Compare commits

...
2274 Commits
Author SHA1 Message Date
PIGCLOUD a6d0705e40 fix(upms): validate department switch authorization
Restrict department switching to the current user department list and reuse the localized access-denied message. Add regression coverage for valid switching and unauthorized or missing departments.

Refs #298

(cherry picked from commit b897c6a34f5f0ff3a4670eb9881e058b56de376d)
2026-11-06 15:19:40 +08:00
PIGCLOUD c0034f3799 Merge branch 'master' of github.com:pig-dev-team/pigx 2026-11-05 16:40:28 +08:00
PIGCLOUD db23fd2d0c feat(SysUserServiceImpl): 添加短信验证码校验逻辑,防止重复使用确保验证码一次性消费
- 更新用户注册和找回密码逻辑,使用新的验证码校验方法
- 添加 SysUserSmsCodeTests 测试类,验证验证码消费行为
2026-11-05 16:36:32 +08:00
PIGCLOUD fd5cd572a4 feat(SysRegisterController): 添加找回密码功能开关控制
- 在 SysRegisterController 中添加对找回密码功能的开关控制
- 如果系统已关闭找回密码功能,则返回失败信息
2026-11-05 16:36:04 +08:00
PIGCLOUD ab91447941 fix(flow): 转义 process.settings 列名,修复 jsqlparser 5.4 解析异常
jsqlparser 5.4 将 settings 视为关键字,TenantLineInnerInterceptor
解析含该列的 SQL 时抛出 ParseException。
2026-11-05 15:18:47 +08:00
PIGCLOUD e3440353ae fix(flow): 转义 process.settings 列名,修复 jsqlparser 5.4 解析异常
jsqlparser 5.4 将 settings 视为关键字,TenantLineInnerInterceptor
解析含该列的 SQL 时抛出 ParseException。
2026-11-05 15:18:43 +08:00
PIGCLOUD ff98dcc3fb chore(deps): 升级积木报表至 2.5.6.1 并覆盖 fastjson 版本 2026-11-05 13:05:57 +08:00
PIGCLOUD 467a1fea1b build(deps): 升级 MyBatis Plus 并适配新版 API
(cherry picked from commit 290764e739fa093eb8187ecd0f9a30062af95f8e)
2026-11-04 21:01:49 +08:00
PIGCLOUD 8d37e48d1f feat(flow): 删除旧的流程通知表和合并表的迁移脚本
- 删除了 `20261014_flow_first_batch.sql` 和 `20261014_flow_merge_tables.sql` 文件
- 更新 `FlowNoticeStatusEnum`,新增 REMOVING 状态
- 修改 `FlowNotice` 实体,确保在插入时保留 userId 值
- 在 `FlowDurableConfiguration` 中添加事务提交后撤销失效通知的逻辑
- 更新 `IFlowNoticeService` 接口,调整通知事件的处理逻辑
- 实现 `FlowNoticeServiceImpl` 中的通知撤销逻辑,确保不误删新通知
- 新增 `FlowMessageRemovalDTO` 数据传输对象,处理通知撤销请求
- 更新 `SysMessageService` 和 `SysMessageController`,支持内部调用撤销流程通知
- 添加 `SysMessageDeletionTests` 测试用例,验证撤销逻辑的正确性
2026-11-03 18:57:11 +08:00
PIGCLOUD 589d17f0d3 fix(db): 补齐国际化与导出权限并同步 Vue 生成模板 2026-11-03 16:50:12 +08:00
PIGCLOUD 5f4d9d6621 style(db): remove trailing blank line after flow sync 2026-11-03 15:24:25 +08:00
PIGCLOUD d6adbfa36e fix(build): upgrade Maven Surefire to 3.6.1
(cherry picked from commit 54dc3b330c245fc79428e4e216b66e405bd47e3f)
2026-11-03 15:22:56 +08:00
PIGCLOUD b003a1b444 fix(auth): 隔离验证码缓存并强制校验短信登录凭据
(cherry picked from commit 9468a3efae7c9b678d074697eced50a175bea1f6)
2026-11-03 14:56:26 +08:00
PIGCLOUD 0974a56294 feat(flow): 优化拒绝处理逻辑,支持多实例结束后重定向到发起人
- 更新 ApproveServiceTask 中拒绝处理逻辑,支持多实例结束后当前执行流尚未落库的情况
- 增加对 CommandContextUtil 的使用,确保执行流迁移的正确性
- 添加 ModelUtilMultiMatchTests 中的单元测试,验证拒绝到发起人的逻辑

(cherry picked from commit 9e37864b02b14a2c980b74e01e126b5d38d10b09)
2026-11-03 14:56:21 +08:00
PIGCLOUD 2f089f029f feat(flow): 条件分支支持多选(包容网关)
- 条件分支节点新增 multiMatch,开启后分叉与合并网关改为 InclusiveGateway,未开启保持排他网关
- 驳回到发起人时收回实例下全部执行流,修复并行、多选分支内驳回后兄弟分支残留导致汇聚异常
- 新增 H2 引擎测试覆盖命中多条、兜底、空分支、嵌套条件及分支内驳回

(cherry picked from commit b982714e1875632fde3338bc69f27052cad98a9d)
2026-11-03 14:56:21 +08:00
PIGCLOUD 93c52e41dc feat(flow): 添加打印模板导入逻辑
- 仅在导入流程时携带打印模板,编辑或复制时保留原模板

(cherry picked from commit ebb2cf463da55efa9ac64bc011ed7ffc8606578a)
2026-11-03 14:56:21 +08:00
PIGCLOUD 2053cc5766 feat(flow): 更新超时任务和通知扫描的延迟时间
- 将 scanReminders 和 scanNotices 方法的扫描延迟时间从 10000ms 修改为 60000ms
- 提高了超时任务和通知的处理频率,优化了系统性能

(cherry picked from commit 71c5177913e5eaf452f62387947be13a6f9cfcc6)
2026-11-03 14:56:21 +08:00
PIGCLOUD ddfc2b41d9 feat(flow): 支持节点 REST 表单权限解析
(cherry picked from commit 80459350acfcd41351497959884307dfa6bbf9c0)
2026-11-03 14:56:21 +08:00
PIGCLOUD 14cb5dfe0a feat(pigx-common): 更新 nacos 版本至 3.3.0
- 将 pigx-common 模块中的 nacos.client.version 更新至 3.3.0
- 将 pigx-register 模块中的 nacos.version 更新至 3.3.0

(cherry picked from commit a25fcc1dedd49b73808fd4c3345da220b2bc50d8)
2026-11-03 14:56:21 +08:00
PIGCLOUD f8742f5e69 fix(flow): 移除回调持久化重试并限制单次通知并发
(cherry picked from commit f7cd6724ee5e5a2fbb7a677f386e582ba9d92610)
2026-11-03 14:56:16 +08:00
PIGCLOUD e0d43f41a1 refactor(flow): migrate durable workspace services to MyBatis Plus
(cherry picked from commit 1b0f4b664cb310fe236dfb046bef9c8248543d71)
2026-11-03 14:56:16 +08:00
PIGCLOUD b04588ffae fix: 修复安全过滤链顺序并清理构建告警
(cherry picked from commit 7dfeb3b7ed6b44b12f72cc82aed92a38e9d39af0)
2026-11-03 14:55:55 +08:00
PIGCLOUD fbb5bd121c feat(api): 删除不再使用的 ConnectConstants、SysDeptRelation、CpUserExcelVo、RoleVO 和 SysSystemSmsConfigVO 类文件
- 移除 ConnectConstants 接口及其相关常量定义
- 删除 SysDeptRelation 类,涉及部门关系表的定义
- 移除 CpUserExcelVo 类,涉及企业微信用户导入的定义
- 删除 RoleVO 类,涉及角色表的定义
- 移除 SysSystemSmsConfigVO 类,涉及系统短信配置的定义

(cherry picked from commit 7ef91170320ae5920458b6e0d64c97e0c6422f62)
2026-11-03 14:55:48 +08:00
PIGCLOUD 72ac720fb6 feat(codegen): 删除不再使用的 GenConfig、TableEntity、SqlDto、PayErrorCodes 等类文件
- 移除冗余的代码文件以简化项目结构
- 清理旧的工具类和实体类,提升代码可维护性

(cherry picked from commit f6eb09a169a2a1bd52501b543018aef15f74e21e)
2026-11-03 14:55:43 +08:00
PIGCLOUD cf917b5988 feat(flow): 新增流程回调投递、草稿存储及流程可靠性服务
- 新增 FlowCallbackDelivery 类,实现 HTTP 回调的至少一次投递机制
- 新增 FlowDraftService 类,支持个人流程草稿的保存、读取和删除
- 新增 FlowReliabilityService 类,处理流程通知、催办与回调的持久化
- 删除 FlowWorkspaceTests 测试类,整合测试逻辑至其他模块

(cherry picked from commit 07c8ccc0e845d30dcfaeeb6d01c999460093c8ac)
2026-11-03 14:55:33 +08:00
PIGCLOUD d0aa3a7284 fix(flow): unify workflow notices and draft reliability
(cherry picked from commit 1632fbb83d24be1523e6fa809ed2ad0ca3e6cb0b)
2026-11-03 14:55:33 +08:00
PIGCLOUD 4f6e796c55 chore(deps): upgrade dynamic-datasource to 4.6.0
(cherry picked from commit 7ff6b91a41cda697f52c3560b4202dab0626e0f9)
2026-11-03 14:55:20 +08:00
PIGCLOUD 085235710b feat(flow): 持久化流程草稿提醒与可靠回调
(cherry picked from commit f6871bee7c5cddaaa5650a284ac3cc3fec16dd18)
2026-11-03 14:55:15 +08:00
PIGCLOUD 749931b53e fix(flow): 按发布版本隔离流程节点配置
(cherry picked from commit 86ae98ad5b29a6d20b7e44283549d7337bb961df)
2026-11-03 14:55:00 +08:00
PIGCLOUD a177f3073a feat(app-article, app-article-category, sys-post): 添加文章和分类拖拽排序功能
- 在 AppArticleController 和 AppArticleCategoryController 中新增排序接口
- 在 AppArticleService 和 AppArticleCategoryService 中添加排序方法
- 在 SysPostController 和 SysPostService 中实现岗位排序功能
- 所有排序功能支持按传入 ID 顺序调整,保留未选中记录位置

(cherry picked from commit 0ba00ddcaba9a042bf082c10230042ba0ecf84d2)
2026-11-03 14:54:51 +08:00
PIGCLOUD d927a5b984 feat(pom): 更新 aws.sdk.version 和 git.commit.version 依赖版本
- 将 aws.sdk.version 从 2.44.14 更新至 2.55.3
- 将 git.commit.version 从 4.9.9 更新至 10.0.1

(cherry picked from commit 9072124412e5961d5ff87adc8d3d8839704b5c05)
2026-11-03 14:54:45 +08:00
PIGCLOUD daad35902e feat(pigx-codegen): 新增JDBC URL安全校验器,防止危险参数注入
- 新增JdbcUrlSecurityValidator,支持MySQL、PostgreSQL、HighGo、SQL Server、Oracle、DB2、DM的JDBC URL危险参数检测
- 在GenDatasourceConfServiceImpl中保存数据源配置时进行安全校验,拒绝包含不安全参数的连接
- 新增GenDatasourceConfServiceImplTests测试用例,覆盖安全与安全的URL场景
- 更新AGENTS.md,调整构建命令描述

(cherry picked from commit cabe0775957e6274cf3c31760724a5ee87fdd743)
2026-11-03 14:54:37 +08:00
PIGCLOUD e4bda833bc docs(db): remove unavailable workflow migration reference 2026-11-03 14:51:50 +08:00
PIGCLOUD cbdd0e202c fix(xss): adapt safelist override to updated jsoup 2026-11-03 14:51:50 +08:00
PIGCLOUD ccdbde5229 fix(pigx-common-security): 修复内部请求校验可被伪造 IP 绕过的问题
- 改用 request.getRemoteAddr() 获取客户端地址,避免从可自定义的转发头提取 IP
- 仅放行 IPv4 回环地址,未携带内部标记的外部请求交由后续认证鉴权处理

(cherry picked from commit b5e5b837ef3e82c4d8231be0bcbd6641c3de7516)
2026-11-03 14:49:33 +08:00
PIGCLOUD 3b15ea4235 fix(auth): 限制表单登录仅使用密码认证
(cherry picked from commit d3c470a848b5369459cd2acc9662276ed52b0e15)
2026-11-03 14:49:32 +08:00
PIGCLOUD 3fd14644cd fix(sentinel): 脱敏数据访问异常并保留异常上报
(cherry picked from commit 194b2d10a8210e93874ad4d1789cf0a4fa4889bd)
2026-11-03 14:49:29 +08:00
PIGCLOUD 4471c363cb feat(controller): 为获取客户端详情和导出功能添加权限控制
- 在 getByClientId 方法上添加 @HasPermission 注解,限制访问权限
- 在 export 方法上添加 @HasPermission 注解,限制访问权限

(cherry picked from commit b84bbffd6e4e74c129d5d02bc2fa3809340dddb7)
2026-11-03 14:49:29 +08:00
PIGCLOUD c0a2b97679 feat(pom): 更新 Spring Boot 和 Spring Cloud 版本
- 将 spring-boot.version 更新至 4.1.2
- 将 spring-cloud.version 更新至 2025.1.4

(cherry picked from commit be2fcf39c253c81826a2bb6266b9de6516d22680)
2026-11-03 14:49:28 +08:00
PIGCLOUD 45250841a5 fix: 调整 sys_route_conf 表 route_id 字段长度为 64
- 将 route_id 字段由 varchar(30) 调整为 varchar(64),避免路由 ID 超长导致存储异常

(cherry picked from commit f681502a5badfbc6bf73ee3c34423241c3b14337)
2026-11-03 14:49:28 +08:00
PIGCLOUD 57877b951f fix(flow): 将查询索引维护到原有初始化 SQL
(cherry picked from commit 88f042d1812902938bdcc0186466e43cc99c13da)
2026-11-03 14:49:27 +08:00
PIGCLOUD 618a29be52 perf(flow): 补充工作流列表查询索引
(cherry picked from commit 51d9242b291efd0ee4f4de329f2e6ccf88389014)
2026-11-03 14:49:27 +08:00
PIGCLOUD 67608f76ba fix(dependabot): 禁止 IJPay 自动升级
(cherry picked from commit efd55dffa7b9e826d894862cb466cf8837ce4e95)
2026-11-03 14:49:24 +08:00
PIGCLOUD 22f55b8ba3 fix(db): 更新初始化脚本注释以指明用途
- 添加注释说明工作流新装/存量升级入口
- 确保初始化脚本不用于升级已有数据库

(cherry picked from commit e2a00ee9c1264d25be641089f3729cac60e0f37f)
2026-11-03 14:49:24 +08:00
PIGCLOUD 9d5ff9c022 fix(message): allow users to delete their own notifications
(cherry picked from commit ea051ea5d76ee9e553754f027e6d3c5ce3aec2b1)
2026-11-03 14:49:23 +08:00
PIGCLOUD ec93f78417 feat(dependabot): 增加对 IJPay 小版本升级的支持
- 更新 dependabot 配置,允许 IJPay 依赖的小版本升级
- 修改注释以反映对 LangChain4j 和 IJPay 的支持

(cherry picked from commit 1b3df5325a1ae6516572e8937c5a56031fcd22ad)
2026-11-03 14:49:23 +08:00
PIGCLOUD 65f184ace6 fix(upms): 保存网站配置时保留各终端验证码开关
移除网站验证码模式变更时对所有 OAuth 终端 captcha_flag 的批量同步,保留前端对默认登录终端的同步行为。

Refs: pig/pigx#7631
(cherry picked from commit 836c2ea5e22f9e9a88f60d8a699e4a66e88979b9)
2026-11-03 14:49:22 +08:00
PIGCLOUD ca84985d63 feat(pigx-mp-platform): 新增按wxUserId精确过滤微信消息查询
- 分页查询新增 wxUserId 精确匹配条件,字段为空时不参与过滤
- 更新接口注释,明确各过滤字段的匹配规则
- 新增 WxFansMsgControllerTests 单元测试,验证按公众号和粉丝维度过滤

(cherry picked from commit 66870cc38f44ccc6c116a09c5e5620ac4b43f9b3)
2026-11-03 14:49:20 +08:00
PIGCLOUD b8fda524f8 fix(pigx-codegen): 修改代码生成默认分支为 master
- 将默认分支从 202601 调整为 master,避免生成代码时指向不存在的分支

(cherry picked from commit 0a86a2d9d012198c55ae77a423396ce709498703)
2026-11-03 14:49:20 +08:00
dependabot[bot] dc663491b6 chore(deps): bump org.jsoup:jsoup in /pigx-common/pigx-common-bom
Bumps [org.jsoup:jsoup](https://github.com/jhy/jsoup) from 1.15.4 to 1.23.2.
- [Release notes](https://github.com/jhy/jsoup/releases)
- [Changelog](https://github.com/jhy/jsoup/blob/master/CHANGES.md)
- [Commits](https://github.com/jhy/jsoup/compare/jsoup-1.15.4...jsoup-1.23.2)

---
updated-dependencies:
- dependency-name: org.jsoup:jsoup
  dependency-version: 1.23.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 7e3fd60373145503a28dc998f44b9467d3d7edc4)
2026-11-03 14:49:19 +08:00
PIGCLOUD cca41756c8 chore(deps): upgrade hutool to 5.8.48
(cherry picked from commit cc59d9bf0736cdc75affb25c4e070808da9ae0fd)
2026-11-03 14:49:19 +08:00
PIGCLOUD cb08f11a5d feat(wx-account-fans): 添加粉丝导出功能及数据脱敏处理
- 新增 WxAccountFansExcelVO 类用于粉丝数据的 Excel 导出
- 在 WxAccountFansController 中实现导出接口,支持按条件筛选粉丝
- 更新 WxAccountFansServiceImpl 中的粉丝更新逻辑,确保数据同步至微信
- 对粉丝的 OpenID 进行脱敏处理,确保隐私安全

(cherry picked from commit a277413d3d7681407daca46bbb635f57a032b25f)
2026-11-03 14:49:18 +08:00
PIGCLOUD e63dc8678e feat(excel-converters): 增加 WRITE_INSTANCE 的文档注释
- 为 WRITE_INSTANCE 添加了详细的文档注释,说明其在未指定目标单元格类型时的用途和返回值。

(cherry picked from commit 8bcff3a8a1879eac50527c25bb99ddc4b35b757d)
2026-11-03 14:49:17 +08:00
PIGCLOUD abf10a2a19 feat(excel-converters): 增强内置转换器功能,添加 StringArrayConverter.WRITE_INSTANCE
- 注册 StringArrayConverter.WRITE_INSTANCE 到 Excel 写构造器
- 优化代码格式,保持一致性

(cherry picked from commit 3800300f7f101560674dacc6a0840e279b753a2e)
2026-11-03 14:49:17 +08:00
PIGCLOUD 1db9bdc636 feat(pom): 添加跳过测试的配置
- 在项目属性中添加 `<skipTests>true</skipTests>` 配置,以便在构建时跳过测试。

(cherry picked from commit 1f1126001d2177aac7a3990d42f6c048f701d536)
2026-11-03 14:49:16 +08:00
PIGCLOUD 60babcbc3d fix: 为 JDK 25+ 添加 Byte Buddy 版本覆盖 profile
- 新增 jdk25-byte-buddy profile,在 JDK 25 及以上环境显式指定
  Byte Buddy 版本为 1.18.11,避免 Sentinel BOM 引入的旧版不兼容

(cherry picked from commit 07a61ad7e3a4b5f1f6e166557bbc6a36638d485b)
2026-11-03 14:49:16 +08:00
PIGCLOUD 2bc231f1bf feat(idempotent): 更新 IdempotentAutoConfiguration 和 IdempotentAutoConfigurationTests
- 移除冗余代码,简化 KeyResolver 和 RedissonClient 的配置
- 增强对 Redis 集群和哨兵模式的支持
- 更新测试用例以验证新的配置逻辑

(cherry picked from commit 0064a36a79cbd17c287eef358def60ea58bc9fbd)
2026-11-03 14:49:14 +08:00
PIGCLOUD 464c6df5b8 feat(sql): 更新 chat2bi_table_meta 表结构,调整字符集为 utf8mb4_general_ci
- 修改 chat2bi_table_meta 表的字符集和排序规则为 utf8mb4_general_ci
- 确保数据源相关字段的字符集一致性
2026-09-23 08:38:49 +08:00
PIGCLOUD 7720ea8547 feat(sql): 新增 chat2bi_table_meta 表结构,支持多数据源表元数据管理
- 包含数据源类型、ID、Schema名、表名等字段
- 提供表注释和列定义的 JSON 格式存储
- 增加多租户支持和同步时间字段

(cherry picked from commit f911168762486715c2c061134416c229462744ed)
2026-09-22 23:06:45 +08:00
PIGCLOUD ee27036339 chore: 统一 PIGX 项目版本为 6.2.0 2026-09-22 22:17:22 +08:00
PIGCLOUD db60b48f6c feat(db): 删除用户社交身份表及相关迁移脚本
- 删除 `20260922_user_social.sql` 文件及其内容
- 更新 `README.md`,移除关于用户社交身份迁移的说明
- 删除 `2026-03-18-flow-withdraw-design.md` 和 `2026-03-19-flow-withdraw-resubmit-design.md` 文档,清理与撤回和重新提交流程相关的设计文档
2026-09-22 22:14:02 +08:00
PIGCLOUD 7712a1bb3c fix(db): 补齐旧社交凭据迁移及升级说明 2026-09-22 22:09:47 +08:00
PIGCLOUD 816a63f0c2 fix(db): 对齐商业版初始化与增量升级表结构
参考 ai-dev-next c0b8a966b 的非 AI 表定义,统一单体与分库结构及内置 OAuth 客户端默认授权。保留 AI 表、菜单与路由排除边界。
2026-09-22 22:09:46 +08:00
PIGCLOUD 545b0a4642 refactor(pigx-upms-biz): 重构租户菜单缓存清理逻辑
- 将缩进从4个空格统一替换为Tab,并调整链式调用换行格式
- 重构 updateTenant 方法中菜单缓存清理逻辑,移除 RedisUtils 依赖,改用 Spring Cache 的 Cache.evict 按角色ID清除缓存
- 移除未使用的 RedisUtils 导入,增加 Cache 导入
- 微调日志格式和数组字面量格式

(cherry picked from commit b368a80a83a7d7efb34a63cda26e4ad64e99dfd0)
2026-09-22 21:52:17 +08:00
PIGCLOUD 1dc58c60cf feat(pigx-upms-biz): 增加飞书用户身份绑定功能
- 在 SysUserMapper.xml 中添加对飞书用户的查询支持
- 新增 FeishuLoginHandlerTests 测试类,验证飞书登录处理逻辑
- 测试覆盖飞书身份的代码交换和用户信息查询功能

(cherry picked from commit 2a0796cce45efd4e0444b0e2a6ef0a9e530dd226)
2026-09-22 21:52:04 +08:00
PIGCLOUD 75ec99389c fix(flow): 保留撤回终止原因
(cherry picked from commit ca125bd0ec08472c02c04356a5c4dd22965e3c78)
2026-09-22 21:51:48 +08:00
PIGCLOUD b6681ed578 fix(flow): 修正拒绝结束状态
(cherry picked from commit 5158476c3ff652f6a97256497074ba9cbd448ff5)
2026-09-22 21:51:48 +08:00
PIGCLOUD 53e7a6c2eb feat: 更新配置文件,增加openfeign请求压缩最小请求大小限制
(cherry picked from commit 0d6f12a2b934abe67eb7952e22ca7cdeddbd848f)
2026-09-22 21:51:48 +08:00
PIGCLOUD a810bf8f0b refactor(codegen): 移除 vform 无用代码
(cherry picked from commit 1bf57b916a66d61c6cfe52fdba827bb3c748c296)
2026-09-22 21:51:23 +08:00
PIGCLOUD 840732c52d refactor(pigx-upms): 重构社交登录,社交凭据迁移至独立表并移除码云/开源中国支持
- 将微信、企微、钉钉等社交登录凭据从 sys_user 字段迁移至独立的 sys_user_social 表
- 删除 Gitee 和 OSC 登录处理器及相关常量、枚举和字典项
- 更新绑定/解绑逻辑,使用 sys_user_social Mapper 进行增删改查
- 修改用户查询 SQL,通过 JOIN sys_user_social 表按社交标识查询用户
- 企业微信导入时自动写入社交绑定关系,并处理社交标识冲突异常
- 新增查询当前用户已绑定社交类型接口

(cherry picked from commit 2181b3311d62f980aecd6e144dbe7bce4e8dd8d2)
2026-09-22 21:49:55 +08:00
PIGCLOUD 6a4b8b1f1d Revert "fix(flow): 修正拒绝结束状态"
This reverts commit 4023b142d1.
2026-09-22 21:44:11 +08:00
PIGCLOUD 3f4d1dbf6e feat(sql): 新增 SqlSortUtils 工具类,提供排序字段校验功能
- 实现 isValidColumn 方法,校验前端传入的排序字段是否合法
- 更新 SqlFilterArgumentResolver,使用 SqlSortUtils 进行排序字段校验

(cherry picked from commit 1833847cd835d9972c2237cb804f00fd8075d4e8)
2026-09-22 21:43:41 +08:00
PIGCLOUD 39ea9a6eae feat(idempotent): 增强幂等配置,支持 Redis 集群和哨兵模式
- 新增对 Redis 集群和哨兵模式的支持
- 更新 Redisson 客户端配置逻辑
- 添加 IdempotentAutoConfigurationTests 测试类,验证新配置的正确性

(cherry picked from commit b836af6dc0dfbe17b20740cfda9e417deae1967d)
2026-09-22 21:43:41 +08:00
PIGCLOUD c80d5bc44a upgrade(jimu): 升级依赖版本并清理Nacos配置中的冗余项
- 升级 jimu 版本从 2.5.0 至 2.5.2,fastjson 版本从 2.0.58 至 2.0.65
- 清理 Nacos 配置(pigx-codegen-dev、pigx-daemon-quartz-dev、pigx-mp-platform-dev、pigx-jimu-platform-dev)中多余的 resources 配置项

(cherry picked from commit ad1b4945b9c1624217eee10d331a91a5004970f5)
2026-09-22 21:43:40 +08:00
PIGCLOUD 50b68563a6 feat: 更新nacos版本至3.2.4以增强功能和稳定性
(cherry picked from commit 52745112879f562cc745b3a8ec65603437c018c4)
2026-09-22 21:43:40 +08:00
PIGCLOUD 2a6ce673f5 fix(param): 将前端注册开关的默认值修改为关闭
(cherry picked from commit 4b94ca3fd4d7e2a5c69afbeb18fff8d336459c9d)
2026-09-22 21:43:39 +08:00
PIGCLOUD 08c081304a feat: 支持 JDK 25+ 显式声明 Lombok 注解处理器
- 添加 `jdk25-annotation-processor` profile,解决 JDK 25+ 下注解处理器自动发现关闭的问题

(cherry picked from commit 852cb195aa36425b3f0c512727a4f04b01da410a)
2026-09-22 21:43:39 +08:00
PIGCLOUD bca999535c feat: 更新 Spring Boot 和 Spring Cloud 版本至 4.1.1 和 2025.1.3
(cherry picked from commit 2d0eb6822807eaff80a491ddcaa0e584c0c197d6)
2026-09-22 21:43:39 +08:00
PIGCLOUD d46af13a2e feat(auth): 优化图形验证码生成逻辑,新增自定义颜色支持
(cherry picked from commit af900df10d6e9df4b9812332f126c2e96474722e)
2026-09-22 21:43:38 +08:00
PIGCLOUD 4023b142d1 fix(flow): 修正拒绝结束状态
(cherry picked from commit 5158476c3ff652f6a97256497074ba9cbd448ff5)
2026-09-22 21:43:38 +08:00
PIGCLOUD 269d7fe5e4 fix(quartz): 增加 REST 任务 URL 白名单校验
(cherry picked from commit ad6cd0600641ce916a09efe6affb56db97ad6890)
2026-09-22 21:43:37 +08:00
PIGCLOUD 2edc478f73 fix(codegen): 拦截非法表名
(cherry picked from commit 4e441f50473a4c3c5222002f23de6afdb5c70588)
2026-09-22 21:43:36 +08:00
PIGCLOUD cbb68a0e5b Merge remote-tracking branch 'origin/dev' into dev 2026-09-22 21:30:00 +08:00
PIGCLOUD 9c63820b53 fix: 修复Nacos配置中never-refreshable和endpoint.restart.access配置项,防止数据源死循环
- 将`spring.cloud.refresh.never-refreshable`从`datasource`改为`dataSource`,避免动态刷新导致数据源循环依赖
- 将`management.endpoint.restart.access`从`unrestricted`改为`none`,限制重启端点访问
2026-08-12 23:23:31 +08:00
PIGCLOUD 4ed36c5559 fix(pigx-common-log): 修复Nacos配置修改导致数据源死循环的问题
- 移除 `excludeFields` 字段的 `@Value` 注解注入,改为直接初始化默认值列表,避免动态配置刷新引发循环依赖
2026-08-07 10:12:24 +08:00
PIGCLOUD c3b336aad4 fix(config): 更新配置文件内容,修复nacos 配置修改数据源陷入死循环而down 2026-08-06 17:42:41 +08:00
PIGCLOUD d46e42d51d chore(upms-tests): 删除多个测试文件以清理代码库 2026-08-03 08:30:05 +08:00
PIGCLOUD fe9ee4d1e6 fix(upms): 更新上传文件方法文档,增加路径校验说明 2026-08-03 08:28:06 +08:00
PIGCLOUD 0aaaee14fb fix(upms): 收紧客户端详情查询接口权限 2026-08-03 08:28:06 +08:00
PIGCLOUD a043c4f19e fix(upms): 收紧客户端详情查询接口权限
将 Feign 查询接口改为仅内部调用,并新增带权限的 /client/details 供管理端使用。
2026-08-03 08:27:40 +08:00
PIGCLOUD d1876914d2 fix(upms): 本地文件存储增加路径穿越防护
上传/读取/删除前校验路径位于存储根目录内,统一错误文案,并修复无扩展名时多余的点号。
2026-08-03 08:27:00 +08:00
PIGCLOUD 6248d60e62 refactor(pigx-monitor): 移除 fastjson 依赖,改用 hutool-json 处理 JSON 序列化与反序列化 2026-08-03 08:25:55 +08:00
PIGCLOUD 7461394f99 refactor(pigx-flow): 移除测试文件并禁用 JimuReport 模块
- 删除 `MultiInstanceHandlerTests`、`ProcessNodeRecordServiceImplTests`、`ProcessTaskControllerTests`、`TaskServiceDelegateParticipationTests`、`TaskServiceImplTests` 五个测试类
- 注释 `pigx-visual/pom.xml` 中的 `pigx-jimu-platform` 模块,并添加启用说明注释
2026-08-01 17:24:24 +08:00
PIGCLOUD 55df29df99 feat(pigx-boot): 报表表添加多sheet标识字段
- 在 `jimu_report` 表中新增 `is_multi_sheet` 字段,用于标识是否多sheet报表
- 更新已有数据记录的 `is_multi_sheet` 字段值
2026-08-01 16:56:44 +08:00
PIGCLOUD 0601ed01ed chore(flow): remove temporary add-sign docs 2026-08-01 13:32:20 +08:00
PIGCLOUD 2b6a4d2e85 feat(flow): support dynamic countersign add-sign 2026-08-01 13:32:20 +08:00
PIGCLOUD 5931a5d6d7 feat(upms): support umami analytics 2026-08-01 13:31:35 +08:00
PIGCLOUD 83ee6144b3 chore(menu): 统一导航授权名称 2026-08-01 12:59:24 +08:00
PIGCLOUD 08a82ee09c fix(boot): randomize MyBatis-Plus snowflake node IDs 2026-08-01 12:00:43 +08:00
PIGCLOUD 1dad386954 chore(gitignore): 移除对 docs 目录及其子目录的忽略规则 2026-08-01 12:00:03 +08:00
PIGCLOUD 02cfe26922 chore(deps): ignore MyBatis upgrades 2026-08-01 11:59:35 +08:00
PIGCLOUD 87911c87d0 fix app page empty state 2026-08-01 11:59:35 +08:00
PIGCLOUD 75f426deb3 fix(swagger): 使用相对地址避免跨域 2026-08-01 11:59:35 +08:00
PIGCLOUD 41f20b2db3 fix(data): 延迟初始化数据权限 Feign 客户端 2026-08-01 11:59:35 +08:00
PIGCLOUD d9130d4fbf fix(pigx-upms-api): 调整社交登录敏感字段脱敏策略,缩短掩码显示长度
- 将 SysSocialDetails 中 appId 和 appSecret 的 @Sensitive 脱敏长度从 4/4 和 9/9 统一调整为 2/2,增强敏感信息保护
2026-08-01 11:59:35 +08:00
PIGCLOUD ea6940378c feat(syslog): 增加对不同数据库的日志汇总查询支持 2026-08-01 11:59:35 +08:00
leng leng ce07c9dcb9 feat(area): 重构行政区划管理接口 (#72) 2026-08-01 11:59:35 +08:00
PIGCLOUD fb5e1bdf6e fix(sequence): 发号器自动建表兼容 PostgreSQL 等非 MySQL 方言
Table.from 推导的列缺少 originType,DDL 阶段无法按目标库转换类型,
PostgreSQL 下 DATETIME 原样输出导致建表失败(type "datetime" does not exist)。
补全 originType 使 anyline 方言别名转换(DATETIME -> TIMESTAMP)生效。

同时显式命名主键约束:anyline 随机生成的约束名约 16% 概率以数字开头,
未加引号时为 SQL 语法错误。

MySQL 差分验证建表行为不变;本地 PostgreSQL 实测建表成功。
2026-08-01 11:59:35 +08:00
PIGCLOUD 2ab4d66f28 fix(feign): 修复首次并发请求转换器竞态 2026-08-01 11:59:35 +08:00
PIGCLOUD d3afca673e fix(upms): aggregate log statistics in database (#7568) 2026-08-01 11:59:35 +08:00
PIGCLOUD 0a15577761 fix log multipart serialization 2026-08-01 11:59:35 +08:00
PIGCLOUD 2bc5fb5f24 feat(datasource): 支持通过 query-ds-enabled 关闭数据库配置表加载扩展数据源
新增 spring.datasource.druid.query-ds-enabled 配置项,默认开启;显式设为
false 时跳过从 gen_datasource_conf 表加载扩展数据源,便于不依赖该表的部署
场景关闭此行为。
2026-08-01 11:59:35 +08:00
PIGCLOUD 76ea7f45ac feat(pigx-upms-biz): 小程序登录支持手机号不存在时自动注册
- 当用户不存在且系统注册功能开启时,自动以手机号注册新用户并返回用户信息
- 初始密码使用10位随机数字,注册逻辑与SysRegisterController保持一致
2026-08-01 11:59:35 +08:00
PIGCLOUD 8062730ec3 fix sequence range update name condition 2026-08-01 11:59:35 +08:00
PIGCLOUD 15fb0df080 fix(upms): restrict user list by ids to inner calls 2026-08-01 11:59:35 +08:00
PIGCLOUD 1e74a8e4b2 fix(job): set default XXL-Job access token 2026-08-01 11:59:35 +08:00
PIGCLOUD 194e3e0f99 fix(service): 使用 JakartaMailUtil 替换 MailUtil 发送邮件 2026-08-01 11:59:35 +08:00
PIGCLOUD 4f79671c94 chore(deps): upgrade xxl-job to 3.4.2 2026-08-01 11:58:31 +08:00
PIGCLOUD 91b5d27347 upgrade(xxl-job): 升级 3.4.1 2026-08-01 11:58:10 +08:00
PIGCLOUD d6ef8e4e98 upgrade(xxl-job): 升级 3.4.1 2026-08-01 11:58:02 +08:00
PIGCLOUD 87489ed353 chore(deps): align non-AI platform with 6.1.0 2026-08-01 11:57:32 +08:00
PIGCLOUD e883e64a65 chore(deps): upgrade jasypt to 4.0.4 2026-08-01 11:53:16 +08:00
PIGCLOUD 00a4b30ecb chore(deps): upgrade spring boot admin to 4.1.1 2026-08-01 11:53:16 +08:00
PIGCLOUD 82743a0375 fix(pom): 升级 spring-boot-admin 版本至 4.1.0 2026-08-01 11:52:59 +08:00
PIGCLOUD a8437aacad fix: 升级 spring-cloud 版本至 2025.1.2
- 升级 spring-cloud 版本至 2025.1.2
2026-08-01 11:52:42 +08:00
PIGCLOUD 74fb06e3ea feat(deps): 升级 Spring Boot 4.1.0 并迁移 Redis 监听到 @RedisListener
- spring-boot.version 4.0.6 -> 4.1.0
- 共享容器 Bean 改名为 redisMessageListenerContainer,适配 Boot 4.1 按名称回退的自动配置
- ClientDetailsInitRunner/DynamicRouteInitRunner 移除 InitializingBean 手工注册,改用 @RedisListener
- WxMpInitConfigRunner 移除自定义 redisContainer Bean,改用 @RedisListener
- 注意:需配合 Nacos 共享配置关闭 spring.cloud.compatibility-verifier(SC 2025.1.1 官方仅声明兼容 Boot 4.0.x)
2026-08-01 11:52:42 +08:00
PIGCLOUD bdeba4ce3d fix(core): avoid replacing projecting jackson converter 2026-06-18 22:51:49 +08:00
PIGCLOUD a6af889ccf fix(upms): validate password reset result 2026-06-18 08:33:11 +08:00
PIGCLOUD 9236384ce6 refactor(pigx-register): 添加 hessian 依赖并移除 jraft-core 的排除配置 2026-06-15 13:26:47 +08:00
PIGCLOUD 53bf0dbcb1 fix(db): 将多个表的 tenant_id 字段长度从 10 增加到 64 2026-06-13 19:21:33 +08:00
PIGCLOUD dda210e91a fix: 修复 YungouosMergePayOrderHandler 中的参数传递问题 2026-06-13 19:21:19 +08:00
PIGCLOUD 783c688b6c fix(pigx-gateway):添加命名异步查询订阅服务配置 2026-06-13 19:21:13 +08:00
PIGCLOUD 2c2a9a3bd7 fix(config): 更新 pigx-daemon-elastic-job-dev.yml 配置,添加 XXL-Job 配置
(cherry picked from commit a0d855e01faf89aeb952718150f1220e351ec724)
2026-06-08 12:28:15 +08:00
PIGCLOUD d7c4ab10b3 fix(visual): align xxl_job schema with xxl-job 3.4.0 (add token, sha256 admin) 2026-06-08 11:20:24 +08:00
PIGCLOUD a5d3dff3fc fix(codegen): 加固 Velocity 模板渲染 2026-06-04 18:32:16 +08:00
PIGCLOUD d3966d64f5 chore(deps): 升级依赖版本 2026-06-04 17:20:20 +08:00
PIGCLOUD fef648a8cf refactor(pigx-upms-api): 将 SiteConfigDTO 迁移至 pigx-upms-api 模块
- 移动 SiteConfigDTO 类从 pigx-upms-biz 的 dto 包到 pigx-upms-api 的 api.dto 包
- 更新业务模块中所有对该类的 import 引用
2026-06-04 00:06:54 +08:00
PIGCLOUD 28c16ac730 fix: 默认关闭反调试保护功能
- 将 `SITE_ANTI_DEBUG_ENABLE` 参数默认值从 `1` 改为 `0`
2026-06-03 23:40:01 +08:00
PIGCLOUD b82721c293 feat(codegen): add generator path check
(cherry picked from commit 11dd892078e9b4f5dabf5df1d2c75d61df6823bd)
2026-06-03 20:58:01 +08:00
PIGCLOUD ace1e560f7 feat(pigx-xxl-job-admin): 新增 XXL-Job Admin 微服务配置 2026-06-03 12:59:08 +08:00
PIGCLOUD e3287e3d8a feat(pigx-common-bom): 新增 mybatis-spring-boot-starter 依赖管理
- 添加 mybatis-spring-boot-starter 依赖并配置版本属性 4.0.1
2026-06-03 12:59:05 +08:00
PIGCLOUD 778e795d9d chore: update version from 6.0.0-SNAPSHOT to 6.0.0 in pom.xml 2026-06-01 09:12:29 +08:00
PIGCLOUD 45c7ceec17 chore(pigx-register): 更新 nacos 版本从 3.2.1 到 3.2.2
- 升级 nacos 依赖版本至 3.2.2
2026-06-01 09:05:29 +08:00
PIGCLOUD 5d561bee33 feat(pigx-codegen): 支持实体生成到独立 api 模块
- 新增 DataModelConstants 定义 API_PATH、ENTITY_PATH 等实体路径常量
- 实现 setEntityModel 方法,自动识别 `-biz` 模块同级 `-api` 模块,将实体生成路径和包名切换到 api 模块
- 更新 gen_template.sql 代码生成模板,使用 entityClassName、entityPath 等动态变量替代硬编码包路径
- 扩展 isSpringBoot3 判断逻辑,兼容 SpringBoot 4.x 主版本
2026-05-28 15:57:50 +08:00
PIGCLOUD f172154800 feat(pigx-codegen): 支持实体生成到独立 api 模块
- 新增 DataModelConstants 定义 API_PATH、ENTITY_PATH 等实体路径常量
- 实现 setEntityModel 方法,自动识别 `-biz` 模块同级 `-api` 模块,将实体生成路径和包名切换到 api 模块
- 更新 gen_template.sql 代码生成模板,使用 entityClassName、entityPath 等动态变量替代硬编码包路径
- 扩展 isSpringBoot3 判断逻辑,兼容 SpringBoot 4.x 主版本
2026-05-28 14:41:17 +08:00
PIGCLOUD f3c0b2034c feat(pigx-upms-biz): 重构微信小程序登录,由 openid 改为手机号登录
- 修改 `MiniAppLoginHandler` 登录流程:使用前端 `getPhoneNumber` 返回的 code 换取手机号,并通过手机号获取用户信息;绑定逻辑改为写入手机号字段
- 引入微信接口调用凭证(access_token)的获取与 Redis 缓存机制,减少重复请求
- 新增 `SecurityConstants` 中 `MINI_APP_ACCESS_TOKEN_URL` 和 `MINI_APP_PHONE_NUMBER_URL` 常量
- 移除自动创建小程序用户逻辑,未绑定时直接返回 null
- 提取微信响应校验、缓存读取/写入、HTTP 请求等方法,便于单元测试覆盖
2026-05-28 14:41:15 +08:00
PIGCLOUD dd49790ceb refactor: 更新 XXL-Job Admin 配置
- 重写 `pigx-xxl-job-admin-dev.yml` 配置内容,增加 Web 服务、Actuator 监控、HikariCP 连接池、邮箱服务及 XXL-SSO 单点登录等详细配置
2026-05-26 07:41:17 +08:00
PIGCLOUD 3b6c63dd64 feat(pigx-register): 禁用Nacos AI扩展功能与广告展示
- 添加配置 `nacos.extension.ai.enabled=false` 关闭AI扩展功能
- 添加配置 `nacos.console.ad.enabled=false` 关闭控制台广告展示
2026-05-26 07:40:59 +08:00
PIGCLOUD b19c1c2f0f feat(docs): add behavioral guidelines for coding practices in AGENTS.md and CLAUDE.md 2026-05-13 09:46:38 +08:00
PIGCLOUD 21127c11b5 chore(db): sync non-ai database scripts 2026-05-25 17:31:39 +08:00
PIGCLOUD 5eff0d71df feat: add new models and update application structure for job scheduling 2026-05-01 23:59:12 +08:00
PIGCLOUD 124a2547dd refactor(xxl-job): replace xxl-job-admin for boot4 2026-05-25 17:31:39 +08:00
PIGCLOUD 3132cc3784 feat(pigx-upms-biz): 新增密码规则预设功能 2026-05-21 17:21:03 +08:00
PIGCLOUD 1b87ae9787 refactor(pigx-common-datasource): 重构数据源类型枚举,新增 AnyLine 解析适配器字段及插件状态查询 2026-05-24 18:49:20 +08:00
PIGCLOUD 0fca2924d4 refactor(pigx-common-data): 解耦 pigx-common-data 对 pigx-common-security 的依赖 2026-05-21 10:39:50 +08:00
PIGCLOUD 5ad4dfb711 refactor(pigx-common-security): 统一验证码校验逻辑并新增短信验证码前置校验 2026-05-20 23:24:23 +08:00
PIGCLOUD c796af6c5f refactor(pigx-common-oss): 将OSS操作从S3AsyncClient迁移至同步S3Client 2026-05-18 19:03:23 +08:00
PIGCLOUD 87a1ea1ae0 refactor(pigx-common-excel): 重构 Excel 模块,引入内置转换器注册机制并优化 Excel 读写流程 2026-05-18 15:56:20 +08:00
PIGCLOUD 1d9bfd866f feat(pigx-common-audit): 重构审计模块,支持通过主键自动获取对象进行比对 2026-05-18 14:19:08 +08:00
PIGCLOUD 836fc04a26 refactor(pigx-common-websocket): 优化 WebSocket 缓冲区配置并移除 Undertow 依赖 2026-05-14 14:13:54 +08:00
PIGCLOUD 5f3bff90e1 feat(pigx-flow-biz): 支持分组ID为空时查询所有未隐藏流程 2026-05-11 17:33:12 +08:00
PIGCLOUD 26efa7acbf feat(pigx-pay-platform): 支持微信支付 APIV3 回调与下单, 2026-05-11 11:19:16 +08:00
PIGCLOUD a1edbfcc6e feat(app): 重构APP模块支持TOB 添加角色底部导航管理功能,更新相关接口和实体 2026-05-10 10:57:59 +08:00
PIGCLOUD c48d5f753c feat(pigx-auth): 增加 SM4 国密算法支持并优化密码解密逻辑 2026-05-03 21:25:09 +08:00
PIGCLOUD 32c6e81b3a feat(encrypt): 优化解密逻辑,重构 AES 加解密实现,增加 SM4 密钥校验 2026-05-03 19:40:22 +08:00
PIGCLOUD 7613f72673 feat(pigx-common-core): 降级 Jackson 3 到 Jackson 2 并重构配置 2026-05-02 13:42:11 +08:00
PIGCLOUD e80b4f0b28 fix(feign): 修复 HttpMessageConverterCustomizer 的 UnsupportedOperationException 2026-05-01 22:14:18 +08:00
PIGCLOUD e88b2818fd chore(pom): update parent version to 6.0.0-SNAPSHOT and adjust dependencies fix: correct import paths for Spring Boot components and update Jackson configuration 2026-05-01 22:20:52 +08:00
PIGCLOUD f68327b857 ci: configure build and dependency automation 2026-04-30 16:06:54 +08:00
PIGCLOUD 66e55f3258 refactor(pigx-common-datasource): 简化动态数据源配置逻辑
- 移除 DEFAULT_QUERY_DS_SQL 常量定义
- 直接使用传入的 queryDsSql 参数,简化条件判断逻辑
- 优化构造函数参数初始化方式
2026-03-20 11:32:36 +08:00
PIGCLOUD 9d198266d7 fix(db): 更新 config_info 表中的配置内容和 MD5 值 2026-03-20 11:28:17 +08:00
PIGCLOUD fe64bf38c2 refactor(pigx-common-datasource): 重构动态数据源配置
- 移除 DruidDataSourceProperties 配置类,直接使用 DruidDataSourceWrapper
- 移除冗余的配置属性和创建逻辑,提升代码简洁性
2026-03-20 11:28:11 +08:00
PIGCLOUD f759865202 feat(pigx-flow-biz): 新增流程撤回功能
- 在 ITaskService 接口中添加 withdrawProcessInstance 方法用于撤回流程实例
- 实现 TaskServiceImpl 中的撤回逻辑,包括权限校验和流程状态更新
- 新增 terminateProcessInstance 私有方法统一处理流程终止和撤回操作
- 在 ProcessInstanceRecordVo 中添加撤回相关字段 canWithdraw 和 withdrawDisabledReason
- 优化 ProcessInstanceServiceImpl 查询逻辑,批量处理驳回状态和撤回状态判断
- 在 ProcessTaskController 中添加撤回流程实例的接口端点
- 定义流程撤回相关的常量,包括结束原因和执行人状态
2026-03-19 08:41:55 +08:00
PIGCLOUD b553787cfd docs(flow): add withdraw resubmit design 2026-03-19 08:39:53 +08:00
PIGCLOUD 2c70387ace docs(flow): add starter withdraw design 2026-03-18 23:57:10 +08:00
PIGCLOUD 9d6515d8fa fix(sql): 移除无用的AI菜单插入语句 2026-03-18 08:55:45 +08:00
PIGCLOUD c3f757e38c fix(db): 删除无用的 SQL 2026-03-09 11:20:07 +08:00
PIGCLOUD 61adedf902 fix(pigx-common-data): 添加 SQL 注入检查并移除自定义转义方法
- 在数据权限拦截器中添加 SQL 注入检查,使用 MyBatis-Plus 的 SqlInjectionUtils 工具类
- 移除原有的 escapeSql 自定义转义方法,直接使用原始 username 参数
- 在生成条件表达式和查询语句时增加注入检查逻辑,发现注入风险时返回空结果集
2026-03-09 10:46:07 +08:00
PIGCLOUD 0198431ffa docs(pigx-common-bom): 升级 spring-boot-admin 版本从 3.5.7 到 3.5.8 2026-03-08 18:03:20 +08:00
PIGCLOUD ed60e69d07 docs(pigx-common-bom): 清理过期的依赖项
- 移除 pigx-common-milvus、pigx-common-mcp、pigx-common-neo4j 依赖项
- 删除不再使用的分支合并设计文档文件
- 清理项目中的过期配置和文档
2026-03-08 18:02:14 +08:00
PIGCLOUD e646321d15 docs: 删除过期的分支合并设计文档
- 移除 2026-03-08-merge-aiflow-branch-design.md 文件
- 移除 2026-03-08-merge-aiflow-non-ai-plan.md 文件
- 清理不再使用的分支合并计划和实施方案
2026-03-08 17:57:17 +08:00
PIGCLOUD 40977fbc56 fix(pigx-flow-api): 修复 RemoteFlowApiFlowService 常量引用
将 FLOW_ENGINE_SERVER 改为 FLOW_SERVER 以匹配 ServiceNameConstants 中的定义。
2026-03-08 15:31:40 +08:00
PIGCLOUD 13b8984769 fix: 移除根 pom.xml 中的 pigx-aigc 模块引用和 pigx-boot 中的 aigc-biz 依赖
dev 分支不含 pigx-aigc 目录,移除对不存在模块的引用以确保编译通过。
2026-03-08 15:29:43 +08:00
PIGCLOUD cb8e426855 chore: 更新 boot 开发配置
从 2bb41b75f 提取非 AI 部分。application-dev.yml 添加 Redis database 配置。
2026-03-08 15:23:18 +08:00
PIGCLOUD 7e005eabd0 feat(pigx-upms-biz): 优化 SysTenantServiceImpl 租户处理逻辑
从 19b3e3ba3 提取非 AI 部分。
2026-03-08 15:20:44 +08:00
PIGCLOUD 7070b9f3d2 feat: 增强租户上下文处理 (非 AI 部分)
从 60b4aca0f 提取 db/0pigxx_boot.sql 和 pigx-boot/pom.xml 变更。
2026-03-08 15:19:28 +08:00
PIGCLOUD 57d1d03a6c feat(pigx-common-core): 更新 ServiceNameConstants 添加 AIGC 服务常量
从 b63758c9f 提取非 AI 文件部分。
2026-03-08 15:18:17 +08:00
PIGCLOUD 98656e4af3 chore: upgrade version to 5.12.0 (non-AI modules only)
Cherry-picked from 799188b31, excluding pigx-aigc and AI-related common modules.
2026-03-08 15:15:12 +08:00
PIGCLOUD 96361c21ec feat(pigx-flow-biz): 增加触发器异常终止处理,确保在事务外安全终止流程
- 在 TriggerServiceTask 中重构异常处理逻辑,将直接终止流程改为抛出特定异常
- 在 TaskServiceImpl 中增加触发器异常终止处理,确保在事务外安全终止流程
- 优化任务参数设置逻辑,提前获取 processInstanceId 确保终止流程可用
- 统一流程终止状态管理,使用 NodeStatusEnum.YZZ 表示已终止状态
- 调整代码格式,提高可读性和一致性

feat(pigx-flow-api): 扩展节点状态枚举

- 在 NodeStatusEnum 中新增 YZZ(9, "已终止") 状态,用于标识流程异常终止情况
2026-03-08 15:07:18 +08:00
PIGCLOUD cd2ec46f82 feat(pigx-flow-biz): 优化任务服务参数传递
- 将taskResultDto.getTaskNode()替换为node变量,简化参数设置逻辑
- 保持其他参数设置不变,提高代码可读性
2026-03-08 15:07:13 +08:00
PIGCLOUD 3acab393c4 feat(pigx-boot): 优化模块依赖配置 1.12.1
- 更新 langchain4j 相关依赖版本至 1.12.1
2026-03-08 15:07:09 +08:00
PIGCLOUD 410a869db2 feat(pigx-flow-biz): 新增流程打印模板功能
- 在 Process 实体类中新增 printTemplate 字段,用于存储 HTML 格式的打印模板
- 新增数据库表字段 print_template,支持流程定义的打印模板存储
- 在 ProcessController 中新增获取和保存打印模板的 REST API 接口
- 在 ProcessInstanceRecordVo 中新增 hasPrintTemplate 字段,标识流程是否配置打印模板
- 优化流程实例列表查询,批量检查打印模板配置状态
- 修复 ProcessInstanceServiceImpl 中重复设置 formData 的问题
2026-03-08 15:06:59 +08:00
PIGCLOUD 3c05364e12 feat(pigx-flow-biz): 实现触发器节点功能
- 在 ModelUtil 中新增 TRIGGER 节点类型处理逻辑,调用 buildTriggerNode 方法
- 重构 buildSimpleServiceTaskNode 通用方法,支持构建服务任务节点
- 新增 buildTriggerNode 方法,使用 TriggerServiceTask 处理触发器逻辑
- 新增 TriggerServiceTask 组件,支持调用外部 HTTP 接口并处理返回值映射
- 支持配置请求头、请求体和返回值映射到表单字段
- 提供异常处理机制,支持抛出异常或终止流程两种策略
2026-03-08 15:06:40 +08:00
PIGCLOUD 325f58996d feat(pigx-flow-biz): 实现触发器节点功能
- 在 NodeFormatUtil 中新增 TRIGGER 节点类型处理逻辑
- 重构 ModelUtil 中的 buildSimpleServiceTaskNode 通用方法,支持构建服务任务节点
- 新增 buildTriggerNode 方法,使用 TriggerServiceTask 处理触发器逻辑
- 新增 TriggerServiceTask 组件,支持调用外部 HTTP 接口并处理返回值映射
- 支持配置请求头、请求体和返回值映射到表单字段
- 提供异常处理机制,支持抛出异常或终止流程两种策略
2026-03-08 15:06:36 +08:00
PIGCLOUD b28d86cb59 feat(pigx-flow-api): 新增延时器节点支持
- 新增 TimerConfig 和 TimerDuration DTO 类,用于配置延时器参数
- 在 Node 类中增加 timerConfig 字段,支持延时器配置
- 新增 TIMER 节点类型枚举值

feat(pigx-flow-biz): 实现延时器节点功能

- 在 ModelUtil 中新增 buildTimerNode 方法,支持构建延时器节点
- 新增 TimerHandler 组件,处理表单字段日期格式转换
- 支持三种延时模式:固定时长、指定日期时间、表单字段日期
- 优化连线名称生成逻辑,避免重复设置
2026-03-08 15:06:17 +08:00
PIGCLOUD ecdbfaca68 feat(pigx-flow-biz): 优化流程创建逻辑
- 在创建流程时增加对空节点用户列表的检查,避免空指针异常
- 当 nodeUserList 为空时直接返回成功结果,跳过后续处理步骤
2026-03-08 15:06:12 +08:00
PIGCLOUD 1b27c695d8 feat(pigx-codegen): 优化数据源密码更新逻辑
- 密码为空时自动从数据库查询并解密原始密码用于连接校验
- 简化密码加密逻辑,移除冗余的条件判断
2026-03-08 15:06:08 +08:00
PIGCLOUD 650d791222 feat(pigx-flow-biz): 扩展抄送任务支持角色和岗位类型
- 在 CopyServiceTask 中新增对角色和岗位类型的抄送人员支持
- 新增 addUserIds 工具方法用于用户ID去重合并
- 优化表单数据处理逻辑,避免重复序列化操作
- 更新注释说明支持用户、部门、角色、岗位四种类型
2026-03-08 15:05:50 +08:00
PIGCLOUD ef13df4f79 feat: 优化文件上传配置,统一使用 undertow 服务器设置
- 在 server 配置中新增 undertow.max-http-post-size 参数
- 将 multipart 文件上传大小限制改为引用 undertow 服务器配置
- 保持文件上传大小限制为 100MB,提高配置一致性
2026-03-08 15:05:45 +08:00
PIGCLOUD 191efaad40 feat(pigx-boot): 添加可选模块依赖支持
- 新增 pigx-codegen、pigx-app-server-biz、pigx-daemon-quartz、pigx-flow-biz、pigx-mp-platform、pigx-pay-platform 等可选模块依赖
- 添加注释说明可选模块可根据 AI 能力需求进行删除以提升启动速度
2026-03-08 15:05:36 +08:00
PIGCLOUD 88d057f081 feat(pigx-flow-api): 为 BizFlowBaseDto 添加 ExcelIgnore 注解
- 在 BizFlowBaseDto 的 flowParamMap 字段上添加 @ExcelIgnore 注解
- 导入 cn.idev.excel.annotation.ExcelIgnore 包
2026-03-08 15:05:32 +08:00
PIGCLOUD d70d741e50 refactor: 升级 Spring Boot 版本至 3.5.11
- 更新 pom.xml 中 spring-boot.version 属性为 3.5.11
2026-03-08 15:05:28 +08:00
PIGCLOUD 2efe58556a refactor(pigx-upms-biz): 简化文件上传逻辑,简化文件名编码转换处理逻辑
- 移除 WebUtils 和 StandardCharsets 相关导入
- 删除微服务环境判断逻辑,直接使用 file.getOriginalFilename()
-
2026-03-08 15:03:34 +08:00
PIGCLOUD 583fca8611 fix(codegen): 修复生成模板导出参数的queryForm污染 2026-03-08 15:03:30 +08:00
PIGCLOUD d11856d3f0 refactor(pigx-common-core): 重命名异步任务执行器方法
- 将 applicationTaskExecutor 方法重命名为 applicationAsyncTaskExecutor
- 更新 AsyncSupportConfigurer 配置以使用新的方法名
- 保持线程池配置参数不变
2026-03-08 15:03:27 +08:00
PIGCLOUD 11b6faf6f8 feat(WebCommonConfiguration): 更新异步任务执行器配置,支持Flowable异步任务 2026-03-08 15:03:08 +08:00
PIGCLOUD 84041ed7ce feat(pigx-flow-api): 新增流程状态事件注册与校验功能
- 在FlowStatusEventPublisher中添加流程ID注册和校验方法,使用Redis Set存储已注册的flowId
- 更新FlowStatusEventAutoConfiguration,在启动时自动注册所有本地flowId到Redis
- 重构ProcessServiceImpl中的validateFlowId方法,改为通过Redis查询flowId注册状态
- 优化BpmOaLeaveServiceImpl中的流程参数设置逻辑,使用Dict构建root用户信息
2026-03-08 15:02:49 +08:00
PIGCLOUD 618f3ff1d5 feat(pigx-common-core): 优化WebCommonConfiguration配置类
- 添加@ConditionalOnWebApplication条件注解确保仅在Servlet环境下生效
- 重命名applicationTaskExecutor方法为applicationAsyncTaskExecutor以明确异步执行器用途
- 移除priorityHeaderInitBinder方法上的重复条件注解
- 更新configureAsyncSupport方法使用新的执行器名称
2026-03-08 15:02:45 +08:00
PIGCLOUD 2754607924 feat(pigx-flow-api): 新增流程状态事件发布订阅机制
- 新增 FlowStatusEventPublisher 用于发布流程状态变更事件到 Redis Channel
- 新增 FlowStatusEventListener 用于监听 Redis 消息并分发给匹配的事件服务
- 新增 IProcessInstanceStatusEventService 接口定义流程状态事件处理规范
- 新增 FlowStatusEventAutoConfiguration 自动配置类,实现事件发布者和监听器的 Bean 注册
- 重构 NodeTaskCompleteNotify 服务,使用事件发布机制替代直接调用事件服务
- 将 IProcessInstanceStatusEventService 接口移动到 flow-api 模块的 event 包下
- 在 pigx-flow-api 模块添加 spring-boot-starter-data-redis 依赖支持
- 更新相关服务的包引用和日期注释
2026-03-08 15:02:40 +08:00
PIGCLOUD d1858d5844 feat(pigx-flow-biz): 条件表达式新增角色和岗位选择器条件处理功能
- 新增SelectRoleNodeConditionStrategy类,处理角色选择器类型条件表达式
- 新增SelectPostNodeConditionStrategy类,处理岗位选择器类型条件表达式
- 在ExpressionHandler中新增roleCompare和postCompare方法,支持角色和岗位比较逻辑
- 更新SysUserService接口及实现,新增根据岗位ID列表获取用户ID列表功能
- 在SysUserController中新增根据岗位ID列表获取用户ID列表接口
- 更新RemoteUserService Feign客户端,新增岗位查询方法
- 更新相关文件版权信息和日期注释
- 删除无用的IProcessInstanceStatusEventService接口
- 在数据库中新增bpm_oa_leave请假申请表结构
2026-03-08 15:02:15 +08:00
PIGCLOUD b7631ddeaf feat(pigx-common-core): 增强Web配置支持异步任务处理
- 在WebCommonConfiguration中新增异步任务执行器配置
- 实现WebMvcConfigurer接口并配置AsyncSupportConfigurer
- 添加ThreadPoolTaskExecutor支持Spring MVC异步请求处理
- 通过TaskExecutionProperties配置线程池参数
2026-03-08 15:02:11 +08:00
PIGCLOUD e60a28a17e feat(pigx-upms-api): 新增站内消息/公告发送功能
- 新增MessageNoticeDTO用于站内消息/公告数据传输
- 在RemoteMessageService中添加sendNotice接口
- 在SysMessageService及其实现类中新增sendNotice方法
- 在SysMessageController中新增sendNotice接口并添加权限控制
- 完善消息保存逻辑,支持站内消息/公告的发送
2026-03-08 15:02:04 +08:00
PIGCLOUD 7015e4704c feat(pigx-boot): 在 Dockerfile 中添加中文字体支持
- 安装 wqy-microhei-fonts 以解决词云中文显示问题
- 清理 yum 缓存以优化镜像大小
2026-03-08 15:01:46 +08:00
PIGCLOUD 4868f0d213 fix(pigx-upms-biz): 修复租户用户移除时的租户切换问题
- 在removeTenantUser方法添加@Transactional注解确保事务性
- 增加用户当前租户检查逻辑
- 当用户当前租户是被移除租户时自动切换到其他可用租户
- 更新用户租户信息后清除用户缓存
2026-03-08 15:01:27 +08:00
PIGCLOUD a44319f898 feat(pigx-knowledge): 移除知识库路由配置
- 从 sys_route_conf 表中删除知识库模块的路由配置记录
2026-03-08 15:01:23 +08:00
PIGCLOUD 0187d93912 fix: 更新 spring-boot 版本至 3.5.10,修正 spring-boot-admin 版本至 3.5.7 2026-03-08 15:01:04 +08:00
PIGCLOUD c19c0f1ed4 feat(pigx-mp-platform): 重构 WxMpInitConfigRunner 类,添加详细文档注释
- 优化消息路由规则配置,支持多种微信事件处理
- 增加 Redis 监听机制,支持运行时动态重新加载配置
- 完善多租户支持,缓存 appid 与租户的映射关系
2026-03-08 15:00:56 +08:00
akhan 7e78541763 🐞 fix: 修复当不同租户appid重复时导致的mpservice初始化失败 2026-03-08 14:59:00 +08:00
PIGCLOUD 4d9093c851 fix(pigx-common-bom): 更新依赖版本
- 将 flowable.version 从 7.0.0 升级到 7.2.0
2026-03-08 14:58:55 +08:00
PIGCLOUD f312f1b229 fix(pigx-common-core): #7229 登录时调用 getUserInfo 获取用户权限,但此时租户上下文还没设置(或设置为默认租户 1),导致 findMenuByRoleId 查询的是错误租户的菜单数据。 @786556226 2026-03-08 14:58:51 +08:00
PIGCLOUD 70334d3c11 fix(pigx-common-bom): 更新MyBatis-Plus版本至3.5.16
- 将mybatis-plus.version从3.5.15升级到3.5.16
2026-03-08 14:58:45 +08:00
PIGCLOUD 23287b77ea fix(pigx-common-security): 添加token过期错误提示
- 在messages_en.properties中添加OAuth2ResourceOwnerBaseAuthenticationProvider.tokenExpired错误消息
2026-03-08 14:58:21 +08:00
PIGCLOUDandClaude Opus 4.5 d2f49723d6 feat(upms): 重构连接器导入功能,支持钉钉和企业微信Excel导入
- 优化钉钉部门同步逻辑,提取常量到 ConnectConstants
- 新增企业微信部门及用户Excel导入功能
- 实现钉钉部门和用户Excel导入功能
- 移除API同步功能,统一使用导入方式

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-08 14:58:10 +08:00
PIGCLOUD 31ad1fbeb8 fix(pigx-common-security): 修复用户密码修改时间处理逻辑
- 修改 PigxUserDetailsService 中密码修改时间的处理逻辑
- 当 passwordModifyTime 为 null 时使用 createTime 作为替代值
2026-03-08 14:57:45 +08:00
PIGCLOUD 27898142ac fix(pigx-common-datasource): 修正动态数据源查询中的 del_flag 参数值
- 将 JdbcDynamicDataSourceProvider 中的 del_flag 参数从 YES 改为 NO
- 确保查询未删除的数据源记录
2026-03-08 14:57:02 +08:00
PIGCLOUD bf2ed2f9f7 fix: 修复 sys_dict_item 表数据中新增的 NULL 字段
- 在 sys_dict_item 表的 INSERT 语句中新增了 NULL 字段
- 修改了 0pigxx_boot.sql、2pigxx.sql 和 9pigxx_ai.sql 三个数据库脚本文件
2026-03-08 14:56:37 +08:00
PIGCLOUD fefbc25f45 feat(pigx-upms-api): 为 SysDictItem 添加 listClass 字段用于标签类型
- 在 SysDictItem 实体类中新增 listClass 字段用于标签类型
- 更新数据库表结构,在 sys_dict_item 表中添加 list_class 列
2026-03-08 14:56:12 +08:00
PIGCLOUD 6fc0a3de36 feat(pigx-upms-biz): 增强区域树查询功能
- 在 SysAreaServiceImpl 中添加 areaType 过滤条件
- 重构查询条件构建逻辑,使用 LambdaQueryWrapper
- 保持原有 areaStatus 和 areaSort 排序条件
2026-03-08 14:56:08 +08:00
PIGCLOUD 2acdceac2a feat(i18n): set default locale to China for message sources 2026-03-08 14:56:04 +08:00
PIGCLOUD b59765f927 fix(ai-register-user): 跳过外部 AI 注册短信验证
- 添加 SecurityConstants 导入
- 使用 WebUtils 获取 请求头
- 当 header 为 FROM_IN 时跳过 短信验证
- 保持内部注册验证逻辑
2026-03-08 14:55:44 +08:00
PIGCLOUD 79dd2471ad docs: 添加 aiflow 分支非 AI 代码合并设计方案和实施计划 2026-03-08 14:53:45 +08:00
PIGCLOUD f56a63beba refactor(pigx-common-data): 重构数据权限拦截器实现,使用 JSqlParser 直接操作 AST 修改 WHERE 条件,避免子查询包装导致索引失效
- 支持复杂 SQL 解析失败时自动回退到子查询包装方案
- 优化表引用处理逻辑,优先使用别名限定列名
- 增加 SQL 注入防护,对字符串值进行转义处理
- 重构条件构建逻辑,支持 AND/OR 逻辑组合
- 完善日志记录和异常处理机制
2026-03-08 13:59:39 +08:00
202312111133 173bc6853d 更新 'pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/DataScopeInnerInterceptor.java'
这样修改之后sql会走索引,数据量大的时候不至于查询超时
2026-03-05 16:17:32 +08:00
PIGCLOUD b9268e4393 Merge branch 'dev' 2026-01-03 23:06:51 +08:00
PIGCLOUD c36ef5fdf5 refactor(copyright): 更新版权年份至 2026
- 统一更新所有源文件、LICENSE、pom.xml 等的版权年份至 2026
2026-01-03 22:55:26 +08:00
PIGCLOUD 25e16f5dd6 feat(upms): 优化密码验证逻辑,返回布尔值以指示验证结果 2026-01-03 11:30:51 +08:00
PIGCLOUD 7bdf9e1d8c feat(upms): 增强租户管理功能并优化用户租户信息处理
- 在UserInfo DTO中新增tenantName字段用于返回租户名称
- 重构SysTenantService.getOrUpdateTenant方法返回完整租户对象
- 更新用户登录逻辑以包含租户名称信息
- 修改默认租户名称为PIGX ADMIN
- 优化租户切换逻辑确保缓存一致性
2025-12-30 21:42:42 +08:00
PIGCLOUD 36620c05ad feat(upms): 移除DingTalk SDK中冲突的mail依赖
- 在pom.xml中为alibaba-dingtalk-service-sdk添加exclusions配置
- 排除javax.mail依赖以避免与其他模块的版本冲突
2025-12-30 21:41:49 +08:00
PIGCLOUD 85a1d609e3 feat(tenant): 添加租户上下文过滤器的描述和执行顺序 2025-12-30 14:49:47 +08:00
PIGCLOUD 13d17923e4 feat(upms): 增强短信验证码注册功能和安全机制
- 在RegisterUserDTO中新增短信验证码字段
- 用户注册时增加短信验证码校验逻辑
- 合并短信验证码发送接口为单一API
- 增加IP频率限制防止短信轰炸攻击
- 优化验证码校验失败的错误返回类型
2025-12-30 10:46:02 +08:00
PIGCLOUD e959811fa2 feat(codegen): 支持动态数据源切换功能
- 在GenTableController的export方法中添加DynamicDataSourceContextHolder支持
- 实现根据table参数动态切换数据源功能
2025-12-29 14:53:41 +08:00
PIGCLOUD 5a324b75c9 refactor(build): 移除多个模块中spring-boot-maven-plugin的CLASSIC配置
- 统一清理pigx-flow/pigx-app-server等模块的冗余loaderImplementation配置
- 简化各模块pom.xml中的spring-boot-maven-plugin配置项
2025-12-28 16:38:52 +08:00
PIGCLOUD 6743d8d7ab feat(version): 升级项目版本至5.11.0
- 更新所有模块的pom.xml中version字段
- 同步更新CLAUDE.md文档中的版本信息
2025-12-28 16:33:51 +08:00
PIGCLOUD bfd64bbd47 feat(pay): 升级yungouos-pay-sdk版本并优化依赖配置
- 将yungouos-pay-sdk版本从2.0.37升级至2.0.39
- 排除hutool-all依赖以避免与系统已有依赖冲突
- 在YungouosMergePayOrderHandler中新增pay参数配置
2025-12-28 11:28:02 +08:00
PIGCLOUD 77ebb4fe37 fix(pom): update spring-boot and dynamic-ds versions 2025-12-28 11:27:57 +08:00
PIGCLOUD aaab895655 fix(pom): 更新spring-cloud版本至2025.0.1 2025-12-28 11:27:21 +08:00
PIGCLOUD f30b32a28a feat(upms): 重构国际化消息和错误码模块化架构
- 移除全局ErrorCodes接口,按模块拆分Auth/Upms/App错误码定义
- 新增模块化i18n消息文件,支持多JAR包扫描加载机制
- 重构MsgUtils支持LocaleContextHolder动态区域解析
- 统一OAuthClientException异常处理支持错误码和描述参数
- 优化企业微信/钉钉同步错误消息国际化支持
2025-12-28 11:27:03 +08:00
PIGCLOUD 7911761653 refactor(RemoteUserService): 优化方法参数注解格式以提高可读性 2025-12-28 11:26:23 +08:00
PIGCLOUD 825b9a147b feat(data-permission): 新增数据权限逻辑组合模式支持
- 新增DataScopeLogicEnum枚举类定义AND/OR逻辑组合模式
- 在DataScope类中添加logicMode字段控制权限组合方式
- 修改DataScopeInnerInterceptor支持动态组合权限条件
- 默认保持OR逻辑以向后兼容现有功能
2025-12-28 11:25:42 +08:00
PIGCLOUD 16a7f9309f feat(flow): 新增驳回到发起人功能
- 在ModelUtil重构开始节点结构,添加root UserTask节点
- 新增RootTaskCreateListener处理驳回到发起人场景
- 新增RootTaskHandler解析发起人执行人
- 在ApproveServiceTask添加TO_START驳回处理逻辑
- 新增ProcessInstanceRecordVo包含驳回状态信息
- 在TaskService添加resubmitTask接口处理重新提交
- 在ProcessTaskController添加resubmitTask接口
2025-12-28 11:25:38 +08:00
PIGCLOUD 0ad5864476 feat(process): 新增流程ID有效性验证功能
- 在IProcessService接口添加validateFlowId方法声明
- 在ProcessServiceImpl实现流程ID验证逻辑
- 在ProcessController添加validateFlowId接口供前端调用
- 支持检查流程ID是否在IProcessInstanceStatusEventService实现类中注册
2025-12-28 11:25:36 +08:00
PIGCLOUD d6c1a0aad1 feat(task): completeTask时同步更新主表单数据
- 扩展queryTask接口支持选择主表单数据源
-
- 优化已完成任务的数据获取逻辑
- 保持原有节点快照数据作为备选方案
2025-12-28 11:25:33 +08:00
PIGCLOUD ab97082cd8 feat(menu): 优化removeMenuById方法实现递归删除子菜单 2025-12-28 11:25:26 +08:00
PIGCLOUD 65297a5574 feat(deps): 升级mybatis-plus至3.5.15版本 、升级hutool至5.8.42版本 2025-12-28 11:23:21 +08:00
PIGCLOUD 2716c65170 feat(oss): 优化OssTemplate 在afterPropertiesSet方法中禁用AWS v1弃用公告
- 统一调整代码缩进为4个空格提升可读性
-
- 保持原有功能逻辑不变
2025-12-28 11:21:56 +08:00
PIGCLOUD 87d1162c45 feat(build): 升级Spring Boot版本至3.5.8
- 更新pom.xml中的spring-boot.version属性至3.5.8版本
- 保持其他依赖版本不变
2025-12-28 11:21:41 +08:00
PIGCLOUD 4adc7b00de feat(auth): 重构FormIdentityLoginConfigurer的handler依赖结构
- 将SsoLogoutSuccessHandler移动到common-security模块中统一管理
- 使用TenantSavedRequestAwareAuthenticationSuccessHandler替代原有success handler
- 保持FormAuthenticationFailureHandler作为默认failure handler
2025-12-28 11:21:24 +08:00
PIGCLOUD f181712cf2 feat(pay): 增强支付回调接口的XSS防护功能
- 在aliCallbak和mergeCallbak接口中添加Content-Type和X-Content-Type-Options安全头
- 在mergeBuy接口中设置安全响应头防止XSS攻击
- 统一使用MediaType.TEXT_PLAIN作为响应内容类型
2025-12-28 11:21:20 +08:00
PIGCLOUD e1ac291a1e feat(auth): 增强XSS防护功能
- 在confirm.ftl模板中对principalName等变量添加?html转义
- 在login.ftl模板中对tenant.id和error变量添加防护处理
- 移除冗余的SsoLogoutSuccessHandler实现类
- 在PigxTokenEndpoint中添加XSS防护注释说明
2025-12-28 11:21:18 +08:00
PIGCLOUD 1268e9d604 refactor(pigx-common-sentinel): 添加hutool-extra依赖
- 新增hutool-extra工具库依赖以增强sentinel模块功能
2025-12-28 11:21:08 +08:00
PIGCLOUD 437970b926 feat(SentinelParser): 更新请求来源解析逻辑,基于客户端 IP 地址 2025-12-28 11:21:08 +08:00
pig666 5ce0abdcd6 Merge branch 'dev' of 202504296/pigx into dev 2025-11-18 16:58:17 +08:00
kukinghan 71a6f5c2d7 fix(sql): 修正参数查看菜单的操作标识为'sys_syspublicparam_view' 2025-11-18 16:23:50 +08:00
PIGCLOUD efd195ae37 feat(RemoteDataScopeService): 修改getRoleList参数类型为List<String>以支持字符串类型roleId
- 将getRoleList方法的roleIdList参数类型从List<Long>改为List<String>
- 保持getDescendantList方法的deptId参数类型仍为Long不变
2025-11-18 09:54:56 +08:00
PIGCLOUD 0b939f3d57 feat(gen-table): 批量代码生成支持复用单表的配置信息 2025-11-18 09:39:57 +08:00
PIGCLOUD 5123e3f116 feat(security): 新增单体一键 CORS跨域配置支持 security.cors.enabled
- 新增PigxBootCorsProperties配置类用于管理CORS跨域参数
- 在AuthorizationServer和ResourceServer中集成CORS配置逻辑
- 支持通过security.cors.enabled开关控制跨域功能
- 提供allowedOriginPatterns等细粒度跨域参数配置
2025-11-18 09:39:53 +08:00
PIGCLOUD 470f5e7fdb feat(db): 在sys_user表新增dept_id字段
- 添加主部门ID字段用于关联用户与部门关系
- 更新admin用户的初始化数据包含dept_id值
2025-11-18 09:39:46 +08:00
PIGCLOUD c88762a433 fix(SysUserDept): 修正用户ID和部门ID的Schema描述为正确的格式 2025-11-18 09:39:40 +08:00
PIGCLOUD 6d837c6f1c fix(ImageCodeEndpoint): 修改验证码类型为动态参数,支持多种验证码类型
fix(ValidateCodeFilter): 更新验证码校验逻辑,支持滑块和点击文字验证码
2025-11-18 09:39:37 +08:00
PIGCLOUD 1a8d0c0898 fix(SysDeptMapper): 移除查询结果的排序条件 2025-11-18 09:39:21 +08:00
PIGCLOUD c0112af189 fix(nacos): 更新nacos版本为3.1.0-bugfix以修复已知问题
(cherry picked from commit 99daf9db95)
2025-11-18 09:39:16 +08:00
PIGCLOUD 6de57dfab1 fix(upms): 修复用户登录失败次数缓存清理问题
- 在用户登录成功时清理对应的登录失败次数缓存
- 使用RedisUtils删除格式化的缓存key
- 防止因缓存残留导致用户被错误锁定
2025-11-18 09:39:05 +08:00
PIGCLOUD a25963323b feat(security): 增强OAuth2 token验证的用户状态检查
- 在PigxCustomOpaqueTokenIntrospector中增加用户账号状态检查逻辑
- 当用户账号被锁定或过期时拒绝访问并抛出InvalidBearerTokenException
- 完善账号异常状态的日志记录和错误处理机制
- 保持原有客户端信息注入功能不变
2025-11-18 09:38:55 +08:00
PIGCLOUD 15f28dcd35 feat(personal): 修改手机号,新增短信验证码校验功能
- 在UserDTO中增加验证码字段用于手机号修改校验
- 修改用户信息时增加短信验证码校验逻辑
- 新增验证码错误提示信息到i18n配置
- 扩展SysMessageService支持区分已注册/未注册手机号验证
2025-11-18 09:38:38 +08:00
PIGCLOUD 45146adec1 refactor(dependencies): 升级log4j2版本至2.25.2
- 更新log4j2依赖版本以修复潜在安全漏洞
- 保持与其他依赖版本的兼容性
2025-11-18 09:38:33 +08:00
PIGCLOUD 646859625b refactor(ConnectServiceImpl): 优化第三方API集成代码结构
- 提取DingTalk/WeChat API字段名为常量
- 统一语言代码为常量LANGUAGE_ZH_CN
- 优化JSON字段访问方式避免硬编码
- 重构企业微信配置获取逻辑
- 增强代码可读性与维护性
2025-11-18 09:38:28 +08:00
PIGCLOUD b7c4132765 feat(security): 优化Feign token传递逻辑
- 重构PigxOAuthRequestInterceptor的token获取流程
- 优先从Web请求中解析token,失败后从NonWebTokenContextHolder获取
- 增加Objects.nonNull检查确保request不为空
- 优化token传递逻辑,支持消息队列等非Web场景
2025-11-18 09:38:04 +08:00
PIGCLOUD 74110199e2 fix(login): 增加登录参数空值校验
- 在OscChinaLoginHandler中增加identify空值校验
- 在WeChatCPLoginHandler中增加userid空值校验
- 在CasLoginHandler中增加username空值校验
- 在MiniAppLoginHandler中增加openId空值校验
- 在SmsLoginHandler中增加identify空值校验
- 在GiteeLoginHandler中增加identify空值校验
- 在WeChatLoginHandler中增加openId空值校验
- 在DingTalkLoginHandler中增加openId空值校验
2025-11-18 09:37:57 +08:00
PIGCLOUD 6117c47d7c feat(user): 支持用户多部门关联及主部门切换功能
- 在SysUser实体类中新增deptId字段标识主部门
- 扩展UserDTO支持多部门ID列表传递
- 重构用户部门关联逻辑,支持设置主部门
- 新增获取用户部门列表和切换主部门接口
- 优化部门查询SQL确保主部门排序优先
- 调整用户详情查询逻辑适配多部门场景
2025-11-18 09:37:43 +08:00
PIGCLOUD 99daf9db95 fix(nacos): 更新nacos版本为3.1.0-bugfix以修复已知问题 2025-11-07 15:37:03 +08:00
PIGCLOUD 16dcbef197 feat(pom): 移除不再使用的pigx-common-milvus、pigx-common-mcp和pigx-common-neo4j依赖 2025-10-29 22:22:13 +08:00
PIGCLOUD dc3ad69a38 reset(build): 添加release参数支持JDK新特性编译,避免非Java25
- 在maven-compiler-plugin配置中新增release参数
- 移除过时的annotationProcessorPaths配置
- 保持与source参数一致的JDK版本兼容性
2025-10-28 16:45:00 +08:00
claudecode 92d9b403c0 feat(flowable): 升级Flowable版本至7.2.0并合并flow模块
- 将Flowable依赖版本从7.0.0升级至7.2.0
- 合并pigx-flow-engine-biz和pigx-flow-task-biz模块为pigx-flow-biz
- 简化pom.xml依赖配置结构
2025-10-26 22:37:03 +08:00
claudecode f4508ac412 feat(flowable): 升级Flowable版本至7.2.0并重构数据库工具类
- 将Flowable依赖版本从7.0.0升级至7.2.0
- 提取AbstractEngineConfiguration中的数据库类型映射逻辑到独立工具类DbUtil
- 新增DbUtil工具类封装数据库类型检测和映射功能
- 删除过时的AbstractEngineConfiguration实现类
2025-10-26 22:36:48 +08:00
claudecode 1bb0af7b52 feat(quartz): 新增Job安全验证机制
- 新增JobSecurityValidator类用于防止RCE漏洞
- 在SysJobServiceImpl中集成安全验证逻辑
- 为JavaClassTaskInvok和SpringBeanTaskInvok添加安全验证
- 在quartz-config.yml中新增安全验证开关配置
2025-10-26 21:32:32 +08:00
claudecode 99d295bfa8 feat(sys-token): 增强token管理功能并修复权限控制
- 为分页查询接口添加sys_token_del权限注解
- 修复删除接口的token参数命名不一致问题
- 统一代码缩进格式为4个空格
2025-10-26 21:32:24 +08:00
claudecode 6f9d41b624 feat(flow): 增加流程节点进行中状态展示功能
- 在ProcessInstanceServiceImpl中新增continueNodeSet处理逻辑
- 扩展NodeFormatUtil以支持JXZ状态节点展示
- 优化流程可视化展示效果,区分已完成和进行中节点
2025-10-26 21:32:12 +08:00
claudecode 14cdf670f2 feat(sys-token): 升级nacos版本至3.1.0
- 更新pigx-register模块的nacos依赖版本
- 保持注册配置中心功能与最新稳定版本兼容
2025-10-26 21:32:07 +08:00
徐晓伟 d67bee5476 🔧 支持 JDK 25 编译
(cherry picked from commit 9cea4f20c3)
2025-10-26 21:31:58 +08:00
claudecode 0674403268 feat(deps): 升级Nacos客户端版本以修复兼容性问题
- 添加nacos-client.version属性并设置为3.1.0
- 引入com.alibaba.nacos:nacos-client依赖项
- 解决Nacos相关issue ID2OA3的兼容性问题
2025-10-21 11:27:14 +08:00
claudecode 103f5e72b0 chore(dependencies): 更新依赖库版本
- 升级hutool工具库版本至5.8.41
- 更新spring-cloud-alibaba版本至2025.0.0.0

# Conflicts:
#	pigx-common/pigx-common-bom/pom.xml
2025-10-20 10:27:16 +08:00
claudecode dacdb83989 feat(quartz): 增强多租户定时任务处理逻辑
- 在getJobKey和getTriggerKey方法中增加TenantContextHolder的租户ID兜底逻辑
- 当SysJob中tenantId为空时自动使用当前线程上下文租户ID
- 优化方法注释使其更符合JavaDoc规范
2025-10-20 10:25:38 +08:00
claudecode d16d8bc18a feat(flow): 扩展流程发起人权限验证支持岗位类型
- 在NodeUserTypeEnum中新增POST类型以支持岗位权限验证
- 修改CombinationGroupServiceImpl中的权限验证逻辑,增加对岗位权限的检查
- 调整PigxUser结构以支持多部门、多角色、多岗位的存储
- 更新AssignUserLeaderStrategyImpl以适配用户的多部门信息
- 在SysDeptServiceImpl的getOrgTree方法中增加对岗位类型的支持
- 优化UserVO中集合属性的初始化以避免空指针异常
2025-10-17 15:42:09 +08:00
冷冷 7710baa92a feat(flow): 扩展流程发起人权限验证支持岗位类型
- 在NodeUserTypeEnum中新增POST类型以支持岗位权限验证
- 修改CombinationGroupServiceImpl中的权限验证逻辑,增加对岗位权限的检查
- 调整PigxUser结构以支持多部门、多角色、多岗位的存储
- 更新AssignUserLeaderStrategyImpl以适配用户的多部门信息
- 在SysDeptServiceImpl的getOrgTree方法中增加对岗位类型的支持
- 优化UserVO中集合属性的初始化以避免空指针异常
2025-10-17 14:55:50 +08:00
claudecode 883293cc2a feat(flow): FlowableUtils添加getFlowParamMap方法统一处理流程发起人参数
- BpmOaLeaveEntity继承BizFlowBaseDto以复用流程基础字段
- 新增BizFlowBaseDto作为流程基础数据传输对象
-
- 优化BpmOaLeaveServiceImpl流程启动逻辑,使用工具类简化代码
2025-10-17 08:56:09 +08:00
pigcloud ed6138b566 refactor(dependencies): 升级项目版本至5.10.0
- 统一更新所有模块的parent版本号
- 标准化pom.xml文件格式和缩进
- 保持依赖配置和模块结构的一致性
2025-10-10 12:53:02 +08:00
pigcloud 4b8775153b refactor(dependencies): 升级项目依赖版本
- 升级 Spring Boot 版本至 3.5.6
- 升级 Spring Boot Admin 版本至 3.5.5
- 升级 MyBatis Plus 相关依赖版本
- 升级 Hutool 工具库版本至 5.8.40
2025-10-10 12:50:39 +08:00
pigcloud f53e542100 ref(flow-biz) 合并 flow-task 、flow-engine 模块 2025-10-10 09:43:40 +08:00
PIGAI 38916dda25 feat(security): 新增单体架构下内部请求头安全过滤机制
- 添加PigxInnerHeaderRemoveFilter类用于防止前端伪造inner header
- 实现基于IP地址和FROM请求头的访问控制逻辑
- 在AutoConfiguration中注册过滤器配置
- 添加hutool-extra依赖支持IP地址工具类
2025-10-09 14:52:27 +08:00
冷冷 d8ddacd143 feat(register): 增加数据库连接池配置参数
- 添加connectionTimeout与validationTimeout配置项
- 提升数据库连接稳定性和超时控制能力
2025-10-09 14:52:19 +08:00
冷冷 e3f4200a39 feat(role-menu): add new role menu entry for ID 1105 2025-10-09 14:51:58 +08:00
冷冷 9ee99d4063 style(common-oss): 统一代码格式并优化路径分隔符处理
- 将代码缩进统一调整为4个空格
- 将硬编码路径分隔符替换为FileUtil.FILE_SEPARATOR
- 优化AmazonS3Client构建器的代码格式
- 移除冗余注释和空行
2025-10-09 14:51:42 +08:00
冷冷 b329b5c501 feat(pay): 优化微信支付URL构建逻辑
- 重构redirectUri构建方式,调整参数顺序提高可读性
- 简化URL拼接逻辑,移除不必要的条件判断
- 保持原有功能不变的情况下改进代码结构
2025-10-09 14:51:39 +08:00
冷冷 8c924da2dc feat(pay): 更新微信支付回调URL和重定向URI以支持微服务架构
- 修改WeChatMpPayOrderHandler中notify_url路径逻辑适配微服务环境
- 调整PayGoodsOrderController中redirect_uri构造方式支持微服务路由
- 使用WebUtils.isMicro()动态判断当前运行环境
- 统一支付模块在微服务和单体架构下的URL路径格式
2025-10-09 14:51:29 +08:00
PIG AI 02e60b3968 feat(security): 为关键接口添加权限控制注解
- 在SysPublicParamController等Controller的分页查询方法添加@HasPermission注解
- 新增sys_user_view等权限菜单项到数据库
- 更新角色菜单关联表以包含新增权限
- 修复渗透测试发现的权限控制缺失问题
2025-10-09 14:51:09 +08:00
PIG AI c6c76b3cbd feat(fix): 移除创建用户时自动关联租户的逻辑 #6864 5.9版本,通过excel表批量导入用户,前端提示“上传失败,数据格式不合法!”,刷新后发现只有1条导入。 2025-10-09 14:50:42 +08:00
lengleng 9c237c9921 feat(flow): 支持业务表单,提供业务表单示例 2025-10-09 14:50:28 +08:00
lengleng cd1854e498 feat(flow): 支持业务表单,提供业务表单示例 2025-10-09 14:50:27 +08:00
lengleng 0d5326ff77 fix(sys): 修复通讯录菜单路径错误
- 修正sys_menu表中通讯录菜单的路径为/biz/app/appContacts/index
- 同步更新0pigxx_boot.sql和2pigxx.sql中的相关记录
2025-10-09 14:49:53 +08:00
lengleng 0eaa4b6d11 feat(flow): 新增表达式分配用户策略支持
- 在Node DTO中添加assignExpress和assignExpressName字段
- 实现AssignExpressStrategyImpl表达式分配策略类
- 支持通过表达式动态计算任务执行人列表
- 优化NodeFormatUtil中的用户分配逻辑
- 更新ProcessInstanceConstant添加表达式分配类型常量
2025-10-09 14:48:42 +08:00
lengleng 79b27b6d7d feat(auth): 增强认证逻辑,支持密码过期校验及定时攻击保护机制 2025-10-09 14:48:11 +08:00
lengleng 2551ef2606 refactor(RedisUtils): 统一RedisTemplate泛型类型并优化代码格式
- 将所有RedisTemplate声明统一为<String, Object>类型提高类型安全
- 调整代码缩进格式为统一标准
- 移除冗余的Optional.ofNullable包装简化代码逻辑
- 保持原有Redis操作方法功能不变
2025-10-09 14:47:45 +08:00
lengleng a60127323e refactor(sequence): 优化Redis序列号生成器实现
- 使用Lombok的@Getter/@Setter简化stringRedisTemplate和stepStart字段访问
- 移除冗余的空字符串检查方法isEmpty
- 清理未使用的getter/setter方法减少代码量
- 保持原有核心序列号生成逻辑不变
2025-10-09 14:47:41 +08:00
lengleng 70855f8b5b fix(auth): 修复微信登录新用户插入用户表时返回信息报错问题#6809
- 在retrieveUser方法中添加对pigxUser.getTenantId()的非空检查
- 使用Objects.nonNull确保tenantId不为空时才设置TenantContextHolder
2025-08-05 14:54:22 +08:00
PIG AI f01440dd9e Merge branch 'master' of https://git.pig4cloud.com/pig/pigx 2025-07-16 22:52:24 +08:00
PIG AI f6798c1d21 fix(db): 移除用户表的phone和username唯一约束 2025-07-16 22:50:22 +08:00
PIG AI 1ef50a6d5b fix(upms): 调整User SQL条件顺序避免逻辑删除不生效问题 2025-07-16 22:49:16 +08:00
pig666 79841ced60 Merge branch 'master' of pig666/pigx into master
# PIG 系统功能更新记录

## 最新更新 (8分钟前) - 6a4b25b3d2
### 🐛 修复:菜单权限查询优化
- **提交类型**: fix
- **模块**: SysMenuMapper
- **内容**: 为 `listMenusByRoleId` 方法添加 `@InterceptorIgnore` 注解
- **目的**: 忽略 tenantLine 拦截器,避免菜单权限查询时的多租户干扰
- **影响**: 修复了角色菜单权限查询在多租户环境下的异常问题

```java
@InterceptorIgnore(tenantLine = "true")
List<SysMenu> listMenusByRoleId(@Param("roleId") Long roleId);
```

---

## 18小时前更新 - e1f5bf6325
### ✨ 功能增强:用户查询多租户过滤
- **提交类型**: feat
- **模块**: tenant
- **内容**: 在 `listTenantUser` 方法中增加 tenantId 过滤条件
- **目的**: 确保用户查询严格按照租户隔离
- **影响**: 提升了多租户环境下用户数据的安全性和准确性

```java
public List<SysUser> listTenantUser(Long tenantId) {
    return baseMapper.selectList(
        Wrappers.<SysUser>lambdaQuery()
            .eq(SysUser::getTenantId, tenantId)
            .eq(SysUser::getDelFlag, CommonConstants.STATUS_NORMAL)
    );
}
```

---

## 1天前更新 - 7be922ef0f
### ✨ 重大功能:多租户手机号管理重构
- **提交类型**: feat
- **模块**: tenant
- **主要功能**:
  1. **手机号唯一性校验**: 在多租户环境下确保手机号的唯一性
  2. **密码重置接口重构**: 支持多租户场景下的密码重置
  3. **短信验证码接口优化**: 增强多租户支持

#### 具体改进内容:

##### 1. 手机号唯一性校验
```java
/**
 * 校验手机号在当前租户下的唯一性
 */
public boolean validatePhoneUnique(String phone, Long tenantId, Long userId) {
    LambdaQueryWrapper<SysUser> wrapper = Wrappers.<SysUser>lambdaQuery()
        .eq(SysUser::getPhone, phone)
        .eq(SysUser::getTenantId, tenantId)
        .eq(SysUser::getDelFlag, CommonConstants.STATUS_NORMAL);

    if (userId != null) {
        wrapper.ne(SysUser::getUserId, userId);
    }

    return baseMapper.selectCount(wrapper) == 0;
}
```

##### 2. 密码重置接口重构
```java
/**
 * 多租户环境下的密码重置
 */
public R<Boolean> resetPassword(String phone, String newPassword, Long tenantId) {
    SysUser user = baseMapper.selectOne(
        Wrappers.<SysUser>lambdaQuery()
            .eq(SysUser::getPhone, phone)
            .eq(SysUser::getTenantId, tenantId)
            .eq(SysUser::getDelFlag, CommonConstants.STATUS_NORMAL)
    );

    if (user == null) {
        return R.failed("用户不存在");
    }

    // 重置密码逻辑
    user.setPassword(passwordEncoder.encode(newPassword));
    return R.ok(updateById(user));
}
```

##### 3. 短信验证码接口优化
```java
/**
 * 发送短信验证码(支持多租户)
 */
public R<Boolean> sendSmsCode(String phone, Long tenantId, String type) {
    // 验证手机号是否存在于当前租户
    boolean exists = baseMapper.exists(
        Wrappers.<SysUser>lambdaQuery()
            .eq(SysUser::getPhone, phone)
            .eq(SysUser::getTenantId, tenantId)
            .eq(SysUser::getDelFlag, CommonConstants.STATUS_NORMAL)
    );

    if (!exists) {
        return R.failed("手机号不存在");
    }

    // 发送短信验证码逻辑
    return smsService
2025-07-16 11:57:55 +08:00
PIG AI f9e960ea1f Merge remote-tracking branch 'origin/master' 2025-07-16 11:48:41 +08:00
PIG AI 6a4b25b3d2 fix(SysMenuMapper): 为listMenusByRoleId方法添加InterceptorIgnore注解忽略tenantLine拦截 2025-07-16 11:48:35 +08:00
PIG AI e1f5bf6325 feat(tenant): 在listTenantUser方法中增加tenantId过滤条件 2025-07-15 17:03:45 +08:00
PIG AI 7be922ef0f feat(tenant): 新增手机号唯一性校验逻辑,重构密码重置和短信验证码接口支持多租户
- 优化部门校验使用isEmpty()方法
- 在SysMessageServiceImpl中为短信发送添加租户隔离支持
2025-07-15 10:06:45 +08:00
PIG AI 2b64a4cfe1 Merge branch 'dev' 2025-07-09 21:18:27 +08:00
PIG AI 8d81533751 fix(security): 增强OAuth2 token管理功能, 确保删除操作后清理残留的username关联键 2025-07-09 21:18:15 +08:00
PIG AI 72e575bbbe feat(codegen): 更新默认分支配置为next
- 将PigxCodeGenDefaultProperties的默认branch值从master改为next
- 保持与项目最新开发分支策略同步
2025-07-09 21:18:14 +08:00
PIG AI fea0028126 Merge branch 'master' into dev 2025-07-09 21:16:32 +08:00
PIG AI 9649b980e5 fix(security): 增强OAuth2 token管理功能, 确保删除操作后清理残留的username关联键 2025-07-09 21:16:13 +08:00
PIG AI 651ff2c74e feat(codegen): 更新默认分支配置为next
- 将PigxCodeGenDefaultProperties的默认branch值从master改为next
- 保持与项目最新开发分支策略同步
2025-07-09 17:55:12 +08:00
PIG AI 6bdbb17dd3 fix(upms): 修复多租户环境下用户查询功能
- 在getUserListByUserName方法中增加TenantBroker.noneAs包装
- 在getUserListByIds方法中增加TenantBroker.noneAs包装
- 确保跨租户查询时能正确获取用户数据
2025-07-08 22:55:34 +08:00
PIG AI c855344c3c fix(quartz): 修复任务状态查询条件错误问题 fix: #6220 Quartz查询BUG 页面任务状态查询无效
- 修正SysJobController中getSysJobPage方法的jobStatus查询条件
- 将误用的jobGroup参数改为正确的jobStatus参数
- 确保任务状态筛选功能正常工作
2025-07-08 15:09:08 +08:00
PIG AI 0c11c4ffa9 refactor(ProcessInstanceServiceImpl): 优化流程实例结束逻辑
- 使用LambdaUpdateChainWrapper重构流程实例结束状态更新逻辑
- 将Optional条件判断改为更简洁的ifPresent方式
- 提高代码可读性与维护性

refactor(TaskServiceImpl): 增强流程终止功能

- 在停止流程实例后自动更新流程记录状态
- 添加YJS状态标记和结束
2025-07-08 11:59:36 +08:00
PIG AI 31cae49a17 refactor(SysUserMapper): 优化用户查询方法命名和SQL逻辑
- 将selectVoListByScope重命名为getUserVoListByScope以保持命名一致性
- 优化SQL查询条件顺序,将tenant_id条件前置
- 在用户列表查询中增加phone模糊查询条件
- 调整tenant_id IS NULL条件位置以提高查询效率
2025-07-07 11:49:18 +08:00
PIG AI f7c1dc402a fix(SysUserMapper): 优化数据权限条件
- 在getUserVosPage和selectVoListByScope查询中增加dept_id字段返回
- 统一SQL条件判断的缩进格式
- 保持模糊查询和精确查询条件的一致性
2025-07-07 11:30:20 +08:00
PIG AI 887c9c32e3 refactor(xxl-job): 升级xxl-job-admin 3.1.1 2025-07-07 10:53:57 +08:00
PIG AI fdc704d564 refactor(xxl-job): 升级xxl-job-admin 3.1.1 2025-07-07 10:53:44 +08:00
PIG AI fdc3ba87da refactor(xxl-job): 升级xxl-job-admin 3.1.1 2025-07-07 10:53:38 +08:00
PIG AI 2fc40ac21a refactor(xxl-job): 升级xxl-job-admin 3.1.1 2025-07-07 10:53:26 +08:00
PIG AI c9124d11c6 refactor(pigx-register): 移除冗余的maven-compiler-plugin配置 2025-07-07 09:32:08 +08:00
PIG AI 769d49a0d5 refactor(nacos): 更新nacos版本并添加maven-compiler-plugin配置
- 将nacos依赖版本从3.0.0升级至3.0.2.OEM版本
- 新增maven-compiler-plugin插件并启用parameters配置
2025-07-06 23:06:02 +08:00
PIG AI 23a464bb7f refactor(user): 使用RedisUtils替代StringRedisTemplate进行重置验证码缓存操作 2025-07-06 14:48:20 +08:00
PIG AI cb7e7222c4 feat(db): 更新测试数据和租户有效期
- 将sys_tenant表的有效期延长至2099-12-31
- 更新sys_user和app_user的联系电话为17338122125
- 保持其他用户信息和密码hash不变
2025-07-06 14:05:18 +08:00
PIG AI f0b83406be feat(upms): 新增ByteArrayMultipartFile工具类实现内存型文件上传
- 实现基于byte[]的MultipartFile接口适配RemoteFileService
- 提供两种构造方式支持直接byte[]或InputStream输入
- 包含完整文件属性(name/originalFilename/contentType)处理方法
- 内置空文件检查和文件大小计算能力
2025-07-05 15:27:31 +08:00
PIG AI a3951a0368 refactor(excel): 替换alibaba-excel为fastexcel依赖
- 将alibaba-excel相关import更新为cn.idev.excel
- 更新pom.xml中依赖为fastexcel 1.2.0
- 修改Excel相关注解及工具类的包路径
2025-07-05 14:58:12 +08:00
PIG AI 88da029a7e refactor(app-pom):统一依赖版本管理,将pigx-app-server-api的硬编码版本号替换为动态project.version变量 2025-07-05 09:23:46 +08:00
PIG AI d32b1af5e4 refactor(auth): 统一代码格式与优化注释风格
- 规范多个类中的代码缩进与空行格式
- 删除冗余注释与不必要的空行
- 统一catch代码块的花括号换行风格
- 优化方法注释的简洁性与一致性
- 调整部分类成员变量的声明顺序
2025-07-05 09:12:00 +08:00
PIG AI dc0e814522 refactor: 统一代码格式,优化注释风格 2025-07-05 09:11:13 +08:00
PIG AI bcfeec31bc feat(tenant): 新增租户信息自动校验与更新功能
- 在SysTenantService中新增getOrUpdateTenant方法实现租户状态自动校验
- 用户登录后自动检查并更新过期租户信息至有效租户
- 重构租户删除逻辑至removeTenant方法并统一缓存清理
- 将用户租户更新接口迁移至SysTenantController
- 优化用户信息查询时自动触发租户校验逻辑
2025-07-05 09:06:08 +08:00
PIG AI c0e9ed69be feat(auth): 优化登录失败次数统计逻辑
- 使用RedisUtils.increment替代原生Redis命令实现递增操作
- 简化代码结构并提升可读性
2025-07-05 09:00:34 +08:00
PIG AI 2d7d089fcd feat(auth): 优化租户过期验证逻辑并统一Redis key格式
- 修改登录失败/成功处理中的Redis key格式,移除tenantKeyStrResolver依赖
- 简化RedisUtils.execute调用方式,移除冗余的RedisCallback类型声明
- 在SysTenantServiceImpl中增加租户状态和时间有效性过滤
- 重构TenantContextHolderFilter的租户验证逻辑,增加remoteTenantService备用查询
- 调整租户无效时的HTTP状态码为426并优化响应内容类型
2025-07-04 16:41:06 +08:00
PIG AI 00efa97eef feat(cache): 在RedisUtils中增加increment方法并优化验证码缓存服务
- 新增RedisUtils.increment方法用于原子递增操作
- 重构CaptchaCacheServiceProvider使用RedisUtils替代直接stringRedisTemplate调用
- 统一Redis缓存操作工具类方法调用方式
2025-07-04 12:24:28 +08:00
PIG AI bf1e58fb71 feat(auth): 增加租户上下文支持
- 在retrieveUser方法中为PigxUser类型设置TenantContextHolder
- 确保用户认证时自动携带租户ID信息
2025-07-04 12:07:17 +08:00
PIG AI 32c7aec93d fix(mybatis): 修复匿名用户处理逻辑返回null值问题
- 修改AnonymousAuthenticationToken情况下的返回值为null
- 优化authentication对象存在性检查逻辑
2025-07-04 12:07:15 +08:00
PIG AI 809b17da68 feat(file): 增强文件下载功能与实体定义
- 使用SysFile.Fields常量替代硬编码字符串字段名
- 增加文件不存在时的日志警告与提前返回处理
- 为SysFile实体添加FieldNameConstants注解与Serial标记
- 优化文件下载响应头设置与异常处理逻辑
2025-07-04 12:07:06 +08:00
PIG AI c8edf16536 feat(security): 重构Redis存储的OAuth2授权服务
- 将PigxRedisOAuth2AuthorizationService迁移至common-security模块
- 使用RedisTemplate替代RedisUtils进行缓存操作
- 增加Jackson序列化支持RouteDefinitionVo
- 优化token存储逻辑与过期时间处理
- 统一授权服务与路由管理的Redis配置
2025-07-04 12:07:00 +08:00
PIG AI d392f2f03a feat(deps): 升级jimu.version从1.8.1到2.0.0以使用新功能
- 替换TinyPinyin依赖为io.github.biezhi版本2.0.3.RELEASE
- 移除无法从中央仓库下载的com.github.promeg版本
2025-07-04 12:06:49 +08:00
PIG AI 0be39ba180 feat(upms): 增加用户表唯一约束并优化用户查询逻辑
- 在user表增加phone和username字段的UNIQUE KEY约束
- 修改SysUserController的details接口查询逻辑
- 通过TenantBroker.noneAs实现跨租户查询用户信息
2025-07-04 12:06:38 +08:00
PIG AI 6dfa937f34 feat(tenant): 新增用户租户关联关系API
- 在SysTenantController中新增addUserTenant接口用于处理用户租户关联
- 完善SysTenantServiceImpl中用户岗位关联逻辑的空值检查
- 新增用户租户关联DTO参数校验和权限控制
2025-07-04 12:05:37 +08:00
PIG AI 21130253a4 feat(tenant): 重构租户用户关系管理
- 新增sys_tenant_user表用于存储租户与用户的多对多关系
- 移除SysTenantServiceImpl中初始化用户的冗余逻辑
- 调整数据库初始化脚本以适配新的用户租户关系模型
2025-07-04 12:05:00 +08:00
PIG AI b1646437bc feat(tenant): 完善用户注册时tenantId的自动填充逻辑
- 在RegisterUserDTO中新增tenantId字段用于接收前端传入的租户ID
- 修改SysUserServiceImpl中用户注册逻辑,支持自动继承当前登录用户的tenantId
- 调整SysUserMapper.xml查询条件,允许查询未分配tenantId的用户
2025-07-04 12:04:57 +08:00
PIG AI 886471f96a refactor(db): update gen_template_group records with new group_id values
- Changed group_id from specific large values to simplified values (1 and 2) for better clarity and consistency in the gen_template_group table inserts.
2025-07-04 12:04:32 +08:00
PIG AI 2db74fc7d6 feat(tenant): 重构用户关联表结构以支持多租户
- 移除sys_user表中的dept_id字段
- 在sys_user_post和sys_user_role表中新增tenant_id字段
- 新增sys_user_dept表存储用户部门关系
- 更新测试数据以适配新的表结构
2025-07-04 12:04:27 +08:00
PIG AI c8a8da7497 feat(tenant): 新增租户用户管理功能
- 在SysUserPost实体类中添加tenantId字段
- 新增SysTenantUserDTO用于租户用户数据传输
- 在SysTenantController中新增用户租户管理接口
- 实现租户用户的增删改查及分页查询功能
- 优化ValidateCodeFilter中的验证码校验逻辑
- 修复PigxUserDetailsService中空部门列表处理问题
2025-07-04 12:01:27 +08:00
PIG AI db332055ae refactor(user): 优化用户部门关系处理逻辑
- 简化SysUserDept的插入操作,直接使用insert方法替代复杂条件判断
- 移除冗余的exists查询和lambda表达式包装逻辑
2025-07-04 12:01:19 +08:00
PIG AI d3770993ce refactor(user): update user information retrieval to use UserDTO and improve method documentation 2025-07-04 11:58:50 +08:00
PIG AI 3a53fb5677 feat(redis): 添加Redis工具类,优化RedisTemplate配置 2025-07-04 11:57:22 +08:00
PIG AI 5058c07bff refactor(auth): 优化OAuth2认证模块文档与token查询逻辑
- 重构OAuth2ResourceOwnerBaseAuthenticationProvider的JavaDoc为中文文档
- 优化token查询接口的分页处理逻辑
- 使用TenantContextHolder替代tenantKeyStrResolver获取租户信息
- 简化token列表查询直接从Redis key解析基础信息
2025-07-04 11:56:36 +08:00
PIG AI 7205251977 feat(upms): ❕ 增强多租户支持,支持在线切换租户
- 新增SysTenantUser实体类及Mapper用于租户用户关系管理
- 新增SysUserDept实体类及Mapper实现用户多部门支持
- 重构用户信息查询逻辑,支持跨租户查询
- 优化部门管理,支持多租户下的部门树查询
- 扩展UserInfo DTO增加deptId字段
- 重构Redis授权服务,优化租户信息存储结构

# Conflicts:
#	pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysTenantController.java
#	pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java
2025-07-04 11:56:14 +08:00
PIG AI 8227768849 refactor(flow-engine): 增强多租户支持
- 在EngineProcessInstanceController中增加tenantId过滤条件
- 在EngineFlowController中为部署和启动流程添加tenantId参数
- 优化流程查询时增加tenantId条件检查
- 统一使用TenantContextHolder获取当前租户信息
2025-07-04 11:50:22 +08:00
PIG AI a970fe166a refactor(stream): 替换Collectors.toList()为toList()方法
- 优化代码简洁性,使用Java 16引入的Stream.toList()替代Collectors.toList()
- 统一代码风格,减少冗余代码
- 提升代码可读性,简化stream操作
2025-07-04 11:50:17 +08:00
PIG AI e2e73dffda feat(register): 添加logback日志配置并设置nacos日志级别
- 新增logback-spring.xml配置文件用于日志管理
- 设置nacos相关日志级别为OFF以减少干扰
- 配置console和file两种日志输出方式
- 在PigxNacosApplication中指定日志配置文件路径
2025-06-25 17:10:59 +08:00
PIG AI f7edba9801 feat(deps): 升级pigx-common-idempotent模块的redisson版本至3.50.0 2025-06-25 11:35:56 +08:00
PIG AI 24a685bc54 feat(config): 更新application-dev和pigx-gateway-dev配置
- 修改application-dev.yml的jasypt加密配置和redis host配置
- 更新pigx-gateway-dev.yml的路由配置和management端点权限
- 为所有配置添加public tenant_id字段
2025-06-24 10:43:03 +08:00
PIG AI b49e8bf736 feat(config): 更新日志级别和版本配置
- 将logback-spring.xml中的root日志级别从debug调整为INFO级别
- 更新docker-compose.yml中的使用说明版本至V5.9并移除version字段
- 升级pigx-app-server-api模块的pom.xml版本至5.9.0
2025-06-24 09:28:43 +08:00
PIG AI 946ca2ef38 revert(app): 移除无用注解和字段并调整代码格式
- 移除AppPageEntity中的@FieldNameConstants注解
- 删除PageTypeEnums中的WORKBENCH枚举项
- 调整AppArticleCollectEntity字段缩进格式
- 简化AppRole中的roleDesc字段描述并移除menuId字段
2025-06-24 09:28:23 +08:00
PIG AI de7e1fb4df feat(pom): 升级项目版本及依赖版本
- 将项目版本从5.8.0升级至5.9.0
- 升级spring-boot版本至3.5.3
- 升级spring-boot-admin版本至3.5.0
- 更新所有子模块的parent版本号
2025-06-24 09:00:07 +08:00
PIG AI 607f7a13eb revert(app): 移除无用注解和字段并调整代码格式
- 移除AppPageEntity中的@FieldNameConstants注解
- 删除PageTypeEnums中的WORKBENCH枚举项
- 调整AppArticleCollectEntity字段缩进格式
- 简化AppRole中的roleDesc字段描述并移除menuId字段
2025-06-24 08:57:25 +08:00
PIG AI 7d422b91ab feat(deps): 更新依赖库版本
- 升级captcha组件版本至1.4.0
- 移除不再需要的jaxb依赖库
- 清理pom.xml中过时的依赖配置
2025-06-23 16:20:26 +08:00
PIG AI 5978f87268 feat(auth): 更新captcha依赖库
- 将滑块验证码依赖从spring-boot-starter-captcha替换为captcha-spring-boot-starter
- 使用pig-mesh维护的新版本captcha组件
2025-06-23 16:20:13 +08:00
PIG AI 1e9c1bd054 feat(boot-config): 禁用Spring Cloud服务发现功能
- 在application.yml中设置spring.cloud.discovery.enabled为false
- 保持与原有nacos配置一致的禁用状态
2025-06-23 16:19:59 +08:00
PIG AI f796c87342 feat(codegen): 更新代码生成模板至V2025001版本 2025-06-23 16:19:59 +08:00
PIG AI 679aebdbb7 feat(codegen): 更新代码生成模板至V2025001版本 2025-06-23 16:19:59 +08:00
PIG AI 52e5be9442 feat(codegen): 新增分支配置支持并更新默认配置前缀
- 修改PREFIX为pigx.codegen以增强配置项命名空间隔离性
- 新增branch字段用于指定代码生成模板仓库的分支
- 更新GenTemplateServiceImpl中模板文件获取逻辑以支持多分支
- 默认分支设置为master保持向后兼容性
2025-06-23 16:19:58 +08:00
PIG AI 78874c1646 refactor(pom): 适配 springboot 3.5 & spring cloud 2025 2025-06-23 16:19:50 +08:00
PIG AI fe9151c2f2 feat(db-config): 更新mybatis-plus的where策略配置
- 将select-strategy修改为where-strategy以优化SQL查询条件生成逻辑
- 保持其他mybatis-plus配置不变
2025-06-23 16:18:32 +08:00
PIG AI 9601609eb2 feat(sse): 优化SSE模块配置与文档
- 重命名messageDistributor为sseMessageDistributor以明确功能定位
- 为SseEmitterEndpoint添加详细方法注释说明
- 优化RedisMessageDistributorConfiguration类结构与文档
- 更新SseEmitterMessageSender类文档与日期信息
- 为MessageDistributorTypeConstants添加类说明文档
2025-06-23 16:18:14 +08:00
PIG AI 718a587c19 feat(tenant): 增强租户状态检查逻辑
- 新增对租户有效期的检查,包括startTime和endTime验证
- 优化无效租户的响应方式,返回401状态码和JSON格式错误信息
- 使用JSONUtil和ContentType处理错误响应输出
- 添加@SneakyThrows注解处理潜在异常
2025-06-23 16:18:09 +08:00
PIG AI 6c8e257a1e fix(auth/templates): 修复模板中request.contextPath的空指针问题
- 在confirm.ftl和login.ftl模板中增加request对象判空逻辑
- 优化OAuth2授权和登录表单的action路径安全性
2025-06-23 16:17:05 +08:00
PIG AI 880652f62c fix(file): 修复文件查询时未使用主库读取导致的数据不一致问题
- 在SysFileServiceImpl中为selectOne方法添加false参数强制使用主库查询
- 优化SysFileController中getFile方法的参数注释说明
2025-06-23 16:16:44 +08:00
PIG AI 155a303bec feat(sys-file): 支持自定义文件名上传功能
- 在文件上传接口中增加fileName参数以支持自定义文件名
- 当未提供fileName时保持原有UUID生成逻辑
- 同步修改相关controller和feign接口的签名
- 完善相关方法的JavaDoc注释
2025-06-23 16:16:44 +08:00
PIG AI 8d0eb9c8fb feat(mybatis): 修改匿名用户处理逻辑以返回用户名
- 移除未使用的SecurityUtils import
- 当用户为AnonymousAuthenticationToken时返回authentication.getName()
- 保持原有非匿名用户处理逻辑不变
2025-06-23 16:16:39 +08:00
PIG AI 00fb8ce48b feat(file): 新增内部文件上传接口
- 在RemoteFileService中新增innerUpload方法并添加NoToken注解
- 在SysFileController中新增innerUpload接口方法并标记为Inner
- 支持通过微服务内部调用上传文件功能
2025-06-23 16:16:12 +08:00
PIG AI 64cdd035e1 feat(app): 新增工作台菜单权限过滤功能
- 在AppIndexServiceImpl中实现基于角色权限的菜单过滤
- 新增WORKBENCH页面类型枚举
- 为AppRole添加menuId字段存储权限菜单
- 扩展AppRoleService提供菜单查询接口
- 优化AppArticleCollectEntity增加image和visit字段
2025-06-23 16:15:39 +08:00
PIG AI 404d7bf6c2 feat(SysLogServiceImpl): 增加按title模糊查询日志功能
- 在SysLogServiceImpl中新增对title字段的模糊查询条件
- 当title参数非空时自动添加like查询条件
2025-06-23 16:15:24 +08:00
PIG AI 2ad48fb751 fix(pom): 回退druid版本至1.2.23
- 将druid依赖版本从1.2.24降级至1.2.23
- 解决与当前系统其他组件的兼容性问题https://github.com/alibaba/druid/issues/6263
2025-06-23 16:15:20 +08:00
PIG AI 560129fc06 feat(security): 优化oauth2.0 的自省端点
- 在PigxRemoteRegisteredClientRepository中实现findById方法
- 优化PigxRedisOAuth2AuthorizationService的token处理逻辑
- 修复findByToken方法中tokenType为null时的默认值处理
- 添加根据username清理token的功能扩展
2025-06-23 16:15:17 +08:00
PIG AI bcd0f82bcc refactor(pigx-register): 简化Nacos启动配置并移除冗余代码
- 删除ConfigConstants.java文件,其配置已迁移至application.properties
- 移除Spring Boot Admin相关配置,简化监控设置
- 重构PigxNacosApplication启动类,精简初始化逻辑
- 将standalone模式配置移至main方法直接设置
- 优化部署类型处理流程,保持核心功能不变
2025-06-23 16:14:58 +08:00
PIG AI 1b560e486b feat(codegen): 修改GeneratorController下载文件名为固定值
- 将动态生成的zip文件名改为固定code.zip
- 简化下载文件名逻辑,统一输出格式
2025-06-23 16:14:49 +08:00
冷冷 0a661a3dc3 chore(nacos.properties): 更新配置文件,优化注释和设置 2025-06-23 16:14:29 +08:00
冷冷 f3738c4e11 docs(pom): 更新Hutool依赖版本至5.8.38 2025-06-23 16:14:28 +08:00
冷冷 c3f6e68770 feat(sys-file): 增加对历史URL参数格式的兼容处理
- 新增对/admin/sys-file/local?fileName=xxx.png格式的兼容支持
- 使用HttpUtil解析URL中的fileName参数
- 当URL参数存在时优先使用参数中的fileName值
2025-06-23 16:09:57 +08:00
冷冷 be30534c40 feat(SysFileServiceImpl): 优化文件获取方法的注释和参数说明
- 更新getFile方法的注释使其更清晰表达功能意图
- 移除未使用的bucket参数以简化方法签名
- 添加对fileName和response参数的详细说明
2025-06-23 16:09:54 +08:00
冷冷 6912730e94 feat(RemoteFileService): 新增文件上传功能
- 在RemoteFileService接口中添加upload方法用于文件上传
- 支持MultipartFile类型参数和MULTIPART_FORM_DATA媒体类型
- 返回R对象包含文件存储路径信息
2025-06-23 16:09:34 +08:00
冷冷 d8e56129bc feat(NACOS): 新增Nacos配置常量与环境初始化逻辑
- 在ConfigConstants中新增AUTH_ENABLED等三个配置常量
- 将standalone模式设置移至initEnv方法统一管理
- 新增initEnv方法集中配置认证开关与日志参数
- 更新docker-compose暴露9848和18080端口
- 优化代码注释与日期格式
2025-06-23 16:09:22 +08:00
冷冷 4779be6cfd feat(flow-engine): 优化审批任务处理逻辑并增强代码可读性
- 重构ApproveServiceTask类,提取拒绝处理逻辑到独立方法
- 增加详细注释说明关键变量和流程逻辑
- 优化变量命名以提高代码可读性
- 实现更清晰的审批条件判断流程
- 支持根据配置将拒绝流程重定向到特定节点或结束节点
2025-06-23 16:09:22 +08:00
冷冷 298d09586d feat(flow-engine): 增强流程结束功能并记录完成原因
- 新增ProcessInstanceParamDto中paramMap参数的传递
- 在ProcessInstanceRecord表中添加finish_reason字段
- 根据approve_condition自动设置流程结束原因
- 重构endProcess方法以支持参数传递
2025-06-23 16:09:21 +08:00
冷冷 2b1742470c docs(pig-register): 更新Nacos相关配置文档
- 中文优化application.properties中的配置项注释
- 中文明确标注已禁用的监控指标配置
- 中文补充认证插件相关配置说明
- 中文调整部署类型和模糊监听配置描述
2025-06-23 16:08:50 +08:00
冷冷 d87172db05 feat(register): 更新Nacos版本至3.0.0, 请注意端口是 18080 2025-06-23 16:07:11 +08:00
冷冷 19a223695f refactor(core): 重构WebPriorityHeader相关配置类并优化结构
- 将PriorityHeaderConfiguration重命名为PriorityHeaderInitBinder以明确用途
- 合并RestTemplate配置至新创建的WebCommonConfiguration类
- 在WebCommonConfiguration中统一管理Web相关Bean配置
- 添加ConditionalOnWebApplication条件注解确保Servlet环境
2025-06-23 16:06:54 +08:00
冷冷 37035cbf27 refactor(core): 重构WebPriorityHeader相关配置类并优化结构
- 将PriorityHeaderConfiguration重命名为PriorityHeaderInitBinder以明确用途
- 合并RestTemplate配置至新创建的WebCommonConfiguration类
- 在WebCommonConfiguration中统一管理Web相关Bean配置
- 添加ConditionalOnWebApplication条件注解确保Servlet环境
2025-06-23 16:06:54 +08:00
冷冷 bf8b8805c8 feat(pigx-common-bom): 升级MyBatis-Plus相关依赖版本
feat(pigx-codegen): 修改GenTableColumnEntity字段更新策略

- 升级MyBatis-Plus版本至3.5.12
- 升级MyBatis-Plus-Join版本至1.5.3
- 修改fieldDict字段的更新策略为ALWAYS
2025-06-23 16:06:21 +08:00
冷冷 d0f89b7917 feat(flow-engine): 完善ApprovalCreateListener代码注释 2025-06-23 16:06:17 +08:00
冷冷 6b48ccf74a feat(flow-engine): 增加流程事件监听器的代码注释
- 新增对节点开始/完成事件的详细处理逻辑
- 完善多实例任务完成事件的处理机制
- 增加变量创建/更新/删除事件日志记录
- 优化流程开始/终止事件的处理流程
- 增强任务分配/完成事件的通知机制
- 统一事件处理参数构建方式
2025-06-23 16:06:14 +08:00
冷冷 b3834e3215 feat(common-sensitive): 新增URL参数脱敏功能及枚举类型(ai-dev)
1. 在DesensitizedUtils工具类中新增url()方法,实现URL参数脱敏功能
2. 在SensitiveTypeEnum枚举中新增QUERY_PARAM类型,关联新增的脱敏方法
3. 方法会将URL参数值统一替换为***以保护敏感信息
2025-06-23 16:06:08 +08:00
冷冷 dc37974c72 chore(deps): 更新Spring Boot版本至3.4.5并移除废弃依赖项
- 升级Spring Boot版本从3.4.3到3.4.5
- 移除不再使用的spring-authorization.version属性
- 清理pigx-common-security模块中冗余的版本号配置
2025-06-23 16:06:08 +08:00
冷冷 f1231ec841 chore(deps): 更新 deepseek 依赖版本至 1.4.7 2025-06-23 16:05:35 +08:00
冷冷 7f9e6105f8 feat(core): 添加PriorityHeaderConfiguration解决请求头冲突问题 2025-06-23 16:05:22 +08:00
冷冷 1700648c2e feat(flow): 新增流程实例详情接口并优化代码格式
- 增加查询流程实例记录的远程接口
- 统一和优化部分代码缩进与注释描述
- 修正“查询挖矿任务”为“查询我的任务”中文注释
2025-06-23 16:05:06 +08:00
冷冷 a5abaa4d2c chore(deps): 更新 deepseek 依赖版本至 1.4.6 2025-06-23 16:04:46 +08:00
冷冷 e78eb14898 chore(docker): 移除JVM内存配置参数并优化安全随机数设置 2025-06-23 16:04:38 +08:00
冷冷 8edb1458a0 feat(mybatis): 支持Oracle和PostgreSQL数据库的SQL表名提取功能 2025-06-23 16:04:25 +08:00
冷冷 7db8f47e39 fix(persistence): update SQL Server version and simplify order by clause in SysUserMapper 2025-06-23 16:04:06 +08:00
冷冷 7f79e077d1 feat(codegen): 修改数据源表和列查询接口返回完整对象
- 将`queryTableList`和`queryTableColumn`返回值从字符串列表改为完整的`Table`和`Column`对象
- 移除`GenDsConfController`的`@Inner`注解限制
2025-06-23 16:03:49 +08:00
冷冷 c303196fe7 feat(pay): 在YungouosMergePayOrderHandler中新增BizParams参数支持
在YungouosMergePayOrderHandler的nativePay方法中,新增了BizParams参数支持,以增强支付功能的灵活性。
2025-06-23 16:03:29 +08:00
冷冷 0422a35562 chore(deps): 更新 pigx-pay-platform 中的 yungouos 依赖版本至 2.0.37 避免和SMS4J 版本冲突无法推送短信 2025-06-23 16:03:26 +08:00
冷冷 96011a3663 fix(app): 移除短信验证码返回中的冗余信息
在 `AppMobileServiceImpl` 中,短信验证码接口的返回值移除了多余的 `code` 参数,简化了响应结构。
2025-06-23 16:03:05 +08:00
luolin 9b4590ccbb ♻️ Refactoring code.命名规范防止冲突 2025-06-23 16:02:56 +08:00
冷冷 47a4421cb3 refactor(mp): 重构粉丝信息处理逻辑,提取保存粉丝方法到 WxAccountFansService
本次提交提取了粉丝信息的保存逻辑到 `WxAccountFansService` 中,优化了代码复用性。具体改动包括:
- 在 `WxAccountFansService` 中新增 `saveFans` 方法,用于统一处理粉丝信息的保存。
- 在 `MsgHandler`、`SubscribeHandler` 和 `LocationHandler` 中调用 `saveFans` 方法,减少重复代码。
- 修正了部分代码格式问题,提升代码可读性。

该重构未引入新功能,仅优化了代码结构,提升了代码的可维护性。
2025-06-23 16:01:23 +08:00
冷冷 29de9b5732 fix(quartz-config): 添加缺失的auto-startup和overwrite-existing-jobs配置
在`quartz-config.yml`中添加了`auto-startup`和`overwrite-existing-jobs`配置项,确保Quartz调度器的默认行为与预期一致。
2025-06-23 16:01:10 +08:00
冷冷 d0a5e0f66b chore(docker): 调整 JAVA_OPTS 内存配置并减少启动等待时间
- 将 `JAVA_OPTS` 中的 `-Xms` 和 `-Xmx` 分别调整为 `2048m` 和 `4096m`
- 将 `CMD` 中的 `sleep` 时间从 `60` 秒减少到 `30` 秒
2025-06-23 16:01:10 +08:00
PIG AI 01724e788a Merge remote-tracking branch 'open/master' into dev 2025-06-23 16:00:07 +08:00
pig666 6764a33d1d Merge branch 'dev' of 202405031425/pigx into dev 2025-04-02 17:15:02 +08:00
pig666 daafcd9eea Merge branch '微信jssdk' of 202405031425/pigx into dev 2025-04-02 17:14:18 +08:00
akhan cee6524ffb ✨ feat: 微信JSSDK配置 2025-04-02 14:30:00 +08:00
akhan bf410db2eb ✨ feat: 微信JSSDK配置 2025-04-02 14:20:54 +08:00
akhan 2abb4faacf ✨ feat: 微信JSSDK配置 2025-04-01 14:53:49 +08:00
akhan cba22d4066 ✨ feat: 登录页新增找回密码功能 2025-03-28 11:18:34 +08:00
冷冷 b55f7fbe91 fix(xxl-job-admin): 修复XxlJobInfoMapper.xml中trigger_status的条件更新逻辑
#6315 5.8版本 xxl-job运行一次后自动停止
2025-03-19 18:26:36 +08:00
冷冷 86a3340802 fix(xxl-job-admin): 修复XxlJobInfoMapper.xml中trigger_status的条件更新逻辑
#6315 5.8版本 xxl-job运行一次后自动停止
2025-03-19 18:24:16 +08:00
冷冷 69d0589222 feat(ai-chat): 添加 AI 聊天功能及相关 DTO 和控制器
- 新增 `AiChatMessageDTO` 用于处理 AI 聊天消息
- 新增 `AiChatController` 提供 AI 聊天接口,支持普通聊天和网络搜索模式
- 在 `pom.xml` 中添加大模型相关依赖
2025-03-12 12:08:05 +08:00
冷冷 c536348d52 feat(ai-chat): 添加 AI 聊天功能及相关 DTO 和控制器
- 新增 `AiChatMessageDTO` 用于处理 AI 聊天消息
- 新增 `AiChatController` 提供 AI 聊天接口,支持普通聊天和网络搜索模式
- 在 `pom.xml` 中添加大模型相关依赖
2025-03-12 12:05:58 +08:00
pig666 b08b69c29b Merge branch 'dev' of 171829182/pigx into dev 2025-03-11 21:44:23 +08:00
冷冷 4978ab23f6 chore(config): 优化 application.yml 文件中的配置格式并启用 openfeign.okhttp
- 简化 `nacos`、`sentinel` 配置项的格式
- 启用 `openfeign.okhttp` 功能
- 删除多余的换行符,提升可读性
2025-03-11 21:27:15 +08:00
曼陀罗 a825de905a refactor(mybatis-plus): 将 selectBatchIds 方法替换为 selectByIds
- 在多个模块中,将 baseMapper.selectBatchIds 替换为 baseMapper.selectByIds- 在多个模块中,将 removeByDsId 中的 deleteBatchIds 替换为 deleteByIds- 在多个模块中,将 list 方法中的 in 条件的参数从数组转换为列表
2025-03-11 17:59:33 +08:00
冷冷 5b5aac37d0 feat(core): 在 WebUtils 中添加 isMicro 方法用于检测微服务环境
新增 `isMicro` 方法,通过 `SpringContextHolder` 获取应用上下文并检查 `security.micro` 属性,默认返回 `true`。
2025-03-10 23:40:00 +08:00
冷冷 e7bea5e221 refactor(xxl-job): 优化任务注册中心的时间处理逻辑,在 XxlJobRegistryMapper.xml 中,简化 SQL 查询条件,直接使用 expiredTime 参数。 2025-03-10 18:58:46 +08:00
冷冷 186505deac chore(deps): 更新 pigx-common-bom 中的 javers 版本至 7.8.0
此次提交将 `javers` 依赖版本从 `7.3.3` 升级至 `7.8.0`,以保持依赖的最新状态并可能修复已知问题或引入新功能。
2025-03-10 14:59:21 +08:00
冷冷 9f7f4c4564 feat(oss): 添加 skipMd5Check 配置项以支持跳过 MD5 检查
#6272 使用腾讯云存储COS ,图片不能正常下载的问题, Invalid base 16 character: '"'
2025-03-10 14:12:29 +08:00
冷冷 aef21008d9 chore(deps): 更新 pigx-common-bom/pom.xml 添加 swagger-annotations 依赖
此次提交在 `pigx-common-bom/pom.xml` 中添加了 `swagger-annotations` 依赖,版本号为 `${swagger.core.version}`。该变更属于项目配置维护的一部分,旨在确保项目的依赖完整性。
2025-03-10 10:46:31 +08:00
冷冷 675d068018 chore(deps): 更新 sms4j 依赖的 groupId 为 org.dromara.sms4j
将 `sms4j` 相关的依赖从 `io.github.pig-mesh.sms4j` 更新为 `org.dromara.sms4j`,确保依赖的准确性和一致性。
2025-03-09 20:53:49 +08:00
冷冷 3a8116b5ea chore(pom): update version from 5.7.0 to 5.8.0 across multiple modules 2025-03-09 20:47:25 +08:00
冷冷 fd44cc6042 refactor(pay-channel): 重构支付渠道查询逻辑并增加敏感信息脱敏处理 2025-03-08 17:13:34 +08:00
冷冷 a328d1c90e feat(sensitive): 新增 JSON 格式数据脱敏功能
在 `DesensitizedUtils` 类中新增 `json` 方法,支持对 JSON 数据进行脱敏处理。该方法允许根据指定的字段进行模糊或精确匹配,并对匹配的字段值进行脱敏处理。
2025-03-08 17:12:46 +08:00
冷冷 4ea3b805fe feat(pay): 在 YungouosMergePayOrderHandler 中提取并传递 key 参数
从支付渠道配置中提取 `key` 参数,并将其传递给 `MergePay.nativePay` 方法,以支持更灵活的支付配置。
2025-03-08 16:19:32 +08:00
冷冷 d0e54a7013 doc(sql): 适配 nacos 2.5 SQL 脚本有调整,需要加字段 2025-03-08 16:17:17 +08:00
冷冷 8c0d8c0284 chore(nacos): update nacos version to 2.5.0 and add tomcat dependencies 2025-03-08 13:28:56 +08:00
冷冷 312720fada feat(flow-task): 新增序列号组件 (依赖于后端赋值) 2025-03-07 23:02:22 +08:00
冷冷 af90a5c906 fix(upms): 发送短信记录日志表的请求参数 2025-03-07 18:18:42 +08:00
冷冷 8bc5f95291 fix(upms): 用户导出报错,升级 MyBatisPlus 的缘故 2025-03-07 18:18:23 +08:00
冷冷 32b5ecf6ed refactor(app): 底部tabbar 支持优先级排序 2025-03-07 18:18:05 +08:00
冷冷 d474799fa7 feat(encrypt-api): 支持全局请求报文加密
BREAKING CHANGE: 文档和用法完全和之前不一样,不需要耦合代码
2025-03-07 18:18:02 +08:00
冷冷 ecc0c8ac93 fix(mp): 微信公众号支持配置单个主菜单 2025-03-07 18:17:59 +08:00
冷冷 6b5dbb86cb chore(codegen): #6238 配置达梦数据源后,下载文档失败 2025-03-07 18:16:13 +08:00
冷冷 dbd552a42c feat(quartz): 新增任务配置校验功能#6109 【需求】定时任务维护增强判断,直接查询 SpringBean class 判断入参是否合法 2025-03-07 18:16:06 +08:00
冷冷 deddae63d5 refactor(auth): 移除不必要的日志依赖,简化 TenantSavedRequestAwareAuthenticationSuccessHandler 类 2025-03-07 18:14:03 +08:00
冷冷 3e016ecc4f Revert "refactor(common-oss): S3文件上传简化去掉byteinputstream"
This reverts commit a7f85b5824de208f5b692cf62a8f7caa16fea4ea.
2025-03-07 18:12:36 +08:00
冷冷 7a97f94557 chore(deps): 添加 deepseek-spring-boot-starter 依赖并更新 pigx-common-bom/pom.xml
在 `pigx-common-bom/pom.xml` 中添加了 `deepseek-spring-boot-starter` 依赖,版本为 `1.4.5`,并新增了 `pigx-common-milvus` 依赖。这些变更为项目引入了新的功能模块,支持 AI 相关的功能扩展。
2025-03-07 18:12:32 +08:00
冷冷 518720d325 refactor(sse): 优化 SseEmitterEndpoint 确保在 onCompletion、onTimeout 和 onError 时清理 SseEmitter。
同时,将 `SecurityUtils.getUser().getId()` 提取为局部变量 `userId`,减少重复代码。

在 `SseEmitterHolder` 中,修改了 `removeSseEmitter` 方法的参数类型和实现,使其直接通过 `SseEmitter` 对象进行删除,提升代码可读性和维护性。

此外,移除了 `SseEmitterMessageSender` 中未使用的 `ReflectUtil` 导入,保持代码简洁。
2025-03-07 18:12:23 +08:00
冷冷 818b4370d2 feat(upms): 新增列出 Hook 业务代码功能
在 `SysMessageServiceImpl`、`SysMessageController` 和 `SysMessageService` 中新增 `listHookBizCode` 方法,用于根据 `MessageHookDTO` 查询并列出符合条件的业务代码。
2025-03-07 18:11:37 +08:00
冷冷 4ed963af5d chore(bom): update springdoc and swagger.core versions 2025-03-07 18:11:29 +08:00
冷冷 ee2453934d fix(report): 在SecurityRequestFilter中添加从cookie中获取token的逻辑
- 当请求头中不存在token时,尝试从cookie中获取token,增强安全性和兼容性。
2025-03-07 18:11:12 +08:00
冷冷 597123ae6d feat(auth): 修改查询token的接口路径为/token/query-token 2025-03-07 18:11:09 +08:00
冷冷 a233aa5b5a refactor(upms-api): 优化 SysRouteConf 实体类的字段填充逻辑
在 `SysRouteConf` 实体类中,为 `createBy`、`updateBy`、`createTime`、`updateTime` 和 `delFlag` 字段添加了 `@TableField` 注解,以自动填充
2025-03-07 18:08:35 +08:00
冷冷 db2f4ffa71 refactor(pay): 优化支持回调链接根据架构自动适配 2025-03-07 18:08:35 +08:00
冷冷 ecad480ec7 chore(deps): 更新 sms4j 依赖的 groupId 和版本号
将 `sms4j` 依赖的 `groupId` 从 `org.dromara.sms4j` 更新为 `io.github.pig-mesh.sms4j`,并将版本号从 `3.3.3` 升级到 `3.3.4`。
2025-02-25 18:10:29 +08:00
冷冷 a285a86571 chore(deps): 更新 mybatis-plus 依赖版本至 3.5.10.1 2025-02-23 22:18:45 +08:00
冷冷 990824343d chore(deps): 更新 spring-boot 版本至 3.4.3
此次提交将 `spring-boot` 的依赖版本从 `3.4.2` 升级至 `3.4.3`,以保持依赖的最新状态。
2025-02-23 22:12:51 +08:00
冷冷 c485de19f2 chore(deps): 更新 hutool 和 spring-authorization 依赖版本
将 `hutool` 从 `5.8.34` 升级到 `5.8.36`,并将 `spring-authorization` 从 `1.4.1` 升级到 `1.4.2`,以获取最新的功能和修复。
2025-02-19 11:57:08 +08:00
冷冷 8afdafbea4 refactor(auth): 将 requestCache 字段修改为 final,增强类的不可变性 2025-02-18 22:18:46 +08:00
冷冷 3a5d7a9eb9 refactor(auth): 移除不必要的日志依赖,简化 TenantSavedRequestAwareAuthenticationSuccessHandler 类 2025-02-18 22:18:22 +08:00
冷冷 7f8626e04f feat: 更新 PigxTokenEndpoint 和相关模板,优化授权流程和界面 2025-02-18 22:17:42 +08:00
冷冷 cfae5e1c05 feat: 删除PigxBootSecurityServerConfiguration文件并优化授权服务器配置(jdk17-dev)
删除`PigxBootSecurityServerConfiguration`文件,将相关配置迁移至`AuthorizationServerConfiguration`。
优化`AuthorizationServerConfiguration`中的授权服务器安全策略,移除不必要的条件注解`@ConditionalOnProperty`。
修复`FormIdentityLoginConfigurer`中的表单登录处理URL,确保与授权服务器配置一致。
2025-02-18 20:25:11 +08:00
冷冷 a00f4f81a4 chore(deps): 更新 Spring Security 配置并引入 Lazy 注解 (jdk17-dev)
在 `AuthorizationServerConfiguration` 中移除 `DelegatingAuthenticationConverter` 的重复导入,并调整其位置。在 `PigxResourceServerConfiguration` 中引入 `@Lazy` 注解优化依赖注入,同时将 `PrePostTemplateDefaults` 替换为 `AnnotationTemplateExpressionDefaults`。
2025-02-18 19:41:57 +08:00
冷冷 03c3b96275 chore(deps): 更新 Spring Boot 和 Spring Cloud 版本 (jdk17-dev)
将 Spring Boot 版本从 3.3.6 更新至 3.4.2,Spring Cloud 版本从 2023.0.4 更新至 2024.0.0。同时更新了 Spring Boot Admin 和 Spring Authorization 版本。
2025-02-18 19:23:39 +08:00
冷冷 803cf33d1e refactor(core): xxl-job-admin 3.0 2025-02-17 17:29:12 +08:00
冷冷 cb131319be feat(upms): 单体模式下不执行路由初始化 2025-02-17 15:35:50 +08:00
冷冷 3e7df4cc61 feat(core): Add utility method to convert boolean to YesNoEnum code 2025-02-17 15:35:50 +08:00
冷冷 84a5f75776 doc(sql): 删除单体版本 sys_role_menu 无用的SQL 数据 2025-02-08 15:17:12 +08:00
冷冷 67150af00a doc(sql): app sql 调整 2025-02-08 15:17:09 +08:00
冷冷 d8c9f64079 fix(core): login token user_id set string type 2025-02-08 15:17:06 +08:00
冷冷 552d6feaf9 feat(flow): 适配 form-design 表单设计器 2025-02-04 15:23:00 +08:00
冷冷 7dab2a5121 doc(SQL): 增加敏感词类型 sensitive_type 字典 2025-02-04 14:13:46 +08:00
冷冷 0777db3cd2 doc(SQL): 更新阿里巴巴素材库图标,统一现有图标数据 2025-02-04 14:07:26 +08:00
冷冷 a63d66f291 feat(flow): 适配 form-design 表单设计器 2025-02-04 10:19:26 +08:00
冷冷 11d2262b8c feat(flow): 适配 form-design 表单设计器 2025-02-04 10:15:30 +08:00
冷冷 bba2e67f23 fix(xxl-job-admin): 执行器管理 OnLine 列表为空 2025-02-04 10:12:38 +08:00
冷冷 5332ee8ce3 refactor(common-datasource): 重构动态数据源,同支持 YAML + JDBC ,兼容Druid 标准配置 2025-02-04 10:12:34 +08:00
冷冷 08f9b493e0 refactor(common-oss): S3文件上传简化去掉byteinputstream 2025-02-04 10:11:56 +08:00
冷冷 ab86bce01c fix(flow): 获取部门主管的时候,提示用户凭证已过期
Closes #6183
2025-01-22 15:10:22 +08:00
冷冷 59c8d2a672 refactor(app): 底部tabbar 支持优先级排序 2025-01-16 11:18:02 +08:00
冷冷 7b1e95f5ff refactor(APP): APP 装修配置优化 2025-01-16 11:17:17 +08:00
冷冷 17a081edb8 upgrade(codegen): anyline 20250109 版本
fix Oracle 读取表的问题
2025-01-13 15:50:48 +08:00
冷冷 63318ae288 Merge branch 'jdk17' into jdk17-dev 2024-12-25 15:15:59 +08:00
冷冷 f6a8ba8c0e doc(no): 删除工单模板,无实际意义 2024-12-25 12:01:36 +08:00
冷冷 cc0f1cda67 feat(data): 支持通过参数跳过数据权限
用法:
DataScope dataScope = new DataScope();
dataScope.setSkip(true);
baseMapper.selectPageByScope(page, wrapper, dataScope);
2024-12-25 09:36:18 +08:00
冷冷 31f41db931 fix(upms): register user can not set roleId
特别重要的更新,涉及安全问题
2024-12-23 15:04:27 +08:00
冷冷 d249355f05 refactor(sentinel): 避免 sentinel 健康检查 强制检测 server 2024-12-16 14:19:56 +08:00
冷冷 75549547b5 refactor(社交登录): 前后端使用统一枚举,避免重复代码 2024-12-05 22:58:22 +08:00
冷冷 9415d82c28 🔖 V5.7.0 2024-12-05 12:23:43 +08:00
冷冷 a55f6d0bfb refactor(idempotent): 重构幂等切面,用原子性操作替换双检锁 2024-12-04 14:22:26 +08:00
冷冷 754d6428c4 upgrade(spring-cloud-alibaba): 2023.0.3.2 2024-12-03 10:30:33 +08:00
冷冷 a013b5196a refactor(security): 异常信息使用 messages_zh_CN.properties 国际化文件处理 2024-12-01 15:04:50 +08:00
冷冷 0a8586ef1e refactor(flowable): 审批节点增加任务转办按钮 2024-12-01 15:02:29 +08:00
冷冷 2999ed8e3a refactor(flowable): 审批节点增加任务转办按钮 2024-12-01 15:01:56 +08:00
冷冷 4f8a78661b upgrade(spring cloud): 2023.0.4 2024-11-29 09:37:03 +08:00
冷冷 8baef653f1 upgrade(all): 5.7.0-SNAPSHOT 2024-11-27 22:04:25 +08:00
冷冷 e77e2c5a4a refactor(security): 增加 satoken 通用配置属性 2024-11-27 20:11:57 +08:00
冷冷 bc305ca84a revert(codegen): 删除 sas oauth2 依赖,避免 satoken 单体 401 2024-11-27 20:10:33 +08:00
冷冷 062034a3a3 upgrade(jimu): 1.8.1 ,避免 CVE 2024-11-26 21:14:35 +08:00
冷冷 536be6fb15 refactor(data): 数据权限查询角色优化 2024-11-26 14:14:27 +08:00
冷冷 0d798c328f refactor(data): 数据权限查询角色优化 2024-11-26 14:06:11 +08:00
冷冷 9cf022c717 upgrade(all): core version upgrade 2024-11-25 09:59:14 +08:00
冷冷 2608b831ff fix(admin): 创建租户时默认的创建的租户角色
Closes #6071
2024-11-25 09:49:50 +08:00
冷冷 f3a03c1afa Merge remote-tracking branch 'gitee/jdk17-dev' into jdk17-dev 2024-11-24 18:06:03 +08:00
冷冷 3b7a66652a fix(log): 操作日志上面的统计图时间轴乱序
Closes #6004
2024-11-24 18:05:51 +08:00
冷冷 64e17420ef refactor(login): 优化短信发送日志级别&小程序登录异常判断 2024-11-24 18:05:00 +08:00
冷冷 eec245d4ad refactor(core): 优化默认查询SQL输出,quartz、工作流的SQL 不输出 2024-11-24 18:04:50 +08:00
冷冷 10e5234e34 refactor(core): 适配 mybatis-plus 3.5.9 2024-11-24 18:04:22 +08:00
冷冷 d9ed794fc3 refactor(app): 优化APP 模块登录用户名不匹配的日志 2024-11-24 17:43:30 +08:00
冷冷 4ff88571c7 doc(sequence): 维护相关驱动包依赖说明注释 2024-11-24 17:42:24 +08:00
冷冷 8d0faea641 fix(security): check-token token相关接口错误时返回不正确的json
Closes #5998
2024-11-24 17:42:14 +08:00
冷冷 c617a8b7e2 fix(log): 操作日志上面的统计图时间轴乱序
Closes #6004
2024-11-24 17:41:40 +08:00
冷冷 4c8ae51957 refactor(login): 优化短信发送日志级别&小程序登录异常判断 2024-11-24 17:41:29 +08:00
冷冷 2d999e325b refactor(flow): rename flow api feign api 2024-11-24 17:41:29 +08:00
冷冷 5d3eba85c4 refactor(flow): 优化flow api 方便业务侧无token 发起流程 2024-11-24 17:40:55 +08:00
冷冷 b62b13fdaf refactor(flow): 优化flow api 方便业务侧无token 发起流程 2024-11-24 17:40:17 +08:00
冷冷 bb1a78e859 upgrade(sas): 1.3.3. 2024-11-24 17:39:53 +08:00
冷冷 fb10c25c6f refactor(core): 适配 mybatis-plus 3.5.9 2024-11-24 17:39:10 +08:00
冷冷 f2384b2b73 upgrade(core): mybatis-plus、druid、 mybatis-plus-join、hutool
- 升级 mybatis-plus 至 3.5.9(原版本为 3.5.8)
- 升级 mybatis-plus-join 至 1.5.2(原版本为 1.4.13)
- 升级 druid 至 1.2.23

BREAKING CHANGE: mybatos-plus 3.5.9 让人头疼,不如叫他 3.6.0 很多不兼容性的内容,注意注意!!!
2024-11-24 17:39:10 +08:00
冷冷 f763512a6c refactor(core): 优化默认查询SQL输出,quartz、工作流的SQL 不输出 2024-11-24 17:38:55 +08:00
冷冷 61d08708b9 upgrade(xxl-job): 2.4.2 2024-11-24 17:38:40 +08:00
冷冷 52827cdbf9 upgrade(xxl-job): 2.4.2 2024-11-24 17:38:39 +08:00
冷冷 61121eb507 refactor(core): 调整 request.getParameterMap()等使用,兼容东方通等容器 2024-11-24 17:38:31 +08:00
冷冷 0d9461d036 refactor(report): 适配达梦 hibernate 6.1 & mybatis-plus 3.5.9 2024-11-24 17:38:18 +08:00
冷冷 6ca76a3016 upgrade(nacos): nacos 2.4.3 2024-11-24 17:38:11 +08:00
冷冷 0243e59041 feat(pay): 修改退款成功状态回调逻辑
- 更新 TradeStatusEnum.java:
  修改第22行,新增 TRADE_CLOSED 状态,关联 REFUND_SUCCESS。

- 更新 AlipayPayNotifyCallbackHandler.java:
  修改第123行,完善退款成功状态判断逻辑,
  如果 trade_status=TRADE_CLOSED 则设置订单状态为 REFUND_SUCCESS,
  否则设置为 TRADE_SUCCESS。

- 更新前端文件 src/views/biz/pay/order/index.vue:
  在第256行新增退款成功状态(label: '退款成功', value: '5'),
  以支持退款成功状态在前端的显示。
2024-11-24 17:38:09 +08:00
冷冷 9dd236e068 refactor(xxl): 重构代码 mapper.xml 支持达梦数据库 2024-11-22 11:35:39 +08:00
冷冷 075cda636a refactor(data): 业务代码里的规则,覆盖计算规则 2024-11-22 10:38:15 +08:00
冷冷 02dea27959 refactor(data): 支持多角色数据权限计算 2024-11-21 23:10:28 +08:00
冷冷 fddf156651 refactor(data): 支持多角色数据权限计算 2024-11-21 23:10:13 +08:00
pig666 59ebbb65de Merge branch 'jdk17-dev' of 673315837/pigx into jdk17-dev 2024-11-06 13:26:21 +08:00
673315837 3f82770353 CaptchaCacheServiceProvider添加接口的increment实现 2024-11-06 12:46:01 +08:00
冷冷 a99abf52a6 refactor(app): app-biz/pom.xml 增加默认的profile cloud 2024-09-13 11:06:06 +08:00
luolin 1e79c85b17 ♻️ Refactoring code.解决数据库存空串的情况 2024-09-10 23:00:13 +08:00
冷冷 e7e31200f2 fix(tenant): #5911 5.6 租户管理 套餐变更清理指定租户的菜单缓存 2024-09-10 23:00:10 +08:00
冷冷 a48e51eda9 fix(app): 导航栏编辑SQL报错 2024-09-08 16:34:03 +08:00
冷冷 4fbc5e6c14 doc(数据库): 字典表增加 【敏感词类型】 2024-09-04 17:18:05 +08:00
冷冷 0d8cde1e13 refactor(core): TenantContextHolderFilter 清空TTL 避免内存泄漏
Closes 5896
2024-09-03 16:23:50 +08:00
冷冷 fd6875763b refactor(websocket): 更换成ConcurrentWebSocketSessionDecorator非阻塞式的sendMessage发送 2024-09-03 11:31:17 +08:00
冷冷 2071195f7d fix(common-sensitive): 默认权限字符串修改为 no_mask 2024-09-01 14:13:43 +08:00
冷冷 9dc190df59 Merge branch 'jdk17-dev' of https://git.pig4cloud.com/pig/pigx into jdk17-dev 2024-08-28 17:40:29 +08:00
冷冷 17a7351e31 fix(app): 【紧急紧急】 APP登录序列化错误导致登录失败 2024-08-28 17:39:49 +08:00
pig666 eac1c8beaf Merge branch 'jdk17-dev' of 2422024617/pigx into jdk17-dev
~
2024-08-28 15:05:11 +08:00
X.Yang 5e5e36d1d4 fix(sql): 修复菜单配置错误导致文档扩展无法使用问题
- 文档扩展菜单 Path 由 http://pigx-gateway:9999/admin/doc.html 变更为 http://pigx-gateway:9999/doc.html
2024-08-28 11:34:02 +08:00
冷冷 350414563c Merge branch 'jdk17' into jdk17-dev 2024-08-27 13:14:34 +08:00
冷冷 43fed57a86 fix(代码生成): 数据库表、字段缓存元数据不更新
(cherry picked from commit 9a6751301d43b7314a32b0d3d5eb16e3020867bf)
2024-08-27 13:09:47 +08:00
冷冷 b87a0839e0 upgrade(version): 5.6.0 2024-08-26 23:48:40 +08:00
冷冷 89dd047167 upgrade(version): 5.6.0 2024-08-26 23:45:03 +08:00
冷冷 f4e0455376 refactor(common-job): 执行器access-token 字段属性变更,保持和官方配置一致 2024-08-23 11:54:13 +08:00
冷冷 62d0271af5 upgrade(core): spring boot 3.3.3 2024-08-23 11:27:43 +08:00
冷冷 d72fade7b0 refactor(sensitive): 增加 common-sensitive 2024-08-22 15:10:28 +08:00
冷冷 0e8858a338 Merge branch 'jdk17' of https://git.pig4cloud.com/pig/pigx into jdk17 2024-08-22 12:47:50 +08:00
冷冷 b5a33cbdd0 Merge branch 'refs/heads/jdk17-dev' into jdk17 2024-08-22 12:46:54 +08:00
冷冷 b560859f20 refactor(代码生成): 默认情况下不自动同步路由 2024-08-22 12:38:12 +08:00
冷冷 bc0debdbf2 refactor(sql): 增加 sys_route_manage 、 no_mask 权限按钮 2024-08-22 12:37:52 +08:00
冷冷 2e6a5831b3 fix(app): 修改app页面设置无法多租户无法使用问题 2024-08-21 15:32:17 +08:00
aeizzz f548079d23 fix(app): 修改app页面设置无法多租户无法使用问题 2024-08-21 15:32:17 +08:00
aeizzz b14c52403c feat(upms): 修正菜单获取更新为异步方式 2024-08-21 15:32:17 +08:00
aeizzz ee0e34eab3 feat(upms): 修正菜单获取更新为异步方式 2024-08-21 15:32:17 +08:00
冷冷 6671a4abf9 refactor(缓存): redistemplate / spring cache 使用 Json 序列化
sas 默认的缓存没有修改
2024-08-21 14:39:19 +08:00
冷冷 26f1f69a56 refactor(文件下载): 返回原始文件名,方便浏览器识别保存
注意文件名的header 字段需要使用 URLEncoder 避免错误
2024-08-21 13:40:27 +08:00
冷冷 e167095932 Merge remote-tracking branch 'origin/jdk17' into jdk17 2024-08-19 13:57:47 +08:00
冷冷 2a5e07f2d7 doc(sql): 增加敏感词菜单I18N 2024-08-19 13:56:17 +08:00
冷冷 80a335e93c feat(日志管理): 增加 Jackson json 日志脱敏工具类,如果日志入库中有敏感字段则进行删除 2024-08-18 23:51:36 +08:00
冷冷 f6e5aebfac feat(日志管理): 增加 Jackson json 日志脱敏工具类,如果日志入库中有敏感字段则进行删除 2024-08-18 23:43:44 +08:00
李世永 a2a9bf529f fix:#5728 第三方账号绑定后前端还是显示未绑定 2024-08-17 22:40:58 +08:00
冷冷 686c0c770f refactor(file): S3无需判断运行环境,均使用/作为路径分隔符
Closes 5845
2024-08-17 14:41:08 +08:00
冷冷 1a1e2be00f Merge branch 'jdk17-dev' of https://git.pig4cloud.com/pig/pigx into jdk17-dev 2024-08-17 14:38:48 +08:00
pig666 604a124ff6 Merge branch 'jdk17-dev' of 202211112327/pigx into jdk17-dev 2024-08-17 14:37:55 +08:00
liukuan f1aa2ff390 在编写代码或配置文件路径时,请确保使用正斜杠/来指定S3路径。即使你在Windows环境中使用S3客户端,也应该使用正斜杠/而不是反斜杠\。这是因为S3不支持反斜杠作为路径分隔符。 2024-08-17 13:42:45 +08:00
冷冷 ed6af29f8a upgrade(bom): up aviatorscript 5.4.3 2024-08-17 13:25:49 +08:00
冷冷 75bfcbdaca upgrade(excel): up easyexcel 4.0.2 2024-08-17 13:20:02 +08:00
冷冷 c01498f8d2 upgrade(common): hutool 5.3.1 , spring-boot-admin 3.3.3 2024-08-17 12:27:54 +08:00
冷冷 bb5e9cb555 upgrade(snapshot): 5.6.0-SNAPSHOT 2024-08-16 22:05:47 +08:00
冷冷 98205b3ead upgrade(nacos): nacos 2.4.1 2024-08-16 21:22:29 +08:00
冷冷 5c724900e3 refactor(代码生成): 适配anyline 2024-08-16 15:57:55 +08:00
冷冷 3c659c86bd refactor(common): security 增加配置项,如果设置 skipPublicUrl true 如果接口对外设置,即使携带token 也不鉴权 2024-08-16 15:28:22 +08:00
冷冷 d6fd5ad960 fix(flow): 代办任务根据流程名称查询失效 2024-08-16 15:28:19 +08:00
冷冷 d723fac0e2 upgrade(代码生成): 升级anyline 0808
听人劝后续固定使用版本,能用别动这个依赖版本
2024-08-16 15:28:17 +08:00
冷冷 5827c163c2 feat(租户管理): 状态过期,强制退出对应租户所有操作 2024-08-16 15:28:13 +08:00
冷冷 d5daf6b27d refactor(代码生成): anyline 切换数据库适配器不变,导致读取的数据库信息错误 2024-08-16 15:28:10 +08:00
冷冷 f2921c2102 fix(security): 安全问题,数字验证码增加参数校验避免伪造绕过 2024-08-16 15:28:04 +08:00
冷冷 4118d91756 refactor(codegen): 代码生成表格列表根据表的元数据(createTime/updateTime)进行排序,最新有更新的表放在最前 2024-08-16 15:27:55 +08:00
冷冷 f3ab8396bc upgrade(codegen): 达梦驱动升级至 8.1.3.140 2024-08-16 15:27:55 +08:00
冷冷 6f7c83feb8 refactor(代码生成): 支持根据表名和注释进行模糊查询
(cherry picked from commit 4e1f0afdba6fe12d7171b348687198272b834ac4)
2024-08-16 15:27:40 +08:00
冷冷 0e6be2eccc upgrade(bom): dynamic-datasource 4.3.1
(cherry picked from commit a3611fa8af3d0742af7607ca5f250a8adade5b28)
2024-08-16 15:27:28 +08:00
冷冷 95644e9b9a refactor(all): @PreAuthorize 使用 @HasPermisson 注解替换
(cherry picked from commit 19b5ec57ad000e6a3ae767626ae8deaad28c901f)
2024-08-16 15:27:23 +08:00
冷冷 4747aa1098 feat(core security): 适配 spring security 6.3 新增 @HasPermisson 注解
使用 @HasPermisson  替换 @PreAuthority(xxxx),简化接口上的注解

(cherry picked from commit 448e77607fec651d18bde97e3d5cc6734342e51a)
2024-08-16 15:27:20 +08:00
冷冷 1359415965 upgrade(core bom): springboot 3.3.2 &spring cloud 2023.0.3
- springboot 3.3.2
- spring cloud 2023.0.3
- spring cloud alibaba 2023.0.1.2
- spring boot admin 3.3.2
- hutool 5.8.29

(cherry picked from commit ba8fc7e8d3cfc15725db50e161e8db17d267df89)
2024-08-16 15:27:16 +08:00
冷冷 ad0c7b87b1 upgrade(core bom): springboot 3.3.2 &spring cloud 2023.0.3
- springboot 3.3.2
- spring cloud 2023.0.3
- spring cloud alibaba 2023.0.1.2
- spring boot admin 3.3.2
- hutool 5.8.29

(cherry picked from commit 58d41b40b36bc810b3c0ae56b39cf17bf328aeb0)
2024-08-16 15:27:16 +08:00
冷冷 1bf9ba0db6 refactor(SQL): 新增sys_system_config 表
原有的 站内信管理修改信息推送

(cherry picked from commit 6800f0a91029fec0deae730f41196b65af524072)
2024-08-16 15:27:10 +08:00
冷冷 ec0703d45d feat(upms): 新增短信、邮件、hook 发送和API 工具
(cherry picked from commit 9f61bc82799fb97e85237d2951cd1ebce8673328)
2024-08-16 15:27:08 +08:00
冷冷 7750314ac6 refactor(common-core): 新增通用配置 common-config , 简化 application配置
大部分情况下 common-config 一旦确定后续不修改,所以不需要写在 application 做一个简化

(cherry picked from commit 872fa03dce8e25f663e918c06e759ad49460c74e)
2024-08-16 15:26:56 +08:00
冷冷 c9d8c6a421 refactor(common-core): 新增通用配置 common-config , 简化 application配置
大部分情况下 common-config 一旦确定后续不修改,所以不需要写在 application 做一个简化

(cherry picked from commit 56f4b2fb915f3552e83ed4760772b13942ebd4d6)
2024-08-16 15:26:53 +08:00
冷冷 2ece806760 ♻️ Refactoring code. GroupVo.java --> GroupVO
(cherry picked from commit e5e6e35a5a2e21f5eabd6021bf10099ed6730cce)
2024-08-16 15:20:03 +08:00
冷冷 51a20ad898 ♻️ [工作流] 代办任务列表查询修改查询用户ID列表和去掉查询任务参数
(cherry picked from commit 84e0116e9bce2725dcd20274c4faf1872f7c86fe)
2024-08-16 15:19:32 +08:00
冷冷 a616bcc2de ♻️ [系统管理] RemoteUserService 增加 list 查询接口
(cherry picked from commit f56af224109f27bcf66a25c4f24f3c6ad3048d8c)
2024-08-16 15:19:23 +08:00
冷冷 4b2d55f339 ✨ #5779 【需求】审批部门负责人,自动根据发起人关联,不需要手动选择
(cherry picked from commit cc9e157f387cf183ecd6ca2d11a7d901a20f8bed)
2024-08-16 15:19:14 +08:00
冷冷 f8630da5af ♻️ 【工作流】 多人任务前端显示头像信息去重
(cherry picked from commit 81da50fbedb48a96e8a19250e8adf2170e50a4e9)
2024-08-16 15:19:08 +08:00
冷冷 97348c9e83 ⬆️ springboot 3.2.7
(cherry picked from commit c8e135ad46c224adb724d3346df2de7d4b2e2869)
2024-08-16 15:18:59 +08:00
冷冷 6d56f5e213 ✨ #5595 【需求】协同管理工作流支持流程节点执行回调
(cherry picked from commit b8de059c6f3e042b7fd1e91177ed36ba1e141f44)
2024-08-16 15:18:54 +08:00
冷冷 e9b77a8e09 ♻️ Refactoring code. 敏感词策略调整不验证数字
(cherry picked from commit e156735d7d6bb42e97b214ddcd3436314c2e5ab9)
2024-08-16 15:18:49 +08:00
冷冷 c2d4c438c4 🐳 Dockerfile 增加expose 9848 方便k8s自动发现端口
(cherry picked from commit 57bc59d97c514d073941e14956f686278396228e)
2024-08-16 15:18:41 +08:00
冷冷 1b822862bf ✨ Introducing new features. 【系统管理】敏感词维护管理
(cherry picked from commit 7be72d3fcb8a611e1a1bc6f7510c0a498d23aa97)
2024-08-16 15:18:35 +08:00
冷冷 20ef46292f ✨ Introducing new features. 文件上传入库文件hash值
(cherry picked from commit fc4778b5a75501283465f450ea49aade357bef9a)
2024-08-16 15:18:29 +08:00
冷冷 9a3c2ddf3f 🔧配置管理模块 增加应用模块名称
(cherry picked from commit e40db4813fce9951742caef99d69aa00bd36102f)
2024-08-16 15:18:20 +08:00
冷冷 e94b2f1d63 ✨ Introducing new features. 【系统管理】敏感词维护管理
(cherry picked from commit 85fbc6de0d50a9dc8869ed54c55155583fdc0709)
2024-08-16 15:18:11 +08:00
冷冷 08376e2cfe 🔧 【通用配置】 lombok.config 支持构造器配置属性自动复制
(cherry picked from commit af659449b08825460f9e8187c755217554533807)
2024-08-16 15:18:07 +08:00
冷冷 aedd2fe4c7 🐳 【docker-compose】基础redis 镜像修改为国内源
(cherry picked from commit b8f2a87afd253755c076d831905132a9fc84120c)
2024-08-16 15:17:35 +08:00
冷冷 03b3ecac55 ✨ Introducing new features. 文件上传入库文件hash值
(cherry picked from commit 37178bcadff8aa29b50e43fb1b24063457f893ec)
2024-08-16 15:17:30 +08:00
冷冷 ba15cf45cc 🔒重构bearer token 抽取过程,带token 就鉴权,即使是暴露的端点
(cherry picked from commit ffafe70bef3777664cc87edd1c58436763930ca3)
2024-08-16 15:17:26 +08:00
冷冷 cdac9cab16 ✨ 增加mybatis-plus乐观锁插件
(cherry picked from commit b3ab378edaa27685ca1f8f02f0b46ed84f1c1729)
2024-08-16 15:17:17 +08:00
冷冷 f650c2c743 🔒 对外输出严禁输出敏感字段 password
(cherry picked from commit 302553bbeb28016e5a11976461d73f8a6a3bd370)
2024-08-16 15:16:35 +08:00
冷冷 8c202a1938 ♻️ 代码生成数据源URL 长度调整为 text 类型存储
(cherry picked from commit bb34a81264055b9a46eae7481f7aba46a7f52de2)
2024-08-16 15:16:32 +08:00
冷冷 e96eaa2179 ✨ 新增 pigx-common-sensitive 脱敏模块
(cherry picked from commit 39899b1e8ff25ca1ac3708086c1ddb677fb56541)
2024-08-16 15:16:26 +08:00
冷冷 aba51bbdb8 ♻️ 增加 NoToken 注解方便对应 无token feign调用场景
(cherry picked from commit 2d78533a29c9c392f75d76cf202ae1daf8f7c77b)
2024-08-16 15:16:20 +08:00
冷冷 835d582b3b ✨ 支持根据角色动态脱敏指定数据属性
(cherry picked from commit 51541692ba7ee9ea5cf68f054f33c52133ca1a71)
2024-08-16 15:16:06 +08:00
冷冷 69aa10d54e ♻️重构 SysTenantServiceImpl 租户默认参数获取方式
(cherry picked from commit 612acdcca78bd5053f19ee9d784e1e9beb6ec9d2)
2024-08-16 15:15:55 +08:00
冷冷 148a2f54da ⬆️ git-commit-id-plugin 定制 git.properties 插件输出
(cherry picked from commit 031b12cc3f3d2d2b170c2bcc9fb3853576bcfe2e)
2024-08-16 15:15:35 +08:00
冷冷 a9b9475fa3 feat(日志管理): 增加 Jackson json 日志脱敏工具类,如果日志入库中有敏感字段则进行删除
(cherry picked from commit a7a5b33c1270e99b01a65307926e98f27c9da3fb)
2024-08-16 15:11:45 +08:00
冷冷 c80178148a feat(代码生成): 支持直接同步菜单、同步网关路由
(cherry picked from commit d61b38419bc70139e40ea6e5e5fe494c66eaaee2)
2024-08-16 15:11:28 +08:00
冷冷 04af734d83 refactor(common-idempotent): 幂等插件重构@Idempotent默认值
默认执行完后删除key

修改默认错误信息格式

(cherry picked from commit 62d2087eb002d6ac5163dd6d569b35ee72b765f0)
2024-08-16 15:11:17 +08:00
冷冷 2a1a7880f0 refactor(路由管理): 增加接口后端鉴权避免安全问题
(cherry picked from commit 82bba90dba8278759da799320aa341e11b0253a2)
2024-08-16 15:10:36 +08:00
冷冷 5d75b8294f feat(代码生成): 支持模板通过github 动态更新检查
(cherry picked from commit e449f424e2dec78c61a2e3a5984f06230b91fca8)
2024-08-16 15:09:58 +08:00
冷冷 9e5cbd4fb5 refactor(代码生成): 删除 config.json 配置,默认属性从配置文件中获取
json -> YAML

(cherry picked from commit 021e7435e294c874d1032d38411db17051ae75c5)
2024-08-16 15:09:45 +08:00
冷冷 860a3f72f5 refactor(代码生成): up anyline 8.7.2-jdk17-20240715
(cherry picked from commit 8f733f21c2b913b5be2154164d2b347a590415b2)
2024-08-16 15:09:32 +08:00
冷冷 c647864b9b refactor(代码生成): 优化代码下载的路径默认为 admin , up screw 0.0.6
(cherry picked from commit 582bbcabbea1e84ef4b33c78c0e8f54897106299)
2024-08-16 15:09:16 +08:00
冷冷 310b16ba7b refactor(菜单管理): 菜单名称重复导致菜单404
新增菜单名称去重

Closes #5753

(cherry picked from commit dc5895869f054d310f99093da6fa668a8a506f9c)
2024-08-16 15:08:48 +08:00
冷冷 abb033f560 refactor(代码生成): 默认的模块名为:admin
config.json 配置文件的默认模块名修改为 admin

(cherry picked from commit 520ee19fcd45d29e9a38b197417532d870de4531)
2024-08-16 15:08:28 +08:00
冷冷 2c77c3db7f style(行政区划): 新增去重判断 ,新增获取详细数据的接口
前端支持 validateExist 方法判断

(cherry picked from commit 557832d1dd69f362d41ef77a0b9c6320700758f8)
2024-08-16 15:07:51 +08:00
冷冷 2da674478e ✨[代码] 代码生成支持通过 git 动态更新 2024-07-13 17:38:46 +08:00
冷冷 69d54efdd4 ♻️ 代码生成支持动态添加字典 2024-07-13 17:37:58 +08:00
冷冷 7052b21a63 ♻️ Refactoring code. GroupVo.java --> GroupVO 2024-07-13 17:37:21 +08:00
冷冷 2e06c03e57 ♻️ 代码生成后端API调整
(cherry picked from commit a3b8798eb39537a32f89371a949a0a80b37110b9)
2024-06-20 16:52:53 +08:00
冷冷 b4db53891d 🐛 数据源模糊查询失败
(cherry picked from commit 818e19b102e21c4f60d15bedd6a4d48b3711851d)
2024-06-20 16:52:34 +08:00
冷冷 63032e672f ♻️ 支付模块 敏感参数脱敏
(cherry picked from commit 5cb7743455edf386161e17e3d409d5f3e6cc936e)
2024-06-20 16:51:42 +08:00
冷冷 1a10197b48 🐛 部门负责人编码和代码查询规则不一样
(cherry picked from commit 8d2417ad4578832caaa94bb2377b896fc6134b46)
2024-06-20 16:51:39 +08:00
冷冷 9fa8b13b6e 🐛 修复 GenDsConfController 下载数据源文档时no such field 错误 2024-06-13 22:44:19 +08:00
冷冷 68e97384e6 ⬆️ screw 0.0.4 增加连接池缓存 2024-06-13 17:24:38 +08:00
冷冷 50bf7c6ba0 ⬆️ screw 0.0.4 增加连接池缓存 2024-06-13 17:24:35 +08:00
冷冷 282c998b41 🔧 quartz-config.yml 默认关闭集群模式和扫描 2024-06-13 17:24:33 +08:00
冷冷 aa01420e46 ⬆️ mybatis-plus 3.5.7. hutool 5.8.28 mybatis-plus-join 1.4.13 2024-06-13 17:24:29 +08:00
冷冷 e61d526512 🔧 单体模式配置 sentinel 关闭 2024-06-12 15:37:04 +08:00
冷冷 d9e0c8cf34 🐛 #5731 任务管理,流程管理,表单设计中,拖拽文件,文件属性设置不生效,文件后缀MP4,rar等格式,文件大小,发布后不生效。 2024-06-12 15:36:17 +08:00
冷冷 04e65b00f7 🔧 修改quartz 线程池数量 2024-06-11 14:15:00 +08:00
冷冷 3e448f1093 ♻️基于 anyline 重构代码生成模块,更便捷的接入其他类型数据库 2024-06-10 15:53:18 +08:00
冷冷 8e32d61f58 ♻️基于 anyline 重构发号器模块,更便捷的接入其他类型数据库 2024-06-10 15:53:01 +08:00
冷冷 fdd7b72f2a 🐳 dockerfile base mirror use aliyun proxy 2024-06-10 15:52:38 +08:00
pig666 9843bd949d Merge branch 'jdk17-dev' of 202310181001/pigx into jdk17-dev 2024-06-10 15:41:06 +08:00
jackshenonly 22666e1ffa [fix]:去掉SSE发送器中过时的代码,以免导致异常 【because "sendFailed" is null】 2024-06-07 14:51:02 +08:00
jackshenonly 2d1f8cd6db 删除Sse Redis 分发器中的冗余代码 2024-06-06 10:03:43 +08:00
冷冷 45fc19a5b2 ✨ 调整日程管理相关的字段名称 适配 Oracle数据库 2024-05-31 14:54:08 +08:00
冷冷 3061a6ec6d ♻️ 优化省市区街道四级查询 2024-05-31 14:54:06 +08:00
冷冷 852be70ab9 🗃️ 重构部分字段SQL 适配Oracle 数据库 2024-05-30 14:54:03 +08:00
冷冷 c7a3534fd7 🔧 maven 增加 boot profile 避免单体打包失败 2024-05-28 13:09:14 +08:00
冷冷 38beb5783c 🐛#5677 common.io 工具类冲突造成excel 导入失败 2024-05-27 16:38:09 +08:00
冷冷 61c78a90fd 🔖 5.5.0 2024-05-23 20:27:06 +08:00
冷冷 05d5e067d6 🔖 v5.5 2024-05-23 11:36:34 +08:00
冷冷 4f736bbac1 🔧 修改 pom.xml 指定默认的 profile ,避免打包不指定profile 2024-05-20 22:15:06 +08:00
冷冷 77004a2ffa ♻️ 优化 pigx-register/pom.xml 依赖导入
(cherry picked from commit 9ef4a3198e6287fc9eb5fe3c16b08901f77e8c50)
2024-05-17 14:52:06 +08:00
冷冷 f95a92d9e5 ⬆️ 升级最新的 nacos-server ,支持服务管理【上下线】 2024-05-17 14:11:10 +08:00
冷冷 cd5bae6c1a 🔧 增加 allowPublicKeyRetrieval 属性,方便用户上手 2024-05-16 11:18:39 +08:00
冷冷 a2e86bc562 🗃️ 优化数据库脚本 2024-05-15 21:54:31 +08:00
冷冷 9b0aeaa326 🗃️ 增加 pigxx_boot.sql 脚本方便新手一键启动单体版本
(cherry picked from commit b77c7998d30e6b6059b6ecb8f968cb3a4c99ab74)
2024-05-14 18:34:41 +08:00
冷冷 f79fe5e03e 🐛 修复 Feign Client Service Name 错误
(cherry picked from commit cd9f8bfbf62abd9bf543d53a625f40e2802e5d39)
2024-05-14 18:34:25 +08:00
冷冷 65f939bbb8 🐛 jimu 不兼容 Mybatis-Plus 3.5.6
(cherry picked from commit ee5fd771dc21ccaf0d39e9c01759654633abacc0)
2024-05-14 18:34:22 +08:00
冷冷 5c83763c29 🔧 pigx-boot/pom.xml 维护全部的业务模块 2024-05-12 15:27:33 +08:00
冷冷 d97a001ec6 ♻️ 【代码生成】支持自动根据数据字段动态维护多租户表 2024-05-12 15:25:26 +08:00
冷冷 c14ee912ce 🐛 【代码生成】自动创建表的没有关联数据源 2024-05-12 15:24:42 +08:00
冷冷 4b201215dd 🔊 单体版本增加 logback-spring.xml 2024-05-11 12:38:35 +08:00
冷冷 e50fb137e7 ⏪ 回滚feign 自动降级的逻辑,方便调用方异常处理 2024-05-11 12:38:11 +08:00
冷冷 cc1a87944b ♻️ 优化 OAuth 2.0 移动端社交登录的过程中异常处理,提升健壮性提示 2024-05-11 12:37:23 +08:00
冷冷 bbf5614cfc ♻️ 优化 OAuth 2.0 登录过程中的异常输出,方便开发过程中调试 2024-05-11 12:36:52 +08:00
冷冷 cc96bf8434 ♻️ 优化 OAuth 2.0 登录过程中的异常输出,方便开发过程中调试 2024-05-11 09:13:19 +08:00
冷冷 4f19ddbeca 🐛 修复 app remote feign spi 文件错误导致失效问题 2024-05-10 16:21:25 +08:00
冷冷 a78682d49f 🐛 修复自选审批节点在我的发起里面查看的 NPE 问题
(cherry picked from commit 4105af1c013af5bea824e3ac485b6b6482e06d46)
2024-05-10 15:58:54 +08:00
冷冷 946dcdaf99 🗃️ 修改菜单中的错别字,代办 --》 待办
(cherry picked from commit 8218c9fbb4d87cabdfa12df194793db5b4ef43ce)
2024-05-10 15:58:50 +08:00
冷冷 179f818e4b ✨ 增加 permission.hasScope 判断工具,方便客户端模式使用
(cherry picked from commit 8f0d861d7a6b1d25a71160142f1aac66687ef6c5)
2024-05-10 15:58:48 +08:00
冷冷 079d70e204 ✨ #5631 建议增加密码过期提示或强制修改密码需求 2024-05-04 11:33:43 +08:00
冷冷 690568aa82 ♻️ 优化异常抛出逻辑,方便二次扩展 2024-05-04 11:33:39 +08:00
冷冷 6fc3a9af40 ♻️ 优化异常抛出逻辑,方便二次扩展 2024-05-04 11:33:39 +08:00
冷冷 503b4aff74 🐛 协同办公我的已办回显有问题 2024-04-25 15:26:12 +08:00
冷冷 1a145b1287 ⏪ 系统生成token 回滚成 uuid
(cherry picked from commit 51cbcbf6226514d3a3c476e9518f022500ea518c)
2024-04-25 14:35:32 +08:00
冷冷 4d76bd855b ✨ 流程引擎模块提供外部API 方便其他模块调用
(cherry picked from commit 0e3e4f8d6cbb624d58fdd65a99cf043a3576fbba)
2024-04-25 14:35:28 +08:00
冷冷 6fcfb260b4 ✨ RemoteUserService 增加注册端点调用
(cherry picked from commit 8709f40273e3be646009119b9deb619c2a38c311)
2024-04-25 14:34:59 +08:00
冷冷 97e3ffc6ac ✨ common-security 能力增强,支持手动传递token 到下游服务
(cherry picked from commit df53f305efa807972f836608cbaf577ee43bc071)
2024-04-25 14:34:50 +08:00
冷冷 41ce4c9fb2 🐛 避免xxl-job-admin 打包后jar css 无法加载
(cherry picked from commit 1d6aad9370df9bb46754f5364689a580de9424d2)
2024-04-25 14:34:46 +08:00
冷冷 f1b1d58fa1 ⬆️ up spring cloud alibaba 2023.0.1.0 2024-04-23 19:45:42 +08:00
冷冷 86a32f7c8e 🗃️ 修改路由配置 sys_route_conf 2024-04-22 12:59:34 +08:00
冷冷 67b276af44 ♻️ EnablePigxFeignClients @AliasFor 注解避免console 控制台警告 2024-04-22 09:12:08 +08:00
冷冷 5138c1e2b8 ♻️ 优化网关、认证中心配置,方便架构调整 2024-04-20 22:55:39 +08:00
冷冷 3d85bb87f8 🔖 v5.5.0-snapshot 2024-04-20 22:12:52 +08:00
冷冷 2f7a72c091 ⬆️ up easyexcel 3.3.4 & poi 5.2.5 2024-04-20 21:57:05 +08:00
冷冷 26bc891783 ♻️ ServiceNameConstants 增加代码生成模块常量 2024-04-20 21:57:03 +08:00
冷冷 44dd71abca 🧐 修改 quartz nacos 配置文件删除冗余配置 2024-04-20 21:57:00 +08:00
冷冷 4c667d04e1 ♻️ 避免各种依赖的地方组件造成 BeanPostProcessorChecker 警告 2024-04-20 21:56:49 +08:00
冷冷 7fbecca54e ✨ 增加 RemoteFileService.java 文件传输工具类 2024-04-20 21:56:45 +08:00
冷冷 e83dc9a198 ♻️ 抽取 quartz-config.yml,方便使用维护 2024-04-20 21:56:41 +08:00
冷冷 3d1bbef3a7 ♻️ SysUser 集成 MyBatisPlus Model 方便使用 2024-04-20 21:56:37 +08:00
冷冷 27de7564c5 ✨ 增加 RemoteFileService.java 文件传输工具类 2024-04-20 21:56:33 +08:00
冷冷 b77d318f07 ✨ add AsyncConfiguration 明确异步线程池配置 2024-04-20 21:56:25 +08:00
冷冷 f3a93fd3d0 ♻️ Refactoring code. 架构重构支持 一套代码两种方式运行 2024-04-18 18:03:28 +08:00
冷冷 159ec6d9d4 ♻️ Refactoring code. 架构重构支持 一套代码两种方式运行 2024-04-18 18:01:40 +08:00
冷冷 d5d48d369f 🐛 Fixing a bug. #5597 【表单设计器】流程设计中的表单设计,数字或金额控件使用异常 2024-04-17 20:33:29 +08:00
冷冷 9c521a7d34 ♻️ Refactoring code. 菜单新增时菜单路径和权限字符串去重提示 2024-04-17 20:33:24 +08:00
冷冷 5db9daee21 🔒密码修改#5544 用户修改接口存在越权漏洞 2024-04-17 20:33:02 +08:00
冷冷 c5e4d9a0d9 ♻️ #5540 【需求】租户管理> 所属的菜单变更后自动同步目标租户 2024-04-17 20:30:29 +08:00
冷冷 6ba8ce326d 🔇 删除Dynamic-ds-log 配置 2024-04-15 22:54:37 +08:00
冷冷 60257eec93 ♻️ Refactoring code. 增加序列化规则 Duration 类型 2024-04-15 22:54:18 +08:00
冷冷 80a2e85618 ⚡ 优化多数据源模式下日志SQL 格式化 filter 生效 2024-03-25 19:33:10 +08:00
冷冷 d7416be841 ⚡ 优化 common-sse 链接成功增加 pong 消息返回 2024-03-21 10:06:45 +08:00
冷冷 ebddfc2e9f 🔒 Fixing security issues. 屏蔽SQLException 具体异常 2024-03-19 17:54:37 +08:00
冷冷 55943af46d ♻️ 社交登录前端支持自动根据后端接口数据配置,不再需要前端 .env 写死打包 2024-03-08 15:31:26 +08:00
冷冷 ff79ae2e27 Merge branch 'jdk17-dev' into jdk17 2024-03-05 15:38:00 +08:00
冷冷 a3a32320c2 🐛 Fixing a bug. 覆盖原生的 OAuth2RefreshTokenAuthenticationConverter ,避免无法获取 query params 2024-03-05 15:36:54 +08:00
lbw 9f6be8850b 🐛 Fixing a bug. 前端排序规则失效 SqlInjectionUtils Error 2024-03-04 21:57:19 +08:00
lbw ac2fbfef0d Merge branch 'jdk17-dev' into jdk17
# Conflicts:
#	pigx-visual/pigx-report-platform/pom.xml
2024-03-03 22:20:04 +08:00
lbw 5f3aa969f3 🗃️ 执行数据库相关的变化, 代码生成风格字段可以为NULL 2024-03-03 21:26:40 +08:00
lbw 10f979fcf8 #5508 【需求建议】@sysLog标签日志没有微服务标识 2024-03-02 17:52:24 +08:00
lbw 88ad413fa5 🗃️ 执行数据库相关的变化 管理员默认权限调整 2024-03-01 15:16:33 +08:00
lbw 8dd3c178d4 ♻️ Refactoring code. 统一工作流模块查询分页参数 2024-02-29 11:40:22 +08:00
lbw c3cdc145d5 ⬆️ Upgrading dependencies. hutool 5.8.26 2024-02-28 21:33:16 +08:00
lbw 59a202e4d9 ⬆️ Upgrading dependencies. goview 1.0.0 2024-02-28 14:42:37 +08:00
lbw 2e582d8710 ⬆️ Upgrading dependencies. springbootadmin 3.2.2 2024-02-23 10:08:42 +08:00
lbw 71e5a0e2ab ⬆️ Upgrading dependencies. springboot 3.2.3 & sas 1.2.2 2024-02-23 10:08:08 +08:00
lbw 9b0fe3f4e2 🔖 Releasing / Version tags. 5.4 2024-02-22 21:30:39 +08:00
lbw 3352865429 🗃️ 执行数据库相关的变化 更新nacos 配置去掉租户配置属性自动发现 2024-02-22 21:21:10 +08:00
lbw 2d0b08bf3f 🗃️ 执行数据库相关的变化 更新nacos 配置去掉租户配置属性自动发现 2024-02-22 21:19:07 +08:00
lbw 37bebcd066 ♻️ Refactoring code. sql注入检测使用mybatis-plus 提供工具类替换 2024-02-22 19:23:18 +08:00
lbw f3b4a32dd9 ♻️ Refactoring code. 优化工作流模块常量 2024-02-22 15:00:00 +08:00
lbw c65f8ddd7a 🗃️ 执行数据库相关的变化,增加注释 2024-02-22 13:33:27 +08:00
lbw 02e2d34cc1 🗃️ 执行数据库相关的变化,增加行政区表 2024-02-20 15:29:17 +08:00
lbw 26d4bad0ff ✨ Introducing new features. 代码生成器支持创建表 2024-02-20 13:42:30 +08:00
lbw d2585f2890 ✨ Introducing new features. 动态菜单增加带参组件字段 2024-02-20 13:31:42 +08:00
lbw 12cc50109c bug fix 默认执行人为空的逻辑错误 2024-02-20 13:31:29 +08:00
lbw e159602711 ♻️ Refactoring code. quartz 只保存发布状态的任务日志 2024-02-20 13:30:02 +08:00
lbw 473f193fb6 🗃️ 执行数据库相关的变化, H5 注册 create_by 字段设置为NULL 2024-02-20 13:29:47 +08:00
lbw bd762afa2d ✨ Introducing new features. 行政区划管理功能 2024-02-20 13:24:01 +08:00
lbw 48fcea9978 ♻️ Refactoring code. 重构钉钉企业登录,支持后端动态配置应用信息 #5478 2024-02-20 13:22:59 +08:00
lbw 96278499dc ✨ Introducing new features. @TenantTable 注解 2024-02-19 13:03:14 +08:00
lbw ac91659105 🔒 Fixing security issues. 升级依赖避免CVE 2024-02-19 13:02:40 +08:00
luolin d7f9cb21fb ♻️ Refactoring code.新增角色与菜单VO对象 2024-02-04 18:03:17 +08:00
luolin e030653d40 ♻️ Refactoring code.规范方法命名含义 2024-02-04 18:03:13 +08:00
lbw bf0cf11349 ♻️ Refactoring code. 重构全局异常处理器 2024-02-04 17:58:50 +08:00
lbw fa08b161f6 ♻️ Refactoring code. 重构发号器重试逻辑 retryTimes 2024-02-04 16:42:22 +08:00
lbw 64d4dd6484 ♻️ Refactoring code. redis 过期API 2024-02-03 10:40:31 +08:00
lbw 7f46d9791b ⬆️ Upgrading dependencies. up jimu springboot3 2024-01-30 20:46:22 +08:00
lbw 4025c42fcf 🗃️ 执行数据库相关的变化,增加 sys_schedule 表的注释 2024-01-29 14:35:24 +08:00
lbw c5b2f82a7a ⬆️ Upgrading dependencies. springboot 3.2.x 2024-01-29 13:05:13 +08:00
lbw 4f63af4ebf 🔧 修改配置文件,nacos 增加数据库超时时间 2024-01-23 11:53:32 +08:00
lbw 1c4de7ef2a 🗃️ 执行数据库相关的变化 统一flow 模块数据库字段【del_flag】/ 【bool】字段 2024-01-23 10:58:34 +08:00
lbw 4f1c99d38b 🐛 Fixing a bug. summary oss file set error 2024-01-17 16:17:25 +08:00
lbw f5026e2206 Dockerfile 8.0.33 2024-01-16 21:37:51 +08:00
lbw 3169e0c1c7 ⬆️ Upgrading dependencies. go-view 0.2.0 2024-01-14 10:45:28 +08:00
lbw d6f5266350 🐛 Fixing a bug. 切换租户后,文件无法获取 2024-01-14 10:45:12 +08:00
lbw db60afa592 ♻️ Refactoring code. 积木token 健壮性判断 2024-01-14 10:44:54 +08:00
lbw 291b54f2fe Merge remote-tracking branch 'origin/jdk17-dev' into jdk17-dev 2024-01-05 12:45:26 +08:00
lbw 54b93d1c66 ⬆️ spring-boot-admin 3.2.0 fix miss external-view style 2024-01-05 12:45:07 +08:00
lbw 2b7b6a744c 🔥 删除flowable engine OpenAPI 注解 2023-12-27 09:11:56 +08:00
pig666 c0e15a4ded Merge branch 'jdk17-dev' of 467449165/pigx into jdk17-dev 2023-12-16 17:24:50 +08:00
wangzj c424c5aa8f 解决docker中文乱码 2023-12-16 16:42:08 +08:00
lbw ad37fb25bb 🔧 修改配置文件,删除无用配置文件 2023-12-14 18:01:26 +08:00
lbw d421b5f22c 🐛 Fixing a bug. 授权码模式丢失 username 参数 2023-12-12 19:04:43 +08:00
lbw 5a8e4b72b1 ✨ Introducing new features. support sse 2023-12-12 18:35:01 +08:00
lbw d15832c784 ♻️ Refactoring code. sql server durid 2023-12-12 12:30:37 +08:00
lbw 6ef72febbf 🐛 Fixing a bug. 授权码模式丢失 username 参数 2023-12-11 10:23:45 +08:00
lbw cfde3c0e1a 🗃️ 执行数据库相关的变化,代码生成模板优化避免强制必填项判断
(cherry picked from commit 740a9ca2ad)
2023-12-07 13:29:07 +08:00
lbw 66b3684ee2 ⬆️ Upgrading dependencies. up goview 0.3.0 2023-12-06 23:53:01 +08:00
lbw 46c1c9e326 ⬆️ Upgrading dependencies. up seata 1.7.0 2023-12-06 12:32:16 +08:00
lbw 57c101e28e ⬆️ Upgrading dependencies. up jimu 1.5.6 2023-12-05 17:22:26 +08:00
lbw 55bcd9fe45 🐛 Fixing a bug. 积木报表查询token失败,获取不到当前用户信息 2023-12-05 16:12:15 +08:00
lbw 16b86b0f66 🐛 Fixing a bug.【用户管理】新增用户 > 列表页开启状态未选中 2023-12-04 18:46:18 +08:00
lbw 8370878ace ♻️ Refactoring code. 统一 Redis 序列化规则 2023-12-04 13:37:18 +08:00
lbw 9b3280ff5d 🔖 Releasing / Version tags. v5.3.0 2023-12-03 19:40:18 +08:00
lbw e78189b266 🗃️ 执行数据库相关的变化,代码生成页面菜单顺序调整1 2023-12-03 13:22:51 +08:00
lbw 80bb259b68 🐛 Fixing a bug. #5334 多角色无法更新个人信息 2023-12-01 19:36:50 +08:00
lbw 83118f5066 ref @SysLog 请求参数无法序列化异常优化 2023-11-30 16:43:11 +08:00
lbw 6bb62a839e ref @SysLog 请求参数无法序列化异常优化 2023-11-30 16:41:36 +08:00
lbw 96e1df004f ♻️ Refactoring code. 统一 RedisTemplate 序列化规则 2023-11-29 14:57:20 +08:00
lbw e0fd01d74b ✨ Introducing new features. org component 2023-11-29 09:31:13 +08:00
lbw 93f02b9d8b ♻️ Refactoring code. 重构 RedisTemplate 序列化泛型 2023-11-28 16:11:01 +08:00
lbw 018768a15e ♻️ Refactoring code. 部门组织架构后端调整 2023-11-28 13:52:32 +08:00
lbw 7460562571 🔖 Releasing / Version tags. 5.3.0-SNAPSHOT 2023-11-27 22:58:33 +08:00
lbw 7c24c2d049 ⬆️ Upgrading dependencies. sas 1.2.0 2023-11-27 22:56:34 +08:00
lbw 8e6e6166b5 ♻️ Refactoring code. common-oss @NestedConfigurationProperty configproperty 2023-11-27 22:41:13 +08:00
lbw d1529c5fba ⬆️ Upgrading dependencies. goview 0.2.1 优化文件上传路径错误配置 2023-11-27 18:24:54 +08:00
lbw 47530dea5e #5319 修复ServiceImpl模板主子表模式下 updateDeep 方法中的主表的关联属性 2023-11-27 16:10:21 +08:00
lbw 34bf7572bf #5285 代码扫描命名规范优化,命名规范扫描发现未知属性词汇“decs”,调整简写改为“desc” 2023-11-27 16:03:32 +08:00
lbw e0bc54f558 🗃️ 执行数据库相关的变化,适配 v5.3 2023-11-27 15:55:31 +08:00
lbw 2716461566 ♻️ Refactoring code. 日程管理支持按周显示,抽取部分枚举值 2023-11-27 14:04:12 +08:00
lbw 673896ecf7 ♻️ Refactoring code. 支持钉钉、企微登录 2023-11-27 13:53:54 +08:00
lbw f6f05b132a ref: 数据字典下拉字典管理排序字段 2023-11-27 13:45:59 +08:00
lbw 3e1d96f9b1 ref: 日志管理增加图表展示接口,方便用户查看使用 2023-11-27 13:45:28 +08:00
lbw 936acbb716 🐛 Fixing a bug. 网关读取客户端配置序列化规则 2023-11-27 13:44:32 +08:00
lbw a8f77654c0 ✨ Introducing new features. 新增消息管理 2023-11-27 13:40:58 +08:00
lbw 3ffb89177a ⬆️ Upgrading dependencies. flowable 7.0.0 2023-11-26 16:00:25 +08:00
lbw 5c11673841 ref: access_token & refresh_token 格式统一 2023-11-26 15:59:58 +08:00
lbw 247c5dbcc9 ⚡ 优化,公众号菜单编辑增加健壮性判断 2023-11-24 23:33:44 +08:00
lbw 5db1ca8e62 ⬆️ Upgrading dependencies. spring-boot 3.1.6 2023-11-24 11:10:26 +08:00
lbw a6577abe17 ⬆️ Upgrading dependencies. spring-boot-admin 3.1.8 2023-11-19 21:00:45 +08:00
lbw fc49d5c488 ♻️ Refactoring code. 避免 cors 失效 2023-11-10 22:11:22 +08:00
lbw 7867476745 ⬆️ Upgrading dependencies. dynamic-datasource 4.2.0 2023-11-09 15:19:25 +08:00
lbw dde66002b2 ✨ Introducing new features. 代码生成支持版本号 2023-11-09 15:14:45 +08:00
lbw 07d9f0c98c ♻️ Refactoring code. Vo -> VO 2023-11-08 15:52:43 +08:00
lbw 61bfcc00de bug: 导入用户锁定标记无效,导入的都是正常的 2023-11-08 15:41:59 +08:00
lbw bcbf539670 refc:.日程content字段太短,长短只有255 2023-11-08 15:40:14 +08:00
lbw 8aeac8c4e9 ⬆️ Upgrading dependencies. mybatis-plus 3.5.4 2023-11-08 15:34:16 +08:00
lbw 6a0199d9cd ♻️ Refactoring code. 重构授权码模式认证页面 2023-11-07 09:08:52 +08:00
lbw b0df74b134 ♻️ Refactoring code. 重构授权码模式认证页面 2023-11-06 14:00:14 +08:00
lbw 7d14ed4345 ⬆️ Upgrading dependencies. 升级 javers mysql 等版本避免CVE 2023-11-01 12:52:05 +08:00
lbw 7aa5a4ebe2 🎨 Improving structure / format of the code. 代码生成增加版本号 2023-10-30 15:15:21 +08:00
lbw f1a1291203 🎨 Improving structure / format of the code. 2023-10-28 23:09:37 +08:00
lbw 31efcb669a ♻️ Refactoring code. xxl-job-admin 适配 springboot 3.x 2023-10-28 23:08:59 +08:00
lbw f98fb3ba1a ♻️ Refactoring code. common-idempotent 适配 SpringBoot 3.X 2023-10-28 21:22:09 +08:00
lbw 22bc9ef90e 🔒 Fixing security issues. 避免C端用户携带token 访问 B端接口 2023-10-27 17:38:47 +08:00
lbw 5bd6d4643c 🎨 Improving structure / format of the code. 格式化代码 2023-10-25 11:24:39 +08:00
lbw 32bcd5465b 🐛 Fixing a bug. 客户端模式不放回认证具体信息 2023-10-25 11:24:28 +08:00
lbw 4d60ca8600 🐛 Fixing a bug. 定时任务新增自动初始化 2023-10-24 09:47:12 +08:00
lbw 90f31d178f ♻️ Refactoring code. 优化动态路由避免更新数据影响范围过大 2023-10-23 22:19:48 +08:00
lbw cb4f51facc ⬆️ Upgrading dependencies. druid 1.2.20 & mybatis-plus-join 1.4.6 & sharding 5.4.1 2023-10-22 15:12:32 +08:00
lbw a7b752cc0b ♻️ Refactoring code. 重构文件上传支持文件夹参数 2023-10-21 11:25:47 +08:00
lbw 736a81473f ♻️ Refactoring code. 重构文件上传支持文件夹参数 2023-10-21 11:13:27 +08:00
lbw a1fb6339af ref: 接口加解密 去除 BC强制依赖 2023-10-21 11:13:01 +08:00
lbw 64f7a90e7d ⬆️ Upgrading dependencies. sas 1.1.3 2023-10-18 13:31:18 +08:00
lbw 2fa4131b1f 🗃️ 执行数据库相关的变化。 xxljob集群部署,出现了重复执行任务的情况,检查调度锁表xxl_job_lock,发现没有数据 2023-10-18 13:14:04 +08:00
lbw 2336a23ea4 ♻️ Refactoring code. 重构Redis<> 序列化方式 2023-10-18 12:55:42 +08:00
lbw 9458a3f3b3 ♻️ Refactoring code. 去除 nacos 登录警告提示 2023-10-16 16:02:31 +08:00
lbw 8f355d8c30 ♻️ Refactoring code. #5236 支持 Get请求接口参数 【文档需要更新】 2023-10-12 15:55:09 +08:00
lbw 893c4c79a4 ♻️ Refactoring code. 脱敏支持 车牌号、IPV4 2023-10-09 13:35:07 +08:00
lbw bcb4c1a805 ✨ Introducing new features. 网关支持数学验证码 2023-09-29 17:17:28 +08:00
lbw 326b8443b5 ✨ Introducing new features. 网关支持数学验证码 2023-09-29 17:17:22 +08:00
lbw 49b4152653 🐛 Fixing a bug. 工作流按角色会签用户为空错误 2023-09-28 12:15:49 +08:00
lbw 8a0187c652 ➕ Adding a dependency. 维护 javax servlet api ,quartz 相关类还是依赖 2023-09-27 18:31:55 +08:00
lbw 0c9b7dd02b ♻️ Refactoring code. 优化 toc app-server 的相关feignclient 引入逻辑,避免删除 app-server 无法启动单体版本 2023-09-27 18:31:21 +08:00
lbw 90a4fb0fa0 ♻️ Refactoring code. 适配最新的 shardingsphere 分库分表策略 2023-09-26 10:50:20 +08:00
lbw 130da074a0 ♻️ Refactoring code. 适配最新的 shardingsphere 分库分表策略 2023-09-26 10:08:24 +08:00
lbw dd89faff1e ♻️ Refactoring code. RedisTemplate 序列化规则使用常量类 2023-09-25 11:47:15 +08:00
lbw 0c60cf1b52 🗃️ 执行数据库相关的变化, 优化代码生成 mapper.xml 模板 2023-09-23 21:56:56 +08:00
lbw cea1924c62 🐛 Fixing a bug. #5197 全局异常信息 ex=Invalid return type for async method (only Future and void supported): class java.lang.Boolean 2023-09-23 21:02:02 +08:00
lbw a91508ac7b ⬆️ Upgrading dependencies. jimu 最新稳定版 2023-09-23 15:28:20 +08:00
lbw 1ef16a076a ♻️ Refactoring code. GenKit 根据jdbc-url推断数据库类型 2023-09-22 13:47:38 +08:00
lbw 23001a092f ⬆️ Upgrading dependencies. lombok support java21 2023-09-22 10:16:35 +08:00
lbw dea0351d99 ⬆️ Upgrading dependencies. lombok support java21 2023-09-21 09:20:37 +08:00
lbw feb39115c9 🗃️ 执行数据库相关的变化 ,补代码生成的JDK17 的SQL 2023-09-19 11:14:33 +08:00
lbw f091558947 ✨ Introducing new features. 优化发号器长度避免设计多租户长度超长 2023-09-18 17:35:31 +08:00
lbw e84a13d03d ♻️ Refactoring code. PigXLogProperties.java to PigxLogProperties.java 2023-09-15 15:55:12 +08:00
lbw b9dc6ab477 🐳 Work about Docker. 修正flow模块docker 暴露端口号
(cherry picked from commit f232a1a617)
2023-09-14 17:28:36 +08:00
lbw 2c6a700154 🔖 Releasing / Version tags. 5.2
🔖 Releasing / Version tags. 5.2
2023-09-13 10:28:40 +08:00
lbw 95371f54a8 🗃️ 执行数据库相关的变化,优化代码生成的checkbox 模板
🗃️ 执行数据库相关的变化,优化代码生成的checkbox 模板

🗃️ 执行数据库相关的变化,优化代码生成的checkbox 模板
2023-09-13 10:02:34 +08:00
lbw 9fc0218cb7 ⬆️ Upgrading dependencies. go-view support tenant 2023-09-09 14:42:14 +08:00
lbw 8e35b50e1d ⬆️ Upgrading dependencies. jimu 1.6.2 支持配置多租户 2023-09-08 13:13:11 +08:00
lbw b7b2f102c7 ⏪ Reverting changes. 修改 nacos 达梦配置项 2023-09-06 16:21:28 +08:00
lbw 20098fe6c0 ♻️ Refactoring code. report 适配达梦数据库 2023-09-06 15:57:38 +08:00
lbw dc66e4a296 🐛 Fixing a bug. QQ解绑字段选择错误,其他分支同理 2023-09-06 15:54:07 +08:00
lbw 64d3289316 ♻️ Refactoring code. 代码生成模块SQL 适配达梦数据 2023-09-05 20:19:47 +08:00
lbw 1947ec3c75 🗃️ 执行数据库相关的变化 admin 修改为 admin_list 避免达梦关键字 2023-09-05 15:01:44 +08:00
lbw 115650b159 ⏪ Reverting changes. 错误配置 2023-09-05 14:59:03 +08:00
lbw 4cb7cfb387 ♻️ Refactoring code. 工作流适配达梦数据库 2023-09-05 14:57:42 +08:00
lbw 3308a68753 ♻️ Refactoring code. 大屏设计器优化达梦数据库适配 2023-09-05 14:57:23 +08:00
lbw 06a72534a9 ♻️ Refactoring code. 发号器优化达梦数据库适配 2023-09-05 14:57:03 +08:00
lbw 918c288bbe ⬆️ Upgrading dependencies. druid 1.2.19 2023-09-04 14:27:00 +08:00
lbw 6a92252c8e ⬆️ Upgrading dependencies. screw 0.0.3 2023-09-02 00:14:44 +08:00
lbw 6d9b45ca56 🐳 Work about Docker. docker-compose.yml 2023-08-31 21:03:43 +08:00
lbw 08d904a8ae 🐳 Work about Docker. 完善 v5.2 docker-compose.yml 2023-08-31 17:18:02 +08:00
lbw 6e193859f7 ⏪ Reverting changes. 考虑兼容性问题默认还是AES加密 2023-08-31 17:10:00 +08:00
lbw 698bb9fd3b ♻️ Refactoring code. spring.factories postprocessor 2023-08-31 15:15:56 +08:00
lbw ac33bb5cdb ⬆️ Upgrading dependencies. spring-boot-admin 3.1.5 2023-08-31 15:15:21 +08:00
lbw 1891666cfe ♻️ Refactoring code. common-encry-api 支持国密算法 2023-08-30 11:01:49 +08:00
lbw 409555c5c5 🗃️ 执行数据库相关的变化,优化代码生成模块修复excel 导出选中条件问题 2023-08-29 14:44:57 +08:00
lbw 83c1f41327 ♻️ Refactoring code. #5106 优化代码模块,重构代码实体中boolean 类型 2023-08-28 21:00:17 +08:00
lbw 8f76c03896 🐛 Fixing a bug. 用户名重复删除后再创建,编辑用户信息错误 2023-08-28 20:33:41 +08:00
lbw da9a765c36 ♻️ Refactoring code. up springboot 3.1.3 2023-08-25 17:04:59 +08:00
lbw e0f3956c2f ♻️ Refactoring code. up nacos 2.2.4 2023-08-25 17:03:26 +08:00
lbw 79b1ea04cf ⬆️ 🐛 升级 com.amazonaws:aws-java-sdk-s3,修复高危漏洞 CVE-2022-31159 2023-08-24 13:54:22 +08:00
lbw 69d969b4cf ⬆️ Upgrading dependencies. sas 1.1.2 2023-08-23 10:34:28 +08:00
lbw 5e10ccdf6c ♻️ Refactoring code. 代码生成controller 支持根据参数类型生成 strUtil & Objects 判断 2023-08-22 21:36:53 +08:00
lbw 659617b407 🐛 Fixing a bug. knif4j 调试接口404 2023-08-22 16:27:09 +08:00
lbw 51c4cf2816 ✨ Introducing new features. up nacos 2.2.4 2023-08-16 14:34:32 +08:00
lbw 40c50cad58 ⬆️ Upgrading dependencies. mybatis-plus 3.5.3.2 jsqlparse 报错问题 2023-08-14 11:45:36 +08:00
lbw 1653e11fc3 ♻️ Refactoring code. 重构日志管理支持请求参数记录 2023-08-14 11:42:18 +08:00
lbw 2efc65c832 ♻️ Refactoring code. dynamic datasource 支持默认的匹配模式 2023-08-13 13:56:48 +08:00
lbw feed3612cc 🐛 Fixing a bug. 修复事务失效问题 2023-08-11 17:48:43 +08:00
lbw ca4fdad6de 🗃️ 执行数据库相关的变化, 增加新增功能I18N 菜单翻译 2023-08-10 18:29:54 +08:00
lbw b024dd7113 🗃️ 执行数据库相关的变化, 增加新增功能I18N 菜单翻译 2023-08-10 15:53:38 +08:00
lbw c8513b3d56 🗃️ 执行数据库相关的变化, spring.data.redis 属性修改 2023-08-10 15:26:18 +08:00
lbw 86aa539ad9 ♻️ Refactoring code. 适配最新 flowable 工作流代码 2023-08-09 15:57:51 +08:00
lbw ae37d1d6fe ♻️ Refactoring code. 导出excel 支持前端多选导出,调整代码生成模板 2023-08-08 20:29:52 +08:00
lbw 2e90388a4f ♻️ Refactoring code. 简化租户套餐维护功能,删除 sys_tenant_menu表 2023-08-08 20:29:02 +08:00
lbw 8b123902b2 ⬆️ Upgrading dependencies. mybatis-plus 3.5.3.2 hutool 5.8.21 、knife4j 4.3.0 2023-08-08 20:27:53 +08:00
lbw 9af30a2ec8 ♻️ Refactoring code. close #I7PVTQ 登录日志的创建人不对 2023-08-08 13:00:42 +08:00
lbw 87347f3613 ⬆️ Upgrading dependencies. spring-boot-admin 3.1.4 /dynamic-datasource 4.1.3 2023-08-07 18:21:31 +08:00
lbw b9939a1420 ✨ Introducing new features. druid log 支持根据表名跳过输出 2023-08-05 22:24:04 +08:00
lbw d0bb2f01e7 ✨ Introducing new features. #5041 ParamResolver 增加批量获取参数的方法封装 2023-08-02 17:40:53 +08:00
lbw 3abfce5703 🐳 Work about Docker. 升级docker镜像jdk依赖版本 2023-08-02 16:25:24 +08:00
lbw 3aa2a54b56 ♻️ Refactoring code. close #I7PVTQ 登录日志的创建人不对 2023-08-02 12:57:53 +08:00
lbw c37b60e9dd ♻️ Refactoring code. close #I7PVTQ 登录日志的创建人不对 2023-08-02 12:54:51 +08:00
lbw 812ed9d57a ✨ Introducing new features. 关闭 sentinel record 相关日志 2023-08-02 12:29:48 +08:00
lbw 71749e7234 ♻️ Refactoring code. 优化流程变量为空处理逻辑 2023-08-01 15:52:23 +08:00
lbw 014a372c5c 🔧 修改配置文件 close #I7OWHV spring cloud openfeign 配置属性变更 2023-07-31 19:40:19 +08:00
lbw 884367ea38 ✨ Introducing new features. 微服务版本适配cxygzl flowable 2023-07-31 15:08:03 +08:00
lbw 1812decae3 ✨ Introducing new features. GlobalExceptionConfiguration 网关全局异常处理器 2023-07-30 23:24:22 +08:00
lbw 3e1e8881d6 🗃️ 执行数据库相关的变化,增加部门负责人岗位 2023-07-30 21:57:11 +08:00
lbw 1c68bc0661 🔥 删除json流程转bpmn 图片 2023-07-30 21:00:28 +08:00
lbw 932c4ec1f4 ♻️ Refactoring code. 【用户管理】状态栏修改为 有效
【用户管理】增加修改悬浮输入框密码功能
2023-07-30 20:01:10 +08:00
lbw 786648d1ca ✨ Introducing new features. 【租户管理】 支持对租户个性化界面信息 2023-07-30 20:00:51 +08:00
lbw 2b20b48389 ✨ Introducing new features. 重构工作流适配单体版本 2023-07-28 22:46:21 +08:00
lbw e878b68975 ✨ Introducing new features. goview 适配 springboot 3 2023-07-28 22:45:09 +08:00
lbw 2342e227ed ✨ Introducing new features. 增加部门负责人岗位,方便工作流审批使用 2023-07-28 12:52:30 +08:00
lbw 9d0ddc4cd9 ✨ Introducing new features. 增加文件分组功能 2023-07-28 12:51:52 +08:00
lbw 524a9fe9da ♻️ Refactoring code. SecurityInnerAspect使用前置通知替代环绕通知 2023-07-26 16:07:20 +08:00
lbw 8a37ea2f4a ⬆️ Upgrading dependencies. up spring-cloud-alibab 2022 2023-07-26 09:50:21 +08:00
lbw 18d1ac8356 🐛 Fixing a bug. #5025 数据权限 COUNT 函数在全部数据权限级别执行错误 2023-07-25 19:41:14 +08:00
lbw 319597d449 ♻️ Refactoring code. 重构feign client registrar 2023-07-24 21:41:10 +08:00
lbw 53a482fe74 ♻️ Refactoring code. 重构feign client registrar 2023-07-24 17:22:28 +08:00
lbw 68da521f53 ➖ 删除fastjson2依赖 2023-07-24 15:09:52 +08:00
lbw b69285c55b ✨ flowable M1的适配版本 2023-07-24 08:17:04 +08:00
lbw 43da5a1dbf ♻️ Refactoring code. 避免SAS 权限拦截失效 2023-07-15 16:31:38 +08:00
lbw 9c9b9666b4 ⚡ 优化SAS 避免鉴权错误 2023-07-14 14:46:50 +08:00
lbw 42fa092bd2 ♻️ Refactoring code.remove oa 2023-07-11 21:08:12 +08:00
lbw e1b8271060 ♻️ Refactoring code. 适配发号器 2023-07-11 10:17:01 +08:00
lbw 7e30209b5f ♻️ Refactoring code. 适配feign 2023-07-11 10:16:49 +08:00
lbw 8054b92b30 ♻️ Refactoring code. 适配quartz 2023-07-11 09:29:08 +08:00
lbw bc772ada79 ♻️ Refactoring code. 适配OpenAPI 2023-07-11 09:27:06 +08:00
lbw 78947f4258 ♻️ Refactoring code. druid 适配 springboot 3.0 2023-07-10 23:18:54 +08:00
lbw 791f5e9a56 ♻️ Refactoring code. druid 适配 springboot 3.0 2023-07-10 21:47:55 +08:00
lbw c536c79434 ♻️ Refactoring code. 优化现有SPI 加载方式 2023-07-10 21:16:37 +08:00
lbw 1525a14753 ✨ Introducing new features. 先解决编译问题 2023-07-10 17:49:56 +08:00
lbw 9eeecf0179 删除无用 module ,方便升级 2023-07-10 16:58:26 +08:00
lbw 5cbee1e4d3 📝 Writing docs. 优化数据库注释 2023-07-09 12:27:16 +08:00
lbw 8a7e9a40fd ♻️ Refactoring code. 优化代码#4976 dialog式的form表单存在富文本编辑器并上传照片后的问题 2023-07-06 10:27:50 +08:00
lbw 4cc73e7372 ♻️ Refactoring code. 审计字段自动填充强制覆盖用户修改 2023-07-04 11:41:22 +08:00
lbw cfffbb39b5 🐛 Fixing a bug. #4978 【审计日志】删除提示权限不足 2023-07-04 11:15:51 +08:00
lbw 0c8ba314a5 Merge branch 'dev' of https://git.pig4cloud.com/pig/pigx 2023-07-03 17:48:23 +08:00
pig666 7de2815c8c Merge branch 'dev' of 202305250923/pigx into dev 2023-07-03 16:51:25 +08:00
dujunliang 66345ee5f5 Fixing a bug.代码生成path反斜线不对导致前端预览点击文件时无法联动展示对应文件 2023-07-03 16:28:38 +08:00
lbw 931635d56c 📝 Writing docs. 增加主子表代码生成的详细 2023-06-30 12:22:06 +08:00
lbw 44f473ba27 ⚡ 移动端密码错误不锁定用户 2023-06-26 19:22:20 +08:00
lbw 0aef68f55a 🐛 Fixing a bug.同步boot 版本Mapper 继承 ModelEntiy 避免 mybatis-plus-join init 错误 2023-06-26 07:52:30 +08:00
lbw ce9dfcb87c 🔖 Releasing / Version tags. 5.1.0 2023-06-25 09:48:44 +08:00
lbw 2bc3e5d18a 🗃️ 执行数据库相关的变化,增加APP 装修菜单 2023-06-24 18:07:33 +08:00
lbw fb443658e8 🗃️ 执行数据库相关的变化,增加APP 装修菜单 2023-06-24 17:23:16 +08:00
lbw 8cbbadf500 ♻️ Refactoring code. 优化APP模块相关查询 2023-06-24 16:03:49 +08:00
lbw 20b566852f ⬇️ Downgrading dependencies. hutool 5.8.19 2023-06-21 15:07:33 +08:00
lbw 6f670e8408 🐛 Fixing a bug. 请求报文AES 加密优化 2023-06-21 14:32:31 +08:00
lbw 3ac09c2b37 ⬆️ Upgrading dependenciesdynamic-datasource-spring-boot-starter 3.6.0
hutool 5.8.20  springboot 2.7.12
2023-06-21 10:01:18 +08:00
lbw d457e52723 ⬆️ Upgrading dependencies. hutool 5.8.20 2023-06-21 08:03:54 +08:00
lbw fd660ac655 🎨 Improving structure / format of the code. 2023-06-21 08:01:08 +08:00
lbw fceb882670 ✨ Introducing new features. 重构 app 模块增加移动端发布 2023-06-21 07:54:39 +08:00
lbw 64630b1c7e ✨ Introducing new features. 代码生成的支持最新的主子表代码生成 2023-06-20 16:00:22 +08:00
lbw 7976d4401c 🎨 Improving structure / format of the code. 格式化代码 2023-06-20 11:35:42 +08:00
lbw 1eaff8c398 ⬆️ Upgrading dependencies. goview 1.2.6 2023-06-20 11:27:13 +08:00
lbw 373e394d59 ♻️ Refactoring code. 重构排序查询条件,避免gateway 两次编码导致失效问题 2023-06-20 11:26:30 +08:00
lbw 4d68be3359 ✨ Introducing new features. 增加cache监控 2023-06-07 14:17:10 +08:00
lbw 8eba77edad ⬆️ Upgrading dependencies. knife4j4.1 GetMapping 推荐使用 @ParameterObject 2023-06-07 13:26:52 +08:00
lbw 380b502cc4 ⬆️ Upgrading dependencies. knife4j4.1 GetMapping 推荐使用 @ParameterObject 2023-06-06 17:33:36 +08:00
lbw c45af2c29c ✨ Introducing new features. 支持 mybatis-plus 连表查询 2023-06-05 16:20:09 +08:00
lbw ebde2a65f8 🐛 Fixing a bug.权限名称去掉分隔符、i18n文件变量名小驼峰 2023-04-28 12:34:34 +08:00
lbw 1f6f73848c 🎨 Improving structure / format of the code. 格式化代码 2023-04-28 11:45:35 +08:00
lbw 3fa14e1a6f Merge remote-tracking branch 'gogs/luolin_dev_5.0' 2023-04-28 11:36:07 +08:00
luolin f2e637e17c ♻️ Refactoring code.生产页面表单布局默认两列 2023-04-28 11:29:37 +08:00
luolin 0d129893cf 🐛 Fixing a bug.生成页面字段排序无效问题 2023-04-28 10:25:12 +08:00
luolin c862514fe2 🐛 Fixing a bug.权限名称去掉分隔符、i18n文件变量名小驼峰 2023-04-27 23:35:13 +08:00
lbw ae15be5357 🐛 Fixing a bug. 表格全选后取消全显数据没有清空 2023-04-27 21:16:21 +08:00
lbw 04d5010f78 ✨ Introducing new features. support 瀚高数据库 2023-04-27 21:14:26 +08:00
lbw 344a30b47b ✨ Introducing new features. KingbaseSqlProvider common-pay 支持人大金仓 2023-04-25 15:01:28 +08:00
lbw 7859de0f0f 🐛 Fixing a bug. 代码生成删除delobjs 方法名错误 2023-04-25 14:12:18 +08:00
lbw 43e2bc986a ♻️ Refactoring code. #4836 WITH RECURSIVE 递归查询语法兼容性问题 2023-04-17 13:49:32 +08:00
lbw 31f85c57eb 🐛 Fixing a bug. #4825 在新建租户中【大屏设计】不可用 2023-04-15 00:11:49 +08:00
lbw 98af04bc58 🎉 🎉 🎉 v5.0 新的里程碑
🎉 🎉 🎉 v5.0 新的里程碑

🎉 🎉 🎉 v5.0 新的里程碑

🎉 🎉 🎉 v5.0 新的里程碑

🎉 🎉 🎉 v5.0 新的里程碑
2023-04-11 19:40:48 +08:00
lbw c04b895686 ✨ Introducing new features. 优化代码生成模板 v-loading 2023-04-11 08:38:57 +08:00
lbw 34535262eb ♻️ Refactoring code. 适配 v5 pigx-app 2023-04-09 11:39:57 +08:00
lbw 7b7615c68f ⚡ 优化客户端模式下 NPE异常 2023-04-07 18:03:01 +08:00
lbw 6e0f2f7fe4 💚 Fixing CI Build. 修改云效编译问题 2023-04-07 14:41:02 +08:00
lbw fbde71ccc4 🎨 Improving structure / format of the code. 优化代码,批量删除无用 import 2023-04-07 14:39:09 +08:00
lbw 6f2187ed0a 🗃️ 执行数据库相关的变化,适配 v5.0 2023-04-07 14:33:05 +08:00
lbw 943d6bdd04 ♻️ Refactoring code. pigx-goview 适配最新V5 UI 2023-04-07 13:08:11 +08:00
lbw 27604385a3 ♻️ Refactoring code. pigx-oa 适配最新V5 UI 2023-04-07 10:56:16 +08:00
lbw 1ddacb086e ♻️ Refactoring code. pigx-mp-biz 适配最新V5 UI 2023-04-07 10:17:51 +08:00
lbw 106627660e ♻️ Refactoring code. pigx-pay-biz 适配最新V5 UI 2023-04-07 09:28:36 +08:00
lbw 4103227078 ♻️ Refactoring code. pigx-upms-biz 适配最新V5 UI 2023-04-06 16:06:00 +08:00
lbw d6a86c275c ♻️ Refactoring code. pigx-quartz 适配最新V5 UI 2023-04-06 15:48:07 +08:00
lbw e6838a19e1 ♻️ Refactoring code. pigx-codegen 适配最新V5 UI 2023-04-06 15:03:58 +08:00
lbw 3c047a59de ♻️ Refactoring code. pigx-app-server 适配最新V5 UI 2023-04-06 14:46:24 +08:00
lbw be7654d6ca ♻️ Refactoring code. 适配最新 V5 UI 2023-04-06 14:24:56 +08:00
lbw 2b6c984791 ♻️ Refactoring code. 优化 upms api 实体 2023-04-06 10:44:59 +08:00
lbw e358994000 ✨ Introducing new features. aj-report 变更为 goview 2023-04-06 10:39:15 +08:00
lbw 38cb3ea380 ⬆️ Upgrading dependencies. mysql-connector-java 修改为 mysql-connector-j 2023-04-04 22:24:23 +08:00
lbw 498d9e422b ⬆️ Upgrading dependencies. xxl-job 2.4.0 2023-04-04 22:08:39 +08:00
lbw c0f7da40f7 ♻️ Refactoring code. 重构部门结构 2023-04-04 11:12:47 +08:00
lbw 2f85b35bd5 ✨ Introducing new features. 支持 LocalTime 类型转换 2023-03-30 23:03:58 +08:00
lbw d731366d86 ⬆️ Upgrading dependencies. sas 0.4.1 2023-03-24 10:26:33 +08:00
lbw 1c4d5be077 🔧 修改配置文件。 默认关闭xss 2023-03-24 10:10:39 +08:00
lbw 063fc88361 ⬆️ Upgrading dependencies. spring-boot 2.7.10/spring-cloud-alibaba 2021.0.5.0 2023-03-24 10:10:24 +08:00
lbw b27fd2ae18 🐛 Fixing a bug. fix #4773 登陆成功清除累计失败次数异常 2023-03-22 09:45:05 +08:00
lbw ca4da3ea8b ✨ Introducing new features. toc header feign 传递 2023-03-18 15:18:37 +08:00
lbw 57c1cad799 ✨ Introducing new features. support client_secrt_post client_secrt_header 2023-03-18 15:17:49 +08:00
lbw 60f8bd160d 🔒 修复安全问题 #4755 短信登录验证码校验 2023-03-18 15:17:21 +08:00
lbw 4e805cd792 ♻️ Refactoring code. 支持数据库记录 client 信息 2023-03-17 16:33:33 +08:00
lbw e356e02f31 ♻️ Refactoring code. 扩展 PigxUser 增加扩展属性 ,注意清空 Redis 2023-03-13 21:08:39 +08:00
lbw e64ce41167 ♻️ Refactoring code. 增加 Long to String 的转换器 2023-03-13 21:08:11 +08:00
lbw eb9109375e ✨ Introducing new features. 增加 easyexcel long 转换器 string 避免精度丢失 2023-03-08 13:56:20 +08:00
lbw c9a136324d 🔥 删除手机号、社交登录缓存逻辑 2023-03-07 22:44:39 +08:00
lbw d114d5de61 ♻️ Refactoring code. 支持string[] 类型导出 2023-03-04 22:37:42 +08:00
lbw 8add169a45 🐛 Fixing a bug. 避免 audit 字段 NPE 2023-02-28 20:52:41 +08:00
lbw deaf9b9563 ✨ Introducing new features. up jasypt 3.0.5 fix: #326 修复 SpringCloud 下,远程配置文件修改(如Nacos),本地ConfigurationProperties 配置类没… #327 2023-02-28 14:36:39 +08:00
lbw ac551c5f0e Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2023-02-28 13:43:39 +08:00
lbw 51ebb7f7bc ✨ Introducing new features. common-audit 字段变更审计功能 2023-02-28 13:14:13 +08:00
aeizzz b0ee4dccdc 🐛 Fixing a bug. 修复数据库脚本的变量名称 2023-02-28 09:57:58 +08:00
lbw 80ff07f744 ✨ Introducing new features. 字段变更审计功能 2023-02-27 23:25:45 +08:00
aeizzz 596bcbc271 Merge remote-tracking branch 'origin/leng_dev' into lei_dev 2023-02-24 17:54:18 +08:00
lbw 32bfde0552 Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2023-02-24 17:36:42 +08:00
aeizzz 3cab378fde 🐛 Fixing a bug. pig前缀改成pigx 2023-02-21 09:46:36 +08:00
lbw fcc20436b7 ⬆️ Upgrading dependencies. #4691 support maven 3.9.0 2023-02-21 09:31:50 +08:00
lbw d6bd0d1652 🔥 Removing code or files. 删除无用代码属性 2023-02-20 17:19:15 +08:00
lbw b3ce559fbb 🔖 Releasing / Version tags. 5.0.0快照 2023-02-15 16:22:35 +08:00
lbw e78da7a9e3 ♻️ Refactoring code.增加I18N 缓存 2023-02-15 11:06:32 +08:00
lbw 3354b7ceb1 feat: #4677 优化 checkToken 返回 OAuth2AccessToken 全部信息 2023-02-13 19:08:23 +08:00
lbw 4e41ecd121 ⚡ 优化 #4659 终端管理有bug初次编辑时"online_quantity":null 2023-02-12 10:17:23 +08:00
lbw 5b9aa7199f Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2023-02-12 08:05:22 +08:00
lbw 4d8389601c ♻️ Refactoring code. 兼容更多排序数组类型的配置 2023-02-09 18:18:53 +08:00
lbw 211e583e7d Merge branch 'master' into leng_dev 2023-02-09 18:18:03 +08:00
lbw e8343a3274 🐛 Fixing a bug. close #4660 因为类名错误,seata服务无法启动 2023-02-08 14:32:25 +08:00
aeizzz 98d5acdf48 🐛 Fixing a bug. 终端管理保存时后端处理如果没有值设置为 0 2023-02-08 08:48:38 +08:00
lbw 999d2f4d15 ✨ Introducing new features. 支持 vue3 代码生成 2023-02-06 16:34:12 +08:00
lbw 203db7ab4a Merge branch 'master' of https://git.pigx.vip/pig/pigx into leng_dev 2023-02-03 22:01:39 +08:00
lbw 2df8577676 🐛 Fixing a bug. #4658 【鉴权注解】pms.hasPermission 失效 2023-02-03 18:10:57 +08:00
lbw af6987594e Merge branch 'dev' of https://git.pigx.vip/pig/pigx 2023-02-03 18:04:21 +08:00
aeizzz cf3f907c5b Merge branch 'leng_dev' into lei_dev 2023-02-03 13:22:54 +08:00
aeizzz de8fd9efc4 🐛 Fixing a bug. 修复 @pms.hasPermission 权限判断不生效的问题 2023-02-03 13:22:26 +08:00
lbw bf3192d54e Merge branch 'dev' of https://git.pigx.vip/pig/pigx into leng_dev 2023-02-01 09:32:44 +08:00
pig777 dfe49efef2 Merge branch 'dev' of 31849868/pigx into dev 2023-02-01 09:26:44 +08:00
lbw 9d0175c018 Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2023-01-31 22:11:50 +08:00
31849868 77e5c4bfb2 oa_leave_bill 中的 tenantId 应该是 Long 2023-01-31 13:03:46 +08:00
aeizzz 6843d5ab59 ✨ Introducing new features. 更新app端登录信息适配单体模块 2023-01-30 14:44:10 +08:00
aeizzz f13bade19e ✨ Introducing new features. 更新app端登录信息适配单体模块 2023-01-29 16:04:47 +08:00
lbw 6d2e4af43f 🐛 monitor druid 监控失败 2023-01-29 14:44:03 +08:00
aeizzz d1208e30c2 ⬆️ Upgrading dependencies. seata 1.6.1 2023-01-28 15:24:48 +08:00
lbw dc9f05d975 Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2023-01-28 14:50:19 +08:00
aeizzz 4600e21f3d ♻️ Refactoring code. javaformat 2023-01-28 13:59:41 +08:00
aeizzz 510061cc75 ✨ Introducing new features. closed #4642 up seata-server 1.6.1 2023-01-28 13:58:45 +08:00
lbw fc89234adc 🐛 修复客户端修改事件无法同步监听 2023-01-28 11:20:50 +08:00
lbw b2146f019e Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2023-01-28 11:18:42 +08:00
aeizzz 859a049646 🐛 Fixing a bug. 授权码登录时 requireProofKey 设置为false 2023-01-28 11:01:23 +08:00
lbw 4053476ff6 ♻️ 重构密码登录过程的特殊日志输出 2023-01-28 09:55:31 +08:00
lbw 39a7a4ebf8 ✨ pigx-register支持开启认证模式 2023-01-14 09:44:49 +08:00
lbw 701a97184d Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2023-01-13 09:54:24 +08:00
aeizzz 997b926611 🐛 Fixing a bug. 修复TransactionalEventListener 监听事件时无法处理 WebServerInitializedEvent 事件 2023-01-13 09:50:38 +08:00
lbw 04fbccf982 🔖 v4.6.0 2023-01-12 20:08:44 +08:00
aeizzz 7f6f5c5c4c 🐛 Fixing a bug. 租户套餐问题 2023-01-12 19:29:24 +08:00
aeizzz 246fa10785 🐛 Fixing a bug. 修改移动端请求头识别字段,防止被nginx过滤 2023-01-11 20:05:24 +08:00
lbw e8e71f36c4 🗃️ 调整租户套餐相关的SQL 2023-01-10 12:18:39 +08:00
lbw 355b47279e ✨ SAS 登录并发控制 2023-01-10 10:13:18 +08:00
lbw 984b1d94ec 🗃️ 数据库脚本修正 2023-01-09 20:00:15 +08:00
lbw cca3567c34 Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2023-01-09 19:03:52 +08:00
aeizzz e0218e79c5 Merge remote-tracking branch 'origin/lei_dev' into lei_dev 2023-01-07 16:58:24 +08:00
aeizzz 1027bccfed ♻️ Refactoring code. 优化代码生成模板 2023-01-07 16:58:13 +08:00
lbw 5a94caa94b Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2023-01-06 17:41:18 +08:00
lbw b995a015b5 🗃️ pigxx_app 默认登录用户 appuser 2023-01-06 17:27:03 +08:00
aeizzz e646396044 ♻️ Refactoring code. 优化代码生成模板 2023-01-06 15:47:21 +08:00
aeizzz b9bf0d14b9 🐛 Fixing a bug. 修复令牌管理中不显示用户id问题 2023-01-06 14:18:00 +08:00
lbw 2cc49aa479 ♻️ 重构@EnableOpenApi 注解增加是否是微服务架构属性,方便单体版本使用 2023-01-06 13:18:27 +08:00
lbw 785acd7d98 ⏪ 回滚代码生成的部分模板的单双引号规则 2023-01-06 11:48:07 +08:00
lbw 1f09b9eb71 🐛 pigx-app 用户编辑缓存不同步问题修复 2023-01-05 22:42:03 +08:00
aeizzz 6af22067d6 🐛 Fixing a bug. 移动端修改用户信息 2023-01-05 20:34:50 +08:00
aeizzz 01d9fcd220 Merge branch 'leng_dev' into lei_dev
# Conflicts:
#	pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserController.java
#	pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserServiceImpl.java
2023-01-05 20:22:50 +08:00
aeizzz a29d368d68 🐛 Fixing a bug. 移动端修改用户信息 2023-01-05 20:19:49 +08:00
lbw 9feb6e65e1 🗃️ 终端管理默认不注入授权码模式,授权码模式必须填写redirect 字段 2023-01-05 20:01:41 +08:00
lbw d1c33d001b Merge remote-tracking branch 'origin/openapi' into leng_dev
# Conflicts:
#	pigx-visual/pigx-codegen/src/main/resources/template/Entity.java.vm
2023-01-04 21:50:44 +08:00
lbw b069372c18 Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2023-01-04 21:49:52 +08:00
lbw a74cf7162b ♻️ 修改请求报文加密body key 和响应输出保持一致 2023-01-04 21:49:42 +08:00
aeizzz a8c8ff8e01 🐛 Fixing a bug. 修改代码生成器导入依赖 2023-01-04 20:16:40 +08:00
lbw e11b9e6f13 🔥 删除sso-demo 模块,可参考文档单点登录自行整合 2023-01-04 19:41:45 +08:00
lbw eee4222d54 🔥 删除sso-demo 模块,可参考文档单点登录自行整合 2023-01-04 19:41:39 +08:00
lbw 40daaa0afc Merge remote-tracking branch 'origin/openapi' into openapi 2023-01-04 19:21:20 +08:00
lbw 6b9225f039 ♻️ Refactoring code. 升级springboot2.7 report 启动失败 2023-01-04 19:21:13 +08:00
aeizzz 91b3991fa4 ✨ Introducing new features. closed #4604 代码生成增加逻辑删除字段注解自动生成 2023-01-04 15:44:38 +08:00
aeizzz eda6d43137 ✨ Introducing new features. closed #4604 代码生成增加逻辑删除字段注解自动生成 2023-01-04 15:41:22 +08:00
lbw 212a6182c1 🐛 Fixing a bug. close #4600 单体版引入多数据源报错 2023-01-04 13:14:06 +08:00
lbw cfc9643e8e Merge remote-tracking branch 'origin/openapi' into openapi 2023-01-04 11:56:15 +08:00
lbw d970431b6d 🎨 Improving structure / format of the code. 代码格式化 2023-01-04 11:56:07 +08:00
lbw ee117107a0 ♻️ Refactoring code. 兼容单体版本 supoort knife4j doc 2023-01-04 11:55:49 +08:00
aeizzz 62b567225e ✨ Introducing new features. up spring boot 2.7.7 2023-01-04 10:38:33 +08:00
aeizzz 6d4a3bed38 ✨ Introducing new features. 更新适配openapi的 sql脚本 2023-01-03 13:29:27 +08:00
aeizzz 405701009d ✨ Introducing new features. 适配openapi 修改代码生成器模板 2023-01-03 11:29:05 +08:00
lbw 65a23e8c30 ♻️ Refactoring code. supoort knife4j doc 2023-01-03 09:50:21 +08:00
aeizzz b10ae03f80 ✨ Introducing new features. up mybatis-plus 3.5.3.1 2023-01-03 09:06:22 +08:00
lbw 2a842989e2 🐛 Fixing a bug.ObjectUtil.isEmpty 2023-01-02 21:58:28 +08:00
lbw c3ebcc491e ♻️ Refactoring code. supoort knife4j doc 2023-01-02 18:10:30 +08:00
lbw 524fac64a3 ♻️ Refactoring code. supoort knife4j 4.0 2023-01-02 10:30:01 +08:00
lbw eb3387da9f ♻️ Refactoring code. 使用openapi3 替代swagger2 2023-01-02 10:17:44 +08:00
aeizzz 82a1f1f5bb 🐛 Fixing a bug. 修复导入钉钉用户是多级部门处理问题 2022-12-30 16:29:33 +08:00
aeizzz 0843b9d468 Merge branch 'leng_dev' of codeup.aliyun.com:pig/pigx/pigx into lei_dev 2022-12-29 19:11:07 +08:00
aeizzz 8de53b30a4 ✨ Introducing new features. up mybatis-plus 3.5.3 2022-12-28 20:08:26 +08:00
aeizzz a1feac5a8e 🐛 Fixing a bug. 避免 race condition 2022-12-28 12:19:16 +08:00
lbw 032c1b54d3 🔧 修改配置文件。删除无用配置和注释内容 2022-12-27 11:20:08 +08:00
lbw f118e72670 Merge remote-tracking branch 'origin/lei_dev' into leng_dev 2022-12-27 11:11:27 +08:00
aeizzz ca1b4f9b98 🐛 Fixing a bug. 删除docker-compose 中redis 和mysql 的暴漏端口 2022-12-27 10:02:30 +08:00
aeizzz 2692d6df71 🐛 Fixing a bug. 新增租户时租户套餐功能bug,默认的角色没有数据权限导致报错 2022-12-26 19:27:04 +08:00
aeizzz 73b0664d2a ✨ Introducing new features. 覆盖nacos官方历史记录查询的问题
数据库插件是oracle时 查询出空数据对比错误
2022-12-26 17:36:06 +08:00
lbw c2617efe4f Merge remote-tracking branch 'origin/lei_dev' into leng_dev
# Conflicts:
#	db/2pigxx.sql
2022-12-19 19:12:20 +08:00
lbw 69c49818fa 🐛 Fixing a bug. 配置属性错误导致对外暴露失效 2022-12-19 18:54:41 +08:00
aeizzz ed24f235a2 🐛 Fixing a bug. 更新数据库脚本 2022-12-19 18:37:23 +08:00
aeizzz 30474f03e2 🐛 Fixing a bug. 修改代码生成模板格式问题;更新数据库脚本 2022-12-19 17:41:15 +08:00
aeizzz df8397c2b9 🐛 Fixing a bug. 更新数据库脚本格式 2022-12-19 17:01:19 +08:00
aeizzz 7a12bfa614 🐛 Fixing a bug. 更新数据库脚本格式 2022-12-19 15:30:00 +08:00
aeizzz 916e127191 🐛 Fixing a bug. 修改数据库脚本格式 2022-12-19 14:06:23 +08:00
aeizzz bcf74da7d0 🐛 Fixing a bug. 需改数据库脚本和nacos 读取的配置 2022-12-19 13:50:41 +08:00
aeizzz 0f660f56b2 ✨ Introducing new features. 更新全量数据库脚本和更新脚本 2022-12-19 13:07:06 +08:00
aeizzz 5327299267 ✨ Introducing new features. 更新数据库脚本 2022-12-19 11:00:06 +08:00
aeizzz 03a4985ba7 Merge branch 'leng_dev' of codeup.aliyun.com:pig/pigx/pigx into lei_dev 2022-12-19 10:51:27 +08:00
lbw 0e35ebdcec ♻️ Refactoring code. v4.6.0 2022-12-19 10:34:46 +08:00
aeizzz 14ef0e0da5 ✨ Introducing new features. 更新 docker-compose.yml 部署脚本 2022-12-19 10:09:55 +08:00
lbw 89d3bad8ce 🔥 Removing code or files. 删除无用配置属性 2022-12-18 09:14:19 +08:00
aeizzz a88e3f1a89 ✨ Introducing new features. 升级nacos版本为2.2.0 2022-12-16 13:48:41 +08:00
aeizzz d84ba2dcc1 ✨ Introducing new features. 更新积木报表前端 2022-12-15 15:17:56 +08:00
aeizzz a3f6d74ca2 ✨ Introducing new features. 更新积木报表 2022-12-15 08:58:53 +08:00
aeizzz 2b78b02ea0 Merge branch 'leng_dev' of https://codeup.aliyun.com/pig/pigx/pigx into lei_dev
 Conflicts:
	pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/CustomMagicDesignerAuthorizationInterceptor.java
2022-12-14 16:25:38 +08:00
aeizzz 4df7a62c89 🐛 Fixing a bug. 修改codegen启动报错 2022-12-14 16:25:06 +08:00
lbw 6590012517 ♻️ Refactoring code. 迁移 Spring Authorization Server 2022-12-14 16:14:16 +08:00
aeizzz d92ae7b504 🐛 Fixing a bug. 修复报表中检查token的问题 2022-12-14 16:00:10 +08:00
aeizzz 1a780fa3d4 ✨ Introducing new features. 更新导入excel 时指定标题行 2022-12-14 13:35:47 +08:00
aeizzz 6aabbe61e6 🐛 Fixing a bug. 修复 RemoteAppUserService 默认不注入问题 2022-12-13 17:12:44 +08:00
aeizzz 39d119991e ♻️ Refactoring code. 修改pom 中文乱码问题 2022-12-12 20:18:35 +08:00
aeizzz 436b5748c0 🐛 Fixing a bug. 令牌查询报错 2022-12-12 16:21:09 +08:00
aeizzz f6fbd50995 ♻️ Refactoring code. 格式化代码 2022-12-12 13:45:38 +08:00
aeizzz f5ea97c8b9 ✨ Introducing new features. 增加部门导入,企业微信用户导入,钉钉用户导入 2022-12-12 13:43:02 +08:00
lbw 0513be8644 ♻️ Refactoring code. 迁移 Spring Authorization Server 2022-12-11 15:18:48 +08:00
lbw 0735bba5e2 Merge remote-tracking branch 'origin/features/app-server' into sas 2022-12-11 10:29:38 +08:00
lbw c4d5457d46 ♻️ Refactoring code. 三方登录适配器调整包名 2022-12-11 09:55:29 +08:00
aeizzz 570c9b26b5 📝 Writing docs. 增加app表,增加租户菜单表 2022-12-09 16:53:38 +08:00
aeizzz 6e31ea6f9f ✨ Introducing new features. 新增租户菜单功能 2022-12-09 16:45:15 +08:00
aeizzz 4cb7646afb 🐛 Fixing a bug. 修复非默认租户注册账号,获取默认角色时报错 2022-12-09 16:44:55 +08:00
aeizzz d1e6975809 ✨ Introducing new features. 增加小程序登录字段维护sql 2022-12-09 13:30:47 +08:00
aeizzz f07a97be74 ✨ Introducing new features. 完善app中微信一键登录 2022-12-09 11:03:13 +08:00
aeizzz 2cfc9c9a95 ♻️ Refactoring code. 格式化代码 2022-12-08 21:38:14 +08:00
aeizzz 3119fe2a1e ✨ Introducing new features. 移动端社交登录 2022-12-08 21:37:28 +08:00
aeizzz 5078800250 ✨ Introducing new features. 增加用户新增和编辑时候的手机号重复判断 2022-12-08 21:18:18 +08:00
aeizzz 28c2affaa7 ✨ Introducing new features. 增加APP手机登录或者社区账号登录逻辑 2022-12-08 18:28:08 +08:00
aeizzz 8b0e4ccbe5 ✨ Introducing new features. 完善app登录时token 的判断
完善app登录时数据权限的问题
2022-12-08 17:56:21 +08:00
aeizzz 986bb47b07 ✨ Introducing new features. 新增角色管理和app登录
1. 完成角色管理
2. 完成菜单管理
3. 完成app用户登录,使用app的用户信息
2022-12-08 15:52:06 +08:00
aeizzz 669b20cf82 ✨ Introducing new features. 新增 app 端用户管理 2022-12-07 14:19:00 +08:00
aeizzz dd23663553 ♻️ Refactoring code. 格式化代码 2022-12-05 16:04:30 +08:00
aeizzz b84ae1b989 🐛 Fixing a bug. 路由实体类中缺少字段和自动注入,修改使用pg数据库时用户查询时的删除标记 2022-12-05 15:59:25 +08:00
aeizzz ca844b16a4 Merge branch 'leng_dev' of https://codeup.aliyun.com/pig/pigx/pigx into lei_dev 2022-12-02 18:03:29 +08:00
aeizzz 747e284f17 🐛 Fixing a bug. 用户删除时删除对应的用户部门信息 2022-12-02 18:01:34 +08:00
lbw c281b6972d 🐛 Fixing a bug. 代码生成模块服务监控状态一直显示不正常 2022-12-01 20:25:33 +08:00
aeizzz e80216eef0 ✨ Introducing new features. close #4544 代码预览 增加左侧结构树 2022-11-29 16:57:43 +08:00
aeizzz 871bdb1183 ✨ Introducing new features. close #4535 up common-excel 模块 2022-11-28 14:51:04 +08:00
aeizzz 5b8b9113ee ✨ Introducing new features. close #4532 up spring cloud 2021.0.5 2022-11-28 13:28:41 +08:00
aeizzz 8c26498284 ✨ Introducing new features. close #4533 up springboot 2.7.6 2022-11-28 13:17:17 +08:00
aeizzz f18319754b ✨ Introducing new features. close #4534 up hutool 5.8.10 2022-11-28 13:08:20 +08:00
aeizzz 3a256dfb71 🐛 Fix a bug. close #4531 代码生成 element 风格缺少 api.js 文件 2022-11-28 10:00:30 +08:00
aeizzz 776448a1b8 Merge branch 'leng_dev' of codeup.aliyun.com:pig/pigx/pigx into lei_dev 2022-11-27 12:43:17 +08:00
lbw 6acc92b769 🗃️ 执行数据库相关的变化 菜单表增加显隐控制字段
🗃️ 执行数据库相关的变化 菜单表增加显隐控制字段
2022-11-27 12:41:04 +08:00
lbw bc09a19ced 🗃️ 执行数据库相关的变化 菜单表增加显隐控制字段 2022-11-27 12:29:20 +08:00
lbw 756617ae64 🐛 Fixing a bug. close #4520 打开积木报表报错:全局异常信息 ex=JmReportTokenServices实现类getUsername方法返回值不允许为空 2022-11-21 12:23:58 +08:00
lbw 3d0fde8e1b ⬆️ Upgrading dependencies. wxjava 4.4.0 2022-11-17 08:01:57 +08:00
lbw b18859eee8 🐛 Fixing a bug. #4501 启动xxljob后添加执行器一直没有效果 2022-11-14 15:26:13 +08:00
lbw 35f833a56f 📝 Writing docs. 优化 dockerfile 2022-11-05 08:44:35 +08:00
lbw d56dfc4a7b ✨ Introducing new features. 支持个人级别数据权限 2022-11-04 16:03:09 +08:00
lbw c7aaa31db8 ⬆️ Upgrading dependencies. 升级 springboot 2.7.5 hutool 版本 2022-11-04 16:02:52 +08:00
pig666 9bc774e774 Merge branch 'master' of 202204140934/pigx into dev 2022-11-03 13:51:50 +08:00
byLaptop d750876367 :features:data、upms:扩展本人数据权限层级,sys_dept表添加user_id避免报错 2022-11-02 15:43:39 +08:00
byLaptop 8fd679fa67 feature:upms:菜单显隐控制后端支持吗,添加visible字段并且默认为1显示0隐藏 2022-11-01 16:42:38 +08:00
lbw 778cc3b9b9 Merge https://git.pigx.vip/121081498/pigx into leng_dev 2022-10-28 09:29:49 +08:00
feng 0223cda149 '删除重复ojdbc8依赖' 2022-10-26 23:13:09 +08:00
lbw 23b27e6c2c Merge branch 'dev' into leng_dev 2022-10-16 14:52:00 +08:00
lbw 910b90ee23 ✨ Introducing new features. #4441 接口请求响应加密与请求体解密 2022-10-16 14:51:40 +08:00
lbw 8efab521bf ✨ Introducing new features. 支持 oauth2.0 scope 设置 2022-10-14 17:19:25 +08:00
lbw 8bdf895b4a ⬆️ Upgrading dependencies. springboot 2.7.4
hutool 5.8.8
2022-10-14 10:44:30 +08:00
lbw 03b052702b 🐛 Fixing a bug. fix close #4410 seata-server 制作镜像报错 2022-10-08 12:20:11 +08:00
pig666 132b292cba Merge branch 'master' of 786556226/pigx into dev 2022-09-30 17:30:39 +08:00
lbw b7c22a2d38 ⬆️ Upgrading dependencies. redisson 3.17.6 2022-09-30 16:33:03 +08:00
lbw e9f625d6eb ♻️ Refactoring code. 租户ttl切换清空拦截器修改为过滤器 2022-09-30 16:28:41 +08:00
geek 3ff89c50e3 fixed #4403 2022-09-30 14:39:38 +08:00
lengleng 59ce474e20 Merge branch 'dev' of https://git.pigx.vip/pig/pigx into leng_dev 2022-09-22 17:21:35 +08:00
pig777 4e10761876 Merge branch 'master' of 853829042/pigx into dev 2022-09-20 15:22:14 +08:00
hangg 703c1aa486 修改表排序规则类型为:utf8mb4_general_ci 2022-09-20 14:27:23 +08:00
lbw 48c940f653 🎨 Improving structure / format of the code. 2022-09-16 17:59:01 +08:00
lbw 907c5e8a82 ⚡ 优化 避免用户名输出错误 查不到用户 更正用户状态失败 2022-09-16 17:57:50 +08:00
lbw a2b64e1109 ⬆️ Upgrading dependencies. spring cloud alibaba version 2022-09-16 17:20:04 +08:00
lbw 5a3493c33e Merge branch 'master' into leng_dev 2022-09-16 17:19:51 +08:00
lbw 85c19f664d ✨ Introducing new features. #4361 如何将用户名或密码不正确的中文提示改为英文提示 2022-09-16 17:19:39 +08:00
lbw 4a61b67350 ♻️ Refactoring code. 动态代码主键、逻辑删除更灵活配置 2022-09-08 10:00:50 +08:00
lbw 1c7d92a4ce 🔖 Releasing / Version tags. 4.5.0
✨ Introducing new features. close #4314 seata-server 支持Jar 打包,不使用默认的ZIP 方便调试

🔖 Releasing / Version tags. 4.5
2022-09-05 14:50:06 +08:00
lbw 86dfea85ac ✨ Introducing new features. close #4311 common-excel 支持JDK17 2022-09-03 16:30:09 +08:00
lbw 39aee6dffe ⬆️ Upgrading dependencies. mysql base 8.0.30 2022-09-02 17:01:55 +08:00
lbw 3413df573e ⚡ 优化 #4298 同时集成pigx-common-seata+shardingsphere后项目无法启动 2022-09-02 17:01:04 +08:00
lbw 216a87a38c ⬆️ Upgrading dependencies. magic-api 2.2.2 2022-09-02 16:58:05 +08:00
lbw 994151e70a 🗃️ 执行数据库相关的变化, 完善数据库脚本 2022-08-27 17:31:07 +08:00
lbw 71b8d5a247 💄 日志记录退出事件文案错误 2022-08-23 15:44:11 +08:00
lbw e0d0981073 ⏪ Reverting changes. 回滚配置 b52d813aa4 2022-08-22 12:46:23 +08:00
lbw a77bc1a099 ♻️ Refactoring code. 优化登录日志记录时间 2022-08-21 11:40:15 +08:00
lbw ef57c77719 🎨 Improving structure / format of the code. 格式化 report 模块 2022-08-21 10:54:40 +08:00
lbw 7ecfca7f18 🐛 Fixing a bug. fix swagger 网关注入失败 2022-08-20 14:51:22 +08:00
lbw 3e76d11fc8 ♻️ Refactoring code. report 支持注册中心发现 2022-08-20 13:37:44 +08:00
lbw f42904f8e5 ♻️ Refactoring code. 支付模块修改适配 2.7 2022-08-20 11:31:44 +08:00
lbw 551a7bc285 ✨ Introducing new features. 优化 AJ-report 升级至最新版本 支持iframe 嵌套 SQL 更新 2022-08-19 16:23:59 +08:00
lbw a136e400d5 ✨ Introducing new features. 优化 AJ-report 升级至最新版本 支持iframe 嵌套 2022-08-19 15:57:49 +08:00
lbw a057f24ad9 ⚡ 优化。#59 菜单开启KeepLive导致Redis监控页面未能触发beforeDestory和destoryed 2022-08-19 12:10:29 +08:00
lbw de255bb7d1 ⚡ 优化。 优化退出逻辑避免无用导入 2022-08-16 14:05:36 +08:00
lbw 08b277bf94 💄 close #4227 租户新增 自动更新客户端配置 2022-08-15 16:08:23 +08:00
lbw b91bca769c 🐛 Fixing a bug. close #4218 前段部门管理表单对话框炫彩主题下遮罩层在表单上面,无法编辑内容 2022-08-13 12:19:02 +08:00
lbw 4ec983a2fe ✨ Introducing new features. close #4211 多数据源支持Druid 日志格式化输出 2022-08-09 13:52:17 +08:00
lbw 5ade945037 ♻️ Refactoring code. close #4209 支持自定义数据权限拦截器、和租户拦截器 2022-08-09 13:29:20 +08:00
lbw b52d813aa4 ✨ Introducing new features. close #4206 Spring MVC 处理映射匹配修改为PathPatternParser 2022-08-07 14:06:29 +08:00
lbw b09808d7a5 🐛 Fixing a bug. 微信公众号用户取消关注重新关注报主键重复 2022-08-07 12:32:58 +08:00
lbw d2c6c44499 ⬆️ 依赖升级 流水线支持打包至云效 2022-08-06 16:31:29 +08:00
lbw 62d774d1c9 ⬆️ Upgrading dependencies. springboot 2.6.10 2022-08-06 16:05:46 +08:00
lbw c65cb1e393 🐛 Fixing a bug. close #4204 postgresql 代码生成查询表列多分号 2022-08-06 15:41:55 +08:00
lbw b467f56783 ♻️ 重构 TenantContextHolderFilter undefined 判断 2022-08-06 13:36:11 +08:00
pig777 60782d4095 Merge branch 'master' of 202206271646/pigx into dev 2022-08-05 18:08:43 +08:00
202206271646 af2ddcdb83 前端第一次登录时或者部分请求时可能tenant_id会是undefined
http://192.168.195.219:5005/ws/info?access_token=54aaf82e-89ef-488b-a692-f542532f010b&TENANT-ID=undefined
在开启webSocket的时候会有一些请求没有租户的id,前端请求过来会是undefined,还有/actuator/health这个请求的租户id也是undefined,会造成第一次登录的时候,没有直接把当前的sessions添加到WebSocketSessionHolder的USER_SESSION_MAP里面
2022-08-05 17:48:00 +08:00
pig777 9d6812bb8d Merge branch 'master' of 202206271646/pigx into dev 2022-07-30 10:50:16 +08:00
202206271646 0a0cbdcb3a 在RetOps里面把getMsg()里面Optional.of()改为Optional.ofNullable()
原因也很简单,在调用Optional.of()的时候源码里面of()该方法里面的值只能是不能为空,代码里面有判断空的异常,但是我们有时候会需要调用RetOps里面的getMsg()方法,但是服务直接调用的时候是成功时msg里面的信息是空的,然而Optional.of()里面不能传空的值,就会出现空指针的异常,而使用Optional.ofNullable()这个方法就不会出现这种异常,如果传入的值是空,它会自动给你new出一个Optional.empty()防止出现空指针异常,比起使用of()方法,ofNullable()更合适
2022-07-30 09:48:59 +08:00
fxz 9e4d1835ab Merge branch 'master' of 786556226/pigx into dev 2022-07-27 17:00:18 +08:00
pig777 592d5bac61 Merge branch 'master' of 202206271646/pigx into dev 2022-07-27 09:51:20 +08:00
geek 33966bf105 添加根据"key*"模糊批量删除缓存的能力 2022-07-26 17:00:40 +08:00
geek 3282f444e8 修复https形式访问nacos控制台时登录不了的bug 2022-07-26 16:27:54 +08:00
202206271646 50b2bac8a1 更新 'pigx-common/pigx-common-bom/pom.xml'
修改mybtis-plus3.5.1版本出现枚举映射的bug,把mybtis-plus升级到3.5.2
2022-07-26 09:14:48 +08:00
lbw 441d34677c ✨ Introducing new features. LoginTypeEnum ADD 企业微信登录 2022-07-19 12:13:52 +08:00
lbw 8ef31d682d ✨ Introducing new features. LoginTypeEnum ADD 企业微信登录 2022-07-19 10:54:37 +08:00
lbw 3dfcf28ce7 ⬆️ Upgrading dependencies. spring boot 2.6.9 & hutool 5.8.4 2022-07-14 21:41:03 +08:00
lbw e12f3147e4 🔖 Releasing / Version tags. 4.5.0 快照 2022-07-14 18:05:18 +08:00
lbw ec6a17570c ✨ Introducing new features. close #4134 【低代码】表单设计以后直接运行无需下载代码 2022-07-14 18:01:22 +08:00
lbw c631e665a5 ➕ 添加依赖, 添加nexus 示例,方便云效流水线构建 2022-07-14 17:46:41 +08:00
lbw cf285407f5 ✨ Introducing new features. feign 异常直接抛出 方便 全局异常处理 2022-07-09 09:23:26 +08:00
lbw f8734c9614 🐛 Fixing a bug. close #4099 手机验证码登录强制校验验证码 2022-07-05 21:41:08 +08:00
lbw 75598ee8ac ✨ Introducing new features. close #4088 permitall ignoreUrls 增加default 2022-07-03 10:58:01 +08:00
lbw ca20a8a732 🎨 Improving structure / format of the code. Switch Case 语句格式 调整 2022-07-03 08:37:43 +08:00
lbw 2dfebcb79e ♻️ Refactoring code. RetOps 重构 PigxClientDetailsServiceImpl.java 2022-07-03 08:36:55 +08:00
lbw 432d484e07 ♻️ Refactoring code. 重构swagger 模块通过 import 注解动态导入 2022-06-28 16:30:10 +08:00
lbw fee1b3f98f ✨ Introducing new features. close #4070 AJ 大屏显示demo的背景图获取不到 2022-06-28 12:21:35 +08:00
lbw 6d3ee00fdc 🐛 Fixing a bug. RetOps.java 链式调用处理错误导致用户不存在异常无法抛出 2022-06-28 11:55:36 +08:00
lbw 6ba7329b2a ✨ Introducing new features. feign 注入支持单体项目通过 127.0.0.1 回路使用 2022-06-25 12:23:12 +08:00
lbw 147794e17e ♻️ Refactoring code. 适配boot版本 2022-06-25 11:22:00 +08:00
lbw 9461620091 ✨ Introducing new features. close #4057 租户过滤条提供 tenantSkip TTL 工具 2022-06-24 22:23:06 +08:00
lbw 21dda92616 ♻️ Refactoring code. 格式化代码 2022-06-21 20:59:28 +08:00
lbw e5a5c115da ✨ Introducing new features. 灰度路由支持根据nacos 权重 2022-06-08 12:31:28 +08:00
lbw 92789b167a Merge branch 'fixbug_gray' of https://git.pig4cloud.com/65668828/pigx4_3 into leng_dev 2022-06-08 12:20:25 +08:00
lbw 419db41f09 Merge branch 'fix_pom_dependency' of https://git.pig4cloud.com/65668828/pigx4_3 into leng_dev 2022-06-08 12:19:56 +08:00
卡尔 240b112ac3 更新 'pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java'
增加灰度路由支持nacos权重分配获取服务实例的功能
1.修复原灰度路由存在的一个bug:
原逻辑会返回带有版本号的服务实例,这些带版本号的服务按照道理应该暂时不提供公测功能
2.增加了一个功能:支持原nacos提供的权重功能
2022-06-01 21:23:58 +08:00
卡尔 c815417d3a 更新 'pigx-visual/pigx-xxl-job-admin/pom.xml'
删除多余依赖,否则最外层依赖会报警告!
2022-06-01 20:43:19 +08:00
65668828 d864eb84f9 更新 'pigx-common/pigx-common-excel/pom.xml'
非必要依赖去除
2022-06-01 20:19:25 +08:00
lbw 0f1a7197b7 ♻️ Refactoring code. 分布式事务配置文件hosts 修改为 pigx-seata 2022-06-01 00:04:22 +08:00
lbw 8fc57e1291 ♻️ Refactoring code. 分布式事务配置文件hosts 修改为 pigx-seata 2022-06-01 00:03:23 +08:00
lbw 36df81d8eb 🐛 Fixing a bug. close #3951 客户端更新bug修复及优化 2022-05-29 13:55:00 +08:00
lbw a16fde7a3c ♻️ Refactoring code. close #3952 当客户端配置不存在时,不用校验验证码及优化 2022-05-29 13:53:26 +08:00
lbw 466072caf9 🔥 Removing code or files. 删除无用文件 2022-05-29 13:50:31 +08:00
lbw a6b67e73d8 Revert "⏪ Reverting changes. pigx-register/application.yml"
This reverts commit 544617ea
2022-05-29 13:49:20 +08:00
lbw 5aea904179 Merge branch 'dev' of https://git.pig4cloud.com/pig/pigx into leng_dev 2022-05-29 13:47:41 +08:00
lbw 14ea7677ad ⬆️ Upgrading dependencies. spring formatter 0.0.32 2022-05-29 13:47:20 +08:00
pig666 7429455261 Merge branch 'master' of 94636829/pigx into dev 2022-05-29 13:46:21 +08:00
yuanly c28562847c 1、更新客户端bug修复;
2、同步客户端时更新缓存;
2022-05-28 21:53:18 +08:00
yuanly d9db312902 Merge branch 'master' of https://git.pig4cloud.com/94636829/pigx 2022-05-28 21:40:33 +08:00
lbw 5467e94e21 🐛 Fixing a bug. common-sequence 入表逻辑错误ID 2022-05-28 13:50:29 +08:00
pig666 58b61b73ac Merge branch 'master' of 94636829/pigx into dev 2022-05-24 09:07:17 +08:00
lbw b0ea406130 Merge remote-tracking branch 'pmc/blackr_dev' into leng_dev
# Conflicts:
#	pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/aspect/SysLogAspect.java
2022-05-22 16:17:05 +08:00
BlackR 80455d09c2 ✨ Introducing new features. support spel 'expression' 2022-05-20 14:40:55 +08:00
yuanly f9c924f9b6 nacos连接数据库区分开发、测试、生产环境 2022-05-20 13:59:11 +08:00
BlackR de66f43616 🐛 Fixing a bug. log insert spel 执行报错. ✨ Introducing new features. support spel 'expression' 2022-05-20 13:46:02 +08:00
lbw 7b0487f2d9 🐛 Fixing a bug. log insert spel 执行报错 2022-05-20 11:23:25 +08:00
lbw 877b1661aa 🔥 移除代码或文件 删除代码中无用导入 2022-05-19 14:06:39 +08:00
lbw 464aea125e 🔥 移除代码或文件 删除代码中无用导入 2022-05-19 11:55:14 +08:00
lbw fbeaee13c0 ⏪ Reverting changes. pigx-common-websocket Error 2022-05-19 11:52:44 +08:00
lbw 71dcbf830f Merge remote-tracking branch 'pmc/blackr_dev' into big 2022-05-17 20:32:01 +08:00
lbw 68f8aab37e 🐳 Work about Docker. editor docker-compose.yml 2022-05-17 16:35:20 +08:00
lbw 1b719c8903 🐛 Fixing a bug. feign log services name error 2022-05-16 19:48:20 +08:00
BlackR 182c30112e ✨ Introducing new features.日志切面支持解析SPEL表达式 2022-05-16 19:11:07 +08:00
lbw ccd3daf937 Merge branch 'big'
# Conflicts:
#	pigx-visual/pigx-bi-platform/pom.xml
2022-05-16 09:25:50 +08:00
lbw 60c9844062 🔖 🔖 🔖 Releasing / Version tags. v4.4 mojito
🔖 🔖 🔖 Releasing / Version tags. v4.4 mojito

🔖 🔖 🔖 Releasing / Version tags. v4.4 mojito
2022-05-15 20:44:42 +08:00
lbw 06fdcce823 🔖 🔖 🔖 Releasing / Version tags. v4.4 mojito 2022-05-15 09:42:22 +08:00
lbw 7cc8e0f776 🔖 🔖 🔖 Releasing / Version tags. v4.4 mojito 2022-05-13 15:24:36 +08:00
lbw 0ae9122740 Merge remote-tracking branch 'pmc/cj20220512' into leng_dev
# Conflicts:
#	pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsService.java
2022-05-13 15:14:00 +08:00
lbw d5e701a658 🐛 Fixing a bug. #3900 支付模块,始终使用的第一次初始化的渠道 2022-05-13 13:08:55 +08:00
cj 0eb14f1bf4 ⚡ 一点微不足道的优化 2022-05-13 13:07:57 +08:00
cj 2adebc1304 🎨 polish RetOps 2022-05-13 13:06:57 +08:00
lbw c5f291943e ♻️ Refactoring code. 数据权限 DataScope.java 增加链式操作方便使用 2022-05-13 10:51:22 +08:00
lbw 73c6fa415d Merge branch 'cj20220512' into leng_dev 2022-05-13 10:50:32 +08:00
lbw 45b2972d71 🗃️ 执行数据库相关的变化. 视频最新的代码删除无用模块 & 添加本地配置文件的支持 2022-05-13 10:45:24 +08:00
cj 212721a833 🎨 polish RetOps 2022-05-13 10:17:07 +08:00
lbw 72a9a2e00b 💄 更新界面和样式文件。 完善uniapp代码生成的样式 2022-05-12 18:43:36 +08:00
lbw 4684c2e480 Merge remote-tracking branch 'public/cj20220512' into leng_dev 2022-05-12 16:52:41 +08:00
cj 93d35dcb20 ✨ Helper class RetOps 2022-05-12 15:59:54 +08:00
lbw 1d9bfa53cd 🐛 Fixing a bug. close #3884 社交登录去除原绑定关系,代码问题修复 2022-05-11 15:51:59 +08:00
lbw 6677bd937c Merge https://git.pig4cloud.com/837152891/pigx into leng_dev 2022-05-11 15:36:50 +08:00
lbw 30fd3fae78 🙈 添加或更新 .gitignore 文件 屏蔽 seata 临时文件 2022-05-11 15:26:51 +08:00
lbw 1967b1d443 ✨ Introducing new features. 内置 seata-server 模块 方便调试 2022-05-11 12:37:01 +08:00
ipixel e49425a505 🐛 社交登录把原绑定关系去除,设置绑定为NULL代码问题修复 2022-05-10 19:45:16 +08:00
lbw 1c4f447355 🐳 Work about Docker. 升级相关的依赖 2022-05-10 16:17:45 +08:00
lbw 5c10519a8e ♻️ Refactoring code. 适配最新版本 微信公众号接口 2022-05-07 22:30:03 +08:00
lbw 8262b3ed60 🎨 改进结构和代码格式 login.ftl 租户ID 错误、 令牌错误 2022-05-07 20:16:08 +08:00
lbw ed7b9d8bb6 问下公众号 API 调整 2022-05-05 09:19:16 +08:00
lbw 688adbc386 ⚡ 优化 积木报表的 header top 2022-05-01 10:41:50 +08:00
lbw 62e900a712 ⚡ 优化 代码生成的模板 2022-05-01 09:37:17 +08:00
lbw 9a3a8678a8 Merge remote-tracking branch 'origin/fxz_dev' into leng_dev 2022-05-01 09:34:29 +08:00
Fxz 1e6377aa05 ✨ error log in file 2022-04-29 17:49:26 +08:00
lbw 16bbfa114a Merge remote-tracking branch 'origin/fxz_dev' into leng_dev 2022-04-29 12:29:27 +08:00
Fxz 9c51005016 ✨ 代码生成预文件 顺序按照 前端 后端 依次显示 、up mysql 8.0.29、 up spring cloud 2021.0.2、修改代码生成模版 2022-04-28 23:39:48 +08:00
lbw c41c0c7a52 🗃️ 执行数据库相关的变化, 支持 达梦数据库 2022-04-28 13:43:24 +08:00
lbw c3d55c3fe2 ✨ Introducing new features. #3860 资源服务器校验令牌支持用户状态后即时生效 2022-04-28 13:43:04 +08:00
lbw 5abb4c6019 ✨ Introducing new features. close #3857 【代码生成】 代码生成支持 uview 风格移动端代码生成 2022-04-28 01:39:40 +08:00
lbw ebcde77c01 Merge remote-tracking branch 'origin/fxz_dev' into leng_dev
# Conflicts:
#	db/2pigxx.sql
2022-04-27 22:58:07 +08:00
lbw 7d9c313c84 ✨ Introducing new features. 支持企业微信组织 用户结构同步 2022-04-27 22:57:24 +08:00
Fxz 459a2e9109 ✨ 【代码生成】 代码生成支持 uview 风格移动端代码生成 2022-04-27 02:35:20 +08:00
Fxz efa46b9454 ✨ 【代码生成】 代码生成支持 uview 风格移动端代码生成 2022-04-27 02:24:08 +08:00
lbw edc36599e9 ✨ Introducing new features. close #3855 【校验组】支持 JSR 303分组校验ValidGroup 2022-04-26 13:16:30 +08:00
Fxz c54a9d92b9 ✨ [密钥管理] 增加扩展字段 & 敏感数据脱敏 2022-04-25 20:00:32 +08:00
lbw 92e20524bc ✨ Introducing new features. 支持企业微信组织 用户结构同步 2022-04-25 16:41:34 +08:00
lbw 5e80065d46 🎨 Improving structure / format of the code. 2022-04-25 14:19:54 +08:00
lbw 3df0e55421 🎨 Improving structure / format of the code. 2022-04-25 13:57:31 +08:00
lbw 245154d5b8 Merge remote-tracking branch 'origin/fxz_dev' into leng_dev 2022-04-24 21:26:30 +08:00
Fxz e69996e39d ✨ 钉钉导入角色、部门、用户 2022-04-23 18:28:34 +08:00
lbw 634803033c Merge branch 'feat/websocket' of https://git.pig4cloud.com/pigx/pigx into leng_dev 2022-04-23 16:41:24 +08:00
Hccake 0f27517b92 🔥 移除 MessageDistributor 中定义的 doSend 方法,防止用户误调用 2022-04-23 16:30:58 +08:00
Hccake fe15c0fd7a 🎨 精简 JsonWebSocketMessage 层级
将接口 JsonWebSocketMessage 删除,抽象类 AbstractJsonWebSocketMessage 改名为 JsonWebSocketMessage
2022-04-23 16:27:04 +08:00
lbw aa17bb3924 ✨ Introducing new features. 钉钉互联 2022-04-22 14:40:06 +08:00
lbw abb43f8a4e 🔥 Removing code or files. 删除无用导入 2022-04-22 12:59:09 +08:00
lbw c2d49ab370 ⬆️ Upgrading dependencies. close #3838 up jasypt 3.0.4 2022-04-22 11:04:04 +08:00
付绪壮 9aeeec155a 🔧 删除配置文件中的过期属性 2022-04-21 16:31:30 +08:00
lbw 544617eae1 ⏪ Reverting changes. pigx-register/application.yml 2022-04-19 23:27:49 +08:00
lbw 7032f8b8b0 Merge remote-tracking branch 'origin/fxz_dev' into leng_dev 2022-04-19 23:26:23 +08:00
lbw 26f9c1d324 ✨ Introducing new features. close #3825 common-oss 支持 local file 模式 2022-04-19 23:26:10 +08:00
lbw b8835cddc4 🐛 Fixing a bug. close #I53HRW 登录用户多表存储的下发的token是不能刷新的 2022-04-19 18:34:34 +08:00
lbw 38018c3c70 🔥 Removing code or files. 删除社交登录 缓存查询逻辑 避免无用 cache 2022-04-19 17:44:34 +08:00
付绪壮 08625b668a ⬆️ up JimuReport v1.5.0-beta 2022-04-19 15:51:34 +08:00
付绪壮 cc5e314c2b Merge remote-tracking branch 'origin/leng_dev' into fxz_dev 2022-04-18 17:48:37 +08:00
lbw ba93f6c291 🗃️ 执行数据库相关的变化, 支持 jimu报表
🗃️ 执行数据库相关的变化, 支持 jimu报表
2022-04-18 17:17:31 +08:00
卢本伟 6561b6d292 ✨ Introducing new features. quartz oa 支持 mssql 2022-04-16 11:35:24 +08:00
卢本伟 a6fdc36ea5 ⬆️ Upgrading dependencies. springboot 2.6.6 druid 1.2.9 2022-04-15 22:04:46 +08:00
卢本伟 1f9efacd1d 🗃️ 执行数据库相关的变化, 添加实体的相关的审计字段 2022-04-15 15:32:46 +08:00
付绪壮 7a963542cd ⬆️ up sentinel 1.8.4 2022-04-15 14:30:23 +08:00
卢本伟 2d8b6446c8 ⚡ 优化 适配Oracle 、PG数据库 2022-04-15 10:56:15 +08:00
卢本伟 7a69bff0e0 ♻️ Refactoring code. common-websocket 默认使用 RedisMessageDistributorConfig.java 2022-04-12 10:21:18 +08:00
卢本伟 bfe8cc2336 Merge https://git.pig4cloud.com/24889356/pigx into leng_dev 2022-04-11 17:51:33 +08:00
卢本伟 2c02514fcf ✨ Introducing new features. close #3794 【新需求】登录错误次数限制,连续登录失败锁定账号 2022-04-11 17:36:02 +08:00
inighty 17f17f150b close stream 2022-04-11 17:03:05 +08:00
卢本伟 f669d1b968 ✨ Introducing new features. close #3794 【新需求】登录错误次数限制,连续登录失败锁定账号 2022-04-11 13:40:11 +08:00
卢本伟 99fe51e6aa Merge remote-tracking branch 'origin/fxz_dev' into leng_dev
# Conflicts:
#	pom.xml
2022-04-10 17:02:50 +08:00
付绪壮 20f285d3a4 ⬆️ up springbootadmin 2.6.6 2022-04-09 15:26:13 +08:00
卢本伟 2c960d58e7 ✨ Introducing new features. close #3777 jimu-report 支持积木报表 2022-04-08 15:20:28 +08:00
卢本伟 7e44f2081f ✨ Introducing new features. close #3777 jimu-report 支持积木报表 2022-04-08 15:20:15 +08:00
卢本伟 99701cb871 ⬆️ Upgrading dependencies. spring-boot-admin 2.6.5 2022-04-08 14:35:28 +08:00
付绪壮 c2449a04c0 ⬆️ up springbootadmin 2.6.5 2022-04-08 09:57:49 +08:00
付绪壮 166eec29ec ✨ pigx-common-seata模块 2022-04-06 15:51:51 +08:00
付绪壮 46dd2b9742 Merge remote-tracking branch 'origin/leng_dev' into fxz_dev 2022-04-03 19:40:24 +08:00
zoper 5d5c150f9b Merge remote-tracking branch 'origin/fxz_dev' into leng_dev 2022-04-03 19:39:02 +08:00
zoper dc0107dd8e Merge remote-tracking branch 'origin/fxz_dev' into leng_dev 2022-04-03 19:10:37 +08:00
付绪壮 b05dcdbb8b 🔧 xxl-jon默认端口改为9099 2022-04-03 11:28:37 +08:00
付绪壮 d08ce2a641 🔥 代码生成模板 不区分数据库类型 2022-04-03 10:50:14 +08:00
付绪壮 6ab705308a ✨ 用户注册 & 异常 国际化 2022-03-31 17:42:53 +08:00
付绪壮 7aee6fbf5b Merge branch 'leng_dev' into fxz_dev 2022-03-31 16:08:45 +08:00
zoper 4bac52602a ➕ 添加依赖,添加DM8 依赖 2022-03-30 20:14:06 +08:00
qraddx deda3a3213 🎨 Improving structure / format of the code. 格式化代码 2022-03-29 13:33:38 +08:00
qraddx ab4dfb92ce Merge remote-tracking branch 'public/feat/websocket' into leng_dev
# Conflicts:
#	pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketHandlerConfig.java
#	pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/PigxSessionKeyGenerator.java
#	pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageDistributor.java
2022-03-29 13:31:37 +08:00
qraddx 913dba7a19 Merge remote-tracking branch 'public/jmn_dev' into leng_dev 2022-03-29 13:30:03 +08:00
qraddx 677e05d643 ⬆️ Upgrading dependencies. springboot 2.6.5. spring boot admin 2.6.3 2022-03-27 17:29:10 +08:00
qraddx ef0fded50f 🐛 Fixing a bug. close #3734 common-websocket 在分布式环境多个实例中的基于redis消息分发逻辑错误 2022-03-27 17:28:47 +08:00
Hccake 3f5fd1a81b ✨ websocket 升级
1. 支持并发发送 websocket
2. 支持 socketjs
3. 支持同一用户多客户端同时登录,消息推送时可对所有客户端推送,也可仅推送其中一个客户端
2022-03-26 20:41:01 +08:00
付绪壮 f3b91a2aef ✨ 用户岗位关系 2022-03-26 16:57:16 +08:00
付绪壮 1c246388e2 ✨ 角色管理导入导出 2022-03-26 16:08:31 +08:00
付绪壮 8969ad36ee ✨ 角色管理导入导出 2022-03-26 16:05:44 +08:00
付绪壮 ef10b99d33 ✨ 岗位管理 2022-03-26 14:41:17 +08:00
jumuning 2355751625 删除多余字段 2022-03-26 14:27:40 +08:00
jumuning 7481a7e638 删除多余字段 2022-03-26 14:27:14 +08:00
付绪壮 a80da76599 Merge branch 'leng_dev' into fxz_dev 2022-03-26 12:27:06 +08:00
qraddx b9f57016c8 ✨ Introducing new features. close #I4ZJ0S sentinel 适配 spring cloud alibaba 2021.0.1.0 2022-03-25 12:02:58 +08:00
qraddx c825dc181e Merge remote-tracking branch 'origin/fxz_dev' into leng_dev 2022-03-25 11:53:00 +08:00
付绪壮 c7404cd1a0 ✨ DictResolver根据字典类型获取字典 2022-03-24 18:16:37 +08:00
付绪壮 c91549d129 ✨ DictResolver根据字典类型获取字典 2022-03-24 17:52:27 +08:00
qraddx 2b970b0df2 ✨ Introducing new features. close #3729 代码生成支持达梦数据库 2022-03-24 12:45:52 +08:00
qraddx 0210ed9b70 ✨ Introducing new features. closed #3727 支持租户根据域名自动选择 2022-03-24 08:36:07 +08:00
付绪壮 72d0fc82a9 ⬆️ 适配 spring cloud alibaba 2021.0.1.0 config.import 导入配置文件 2022-03-21 21:40:23 +08:00
付绪壮 e430d79c81 ⬆️ 适配 spring cloud alibaba 2021.0.1.0 config.import 导入配置文件 2022-03-21 21:37:57 +08:00
qraddx ca7bb696b3 ✨ Introducing new features. #3711 ureport2 支持preview 数据不二次登录 2022-03-17 12:00:43 +08:00
qraddx d07022c89a Merge branch 'big' into leng_dev 2022-03-15 09:39:20 +08:00
qraddx 33f713d17d 🍻 close #3705 用户被锁定时,后台提示用户帐号已被锁定,请求返回用户名不存在或者密码错误 2022-03-15 09:39:10 +08:00
qraddx a7df615d95 🗃️ 执行数据库相关的变化. 增量脚本增加mail 字段 2022-03-10 14:22:10 +08:00
qraddx f003209b26 🗃️ 执行数据库相关的变化. 增量脚本增加mail 字段 2022-03-10 14:10:48 +08:00
qraddx 4864b90936 ⚡ 优化 close #3674 common-gateway 无用 SPI 文件删除 2022-03-07 11:05:13 +08:00
qraddx 275e6f26af 🐛 Fixing a bug. close #3661 搭建完之后地址请求被嵌入能执行的js代码 2022-03-04 11:45:03 +08:00
qraddx 9fbc295947 🐛 Fixing a bug. close #3648 pigx-xxl-job-admin 项目启动错误日志 2022-02-28 15:56:12 +08:00
qraddx db8ff631ce 🐛 Fixing a bug. close #3648 pigx-xxl-job-admin 项目启动错误日志 2022-02-28 15:45:32 +08:00
qraddx 1cbfc6a82b 🐛 Fixing a bug. close #3641 4.3版本文件上传Bug 2022-02-28 09:46:58 +08:00
qraddx 9550182889 Merge branch 'big' into leng_dev 2022-02-25 12:00:24 +08:00
qraddx ed38882667 ⬆️ Upgrading dependencies. spring boot 2.6.4 2022-02-25 12:00:13 +08:00
qraddx 924e22988d 🔖 Releasing / Version tags. 4.3 2022-02-23 21:25:58 +08:00
906670865 210843442d 更新 'pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectCountByScope.java'
更新 'pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectListByScope.java'

更新 'pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectListByScope.java'

更新 'pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectListByScope.java'

更新 'pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/SelectPageByScope.java'
2022-02-23 12:00:37 +08:00
qraddx c8d3a24cff 🔖 Releasing / Version tags. 4.3 2022-02-22 14:04:07 +08:00
qraddx bca13aea17 🔖 Releasing / Version tags. 4.3 2022-02-22 12:23:02 +08:00
qraddx 653c7a72c5 🗃️ 执行数据库相关的变化
🗃️ 执行数据库相关的变化

🗃️ 执行数据库相关的变化
2022-02-21 23:43:53 +08:00
qraddx 9a366cd78a ⚡ 优化, 发号器获取数据源类型支持 druid jdbc url 配置形式 2022-02-18 14:59:24 +08:00
qraddx 911e7a47f1 🔥 删除 monitor bootstrap.yml 无用配置 2022-02-18 13:31:12 +08:00
qraddx c9853945cc ⬆️ Upgrading dependencies. springboot 2.6.3 & springcloud 2021.0.1 2022-02-18 12:09:06 +08:00
qraddx ff9b756e79 ✨ Introducing new features. #3295 增加QQ登录的支持,修改绑定手机号逻辑 2022-02-18 10:25:15 +08:00
qraddx 1be210d78b ✨ Introducing new features. #3612 增加客户端同时登录在线数量控制功能 2022-02-18 10:24:53 +08:00
qraddx 5fdbdf4998 🎨 Improving structure / format of the code. 格式化大屏模块代码格式 2022-02-18 10:17:54 +08:00
pig666 cf4cc58f5e Merge branch 'master' of 837152891/pigx into dev 2022-02-17 16:51:28 +08:00
pig666 fe69b2cdbc Merge branch 'dev' of 934041945/pigx into dev 2022-02-17 16:48:08 +08:00
qraddx 97ed79b7f6 🐛 Fixing a bug. 分布式事务兼容 SpringBoot 2.6 2022-02-17 15:20:45 +08:00
qraddx ccb5132e40 🐛 Fixing a bug. OA 请假丢失 当前时间字段 2022-02-16 10:50:48 +08:00
qraddx 509e55c183 ⬆️ Upgrading dependencies. IJPAY 2.8.0 2022-02-16 10:14:01 +08:00
qraddx 2e31e2a372 ✨ Introducing new features. close #3613 使用 hutool-bom 全局定义工具类版本 2022-02-15 14:34:53 +08:00
qraddx a59a402893 ✨ Introducing new features. close #3613 使用 hutool-bom 全局定义工具类版本 2022-02-15 13:04:24 +08:00
ZHENGXIAOCONG 8017717311 客户端支持同时在线,并且数量可配置,默认客户端只能登录一个 2022-02-14 15:27:24 +08:00
qraddx 7e7db12fa4 ✨ Introducing new features. up aj-report V0.9.6.1 支持http 数据源 2022-02-13 21:36:27 +08:00
qraddx 3058892a72 🐛 Fixing a bug. 公众号消息回复时显示对应的昵称,平台回复则显示公众号名称 2022-02-10 16:08:18 +08:00
qraddx 5283b8ce19 ✨ Introducing new features. close #3603 资源服务器本地模式默认为Local 高性能 2022-02-10 14:32:57 +08:00
qraddx 11badf807a ✨ Introducing new features. close #3607 系统日志、定时任务日志 批量删除 2022-02-10 14:18:29 +08:00
qraddx bbe1917e01 ♻️ 重构 close #3472 【用户多表存储】支持多用户体系设置 2022-02-07 21:54:52 +08:00
qraddx 2d2a995a83 ✨ Introducing new features. close #3598 【新特性】终端管理支持图形化配置登录是否重新生成令牌,控制是否允许同一账号是否可以多处 2022-02-05 17:10:33 +08:00
qraddx 048132d912 ⚡ 优化, close #3597 【优化】字典、角色、租户新增时增加唯一性校验 2022-02-05 17:04:04 +08:00
qraddx 7197203364 ⚡ 优化, 优化动态路由的日志输出,方便启动时观察路由初始化情况 2022-02-05 15:39:13 +08:00
qraddx 7679b8dbd3 ♻️ 重构配置类名称 config -> configuration 2022-02-05 15:01:28 +08:00
qraddx dbc3b9e05e ♻️ Refactoring code. close #3596 【重构】重构redis 信道配置,支持 afterPropertiesSet 统一配置 2022-02-04 23:57:41 +08:00
qraddx 57ec2a5e1e ⬆️ Upgrading dependencies. close #3547 up mybatis-plus 升级到3.5.1
⬆️ Upgrading dependencies. close #3547 up mybatis-plus 升级到3.5.1
2022-01-27 21:32:18 +08:00
qraddx 847e739fc9 ⚡ 优化 close #3582 网关动态路由添加数量有限制导致路由404 2022-01-21 12:24:25 +08:00
qraddx a06c9bc69a ♻️ Refactoring code. 发号器 优化 适配Oracle 、PG数据库 2022-01-19 15:35:11 +08:00
qraddx b533e6441b 🐛 Fixing a bug. close #3575 代码生成器连接sqlserver报错,无法获取到库中的表 2022-01-18 15:01:41 +08:00
qraddx bde8bc0d6a ⚡ 优化 适配Oracle 、PG数据库 2022-01-18 14:53:59 +08:00
qraddx 036bf65280 🐛 Fixing a bug. close #3575 代码生成器连接sqlserver报错,无法获取到库中的表 2022-01-17 16:14:55 +08:00
qraddx bb375e389c 🎨 Improving structure / format of the code. 代码导入格式化 2022-01-15 16:22:59 +08:00
lbw b8e6deacc8 🔖 Releasing / Version tags. v4.3.0.snapshot 2022-01-14 12:20:03 +08:00
lbw 0aba0eaa48 ⚡ 优化 适配Oracle 数据库 2022-01-09 09:12:26 +08:00
lbw 0b51c3c73d ⬆️ Upgrading dependencies. spring cloud 2021 & spring boot 2.6.x
⬆️ Upgrading dependencies. spring cloud 2021 & spring boot 2.6.x
2022-01-09 09:11:44 +08:00
lbw 0b2317f344 ⬆️ Upgrading dependencies. nacos 2.0.3 2022-01-09 09:09:46 +08:00
lbw 9ebd12c9df 🐛 Fixing a bug. xss 过滤 属性配置错误 2022-01-08 15:17:19 +08:00
lbw f4c9545366 ✅ Adding tests. pom 支持多数据库切换 2022-01-07 15:36:43 +08:00
lbw d4b75b0fd2 ✅ Adding tests. pom 支持多数据库切换 2022-01-07 15:36:20 +08:00
lbw 3d1d60239b ✨ Introducing new features. 优雅处理 spring security 国际化异常 2022-01-07 15:35:49 +08:00
lbw d193bbd414 ⚡ 优化 适配Oracle 数据库 2022-01-07 15:35:07 +08:00
lbw ab94025923 ⚡ 优化 适配Oracle 数据库 2022-01-06 15:27:45 +08:00
lbw 262a2971ea 🐛 Fixing a bug. close #3540 系统类字典编辑提示文案错误 2022-01-06 14:55:50 +08:00
lbw b66dadc64b ✨ Introducing new features. close #3474 实现对数据库多数据源的支持 2022-01-05 22:45:04 +08:00
lbw c9ccc6c888 ✨ Introducing new features. close #3505 【公众号】公众号支持更改备注及用户的标签 2022-01-05 22:43:58 +08:00
lbw 9e70c551cc ✨ Introducing new features. close #3538 【微信公众平台】 支持接口 quota 2022-01-05 22:41:20 +08:00
lbw e3009ba13c ⚡ 优化 适配Oracle 数据库 2022-01-05 13:35:00 +08:00
lbw d935a31057 🔥 删除无用代码 BaseEntity.java 2022-01-05 13:13:19 +08:00
lbw 62a099dcfd ✨ Introducing new features. close #3532 up wxjava 4.20
#3502 【公众号】使用平台自定义微信昵称 解决公众号平台不在返回关注用户的昵称、头像信息
2022-01-05 13:12:21 +08:00
lbw f1161213b3 ✨ Introducing new features. close #3530 部门树、菜单树支持按名称检索 方便使用 2022-01-04 17:42:59 +08:00
lbw 9a3985ff94 ✨ Introducing new features. close #3530 部门树、菜单树支持按名称检索 方便使用 2022-01-04 17:08:22 +08:00
lbw 8e12472ac4 🔥 删除无用注解 SysUser.java 2022-01-04 14:02:36 +08:00
lbw 2b5deed723 Merge branch 'lisb_dev' of codeup.aliyun.com:pig/pigx/pigx into leng_dev 2022-01-04 13:40:30 +08:00
lbw 2b81a9b7dc ♻️ Refactoring code. 字典缓存刷新逻辑 重构支持更细粒度 2022-01-04 08:35:34 +08:00
lishangbu d18a87cc49 ✨ Introducing new features. 支持终端缓存同步
🐛 Fixing a bug.兼容先前代码,将dict的itemValue序列化成value返回
2021-12-31 17:08:18 +08:00
lishangbu c27acd9a8f ✨ Introducing new features. 微信账户标签管理 2021-12-31 14:27:48 +08:00
lishangbu 1afff76e4d Merge remote-tracking branch 'origin/leng_dev' into lisb_dev 2021-12-31 14:24:46 +08:00
lbw 0ba2cb91cd ✨ Introducing new features. close #3524 支持 CAS 单点接入 2021-12-31 13:51:08 +08:00
lishangbu 9920be51f7 Merge remote-tracking branch 'origin/leng_dev' into lisb_dev 2021-12-30 23:34:18 +08:00
lbw 041cf3a53b 🐛 Fixing a bug. close #3521 【令牌管理】不显示用户名和用户ID 2021-12-30 21:21:40 +08:00
lishangbu 6af4b091bd 🔥 Removing code or files.移除quartz工程中自定义的两张表的mapper文件 2021-12-30 15:34:51 +08:00
lishangbu 7783d8d318 Merge remote-tracking branch 'origin/leng_dev' into lisb_dev 2021-12-30 14:14:59 +08:00
lishangbu de784a3bd8 ♻️ Refactoring code.优化基础字段 2021-12-30 14:14:47 +08:00
lbw e3556e0a87 ✨ Introducing new features. close #3514 common-idempotent 幂等模块 2021-12-30 14:13:12 +08:00
lbw f3c56acfd4 Merge branch 'lisb_dev' of codeup.aliyun.com:pig/pigx/pigx into leng_dev 2021-12-30 14:01:50 +08:00
lbw 2bbc33dc37 ✨ Introducing new features. close #3514 common-idempotent 幂等模块 2021-12-30 13:59:31 +08:00
lishangbu 2026580834 ⏪ Reverting changes.回滚sort字段 2021-12-30 02:46:53 +08:00
lishangbu fed616b171 Merge remote-tracking branch 'origin/leng_dev' into lisb_dev 2021-12-30 02:33:26 +08:00
lishangbu 23d64e5092 ⬆️ Upgrading dependencies.close #I4ONR3 Bump hutool-all from 5.7.16 to 5.7.18 2021-12-30 02:33:11 +08:00
lishangbu 3705f3e35e 🔥 Removing code or files.删除h2 数据库 2021-12-29 15:10:22 +08:00
lishangbu 6ec605691b ♻️ Refactoring code.字典项优化 2021-12-29 13:52:01 +08:00
lishangbu 300e9e6779 ♻️ Refactoring code.dict的type改为dictType 2021-12-29 13:33:05 +08:00
lbw e6a8bd9c73 🔒 Fixing security issues. Apache Log4j 中出现新的远程代码执行漏洞 2021-12-29 13:18:21 +08:00
lishangbu 944a45ce9a ♻️ Refactoring code.优化发号器sql语句 2021-12-29 13:08:06 +08:00
lbw f3015637cd Merge branch 'lisb_dev' of codeup.aliyun.com:pig/pigx/pigx into leng_dev 2021-12-29 12:33:29 +08:00
lbw 86472c9a62 ✨ Introducing new features. close #3498 @WithMockOAuth2User注释在4.2版本下报错 2021-12-29 12:33:00 +08:00
lishangbu c1680ad72b 🔥 Removing code or files.移除activiti中设置数据类型的代码 2021-12-29 12:21:51 +08:00
lishangbu 251e6a8b0b ♻️ Refactoring code.进行部分兼容性操作 2021-12-29 08:17:18 +08:00
lishangbu 01f34937a5 ✨ Introducing new features.增加部分report初始化语句 2021-12-28 13:44:51 +08:00
lbw 3790f7d583 🔊 优化网关日志输出,只输出日志信息 不输出错误堆栈 2021-12-28 10:00:52 +08:00
lishangbu cf5bec4cfa 🐳 Work about Docker.docker compose语法版本调整为v3 2021-12-28 09:55:57 +08:00
lishangbu de77ef0b5b 🐛 Fixing a bug.优化一处mysql特有的函数 2021-12-28 00:05:44 +08:00
lishangbu f5d37cd297 🐛 Fixing a bug.处理了报表系统支持H2数据库中出现的一些问题 2021-12-27 23:10:35 +08:00
lishangbu e88ef5d878 :boom:Introduce breaking changes.报表系统支持H2数据库 2021-12-27 22:37:48 +08:00
lishangbu 35dbc84b49 :boom:Introduce breaking changes.xxl-job-admin支持H2数据库 2021-12-27 20:02:07 +08:00
lbw 23b0bb7453 🔒 Fixing security issues. close #3491 关闭swagger时,swagger页面404但是/admin/v2/api-docs仍能获取到信息 2021-12-27 11:28:12 +08:00
lbw 42c388e186 Merge branch 'dev' into leng_dev
# Conflicts:
#	pigx-common/pigx-common-bom/pom.xml
2021-12-27 10:42:24 +08:00
lishangbu 9a58c47093 💥 Introducing breaking changes.处理upms中的type与sort关键字
xxx
2021-12-25 11:23:54 +08:00
lishangbu 1b26ef69c7 🐛 Fixing a bug.close #3489 log4j版本覆盖不完全 2021-12-24 22:19:35 +08:00
lishangbu 6f9259dc9b 🐛 Fixing a bug.insertBatchSomeColumn是mysql特有语法,不支持跨数据库操作 2021-12-24 11:43:56 +08:00
lishangbu 7d0e1ddfed 🐛 Fixing a bug. 修复变更主键策略为ASSIGN_ID后用户创建失败以及无法Excel导出的问题 2021-12-24 09:24:06 +08:00
lbw f01183914c 🐛 Fixing a bug. close #3419 [大屏设计] 编辑页面--导出(包含数据集)出错“The Token has expired” 2021-12-21 21:20:40 +08:00
lbw 1b0685a4d2 ⚡ 优化 适配Oracle 数据库 2021-12-20 20:15:30 +08:00
lbw a09ebf7d9a ⚡ 优化 close #3459 创建重复定时任务检验失败不提示错误原因 2021-12-16 17:41:25 +08:00
lbw 97f6555841 🗃️ 执行数据库相关的变化 close #3457 【优化】更新部门关系SQL 拆分为多个SQL 执行,提高数据库兼容性 2021-12-16 09:56:53 +08:00
lbw 289e212aa9 🎨 Improving structure / format of the code. 代码格式化 2021-12-14 13:06:40 +08:00
lbw d9882ae1e2 🔊 spring cloud gateway 异常输出日志堆栈 方便排查 2021-12-14 13:04:21 +08:00
lbw 30cd285b81 ♻️ Refactoring code. close #3451 oss 通用文件上传支持文件类型 2021-12-14 13:03:45 +08:00
lbw 3b4bf4325c 🔒 Fixing security issues. log4j-core log4j-api 版本指定为 安全版本 2021-12-12 17:29:06 +08:00
lbw 5813aef393 🔒 Fixing security issues. close #3429 日志分页查询 desc asc 字段入参查询存在 SQL 注入 2021-12-08 18:00:05 +08:00
lbw 5d318f994c ♻️ Refactoring code. close #3430 主键策略调整为 ASSIGN_ID , 增加审计字段自动填充 2021-12-08 17:58:58 +08:00
lbw 4fc541e2f4 🐛 Fixing a bug. close #3414 包含特殊字符+的密码,登录验证失败 2021-12-05 11:25:48 +08:00
lbw 56624074de ✨ Introducing new features. close #3394 【用户信息】扩展用户基本信息增加部分扩展字段 2021-12-03 18:05:44 +08:00
lbw 3dab2a3405 Merge remote-tracking branch 'origin/fxz_dev' into leng_dev 2021-12-03 15:31:58 +08:00
lbw b9e5baaf4d 📝 close #3410 common-test 单元测试模块 文档及代码更新
♻️  close #3394 【用户信息】扩展用户基本信息增加部分扩展字段

♻️  close #3394 【用户信息】扩展用户基本信息增加部分扩展字段

♻️  close #3394 【用户信息】扩展用户基本信息增加部分扩展字段
2021-12-03 15:29:59 +08:00
lbw 072bafe72a ✨ spi spring.factories 增加 ClientDetailsFeignClient 2021-12-03 15:29:59 +08:00
dobo 017e366f88 pigx-common-bom下xxljob版本更新为2.3.0 2021-12-03 15:29:59 +08:00
付绪壮 a1a2d537b0 ♻️ close #3394 【用户信息】扩展用户基本信息增加部分扩展字段 2021-12-03 15:22:48 +08:00
付绪壮 938afcf206 ♻️ close #3394 【用户信息】扩展用户基本信息增加部分扩展字段 2021-12-03 15:21:58 +08:00
付绪壮 624f7c2146 Merge remote-tracking branch 'origin/leng_dev' into fxz_dev 2021-12-03 15:06:51 +08:00
付绪壮 95a82439af ♻️ close #3394 【用户信息】扩展用户基本信息增加部分扩展字段 2021-12-03 14:46:17 +08:00
lbw 3b2e6d841b 📝 close #3410 common-test 单元测试模块 文档及代码更新 2021-12-03 14:39:14 +08:00
lbw d9ef13ae2f ✨ spi spring.factories 增加 ClientDetailsFeignClient 2021-12-03 14:35:49 +08:00
lbw 47f1a97703 Merge branch 'dev' of https://git.pig4cloud.com/pig/pigx into leng_dev 2021-12-03 10:49:44 +08:00
pig666 431ff293bc Merge branch 'dev' of 94636829/pigx into dev 2021-12-03 10:48:39 +08:00
dobo 7feec1b445 pigx-common-bom下xxljob版本更新为2.3.0 2021-12-03 10:11:27 +08:00
lbw c7c30c118a 🐛 Fixing a bug. closd #3398 【大屏设计】添加维护数据源 maxActive can't not set zero 2021-12-01 14:36:34 +08:00
lbw 61983ec946 ✨ Introducing new features. close #3396 代码生成支持数据库表结构文档导出 2021-11-30 21:48:09 +08:00
lbw 08e7eccaf1 Merge https://git.pig4cloud.com/361243819/pigx into dev 2021-11-30 21:39:36 +08:00
361243819@qq.com 1f01ad0b57 用户导入导出权限写错修改 2021-11-30 11:20:24 +08:00
lbw 028ffa667a 🐛 Fixing a bug. close #3355 Admin 模块启动提示: 使用不当,会额外暴露接口 2021-11-19 11:55:11 +08:00
lbw 9d1730d9de 🐛 Fixing a bug. close #3352 代码生成使用Oracle数据库出错 2021-11-19 11:54:59 +08:00
lbw 243fdc94f2 🐛 Fixing a bug. close #3352 代码生成使用Oracle数据库出错 2021-11-19 11:21:33 +08:00
ipixel cb7eb14a09 代码优化,防止内容中含有多余的@符号 2021-11-11 16:58:03 +08:00
ipixel 9568a56de0 增加QQ登录的支持,修改绑定手机号逻辑 2021-11-11 16:28:38 +08:00
MicLng dfb171233c 🗃️ 执行数据库相关的变化。 工作流模块不对外暴露 /ws/info 端点 2021-11-05 22:50:55 +08:00
MicLng d15deac105 ✨ Introducing new features. close #3303 report-platform 配置交由 nacos 统一管理 2021-11-05 11:46:33 +08:00
MicLng 8e2cd1234a ✨ Introducing new features. closed #3301 common-websocket 提供默认的文本处理器 2021-11-05 11:33:55 +08:00
ipixel baac7a6cc6 根据访问令牌获取用户登录信息 2021-11-04 15:06:25 +08:00
MicLng 964aff613c Merge https://git.pig4cloud.com/837152891/pigx into leng_dev 2021-11-04 11:18:45 +08:00
ipixel 65f21be0db Mybatis分页插件配置修改,以及统一登录页面中的代码修改 2021-11-04 10:23:26 +08:00
MicLng a5325ca5d4 🐛 Fixing a bug. PigxAuthenticationLogoutEventHandler.java 登录成功文案错误 2021-11-03 15:31:38 +08:00
MicLng 47e6132e28 ⏪ Reverting changes. 回滚 mybatis-plus 3.4.3 避免sqlparse 升级导致兼容性问题 2021-11-02 20:35:41 +08:00
MicLng 8775f043d7 🐛 Fixing a bug. element 风格代码生成导出excel 错误 2021-11-02 13:38:29 +08:00
MicLng 972e5c88a9 ⬆️ Upgrading dependencies. close #3090 up mybatis-plus 3.4.3.4 固定sqlparse 版本 2021-11-02 13:37:54 +08:00
MicLng a8bed6daea ⬆️ Upgrading dependencies. close #3090 up mybatis-plus 3.4.3.4 2021-11-02 11:59:53 +08:00
MicLng 011dfe8da4 ⬆️ Upgrading dependencies. spring boot admin 2.5.3 2021-10-31 10:19:31 +08:00
MicLng 57cab9ccc8 ⬆️ Upgrading dependencies. 升级 aj-report 前端 2021-10-29 22:57:53 +08:00
MicLng aaa7a54cad ⬆️ Upgrading dependencies. 升级 aj-report 前端 2021-10-29 22:57:37 +08:00
MicLng 44f10aca25 🗃️ 执行数据库相关的变化 动态路由支持元数据配置 2021-10-29 22:18:31 +08:00
MicLng 16e9831909 🗃️ 执行数据库相关的变化 动态路由支持元数据配置 2021-10-29 22:15:46 +08:00
MicLng d59d53495f 🗃️ 执行数据库相关的变化 动态路由支持元数据配置 2021-10-29 21:46:30 +08:00
MicLng 9a79a66380 🗃️ 执行数据库相关的变化 动态路由支持元数据配置 2021-10-29 21:30:24 +08:00
MicLng 73edf45567 🐳 Work about Docker. 调整docker-compsoe 文件 2021-10-29 21:04:47 +08:00
MicLng 3c1eef3587 ⬆️ Upgrading dependencies. spring boot 2.5.6 hutool 5.7.15
⬆️ Upgrading dependencies. spring boot 2.5.6 hutool 5.7.15
2021-10-29 20:46:57 +08:00
MicLng 4066c13d82 🗃️ 执行数据库相关的变化, 调整数据库脚本 2021-10-28 23:52:41 +08:00
MicLng 5609608e09 🐛 Fixing a bug. close #3264 日志无法记录参数校验的异常及其他自定义异常 2021-10-27 11:14:45 +08:00
MicLng 1929c84b88 🎨 Improving structure / format of the code. 2021-10-27 09:38:13 +08:00
MicLng 42b5ee41da Merge https://git.pig4cloud.com/673315837/pigx into leng_dev 2021-10-26 12:53:59 +08:00
MicLng 9be823dc71 ✨ Introducing new features. 数据大屏 2021-10-26 12:53:54 +08:00
SEVEN_ME a255caf715 ✨ 授权码添加过期时间 2021-10-21 16:03:05 +08:00
MicLng 8494e3ebca 🔖 Releasing / Version tags. v4.2.0 2021-10-18 16:29:29 +08:00
MicLng bda2b3b85c ✨ Introducing new features. close #3233 添加登录踢出功能 2021-10-18 16:26:28 +08:00
MicLng 97d2c50d0b 🔥 Removing code or files. 删除大屏设计器演示环境限制 2021-10-16 20:21:33 +08:00
MicLng dac44bc2fb ✨ Introducing new features. close #3233 添加登录踢出功能 2021-10-16 20:20:11 +08:00
MicLng 0ac7776cbb ✨ Introducing new features. close #3230 为单独某个接口设置网关超时的时间的实现 2021-10-16 20:19:30 +08:00
MicLng 6c1cadadbe 🐛 Fixing a bug. #3222 分页查询严重BUG,size传值-1时整表查询 2021-10-11 12:43:11 +08:00
MicLng 2cc47d4ee2 ⬆️ Upgrading dependencies. #3216 MybatisPlus升级到3.4.3.4版本 2021-10-09 16:14:29 +08:00
MicLng ad4b79106a ✨ Introducing new features. #3219 支持配置 nacos access-log 关闭 2021-10-09 16:07:12 +08:00
YLC8E 08ef5b8001 ✨ Introducing new features. common-websocket #3170 【重构】websocket 服务端整合 2021-10-09 09:10:56 +08:00
YLC8E fa32a643c7 ✨ Introducing new features. common-excel 下载模板 2021-10-07 13:38:57 +08:00
YLC8E 7473bdad0c ✨ Introducing new features. closed #3028 字典、参数管理 spring cache 支持主动刷新 2021-10-06 18:53:20 +08:00
YLC8E 28bae7bb83 ✨ Introducing new features. common-websocket #3170 【重构】websocket 服务端整合 2021-10-06 13:18:56 +08:00
YLC8E f85a8c71ca ✨ Introducing new features. common-websocket #3170 【重构】websocket 服务端整合 2021-10-05 20:03:29 +08:00
YLC8E 33ea18e49c ♻️ Refactoring code. 移动 ClientDetailsService 类至公共包 2021-10-04 19:40:10 +08:00
YLC8E 32f13aadf8 ✨ Introducing new features. closed #3157 【新特性】 令牌管理返回当前令牌对应的客户端ID 2021-10-04 00:01:07 +08:00
YLC8E c448dbe832 🐛 Fixing a bug. closed #3159 关于uname_to_access_z的疑问
🐛 Fixing a bug. closed #3159 关于uname_to_access_z的疑问
2021-10-03 17:15:32 +08:00
YLC8E f00d7fd59e ⬆️ springboot 2.5.5 、spring cloud 2020.0.4 2021-10-02 23:22:51 +08:00
jiojio 104e2ccc20 ✨ Introducing new features. closed #3168 【新特性】 增加支持大屏设计功能
✨ Introducing new features. closed #3168 【新特性】 增加支持大屏设计功能
2021-09-22 17:20:21 +08:00
jiojio fdfa8c1c3b ✨ Introducing new features. closed #3168 【新特性】 增加支持大屏设计功能 2021-09-17 16:48:02 +08:00
云彩ing 9b4d821a9b ⚡ 优化 closed #3150 【优化】用户使用过程中,若被删除提示令牌过期而不是报错 2021-09-13 12:19:41 +08:00
wjie 9480e6059b 🐛 Fixing a bug. nacos 提示错误密码 2021-09-04 23:44:07 +08:00
wjie d1c51602d2 🗃️ 执行数据库相关的变化。 全部环境变量使用 下划线替代中划线 2021-09-04 15:56:33 +08:00
wjie 7ae777a825 ⚡ 优化 closed #3124 登录用户支持多表储存,最后一步出现错误 2021-09-04 15:35:20 +08:00
wjie b84b20bfcc 🐳 Work about Docker. closed #3106 docker-compose 维护minio web console 端口 2021-08-31 16:28:48 +08:00
wjie d5d43469ac ⬆️ Upgrading dependencies. closed #3087 #3073 #3064 2021-08-31 16:19:15 +08:00
wjie 27e967481c ✨ Introducing new features. closed #3045 【新特性】common-excel 模块 2021-08-31 16:13:46 +08:00
wjie 109dc634e6 ✨ Introducing new features. closed #3045 【新特性】common-excel 模块 2021-08-31 16:09:14 +08:00
wjie 3ffb08968a ✨ Introducing new features. closed #3013 【重构】重构前端index.vue 的刷新逻辑抽取成对应的方法 2021-08-05 20:20:58 +08:00
wjie 6da9c2bbbc 🐛 Fixing a bug. closed #3027 Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 date/time type java.time.Instant not supported by default #26859 2021-08-05 17:54:45 +08:00
wjie cbf8fb0da9 ✨ Introducing new features. closed #3013 【重构】重构前端index.vue 的刷新逻辑抽取成对应的方法 2021-08-05 17:54:27 +08:00
lbw db7bc750d7 ✨ Introducing new features. closed #2988 xxl-job-admin 配置文件集成到nacos 配置中心 2021-08-05 11:06:09 +08:00
lbw ff977f2f3d ✨ Introducing new features. closed #3038 用户导入导出、日志导出 2021-08-05 11:03:20 +08:00
lbw e5469fcd98 ✨ Introducing new features. closed #3013 【重构】重构前端index.vue 的刷新逻辑抽取成对应的方法 2021-08-05 10:37:27 +08:00
lbw c122af1b0c 🎨 Improving structure / format of the code. closed #I43RA1 部分方法涉及多表未加@Transactional事务处理 2021-08-04 09:17:11 +08:00
lbw 74d08316c1 🐛 Fixing a bug. closed #3027 Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 date/time type java.time.Instant not supported by default #26859 2021-08-03 15:57:10 +08:00
lbw 7cddb1f63f ♻️ Refactoring code. closed #3026 【重构】部门管理使用表格树重构 2021-08-03 13:46:08 +08:00
lbw d5a6dc11ad ⬆️ Upgrading dependencies. closed #3024 up hutool 5.7.7 2021-08-03 10:10:23 +08:00
lbw 838304da21 ⬆️ Upgrading dependencies. closed #3017 up dynamic-datasource-spring-boot-starter 3.4.1 2021-08-03 09:57:04 +08:00
lbw 0de4a88a2a ✨ Introducing new features. 代码生成默认element 原生 2021-08-03 09:47:35 +08:00
lbw f59874f783 ✨ Introducing new features. closed #2988 xxl-job-admin 配置文件集成到nacos 配置中心 2021-07-30 15:01:01 +08:00
lbw 4c65257273 ⬆️ Upgrading dependencies. closed #2991 up spring boot 2.5.3 2021-07-30 15:00:04 +08:00
lbw 620809c05e ✨ Introducing new features. 优化代码生成 controller 使用条件构造器注入 2021-07-22 08:32:29 +08:00
lbw 7137a7278e ⬆️ Upgrading dependencies. closed #2952 #2979 up IJpay 2.7.6 2021-07-19 17:19:41 +08:00
lbw f9d6eb6c65 Merge branch 'big' into leng_dev 2021-07-19 17:17:17 +08:00
lbw 237f3ff325 ⬆️ Upgrading dependencies. closed #2952 up hutool 5.7.4 2021-07-19 17:16:16 +08:00
lbw 1feb7272bb 🐛 Fixing a bug.#2938 刚刚生成的专属版本启动AdminApplication 启动报错 2021-07-10 15:02:34 +08:00
lbw f7e91ed3db 🐛 Fixing a bug. #2932 升级hutool导致无法支付 2021-07-10 15:01:12 +08:00
lbw 42c817a7fe 🔖 Releasing / Version tags. v4.1
🔖 Releasing / Version tags. v4.1

🔖 Releasing / Version tags. v4.1

🔖 Releasing / Version tags. v4.1

🔖 Releasing / Version tags. v4.1
2021-07-01 17:13:37 +08:00
lbw edde446f1c 🔖 Releasing / Version tags. v4.1
🔖 Releasing / Version tags. v4.1
2021-07-01 14:11:06 +08:00
lbw 5f53b1da29 🐛 Fixing a bug. #2901 网关灰度路由 version 没有轮询 2021-07-01 14:07:53 +08:00
lbw e228dc14ea 🌱 数据权限外的部门树展示锁标识 2021-07-01 14:07:53 +08:00
lbw e5fce89ae9 ✨ Introducing new features. tx 适配 spring boot 2.5 2021-07-01 14:07:53 +08:00
lbw 716e5bd169 🔖 Releasing / Version tags. v4.1 代码优化 && 依赖升级
🔖 Releasing / Version tags. v4.1 代码优化 && 依赖升级

⬆️ Upgrading dependencies. mybatis-plus 3.4.3

⬆️ Upgrading dependencies. mybatis-plus 3.4.3

⬆️ Upgrading dependencies. mybatis-plus 3.4.3
2021-07-01 14:07:50 +08:00
lbw 7b9431caf2 ⬆️ Upgrading dependencies. #2836 up dynamic-datasource-spring-boot-starter 3.4.0 2021-06-29 19:30:01 +08:00
lbw 2d8cad119f ♻️ Refactoring code.#2667 移除代码&配置中关于ribbon 相关 2021-06-29 19:29:34 +08:00
lbw f928f38ce3 🔥 Removing code or files. RedisEventStore.java 2021-06-29 17:08:49 +08:00
lbw a49d03d242 ⬆️ closed #2893 up Knife4j 2.0.9 2021-06-28 20:08:42 +08:00
lbw 3164fb2295 ⬆️ closed #2836 up dynamic-datasource-spring-boot-starter 3.4.0 2021-06-28 10:49:18 +08:00
lbw 4a76c85389 ⬆️ closed #2889 up spring boot admin 2.4.2 2021-06-28 10:49:04 +08:00
lbw c85bdab9be ⬆️ #2838 up nacos 2.0.2 2021-06-25 16:58:41 +08:00
lbw 864e0948a3 ♻️ #2839 common-xss 模块代码更新 2021-06-25 11:02:00 +08:00
lbw 53a3951390 ⬆️ up hutool 5.7 split 兼容性修改 2021-06-25 10:35:16 +08:00
lbw 9c81dc8c6e Merge branch 'dev' of https://git.pig4cloud.com/pig/pigx into leng_dev 2021-06-24 15:18:40 +08:00
lbw 19b958de49 ⬆️ Upgrading dependencies. spring boot 2.5.2 & spring cloud 2020.0.3 2021-06-24 15:17:04 +08:00
pig777 76f204bebb Merge branch 'dev' of 892108994/pigx into dev 2021-06-24 14:43:36 +08:00
892108994 266cd52dea 更新 'pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/ClassUtils.java'
去除多余的分号
2021-06-24 12:15:55 +08:00
lbw b1d52910df ✨ Introducing new features. #2872 在操作日志中记录用户登录退出日志 2021-06-22 15:26:32 +08:00
lbw 80c6edc221 ✨ DruidSqlLogFilter Mybatis 输出日志格式化处理 2021-06-03 15:56:51 +08:00
pig666 6cad47e7f6 Merge branch 'dev' of 574315408/pigx into dev 2021-05-28 23:48:23 +08:00
刘海涛 94d5ec961b fix:代码生成器pgsql数据库float4、float8类型转换失败的问题 2021-05-28 18:16:56 +08:00
lbw f595cda94e ♻️ #2585 基于 Hutool TreeUtils 重构目前系统自定义使用的TreeUtil 2021-05-25 11:35:28 +08:00
lbw c2c2ad928a ✨ pig-common-job Remove class scanning 2021-05-20 15:15:11 +08:00
lbw be996be280 🐛 Fixing ApplicationLoggerInitializer use EnvironmentPostProcessor 2021-05-20 15:07:03 +08:00
lbw 5548f11100 ✨ pig-common-swagger Code optimization, support servlet, webflux, gateway at the same time 2021-05-20 15:05:40 +08:00
lbw 22cb241520 ✨ Restore the color after the banner end 2021-05-20 14:16:18 +08:00
lbw ec982414fd ♻️ #2685 注册中心在监控中心一直是宕机状态 2021-05-08 10:13:13 +08:00
lbw e828cd7f19 ✨ closed #2675 OpenFeign Get @SpringQueryMap 参数替代 Post查询 2021-04-29 17:13:36 +08:00
lbw c01ca8edda ⬆️ Upgrading dependencies. up springboot 2.4.5 up spring cloud alibaba 2021.1 up spring boot admin 2.4.1 2021-04-22 11:51:05 +08:00
pig666 c7a6832c40 Merge branch 'dev' of 574315408/pigx into dev 2021-04-20 11:50:03 +08:00
刘海涛 0c5ac9027c 修改xxl-job-admin数据源用户名变量错误和统一风格 2021-04-20 11:27:04 +08:00
pig666 e535927a50 Merge branch 'dev' of 574315408/pigx into dev 2021-04-20 11:24:00 +08:00
刘海涛 9542bab406 代码生成器mssql、mysql、pgsql like匹配多张表问题的修改 2021-04-19 13:58:25 +08:00
pig777 8db60416bf Merge branch 'dev' of 574315408/pigx into dev 2021-04-15 22:57:04 +08:00
刘海涛 d9a0f9e8fe 解决postgresql数据库代码生成器表字段char类型转换为unknowType的问题 2021-04-15 16:49:03 +08:00
lengleng 380daf6b99 ✨ Introducing new features. #2613 【swagger /knife4j】 支持统一开关屏蔽调用页面 2021-04-12 13:10:26 +08:00
lengleng 03455564a3 🐛 Fixing a bug. #2611 【报表模块】配置内置数据源后无法启动服务 2021-04-11 14:25:18 +08:00
lengleng a6521cb0c0 ✨ Introducing new features. #2613 【swagger /knife4j】 支持统一开关屏蔽调用页面 2021-04-11 14:24:53 +08:00
lengleng 94f233f4af 🐛 Fixing a bug. #2596 微信公众号模块查询为null导致错误 2021-04-09 17:22:28 +08:00
lengleng b9afbad661 🐛 Fixing a bug. #2591 【报表设计】查询表单设计器不能正确加载 2021-04-07 15:01:39 +08:00
lengleng 5dca7d2116 ⬆️ Upgrading dependencies. springboot 2.4.4 spring cloud 2020.0.2 spring cloud alibaba 2020.0.RC1 2021-04-01 21:48:20 +08:00
lengleng ebc7715ffd ⬆️ Upgrading dependencies. springboot 2.4.4 spring cloud 2020.0.2 spring cloud alibaba 2020.0.RC1 2021-04-01 21:42:02 +08:00
lengleng cbdd175831 🐛 Fixing a bug. #2533 登录过程中自定义异常,中文提示 500 异常 2021-04-01 21:41:03 +08:00
pig666 54d791782c Merge branch 'dev' of 1064771905/pigx-fork into dev 2021-03-26 23:24:53 +08:00
TAO WU 08a463a8c6 style(优化枚举类注解): 流程状态枚举类描述不正确
(cherry picked from commit a992f46f05)
2021-03-25 15:56:27 +08:00
pig777 3b641d2db8 Merge branch 'dev' of 21480080/pigx into dev
LGTM
2021-03-22 12:36:47 +08:00
JackWU 82e5ed6939 ignore Clients has configged by db. 2021-03-22 11:45:18 +08:00
lengleng 381838a431 ⏪ Reverting changes. 回滚错误提交的镜像信息 2021-03-13 16:21:33 +08:00
lengleng 73dedab201 🐛 Fixing a bug. closed ##2476 登录密码首尾输入多个空格任然能登录成功 2021-03-13 16:19:50 +08:00
lengleng 168de49a8f 🐛 Fixing a bug. closed #2443 【开发平台】生成代码预览 提示SQL 执行失败 2021-03-12 13:25:22 +08:00
lengleng bda6613300 🔖 Releasing / Version tags. 4.0.0 2021-03-07 14:13:31 +08:00
lengleng b3d369e1e5 🔖 Releasing / Version tags. 4.0.0 2021-03-07 14:07:25 +08:00
lengleng cfdc794fb0 🔖 Releasing / Version tags. 4.0.0
🔖 Releasing / Version tags. 4.0.0

🔖 Releasing / Version tags. 4.0.0
2021-03-04 14:54:12 +08:00
lengleng e076b30635 ⚡ 优化 | 去掉无用参数避免NPE
⚡ 优化 | 去掉无用参数避免NPE
2021-03-03 23:01:27 +08:00
lengleng d868d5c90d ⚡ 优化 | 报表设计避免驱动不存在,增加mysql8 默认驱动 2021-03-03 16:45:46 +08:00
lengleng a896cd6beb ⚡ 优化 | 避免oracle 表名小写无法查询字段信息 2021-03-03 14:42:06 +08:00
lengleng 5ef6b7576b ⚡ 优化 | 优化 websocket 配置,避免歧义 2021-03-03 00:09:38 +08:00
lengleng f38ef2856b ⬆️ Upgrading dependencies. closed #2383 up XXL-JOB v2.3.0 2021-03-02 12:33:56 +08:00
lengleng fa859723b5 ⬇️ Downgrading dependencies. | 2.3.1 避免 2.4.0 服务状态不准确问题 2021-02-28 22:26:41 +08:00
lengleng 040b7190a6 ⬆️ 依赖升级 | closed #2280 up nacos 1.4.1
⬆️ 依赖升级 | closed #2280 up nacos 1.4.1
2021-02-24 10:28:53 +08:00
lengleng 20c7502b71 🗃️ 执行数据库相关的变化 | 数据库脚本更新至 v4.0 2021-02-22 11:41:41 +08:00
lengleng 6e9be4ab01 ⬆️ 依赖升级 | closed #2383 up XXL-JOB v2.3.0 2021-02-20 19:51:32 +08:00
lengleng 1a2467432d ⬆️ 依赖升级 | closed #2394 up spring boot admin 2.4.0 |
closed #2395 up hutool 5.5.8
2021-02-20 18:57:59 +08:00
lengleng b1400f81a1 🐛 Fixing a bug. | closed #2398 分页方法IPage泛型 2021-02-20 18:23:44 +08:00
lengleng 9267ed669c ⬆️ Upgrading dependencies. | closed #2401 up AJ-Captcha 行为验证码 V1.2.7 2021-02-20 18:23:02 +08:00
lengleng 6b3899394f ✨ 添加新特性 | closed #2400 公众号、支付模块涉及敏感字段需要脱敏显示 2021-02-20 18:12:33 +08:00
lengleng 2c797b7295 🐛 修复 BUG | #2386 短信登录失败,失败事件触发了3次 2021-02-19 13:10:49 +08:00
lengleng 24577a2c81 ⬆️ 依赖升级 | closed #2388 up spring boot 2.4.3 2021-02-19 10:49:41 +08:00
lengleng a144f24e73 🔧 修改配置文件 | 修改 bootstrap.yml 文件中关于 排除自启配置,移动到 nacos 对应配置文件中 2021-02-18 12:50:56 +08:00
lengleng 57c081069f ⬆️ 依赖升级
closed #2278 up spring boot 2.4.2
closed #2385 up fastjson fastjson 1.2.75
closed #2384 up Druid 1.2.5
2021-02-18 12:31:20 +08:00
lisb c558cc7cef Merge branch 'lisb_dev' of pigx/pigx into leng_dev 2021-02-16 12:04:09 +08:00
lishangbu e89f919aa1 ♻️ Refactoring code.启用缓存自动ttl特性时,保留原始键不变 2021-02-16 11:55:05 +08:00
lbw de47cf88ab ⚡ 优化xss TTL 问题,避免OOM 2021-02-09 16:17:44 +08:00
lbw 45d5458526 ✨ Introducing new features.#2374 避免授权码模式下丢失租户上下文的问题 2021-02-08 00:10:02 +08:00
lbw 480d2f3801 🔒 修复安全 , 健壮性判断 2021-02-05 17:40:13 +08:00
lbw 5b9d778425 ♻️ Refactoring code. #2358 websocket 调整 2021-02-05 13:34:03 +08:00
lbw ced4a056e5 ✨ Introducing new features. #2116 报表设计增加 spring security 安全控制 默认账户 pigx pigx 2021-02-03 19:27:28 +08:00
lbw 1aa49ce49c 🔥 Removing code or files. 去掉过期 @SpringCloudApplication 2021-02-03 15:14:36 +08:00
lbw 19e54584a2 ✨ Introducing new features. #2351 【支付管理】支持YunGouOS 小微商户支付模式 2021-02-03 13:24:11 +08:00
lbw eb8bd5b2d1 ✨ Introducing new features. #2351 【支付管理】支持YunGouOS 小微商户支付模式 2021-02-03 13:18:29 +08:00
lbw 821580737c 📝 Writing docs. #2349 微信公众号项目 dockerfile run 命令参数错误 2021-02-02 16:28:00 +08:00
lbw 1e6807cb24 ⬆️ Upgrading dependencies. #2291 up mysql-connect-java 8.0.23 2021-02-02 15:48:42 +08:00
lbw e461af354e ♻️ Refactoring code. 修改社交登录绑定逻辑,增加去重判断 2021-02-02 14:43:03 +08:00
lbw fe191320e3 ✨ Introducing new features. #2324 up spring cloud 2020.0.1 2021-02-02 11:39:56 +08:00
lbw 3af30a0e9e ♻️ Refactoring code. RedisTemplateConfig 优先于 Redisson 配置 2021-02-02 11:07:41 +08:00
lbw 3197cac20f ✨ Introducing new features. #2303 兼容并支持SCL 灰度路由 2021-01-25 15:28:51 +08:00
lbw 3990f3f51b 🎨 Improving structure / format of the code. 代码格式化 删除无用代码 2021-01-23 16:33:25 +08:00
lbw 648fb81d36 ✨ Introducing new features. #2263 [common-test]基于pig优化单元测试 2021-01-23 16:32:57 +08:00
lbw 476346379e Merge remote-tracking branch 'origin/leng_dev' into leng_dev 2021-01-15 17:16:01 +08:00
lbw abf486b73e ✨ Introducing new features. 单元测试实现支持 租户隔离
✨ Introducing new features. 单元测试实现支持 租户隔离
2021-01-15 17:15:52 +08:00
lbw a514adb7a8 ✨ Introducing new features. 单元测试实现支持 租户隔离 2021-01-15 17:11:39 +08:00
lbw 5caa9254d9 🐛 Fixing a bug. #2272 文件上传失败提示错误错误 2021-01-15 17:10:57 +08:00
lbw 8cf212fb13 🔒 修复安全,强转类型失败判断 2021-01-13 14:12:00 +08:00
lbw 8906153849 🎨 Improving structure / format of the code. 代码格式化 2021-01-13 13:37:12 +08:00
lbw 896ad75252 ✨ Introducing new features. #2161 日志切面保存错误日志 2021-01-13 10:15:05 +08:00
lbw 14b5dacb64 🐛 Fixing a bug. #2267 登录日志 未区分租户 日志表 中的tenant_id为0 2021-01-13 10:13:45 +08:00
lbw b80fce8c10 🐛 Fixing a bug. #2264 灰度发布设置版本号时无法负载均衡
🐛 Fixing a bug. #2264 灰度发布设置版本号时无法负载均衡
2021-01-13 09:43:43 +08:00
lbw 36df95ca78 ✨ Introducing new features. #2263 [common-test]基于pig优化单元测试 2021-01-12 22:14:20 +08:00
pig666 33a8f76472 Merge branch 'dev' of 583290313/pigx-fix-common-test into dev 2021-01-12 21:42:48 +08:00
Sheldon Zi 523a2f8471 feat(test): 优化单元测试
1. 使用RestTemplate改写获取accessToken的方法, accessTokenUri可以使用服务名进行负载均衡
2. 获取用户时, 使用ResourceServerTokenServices.loadAuthentication, 支持ResourceServer(isLocal=true/false)的情况
3. 支持角色权限
2021-01-12 17:35:43 +08:00
lbw f97015b183 ⬆️ Upgrading dependencies. #2251 up AJ-Captcha 行为验证码 V1.2.5 2021-01-11 17:41:32 +08:00
lbw f8289a00a6 ✨ Introducing new features. #2250 升级 knife4j 3.x 支持自动OAuth 2.0 授权 2021-01-09 15:11:39 +08:00
lbw 61d05ebce7 🐛 Fixing a bug. #2242 数据权限 用户权限设置为ALL(0, "全部"), selectCountByScope报错 2021-01-08 11:21:36 +08:00
lbw bbc5d8ff44 ✨ Introducing new features. #2241 【common-test】 优化单元测试模块,支持默认角色 2021-01-07 16:03:46 +08:00
lbw cdc28eb991 🔒 Fixing security issues. #2235 【代码生成】选择elemenet 风格 添加数据时,表单重复提交 2021-01-07 09:56:49 +08:00
lengleng 679425894f ⬆️ Upgrading dependencies. spring boot admin 2.3.1 2021-01-05 13:29:44 +08:00
lengleng 511e56d0dd ✨ Introducing new features. 新增yungouos支付渠道 2021-01-05 11:27:50 +08:00
lengleng dbbba889c0 🎨 Improving structure / format of the code. 格式化代码 2021-01-03 10:48:18 +08:00
lengleng bf2ce5cffd ✨ Introducing new features. #2207 适配兼容 Spring Cloud 2020 && Spring Boot 2.4 2020-12-30 11:31:51 +08:00
lengleng a25caeff01 ⬆️ Upgrading dependencies. spring cloud 2020 2020-12-29 16:47:24 +08:00
lengleng f51a3f2ae3 🔥 Removing code or files. 删除关于 OAuth2.0 Jackson 序列化部分 2020-12-24 11:05:24 +08:00
lengleng f57f29d9ee ✨ Introducing new features. #2176 Feign参数过长会报错的解决方案 2020-12-22 23:55:20 +08:00
lengleng 1e09236868 ✨ Introducing new features. 代码生成细节完善,注释换行符号去除, 字段类型去除括号后匹配等 2020-12-22 23:53:52 +08:00
lengleng fc6fefd224 ✨ Introducing new features. #2151 【代码生成】 支持ORACEL / SQL SERVER /PG/DB2 等其他数据源类型代码生成 2020-12-15 16:41:58 +08:00
lengleng afe07e9d56 ⬆️ Upgrading dependencies. #2148 UP Druid 1.2.4 版本发布,增强 SQL Parser,支持 JDK8 日期类型 2020-12-14 21:50:04 +08:00
lengleng 82bc012da3 🐛 Fixing a bug. #2150 角色管理,编辑数据权限,选自定义,不选择部门,则后续操作报错 2020-12-14 21:49:03 +08:00
lengleng e69a50c5ee ✨ Introducing new features. #2151 【代码生成】 支持ORACEL / SQL SERVER /PG 等其他数据源类型代码生成 2020-12-14 21:36:15 +08:00
lengleng 193a1f478b 🐛 Fixing a bug. closed #2145 上传文件接口在swagger中MultipartFile类型显示为String,无法上传文件。 2020-12-13 19:56:51 +08:00
lengleng 6e29c5d9e1 Merge branch 'dev' of https://git.pig4cloud.com/pig/pigx into leng_dev 2020-12-10 20:40:53 +08:00
lengleng 2f9c93bc53 🐛 Fixing a bug. closed #2080 xxl -job admin url 参数错误 2020-12-10 20:39:01 +08:00
lengleng 8c2cb9fa45 ✨ Introducing new features. #2119 swagger 服务列表支持自定义排序& 根据服务状态过滤 2020-12-10 10:35:18 +08:00
lengleng dbb4ae4373 ♻️ Refactoring code. #2115 认证中心 和 数据库解耦,通过feign 调用数据源 011d25de6b 2020-12-07 13:33:13 +08:00
lengleng 3306d08819 ✨ Introducing new features. #2116 报表设计增加  spring security 安全控制 2020-12-07 11:50:15 +08:00
lengleng 011d25de6b ♻️ Refactoring code. #2115 认证中心 和 数据库解耦,通过feign 调用数据源 2020-12-07 11:36:14 +08:00
lengleng f0b24a8e40 ✨ Introducing new features. #2116 报表设计增加 spring security 安全控制 2020-12-07 11:31:09 +08:00
lengleng a648988bbf ✨ Introducing new features. #2114 增加全局编码转换,避免 context type 不规范乱码问题 2020-12-07 10:48:49 +08:00
小七 3a2ab23eee #2087 【工作流】模型设计器支持资源服务器鉴权 2020-12-05 19:02:07 +08:00
小七 9918215509 ✨ Introducing new features. #2087 【工作流】模型设计器支持资源服务器鉴权 2020-12-03 17:48:24 +08:00
pig777 28029d2098 Merge branch 'master' of 94636829/pigx into dev 2020-12-03 14:02:48 +08:00
dobo 95073d8269 更新 'pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/processor/UReportPropertyPlaceholderConfigurerPlus.java' 2020-12-03 12:22:37 +08:00
小七 b493ed96b0 🔖 Releasing / Version tags. 4.0.0-SNAPSHOT 2020-12-01 22:23:16 +08:00
小七 e2df067f8a 🚚 Moving or renaming files. 2020-11-30 17:13:30 +08:00
小七 a15ed20ed7 Merge branch 'leng_dev' into big 2020-11-30 13:48:31 +08:00
小七 a938cdf730 🚚 Moving or renaming files. 2020-11-30 13:48:23 +08:00
小七 750d3685e4 Merge remote-tracking branch 'origin/dev' into dev 2020-11-30 13:15:47 +08:00
小七 f48ecd8792 Merge branch 'master' into big 2020-11-30 10:27:59 +08:00
小七 e60763e771 🎉 🎉 🎉 v3.11 2020-11-30 10:26:49 +08:00
小七 ef323f6943 🎉 🎉 🎉 v3.11 2020-11-30 10:25:31 +08:00
小七 9e546c3b9f 🎉 🎉 🎉 v3.11
🎉 🎉 🎉 v3.11
2020-11-29 18:55:00 +08:00
小七 317fb80c01 ✨ Introducing new features. #1631 【讨论帖】重构目前整体架构核心,不调用认证中心 ,资源服务器自行校验 token   <=>
23d705cfbb
2020-11-29 16:10:16 +08:00
小七 c03076e711 ✨ Introducing new features. #2005 升级 mybatis-plus 3.4.1 支持插件主体配置设置 e5dd87ab66 2020-11-29 13:54:55 +08:00
lbw a6c26b7bca ✨ Introducing new features. #2034 客户端管理 增加验证码、前端登录加密控制功能 代码优化 96a5d4c3f5 2020-11-29 12:01:23 +08:00
lbw 47eb600ccb 🗃️ 执行数据库相关的变化. v3.11 数据库脚本 2020-11-29 11:01:28 +08:00
lbw a8a6d3d9fb ⬇️ Downgrading dependencies. down nacos 1.3.2 避免兼容性问题
⬇️ Downgrading dependencies. down nacos 1.3.2 避免兼容性问题
2020-11-28 13:06:54 +08:00
lengleng a288bae3f5 ⬆️ Upgrading dependencies. #2060 up Knife4j 2.0.8发布,轻量级微服务聚合文档中间件诞生 2020-11-25 11:51:16 +08:00
lengleng cefc39f98d ♻️ Refactoring code. 重构粉丝同步逻辑,减少操作逻辑,避免大批量耗时 2020-11-25 11:09:10 +08:00
lengleng 2018e571ea 🎨 Improving structure / format of the code. 格式化代码 438acdd56e 2020-11-25 11:08:25 +08:00
lengleng 43ba12ea40 ⬆️ Upgrading dependencies. hutool 5.5.1 2020-11-19 16:15:37 +08:00
lengleng 438acdd56e ✨ Introducing new features. #2022 自定义 Spring Boot FailureAnalyzer 避免路由没初始化 启动网关导致404 2020-11-19 15:38:50 +08:00
lengleng 96a5d4c3f5 ✨ Introducing new features. #2034 客户端管理 增加验证码、前端登录加密控制功能 2020-11-19 12:49:02 +08:00
pig666 b81fb91708 Merge branch 'yuandev' of 28179060/pigx into dev
LGTM
2020-11-18 09:22:13 +08:00
袁启勋 817245b363 统一变量名称 2020-11-18 09:15:22 +08:00
jovlog 8895e96f71 ✨ Introducing new features. Long 输出 String 避免精度丢失 2020-11-16 16:21:58 +08:00
lengleng e5dd87ab66 ✨ Introducing new features. #2005 升级 mybatis-plus 3.4.1 支持插件主体配置设置 2020-11-13 11:32:55 +08:00
pig666 600d002cdb 🐛 Fixing a bug. #2002 【文件管理】 上传中文名称文件,列表显示源文件名乱码 2020-11-10 17:03:35 +08:00
pig666 324109c59b ⬆️ Upgrading dependencies. spring cloud hoxton.SR9 2020-11-10 13:24:10 +08:00
pig666 5bdf931212 ✨ Introducing new features. #1631 【讨论帖】重构目前整体架构核心,不调用认证中心 ,资源服务器自行校验 token <=>
23d705cfbb

✨ Introducing new features. #1631 【讨论帖】重构目前整体架构核心,不调用认证中心 ,资源服务器自行校验 token   <=>
23d705cfbb
2020-11-10 11:36:54 +08:00
pig666 8a80d89f9f ✨ Introducing new features. #1985 引入 Mica-XSS 插件,避免 element 部分xss 脚本未转义攻击问题
da1569fbb4
2020-11-10 10:35:32 +08:00
lengleng 575a0be70d ✨ Introducing new features. #1998 xxl-job 客户端支持基于服务注册发现的自动化配置 xxl-job-admin
✨ Introducing new features. #1998 xxl-job 客户端支持基于服务注册发现的自动化配置 xxl-job-admin
2020-11-09 16:25:03 +08:00
lengleng 16b5ae6c64 ✨ Introducing new features. #1841 内置 xxl-job-admin 模块 方便使用 2020-11-09 14:16:18 +08:00
lengleng d2acacf830 ⬆️ Upgrading dependencies. durid 1.2.3
⬆️ Upgrading dependencies. durid 1.2.3
2020-11-09 13:43:01 +08:00
lengleng 64274e0828 ⬆️ Upgrading dependencies. #1997 jayspt 配置文件加解密组件 升级至 3.X兼容 Nacos配置刷新 2020-11-09 13:22:51 +08:00
lengleng 7e11c9f106 ✨ Introducing new features. #1995 支持 Nacos 1.4
✨ Introducing new features. #1995 支持 Nacos 1.4
2020-11-07 15:45:49 +08:00
lengleng da1569fbb4 ✨ Introducing new features. #1985 引入 Mica-XSS 插件,避免 element 部分xss 脚本未转义攻击问题 新特性 2020-11-06 14:14:08 +08:00
pig777 5edf4d5e6e 🐛 Fixing a bug. #1981 【字典分页】3.10 ui查询结果为空,总数量不对 未更改 2020-11-04 22:11:48 +08:00
pig777 ceac667a71 ✨ Introducing new features. #1982 单点登录sso下跳转 无法传递租户上下文 2020-11-04 21:02:34 +08:00
pig777 407a9bb15c 🗃️ 执行数据库相关的变化,增加报表相关按钮 2020-10-29 12:56:19 +08:00
pig777 30a7e97dd7 🐳 Work about Docker. 优化docker 镜像时间设置
🐳 Work about Docker. 优化docker 镜像时间设置
2020-10-29 10:15:39 +08:00
pig777 fa33aeae4c ✨ Introducing new features.#1908 日志功能新增时间过滤条件 2020-10-27 16:52:49 +08:00
pig666 b43599167e 🎨 Improving structure / format of the code. 格式化代码 2020-10-24 16:31:21 +08:00
pig666 b15dbe08ec Merge branch 'serializer' into leng_dev
# Conflicts:
#	pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermitAllUrlResolver.java
2020-10-24 16:27:25 +08:00
pig666 3965327004 ✨ Introducing new features. #1958 OAuth2.0 RedisTokenStore 支持 Jackson 序列化 2020-10-24 16:23:15 +08:00
pig666 086be8e55b 🐛 Fixing a bug. #1957 Spring Boot 异常处理 /error 导致OAuth 2.0 NPE异常 2020-10-24 16:15:01 +08:00
冷冷 e3e63731d3 ✨ Introducing new features. oauth2.0 序列化
✨ Introducing new features. oauth2.0 序列化

✨ Introducing new features. oauth2.0 序列化

✨ Introducing new features. oauth2.0 序列化
2020-10-22 21:27:00 +08:00
pig666 25c3f937cc ✨ Introducing new features. #1944 支持分布式应用 druid sql 监控 2020-10-19 22:29:42 +08:00
pig666 7dbe446bef ✨ Introducing new features.#1908 日志功能新增时间过滤条件 区分租户隔离
✨ Introducing new features.#1908 日志功能新增时间过滤条件 区分租户隔离
2020-10-16 18:14:06 +08:00
pig666 cf1d4c8f06 ✨ Introducing new features. #1935 灰度路由支持非WEB调用传递 2020-10-16 15:53:46 +08:00
pig666 590620c651 🎨 Improving structure / format of the code. 格式化代码 2020-10-16 15:53:33 +08:00
冷冷 ecb238740c ✨ Introducing new features. #1934 所有服务都接入到 Spring Boot Admin 监控
✨ Introducing new features. #1934 所有服务都接入到 Spring Boot Admin 监控
2020-10-16 13:40:39 +08:00
冷冷 163277fd16 ✨ Introducing new features. #1936 支持 ureport 报表系统 2020-10-16 11:12:59 +08:00
冷冷 7f651b4667 🔒 Fixing security issues. #1932 启动支持 @Inner 路径安全性检测 2020-10-16 11:04:16 +08:00
冷冷 bdf0824e30 🔇 Removing logs. 屏蔽 MybatisPlus 主键校验日志 2020-10-16 09:51:30 +08:00
冷冷 1f16bf4002 🔥 Removing code or files. 删除无用日志文件 2020-10-15 10:35:48 +08:00
冷冷 6dbcac8666 ♻️ Refactoring code. #1920 @Inner 写在类级别无效 2020-10-15 10:34:38 +08:00
冷冷 841cc622da ✨ Introducing new features.#1908 日志功能新增时间过滤条件 2020-10-14 15:38:10 +08:00
冷冷 27489ce1a2 ♻️ Refactoring code. #1920 @Inner 写在类级别无效 2020-10-14 15:37:48 +08:00
冷冷 20a6e6c702 ⬆️ Upgrading dependencies. #1850 up hutool 5.4.4 2020-10-14 15:36:46 +08:00
不合群的混子 bf116039f9 ♻️ Refactoring code. #1900 优化 SSO 退出功能,支持自动重定向和参数重定向 2020-10-06 14:51:24 +08:00
lengleng baf333d475 ✨ Introducing new features. #1899 up swagger 3.0 重构 common-swagger 模块 2020-10-03 13:08:31 +08:00
lengleng 6f4328a31f ✨ Introducing new features. #1899 up swagger 3.0 重构 common-swagger 模块 2020-10-03 12:40:31 +08:00
冷冷 c89ddf9c9e ✨ Introducing new features. #1814 oauth2中client_id_to_access数据膨胀 2020-09-30 15:39:31 +08:00
冷冷 23d705cfbb ✨ Introducing new features. 资源服务器本地模式,本地调用 tokenstore 提高性能 2020-09-30 14:18:20 +08:00
sindaZeng 7787126f42 重写DefaultTokenServices 实现单设备登陆 2020-09-29 17:41:57 +08:00
冷冷 f0eeee7c44 ♻️ Refactoring code. 优化动态路由支持 Redis 信道重复加载 2020-09-29 13:17:15 +08:00
pig777 54e52f1c60 ✨ Introducing new features. pigx-common-test support oauth2 test 2020-09-22 22:57:14 +08:00
qtcwxj 5961c303f5 Merge branch 'dev' of https://git.pig4cloud.com/pig/pigx into leng_dev 2020-09-22 13:58:40 +08:00
pig666 4a9bfb0717 Merge branch 'dev' of 545384243/pigx into dev 2020-09-22 13:22:00 +08:00
qtcwxj 5d2b6d84b4 ♻️ Refactoring code. 优化动态路由 refreshrouteevent 2020-09-22 12:34:42 +08:00
qtcwxj 58b2ba44a9 🐳 Work about Docker. 优化docker 优先启动 upms 2020-09-22 12:34:21 +08:00
hewenbin 345ee10afe #1831 修改默认发号器跳号问题(除了第一个区间能取完所有值,其他的区间只能取到第一个值) 2020-09-22 11:27:09 +08:00
冷冷 155e1ef570 ⬆️ Upgrading dependencies.#1850 up hutool 5.4.3 2020-09-18 17:18:26 +08:00
Pzer 4bfa5b3076 ⬆️ Upgrading dependencies. #1846 up spring cloud alibaba 2.2.3 #1845 up spring boot 2.3.4 2020-09-18 11:36:40 +08:00
Pzer dd6b0e8225 🐛 Fixing a bug. #1831 默认发号器跳号问题(除了第一个区间能取完所有值,其他的区间只能取到第一个值) 2020-09-18 10:51:12 +08:00
Pzer 2bf2c2c3e4 🐛 Fixing a bug. #1843 nacos 启动后一直在尝试创建"mydb"数据库 2020-09-18 10:51:00 +08:00
DevOps 9595b87b4e Merge branch 'dev' into leng_dev 2020-09-15 08:52:24 +08:00
DevOps 45d8d4528e ⬆️ Upgrading dependencies. druid 1.1.23 #1811 编译提示The POM for com.alibaba:druid:jar:1.1.21 is invalid 2020-09-15 08:49:03 +08:00
dreamlu a380a996b6 🔖 Releasing / Version tags. 3.10
🔖 Releasing / Version tags. 3.10

🔖 Releasing / Version tags. 3.10

🔖 Releasing / Version tags. 3.10

🔖 Releasing / Version tags. 3.10
2020-09-13 20:11:54 +08:00
dreamlu 4837ad1984 🔖 Releasing / Version tags. 3.10
🔖 Releasing / Version tags. 3.10
2020-09-12 11:31:06 +08:00
a 9b9f724e37 ⬆️ Upgrading dependencies. #1788 up hutool 5.4.2 2020-09-10 12:24:16 +08:00
a e56e9dd503 ✨ Introducing new features. #1771 I18N 统一服务端认证授权信息 2020-09-04 12:46:26 +08:00
pig777 964bf540a8 ✨ Introducing new features.#1770 客户端认证异常统一,避免重定向至SSO 认证页面 2020-09-04 12:43:11 +08:00
冷冷 1f5afb045b ⬆️ Upgrading dependencies. docker-maven-plugin 0.33.0 2020-09-03 22:04:08 +08:00
冷冷 f238ee1207 ✨ Introducing new features. #1620 【oauth2】扩展 RedisTokenStore 记录用户名 和token 关系,方便用户扩展自己业务逻辑 2020-09-03 21:36:20 +08:00
冷冷 ded5fe44e1 ✨ Introducing new features. #1632 扩展支持授权码模式支持认证中心集群
✨ Introducing new features. #1632 扩展支持授权码模式支持认证中心集群
2020-09-03 11:29:35 +08:00
冷冷 2340fe87c1 ✨ Introducing new features. #1761 个人信息页面修改增加原密码校验 2020-09-03 10:39:39 +08:00
冷冷 8ff3abbd28 ⬆️ Upgrading dependencies. #1759 up hutool 5.4.1 2020-09-03 08:44:04 +08:00
冷冷 8ca64f26fd ♻️ Refactoring code. pom version constant 2020-09-02 09:31:47 +08:00
冷冷 03b499568e ⬆️ Upgrading dependencies. #1696 up sentinel 1.8
⬆️ Upgrading dependencies. #1696 up sentinel 1.8
2020-09-02 08:42:23 +08:00
冷冷 729df9d1c7 ⬆️ Upgrading dependencies. spring cloud alibaba 2.2.2 2020-09-01 21:41:27 +08:00
冷冷 cc10c896c7 ⬆️ Upgrading dependencies. #1747 up Spring Cloud Hoxton Service Release 8 2020-08-31 10:30:22 +08:00
冷冷 b97fcc789d ✨ Introducing new features. #1732 行为验证码升级至 1.2.4 版本 2020-08-31 10:29:50 +08:00
冷冷 87323975d2 ✨ Introducing new features. 角色查询增加缓存,提高微服务多模块 数据权限查询效率 2020-08-27 13:34:31 +08:00
冷冷 19490a6ccb ⬆️ Upgrading dependencies. #1732 行为验证码升级至 1.2.4 版本 2020-08-27 11:22:15 +08:00
冷冷 13694ffcc8 🐛 Fixing a bug. #1725 【微信管理】运营数据为空 2020-08-25 17:46:53 +08:00
冷冷 12c9a7158a ⬆️ Upgrading dependencies. #1723 up wxjava3.9.0 2020-08-25 15:48:55 +08:00
冷冷 727ed43cf3 ⏪ Reverting changes. 修改部分批量操作, mybatisplus 空属性数据库默认值覆盖问题 2020-08-25 09:18:35 +08:00
冷冷 86b40ec069 ⬆️ Upgrading dependencies. up nacos 1.3.2 https://gitee.com/log4j/pig/issues/I1Q9RG 2020-08-24 22:04:35 +08:00
冷冷 4b27431edb ⬆️ Upgrading dependencies. #1719 up Knife4j 2.0.4 2020-08-24 21:39:03 +08:00
冷冷 91c4532347 ⬆️ Upgrading dependencies.#1700 up hutool 5.4.0 #1662 up spring boot 2.3.3 2020-08-24 15:58:40 +08:00
冷冷 45ad80dd49 🐛 Fixing a bug. closed #1656 修改终端管理下pig数据后报错 2020-08-13 09:12:17 +08:00
冷冷 6fcbcc583d Merge https://git.pig4cloud.com/251202439/pigx into leng_dev 2020-08-13 09:10:27 +08:00
251202439 dd855b1920 更新 'pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysOauthClientDetailsServiceImpl.java'
修复终端管理修改pig的扩展信息保存后再清空 报错问题
2020-08-12 11:22:04 +08:00
冷冷 91406e5079 ⬆️ closed #1647 up spring boot admin 2.3.0 2020-08-10 15:20:27 +08:00
冷冷 3402b9b53a 🍎 Fixing something on macOS. #1640 表单设计器 默认根据表设计栅栏 span 为空 2020-08-07 16:33:15 +08:00
冷冷 2eeb49f08b ✨ Introducing new features. #1628 PigxBaseMapper 优化MyBatisPlus 的批量插入和支持数据权限 2020-08-05 15:08:03 +08:00
冷冷 cf0db9c132 ⬆️ Upgrading dependencies. 更新 spring boot 、spring cloud 、mp 、pay 依赖
⬆️ Upgrading dependencies. 更新 spring boot 、spring cloud 、mp 、pay 依赖
2020-08-04 11:56:42 +08:00
冷冷 ec3bbd900e 🐛 Fixing a bug. #1534 amazonaws oss Unable to execute HTTP request: Timeout waiting for connection from pool 2020-07-20 13:57:53 +08:00
冷冷 81af2b2dc8 🔥 Removing code or files. 删除Admin Server JacksonConfig.java 通过配置排除 2020-07-13 20:01:59 +08:00
冷冷 9b25930340 Merge branch 'master' into dev 2020-07-13 19:37:15 +08:00
冷冷 1a1ae4dbcb https://gitee.com/log4j/pig/issues/I1M2TJ sentinel 异常降级失效 2020-07-13 17:15:27 +08:00
冷冷 0adbc36a3d #1426 网关报错failed: Too many open files 2020-07-13 17:14:54 +08:00
冷冷 ba37cc4e06 #1451 新增租户后,登录界面不显示 2020-07-13 17:14:24 +08:00
lengleng 4d2f16d092 🔖 Releasing / Version tags. 3.9.0
🔖 Releasing / Version tags. 3.9.0

🔖 Releasing / Version tags. 3.9.0
2020-06-21 16:44:34 +08:00
lengleng d181e530a3 🔖 Releasing / Version tags. 3.9.0 2020-06-21 13:27:30 +08:00
lengleng c718affad2 🗃️ 执行数据库相关的变化. 常量 sys_public_param 基础常量 2020-06-21 11:21:43 +08:00
lengleng be60059bea ♻️ Refactoring code. 细节优化,(ossendpoint 展示、常量参数工具、oauth server 异常国际化问题) 2020-06-20 23:05:36 +08:00
lengleng a646f3599a ♻️ Refactoring code. 统一消息插入时间规则,完全依靠数据库的时钟设置 2020-06-20 23:04:36 +08:00
lengleng 59e11b0492 ♻️ Refactoring code. 优化数据权限,返回部门树 包含有无权限标志 2020-06-20 23:03:34 +08:00
lengleng 0c894935eb 🔥 Removing code or files. #1408 部门关系表 sys_Dept_relation 2020-06-20 23:02:02 +08:00
lengleng 10495b0f3d 🗃️ 执行数据库相关的变化. 增加默认角色功能菜单 2020-06-19 09:55:44 +08:00
lengleng 20fb980ec4 ⬆️ Upgrading dependencies. nacos 1.3.0 2020-06-18 21:29:14 +08:00
lengleng 741f65bf27 ♻️ Refactoring code. 支付模块 2020-06-18 21:17:39 +08:00
gokje 7448387466 ✨ Introducing new features. closed #1400 数据权限支持 Mybatis-plus 自带方法的过滤 2020-06-17 20:45:55 +08:00
gokje e7da9c0510 ✨ Introducing new features. closed #1400 数据权限支持 Mybatis-plus 自带方法的过滤 2020-06-17 20:39:01 +08:00
冷冷 79d0813092 Merge branch 'master' of 1870737809/pigx into dev 2020-06-17 16:45:48 +08:00
yhaili 81a7fa8e45 1、数据权限-支持本人数据(权限控制可选:仅部门、仅本人、部门+本人)
2、数据权限-支持自动注入和手动注入(在xml中通过点位符注入)
3、数据权限-支持字段名及表别名设置
2020-06-17 14:43:28 +08:00
lengleng b52030f56d ✨ Introducing new features. closed #1391 GET请求支持时间字符串到JAVA8对象的自动转换 2020-06-17 11:30:33 +08:00
lengleng c0dee9a37c 🗃️ 执行数据库相关的变化. 租户隔离增加客户端表
🗃️ 执行数据库相关的变化. 租户隔离增加客户端表
2020-06-15 18:04:17 +08:00
lengleng 65fee3fc97 📝 Writing docs. 增加关于时间转换规则的注释 2020-06-15 13:03:39 +08:00
lengleng 18a26b4184 💡 Documenting source code. bom 正价checkstyle 插件方便关联 mvn spring-javaformat: validate 2020-06-14 18:22:17 +08:00
lengleng bd47066299 🎨 改进结构和代码格式. add spring-javaformat plugin and format all code 2020-06-14 17:59:04 +08:00
lengleng 5414983f3d 💄 Updating the UI and style files. 优化前端过期提示,强制中文 2020-06-14 17:44:43 +08:00
cj 946da3d593 后台作业默认以租户身份运行 2020-06-12 15:04:06 +08:00
cj 88c9ea6409 租户上下文维护优化 2020-06-12 14:10:49 +08:00
lengleng 533b985749 ✨ Introducing new features. 网关支持 sentinel 2020-06-11 22:50:17 +08:00
lengleng 6362d16783 ✨ Introducing new features. sentinel 统一降级处理 2020-06-09 21:50:46 +08:00
lengleng dfdd11c0f4 🗃️ 执行数据库相关的变化.
🗃️ 执行数据库相关的变化.

🗃️ 执行数据库相关的变化.
2020-06-09 16:34:51 +08:00
lengleng de263a7630 🔒 Fixing security issues. 微信模块权限完善,SQL 维护、token 过期提示优化 2020-06-09 12:02:02 +08:00
lengleng d1b2fc2e2b ♻️ Refactoring code. 优化 Jackconfig 避免spring boot admin json 输出异常 2020-06-06 14:26:38 +08:00
lengleng 23c771747e 🔥 Removing code or files. 删除 topology-view ,spring boot 2.3.0 支持配置 2020-06-06 09:59:53 +08:00
lengleng a5437968b9 ⚡ 优化 #1337 社交登录用户凭证已过期 2020-06-04 12:24:39 +08:00
lengleng d90a021659 ⬆️ spring boot 2.3.0 | spring cloud hoxton sr5 | mybatis-plus 3.3.2 2020-06-02 16:20:12 +08:00
pig666 a800457f7a ♻️ Refactoring code. 优化配置参数 2020-05-30 12:26:28 +08:00
pig666 d7bb25f416 Merge remote-tracking branch 'origin/very_pig' into leng_dev 2020-05-30 10:11:38 +08:00
pig666 556ce21343 🐛 Fixing a bug. #1310 解决sequence生成序列号,多租户覆盖的问题 2020-05-29 21:51:41 +08:00
cj 6062f31223 client头解析失败不抛出异常 2020-05-28 18:24:19 +08:00
cj 8fc71b3eff 修复了一个难以言表而又不得不修复的问题 2020-05-28 18:24:19 +08:00
pig666 f551280606 ⏪ Reverting changes. 回滚关于 #1287 移除DataScopeInterceptor中的plugin和setProperties多余重写方法 2020-05-27 12:09:06 +08:00
pig666 7b6293e9ea ⬆️ Upgrading dependencies. 验证码插件升级至1.2.0 支持support.pig4cloud.com 2020-05-27 11:45:11 +08:00
pig666 9914a6b001 🐳 Work about Docker. 优化 mp 启动时间晚于 upms 2020-05-26 09:14:07 +08:00
pig666 346d3f81c3 ⬆️ Upgrading dependencies. knife4j 2.0.3 2020-05-26 09:08:48 +08:00
liwen 8d6398bb4d 移除DataScopeInterceptor中的plugin和setProperties多余重写方法。 2020-05-26 08:14:25 +08:00
冷冷 c9c3f6a383 Merge branch '858695266_dev' of 858695266/pigx into leng_dev 2020-05-25 11:26:02 +08:00
SaintLoong e4922681a7 pathStyleAccess 采用nginx反向代理或者AWS S3 配置成true,支持第三方云存储配置成false
文案错误
2020-05-25 11:11:05 +08:00
SaintLoong 2c03f084e3 增加配置参数pathStyleAccess
采用非nginx但想代理或者AWS S3 配置成true,支持第三方云存储配置成false
2020-05-25 11:06:03 +08:00
pig666 12c86e9992 🐛 Fixing a bug. #1209 新建用户 登录后,部门管理和添加用户时,获取到的部门树数据为空 2020-05-24 19:44:21 +08:00
pig666 0586f3958e ✨ Introducing new features. #1279 Spring Cloud Gateway 全局通用异常处理 2020-05-24 19:43:34 +08:00
pig666 a504f00b64 Merge remote-tracking branch 'origin/very_pig' into leng_dev 2020-05-24 17:28:56 +08:00
pig666 b72b8c2526 Merge remote-tracking branch 'origin/very_pig' into leng_dev 2020-05-24 17:24:04 +08:00
chenjun e5c3a8f5d2 数据权限健壮性处理 2020-05-23 23:36:43 +08:00
chenjun 8d659cff85 支持无权限用户的身份证 2020-05-23 23:04:30 +08:00
pig666 65003cfb82 💄 Updating the UI and style files. 调整 get 查询校验 view ,防止越权 2020-05-23 14:37:37 +08:00
pig666 7b77575a13 Merge remote-tracking branch 'origin/lucky_dev' into leng_dev_wx 2020-05-23 14:35:08 +08:00
lzg 19cd0c09d4 ♻️ Refactoring code. common-minio -> common-oss 支持V3协议 OSS 2020-05-23 14:25:29 +08:00
pig777 7103be131c Merge branch '858695266_oss' of 858695266/pigx into leng_dev_wx 2020-05-23 12:27:16 +08:00
SaintLoong ee73cde0e7 aws-s3 通用存储操作
支持所有兼容s3协议的云存储: {阿里云OSS,腾讯云COS,七牛云,京东云,minio 等}
自定义域名只有直接返回cdn文件链接需要,现在pigx直接读取文件流到服务器,暂时无用,功能没添加
2020-05-23 09:11:21 +08:00
cj 2dfd732d04 JVM 参数可配置 2020-05-22 17:44:41 +08:00
lengleng 53390e748d ⚡ 优化. image code check path -> /code/check 2020-05-19 19:43:21 +08:00
lengleng 7e6d641e4e ⚡ 优化. @Autowired --> @RequiredArgsConstructor 2020-05-19 18:22:37 +08:00
lengleng 6a28df8884 ✨ Introducing new features. #1245 升级验证码实现支持 行为验证码 2020-05-19 13:27:46 +08:00
lengleng 4725c30dfc 🐛 Fixing a bug. #1241 流程管理中 新增流程图保存时租户信息会自动变为1 2020-05-19 13:27:04 +08:00
lengleng 65c4d10630 ✨ Introducing new features. #1231 表单设计器支持生成代码预览功能 2020-05-18 15:13:10 +08:00
Lucky 8cbef7f43d ⚡ 优化。 修复权限get 2020-05-18 11:05:52 +08:00
Lucky e74e713256 ⚡ 优化。 修正描述,快速禁用Swagger2 2020-05-18 10:57:13 +08:00
Lucky 4d805b172a 🔒 修复安全问题. 安全测试【越权访问】。使用非admin账号且没有获取菜单的权限账号(test),进行接口调用,可以调通获取信息。 2020-05-18 10:53:34 +08:00
Lucky 04353a43b7 Merge branch 'leng_dev' of https://git.pig4cloud.com/pigx/pigx into lucky_dev
 Conflicts:
	docker-compose.yml
2020-05-18 10:51:35 +08:00
torvalds 1b6a129d94 ✨ Introducing new features. #1214 【优化】 接口对外暴露,不校验 Authentication Header 头 2020-05-15 16:26:24 +08:00
torvalds 63789c5499 ✨ Introducing new features. 支持支付参数配置 集群化和更改所有是实例修改 2020-05-15 11:08:02 +08:00
torvalds ca186459a8 ⬆️ Upgrading dependencies. #1213 up spring boot admin 2.2.3 2020-05-15 10:50:29 +08:00
torvalds 9d964a2224 ♻️ Refactoring code. 编码设置为utf8 2020-05-14 23:49:59 +08:00
torvalds 6bf616cda0 🐛 Fixing a bug. #1209 新建用户 登录后,部门管理和添加用户时,获取到的部门树数据为空 2020-05-14 20:16:13 +08:00
cj c347577bb6 AES解密NPE 2020-05-13 18:02:51 +08:00
冷冷 e192c729e6 🐛 Fixing a bug. 统一登录错误提示乱码 2020-05-13 16:07:53 +08:00
冷冷 7b578b5549 ♻️ Refactoring code. 增强微信模块功能,支持素材 回复等 2020-05-13 14:46:10 +08:00
冷冷 57223bc514 ⏪ Reverting changes. 继续保留 register tomcat 配置,后边优化 2020-05-13 14:45:30 +08:00
冷冷 166e52a779 🔥 Removing code or files. 删除无用 test 2020-05-12 18:57:19 +08:00
冷冷 95cf1da439 ♻️ Refactoring code.#1194 调整pigx-common-bom 优先级,dependencyManagement 最高 #1195 升级 mysql 8.0.20 2020-05-12 18:37:55 +08:00
冷冷 c1b89f1b21 ✨ Introducing new features. #1187 pigx-register 使用 undertow ,去除 tomcat 统一容器 2020-05-12 15:38:46 +08:00
冷冷 98e2dea7c6 ♻️ Refactoring code. #1189 服务端设置 直接读取参数配置表,增加统一统一工具 2020-05-12 12:35:08 +08:00
冷冷 a765abcbc9 ✨ Introducing new features.#1185 up spring cloud hoxton sr4 or sr5 2020-05-11 08:40:20 +08:00
冷冷 0a5473a631 Merge remote-tracking branch 'origin/docker-bd' into leng_dev_wx 2020-05-10 19:03:34 +08:00
chenjun f8491cc4a3 💄 docker镜像构建优化 2020-05-09 21:45:08 +08:00
冷冷 b6f928e5ff ✨ Introducing new features.#1169 升级 Spring Boot 2.2.7 2020-05-08 15:04:53 +08:00
冷冷 25b172e7f6 ✨ Introducing new features. 完善 微信模块功能 2020-05-06 09:08:43 +08:00
冷冷 a6f0bbd169 Merge branch 'master' into leng_dev_wx 2020-05-01 21:01:17 +08:00
冷冷 2cbcea03f6 💄 Updating the UI and style files. #1139 pigx 代码生成菜单SQL 新增租户字段 2020-04-29 17:49:57 +08:00
冷冷 1a71ea92ff 💄 Updating the UI and style files. #1139 pigx 代码生成菜单SQL 新增租户字段 2020-04-29 17:07:09 +08:00
冷冷 9f88be07dd 🐛 Fixing a bug. #1133 check_token 没有区分租户 导致client查询报空指针异常 2020-04-29 11:24:03 +08:00
冷冷 3af4a03e10 ♻️ Refactoring code. 微信管理 2020-04-27 18:36:55 +08:00
冷冷 b864c748b6 🐛 Fixing a bug. #1120 代码生成的数据源checkDataSource是否应该关闭connection 2020-04-27 16:02:22 +08:00
冷冷 1af2a227b2 Merge branch 'dev' of https://git.pig4cloud.com/pig/pigx into leng_dev 2020-04-27 15:48:31 +08:00
冷冷 bf06eb9e5d Merge branch 'master' of 2276811600/pigx into dev 2020-04-27 15:47:36 +08:00
xiaohan815 9aee7740f6 checkDataSource之后关闭connection 2020-04-27 12:09:12 +08:00
冷冷 6cba0a8ba6 ♻️ Refactoring code. 数据权限扩展支持 mybatis-plus 自带方法 2020-04-26 20:04:13 +08:00
冷冷 6f50d63fdc ⬆️ Upgrading dependencies. #1117 up hutool 5.3.1 2020-04-26 08:40:53 +08:00
冷冷 bbe0f0664b 🔖 Releasing / Version tags. 3.9.0-SNAPSHOT 2020-04-25 08:06:06 +08:00
冷冷 259d971155 ⏪ Reverting changes. 代码回滚,修复 代码生成丢失路径 2020-04-23 22:02:29 +08:00
冷冷 1ecb6ceada 💄 Updating the UI and style files. #1054 【重构】 登录流程简化,减少DB 访问 2020-04-20 10:25:06 +08:00
冷冷 b5b6594cb2 Merge branch 'master' into leng_dev 2020-04-20 10:03:04 +08:00
冷冷 e470d9f6ed 💄 Updating the UI and style files. #1054 【重构】 登录流程简化,减少DB 访问
💄 Updating the UI and style files. #1054 【重构】 登录流程简化,减少DB 访问
2020-04-20 10:01:48 +08:00
冷冷 357e2d8ab2 ⬆️ Upgrading dependencies. #1084 up transmittable-thread-local 2.11.4 2020-04-20 10:01:14 +08:00
冷冷 bd7bb907a5 ⬆️ Upgrading dependencies. #1083 up hutool 5.3.1
⬆️ Upgrading dependencies. #1083 up hutool 5.3.1
2020-04-20 10:01:14 +08:00
冷冷 8f4fd33626 🐳 Work about Docker. 统一docker base 镜像 2020-04-20 10:01:14 +08:00
冷冷 3c5278af92 🐛 Fixing a bug. 已合并 !52 全局异常处理validation Exception 2020-04-20 10:01:14 +08:00
冷冷 f7ef5091ea ♻️ Refactoring code. 重构@Cacheable unless 条件 2020-04-20 10:01:14 +08:00
冷冷 fa7fe40dda 🗃️ 执行数据库相关的变化. 优化增量脚本 2020-04-20 10:01:13 +08:00
冷冷 7b5a465065 🐳 Work about Docker. 维护 xxl-job 的docker 坐标 2020-04-20 10:01:13 +08:00
lishangbu 7e91c816f0 ⬆️ Upgrading dependencies.升级xxl-job2.2.0 2020-04-20 10:01:13 +08:00
lishangbu 96e0aa80e9 ⬆️ Upgrading dependencies.升级xxl-job2.2.0 2020-04-20 10:01:13 +08:00
冷冷 c55577baa1 💄 Updating the UI and style files. #1054 【重构】 登录流程简化,减少DB 访问 2020-04-20 09:22:32 +08:00
冷冷 fd604741fa ⬆️ Upgrading dependencies. #1084 up transmittable-thread-local 2.11.4 2020-04-19 23:11:22 +08:00
冷冷 e2ae2b50b4 ⬆️ Upgrading dependencies. #1083 up hutool 5.3.1
⬆️ Upgrading dependencies. #1083 up hutool 5.3.1
2020-04-19 22:48:06 +08:00
冷冷 b0aa221fce 🐳 Work about Docker. 统一docker base 镜像 2020-04-18 18:30:38 +08:00
冷冷 1a2dd7eb77 🐛 Fixing a bug. 已合并 !52 全局异常处理validation Exception 2020-04-18 18:29:49 +08:00
冷冷 0d343fed34 ♻️ Refactoring code. 重构@Cacheable unless 条件 2020-04-16 10:23:58 +08:00
冷冷 f96ddc9827 🗃️ 执行数据库相关的变化. 优化增量脚本 2020-04-16 10:23:34 +08:00
冷冷 08dabc6364 🐳 Work about Docker. 维护 xxl-job 的docker 坐标 2020-04-15 23:01:06 +08:00
lishangbu eac1750c94 ⬆️ Upgrading dependencies.升级xxl-job2.2.0 2020-04-15 22:13:57 +08:00
lishangbu 5ab845a6d5 ⬆️ Upgrading dependencies.升级xxl-job2.2.0 2020-04-15 22:09:01 +08:00
冷冷 d298f83a25 Merge branch 'leng_dev' 2020-04-13 23:06:06 +08:00
冷冷 3a94c9db52 🗃️ 执行数据库相关的变化. v3.7 to v3.8 增量脚本 2020-04-13 23:05:44 +08:00
冷冷 37356e2107 ♻️ Refactoring code. #1054 【重构】 登录流程简化,减少DB 访问 2020-04-13 21:20:47 +08:00
冷冷 8a2315374a 🔖 Releasing / Version tags. 3.8.0
🔖 Releasing / Version tags. 3.8.0

🔖 Releasing / Version tags. 3.8.0
2020-04-11 20:09:20 +08:00
冷冷 47af02a912 🔖 Releasing / Version tags. 3.8.0
🔖 Releasing / Version tags. 3.8.0
2020-04-11 18:17:49 +08:00
冷冷 ed32de0dd8 🔥 Removing code or files. 删除无用导入 2020-04-11 11:52:02 +08:00
冷冷 853eca7abd Merge remote-tracking branch 'origin/lisb_dev' into leng_dev 2020-04-11 11:48:41 +08:00
冷冷 8e19a9e0e9 🔥 Removing code or files. 删除 feign 文件上传demo 2020-04-11 09:12:47 +08:00
冷冷 5c0dadb6f6 ♻️ Refactoring code. security 成功事件健壮性判断 2020-04-11 09:12:20 +08:00
冷冷 ef7f08369e ⬆️ Upgrading dependencies. spring cloud alibaba 2.2.1 2020-04-10 19:30:08 +08:00
冷冷 30d1a798c2 ✨ Introducing new features. 增加 请求header 变量避免,check-token 返回xml 无法解析 2020-04-10 18:27:58 +08:00
冷冷 ce58c8d7c7 nacos 1.2.1 2020-04-10 16:41:52 +08:00
冷冷 6231887d25 nacos 1.2.1 2020-04-10 16:38:24 +08:00
lishangbu 39fb1a223a 🔥 Removing code or files. 移除过时文件
🚚 Moving or renaming files.统一前端展示对象类名大小写
2020-04-09 17:50:26 +08:00
lishangbu 5b32422491 ♻️ Refactoring code.显式指定时区,避免执行环境影响 2020-04-09 16:11:15 +08:00
冷冷 93e8c14766 ✨ Introducing new features. 菜单支持租户隔离 2020-04-08 18:21:11 +08:00
冷冷 3b9568bb46 ✨ Introducing new features. 支持前后端 sso 的退出,回调 2020-04-06 11:34:20 +08:00
冷冷 1e81e0d25d ✨ Introducing new features. 返回菜单ID,前端菜单修改,支持局部刷新 2020-04-06 11:33:39 +08:00
冷冷 f5f30eb891 Merge remote-tracking branch 'origin/leng_dev' into leng_dev 2020-04-03 18:39:57 +08:00
冷冷 bdb215c2f1 🎨 Improving structure / format of the code. 删除无用引入和格式调整 2020-04-03 18:39:40 +08:00
冷冷 18e20503f2 🔥 Removing code or files.删除无用注解,避免重复引入 2020-04-03 18:38:49 +08:00
冷冷 3f8e684287 💄 Updating the UI and style files. 秘钥类型唯一性判断 2020-04-02 16:59:44 +08:00
冷冷 fb9aac9028 ✨ Introducing new features. #981 租户优化支持更多表的数据隔离
✨ Introducing new features. #981 租户优化支持更多表的数据隔离
2020-04-02 12:59:18 +08:00
冷冷 d9022b782c 🐛 Fixing a bug. #978 配置文件中 ${MYSQL-USER:root} 等 修改为 MYSQL_USER
🐛 Fixing a bug. #978 配置文件中 ${MYSQL-USER:root} 等 修改为 MYSQL_USER
2020-04-02 12:43:29 +08:00
冷冷 81696d9e60 🔥 Removing code or files. 删除租户路由隔离 2020-04-01 18:13:58 +08:00
冷冷 15d3fefbbe 💄 Updating the UI and style files. token 过期输出信优化 2020-04-01 17:12:55 +08:00
冷冷 73d4f73ccc ⏪ Reverting changes. 回滚代码,路由表不区分租户 2020-04-01 17:12:30 +08:00
冷冷 5c10898c73 🗃️ 执行数据库相关的变化, 多租户相关表维护 2020-04-01 11:27:39 +08:00
冷冷 9289886f45 🐛 Fixing a bug. #993 cloud-gateway 3.7版本yml配置 spring.cloud.loadbalancer.ribbon.enabled = false 2020-04-01 10:55:33 +08:00
冷冷 e2b5259226 🐛 Fixing a bug. #960 pigx-common-minio里MinioTemplate类-getAllObjectsByPrefix方法出现死循环 2020-03-26 12:05:13 +08:00
冷冷 cedd7eb91a ✨ Introducing new features. 登录日志保存 2020-03-25 21:33:58 +08:00
冷冷 f3bbb4295d ♻️ Refactoring code. 增强租户隔离,客户端、路由 、菜单支持租户隔离
♻️ Refactoring code. 增强租户隔离,客户端、路由 、菜单支持租户隔离
2020-03-25 15:48:37 +08:00
冷冷 611596506d ✨ 添加新特性。 添加 feign endpoint 2020-03-25 12:10:53 +08:00
冷冷 d06618ae36 ⚡ 优化, map init size 4 2020-03-25 12:10:14 +08:00
冷冷 778aa9431f ⬆️ Upgrading dependencies. hutool 5.2.4 2020-03-25 12:09:40 +08:00
冷冷 fd3326602b 🔥 Removing code or files. 删除 elastic-job 2020-03-24 17:22:12 +08:00
冷冷 53700d6f63 Merge remote-tracking branch 'origin/leng_dev' into leng_dev
# Conflicts:
#	pom.xml
2020-03-22 15:10:29 +08:00
冷冷 07546318a5 ⬆️ Upgrading dependencies. hutool 5.2.3 fastjson 1.2.67 2020-03-22 15:09:58 +08:00
冷冷 12c90c9542 🐛 Fixing a bug.#909 开发平台的数据源管理中新建数据源没有存下租户id 2020-03-19 10:50:42 +08:00
冷冷 e9676c01cb 🐛 Fixing a bug.#904 代码生成前端xxx-form.vue生成命名与index.vue引用不一致 2020-03-18 10:22:13 +08:00
冷冷 bbfa067f95 🐛 Fixing a bug.#894 前端条件搜索会自动带入当前页码进去导致查不出数据 2020-03-15 16:03:42 +08:00
冷冷 0eb05bf7fc 👌 Updating code due to code review changes. p3c 代码审查 2020-03-14 12:22:43 +08:00
冷冷 312a8e57d4 🐛 Fixing a bug.#888 xxl-job启动报错 Address already in use: bind 2020-03-14 12:21:56 +08:00
冷冷 7906f4b74b ✨ Introducing new features. #864 【灰度路由】swagger 调试灰度路由功能 2020-03-13 13:03:54 +08:00
冷冷 660cc073e9 ♻️ Refactoring code. pigx-common-ds 依赖项调整 2020-03-13 13:03:00 +08:00
冷冷 431687b00e ♻️ Refactoring code. 数据源管理,不在默认引入数据源配置 2020-03-11 15:34:05 +08:00
冷冷 758c7f0d0a Merge branch 'big' into leng_dev
# Conflicts:
#	pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/MenuTree.java
#	pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/TreeUtil.java
2020-03-11 15:33:13 +08:00
冷冷 6ef83182dd Merge branch 'master' into big 2020-03-10 11:14:43 +08:00
冷冷 e98f5a922d #820 【菜单管理】新增按钮 > 权限 无法保存 & 修复方案 2020-03-10 11:14:29 +08:00
冷冷 95028e8f52 #825 3.7 token 刷新空指针问题 & 修复方案 2020-03-10 11:10:04 +08:00
冷冷 6754db99f9 ⬆️ Upgrading dependencies. Knife4j 2.0.2 正式发布,Swagger 接口文档赋能工具 2020-03-09 11:05:47 +08:00
冷冷 8322ac6f87 ⚡ 优化。 sso-client-demo 不在依赖 spring cloud 组件 2020-03-05 16:15:22 +08:00
冷冷 9e7b190cd0 🐛 Fixing a bug. #825 3.7 token 刷新空指针问题 & 修复方案 2020-03-04 16:31:28 +08:00
冷冷 e1cca0d224 Merge branch 'dev' into leng_dev 2020-03-04 10:45:23 +08:00
lishangbu 844ed45c26 ⬆️ Upgrading dependencies.移除过时依赖项目spring platform 2020-03-04 10:40:50 +08:00
冷冷 541aa33833 🐛 Fixing a bug. #50 spring-platform项目已经停止支持,建议移除 2020-03-04 10:31:38 +08:00
lishangbu e130cae470 ♻️ Refactoring code.调整调度作业包名gray->job 2020-03-04 10:10:01 +08:00
lishangbu 4f91b7fc3d 🚚 Moving or renaming files.event单词拼写错误 2020-03-03 22:11:41 +08:00
冷冷 750fc431f3 🔖 Releasing / Version tags. 3.8.0.BUILD-SNAPSHOT 2020-03-03 17:18:07 +08:00
冷冷 d883e11fac 🐛 Fixing a bug. #820 【菜单管理】新增按钮 > 权限 无法保存 2020-03-03 17:17:22 +08:00
冷冷 f587ca0ba8 📝 Writing docs. README.md 2020-02-28 17:10:51 +08:00
冷冷 af19ac7baf ✨ 添加新特性.  pigx-common-feing 支持META-INF 自动导入 2020-02-28 15:19:27 +08:00
冷冷 8904c39e81 🐛 Fixing a bug. #793 租户查询缓存问题 2020-02-28 13:56:47 +08:00
冷冷 cec6c67d93 📝 Writing docs. 工单描述修改 2020-02-28 13:12:17 +08:00
冷冷 9643bc4803 🐳 Work about Docker. xxl port 9080 2020-02-26 12:16:43 +08:00
冷冷 8c1b5dc435 ⬆️ Upgrading dependencies. spring cloud hoxton.sr2 2020-02-26 10:35:13 +08:00
冷冷 e0bd6f7c06 🐛 Fixing a bug. #787 【优化】希望能统一一下 createTime,updateTime的字段类型 2020-02-24 22:54:06 +08:00
冷冷 79823b6029 🐛 Fixing a bug. #793 租户查询缓存问题 2020-02-24 22:53:14 +08:00
冷冷 e814feecab Merge remote-tracking branch 'origin/fix_982' into dev 2020-02-24 22:23:42 +08:00
冷冷 dcc969bf32 Merge remote-tracking branch 'origin/fix_793' into dev 2020-02-24 22:23:37 +08:00
冷冷 5247b128f9 文件读取异常,不输入堆栈 2020-02-24 20:03:22 +08:00
冷冷 801be657ad sql 修正SQL 脚本 2020-02-24 20:03:04 +08:00
冷冷 7e2e266096 🆙 hutool 5.1.4 2020-02-24 20:02:42 +08:00
chenjun 1473edae68 🐛 Fixing a bug. #793 租户查询缓存问题 2020-02-24 19:40:16 +08:00
冷冷 cbc584cfb2 ♻️ Refactoring code. 部署失败,错误抛出 2020-02-21 16:55:25 +08:00
冷冷 1ad9097831 🐳 Work about Docker. 工作流模块base pig4cloud/java8 2020-02-21 16:55:01 +08:00
冷冷 67fb16e787 ⬆️ Upgrading dependencies. mysql 8.0.19 2020-02-21 16:54:31 +08:00
冷冷 b3b0da8a95 🗃️ 执行数据库相关的变化, 增加数据字典,代码生成数据库变更 2020-02-20 22:08:09 +08:00
冷冷 0d27c9e3da 🔒 Fixing security issues. [Security Bug]Sql injection on page pagination!!! 2020-02-20 19:01:51 +08:00
冷冷 c0faa3d075 ♻️ Refactoring code. 顶部菜单优化 2020-02-18 11:35:53 +08:00
冷冷 a67550857a ♻️ Refactoring code. 菜单管理重构 2020-02-17 20:28:52 +08:00
冷冷 7687afd19a 🐛 Fixing a bug. 代码生成模板命名错误
🐛 Fixing a bug.  代码生成模板命名错误
2020-02-17 13:13:26 +08:00
冷冷 caf14ff5f9 🐛 Fixing a bug. #766 auth模块下的inner注解失效 2020-02-15 13:06:01 +08:00
冷冷 11af631b32 ⬆️ Upgrading dependencies. spring cloud alibaba 2.2.0 2020-02-13 13:46:07 +08:00
冷冷 1635fadc38 ⬆️ Upgrading dependencies. spring cloud alibaba 2.2.0 2020-02-12 15:57:01 +08:00
冷冷 49966b1096 ♻️ Refactoring code. 优化代码生成 2020-02-12 13:26:26 +08:00
冷冷 934f2ec361 🐛 Fixing a bug. #753 413 (Request Entity Too Large) 2020-02-10 22:29:27 +08:00
冷冷 f0d18f82d5 ✨ 添加新特性. pigx-common-feing 支持META-INF 自动导入 2020-02-09 21:18:37 +08:00
冷冷 9f22f3e999 #743 【重构】Mapper 去掉@MapperScan配置,手动增加@Mapper 新特性 2020-02-09 21:17:43 +08:00
冷冷 100289dc2b ♻️ Refactoring code. #743 【重构】Mapper 去掉@MapperScan配置,手动增加@Mapper 2020-02-08 17:32:23 +08:00
冷冷 029b90b237 ✨ Introducing new features. 重构代码生产 多数据源功能 2020-02-07 13:03:59 +08:00
Lucky f6aff482a2 🐳 Work about Docker.   完善脚本 2020-02-07 03:10:30 +08:00
冷冷 d0716c22f0 Merge remote-tracking branch 'origin/liuyes_dev' into leng_feat_dy_ds 2020-02-06 17:32:00 +08:00
冷冷 432335d17e up: spring-cloud-maven-plugin version 1.1.1 2020-02-06 16:30:58 +08:00
冷冷 d2db31e9be sql: 修改默认角色的数据权限an 2020-02-06 16:15:56 +08:00
冷冷 28e390975e 新特性: 部门树增加 数据权限过滤 2020-02-06 16:15:03 +08:00
冷冷 65604d745a ♻️ Refactoring code. 退出令牌重构 2020-01-30 12:40:15 +08:00
冷冷 6bb7aff4ad ⬆️ Upgrading dependencies. spring boot 2.2.4 & mybatis-plus 3.3.1 2020-01-30 12:39:56 +08:00
冷冷 2a839a56f0 ✨ Introducing new features. 代码生成支持 element 原生 2020-01-30 12:39:17 +08:00
冷冷 7a815e6d4c 🐳 Work about Docker. 修改docker 时区问题 2020-01-30 12:38:26 +08:00
冷冷 619f5ffab4 🐳 Work about Docker. 修改docker context 2020-01-18 16:42:40 +08:00
chenjun ec6abd4eac speed up maven plugin download 2020-01-16 21:20:50 +08:00
冷冷 1d12327219 ⏪ Reverting changes. cache revert 2020-01-12 20:16:07 +08:00
冷冷 ca455ceade ⬆️ Upgrading dependencies. 添加灰度 pigx-common-gray 依赖
🐛 Fixing a bug. gray feign request

🐛 Fixing a bug. gray feign request
2020-01-12 18:47:40 +08:00
冷冷 93fdad4dd0 ✨ Introducing new features. 支持全局的服务灰度路由 2020-01-12 15:57:04 +08:00
冷冷 006cbbb953 ✨ Introducing new features. 登录敏感参数支持 post body 2020-01-08 21:56:41 +08:00
冷冷 b5152a2c80 🐳 Work about Docker. edit docker-compose.yml 2020-01-07 12:38:03 +08:00
冷冷 933f986ba0 ✨ Introducing new features. 支持非web 环境使用 分布式事务 2020-01-03 15:53:55 +08:00
冷冷 d63c8c925c 🔖 Releasing / Version tags.3.6.0
🔖 Releasing / Version tags. 3.6.0
2020-01-01 11:10:51 +08:00
冷冷 5dbfc2ae14 ⬇️ Downgrading dependencies. xxl-job 2.1.1 2019-12-31 14:51:00 +08:00
冷冷 e77ca97b39 📝 Writing docs. 优化docker-compose xxl-job jdbc 2019-12-31 14:02:51 +08:00
冷冷 f5d407d2de 🗃️ 执行数据库相关的变化, nacos 数据库相关 2019-12-31 13:04:06 +08:00
冷冷 3019ece8c3 ♻️ Refactoring code. 重构SQL 2019-12-31 10:24:07 +08:00
冷冷 8704c75843 🚨 Removing linter warnings. 删除无用引入 2019-12-31 10:23:42 +08:00
冷冷 cf0967cd4d ✨ #846 Knife4j 2.0 发布,涅槃重生~! 新特性 2019-12-31 10:20:16 +08:00
冷冷 63f297704c ✨ #891 Spring Boot Admin 2.2.1 发布; #866 升级hutool 5.1.0; #865 升级 Spring Cloud Hoxton.SR1;#846 Knife4j 2.0 发布,涅槃重生~! 新特性 2019-12-31 10:19:55 +08:00
冷冷 f674374be2 ✨ #791 升级 XXL-JOB 2.1.2 版本 2019-12-31 10:18:28 +08:00
冷冷 cbef9c8ec6 ✨ #863 权限扩展 pms.hasPermission('A','B') 支持多个权限标识判断 2019-12-31 09:22:47 +08:00
liuyes be502be2b3 修改说明文件 2019-12-20 21:12:59 +08:00
liuyes 7687eb1348 增加说明文件 2019-12-20 21:03:52 +08:00
liuyes 882b1c8a64 增加pigx-code模块,使用dynamic-datasource实现多数据源 2019-12-20 20:44:03 +08:00
冷冷 8f9ba8cb35 🐛 Fixing a bug. MinioEndpoint 无效 2019-12-17 17:36:12 +08:00
冷冷 152267193e 🐳 Work about Docker. edit dockerfile 2019-12-12 13:25:52 +08:00
冷冷 fbca4f45de ♻️ Refactoring code. avue searchchange done 2019-12-11 19:48:19 +08:00
冷冷 90c13a4082 ⬆️ spring boot 2.2 logging.file -> logging.file.name 2019-12-11 19:01:30 +08:00
冷冷 9c10e524d7 ⬆️ Upgrading dependencies. hutool 5.0.7 2019-12-11 17:53:01 +08:00
冷冷 cf4d00e2ed 💄 Updating the UI and style files. 表格 默认隐藏搜索 2019-12-11 17:41:12 +08:00
冷冷 8b44dbbeaf ♻️ Refactoring code. 数字计算图形化 2019-12-11 12:53:20 +08:00
冷冷 2ad1ded684 🔥 Removing code or files. remove not use test 2019-12-10 22:01:49 +08:00
冷冷 7bc5881d95 fix: #793 数据翻页没有传递pageSize 参数绑定有问题 2019-12-10 21:01:40 +08:00
冷冷 4845159dba ⬆️ Upgrading dependencies. xxl-job-admin 2.1.1 2019-12-09 21:24:43 +08:00
冷冷 208b862b2b ⬆️ Upgrading dependencies.mybatis 3.3.0 2019-12-09 13:03:15 +08:00
冷冷 616273166f ⬆️ Upgrading dependencies.spring 2.2.2 2019-12-08 15:04:38 +08:00
冷冷 823f230009 ⬆️ Upgrading dependencies. Hoxton + Alibaba 2.2.1 + sba 2.2.0 2019-12-05 18:36:12 +08:00
冷冷 8ee85ca1a0 🔥 Removing code or files. 删除无用UI 工具,SBA 2.2 支持中文国际化 2019-12-05 18:35:40 +08:00
冷冷 079d66ad65 🔖 Releasing / Version tags. 3.6.0-snapshot greenwich sr4 2019-11-21 07:33:36 +08:00
冷冷 aac03a8565 ♻️ Refactoring code.@SneakyThrows 2019-11-21 07:28:16 +08:00
冷冷 d07542f30c Merge remote-tracking branch 'origin/dev' into leng_dev 2019-11-21 07:26:26 +08:00
xuzihui 812de4749d #783 【新特性】数组格式统一优化 2019-11-20 22:18:56 +08:00
liuyes 475b0b1c8f 修改说明 2019-11-20 08:29:09 +08:00
liuyes 0c493bad14 增加动态多数据源示例项目 2019-11-20 08:20:58 +08:00
冷冷 c7475f88ce ⬆️ Upgrading dependencies. hutool 5.0.5 2019-11-13 21:15:25 +08:00
冷冷 af01e7403f 🗃️ 执行数据库相关的变化.websocket sql 变化 2019-11-12 07:55:58 +08:00
冷冷 2de123901b 🗃️ 执行数据库相关的变化.删除代码生成无用的数据 2019-11-10 17:48:25 +08:00
冷冷 ba366834f9 ✨ Introducing new features.菜单显示调整 2019-11-10 17:30:19 +08:00
冷冷 c551912488 feat(pigx-common-data): #749 【新功能】增强 cache 组件 cacheName 时长支持单位
Closes #749
2019-11-09 18:50:06 +08:00
冷冷 07c20f36c9 fix(pigx-common-job): #751 XxlJobAutoConfiguration类注解冗余
Closes #751
2019-11-09 18:37:01 +08:00
冷冷 4d1a30c34d ⬆️ Upgrading dependencies. spring boot 2.1.10 2019-11-07 17:21:56 +08:00
冷冷 708d2ef031 🗃️ 执行数据库相关的变化. 数据库脚本变化 2019-11-07 10:58:28 +08:00
冷冷 89b8074f37 ✨ 添加新特性. spring boot admin ui 2019-11-07 09:50:59 +08:00
冷冷 de580103bb 💄 Updating the UI and style files. 修改静态资源 app 2019-11-06 22:29:35 +08:00
冷冷 f4d879dad2 🐳 Work about Docker. 2019-11-06 21:32:07 +08:00
冷冷 cbf0d1c711 🐳 Work about Docker. 2019-11-06 20:49:04 +08:00
冷冷 d6ebaf43bd 演示环境数据库 2019-11-06 19:44:15 +08:00
冷冷 70d6e957cc feat(quartz 模块): #735 升级 mybatis-plus 3.2.0 druid 1.1.21
#735 升级 mybatis-plus 3.2.0 druid 1.1.21

Closes 735
2019-11-06 19:33:48 +08:00
冷冷 e3468b5c8d 🔥 Removing code or files. 删除 hystrix 监控 2019-11-04 12:54:25 +08:00
冷冷 a16150ba59 Merge remote-tracking branch 'origin/j3_dev' into leng_dev 2019-11-03 18:10:21 +08:00
冷冷 0be9e9bc96 ✨ Introducing new features. 支持小程序登录 2019-11-03 18:09:53 +08:00
chenjun c4d3af06b9 误删了oauth客户端缓存 2019-11-02 23:26:28 +08:00
冷冷 6c910f5a53 Merge remote-tracking branch 'origin/j3_dev' into leng_dev 2019-11-01 20:24:44 +08:00
jclazz a2b36e9479 异常消息国际化支持 2019-11-01 13:33:35 +08:00
冷冷 d77d3be2cd ⬆️ Upgrading dependencies. nacos 1.1.4 2019-11-01 12:34:23 +08:00
chenjun 503dd2ad72 Merge branch 'master' into fix-663 2019-10-31 23:32:29 +08:00
chenjun c648dae172 fix #663 2019-10-31 23:23:00 +08:00
冷冷 d9e7a740cf ⬆️ Upgrading dependencies. hutool 5.0.3 druid 1.1.20 2019-10-29 10:17:16 +08:00
冷冷 33de3c1396 feat(quartz 模块): quartz 支持 sentinel
修改 beanprocess factory ,增加beanName = job_group + job_key
2019-10-25 16:17:35 +08:00
冷冷 5d1cd5de75 🐛 Fixing a bug. #613 缓存支持不区分租户 2019-10-23 09:50:16 +08:00
冷冷 93021656e2 💄 Updating the UI 修改包名称 2019-10-23 09:07:16 +08:00
冷冷 316972ba3d 📌 Pinning dependencies to specific versions. 重构maven 依赖 2019-10-19 18:17:26 +08:00
冷冷 89ec22dbab ✨ 添加新特性. 支持前端文件上传,返回link 2019-10-19 14:00:57 +08:00
冷冷 4c50a6ec11 #664 在redis-cluster模式下停用任何一个master或slave节点导致应用不能登录 help want 2019-10-19 14:00:25 +08:00
冷冷 19b1a6a574 #688 redisTemplate scan操作未关闭Cursor 2019-10-19 13:59:27 +08:00
冷冷 9cb2b48bae 📌 去除私服 . nacos-config/nacos-naming 从中央厂库获取 2019-10-13 17:52:21 +08:00
冷冷 18d03b7ce3 ✨ add pigx-sentinel-dashboard
♻️  重构包名
2019-10-12 15:49:27 +08:00
冷冷 04371e8aa0 ✨ redis-cluster support refreshing this cluster topokogy view 2019-10-12 11:35:53 +08:00
冷冷 16ed6055a4 ✨ 新特性。 sentinel -> hytrix | add pigx-common-sentinel 2019-10-11 21:42:12 +08:00
冷冷 45a6718d89 ♻️ 重构变量名称, gl@ -> gl: 方便rdm分组查看 2019-10-11 13:04:26 +08:00
冷冷 f6f56995b6 Merge branch 'master' into leng_dev 2019-10-11 11:19:34 +08:00
冷冷 a5da09d021 Merge branch 'master' of https://gitee.ltd/pigx/pigx 2019-10-11 11:16:08 +08:00
冷冷 9b916b9092 ✨ #654 quartz 配置使用Rest 调用 2019-10-11 11:15:31 +08:00
冷冷 5cb53c3e3b 🎨 改进结构和代码格式。 更新无用代码和不规范代码 2019-10-11 11:14:55 +08:00
冷冷 fa55191516 Merge branch 'j3_dev' of pigx/pigx into master 2019-10-09 16:24:28 +08:00
jclazz 47f613a758 fix #613 2019-10-09 15:04:28 +08:00
冷冷 24021e6c6d 🔖 Releasing / Version tags. 3.4.0 2019-10-07 16:44:25 +08:00
冷冷 ae38590649 🔖 Releasing / Version tags. 3.4.0 2019-10-07 09:50:29 +08:00
冷冷 c1eacbf7bf 🐳 修改dockerfile 及其compose 2019-10-07 07:31:53 +08:00
冷冷 c3b8434a83 🗃️ xxl-job 的相关依赖脚本 2019-10-07 07:31:15 +08:00
冷冷 311408da77 🎨 改进数据权限 驼峰配置 deptId --> dept_id 2019-10-07 07:17:39 +08:00
冷冷 3caba5d77a 🔧 修改swagger-bootstap-ui 为 knife4j 2019-10-06 20:51:26 +08:00
冷冷 1fe0f52848 👌 更新代码, 满足P3C 规则 2019-10-06 20:49:05 +08:00
冷冷 3ca082084b 🐛 Fixing a bug. #599 【协同办公】activiti 创建模型后,查看模型报错 2019-10-06 20:47:50 +08:00
冷冷 9e61b96980 ⬆️ Upgrading dependencies. nacos 1.1.3 2019-10-06 20:46:34 +08:00
冷冷 348b72eb74 🐛 Fixing a bug. #614 发号器sequence使用默认配置会报错 2019-10-03 06:15:51 +08:00
冷冷 45bf557b6f 🐛 Fixing a bug. 租户查询不查询缓存,避免数据不一致 2019-09-18 17:28:27 +08:00
冷冷 75a9e98c4b ♻️ 重构代码。 重构token TokenEnhancer 2019-09-18 17:27:54 +08:00
冷冷 b7b414b3f2 ✨ 添加新特性。支持 xxl-job 2019-09-18 17:27:10 +08:00
冷冷 984336923a ♻️ 重构代码。 登陆后回掉request response 2019-09-16 10:23:44 +08:00
冷冷 17b05dac26 ⬆️ Upgrading dependencies. Spring Cloud Greenwich.SR3 2019-09-16 09:51:32 +08:00
冷冷 ff1b331062 🔒 修复安全问题. 临时修复fastjson 安全问题,等待 spring cloud alibaba 升级 fix #586 2019-09-15 09:48:26 +08:00
冷冷 2dfc33d500 ⬆️ Upgrading dependencies. spring boot 2.1.8 2019-09-09 08:28:16 +08:00
冷冷 03ae63a2b9 🤡 增强数据权限 支持跨服务问题 2019-09-07 20:18:19 +08:00
冷冷 e0b2776c68 ✅ remove tests. 2019-09-04 21:45:08 +08:00
冷冷 069b8f53c1 🔥 Removing code or files. 删除无用引入 2019-09-04 21:44:48 +08:00
冷冷 f91921ed0c 🐛 Fixing a bug. #541 【turbine 监控401】“服务监控”功能异常 2019-09-04 21:43:52 +08:00
冷冷 de2be5d46d 🐛 Fixing a bug. 修复nacos 图标加载路径错误、图标读取失败问题 2019-08-31 11:05:10 +08:00
冷冷 544f91648c 🔖 Releasing / Version tags. 3.3.0 Release 2019-08-29 22:15:52 +08:00
冷冷 cf0ba9dfd3 🐳 Work about Docker. sleep time double 2019-08-29 19:02:04 +08:00
冷冷 4402814b0d 🎨 改进结构和代码格式。 pigx-common-sequence 模块增加 pigx目录 2019-08-29 14:43:11 +08:00
冷冷 d51d9559ae 🐛 Fixing a bug. #530 【定时任务】SysJobMapper.xml 字段定义错误 2019-08-29 12:00:37 +08:00
冷冷 fc0919e4aa Merge branch 'master' into leng_dev
# Conflicts:
#	pigx-auth/pom.xml
#	pigx-common/pigx-common-bom/pom.xml
#	pigx-common/pigx-common-core/pom.xml
#	pigx-common/pigx-common-data/pom.xml
#	pigx-common/pigx-common-datasource/pom.xml
#	pigx-common/pigx-common-gateway/pom.xml
#	pigx-common/pigx-common-job/pom.xml
#	pigx-common/pigx-common-log/pom.xml
#	pigx-common/pigx-common-minio/pom.xml
#	pigx-common/pigx-common-security/pom.xml
#	pigx-common/pigx-common-sequence/pom.xml
#	pigx-common/pigx-common-swagger/pom.xml
#	pigx-common/pigx-common-transaction/pom.xml
#	pigx-common/pom.xml
#	pigx-gateway/pom.xml
#	pigx-register/pom.xml
#	pigx-upms/pigx-upms-api/pom.xml
#	pigx-upms/pigx-upms-biz/pom.xml
#	pigx-upms/pom.xml
#	pigx-visual/pigx-activiti/pom.xml
#	pigx-visual/pigx-codegen/pom.xml
#	pigx-visual/pigx-daemon-elastic-job/pom.xml
#	pigx-visual/pigx-daemon-quartz/pom.xml
#	pigx-visual/pigx-monitor/pom.xml
#	pigx-visual/pigx-mp-manager/pom.xml
#	pigx-visual/pigx-pay/pom.xml
#	pigx-visual/pigx-sso-client-demo/pom.xml
#	pigx-visual/pigx-tx-manager/pom.xml
#	pigx-visual/pom.xml
#	pom.xml
2019-08-28 12:00:03 +08:00
冷冷 de5e8f638d 🔖 🔖 🔖 3.3.SNAPSHOT 快照版本 2019-08-28 11:56:37 +08:00
冷冷 e2a7b58926 🔖 🔖 🔖 3.3.0 2019-08-28 00:17:10 +08:00
冷冷 f0cce97d3a 🎨 改进结构和代码格式。 代码格式调整机器 验证码返回content-type 修改 2019-08-27 15:51:38 +08:00
冷冷 bfa08e6166 🎨 改进结构和代码格式。 修改部分P3C 不规范代码 2019-08-25 17:57:41 +08:00
冷冷 f6a5220c3e 🔥 Removing code or files. 删除无用import 2019-08-25 17:37:30 +08:00
冷冷 0ff2e3d774 ✨ 添加新特性。 动态路由 L1 L2 动态更新, redis pub/sub 事件 2019-08-25 13:10:13 +08:00
冷冷 5a752c4a1f 🐛 Fixing a bug. #510 【租户管理】初始化数据的字典项所属字典ID 未更新 2019-08-25 03:08:17 +08:00
冷冷 36b619d9da 🐛 Fixing a bug.代码生成微调 ,优化生成细节 2019-08-23 21:46:54 +08:00
冷冷 9dd89b36a3 🔥 Removing code or files. 删除无用代码 2019-08-21 22:47:14 +08:00
冷冷 cc529bdf06 Merge https://gitee.ltd/Hccake/pigx into leng_dev 2019-08-20 23:06:57 +08:00
冷冷 531d7b67a6 💄 Updating the UI and style files. form login error info 2019-08-20 23:05:10 +08:00
冷冷 68e79a35d7 ✏️ 修复拼写错误, 配置文件 多了个R 2019-08-19 16:30:22 +08:00
冷冷 ab0c01da0f 🔇 删除代码, 关于网卡配置 2019-08-19 16:23:03 +08:00
冷冷 6f51054330 ✨ 添加新特性。支持路由信息的二级缓存 2019-08-19 15:54:02 +08:00
冷冷 12277fb0a7 Merge remote-tracking branch 'origin/leng_dev' into leng_dev 2019-08-16 22:52:32 +08:00
冷冷 709d8e47f5 ♻️ 重构代码。 重构代码生成,支持路由二级缓存 2019-08-16 22:52:24 +08:00
Hccake 0a1ce03a51 1. 修改actived可以通过指定profile动态切换 2019-08-15 10:42:11 +08:00
Lucky 981ab4bd89 ⚡ 优化。 字符引入StringPool.AT方式 2019-08-11 06:01:22 +08:00
冷冷 b998215e11 Merge https://gitee.ltd/Hccake/pigx into leng_dev 2019-08-08 20:09:32 +08:00
Hccake 4ee400466c 1. 添加Quartz立刻执行定时任务方法
2. 简单抽取TaskInvok工厂类
2019-08-08 16:09:06 +08:00
Lucky c9747a4594 ⚡ 优化。 修正描述 2019-08-07 22:54:14 +08:00
冷冷 9c5d4bc4d6 🗃️ 执行数据库相关的变化。 allowPublicKeyRetrieval=true 2019-08-05 22:28:58 +08:00
冷冷 663f1b3212 🐛 Fixing a bug. fix #429 【文件管理】 pigx-common-minio 项目包名错误,缺少一层文件目录 2019-08-04 12:11:14 +08:00
冷冷 e2a1c94551 ⬆️ Upgrading dependencies, spring cloud alibaba 2.1.0 2019-08-04 12:04:46 +08:00
冷冷 d737142a7b 🐛 Fixing a bug.fix #441 【发号器模块】 SequenceAutoConfiguration 默认注入bean 逻辑判断条件错误 2019-07-27 11:08:35 +08:00
冷冷 a952ac163d Merge branch '3.2.0-bugfix' of https://gitee.ltd/237497819/pigx into leng_dev 2019-07-27 10:39:17 +08:00
冷冷 7aa7c13dbd 🐛 Fixing a bug. check_token 确实oauth active 参数,外围系统接入 check_token 失败 2019-07-27 07:43:50 +08:00
冷冷 cec7937891 ✨ 添加新特性.spring boot admin 新增登录安全认证 2019-07-26 13:16:17 +08:00
冷冷 7cf7b53ece 🐛 Fixing a bug. fix #435 【支付模块】 支付宝回调两次处理逻辑 2019-07-26 13:11:47 +08:00
冷冷 a32564ac1e 🐛 Fixing a bug. fix #435 【支付模块】 支付宝回调两次处理逻辑 2019-07-26 13:11:36 +08:00
冷冷 b231a71291 🐛 Fixing a bug. 常量upms 定义错误, 用户管理删除问题修复 2019-07-23 09:34:00 +08:00
237497819 1d9b94384c 🐛 修复自动装配参数值的问题 2019-07-22 10:11:30 +08:00
冷冷 cf2daaaa25 🔖 🔖 🔖 3.2.0 2019-07-21 20:25:03 +08:00
冷冷 1a0ce157fb 🔖 🔖 🔖 3.2.0 发布 2019-07-21 03:51:59 +08:00
冷冷 831c74364b 🔖 🔖 🔖 Releasing / Version tags. 3.2.0 2019-07-21 02:40:12 +08:00
冷冷 a50c6098f4 🐛 Fixing a bug. 租户维护缓存不清楚问题解决 2019-07-19 19:22:16 +08:00
冷冷 16261883e5 ⬆️ Upgrading dependencies. 升级nacos 1.1.0 2019-07-19 07:24:37 +08:00
冷冷 babda19050 ➖ Removing a dependency. mica 2019-07-15 18:04:57 +08:00
冷冷 c78200af7a 🐛 Fixing a bug. 支付宝支付不维护租户ID 2019-07-12 22:07:55 +08:00
冷冷 64ba722bc5 🐳 在 Docker 中运行维护docker-compose 2019-07-12 18:31:46 +08:00
冷冷 8e64466ebf 🐳 调整docker run jar 默认jvm Xmx Xms 大小 -> 4G 启动 2019-07-12 18:09:46 +08:00
冷冷 c0bb93e257 🐳 调整docker run jar 默认jvm Xmx Xms 大小 -> 4G 启动 2019-07-12 16:35:43 +08:00
冷冷 9707f08a28 🗃️ 执行数据库相关的变化。 增加pay模块脚本、dockerfile维护 2019-07-12 16:31:49 +08:00
冷冷 9af3254cc8 🐛 Fixing a bug. #367 部门管理-修改,校验注解错误@NotNull 2019-07-12 15:40:45 +08:00
冷冷 ad83a4f870 🐛 Fixing a bug.支付宝异步回调 不修改支付状态 2019-07-12 15:23:52 +08:00
冷冷 86b0cd228e 💚 修正注释文案错误问题等 2019-07-12 08:57:42 +08:00
冷冷 f8b4400897 Merge branch 'jclazz' of https://gitee.ltd/123825937/pigx into leng_dev 2019-07-08 14:00:43 +08:00
冷冷 5b01ce1c8a Merge remote-tracking branch 'origin/sakura_dev' into leng_dev
# Conflicts:
#	pom.xml
2019-07-08 13:55:37 +08:00
冷冷 439accf746 ⬆️ 依赖升级。 mybatis-plus 3.1.2 spring boot admin 2.1.6 2019-07-08 13:54:28 +08:00
chenjun 69174d3385 添加CORS配置说明 2019-07-06 13:46:26 +08:00
chenjun 68bb1351a1 网关支持CROS(可配置) 2019-07-06 13:46:02 +08:00
lishangbu 5fc406b014 🔥 Removing code or files.移除基于easyexcel的common-excel实现 2019-07-04 08:58:37 +08:00
冷冷 5b9218c083 ⚡ 优化代码注解的属性值 vm 2019-07-03 21:18:02 +08:00
冷冷 d212e884ca Merge branch 'sakura_dev' into leng_dev 2019-07-03 21:11:17 +08:00
冷冷 cebeb347bb ✨ 添加新特性。灰度发布
♻️ 重构代码。 支付回调逻辑抽象
👽 由于外部API的改变而更新代码。 更新不在维护前端
2019-07-03 21:10:03 +08:00
lishangbu 9235f30c81 ✨ Introducing new features.添加Excel导出案例 2019-07-03 17:40:00 +08:00
lishangbu 1bfff15a4e 🎨 Improving structure / format of the code.修正部分实体属性错误注释,移除菜单树实体上部分无用属性,添加swagger实体属性说明 2019-07-02 22:28:12 +08:00
冷冷 b8121b20a4 ➖ 移除依赖。 更新spring security 依赖管理 2019-07-01 18:39:39 +08:00
冷冷 a9bb7c1932 🐛 Fixing a bug. 路由规则调整,解决配置有限不生效问题 2019-06-28 16:17:40 +08:00
冷冷 b2a7c71449 🔥 Removing code or files. 删除网卡配置 2019-06-28 16:03:31 +08:00
冷冷 ac11fb5b1e 🎨 改进结构和代码格式。 优化代码生成格式 2019-06-28 15:53:09 +08:00
冷冷 e45428bc6c Merge branch 'master' of https://gitee.ltd/420154195/pigx into leng_dev 2019-06-28 09:40:22 +08:00
冷冷 ff510396d3 ♻️ 重构代码。支付回调 代码重构 2019-06-28 09:31:36 +08:00
zhangjiajia 7fb34b26e7 在生成的entity中增加swagger接口文档中属性说明注解 2019-06-27 18:31:34 +08:00
冷冷 04f620dc8a ♻️ 重构代码。 Controll 名称修改,升级 hutool 4.5.15 2019-06-27 15:02:18 +08:00
冷冷 31d0d13818 Merge branch 'dev' of https://gitee.ltd/pig/pigx into leng_dev
# Conflicts:
#	pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/MobileServiceImpl.java
2019-06-25 18:09:50 +08:00
冷冷 db5b1b2dcf Merge branch 'master' of https://gitee.ltd/1012042523/pigx into leng_dev 2019-06-25 18:06:05 +08:00
冷冷 796872022c ✨ 添加新特性。 扩展ribbon 支持IP有限策略 2019-06-25 18:05:36 +08:00
pigxcloud 002f7d41a2 🔒 修复安全问题。MyBatis-plus Order By 存在的SQL 注入问题修复 2019-06-24 22:28:54 +08:00
pigxcloud 401f25319c ♻️ 重构代码。 简化菜单配置 2019-06-24 16:37:24 +08:00
pigxcloud 572a3de60f ♻️ 重构代码。 菜单ID 生成策略修改 2019-06-24 14:53:32 +08:00
pigxcloud 6d4c194601 Merge remote-tracking branch 'origin/3.2' into 3.2 2019-06-20 18:28:24 +08:00
pigxcloud 2f2013b0df ✨ 添加新特性。支付相关功能 2019-06-20 18:28:09 +08:00
直白 8521d9a340 解决不同模型部署后只有一个流程的问题 2019-06-20 11:59:35 +08:00
huangxutao 70b7b035f5 ⚡ 优化代码,显示接口名称 2019-06-19 17:39:52 +08:00
如梦技术 a002299c3e ⚡ 代码优化,减少 sonar 问题. 2019-06-19 16:37:00 +08:00
pig4cloud.com 9bfedb98c4 Merge branch 'master' of 335333729/pigx into dev
https://gitee.wang/pig/pigx/issues
2019-06-19 09:44:44 +08:00
lishangbu f429e72a40 🎨 Improving structure / format of the code.调整文件管理代码格式 2019-06-18 23:49:30 +08:00
huangxutao 6908b89731 ⚡ 优化ing. 测试列表展示数据 2019-06-18 19:05:38 +08:00
huangxutao 8d24b2067e ✨ 添加新特性。文件管理数据和菜单配置脚本 2019-06-18 19:00:54 +08:00
huangxutao 64d2dad9c1 ⚡ 优化ing. 代码生成器描述,添加租户ID常量 2019-06-18 18:54:57 +08:00
huangxutao 7b2609408d ✨ 添加新特性。文件管理 2019-06-18 18:54:03 +08:00
wangchenglin cf49e46c2c 修改获取短信验证码的key的规则 2019-06-17 11:11:23 +08:00
lishangbu 1b3bdd0197 🎨 Improving structure / format of the code. 2019-06-14 14:48:52 +08:00
lishangbu 45d3718ed6 ✨ Introducing new features.添加Excel导入导出功能,基于alibaba的easyexcel 2019-06-14 13:10:30 +08:00
lishangbu 5d414fb8e6 ➖ Removing a dependency.remove poi 2019-06-12 23:14:46 +08:00
pigxcloud abb25ab7cd Merge branch 'master' into 3.2
# Conflicts:
#	pigx-auth/pom.xml
#	pigx-common/pigx-common-bom/pom.xml
#	pigx-common/pigx-common-core/pom.xml
#	pigx-common/pigx-common-data/pom.xml
#	pigx-common/pigx-common-datasource/pom.xml
#	pigx-common/pigx-common-gateway/pom.xml
#	pigx-common/pigx-common-job/pom.xml
#	pigx-common/pigx-common-log/pom.xml
#	pigx-common/pigx-common-minio/pom.xml
#	pigx-common/pigx-common-security/pom.xml
#	pigx-common/pigx-common-swagger/pom.xml
#	pigx-common/pigx-common-transaction/pom.xml
#	pigx-common/pom.xml
#	pigx-gateway/pom.xml
#	pigx-register/pom.xml
#	pigx-upms/pigx-upms-api/pom.xml
#	pigx-upms/pigx-upms-biz/pom.xml
#	pigx-upms/pom.xml
#	pigx-visual/pigx-activiti/pom.xml
#	pigx-visual/pigx-codegen/pom.xml
#	pigx-visual/pigx-daemon-elastic-job/pom.xml
#	pigx-visual/pigx-daemon-quartz/pom.xml
#	pigx-visual/pigx-monitor/pom.xml
#	pigx-visual/pigx-mp-manager/pom.xml
#	pigx-visual/pigx-sso-client-demo/pom.xml
#	pigx-visual/pigx-tx-manager/pom.xml
#	pigx-visual/pom.xml
#	pom.xml
2019-06-12 15:40:19 +08:00
pigxcloud 5802d74f89 Merge branch '443855452/master' of https://gitee.ltd/pig/pigx into 3.2 2019-06-12 15:39:59 +08:00
pig4cloud.com 643ab9201f Merge branch 'master' of 443855452/pigx into dev 2019-06-12 15:28:51 +08:00
pigxcloud 388ff2a7ca ⚡ 优化代码,删除无用引入和错误注解@NotBlank 2019-06-12 15:26:28 +08:00
陈鸿彬 cfcee9c58b 解决mysql8.0.12,数据字典和公共参数中system字段为保留字查询错误 2019-06-10 15:52:28 +08:00
pig4cloud.com d3ee3104f3 Merge branch 'master' of lengleng/pigx into dev
#335 解决docker-compose版本错误
2019-06-06 23:35:36 +08:00
pigxcloud 827377e3d1 修改docker-compose 中版本信息 2019-06-06 22:59:37 +08:00
pigxcloud 9aa8b74e5c 🔖 Releasing / Version tags. 3.1.0 2019-06-05 17:37:05 +08:00
pigxcloud 178836829d 🔖 Releasing / Version tags. 3.1.0 2019-06-03 14:09:42 +08:00
pigxcloud 075c31a508 ✨ 添加新特性。 支付收单模块 2019-06-03 07:41:34 +08:00
2629 changed files with 155995 additions and 233061 deletions

No files matched your search

+66
View File
@@ -0,0 +1,66 @@
version: 2
updates:
- package-ecosystem: maven
directory: /
schedule:
interval: weekly
day: monday
time: "09:00"
timezone: Asia/Shanghai
open-pull-requests-limit: 5
# 默认只自动处理 Maven patch 升级;LangChain4j 小版本升级也交给 Dependabot 自动建 PR。
allow:
- dependency-name: "*"
update-types:
- version-update:semver-patch
- dependency-name: "dev.langchain4j:*"
update-types:
- version-update:semver-minor
ignore:
# 完全忽略 IJPay 的所有升级。
- dependency-name: "com.github.javen205:IJPay-*"
# 完全忽略 MyBatis-Plus BOM 的所有升级。
- dependency-name: "com.baomidou:mybatis-plus-bom"
# 完全忽略 MyBatis-Plus-Join 的所有升级。
- dependency-name: "com.github.yulichang:mybatis-plus-join-*"
# major 升级涉及迁移风险,仍保留人工评估。
- dependency-name: "*"
update-types:
- version-update:semver-major
commit-message:
prefix: chore(deps)
groups:
# LangChain4j 单独分组,避免与普通 Maven patch 升级混在一个 PR。
langchain4j:
patterns:
- "dev.langchain4j:*"
update-types:
- patch
- minor
maven-dependencies:
patterns:
- "*"
exclude-patterns:
- "dev.langchain4j:*"
update-types:
- patch
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
day: monday
time: "09:30"
timezone: Asia/Shanghai
open-pull-requests-limit: 3
ignore:
- dependency-name: "*"
update-types:
- version-update:semver-minor
- version-update:semver-major
commit-message:
prefix: ci(deps)
groups:
github-actions:
patterns:
- "*"
+74
View File
@@ -0,0 +1,74 @@
name: CI
on:
workflow_dispatch:
push:
pull_request:
permissions:
contents: read
jobs:
maven-build:
name: Maven build (Java ${{ matrix.java-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
java-version: ['17', '25']
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Set up JDK ${{ matrix.java-version }}
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: ${{ matrix.java-version }}
cache: maven
- name: Add JDK 25 annotation processor profile
if: matrix.java-version == '25'
run: |
python - <<'PY'
from pathlib import Path
pom = Path('pom.xml')
content = pom.read_text()
profile = '''\
<profile>
<id>jdk25-annotation-processor</id>
<activation>
<jdk>[25,)</jdk>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</profile>
'''
marker = ' </profiles>'
if marker not in content:
raise SystemExit('Cannot find root pom.xml profiles section.')
if 'jdk25-annotation-processor' not in content:
content = content.replace(marker, profile + marker, 1)
pom.write_text(content)
PY
- name: Build with Maven
run: mvn -B -ntp clean install
+10 -1
View File
@@ -26,7 +26,6 @@ rebel.xml
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/
@@ -50,6 +49,7 @@ target/
*.java~
*.properties~
*.xml~
sessionStore
### system ignore ###
.DS_Store
@@ -58,6 +58,15 @@ Servers
.metadata
upload
gen_code
application-preview.yml
### node ###
node_modules
### claude code ###
.claude
docs
### test
aitest
.vectorex
+16 -13
View File
@@ -1,19 +1,22 @@
### 版本信息
- 提问务必按以下模板,提交详细信息。
- 错误信息多多益善、错误截图多多益善。
---
---
### 环境信息
- pigx版本:
- 操作系统:
- 是否修改包名:
- 是否修改包名:
### 提供详细日志、截图、回显步骤
### 报错信息 (注意格式化)
```
这里粘贴代码或者、日志
```
### 问题描述(包括回显步骤、截图 (此项没有直接关闭、不予解决))
+63
View File
@@ -0,0 +1,63 @@
# Repository Guidelines
## Project Structure & Module Organization
pigx aggregates Spring Cloud services through the root `pom.xml`. Runtime services sit under dedicated folders:
`pigx-register` (service discovery/Nacos), `pigx-gateway` (edge routing), `pigx-auth` (OAuth2), `pigx-upms` (user &
permission), `pigx-flow` (workflow), `pigx-app-server`, and `pigx-visual` (monitoring plus
schedulers). Shared libraries and DTOs live in `pigx-common`. Sample SQL and Docker build contexts reside in `db/`,
while infra manifests live in `docker-compose.yml`. Every module uses the standard `src/main/java` and `src/test/java`
layout.
## Build, Test, and Development Commands
Focused Maven commands are allowed only for test execution. They must not be used to package, start, or restart
services.
## Testing Guidelines
Use `spring-boot-starter-test` (JUnit 5, AssertJ, Mockito) for unit and slice tests. Name classes `*Tests.java` and
colocate fixtures in `src/test/resources`. Target >70% line coverage on the service layer that guards authentication,
gateway filters, and approval flows. Before opening a PR, run the focused tests required by the change, then perform
the required runtime validation. Do not use `mvn verify` as a build shortcut unless the user explicitly requests it.
## Commit & Pull Request Guidelines
Follow the repo’s `type(scope): summary` history, e.g. `fix(upms): clear login failure cache` or
`feat(ai-voice): add speech transcription`. Each PR must describe the impact area, list affected modules, and reference
internal tickets or issues. Attach curl/Postman snippets or screenshots whenever UI or OpenAPI responses change. Rebase
on `ai-dev`, avoid committing generated artifacts, and call out schema/config updates explicitly.
## Security & Configuration Tips
Never commit environment secrets; rely on `docker-compose.yml` plus `.env` overrides ignored by Git. Keep `db/` seed
data sanitized, and drive end-to-end checks against `pigx-register` (ports 8848/9848) with `pigx-gateway` (9999) so
discovery behavior matches production.
## Behavioral Guidelines
The following four rules apply to all tasks and take precedence over other default behaviors.
### 1. Think Before Coding
- When requirements are ambiguous, ask first — never make silent assumptions
- If a simpler solution exists, say so explicitly rather than quietly picking a direction
- When something is unclear, surface the confusion instead of pushing forward with guesswork
### 2. Prefer Simplicity
- Use the minimum code needed to solve the current problem; add nothing unrequested
- Do not introduce abstractions for one-off code or design for hypothetical future needs
- Ask yourself: would a senior engineer call this over-engineered?
### 3. Surgical Changes
- Only touch what the task requires; do not refactor adjacent code as a side effect
- Do not alter style or structure unrelated to the current task
- Every changed line must trace directly to a stated requirement
### 4. Goal-Driven Execution
- Convert vague instructions into verifiable goals — prefer tests as the success criterion
- "Fix a bug" → write a failing test that reproduces it, then make it pass
- "Add validation" → write tests covering invalid inputs, then make them pass
+1 -1
View File
@@ -1,4 +1,4 @@
Copyright (c) 2018-2025, lengleng All rights reserved.
Copyright (c) 2018-2026, lengleng All rights reserved.
协议和授权
pigX并非一个开源软件,作者保留全部的权利。
+8 -9
View File
@@ -1,21 +1,20 @@
## 协议和授权
pigX并非一个开源软件,作者保留全部的权利。
pigX 并非一个开源软件,作者保留全部的权利。
擅自窃用,即属严重侵权行为,与盗窃无异。产生的一切任何后果责任由侵权者自负。
### 🌹权益
1. 个人使用
2. 允许用于学习、毕设等。
## 商业使用
- [商用请购买商业授权](https://pig4cloud.com)
- [使用对应的专属版本](https://pig4cloud.com/data/other/form3.html)
### 🚫禁止
1. 将本项目的部分或全部代码和资源进行任何形式的再发行(尤其上传GitHub、Gitee )
2. 利用本项目的部分或全部代码和资源进行`任何商业行为`
将本项目的部分或全部代码和资源进行任何形式的再发行(上传GitHub、Gitee )
### 免责声明
### 侵权处理
PigX 未对任何组织、团队,书面授权商业使用。如若出现任何商业后果、纠纷和本人无关,特此声明
- 支付¥ 100000 侵权费用(含我方法律援助费用),本团队已完全委托博睿律师事务所 司法保护
- 个人行为将直接收集材料邮寄贵司侵权律师函,若出现司法诉讼将直接影响当事人征信档案等特此说明
## 贡献代码
+3292
View File
File diff suppressed because it is too large. Load diff
+17 -2
View File
@@ -2,7 +2,7 @@
create database `pigxx` default character set utf8mb4 collate utf8mb4_general_ci;
-- pigx 工作流相关库
create database `pigxx_ac` default character set utf8mb4 collate utf8mb4_general_ci;
create database `pigxx_flow` default character set utf8mb4 collate utf8mb4_general_ci;
-- pigx 任务相关库
create database `pigxx_job` default character set utf8mb4 collate utf8mb4_general_ci;
@@ -11,4 +11,19 @@ create database `pigxx_job` default character set utf8mb4 collate utf8mb4_genera
create database `pigxx_mp` default character set utf8mb4 collate utf8mb4_general_ci;
-- pigx nacos配置相关库
create database `pigxx_config` default character set utf8mb4 collate utf8mb4_general_ci;
create database `pigxx_config` default character set utf8mb4 collate utf8mb4_general_ci;
-- pigx pay配置相关库
create database `pigxx_pay` default character set utf8mb4 collate utf8mb4_general_ci;
-- pigx codegen相关库
create database `pigxx_codegen` default character set utf8mb4 collate utf8mb4_general_ci;
-- pigx report相关库
create database `pigxx_report` default character set utf8mb4 collate utf8mb4_general_ci;
-- pigx bi 报表相关的数据库
create database `pigxx_bi` default character set utf8mb4 collate utf8mb4_general_ci;
-- pigx app 模块相关的数据库
create database `pigxx_app` default character set utf8mb4 collate utf8mb4_general_ci;
+1409 -251
View File
File diff suppressed because it is too large. Load diff
-688
View File
@@ -1,688 +0,0 @@
/*
Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50723
Source Host : localhost
Source Database : pigxx_ac
Target Server Type : MySQL
Target Server Version : 50723
File Encoding : utf-8
Date: 01/09/2019 11:09:48 AM
*/
USE pigxx_ac;
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for `ACT_EVT_LOG`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_EVT_LOG`;
CREATE TABLE `ACT_EVT_LOG` (
`LOG_NR_` bigint(20) NOT NULL AUTO_INCREMENT,
`TYPE_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TIME_STAMP_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
`USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`DATA_` longblob,
`LOCK_OWNER_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`LOCK_TIME_` timestamp(3) NULL DEFAULT NULL,
`IS_PROCESSED_` tinyint(4) DEFAULT '0',
PRIMARY KEY (`LOG_NR_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for `ACT_GE_BYTEARRAY`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_GE_BYTEARRAY`;
CREATE TABLE `ACT_GE_BYTEARRAY` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`DEPLOYMENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`BYTES_` longblob,
`GENERATED_` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`ID_`),
KEY `ACT_FK_BYTEARR_DEPL` (`DEPLOYMENT_ID_`),
CONSTRAINT `ACT_FK_BYTEARR_DEPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `ACT_RE_DEPLOYMENT` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_GE_BYTEARRAY`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_GE_BYTEARRAY` VALUES ('12510', '1', '请教流程.bpmn20.xml', '12509', 0x3c3f786d6c2076657273696f6e3d27312e302720656e636f64696e673d275554462d38273f3e0a3c646566696e6974696f6e7320786d6c6e733d22687474703a2f2f7777772e6f6d672e6f72672f737065632f42504d4e2f32303130303532342f4d4f44454c2220786d6c6e733a7873693d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612d696e7374616e63652220786d6c6e733a7873643d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220786d6c6e733a61637469766974693d22687474703a2f2f61637469766974692e6f72672f62706d6e2220786d6c6e733a62706d6e64693d22687474703a2f2f7777772e6f6d672e6f72672f737065632f42504d4e2f32303130303532342f44492220786d6c6e733a6f6d6764633d22687474703a2f2f7777772e6f6d672e6f72672f737065632f44442f32303130303532342f44432220786d6c6e733a6f6d6764693d22687474703a2f2f7777772e6f6d672e6f72672f737065632f44442f32303130303532342f44492220747970654c616e67756167653d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d61222065787072657373696f6e4c616e67756167653d22687474703a2f2f7777772e77332e6f72672f313939392f585061746822207461726765744e616d6573706163653d22687474703a2f2f7777772e61637469766974692e6f72672f70726f63657373646566223e0a20203c70726f636573732069643d224c6561766542696c6c22206e616d653d224c6561766542696c6c2220697345786563757461626c653d2274727565223e0a202020203c73746172744576656e742069643d227369642d33414335453536332d453645332d343737372d423434362d30343736443838344331314422206e616d653d22e68f90e4baa4222f3e0a202020203c757365725461736b2069643d227369642d38433845373242432d353330322d343041372d413031372d30344542394641393136444122206e616d653d22e794a8e688b7e68f90e4baa4223e0a2020202020203c657874656e73696f6e456c656d656e74733e0a20202020202020203c61637469766974693a7461736b4c697374656e6572206576656e743d226372656174652220636c6173733d22636f6d2e70696734636c6f75642e706967782e6163742e6c697374656e65722e4c6561766550726f636573735461736b4c697374656e6572222f3e0a2020202020203c2f657874656e73696f6e456c656d656e74733e0a202020203c2f757365725461736b3e0a202020203c757365725461736b2069643d227369642d33354144463030362d353743302d343745302d394235422d41463432344530413745344522206e616d653d22e7bb84e995bfe5aea1e689b9223e0a2020202020203c657874656e73696f6e456c656d656e74733e0a20202020202020203c61637469766974693a7461736b4c697374656e6572206576656e743d226372656174652220636c6173733d22636f6d2e70696734636c6f75642e706967782e6163742e6c697374656e65722e4c6561766550726f636573735461736b4c697374656e6572222f3e0a2020202020203c2f657874656e73696f6e456c656d656e74733e0a202020203c2f757365725461736b3e0a202020203c656e644576656e742069643d227369642d30353539313044422d314445362d344243342d423532372d32334641373139444532363522206e616d653d22e7bb93e69d9f222f3e0a202020203c73657175656e6365466c6f772069643d227369642d32424346433631362d374438412d343134312d414633462d3841433138454131303044462220736f757263655265663d227369642d33414335453536332d453645332d343737372d423434362d30343736443838344331314422207461726765745265663d227369642d38433845373242432d353330322d343041372d413031372d303445423946413931364441222f3e0a202020203c73657175656e6365466c6f772069643d227369642d45464334383546312d414543392d343536392d423430312d44313644453538463637333722206e616d653d22e5aea1e689b92220736f757263655265663d227369642d38433845373242432d353330322d343041372d413031372d30344542394641393136444122207461726765745265663d227369642d33354144463030362d353743302d343745302d394235422d414634323445304137453445222f3e0a202020203c73657175656e6365466c6f772069643d227369642d38344242323430352d384530322d344442392d384632392d45394242423033324330443922206e616d653d22e9a9b3e59b9e2220736f757263655265663d227369642d33354144463030362d353743302d343745302d394235422d41463432344530413745344522207461726765745265663d227369642d38433845373242432d353330322d343041372d413031372d303445423946413931364441223e0a2020202020203c636f6e646974696f6e45787072657373696f6e207873693a747970653d2274466f726d616c45787072657373696f6e223e3c215b43444154415b247b666c61672e657175616c732827e9a9b3e59b9e27297d5d5d3e3c2f636f6e646974696f6e45787072657373696f6e3e0a202020203c2f73657175656e6365466c6f773e0a202020203c73657175656e6365466c6f772069643d227369642d36393830363236352d423636302d344239322d423744392d38444532413535433530373922206e616d653d22e5aea1e689b92220736f757263655265663d227369642d33354144463030362d353743302d343745302d394235422d41463432344530413745344522207461726765745265663d227369642d30353539313044422d314445362d344243342d423532372d323346413731394445323635222f3e0a20203c2f70726f636573733e0a20203c62706d6e64693a42504d4e4469616772616d2069643d2242504d4e4469616772616d5f4c6561766542696c6c223e0a202020203c62706d6e64693a42504d4e506c616e652062706d6e456c656d656e743d224c6561766542696c6c222069643d2242504d4e506c616e655f4c6561766542696c6c223e0a2020202020203c62706d6e64693a42504d4e53686170652062706d6e456c656d656e743d227369642d33414335453536332d453645332d343737372d423434362d303437364438383443313144222069643d2242504d4e53686170655f7369642d33414335453536332d453645332d343737372d423434362d303437364438383443313144223e0a20202020202020203c6f6d6764633a42Line truncated
COMMIT;
-- ----------------------------
-- Table structure for `ACT_GE_PROPERTY`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_GE_PROPERTY`;
CREATE TABLE `ACT_GE_PROPERTY` (
`NAME_` varchar(64) COLLATE utf8_bin NOT NULL,
`VALUE_` varchar(300) COLLATE utf8_bin DEFAULT NULL,
`REV_` int(11) DEFAULT NULL,
PRIMARY KEY (`NAME_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_GE_PROPERTY`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_GE_PROPERTY` VALUES ('next.dbid', '32501', '14'), ('schema.history', 'create(5.22.0.0)', '1'), ('schema.version', '5.22.0.0', '1');
COMMIT;
-- ----------------------------
-- Table structure for `ACT_HI_ACTINST`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_HI_ACTINST`;
CREATE TABLE `ACT_HI_ACTINST` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`PROC_DEF_ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`EXECUTION_ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`ACT_ID_` varchar(255) COLLATE utf8_bin NOT NULL,
`TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`CALL_PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`ACT_NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`ACT_TYPE_` varchar(255) COLLATE utf8_bin NOT NULL,
`ASSIGNEE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`START_TIME_` datetime(3) NOT NULL,
`END_TIME_` datetime(3) DEFAULT NULL,
`DURATION_` bigint(20) DEFAULT NULL,
`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_HI_ACT_INST_START` (`START_TIME_`),
KEY `ACT_IDX_HI_ACT_INST_END` (`END_TIME_`),
KEY `ACT_IDX_HI_ACT_INST_PROCINST` (`PROC_INST_ID_`,`ACT_ID_`),
KEY `ACT_IDX_HI_ACT_INST_EXEC` (`EXECUTION_ID_`,`ACT_ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_HI_ACTINST`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_HI_ACTINST` VALUES ('30106', 'LeaveBill:1:30104', '30105', '30105', 'start', null, null, '开始', 'startEvent', null, '2018-12-18 22:51:52.599', '2018-12-18 22:51:52.600', '1', '1'), ('30107', 'LeaveBill:1:30104', '30105', '30105', 'user', '30108', null, '用户提交', 'userTask', null, '2018-12-18 22:51:52.600', '2018-12-18 22:52:05.817', '13217', '1'), ('30114', 'LeaveBill:1:30104', '30105', '30105', 'pm', '30115', null, '组长审批', 'userTask', null, '2018-12-18 22:52:05.817', '2018-12-18 22:52:11.607', '5790', '1'), ('30118', 'LeaveBill:1:30104', '30105', '30105', 'user', '30119', null, '用户提交', 'userTask', null, '2018-12-18 22:52:11.607', null, null, '1');
COMMIT;
-- ----------------------------
-- Table structure for `ACT_HI_ATTACHMENT`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_HI_ATTACHMENT`;
CREATE TABLE `ACT_HI_ATTACHMENT` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`DESCRIPTION_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`URL_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`CONTENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TIME_` datetime(3) DEFAULT NULL,
PRIMARY KEY (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for `ACT_HI_COMMENT`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_HI_COMMENT`;
CREATE TABLE `ACT_HI_COMMENT` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`TIME_` datetime(3) NOT NULL,
`USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`ACTION_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`MESSAGE_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`FULL_MSG_` longblob,
PRIMARY KEY (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_HI_COMMENT`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_HI_COMMENT` VALUES ('30111', 'comment', '2018-12-18 22:52:05.805', 'admin', '30108', '30105', 'AddComment', '1', 0x31), ('30117', 'comment', '2018-12-18 22:52:11.589', 'admin', '30115', '30105', 'AddComment', '2', 0x32);
COMMIT;
-- ----------------------------
-- Table structure for `ACT_HI_DETAIL`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_HI_DETAIL`;
CREATE TABLE `ACT_HI_DETAIL` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`TYPE_` varchar(255) COLLATE utf8_bin NOT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`ACT_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`NAME_` varchar(255) COLLATE utf8_bin NOT NULL,
`VAR_TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`REV_` int(11) DEFAULT NULL,
`TIME_` datetime(3) NOT NULL,
`BYTEARRAY_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`DOUBLE_` double DEFAULT NULL,
`LONG_` bigint(20) DEFAULT NULL,
`TEXT_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`TEXT2_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_HI_DETAIL_PROC_INST` (`PROC_INST_ID_`),
KEY `ACT_IDX_HI_DETAIL_ACT_INST` (`ACT_INST_ID_`),
KEY `ACT_IDX_HI_DETAIL_TIME` (`TIME_`),
KEY `ACT_IDX_HI_DETAIL_NAME` (`NAME_`),
KEY `ACT_IDX_HI_DETAIL_TASK_ID` (`TASK_ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for `ACT_HI_IDENTITYLINK`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_HI_IDENTITYLINK`;
CREATE TABLE `ACT_HI_IDENTITYLINK` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`GROUP_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_HI_IDENT_LNK_USER` (`USER_ID_`),
KEY `ACT_IDX_HI_IDENT_LNK_TASK` (`TASK_ID_`),
KEY `ACT_IDX_HI_IDENT_LNK_PROCINST` (`PROC_INST_ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_HI_IDENTITYLINK`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_HI_IDENTITYLINK` VALUES ('30109', null, 'candidate', 'admin', '30108', null), ('30110', null, 'participant', 'admin', null, '30105'), ('30116', null, 'candidate', 'admin', '30115', null), ('30120', null, 'candidate', 'admin', '30119', null);
COMMIT;
-- ----------------------------
-- Table structure for `ACT_HI_PROCINST`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_HI_PROCINST`;
CREATE TABLE `ACT_HI_PROCINST` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`BUSINESS_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`PROC_DEF_ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`START_TIME_` datetime(3) NOT NULL,
`END_TIME_` datetime(3) DEFAULT NULL,
`DURATION_` bigint(20) DEFAULT NULL,
`START_USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`START_ACT_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`END_ACT_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`SUPER_PROCESS_INSTANCE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`DELETE_REASON_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',
`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`),
UNIQUE KEY `PROC_INST_ID_` (`PROC_INST_ID_`),
KEY `ACT_IDX_HI_PRO_INST_END` (`END_TIME_`),
KEY `ACT_IDX_HI_PRO_I_BUSKEY` (`BUSINESS_KEY_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_HI_PROCINST`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_HI_PROCINST` VALUES ('30105', '30105', 'LeaveBill_6', 'LeaveBill:1:30104', '2018-12-18 22:51:52.599', null, null, null, 'start', null, null, null, '1', null);
COMMIT;
-- ----------------------------
-- Table structure for `ACT_HI_TASKINST`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_HI_TASKINST`;
CREATE TABLE `ACT_HI_TASKINST` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TASK_DEF_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`PARENT_TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`DESCRIPTION_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`OWNER_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`ASSIGNEE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`START_TIME_` datetime(3) NOT NULL,
`CLAIM_TIME_` datetime(3) DEFAULT NULL,
`END_TIME_` datetime(3) DEFAULT NULL,
`DURATION_` bigint(20) DEFAULT NULL,
`DELETE_REASON_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`PRIORITY_` int(11) DEFAULT NULL,
`DUE_DATE_` datetime(3) DEFAULT NULL,
`FORM_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_HI_TASK_INST_PROCINST` (`PROC_INST_ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_HI_TASKINST`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_HI_TASKINST` VALUES ('30108', 'LeaveBill:1:30104', 'user', '30105', '30105', '用户提交', null, null, null, null, '2018-12-18 22:51:52.601', null, '2018-12-18 22:52:05.815', '13214', 'completed', '50', null, null, null, '1'), ('30115', 'LeaveBill:1:30104', 'pm', '30105', '30105', '组长审批', null, null, null, null, '2018-12-18 22:52:05.817', null, '2018-12-18 22:52:11.603', '5786', 'completed', '50', null, null, null, '1'), ('30119', 'LeaveBill:1:30104', 'user', '30105', '30105', '用户提交', null, null, null, null, '2018-12-18 22:52:11.607', null, null, null, null, '50', null, null, null, '1');
COMMIT;
-- ----------------------------
-- Table structure for `ACT_HI_VARINST`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_HI_VARINST`;
CREATE TABLE `ACT_HI_VARINST` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`NAME_` varchar(255) COLLATE utf8_bin NOT NULL,
`VAR_TYPE_` varchar(100) COLLATE utf8_bin DEFAULT NULL,
`REV_` int(11) DEFAULT NULL,
`BYTEARRAY_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`DOUBLE_` double DEFAULT NULL,
`LONG_` bigint(20) DEFAULT NULL,
`TEXT_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`TEXT2_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`CREATE_TIME_` datetime(3) DEFAULT NULL,
`LAST_UPDATED_TIME_` datetime(3) DEFAULT NULL,
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_HI_PROCVAR_PROC_INST` (`PROC_INST_ID_`),
KEY `ACT_IDX_HI_PROCVAR_NAME_TYPE` (`NAME_`,`VAR_TYPE_`),
KEY `ACT_IDX_HI_PROCVAR_TASK_ID` (`TASK_ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_HI_VARINST`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_HI_VARINST` VALUES ('30112', '30105', '30105', null, 'days', 'integer', '1', null, null, '11', '11', null, '2018-12-18 22:52:05.813', '2018-12-18 22:52:11.598'), ('30113', '30105', '30105', null, 'flag', 'string', '1', null, null, null, '驳回', null, '2018-12-18 22:52:05.813', '2018-12-18 22:52:11.600');
COMMIT;
-- ----------------------------
-- Table structure for `ACT_ID_GROUP`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_ID_GROUP`;
CREATE TABLE `ACT_ID_GROUP` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for `ACT_ID_INFO`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_ID_INFO`;
CREATE TABLE `ACT_ID_INFO` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`USER_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TYPE_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`VALUE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`PASSWORD_` longblob,
`PARENT_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for `ACT_ID_MEMBERSHIP`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_ID_MEMBERSHIP`;
CREATE TABLE `ACT_ID_MEMBERSHIP` (
`USER_ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`GROUP_ID_` varchar(64) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`USER_ID_`,`GROUP_ID_`),
KEY `ACT_FK_MEMB_GROUP` (`GROUP_ID_`),
CONSTRAINT `ACT_FK_MEMB_GROUP` FOREIGN KEY (`GROUP_ID_`) REFERENCES `ACT_ID_GROUP` (`ID_`),
CONSTRAINT `ACT_FK_MEMB_USER` FOREIGN KEY (`USER_ID_`) REFERENCES `ACT_ID_USER` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for `ACT_ID_USER`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_ID_USER`;
CREATE TABLE `ACT_ID_USER` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`FIRST_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`LAST_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`EMAIL_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`PWD_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`PICTURE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for `ACT_PROCDEF_INFO`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_PROCDEF_INFO`;
CREATE TABLE `ACT_PROCDEF_INFO` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`PROC_DEF_ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`INFO_JSON_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`),
UNIQUE KEY `ACT_UNIQ_INFO_PROCDEF` (`PROC_DEF_ID_`),
KEY `ACT_IDX_INFO_PROCDEF` (`PROC_DEF_ID_`),
KEY `ACT_FK_INFO_JSON_BA` (`INFO_JSON_ID_`),
CONSTRAINT `ACT_FK_INFO_JSON_BA` FOREIGN KEY (`INFO_JSON_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`),
CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for `ACT_RE_DEPLOYMENT`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_RE_DEPLOYMENT`;
CREATE TABLE `ACT_RE_DEPLOYMENT` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',
`DEPLOY_TIME_` timestamp(3) NULL DEFAULT NULL,
PRIMARY KEY (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_RE_DEPLOYMENT`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_RE_DEPLOYMENT` VALUES ('12509', '请教流程', null, '1', '2018-11-11 01:47:50.296'), ('30101', '请假流程', null, '1', '2018-12-18 22:50:23.963');
COMMIT;
-- ----------------------------
-- Table structure for `ACT_RE_MODEL`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_RE_MODEL`;
CREATE TABLE `ACT_RE_MODEL` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`CREATE_TIME_` timestamp(3) NULL DEFAULT NULL,
`LAST_UPDATE_TIME_` timestamp(3) NULL DEFAULT NULL,
`VERSION_` int(11) DEFAULT NULL,
`META_INFO_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`DEPLOYMENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`EDITOR_SOURCE_VALUE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`EDITOR_SOURCE_EXTRA_VALUE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',
PRIMARY KEY (`ID_`),
KEY `ACT_FK_MODEL_SOURCE` (`EDITOR_SOURCE_VALUE_ID_`),
KEY `ACT_FK_MODEL_SOURCE_EXTRA` (`EDITOR_SOURCE_EXTRA_VALUE_ID_`),
KEY `ACT_FK_MODEL_DEPLOYMENT` (`DEPLOYMENT_ID_`),
CONSTRAINT `ACT_FK_MODEL_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `ACT_RE_DEPLOYMENT` (`ID_`),
CONSTRAINT `ACT_FK_MODEL_SOURCE` FOREIGN KEY (`EDITOR_SOURCE_VALUE_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`),
CONSTRAINT `ACT_FK_MODEL_SOURCE_EXTRA` FOREIGN KEY (`EDITOR_SOURCE_EXTRA_VALUE_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_RE_MODEL`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_RE_MODEL` VALUES ('1', '13', '请假流程', 'LeaveBill', 'LeaveBill', '2018-11-10 22:52:35.569', '2018-12-18 22:47:07.638', '1', '{\"name\":\"请假流程\",\"revision\":1,\"description\":\"内置请假流程。\"}', null, '2', '3', '1');
COMMIT;
-- ----------------------------
-- Table structure for `ACT_RE_PROCDEF`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_RE_PROCDEF`;
CREATE TABLE `ACT_RE_PROCDEF` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`KEY_` varchar(255) COLLATE utf8_bin NOT NULL,
`VERSION_` int(11) NOT NULL,
`DEPLOYMENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`RESOURCE_NAME_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`DGRM_RESOURCE_NAME_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`DESCRIPTION_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`HAS_START_FORM_KEY_` tinyint(4) DEFAULT NULL,
`HAS_GRAPHICAL_NOTATION_` tinyint(4) DEFAULT NULL,
`SUSPENSION_STATE_` int(11) DEFAULT NULL,
`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',
PRIMARY KEY (`ID_`),
UNIQUE KEY `ACT_UNIQ_PROCDEF` (`KEY_`,`VERSION_`,`TENANT_ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_RE_PROCDEF`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_RE_PROCDEF` VALUES ('LeaveBill:1:30104', '2', 'LeaveBill', 'LeaveBill', 'LeaveBill', '1', '30101', '请假流程.bpmn20.xml', '请假流程.LeaveBill.png', null, '0', '1', '1', '1');
COMMIT;
-- ----------------------------
-- Table structure for `ACT_RU_EVENT_SUBSCR`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_RU_EVENT_SUBSCR`;
CREATE TABLE `ACT_RU_EVENT_SUBSCR` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`EVENT_TYPE_` varchar(255) COLLATE utf8_bin NOT NULL,
`EVENT_NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`ACTIVITY_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`CONFIGURATION_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`CREATED_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_EVENT_SUBSCR_CONFIG_` (`CONFIGURATION_`),
KEY `ACT_FK_EVENT_EXEC` (`EXECUTION_ID_`),
CONSTRAINT `ACT_FK_EVENT_EXEC` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for `ACT_RU_EXECUTION`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_RU_EXECUTION`;
CREATE TABLE `ACT_RU_EXECUTION` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`BUSINESS_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`PARENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`SUPER_EXEC_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`ACT_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`IS_ACTIVE_` tinyint(4) DEFAULT NULL,
`IS_CONCURRENT_` tinyint(4) DEFAULT NULL,
`IS_SCOPE_` tinyint(4) DEFAULT NULL,
`IS_EVENT_SCOPE_` tinyint(4) DEFAULT NULL,
`SUSPENSION_STATE_` int(11) DEFAULT NULL,
`CACHED_ENT_STATE_` int(11) DEFAULT NULL,
`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',
`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`LOCK_TIME_` timestamp(3) NULL DEFAULT NULL,
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_EXEC_BUSKEY` (`BUSINESS_KEY_`),
KEY `ACT_FK_EXE_PROCINST` (`PROC_INST_ID_`),
KEY `ACT_FK_EXE_PARENT` (`PARENT_ID_`),
KEY `ACT_FK_EXE_SUPER` (`SUPER_EXEC_`),
KEY `ACT_FK_EXE_PROCDEF` (`PROC_DEF_ID_`),
CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`),
CONSTRAINT `ACT_FK_EXE_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`),
CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `ACT_FK_EXE_SUPER` FOREIGN KEY (`SUPER_EXEC_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_RU_EXECUTION`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_RU_EXECUTION` VALUES ('30105', '3', '30105', 'LeaveBill_6', null, 'LeaveBill:1:30104', null, 'user', '1', '0', '1', '0', '1', '2', '1', null, null);
COMMIT;
-- ----------------------------
-- Table structure for `ACT_RU_IDENTITYLINK`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_RU_IDENTITYLINK`;
CREATE TABLE `ACT_RU_IDENTITYLINK` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`GROUP_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_IDENT_LNK_USER` (`USER_ID_`),
KEY `ACT_IDX_IDENT_LNK_GROUP` (`GROUP_ID_`),
KEY `ACT_IDX_ATHRZ_PROCEDEF` (`PROC_DEF_ID_`),
KEY `ACT_FK_TSKASS_TASK` (`TASK_ID_`),
KEY `ACT_FK_IDL_PROCINST` (`PROC_INST_ID_`),
CONSTRAINT `ACT_FK_ATHRZ_PROCEDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`),
CONSTRAINT `ACT_FK_IDL_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`),
CONSTRAINT `ACT_FK_TSKASS_TASK` FOREIGN KEY (`TASK_ID_`) REFERENCES `ACT_RU_TASK` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_RU_IDENTITYLINK`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_RU_IDENTITYLINK` VALUES ('30110', '1', null, 'participant', 'admin', null, '30105', null), ('30120', '1', null, 'candidate', 'admin', '30119', null, null);
COMMIT;
-- ----------------------------
-- Table structure for `ACT_RU_JOB`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_RU_JOB`;
CREATE TABLE `ACT_RU_JOB` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`TYPE_` varchar(255) COLLATE utf8_bin NOT NULL,
`LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL,
`LOCK_OWNER_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`EXCLUSIVE_` tinyint(1) DEFAULT NULL,
`EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROCESS_INSTANCE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`RETRIES_` int(11) DEFAULT NULL,
`EXCEPTION_STACK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`EXCEPTION_MSG_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`DUEDATE_` timestamp(3) NULL DEFAULT NULL,
`REPEAT_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`HANDLER_TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`HANDLER_CFG_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',
PRIMARY KEY (`ID_`),
KEY `ACT_FK_JOB_EXCEPTION` (`EXCEPTION_STACK_ID_`),
CONSTRAINT `ACT_FK_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for `ACT_RU_TASK`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_RU_TASK`;
CREATE TABLE `ACT_RU_TASK` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`PARENT_TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`DESCRIPTION_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`TASK_DEF_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`OWNER_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`ASSIGNEE_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`DELEGATION_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PRIORITY_` int(11) DEFAULT NULL,
`CREATE_TIME_` timestamp(3) NULL DEFAULT NULL,
`DUE_DATE_` datetime(3) DEFAULT NULL,
`CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`SUSPENSION_STATE_` int(11) DEFAULT NULL,
`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',
`FORM_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_TASK_CREATE` (`CREATE_TIME_`),
KEY `ACT_FK_TASK_EXE` (`EXECUTION_ID_`),
KEY `ACT_FK_TASK_PROCINST` (`PROC_INST_ID_`),
KEY `ACT_FK_TASK_PROCDEF` (`PROC_DEF_ID_`),
CONSTRAINT `ACT_FK_TASK_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`),
CONSTRAINT `ACT_FK_TASK_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`),
CONSTRAINT `ACT_FK_TASK_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_RU_TASK`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_RU_TASK` VALUES ('30119', '1', '30105', '30105', 'LeaveBill:1:30104', '用户提交', null, null, 'user', null, null, null, '50', '2018-12-18 22:52:11.607', null, null, '1', '1', null);
COMMIT;
-- ----------------------------
-- Table structure for `ACT_RU_VARIABLE`
-- ----------------------------
DROP TABLE IF EXISTS `ACT_RU_VARIABLE`;
CREATE TABLE `ACT_RU_VARIABLE` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`TYPE_` varchar(255) COLLATE utf8_bin NOT NULL,
`NAME_` varchar(255) COLLATE utf8_bin NOT NULL,
`EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`BYTEARRAY_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`DOUBLE_` double DEFAULT NULL,
`LONG_` bigint(20) DEFAULT NULL,
`TEXT_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`TEXT2_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_VARIABLE_TASK_ID` (`TASK_ID_`),
KEY `ACT_FK_VAR_EXE` (`EXECUTION_ID_`),
KEY `ACT_FK_VAR_PROCINST` (`PROC_INST_ID_`),
KEY `ACT_FK_VAR_BYTEARRAY` (`BYTEARRAY_ID_`),
CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`),
CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`),
CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `ACT_RU_VARIABLE`
-- ----------------------------
BEGIN;
INSERT INTO `ACT_RU_VARIABLE` VALUES ('30112', '1', 'integer', 'days', '30105', '30105', null, null, null, '11', '11', null), ('30113', '2', 'string', 'flag', '30105', '30105', null, null, null, null, '驳回', null);
COMMIT;
-- ----------------------------
-- Table structure for `oa_leave_bill`
-- ----------------------------
DROP TABLE IF EXISTS `oa_leave_bill`;
CREATE TABLE `oa_leave_bill` (
`leave_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(40) DEFAULT NULL COMMENT '用户名',
`days` int(4) DEFAULT NULL COMMENT '请假天数',
`content` varchar(255) DEFAULT NULL COMMENT '备注',
`state` char(1) DEFAULT '0' COMMENT '状态',
`leave_time` datetime DEFAULT NULL COMMENT '请假时间',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` char(1) DEFAULT '0' COMMENT '删除标识',
`tenant_id` int(11) NOT NULL COMMENT '所属租户',
PRIMARY KEY (`leave_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of `oa_leave_bill`
-- ----------------------------
BEGIN;
INSERT INTO `oa_leave_bill` VALUES ('2', 'admin', '16', '2018-12-19 12:00', '1', '2018-12-19 12:00:00', '2018-12-18 22:35:45', '2018-12-18 22:37:13', '0', '1'), ('3', 'admin', '20', '2018-12-22 12:00', '1', '2018-12-22 12:00:00', '2018-12-18 22:41:11', '2018-12-18 22:41:27', '0', '1'), ('4', 'admin', '22', '111', '1', '2018-12-03 12:00:00', '2018-12-18 22:42:45', '2018-12-18 22:42:50', '0', '1'), ('5', 'admin', '20', '11111', '1', '2018-12-12 12:00:00', '2018-12-18 22:45:30', '2018-12-18 22:45:34', '0', '1'), ('6', 'admin', '11', '12', '1', '2018-12-04 12:00:00', '2018-12-18 22:51:19', '2018-12-18 22:51:52', '0', '1');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
+334
View File
@@ -0,0 +1,334 @@
-- 本文件仅用于初始化,不用于升级已有数据库。
USE pigxx_flow;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE `bpm_oa_leave` (
`id` BIGINT NOT NULL COMMENT '主键',
`process_instance_id` VARCHAR(64) DEFAULT NULL COMMENT '流程实例编号',
`username` VARCHAR(255) NOT NULL COMMENT '申请人',
`leave_type` SMALLINT NOT NULL COMMENT '请假类型',
`leave_reason` VARCHAR(255) DEFAULT NULL COMMENT '请假原因',
`start_time` DATETIME(6) NOT NULL COMMENT '开始时间',
`end_time` DATETIME(6) NOT NULL COMMENT '结束时间',
`leave_day` SMALLINT NOT NULL COMMENT '请假天数',
`leave_status` SMALLINT DEFAULT NULL COMMENT '请假结果',
`create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
`update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
`del_flag` CHAR(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='请假申请表';
-- ----------------------------
-- Table structure for process
-- ----------------------------
DROP TABLE IF EXISTS `process`;
CREATE TABLE `process` (
`id` bigint NOT NULL COMMENT '用户id',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '表单ID',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单名称',
`logo` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '图标配置',
`settings` json DEFAULT NULL COMMENT '设置项',
`group_id` bigint NOT NULL COMMENT '分组ID',
`form_config` json NOT NULL COMMENT '表单设置信息',
`form_items` json NOT NULL COMMENT '表单设置内容',
`process` json NOT NULL COMMENT '流程设置内容',
`remark` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`sort` int NOT NULL,
`is_hidden` char(1) NOT NULL COMMENT '0 正常 1=隐藏',
`is_stop` char(1) NOT NULL COMMENT '0 正常 1=停用 ',
`admin_id` bigint DEFAULT NULL COMMENT '流程管理员',
`unique_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '唯一性id',
`admin_list` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '管理员',
`range_show` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '范围描述显示',
`print_template` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '打印模板',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `idx_form_id` (`flow_id`) USING BTREE,
KEY `process_idx_id` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=182 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流程定义数据';
-- ----------------------------
-- Table structure for process_copy
-- ----------------------------
DROP TABLE IF EXISTS `process_copy`;
CREATE TABLE `process_copy` (
`id` bigint NOT NULL COMMENT '用户id',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime COMMENT '创建时间',
`update_time` datetime COMMENT '更新时间',
`start_time` datetime NOT NULL COMMENT ' 流程发起时间',
`node_time` datetime NOT NULL COMMENT '当前节点时间',
`start_user_id` bigint NOT NULL COMMENT '发起人',
`flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id',
`process_instance_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '实例id',
`node_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '节点id',
`group_id` bigint NOT NULL COMMENT '分组id',
`group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分组名称',
`process_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程名称',
`node_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '节点 名称',
`form_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单数据',
`user_id` bigint NOT NULL COMMENT '抄送人id',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id',
PRIMARY KEY (`id`) USING BTREE,
KEY `copy_idx_id` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流程抄送数据';
-- ----------------------------
-- Table structure for process_group
-- ----------------------------
DROP TABLE IF EXISTS `process_group`;
CREATE TABLE `process_group` (
`id` bigint NOT NULL COMMENT '用户id',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`group_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分组名',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id',
PRIMARY KEY (`id`) USING BTREE,
KEY `group_idx_id` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流程分组';
-- ----------------------------
-- Table structure for process_instance_record
-- ----------------------------
DROP TABLE IF EXISTS `process_instance_record`;
CREATE TABLE `process_instance_record` (
`id` bigint NOT NULL COMMENT '用户id',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程名字',
`logo` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '头像',
`user_id` bigint NOT NULL COMMENT '用户id',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程id',
`process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程实例id',
`form_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '表单数据',
`group_id` bigint DEFAULT NULL COMMENT '组id',
`group_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组名称',
`status` int DEFAULT '1' COMMENT '状态',
`finish_reason` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '结束原因',
`end_time` datetime DEFAULT NULL COMMENT '结束时间',
`parent_process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上级流程实例id',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id',
PRIMARY KEY (`id`) USING BTREE,
KEY `record_idx_id` (`id`) USING BTREE,
KEY `record_idx_dep_id` (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=366 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='流程记录';
-- ----------------------------
-- Table structure for process_node_data
-- ----------------------------
DROP TABLE IF EXISTS `process_node_data`;
CREATE TABLE `process_node_data` (
`id` bigint NOT NULL COMMENT '用户id',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime COMMENT '创建时间',
`update_time` datetime COMMENT '更新时间',
`process_definition_id` varchar(64) DEFAULT NULL COMMENT '引擎流程定义ID,发布版本快照',
`flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id',
`data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单数据',
`node_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_node_definition` (`tenant_id`,`process_definition_id`,`node_id`),
KEY `data_idx_id` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1195 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='流程节点数据';
-- ----------------------------
-- Table structure for process_node_record
-- ----------------------------
DROP TABLE IF EXISTS `process_node_record`;
CREATE TABLE `process_node_record` (
`id` bigint NOT NULL COMMENT '用户id',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime COMMENT '创建时间',
`update_time` datetime COMMENT '更新时间',
`flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id',
`process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程实例id',
`data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '表单数据',
`node_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`node_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '节点类型',
`node_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '节点名字',
`status` int NOT NULL COMMENT '节点状态',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime DEFAULT NULL COMMENT '结束时间',
`execution_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '执行id',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id',
PRIMARY KEY (`id`) USING BTREE,
KEY `node_idx_id` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1435 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='流程节点记录';
-- ----------------------------
-- Table structure for process_node_record_assign_user
-- ----------------------------
DROP TABLE IF EXISTS `process_node_record_assign_user`;
CREATE TABLE `process_node_record_assign_user` (
`id` bigint NOT NULL COMMENT '用户id',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime COMMENT '创建时间',
`update_time` datetime COMMENT '更新时间',
`flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id',
`process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程实例id',
`data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '表单数据',
`node_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`user_id` bigint NOT NULL COMMENT ' 用户id',
`status` int NOT NULL COMMENT '节点状态',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime DEFAULT NULL COMMENT '结束时间',
`execution_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '执行id',
`task_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ' 任务id',
`approve_desc` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '审批意见',
`node_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ' 节点名称',
`task_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '任务类型',
`local_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '表单本地数据',
`node_record_id` bigint NOT NULL COMMENT '本轮节点执行记录id',
`assignment_origin` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'ORIGINAL' COMMENT '分配来源 ORIGINAL/ADD_SIGN',
`initial_user_id` bigint NOT NULL COMMENT '本份待办最初分配用户id',
`add_sign_record_id` bigint DEFAULT NULL COMMENT '动态加签批次记录id',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_node_record_user` (`tenant_id`,`node_record_id`,`user_id`) USING BTREE,
KEY `user_idx_id` (`id`) USING BTREE,
KEY `idx_add_sign_record_id` (`add_sign_record_id`) USING BTREE,
KEY `idx_assign_tenant_instance_del` (`tenant_id`,`process_instance_id`,`del_flag`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=597 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='流程节点记录-执行人';
-- Flowable 列表查询索引:act_* 表由引擎初始化,不在本脚本中创建。
-- 首次启动完成后,在业务库手动执行以下 SQL 一次;已有同名索引时不要重复执行。
-- 待办:按审批人筛选、创建时间排序。
-- ALTER TABLE `act_ru_task`
-- ADD INDEX `idx_task_assignee_create` (`ASSIGNEE_`, `CREATE_TIME_`),
-- ALGORITHM=INPLACE, LOCK=NONE;
-- 已办:按审批人及结束时间查询、统计。
-- ALTER TABLE `act_hi_actinst`
-- ADD INDEX `idx_act_assignee_end` (`ASSIGNEE_`, `END_TIME_`),
-- ALGORITHM=INPLACE, LOCK=NONE;
-- ----------------------------
-- Table structure for process_task_add_sign_record
-- ----------------------------
DROP TABLE IF EXISTS `process_task_add_sign_record`;
CREATE TABLE `process_task_add_sign_record` (
`id` bigint NOT NULL COMMENT '主键id',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime COMMENT '创建时间',
`update_time` datetime COMMENT '更新时间',
`flow_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程id',
`process_instance_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '流程实例id',
`node_record_id` bigint NOT NULL COMMENT '本轮节点执行记录id',
`node_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '节点id',
`source_task_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '发起加签的任务id',
`added_by_user_id` bigint NOT NULL COMMENT '加签发起人id',
`reason` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '加签原因',
`target_user_ids` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '本批次目标用户快照',
`participant_user_ids_before` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '操作前参与人快照',
`participant_user_ids_after` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '操作后参与人快照',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_add_sign_node_record` (`tenant_id`,`node_record_id`) USING BTREE,
KEY `idx_add_sign_process_instance` (`tenant_id`,`process_instance_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='流程动态加签批次记录';
-- ----------------------------
-- Table structure for process_starter
-- ----------------------------
DROP TABLE IF EXISTS `process_starter`;
CREATE TABLE `process_starter` (
`id` bigint NOT NULL COMMENT '用户id',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime COMMENT '创建时间',
`update_time` datetime COMMENT '更新时间',
`type_id` bigint NOT NULL COMMENT '用户id或者部门id',
`type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ' 类型 user dept',
`process_id` bigint NOT NULL COMMENT '流程id',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id',
PRIMARY KEY (`id`) USING BTREE,
KEY `starter_idx_id` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=217 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流程发起人';
-- ----------------------------
-- Table structure for bmp_oa_leave
-- ----------------------------
DROP TABLE IF EXISTS `bmp_oa_leave`;
CREATE TABLE `bmp_oa_leave` (
`id` bigint NOT NULL COMMENT '请假表单主键',
`username` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请人',
`leave_type` int NOT NULL COMMENT '请假类型',
`leave_reason` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请假原因',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime NOT NULL COMMENT '结束时间',
`leave_day` int NOT NULL COMMENT '请假天数',
`leave_status` int DEFAULT NULL COMMENT '请假结果',
`process_instance_id` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '流程实例的编号',
`create_by` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
`update_by` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
`del_flag` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='请假表单';
-- ----------------------------
-- Table structure for flow_draft
-- ----------------------------
DROP TABLE IF EXISTS `flow_draft`;
CREATE TABLE `flow_draft` (
`id` varchar(36) COLLATE utf8mb4_general_ci NOT NULL COMMENT '草稿ID',
`tenant_id` bigint NOT NULL COMMENT '所属租户ID',
`user_id` bigint NOT NULL COMMENT '草稿所属用户ID',
`kind` varchar(16) COLLATE utf8mb4_general_ci NOT NULL COMMENT '草稿类型:DESIGN 流程设计,APPLICATION 申请',
`flow_id` varchar(64) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '关联流程ID,未建立流程时为空串',
`title` varchar(200) COLLATE utf8mb4_general_ci NOT NULL COMMENT '草稿标题',
`payload` longtext COLLATE utf8mb4_general_ci NOT NULL COMMENT '草稿内容 JSON,最多 1 MB',
`revision` bigint NOT NULL COMMENT '乐观锁版本号',
`updated_at` timestamp(3) NOT NULL COMMENT '最后保存时间',
PRIMARY KEY (`id`),
KEY `idx_draft_owner` (`tenant_id`,`user_id`,`kind`,`updated_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='个人流程草稿';
-- ----------------------------
-- Table structure for flow_notice
-- ----------------------------
DROP TABLE IF EXISTS `flow_notice`;
CREATE TABLE `flow_notice` (
`id` varchar(36) COLLATE utf8mb4_general_ci NOT NULL COMMENT '通知事件ID',
`tenant_id` bigint NOT NULL COMMENT '所属租户ID',
`user_id` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '接收人ID,超时提醒到期前为空串',
`event_key` varchar(180) COLLATE utf8mb4_general_ci NOT NULL COMMENT '事件去重键',
`kind` varchar(16) COLLATE utf8mb4_general_ci NOT NULL COMMENT '通知类型:TODO 待办,URGE 催办,OVERDUE 超时提醒',
`title` varchar(200) COLLATE utf8mb4_general_ci NOT NULL COMMENT '通知标题',
`task_id` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '引擎任务ID',
`instance_id` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '引擎流程实例ID',
`created_at` timestamp(3) NOT NULL COMMENT '创建时间',
`status` varchar(16) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'SENT' COMMENT '状态:PENDING 待到期,READY 待投递,SENT 已投递,REMOVING 待撤销,CANCELLED 已取消,DISABLED 已停用',
`scheduled_at` timestamp(3) NULL DEFAULT NULL COMMENT '计划投递或到期时间',
`sent_at` timestamp(3) NULL DEFAULT NULL COMMENT '投递到统一站内信的时间',
`reminder_key` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '超时提醒任务ID,每个任务最多一条',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_notice_event` (`tenant_id`,`user_id`,`event_key`),
UNIQUE KEY `uk_notice_reminder` (`tenant_id`,`reminder_key`),
KEY `idx_notice_owner` (`tenant_id`,`user_id`,`created_at`),
KEY `idx_notice_due` (`status`,`scheduled_at`),
KEY `idx_notice_task` (`tenant_id`,`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='流程通知事件';
SET FOREIGN_KEY_CHECKS = 1;
+339 -220
View File
@@ -1,320 +1,439 @@
/*
my.cnf 设置数据库表名小写
--lower_case_table_names=1
*/
USE pigxx_job;
SET NAMES utf8;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for `job_execution_log`
-- ----------------------------
DROP TABLE IF EXISTS `job_execution_log`;
CREATE TABLE `job_execution_log` (
`id` varchar(40) NOT NULL,
`job_name` varchar(100) NOT NULL,
`task_id` varchar(255) NOT NULL,
`hostname` varchar(255) NOT NULL,
`ip` varchar(50) NOT NULL,
`sharding_item` int(11) NOT NULL,
`execution_source` varchar(20) NOT NULL,
`failure_cause` varchar(4000) DEFAULT NULL,
`is_success` int(11) NOT NULL,
`start_time` timestamp NULL DEFAULT NULL,
`complete_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='任务日志表';
-- ----------------------------
-- Table structure for `job_status_trace_log`
-- ----------------------------
DROP TABLE IF EXISTS `job_status_trace_log`;
CREATE TABLE `job_status_trace_log` (
`id` varchar(40) NOT NULL,
`job_name` varchar(100) NOT NULL,
`original_task_id` varchar(255) NOT NULL,
`task_id` varchar(255) NOT NULL,
`slave_id` varchar(50) NOT NULL,
`source` varchar(50) NOT NULL,
`execution_type` varchar(20) NOT NULL,
`sharding_item` varchar(100) NOT NULL,
`state` varchar(20) NOT NULL,
`message` varchar(4000) DEFAULT NULL,
`creation_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `TASK_ID_STATE_INDEX` (`task_id`,`state`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='任务轨迹表';
-- ----------------------------
-- Table structure for `qrtz_blob_triggers`
-- Table structure for qrtz_blob_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_blob_triggers`;
CREATE TABLE `qrtz_blob_triggers` (
`sched_name` varchar(120) NOT NULL,
`trigger_name` varchar(200) NOT NULL,
`trigger_group` varchar(200) NOT NULL,
`blob_data` blob,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE,
CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`blob_data` blob,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE,
CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Table structure for `qrtz_calendars`
-- Records of qrtz_blob_triggers
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for qrtz_calendars
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_calendars`;
CREATE TABLE `qrtz_calendars` (
`sched_name` varchar(120) NOT NULL,
`calendar_name` varchar(200) NOT NULL,
`calendar` blob NOT NULL,
PRIMARY KEY (`sched_name`,`calendar_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`calendar_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`calendar` blob NOT NULL,
PRIMARY KEY (`sched_name`,`calendar_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Table structure for `qrtz_cron_triggers`
-- Records of qrtz_calendars
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for qrtz_cron_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_cron_triggers`;
CREATE TABLE `qrtz_cron_triggers` (
`sched_name` varchar(120) NOT NULL,
`trigger_name` varchar(200) NOT NULL,
`trigger_group` varchar(200) NOT NULL,
`cron_expression` varchar(200) NOT NULL,
`time_zone_id` varchar(80) DEFAULT NULL,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE,
CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`cron_expression` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`time_zone_id` varchar(80) CHARACTER SET utf8mb4 DEFAULT NULL,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE,
CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Records of `qrtz_cron_triggers`
-- Records of qrtz_cron_triggers
-- ----------------------------
BEGIN;
INSERT INTO `qrtz_cron_triggers` VALUES ('clusteredScheduler', '测试任务', 'demo', '0 * * * * ? *', 'Asia/Shanghai');
COMMIT;
-- ----------------------------
-- Table structure for `qrtz_fired_triggers`
-- Table structure for qrtz_fired_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_fired_triggers`;
CREATE TABLE `qrtz_fired_triggers` (
`sched_name` varchar(120) NOT NULL,
`entry_id` varchar(95) NOT NULL,
`trigger_name` varchar(200) NOT NULL,
`trigger_group` varchar(200) NOT NULL,
`instance_name` varchar(200) NOT NULL,
`fired_time` bigint(13) NOT NULL,
`sched_time` bigint(13) NOT NULL,
`priority` int(11) NOT NULL,
`state` varchar(16) NOT NULL,
`job_name` varchar(200) DEFAULT NULL,
`job_group` varchar(200) DEFAULT NULL,
`is_nonconcurrent` varchar(1) DEFAULT NULL,
`requests_recovery` varchar(1) DEFAULT NULL,
PRIMARY KEY (`sched_name`,`entry_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`entry_id` varchar(95) CHARACTER SET utf8mb4 NOT NULL,
`trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`instance_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`fired_time` bigint NOT NULL,
`sched_time` bigint NOT NULL,
`priority` int NOT NULL,
`state` varchar(16) CHARACTER SET utf8mb4 NOT NULL,
`job_name` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL,
`job_group` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL,
`is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL,
`requests_recovery` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL,
PRIMARY KEY (`sched_name`,`entry_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Table structure for `qrtz_job_details`
-- Records of qrtz_fired_triggers
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for qrtz_job_details
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_job_details`;
CREATE TABLE `qrtz_job_details` (
`sched_name` varchar(120) NOT NULL,
`job_name` varchar(200) NOT NULL,
`job_group` varchar(200) NOT NULL,
`description` varchar(250) DEFAULT NULL,
`job_class_name` varchar(250) NOT NULL,
`is_durable` varchar(1) NOT NULL,
`is_nonconcurrent` varchar(1) NOT NULL,
`is_update_data` varchar(1) NOT NULL,
`requests_recovery` varchar(1) NOT NULL,
`job_data` blob,
PRIMARY KEY (`sched_name`,`job_name`,`job_group`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`job_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`job_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`description` varchar(250) CHARACTER SET utf8mb4 DEFAULT NULL,
`job_class_name` varchar(250) CHARACTER SET utf8mb4 NOT NULL,
`is_durable` varchar(1) CHARACTER SET utf8mb4 NOT NULL,
`is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 NOT NULL,
`is_update_data` varchar(1) CHARACTER SET utf8mb4 NOT NULL,
`requests_recovery` varchar(1) CHARACTER SET utf8mb4 NOT NULL,
`job_data` blob,
PRIMARY KEY (`sched_name`,`job_name`,`job_group`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Records of `qrtz_job_details`
-- Records of qrtz_job_details
-- ----------------------------
BEGIN;
INSERT INTO `qrtz_job_details` VALUES ('clusteredScheduler', '测试任务', 'demo', null, 'com.pig4cloud.pigx.daemon.quartz.config.PigxQuartzFactory', '0', '1', '0', '0', 0xaced0005737200156f72672e71756172747a2e4a6f62446174614d61709fb083e8bfa9b0cb020000787200266f72672e71756172747a2e7574696c732e537472696e674b65794469727479466c61674d61708208e8c3fbc55d280200015a0013616c6c6f77735472616e7369656e74446174617872001d6f72672e71756172747a2e7574696c732e4469727479466c61674d617013e62ead28760ace0200025a000564697274794c00036d617074000f4c6a6176612f7574696c2f4d61703b787001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c7708000000100000000174000b7363686564756c654a6f627372002e636f6d2e70696734636c6f75642e706967782e6461656d6f6e2e71756172747a2e656e746974792e5379734a6f6200000000000000010200174c0009636c6173734e616d657400124c6a6176612f6c616e672f537472696e673b4c0008637265617465427971007e00094c000a63726561746554696d657400194c6a6176612f74696d652f4c6f63616c4461746554696d653b4c000e63726f6e45787072657373696f6e71007e00094c000b657865637574655061746871007e00094c00106a6f624578656375746553746174757371007e00094c00086a6f6247726f757071007e00094c00056a6f6249647400134c6a6176612f6c616e672f496e74656765723b4c00076a6f624e616d6571007e00094c00086a6f624f7264657271007e00094c00096a6f6253746174757371007e00094c000d6a6f6254656e616e745479706571007e00094c00076a6f625479706571007e00094c000a6d6574686f644e616d6571007e00094c00116d6574686f64506172616d7356616c756571007e00094c000d6d697366697265506f6c69637971007e00094c00086e65787454696d6571007e000a4c000c70726576696f757354696d6571007e000a4c000672656d61726b71007e00094c0009737461727454696d6571007e000a4c000874656e616e74496471007e000b4c0008757064617465427971007e00094c000a75706461746554696d6571007e000a78720035636f6d2e62616f6d69646f752e6d796261746973706c75732e657874656e73696f6e2e6163746976657265636f72642e4d6f64656c0000000000000001020000787074000464656d6f74000561646d696e7372000d6a6176612e74696d652e536572955d84ba1b2248b20c00007870770a05000007e303190e00f17874000d30202a202a202a202a203f202a7400007400013074000464656d6f737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b02000078700000000174000ce6b58be8af95e4bbbbe58aa17400013574000133740001317400013274000a64656d6f4d6574686f6474000970696734636c6f7564740001337371007e0010770905000007e3031916e2787371007e0010770a05000007e30319161ccd78740020e6bc94e7a4ba537072696e67204265616ee79a84e5ae9ae697b6e4bbbbe58aa17371007e0010770a05000007e303191600de7871007e001874000561646d696e7371007e0010770a05000007e303190e00f1787800);
COMMIT;
-- ----------------------------
-- Table structure for `qrtz_locks`
-- Table structure for qrtz_locks
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_locks`;
CREATE TABLE `qrtz_locks` (
`sched_name` varchar(120) NOT NULL,
`lock_name` varchar(40) NOT NULL,
PRIMARY KEY (`sched_name`,`lock_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`lock_name` varchar(40) CHARACTER SET utf8mb4 NOT NULL,
PRIMARY KEY (`sched_name`,`lock_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Records of `qrtz_locks`
-- Records of qrtz_locks
-- ----------------------------
BEGIN;
INSERT INTO `qrtz_locks` VALUES ('clusteredScheduler', 'STATE_ACCESS'), ('clusteredScheduler', 'TRIGGER_ACCESS');
COMMIT;
-- ----------------------------
-- Table structure for `qrtz_paused_trigger_grps`
-- Table structure for qrtz_paused_trigger_grps
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`;
CREATE TABLE `qrtz_paused_trigger_grps` (
`sched_name` varchar(120) NOT NULL,
`trigger_group` varchar(200) NOT NULL,
PRIMARY KEY (`sched_name`,`trigger_group`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
PRIMARY KEY (`sched_name`,`trigger_group`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Table structure for `qrtz_scheduler_state`
-- Records of qrtz_paused_trigger_grps
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for qrtz_scheduler_state
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_scheduler_state`;
CREATE TABLE `qrtz_scheduler_state` (
`sched_name` varchar(120) NOT NULL,
`instance_name` varchar(200) NOT NULL,
`last_checkin_time` bigint(13) NOT NULL,
`checkin_interval` bigint(13) NOT NULL,
PRIMARY KEY (`sched_name`,`instance_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`instance_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`last_checkin_time` bigint NOT NULL,
`checkin_interval` bigint NOT NULL,
PRIMARY KEY (`sched_name`,`instance_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Records of `qrtz_scheduler_state`
-- Records of qrtz_scheduler_state
-- ----------------------------
BEGIN;
INSERT INTO `qrtz_scheduler_state` VALUES ('clusteredScheduler', 'lengleng1553564320591', '1553568907589', '10000');
COMMIT;
-- ----------------------------
-- Table structure for `qrtz_simple_triggers`
-- Table structure for qrtz_simple_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_simple_triggers`;
CREATE TABLE `qrtz_simple_triggers` (
`sched_name` varchar(120) NOT NULL,
`trigger_name` varchar(200) NOT NULL,
`trigger_group` varchar(200) NOT NULL,
`repeat_count` bigint(7) NOT NULL,
`repeat_interval` bigint(12) NOT NULL,
`times_triggered` bigint(10) NOT NULL,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE,
CONSTRAINT `QRTZ_SIMPLE_TRIGGERS_IBFK_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`repeat_count` bigint NOT NULL,
`repeat_interval` bigint NOT NULL,
`times_triggered` bigint NOT NULL,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE,
CONSTRAINT `QRTZ_SIMPLE_TRIGGERS_IBFK_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Table structure for `qrtz_simprop_triggers`
-- Records of qrtz_simple_triggers
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for qrtz_simprop_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_simprop_triggers`;
CREATE TABLE `qrtz_simprop_triggers` (
`sched_name` varchar(120) NOT NULL,
`trigger_name` varchar(200) NOT NULL,
`trigger_group` varchar(200) NOT NULL,
`str_prop_1` varchar(512) DEFAULT NULL,
`str_prop_2` varchar(512) DEFAULT NULL,
`str_prop_3` varchar(512) DEFAULT NULL,
`int_prop_1` int(11) DEFAULT NULL,
`int_prop_2` int(11) DEFAULT NULL,
`long_prop_1` bigint(20) DEFAULT NULL,
`long_prop_2` bigint(20) DEFAULT NULL,
`dec_prop_1` decimal(13,4) DEFAULT NULL,
`dec_prop_2` decimal(13,4) DEFAULT NULL,
`bool_prop_1` varchar(1) DEFAULT NULL,
`bool_prop_2` varchar(1) DEFAULT NULL,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE,
CONSTRAINT `QRTZ_SIMPROP_TRIGGERS_IBFK_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`str_prop_1` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL,
`str_prop_2` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL,
`str_prop_3` varchar(512) CHARACTER SET utf8mb4 DEFAULT NULL,
`int_prop_1` int DEFAULT NULL,
`int_prop_2` int DEFAULT NULL,
`long_prop_1` bigint DEFAULT NULL,
`long_prop_2` bigint DEFAULT NULL,
`dec_prop_1` decimal(13,4) DEFAULT NULL,
`dec_prop_2` decimal(13,4) DEFAULT NULL,
`bool_prop_1` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL,
`bool_prop_2` varchar(1) CHARACTER SET utf8mb4 DEFAULT NULL,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE,
CONSTRAINT `QRTZ_SIMPROP_TRIGGERS_IBFK_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Table structure for `qrtz_triggers`
-- Records of qrtz_simprop_triggers
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for qrtz_triggers
-- ----------------------------
DROP TABLE IF EXISTS `qrtz_triggers`;
CREATE TABLE `qrtz_triggers` (
`sched_name` varchar(120) NOT NULL,
`trigger_name` varchar(200) NOT NULL,
`trigger_group` varchar(200) NOT NULL,
`job_name` varchar(200) NOT NULL,
`job_group` varchar(200) NOT NULL,
`description` varchar(250) DEFAULT NULL,
`next_fire_time` bigint(13) DEFAULT NULL,
`prev_fire_time` bigint(13) DEFAULT NULL,
`priority` int(11) DEFAULT NULL,
`trigger_state` varchar(16) NOT NULL,
`trigger_type` varchar(8) NOT NULL,
`start_time` bigint(13) NOT NULL,
`end_time` bigint(13) DEFAULT NULL,
`calendar_name` varchar(200) DEFAULT NULL,
`misfire_instr` smallint(2) DEFAULT NULL,
`job_data` blob,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE,
KEY `sched_name` (`sched_name`,`job_name`,`job_group`) USING BTREE,
CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `job_name`, `job_group`) REFERENCES `qrtz_job_details` (`sched_name`, `job_name`, `job_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
`sched_name` varchar(120) CHARACTER SET utf8mb4 NOT NULL,
`trigger_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`trigger_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`job_name` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`job_group` varchar(200) CHARACTER SET utf8mb4 NOT NULL,
`description` varchar(250) CHARACTER SET utf8mb4 DEFAULT NULL,
`next_fire_time` bigint DEFAULT NULL,
`prev_fire_time` bigint DEFAULT NULL,
`priority` int DEFAULT NULL,
`trigger_state` varchar(16) CHARACTER SET utf8mb4 NOT NULL,
`trigger_type` varchar(8) CHARACTER SET utf8mb4 NOT NULL,
`start_time` bigint NOT NULL,
`end_time` bigint DEFAULT NULL,
`calendar_name` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL,
`misfire_instr` smallint DEFAULT NULL,
`job_data` blob,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`) USING BTREE,
KEY `sched_name` (`sched_name`,`job_name`,`job_group`) USING BTREE,
CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `job_name`, `job_group`) REFERENCES `qrtz_job_details` (`sched_name`, `job_name`, `job_group`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- ----------------------------
-- Records of `qrtz_triggers`
-- Records of qrtz_triggers
-- ----------------------------
BEGIN;
INSERT INTO `qrtz_triggers` VALUES ('clusteredScheduler', '测试任务', 'demo', '测试任务', 'demo', null, '1553568960000', '1553568900000', '5', 'WAITING', 'CRON', '1553564598000', '0', null, '2', '');
COMMIT;
-- ----------------------------
-- Table structure for `sys_job`
-- Table structure for sys_job
-- ----------------------------
DROP TABLE IF EXISTS `sys_job`;
CREATE TABLE `sys_job` (
`job_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '任务id',
`job_name` varchar(64) NOT NULL COMMENT '任务名称',
`job_group` varchar(64) NOT NULL COMMENT '任务组名',
`job_order` char(1) DEFAULT NULL COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1',
`job_type` char(1) NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他',
`execute_path` varchar(500) DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持rest get协议,需要增加String返回值,0成功,1失败;job_type=4时,jar路径;其它值为空',
`class_name` varchar(500) DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空',
`method_name` varchar(500) DEFAULT NULL COMMENT '任务方法',
`method_params_value` varchar(2000) DEFAULT NULL COMMENT '参数值',
`cron_expression` varchar(255) DEFAULT NULL COMMENT 'cron执行表达式',
`misfire_policy` varchar(20) DEFAULT '3' COMMENT '错失执行策略(1错失周期立即执行 2错失周期执行一次 3下周期执行)',
`job_tenant_type` char(1) DEFAULT '1' COMMENT '1、多租户任务;2、非多租户任务',
`job_status` char(1) DEFAULT '0' COMMENT '状态(1、未发布;2、运行中;3、暂停;4、删除;)',
`job_execute_status` char(1) DEFAULT '0' COMMENT '状态(0正常 1异常)',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`start_time` timestamp NULL DEFAULT NULL COMMENT '初次执行时间',
`previous_time` timestamp NULL DEFAULT NULL COMMENT '上次执行时间',
`next_time` timestamp NULL DEFAULT NULL COMMENT '下次执行时间',
`tenant_id` int(11) DEFAULT '1' COMMENT '租户',
`remark` varchar(500) DEFAULT '' COMMENT '备注信息',
PRIMARY KEY (`job_id`,`job_name`,`job_group`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='定时任务调度表';
`job_id` bigint NOT NULL COMMENT '任务id',
`job_name` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '任务名称',
`job_group` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '任务组名',
`job_order` char(1) CHARACTER SET utf8mb4 DEFAULT '1' COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1',
`job_type` char(1) CHARACTER SET utf8mb4 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他',
`execute_path` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持rest get协议,需要增加String返回值,0成功,1失败;job_type=4时,jar路径;其它值为空',
`class_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空',
`method_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务方法',
`method_params_value` varchar(2000) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '参数值',
`cron_expression` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'cron执行表达式',
`misfire_policy` varchar(20) CHARACTER SET utf8mb4 DEFAULT '3' COMMENT '错失执行策略(1错失周期立即执行 2错失周期执行一次 3下周期执行)',
`job_tenant_type` char(1) CHARACTER SET utf8mb4 DEFAULT '1' COMMENT '1、多租户任务;2、非多租户任务',
`job_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '状态(1、未发布;2、运行中;3、暂停;4、删除;)',
`job_execute_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '状态(0正常 1异常)',
`create_by` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`start_time` timestamp NULL DEFAULT NULL COMMENT '初次执行时间',
`previous_time` timestamp NULL DEFAULT NULL COMMENT '上次执行时间',
`next_time` timestamp NULL DEFAULT NULL COMMENT '下次执行时间',
`tenant_id` bigint DEFAULT '1' COMMENT '租户',
`remark` varchar(500) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '备注信息',
PRIMARY KEY (`job_id`,`job_name`,`job_group`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务调度表';
-- ----------------------------
-- Records of `sys_job`
-- Records of sys_job
-- ----------------------------
BEGIN;
INSERT INTO `sys_job` VALUES ('1', '测试任务', 'demo', '5', '2', '', 'demo', 'demoMethod', 'pig4cloud', '0 * * * * ? *', '3', '1', '2', '0', 'admin', '2019-03-25 14:00:14', 'admin', '2019-03-25 14:00:14', '2019-03-26 09:43:18', '2019-03-26 10:55:00', '2019-03-26 10:56:00', '1', '演示Spring Bean的定时任务');
COMMIT;
-- ----------------------------
-- Table structure for `sys_job_log`
-- Table structure for sys_job_log
-- ----------------------------
DROP TABLE IF EXISTS `sys_job_log`;
CREATE TABLE `sys_job_log` (
`job_log_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '任务日志ID',
`job_id` int(11) NOT NULL COMMENT '任务id',
`job_name` varchar(64) DEFAULT NULL COMMENT '任务名称',
`job_group` varchar(64) DEFAULT NULL COMMENT '任务组名',
`job_order` char(1) DEFAULT NULL COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1',
`job_type` char(1) NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他',
`execute_path` varchar(500) DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持post协议;job_type=4时,jar路径;其它值为空',
`class_name` varchar(500) DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空',
`method_name` varchar(500) DEFAULT NULL COMMENT '任务方法',
`method_params_value` varchar(2000) DEFAULT NULL COMMENT '参数值',
`cron_expression` varchar(255) DEFAULT NULL COMMENT 'cron执行表达式',
`job_message` varchar(500) DEFAULT NULL COMMENT '日志信息',
`job_log_status` char(1) DEFAULT '0' COMMENT '执行状态(0正常 1失败)',
`execute_time` varchar(30) DEFAULT NULL COMMENT '执行时间',
`exception_info` varchar(2000) DEFAULT '' COMMENT '异常信息',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`tenant_id` int(11) NOT NULL DEFAULT '1' COMMENT '租户id',
PRIMARY KEY (`job_log_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='定时任务执行日志表';
`job_log_id` bigint NOT NULL COMMENT '任务日志ID',
`job_id` bigint NOT NULL COMMENT '任务id',
`job_name` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务名称',
`job_group` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务组名',
`job_order` char(1) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '组内执行顺利,值越大执行优先级越高,最大值9,最小值1',
`job_type` char(1) CHARACTER SET utf8mb4 NOT NULL DEFAULT '1' COMMENT '1、java类;2、spring bean名称;3、rest调用;4、jar调用;9其他',
`execute_path` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=3时,rest调用地址,仅支持post协议;job_type=4时,jar路径;其它值为空',
`class_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'job_type=1时,类完整路径;job_type=2时,spring bean名称;其它值为空',
`method_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '任务方法',
`method_params_value` varchar(2000) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '参数值',
`cron_expression` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'cron执行表达式',
`job_message` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '日志信息',
`job_log_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '执行状态(0正常 1失败)',
`execute_time` varchar(30) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '执行时间',
`exception_info` varchar(2000) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '异常信息',
`scheduled_fire_time` datetime DEFAULT NULL COMMENT '计划触发时间',
`fire_instance_id` varchar(128) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT 'Quartz触发实例ID',
`dedup_status` char(1) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '去重状态(0正常执行 1同一触发点重复 2任务运行中跳过)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`tenant_id` bigint NOT NULL DEFAULT '1' COMMENT '租户id',
PRIMARY KEY (`job_log_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时任务执行日志表';
CREATE TABLE `xxl_job_group` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
`title` varchar(64) NOT NULL COMMENT '执行器名称',
`address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
`address_list` text COMMENT '执行器地址列表,多地址逗号分隔',
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_registry` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`registry_group` varchar(50) NOT NULL,
`registry_key` varchar(255) NOT NULL,
`registry_value` varchar(255) NOT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
`job_desc` varchar(255) NOT NULL,
`add_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`author` varchar(64) DEFAULT NULL COMMENT '作者',
`alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
`schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型',
`schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',
`misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',
`executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
`executor_handler` varchar(255) DEFAULT NULL COMMENT '任务handler',
`executor_param` text DEFAULT NULL COMMENT '任务参数',
`executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
`executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
`glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
`glue_source` mediumtext COMMENT 'GLUE源代码',
`glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
`glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
`child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
`trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
`trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
`trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_logglue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
`glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
`glue_source` mediumtext COMMENT 'GLUE源代码',
`glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
`add_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
`executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
`executor_handler` varchar(255) DEFAULT NULL COMMENT '任务handler',
`executor_param` text DEFAULT NULL COMMENT '任务参数',
`executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '任务分片参数,格式如 1/2',
`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
`trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
`trigger_code` int(11) NOT NULL COMMENT '调度-结果',
`trigger_msg` text COMMENT '调度-日志',
`handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
`handle_code` int(11) NOT NULL COMMENT '执行-状态',
`handle_msg` text COMMENT '执行-日志',
`alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
PRIMARY KEY (`id`),
KEY `I_trigger_time` (`trigger_time`),
KEY `I_handle_code` (`handle_code`),
KEY `I_jobgroup` (`job_group`),
KEY `I_jobid` (`job_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_log_report` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',
`running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
`suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
`fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_lock` (
`lock_name` varchar(50) NOT NULL COMMENT '锁名称',
PRIMARY KEY (`lock_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '账号',
`password` varchar(100) NOT NULL COMMENT '密码加密信息',
`token` varchar(100) DEFAULT NULL COMMENT '登录token',
`role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
`permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
PRIMARY KEY (`id`),
UNIQUE KEY `i_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`)
VALUES (1, 'pigx-daemon-elastic-job', 'PIGX定时任务执行器', 0, NULL, now());
INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`,
`schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`,
`executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`,
`executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`,
`child_jobid`)
VALUES (1, 1, '示例任务01', now(), now(), 'XXL', '', 'CRON', '0 0 0 * * ? *',
'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化',
now(), '');
INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`)
VALUES (1, 'admin', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 1, NULL);
INSERT INTO `xxl_job_lock` (`lock_name`)
VALUES ('schedule_lock');
commit;
SET FOREIGN_KEY_CHECKS = 1;
+163 -98
View File
@@ -1,132 +1,197 @@
/*
Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50723
Source Host : localhost
Source Database : pigxx_mp
Target Server Type : MySQL
Target Server Version : 50723
File Encoding : utf-8
Date: 04/15/2019 22:16:01 PM
*/
USE pigxx_mp;
SET NAMES utf8;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for `wx_account`
-- Table structure for wx_account
-- ----------------------------
DROP TABLE IF EXISTS `wx_account`;
CREATE TABLE `wx_account` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(100) DEFAULT NULL COMMENT '公众号名称',
`account` varchar(100) DEFAULT NULL COMMENT '公众号账户',
`appid` varchar(100) DEFAULT NULL COMMENT '公众号appid',
`appsecret` varchar(100) DEFAULT NULL COMMENT '公众号密钥',
`url` varchar(100) DEFAULT NULL COMMENT '公众号url',
`token` varchar(100) DEFAULT NULL COMMENT '公众号token',
`aeskey` varchar(300) DEFAULT NULL COMMENT '加密密钥',
`qr_url` varchar(200) DEFAULT NULL COMMENT '二维码图片URL',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标记',
`tenant_id` int(11) DEFAULT NULL COMMENT '租户Id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='公众号账户表';
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '名称',
`account` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '账号',
`appid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用ID',
`appsecret` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用秘钥',
`url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'URL地址',
`token` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Token令牌',
`aeskey` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '消息加解密密钥',
`qr_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '二维码URL地址',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='公众号账户表';
-- ----------------------------
-- Table structure for `wx_account_fans`
-- Records of wx_account
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for wx_account_fans
-- ----------------------------
DROP TABLE IF EXISTS `wx_account_fans`;
CREATE TABLE `wx_account_fans` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`openid` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '用户标识',
`subscribe_status` char(1) CHARACTER SET utf8 DEFAULT NULL COMMENT '订阅状态,0未关注,1已关注',
`id` bigint(20) NOT NULL COMMENT '主键ID',
`openid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '粉丝openid',
`subscribe_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '订阅状态,0未订阅,1已订阅',
`subscribe_time` datetime DEFAULT NULL COMMENT '订阅时间',
`nickname` varchar(255) DEFAULT NULL COMMENT '昵称',
`gender` varchar(10) CHARACTER SET utf8 DEFAULT NULL COMMENT '性别,1男,2女,0未知',
`language` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT '语言',
`country` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT '国家',
`province` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT '省份',
`city` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT '城市',
`headimg_url` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT '头像地址',
`remark` varchar(500) CHARACTER SET utf8 DEFAULT NULL COMMENT '备注',
`wx_account_id` int(11) DEFAULT NULL COMMENT '微信公众号ID',
`wx_account_name` varchar(32) CHARACTER SET utf8 DEFAULT NULL,
`wx_account_appid` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '微信公众号appid',
`nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '昵称',
`gender` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别',
`language` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '语言',
`country` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '国家',
`province` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省份',
`city` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '城市',
`tag_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组ID',
`headimg_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '头像URL地址',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注信息',
`wx_account_id` bigint(20) DEFAULT NULL COMMENT '微信公众号ID',
`wx_account_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信公众号名称',
`wx_account_appid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信公众号AppID',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` char(1) CHARACTER SET utf8 NOT NULL DEFAULT '0' COMMENT '删除标记',
`tenant_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_1` (`openid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信公众号粉丝表';
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
`is_black` int(255) DEFAULT NULL COMMENT '是否在黑名单',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_1` (`openid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信公众号粉丝表';
-- ----------------------------
-- Table structure for `wx_fans_msg`
-- Records of wx_account_fans
-- ----------------------------
DROP TABLE IF EXISTS `wx_fans_msg`;
CREATE TABLE `wx_fans_msg` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
`openid` varchar(100) DEFAULT NULL COMMENT '用户标识',
`nickname` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '昵称',
`headimg_url` varchar(500) DEFAULT NULL COMMENT '头像地址',
`wx_account_appid` varchar(255) DEFAULT NULL,
`wx_account_name` varchar(255) DEFAULT NULL,
`wx_account_id` int(11) DEFAULT NULL COMMENT '微信账号ID',
`msg_id` bigint(20) DEFAULT NULL COMMENT '消息ID',
`msg_type` varchar(32) DEFAULT NULL COMMENT '消息类型',
`content` varchar(500) DEFAULT NULL COMMENT '内容',
`res_content` varchar(3000) DEFAULT NULL COMMENT '最近一条回复内容',
`is_res` char(1) DEFAULT '0' COMMENT '是否已回复',
`media_id` varchar(100) DEFAULT NULL COMMENT '微信素材ID',
`pic_url` varchar(500) DEFAULT NULL COMMENT '微信图片URL',
`pic_path` varchar(500) DEFAULT NULL COMMENT '本地图片路径',
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for wx_account_tag
-- ----------------------------
DROP TABLE IF EXISTS `wx_account_tag`;
CREATE TABLE `wx_account_tag` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tag` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标签名称',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '创建人',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '修改人',
`create_time` datetime COMMENT '创建时间',
`update_time` datetime COMMENT '修改时间',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标记,0未删除,1已删除',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
`wx_account_id` bigint(20) NOT NULL COMMENT '微信公众号ID',
`wx_account_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '微信公众号名称',
`wx_account_appid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '微信公众号AppID',
`tag_id` bigint(20) NOT NULL COMMENT '标签ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信公众号标签表';
-- ----------------------------
-- Records of wx_account_tag
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for wx_auto_reply
-- ----------------------------
DROP TABLE IF EXISTS `wx_auto_reply`;
CREATE TABLE `wx_auto_reply` (
`id` bigint(20) NOT NULL COMMENT '主键',
`type` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类型(1、关注时回复;2、消息回复;3、关键词回复)',
`req_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关键词',
`req_type` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请求消息类型(text:文本;image:图片;voice:语音;video:视频;shortvideo:小视频;location:地理位置)',
`rep_type` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复消息类型(text:文本;image:图片;voice:语音;video:视频;music:音乐;news:图文)',
`rep_mate` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复类型文本匹配类型(1、全匹配,2、半匹配)',
`rep_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '回复类型文本保存文字',
`rep_media_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复类型imge、voice、news、video的mediaID或音乐缩略图的媒体id',
`rep_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复的素材名、视频和音乐的标题',
`rep_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '视频和音乐的描述',
`rep_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '链接',
`rep_hq_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '高质量链接',
`rep_thumb_media_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '缩略图的媒体id',
`rep_thumb_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '缩略图url',
`content` json DEFAULT NULL COMMENT '图文消息的内容',
`app_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号ID',
`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '逻辑删除标记(0:显示;1:隐藏)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` char(1) DEFAULT '0' COMMENT '删除标记',
`tenant_id` int(11) DEFAULT NULL COMMENT '租户',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='粉丝消息表 ';
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信自动回复';
-- ----------------------------
-- Table structure for `wx_fans_msg_res`
-- Records of wx_auto_reply
-- ----------------------------
DROP TABLE IF EXISTS `wx_fans_msg_res`;
CREATE TABLE `wx_fans_msg_res` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`fans_msg_id` int(11) DEFAULT NULL COMMENT '粉丝消息ID',
`res_content` text COMMENT '回复内容',
`user_id` varchar(32) DEFAULT NULL COMMENT '用户ID',
`user_name` varchar(32) DEFAULT NULL COMMENT '用户名',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` char(1) DEFAULT '0' COMMENT '删除标识',
`tenant_id` int(11) DEFAULT NULL COMMENT '租户表',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='回复粉丝消息历史表 ';
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for `wx_menu`
-- Table structure for wx_mp_menu
-- ----------------------------
DROP TABLE IF EXISTS `wx_mp_menu`;
CREATE TABLE `wx_mp_menu` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
`id` bigint(20) NOT NULL COMMENT '主键',
`menu` json DEFAULT NULL COMMENT '菜单',
`wx_account_id` int(11) DEFAULT NULL,
`wx_account_appid` varchar(100) DEFAULT NULL,
`wx_account_name` varchar(32) DEFAULT NULL,
`wx_account_id` bigint(20) DEFAULT NULL COMMENT '公众号ID',
`wx_account_appid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号APPID',
`wx_account_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号名称',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` char(1) DEFAULT '0' COMMENT '删除标记',
`tenant_id` int(11) DEFAULT NULL COMMENT '租户ID',
`pub_flag` char(1) DEFAULT '0' COMMENT '发布标志',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='微信菜单表';
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
`pub_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '发布标志',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信菜单表';
-- ----------------------------
-- Records of wx_mp_menu
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for wx_msg
-- ----------------------------
DROP TABLE IF EXISTS `wx_msg`;
CREATE TABLE `wx_msg` (
`id` bigint(20) NOT NULL COMMENT '主键',
`app_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号名称',
`app_logo` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号logo',
`wx_user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '微信用户ID',
`nick_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信用户昵称',
`headimg_url` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信用户头像',
`type` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '消息分类(1、用户发给公众号;2、公众号发给用户;)',
`rep_type` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '消息类型(text:文本;image:图片;voice:语音;video:视频;shortvideo:小视频;location:地理位置;music:音乐;news:图文;event:推送事件)',
`rep_event` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '事件类型(subscribe:关注;unsubscribe:取关;CLICK、VIEW:菜单事件)',
`rep_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '回复类型文本保存文字、地理位置信息',
`rep_media_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复类型imge、voice、news、video的mediaID或音乐缩略图的媒体id',
`rep_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回复的素材名、视频和音乐的标题',
`rep_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '视频和音乐的描述',
`rep_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '链接',
`rep_hq_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '高质量链接',
`content` json DEFAULT NULL COMMENT '图文消息的内容',
`rep_thumb_media_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '缩略图的媒体id',
`rep_thumb_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '缩略图url',
`rep_location_x` double DEFAULT NULL COMMENT '地理位置维度',
`rep_location_y` double DEFAULT NULL COMMENT '地理位置经度',
`rep_scale` double DEFAULT NULL COMMENT '地图缩放大小',
`read_flag` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '已读标记(1:是;0:否)',
`app_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公众号ID',
`open_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信唯一标识',
`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '逻辑删除标记(0:显示;1:隐藏)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信消息';
-- ----------------------------
-- Records of wx_msg
-- ----------------------------
BEGIN;
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
+265 -110
View File
@@ -1,99 +1,125 @@
/*
Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50723
Source Host : localhost
Source Database : pigxx_config
Target Server Type : MySQL
Target Server Version : 50723
File Encoding : utf-8
Date: 05/18/2019 15:19:14 PM
*/
USE pigxx_config;
SET NAMES utf8;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for `config_info`
-- Table structure for config_info
-- ----------------------------
DROP TABLE IF EXISTS `config_info`;
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
`group_id` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`group_id` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'group_id',
`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COLLATE utf8_bin COMMENT 'source user',
`src_ip` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,
`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
`c_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL,
`c_use` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`effect` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`type` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`c_schema` text COLLATE utf8_bin,
`c_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT 'configuration description',
`c_use` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'configuration usage',
`effect` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '配置生效的描述',
`type` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '配置的类型',
`c_schema` text COLLATE utf8_bin COMMENT '配置的模式',
`encrypted_data_key` varchar(1024) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '密钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
-- ----------------------------
-- Records of `config_info`
-- Records of config_info
-- ----------------------------
BEGIN;
INSERT INTO `config_info` VALUES ('1', 'application-dev.yml', 'DEFAULT_GROUP', 'jasypt:\n encryptor:\n password: pigx\n\nspring:\n redis:\n password:\n host: ${REDIS-HOST:pigx-redis}\n\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\'\n\nfeign:\n hystrix:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n# hystrix If you need to use ThreadLocal bound variables in your RequestInterceptor`s\n# you will need to either set the thread isolation strategy for Hystrix to `SEMAPHORE or disable Hystrix in Feign.\nhystrix:\n command:\n default:\n execution:\n isolation:\n strategy: SEMAPHORE\n thread:\n timeoutInMilliseconds: 60000\n shareSecurityContext: true\n\n\nribbon:\n ReadTimeout: 10000\n ConnectTimeout: 10000\n\n\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n\n\nswagger:\n title: PigX Swagger API\n license: Powered By PigX\n licenseUrl: https://pig4cloud.com/\n terms-of-service-url: https://pig4cloud.com/\n contact:\n email: wangiegie@gmail.com\n url: https://pig4cloud.com/about.html\n authorization:\n name: pigX OAuth\n auth-regex: ^.*$\n authorization-scope-list:\n - scope: server\n description: server all\n token-url-list:\n - http://${GATEWAY-HOST:pigx-gateway}:${GATEWAY-PORT:9999}/auth/oauth/token\n\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /actuator/**\n - /v2/api-docs\n resource:\n loadBalanced: true\n token-info-uri: http://${AUTH-HOST:pigx-auth}/oauth/check_token\n\n#dsdsa来电二中文呀', '4d6f2c325d0c230431b2d298069182f6', '2019-04-18 02:10:20', '2019-05-07 21:05:09', null, '0:0:0:0:0:0:0:1', '', '', '通用配置文件', null, null, 'yaml', null), ('2', 'pigx-activiti-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n client-id: ENC(gPFcUOmJm8WqM3k3eSqS0Q==)\n client-secret: ENC(gPFcUOmJm8WqM3k3eSqS0Q==)\n scope: server\n ignore-urls:\n - \'/actuator/**\'\n - \'/v2/api-docs\'\n - \'/editor-app/**\'\n - \'/modeler.html\'\n - \'/ws/**\'\nspring:\n autoconfigure:\n exclude: org.activiti.spring.boot.SecurityAutoConfiguration\n activiti:\n check-process-definitions: false\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL-USER:root}\n password: ${MYSQL-PWD:root}\n url: jdbc:mysql://${MYSQL-HOST:pigx-mysql}:${MYSQL-PORT:3306}/${MYSQL-DB:pigxx_ac}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true\n\n# 租户表维护\npigx:\n tenant:\n column: tenant_id\n tables:\n - oa_leave_bill', 'f9ae6f353c354f3a398373a6fe93e543', '2019-04-18 02:10:56', '2019-05-14 15:14:56', null, '127.0.0.1', '', '', '工作流配置文件', null, null, 'yaml', null), ('3', 'pigx-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL-USER:root}\n password: ${MYSQL-PWD:root}\n url: jdbc:mysql://${MYSQL-HOST:pigx-mysql}:${MYSQL-PORT:3306}/${MYSQL-DB:pigxx}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/', '7065ac5cb6d799bfd290ad3eaf19d838', '2019-04-18 02:11:32', '2019-05-14 15:15:26', null, '127.0.0.1', '', '', '认证中心配置文件', null, null, 'yaml', null), ('4', 'pigx-codegen-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n client-id: ENC(gPFcUOmJm8WqM3k3eSqS0Q==)\n client-secret: ENC(gPFcUOmJm8WqM3k3eSqS0Q==)\n scope: server\n# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL-USER:root}\n password: ${MYSQL-PWD:root}\n url: jdbc:mysql://${MYSQL-HOST:pigx-mysql}:${MYSQL-PORT:3306}/${MYSQL-DB:pigxx}?cLine truncated
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`,
`src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`,
`encrypted_data_key`)
VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP',
'# 配置文件加密根密码\njasypt:\n encryptor:\n password: pigx\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n\nspring:\n jackson:\n use-jackson2-defaults: true\n data:\n redis:\n host: pigx-redis\n servlet:\n multipart:\n max-file-size: 100MB\n max-request-size: 100MB\n cloud:\n refresh:\n never-refreshable: dataSource\n compatibility-verifier:\n enabled: false\n nacos:\n discovery:\n naming-async-query-subscribe-service: true\n sentinel:\n eager: true\n transport:\n dashboard: pigx-sentinel:5020\n openfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n connection-timeout: 20000\n compression:\n request:\n min-request-size: 5120\n enabled: true\n response:\n enabled: true\n\n# 端点对外暴露\nmanagement:\n endpoints:\n web:\n exposure:\n include: \' *\' \n endpoint:\n restart:\n access: none\n health:\n show-details: ALWAYS\n\n#开启灰度\ngray:\n rule:\n enabled: true\n\n# liteflow配置\nliteflow:\n # 分支超时时间调整为 150 秒\n when-max-wait-time: 150000\n\n# mybatis-plus 配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n capitalMode: true\n banner: false\n db-config:\n id-type: auto\n where-strategy: not_empty\n insert-strategy: not_empty\n update-strategy: not_null\n sequence:\n worker-id: ${random.int(1,31)}\n datacenter-id: ${random.int(1,31)}\n type-handlers-package: com.pig4cloud.pigx.common.data.handler\n configuration:\n jdbc-type-for-null: \'null\'\n call-setters-on-nulls: true\n shrink-whitespaces-in-sql: true\nmybatis-plus-join:\n banner: false #关闭连表查询组件banner',
'0dc3faa0d9871245282f6b7d4f2249c0', '2022-12-16 10:44:25', '2023-08-14 11:44:19', 'nacos', '127.0.0.1', '',
'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (2, 'pigx-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/\n\n# 前端登录验证码\nsecurity:\n encodeKey: \'pigxpigxpigxpigx\'\n# 验证码相关配置参考: http://t.cn/A647jEdu\naj:\n captcha:\n cache-type: redis\n water-mark: pig4cloud', 'bb6bd9b9e21afdec3d6c88636387df96', '2022-12-16 10:44:25', '2024-04-20 22:47:21', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (3, 'pigx-codegen-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_codegen}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n', 'e9ca4622d920568cb5daf08145b63b1e', '2022-12-16 10:44:25', '2024-02-22 15:08:09', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (4, 'pigx-daemon-elastic-job-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n\n# XXL-Job 配置\nxxl:\n job:\n accessToken: default_token', 'ac1b92ceacc451eac15942131e04c6dd', '2022-12-16 10:44:25', '2023-04-07 14:14:50', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (5, 'pigx-gateway-dev.yml', 'DEFAULT_GROUP', '# 固定路由转发配置 无修改\nspring:\n cloud:\n gateway:\n server:\n webflux:\n routes:\n - id: openapi\n uri: lb://pigx-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?<path>.*), /$\\{path}/$\\{path}/v3/api-docs\n\n# gateway 刷新端点\nmanagement:\n endpoint:\n gateway:\n access: unrestricted\n', 'd9454d877ff3d8bd3fd0d5be99810195', '2022-12-16 10:44:25', '2024-04-20 22:47:02', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (6, 'pigx-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n # 安全配置\n security:\n user:\n name: ENC(rZHA4LW5hHmhLAAzJoFNag==) # pigx\n password: ENC(bjeyh+Aeii3kHXkoo00ZUw==) # pigx\n autoconfigure:\n exclude: com.pig4cloud.pigx.common.core.config.JacksonConfiguration\n boot:\n admin:\n ui:\n title: \'pigx 服务状态监控\'\n brand: \'pigx 服务状态监控\'\n external-views:\n - label: \"SQL监控\"\n url: /druid/sql.html\n order: 2000\n iframe: true\nmanagement:\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS #显示详细信息\n\n\n# druid 监控的服务\nmonitor:\n applications:\n - pigx-upms-biz\n', '2bb39e4dee3f90d4186d1e42aa666d2a', '2022-12-16 10:44:25', '2023-04-07 14:12:09', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (7, 'pigx-upms-biz-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /druid/**\n\n# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n stat-view-servlet:\n enabled: true\n allow: \"\"\n url-pattern: /druid/*\n #login-username: admin\n #login-password: admin\n filter:\n stat:\n enabled: true\n log-slow-sql: true\n slow-sql-millis: 10000\n merge-sql: false\n wall:\n config:\n multi-statement-allow: true\n\n# 本地文件系统\nfile:\n type: local\n local:\n basePath: /Users/lengleng/Downloads/files', '31570b7a880625228335b7f7e5aaa312', '2022-12-16 10:44:25', '2024-02-22 15:08:36', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (8, 'pigx-daemon-quartz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n', 'caa1a7ea301239a18e9a43699e43707e', '2022-12-16 10:44:25', '2024-04-19 21:49:00', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (9, 'pigx-pay-platform-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_pay}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/\n# 租户表维护\npigx:\n pay:\n test: lengleng\n aliPayConfig:\n expire-time: 30\n return-url: http://pig4cloud.com\n notify-url: http://payx.yunjihuitong.com/pay/notify/ali/callbak\n wxPayConfig:\n notify-url: https://admin.pig4cloud.com/pay/notify/wx/callbak\n mergePayConfig:\n return-url: http://pig4cloud.com\n notify-url: http://wechat.pigx.top/pay/notify/merge/callbak\n xsequence: #发号器相关配置\n db:\n retry-times: 3\n table-name: pay_sequence', 'f4e5734a99f3c1f059071deac081b33d', '2022-12-16 10:44:25', '2024-02-22 15:09:08', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (11, 'pigx-mp-platform-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_mp}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n', 'ae40865200e414d06d63d96f257f372e', '2022-12-16 10:44:25', '2024-02-22 15:09:20', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (12, 'pigx-xxl-job-admin-dev.yml', 'DEFAULT_GROUP', '# XXL-Job Admin 微服务配置\n# Actuator 监控配置\nmanagement:\n endpoints:\n web:\n base-path: /actuator\n health:\n mail:\n enabled: false\n\n# Spring 配置\nspring:\n # MVC 配置\n mvc:\n servlet:\n load-on-startup: 0\n static-path-pattern: /static/**\n\n # 静态资源配置\n web:\n resources:\n static-locations: classpath:/static/\n\n # Freemarker 模板引擎配置\n freemarker:\n template-loader-path: classpath:/templates/\n suffix: .ftl\n charset: UTF-8\n request-context-attribute: request\n settings:\n number_format: 0.##########\n new_builtin_class_resolver: safer\n\n # 数据源配置\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n\n # 邮件服务配置\n mail:\n host: smtp.qq.com\n port: 25\n username: xxx@qq.com\n from: xxx@qq.com\n password: xxx\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n socketFactory:\n class: javax.net.ssl.SSLSocketFactory\n\n# MyBatis 配置\nmybatis:\n mapper-locations: classpath:/mapper/**/*Mapper.xml\n\n# XXL-Job 配置\nxxl:\n job:\n # 访问令牌\n accessToken: default_token\n # 超时时间(秒)\n timeout: 3\n # 国际化 (zh_CN, zh_TC, en)\n i18n: zh_CN\n # 触发器线程池最大线程数\n triggerpool:\n fast:\n max: 300\n slow:\n max: 200\n # 调度批次大小\n schedule:\n batchsize: 100\n # 日志保留天数\n logretentiondays: 30\n\n# XXL-SSO 单点登录配置\nxxl-sso:\n token:\n key: xxl_job_login_token\n timeout: 604800000\n client:\n excluded:\n paths:\n login:\n path: /auth/login', 'e4e88bd4e91599ae03854a8dfe491786', '2022-12-16 10:44:25', '2026-05-01 23:02:41', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (13, 'pigx-report-platform-dev.yml', 'DEFAULT_GROUP', 'spring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_report}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n jpa:\n database-platform: org.hibernate.dialect.MySQLDialect\n\nsecurity:\n oauth2:\n client:\n ignore-urls:\n - /\n - /api/project/getData\n - /static/**\n - /api/project/get-file/*\n\n# 文件上传路径\ngv:\n img-path: /Users/lengleng/Downloads/img/\n', 'ce3fde4b4592cdd61feb2e443b2ddfe5', '2022-12-16 10:44:25', '2023-04-07 12:56:57', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (14, 'pigx-jimu-platform-dev.yml', 'DEFAULT_GROUP', 'spring:\n #配置静态资源\n mvc:\n static-path-pattern: /**\n #配置数据库\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_bi}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n \n#JimuReport[minidao配置]\nminidao :\n base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\n db-type: mysql\n#JimuReport[上传配置]\njeecg :\n jmreport:\n customPrePath: /api/jimu\n # 自动保存\n autoSave: true\n # 单位毫秒 默认5*60*1000 \n interval: 10000\n # local|minio|alioss\n uploadType: local\n # local\n path :\n #文件路径A\n upload: ~/jimu/data\n # alioss\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n staticDomain: ??\n bucketName: ??\n # minio\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: ??\n#输出sql日志\nlogging:\n level:\n org.jeecg.modules.jmreport : debug', '898d86e9ae9110a0081f7d346487fe6a', '2022-12-16 10:44:25', '2024-01-30 20:44:36', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (15, 'pigx-app-server-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_app}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true', 'e4668a1854e92a5a666e83479ef7d26a', '2022-12-19 10:30:07', '2024-02-22 15:09:50', 'nacos', '127.0.0.1', '', 'public', '', '', '', 'yaml', '', '');
INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`) VALUES (16, 'pigx-flow-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n druid:\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n url: jdbc:mysql://${MYSQL_HOST:pigx-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pigxx_flow}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&nullCatalogMeansCurrent=true\n\n# flowable 配置\nflowable:\n variable-json-mapper: jackson2', '233121e20445609e1ba378c3686ea7d5', '2023-07-28 13:41:32', '2023-07-28 13:43:36', 'nacos', '127.0.0.1', '', 'public', 'flowable 工作引擎', '', '', 'yaml', '', '');
COMMIT;
-- ----------------------------
-- Table structure for `config_info_aggr`
-- ----------------------------
DROP TABLE IF EXISTS `config_info_aggr`;
CREATE TABLE `config_info_aggr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
`group_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
`datum_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'datum_id',
`content` longtext COLLATE utf8_bin NOT NULL COMMENT '内容',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
-- ----------------------------
-- Table structure for `config_info_beta`
-- Table structure for config_info_beta
-- ----------------------------
DROP TABLE IF EXISTS `config_info_beta`;
CREATE TABLE `config_info_beta` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
`beta_ips` varchar(1024) COLLATE utf8_bin DEFAULT NULL COMMENT 'betaIps',
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COLLATE utf8_bin COMMENT 'source user',
`src_ip` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` varchar(1024) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '密钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
-- ----------------------------
-- Table structure for `config_info_tag`
-- Records of config_info_beta
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for config_info_gray
-- ----------------------------
DROP TABLE IF EXISTS `config_info_gray`;
CREATE TABLE `config_info_gray` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`src_user` text COMMENT 'src_user',
`src_ip` varchar(100) DEFAULT NULL COMMENT 'src_ip',
`gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_create',
`gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_modified',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`gray_name` varchar(128) NOT NULL COMMENT 'gray_name',
`gray_rule` text NOT NULL COMMENT 'gray_rule',
`encrypted_data_key` varchar(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`),
KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`),
KEY `idx_gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='config_info_gray';
-- ----------------------------
-- Records of config_info_gray
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for config_info_tag
-- ----------------------------
DROP TABLE IF EXISTS `config_info_tag`;
CREATE TABLE `config_info_tag` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
@@ -101,136 +127,265 @@ CREATE TABLE `config_info_tag` (
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COLLATE utf8_bin COMMENT 'source user',
`src_ip` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
-- ----------------------------
-- Table structure for `config_tags_relation`
-- Records of config_info_tag
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for config_tags_relation
-- ----------------------------
DROP TABLE IF EXISTS `config_tags_relation`;
CREATE TABLE `config_tags_relation` (
`id` bigint(20) NOT NULL COMMENT 'id',
`id` bigint NOT NULL COMMENT 'id',
`tag_name` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_name',
`tag_type` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'tag_type',
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
`nid` bigint(20) NOT NULL AUTO_INCREMENT,
`nid` bigint NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识',
PRIMARY KEY (`nid`),
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
-- ----------------------------
-- Table structure for `group_capacity`
-- Records of config_tags_relation
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for group_capacity
-- ----------------------------
DROP TABLE IF EXISTS `group_capacity`;
CREATE TABLE `group_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`group_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
`quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
`max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
-- ----------------------------
-- Table structure for `his_config_info`
-- Records of group_capacity
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for his_config_info
-- ----------------------------
DROP TABLE IF EXISTS `his_config_info`;
CREATE TABLE `his_config_info` (
`id` bigint(64) unsigned NOT NULL,
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`data_id` varchar(255) COLLATE utf8_bin NOT NULL,
`group_id` varchar(128) COLLATE utf8_bin NOT NULL,
`id` bigint unsigned NOT NULL COMMENT 'id',
`nid` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识',
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
`content` longtext COLLATE utf8_bin NOT NULL,
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL,
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
`src_user` text COLLATE utf8_bin,
`src_ip` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`op_type` char(10) COLLATE utf8_bin DEFAULT NULL,
`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COLLATE utf8_bin COMMENT 'source user',
`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
`op_type` char(10) COLLATE utf8_bin DEFAULT NULL COMMENT 'operation type',
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` varchar(1024) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '密钥',
`publish_type` varchar(50) COLLATE utf8_bin DEFAULT 'formal' COMMENT 'publish type gray or formal',
`gray_name` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'gray name',
`ext_info` longtext COLLATE utf8_bin COMMENT 'ext info',
PRIMARY KEY (`nid`),
KEY `idx_gmt_create` (`gmt_create`),
KEY `idx_gmt_modified` (`gmt_modified`),
KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
-- ----------------------------
-- Table structure for `roles`
-- Table structure for permissions
-- ----------------------------
DROP TABLE IF EXISTS `permissions`;
CREATE TABLE `permissions` (
`role` varchar(50) NOT NULL COMMENT 'role',
`resource` varchar(128) NOT NULL COMMENT 'resource',
`action` varchar(8) NOT NULL COMMENT 'action',
UNIQUE KEY `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of permissions
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for roles
-- ----------------------------
DROP TABLE IF EXISTS `roles`;
CREATE TABLE `roles` (
`username` varchar(50) NOT NULL,
`role` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
`username` varchar(50) NOT NULL COMMENT 'username',
`role` varchar(50) NOT NULL COMMENT 'role',
UNIQUE KEY `idx_user_role` (`username`,`role`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for `tenant_capacity`
-- Records of roles
-- ----------------------------
BEGIN;
INSERT INTO `roles` (`username`, `role`) VALUES ('nacos', 'ROLE_ADMIN');
COMMIT;
-- ----------------------------
-- Table structure for tenant_capacity
-- ----------------------------
DROP TABLE IF EXISTS `tenant_capacity`;
CREATE TABLE `tenant_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
`quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
`max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
-- ----------------------------
-- Table structure for `tenant_info`
-- Records of tenant_capacity
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for tenant_info
-- ----------------------------
DROP TABLE IF EXISTS `tenant_info`;
CREATE TABLE `tenant_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`kp` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'kp',
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
`tenant_name` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_name',
`tenant_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT 'tenant_desc',
`create_source` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'create_source',
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
`gmt_create` bigint NOT NULL COMMENT '创建时间',
`gmt_modified` bigint NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
-- ----------------------------
-- Table structure for `users`
-- Records of tenant_info
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`username` varchar(50) NOT NULL,
`password` varchar(500) NOT NULL,
`enabled` tinyint(1) NOT NULL,
`username` varchar(50) NOT NULL COMMENT 'username',
`password` varchar(500) NOT NULL COMMENT 'password',
`enabled` tinyint(1) NOT NULL COMMENT 'enabled',
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of `users`
-- Records of users
-- ----------------------------
BEGIN;
INSERT INTO `users` VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', '1');
INSERT INTO `users` (`username`, `password`, `enabled`) VALUES ('nacos', '$2a$10$W6PKgRTzXUp6R/NY853Kn.nRaIcX3whIMTZ/WWkNqo2MTOeSBjKJq', 1);
COMMIT;
-- ----------------------------
-- Table structure for pipeline_execution
-- ----------------------------
DROP TABLE IF EXISTS `pipeline_execution`;
CREATE TABLE `pipeline_execution` (
`execution_id` varchar(64) NOT NULL COMMENT '执行ID',
`resource_type` varchar(32) NOT NULL COMMENT '资源类型',
`resource_name` varchar(256) NOT NULL COMMENT '资源名称',
`namespace_id` varchar(128) DEFAULT NULL COMMENT '命名空间ID',
`version` varchar(64) DEFAULT NULL COMMENT '版本',
`status` varchar(32) NOT NULL COMMENT '执行状态',
`pipeline` longtext NOT NULL COMMENT 'pipeline节点结果JSON',
`create_time` bigint(20) NOT NULL COMMENT '创建时间',
`update_time` bigint(20) NOT NULL COMMENT '修改时间',
PRIMARY KEY (`execution_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI资源发布审核Pipeline执行记录';
-- ----------------------------
-- Table structure for ai_resource
-- ----------------------------
DROP TABLE IF EXISTS `ai_resource`;
CREATE TABLE `ai_resource` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`name` varchar(256) NOT NULL COMMENT '资源名称',
`type` varchar(32) NOT NULL COMMENT '资源类型',
`c_desc` varchar(2048) DEFAULT NULL COMMENT '资源描述',
`status` varchar(32) DEFAULT NULL COMMENT '资源状态',
`namespace_id` varchar(128) NOT NULL DEFAULT '' COMMENT '命名空间ID',
`biz_tags` varchar(1024) DEFAULT NULL COMMENT '业务标签',
`ext` longtext DEFAULT NULL COMMENT '扩展信息(JSON)',
`c_from` varchar(256) NOT NULL DEFAULT 'local' COMMENT '来源标识(导入/同步来源)',
`version_info` longtext DEFAULT NULL COMMENT '版本信息(JSON)',
`meta_version` bigint(20) NOT NULL DEFAULT 1 COMMENT '元数据版本(乐观锁)',
`scope` varchar(16) NOT NULL DEFAULT 'PRIVATE' COMMENT '可见性: PUBLIC/PRIVATE',
`owner` varchar(128) NOT NULL DEFAULT '' COMMENT '创建者用户名',
`download_count` bigint(20) NOT NULL DEFAULT 0 COMMENT '下载次数',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_ai_resource_ns_name_type` (`namespace_id`,`name`,`type`,`c_from`),
KEY `idx_ai_resource_name` (`name`),
KEY `idx_ai_resource_type` (`type`),
KEY `idx_ai_resource_gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI资源元数据表';
-- ----------------------------
-- Table structure for ai_resource_version
-- ----------------------------
DROP TABLE IF EXISTS `ai_resource_version`;
CREATE TABLE `ai_resource_version` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`type` varchar(32) NOT NULL COMMENT '资源类型',
`author` varchar(128) DEFAULT NULL COMMENT '作者',
`name` varchar(256) NOT NULL COMMENT '资源名称',
`c_desc` varchar(2048) DEFAULT NULL COMMENT '版本描述',
`status` varchar(32) NOT NULL COMMENT '版本状态',
`version` varchar(64) NOT NULL COMMENT '版本号',
`namespace_id` varchar(128) NOT NULL DEFAULT '' COMMENT '命名空间ID',
`storage` longtext DEFAULT NULL COMMENT '存储信息(JSON)',
`publish_pipeline_info` longtext DEFAULT NULL COMMENT '发布流水线信息(JSON)',
`download_count` bigint(20) NOT NULL DEFAULT 0 COMMENT '下载次数',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_ai_resource_ver_ns_name_type_ver` (`namespace_id`,`name`,`type`,`version`),
KEY `idx_ai_resource_ver_name` (`name`),
KEY `idx_ai_resource_ver_status` (`status`),
KEY `idx_ai_resource_ver_gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI资源版本表';
SET FOREIGN_KEY_CHECKS = 1;
+169
View File
@@ -0,0 +1,169 @@
USE pigxx_pay;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for pay_channel
-- ----------------------------
DROP TABLE IF EXISTS `pay_channel`;
CREATE TABLE `pay_channel` (
`id` bigint(20) NOT NULL COMMENT '渠道主键ID',
`mch_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商户ID',
`channel_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道ID',
`channel_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道名称',
`channel_mch_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道商户ID',
`return_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '前端回调地址',
`notify_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '后端回调地址',
`state` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态',
`param` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '参数',
`remark` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
`app_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='支付渠道表';
-- ----------------------------
-- Records of pay_channel
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for pay_goods_order
-- ----------------------------
DROP TABLE IF EXISTS `pay_goods_order`;
CREATE TABLE `pay_goods_order` (
`goods_order_id` bigint(20) NOT NULL COMMENT '商品订单ID',
`goods_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品ID',
`goods_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称',
`amount` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '金额',
`user_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户ID',
`status` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '订单状态:订单生成(0)、支付成功(1)、处理完成(2)、处理失败(-1)',
`pay_order_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付订单ID',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`goods_order_id`) USING BTREE,
UNIQUE KEY `IDX_PayOrderId` (`pay_order_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品订单表';
-- ----------------------------
-- Records of pay_goods_order
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for pay_notify_record
-- ----------------------------
DROP TABLE IF EXISTS `pay_notify_record`;
CREATE TABLE `pay_notify_record` (
`id` bigint(20) NOT NULL COMMENT 'ID',
`notify_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '通知ID',
`request` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请求内容',
`response` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '响应内容',
`order_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '订单号',
`http_status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'http状态',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='通知记录日志表';
-- ----------------------------
-- Records of pay_notify_record
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for pay_refund_order
-- ----------------------------
DROP TABLE IF EXISTS `pay_refund_order`;
CREATE TABLE `pay_refund_order` (
`refund_order_id` bigint(20) NOT NULL COMMENT '退款订单ID',
`pay_order_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付订单号',
`channel_pay_order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道支付订单号',
`mch_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商户号',
`mch_refund_no` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商户退款单号',
`channel_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道ID',
`pay_amount` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付金额',
`refund_amount` bigint(20) NOT NULL COMMENT '退款金额,单位分',
`currency` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '币种',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '退款状态:0-订单生成,1-退款中,2-退款成功,3-退款失败,4-业务处理完成',
`result` tinyint(4) NOT NULL DEFAULT '0' COMMENT '退款结果:0-不确认结果,1-等待手动处理,2-确认成功,3-确认失败',
`client_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '客户端IP',
`device` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '设备信息',
`remark` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注信息',
`channel_user` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道用户标识',
`username` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',
`channel_mch_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道商户号',
`channel_order_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道订单号',
`channel_err_code` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道错误码',
`channel_err_msg` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道错误信息',
`extra` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '附加信息',
`notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '通知URL',
`param1` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '扩展参数1',
`param2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '扩展参数2',
`expire_time` datetime DEFAULT NULL COMMENT '订单失效时间',
`refund_succ_time` datetime DEFAULT NULL COMMENT '订单退款成功时间',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`refund_order_id`) USING BTREE,
UNIQUE KEY `IDX_MchId_MchOrderNo` (`mch_id`,`mch_refund_no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='退款订单表';
-- ----------------------------
-- Records of pay_refund_order
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for pay_trade_order
-- ----------------------------
DROP TABLE IF EXISTS `pay_trade_order`;
CREATE TABLE `pay_trade_order` (
`order_id` bigint(20) NOT NULL COMMENT '订单ID',
`channel_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道ID',
`amount` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支付金额',
`currency` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '币种',
`status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '支付状态:0-订单生成,1-支付中(目前未使用),2-支付成功,3-业务处理完成',
`client_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '客户端IP',
`device` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '设备信息',
`subject` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题',
`body` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '内容',
`extra` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '附加信息',
`channel_mch_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道商户号',
`channel_order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '渠道订单号',
`err_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '错误码',
`err_msg` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '错误信息',
`param1` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '扩展参数1',
`param2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '扩展参数2',
`notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '通知URL',
`notify_count` tinyint(4) DEFAULT '0' COMMENT '通知次数',
`last_notify_time` bigint(20) DEFAULT NULL COMMENT '最后一次通知时间',
`expire_time` bigint(20) DEFAULT NULL COMMENT '订单失效时间',
`pay_succ_time` datetime DEFAULT NULL COMMENT '订单支付成功时间',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志',
`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`order_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='支付订单表';
-- ----------------------------
-- Records of pay_trade_order
-- ----------------------------
BEGIN;
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
+366
View File
@@ -0,0 +1,366 @@
USE pigxx_codegen;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for gen_datasource_conf
-- ----------------------------
DROP TABLE IF EXISTS `gen_datasource_conf`;
CREATE TABLE `gen_datasource_conf` (
`id` bigint NOT NULL COMMENT '主键',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '别名',
`url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'jdbcurl',
`username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',
`password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
`tenant_id` bigint DEFAULT NULL COMMENT '租户ID',
`ds_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型',
`conf_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配置类型',
`ds_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库名称',
`instance` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '实例',
`port` int DEFAULT NULL COMMENT '端口',
`host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主机',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据源表';
-- ----------------------------
-- Records of gen_datasource_conf
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for gen_field_type
-- ----------------------------
DROP TABLE IF EXISTS `gen_field_type`;
CREATE TABLE `gen_field_type` (
`id` bigint NOT NULL COMMENT 'id',
`column_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型',
`attr_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性类型',
`package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性包名',
`default_form_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '默认表单类型',
`default_query_form_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '默认查询表单类型',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
PRIMARY KEY (`id`),
UNIQUE KEY `column_type` (`column_type`)
) ENGINE=InnoDB AUTO_INCREMENT=1634915190321451010 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字段类型管理';
-- ----------------------------
-- Records of gen_field_type
-- ----------------------------
BEGIN;
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (1,'datetime','LocalDateTime','java.time.LocalDateTime','datetime','datetimerange','2023-02-06 08:45:10',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (2,'date','LocalDate','java.time.LocalDate','date','daterange','2023-02-06 08:45:10',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (3,'tinyint','Integer',NULL,'number','number','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (4,'smallint','Integer',NULL,'number','number','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (5,'mediumint','Integer',NULL,'number','number','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (6,'int','Integer',NULL,'number','number','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (7,'integer','Integer',NULL,'number','number','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (8,'bigint','Long',NULL,'number','number','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (9,'float','Float',NULL,'number','number','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (10,'double','Double',NULL,'number','number','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (11,'decimal','BigDecimal','java.math.BigDecimal','number','number','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (12,'bit','Boolean',NULL,'radio','radio','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (13,'char','String',NULL,'radio','radio','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (14,'varchar','String',NULL,'text','text','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (15,'tinytext','String',NULL,'textarea','text','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (16,'text','String',NULL,'textarea','text','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (17,'mediumtext','String',NULL,'textarea','text','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (18,'longtext','String',NULL,'textarea','text','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (19,'timestamp','LocalDateTime','java.time.LocalDateTime','datetime','datetimerange','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (20,'NUMBER','Integer',NULL,'number','number','2023-02-06 08:45:11',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (21,'BINARY_INTEGER','Integer',NULL,'number','number','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (22,'BINARY_FLOAT','Float',NULL,'number','number','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (23,'BINARY_DOUBLE','Double',NULL,'number','number','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (24,'VARCHAR2','String',NULL,'text','text','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (25,'NVARCHAR','String',NULL,'text','text','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (26,'NVARCHAR2','String',NULL,'text','text','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (27,'CLOB','String',NULL,'textarea','text','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (28,'int8','Long',NULL,'number','number','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (29,'int4','Integer',NULL,'number','number','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (30,'int2','Integer',NULL,'number','number','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (31,'numeric','BigDecimal','java.math.BigDecimal','number','number','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (32,'json','String',NULL,'textarea','text','2023-02-06 08:45:12',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (33,'BPCHAR','String',NULL,'text','text','2026-04-07 20:27:29',NULL,NULL,NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (34,'time','LocalTime','java.time.LocalTime','text','text','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (35,'year','Integer',NULL,'number','number','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (36,'enum','String',NULL,'text','text','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (37,'set','String',NULL,'text','text','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (38,'bool','Boolean',NULL,'radio','radio','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (39,'boolean','Boolean',NULL,'radio','radio','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (40,'float4','Float',NULL,'number','number','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (41,'float8','Double',NULL,'number','number','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (42,'jsonb','String',NULL,'textarea','text','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (43,'uuid','String',NULL,'text','text','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (44,'serial','Integer',NULL,'number','number','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (45,'bigserial','Long',NULL,'number','number','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (46,'smallserial','Integer',NULL,'number','number','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (47,'timestamptz','LocalDateTime','java.time.LocalDateTime','datetime','datetimerange','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (48,'timetz','String',NULL,'text','text','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
INSERT INTO `gen_field_type` (`id`, `column_type`, `attr_type`, `package_name`, `default_form_type`, `default_query_form_type`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (49,'bytea','String',NULL,'textarea','text','2026-04-07 20:47:09',NULL,'2026-04-07 20:47:09',NULL,'0');
COMMIT;
-- ----------------------------
-- Table structure for gen_group
-- ----------------------------
DROP TABLE IF EXISTS `gen_group`;
CREATE TABLE `gen_group` (
`id` bigint NOT NULL,
`group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组名称',
`group_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分组描述',
`tenant_id` bigint NOT NULL COMMENT '租户ID',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人',
`create_time` datetime DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '修改人',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组';
-- ----------------------------
-- Records of gen_group
-- ----------------------------
BEGIN;
INSERT INTO `gen_group` (`id`, `group_name`, `group_desc`, `tenant_id`, `create_by`, `update_by`, `create_time`, `update_time`, `del_flag`) VALUES (1,'单表增删改查V202611',NULL,1,'admin','admin','2026-04-08 17:38:24','2026-04-08 17:38:24','0');
INSERT INTO `gen_group` (`id`, `group_name`, `group_desc`, `tenant_id`, `create_by`, `update_by`, `create_time`, `update_time`, `del_flag`) VALUES (2,'主子表增删改查V202611',NULL,1,'admin','admin','2026-04-08 17:38:24','2026-04-08 17:38:24','0');
INSERT INTO `gen_group` (`id`, `group_name`, `group_desc`, `tenant_id`, `create_by`, `update_by`, `create_time`, `update_time`, `del_flag`) VALUES (3,'树形表格增删改查V202611',NULL,1,'admin','admin','2026-04-08 17:38:24','2026-04-08 17:38:24','0');
INSERT INTO `gen_group` (`id`, `group_name`, `group_desc`, `tenant_id`, `create_by`, `update_by`, `create_time`, `update_time`, `del_flag`) VALUES (4,'左树右表增删改查V202611',NULL,1,'admin','admin','2026-04-08 17:38:24','2026-04-08 17:38:24','0');
COMMIT;
-- ----------------------------
-- Table structure for gen_table
-- ----------------------------
DROP TABLE IF EXISTS `gen_table`;
CREATE TABLE `gen_table` (
`id` bigint NOT NULL COMMENT 'id',
`table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名',
`class_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类名',
`db_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据库类型',
`table_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '说明',
`author` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '作者',
`email` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱',
`package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '项目包名',
`version` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '项目版本号',
`i18n` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否生成带有i18n 0 不带有 1带有',
`style` bigint DEFAULT NULL COMMENT '代码风格',
`sync_menu_id` bigint DEFAULT NULL COMMENT '所属菜单ID',
`sync_route` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否自动同步路由',
`child_table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表名称',
`main_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主表关联键',
`child_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表关联键',
`parent_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '父表关联键',
`name_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '名称字段',
`generator_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '生成方式 0:zip压缩包 1:自定义目录',
`backend_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '后端生成路径',
`frontend_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '前端生成路径',
`module_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '模块名',
`function_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '功能名',
`form_layout` tinyint DEFAULT NULL COMMENT '表单布局 1:一列 2:两列',
`ds_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据源ID',
`baseclass_id` bigint DEFAULT NULL COMMENT '基类ID',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `table_name_idx` (`table_name`,`ds_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表';
-- ----------------------------
-- Records of gen_table
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for gen_table_column
-- ----------------------------
DROP TABLE IF EXISTS `gen_table_column`;
CREATE TABLE `gen_table_column` (
`id` bigint NOT NULL COMMENT 'id',
`ds_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据源名称',
`table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名称',
`field_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段名称',
`field_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段类型',
`field_comment` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字段说明',
`attr_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性名',
`attr_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性类型',
`package_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '属性包名',
`sort` int DEFAULT NULL COMMENT '排序',
`auto_fill` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '自动填充 DEFAULT、INSERT、UPDATE、INSERT_UPDATE',
`primary_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '主键 0:否 1:是',
`base_field` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '基类字段 0:否 1:是',
`form_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '表单项 0:否 1:是',
`form_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '表单必填 0:否 1:是',
`form_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表单类型',
`form_validator` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表单效验',
`grid_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '列表项 0:否 1:是',
`grid_sort` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '列表排序 0:否 1:是',
`query_item` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '查询项 0:否 1:是',
`query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询方式',
`query_form_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询表单类型',
`field_dict` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表字段';
-- ----------------------------
-- Records of gen_table_column
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for gen_template
-- ----------------------------
DROP TABLE IF EXISTS `gen_template`;
CREATE TABLE `gen_template` (
`id` bigint NOT NULL COMMENT '主键',
`template_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板名称',
`generator_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板路径',
`template_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板描述',
`template_code` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板代码',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标记',
`tenant_id` bigint NOT NULL COMMENT '租户ID',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '创建人',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '修改人',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板';
-- ----------------------------
-- Records of gen_template
-- ----------------------------
BEGIN;
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (1,'ControllerV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java','ControllerV202611','## 查询条件按需导入:字符串字段和组织关键字用 StrUtil,其余类型用 Objects;复选框与日期范围两者都不用\n#set($needStrUtil = false)\n#set($needObjects = false)\n#foreach($field in $queryList)\n#if($field.formType == \'checkbox\' || $field.queryFormType == \'daterange\' || $field.queryFormType == \'datetimerange\')\n#elseif($field.formType.startsWith(\'org-\') || $field.attrType == \'String\')\n#set($needStrUtil = true)\n#else\n#set($needObjects = true)\n#end\n#end\n#set($hasOrgQuery = false)\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrgQuery = true)\n#end\n#end\n## 组织字段以 [{id,name}] JSON 存储,按 ${attrName}Keyword 对整列模糊查询,分页和导出共用\n#macro(orgKeywordParams)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), @RequestParam(required = false) String ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordDecl)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), String ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordArgs)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordFilters)\n#if($hasOrgQuery)\n // 组织字段对整列 JSON 做 LIKE:关键字为数字或 id/name 时会误命中,需精确匹配时改用数据库 JSON 函数\n#end\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))\n wrapper.like(StrUtil.isNotBlank(${field.attrName}Keyword), ${ClassName}Entity::$str.getProperty($field.attrName), ${field.attrName}Keyword);\n#end\n#end\n#end\n#set($permissionPrefix = \"${moduleName}_${functionName}\")\n#set($permissionPrefix = $permissionPrefix.toLowerCase())\npackage ${package}.${moduleName}.controller;\n\n#if($needStrUtil)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport ${package}.common.core.util.R;\nimport ${package}.common.log.annotation.SysLog;\n#if($opensource)\nimport com.pig4cloud.plugin.excel.annotation.ResponseExcel;\nimport com.pig4cloud.plugin.excel.annotation.RequestExcel;\n#else\nimport ${package}.common.excel.annotation.ResponseExcel;\nimport ${package}.common.excel.annotation.RequestExcel;\n#end\nimport ${entityClassName};\nimport ${package}.${moduleName}.service.${ClassName}Service;\n\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\n#if($isSpringBoot3)\nimport ${package}.common.security.annotation.HasPermission;\nimport org.springdoc.core.annotations.ParameterObject;\n#else\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport org.springdoc.api.annotations.ParameterObject;\n#end\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n#if($needObjects)\nimport java.util.Objects;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping(\"/${functionName}\" )\n@Tag(description = \"${functionName}\" , name = \"${tableComment}管理\" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = \"分页查询\" , description = \"分页查询\" )\n @GetMapping(\"/page\" )\n #if($isSpringBoot3)\n @HasPermission(\"${permissionPrefix}_view\")\n #else\n @PreAuthorize(\"@pms.hasPermission(\'${permissionPrefix}_view\')\" )\n #end\n public R get${ClassName}Page(@ParameterObject Page page, @ParameterObject ${ClassName}Entity ${className}#orgKeywordParams()) {\n return R.ok(${className}Service.page(page, buildQueryWrapper(${className}#orgKeywordArgs())));\n }\n\n /**\n * 列表与导出共用的查询条件,保证导出结果与列表一致\n */\n private LambdaQueryWrapper<${ClassName}Entity> buildQueryWrapper(${ClassName}Entity ${className}#orgKeywordDecl()) {\n LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (2,'ServiceV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/service/${ClassName}Service.java','ServiceV202611','package ${package}.${moduleName}.service;\n\nimport com.baomidou.mybatisplus.spring.service.IService;\nimport ${entityClassName};\n\npublic interface ${ClassName}Service extends IService<${ClassName}Entity> {\n\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (3,'ServiceImplV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/service/impl/${ClassName}ServiceImpl.java','ServiceImplV202611','package ${package}.${moduleName}.service.impl;\n\nimport com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;\nimport ${entityClassName};\nimport ${package}.${moduleName}.mapper.${ClassName}Mapper;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.stereotype.Service;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Service\npublic class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {\n\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (4,'实体V202611','${entityPath}/src/main/java/${entityPackagePath}/${ClassName}Entity.java','实体V202611','#set($hasOrg = false)\n#foreach($field in $fieldList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\npackage ${entityPackage};\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.spring.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#if($hasOrg)\nimport com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;\nimport ${package}.common.core.util.OrgRef;\nimport org.apache.fesod.sheet.annotation.ExcelIgnore;\nimport java.util.List;\n#end\n#if($isTenant)\nimport ${package}.common.core.util.TenantTable;\n#end\n#foreach($import in $importList)\n#if(!$import.startsWith(\'java.lang.\'))\nimport $import;\n#end\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n#if($isTenant)\n@TenantTable\n#end\n@TableName(value = \"${tableName}\"#if($hasOrg), autoResultMap = true#end)\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${tableComment}\")\npublic class ${ClassName}Entity extends Model<${ClassName}Entity> {\n\n#foreach ($field in $fieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.formType.startsWith(\'org-\'))\n @TableField(typeHandler = JacksonTypeHandler.class#if($field.autoFill == \'INSERT\' || $field.autoFill == \'INSERT_UPDATE\' || $field.autoFill == \'UPDATE\'), fill = FieldFill.${field.autoFill}#end)\n @ExcelIgnore\n#elseif($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n#if($field.formType.startsWith(\'org-\'))\n private List<OrgRef> $field.attrName;\n#elseif($field.formType == \'checkbox\')\n private ${field.attrType}[] $field.attrName;\n#elseif($field.formType == \'daterange\' || $field.formType == \'datetimerange\')\n private String[] $field.attrName;\n#else\n private $field.attrType $field.attrName;\n#end\n#end\n#foreach ($field in $queryList)\n#if($field.queryFormType == \'daterange\' || $field.queryFormType == \'datetimerange\')\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment 查询范围\n */\n @TableField(exist = false)\n @Schema(description=\"$comment 查询范围\",hidden=true)\n private String[] ${field.attrName}Range;\n#end\n#end\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (5,'MapperV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ClassName}Mapper.java','MapperV202611','package ${package}.${moduleName}.mapper;\n\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport ${entityClassName};\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\npublic interface ${ClassName}Mapper extends BaseMapper<${ClassName}Entity> {\n\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (6,'Mapper.xmlV202611','${backendPath}/src/main/resources/mapper/${ClassName}Mapper.xml','Mapper.xmlV202611','<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n\n<mapper namespace=\"${package}.${moduleName}.mapper.${ClassName}Mapper\">\n\n <resultMap id=\"${className}Map\" type=\"${entityClassName}\">\n#foreach ($field in $fieldList)\n #if($field.primaryPk == \'1\')\n <id property=\"$field.attrName\" column=\"$field.fieldName\"/>\n #else\n <result property=\"$field.attrName\" column=\"$field.fieldName\"#if($field.formType.startsWith(\'org-\')) typeHandler=\"com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler\"#end/>\n #end\n#end\n </resultMap>\n</mapper>\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (7,'权限菜单V202611','${backendPath}/menu/${functionName}_menu.sql','权限菜单V202611','#set($permissionPrefix = \"${moduleName}_${functionName}\")\n#set($permissionPrefix = $permissionPrefix.toLowerCase())\n-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 , #if(!$opensource)默认租户 1#end\n#set($menuId=${dateTool.getSystemTime()})\n\n-- 菜单SQL\ninsert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\'#if(!$opensource), 1#end);\n\n-- 菜单对应按钮SQL\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,1)},${menuId}, \'${permissionPrefix}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\'#if(!$opensource), 1#end);\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,2)},${menuId}, \'${permissionPrefix}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\'#if(!$opensource), 1#end);\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,3)},${menuId}, \'${permissionPrefix}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\'#if(!$opensource), 1#end);\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,4)},${menuId}, \'${permissionPrefix}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\'#if(!$opensource), 1#end);\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,5)},${menuId}, \'${permissionPrefix}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\'#if(!$opensource), 1#end);\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (8,'api.tsV202611','${frontendPath}/src/api/${moduleName}/${functionName}.ts','api.tsV202611','import request from \"/@/utils/request\"\n\n// ========== 基础CRUD接口 ==========\n\n/**\n * 分页查询列表数据\n * @param query - 查询参数对象\n * @returns Promise<分页数据>\n */\nexport function fetchList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/page\',\n method: \'get\',\n params: query\n })\n}\n\n/**\n * 新增数据\n * @param obj - 要新增的数据对象\n * @returns Promise<boolean> - 操作结果\n */\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\n/**\n * 获取详情数据\n * @param obj - 查询参数对象(包含ID等)\n * @returns Promise<数据详情>\n */\nexport function getObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/details\',\n method: \'get\',\n params: obj\n })\n}\n\n/**\n * 批量删除数据\n * @param ids - 要删除的ID数组\n * @returns Promise<操作结果>\n */\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\n/**\n * 更新数据\n * @param obj - 要更新的数据对象\n * @returns Promise<操作结果>\n */\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n// ========== 工具函数 ==========\n\n/**\n * 验证字段值唯一性\n * @param rule - 验证规则对象\n * @param value - 要验证的值\n * @param callback - 验证回调函数\n * @param isEdit - 是否为编辑模式\n * \n * @example\n * // 在表单验证规则中使用\n * fieldName: [\n * {\n * validator: (rule, value, callback) => {\n * validateExist(rule, value, callback, form.${pk.attrName} !== \'\');\n * },\n * trigger: \'blur\',\n * },\n * ]\n */\nexport function validateExist(rule: any, value: any, callback: any, isEdit: boolean) {\n // 编辑模式下跳过验证\n if (isEdit) {\n return callback();\n }\n\n // 查询是否存在相同值\n getObj({ [rule.field]: value }).then((response) => {\n const result = response.data;\n if (result !== null && result.length > 0) {\n callback(new Error(\'数据已经存在\'));\n } else {\n callback();\n }\n });\n}\n\n#if($ChildClassName)\n// ========== 子表相关接口 ==========\n\n/**\n * 删除子表数据\n * @param ids - 要删除的子表数据ID数组\n * @returns Promise<操作结果>\n */\nexport function delChildObj(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/child\',\n method: \'delete\',\n data: ids\n })\n}\n#end\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (9,'表格V202611','${frontendPath}/src/views/${moduleName}/${functionName}/index.vue','表格V202611','## 有字典字段时才导入 useDict\n#set($hasDictField = false)\n#foreach($field in $queryList)\n#if($field.fieldDict)\n#set($hasDictField = true)\n#end\n#end\n#foreach($field in $gridList)\n#if($field.fieldDict)\n#set($hasDictField = true)\n#end\n#end\n## 开关:按属性类型决定开/关的值,Boolean 用 true/false,整型用 1/0,其余用 \'1\'/\'0\'\n#macro(switchValues $f)\n#if($f.attrType == \'Boolean\')\n#set($switchOn = \'true\')\n#set($switchOff = \'false\')\n#elseif($f.attrType == \'Integer\' || $f.attrType == \'Long\' || $f.attrType == \'Short\')\n#set($switchOn = \'1\')\n#set($switchOff = \'0\')\n#else\n#set($switchOn = "\'1\'")\n#set($switchOff = "\'0\'")\n#end\n#end\n#set($permissionPrefix = "${moduleName}_${functionName}")\n#set($permissionPrefix = $permissionPrefix.toLowerCase())\n<template>\n <div class="layout-padding">\n <div class="layout-padding-auto layout-padding-view">\n#if($queryList)\n <!-- 查询表单区域 -->\n <el-row v-show="showSearch">\n <el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))#set($queryKey = "${field.attrName}Keyword")#else#set($queryKey = $field.attrName)#end\n#if($field.queryFormType == \'select\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-select v-model="state.queryForm.${field.attrName}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end">\n#if($field.fieldDict)\n <el-option \n :label="item.label" \n :value="item.value" \n v-for="(item, index) in ${field.fieldDict}" \n :key="index"\n />\n#else\n <el-option label="请选择" value="0" />\n#end\n </el-select>\n </el-form-item>\n#elseif($field.queryFormType == \'date\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-date-picker\n type="date"\n placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"\n v-model="state.queryForm.${field.attrName}"\n :value-format="dateStr"\n />\n </el-form-item>\n#elseif($field.queryFormType == \'daterange\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}Range">\n <el-date-picker\n type="daterange"\n range-separator="至"\n start-placeholder="开始日期"\n end-placeholder="结束日期"\n v-model="state.queryForm.${field.attrName}Range"\n :value-format="dateStr"\n />\n </el-form-item>\n#elseif($field.queryFormType == \'datetime\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-date-picker\n type="datetime"\n placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"\n v-model="state.queryForm.${field.attrName}"\n :value-format="dateTimeStr"\n />\n </el-form-item>\n#elseif($field.queryFormType == \'datetimerange\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}Range">\n <el-date-picker\n type="datetimerange"\n range-separator="至"\n start-placeholder="开始时间"\n end-placeholder="结束时间"\n v-model="state.queryForm.${field.attrName}Range"\n :value-format="dateTimeStr"\n />\n </el-form-item>\n#elseif($field.formType == \'radio\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-radio-group v-model="state.queryForm.${field.attrName}">\n#if($field.fieldDict)\n <el-radio \n :label="item.value" \n v-for="(item, index) in ${field.fieldDict}" \n border \n :key="index"\n >\n {{ item.label }}\n </el-radio>\n#else\n <el-radio label="${field.fieldComment}" border>\n ${field.fieldComment}\n </el-radio>\n#end\n </el-rLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (10,'表单V202611','${frontendPath}/src/views/${moduleName}/${functionName}/form.vue','表单V202611','## 有字典字段时才导入 useDict\n#set($hasDictField = false)\n#foreach($field in $formList)\n#if($field.fieldDict)\n#set($hasDictField = true)\n#end\n#end\n#set($hasDuplicate = false)\n#foreach($field in $formList)\n#if($field.formValidator == \'duplicate\')\n#set($hasDuplicate = true)\n#end\n#end\n## 开关:按属性类型决定开/关的值,Boolean 用 true/false,整型用 1/0,其余用 \'1\'/\'0\'\n#macro(switchValues $f)\n#if($f.attrType == \'Boolean\')\n#set($switchOn = \'true\')\n#set($switchOff = \'false\')\n#elseif($f.attrType == \'Integer\' || $f.attrType == \'Long\' || $f.attrType == \'Short\')\n#set($switchOn = \'1\')\n#set($switchOff = \'0\')\n#else\n#set($switchOn = "\'1\'")\n#set($switchOff = "\'0\'")\n#end\n#end\n#set($hasOrg = false)\n#foreach($field in $formList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\n<template>\n <el-dialog :title="form.${pk.attrName} ? \'编辑\' : \'新增\'" v-model="visible"\n :close-on-click-modal="false" draggable>\n <el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading">\n <el-row :gutter="24">\n#foreach($field in $formList)\n#if($field.attrName != ${pk.attrName})\n#if($formLayout == 1)\n <el-col :span="24" class="mb20">\n#elseif($formLayout == 2)\n <el-col :span="12" class="mb20">\n#end\n#if($field.formType.startsWith(\'org-\'))\n#set($orgType = $field.formType.replace(\'org-\', \'\').replace(\'-multiple\', \'\'))\n <el-form-item label="${field.fieldComment}" prop="${field.attrName}">\n <OrgSelect v-model="form.${field.attrName}" value-type="item" type="${orgType}" :multiple="#if($field.formType.endsWith(\'-multiple\'))true#else false#end" label="${field.fieldComment}" :disabled="loading" />\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'switch\')\n#switchValues($field)\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-switch :model-value="String(form.${field.attrName}) === String($switchOn)" @change="(checked) => (form.${field.attrName} = checked ? $switchOn : $switchOff)" />\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'text\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-input v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"/>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'textarea\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-input type="textarea" v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"/>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'select\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-select v-model="form.${field.attrName}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end">\n#if($field.fieldDict)\n <el-option :value="item.value" :label="item.label" v-for="(item, index) in ${field.fieldDict}" :key="index"></el-option>\n#else\n <el-option label="请选择" value="0"></el-option>\n#end\n </el-select>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'radio\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-radio-group v-model="form.${field.attrName}">\n#if($field.fieldDict)\n <el-radio :label="item.value" v-for="(item, index) in ${field.fieldDict}" border :key="index">{{ item.label }}</el-radio>\n#else\n <el-radio label="${field.fieldComment}" border>${field.fieldComment}</el-radio>\n#end\n </el-radio-group>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'checkbox\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-checkbox-group v-model="form.${field.attrName}">\n#if($field.fieldDict)\n <el-checkbox :label="item.value" v-for="(item, index) in ${field.fieldDict}" :key="index">{{ item.label }}</el-checkbox>\n#else\n <el-checkbox label="启用"Line truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (11,'主子ServiceV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/service/${ClassName}Service.java','主子ServiceV202611','#foreach($field in $childFieldList)\n#if($field.primaryPk == \'1\')\n#set($childPk = $field)\n#end\n#end\npackage ${package}.${moduleName}.service;\n\nimport com.github.yulichang.extension.mapping.base.MPJDeepService;\nimport ${entityClassName};\n\npublic interface ${ClassName}Service extends MPJDeepService<${ClassName}Entity> {\n Boolean saveDeep(${ClassName}Entity ${className});\n\n Boolean updateDeep(${ClassName}Entity ${className});\n\n Boolean removeDeep(${pk.attrType}[] ids);\n\n Boolean removeChild(${childPk.attrType}[] ids);\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (12,'主子ServiceImplV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/service/impl/${ClassName}ServiceImpl.java','主子ServiceImplV202611','#foreach($field in $childFieldList)\n#if($field.primaryPk == \'1\')\n#set($childPk = $field)\n#end\n#end\npackage ${package}.${moduleName}.service.impl;\n\nimport com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;\nimport ${entityClassName};\nimport ${package}.${moduleName}.mapper.${ClassName}Mapper;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport org.springframework.stereotype.Service;\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport ${entityPackage}.${ChildClassName}Entity;\nimport ${package}.${moduleName}.mapper.${ChildClassName}Mapper;\nimport org.springframework.transaction.annotation.Transactional;\nimport lombok.RequiredArgsConstructor;\nimport java.util.Objects;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Service\n@RequiredArgsConstructor\npublic class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {\n\n private final ${ChildClassName}Mapper ${childClassName}Mapper;\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean saveDeep(${ClassName}Entity ${className}) {\n baseMapper.insert(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n ${childClassName}.$str.setProperty($childField)(${className}.$str.getProperty($mainField)());\n ${childClassName}Mapper.insert( ${childClassName});\n }\n\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean updateDeep(${ClassName}Entity ${className}) {\n baseMapper.updateById(${className});\n for (${ChildClassName}Entity ${childClassName} : ${className}.get${ChildClassName}List()) {\n#set($getChildPkName=$str.getProperty(${childPk.attrName}))\n if (Objects.isNull(${childClassName}.$getChildPkName())) {\n ${childClassName}.$str.setProperty($childField)(${className}.$str.getProperty($mainField)());\n ${childClassName}Mapper.insert(${childClassName});\n } else {\n ${childClassName}Mapper.updateById(${childClassName});\n }\n }\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeDeep(${pk.attrType}[] ids) {\n List<${ClassName}Entity> records = baseMapper.selectBatchIds(CollUtil.toList(ids));\n if (CollUtil.isEmpty(records)) {\n return Boolean.TRUE;\n }\n ${childClassName}Mapper.delete(Wrappers.<${ChildClassName}Entity>lambdaQuery()\n .in(${ChildClassName}Entity::$str.getProperty($childField), records.stream()\n .map(${ClassName}Entity::$str.getProperty($mainField)).collect(Collectors.toList())));\n baseMapper.deleteBatchIds(CollUtil.toList(ids));\n return Boolean.TRUE;\n }\n\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeChild(${childPk.attrType}[] ids) {\n ${childClassName}Mapper.deleteBatchIds(CollUtil.toList(ids));\n return Boolean.TRUE;\n }\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (13,'主实体V202611','${entityPath}/src/main/java/${entityPackagePath}/${ClassName}Entity.java','主实体V202611','#set($hasOrg = false)\n#foreach($field in $fieldList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\npackage ${entityPackage};\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.spring.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#if($hasOrg)\nimport com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;\nimport ${package}.common.core.util.OrgRef;\n#end\n#if($isTenant)\nimport ${package}.common.core.util.TenantTable;\n#end\n#foreach($import in $importList)\n#if(!$import.startsWith(\'java.lang.\'))\nimport $import;\n#end\n#end\nimport org.apache.fesod.sheet.annotation.ExcelIgnore;\nimport com.github.yulichang.annotation.EntityMapping;\nimport java.util.List;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n#if($isTenant)\n@TenantTable\n#end\n@TableName(value = \"${tableName}\"#if($hasOrg), autoResultMap = true#end)\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${tableComment}\")\npublic class ${ClassName}Entity extends Model<${ClassName}Entity> {\n\n#foreach ($field in $fieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.formType.startsWith(\'org-\'))\n @TableField(typeHandler = JacksonTypeHandler.class#if($field.autoFill == \'INSERT\' || $field.autoFill == \'INSERT_UPDATE\' || $field.autoFill == \'UPDATE\'), fill = FieldFill.${field.autoFill}#end)\n @ExcelIgnore\n#elseif($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n#if($field.formType.startsWith(\'org-\'))\n private List<OrgRef> $field.attrName;\n#elseif($field.formType == \'checkbox\')\n private ${field.attrType}[] $field.attrName;\n#elseif($field.formType == \'daterange\' || $field.formType == \'datetimerange\')\n @TableField(typeHandler = JacksonTypeHandler.class)\n private String[] $field.attrName;\n#else\n private $field.attrType $field.attrName;\n#end\n#end\n#foreach ($field in $queryList)\n#if($field.queryFormType == \'daterange\' || $field.queryFormType == \'datetimerange\')\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment 查询范围\n */\n @TableField(exist = false)\n @Schema(description=\"$comment 查询范围\",hidden=true)\n private String[] ${field.attrName}Range;\n#end\n#end\n @ExcelIgnore\n @TableField(exist = false)\n @EntityMapping(thisField = \"$mainField\", joinField = \"$childField\")\n private List<${ChildClassName}Entity> ${childClassName}List;\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (14,'MapperV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ClassName}Mapper.java','MapperV202611','package ${package}.${moduleName}.mapper;\n\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport ${entityClassName};\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\npublic interface ${ClassName}Mapper extends BaseMapper<${ClassName}Entity> {\n\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (15,'Mapper.xmlV202611','${backendPath}/src/main/resources/mapper/${ClassName}Mapper.xml','Mapper.xmlV202611','<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n\n<mapper namespace=\"${package}.${moduleName}.mapper.${ClassName}Mapper\">\n\n <resultMap id=\"${className}Map\" type=\"${entityClassName}\">\n#foreach ($field in $fieldList)\n #if($field.primaryPk == \'1\')\n <id property=\"$field.attrName\" column=\"$field.fieldName\"/>\n #else\n <result property=\"$field.attrName\" column=\"$field.fieldName\"#if($field.formType.startsWith(\'org-\')) typeHandler=\"com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler\"#end/>\n #end\n#end\n </resultMap>\n</mapper>\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (16,'权限菜单V202611','${backendPath}/menu/${functionName}_menu.sql','权限菜单V202611','#set($permissionPrefix = \"${moduleName}_${functionName}\")\n#set($permissionPrefix = $permissionPrefix.toLowerCase())\n-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 , #if(!$opensource)默认租户 1#end\n#set($menuId=${dateTool.getSystemTime()})\n\n-- 菜单SQL\ninsert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\'#if(!$opensource), 1#end);\n\n-- 菜单对应按钮SQL\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,1)},${menuId}, \'${permissionPrefix}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\'#if(!$opensource), 1#end);\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,2)},${menuId}, \'${permissionPrefix}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\'#if(!$opensource), 1#end);\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,3)},${menuId}, \'${permissionPrefix}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\'#if(!$opensource), 1#end);\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,4)},${menuId}, \'${permissionPrefix}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\'#if(!$opensource), 1#end);\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,5)},${menuId}, \'${permissionPrefix}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\'#if(!$opensource), 1#end);\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (17,'api.tsV202611','${frontendPath}/src/api/${moduleName}/${functionName}.ts','api.tsV202611','import request from \"/@/utils/request\"\n\n// ========== 基础CRUD接口 ==========\n\n/**\n * 分页查询列表数据\n * @param query - 查询参数对象\n * @returns Promise<分页数据>\n */\nexport function fetchList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/page\',\n method: \'get\',\n params: query\n })\n}\n\n/**\n * 新增数据\n * @param obj - 要新增的数据对象\n * @returns Promise<boolean> - 操作结果\n */\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\n/**\n * 获取详情数据\n * @param obj - 查询参数对象(包含ID等)\n * @returns Promise<数据详情>\n */\nexport function getObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/details\',\n method: \'get\',\n params: obj\n })\n}\n\n/**\n * 批量删除数据\n * @param ids - 要删除的ID数组\n * @returns Promise<操作结果>\n */\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\n/**\n * 更新数据\n * @param obj - 要更新的数据对象\n * @returns Promise<操作结果>\n */\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n// ========== 工具函数 ==========\n\n/**\n * 验证字段值唯一性\n * @param rule - 验证规则对象\n * @param value - 要验证的值\n * @param callback - 验证回调函数\n * @param isEdit - 是否为编辑模式\n * \n * @example\n * // 在表单验证规则中使用\n * fieldName: [\n * {\n * validator: (rule, value, callback) => {\n * validateExist(rule, value, callback, form.${pk.attrName} !== \'\');\n * },\n * trigger: \'blur\',\n * },\n * ]\n */\nexport function validateExist(rule: any, value: any, callback: any, isEdit: boolean) {\n // 编辑模式下跳过验证\n if (isEdit) {\n return callback();\n }\n\n // 查询是否存在相同值\n getObj({ [rule.field]: value }).then((response) => {\n const result = response.data;\n if (result !== null && result.length > 0) {\n callback(new Error(\'数据已经存在\'));\n } else {\n callback();\n }\n });\n}\n\n#if($ChildClassName)\n// ========== 子表相关接口 ==========\n\n/**\n * 删除子表数据\n * @param ids - 要删除的子表数据ID数组\n * @returns Promise<操作结果>\n */\nexport function delChildObj(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/child\',\n method: \'delete\',\n data: ids\n })\n}\n#end\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (18,'子实体V202611','${entityPath}/src/main/java/${entityPackagePath}/${ChildClassName}Entity.java','子实体V202611','#set($hasOrg = false)\n#foreach($field in $childFieldList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\npackage ${entityPackage};\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.spring.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\n#if($isChildTenant)\nimport ${package}.common.core.util.TenantTable;\n#end\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#if($hasOrg)\nimport com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;\nimport ${package}.common.core.util.OrgRef;\nimport java.util.List;\n#end\n#set($childImports = [])\n#foreach($field in $childFieldList)\n#if($field.packageName && !$field.packageName.startsWith(\'java.lang.\') && !$childImports.contains($field.packageName))\n#set($void = $childImports.add($field.packageName))\n#end\n#end\n#foreach($import in $childImports)\nimport $import;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n#if($isChildTenant)\n@TenantTable\n#end\n@TableName(value = \"${childTableName}\"#if($hasOrg), autoResultMap = true#end)\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${childTableName}\")\npublic class ${ChildClassName}Entity extends Model<${ChildClassName}Entity> {\n\n#foreach ($field in $childFieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.formType.startsWith(\'org-\'))\n @TableField(typeHandler = JacksonTypeHandler.class#if($field.autoFill == \'INSERT\' || $field.autoFill == \'INSERT_UPDATE\' || $field.autoFill == \'UPDATE\'), fill = FieldFill.${field.autoFill}#end)\n#elseif($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n#if($field.formType.startsWith(\'org-\'))\n private List<OrgRef> $field.attrName;\n#elseif($field.formType == \'checkbox\')\n private ${field.attrType}[] $field.attrName;\n#else\n private $field.attrType $field.attrName;\n#end \n#end\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (19,'主子ControllerV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java','主子ControllerV202611','## 查询条件按需导入:字符串字段和组织关键字用 StrUtil,其余类型用 Objects;复选框与日期范围两者都不用\n#set($needStrUtil = false)\n#set($needObjects = false)\n#foreach($field in $queryList)\n#if($field.formType == \'checkbox\' || $field.queryFormType == \'daterange\' || $field.queryFormType == \'datetimerange\')\n#elseif($field.formType.startsWith(\'org-\') || $field.attrType == \'String\')\n#set($needStrUtil = true)\n#else\n#set($needObjects = true)\n#end\n#end\n#set($hasOrgQuery = false)\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrgQuery = true)\n#end\n#end\n## 组织字段以 [{id,name}] JSON 存储,按 ${attrName}Keyword 对整列模糊查询,分页和导出共用\n#macro(orgKeywordParams)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), @RequestParam(required = false) String ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordDecl)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), String ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordArgs)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordFilters)\n#if($hasOrgQuery)\n // 组织字段对整列 JSON 做 LIKE:关键字为数字或 id/name 时会误命中,需精确匹配时改用数据库 JSON 函数\n#end\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))\n wrapper.like(StrUtil.isNotBlank(${field.attrName}Keyword), ${ClassName}Entity::$str.getProperty($field.attrName), ${field.attrName}Keyword);\n#end\n#end\n#end\n#set($permissionPrefix = \"${moduleName}_${functionName}\")\n#set($permissionPrefix = $permissionPrefix.toLowerCase())\n#foreach($field in $childFieldList)\n#if($field.primaryPk == \'1\')\n#set($childPk = $field)\n#end\n#end\npackage ${package}.${moduleName}.controller;\n\n#if($needStrUtil)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.util.ArrayUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport ${package}.common.core.util.R;\nimport ${package}.common.log.annotation.SysLog;\n#if($opensource)\nimport com.pig4cloud.plugin.excel.annotation.ResponseExcel;\nimport com.pig4cloud.plugin.excel.annotation.RequestExcel;\n#else\nimport ${package}.common.excel.annotation.ResponseExcel;\nimport ${package}.common.excel.annotation.RequestExcel;\n#end\nimport ${entityClassName};\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\n#if($isSpringBoot3)\nimport ${package}.common.security.annotation.HasPermission;\nimport org.springdoc.core.annotations.ParameterObject;\n#else\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport org.springdoc.api.annotations.ParameterObject;\n#end\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n#if($needObjects)\nimport java.util.Objects;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping(\"/${functionName}\" )\n@Tag(description = \"${functionName}\" , name = \"${tableComment}管理\" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = \"分页查询\" , description = \"分页查询\" )\n @GetMapping(\"/page\" )\n #if($isSpringBoot3)\n @HasPermission(\"${permissionPrefix}_view\")\n #else\n @PreAuthorize(\"@pms.hasPermission(\'${permissionPrefix}_view\')\" )\n #end\n public R get${ClassName}Page(@ParameterObject Page page, @ParameterObject ${ClassName}Entity ${className}#orgKeywordParams()) {\n return R.ok(${className}Service.page(page, buildQueryWrapper(${className}#orgKeywordArgs())));\n }\n\n /**\n * 列表与导出共用的查询条件,保证导出结果与列表一致\n */\n private LambdaQueryWrapper<${ClassName}Entity> buildQueryWrapper(${ClassName}Entity ${className}#orgKeywordDecl()) {\Line truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (20,'主子表单V202611','${frontendPath}/src/views/${moduleName}/${functionName}/form.vue','主子表单V202611','## 有字典字段时才导入 useDict\n#set($hasDictField = false)\n#foreach($field in $formList)\n#if($field.fieldDict)\n#set($hasDictField = true)\n#end\n#end\n#set($hasDuplicate = false)\n#foreach($field in $formList)\n#if($field.formValidator == \'duplicate\')\n#set($hasDuplicate = true)\n#end\n#end\n## 开关:按属性类型决定开/关的值,Boolean 用 true/false,整型用 1/0,其余用 \'1\'/\'0\'\n#macro(switchValues $f)\n#if($f.attrType == \'Boolean\')\n#set($switchOn = \'true\')\n#set($switchOff = \'false\')\n#elseif($f.attrType == \'Integer\' || $f.attrType == \'Long\' || $f.attrType == \'Short\')\n#set($switchOn = \'1\')\n#set($switchOff = \'0\')\n#else\n#set($switchOn = "\'1\'")\n#set($switchOff = "\'0\'")\n#end\n#end\n#set($hasOrg = false)\n#foreach($field in $formList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\n#foreach($field in $childFieldList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\n<template>\n <el-drawer :title="form.${pk.attrName} ? (detail ? \'详情\' : \'编辑\') : \'添加\'" v-model="visible" size="50%">\n <el-form ref="dataFormRef" :model="form" :rules="dataRules" :disabled="detail" v-loading="loading">\n <el-row :gutter="24">\n#foreach($field in $formList)\n#if($field.attrName != ${pk.attrName})\n#if($formLayout == 1)\n <el-col :span="24" class="mb20">\n#elseif($formLayout == 2)\n <el-col :span="12" class="mb20">\n#end\n#if($field.formType.startsWith(\'org-\'))\n#set($orgType = $field.formType.replace(\'org-\', \'\').replace(\'-multiple\', \'\'))\n <el-form-item label="${field.fieldComment}" prop="${field.attrName}">\n <OrgSelect v-model="form.${field.attrName}" value-type="item" type="${orgType}" :multiple="#if($field.formType.endsWith(\'-multiple\'))true#else false#end" label="${field.fieldComment}" :disabled="loading || detail" />\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'switch\')\n#switchValues($field)\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-switch :model-value="String(form.${field.attrName}) === String($switchOn)" @change="(checked) => (form.${field.attrName} = checked ? $switchOn : $switchOff)" />\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'text\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.fieldName}#end" prop="${field.attrName}">\n <el-input v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.fieldName}#end"/>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'textarea\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.fieldName}#end" prop="${field.attrName}">\n <el-input type="textarea" v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.fieldName}#end"/>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'select\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.fieldName}#end" prop="${field.attrName}">\n <el-select v-model="form.${field.attrName}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.fieldName}#end">\n#if($field.fieldDict)\n <el-option :value="item.value" :label="item.label" v-for="(item, index) in ${field.fieldDict}" :key="index"></el-option>\n#else\n <el-option label="请选择" value="0"></el-option>\n#end\n </el-select>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'radio\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.fieldName}#end" prop="${field.attrName}">\n <el-radio-group v-model="form.${field.attrName}">\n#if($field.fieldDict)\n <el-radio :label="item.value" v-for="(item, index) in ${field.fieldDict}" border :key="index">{{ item.label }}</el-radio>\n#else\n <el-radio label="${field.fieldComment}" border>${field.fieldComment}</el-radio>\n#end\n </el-radio-group>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'checkbox\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.fieldName}#end" prop="${field.attrName}">\n <el-checkbox-group v-model="form.${field.attrName}">\n#if($field.fieldDict)\n <el-checkbox :label="item.value" v-fLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (21,'主子表格V202611','${frontendPath}/src/views/${moduleName}/${functionName}/index.vue','主子表格V202611','## 有字典字段时才导入 useDict\n#set($hasDictField = false)\n#foreach($field in $queryList)\n#if($field.fieldDict)\n#set($hasDictField = true)\n#end\n#end\n#foreach($field in $gridList)\n#if($field.fieldDict)\n#set($hasDictField = true)\n#end\n#end\n## 开关:按属性类型决定开/关的值,Boolean 用 true/false,整型用 1/0,其余用 \'1\'/\'0\'\n#macro(switchValues $f)\n#if($f.attrType == \'Boolean\')\n#set($switchOn = \'true\')\n#set($switchOff = \'false\')\n#elseif($f.attrType == \'Integer\' || $f.attrType == \'Long\' || $f.attrType == \'Short\')\n#set($switchOn = \'1\')\n#set($switchOff = \'0\')\n#else\n#set($switchOn = "\'1\'")\n#set($switchOff = "\'0\'")\n#end\n#end\n#set($permissionPrefix = "${moduleName}_${functionName}")\n#set($permissionPrefix = $permissionPrefix.toLowerCase())\n<template>\n <div class="layout-padding">\n <div class="layout-padding-auto layout-padding-view">\n#if($queryList)\n <el-row v-show="showSearch">\n <el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))#set($queryKey = "${field.attrName}Keyword")#else#set($queryKey = $field.attrName)#end\n#if($field.queryFormType == \'select\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-select v-model="state.queryForm.${field.attrName}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end">\n#if($field.fieldDict)\n <el-option \n :label="item.label" \n :value="item.value" \n v-for="(item, index) in ${field.fieldDict}" \n :key="index">\n </el-option>\n#else\n <el-option label="请选择">0</el-option>\n#end\n </el-select>\n </el-form-item>\n#elseif($field.queryFormType == \'date\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-date-picker\n type="date"\n placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"\n :value-format="dateStr"\n v-model="state.queryForm.${field.attrName}"\n />\n </el-form-item>\n#elseif($field.queryFormType == \'daterange\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}Range">\n <el-date-picker\n type="daterange"\n range-separator="至"\n start-placeholder="开始日期"\n end-placeholder="结束日期"\n v-model="state.queryForm.${field.attrName}Range"\n :value-format="dateStr"\n />\n </el-form-item>\n#elseif($field.queryFormType == \'datetime\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-date-picker\n type="datetime"\n placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"\n :value-format="dateTimeStr"\n v-model="state.queryForm.${field.attrName}"\n />\n </el-form-item>\n#elseif($field.queryFormType == \'datetimerange\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}Range">\n <el-date-picker\n type="datetimerange"\n range-separator="至"\n start-placeholder="开始时间"\n end-placeholder="结束时间"\n v-model="state.queryForm.${field.attrName}Range"\n :value-format="dateTimeStr"\n />\n </el-form-item>\n#elseif($field.formType == \'radio\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-radio-group v-model="state.queryForm.${field.attrName}">\n#if($field.fieldDict)\n <el-radio \n :label="item.value" \n v-for="(item, index) in ${field.fieldDict}" \n border \n :key="index">\n {{ item.label }}\n </el-radio>\n#else\n <el-radio label="${field.fieldComment}" border>${field.fieldComment}</el-radio>\n#end\n </el-radio-group>\n </el-form-item>\n#else\n <elLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (22,'子MapperV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ChildClassName}Mapper.java','子MapperV202611','package ${package}.${moduleName}.mapper;\n\nimport ${package}.common.data.datascope.PigxBaseMapper;\nimport ${entityPackage}.${ChildClassName}Entity;\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\npublic interface ${ChildClassName}Mapper extends PigxBaseMapper<${ChildClassName}Entity> {\n\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (23,'树形ControllerV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java','树形ControllerV202611','## 查询条件按需导入:字符串字段用 StrUtil,其余类型用 Objects;复选框与日期范围两者都不用\n#set($needStrUtil = false)\n#set($needObjects = false)\n#foreach($field in $queryList)\n#if($field.formType == \'checkbox\' || $field.queryFormType == \'daterange\' || $field.queryFormType == \'datetimerange\')\n#elseif($field.formType.startsWith(\'org-\') || $field.attrType == \'String\')\n#set($needStrUtil = true)\n#else\n#set($needObjects = true)\n#end\n#end\n#set($hasOrgQuery = false)\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrgQuery = true)\n#end\n#end\n## 组织字段以 [{id,name}] JSON 存储,按 ${attrName}Keyword 对整列模糊查询,分页和导出共用\n#macro(orgKeywordParams)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), @RequestParam(required = false) String ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordDecl)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), String ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordArgs)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordFilters)\n#if($hasOrgQuery)\n // 组织字段对整列 JSON 做 LIKE:关键字为数字或 id/name 时会误命中,需精确匹配时改用数据库 JSON 函数\n#end\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))\n wrapper.like(StrUtil.isNotBlank(${field.attrName}Keyword), ${ClassName}Entity::$str.getProperty($field.attrName), ${field.attrName}Keyword);\n#end\n#end\n#end\npackage ${package}.${moduleName}.controller;\n\n#if($queryList)\n#if($needStrUtil)\nimport cn.hutool.core.util.StrUtil;\n#end\n#end\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport ${package}.common.core.util.R;\nimport ${package}.common.log.annotation.SysLog;\n#if($opensource)\nimport com.pig4cloud.plugin.excel.annotation.ResponseExcel;\nimport com.pig4cloud.plugin.excel.annotation.RequestExcel;\n#else\nimport ${package}.common.excel.annotation.ResponseExcel;\nimport ${package}.common.excel.annotation.RequestExcel;\n#end\nimport ${entityClassName};\nimport ${package}.${moduleName}.service.${ClassName}Service;\n\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\n#if($isSpringBoot3)\nimport ${package}.common.security.annotation.HasPermission;\nimport org.springdoc.core.annotations.ParameterObject;\n#else\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport org.springdoc.api.annotations.ParameterObject;\n#end\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n#if($needObjects)\nimport java.util.Objects;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@RestController\n@RequiredArgsConstructor\n@RequestMapping("/${functionName}" )\n@Tag(description = "${functionName}" , name = "${tableComment}管理" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 获取树形列表\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = "获取树形列表" , description = "获取树形列表" )\n @GetMapping("/tree" )\n #if($isSpringBoot3)\n @HasPermission("$str.lowerCase($moduleName)_$str.lowerCase($functionName)_view")\n #else\n @PreAuthorize("@pms.hasPermission(\'$str.lowerCase($moduleName)_$str.lowerCase($functionName)_view\')" )\n #end\n public R get${ClassName}Tree(@ParameterObject ${ClassName}Entity ${className}#orgKeywordParams()) {\n return R.ok(${className}Service.buildTree(buildQueryWrapper(${className}#orgKeywordArgs())));\n }\n\n /**\n * 列表与导出共用的查询条件,保证导出结果与列表一致\n */\n private LambdaQueryWrapper<${ClassName}Entity> buildQueryWrapper(${ClassName}Entity ${className}#orgKeywordDecl()) {\n LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();\n#orgKeywordFilters()\n#foreach ($field in $queryList)\n#if(!$field.formType.startsWith(\'org-\'))\n#set($getAttrName=$str.getProperty($field.attLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (24,'树形ServiceV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/service/${ClassName}Service.java','树形ServiceV202611','package ${package}.${moduleName}.service;\n\nimport cn.hutool.core.lang.tree.Tree;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.spring.service.IService;\nimport ${entityClassName};\n\nimport java.util.List;\n\n/**\n * ${tableComment} Service接口\n *\n * @author ${author}\n * @date ${datetime}\n */\npublic interface ${ClassName}Service extends IService<${ClassName}Entity> {\n\n /**\n * 构建树形结构数据\n * @param wrapper 查询条件\n * @return 树形结构数据\n */\n List<Tree<${pk.attrType}>> buildTree(LambdaQueryWrapper<${ClassName}Entity> wrapper);\n\n /**\n * 递归删除节点及其子节点\n * @param ids 要删除的节点ID列表\n * @return 删除结果\n */\n boolean removeBatchByIds(List<${pk.attrType}> ids);\n} ','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (25,'树形ServiceImplV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/service/impl/${ClassName}ServiceImpl.java','树形ServiceImplV202611','## 根节点 ID 按主键类型生成,与 Tree<${pk.attrType}> 类型一致\n#if($pk.attrType == \'Long\')\n#set($treeRootId = \'0L\')\n#elseif($pk.attrType == \'String\')\n#set($treeRootId = \'"0"\')\n#else\n#set($treeRootId = \'0\')\n#end\npackage ${package}.${moduleName}.service.impl;\n\nimport cn.hutool.core.collection.CollUtil;\nimport cn.hutool.core.lang.tree.Tree;\nimport cn.hutool.core.lang.tree.TreeNode;\nimport cn.hutool.core.lang.tree.TreeUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;\nimport ${entityClassName};\nimport ${package}.${moduleName}.mapper.${ClassName}Mapper;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport jakarta.validation.constraints.NotNull;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\n\n/**\n * ${tableComment} Service实现类\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Service\n@RequiredArgsConstructor\npublic class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {\n\n /**\n * 构建树形结构数据\n * @param wrapper 查询条件\n * @return 树形结构数据\n */\n @Override\n public List<Tree<${pk.attrType}>> buildTree(LambdaQueryWrapper<${ClassName}Entity> wrapper) {\n // 查询命中节点,再按层补齐祖先,保留完整树路径\n List<${ClassName}Entity> allList = list(wrapper);\n \n if (CollUtil.isEmpty(allList)) {\n return new ArrayList<>();\n }\n\n Map<${pk.attrType}, ${ClassName}Entity> nodes = new LinkedHashMap<>();\n allList.forEach(entity -> nodes.put(entity.$str.getProperty($pk.attrName)(), entity));\n List<${ClassName}Entity> level = allList;\n while (!level.isEmpty()) {\n List<${pk.attrType}> parentIds = level.stream()\n .map(${ClassName}Entity::$str.getProperty($parentField))\n .filter(id -> id != null && !Objects.equals(id, ${treeRootId}) && !nodes.containsKey(id))\n .distinct()\n .toList();\n if (parentIds.isEmpty()) {\n break;\n }\n level = listByIds(parentIds);\n level.forEach(entity -> nodes.put(entity.$str.getProperty($pk.attrName)(), entity));\n }\n\n // 转换为TreeNode,仅包含命中节点及其祖先\n List<TreeNode<${pk.attrType}>> collect = nodes.values().stream().map(getNodeFunction()).toList();\n\n // 使用TreeUtil构建树形结构,根节点ID为0\n return TreeUtil.build(collect, ${treeRootId});\n }\n\n /**\n * 获取TreeNode转换函数\n * @return TreeNode转换函数\n */\n @NotNull\n private Function<${ClassName}Entity, TreeNode<${pk.attrType}>> getNodeFunction() {\n return entity -> {\n TreeNode<${pk.attrType}> node = new TreeNode<>();\n node.setId(entity.$str.getProperty($pk.attrName)());\n node.setName(entity.$str.getProperty($nameField)());\n node.setParentId(entity.$str.getProperty($parentField)() != null ? entity.$str.getProperty($parentField)() : ${treeRootId});\n\n // 扩展属性\n Map<String, Object> extra = new HashMap<>();\n#foreach($field in $fieldList)\n extra.put(${ClassName}Entity.Fields.${field.attrName}, entity.$str.getProperty($field.attrName)());\n#end\n node.setExtra(extra);\n return node;\n };\n }\n\n /**\n * 递归删除节点及其子节点\n * @param ids 要删除的节点ID列表\n * @return 删除结果\n */\n @Override\n @Transactional(rollbackFor = Exception.class)\n public boolean removeBatchByIds(List<${pk.attrType}> ids) {\n if (CollUtil.isEmpty(ids)) {\n return true;\n }\n\n // 获取所有要删除的ID(包括子节点)\n List<${pk.attrType}> allDeleteIds = new ArrayList<>(ids);\n \n for (${pk.attrType} id : ids) {\n List<${pk.attrType}> childIds = getChildIdsRecursive(id);\n allDeleteIds.addAll(childIds);\n }\n\n // 去重\n allLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (26,'树形实体V202611','${entityPath}/src/main/java/${entityPackagePath}/${ClassName}Entity.java','树形实体V202611','#set($hasOrg = false)\n#foreach($field in $fieldList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\npackage ${entityPackage};\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.spring.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.FieldNameConstants;\n#if($hasOrg)\nimport com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;\nimport ${package}.common.core.util.OrgRef;\nimport org.apache.fesod.sheet.annotation.ExcelIgnore;\nimport java.util.List;\n#end\n#if($isTenant)\nimport ${package}.common.core.util.TenantTable;\n#end\n#foreach($import in $importList)\n#if(!$import.startsWith(\'java.lang.\'))\nimport $import;\n#end\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n@FieldNameConstants\n#if($isTenant)\n@TenantTable\n#end\n@TableName(value = "${tableName}"#if($hasOrg), autoResultMap = true#end)\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = "${tableComment}")\npublic class ${ClassName}Entity extends Model<${ClassName}Entity> {\n\n#foreach ($field in $fieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.formType.startsWith(\'org-\'))\n @TableField(typeHandler = JacksonTypeHandler.class#if($field.autoFill == \'INSERT\' || $field.autoFill == \'INSERT_UPDATE\' || $field.autoFill == \'UPDATE\'), fill = FieldFill.${field.autoFill}#end)\n @ExcelIgnore\n#elseif($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description="$comment"#if($field.hidden),hidden=$field.hidden#end)\n#if($field.formType.startsWith(\'org-\'))\n private List<OrgRef> $field.attrName;\n#elseif($field.formType == \'checkbox\')\n private ${field.attrType}[] $field.attrName;\n#elseif($field.formType == \'daterange\' || $field.formType == \'datetimerange\')\n private String[] $field.attrName;\n#else\n private $field.attrType $field.attrName;\n#end\n#end\n#foreach ($field in $queryList)\n#if($field.queryFormType == \'daterange\' || $field.queryFormType == \'datetimerange\')\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment 查询范围\n */\n @TableField(exist = false)\n @Schema(description="$comment 查询范围",hidden=true)\n private String[] ${field.attrName}Range;\n#end\n#end\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (27,'MapperV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ClassName}Mapper.java','MapperV202611','package ${package}.${moduleName}.mapper;\n\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport ${entityClassName};\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\npublic interface ${ClassName}Mapper extends BaseMapper<${ClassName}Entity> {\n\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (28,'Mapper.xmlV202611','${backendPath}/src/main/resources/mapper/${ClassName}Mapper.xml','Mapper.xmlV202611','<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n\n<mapper namespace=\"${package}.${moduleName}.mapper.${ClassName}Mapper\">\n\n <resultMap id=\"${className}Map\" type=\"${entityClassName}\">\n#foreach ($field in $fieldList)\n #if($field.primaryPk == \'1\')\n <id property=\"$field.attrName\" column=\"$field.fieldName\"/>\n #else\n <result property=\"$field.attrName\" column=\"$field.fieldName\"#if($field.formType.startsWith(\'org-\')) typeHandler=\"com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler\"#end/>\n #end\n#end\n </resultMap>\n</mapper>\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (29,'权限菜单V202611','${backendPath}/menu/${functionName}_menu.sql','权限菜单V202611','#set($permissionPrefix = \"${moduleName}_${functionName}\")\n#set($permissionPrefix = $permissionPrefix.toLowerCase())\n-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 , #if(!$opensource)默认租户 1#end\n#set($menuId=${dateTool.getSystemTime()})\n\n-- 菜单SQL\ninsert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\'#if(!$opensource), 1#end);\n\n-- 菜单对应按钮SQL\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,1)},${menuId}, \'${permissionPrefix}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\'#if(!$opensource), 1#end);\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,2)},${menuId}, \'${permissionPrefix}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\'#if(!$opensource), 1#end);\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,3)},${menuId}, \'${permissionPrefix}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\'#if(!$opensource), 1#end);\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,4)},${menuId}, \'${permissionPrefix}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\'#if(!$opensource), 1#end);\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,5)},${menuId}, \'${permissionPrefix}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\'#if(!$opensource), 1#end);\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (30,'树形api.tsV202611','${frontendPath}/src/api/${moduleName}/${functionName}.ts','树形api.tsV202611','import request from \"/@/utils/request\"\n\n// ========== 树形表格CRUD接口 ==========\n\n/**\n * 获取树形列表数据\n * @param query - 查询参数对象\n * @returns Promise<树形数据>\n */\nexport function fetchTreeList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/tree\',\n method: \'get\',\n params: query\n })\n}\n\n/**\n * 新增数据\n * @param obj - 要新增的数据对象\n * @returns Promise<boolean> - 操作结果\n */\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\n/**\n * 获取详情数据\n * @param obj - 查询参数对象(包含ID等)\n * @returns Promise<数据详情>\n */\nexport function getObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/details\',\n method: \'get\',\n params: obj\n })\n}\n\n/**\n * 批量删除数据(递归删除子节点)\n * @param ids - 要删除的ID数组\n * @returns Promise<操作结果>\n */\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\n/**\n * 更新数据\n * @param obj - 要更新的数据对象\n * @returns Promise<操作结果>\n */\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n\n// ========== 工具函数 ==========\n\n/**\n * 验证字段值唯一性\n * @param rule - 验证规则对象\n * @param value - 要验证的值\n * @param callback - 验证回调函数\n * @param isEdit - 是否为编辑模式\n * \n * @example\n * // 在表单验证规则中使用\n * fieldName: [\n * {\n * validator: (rule, value, callback) => {\n * validateExist(rule, value, callback, form.${pk.attrName} !== \'\');\n * },\n * trigger: \'blur\',\n * },\n * ]\n */\nexport function validateExist(rule: any, value: any, callback: any, isEdit: boolean) {\n // 编辑模式下跳过验证\n if (isEdit) {\n return callback();\n }\n\n // 查询是否存在相同值\n getObj({ [rule.field]: value }).then((response) => {\n const result = response.data;\n if (result !== null && result.length > 0) {\n callback(new Error(\'数据已经存在\'));\n } else {\n callback();\n }\n });\n}','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (31,'树形表格V202611','${frontendPath}/src/views/${moduleName}/${functionName}/index.vue','树形表格V202611','## 有字典字段时才导入 useDict\n#set($hasDictField = false)\n#foreach($field in $queryList)\n#if($field.fieldDict)\n#set($hasDictField = true)\n#end\n#end\n#foreach($field in $gridList)\n#if($field.fieldDict)\n#set($hasDictField = true)\n#end\n#end\n## 开关:按属性类型决定开/关的值,Boolean 用 true/false,整型用 1/0,其余用 \'1\'/\'0\'\n#macro(switchValues $f)\n#if($f.attrType == \'Boolean\')\n#set($switchOn = \'true\')\n#set($switchOff = \'false\')\n#elseif($f.attrType == \'Integer\' || $f.attrType == \'Long\' || $f.attrType == \'Short\')\n#set($switchOn = \'1\')\n#set($switchOff = \'0\')\n#else\n#set($switchOn = "\'1\'")\n#set($switchOff = "\'0\'")\n#end\n#end\n<template>\n <div class="layout-padding">\n <div class="layout-padding-auto layout-padding-view">\n#if($queryList)\n <!-- 查询表单区域 -->\n <el-row v-show="showSearch">\n <el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))#set($queryKey = "${field.attrName}Keyword")#else#set($queryKey = $field.attrName)#end\n#if($field.queryFormType == \'select\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${queryKey}">\n <el-select v-model="state.queryForm.${queryKey}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end">\n#if($field.fieldDict)\n <el-option \n :label="item.label" \n :value="item.value" \n v-for="(item, index) in ${field.fieldDict}" \n :key="index"\n />\n#else\n <el-option label="请选择" value="0" />\n#end\n </el-select>\n </el-form-item>\n#elseif($field.queryFormType == \'date\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${queryKey}">\n <el-date-picker \n type="date" \n placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" \n v-model="state.queryForm.${queryKey}"\n :value-format="dateStr"\n />\n </el-form-item>\n#elseif($field.queryFormType == \'datetime\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${queryKey}">\n <el-date-picker\n type="datetime"\n placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"\n v-model="state.queryForm.${queryKey}"\n :value-format="dateTimeStr"\n />\n </el-form-item>\n#elseif($field.queryFormType == \'daterange\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}Range">\n <el-date-picker\n type="daterange"\n range-separator="至"\n start-placeholder="开始日期"\n end-placeholder="结束日期"\n v-model="state.queryForm.${field.attrName}Range"\n :value-format="dateStr"\n />\n </el-form-item>\n#elseif($field.queryFormType == \'datetimerange\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}Range">\n <el-date-picker\n type="datetimerange"\n range-separator="至"\n start-placeholder="开始时间"\n end-placeholder="结束时间"\n v-model="state.queryForm.${field.attrName}Range"\n :value-format="dateTimeStr"\n />\n </el-form-item>\n#elseif($field.formType == \'radio\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${queryKey}">\n <el-radio-group v-model="state.queryForm.${queryKey}">\n#if($field.fieldDict)\n <el-radio \n :label="item.value" \n v-for="(item, index) in ${field.fieldDict}" \n border \n :key="index"\n >\n {{ item.label }}\n </el-radio>\n#else\n <el-radio label="${field.fieldComment}" border>\n ${field.fieldComment}\n </el-radio>\n#end\n </el-radio-group>\n </el-form-item>\n#else\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#enLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (32,'树形表单V202611','${frontendPath}/src/views/${moduleName}/${functionName}/form.vue','树形表单V202611','#set($hasDuplicate = false)\n#foreach($field in $formList)\n#if($field.formValidator == \'duplicate\')\n#set($hasDuplicate = true)\n#end\n#end\n## 开关:按属性类型决定开/关的值,Boolean 用 true/false,整型用 1/0,其余用 \'1\'/\'0\'\n#macro(switchValues $f)\n#if($f.attrType == \'Boolean\')\n#set($switchOn = \'true\')\n#set($switchOff = \'false\')\n#elseif($f.attrType == \'Integer\' || $f.attrType == \'Long\' || $f.attrType == \'Short\')\n#set($switchOn = \'1\')\n#set($switchOff = \'0\')\n#else\n#set($switchOn = "\'1\'")\n#set($switchOff = "\'0\'")\n#end\n#end\n#set($hasOrg = false)\n#foreach($field in $formList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\n<template>\n <el-dialog :title="form.${pk.attrName} ? \'编辑\' : \'新增\'" v-model="visible"\n :close-on-click-modal="false" draggable>\n <el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">\n <el-row :gutter="24">\n <!-- 父级节点选择 -->\n#if($formLayout == 1)\n <el-col :span="24" class="mb20">\n#elseif($formLayout == 2)\n <el-col :span="12" class="mb20">\n#end\n <el-form-item label="父级节点" prop="${parentField}">\n <el-tree-select\n v-model="form.${parentField}"\n :data="parentNodes"\n :props="treeSelectProps"\n check-strictly\n :render-after-expand="false"\n placeholder="请选择父级节点"\n style="width: 100%"\n clearable\n filterable\n />\n </el-form-item>\n </el-col>\n#foreach($field in $formList)\n#if($field.attrName != ${pk.attrName} && $field.attrName != ${parentField})\n#if($formLayout == 1)\n <el-col :span="24" class="mb20">\n#elseif($formLayout == 2)\n <el-col :span="12" class="mb20">\n#end\n#if($field.formType.startsWith(\'org-\'))\n#set($orgType = $field.formType.replace(\'org-\', \'\').replace(\'-multiple\', \'\'))\n <el-form-item label="${field.fieldComment}" prop="${field.attrName}">\n <OrgSelect v-model="form.${field.attrName}" value-type="item" type="${orgType}" :multiple="#if($field.formType.endsWith(\'-multiple\'))true#else false#end" label="${field.fieldComment}" :disabled="loading" />\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'switch\')\n#switchValues($field)\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-switch :model-value="String(form.${field.attrName}) === String($switchOn)" @change="(checked) => (form.${field.attrName} = checked ? $switchOn : $switchOff)" />\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'text\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-input v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"/>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'textarea\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-input type="textarea" v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"/>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'select\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-select v-model="form.${field.attrName}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end">\n#if($field.fieldDict)\n <el-option :value="item.value" :label="item.label" v-for="(item, index) in ${field.fieldDict}" :key="index"></el-option>\n#else\n <el-option label="请选择" value="0"></el-option>\n#end\n </el-select>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'radio\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-radio-group v-model="form.${field.attrName}">\n#if($field.fieldDict)\n <el-radio :label="item.value" v-for="(item, index) in ${field.fieldDict}" border :key="index">{{ item.label }}</el-radio>\n#else\n <el-radio label="${field.fieldComment}" bordLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (33,'左树右表ControllerV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/controller/${ClassName}Controller.java','左树右表ControllerV202611','## 查询条件按需导入 StrUtil(字符串字段);Objects 用于树节点筛选,始终导入\n#set($needStrUtil = false)\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\') || ($field.formType != \'checkbox\' && $field.queryFormType != \'daterange\' && $field.queryFormType != \'datetimerange\' && $field.attrType == \'String\'))\n#set($needStrUtil = true)\n#end\n#end\n#set($hasOrgQuery = false)\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrgQuery = true)\n#end\n#end\n## 组织字段以 [{id,name}] JSON 存储,按 ${attrName}Keyword 对整列模糊查询,分页和导出共用\n#macro(orgKeywordParams)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), @RequestParam(required = false) String ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordDecl)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), String ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordArgs)#foreach($field in $queryList)#if($field.formType.startsWith(\'org-\')), ${field.attrName}Keyword#end#end#end\n#macro(orgKeywordFilters)\n#if($hasOrgQuery)\n // 组织字段对整列 JSON 做 LIKE:关键字为数字或 id/name 时会误命中,需精确匹配时改用数据库 JSON 函数\n#end\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))\n wrapper.like(StrUtil.isNotBlank(${field.attrName}Keyword), ${ClassName}Entity::$str.getProperty($field.attrName), ${field.attrName}Keyword);\n#end\n#end\n#end\npackage ${package}.${moduleName}.controller;\n\n#if($needStrUtil)\nimport cn.hutool.core.util.StrUtil;\n#end\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.collection.CollUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport ${package}.common.core.util.R;\nimport ${package}.common.log.annotation.SysLog;\n#if($opensource)\nimport com.pig4cloud.plugin.excel.annotation.ResponseExcel;\nimport com.pig4cloud.plugin.excel.annotation.RequestExcel;\n#else\nimport ${package}.common.excel.annotation.ResponseExcel;\nimport ${package}.common.excel.annotation.RequestExcel;\n#end\nimport ${entityPackage}.${ChildClassName}Entity;\nimport ${entityClassName};\nimport ${package}.${moduleName}.service.${ClassName}Service;\n\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\n#if($isSpringBoot3)\nimport ${package}.common.security.annotation.HasPermission;\nimport org.springdoc.core.annotations.ParameterObject;\n#else\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport org.springdoc.api.annotations.ParameterObject;\n#end\nimport org.springframework.http.HttpHeaders;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n#foreach($field in $childFieldList)\n#if($field.primaryPk == \'1\')\n#set($childPkField = $field)\n#break\n#end\n#end\n#set($childFieldGetter = $str.getProperty($childField))\n@RestController\n@RequiredArgsConstructor\n@RequestMapping("/${functionName}" )\n@Tag(description = "${functionName}" , name = "${tableComment}管理" )\n@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)\npublic class ${ClassName}Controller {\n\n private final ${ClassName}Service ${className}Service;\n\n /**\n * 分页查询\n * @param page 分页对象\n * @param ${className} ${tableComment}\n * @return\n */\n @Operation(summary = "分页查询" , description = "分页查询" )\n @GetMapping("/page" )\n #if($isSpringBoot3)\n @HasPermission("$str.lowerCase($moduleName)_$str.lowerCase($functionName)_view")\n #else\n @PreAuthorize("@pms.hasPermission(\'$str.lowerCase($moduleName)_$str.lowerCase($functionName)_view\')" )\n #end\n public R get${ClassName}Page(@ParameterObject Page page, @ParameterObject ${ClassName}Entity ${className}#orgKeywordParams()) {\n return R.ok(${className}Service.page(page, buildQueryWrapper(${className}#orgKeywordArgs())));\n }\n\n /**\n * 列表与导出共用的查询条件,保证导出结果与列表一致\n */\n private LambdaQueryWrapper<${ClassName}Entity> buildQueryWrapper(${ClassName}Entity ${className}#orgKeywordDecl()) {\n LambLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (34,'左树右表ServiceV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/service/${ClassName}Service.java','左树右表ServiceV202611','package ${package}.${moduleName}.service;\n\nimport cn.hutool.core.lang.tree.Tree;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.spring.service.IService;\nimport ${entityPackage}.${ChildClassName}Entity;\nimport ${entityClassName};\n\nimport java.util.List;\n\n/**\n * ${tableComment} Service接口\n *\n * @author ${author}\n * @date ${datetime}\n */\n#foreach($field in $childFieldList)\n#if($field.primaryPk == \'1\')\n#set($childPkField = $field)\n#break\n#end\n#end\npublic interface ${ClassName}Service extends IService<${ClassName}Entity> {\n\n /**\n * 构建树形结构数据\n * @param wrapper 查询条件\n * @return 树形结构数据\n */\n List<Tree<${childPkField.attrType}>> buildTree(LambdaQueryWrapper<${ChildClassName}Entity> wrapper);\n\n /**\n * 获取树节点详情\n * @param ${childClassName} 树节点查询对象\n * @return 树节点详情列表\n */\n List<${ChildClassName}Entity> getTreeDetails(${ChildClassName}Entity ${childClassName});\n\n /**\n * 保存树节点\n * @param ${childClassName} 树节点对象\n * @return 保存结果\n */\n Boolean saveTree(${ChildClassName}Entity ${childClassName});\n\n /**\n * 更新树节点\n * @param ${childClassName} 树节点对象\n * @return 更新结果\n */\n Boolean updateTree(${ChildClassName}Entity ${childClassName});\n\n /**\n * 批量删除树节点\n * @param ids 树节点ID列表\n * @return 删除结果\n */\n Boolean removeTreeByIds(${childPkField.attrType}[] ids);\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (35,'左树右表ServiceImplV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/service/impl/${ClassName}ServiceImpl.java','左树右表ServiceImplV202611','package ${package}.${moduleName}.service.impl;\n\nimport cn.hutool.core.collection.CollUtil;\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.lang.tree.Tree;\nimport cn.hutool.core.lang.tree.TreeNode;\nimport cn.hutool.core.lang.tree.TreeUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;\nimport ${entityPackage}.${ChildClassName}Entity;\nimport ${entityClassName};\nimport ${package}.${moduleName}.mapper.${ChildClassName}Mapper;\nimport ${package}.${moduleName}.mapper.${ClassName}Mapper;\nimport ${package}.${moduleName}.service.${ClassName}Service;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.function.Function;\n\n/**\n * ${tableComment} Service实现类\n *\n * @author ${author}\n * @date ${datetime}\n */\n#foreach($field in $childFieldList)\n#if($field.primaryPk == \'1\')\n#set($childPkField = $field)\n#set($childPkGetter = $str.getProperty($childPkField.attrName))\n#break\n#end\n#end\n#set($parentGetter = $str.getProperty($parentField))\n#set($childFieldGetter = $str.getProperty($childField))\n#if($childPkField.attrType == \'Long\')\n#set($treeRootId = \'0L\')\n#elseif($childPkField.attrType == \'String\')\n#set($treeRootId = \'\"0\"\')\n#else\n#set($treeRootId = \'0\')\n#end\n@Service\n@RequiredArgsConstructor\npublic class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {\n\n private final ${ChildClassName}Mapper ${childClassName}Mapper;\n\n /**\n * 构建树形结构数据\n * @param wrapper 查询条件\n * @return 树形结构数据\n */\n @Override\n public List<Tree<${childPkField.attrType}>> buildTree(LambdaQueryWrapper<${ChildClassName}Entity> wrapper) {\n List<${ChildClassName}Entity> allList = ${childClassName}Mapper.selectList(wrapper);\n\n if (CollUtil.isEmpty(allList)) {\n return new ArrayList<>();\n }\n\n List<TreeNode<${childPkField.attrType}>> collect = allList.stream().map(getNodeFunction()).toList();\n return TreeUtil.build(collect, ${treeRootId});\n }\n\n /**\n * 获取树节点详情\n * @param ${childClassName} 树节点查询对象\n * @return 树节点详情列表\n */\n @Override\n public List<${ChildClassName}Entity> getTreeDetails(${ChildClassName}Entity ${childClassName}) {\n return ${childClassName}Mapper.selectList(Wrappers.query(${childClassName}));\n }\n\n /**\n * 保存树节点\n * @param ${childClassName} 树节点对象\n * @return 保存结果\n */\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean saveTree(${ChildClassName}Entity ${childClassName}) {\n ${childClassName}.$str.setProperty($parentField)(validateParentRelation(null, ${childClassName}.$str.getProperty($parentField)()));\n return ${childClassName}Mapper.insert(${childClassName}) > 0;\n }\n\n /**\n * 更新树节点\n * @param ${childClassName} 树节点对象\n * @return 更新结果\n */\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean updateTree(${ChildClassName}Entity ${childClassName}) {\n ${childClassName}.$str.setProperty($parentField)(validateParentRelation(${childClassName}.$str.getProperty($childPkField.attrName)(), ${childClassName}.$str.getProperty($parentField)()));\n return ${childClassName}Mapper.updateById(${childClassName}) > 0;\n }\n\n /**\n * 批量删除树节点\n * @param ids 树节点ID列表\n * @return 删除结果\n */\n @Override\n @Transactional(rollbackFor = Exception.class)\n public Boolean removeTreeByIds(${childPkField.attrType}[] ids) {\n if (ArrayUtil.isEmpty(ids)) {\n return Boolean.TRUE;\n }\n\n for (${childPkField.attrType} id : ids) {\n if (hasChildNodes(id)) {\n throw new RuntimeException(\"当前节点存在子节点,不能删除\");\n }\n if (hasMainRecords(id)) {\n throw new RuntimeException(\"当前节点已关联主表数据,不能删除\");\n }\n }\n\n return ${childClassNameLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (36,'实体V202611','${entityPath}/src/main/java/${entityPackagePath}/${ClassName}Entity.java','实体V202611','#set($hasOrg = false)\n#foreach($field in $fieldList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\npackage ${entityPackage};\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.spring.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#if($hasOrg)\nimport com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;\nimport ${package}.common.core.util.OrgRef;\nimport org.apache.fesod.sheet.annotation.ExcelIgnore;\nimport java.util.List;\n#end\n#if($isTenant)\nimport ${package}.common.core.util.TenantTable;\n#end\n#foreach($import in $importList)\n#if(!$import.startsWith(\'java.lang.\'))\nimport $import;\n#end\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n#if($isTenant)\n@TenantTable\n#end\n@TableName(value = \"${tableName}\"#if($hasOrg), autoResultMap = true#end)\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${tableComment}\")\npublic class ${ClassName}Entity extends Model<${ClassName}Entity> {\n\n#foreach ($field in $fieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.formType.startsWith(\'org-\'))\n @TableField(typeHandler = JacksonTypeHandler.class#if($field.autoFill == \'INSERT\' || $field.autoFill == \'INSERT_UPDATE\' || $field.autoFill == \'UPDATE\'), fill = FieldFill.${field.autoFill}#end)\n @ExcelIgnore\n#elseif($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n#if($field.formType.startsWith(\'org-\'))\n private List<OrgRef> $field.attrName;\n#elseif($field.formType == \'checkbox\')\n private ${field.attrType}[] $field.attrName;\n#elseif($field.formType == \'daterange\' || $field.formType == \'datetimerange\')\n private String[] $field.attrName;\n#else\n private $field.attrType $field.attrName;\n#end\n#end\n#foreach ($field in $queryList)\n#if($field.queryFormType == \'daterange\' || $field.queryFormType == \'datetimerange\')\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n\n /**\n * $comment 查询范围\n */\n @TableField(exist = false)\n @Schema(description=\"$comment 查询范围\",hidden=true)\n private String[] ${field.attrName}Range;\n#end\n#end\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (37,'MapperV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ClassName}Mapper.java','MapperV202611','package ${package}.${moduleName}.mapper;\n\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport ${entityClassName};\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\npublic interface ${ClassName}Mapper extends BaseMapper<${ClassName}Entity> {\n\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (38,'Mapper.xmlV202611','${backendPath}/src/main/resources/mapper/${ClassName}Mapper.xml','Mapper.xmlV202611','<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n\n<mapper namespace=\"${package}.${moduleName}.mapper.${ClassName}Mapper\">\n\n <resultMap id=\"${className}Map\" type=\"${entityClassName}\">\n#foreach ($field in $fieldList)\n #if($field.primaryPk == \'1\')\n <id property=\"$field.attrName\" column=\"$field.fieldName\"/>\n #else\n <result property=\"$field.attrName\" column=\"$field.fieldName\"#if($field.formType.startsWith(\'org-\')) typeHandler=\"com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler\"#end/>\n #end\n#end\n </resultMap>\n</mapper>\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (39,'子实体V202611','${entityPath}/src/main/java/${entityPackagePath}/${ChildClassName}Entity.java','子实体V202611','#set($hasOrg = false)\n#foreach($field in $childFieldList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\npackage ${entityPackage};\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport com.baomidou.mybatisplus.spring.activerecord.Model;\nimport io.swagger.v3.oas.annotations.media.Schema;\n#if($isChildTenant)\nimport ${package}.common.core.util.TenantTable;\n#end\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n#if($hasOrg)\nimport com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;\nimport ${package}.common.core.util.OrgRef;\nimport java.util.List;\n#end\n#set($childImports = [])\n#foreach($field in $childFieldList)\n#if($field.packageName && !$field.packageName.startsWith(\'java.lang.\') && !$childImports.contains($field.packageName))\n#set($void = $childImports.add($field.packageName))\n#end\n#end\n#foreach($import in $childImports)\nimport $import;\n#end\n\n/**\n * ${tableComment}\n *\n * @author ${author}\n * @date ${datetime}\n */\n@Data\n#if($isChildTenant)\n@TenantTable\n#end\n@TableName(value = \"${childTableName}\"#if($hasOrg), autoResultMap = true#end)\n@EqualsAndHashCode(callSuper = true)\n@Schema(description = \"${childTableName}\")\npublic class ${ChildClassName}Entity extends Model<${ChildClassName}Entity> {\n\n#foreach ($field in $childFieldList)\n#if(${field.fieldComment})#set($comment=${field.fieldComment})#else #set($comment=${field.attrName})#end\n /**\n * $comment\n */\n#if($field.primaryPk == \'1\')\n @TableId(type = IdType.ASSIGN_ID)\n#end\n#if($field.formType.startsWith(\'org-\'))\n @TableField(typeHandler = JacksonTypeHandler.class#if($field.autoFill == \'INSERT\' || $field.autoFill == \'INSERT_UPDATE\' || $field.autoFill == \'UPDATE\'), fill = FieldFill.${field.autoFill}#end)\n#elseif($field.autoFill == \'INSERT\')\n @TableField(fill = FieldFill.INSERT)\n#elseif($field.autoFill == \'INSERT_UPDATE\')\n @TableField(fill = FieldFill.INSERT_UPDATE)\n#elseif($field.autoFill == \'UPDATE\')\n @TableField(fill = FieldFill.UPDATE)\n#end\n#if($field.fieldName == \'del_flag\')\n @TableLogic\n @TableField(fill = FieldFill.INSERT)\n#end\n @Schema(description=\"$comment\"#if($field.hidden),hidden=$field.hidden#end)\n#if($field.formType.startsWith(\'org-\'))\n private List<OrgRef> $field.attrName;\n#elseif($field.formType == \'checkbox\')\n private ${field.attrType}[] $field.attrName;\n#else\n private $field.attrType $field.attrName;\n#end \n#end\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (40,'子MapperV202611','${backendPath}/src/main/java/${packagePath}/${moduleName}/mapper/${ChildClassName}Mapper.java','子MapperV202611','package ${package}.${moduleName}.mapper;\n\nimport ${package}.common.data.datascope.PigxBaseMapper;\nimport ${entityPackage}.${ChildClassName}Entity;\nimport org.apache.ibatis.annotations.Mapper;\n\n@Mapper\npublic interface ${ChildClassName}Mapper extends PigxBaseMapper<${ChildClassName}Entity> {\n\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (41,'权限菜单V202611','${backendPath}/menu/${functionName}_menu.sql','权限菜单V202611','#set($permissionPrefix = \"${moduleName}_${functionName}\")\n#set($permissionPrefix = $permissionPrefix.toLowerCase())\n-- 该脚本不要直接执行, 注意维护菜单的父节点ID 默认 父节点-1 , #if(!$opensource)默认租户 1#end\n#set($menuId=${dateTool.getSystemTime()})\n\n-- 菜单SQL\ninsert into sys_menu ( menu_id,parent_id, path, permission, menu_type, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${menuId}, \'-1\', \'/${moduleName}/${functionName}/index\', \'\', \'0\', \'icon-bangzhushouji\', \'0\', null , \'8\', null , \'${tableComment}管理\'#if(!$opensource), 1#end);\n\n-- 菜单对应按钮SQL\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,1)},${menuId}, \'${permissionPrefix}_view\', \'1\', null, \'1\', \'0\', null, \'0\', null, \'${tableComment}查看\'#if(!$opensource), 1#end);\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,2)},${menuId}, \'${permissionPrefix}_add\', \'1\', null, \'1\', \'0\', null, \'1\', null, \'${tableComment}新增\'#if(!$opensource), 1#end);\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,3)},${menuId}, \'${permissionPrefix}_edit\', \'1\', null, \'1\', \'0\', null, \'2\', null, \'${tableComment}修改\'#if(!$opensource), 1#end);\n\ninsert into sys_menu (menu_id, parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,4)},${menuId}, \'${permissionPrefix}_del\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'${tableComment}删除\'#if(!$opensource), 1#end);\n\ninsert into sys_menu ( menu_id,parent_id, permission, menu_type, path, icon, del_flag, create_time, sort_order, update_time, name#if(!$opensource), tenant_id#end)\nvalues (${math.add($menuId,5)},${menuId}, \'${permissionPrefix}_export\', \'1\', null, \'1\', \'0\', null, \'3\', null, \'导入导出\'#if(!$opensource), 1#end);\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (42,'左树右表api.tsV202611','${frontendPath}/src/api/${moduleName}/${functionName}.ts','左树右表api.tsV202611','import request from \"/@/utils/request\"\n\n// ========== 基础CRUD接口 ==========\n\n/**\n * 分页查询列表数据\n * @param query - 查询参数对象\n * @returns Promise<分页数据>\n */\nexport function fetchList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/page\',\n method: \'get\',\n params: query\n })\n}\n\n/**\n * 新增数据\n * @param obj - 要新增的数据对象\n * @returns Promise<boolean> - 操作结果\n */\nexport function addObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'post\',\n data: obj\n })\n}\n\n/**\n * 获取详情数据\n * @param obj - 查询参数对象(包含ID等)\n * @returns Promise<数据详情>\n */\nexport function getObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/details\',\n method: \'get\',\n params: obj\n })\n}\n\n/**\n * 批量删除数据\n * @param ids - 要删除的ID数组\n * @returns Promise<操作结果>\n */\nexport function delObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'delete\',\n data: ids\n })\n}\n\n/**\n * 更新数据\n * @param obj - 要更新的数据对象\n * @returns Promise<操作结果>\n */\nexport function putObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}\',\n method: \'put\',\n data: obj\n })\n}\n\n// ========== 树形CRUD接口 ==========\n\n/**\n * 获取树形列表数据\n * @param query - 查询参数对象\n * @returns Promise<树形数据>\n */\nexport function fetchTreeList(query?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/tree\',\n method: \'get\',\n params: query\n })\n}\n\n/**\n * 获取树节点详情\n * @param obj - 查询参数对象(包含ID等)\n * @returns Promise<树节点详情>\n */\nexport function getTreeObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/tree/details\',\n method: \'get\',\n params: obj\n })\n}\n\n/**\n * 新增树节点\n * @param obj - 要新增的树节点对象\n * @returns Promise<操作结果>\n */\nexport function addTreeObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/tree\',\n method: \'post\',\n data: obj\n })\n}\n\n/**\n * 更新树节点\n * @param obj - 要更新的树节点对象\n * @returns Promise<操作结果>\n */\nexport function putTreeObj(obj?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/tree\',\n method: \'put\',\n data: obj\n })\n}\n\n/**\n * 删除树节点\n * @param ids - 要删除的树节点ID数组\n * @returns Promise<操作结果>\n */\nexport function delTreeObjs(ids?: Object) {\n return request({\n url: \'/${moduleName}/${functionName}/tree\',\n method: \'delete\',\n data: ids\n })\n}\n\n// ========== 工具函数 ==========\n\n/**\n * 验证字段值唯一性\n * @param rule - 验证规则对象\n * @param value - 要验证的值\n * @param callback - 验证回调函数\n * @param isEdit - 是否为编辑模式\n *\n * @example\n * // 在表单验证规则中使用\n * fieldName: [\n * {\n * validator: (rule, value, callback) => {\n * validateExist(rule, value, callback, form.${pk.attrName} !== \'\');\n * },\n * trigger: \'blur\',\n * },\n * ]\n */\nexport function validateExist(rule: any, value: any, callback: any, isEdit: boolean) {\n // 编辑模式下跳过验证\n if (isEdit) {\n return callback();\n }\n\n // 查询是否存在相同值\n getObj({ [rule.field]: value }).then((response) => {\n const result = response.data;\n if (result !== null && result.length > 0) {\n callback(new Error(\'数据已经存在\'));\n } else {\n callback();\n }\n });\n}\n','2026-04-08 17:38:24','2026-04-08 17:38:24','0',1,'admin','admin');
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (43,'左树右表表格V202611','${frontendPath}/src/views/${moduleName}/${functionName}/index.vue','左树右表表格V202611','## 有字典字段时才导入 useDict\n#set($hasDictField = false)\n#foreach($field in $queryList)\n#if($field.fieldDict)\n#set($hasDictField = true)\n#end\n#end\n#foreach($field in $gridList)\n#if($field.fieldDict)\n#set($hasDictField = true)\n#end\n#end\n#foreach($field in $childFieldList)\n#if($field.primaryPk == \'1\')\n#set($childPkField = $field)\n#break\n#end\n#end\n## 开关:按属性类型决定开/关的值,Boolean 用 true/false,整型用 1/0,其余用 \'1\'/\'0\'\n#macro(switchValues $f)\n#if($f.attrType == \'Boolean\')\n#set($switchOn = \'true\')\n#set($switchOff = \'false\')\n#elseif($f.attrType == \'Integer\' || $f.attrType == \'Long\' || $f.attrType == \'Short\')\n#set($switchOn = \'1\')\n#set($switchOff = \'0\')\n#else\n#set($switchOn = "\'1\'")\n#set($switchOff = "\'0\'")\n#end\n#end\n<template>\n <div class="layout-padding">\n <splitpanes>\n <pane size="15">\n <div class="layout-padding-auto layout-padding-view">\n <el-scrollbar>\n <div class="mb8" style="display: flex; align-items: center; justify-content: space-between;">\n <span style="font-weight: 500;">左侧节点</span>\n <div>\n <el-tooltip :content="currentTreeId ? \'新增子节点\' : \'新增根节点\'" placement="top">\n <el-button link type="primary" icon="FolderAdd" @click="handleAddTree" />\n </el-tooltip>\n </div>\n </div>\n <el-tree\n ref="treeRef"\n :data="treeData"\n :props="treeProps"\n node-key="${childPkField.attrName}"\n highlight-current\n default-expand-all\n :expand-on-click-node="false"\n @node-click="handleTreeNodeClick"\n >\n <template #default="{ node, data }">\n <span style="flex: 1; display: flex; align-items: center; justify-content: space-between;">\n <span>{{ node.label }}</span>\n <span v-if="currentTreeId === data.${childPkField.attrName}" style="margin-left: 8px;">\n <el-tooltip content="编辑" placement="top">\n <el-button link type="primary" icon="Edit" size="small" @click.stop="handleEditTree" />\n </el-tooltip>\n <el-tooltip content="删除" placement="top">\n <el-button link type="danger" icon="Delete" size="small" @click.stop="handleDeleteTree" />\n </el-tooltip>\n </span>\n </span>\n </template>\n </el-tree>\n </el-scrollbar>\n </div>\n </pane>\n <pane class="ml8">\n <div class="layout-padding-auto layout-padding-view">\n#if($queryList)\n <el-row v-show="showSearch">\n <el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">\n#foreach($field in $queryList)\n#if($field.formType.startsWith(\'org-\'))#set($queryKey = "${field.attrName}Keyword")#else#set($queryKey = $field.attrName)#end\n#if($field.attrName != ${childField})\n#if($field.queryFormType == \'select\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${queryKey}">\n <el-select v-model="state.queryForm.${queryKey}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end">\n#if($field.fieldDict)\n <el-option \n :label="item.label" \n :value="item.value" \n v-for="(item, index) in ${field.fieldDict}" \n :key="index"\n />\n#else\n <el-option label="请选择" value="0" />\n#end\n </el-select>\n </el-form-item>\n#elseif($field.queryFormType == \'date\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${queryKey}">\n <el-date-picker\n type="date"\n placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"\n v-model="state.queryForm.${queryKey}"\n :value-format="dateStr"\n />\n </el-form-item>\n#elseif($field.queryFormType == \'daterange\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}Range">\n <el-date-pickerLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (44,'左树右表树表单V202611','${frontendPath}/src/views/${moduleName}/${functionName}/tree-form.vue','左树右表树表单V202611','#foreach($field in $childFieldList)\n#if($field.primaryPk == \'1\')\n#set($childPkField = $field)\n#break\n#end\n#end\n#set($fieldDict=[])\n#foreach($field in $childFieldList)\n#if($field.fieldDict)\n#set($void=$fieldDict.add($field.fieldDict))\n#end\n#end\n## 开关:按属性类型决定开/关的值,Boolean 用 true/false,整型用 1/0,其余用 \'1\'/\'0\'\n#macro(switchValues $f)\n#if($f.attrType == \'Boolean\')\n#set($switchOn = \'true\')\n#set($switchOff = \'false\')\n#elseif($f.attrType == \'Integer\' || $f.attrType == \'Long\' || $f.attrType == \'Short\')\n#set($switchOn = \'1\')\n#set($switchOff = \'0\')\n#else\n#set($switchOn = "\'1\'")\n#set($switchOff = "\'0\'")\n#end\n#end\n#set($hasOrg = false)\n#foreach($field in $childFieldList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\n<template>\n <el-dialog :title="form.${childPkField.attrName} ? \'编辑\' : \'新增\'" v-model="visible"\n :close-on-click-modal="false" draggable>\n <el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading">\n <el-row :gutter="24">\n#if($formLayout == 1)\n <el-col :span="24" class="mb20">\n#elseif($formLayout == 2)\n <el-col :span="12" class="mb20">\n#end\n <el-form-item label="父级节点" prop="${parentField}">\n <el-tree-select\n v-model="form.${parentField}"\n :data="parentNodes"\n :props="treeSelectProps"\n check-strictly\n :render-after-expand="false"\n placeholder="请选择父级节点"\n style="width: 100%"\n clearable\n filterable\n />\n </el-form-item>\n </el-col>\n#foreach($field in $childFieldList)\n#if($field.attrName != ${childPkField.attrName} && $field.attrName != ${parentField})\n#if($formLayout == 1)\n <el-col :span="24" class="mb20">\n#elseif($formLayout == 2)\n <el-col :span="12" class="mb20">\n#end\n#if($field.formType.startsWith(\'org-\'))\n#set($orgType = $field.formType.replace(\'org-\', \'\').replace(\'-multiple\', \'\'))\n <el-form-item label="${field.fieldComment}" prop="${field.attrName}">\n <OrgSelect v-model="form.${field.attrName}" value-type="item" type="${orgType}" :multiple="#if($field.formType.endsWith(\'-multiple\'))true#else false#end" label="${field.fieldComment}" :disabled="loading" />\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'switch\')\n#switchValues($field)\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-switch :model-value="String(form.${field.attrName}) === String($switchOn)" @change="(checked) => (form.${field.attrName} = checked ? $switchOn : $switchOff)" />\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'text\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-input v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"/>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'textarea\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-input type="textarea" v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"/>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'select\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-select v-model="form.${field.attrName}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end">\n#if($field.fieldDict)\n <el-option :value="item.value" :label="item.label" v-for="(item, index) in ${field.fieldDict}" :key="index"></el-option>\n#else\n <el-option label="请选择" value="0"></el-option>\n#end\n </el-select>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'radio\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-radio-group v-model="form.${field.attrName}">\n#if($field.fieldDict)\n <el-radio :label="item.value" v-for="(item, index) in ${field.fieldDicLine truncated
INSERT INTO `gen_template` (`id`, `template_name`, `generator_path`, `template_desc`, `template_code`, `create_time`, `update_time`, `del_flag`, `tenant_id`, `create_by`, `update_by`) VALUES (45,'左树右表主表单V202611','${frontendPath}/src/views/${moduleName}/${functionName}/form.vue','左树右表主表单V202611','#set($hasDuplicate = false)\n#foreach($field in $formList)\n#if($field.attrName != ${childField} && $field.formValidator == \'duplicate\')\n#set($hasDuplicate = true)\n#end\n#end\n#foreach($field in $childFieldList)\n#if($field.primaryPk == \'1\')\n#set($childPkField = $field)\n#break\n#end\n#end\n#set($relationFieldLabel = $childField)\n#foreach($field in $fieldList)\n#if($field.attrName == $childField)\n#if($field.fieldComment)\n#set($relationFieldLabel = $field.fieldComment)\n#else\n#set($relationFieldLabel = $field.attrName)\n#end\n#break\n#end\n#end\n#set($fieldDict=[])\n#foreach($field in $formList)\n#if($field.fieldDict)\n#set($void=$fieldDict.add($field.fieldDict))\n#end\n#end\n## 开关:按属性类型决定开/关的值,Boolean 用 true/false,整型用 1/0,其余用 \'1\'/\'0\'\n#macro(switchValues $f)\n#if($f.attrType == \'Boolean\')\n#set($switchOn = \'true\')\n#set($switchOff = \'false\')\n#elseif($f.attrType == \'Integer\' || $f.attrType == \'Long\' || $f.attrType == \'Short\')\n#set($switchOn = \'1\')\n#set($switchOff = \'0\')\n#else\n#set($switchOn = "\'1\'")\n#set($switchOff = "\'0\'")\n#end\n#end\n#set($hasOrg = false)\n#foreach($field in $formList)\n#if($field.formType.startsWith(\'org-\'))\n#set($hasOrg = true)\n#end\n#end\n<template>\n <el-dialog :title="form.${pk.attrName} ? \'编辑\' : \'新增\'" v-model="visible"\n :close-on-click-modal="false" draggable>\n <el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading">\n <el-row :gutter="24">\n#if($formLayout == 1)\n <el-col :span="24" class="mb20">\n#elseif($formLayout == 2)\n <el-col :span="12" class="mb20">\n#end\n <el-form-item label="${relationFieldLabel}" prop="${childField}">\n <el-tree-select\n v-model="form.${childField}"\n :data="treeNodes"\n :props="treeSelectProps"\n check-strictly\n :render-after-expand="false"\n placeholder="请选择${relationFieldLabel}"\n style="width: 100%"\n clearable\n filterable\n />\n </el-form-item>\n </el-col>\n#foreach($field in $formList)\n#if($field.attrName != ${pk.attrName} && $field.attrName != ${childField})\n#if($formLayout == 1)\n <el-col :span="24" class="mb20">\n#elseif($formLayout == 2)\n <el-col :span="12" class="mb20">\n#end\n#if($field.formType.startsWith(\'org-\'))\n#set($orgType = $field.formType.replace(\'org-\', \'\').replace(\'-multiple\', \'\'))\n <el-form-item label="${field.fieldComment}" prop="${field.attrName}">\n <OrgSelect v-model="form.${field.attrName}" value-type="item" type="${orgType}" :multiple="#if($field.formType.endsWith(\'-multiple\'))true#else false#end" label="${field.fieldComment}" :disabled="loading" />\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'switch\')\n#switchValues($field)\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-switch :model-value="String(form.${field.attrName}) === String($switchOn)" @change="(checked) => (form.${field.attrName} = checked ? $switchOn : $switchOff)" />\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'text\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-input v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"/>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'textarea\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-input type="textarea" v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end"/>\n </el-form-item>\n </el-col>\n#elseif($field.formType == \'select\')\n <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end" prop="${field.attrName}">\n <el-select v-model="form.${field.attrName}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else${field.attrName}#end">\n#if($field.fieldDict)\n <el-option :value="item.value" :label="item.label" v-for="(item, index) in ${field.fieldDict}" :key="index"></el-option>\n#else\n <el-option label="请选择" value="0"></el-option>\n#end\n Line truncated
COMMIT;
-- ----------------------------
-- Table structure for gen_template_group
-- ----------------------------
DROP TABLE IF EXISTS `gen_template_group`;
CREATE TABLE `gen_template_group` (
`group_id` bigint NOT NULL COMMENT '分组id',
`template_id` bigint NOT NULL COMMENT '模板id',
PRIMARY KEY (`group_id`,`template_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模板分组关联表';
-- ----------------------------
-- Records of gen_template_group
-- ----------------------------
BEGIN;
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (1,1);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (1,2);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (1,3);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (1,4);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (1,5);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (1,6);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (1,7);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (1,8);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (1,9);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (1,10);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,11);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,12);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,13);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,14);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,15);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,16);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,17);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,18);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,19);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,20);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,21);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (2,22);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (3,23);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (3,24);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (3,25);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (3,26);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (3,27);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (3,28);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (3,29);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (3,30);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (3,31);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (3,32);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,33);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,34);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,35);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,36);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,37);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,38);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,39);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,40);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,41);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,42);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,43);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,44);
INSERT INTO `gen_template_group` (`group_id`, `template_id`) VALUES (4,45);
COMMIT;
-- ----------------------------
-- Table structure for gen_create_table
-- ----------------------------
DROP TABLE IF EXISTS `gen_create_table`;
CREATE TABLE `gen_create_table` (
`id` bigint NOT NULL COMMENT '主键ID',
`table_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '表名称',
`ds_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '数据源',
`comments` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '表注释',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL,
`column_info` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '字段信息',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '删除标记',
`tenant_id` bigint DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='自动创建表管理';
SET FOREIGN_KEY_CHECKS = 1;
+185
View File
@@ -0,0 +1,185 @@
USE pigxx_app;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for app_article
-- ----------------------------
DROP TABLE IF EXISTS `app_article`;
CREATE TABLE `app_article` (
`id` bigint NOT NULL COMMENT '主键',
`cid` bigint NOT NULL COMMENT '分类',
`title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标题',
`intro` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '简介',
`summary` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '摘要',
`image` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '封面',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '内容',
`author` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '作者',
`visit` int unsigned NOT NULL DEFAULT '0' COMMENT '浏览',
`sort` int unsigned NOT NULL DEFAULT '50' COMMENT '排序',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
`update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '删除时间',
`tenant_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `cid_idx` (`cid`) USING BTREE COMMENT '分类索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='文章资讯表';
-- ----------------------------
-- Records of app_article
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for app_article_category
-- ----------------------------
DROP TABLE IF EXISTS `app_article_category`;
CREATE TABLE `app_article_category` (
`id` bigint unsigned NOT NULL COMMENT '主键',
`name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称',
`sort` smallint unsigned NOT NULL DEFAULT '50' COMMENT '排序',
`is_show` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '是否显示: 0=否, 1=是',
`del_flag` char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否删除: 0=否, 1=是',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '创建人',
`update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
`tenant_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='文章分类表';
-- ----------------------------
-- Records of app_article_category
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for app_article_collect
-- ----------------------------
DROP TABLE IF EXISTS `app_article_collect`;
CREATE TABLE `app_article_collect` (
`id` bigint unsigned NOT NULL COMMENT '主键',
`user_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
`article_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '文章ID',
`create_time` datetime COMMENT '创建时间',
`update_time` datetime COMMENT '更新时间',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
`update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
`tenant_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='文章收藏表';
-- ----------------------------
-- Records of app_article_collect
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for app_contacts
-- ----------------------------
DROP TABLE IF EXISTS `app_contacts`;
CREATE TABLE `app_contacts` (
`id` bigint NOT NULL COMMENT '主键',
`contact_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系人',
`contact_phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机号',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
`tenant_id` bigint DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='通讯录表';
-- ----------------------------
-- Records of app_contacts
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for app_page
-- ----------------------------
DROP TABLE IF EXISTS `app_page`;
CREATE TABLE `app_page` (
`id` bigint unsigned NOT NULL COMMENT '主键',
`page_type` tinyint unsigned NOT NULL DEFAULT '10' COMMENT '页面类型',
`page_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '页面名称',
`page_data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '页面数据',
`create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
`update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`del_flag` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '删除标记',
`tenant_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='页面装修表';
-- ----------------------------
-- Records of app_page
-- ----------------------------
BEGIN;
INSERT INTO `app_page` VALUES (1, 1, '首页装修', '[{\"name\":\"search\",\"title\":\"搜索\",\"styles\":{},\"content\":{},\"disabled\":1},{\"name\":\"banner\",\"title\":\"首页轮播图\",\"styles\":{},\"content\":{\"data\":[{\"link\":{\"name\":\"个人中心\",\"path\":\"/pages/user/index\",\"type\":\"shop\"},\"name\":\"商品大抽拼\",\"image\":\"https://minio.pigx.vip/oss/202605/home.jpg\"}],\"enabled\":1}},{\"name\":\"nav\",\"title\":\"导航菜单\",\"styles\":{},\"content\":{\"data\":[{\"icon\":\"star\",\"link\":{\"name\":\"我的收藏\",\"path\":\"/pages/user/collection/index\",\"type\":\"shop\"},\"name\":\"我的收藏\",\"image\":\"https://minio.pigx.top/oss/app/nav02.png\"},{\"icon\":\"calendar-line\",\"name\":\"日历\",\"link\":{\"path\":\"/pages/workbench/calendar/index\",\"name\":\"日程\",\"type\":\"shop\"}},{\"icon\":\"message\",\"name\":\"消息中心\",\"link\":{\"path\":\"/pages/user/messages/index\",\"name\":\"消息中心\",\"type\":\"shop\"}},{\"icon\":\"user-group\",\"name\":\"通讯录\",\"link\":{\"path\":\"/pages/workbench/contacts/index\",\"name\":\"通讯录\",\"type\":\"shop\"}}],\"enabled\":1}}]', NULL, 'admin', NULL, '2026-05-13 23:37:53', '0', 1);
INSERT INTO `app_page` VALUES (2, 2, '个人中心', '[{\"name\":\"user-info\",\"title\":\"用户信息\",\"styles\":{},\"content\":{},\"disabled\":1},{\"name\":\"my-service\",\"title\":\"我的服务\",\"styles\":{},\"content\":{\"data\":[{\"icon\":\"settings\",\"link\":{\"name\":\"个人设置\",\"path\":\"/pages/user/settings/index\",\"type\":\"shop\"},\"name\":\"个人设置\",\"image\":\"https://minio.pigx.top/oss/app/user_setting.png\"},{\"icon\":\"star\",\"link\":{\"name\":\"我的收藏\",\"path\":\"/pages/user/collection/index\",\"type\":\"shop\"},\"name\":\"我的收藏\",\"image\":\"https://minio.pigx.top/oss/app/user_collect.png\"},{\"icon\":\"headset\",\"link\":{\"name\":\"联系客服\",\"path\":\"/pages/user/customer-service/index\",\"type\":\"shop\"},\"name\":\"联系客服\",\"image\":\"https://minio.pigx.top/oss/app/user_kefu.png\"},{\"icon\":\"info-circle\",\"name\":\"关于我们\",\"link\":{\"path\":\"/pages/user/about/index\",\"name\":\"关于我们\",\"type\":\"shop\"}}],\"style\":2,\"title\":\"服务中心\"}},{\"name\":\"user-banner\",\"title\":\"个人中心广告图\",\"styles\":{},\"content\":{\"data\":[{\"link\":{\"name\":\"个人中心\",\"path\":\"/pages/user/index\",\"type\":\"shop\"},\"name\":\"sdds\",\"image\":\"https://minio.pigx.vip/oss/202605/ad.jpg\"}],\"enabled\":1}}]', NULL, 'admin', NULL, '2026-05-13 23:37:53', '0', 1);
INSERT INTO `app_page` VALUES (3, 3, '客服设置', '[{\"title\":\"客服设置\",\"name\":\"customer-service\",\"content\":{\"title\":\"添加客服二维码\",\"time\":\"早上 9:00 - 22:00\",\"mobile\":\"13800138000\",\"qrcode\":\"/admin/sys-file/oss/file?fileName=86f81144ab2a4984bbf63fe851d49faf.png\"},\"styles\":{}}]', NULL, 'admin', NULL, '2026-05-13 23:37:53', '0', 1);
INSERT INTO `app_page` VALUES (4, 4, '工作台', '[{\"id\":\"mp47dnlr51ltq\",\"title\":\"常用功能\",\"name\":\"workbench-shortcuts\",\"content\":{\"enabled\":1,\"data\":[{\"icon\":\"send\",\"name\":\"我的\",\"link\":{\"path\":\"/pages/workbench/flow/tasks/index?type=started\",\"name\":\"我的\",\"type\":\"flow-tasks\"},\"color\":\"#2563eb\"},{\"icon\":\"clock-circle\",\"name\":\"待办\",\"link\":{\"path\":\"/pages/workbench/flow/tasks/index?type=pending\",\"name\":\"待办\",\"type\":\"flow-tasks\"},\"color\":\"#d97706\"},{\"icon\":\"email\",\"name\":\"抄送\",\"link\":{\"path\":\"/pages/workbench/flow/tasks/index?type=cc\",\"name\":\"抄送\",\"type\":\"flow-tasks\"},\"color\":\"#4f46e5\"},{\"icon\":\"check-circle\",\"name\":\"已办\",\"link\":{\"path\":\"/pages/workbench/flow/tasks/index?type=completed\",\"name\":\"已办\",\"type\":\"flow-tasks\"},\"color\":\"#15803d\"}]},\"styles\":{}}]', NULL, 'admin', NULL, '2026-05-13 23:44:57', '0', 1);
COMMIT;
-- ----------------------------
-- Table structure for app_tabbar
-- ----------------------------
DROP TABLE IF EXISTS `app_tabbar`;
CREATE TABLE `app_tabbar` (
`id` bigint unsigned NOT NULL COMMENT '主键',
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '导航名称',
`selected` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '选中图标',
`unselected` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '未选中图标',
`link` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '链接地址',
`sort_order` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`login_flag` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '是否需要登录(0-不需要,1-需要)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
`update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
`del_flag` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '删除标记',
`tenant_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='底部装修表';
-- ----------------------------
-- Records of app_tabbar
-- ----------------------------
BEGIN;
INSERT INTO `app_tabbar` VALUES (1, '首页', 'home-fill', 'home', '{\"path\":\"/pages/index/index\",\"name\":\"首页\",\"type\":\"shop\"}', 0, '0', NULL, '2026-05-13 23:37:53', NULL, 'admin', '0', 1);
INSERT INTO `app_tabbar` VALUES (2, '工作台', 'apps', 'apps', '{\"path\":\"/pages/workbench/index\",\"name\":\"工作台\",\"type\":\"shop\"}', 1, '1', NULL, '2026-05-13 23:42:00', NULL, 'admin', '0', 1);
INSERT INTO `app_tabbar` VALUES (3, '我的', 'user', 'user', '{\"path\":\"/pages/user/index\",\"name\":\"个人中心\",\"type\":\"shop\"}', 2, '0', NULL, '2026-05-13 23:37:53', NULL, 'admin', '0', 1);
COMMIT;
-- ----------------------------
-- Table structure for app_role_tabbar
-- ----------------------------
DROP TABLE IF EXISTS `app_role_tabbar`;
CREATE TABLE `app_role_tabbar` (
`role_id` bigint(20) NOT NULL COMMENT '系统角色ID',
`tabbar_id` bigint(20) NOT NULL COMMENT '底部导航ID',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户',
PRIMARY KEY (`role_id`,`tabbar_id`,`tenant_id`) USING BTREE,
KEY `app_role_tabbar_role_index` (`role_id`,`tenant_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='App角色底部导航表';
-- ----------------------------
-- Records of app_role_tabbar
-- ----------------------------
BEGIN;
INSERT INTO `app_role_tabbar` VALUES (1, 2, 1);
INSERT INTO `app_role_tabbar` VALUES (1, 3, 1);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
+4266
View File
File diff suppressed because it is too large. Load diff
+22 -8
View File
@@ -1,17 +1,31 @@
FROM mysql:5.7
FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/mysql-server:8.0.32
MAINTAINER lengleng(wangiegie@gmail.com)
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV TZ=Asia/Shanghai
ENV LANG C.UTF-8
COPY ./db/1schema.sql /docker-entrypoint-initdb.d
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY ./db/2pigxx.sql /docker-entrypoint-initdb.d
COPY ./1schema.sql /docker-entrypoint-initdb.d
COPY ./db/3pigxx_ac.sql /docker-entrypoint-initdb.d
COPY ./2pigxx.sql /docker-entrypoint-initdb.d
COPY ./db/4pigxx_job.sql /docker-entrypoint-initdb.d
COPY ./3pigxx_flow.sql /docker-entrypoint-initdb.d
COPY ./db/5pigxx_mp.sql /docker-entrypoint-initdb.d
COPY ./4pigxx_job.sql /docker-entrypoint-initdb.d
COPY ./db/6pigxx_config.sql /docker-entrypoint-initdb.d
COPY ./5pigxx_mp.sql /docker-entrypoint-initdb.d
COPY ./6pigxx_config.sql /docker-entrypoint-initdb.d
COPY ./7pigxx_pay.sql /docker-entrypoint-initdb.d
COPY ./8pigxx_codegen.sql /docker-entrypoint-initdb.d
COPY ./99pigxx_bi.sql /docker-entrypoint-initdb.d
COPY ./999pigxx_app.sql /docker-entrypoint-initdb.d
# 微服务版本可以注释掉下面这行
COPY ./0pigxx_boot.sql /docker-entrypoint-initdb.d
+41
View File
@@ -0,0 +1,41 @@
# 使用说明 V6.0 - 单体架构版本
# 1. 先构建单体 JAR: mvn clean install -Pboot -DskipTests
# 2. 启动服务: docker compose -f docker-compose-boot.yml up -d
# 3. 静静等待服务启动
services:
pigx-mysql:
build:
context: ./db
environment:
MYSQL_ROOT_HOST: "%"
MYSQL_ROOT_PASSWORD: root
restart: always
container_name: pigx-mysql
image: pigx-mysql
command: --lower_case_table_names=1
networks:
- spring_cloud_default
pigx-redis:
container_name: pigx-redis
image: registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/redis
restart: always
networks:
- spring_cloud_default
# 单体的时候注意,服务名称命名为 pigx-gateway 对应前端nginx 配置
pigx-gateway:
build:
context: ./pigx-boot
restart: always
container_name: pigx-boot
image: pigx-boot
ports:
- 9999:9999
networks:
- spring_cloud_default
networks:
spring_cloud_default:
name: spring_cloud_default
driver: bridge
+99 -63
View File
@@ -1,142 +1,178 @@
# 使用说明 V3.0.0
# 使用说明 V6.0 - 微服务架构版本
# 1. 使用docker-compose 宿主机不需要配置host来发现
# 2. 无需修改源码,根目录 docker-compose up 即可
# 3. 静静等待服务启动
version: '2'
services:
pigx-mysql:
build:
context: ./
dockerfile: ./db/Dockerfile
context: ./db
environment:
MYSQL_ROOT_HOST: "%"
MYSQL_ROOT_PASSWORD: root
restart: always
container_name: pigx-mysql
image: pigx-mysql
ports:
- 3306:3306
volumes:
- ./pigx-mysql:/var/lib/mysql
command: --lower_case_table_names=1
pigx-zookeeper:
image: zookeeper:3.4.13
restart: always
networks:
- spring_cloud_default
pigx-redis:
image: redis:5.0.4
restart: always
container_name: pigx-redis
ports:
- 6379:6379
pigx-minio:
image: minio/minio
command: server /data
ports:
- 9000:9000
volumes:
- ./data:/data
- ./config:/root/.minio
environment:
- MINIO_DOMAIN=pigx-minio
- MINIO_ACCESS_KEY=lengleng
- MINIO_SECRET_KEY=lengleng
image: registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/redis
restart: always
networks:
- spring_cloud_default
pigx-register:
build:
context: ./
dockerfile: ./pigx-register/Dockerfile
context: ./pigx-register
restart: always
container_name: pigx-register
image: pigx-register
ports:
- 8848:8848
- 9848:9848
- 18080:18080
networks:
- spring_cloud_default
pigx-gateway:
build:
context: ./
dockerfile: ./pigx-gateway/Dockerfile
context: ./pigx-gateway
restart: always
container_name: pigx-gateway
image: pigx-gateway
ports:
- 9999:9999
networks:
- spring_cloud_default
pigx-auth:
build:
context: ./
dockerfile: ./pigx-auth/Dockerfile
context: ./pigx-auth
restart: always
container_name: pigx-auth
image: pigx-auth
networks:
- spring_cloud_default
pigx-upms:
build:
context: ./
dockerfile: ./pigx-upms/pigx-upms-biz/Dockerfile
context: ./pigx-upms/pigx-upms-biz
restart: always
container_name: pigx-upms
image: pigx-upms
networks:
- spring_cloud_default
pigx-flow-biz:
build:
context: ./pigx-flow/pigx-flow-biz
restart: always
container_name: pigx-flow-biz
image: pigx-flow-biz
networks:
- spring_cloud_default
pigx-app-server:
build:
context: ./pigx-app-server/pigx-app-server-biz
restart: always
container_name: pigx-app-server
image: pigx-app-server
networks:
- spring_cloud_default
pigx-monitor:
build:
context: ./
dockerfile: ./pigx-visual/pigx-monitor/Dockerfile
context: ./pigx-visual/pigx-monitor
restart: always
image: pigx-monitor
container_name: pigx-monitor
ports:
- 5001:5001
networks:
- spring_cloud_default
pigx-daemon-quartz:
build:
context: ./
dockerfile: ./pigx-visual/pigx-daemon-quartz/Dockerfile
context: ./pigx-visual/pigx-daemon-quartz
restart: always
image: pigx-daemon-quartz
container_name: pigx-daemon-quartz
networks:
- spring_cloud_default
pigx-daemon-elastic-job:
build:
context: ./
dockerfile: ./pigx-visual/pigx-daemon-elastic-job/Dockerfile
context: ./pigx-visual/pigx-daemon-elastic-job
restart: always
image: pigx-daemon-elastic-job
container_name: pigx-daemon-elastic-job
networks:
- spring_cloud_default
pigx-xxl-job-admin:
build:
context: ./pigx-visual/pigx-xxl-job-admin
restart: always
image: pigx-xxl-job-admin
container_name: pigx-xxl-job-admin
ports:
- 9080:9080
networks:
- spring_cloud_default
pigx-codegen:
build:
context: ./
dockerfile: ./pigx-visual/pigx-codegen/Dockerfile
context: ./pigx-visual/pigx-codegen
restart: always
image: pigx-codegen
container_name: pigx-codegen
networks:
- spring_cloud_default
pigx-mp-manager:
pigx-mp-platform:
build:
context: ./
dockerfile: ./pigx-visual/pigx-mp-manager/Dockerfile
context: ./pigx-visual/pigx-mp-platform
restart: always
image: pigx-mp-manager
container_name: pigx-mp-manager
image: pigx-mp-platform
container_name: pigx-mp-platform
networks:
- spring_cloud_default
pigx-activiti:
pigx-pay-platform:
build:
context: ./
dockerfile: ./pigx-visual/pigx-activiti/Dockerfile
context: ./pigx-visual/pigx-pay-platform
restart: always
image: pigx-activiti
container_name: pigx-activiti
image: pigx-pay-platform
container_name: pigx-pay-platform
networks:
- spring_cloud_default
pigx-tx-manager:
pigx-report-platform:
build:
context: ./
dockerfile: ./pigx-visual/pigx-tx-manager/Dockerfile
context: ./pigx-visual/pigx-report-platform
restart: always
image: pigx-tx-manager
container_name: pigx-tx-manager
image: pigx-report-platform
container_name: pigx-report-platform
ports:
- 5004:5004
- 9998:9998
- 9095:9095
networks:
- spring_cloud_default
pigx-jimu-platform:
build:
context: ./pigx-visual/pigx-jimu-platform
restart: always
image: pigx-jimu-platform
container_name: pigx-jimu-platform
ports:
- 5008:5008
networks:
- spring_cloud_default
networks:
spring_cloud_default:
name: spring_cloud_default
driver: bridge
+5
View File
@@ -0,0 +1,5 @@
# 此文件不得删除,构造器注入的时候自动复制字段上边的注解
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Value
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
lombok.copyableAnnotations += org.springframework.context.annotation.Lazy
@@ -0,0 +1,42 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-app-server</artifactId>
<version>6.2.0</version>
</parent>
<artifactId>pigx-app-server-api</artifactId>
<dependencies>
<!--core 工具类-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-core</artifactId>
</dependency>
<!--mybatis plus extension,包含了mybatis plus core-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring</artifactId>
</dependency>
<!--feign 工具类-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-feign</artifactId>
</dependency>
<!-- excel 导入导出 -->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-excel</artifactId>
</dependency>
<!-- 脱敏工具类-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-sensitive</artifactId>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,38 @@
package com.pig4cloud.pigx.app.api.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* App 角色底部导航配置请求体。
* <p>
* 后台保存某个系统角色可见的 App Tabbar 列表。公开 Tabbar 由 {@code app_tabbar.login_flag=0}
* 控制,不依赖这里的角色授权。
*
* @author lengleng
* @date 2026-05-09
*/
@Data
@Schema(description = "App角色底部导航配置")
public class AppRoleTabbarDTO implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "角色ID不能为空")
@Schema(description = "系统角色ID")
private Long roleId;
/**
* 该角色可见的登录态 Tabbar ID 列表。
* <p>
* 保存时采用覆盖语义,空列表表示清空该角色的 Tabbar 授权。
*/
@Schema(description = "底部导航ID列表")
private List<Long> tabbarIds = new ArrayList<>();
}
@@ -0,0 +1,86 @@
package com.pig4cloud.pigx.app.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.spring.activerecord.Model;
import com.pig4cloud.pigx.common.core.util.TenantTable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 文章分类表
*
* @author pig
* @date 2023-06-07 16:28:03
*/
@Data
@TenantTable
@TableName("app_article_category")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "文章分类表")
public class AppArticleCategoryEntity extends Model<AppArticleCategoryEntity> {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private Long id;
/**
* 名称
*/
@Schema(description = "名称")
private String name;
/**
* 排序
*/
@Schema(description = "排序")
private Integer sort;
/**
* 是否显示: 0=否, 1=是
*/
@Schema(description = "是否显示: 0=否, 1=是")
private Integer isShow;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 更新人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新人")
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新时间")
private LocalDateTime updateTime;
/**
* 是否删除: 0=否, 1=是
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "是否删除: 0=否, 1=是")
private String delFlag;
}
@@ -0,0 +1,98 @@
package com.pig4cloud.pigx.app.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.spring.activerecord.Model;
import com.pig4cloud.pigx.common.core.util.TenantTable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 文章收藏表
*
* @author pig
* @date 2023-06-16 14:33:41
*/
@Data
@TenantTable
@TableName("app_article_collect")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "文章收藏表")
public class AppArticleCollectEntity extends Model<AppArticleCollectEntity> {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private Long id;
/**
* 用户ID
*/
@Schema(description = "用户ID")
private Long userId;
/**
* 文章ID
*/
@Schema(description = "文章ID")
private Long articleId;
/**
* 文章标题
*/
@TableField(exist = false)
private String title;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 更新人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新人")
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新时间")
private LocalDateTime updateTime;
/**
* 是否删除
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "是否删除")
private String delFlag;
/**
* 图片
*/
@TableField(exist = false)
private String image;
/**
* 访问次数
*/
@TableField(exist = false)
private Long visit;
}
@@ -0,0 +1,136 @@
package com.pig4cloud.pigx.app.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.spring.activerecord.Model;
import com.pig4cloud.pigx.common.core.util.TenantTable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.FieldNameConstants;
import java.time.LocalDateTime;
/**
* 文章资讯
*
* @author pig
* @date 2023-06-07 16:32:35
*/
@Data
@TenantTable
@FieldNameConstants
@TableName("app_article")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "文章资讯")
public class AppArticleEntity extends Model<AppArticleEntity> {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private Long id;
/**
* 分类
*/
@Schema(description = "分类")
private Long cid;
/**
* 标题
*/
@Schema(description = "标题")
private String title;
/**
* 简介
*/
@Schema(description = "简介")
private String intro;
/**
* 摘要
*/
@Schema(description = "摘要")
private String summary;
/**
* 封面
*/
@Schema(description = "封面")
private String image;
/**
* 内容
*/
@Schema(description = "内容")
private String content;
/**
* 作者
*/
@Schema(description = "作者")
private String author;
/**
* 浏览
*/
@Schema(description = "浏览")
private Integer visit;
/**
* 排序
*/
@Schema(description = "排序")
private Integer sort;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 更新人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新人")
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新时间")
private LocalDateTime updateTime;
/**
* 删除时间
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标志")
private String delFlag;
/**
* 当前用户是否已收藏
*/
@TableField(exist = false)
private boolean collect;
/**
* 分类名称
*/
@TableField(exist = false)
private String cname;
}
@@ -0,0 +1,92 @@
package com.pig4cloud.pigx.app.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.spring.activerecord.Model;
import com.pig4cloud.pigx.common.core.util.TenantTable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 通讯录表
*
* @author pigx
* @date 2025-05-29 17:30:30
*/
@Data
@TenantTable
@TableName("app_contacts")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "通讯录表")
public class AppContactsEntity extends Model<AppContactsEntity> {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private Long id;
/**
* 联系人
*/
@Schema(description = "联系人")
private String contactName;
/**
* 手机号
*/
@Schema(description = "手机号")
private String contactPhone;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "修改人")
private String updateBy;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "修改时间")
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记")
private String delFlag;
/**
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -0,0 +1,94 @@
package com.pig4cloud.pigx.app.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.spring.activerecord.Model;
import com.pig4cloud.pigx.common.core.util.TenantTable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.FieldNameConstants;
import java.time.LocalDateTime;
/**
* App 装修页面实体。
* <p>
* 仅对应 {@code app_page} 表,保存页面类型、页面名称和页面组件 JSON。
* 底部 Tabbar 已拆分到 {@code app_tabbar},不要再塞进 {@link #pageData}。
*
* @author lengleng
* @date 2023-06-08 11:19:23
*/
@Data
@TenantTable
@TableName("app_page")
@FieldNameConstants
@EqualsAndHashCode(callSuper = true)
@Schema(description = "页面")
public class AppPageEntity extends Model<AppPageEntity> {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private Long id;
/**
* 页面类型,对应 {@link com.pig4cloud.pigx.app.api.enums.PageTypeEnums}
*/
@Schema(description = "页面类型")
private Integer pageType;
/**
* 页面名称
*/
@Schema(description = "页面名称")
private String pageName;
/**
* 页面装修组件 JSON。
* <p>
* 只保存页面内部组件,例如搜索、轮播、导航块、服务块等;
* 运行时需要 Tabbar 时由服务层聚合 {@code app_tabbar} 返回。
*/
@Schema(description = "页面数据")
private String pageData;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "修改人")
private String updateBy;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "修改时间")
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记")
private String delFlag;
}
@@ -0,0 +1,37 @@
package com.pig4cloud.pigx.app.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.spring.activerecord.Model;
import com.pig4cloud.pigx.common.core.util.TenantTable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* App 角色底部导航关联实体,以 (role_id, tabbar_id, tenant_id) 为复合主键。
* <p>
* 这里的 roleId 是系统角色 {@code sys_role.role_id}。运行时不会跨库查询 {@code sys_user_role},
* 而是从登录 token 的角色权限中解析 roleId,再回到本表查询可见 Tabbar。
*
* @author lengleng
* @date 2026-05-09
*/
@Data
@TenantTable
@TableName("app_role_tabbar")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "App角色底部导航")
public class AppRoleTabbar extends Model<AppRoleTabbar> {
private static final long serialVersionUID = 1L;
@Schema(description = "系统角色ID")
private Long roleId;
@Schema(description = "底部导航ID")
private Long tabbarId;
@Schema(description = "租户ID", hidden = true)
private Long tenantId;
}
@@ -0,0 +1,117 @@
package com.pig4cloud.pigx.app.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.spring.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.pig4cloud.pigx.common.core.util.TenantTable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* App 底部导航实体。
* <p>
* 该表是移动端底部 Tabbar 的唯一数据源。图标字段保存 Wot UI 图标名,
* 运行时可见性由 {@link #loginFlag} 和 {@code app_role_tabbar} 共同决定。
*
* @author lengleng
* @date 2023-06-08 11:18:46
*/
@Data
@TenantTable
@TableName("app_tabbar")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "导航栏")
public class AppTabbarEntity extends Model<AppTabbarEntity> {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private Long id;
/**
* 导航名称
*/
@Schema(description = "导航名称")
private String name;
/**
* 选中态图标名。
* <p>
* 保存 Wot UI 内置图标名称,例如 {@code home-fill}。
*/
@Schema(description = "选中态图标名")
private String selected;
/**
* 未选中态图标名。
* <p>
* 保存 Wot UI 内置图标名称,例如 {@code home}。
*/
@Schema(description = "未选中态图标名")
private String unselected;
/**
* 跳转链接 JSON。
* <p>
* 前端按装修链接结构解析,例如 {@code {"path":"/pages/index/index","type":"shop"}}。
*/
@Schema(description = "链接地址")
@JsonRawValue
@JsonDeserialize()
private String link;
/**
* 排序顺序
*/
@Schema(description = "排序值")
private Integer sortOrder;
/**
* 是否需要登录,0=不需要登录也可见,1=登录后按角色授权可见。
*/
@Schema(description = "是否需要登录,0=不需要登录也可见,1=登录后按角色授权可见")
private String loginFlag;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 更新人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新人")
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新时间")
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记")
private String delFlag;
}
@@ -0,0 +1,28 @@
package com.pig4cloud.pigx.app.api.enums;
/**
* App Server 模块错误编码
*
* @author lengleng
* @date 2022/3/30
*/
public interface AppErrorCodes {
// === App 用户相关 ===
String APP_USER_USERINFO_EMPTY = "app.user.userInfo.empty";
String APP_USER_USERNAME_EXISTING = "app.user.username.existing";
String APP_USER_IMPORT_SUCCEED = "app.user.import.succeed";
String APP_USER_QUERY_ERROR = "app.user.query.error";
// === App 角色相关 ===
String APP_ROLE_ROLENAME_INEXISTENCE = "app.role.roleName.inexistence";
String APP_ROLE_NAMEORCODE_EXISTING = "app.role.nameOrCode.existing";
// === App 短信相关 ===
String APP_SMS_OFTEN = "app.sms.often";
}
@@ -0,0 +1,60 @@
package com.pig4cloud.pigx.app.api.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* App 装修页面类型枚举。
* <p>
* 页面类型会写入 {@code app_page.page_type},后台保存装修页时根据该枚举回填页面名称。
*
* @author lengleng
* @date 2024/12/22
*/
@Getter
@RequiredArgsConstructor
public enum PageTypeEnums {
/**
* 首页
*/
HOME(1, "首页装修"),
/**
* 个人中心
*/
USER(2, "个人中心"),
/**
* 客服设置
*/
SERVICE(3, "客服设置"),
/**
* 工作台属性
*/
WORKBENCH(4, "工作台");
/**
* 页面类型编码,和 app_page.page_type 对应。
*/
private final Integer pageType;
/**
* 页面类型展示名称。
*/
private final String name;
/**
* 按类型获取名称
*
* @param pageType 页面类型
* @return {@link String }
*/
public static String getNameByType(Integer pageType) {
for (PageTypeEnums value : PageTypeEnums.values()) {
if (value.pageType.equals(pageType)) {
return value.name;
}
}
return null;
}
}
@@ -0,0 +1,102 @@
package com.pig4cloud.pigx.app.api.vo;
import com.pig4cloud.pigx.app.api.entity.AppPageEntity;
import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import java.time.LocalDateTime;
import java.util.List;
/**
* APP 装修页聚合数据。
* <p>
* 对外保持页面字段在顶层,额外追加 {@link #tabbar},避免把底部导航配置重新写回
* {@code app_page.page_data}。
*
* @author lengleng
*/
@Data
@Schema(description = "APP 装修页聚合数据")
public class AppDecorateVO {
/**
* 主键
*/
@Schema(description = "主键")
private Long id;
/**
* 页面类型
*/
@Schema(description = "页面类型")
private Integer pageType;
/**
* 页面名称
*/
@Schema(description = "页面名称")
private String pageName;
/**
* 页面装修组件 JSON,不包含底部 Tabbar。
*/
@Schema(description = "页面数据")
private String pageData;
/**
* 创建人
*/
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 修改人
*/
@Schema(description = "修改人")
private String updateBy;
/**
* 修改时间
*/
@Schema(description = "修改时间")
private LocalDateTime updateTime;
/**
* 删除标记
*/
@Schema(description = "删除标记")
private String delFlag;
/**
* 当前查询场景下可用的底部导航栏。
* <p>
* 后台装修查询返回完整 Tabbar;App 运行时查询返回公开 Tabbar + 当前角色授权 Tabbar。
*/
@Schema(description = "底部导航栏")
private List<AppTabbarEntity> tabbar;
/**
* 根据页面实体和 Tabbar 列表构建装修聚合 VO。
*
* @param page 页面实体,可能为空
* @param tabbar Tabbar 列表
* @return 装修聚合数据
*/
public static AppDecorateVO of(AppPageEntity page, List<AppTabbarEntity> tabbar) {
AppDecorateVO vo = new AppDecorateVO();
if (page != null) {
BeanUtils.copyProperties(page, vo);
}
vo.setTabbar(tabbar);
return vo;
}
}
@@ -0,0 +1,14 @@
# App Server Module i18n Messages - English
# App user related
app.user.userInfo.empty=App user information is empty for {0}
app.user.username.existing=Username {0} already exists
app.user.import.succeed=User import succeeded; default password is the phone number
app.user.query.error=Failed to fetch current user information
# App role related
app.role.roleName.inexistence=Role name {0} does not exist
app.role.nameOrCode.existing=Role name or code already exists ({0} {1})
# App SMS related
app.sms.often=Verification code sent too frequently
@@ -0,0 +1,14 @@
# App Server 模块国际化消息 - 中文
# App 用户相关
app.user.userInfo.empty={0} \u7528\u6237\u4FE1\u606F\u4E3A\u7A7A
app.user.username.existing={0} \u7528\u6237\u540D\u5DF2\u5B58\u5728
app.user.import.succeed=\u7528\u6237\u5BFC\u5165\u6210\u529F\uFF0C\u9ED8\u8BA4\u5BC6\u7801\u4E3A\u624B\u673A\u53F7
app.user.query.error=\u83B7\u53D6\u5F53\u524D\u7528\u6237\u4FE1\u606F\u5931\u8D25
# App 角色相关
app.role.roleName.inexistence={0} \u89D2\u8272\u540D\u79F0\u4E0D\u5B58\u5728
app.role.nameOrCode.existing={0} {1} \u89D2\u8272\u540D\u6216\u89D2\u8272\u7F16\u7801\u5DF2\u7ECF\u5B58\u5728
# App 短信相关
app.sms.often=\u9A8C\u8BC1\u7801\u53D1\u9001\u8FC7\u9891\u7E41
@@ -0,0 +1,19 @@
FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:21-anolis
MAINTAINER wangiegie@gmail.com
ENV TZ=Asia/Shanghai
ENV LANG C.UTF-8
ENV JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom"
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir -p /pigx-app-server
WORKDIR /pigx-app-server
EXPOSE 7060
ADD ./target/pigx-app-server-biz.jar ./
CMD sleep 60;java $JAVA_OPTS -jar pigx-app-server-biz.jar
+131
View File
@@ -0,0 +1,131 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-app-server</artifactId>
<version>6.2.0</version>
</parent>
<artifactId>pigx-app-server-biz</artifactId>
<dependencies>
<!--必备: spring boot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<!--必备: 注册中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--必备: 配置中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--必备: 操作数据源相关-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-data</artifactId>
</dependency>
<!--必备:pigx安全模块-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-security</artifactId>
</dependency>
<!--必备:xss 过滤模块-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-xss</artifactId>
</dependency>
<!--必备: sentinel 依赖-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-sentinel</artifactId>
</dependency>
<!--必备: feign 依赖-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-feign</artifactId>
</dependency>
<!--必备: 依赖api模块-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-app-server-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-upms-api</artifactId>
</dependency>
<!--必备: log 依赖-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-log</artifactId>
</dependency>
<!--必备: API加解密 -->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-encrypt-api</artifactId>
</dependency>
<!--选配: mybatis 依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot4-starter</artifactId>
</dependency>
<!--选配: druid 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-4-starter</artifactId>
</dependency>
<!--选配: mysql 数据库驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!--选配: swagger文档-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-swagger</artifactId>
</dependency>
</dependencies>
<profiles>
<profile>
<id>cloud</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>boot</id>
</profile>
</profiles>
</project>
@@ -0,0 +1,26 @@
package com.pig4cloud.pigx.app;
import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients;
import com.pig4cloud.pigx.common.security.annotation.EnablePigxResourceServer;
import com.pig4cloud.pigx.common.swagger.annotation.EnableOpenApi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author pigx archetype
* <p>
* 项目启动类
*/
@EnableOpenApi("app")
@EnablePigxFeignClients
@EnableDiscoveryClient
@EnablePigxResourceServer
@SpringBootApplication
public class PigxAppApplication {
public static void main(String[] args) {
SpringApplication.run(PigxAppApplication.class, args);
}
}
@@ -0,0 +1,151 @@
package com.pig4cloud.pigx.app.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity;
import com.pig4cloud.pigx.app.service.AppArticleCategoryService;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel;
import com.pig4cloud.pigx.common.log.annotation.SysLog;
import com.pig4cloud.pigx.common.security.annotation.HasPermission;
import com.pig4cloud.pigx.common.security.annotation.Inner;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 文章分类表
*
* @author pig
* @date 2023-06-07 16:28:03
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/appArticleCategory")
@Tag(description = "appArticleCategory", name = "文章分类表管理")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class AppArticleCategoryController {
private final AppArticleCategoryService appArticleCategoryService;
/**
* 分页查询
* @param page 分页对象
* @param appArticleCategory 文章分类表
* @return
*/
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page")
@HasPermission("app_appArticleCategory_view")
public R getAppArticleCategoryPage(@ParameterObject Page page,
@ParameterObject AppArticleCategoryEntity appArticleCategory) {
LambdaQueryWrapper<AppArticleCategoryEntity> wrapper = Wrappers.lambdaQuery();
wrapper.like(StrUtil.isNotBlank(appArticleCategory.getName()), AppArticleCategoryEntity::getName,
appArticleCategory.getName());
wrapper.orderByAsc(AppArticleCategoryEntity::getSort, AppArticleCategoryEntity::getId);
return R.ok(appArticleCategoryService.page(page, wrapper));
}
/**
* 通过id查询文章分类表
* @param id id
* @return R
*/
@Operation(summary = "通过id查询", description = "通过id查询")
@GetMapping("/{id}")
@HasPermission("app_appArticleCategory_view")
public R getById(@PathVariable("id") Long id) {
return R.ok(appArticleCategoryService.getById(id));
}
/**
* 通过查询文章分类
* @return R
*/
@Operation(summary = "查询文章分类", description = "查询文章分类")
@Inner(value = false)
@GetMapping("/list")
public R list() {
return R.ok(appArticleCategoryService.list(Wrappers.<AppArticleCategoryEntity>lambdaQuery()
.orderByAsc(AppArticleCategoryEntity::getSort, AppArticleCategoryEntity::getId)));
}
/**
* 新增文章分类表
* @param appArticleCategory 文章分类表
* @return R
*/
@Operation(summary = "新增文章分类表", description = "新增文章分类表")
@SysLog("新增文章分类表")
@PostMapping
@HasPermission("app_appArticleCategory_add")
public R save(@RequestBody AppArticleCategoryEntity appArticleCategory) {
return R.ok(appArticleCategoryService.save(appArticleCategory));
}
/**
* 修改文章分类表
* @param appArticleCategory 文章分类表
* @return R
*/
@Operation(summary = "修改文章分类表", description = "修改文章分类表")
@SysLog("修改文章分类表")
@PutMapping
@HasPermission("app_appArticleCategory_edit")
public R updateById(@RequestBody AppArticleCategoryEntity appArticleCategory) {
return R.ok(appArticleCategoryService.updateById(appArticleCategory));
}
/**
* 按传入 ID 顺序调整文章分类,保留未选中记录在排序序列中的位置。
* <p>
* 以当前租户内未删除记录的排序值、主键升序为基准,仅重排选中记录占据的位置, 再将全部记录的排序值从 1 起连续重编号。
* @param ids 按目标顺序排列的文章分类 ID;不可为 null 或空,不可包含 null、重复或不可用的 ID
* @return 排序保存成功的响应;校验或更新失败时抛出异常,由统一异常处理器转换响应
* @throws IllegalArgumentException ID 列表为空、包含 null 或重复值,或指定记录已删除、不属于当前租户 或不存在
* @throws IllegalStateException 批量更新返回失败
*/
@Operation(summary = "拖拽排序", description = "按当前列表顺序保存排序")
@SysLog("文章分类排序")
@PutMapping("/sort")
@HasPermission("app_appArticleCategory_edit")
public R sort(@RequestBody List<Long> ids) {
appArticleCategoryService.sort(ids);
return R.ok();
}
/**
* 通过id删除文章分类表
* @param ids id列表
* @return R
*/
@Operation(summary = "通过id删除文章分类表", description = "通过id删除文章分类表")
@SysLog("通过id删除文章分类表")
@DeleteMapping
@HasPermission("app_appArticleCategory_del")
public R removeById(@RequestBody Long[] ids) {
return R.ok(appArticleCategoryService.removeBatchByIds(CollUtil.toList(ids)));
}
/**
* 导出excel 表格
* @param appArticleCategory 查询条件
* @return excel 文件流
*/
@ResponseExcel
@GetMapping("/export")
@HasPermission("app_appArticleCategory_export")
public List<AppArticleCategoryEntity> export(AppArticleCategoryEntity appArticleCategory) {
return appArticleCategoryService.list(Wrappers.query(appArticleCategory));
}
}
@@ -0,0 +1,131 @@
package com.pig4cloud.pigx.app.controller;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity;
import com.pig4cloud.pigx.app.api.entity.AppArticleEntity;
import com.pig4cloud.pigx.app.service.AppArticleCollectService;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel;
import com.pig4cloud.pigx.common.log.annotation.SysLog;
import com.pig4cloud.pigx.common.security.annotation.HasPermission;
import com.pig4cloud.pigx.common.security.util.SecurityUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 文章收藏表
*
* @author pig
* @date 2023-06-16 14:33:41
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/collect")
@Tag(description = "collect", name = "文章收藏表管理")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class AppArticleCollectController {
private final AppArticleCollectService appArticleCollectService;
/**
* 分页查询文章收藏信息。
*
* @param page 分页查询参数对象
* @return 返回分页结果对象,包含文章收藏信息列表
*/
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page")
public R getAppArticleCollectPage(@ParameterObject Page page) {
MPJLambdaWrapper<AppArticleCollectEntity> wrapper = new MPJLambdaWrapper<AppArticleCollectEntity>()
.selectAll(AppArticleCollectEntity.class)
.select(AppArticleEntity::getTitle, AppArticleEntity::getImage, AppArticleEntity::getVisit)
.leftJoin(AppArticleEntity.class, AppArticleEntity::getId, AppArticleCollectEntity::getArticleId)
.eq(AppArticleCollectEntity::getUserId, SecurityUtils.getUser().getId());
return R.ok(appArticleCollectService.selectJoinListPage(page, AppArticleCollectEntity.class, wrapper));
}
/**
* 通过id查询文章收藏表
*
* @param id id
* @return R
*/
@Operation(summary = "通过id查询", description = "通过id查询")
@GetMapping("/{id}")
public R getById(@PathVariable("id") Long id) {
return R.ok(appArticleCollectService.getById(id));
}
/**
* 新增文章收藏表
*
* @param appArticleCollect 文章收藏表
* @return R
*/
@Operation(summary = "新增文章收藏表", description = "新增文章收藏表")
@SysLog("新增文章收藏表")
@PostMapping
public R save(@RequestBody AppArticleCollectEntity appArticleCollect) {
return R.ok(appArticleCollectService.saveArticleCollect(appArticleCollect));
}
/**
* 修改文章收藏表
*
* @param appArticleCollect 文章收藏表
* @return R
*/
@Operation(summary = "修改文章收藏表", description = "修改文章收藏表")
@SysLog("修改文章收藏表")
@PutMapping
public R updateById(@RequestBody AppArticleCollectEntity appArticleCollect) {
return R.ok(appArticleCollectService.updateById(appArticleCollect));
}
/**
* 通过id删除文章收藏表
*
* @param ids id列表
* @return R
*/
@Operation(summary = "通过id删除文章收藏表", description = "通过id删除文章收藏表")
@SysLog("通过id删除文章收藏表")
@DeleteMapping
public R removeById(@RequestBody Long[] ids) {
return R.ok(appArticleCollectService.removeBatchByIds(CollUtil.toList(ids)));
}
@Operation(summary = "通过文章id删除文章收藏表", description = "通过文章id删除文章收藏表")
@SysLog("通过文章id删除文章收藏表")
@DeleteMapping("/{articleId}")
public R removeByArticleId(@PathVariable String articleId) {
Long id = SecurityUtils.getUser().getId();
return R.ok(appArticleCollectService.remove(Wrappers.<AppArticleCollectEntity>lambdaQuery()
.eq(AppArticleCollectEntity::getUserId, id)
.eq(AppArticleCollectEntity::getArticleId, articleId)));
}
/**
* 导出excel 表格
*
* @param appArticleCollect 查询条件
* @return excel 文件流
*/
@ResponseExcel
@GetMapping("/export")
@HasPermission("app_collect_export")
public List<AppArticleCollectEntity> export(AppArticleCollectEntity appArticleCollect) {
return appArticleCollectService.list(Wrappers.query(appArticleCollect));
}
}
@@ -0,0 +1,137 @@
package com.pig4cloud.pigx.app.controller;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.app.api.entity.AppArticleEntity;
import com.pig4cloud.pigx.app.service.AppArticleService;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel;
import com.pig4cloud.pigx.common.log.annotation.SysLog;
import com.pig4cloud.pigx.common.security.annotation.HasPermission;
import com.pig4cloud.pigx.common.security.annotation.Inner;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 文章资讯
*
* @author pig
* @date 2023-06-07 16:32:35
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/appArticle")
@Tag(description = "appArticle", name = "文章资讯管理")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class AppArticleController {
private final AppArticleService appArticleService;
/**
* 分页查询文章资讯。
* <p>
* 返回文章列表时会关联分类名称,供 App 资讯列表和后台管理复用。
* @param page 分页对象
* @param appArticle 文章资讯
* @return 文章分页结果
*/
@Operation(summary = "分页查询", description = "分页查询")
@Inner(value = false)
@GetMapping("/page")
public R getAppArticlePage(@ParameterObject Page page, @ParameterObject AppArticleEntity appArticle) {
return R.ok(appArticleService.pageAndCname(page, appArticle));
}
/**
* 查询文章详情。
* <p>
* 会递增访问次数;如果传入 userId,则额外返回该用户是否收藏当前文章。
* @param id 文章 ID
* @param userId 用户 ID,可为空
* @return 文章详情
*/
@Inner(value = false)
@Operation(summary = "通过id查询", description = "通过id查询")
@GetMapping("/details/{id}/{userId}")
public R getById(@PathVariable("id") Long id, @PathVariable(required = false) Long userId) {
return R.ok(appArticleService.getArticleAndIncrById(id, userId));
}
/**
* 新增文章资讯
* @param appArticle 文章资讯
* @return R
*/
@Operation(summary = "新增文章资讯", description = "新增文章资讯")
@SysLog("新增文章资讯")
@PostMapping
@HasPermission("app_appArticle_add")
public R save(@RequestBody AppArticleEntity appArticle) {
return R.ok(appArticleService.save(appArticle));
}
/**
* 修改文章资讯
* @param appArticle 文章资讯
* @return R
*/
@Operation(summary = "修改文章资讯", description = "修改文章资讯")
@SysLog("修改文章资讯")
@PutMapping
@HasPermission("app_appArticle_edit")
public R updateById(@RequestBody AppArticleEntity appArticle) {
return R.ok(appArticleService.updateById(appArticle));
}
/**
* 按传入 ID 顺序调整文章,保留未选中记录在排序序列中的位置。
* <p>
* 以当前租户内未删除记录的排序值、主键升序为基准,仅重排选中记录占据的位置, 再将全部记录的排序值从 1 起连续重编号。
* @param ids 按目标顺序排列的文章 ID;不可为 null 或空,不可包含 null、重复或不可用的 ID
* @return 排序保存成功的响应;校验或更新失败时抛出异常,由统一异常处理器转换响应
* @throws IllegalArgumentException ID 列表为空、包含 null 或重复值,或指定记录已删除、不属于当前租户 或不存在
* @throws IllegalStateException 批量更新返回失败
*/
@Operation(summary = "拖拽排序", description = "按当前列表顺序保存排序")
@SysLog("文章资讯排序")
@PutMapping("/sort")
@HasPermission("app_appArticle_edit")
public R sort(@RequestBody List<Long> ids) {
appArticleService.sort(ids);
return R.ok();
}
/**
* 通过id删除文章资讯
* @param ids id列表
* @return R
*/
@Operation(summary = "通过id删除文章资讯", description = "通过id删除文章资讯")
@SysLog("通过id删除文章资讯")
@DeleteMapping
@HasPermission("app_appArticle_del")
public R removeById(@RequestBody Long[] ids) {
return R.ok(appArticleService.removeBatchByIds(CollUtil.toList(ids)));
}
/**
* 导出excel 表格
* @param appArticle 查询条件
* @return excel 文件流
*/
@ResponseExcel
@GetMapping("/export")
@HasPermission("app_appArticle_export")
public List<AppArticleEntity> export(AppArticleEntity appArticle) {
return appArticleService.list(Wrappers.query(appArticle));
}
}
@@ -0,0 +1,122 @@
package com.pig4cloud.pigx.app.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.app.api.entity.AppContactsEntity;
import com.pig4cloud.pigx.app.service.AppContactsService;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel;
import com.pig4cloud.pigx.common.log.annotation.SysLog;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import com.pig4cloud.pigx.common.security.annotation.HasPermission;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 通讯录表管理控制器
*
* @author lengleng
* @date 2025/05/29
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/appContacts")
@Tag(description = "appContacts", name = "通讯录表管理")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class AppContactsController {
private final AppContactsService appContactsService;
/**
* 分页查询
*
* @param page 分页对象
* @param appContacts 通讯录表
* @return
*/
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page")
@HasPermission("app_appContacts_view")
public R getAppContactsPage(@ParameterObject Page page, @ParameterObject AppContactsEntity appContacts) {
return R.ok(appContactsService.pageScope(page, appContacts));
}
/**
* 通过id查询通讯录表
*
* @param id id
* @return R
*/
@Operation(summary = "通过id查询", description = "通过id查询")
@GetMapping("/{id}")
@HasPermission("app_appContacts_view")
public R getById(@PathVariable("id") Long id) {
return R.ok(appContactsService.getById(id));
}
/**
* 新增通讯录表
*
* @param appContacts 通讯录表
* @return R
*/
@Operation(summary = "新增通讯录表", description = "新增通讯录表")
@SysLog("新增通讯录表")
@PostMapping
@HasPermission("app_appContacts_add")
public R save(@RequestBody AppContactsEntity appContacts) {
return R.ok(appContactsService.save(appContacts));
}
/**
* 修改通讯录表
*
* @param appContacts 通讯录表
* @return R
*/
@Operation(summary = "修改通讯录表", description = "修改通讯录表")
@SysLog("修改通讯录表")
@PutMapping
@HasPermission("app_appContacts_edit")
public R updateById(@RequestBody AppContactsEntity appContacts) {
return R.ok(appContactsService.updateById(appContacts));
}
/**
* 通过id删除通讯录表
*
* @param ids id列表
* @return R
*/
@Operation(summary = "通过id删除通讯录表", description = "通过id删除通讯录表")
@SysLog("通过id删除通讯录表")
@DeleteMapping
@HasPermission("app_appContacts_del")
public R removeById(@RequestBody Long[] ids) {
return R.ok(appContactsService.removeBatchByIds(CollUtil.toList(ids)));
}
/**
* 导出excel 表格
*
* @param appContacts 查询条件
* @param ids 导出指定ID
* @return excel 文件流
*/
@ResponseExcel
@GetMapping("/export")
@HasPermission("app_appContacts_export")
public List<AppContactsEntity> export(AppContactsEntity appContacts, Long[] ids) {
return appContactsService.list(Wrappers.lambdaQuery(appContacts).in(ArrayUtil.isNotEmpty(ids), AppContactsEntity::getId, ids));
}
}
@@ -0,0 +1,86 @@
package com.pig4cloud.pigx.app.controller;
import com.pig4cloud.pigx.app.service.AppIndexService;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.security.annotation.Inner;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* App 运行时页面接口。
* <p>
* 这里的接口主要给移动端调用,返回首页、装修页、底部 Tabbar 等运行时数据。
* 部分接口允许匿名访问,具体可见方法上的 {@link Inner} 配置。
*
* @author lengleng
* @date 2023/6/8
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/index")
@Tag(description = "App 页面控制", name = "app index")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class AppIndexController {
private final AppIndexService indexService;
/**
* 获取首页基础数据。
* <p>
* 当前返回首页装修页记录和资讯列表,适合旧版首页一次性拉取基础内容。
*
* @return 首页页面数据和资讯列表
*/
@Inner(value = false)
@GetMapping("/index")
public R index() {
return R.ok(indexService.index());
}
/**
* 获取移动端底部导航配置。
* <p>
* 未登录时只返回公开 Tabbar;登录后返回公开 Tabbar + 当前用户角色授权的 Tabbar。
*
* @return 当前访问身份可见的 Tabbar 列表
*/
@Inner(value = false)
@GetMapping("/config")
public R config() {
return R.ok(indexService.config());
}
/**
* 获取指定页面类型的装修数据。
* <p>
* 返回页面装修 JSON,同时聚合当前访问身份可见的 Tabbar,方便移动端一次请求完成页面渲染。
*
* @param pageType 页面类型
* @return 装修页聚合数据
*/
@Inner(value = false)
@GetMapping("/decorate")
public R decorate(@Validated @RequestParam("id") Integer pageType) {
return R.ok(indexService.decorate(pageType));
}
/**
* 获取工作台页面装修数据。
* <p>
* 工作台内部按钮权限复用 B 端权限体系,这里不再按 App 专属菜单做二次过滤。
*
* @return 工作台页面数据
*/
@GetMapping("/workbench")
public R workbench() {
return R.ok(indexService.workbench());
}
}
@@ -0,0 +1,61 @@
/*
* Copyright (c) 2018-2026, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.pig4cloud.pigx.app.controller;
import com.pig4cloud.pigx.app.service.AppMobileService;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.security.annotation.Inner;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* App 手机验证码接口。
*
* @author lengleng
* @date 2018/11/14
* <p>
* 手机验证码
*/
@RestController
@AllArgsConstructor
@RequestMapping("/appmobile")
@Tag(description = "mobile", name = "手机管理模块")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class AppMobileController {
private final AppMobileService appMobileService;
/**
* 发送 App 手机验证码。
*
* @param mobile 手机号
* @return 发送结果
*/
@Inner(value = false)
@GetMapping("/{mobile}")
public R sendSmsCode(@PathVariable String mobile) {
return appMobileService.sendSmsCode(mobile);
}
}
@@ -0,0 +1,92 @@
package com.pig4cloud.pigx.app.controller;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pig4cloud.pigx.app.api.entity.AppPageEntity;
import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity;
import com.pig4cloud.pigx.app.api.enums.PageTypeEnums;
import com.pig4cloud.pigx.app.api.vo.AppDecorateVO;
import com.pig4cloud.pigx.app.service.AppPageService;
import com.pig4cloud.pigx.app.service.AppTabbarService;
import com.pig4cloud.pigx.common.core.util.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* App 装修页面后台管理接口。
* <p>
* 页面表只保存页面装修组件 JSON,底部 Tabbar 由 {@code app_tabbar} 独立维护;
* 查询装修页时会聚合 Tabbar,便于后台预览。
*
* @author pig
* @date 2023-06-07 16:32:35
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/appPage")
@Tag(description = "appPage", name = "页面管理")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class AppPageController {
private final AppPageService pageService;
private final AppTabbarService tabbarService;
/**
* 按页面类型查询后台装修页配置。
* <p>
* 返回结构保持页面字段在顶层,并额外携带完整 Tabbar 列表,用于后台装修预览和 Tabbar 设置区初始化。
*
* @param pageType 页面类型,见 {@link PageTypeEnums}
* @return 页面装修数据和完整 Tabbar 列表
*/
@Operation(summary = "通过页面类型查询", description = "通过页面类型查询")
@GetMapping("/{pageType}")
public R getByPageType(@PathVariable("pageType") Integer pageType) {
AppPageEntity appPage = pageService.getOne(Wrappers.<AppPageEntity>lambdaQuery()
.eq(AppPageEntity::getPageType, pageType)
.orderByDesc(AppPageEntity::getCreateTime), false);
List<AppTabbarEntity> tabbarList = tabbarService
.list(Wrappers.<AppTabbarEntity>lambdaQuery().orderByAsc(AppTabbarEntity::getSortOrder).orderByAsc(AppTabbarEntity::getId));
AppDecorateVO decorateVO = AppDecorateVO.of(appPage, tabbarList);
if (appPage == null) {
decorateVO.setPageType(pageType);
decorateVO.setPageName(PageTypeEnums.getNameByType(pageType));
decorateVO.setPageData("[]");
}
return R.ok(decorateVO);
}
/**
* 保存页面装修数据。
* <p>
* 同一页面类型只保留一份最新配置;保存时先删除旧记录,再写入新记录。
* Tabbar 不随页面一起保存,需通过 {@link AppTabbarController} 单独维护。
*
* @param page 页面
* @return 保存结果
*/
@Operation(summary = "更新页面", description = "更新页面")
@PutMapping
@Transactional(rollbackFor = Exception.class)
public R update(@RequestBody AppPageEntity page) {
List<AppPageEntity> pageEntityList = pageService
.list(Wrappers.<AppPageEntity>lambdaQuery().eq(AppPageEntity::getPageType, page.getPageType()));
if (CollUtil.isNotEmpty(pageEntityList)) {
// app_page 按页面类型覆盖保存,避免同一页面类型存在多份装修数据。
pageService.removeByIds(pageEntityList.stream().map(AppPageEntity::getId).toList());
}
page.setPageName(PageTypeEnums.getNameByType(page.getPageType()));
return R.ok(pageService.save(page));
}
}
@@ -0,0 +1,105 @@
package com.pig4cloud.pigx.app.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pig4cloud.pigx.admin.api.entity.SysRole;
import com.pig4cloud.pigx.admin.api.feign.RemoteRoleService;
import com.pig4cloud.pigx.app.api.dto.AppRoleTabbarDTO;
import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity;
import com.pig4cloud.pigx.app.service.AppRoleTabbarService;
import com.pig4cloud.pigx.app.service.AppTabbarService;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.security.annotation.HasPermission;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* App 角色底部导航授权管理接口。
* <p>
* 该接口只维护「系统角色 -> App Tabbar」的授权关系。角色本身仍来自 upms 的 {@code sys_role},
* App 端运行时根据登录 token 中的角色 ID 读取 {@code app_role_tabbar},不跨库 join {@code sys_user_role}。
*
* @author lengleng
* @date 2026-05-09
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/role-tabbar")
@Tag(description = "role-tabbar", name = "App角色底部导航授权")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class AppRoleTabbarController {
private final RemoteRoleService remoteRoleService;
private final AppTabbarService appTabbarService;
private final AppRoleTabbarService appRoleTabbarService;
/**
* 查询可授权的系统角色列表。
* <p>
* 角色来源于 upms 远程接口,前端可按角色名称做轻量过滤,用于角色 Tabbar 授权页面。
*
* @param roleName 角色名称关键字,可为空
* @return 系统角色列表
*/
@GetMapping("/roles")
@HasPermission("app_role_tabbar_view")
public R<List<SysRole>> roles(@RequestParam(required = false) String roleName) {
R<List<SysRole>> roles = remoteRoleService.getAllRole();
if (!roles.isOk() || roles.getData() == null || StrUtil.isBlank(roleName)) {
return roles;
}
return R.ok(roles.getData()
.stream()
.filter(role -> StrUtil.containsIgnoreCase(role.getRoleName(), roleName))
.toList());
}
/**
* 查询可授权的 App 底部导航列表。
* <p>
* 返回完整 Tabbar 列表,公开 Tabbar 前端可固定勾选,登录可见 Tabbar 由角色授权控制。
*
* @return App Tabbar 列表
*/
@GetMapping("/tabbar")
@HasPermission("app_role_tabbar_view")
public R<List<AppTabbarEntity>> tabbars() {
return R.ok(appTabbarService.list(Wrappers.<AppTabbarEntity>lambdaQuery()
.orderByAsc(AppTabbarEntity::getSortOrder)));
}
/**
* 查询指定角色已授权的 Tabbar ID。
*
* @param roleId 系统角色 ID
* @return 已授权的 Tabbar ID 列表
*/
@GetMapping("/{roleId}")
@HasPermission("app_role_tabbar_view")
public R<List<Long>> roleTabbars(@PathVariable Long roleId) {
return R.ok(appRoleTabbarService.listTabbarIdsByRoleId(roleId));
}
/**
* 保存角色 Tabbar 授权。
* <p>
* 保存采用覆盖语义:先清空该角色原有授权,再写入本次提交的 Tabbar ID 列表。
*
* @param dto 角色 Tabbar 授权请求
* @return 保存结果
*/
@PutMapping
@HasPermission("app_role_tabbar_edit")
public R<Boolean> saveRoleTabbars(@Valid @RequestBody AppRoleTabbarDTO dto) {
return R.ok(appRoleTabbarService.saveRoleTabbars(dto));
}
}
@@ -0,0 +1,87 @@
package com.pig4cloud.pigx.app.controller;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pig4cloud.pigx.app.api.entity.AppRoleTabbar;
import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity;
import com.pig4cloud.pigx.app.service.AppRoleTabbarService;
import com.pig4cloud.pigx.app.service.AppTabbarService;
import com.pig4cloud.pigx.common.core.util.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* App 底部导航后台管理接口。
* <p>
* Tabbar 是移动端底部入口的数据源,图标字段保存 Wot UI 图标名;
* 是否登录可见由 {@code loginFlag} 控制,登录后再叠加角色授权。
*
* @author pig
* @date 2023-06-07 16:32:35
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/appTabbar")
@Tag(description = "appTabbar", name = "底部导航")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class AppTabbarController {
private final AppTabbarService tabbarService;
private final AppRoleTabbarService roleTabbarService;
/**
* 查询全部底部导航。
* <p>
* 后台维护页面使用完整列表;移动端运行时请走 {@code /app/index/config},
* 由运行时接口按公开/角色授权规则过滤。
*
* @return 完整 Tabbar 列表
*/
@Operation(summary = "查询导航列表", description = "查询导航列表")
@GetMapping("/list")
public R list() {
return R.ok(tabbarService.list(
Wrappers.<AppTabbarEntity>lambdaQuery().orderByAsc(AppTabbarEntity::getSortOrder).orderByAsc(AppTabbarEntity::getId)));
}
/**
* 批量保存底部导航。
* <p>
* 前端提交的是当前完整 Tabbar 列表。这里会删除数据库中已不存在的 Tabbar,
* 并同步清理角色授权关系,避免 {@code app_role_tabbar} 残留无效 tabbar_id。
*
* @param tabbarEntityList 当前完整 Tabbar 配置
* @return 保存结果
*/
@Operation(summary = "更新导航", description = "更新导航")
@PutMapping
public R update(@RequestBody List<AppTabbarEntity> tabbarEntityList) {
tabbarEntityList.forEach(tabbar -> {
if (tabbar.getLoginFlag() == null) {
tabbar.setLoginFlag("1");
}
});
// 删除不在新增范围的导航菜单
List<Long> idList = tabbarService.list().stream().map(AppTabbarEntity::getId).toList();
List<Long> newIdList = tabbarEntityList.stream().map(AppTabbarEntity::getId).toList();
// 计算需要删除的 ID 列表
List<Long> idsToRemove = CollUtil.subtractToList(idList, newIdList);
// 如果有需要删除的菜单,则批量删除
if (CollUtil.isNotEmpty(idsToRemove)) {
tabbarService.removeBatchByIds(idsToRemove);
roleTabbarService.remove(Wrappers.<AppRoleTabbar>lambdaQuery().in(AppRoleTabbar::getTabbarId, idsToRemove));
}
return R.ok(tabbarService.saveOrUpdateBatch(tabbarEntityList));
}
}
@@ -0,0 +1,13 @@
package com.pig4cloud.pigx.app.mapper;
import com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity;
import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 文章分类 Mapper。
*/
@Mapper
public interface AppArticleCategoryMapper extends PigxBaseMapper<AppArticleCategoryEntity> {
}
@@ -0,0 +1,13 @@
package com.pig4cloud.pigx.app.mapper;
import com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity;
import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 文章收藏 Mapper。
*/
@Mapper
public interface AppArticleCollectMapper extends PigxBaseMapper<AppArticleCollectEntity> {
}
@@ -0,0 +1,13 @@
package com.pig4cloud.pigx.app.mapper;
import com.pig4cloud.pigx.app.api.entity.AppArticleEntity;
import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 文章资讯 Mapper。
*/
@Mapper
public interface AppArticleMapper extends PigxBaseMapper<AppArticleEntity> {
}
@@ -0,0 +1,16 @@
package com.pig4cloud.pigx.app.mapper;
import com.pig4cloud.pigx.app.api.entity.AppContactsEntity;
import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 通讯录 Mapper。
* <p>
* 继承 {@link PigxBaseMapper} 后可配合数据权限插件执行范围查询。
*/
@Mapper
public interface AppContactsMapper extends PigxBaseMapper<AppContactsEntity> {
}
@@ -0,0 +1,13 @@
package com.pig4cloud.pigx.app.mapper;
import com.pig4cloud.pigx.app.api.entity.AppPageEntity;
import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* App 装修页面 Mapper。
*/
@Mapper
public interface AppPageMapper extends PigxBaseMapper<AppPageEntity> {
}
@@ -0,0 +1,16 @@
package com.pig4cloud.pigx.app.mapper;
import com.pig4cloud.pigx.app.api.entity.AppRoleTabbar;
import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* App 角色底部导航 Mapper。
*
* @author lengleng
* @date 2026-05-09
*/
@Mapper
public interface AppRoleTabbarMapper extends PigxBaseMapper<AppRoleTabbar> {
}
@@ -0,0 +1,13 @@
package com.pig4cloud.pigx.app.mapper;
import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity;
import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* App 底部导航 Mapper。
*/
@Mapper
public interface AppTabbarMapper extends PigxBaseMapper<AppTabbarEntity> {
}
@@ -0,0 +1,23 @@
package com.pig4cloud.pigx.app.service;
import com.baomidou.mybatisplus.spring.service.IService;
import com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity;
import java.util.List;
/**
* 文章分类基础服务。
*/
public interface AppArticleCategoryService extends IService<AppArticleCategoryEntity> {
/**
* 按传入 ID 顺序调整文章分类,保留未选中记录在排序序列中的位置。
* <p>
* 以当前租户内未删除记录的排序值、主键升序为基准,仅重排选中记录占据的位置, 再将全部记录的排序值从 1 起连续重编号。
* @param ids 按目标顺序排列的文章分类 ID;不可为 null 或空,不可包含 null、重复或不可用的 ID
* @throws IllegalArgumentException ID 列表为空、包含 null 或重复值,或指定记录已删除、不属于当前租户 或不存在
* @throws IllegalStateException 批量更新返回失败
*/
void sort(List<Long> ids);
}
@@ -0,0 +1,21 @@
package com.pig4cloud.pigx.app.service;
import com.github.yulichang.base.MPJBaseService;
import com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity;
/**
* 文章收藏服务。
* <p>
* 收藏记录以当前登录用户为维度保存,同一用户对同一文章只允许收藏一次。
*/
public interface AppArticleCollectService extends MPJBaseService<AppArticleCollectEntity> {
/**
* 保存当前用户的文章收藏。
*
* @param appArticleCollect 收藏请求,需包含文章 ID
* @return true=保存成功,false=已收藏或未保存
*/
Boolean saveArticleCollect(AppArticleCollectEntity appArticleCollect);
}
@@ -0,0 +1,39 @@
package com.pig4cloud.pigx.app.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.spring.service.IService;
import com.pig4cloud.pigx.app.api.entity.AppArticleEntity;
import java.util.List;
/**
* 文章查询与排序服务,供管理端和 App 文章接口调用。
*/
public interface AppArticleService extends IService<AppArticleEntity> {
/**
* 按传入 ID 顺序调整文章,保留未选中记录在排序序列中的位置。
* <p>
* 以当前租户内未删除记录的排序值、主键升序为基准,仅重排选中记录占据的位置, 再将全部记录的排序值从 1 起连续重编号。
* @param ids 按目标顺序排列的文章 ID;不可为 null 或空,不可包含 null、重复或不可用的 ID
* @throws IllegalArgumentException ID 列表为空、包含 null 或重复值,或指定记录已删除、不属于当前租户 或不存在
* @throws IllegalStateException 批量更新返回失败
*/
void sort(List<Long> ids);
/**
* 获取文章并使阅读数+1
* @param id id
* @return
*/
AppArticleEntity getArticleAndIncrById(Long id, Long userId);
/**
* 分页查询文章列表 包含分类名称
* @param page 分页参数
* @param appArticle 文章查询条件
* @return
*/
Page pageAndCname(Page page, AppArticleEntity appArticle);
}
@@ -0,0 +1,23 @@
package com.pig4cloud.pigx.app.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.spring.service.IService;
import com.pig4cloud.pigx.app.api.entity.AppContactsEntity;
/**
* 应用联系人服务接口
*
* @author lengleng
* @date 2025/05/29
*/
public interface AppContactsService extends IService<AppContactsEntity> {
/**
* 根据应用联系人实体获取分页范围
*
* @param page 分页对象
* @param contactsEntity 应用联系人实体
* @return 分页范围对象
*/
Page pageScope(Page page, AppContactsEntity contactsEntity);
}
@@ -0,0 +1,49 @@
package com.pig4cloud.pigx.app.service;
import com.pig4cloud.pigx.app.api.entity.AppPageEntity;
import com.pig4cloud.pigx.app.api.vo.AppDecorateVO;
import java.util.Map;
/**
* App 运行时页面服务。
* <p>
* 负责给移动端聚合首页、装修页、工作台和 Tabbar 配置;
* 后台装修管理接口不直接走这里。
*
* @author lengleng
* @date 2023/6/8
*/
public interface AppIndexService {
/**
* 获取首页基础数据。
*
* @return 首页页面记录和资讯列表
*/
Map<String, Object> index();
/**
* 获取运行时配置。
*
* @return 当前访问身份可见的 Tabbar 等配置
*/
Map<String, Object> config();
/**
* 获取指定页面类型的装修页聚合数据。
*
* @param id 页面类型
* @return 装修页聚合数据
*/
AppDecorateVO decorate(Integer id);
/**
* 返回工作台页面实体对象。
* <p>
* 工作台按钮权限由 B 端 permission 控制,这里只返回页面装修数据。
*
* @return 工作台页面实体对象
*/
AppPageEntity workbench();
}
@@ -0,0 +1,35 @@
/*
* Copyright (c) 2018-2026, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.pig4cloud.pigx.app.service;
import com.pig4cloud.pigx.common.core.util.R;
/**
* @author lengleng
* @date 2018/11/14
*/
public interface AppMobileService {
/**
* 发送手机验证码
* @param mobile mobile
* @return code
*/
R<Boolean> sendSmsCode(String mobile);
}
@@ -0,0 +1,14 @@
package com.pig4cloud.pigx.app.service;
import com.baomidou.mybatisplus.spring.service.IService;
import com.pig4cloud.pigx.app.api.entity.AppPageEntity;
/**
* App 装修页面基础服务。
* <p>
* 页面组件 JSON 保存在 {@link AppPageEntity#getPageData()},
* 底部 Tabbar 不保存在页面 JSON 中。
*/
public interface AppPageService extends IService<AppPageEntity> {
}
@@ -0,0 +1,40 @@
package com.pig4cloud.pigx.app.service;
import com.baomidou.mybatisplus.spring.service.IService;
import com.pig4cloud.pigx.app.api.dto.AppRoleTabbarDTO;
import com.pig4cloud.pigx.app.api.entity.AppRoleTabbar;
import java.util.List;
/**
* App 角色底部导航服务,管理系统角色与 App 底部导航的授权关系。
*
* @author lengleng
*/
public interface AppRoleTabbarService extends IService<AppRoleTabbar> {
/**
* 查询指定角色已授权的底部导航 ID 列表。
*
* @param roleId 系统角色 ID
* @return 底部导航 ID 列表
*/
List<Long> listTabbarIdsByRoleId(Long roleId);
/**
* 查询指定角色列表已授权的底部导航 ID 列表。
*
* @param roleIds 系统角色 ID 列表
* @return 底部导航 ID 列表
*/
List<Long> listTabbarIdsByRoleIds(List<Long> roleIds);
/**
* 保存角色底部导航授权。
*
* @param dto 角色底部导航配置
* @return 操作结果
*/
Boolean saveRoleTabbars(AppRoleTabbarDTO dto);
}
@@ -0,0 +1,11 @@
package com.pig4cloud.pigx.app.service;
import com.baomidou.mybatisplus.spring.service.IService;
import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity;
/**
* App 底部导航基础服务。
*/
public interface AppTabbarService extends IService<AppTabbarEntity> {
}
@@ -0,0 +1,60 @@
package com.pig4cloud.pigx.app.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity;
import com.pig4cloud.pigx.app.mapper.AppArticleCategoryMapper;
import com.pig4cloud.pigx.app.service.AppArticleCategoryService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 文章分类表
*
* @author pig
* @date 2023-06-07 16:28:03
*/
@Service
public class AppArticleCategoryServiceImpl extends ServiceImpl<AppArticleCategoryMapper, AppArticleCategoryEntity>
implements AppArticleCategoryService {
/**
* 按传入 ID 顺序调整文章分类,保留未选中记录在排序序列中的位置。
* <p>
* 以当前租户内未删除记录的排序值、主键升序为基准,仅重排选中记录占据的位置, 再将全部记录的排序值从 1 起连续重编号。
* @param ids 按目标顺序排列的文章分类 ID;不可为 null 或空,不可包含 null、重复或不可用的 ID
* @throws IllegalArgumentException ID 列表为空、包含 null 或重复值,或指定记录已删除、不属于当前租户 或不存在
* @throws IllegalStateException 批量更新返回失败
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void sort(List<Long> ids) {
Assert.notEmpty(ids, "排序记录不能为空");
Set<Long> selected = new HashSet<>(ids);
Assert.isTrue(!selected.contains(null) && selected.size() == ids.size(), "排序记录无效");
// 锁定统一顺序,避免重复排序值和分页边界导致拖动后顺序丢失。
List<AppArticleCategoryEntity> records = list(Wrappers.<AppArticleCategoryEntity>lambdaQuery()
.orderByAsc(AppArticleCategoryEntity::getSort, AppArticleCategoryEntity::getId)
.last("FOR UPDATE"));
long matched = records.stream().filter(row -> selected.contains(row.getId())).count();
Assert.isTrue(matched == ids.size(), "记录已变更,请刷新后重试");
List<AppArticleCategoryEntity> updates = new ArrayList<>();
int next = 0;
for (int i = 0; i < records.size(); i++) {
AppArticleCategoryEntity current = records.get(i);
Long id = selected.contains(current.getId()) ? ids.get(next++) : current.getId();
AppArticleCategoryEntity update = new AppArticleCategoryEntity();
update.setId(id);
update.setSort(i + 1);
updates.add(update);
}
Assert.state(updateBatchById(updates), "排序保存失败");
}
}
@@ -0,0 +1,44 @@
package com.pig4cloud.pigx.app.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity;
import com.pig4cloud.pigx.app.mapper.AppArticleCollectMapper;
import com.pig4cloud.pigx.app.service.AppArticleCollectService;
import com.pig4cloud.pigx.common.security.util.SecurityUtils;
import org.springframework.stereotype.Service;
/**
* 文章收藏服务实现。
* <p>
* 收藏归属当前登录用户,保存前会校验同一用户是否已经收藏过同一文章。
*
* @author pig
* @date 2023-06-16 14:33:41
*/
@Service
public class AppArticleCollectServiceImpl extends ServiceImpl<AppArticleCollectMapper, AppArticleCollectEntity>
implements AppArticleCollectService {
/**
* 保存当前登录用户的文章收藏。
*
* @param appArticleCollect 收藏请求,业务上只需要文章 ID,用户 ID 由登录态写入
* @return true=收藏成功,false=已经收藏
*/
@Override
public Boolean saveArticleCollect(AppArticleCollectEntity appArticleCollect) {
Long id = SecurityUtils.getUser().getId();
appArticleCollect.setUserId(id);
if (baseMapper.exists(Wrappers.<AppArticleCollectEntity>lambdaQuery()
.eq(AppArticleCollectEntity::getUserId, id)
.eq(AppArticleCollectEntity::getArticleId, appArticleCollect.getArticleId()))) {
return Boolean.FALSE;
}
return this.save(appArticleCollect);
}
}
@@ -0,0 +1,122 @@
package com.pig4cloud.pigx.app.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity;
import com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity;
import com.pig4cloud.pigx.app.api.entity.AppArticleEntity;
import com.pig4cloud.pigx.app.mapper.AppArticleCollectMapper;
import com.pig4cloud.pigx.app.mapper.AppArticleMapper;
import com.pig4cloud.pigx.app.service.AppArticleService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Objects;
/**
* 文章资讯服务实现。
* <p>
* 负责文章列表关联分类名称、文章详情访问次数递增,以及当前用户收藏状态补充。
*
* @author pig
* @date 2023-06-07 16:32:35
*/
@Service
@RequiredArgsConstructor
public class AppArticleServiceImpl extends ServiceImpl<AppArticleMapper, AppArticleEntity>
implements AppArticleService {
private final AppArticleCollectMapper collectMapper;
/**
* 获取文章详情,并尝试将阅读数加 1。
* <p>
* 如果传入用户 ID,会额外查询该用户是否已收藏当前文章。 阅读数更新使用当前 visit 值作为条件,降低并发覆盖风险。
* @param id 文章 ID
* @param userId 当前用户 ID,可为空
* @return 文章详情
*/
@Override
public AppArticleEntity getArticleAndIncrById(Long id, Long userId) {
AppArticleEntity appArticleEntity = baseMapper.selectById(id);
// 登录用户访问详情时,补充当前用户是否已收藏该文章。
if (Objects.nonNull(userId)) {
boolean exists = collectMapper.exists(Wrappers.<AppArticleCollectEntity>lambdaQuery()//
.eq(AppArticleCollectEntity::getArticleId, appArticleEntity.getId())//
.eq(AppArticleCollectEntity::getUserId, userId));
appArticleEntity.setCollect(exists);
}
Integer nowVisit = appArticleEntity.getVisit();
appArticleEntity.setVisit(nowVisit + 1);
// 使用旧 visit 值作为更新条件,避免并发访问时直接覆盖最新阅读数。
baseMapper.update(appArticleEntity,
Wrappers.<AppArticleEntity>lambdaQuery()
.eq(AppArticleEntity::getId, id)
.eq(AppArticleEntity::getVisit, nowVisit));
return appArticleEntity;
}
/**
* 分页查询文章列表,并关联分类名称。
* @param page 分页参数
* @param appArticle 文章查询条件
* @return 文章分页结果,包含分类名称 cname
*/
@Override
public Page pageAndCname(Page page, AppArticleEntity appArticle) {
MPJLambdaWrapper<AppArticleEntity> wrapper = new MPJLambdaWrapper<>();
wrapper.selectAll(AppArticleEntity.class)
.selectAs(AppArticleCategoryEntity::getName, AppArticleEntity.Fields.cname)
.leftJoin(AppArticleCategoryEntity.class, AppArticleCategoryEntity::getId, AppArticleEntity::getCid)
.like(StrUtil.isNotBlank(appArticle.getAuthor()), AppArticleEntity::getAuthor, appArticle.getAuthor())
.like(StrUtil.isNotBlank(appArticle.getTitle()), AppArticleEntity::getTitle, appArticle.getTitle())
.eq(Objects.nonNull(appArticle.getCid()), AppArticleEntity::getCid, appArticle.getCid())
.orderByAsc(AppArticleEntity::getSort, AppArticleEntity::getId);
return this.page(page, wrapper);
}
/**
* 按传入 ID 顺序调整文章,保留未选中记录在排序序列中的位置。
* <p>
* 以当前租户内未删除记录的排序值、主键升序为基准,仅重排选中记录占据的位置, 再将全部记录的排序值从 1 起连续重编号。
* @param ids 按目标顺序排列的文章 ID;不可为 null 或空,不可包含 null、重复或不可用的 ID
* @throws IllegalArgumentException ID 列表为空、包含 null 或重复值,或指定记录已删除、不属于当前租户 或不存在
* @throws IllegalStateException 批量更新返回失败
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void sort(List<Long> ids) {
Assert.notEmpty(ids, "排序记录不能为空");
Set<Long> selected = new HashSet<>(ids);
Assert.isTrue(!selected.contains(null) && selected.size() == ids.size(), "排序记录无效");
// 锁定统一顺序,避免重复排序值和分页边界导致拖动后顺序丢失。
List<AppArticleEntity> records = list(Wrappers.<AppArticleEntity>lambdaQuery()
.orderByAsc(AppArticleEntity::getSort, AppArticleEntity::getId)
.last("FOR UPDATE"));
long matched = records.stream().filter(row -> selected.contains(row.getId())).count();
Assert.isTrue(matched == ids.size(), "记录已变更,请刷新后重试");
List<AppArticleEntity> updates = new ArrayList<>();
int next = 0;
for (int i = 0; i < records.size(); i++) {
AppArticleEntity current = records.get(i);
Long id = selected.contains(current.getId()) ? ids.get(next++) : current.getId();
AppArticleEntity update = new AppArticleEntity();
update.setId(id);
update.setSort(i + 1);
updates.add(update);
}
Assert.state(updateBatchById(updates), "排序保存失败");
}
}
@@ -0,0 +1,42 @@
package com.pig4cloud.pigx.app.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import com.pig4cloud.pigx.app.api.entity.AppContactsEntity;
import com.pig4cloud.pigx.app.mapper.AppContactsMapper;
import com.pig4cloud.pigx.app.service.AppContactsService;
import com.pig4cloud.pigx.common.data.datascope.DataScope;
import com.pig4cloud.pigx.common.security.util.SecurityUtils;
import org.springframework.stereotype.Service;
/**
* 通讯录服务实现类
* <p>
* 通讯录列表会结合系统数据权限,只返回当前登录用户可见范围内的数据。
*
* @author lengleng
* @date 2025/05/29
*/
@Service
public class AppContactsServiceImpl extends ServiceImpl<AppContactsMapper, AppContactsEntity> implements AppContactsService {
/**
* 根据查询条件分页查询通讯录,并应用数据权限范围。
*
* @param page 分页对象
* @param appContacts 应用联系人实体
* @return 分页范围对象
*/
@Override
public Page pageScope(Page page, AppContactsEntity appContacts) {
LambdaQueryWrapper<AppContactsEntity> wrapper = Wrappers.lambdaQuery();
wrapper.like(StrUtil.isNotBlank(appContacts.getContactName()), AppContactsEntity::getContactName, appContacts.getContactName());
wrapper.like(StrUtil.isNotBlank(appContacts.getContactPhone()), AppContactsEntity::getContactPhone, appContacts.getContactPhone());
DataScope dataScope = new DataScope();
dataScope.setUsername(SecurityUtils.getUser().getUsername());
return baseMapper.selectPageByScope(page, wrapper, dataScope);
}
}
@@ -0,0 +1,139 @@
package com.pig4cloud.pigx.app.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pig4cloud.pigx.app.api.entity.AppArticleEntity;
import com.pig4cloud.pigx.app.api.entity.AppPageEntity;
import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity;
import com.pig4cloud.pigx.app.api.enums.PageTypeEnums;
import com.pig4cloud.pigx.app.api.vo.AppDecorateVO;
import com.pig4cloud.pigx.app.mapper.AppArticleMapper;
import com.pig4cloud.pigx.app.mapper.AppPageMapper;
import com.pig4cloud.pigx.app.mapper.AppTabbarMapper;
import com.pig4cloud.pigx.app.service.AppIndexService;
import com.pig4cloud.pigx.app.service.AppRoleTabbarService;
import com.pig4cloud.pigx.common.core.constant.CommonConstants;
import com.pig4cloud.pigx.common.security.util.SecurityUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* App首页服务实现类
* 实现AppIndexService接口,提供首页数据、导航栏配置以及页面配置等功能。
* <p>
* 该实现面向移动端运行时:Tabbar 会按公开/登录角色授权规则过滤,
* 页面装修数据则保持原始组件 JSON,不在这里做页面组件级权限裁剪。
*
* @author lengleng
* @date 2023/6/8
*/
@Service
@RequiredArgsConstructor
public class AppIndexServiceImpl implements AppIndexService {
private final AppTabbarMapper appTabbarMapper;
private final AppPageMapper appPageMapper;
private final AppArticleMapper appArticleMapper;
private final AppRoleTabbarService appRoleTabbarService;
/**
* 获取商城首页基础数据。
* <p>
* 旧版首页接口返回首页装修页记录和资讯列表;新版装修页推荐使用 {@link #decorate(Integer)}。
*
* @return 首页页面数据和资讯列表
*/
@Override
public Map<String, Object> index() {
Map<String, Object> response = new LinkedHashMap<>();
AppPageEntity appPageEntity = appPageMapper.selectOne(Wrappers.<AppPageEntity>lambdaQuery()
.eq(AppPageEntity::getPageType, PageTypeEnums.HOME.getPageType())
.orderByDesc(AppPageEntity::getCreateTime),
false
);
List<AppArticleEntity> articleList = appArticleMapper
.selectList(Wrappers.<AppArticleEntity>lambdaQuery().orderByDesc(AppArticleEntity::getSort));
response.put("pages", appPageEntity);
response.put("article", articleList);
return response;
}
/**
* 获取运行时配置。
* <p>
* 当前只包含 Tabbar,并按 {@link #listAuthorizedTabbar()} 的规则过滤。
*
* @return 运行时配置集合
*/
@Override
public Map<String, Object> config() {
Map<String, Object> response = new LinkedHashMap<>();
response.put("tabbar", listAuthorizedTabbar());
return response;
}
/**
* 根据页面类型获取最新装修页,并附加当前访问身份可见的 Tabbar。
*
* @param pageType 页面类型
* @return 装修页聚合数据
*/
@Override
public AppDecorateVO decorate(Integer pageType) {
AppPageEntity appPageEntity = appPageMapper.selectOne(
Wrappers.<AppPageEntity>lambdaQuery()
.eq(AppPageEntity::getPageType, pageType)
.orderByDesc(AppPageEntity::getCreateTime),
false
);
return AppDecorateVO.of(appPageEntity, listAuthorizedTabbar());
}
/**
* 获取工作台页面数据。
* <p>
* 工作台内部按钮权限复用系统菜单 permission,这里不再读取 App 专属菜单授权。
*
* @return 工作台页面实体
*/
@Override
public AppPageEntity workbench() {
return appPageMapper.selectOne(
Wrappers.<AppPageEntity>lambdaQuery()
.eq(AppPageEntity::getPageType, PageTypeEnums.WORKBENCH.getPageType())
.orderByDesc(AppPageEntity::getCreateTime),
false
);
}
/**
* 查询当前访问身份可见的 Tabbar。
* <p>
* 匿名访问只返回 {@code loginFlag=0} 的公开 Tabbar;登录访问从 token authorities
* 解析角色 ID,再读取 {@code app_role_tabbar} 中授权的 Tabbar,避免跨库 join upms 的
* {@code sys_user_role}。
*
* @return 当前可见的 Tabbar 列表
*/
private List<AppTabbarEntity> listAuthorizedTabbar() {
List<Long> roleIds = SecurityUtils.getUser() == null ? List.of() : SecurityUtils.getRoleIds();
List<Long> tabbarIds = appRoleTabbarService.listTabbarIdsByRoleIds(roleIds);
return appTabbarMapper.selectList(Wrappers.<AppTabbarEntity>lambdaQuery()
.and(wrapper -> {
wrapper.eq(AppTabbarEntity::getLoginFlag, CommonConstants.STATUS_NORMAL);
if (!tabbarIds.isEmpty()) {
wrapper.or().in(AppTabbarEntity::getId, tabbarIds);
}
})
.orderByAsc(AppTabbarEntity::getSortOrder)
.orderByAsc(AppTabbarEntity::getId));
}
}
@@ -0,0 +1,75 @@
/*
* Copyright (c) 2018-2026, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.pig4cloud.pigx.app.service.impl;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.pig4cloud.pigx.app.api.enums.AppErrorCodes;
import com.pig4cloud.pigx.app.service.AppMobileService;
import com.pig4cloud.pigx.common.core.constant.CacheConstants;
import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum;
import com.pig4cloud.pigx.common.core.util.MsgUtils;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.data.cache.RedisUtils;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* App 手机验证码服务实现。
* <p>
* 验证码按 {@code 验证码缓存前缀 + 登录类型 + 手机号} 写入 Redis,
* 过期时间使用统一安全常量配置。
*
* @author lengleng
* @date 2018/11/14
* <p>
* 手机登录相关业务实现
*/
@Slf4j
@Service
@AllArgsConstructor
public class AppMobileServiceImpl implements AppMobileService {
/**
* 发送手机验证码。
* <p>
* 如果验证码仍在有效期内,则拒绝重复发送。当前实现只生成并缓存验证码,
* 后续接入短信网关时应在生成验证码后调用真实发送能力。
*
* @param mobile 手机号
* @return true=生成成功,false=验证码未过期
*/
@Override
public R<Boolean> sendSmsCode(String mobile) {
String codeObj = RedisUtils.get(CacheConstants.SMS_CODE_KEY + LoginTypeEnum.APPSMS.getType() + StringPool.AT + mobile);
if (StrUtil.isNotBlank(codeObj)) {
log.info("手机号验证码未过期:{},{}", mobile, codeObj);
return R.ok(Boolean.FALSE, MsgUtils.getMessage(AppErrorCodes.APP_SMS_OFTEN));
}
String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE));
log.debug("手机号生成验证码成功:{},{}", mobile, code);
RedisUtils.set(CacheConstants.SMS_CODE_KEY + LoginTypeEnum.APPSMS.getType() + StringPool.AT + mobile, code, SecurityConstants.CODE_TIME);
return R.ok(Boolean.TRUE);
}
}
@@ -0,0 +1,18 @@
package com.pig4cloud.pigx.app.service.impl;
import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import com.pig4cloud.pigx.app.api.entity.AppPageEntity;
import com.pig4cloud.pigx.app.mapper.AppPageMapper;
import com.pig4cloud.pigx.app.service.AppPageService;
import org.springframework.stereotype.Service;
/**
* 页面
*
* @author lengleng
* @date 2023-06-08 11:19:23
*/
@Service
public class AppPageServiceImpl extends ServiceImpl<AppPageMapper, AppPageEntity> implements AppPageService {
}
@@ -0,0 +1,83 @@
package com.pig4cloud.pigx.app.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import com.pig4cloud.pigx.app.api.dto.AppRoleTabbarDTO;
import com.pig4cloud.pigx.app.api.entity.AppRoleTabbar;
import com.pig4cloud.pigx.app.mapper.AppRoleTabbarMapper;
import com.pig4cloud.pigx.app.service.AppRoleTabbarService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
/**
* App 角色底部导航服务实现。
* <p>
* 只访问 app-server 本库的 {@code app_role_tabbar}。运行时角色来源由 Spring Security
* token authorities 提供,避免 app-server 跨库 join upms 的用户角色表。
*
* @author lengleng
* @date 2026-05-09
*/
@Service
@RequiredArgsConstructor
public class AppRoleTabbarServiceImpl extends ServiceImpl<AppRoleTabbarMapper, AppRoleTabbar>
implements AppRoleTabbarService {
@Override
public List<Long> listTabbarIdsByRoleId(Long roleId) {
return roleId == null ? List.of() : listTabbarIdsByRoleIds(List.of(roleId));
}
/**
* 根据多个角色查询可见 Tabbar。
* <p>
* 一个用户可能同时拥有多个角色,因此这里会先对角色 ID 去重,再对查询出的 Tabbar ID 去重。
*
* @param roleIds 系统角色 ID 列表
* @return 去重后的 Tabbar ID 列表
*/
@Override
public List<Long> listTabbarIdsByRoleIds(List<Long> roleIds) {
if (CollUtil.isEmpty(roleIds)) {
return List.of();
}
List<Long> distinctRoleIds = roleIds.stream().filter(Objects::nonNull).distinct().toList();
if (CollUtil.isEmpty(distinctRoleIds)) {
return List.of();
}
return this.list(Wrappers.<AppRoleTabbar>lambdaQuery().in(AppRoleTabbar::getRoleId, distinctRoleIds))
.stream()
.map(AppRoleTabbar::getTabbarId)
.filter(Objects::nonNull)
.distinct()
.toList();
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean saveRoleTabbars(AppRoleTabbarDTO dto) {
// 覆盖保存:后台每次提交的是该角色完整授权结果,先删旧关系再写新关系。
this.remove(Wrappers.<AppRoleTabbar>lambdaQuery().eq(AppRoleTabbar::getRoleId, dto.getRoleId()));
if (CollUtil.isEmpty(dto.getTabbarIds())) {
return Boolean.TRUE;
}
List<AppRoleTabbar> records = dto.getTabbarIds()
.stream()
.filter(Objects::nonNull)
.distinct()
.map(tabbarId -> {
AppRoleTabbar roleTabbar = new AppRoleTabbar();
roleTabbar.setRoleId(dto.getRoleId());
roleTabbar.setTabbarId(tabbarId);
return roleTabbar;
})
.toList();
return this.saveBatch(records);
}
}
@@ -0,0 +1,18 @@
package com.pig4cloud.pigx.app.service.impl;
import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import com.pig4cloud.pigx.app.api.entity.AppTabbarEntity;
import com.pig4cloud.pigx.app.mapper.AppTabbarMapper;
import com.pig4cloud.pigx.app.service.AppTabbarService;
import org.springframework.stereotype.Service;
/**
* 导航栏
*
* @author lengleng
* @date 2023-06-08 11:18:46
*/
@Service
public class AppTabbarServiceImpl extends ServiceImpl<AppTabbarMapper, AppTabbarEntity> implements AppTabbarService {
}
@@ -0,0 +1,18 @@
server:
port: 7060
spring:
application:
name: @artifactId@
cloud:
nacos:
username: @nacos.username@
password: @nacos.password@
discovery:
server-addr: ${NACOS_HOST:pigx-register}:${NACOS_PORT:8848}
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
config:
import:
- optional:nacos:application-@profiles.active@.yml
- optional:nacos:${spring.application.name}-@profiles.active@.yml
@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
小技巧: 在根pom里面设置统一存放路径,统一管理方便维护
<properties>
<log-path>/Users/lengleng</log-path>
</properties>
1. 其他模块加日志输出,直接copy本文件放在resources 目录即可
2. 注意修改 <property name="${log-path}/log.path" value=""/> 的value模块
-->
<configuration debug="false" scan="false">
<property name="log.path" value="logs/${project.artifactId}"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" class="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
class="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
class="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
</appender>
<!-- Log file error output -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<logger name="org.activiti.engine.impl.db" level="DEBUG">
<appender-ref ref="debug"/>
</logger>
<!--nacos 心跳 INFO 屏蔽-->
<logger name="com.alibaba.nacos" level="OFF">
<appender-ref ref="error"/>
</logger>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="debug"/>
</root>
</configuration>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pig4cloud.pigx.app.mapper.AppArticleCategoryMapper">
<resultMap id="appArticleCategoryMap" type="com.pig4cloud.pigx.app.api.entity.AppArticleCategoryEntity">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sort" column="sort"/>
<result property="isShow" column="is_show"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pig4cloud.pigx.app.mapper.AppArticleCollectMapper">
<resultMap id="appArticleCollectMap" type="com.pig4cloud.pigx.app.api.entity.AppArticleCollectEntity">
<id property="id" column="id"/>
<result property="userId" column="user_id"/>
<result property="articleId" column="article_id"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pig4cloud.pigx.app.mapper.AppArticleMapper">
<resultMap id="appArticleMap" type="com.pig4cloud.pigx.app.api.entity.AppArticleEntity">
<id property="id" column="id"/>
<result property="cid" column="cid"/>
<result property="title" column="title"/>
<result property="intro" column="intro"/>
<result property="summary" column="summary"/>
<result property="image" column="image"/>
<result property="content" column="content"/>
<result property="author" column="author"/>
<result property="visit" column="visit"/>
<result property="sort" column="sort"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pig4cloud.pigx.app.mapper.AppContactsMapper">
<resultMap id="appContactsMap" type="com.pig4cloud.pigx.app.api.entity.AppContactsEntity">
<id property="id" column="id"/>
<result property="contactName" column="contact_name"/>
<result property="contactPhone" column="contact_phone"/>
<result property="remark" column="remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
</mapper>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pig4cloud.pigx.app.mapper.AppPageMapper">
<resultMap id="appPageMap" type="com.pig4cloud.pigx.app.api.entity.AppPageEntity">
<id property="id" column="id"/>
<result property="pageType" column="page_type"/>
<result property="pageName" column="page_name"/>
<result property="pageData" column="page_data"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pig4cloud.pigx.app.mapper.AppTabbarMapper">
<resultMap id="appTabbarMap" type="com.pig4cloud.pigx.app.api.entity.AppTabbarEntity">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="selected" column="selected"/>
<result property="unselected" column="unselected"/>
<result property="link" column="link"/>
<result property="sortOrder" column="sort_order"/>
<result property="loginFlag" column="login_flag"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>
+21
View File
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx</artifactId>
<version>6.2.0</version>
</parent>
<artifactId>pigx-app-server</artifactId>
<packaging>pom</packaging>
<!--项目子模块-->
<modules>
<module>pigx-app-server-api</module>
<module>pigx-app-server-biz</module>
</modules>
</project>
+8 -4
View File
@@ -1,8 +1,12 @@
FROM anapsix/alpine-java:8_server-jre_unlimited
FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:21-anolis
MAINTAINER wangiegie@gmail.com
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV TZ=Asia/Shanghai
ENV LANG C.UTF-8
ENV JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir -p /pigx-auth
@@ -10,6 +14,6 @@ WORKDIR /pigx-auth
EXPOSE 3000
ADD ./pigx-auth/target/pigx-auth.jar ./
ADD ./target/pigx-auth.jar ./
CMD sleep 30;java -Djava.security.egd=file:/dev/./urandom -jar pigx-auth.jar
CMD sleep 120;java $JAVA_OPTS -jar pigx-auth.jar
+115 -84
View File
@@ -19,93 +19,124 @@
-->
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx</artifactId>
<version>3.1.0</version>
</parent>
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx</artifactId>
<version>6.2.0</version>
</parent>
<artifactId>pigx-auth</artifactId>
<packaging>jar</packaging>
<artifactId>pigx-auth</artifactId>
<packaging>jar</packaging>
<description>pigx 认证授权中心,基于 spring security oAuth2</description>
<description>pigx 认证授权中心,基于 spring security oAuth2</description>
<dependencies>
<!--注册中心客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--配置中心客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--upms api、model 模块-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-upms-api</artifactId>
</dependency>
<!--security-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-security</artifactId>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--缓存操作-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-data</artifactId>
</dependency>
<!--JDBC相关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- druid 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<!--freemarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--spring security 、oauth、jwt依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<!--web 模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--undertow容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
<dependencies>
<!--注册中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--配置中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--log-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-log</artifactId>
</dependency>
<!--security-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-security</artifactId>
</dependency>
<!--feign 依赖-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-feign</artifactId>
</dependency>
<!--缓存操作-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-data</artifactId>
</dependency>
<!--sentinel 依赖-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-sentinel</artifactId>
</dependency>
<!--路由控制-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-gray</artifactId>
</dependency>
<!--freemarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- 加签 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
</dependency>
<!-- API加解密 -->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pigx-common-encrypt-api</artifactId>
</dependency>
<!-- 验证码公共能力 -->
<dependency>
<groupId>io.springboot.plugin</groupId>
<artifactId>captcha-core</artifactId>
</dependency>
<!-- 滑块验证码 -->
<dependency>
<groupId>io.github.pig-mesh.plugin</groupId>
<artifactId>captcha-spring-boot-starter</artifactId>
</dependency>
<!--web 模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>cloud</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>boot</id>
</profile>
</profiles>
</project>
@@ -1,39 +1,37 @@
/*
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
*
* Copyright (c) 2018-2025, lengleng All rights reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.pig4cloud.pigx.auth;
import com.pig4cloud.pigx.common.security.annotation.EnablePigxFeignClients;
import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author lengleng
* @date 2018年06月21日
* 认证授权中心
* @date 2018年06月21日 认证授权中心
*/
@SpringCloudApplication
@EnablePigxFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class PigxAuthApplication {
public static void main(String[] args) {
SpringApplication.run(PigxAuthApplication.class, args);
}
}
@@ -1,132 +0,0 @@
/*
*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*
*/
package com.pig4cloud.pigx.auth.config;
import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder;
import com.pig4cloud.pigx.common.security.component.PigxWebResponseExceptionTranslator;
import com.pig4cloud.pigx.common.security.service.PigxClientDetailsService;
import com.pig4cloud.pigx.common.security.service.PigxUser;
import com.pig4cloud.pigx.common.security.service.PigxUserDetailsService;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator;
import org.springframework.security.oauth2.provider.token.TokenEnhancer;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
/**
* @author lengleng
* @date 2018/6/22
* 认证服务器配置
*/
@Configuration
@AllArgsConstructor
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
private final DataSource dataSource;
private final PigxUserDetailsService pigxUserDetailsService;
private final AuthenticationManager authenticationManagerBean;
private final RedisConnectionFactory redisConnectionFactory;
@Override
@SneakyThrows
public void configure(ClientDetailsServiceConfigurer clients) {
PigxClientDetailsService clientDetailsService = new PigxClientDetailsService(dataSource);
clientDetailsService.setSelectClientDetailsSql(SecurityConstants.DEFAULT_SELECT_STATEMENT);
clientDetailsService.setFindClientDetailsSql(SecurityConstants.DEFAULT_FIND_STATEMENT);
clients.withClientDetails(clientDetailsService);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) {
oauthServer
.allowFormAuthenticationForClients()
.checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
.tokenStore(tokenStore())
.tokenEnhancer(tokenEnhancer())
.userDetailsService(pigxUserDetailsService)
.authenticationManager(authenticationManagerBean)
.reuseRefreshTokens(false)
.pathMapping("/oauth/confirm_access", "/token/confirm_access")
.exceptionTranslator(new PigxWebResponseExceptionTranslator());
}
@Bean
public TokenStore tokenStore() {
RedisTokenStore tokenStore = new RedisTokenStore(redisConnectionFactory);
tokenStore.setPrefix(SecurityConstants.PIGX_PREFIX + SecurityConstants.OAUTH_PREFIX);
tokenStore.setAuthenticationKeyGenerator(new DefaultAuthenticationKeyGenerator() {
@Override
public String extractKey(OAuth2Authentication authentication) {
return super.extractKey(authentication) + ":" + TenantContextHolder.getTenantId();
}
});
return tokenStore;
}
/**
* token增强,客户端模式不增强。
*
* @return TokenEnhancer
*/
@Bean
public TokenEnhancer tokenEnhancer() {
return (accessToken, authentication) -> {
if (SecurityConstants.CLIENT_CREDENTIALS
.equals(authentication.getOAuth2Request().getGrantType())) {
return accessToken;
}
final Map<String, Object> additionalInfo = new HashMap<>(8);
PigxUser pigxUser = (PigxUser) authentication.getUserAuthentication().getPrincipal();
additionalInfo.put(SecurityConstants.DETAILS_USER_ID, pigxUser.getId());
additionalInfo.put(SecurityConstants.DETAILS_USERNAME, pigxUser.getUsername());
additionalInfo.put(SecurityConstants.DETAILS_DEPT_ID, pigxUser.getDeptId());
additionalInfo.put(SecurityConstants.DETAILS_TENANT_ID, pigxUser.getTenantId());
additionalInfo.put(SecurityConstants.DETAILS_LICENSE, SecurityConstants.PIGX_LICENSE);
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
return accessToken;
};
}
}
@@ -0,0 +1,204 @@
/*
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.pig4cloud.pigx.auth.config;
import com.pig4cloud.pigx.auth.support.CustomeOAuth2AccessTokenGenerator;
import com.pig4cloud.pigx.auth.support.core.CustomeOAuth2TokenCustomizer;
import com.pig4cloud.pigx.auth.support.core.FormIdentityLoginConfigurer;
import com.pig4cloud.pigx.auth.support.core.PigxDaoAuthenticationProvider;
import com.pig4cloud.pigx.auth.support.core.PigxOAuth2RefreshTokenAuthenticationConverter;
import com.pig4cloud.pigx.auth.support.filter.FormLoginValidateCodeFilter;
import com.pig4cloud.pigx.auth.support.filter.PasswordDecoderFilter;
import com.pig4cloud.pigx.auth.support.filter.ValidateCodeFilter;
import com.pig4cloud.pigx.auth.support.handler.PigxAuthenticationFailureEventHandler;
import com.pig4cloud.pigx.auth.support.handler.PigxAuthenticationSuccessEventHandler;
import com.pig4cloud.pigx.auth.support.password.OAuth2ResourceOwnerPasswordAuthenticationConverter;
import com.pig4cloud.pigx.auth.support.password.OAuth2ResourceOwnerPasswordAuthenticationProvider;
import com.pig4cloud.pigx.auth.support.sms.OAuth2ResourceOwnerSmsAuthenticationConverter;
import com.pig4cloud.pigx.auth.support.sms.OAuth2ResourceOwnerSmsAuthenticationProvider;
import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
import com.pig4cloud.pigx.common.security.component.PigxBootCorsProperties;
import com.pig4cloud.pigx.common.security.handler.FormAuthenticationFailureHandler;
import com.pig4cloud.pigx.common.security.handler.SsoLogoutSuccessHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.oauth2.server.authorization.OAuth2AuthorizationServerConfigurer;
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
import org.springframework.security.oauth2.server.authorization.token.OAuth2RefreshTokenGenerator;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
import org.springframework.security.oauth2.server.authorization.web.authentication.OAuth2AuthorizationCodeAuthenticationConverter;
import org.springframework.security.oauth2.server.authorization.web.authentication.OAuth2ClientCredentialsAuthenticationConverter;
import org.springframework.security.web.DefaultSecurityFilterChain;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.AuthenticationConverter;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.DelegatingAuthenticationConverter;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import java.util.Arrays;
/**
* @author lengleng
* @date 2022/5/27
* <p>
* 认证服务器配置
*/
@Configuration
@RequiredArgsConstructor
public class AuthorizationServerConfiguration {
private final OAuth2AuthorizationService authorizationService;
private final PasswordDecoderFilter passwordDecoderFilter;
private final ValidateCodeFilter validateCodeFilter;
private final FormLoginValidateCodeFilter formLoginValidateCodeFilter;
private final PigxBootCorsProperties corsProperties;
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http,
PigxAuthenticationSuccessEventHandler successEventHandler,
PigxAuthenticationFailureEventHandler failureEventHandler) throws Exception {
// 配置授权服务器的安全策略,只有/oauth2/**的请求才会走如下的配置
http.securityMatcher("/oauth2/**");
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer();
// 增加验证码过滤器
http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class);
// 增加授权码登录表单验证码过滤器
http.addFilterBefore(formLoginValidateCodeFilter, UsernamePasswordAuthenticationFilter.class);
// 增加密码解密过滤器
http.addFilterBefore(passwordDecoderFilter, UsernamePasswordAuthenticationFilter.class);
http.with(authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点
tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter()) // 注入自定义的授权认证Converter
.accessTokenResponseHandler(successEventHandler) // 登录成功处理器
.errorResponseHandler(failureEventHandler);// 登录失败处理器
}).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证
oAuth2ClientAuthenticationConfigurer.errorResponseHandler(failureEventHandler))// 处理客户端认证异常
.authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面
.consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI)), Customizer.withDefaults())
.authorizeHttpRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated());
// 设置 Token 存储的策略
http.with(authorizationServerConfigurer.authorizationService(authorizationService)// redis存储token的实现
.authorizationServerSettings(
AuthorizationServerSettings.builder().issuer(SecurityConstants.PIGX_LICENSE).build()),
Customizer.withDefaults());
// 设置授权码模式登录页面
http.with(new FormIdentityLoginConfigurer(), Customizer.withDefaults());
// 单体版本:根据配置启用CORS跨域支持(仅在security.cors.enabled=true时生效)
if (Boolean.TRUE.equals(corsProperties.getEnabled())) {
http.cors(cors -> cors.configurationSource(request -> {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsProperties.getAllowedOriginPatterns().forEach(corsConfiguration::addAllowedOriginPattern);
corsProperties.getAllowedHeaders().forEach(corsConfiguration::addAllowedHeader);
corsProperties.getAllowedMethods().forEach(corsConfiguration::addAllowedMethod);
corsConfiguration.setAllowCredentials(corsProperties.getAllowCredentials());
source.registerCorsConfiguration(corsProperties.getPathPattern(), corsConfiguration);
return corsConfiguration;
}));
}
DefaultSecurityFilterChain securityFilterChain = http.build();
// 注入自定义授权模式实现
addCustomOAuth2GrantAuthenticationProvider(http);
return securityFilterChain;
}
/**
* 令牌生成规则实现 </br>
* client:username:uuid
*
* @return OAuth2TokenGenerator
*/
@Bean
public OAuth2TokenGenerator oAuth2TokenGenerator() {
CustomeOAuth2AccessTokenGenerator accessTokenGenerator = new CustomeOAuth2AccessTokenGenerator();
// 注入Token 增加关联用户信息
accessTokenGenerator.setAccessTokenCustomizer(new CustomeOAuth2TokenCustomizer());
return new DelegatingOAuth2TokenGenerator(accessTokenGenerator, new OAuth2RefreshTokenGenerator());
}
@Bean
public AuthenticationFailureHandler authenticationFailureHandler() {
return new FormAuthenticationFailureHandler();
}
@Bean
public LogoutSuccessHandler logoutSuccessHandler() {
return new SsoLogoutSuccessHandler();
}
/**
* request -> xToken 注入请求转换器
*
* @return DelegatingAuthenticationConverter
*/
private AuthenticationConverter accessTokenRequestConverter() {
return new DelegatingAuthenticationConverter(
Arrays.asList(new OAuth2ResourceOwnerPasswordAuthenticationConverter(),
new OAuth2ResourceOwnerSmsAuthenticationConverter(),
new PigxOAuth2RefreshTokenAuthenticationConverter(),
new OAuth2ClientCredentialsAuthenticationConverter(),
new OAuth2AuthorizationCodeAuthenticationConverter()));
}
/**
* 注入授权模式实现提供方
* <p>
* 1. 密码模式 </br>
* 2. 短信登录 </br>
*/
@SuppressWarnings("unchecked")
private void addCustomOAuth2GrantAuthenticationProvider(HttpSecurity http) {
AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);
OAuth2AuthorizationService authorizationService = http.getSharedObject(OAuth2AuthorizationService.class);
OAuth2ResourceOwnerPasswordAuthenticationProvider resourceOwnerPasswordAuthenticationProvider = new OAuth2ResourceOwnerPasswordAuthenticationProvider(
authenticationManager, authorizationService, oAuth2TokenGenerator());
OAuth2ResourceOwnerSmsAuthenticationProvider resourceOwnerSmsAuthenticationProvider = new OAuth2ResourceOwnerSmsAuthenticationProvider(
authenticationManager, authorizationService, oAuth2TokenGenerator());
// 处理 UsernamePasswordAuthenticationToken
http.authenticationProvider(new PigxDaoAuthenticationProvider());
// 处理 OAuth2ResourceOwnerPasswordAuthenticationToken
http.authenticationProvider(resourceOwnerPasswordAuthenticationProvider);
// 处理 OAuth2ResourceOwnerSmsAuthenticationToken
http.authenticationProvider(resourceOwnerSmsAuthenticationProvider);
}
}
@@ -1,126 +0,0 @@
/*
*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*
*/
package com.pig4cloud.pigx.auth.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.pig4cloud.pigx.common.security.handler.MobileLoginSuccessHandler;
import com.pig4cloud.pigx.common.security.mobile.MobileSecurityConfigurer;
import com.pig4cloud.pigx.common.security.service.PigxUserDetailsService;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
/**
* @author lengleng
* @date 2018/6/22
* 认证相关配置
*/
@Primary
@Order(90)
@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Autowired
private ObjectMapper objectMapper;
@Autowired
private ClientDetailsService clientDetailsService;
@Autowired
private PigxUserDetailsService userDetailsService;
@Lazy
@Autowired
private AuthorizationServerTokenServices defaultAuthorizationServerTokenServices;
@Override
@SneakyThrows
protected void configure(HttpSecurity http) {
http
.formLogin()
.loginPage("/token/login")
.loginProcessingUrl("/token/form")
.and()
.authorizeRequests()
.antMatchers(
"/token/**",
"/actuator/**",
"/mobile/**").permitAll()
.anyRequest().authenticated()
.and().csrf().disable()
.apply(mobileSecurityConfigurer());
}
/**
* 不拦截静态资源
*
* @param web
*/
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/css/**");
}
@Bean
@Override
@SneakyThrows
public AuthenticationManager authenticationManagerBean() {
return super.authenticationManagerBean();
}
@Bean
public AuthenticationSuccessHandler mobileLoginSuccessHandler() {
return MobileLoginSuccessHandler.builder()
.objectMapper(objectMapper)
.clientDetailsService(clientDetailsService)
.passwordEncoder(passwordEncoder())
.defaultAuthorizationServerTokenServices(defaultAuthorizationServerTokenServices).build();
}
@Bean
public MobileSecurityConfigurer mobileSecurityConfigurer() {
MobileSecurityConfigurer mobileSecurityConfigurer = new MobileSecurityConfigurer();
mobileSecurityConfigurer.setMobileLoginSuccessHandler(mobileLoginSuccessHandler());
mobileSecurityConfigurer.setUserDetailsService(userDetailsService);
return mobileSecurityConfigurer;
}
/**
* https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released#password-storage-updated
* Encoded password does not look like BCrypt
*
* @return PasswordEncoder
*/
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
}
@@ -0,0 +1,94 @@
package com.pig4cloud.pigx.auth.endpoint;
import cn.hutool.core.lang.Validator;
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
import com.pig4cloud.pigx.common.core.constant.CacheConstants;
import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.core.util.SpringContextHolder;
import com.pig4cloud.pigx.common.data.cache.RedisUtils;
import io.springboot.captcha.ArithmeticCaptcha;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.awt.Color;
/**
* 验证码相关的接口
*
* @author lengleng
* @date 2022/6/27
*/
@RestController
@RequestMapping("/code")
@RequiredArgsConstructor
public class ImageCodeEndpoint {
private static final Integer DEFAULT_IMAGE_WIDTH = 100;
private static final Integer DEFAULT_IMAGE_HEIGHT = 40;
/**
* 创建图形验证码
*/
@SneakyThrows
@GetMapping("/image")
public void image(String randomStr, HttpServletResponse response) {
ArithmeticCaptcha captcha = createCaptcha();
String result = captcha.text();
// 如果是手机号码,不存储下发验证码
if (Validator.isMobile(randomStr)) {
return;
}
RedisUtils.set(CacheConstants.IMAGE_CODE_KEY + randomStr, result, SecurityConstants.CODE_TIME);
// 转换流信息写出
captcha.out(response.getOutputStream());
}
static ArithmeticCaptcha createCaptcha() {
return new ArithmeticCaptcha(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT) {
@Override
protected Color color() {
return Color.BLACK;
}
};
}
/**
* 行为 创建滑块图形验证码
*/
@SneakyThrows
@GetMapping("/create")
public R behavior(String captchaType) {
CaptchaVO vo = new CaptchaVO();
vo.setCaptchaType(captchaType);
CaptchaService captchaService = SpringContextHolder.getBean(CaptchaService.class);
return R.ok(captchaService.get(vo));
}
/**
* 行为 创建滑块图形验证码
*/
@SneakyThrows
@PostMapping("/check")
public R check(HttpServletRequest request) {
CaptchaVO vo = new CaptchaVO();
vo.setPointJson(request.getParameter("pointJson"));
vo.setToken(request.getParameter("token"));
vo.setCaptchaType(request.getParameter("captchaType"));
CaptchaService captchaService = SpringContextHolder.getBean(CaptchaService.class);
return R.ok(captchaService.check(vo));
}
}
@@ -1,203 +1,306 @@
/*
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
*
* Copyright (c) 2018-2025, lengleng All rights reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.pig4cloud.pigx.auth.endpoint;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.TemporalAccessorUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails;
import com.pig4cloud.pigx.admin.api.entity.SysTenant;
import com.pig4cloud.pigx.admin.api.feign.RemoteClientDetailsService;
import com.pig4cloud.pigx.admin.api.feign.RemoteTenantService;
import com.pig4cloud.pigx.admin.api.vo.TokenVO;
import com.pig4cloud.pigx.auth.support.core.AuthCaptchaSupport;
import com.pig4cloud.pigx.auth.support.core.AuthErrorCodes;
import com.pig4cloud.pigx.common.core.constant.CacheConstants;
import com.pig4cloud.pigx.common.core.constant.PaginationConstants;
import com.pig4cloud.pigx.common.core.constant.CommonConstants;
import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
import com.pig4cloud.pigx.common.core.util.MsgUtils;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.core.util.RetOps;
import com.pig4cloud.pigx.common.core.util.SpringContextHolder;
import com.pig4cloud.pigx.common.data.cache.RedisUtils;
import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder;
import com.pig4cloud.pigx.common.security.annotation.Inner;
import com.pig4cloud.pigx.common.security.util.SecurityUtils;
import lombok.AllArgsConstructor;
import com.pig4cloud.pigx.common.security.util.OAuth2ErrorCodesExpand;
import com.pig4cloud.pigx.common.security.util.OAuthClientException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.CacheManager;
import org.springframework.data.redis.core.ConvertingCursor;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.http.HttpHeaders;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken;
import org.springframework.security.oauth2.provider.AuthorizationRequest;
import org.springframework.security.oauth2.provider.ClientDetails;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.security.authentication.event.LogoutSuccessEvent;
import org.springframework.security.oauth2.core.OAuth2AccessToken;
import org.springframework.security.oauth2.core.OAuth2ErrorCodes;
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.security.Principal;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
/**
* @author lengleng
* @date 2018/6/24
* 删除token端点
* @date 2019/2/1 删除token端点
*/
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/token")
@RequestMapping
@RequiredArgsConstructor
public class PigxTokenEndpoint {
private static final String PIGX_OAUTH_ACCESS = SecurityConstants.PIGX_PREFIX + SecurityConstants.OAUTH_PREFIX + "auth_to_access:";
private final ClientDetailsService clientDetailsService;
private final RedisTemplate pigxRedisTemplate;
private final TokenStore tokenStore;
private final CacheManager cacheManager;
/**
* 认证页面
*
* @param modelAndView
* @return ModelAndView
*/
@GetMapping("/login")
public ModelAndView require(ModelAndView modelAndView) {
modelAndView.setViewName("ftl/login");
return modelAndView;
}
private static final String DEFAULT_FORM_CLIENT_ID = "pig";
/**
* 确认授权页面
*
* @param request
* @param session
* @param modelAndView
* @return
*/
@GetMapping("/confirm_access")
public ModelAndView confirm(HttpServletRequest request, HttpSession session, ModelAndView modelAndView) {
Map<String, Object> scopeList = (Map<String, Object>) request.getAttribute("scopes");
modelAndView.addObject("scopeList", scopeList.keySet());
private final OAuth2AuthorizationService authorizationService;
Object auth = session.getAttribute("authorizationRequest");
if (auth != null) {
AuthorizationRequest authorizationRequest = (AuthorizationRequest) auth;
ClientDetails clientDetails = clientDetailsService.loadClientByClientId(authorizationRequest.getClientId());
modelAndView.addObject("app", clientDetails.getAdditionalInformation());
modelAndView.addObject("user", SecurityUtils.getUser());
}
private final RemoteClientDetailsService clientDetailsService;
modelAndView.setViewName("ftl/confirm");
return modelAndView;
}
private final RemoteTenantService tenantService;
/**
* 退出token
*
* @param authHeader Authorization
*/
@DeleteMapping("/logout")
public R logout(@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authHeader) {
if (StrUtil.isBlank(authHeader)) {
return R.ok(Boolean.FALSE, "退出失败,token 为空");
}
private final CacheManager cacheManager;
String tokenValue = authHeader.replace(OAuth2AccessToken.BEARER_TYPE, StrUtil.EMPTY).trim();
OAuth2AccessToken accessToken = tokenStore.readAccessToken(tokenValue);
if (accessToken == null || StrUtil.isBlank(accessToken.getValue())) {
return R.ok(Boolean.TRUE, "退出失败,token 无效");
}
private final AuthCaptchaSupport authCaptchaSupport;
OAuth2Authentication auth2Authentication = tokenStore.readAuthentication(accessToken);
// 清空用户信息
cacheManager.getCache(CacheConstants.USER_DETAILS)
.evict(auth2Authentication.getName());
/**
* 认证页面
*
* @param modelAndView
* @param error 表单登录失败处理回调的错误信息
* @return ModelAndView
*/
@GetMapping("/token/login")
public ModelAndView require(ModelAndView modelAndView, @RequestParam(required = false) String error,
HttpServletRequest request, HttpServletResponse response) {
modelAndView.setViewName("ftl/login");
// Note: XSS prevention is handled by FreeMarker template using ?html directive
modelAndView.addObject("error", error);
// 清空access token
tokenStore.removeAccessToken(accessToken);
List<SysTenant> tenantList = Objects.requireNonNullElse(tenantService.list().getData(), List.of());
String authClientId = StrUtil.blankToDefault(
authCaptchaSupport.resolveAuthorizationClientId(request, response, true), DEFAULT_FORM_CLIENT_ID);
Long selectedTenantId = resolveSelectedTenantId(request, response, tenantList);
Map<String, Boolean> tenantCaptchaEnabledMap = buildTenantCaptchaEnabledMap(tenantList, authClientId);
// 清空 refresh token
OAuth2RefreshToken refreshToken = accessToken.getRefreshToken();
tokenStore.removeRefreshToken(refreshToken);
return R.ok(Boolean.TRUE);
}
modelAndView.addObject("tenantList", tenantList);
modelAndView.addObject("authClientId", authClientId);
modelAndView.addObject("selectedTenantId", selectedTenantId);
modelAndView.addObject("showCaptcha",
Boolean.TRUE.equals(tenantCaptchaEnabledMap.get(String.valueOf(selectedTenantId))));
modelAndView.addObject("tenantCaptchaEnabledJson", JSONUtil.toJsonStr(tenantCaptchaEnabledMap));
return modelAndView;
}
/**
* 令牌管理调用
*
* @param token token
* @return
*/
@Inner
@DeleteMapping("/{token}")
public R<Boolean> delToken(@PathVariable("token") String token) {
OAuth2AccessToken oAuth2AccessToken = tokenStore.readAccessToken(token);
tokenStore.removeAccessToken(oAuth2AccessToken);
return new R<>();
}
/**
* 授权码模式:确认页面
*
* @return {@link ModelAndView }
*/
@GetMapping("/oauth2/confirm_access")
public ModelAndView confirm(Principal principal, ModelAndView modelAndView,
@RequestParam(OAuth2ParameterNames.CLIENT_ID) String clientId,
@RequestParam(OAuth2ParameterNames.SCOPE) String scope,
@RequestParam(OAuth2ParameterNames.STATE) String state) {
SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId))
.getData()
.orElseThrow(() -> new OAuthClientException(OAuth2ErrorCodes.INVALID_CLIENT,
MsgUtils.getMessage(AuthErrorCodes.AUTH_CLIENT_INVALID)));
Set<String> authorizedScopes = StringUtils.commaDelimitedListToSet(clientDetails.getScope());
// Note: XSS prevention is handled by FreeMarker template using ?html directive
modelAndView.addObject("clientId", clientId);
modelAndView.addObject("state", state);
modelAndView.addObject("scopeList", authorizedScopes);
modelAndView.addObject("principalName", principal.getName());
modelAndView.setViewName("ftl/confirm");
return modelAndView;
}
/**
* 查询token
*
* @param params 分页参数
* @return
*/
@Inner
@PostMapping("/page")
public R<Page> tokenList(@RequestBody Map<String, Object> params) {
//根据分页参数获取对应数据
String key = String.format("%s*:%s", PIGX_OAUTH_ACCESS, TenantContextHolder.getTenantId());
List<String> pages = findKeysForPage(key, MapUtil.getInt(params, PaginationConstants.CURRENT)
, MapUtil.getInt(params, PaginationConstants.SIZE));
/**
* 注销并删除令牌
*
* @param authHeader auth 标头
* @return {@link R }<{@link Boolean }>
*/
@DeleteMapping("/token/logout")
public R<Boolean> logout(@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authHeader) {
if (StrUtil.isBlank(authHeader)) {
return R.ok();
}
pigxRedisTemplate.setKeySerializer(new StringRedisSerializer());
pigxRedisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
Page result = new Page(MapUtil.getInt(params, PaginationConstants.CURRENT), MapUtil.getInt(params, PaginationConstants.SIZE));
result.setRecords(pigxRedisTemplate.opsForValue().multiGet(pages));
result.setTotal(Long.valueOf(pigxRedisTemplate.keys(key).size()));
return R.ok(result);
}
String tokenValue = authHeader.replace(OAuth2AccessToken.TokenType.BEARER.getValue(), StrUtil.EMPTY).trim();
return removeToken(tokenValue);
}
/**
* 校验token
*
* @param token 令牌
* @return
*/
@SneakyThrows
@GetMapping("/token/check_token")
public R<OAuth2AccessToken> checkToken(String token, HttpServletResponse response, HttpServletRequest request) {
ServletServerHttpResponse httpResponse = new ServletServerHttpResponse(response);
private List<String> findKeysForPage(String patternKey, int pageNum, int pageSize) {
ScanOptions options = ScanOptions.scanOptions().match(patternKey).build();
RedisSerializer<String> redisSerializer = (RedisSerializer<String>) pigxRedisTemplate.getKeySerializer();
Cursor cursor = (Cursor) pigxRedisTemplate.executeWithStickyConnection(redisConnection -> new ConvertingCursor<>(redisConnection.scan(options), redisSerializer::deserialize));
List<String> result = new ArrayList<>();
int tmpIndex = 0;
int startIndex = (pageNum - 1) * pageSize;
int end = pageNum * pageSize;
if (StrUtil.isBlank(token)) {
httpResponse.setStatusCode(HttpStatus.UNAUTHORIZED);
return R.failed(OAuth2ErrorCodesExpand.TOKEN_MISSING);
}
OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN);
// 如果令牌不存在 返回401
if (authorization == null || authorization.getAccessToken() == null) {
httpResponse.setStatusCode(HttpStatus.UNAUTHORIZED);
return R.failed(OAuth2ErrorCodesExpand.INVALID_BEARER_TOKEN);
}
// 获取令牌
return R.ok(Objects.requireNonNull(authorization).getAccessToken().getToken());
}
/**
* 移除指定令牌
*
* @param token 需要移除的令牌
* @return 操作结果,成功返回true
*/
@Inner
@DeleteMapping("/token/remove/{token}")
public R<Boolean> removeToken(@PathVariable("token") String token) {
OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN);
if (authorization == null) {
return R.ok();
}
OAuth2Authorization.Token<OAuth2AccessToken> accessToken = authorization.getAccessToken();
if (accessToken == null || StrUtil.isBlank(accessToken.getToken().getTokenValue())) {
return R.ok();
}
// 清空用户信息
cacheManager.getCache(CacheConstants.USER_DETAILS).evict(authorization.getPrincipalName());
// 清空access token
authorizationService.remove(authorization);
// 处理自定义退出事件,保存相关日志
SpringContextHolder.publishEvent(new LogoutSuccessEvent(new PreAuthenticatedAuthenticationToken(
authorization.getPrincipalName(), authorization.getRegisteredClientId())));
return R.ok();
}
/**
* 分页查询token列表
*
* @param params 查询参数,包含分页参数(current,size)和可选用户名过滤条件(username)
* @return 分页结果,包含token列表和总数
*/
@Inner
@PostMapping("/token/page")
public R<Page<TokenVO>> tokenList(@RequestBody Map<String, Object> params) {
// 根据username参数获取对应数据
String username = MapUtil.getStr(params, SecurityConstants.DETAILS_USERNAME);
String usernameKey = String.format("token::username::%s*::*::%s::*", username,
TenantContextHolder.getTenantId());
String key = String.format("token::username::*::*::%s::*", TenantContextHolder.getTenantId());
int current = MapUtil.getInt(params, CommonConstants.CURRENT);
int size = MapUtil.getInt(params, CommonConstants.SIZE);
// 根据是否有username参数选择不同的查询key
String searchKey = StrUtil.isNotBlank(username) ? usernameKey : key;
Set<String> keys = RedisUtils.keys(searchKey);
// 分页处理
List<String> pages = keys.stream().skip((current - 1) * size).limit(size).toList();
Page<TokenVO> result = new Page(current, size);
List<TokenVO> tokenVoList = pages.stream().map(keyName -> {
// 从key名称解析信息: token::username::{username}::{tenantId}::{tokenId}
String[] keyParts = keyName.split("::");
if (keyParts.length < 6) {
return null;
}
TokenVO tokenVo = new TokenVO();
// 从key解析username
String keyUsername = keyParts[2];
tokenVo.setUsername(keyUsername);
tokenVo.setClientId(keyParts[3]);
tokenVo.setId(keyParts[5]);
tokenVo.setAccessToken(keyParts[5]);
// 获取TTL作为过期时间
Long ttl = RedisUtils.getExpire(keyName);
// TTL是秒数,转换为过期时间
long expiresAtMillis = System.currentTimeMillis() + (ttl * 1000);
String expiresAt = TemporalAccessorUtil.format(java.time.Instant.ofEpochMilli(expiresAtMillis),
DatePattern.NORM_DATETIME_PATTERN);
tokenVo.setExpiresAt(expiresAt);
return tokenVo;
}).filter(Objects::nonNull).toList();
result.setRecords(tokenVoList);
result.setTotal(keys.size());
return R.ok(result);
}
@Inner
@GetMapping("/token/query-token")
public R queryToken(String token) {
OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN);
return R.ok(authorization);
}
private Long resolveSelectedTenantId(HttpServletRequest request, HttpServletResponse response, List<SysTenant> tenantList) {
String tenantId = authCaptchaSupport.resolveAuthorizationTenantId(request, response, true);
if (StrUtil.isNotBlank(tenantId)) {
try {
return Long.parseLong(tenantId);
} catch (NumberFormatException ignored) {
// ignore invalid tenant id and fall back to the default selection below
}
}
if (!tenantList.isEmpty()) {
return tenantList.get(0).getId();
}
return CommonConstants.TENANT_ID_1;
}
private Map<String, Boolean> buildTenantCaptchaEnabledMap(List<SysTenant> tenantList, String authClientId) {
Map<String, Boolean> result = new LinkedHashMap<>(tenantList.size());
for (SysTenant tenant : tenantList) {
String tenantId = String.valueOf(tenant.getId());
result.put(tenantId, authCaptchaSupport.isCaptchaEnabled(tenantId, authClientId));
}
return result;
}
assert cursor != null;
while (cursor.hasNext()) {
if (tmpIndex >= startIndex && tmpIndex < end) {
result.add(cursor.next().toString());
tmpIndex++;
continue;
}
if (tmpIndex >= end) {
break;
}
tmpIndex++;
cursor.next();
}
return result;
}
}
@@ -1,45 +0,0 @@
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.pig4cloud.pigx.auth.handler;
import com.pig4cloud.pigx.common.security.handler.AbstractAuthenticationFailureEvenHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Component;
/**
* @author lengleng
* @date 2018/10/8
*/
@Slf4j
@Component
public class PigxAuthenticationFailureEvenHandler extends AbstractAuthenticationFailureEvenHandler {
/**
* 处理登录失败方法
* <p>
*
* @param authenticationException 登录的authentication 对象
* @param authentication 登录的authenticationException 对象
*/
@Override
public void handle(AuthenticationException authenticationException, Authentication authentication) {
log.info("用户:{} 登录失败,异常:{}", authentication.getPrincipal(), authenticationException.getLocalizedMessage());
}
}
@@ -1,44 +0,0 @@
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.pig4cloud.pigx.auth.handler;
import com.pig4cloud.pigx.common.security.handler.AbstractAuthenticationSuccessEventHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
/**
* @author lengleng
* @date 2018/10/8
*/
@Slf4j
@Component
public class PigxAuthenticationSuccessEventHandler extends AbstractAuthenticationSuccessEventHandler {
/**
* 处理登录成功方法
* <p>
* 获取到登录的authentication 对象
*
* @param authentication 登录对象
*/
@Override
public void handle(Authentication authentication) {
log.info("用户:{} 登录成功", authentication.getPrincipal());
}
}
@@ -0,0 +1,119 @@
package com.pig4cloud.pigx.auth.support;
import org.springframework.lang.Nullable;
import org.springframework.security.oauth2.core.ClaimAccessor;
import org.springframework.security.oauth2.core.OAuth2AccessToken;
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
import org.springframework.security.oauth2.server.authorization.token.*;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.time.Instant;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* @author lengleng
* @date 2022/5/29
*/
public class CustomeOAuth2AccessTokenGenerator implements OAuth2TokenGenerator<OAuth2AccessToken> {
private OAuth2TokenCustomizer<OAuth2TokenClaimsContext> accessTokenCustomizer;
@Nullable
@Override
public OAuth2AccessToken generate(OAuth2TokenContext context) {
if (!OAuth2TokenType.ACCESS_TOKEN.equals(context.getTokenType()) || !OAuth2TokenFormat.REFERENCE
.equals(context.getRegisteredClient().getTokenSettings().getAccessTokenFormat())) {
return null;
}
String issuer = null;
if (context.getAuthorizationServerContext() != null) {
issuer = context.getAuthorizationServerContext().getIssuer();
}
RegisteredClient registeredClient = context.getRegisteredClient();
Instant issuedAt = Instant.now();
Instant expiresAt = issuedAt.plus(registeredClient.getTokenSettings().getAccessTokenTimeToLive());
// @formatter:off
OAuth2TokenClaimsSet.Builder claimsBuilder = OAuth2TokenClaimsSet.builder();
if (StringUtils.hasText(issuer)) {
claimsBuilder.issuer(issuer);
}
claimsBuilder
.subject(context.getPrincipal().getName())
.audience(Collections.singletonList(registeredClient.getClientId()))
.issuedAt(issuedAt)
.expiresAt(expiresAt)
.notBefore(issuedAt)
.id(UUID.randomUUID().toString());
if (!CollectionUtils.isEmpty(context.getAuthorizedScopes())) {
claimsBuilder.claim(OAuth2ParameterNames.SCOPE, context.getAuthorizedScopes());
}
// @formatter:on
if (this.accessTokenCustomizer != null) {
// @formatter:off
OAuth2TokenClaimsContext.Builder accessTokenContextBuilder = OAuth2TokenClaimsContext.with(claimsBuilder)
.registeredClient(context.getRegisteredClient())
.principal(context.getPrincipal())
.authorizationServerContext(context.getAuthorizationServerContext())
.authorizedScopes(context.getAuthorizedScopes())
.tokenType(context.getTokenType())
.authorizationGrantType(context.getAuthorizationGrantType());
if (context.getAuthorization() != null) {
accessTokenContextBuilder.authorization(context.getAuthorization());
}
if (context.getAuthorizationGrant() != null) {
accessTokenContextBuilder.authorizationGrant(context.getAuthorizationGrant());
}
// @formatter:on
OAuth2TokenClaimsContext accessTokenContext = accessTokenContextBuilder.build();
this.accessTokenCustomizer.customize(accessTokenContext);
}
OAuth2TokenClaimsSet accessTokenClaimsSet = claimsBuilder.build();
return new OAuth2AccessTokenClaims(OAuth2AccessToken.TokenType.BEARER, UUID.randomUUID().toString(),
accessTokenClaimsSet.getIssuedAt(), accessTokenClaimsSet.getExpiresAt(), context.getAuthorizedScopes(),
accessTokenClaimsSet.getClaims());
}
/**
* Sets the {@link OAuth2TokenCustomizer} that customizes the
* {@link OAuth2TokenClaimsContext#getClaims() claims} for the
* {@link OAuth2AccessToken}.
* @param accessTokenCustomizer the {@link OAuth2TokenCustomizer} that customizes the
* claims for the {@code OAuth2AccessToken}
*/
public void setAccessTokenCustomizer(OAuth2TokenCustomizer<OAuth2TokenClaimsContext> accessTokenCustomizer) {
Assert.notNull(accessTokenCustomizer, "accessTokenCustomizer cannot be null");
this.accessTokenCustomizer = accessTokenCustomizer;
}
private static final class OAuth2AccessTokenClaims extends OAuth2AccessToken implements ClaimAccessor {
private final Map<String, Object> claims;
private OAuth2AccessTokenClaims(TokenType tokenType, String tokenValue, Instant issuedAt, Instant expiresAt,
Set<String> scopes, Map<String, Object> claims) {
super(tokenType, tokenValue, issuedAt, expiresAt, scopes);
this.claims = claims;
}
@Override
public Map<String, Object> getClaims() {
return this.claims;
}
}
}
@@ -0,0 +1,97 @@
package com.pig4cloud.pigx.auth.support.base;
import com.pig4cloud.pigx.common.security.util.OAuth2EndpointUtils;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.core.OAuth2ErrorCodes;
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
import org.springframework.security.web.authentication.AuthenticationConverter;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @author jumuning
* @date 2022-06-02
*
* 自定义模式认证转换器
*/
public abstract class OAuth2ResourceOwnerBaseAuthenticationConverter<T extends OAuth2ResourceOwnerBaseAuthenticationToken>
implements AuthenticationConverter {
/**
* 是否支持此convert
* @param grantType 授权类型
* @return
*/
public abstract boolean support(String grantType);
/**
* 校验参数
* @param request 请求
*/
public void checkParams(HttpServletRequest request) {
}
/**
* 构建具体类型的token
* @param clientPrincipal
* @param requestedScopes
* @param additionalParameters
* @return
*/
public abstract T buildToken(Authentication clientPrincipal, Set<String> requestedScopes,
Map<String, Object> additionalParameters);
@Override
public Authentication convert(HttpServletRequest request) {
// grant_type (REQUIRED)
String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE);
if (!support(grantType)) {
return null;
}
MultiValueMap<String, String> parameters = OAuth2EndpointUtils.getParameters(request);
// scope (OPTIONAL)
String scope = parameters.getFirst(OAuth2ParameterNames.SCOPE);
if (StringUtils.hasText(scope) && parameters.get(OAuth2ParameterNames.SCOPE).size() != 1) {
OAuth2EndpointUtils.throwError(OAuth2ErrorCodes.INVALID_REQUEST, OAuth2ParameterNames.SCOPE,
OAuth2EndpointUtils.ACCESS_TOKEN_REQUEST_ERROR_URI);
}
Set<String> requestedScopes = null;
if (StringUtils.hasText(scope)) {
requestedScopes = new HashSet<>(Arrays.asList(StringUtils.delimitedListToStringArray(scope, " ")));
}
// 校验个性化参数
checkParams(request);
// 获取当前已经认证的客户端信息
Authentication clientPrincipal = SecurityContextHolder.getContext().getAuthentication();
if (clientPrincipal == null) {
OAuth2EndpointUtils.throwError(OAuth2ErrorCodes.INVALID_REQUEST, OAuth2ErrorCodes.INVALID_CLIENT,
OAuth2EndpointUtils.ACCESS_TOKEN_REQUEST_ERROR_URI);
}
// 扩展信息
Map<String, Object> additionalParameters = parameters.entrySet()
.stream()
.filter(e -> !e.getKey().equals(OAuth2ParameterNames.GRANT_TYPE)
&& !e.getKey().equals(OAuth2ParameterNames.SCOPE))
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().get(0)));
// 创建token
return buildToken(clientPrincipal, requestedScopes, additionalParameters);
}
}
@@ -0,0 +1,328 @@
package com.pig4cloud.pigx.auth.support.base;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.pig4cloud.pigx.common.core.constant.CommonConstants;
import com.pig4cloud.pigx.common.security.service.PigxRedisOAuth2AuthorizationService;
import com.pig4cloud.pigx.common.security.util.OAuth2ErrorCodesExpand;
import com.pig4cloud.pigx.common.security.util.ScopeException;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.security.authentication.*;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.oauth2.core.*;
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.security.Principal;
import java.time.Instant;
import java.util.*;
import java.util.function.Supplier;
/**
* @author jumuning
* @description 处理自定义授权
*/
@Slf4j
public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider<T extends OAuth2ResourceOwnerBaseAuthenticationToken>
implements AuthenticationProvider {
private static final Logger LOGGER = LogManager.getLogger(OAuth2ResourceOwnerBaseAuthenticationProvider.class);
private static final String ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1";
private final OAuth2AuthorizationService authorizationService;
private final OAuth2TokenGenerator<? extends OAuth2Token> tokenGenerator;
private final AuthenticationManager authenticationManager;
private final MessageSourceAccessor messages;
@Deprecated
private Supplier<String> refreshTokenGenerator;
/**
* 构造一个基于资源所有者密码模式的OAuth2认证提供者
*
* @param authenticationManager 认证管理器
* @param authorizationService 授权服务
* @param tokenGenerator 令牌生成器
* @since 0.2.3
*/
public OAuth2ResourceOwnerBaseAuthenticationProvider(AuthenticationManager authenticationManager,
OAuth2AuthorizationService authorizationService,
OAuth2TokenGenerator<? extends OAuth2Token> tokenGenerator) {
Assert.notNull(authorizationService, "authorizationService cannot be null");
Assert.notNull(tokenGenerator, "tokenGenerator cannot be null");
this.authenticationManager = authenticationManager;
this.authorizationService = authorizationService;
this.tokenGenerator = tokenGenerator;
// 国际化配置
this.messages = new MessageSourceAccessor(SpringUtil.getBean("securityMessageSource"), Locale.CHINA);
}
@Deprecated
public void setRefreshTokenGenerator(Supplier<String> refreshTokenGenerator) {
Assert.notNull(refreshTokenGenerator, "refreshTokenGenerator cannot be null");
this.refreshTokenGenerator = refreshTokenGenerator;
}
public abstract UsernamePasswordAuthenticationToken buildToken(Map<String, Object> reqParameters);
/**
* 判断当前provider是否支持指定的令牌类型
*
* @param authentication 要检查的令牌类型
* @return 如果支持则返回true,否则返回false
*/
@Override
public abstract boolean supports(Class<?> authentication);
/**
* 检查当前请求客户端是否支持此模式
*
* @param registeredClient 已注册的客户端
*/
public abstract void checkClient(RegisteredClient registeredClient);
/**
* 执行身份验证,与{@link AuthenticationManager#authenticate(Authentication)}具有相同契约
*
* @param authentication 身份验证请求对象
* @return 包含凭据的完全认证对象,如果无法支持传入的认证对象则可能返回null
* @throws AuthenticationException 身份验证失败时抛出
* @throws OAuth2AuthenticationException 当scope无效或服务器错误时抛出
*/
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
T resouceOwnerBaseAuthentication = (T) authentication;
OAuth2ClientAuthenticationToken clientPrincipal = getAuthenticatedClientElseThrowInvalidClient(
resouceOwnerBaseAuthentication);
RegisteredClient registeredClient = clientPrincipal.getRegisteredClient();
checkClient(registeredClient);
Set<String> authorizedScopes;
// Default to configured scopes
if (!CollectionUtils.isEmpty(resouceOwnerBaseAuthentication.getScopes())) {
for (String requestedScope : resouceOwnerBaseAuthentication.getScopes()) {
if (!registeredClient.getScopes().contains(requestedScope)) {
throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_SCOPE);
}
}
authorizedScopes = new LinkedHashSet<>(resouceOwnerBaseAuthentication.getScopes());
} else {
authorizedScopes = new LinkedHashSet<>();
}
Map<String, Object> reqParameters = resouceOwnerBaseAuthentication.getAdditionalParameters();
try {
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = buildToken(reqParameters);
LOGGER.debug("got usernamePasswordAuthenticationToken=" + usernamePasswordAuthenticationToken);
Authentication usernamePasswordAuthentication = authenticationManager
.authenticate(usernamePasswordAuthenticationToken);
Object onlineQuantity = registeredClient.getClientSettings()
.getSettings()
.get(CommonConstants.ONLINE_QUANTITY);
// 没有设置并发控制走原有逻辑生成 || 设置同时在线为 true
if (Objects.isNull(onlineQuantity) || BooleanUtil.toBooleanObject((String) onlineQuantity)) {
return generatAuthenticationToken(resouceOwnerBaseAuthentication, clientPrincipal, registeredClient,
authorizedScopes, usernamePasswordAuthentication);
}
// 不允许同时在线,删除原有username 关联的所有token
PigxRedisOAuth2AuthorizationService redisOAuth2AuthorizationService = (PigxRedisOAuth2AuthorizationService) this.authorizationService;
redisOAuth2AuthorizationService.removeByUsername(usernamePasswordAuthentication);
return generatAuthenticationToken(resouceOwnerBaseAuthentication, clientPrincipal, registeredClient,
authorizedScopes, usernamePasswordAuthentication);
} catch (AuthenticationException ex) {
throw oAuth2AuthenticationException(authentication, ex);
} catch (Exception e) {
log.error("登录异常:", e);
throw new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR));
}
}
/**
* 生成OAuth2访问令牌认证令牌
*
* @param resouceOwnerBaseAuthentication 资源所有者基础认证信息
* @param clientPrincipal 客户端认证主体
* @param registeredClient 已注册的客户端信息
* @param authorizedScopes 授权范围集合
* @param usernamePasswordAuthentication 用户名密码认证信息
* @return OAuth2访问令牌认证令牌
* @throws OAuth2AuthenticationException 令牌生成失败时抛出异常
*/
@NotNull
private OAuth2AccessTokenAuthenticationToken generatAuthenticationToken(T resouceOwnerBaseAuthentication,
OAuth2ClientAuthenticationToken clientPrincipal, RegisteredClient registeredClient,
Set<String> authorizedScopes, Authentication usernamePasswordAuthentication) {
// @formatter:off
DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder()
.registeredClient(registeredClient)
.principal(usernamePasswordAuthentication)
.authorizationServerContext(AuthorizationServerContextHolder.getContext())
.authorizedScopes(authorizedScopes)
.authorizationGrantType(resouceOwnerBaseAuthentication.getAuthorizationGrantType())
.authorizationGrant(resouceOwnerBaseAuthentication);
// @formatter:on
OAuth2Authorization.Builder authorizationBuilder = OAuth2Authorization.withRegisteredClient(registeredClient)
.principalName(usernamePasswordAuthentication.getName())
.authorizationGrantType(resouceOwnerBaseAuthentication.getAuthorizationGrantType())
// 0.4.0 新增的方法
.authorizedScopes(authorizedScopes);
// ----- Access token -----
OAuth2TokenContext tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.ACCESS_TOKEN).build();
OAuth2Token generatedAccessToken = this.tokenGenerator.generate(tokenContext);
if (generatedAccessToken == null) {
OAuth2Error error = new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR,
"The token generator failed to generate the access token.", ERROR_URI);
throw new OAuth2AuthenticationException(error);
}
OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,
generatedAccessToken.getTokenValue(), generatedAccessToken.getIssuedAt(),
generatedAccessToken.getExpiresAt(), tokenContext.getAuthorizedScopes());
if (generatedAccessToken instanceof ClaimAccessor) {
authorizationBuilder.id(accessToken.getTokenValue())
.token(accessToken,
(metadata) -> metadata.put(OAuth2Authorization.Token.CLAIMS_METADATA_NAME,
((ClaimAccessor) generatedAccessToken).getClaims()))
// 0.4.0 新增的方法
.authorizedScopes(authorizedScopes)
.attribute(Principal.class.getName(), usernamePasswordAuthentication);
} else {
authorizationBuilder.id(accessToken.getTokenValue()).accessToken(accessToken);
}
// ----- Refresh token -----
OAuth2RefreshToken refreshToken = null;
if (registeredClient.getAuthorizationGrantTypes().contains(AuthorizationGrantType.REFRESH_TOKEN) &&
// Do not issue refresh token to public client
!clientPrincipal.getClientAuthenticationMethod().equals(ClientAuthenticationMethod.NONE)) {
if (this.refreshTokenGenerator != null) {
Instant issuedAt = Instant.now();
Instant expiresAt = issuedAt.plus(registeredClient.getTokenSettings().getRefreshTokenTimeToLive());
refreshToken = new OAuth2RefreshToken(this.refreshTokenGenerator.get(), issuedAt, expiresAt);
} else {
tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.REFRESH_TOKEN).build();
OAuth2Token generatedRefreshToken = this.tokenGenerator.generate(tokenContext);
if (!(generatedRefreshToken instanceof OAuth2RefreshToken)) {
OAuth2Error error = new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR,
"The token generator failed to generate the refresh token.", ERROR_URI);
throw new OAuth2AuthenticationException(error);
}
refreshToken = (OAuth2RefreshToken) generatedRefreshToken;
}
authorizationBuilder.refreshToken(refreshToken);
}
OAuth2Authorization authorization = authorizationBuilder.build();
this.authorizationService.save(authorization);
LOGGER.debug("returning OAuth2AccessTokenAuthenticationToken");
return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, accessToken, refreshToken,
Objects.requireNonNull(authorization.getAccessToken().getClaims()));
}
/**
* 登录异常转换为oauth2异常
* @param authentication 身份验证
* @param authenticationException 身份验证异常
* @return {@link OAuth2AuthenticationException}
*/
private OAuth2AuthenticationException oAuth2AuthenticationException(Authentication authentication,
AuthenticationException authenticationException) {
// OAuth2AuthenticationException 直接返回
if (authenticationException instanceof OAuth2AuthenticationException) {
return (OAuth2AuthenticationException) authenticationException;
}
if (authenticationException instanceof UsernameNotFoundException) {
return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.USERNAME_NOT_FOUND,
this.messages.getMessage("JdbcDaoImpl.notFound", new Object[]{authentication.getName()},
"Username {0} not found"),
""));
}
if (authenticationException instanceof BadCredentialsException) {
return new OAuth2AuthenticationException(
new OAuth2Error(OAuth2ErrorCodesExpand.BAD_CREDENTIALS, this.messages.getMessage(
"AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"), ""));
}
if (authenticationException instanceof LockedException) {
return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.USER_LOCKED, this.messages
.getMessage("AbstractUserDetailsAuthenticationProvider.locked", "User account is locked"), ""));
}
if (authenticationException instanceof DisabledException) {
return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.USER_DISABLE,
this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.disabled", "User is disabled"),
""));
}
if (authenticationException instanceof AccountExpiredException) {
return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.USER_EXPIRED, this.messages
.getMessage("AbstractUserDetailsAuthenticationProvider.expired", "User account has expired"), ""));
}
if (authenticationException instanceof CredentialsExpiredException) {
return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.CREDENTIALS_EXPIRED,
this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.credentialsExpired",
"User credentials have expired"),
""));
}
if (authenticationException instanceof ScopeException) {
return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodes.INVALID_SCOPE,
this.messages.getMessage("AbstractAccessDecisionManager.accessDenied", "invalid_scope"), ""));
}
log.error(authenticationException.getLocalizedMessage());
return new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR),
authenticationException.getLocalizedMessage(), authenticationException);
}
private OAuth2ClientAuthenticationToken getAuthenticatedClientElseThrowInvalidClient(
Authentication authentication) {
OAuth2ClientAuthenticationToken clientPrincipal = null;
if (OAuth2ClientAuthenticationToken.class.isAssignableFrom(authentication.getPrincipal().getClass())) {
clientPrincipal = (OAuth2ClientAuthenticationToken) authentication.getPrincipal();
}
if (clientPrincipal != null && clientPrincipal.isAuthenticated()) {
return clientPrincipal;
}
throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_CLIENT);
}
}
@@ -0,0 +1,61 @@
package com.pig4cloud.pigx.auth.support.base;
import lombok.Getter;
import org.springframework.lang.Nullable;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.core.AuthorizationGrantType;
import org.springframework.util.Assert;
import java.util.*;
/**
* @author lengleng
* @date 2022/6/2
*
* 自定义授权模式抽象
*/
public abstract class OAuth2ResourceOwnerBaseAuthenticationToken extends AbstractAuthenticationToken {
@Getter
private final AuthorizationGrantType authorizationGrantType;
@Getter
private final Authentication clientPrincipal;
@Getter
private final Set<String> scopes;
@Getter
private final Map<String, Object> additionalParameters;
public OAuth2ResourceOwnerBaseAuthenticationToken(AuthorizationGrantType authorizationGrantType,
Authentication clientPrincipal, @Nullable Set<String> scopes,
@Nullable Map<String, Object> additionalParameters) {
super(Collections.emptyList());
Assert.notNull(authorizationGrantType, "authorizationGrantType cannot be null");
Assert.notNull(clientPrincipal, "clientPrincipal cannot be null");
this.authorizationGrantType = authorizationGrantType;
this.clientPrincipal = clientPrincipal;
this.scopes = Collections.unmodifiableSet(scopes != null ? new HashSet<>(scopes) : Collections.emptySet());
this.additionalParameters = Collections.unmodifiableMap(
additionalParameters != null ? new HashMap<>(additionalParameters) : Collections.emptyMap());
}
/**
* 扩展模式一般不需要密码
*/
@Override
public Object getCredentials() {
return "";
}
/**
* 获取用户名
*/
@Override
public Object getPrincipal() {
return this.clientPrincipal;
}
}
@@ -0,0 +1,4 @@
/**
* 自定义认证模式接入的抽象实现
*/
package com.pig4cloud.pigx.auth.support.base;
@@ -0,0 +1,172 @@
package com.pig4cloud.pigx.auth.support.core;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.pig4cloud.pigx.common.core.constant.CacheConstants;
import com.pig4cloud.pigx.common.core.constant.CommonConstants;
import com.pig4cloud.pigx.common.core.constant.enums.CaptchaFlagTypeEnum;
import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum;
import com.pig4cloud.pigx.common.core.exception.ValidateCodeException;
import com.pig4cloud.pigx.common.core.util.MsgUtils;
import com.pig4cloud.pigx.common.data.cache.RedisUtils;
import com.pig4cloud.pigx.common.security.captcha.CaptchaResult;
import com.pig4cloud.pigx.common.security.captcha.CaptchaValidator;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
import org.springframework.security.web.savedrequest.RequestCache;
import org.springframework.security.web.savedrequest.SavedRequest;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* 授权登录验证码支持组件
*
* <p>
* 统一处理验证码开关判断、授权客户端解析和验证码校验,避免在多个过滤器和控制器中重复实现。
* </p>
*
* @author pig
* @date 2026-03-20
*/
@Component
@RequiredArgsConstructor
public class AuthCaptchaSupport {
private final RequestCache requestCache = new HttpSessionRequestCache();
private final CaptchaValidator captchaValidator;
/**
* 解析当前授权流程中的真实客户端ID
*
* @param request 当前请求
* @param response 当前响应
* @param includeCurrentRequestId 是否优先读取当前请求参数中的 client_id
* @return 授权客户端ID
*/
public String resolveAuthorizationClientId(HttpServletRequest request, HttpServletResponse response,
boolean includeCurrentRequestId) {
return resolveAuthorizationParameter(request, response, OAuth2ParameterNames.CLIENT_ID, includeCurrentRequestId);
}
/**
* 解析当前授权流程中的租户ID
*
* @param request 当前请求
* @param response 当前响应
* @param includeCurrentRequestId 是否优先读取当前请求参数中的租户ID
* @return 租户ID
*/
public String resolveAuthorizationTenantId(HttpServletRequest request, HttpServletResponse response,
boolean includeCurrentRequestId) {
return resolveAuthorizationParameter(request, response, CommonConstants.TENANT_ID, includeCurrentRequestId);
}
/**
* 判断客户端是否开启验证码
*
* @param tenantId 租户ID
* @param clientId 客户端ID
* @return true 开启验证码
*/
public boolean isCaptchaEnabled(String tenantId, String clientId) {
if (StrUtil.isBlank(clientId)) {
return true;
}
String finalTenantId = StrUtil.isBlank(tenantId) ? CommonConstants.TENANT_ID_1.toString() : tenantId;
String key = String.format("%s:%s:%s", finalTenantId, CacheConstants.CLIENT_FLAG, clientId);
String val = RedisUtils.get(key);
if (val == null) {
return true;
}
JSONObject information = JSONUtil.parseObj(val);
return !StrUtil.equals(CaptchaFlagTypeEnum.OFF.getType(), information.getStr(CommonConstants.CAPTCHA_FLAG));
}
/**
* 校验请求中的验证码
*
* @param request 当前请求
* @throws ValidateCodeException 验证码校验失败
*/
public void validateCode(HttpServletRequest request) throws ValidateCodeException {
String code = request.getParameter("code");
if (StrUtil.isBlank(code)) {
throw new ValidateCodeException(MsgUtils.getMessage(AuthErrorCodes.AUTH_CAPTCHA_EMPTY));
}
String randomStr = request.getParameter("randomStr");
boolean isBehavior = StrUtil.equalsAnyIgnoreCase(randomStr, CommonConstants.IMAGE_CODE_BLOCK_PUZZLE,
CommonConstants.IMAGE_CODE_CLICK_WORD);
String captchaType = isBehavior ? randomStr : CommonConstants.IMAGE_CODE_MATH;
String captchaVerification = isBehavior ? code
: randomStr + CommonConstants.CAPTCHA_VERIFICATION_SEPARATOR + code;
CaptchaResult result = captchaValidator.validate(captchaType, captchaVerification);
if (!result.isOk()) {
String errorCode = isBehavior ? AuthErrorCodes.AUTH_CAPTCHA_EMPTY : AuthErrorCodes.AUTH_CAPTCHA_INVALID;
throw new ValidateCodeException(MsgUtils.getMessage(errorCode));
}
}
/**
* 按完整类型前缀判断是否使用短信登录,不校验手机号格式或验证码。
*
* @param mobile 登录标识,格式为 {@code SMS@手机号} 或 {@code APP-SMS@手机号};允许为 null
* @return 匹配短信类型前缀时为 true;null、空串或其他类型返回 false
*/
public boolean isSmsLogin(String mobile) {
return StrUtil.startWith(mobile, LoginTypeEnum.SMS.getType() + StrUtil.AT)
|| StrUtil.startWith(mobile, LoginTypeEnum.APPSMS.getType() + StrUtil.AT);
}
/**
* 校验请求中的短信身份凭据,不接受图形或行为验证码作为替代。
* 类型合法且验证码非空时委托缓存校验;读取缓存后无论匹配与否均消费该验证码。
*
* @param request 非 null 请求,mobile 参数为 {@code SMS@手机号} 或
* {@code APP-SMS@手机号},code 参数为短信验证码
* @throws ValidateCodeException 验证码为空、登录类型不合法,或验证码不存在、过期、不匹配
*/
public void validateSmsCode(HttpServletRequest request) {
String mobile = request.getParameter("mobile");
String code = request.getParameter("code");
if (StrUtil.isBlank(code)) {
throw new ValidateCodeException(MsgUtils.getMessage(AuthErrorCodes.AUTH_CAPTCHA_EMPTY));
}
if (!isSmsLogin(mobile) || !captchaValidator.validateSms(mobile, code).isOk()) {
throw new ValidateCodeException(MsgUtils.getMessage(AuthErrorCodes.AUTH_CAPTCHA_INVALID));
}
}
private String resolveAuthorizationParameter(HttpServletRequest request, HttpServletResponse response,
String parameterName, boolean includeCurrentRequestId) {
if (includeCurrentRequestId) {
String parameterValue = request.getParameter(parameterName);
if (StrUtil.isNotBlank(parameterValue)) {
return parameterValue;
}
}
SavedRequest savedRequest = requestCache.getRequest(request, response);
if (Objects.isNull(savedRequest)) {
return null;
}
String[] parameterValues = savedRequest.getParameterValues(parameterName);
if (Objects.isNull(parameterValues) || parameterValues.length == 0) {
return null;
}
return parameterValues[0];
}
}
@@ -0,0 +1,18 @@
package com.pig4cloud.pigx.auth.support.core;
/**
* Auth 模块错误编码
*
* @author lengleng
* @date 2022/3/30
*/
public interface AuthErrorCodes {
// === 验证码相关 ===
String AUTH_CAPTCHA_EMPTY = "auth.captcha.empty";
String AUTH_CAPTCHA_INVALID = "auth.captcha.invalid";
// === 客户端相关 ===
String AUTH_CLIENT_INVALID = "auth.client.invalid";
}
Loaded 100 of 2629 files, more files were not shown because too many files have changed in this diff. Show more