diff --git a/.gitignore b/.gitignore
index 26a62dc..df985dc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,20 +1,29 @@
-# ---> Actionscript
-# Build and Release Folders
-bin-debug/
-bin-release/
-[Oo]bj/
-[Bb]in/
+# ---> Project
-# Other files and folders
+# logs
+**/logs/
+
+# ai
+.claude
+
+# ---> Maven
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+# ---> Eclipse
.settings/
+.project
+.classpath
-# Executables
-*.swf
-*.air
-*.ipa
-*.apk
-
-# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties`
-# should NOT be excluded as they contain compiler settings and other important
-# information for Eclipse / Flash Builder.
-
+# ---> Idea
+.idea/
+*.iml
\ No newline at end of file
diff --git a/README.md b/README.md
index 46fbb59..c06bf78 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,873 @@
-# xtools-app
+# xtools-app 项目设计文档
-低调大师工具箱,基础应用模块,适配JDK25
\ No newline at end of file
+## 一、功能和用途
+
+### 1.1 项目概述
+
+- **项目名称**:xtools-app
+- **项目版本**:1.0.0
+- **父POM**:org.xujun:xtools-parent-cloud:5.0.0
+- **项目定位**:基础应用平台,提供企业级应用开发的核心功能和公共模块,支持单体部署和微服务部署两种模式
+- **组织**:org.xujun
+
+#### 1.2 技术特点
+
+- 采用最新的 **JDK 25** 版本,充分利用新特性(ScopedValue、虚拟线程、Record等)
+- 基于 **Spring Boot 4.0.5** 构建,支持自动配置和快速开发
+- 集成 **Spring Cloud 2025.1.1** 微服务框架
+- 使用 **Spring Cloud Alibaba 2025.1.0.0** 微服务组件
+- 使用 **MyBatis-Plus 3.5.16** 简化数据访问层开发(基于 MyBatis 4.0.1)
+- 使用 **Spring Data Elasticsearch**(基于 Elasticsearch Client 9.2.6)实现日志存储和检索
+- 支持 **Nacos 3.1.1** 服务注册与发现、配置中心
+- 集成 **Sentinel 1.8.9** 实现流量控制和熔断降级
+- 使用 **Spring Data Redis**(基于 Lettuce 6.8.2)实现分布式缓存
+- 使用 **Spring AMQP 4.0.2**(RabbitMQ Client 5.27.1)实现异步消息处理
+- 支持 **Knife4j 4.5.0**(基于 SpringDoc OpenAPI 3.0.3)自动生成 API 文档
+- 使用 **Druid 1.2.28** 数据库连接池
+- 使用 **SM2/SM3** 国密算法保障密码和数据安全
+
+### 1.3 核心功能
+
+```mermaid
+graph TB
+ subgraph 系统管理模块
+ A1[用户管理
用户增删改查,角色分配,密码管理]
+ A2[角色管理
角色配置,权限分配,菜单分配]
+ A3[菜单管理
树形结构,动态加载,按钮权限]
+ A4[部门管理
树形结构,人员管理]
+ A5[字典管理
类型管理,字典项管理]
+ A6[日志管理
操作日志,登录日志,ES存储]
+ A7[通知管理
通知发布,用户通知,已读未读]
+ A8[任务管理
定时任务配置,任务监控]
+ A9[系统监控
服务器监控,JVM监控]
+ A10[JAR管理
JAR加载,JAR监控]
+ A11[文件管理
文件上传,S3存储]
+ A12[参数管理
系统参数配置]
+ A13[风控管理
IP限流,URI限流]
+ A14[地址管理
地址解析,IP归属]
+ end
+
+ subgraph 代码生成模块
+ B1[数据源管理
多数据源,连接测试]
+ B2[表结构管理
表查询,字段配置,同步]
+ B3[代码生成
参数配置,模板渲染,ZIP下载]
+ B4[代码预览
代码查看,多模板支持]
+ end
+
+ subgraph 公共模块
+ C1[缓存模块
Redis缓存,缓存枚举,AOP缓存]
+ C2[远程调用
OpenFeign,微服务通信]
+ C3[JAR管理
动态JAR加载,运行时扩展]
+ C4[日志总线
事件发布,MQ异步写入ES]
+ C5[日志过滤
请求拦截,操作日志采集]
+ C6[消息队列
RabbitMQ,异步处理,错误重试]
+ C7[任务调度
异步任务,定时任务,Redis分布式锁]
+ C8[限流模块
Sentinel集成,流量控制]
+ end
+
+ subgraph 监控模块
+ D1[监控服务端
Spring Boot Admin Server]
+ D2[监控客户端
Spring Boot Admin Client]
+ end
+```
+
+```mermaid
+mindmap
+ root((xtools-app
基础应用平台))
+ 系统管理
+ 用户管理
+ 增删改查
+ 角色分配
+ 密码管理
+ 状态管理
+ 角色管理
+ 角色配置
+ 权限分配
+ 菜单分配
+ 菜单管理
+ 树形结构
+ 动态加载
+ 按钮权限
+ 部门管理
+ 树形结构
+ 人员管理
+ 字典管理
+ 类型管理
+ 字典项管理
+ 日志管理
+ 操作日志
+ ES存储检索
+ 通知管理
+ 通知发布
+ 用户通知
+ 文件管理
+ 本地上传
+ S3存储
+ 风控管理
+ IP限流
+ URI限流
+ 代码生成
+ 数据源管理
+ 多数据源
+ 连接测试
+ 表结构管理
+ 表同步
+ 字段配置
+ 代码生成
+ Velocity模板
+ ZIP下载
+ 代码预览
+ 多模板预览
+ 公共模块
+ 缓存管理
+ Redis缓存
+ 缓存枚举
+ 远程调用
+ OpenFeign
+ 日志处理
+ 日志总线
+ 日志过滤
+ 消息队列
+ RabbitMQ
+ 任务调度
+ 异步任务
+ 定时任务
+```
+
+```mermaid
+graph LR
+ User[用户] --> Login[登录认证]
+ User --> Menu[菜单访问]
+ User --> Data[数据操作]
+
+ Login --> Auth[认证授权]
+ Auth --> Token[Token管理]
+ Auth --> Redis[Redis缓存]
+
+ Menu --> Perm[权限验证]
+ Role[角色] --> Perm
+
+ Data --> LogFilter[日志过滤器]
+ LogFilter --> LogBus[日志总线]
+ LogBus --> MQ[RabbitMQ]
+ MQ --> LogMq[日志消费者]
+ LogMq --> ES[Elasticsearch]
+
+ Cache[Redis缓存] --> Data
+
+ Gen[代码生成] --> DB[数据库]
+ Gen --> Velocity[Velocity模板]
+```
+
+## 二、项目结构设计
+
+### 2.1 整体架构
+
+```mermaid
+graph TD
+ xtools-app[xtools-app
基础应用平台
v1.0.0] --> common[xtools-app-common
公共模块]
+ xtools-app --> sys[xtools-app-sys
系统管理模块]
+ xtools-app --> gen[xtools-app-gen
代码生成模块]
+ xtools-app --> monitor[xtools-app-monitor
监控模块]
+ xtools-app --> standalone[xtools-app-standalone
单体部署模块]
+
+ common --> cache[common-cache
缓存模块]
+ common --> call[common-call
远程调用模块]
+ common --> jar[common-jar
JAR管理模块]
+ common --> job[common-job
任务调度模块]
+ common --> log[common-log
日志模块]
+ common --> mq[common-mq
消息队列模块]
+ common --> sentinel[common-sentinel
限流模块]
+ common --> task[common-task
异步任务模块]
+
+ log --> log-bus[log-bus
日志总线]
+ log --> log-filter[log-filter
日志过滤器]
+
+ sys --> sys-api[sys-api
系统API接口]
+ sys --> sys-auth[sys-auth
认证授权]
+ sys --> sys-biz[sys-biz
系统业务逻辑]
+ sys --> sys-boot[sys-boot
系统微服务启动]
+ sys --> sys-call[sys-call
系统远程调用]
+ sys --> sys-file[sys-file
文件管理]
+ sys --> sys-file-web[sys-file-web
文件Web服务]
+ sys --> sys-log-es[sys-log-bus-elasticsearch
日志ES存储]
+ sys --> sys-param[sys-param
系统参数]
+ sys --> sys-scheduled[sys-scheduled
定时任务]
+ sys --> sys-risk[sys-risk
风控管理]
+
+ gen --> gen-biz[gen-biz
代码生成业务]
+ gen --> gen-boot[gen-boot
代码生成微服务启动]
+
+ monitor --> monitor-boot[monitor-boot
监控服务端]
+ monitor --> monitor-client[monitor-client
监控客户端]
+```
+
+### 2.2 分层架构
+
+```mermaid
+flowchart TB
+ subgraph Controller层
+ A1[接收HTTP请求]
+ A2[参数验证
Valid]
+ A3[调用Service层]
+ A4[返回统一响应
Result]
+ end
+
+ subgraph Service层
+ B1[业务逻辑处理]
+ B2[事务控制
Transactional]
+ B3[调用Mapper层]
+ B4[缓存操作
Redis]
+ end
+
+ subgraph Mapper层
+ C1[MyBatis-Plus
BaseMapper]
+ C2[数据库访问]
+ C3[SQL执行]
+ end
+
+ subgraph 横切关注点
+ D1[AuthFilter
认证过滤器]
+ D2[LogBus
日志总线]
+ D3[Sentinel
流量控制]
+ D4[MqErrorHandle
消息错误处理]
+ end
+
+ A1 --> A2 --> A3 --> B1
+ B1 --> B2 --> B3 --> C1
+ C1 --> C2 --> C3
+
+ A1 -.-> D1
+ A1 -.-> D2
+ A1 -.-> D3
+ B1 -.-> D4
+```
+
+### 2.3 模块职责
+
+| 层级 | 模块 | 职责说明 |
+|------|------|----------|
+| **Controller层** | SysUserController、SysLoginController等 | 接收HTTP请求、参数验证(@Valid)、调用Service层、返回统一响应(Result) |
+| **Service层** | SysUserServiceImpl、SysLoginServiceImpl等 | 实现业务逻辑、事务控制(@Transactional)、调用Mapper层、缓存操作 |
+| **BaseService层** | SysUserBaseService等 | 继承MyBatis-Plus ServiceImpl,提供基础CRUD操作 |
+| **Mapper层** | SysUserMapper、SysRoleMapper等 | 继承MyBatis-Plus BaseMapper,数据库访问、SQL执行 |
+| **Entity层** | SysUser、SysRole、SysMenu等 | 数据库实体映射 |
+| **DTO层** | Req(请求)、Resp(响应)、Excel | 数据传输对象 |
+| **Convert层** | SysUserConvert、SysRoleConvert等 | MapStruct对象转换 |
+| **Config层** | SysConfig、ApiConfig等 | 配置类 |
+| **MQ层** | SysLogMq、SysTaskMq等 | 消息队列消费者 |
+| **Job层** | BaseJob、SysLogJob等 | 定时任务、异步任务 |
+| **Utils层** | PasswdUtils、AuthUtils等 | 工具类 |
+
+### 2.4 包结构设计
+
+```
+xtools.app.{module}
+├── controller # 控制器层
+├── service # 服务接口
+│ ├── base # 基础服务(继承ServiceImpl)
+│ └── impl # 服务实现
+├── mapper # 数据访问层
+├── model
+│ ├── entity # 实体类
+│ ├── dto
+│ │ ├── req # 请求DTO(AddReq、UpdateReq、PageReq)
+│ │ ├── resp # 响应DTO
+│ │ └── excel # Excel导入导出DTO
+│ └── vo # 视图对象
+├── convert # MapStruct转换器
+├── config # 配置类
+├── utils # 工具类
+├── mq # 消息队列处理
+├── job # 定时任务
+└── es # Elasticsearch相关
+```
+
+### 2.5 启动模块
+
+项目支持两种部署模式:
+
+| 模块 | 说明 |
+|------|------|
+| **xtools-app-standalone** | 单体部署模式,包含所有模块,通过 spring-boot-maven-plugin 打包为可执行JAR |
+| **xtools-app-sys-boot** | 微服务模式 - 系统管理服务 |
+| **xtools-app-gen-boot** | 微服务模式 - 代码生成服务 |
+| **xtools-app-monitor-boot** | 微服务模式 - 监控服务 |
+
+## 三、项目功能设计
+
+### 3.1 认证授权设计
+
+#### 认证流程
+
+```mermaid
+flowchart TD
+ A[用户请求登录] --> B[前端获取SM2公钥]
+ B --> C[用户输入账号密码
使用SM2公钥加密]
+ C --> D{验证验证码}
+ D -->|验证码已过期| E[返回验证码已过期]
+ D -->|验证码错误| F[返回验证码错误]
+ D -->|验证成功| G[后端SM2解密密码]
+ G --> H{查询账号}
+ H -->|账户不存在| I[返回账户不存在]
+ H -->|账户被禁用| J[返回账户被禁用]
+ H -->|账户正常| K{SM3密码比对}
+ K -->|密码错误| L[返回密码错误]
+ K -->|密码正确| M[查询用户角色]
+ M --> N[生成Token
缓存用户信息到Redis]
+ N --> O[返回TokenDto]
+```
+
+#### 验证码机制
+
+系统支持两种验证码模式(随机切换):
+- **GIF动态验证码**:基于 Easy Captcha 生成动态图片验证码
+- **算术验证码**:随机生成加减法算术题图片
+
+验证码通过 Redis 缓存(`AppCache.UID_CAPTCHA`,过期时间60秒)。
+
+#### RBAC权限模型
+
+```mermaid
+graph TD
+ User[用户 SysUser] -->|多对多| UserRole[用户角色关联
SysUserRole]
+ UserRole -->|多对多| Role[角色 SysRole]
+
+ Role -->|多对多| RoleMenu[角色菜单关联
SysRoleMenu]
+ RoleMenu -->|多对多| Menu[菜单权限 SysMenu]
+
+ Menu --> M1[页面菜单]
+ Menu --> M2[按钮权限]
+ Menu --> M3[接口权限]
+```
+
+#### 权限验证流程
+
+```mermaid
+flowchart TD
+ A[用户发起请求] --> B{判断请求类型}
+ B -->|微服务请求| C[验证Cloud Token]
+ B -->|常规请求| D[获取请求URI]
+
+ C --> C1{Token有效?}
+ C1 -->|无效| C2[返回UNAUTHORIZED]
+ C1 -->|有效| C3[传递头部信息]
+ C3 --> C4[校验掩码设置]
+ C4 --> C5[放行请求]
+
+ D --> D1{URI在权限白名单?}
+ D1 -->|是| D2[放行请求]
+ D1 -->|否| D3{获取UID}
+ D3 -->|UID为空| D4[返回METHOD_NOT_ALLOWED]
+ D3 -->|UID存在| D5{URI在登录白名单?}
+ D5 -->|是| D2
+ D5 -->|否| D6{验证AccessToken}
+ D6 -->|无效| D7[返回UNAUTHORIZED]
+ D6 -->|有效| D8{校验URI访问权限}
+ D8 -->|无权限| D9[返回FORBIDDEN]
+ D8 -->|有权限| D10[设置上下文信息]
+ D10 --> D11[校验掩码设置]
+ D11 --> D2
+```
+
+#### 认证模式
+
+系统支持两种认证模式,通过请求头 `Cloud` 标识区分:
+- **微服务认证**:验证 Cloud Token(一次性令牌,Redis Hash存储)
+- **常规认证**:验证 UID + AccessToken + URI权限
+
+### 3.2 日志管理设计
+
+#### 日志处理流程
+
+```mermaid
+flowchart LR
+ A[HTTP请求] --> B[LogFilter
日志过滤器]
+ B --> C[采集请求信息
URI,参数,IP,UserAgent]
+ C --> D[LogBus
日志总线]
+ D --> E[RabbitMQ
异步消息队列]
+ E --> F[SysLogMq
日志消费者]
+ F --> G[LogBusService
日志处理服务]
+ G --> H[Elasticsearch
日志存储]
+```
+
+#### 日志类型
+
+| 类型 | 说明 | 处理方式 |
+|------|------|----------|
+| 操作日志 | 用户操作行为记录 | LogFilter采集 -> MQ -> ES |
+| 系统日志 | 系统运行日志 | LogBus记录 -> MQ -> ES |
+| 任务日志 | 定时任务执行日志 | BaseJob记录 -> LogBus -> MQ -> ES |
+| 错误日志 | 异常和错误信息 | 异常捕获 -> LogBus -> MQ -> ES |
+
+#### 日志配置
+
+- **日志总线**:基于 `xtools-boot-log` 封装,支持通过 `LogBus.init()` 链式调用记录日志
+- **消息队列**:使用 RabbitMQ 异步处理,并发度配置为 5-10
+- **存储**:日志存储到 Elasticsearch,通过 `EsSysLogRepository` 和 `EsSysLogServiceImpl` 实现
+- **日志追踪**:使用 `LogTrackHolder`(基于 ScopedValue)实现日志链路追踪
+
+### 3.3 代码生成设计
+
+#### 代码生成流程
+
+```mermaid
+flowchart TD
+ A[配置数据源] --> B[测试连接]
+ B --> C[同步数据库]
+ C --> D{读取表信息}
+
+ D --> E[获取表列表
DatabaseMetaData]
+ E --> F[过滤排除表]
+ F --> G[生成表信息
GenTable]
+
+ G --> H[获取字段信息
DatabaseMetaData]
+ H --> I[处理字段类型
类型映射,表单类型]
+ I --> J[生成字段信息
GenTableColumn]
+
+ J --> K[保存到数据库]
+ K --> L{用户操作}
+
+ L -->|预览代码| M[Velocity渲染模板]
+ L -->|下载代码| N[Velocity渲染模板]
+ L -->|修改配置| O[保存表和字段配置]
+
+ M --> P[返回代码列表
GenCodeDto]
+ N --> Q[打包ZIP下载]
+```
+
+#### 模板引擎
+
+- 使用 **Apache Velocity 2.4.1** 模板引擎
+- 通过 `GenProperties` 配置模板路径和生成参数
+- 支持多种模板类型:Entity、Service、ServiceImpl、Mapper、Controller、Vue、TS API、SQL等
+- 支持微服务 API 模块生成(可配置开关 `openApi`)
+- 支持字典数据、脱敏数据等高级配置
+
+#### 代码生成特性
+
+| 特性 | 说明 |
+|------|------|
+| 多数据源 | 支持 MySQL 等多种数据库类型 |
+| 表结构同步 | 自动读取表和字段元数据 |
+| 智能类型映射 | 自动将数据库类型映射为 Java 类型 |
+| 表单类型推断 | 根据字段类型自动推断表单组件 |
+| 查询方式推断 | String类型默认LIKE,时间类型默认范围查询 |
+| 模板配置 | 可配置后端和前端项目名称、模块路径等 |
+| ZIP下载 | 生成的代码打包为ZIP文件下载 |
+
+### 3.4 任务调度设计
+
+#### 任务实现
+
+```mermaid
+flowchart TD
+ A[任务触发] --> B[BaseJob.run]
+ B --> C[初始化日志追踪
ScopedValue]
+ C --> D[获取Redis锁
tryLock]
+ D --> E{获取锁成功?}
+ E -->|否| F[记录日志:已存在]
+ E -->|是| G[执行runJob方法]
+ G --> H{执行成功?}
+ H -->|异常| I[记录错误日志]
+ H -->|成功| J[记录成功日志]
+ I --> K[释放锁
releaseLock]
+ J --> K
+```
+
+#### 任务类型
+
+| 类型 | 实现方式 | 说明 |
+|------|----------|------|
+| 异步任务 | `BaseJob implements Runnable` | 支持分布式锁,防止重复执行 |
+| XXL-JOB | `xtools-boot-job-xxl`(可选) | 分布式任务调度平台 |
+| 定时任务 | `SysScheduled` | Spring Task 定时任务管理 |
+| Spring任务 | `JobInterface.execute()` | Spring 原生任务执行接口 |
+
+#### 任务调度特性
+
+- **分布式锁**:使用 Redis `tryLock` / `releaseLock` 实现分布式锁,防止多实例重复执行
+- **日志追踪**:通过 `ScopedValue`(JDK 25特性)实现任务执行上下文传递
+- **异常处理**:任务执行异常自动记录错误日志
+- **超时控制**:支持自定义锁超时时间
+
+### 3.5 缓存设计
+
+#### 缓存策略
+
+| 缓存Key | 说明 | 过期时间 |
+|---------|------|----------|
+| `xtools-app:uid:{uid}:sm2` | SM2公钥缓存 | 5分钟 |
+| `xtools-app:uid:{uid}:captcha` | 验证码缓存 | 60秒 |
+| `xtools-app:auth:sys:user:{token}` | 用户认证信息 | 1小时 |
+| `xtools-app:auth:sys:uri` | 权限URI缓存 | 永不过期 |
+| `xtools-app:auth:cloud:token` | 微服务Token | 60秒 |
+| `xtools-app:mq:msg:err:{id}` | MQ消息错误次数 | 60秒 |
+| `xtools-app:lock:job:{className}` | 任务分布式锁 | 5分钟 |
+| `xtools-app:risk:ip:{ip}` | 风控IP | 永不过期 |
+| `xtools-app:risk:uri:{uri}` | 风控URI | 永不过期 |
+| `xtools-app:sys:cache:param:{key}` | 系统参数缓存 | 永不过期 |
+| `xtools-app:sys:cache:jar:{name}` | JAR包缓存 | 永不过期 |
+| `xtools-app:sys:cache:addr:{key}` | 地址缓存 | 1小时 |
+
+#### 缓存架构
+
+```mermaid
+graph TD
+ A[应用层] --> B[AppCache
缓存枚举]
+ B --> C[RedisService
Redis操作服务]
+
+ subgraph Redis缓存
+ D1[认证缓存
Token,用户信息]
+ D2[业务缓存
参数,地址,JAR]
+ D3[风控缓存
IP,URI限流]
+ D4[分布式锁
任务锁]
+ D5[临时数据
验证码,SM2密钥]
+ end
+
+ C --> D1
+ C --> D2
+ C --> D3
+ C --> D4
+ C --> D5
+```
+
+### 3.6 文件存储设计
+
+项目支持多种文件存储方式(通过 `xtools-app-standalone` 可选配置):
+
+| 存储方式 | 模块 | 说明 |
+|---------|------|------|
+| S3存储 | `xtools-boot-storage-s3` | 兼容S3协议的对象存储 |
+| 本地文件 | `xtools-boot-storage-file` | 本地文件系统存储(可选) |
+
+## 四、编码规范设计
+
+### 4.1 命名规范
+
+#### 类命名
+
+| 类型 | 命名规范 | 示例 |
+|------|----------|------|
+| 实体类 | `Sys` + 模块名 | `SysUser`、`SysRole`、`SysMenu` |
+| 请求DTO | 模块名 + `Req` | `SysUserAddReq`、`SysUserPageReq` |
+| 响应DTO | 模块名 + `Resp` | `GenTableInfoResp` |
+| Excel DTO | 模块名 + `Excel` | `SysDictExcel` |
+| Service接口 | 模块名 + `Service` | `SysUserService` |
+| Service实现 | 模块名 + `ServiceImpl` | `SysUserServiceImpl` |
+| Base Service | 模块名 + `BaseService` | `SysUserBaseService` |
+| Controller | 模块名 + `Controller` | `SysUserController` |
+| Mapper | 模块名 + `Mapper` | `SysUserMapper` |
+| 转换器 | 模块名 + `Convert` | `SysUserConvert` |
+| 工具类 | 功能名 + `Utils` | `PasswdUtils`、`AuthUtils` |
+| 配置类 | 功能名 + `Config` 或 `Properties` | `SysConfig`、`GenProperties` |
+
+#### 方法命名
+
+| 操作 | 命名规范 | 示例 |
+|------|----------|------|
+| 查询单个 | `getXxx` | `getUserInfo()` |
+| 分页查询 | `pageXxx` | `pageSysUser()` |
+| 新增 | `addXxx` / `saveXxx` | `addSysUser()` |
+| 修改 | `updateXxx` / `editXxx` | `editUserInfo()` |
+| 删除 | `delXxx` / `deleteXxx` | `delSysUser()` |
+| 统计 | `countXxx` | — |
+
+### 4.2 注释规范
+
+#### 类注释格式
+
+```java
+/**
+ *
Title : 类名称
+ *Description : 类描述
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/31 21:18 + */ +``` + +#### 方法注释格式 + +```java +/** + * 方法描述 + * + * @param param 参数说明 + * @return 返回值说明 + */ +``` + +#### 常量注释格式 + +```java +/** + * 微服务标识 + */ +private static final String CLOUD_FLAG = String.valueOf(Boolean.TRUE); +``` + +### 4.3 代码风格 + +- **Lombok**:使用 `@RequiredArgsConstructor` 构造器注入,减少样板代码 +- **MapStruct**:使用接口定义对象转换器,编译时自动生成实现 +- **MyBatis-Plus**:继承 `ServiceImpl` 和 `BaseMapper`,简化CRUD操作 +- **依赖注入**:使用 `@RequiredArgsConstructor` + `final` 字段(构造器注入)和 `@Resource`(特殊场景) +- **统一返回**:使用 `ResultTitle : RedisServiceAop
+ *Description : RedisServiceAop
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/11 14:07 + */ +@Aspect +@Component +public class RedisServiceAop { + + /** + * 方法切面 + */ + @Pointcut("execution(* xtools.boot.cache.redis.base.RedisService.*(..))") + public void methods() { + } + + /** + * 调用记录 + * + * @param joinPoint 切点 + * @return 调用结果 + * @throws Throwable 异常信息 + */ + @Around("methods()") + public Object logMethodCall(ProceedingJoinPoint joinPoint) throws Throwable { + LogTrack logTrack = LogTrackHolder.getDefNull(); + if (Objects.isNull(logTrack)) { + return joinPoint.proceed(); + } + long startTime = System.currentTimeMillis(); + String method = joinPoint.getSignature().getName(); + Object[] args = joinPoint.getArgs(); + Exception err = null; + Object result = null; + try { + result = joinPoint.proceed(); + return result; + } catch (Exception e) { + err = e; + throw e; + } finally { + long endTime = System.currentTimeMillis(); + JSONObject logData = JSONObject.of("method", method, "args", args, "result", result, "execTime", endTime - startTime); + LogBus.init(err == null ? LogLevel.INFO : LogLevel.ERROR, LogBusBaseType.REDIS, logTrack) + .data(logData) + .error(err) + .save(); + } + } + +} diff --git a/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java b/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java new file mode 100644 index 0000000..dfbffc9 --- /dev/null +++ b/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java @@ -0,0 +1,107 @@ +package xtools.app.common.cache.enums; + +import xtools.boot.cache.redis.enums.BaseCacheEnum; +import xtools.core.extend.TemplateUtils; + +/** + *Title : AppCache
+ *Description : AppCache
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/4 16:27 + */ +public enum AppCache implements BaseCacheEnum { + + // uid加密SM2 + UID_SM2("uid:{}:sm2", 5 * 60L), + // uid验证码 + UID_CAPTCHA("uid:{}:captcha", 60L), + + // SYS 授权用户信息 + AUTH_SYS_USER("auth:sys:user:", 60 * 60L), + // SYS 授权 URI + AUTH_SYS_URI("auth:sys:uri", -1L), + // CLOUD 授权 TOKEN + AUTH_CLOUD_TOKEN("auth:cloud:token", 60L), + + // MQ消息错误次数 + MQ_MSG_ERR_COUNT("mq:msg:err:", 60L), + + // JOB锁 + LOCK_JOB("lock:job:", 5 * 60L), + + // 风控IP + RISK_IP("risk:ip:", -1L), + // 风控URI + RISK_URI("risk:uri:", -1L), + + // 系统参数缓存 + SYS_CACHE_PARAM("sys:cache:param:", -1L), + // 系统JAR包缓存 + SYS_CACHE_JAR("sys:cache:jar:", -1L), + // 地址缓存 + SYS_CACHE_ADDR("sys:cache:addr:", 60 * 60L), + // 天气缓存 + SYS_CACHE_HOME_WEATHER("sys:cache:home:weather:", 30 * 60L), + ; + + /** + * 系统缓存前缀 + */ + private final static String SYS_CACHE_PREFIX = "xtools-app:"; + + /** + * key + */ + private final String key; + + /** + * 超时时间 + */ + private final Long expireTime; + + /** + * 构造方法 + * + * @param key 缓存 key + * @param expireTime 过期时间 + */ + AppCache(String key, Long expireTime) { + this.key = key; + this.expireTime = expireTime; + } + + /** + * 获取缓存 key + * + * @param param 参数 + * @return 缓存 key + */ + public String key(Object... param) { + return SYS_CACHE_PREFIX + TemplateUtils.format(key, param); + } + + /** + * 获取缓存 key + * + * @return 缓存 key + */ + @Override + public String key() { + return SYS_CACHE_PREFIX + key; + } + + /** + * 获取缓存过期时间 + * + * @return 缓存过期时间 + */ + @Override + public Long expireTime() { + return expireTime; + } +} diff --git a/xtools-app-common/xtools-app-common-call/pom.xml b/xtools-app-common/xtools-app-common-call/pom.xml new file mode 100644 index 0000000..6f4dee9 --- /dev/null +++ b/xtools-app-common/xtools-app-common-call/pom.xml @@ -0,0 +1,31 @@ + +Title : SysCallInterceptor
+ *Description : SysCallInterceptor
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/27 14:55 + */ +@Component +public class SysCallInterceptor implements CallInterceptor, BaseParams { + + /** + * 缓存参数 + */ + private static final AppCache CACHE_PARAM = AppCache.AUTH_CLOUD_TOKEN; + + @Resource + private RedisService redisService; + + /** + * 请求之前 + * + * @param request 请求 + */ + @Override + public void before(@NonNull HttpRequest request) { + // 设置微服务认证信息 + setCloudToken(request); + MapTitle : InitJar
+ *Description : InitJar
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/2 14:13 + */ +@Component +@Order(BaseParams.CP_NUM200) +public class InitJar implements ApplicationRunner { + + /** + * 应用名称 + */ + @Value("${spring.application.name:xtools-app}") + private String name; + + @Resource + private RedisService redisService; + + + @Override + public void run(@NonNull ApplicationArguments args) { + ScopedValue.where(LogTrackHolder.getScoped(), LogTrackHolder.newMain()).run(() -> { + try { + init(); + } catch (Exception e) { + LogBus.init(LogLevel.ERROR, LogBusBaseType.OTHER).title("初始化Jar异常").error(e).save(); + } + }); + + } + + /** + * 初始化 + */ + private void init() { + ListTitle : RunJarUtils
+ *Description : RunJarUtils
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/18 21:11 + */ +public class RunJarUtils implements BaseParams { + + /** + * 缓存参数 + */ + private static final AppCache CACHE_PARAM = AppCache.SYS_CACHE_JAR; + + /** + * 获取运行中的Jar + */ + public static ListTitle : BaseJob
+ *Description : BaseJob
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/23 17:36 + */ +public abstract class BaseJob implements Runnable, BaseParams, JobInterface { + + /** + * 锁参数 + */ + private static final AppCache LOCK_PARAM = AppCache.LOCK_JOB; + + /** + * 运行作业 + */ + @Override + public void run() { + ScopedValue.where(LogTrackHolder.getScoped(), LogTrackHolder.newMain()).run(this::exec); + } + + /** + * 执行作业 + */ + private void exec() { + // 获取执行的class名称 + String className = getClass().getSimpleName(); + // 标题 + String title = "[" + className + "]"; + // 获取本次作业名称 + String jobName = null; + // 获取redis服务 + RedisService redisService = null; + // 锁 + boolean locked = false; + try { + // 记录日志 + LogBus.init(LogLevel.INFO, LogBusBaseType.JOB).title(title + "开始执行").save(); + + jobName = className + CP_LINE + InstantUtils.format(Instant.now(), "yyyyMMddHHmmssSSS") + CP_LINE + UuidUtils.get(); + redisService = RedisUtils.get(); + // 获取超时时间 + Long expireTime = expireTime(); + if (!CheckUtils.id(expireTime)) { + expireTime = LOCK_PARAM.expireTime(); + } + // 加锁 + locked = redisService.tryLock(LOCK_PARAM.key() + className, jobName, expireTime); + if (!locked) { + LogBus.init(LogLevel.INFO, LogBusBaseType.JOB).title(title + "已存在").save(); + return; + } + + runJob(); + } catch (Exception e) { + LogBus.init(LogLevel.ERROR, LogBusBaseType.JOB).title(title + "运行异常").error(e).save(); + } finally { + if (Objects.nonNull(redisService) && locked) { + boolean released = redisService.releaseLock(LOCK_PARAM.key() + className, jobName); + if (!released) { + LogBus.init(LogLevel.ERROR, LogBusBaseType.JOB).title(title + "锁释放异常").save(); + } else { + LogBus.init(LogLevel.INFO, LogBusBaseType.JOB).title(title + "执行成功").save(); + } + } + } + } + + /** + * 执行任务 + */ + @Override + public void execute() { + // 标题 + String title = "[" + getClass().getSimpleName() + "]"; + ScopedValue.where(LogTrackHolder.getScoped(), LogTrackHolder.newMain()).run(() -> { + Exception e = null; + try { + // 记录日志 + LogBus.init(LogLevel.INFO, LogBusBaseType.JOB).title(title + "开始执行").save(); + runJob(); + } catch (Exception ex) { + e = ex; + } finally { + if (Objects.nonNull(e)) { + LogBus.init(LogLevel.ERROR, LogBusBaseType.JOB).title(title + "运行异常").error(e).save(); + } else { + LogBus.init(LogLevel.INFO, LogBusBaseType.JOB).title(title + "执行成功").save(); + } + } + }); + } + + /** + * 获取锁超时时间 + * + * @return 锁超时时间 + */ + public Long expireTime() { + return null; + } + + /** + * 运行作业 + * + * @throws Exception 运行异常 + */ + public abstract void runJob() throws Exception; + +} diff --git a/xtools-app-common/xtools-app-common-log/pom.xml b/xtools-app-common/xtools-app-common-log/pom.xml new file mode 100644 index 0000000..4f2559e --- /dev/null +++ b/xtools-app-common/xtools-app-common-log/pom.xml @@ -0,0 +1,20 @@ + +Title : SysLogType
+ *Description : SysLogType
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/3 11:26 + */ +public enum SysLogType implements LogBusType { + + ; + + /** + * 编码 + **/ + private final int code; + + /** + * 说明 + **/ + private final String desc; + + /** + * 初始化方法 + * + * @param code Code + * @param desc 说明 + */ + SysLogType(int code, String desc) { + this.code = code; + this.desc = desc; + } + + /** + * 获取所有枚举 + * + * @return 所有枚举 + */ + @Override + public BaseEnum[] all() { + return values(); + } + + /** + * 获取枚举编码 + * + * @return 枚举编码 + */ + @Override + public int code() { + return code + BASE_CODE; + } + + /** + * 获取枚举说明 + * + * @return 枚举说明 + */ + @Override + public String desc() { + return desc; + } +} diff --git a/xtools-app-common/xtools-app-common-log/xtools-app-common-log-bus/src/main/java/xtools/app/common/log/bus/handle/LogBusHandle.java b/xtools-app-common/xtools-app-common-log/xtools-app-common-log-bus/src/main/java/xtools/app/common/log/bus/handle/LogBusHandle.java new file mode 100644 index 0000000..ba81044 --- /dev/null +++ b/xtools-app-common/xtools-app-common-log/xtools-app-common-log-bus/src/main/java/xtools/app/common/log/bus/handle/LogBusHandle.java @@ -0,0 +1,54 @@ +package xtools.app.common.log.bus.handle; + +import org.springframework.stereotype.Component; +import xtools.app.common.log.bus.service.LogBusService; +import xtools.app.common.mq.enums.RabbitMqEnums; +import xtools.boot.core.utils.SpringContextUtils; +import xtools.boot.log.interfaces.LogBusInterface; +import xtools.boot.log.model.dto.LogBody; +import xtools.boot.mq.base.utils.MqBus; + +import java.util.Objects; + +/** + *Title : LogBusHandle
+ *Description : LogBusHandle
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/3 17:01 + */ +@Component +public class LogBusHandle implements LogBusInterface { + + /** + * 日志服务 + */ + private static LogBusService logBusService; + + /** + * 是否使用本地服务 + */ + private static Boolean localService; + + /** + * 保存日志 + * + * @param logBody 日志 + */ + @Override + public void save(LogBody logBody) { + if (Objects.isNull(localService)) { + logBusService = SpringContextUtils.getBeanDefNull(LogBusService.class); + localService = Objects.nonNull(logBusService); + } + if (localService) { + logBusService.saveLog(logBody); + } else { + MqBus.push(RabbitMqEnums.SYS_LOG, logBody); + } + } +} diff --git a/xtools-app-common/xtools-app-common-log/xtools-app-common-log-bus/src/main/java/xtools/app/common/log/bus/service/LogBusService.java b/xtools-app-common/xtools-app-common-log/xtools-app-common-log-bus/src/main/java/xtools/app/common/log/bus/service/LogBusService.java new file mode 100644 index 0000000..5786279 --- /dev/null +++ b/xtools-app-common/xtools-app-common-log/xtools-app-common-log-bus/src/main/java/xtools/app/common/log/bus/service/LogBusService.java @@ -0,0 +1,25 @@ +package xtools.app.common.log.bus.service; + +import xtools.boot.log.model.dto.LogBody; + +/** + *Title : LogBusService
+ *Description : LogBusService
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/7 19:41 + */ +public interface LogBusService { + + /** + * 保存日志 + * + * @param logBody 日志 + */ + void saveLog(LogBody logBody); + +} diff --git a/xtools-app-common/xtools-app-common-log/xtools-app-common-log-filter/pom.xml b/xtools-app-common/xtools-app-common-log/xtools-app-common-log-filter/pom.xml new file mode 100644 index 0000000..0758738 --- /dev/null +++ b/xtools-app-common/xtools-app-common-log/xtools-app-common-log-filter/pom.xml @@ -0,0 +1,48 @@ + +Title : HttpLogFilter
+ *Description : HttpLogFilter
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/6 16:37 + */ +@Component +public class HttpLogFilter extends BaseFilter implements Ordered, BaseParams { + + /** + * 日志白名单 + */ + private static final SetTitle : HttpLogWhitelist
+ *Description : HttpLogWhitelist
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/4/2 14:36 + */ +public interface HttpLogWhitelist { + + /** + * 添加日志白名单 + * + * @return 日志白名单 + */ + default SetTitle : RabbitMqEnums
+ *Description : RabbitMqEnums
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/5 16:46 + */ +public enum RabbitMqEnums implements MqEnums { + + // 系统日志 + SYS_LOG("sys.log", false), + // 系统任务 + SYS_TASK("sys.task", true), + ; + + /** + * 队列名称 + */ + private final String queue; + + /** + * 是否保存日志 + */ + private final boolean saveLog; + + /** + * 构造方法 + * + * @param queue 队列名称 + * @param saveLog 是否保存日志 + */ + RabbitMqEnums(String queue, boolean saveLog) { + this.queue = queue; + this.saveLog = saveLog; + } + + /** + * 获取队列名称 + * + * @return 队列名称 + */ + @Override + public String queue() { + return queue; + } + + /** + * 是否保存日志 + * + * @return 是否保存日志 + */ + @Override + public boolean saveLog() { + return saveLog; + } + +} diff --git a/xtools-app-common/xtools-app-common-mq/src/main/java/xtools/app/common/mq/handle/MqErrorHandle.java b/xtools-app-common/xtools-app-common-mq/src/main/java/xtools/app/common/mq/handle/MqErrorHandle.java new file mode 100644 index 0000000..a703049 --- /dev/null +++ b/xtools-app-common/xtools-app-common-mq/src/main/java/xtools/app/common/mq/handle/MqErrorHandle.java @@ -0,0 +1,57 @@ +package xtools.app.common.mq.handle; + +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import xtools.app.common.cache.enums.AppCache; +import xtools.base.config.BaseParams; +import xtools.boot.cache.redis.base.RedisService; +import xtools.boot.mq.base.handle.BaseErrorHandle; +import xtools.extend.encrypt.Sm3Utils; + +/** + *Title : MqErrorHandle
+ *Description : MqErrorHandle
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/12 10:53 + */ +@Slf4j +@Component +public class MqErrorHandle implements BaseErrorHandle, BaseParams { + + /** + * 缓存参数 + */ + private static final AppCache CACHE_PARAM = AppCache.MQ_MSG_ERR_COUNT; + + @Resource + private RedisService redisService; + + /** + * 消息处理错误异常(需要消息队列重推消息,抛出异常即可) + * + * @param message 消息内容 + * @param exception 异常信息 + */ + @Override + public void messageHandle(String message, Exception exception) { + String cacheKey = CACHE_PARAM.key() + Sm3Utils.encryptToString(message); + Long incr = redisService.incr(cacheKey); + redisService.expire(cacheKey, CACHE_PARAM.expireTime()); + if (incr >= CP_NUM3) { + redisService.del(cacheKey); + } else { + try { + Thread.sleep(CP_NUM1000); + } catch (InterruptedException e) { + log.error("消息处理异常,等待失败", e); + } + throw new RuntimeException(exception); + } + } +} diff --git a/xtools-app-common/xtools-app-common-sentinel/pom.xml b/xtools-app-common/xtools-app-common-sentinel/pom.xml new file mode 100644 index 0000000..42bf463 --- /dev/null +++ b/xtools-app-common/xtools-app-common-sentinel/pom.xml @@ -0,0 +1,45 @@ + +Title : SysBlockExceptionHandler
+ *Description : SysBlockExceptionHandler
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : Windows11
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/4/14 21:54 + */ +@Component +public class SysBlockExceptionHandler implements CustomBlockExceptionHandler { + + /** + * 自定义Sentinel阻塞异常处理器 + * + * @param request HttpServletRequest + * @param response HttpServletResponse + * @param resourceName 资源名称 + * @param e BlockException + * @return 是否默认写出提示信息 + */ + @Override + public boolean handle( + HttpServletRequest request, + HttpServletResponse response, + String resourceName, + BlockException e + ) { + // 日志数据 + JSONObject log = new JSONObject(); + // IP + log.put("ip", HeaderUtils.getIp(request)); + // URI + log.put("uri", HeaderUtils.getAllUri(request)); + // 用户标识 + log.put("userAgent", HeaderUtils.getUserAgent(request)); + // 请求参数 + log.put("params", HeaderUtils.getParams(request)); + // 请求来源 + log.put("referer", HeaderUtils.getReferer(request)); + // 规则数据 + log.put("rule", e.getRule()); + // 保存日志 + LogBus.init(LogLevel.WARN, LogBusBaseType.SENTINEL).error(e).data(log).save(); + return true; + } +} diff --git a/xtools-app-common/xtools-app-common-task/pom.xml b/xtools-app-common/xtools-app-common-task/pom.xml new file mode 100644 index 0000000..47eaca0 --- /dev/null +++ b/xtools-app-common/xtools-app-common-task/pom.xml @@ -0,0 +1,31 @@ + +Title : TaskType
+ *Description : TaskType
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/15 10:29 + */ +public enum TaskType implements BaseTaskType { + + // 其他任务 + OTHER(10, "其他任务"), + // 删除系统日志 + DEL_SYS_LOG(20, "删除系统日志"), + // 删除系统文件 + DEL_SYS_FILE(30, "删除系统文件"), + ; + + /** + * 编码 + */ + private final int code; + + /** + * 说明 + */ + private final String desc; + + /** + * 初始化方法 + * + * @param code Code + * @param desc 说明 + */ + TaskType(int code, String desc) { + this.code = code; + this.desc = desc; + } + + /** + * 判断枚举值类型 + * + * @param code 枚举值 + * @return 枚举值类型 + */ + public static TaskType valueOf(int code) { + for (TaskType type : values()) { + if (type.code == code) { + return type; + } + } + throw new IllegalArgumentException("unknown code, code=" + code); + } + + /** + * 获取所有枚举 + * + * @return 所有枚举 + */ + @Override + public BaseEnum[] all() { + return values(); + } + + /** + * 获取枚举编码 + * + * @return 枚举编码 + */ + @Override + public int code() { + return code; + } + + /** + * 获取枚举说明 + * + * @return 枚举说明 + */ + @Override + public String desc() { + return desc; + } + +} diff --git a/xtools-app-common/xtools-app-common-task/src/main/java/xtools/app/common/task/handle/TaskBusHandle.java b/xtools-app-common/xtools-app-common-task/src/main/java/xtools/app/common/task/handle/TaskBusHandle.java new file mode 100644 index 0000000..aa45fdc --- /dev/null +++ b/xtools-app-common/xtools-app-common-task/src/main/java/xtools/app/common/task/handle/TaskBusHandle.java @@ -0,0 +1,32 @@ +package xtools.app.common.task.handle; + +import org.springframework.stereotype.Component; +import xtools.app.common.mq.enums.RabbitMqEnums; +import xtools.boot.mq.base.utils.MqBus; +import xtools.boot.task.interfaces.TaskBusInterface; +import xtools.boot.task.model.dto.TaskInfo; + +/** + *Title : TaskBusHandle
+ *Description : TaskBusHandle
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/15 10:31 + */ +@Component +public class TaskBusHandle implements TaskBusInterface { + + /** + * 保存任务 + * + * @param taskInfo 任务 + */ + @Override + public void save(TaskInfo taskInfo) { + MqBus.push(RabbitMqEnums.SYS_TASK, taskInfo); + } +} diff --git a/xtools-app-gen/pom.xml b/xtools-app-gen/pom.xml new file mode 100644 index 0000000..19a8556 --- /dev/null +++ b/xtools-app-gen/pom.xml @@ -0,0 +1,20 @@ + +Title : GenProperties
+ *Description : 代码生成配置属性
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/20 08:43 + */ +@Data +@Component +@ConfigurationProperties(prefix = "gen") +public class GenProperties { + + + /** + * 后端应用名 + */ + private String backendAppName; + + /** + * 前端应用名 + */ + private String frontendAppName; + + /** + * 下载文件名 + */ + private String downloadFileName; + + /** + * 排除数据表 + */ + private ListTitle : VelocityConfig
+ *Description : VelocityConfig
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/20 10:22 + */ +@Configuration +public class VelocityConfig { + + /** + * 创建 VelocityEngine 实例 + * + * @return VelocityEngine 实例 + */ + @Bean + public VelocityEngine velocityEngine() { + Properties properties = new Properties(); + + properties.setProperty("resource.loaders", "class"); + properties.setProperty("resource.loader.class.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + properties.setProperty("resource.default_encoding", "UTF-8"); + properties.setProperty("output.encoding", "UTF-8"); + + VelocityEngine velocityEngine = new VelocityEngine(); + velocityEngine.init(properties); + return velocityEngine; + } + +} diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/controller/GenDatasourceController.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/controller/GenDatasourceController.java new file mode 100644 index 0000000..94a5ee1 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/controller/GenDatasourceController.java @@ -0,0 +1,107 @@ +package xtools.app.gen.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import xtools.app.gen.model.dto.req.GenDatasourceAddReq; +import xtools.app.gen.model.dto.req.GenDatasourcePageReq; +import xtools.app.gen.model.dto.req.GenDatasourceUpdateReq; +import xtools.app.gen.model.dto.resp.GenDatasourceResp; +import xtools.app.gen.service.GenDatasourceService; +import xtools.app.gen.service.GenService; +import xtools.boot.api.model.dto.Result; +import xtools.boot.api.model.dto.page.PageReq; +import xtools.boot.api.model.dto.page.PageResp; +import xtools.boot.api.model.dto.req.IdListReq; + +/** + *Title : GenDatasourceController
+ *Description : GenDatasourceController
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/17 13:33 + */ +@Tag(name = "代码生成-数据源模块") +@RestController +@RequiredArgsConstructor +@RequestMapping("/gen/datasource") +public class GenDatasourceController { + + private final GenDatasourceService genDatasourceService; + + private final GenService genService; + + @Operation(summary = "分页请求") + @PostMapping("page") + public ResultTitle : GenTableColumnController
+ *Description : 代码生成字段配置表模块
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 11:20 + */ +@Tag(name = "代码生成-字段信息模块") +@RestController +@RequiredArgsConstructor +@RequestMapping("/gen/table-column") +public class GenTableColumnController { + + private final GenTableColumnService genTableColumnService; + + @Operation(summary = "分页请求") + @PostMapping("page") + public ResultTitle : GenTableController
+ *Description : 代码生成配置表模块
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 10:30 + */ +@Tag(name = "代码生成-表信息模块") +@RestController +@RequiredArgsConstructor +@RequestMapping("/gen/table") +public class GenTableController { + + private final GenService genService; + + private final GenTableService genTableService; + + @Operation(summary = "分页请求") + @PostMapping("page") + public ResultTitle : GenTableConvert
+ *Description : GenTableConvert
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 10:10 + */ +@Mapper(componentModel = "spring") +public interface GenConvert { + + /** + * 表格列表转表格信息列表 + * + * @param genTableList 表格列表 + * @return 表格信息列表 + */ + ListTitle : GenDatasourceConvert
+ *Description : GenDatasourceConvert
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/17 13:30 + */ +@Mapper(componentModel = "spring") +public interface GenDatasourceConvert { + + /** + * 添加请求转实体 + * + * @param req 添加请求 + * @return 实体 + */ + GenDatasource addReqToEntity(GenDatasourceAddReq req); + + /** + * 修改请求转实体 + * + * @param req 修改请求 + * @return 实体 + */ + GenDatasource updateReqToEntity(GenDatasourceUpdateReq req); + + /** + * 实体转响应 + * + * @param data 实体 + * @return 响应 + */ + GenDatasourceResp entityToResp(GenDatasource data); + + /** + * 批量实体转响应 + * + * @param dataList 批量实体 + * @return 响应 + */ + ListTitle : GenTableColumnConvert
+ *Description : GenTableColumnConvert
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 10:55 + */ +@Mapper(componentModel = "spring") +public interface GenTableColumnConvert { + + /** + * 添加请求转实体 + * + * @param req 添加请求 + * @return 实体 + */ + GenTableColumn addReqToEntity(GenTableColumnAddReq req); + + /** + * 修改请求转实体 + * + * @param req 修改请求 + * @return 实体 + */ + GenTableColumn updateReqToEntity(GenTableColumnUpdateReq req); + + /** + * 实体转响应 + * + * @param data 实体 + * @return 响应 + */ + GenTableColumnResp entityToResp(GenTableColumn data); + + /** + * 批量实体转响应 + * + * @param dataList 批量实体 + * @return 响应 + */ + ListTitle : GenTableConvert
+ *Description : GenTableConvert
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 10:10 + */ +@Mapper(componentModel = "spring") +public interface GenTableConvert { + + /** + * 添加请求转实体 + * + * @param req 添加请求 + * @return 实体 + */ + GenTable addReqToEntity(GenTableAddReq req); + + /** + * 修改请求转实体 + * + * @param req 修改请求 + * @return 实体 + */ + GenTable updateReqToEntity(GenTableUpdateReq req); + + /** + * 实体转响应 + * + * @param data 实体 + * @return 响应 + */ + GenTableResp entityToResp(GenTable data); + + /** + * 批量实体转响应 + * + * @param dataList 批量实体 + * @return 响应 + */ + ListTitle : GenError
+ *Description : GenError
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2025/12/23 16:53 + */ +public enum FormTypeEnum implements BaseEnum { + + /** + * 输入框 + */ + INPUT(1, "输入框"), + + /** + * 下拉框 + */ + SELECT(2, "下拉框"), + + /** + * 单选框 + */ + RADIO(3, "单选框"), + + /** + * 复选框 + */ + CHECK_BOX(4, "复选框"), + + /** + * 数字输入框 + */ + INPUT_NUMBER(5, "数字输入框"), + + /** + * 开关 + */ + SWITCH(6, "开关"), + + /** + * 文本域 + */ + TEXT_AREA(7, "文本域"), + + /** + * 日期时间框 + */ + DATE(8, "日期框"), + + /** + * 日期框 + */ + DATE_TIME(9, "日期时间框"), + + /** + * 隐藏域 + */ + HIDDEN(10, "隐藏域"); + + /** + * 编码 + **/ + private final int code; + + /** + * 说明 + **/ + private final String desc; + + /** + * 初始化方法 + * + * @param code Code + * @param desc 说明 + */ + FormTypeEnum(int code, String desc) { + this.code = code; + this.desc = desc; + } + + /** + * 获取所有枚举 + * + * @return 所有枚举 + */ + @Override + public BaseEnum[] all() { + return values(); + } + + /** + * 获取枚举编码 + * + * @return 枚举编码 + */ + @Override + public int code() { + return code; + } + + /** + * 获取枚举说明 + * + * @return 枚举说明 + */ + @Override + public String desc() { + return desc; + } +} diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/enums/QueryTypeEnum.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/enums/QueryTypeEnum.java new file mode 100644 index 0000000..0050eb8 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/enums/QueryTypeEnum.java @@ -0,0 +1,128 @@ +package xtools.app.gen.enums; + +import xtools.boot.api.enums.BaseEnum; + +/** + *Title : GenError
+ *Description : GenError
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2025/12/23 16:53 + */ +public enum QueryTypeEnum implements BaseEnum { + + /** + * 等于 + */ + EQ(1, "="), + + /** + * 模糊匹配 + */ + LIKE(2, "LIKE '%s%'"), + + /** + * 包含 + */ + IN(3, "IN"), + + /** + * 范围 + */ + BETWEEN(4, "BETWEEN"), + + /** + * 大于 + */ + GT(5, ">"), + + /** + * 大于等于 + */ + GE(6, ">="), + + /** + * 小于 + */ + LT(7, "<"), + + /** + * 小于等于 + */ + LE(8, "<="), + + /** + * 不等于 + */ + NE(9, "!="), + + /** + * 左模糊匹配 + */ + LIKE_LEFT(10, "LIKE '%s'"), + + /** + * 右模糊匹配 + */ + LIKE_RIGHT(11, "LIKE 's%'"), + + /** + * 时间范围 + */ + TIME_RANGE(12, "utils"); + + /** + * 编码 + **/ + private final int code; + + /** + * 说明 + **/ + private final String desc; + + /** + * 初始化方法 + * + * @param code Code + * @param desc 说明 + */ + QueryTypeEnum(int code, String desc) { + this.code = code; + this.desc = desc; + } + + /** + * 获取所有枚举 + * + * @return 所有枚举 + */ + @Override + public BaseEnum[] all() { + return values(); + } + + /** + * 获取枚举编码 + * + * @return 枚举编码 + */ + @Override + public int code() { + return code; + } + + /** + * 获取枚举说明 + * + * @return 枚举说明 + */ + @Override + public String desc() { + return desc; + } +} diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/mapper/GenDatasourceMapper.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/mapper/GenDatasourceMapper.java new file mode 100644 index 0000000..df1a9b1 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/mapper/GenDatasourceMapper.java @@ -0,0 +1,20 @@ +package xtools.app.gen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import xtools.app.gen.model.entity.GenDatasource; + +/** + *Title : GenDatasourceMapper
+ *Description : GenDatasourceMapper
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/17 13:12 + */ +@Mapper +public interface GenDatasourceMapper extends BaseMapperTitle : GenTableColumnMapper
+ *Description : GenTableColumnMapper
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 11:00 + */ +@Mapper +public interface GenTableColumnMapper extends BaseMapperTitle : GenTableMapper
+ *Description : GenTableMapper
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 10:35 + */ +@Mapper +public interface GenTableMapper extends BaseMapperTitle : GenCodeDto
+ *Description : GenCodeDto
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/21 08:37 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GenCodeDto implements Serializable { + + /** + * 路径 + */ + @Schema(description = "路径", example = "/gen/code/") + private String path; + + /** + * 文件名 + */ + @Schema(description = "文件名", example = "UserController.java") + private String fileName; + + /** + * 内容 + */ + @Schema(description = "内容", example = "public class Test {}") + private String content; +} diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenDatasourceAddReq.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenDatasourceAddReq.java new file mode 100644 index 0000000..2f68c39 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenDatasourceAddReq.java @@ -0,0 +1,83 @@ +package xtools.app.gen.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *Title : GenDatasourceAddReq
+ *Description : 数据源信息添加请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GenDatasourceAddReq implements Serializable { + + /** + * 数据源名称 + */ + @Schema(description = "数据源名称", example = "test_db") + private String dbName; + + /** + * 数据库类型[1.MySQL,2.PostgreSQL] + */ + @Schema(description = "数据库类型[1.MySQL,2.PostgreSQL]", example = "1") + private Integer dbType; + + /** + * JDBC 连接地址 + */ + @Schema(description = "JDBC 连接地址", example = "jdbc:mysql://localhost:3306/testdb") + private String jdbcUrl; + + /** + * 用户名 + */ + @Schema(description = "用户名", example = "root") + private String username; + + /** + * 密码 + */ + @Schema(description = "密码", example = "password123") + private String password; + + /** + * 模块名 + */ + @Schema(description = "模块名", example = "system") + private String moduleName; + + /** + * 子模块名 + */ + @Schema(description = "子模块名", example = "user") + private String subModuleName; + + /** + * 包路径 + */ + @Schema(description = "包路径", example = "com.example.project") + private String packageName; + + /** + * 状态[1.正常,0.停用] + */ + @Schema(description = "状态[1.正常,0.停用]", example = "1") + private Integer status; + + /** + * 备注 + */ + @Schema(description = "备注", example = "测试数据源") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenDatasourcePageReq.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenDatasourcePageReq.java new file mode 100644 index 0000000..4daebab --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenDatasourcePageReq.java @@ -0,0 +1,102 @@ +package xtools.app.gen.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.Instant; + +/** + *Title : GenDatasourcePageReq
+ *Description : 数据源信息分页请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:06 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GenDatasourcePageReq implements Serializable { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID", example = "1") + private Long id; + + /** + * 数据源名称 + */ + @Schema(description = "数据源名称", example = "test_db") + private String dbName; + + /** + * 数据库类型[1.MySQL,2.PostgreSQL] + */ + @Schema(description = "数据库类型[1.MySQL,2.PostgreSQL]", example = "1") + private Integer dbType; + + /** + * JDBC 连接地址 + */ + @Schema(description = "JDBC 连接地址", example = "jdbc:mysql://localhost:3306/testdb") + private String jdbcUrl; + + /** + * 用户名 + */ + @Schema(description = "用户名", example = "root") + private String username; + + /** + * 密码 + */ + @Schema(description = "密码", example = "password123") + private String password; + + /** + * 模块名 + */ + @Schema(description = "模块名", example = "system") + private String moduleName; + + /** + * 子模块名 + */ + @Schema(description = "子模块名", example = "user") + private String subModuleName; + + /** + * 包路径 + */ + @Schema(description = "包路径", example = "com.example.project") + private String packageName; + + /** + * 状态[1.正常,0.停用] + */ + @Schema(description = "状态[1.正常,0.停用]", example = "1") + private Integer status; + + /** + * 备注 + */ + @Schema(description = "备注", example = "测试数据源") + private String memo; + + /** + * 创建时间(范围) + */ + @Schema(description = "创建时间(范围)", example = "['2026-01-01 00:00:00', '2026-01-01 12:00:00']") + private Instant[] gmtCreateRange; + + /** + * 更新时间(范围) + */ + @Schema(description = "更新时间(范围)", example = "['2026-01-01 00:00:00', '2026-01-01 12:00:00']") + private Instant[] gmtModifiedRange; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenDatasourceUpdateReq.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenDatasourceUpdateReq.java new file mode 100644 index 0000000..b2eeae9 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenDatasourceUpdateReq.java @@ -0,0 +1,89 @@ +package xtools.app.gen.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *Title : GenDatasourceUpdateReq
+ *Description : 数据源信息更新请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:06 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GenDatasourceUpdateReq implements Serializable { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID", example = "1") + private Long id; + + /** + * 数据源名称 + */ + @Schema(description = "数据源名称", example = "test_db") + private String dbName; + + /** + * 数据库类型[1.MySQL,2.PostgreSQL] + */ + @Schema(description = "数据库类型[1.MySQL,2.PostgreSQL]", example = "1") + private Integer dbType; + + /** + * JDBC 连接地址 + */ + @Schema(description = "JDBC 连接地址", example = "jdbc:mysql://localhost:3306/testdb") + private String jdbcUrl; + + /** + * 用户名 + */ + @Schema(description = "用户名", example = "root") + private String username; + + /** + * 密码 + */ + @Schema(description = "密码", example = "password123") + private String password; + + /** + * 模块名 + */ + @Schema(description = "模块名", example = "system") + private String moduleName; + + /** + * 子模块名 + */ + @Schema(description = "子模块名", example = "user") + private String subModuleName; + + /** + * 包路径 + */ + @Schema(description = "包路径", example = "com.example.project") + private String packageName; + + /** + * 状态[1.正常,0.停用] + */ + @Schema(description = "状态[1.正常,0.停用]", example = "1") + private Integer status; + + /** + * 备注 + */ + @Schema(description = "备注", example = "测试数据源") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableAddReq.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableAddReq.java new file mode 100644 index 0000000..cfe0d1a --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableAddReq.java @@ -0,0 +1,107 @@ +package xtools.app.gen.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *Title : GenTableAddReq
+ *Description : 表信息添加请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GenTableAddReq implements Serializable { + + /** + * 数据源 ID + */ + @Schema(description = "数据源 ID", example = "1") + private Long datasourceId; + + /** + * 表名 + */ + @Schema(description = "表名", example = "sys_user") + private String tableName; + + /** + * 模块名 + */ + @Schema(description = "模块名", example = "system") + private String moduleName; + + /** + * 包名 + */ + @Schema(description = "包名", example = "com.example.project") + private String packageName; + + /** + * 业务名 + */ + @Schema(description = "业务名", example = "用户管理") + private String businessName; + + /** + * 实体类名 + */ + @Schema(description = "实体类名", example = "SysUser") + private String entityName; + + /** + * 属性名 + */ + @Schema(description = "属性名", example = "sysUser") + private String propName; + + /** + * 作者 + */ + @Schema(description = "作者", example = "XuJun") + private String author; + + /** + * 上级菜单ID,对应sys_menu的id + */ + @Schema(description = "上级菜单ID,对应sys_menu的id", example = "100") + private String parentMenuId; + + /** + * 表格操作 + */ + @Schema(description = "表格操作") + private Integer excelOpt; + + /** + * 打开微服务API[0.关闭,1.打开] + */ + @Schema(description = "打开微服务API[0.关闭,1.打开]") + private Integer openApi; + + /** + * 要移除的表前缀,如: sys_ + */ + @Schema(description = "要移除的表前缀,如: sys_", example = "sys_") + private String removeTablePrefix; + + /** + * 页面类型[classic|curd] + */ + @Schema(description = "页面类型[classic|curd]", example = "curd") + private String pageType; + + /** + * 备注 + */ + @Schema(description = "备注", example = "系统用户表") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableColumnAddReq.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableColumnAddReq.java new file mode 100644 index 0000000..b9f3bab --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableColumnAddReq.java @@ -0,0 +1,155 @@ +package xtools.app.gen.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *Title : GenTableColumnAddReq
+ *Description : 表字段信息添加请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GenTableColumnAddReq implements Serializable { + + /** + * 数据源 ID + */ + @Schema(description = "数据源 ID", example = "1") + private Long datasourceId; + + /** + * 表 ID + */ + @Schema(description = "表 ID", example = "1") + private Long tableId; + + /** + * 是否主键[1.主键,0.非主键] + */ + @Schema(description = "是否主键[1.主键,0.非主键]", example = "1") + private Integer isPk; + + /** + * 数据库列名 + */ + @Schema(description = "数据库列名", example = "user_id") + private String columnName; + + /** + * 数据库列类型 + */ + @Schema(description = "数据库列类型", example = "varchar(64)") + private String columnType; + + /** + * 数据库列长度 + */ + @Schema(description = "数据库列长度", example = "64") + private Integer columnLength; + + /** + * 字段名称 + */ + @Schema(description = "字段名称", example = "userId") + private String fieldName; + + /** + * 字段类型 + */ + @Schema(description = "字段类型", example = "String") + private String fieldType; + + /** + * 字段排序 + */ + @Schema(description = "字段排序", example = "1") + private Integer fieldSort; + + /** + * 字段描述 + */ + @Schema(description = "字段描述", example = "用户ID") + private String fieldComment; + + /** + * 方法名 + */ + @Schema(description = "方法名", example = "getUserId") + private String funName; + + /** + * 最大长度 + */ + @Schema(description = "最大长度", example = "64") + private Integer maxLength; + + /** + * 是否必填[1.是,0.否] + */ + @Schema(description = "是否必填[1.是,0.否]", example = "true") + private Integer isRequired; + + /** + * 是否在列表显示[1.是,0.否] + */ + @Schema(description = "是否在列表显示[1.是,0.否]", example = "true") + private Integer isShowInList; + + /** + * 是否在表单显示[1.是,0.否] + */ + @Schema(description = "是否在表单显示[1.是,0.否]", example = "true") + private Integer isShowInForm; + + /** + * 是否在查询条件显示[1.是,0.否] + */ + @Schema(description = "是否在查询条件显示[1.是,0.否]", example = "true") + private Integer isShowInQuery; + + /** + * 查询方式 + */ + @Schema(description = "查询方式", example = "1") + private Integer queryType; + + /** + * 表单类型 + */ + @Schema(description = "表单类型", example = "1") + private Integer formType; + + /** + * 字典类型 + */ + @Schema(description = "字典类型", example = "user_type") + private String dictType; + + /** + * 脱敏类型 + */ + @Schema(description = "脱敏类型", example = "OFF") + private String maskType; + + /** + * 扩展字段[1.是,0.否] + */ + @Schema(description = "扩展字段[1.是,0.否]", example = "false") + private Integer ext; + + /** + * 备注 + */ + @Schema(description = "备注", example = "用户标识字段") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableColumnPageReq.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableColumnPageReq.java new file mode 100644 index 0000000..753b8df --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableColumnPageReq.java @@ -0,0 +1,174 @@ +package xtools.app.gen.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.Instant; + +/** + *Title : GenTableColumnPageReq
+ *Description : 表字段信息分页请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GenTableColumnPageReq implements Serializable { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID", example = "1") + private Long id; + + /** + * 数据源 ID + */ + @Schema(description = "数据源 ID", example = "1") + private Long datasourceId; + + /** + * 表 ID + */ + @Schema(description = "表 ID", example = "1") + private Long tableId; + + /** + * 是否主键[1.主键,0.非主键] + */ + @Schema(description = "是否主键[1.主键,0.非主键]", example = "1") + private Integer isPk; + + /** + * 数据库列名 + */ + @Schema(description = "数据库列名", example = "user_id") + private String columnName; + + /** + * 数据库列类型 + */ + @Schema(description = "数据库列类型", example = "varchar(64)") + private String columnType; + + /** + * 数据库列长度 + */ + @Schema(description = "数据库列长度", example = "64") + private Integer columnLength; + + /** + * 字段名称 + */ + @Schema(description = "字段名称", example = "userId") + private String fieldName; + + /** + * 字段类型 + */ + @Schema(description = "字段类型", example = "String") + private String fieldType; + + /** + * 字段排序 + */ + @Schema(description = "字段排序", example = "1") + private Integer fieldSort; + + /** + * 字段描述 + */ + @Schema(description = "字段描述", example = "用户ID") + private String fieldComment; + + /** + * 方法名 + */ + @Schema(description = "方法名", example = "getUserId") + private String funName; + + /** + * 最大长度 + */ + @Schema(description = "最大长度", example = "64") + private Integer maxLength; + + /** + * 是否必填[1.是,0.否] + */ + @Schema(description = "是否必填[1.是,0.否]", example = "true") + private Integer isRequired; + + /** + * 是否在列表显示[1.是,0.否] + */ + @Schema(description = "是否在列表显示[1.是,0.否]", example = "true") + private Integer isShowInList; + + /** + * 是否在表单显示[1.是,0.否] + */ + @Schema(description = "是否在表单显示[1.是,0.否]", example = "true") + private Integer isShowInForm; + + /** + * 是否在查询条件显示[1.是,0.否] + */ + @Schema(description = "是否在查询条件显示[1.是,0.否]", example = "true") + private Integer isShowInQuery; + + /** + * 查询方式 + */ + @Schema(description = "查询方式", example = "1") + private Integer queryType; + + /** + * 表单类型 + */ + @Schema(description = "表单类型", example = "1") + private Integer formType; + + /** + * 字典类型 + */ + @Schema(description = "字典类型", example = "user_type") + private String dictType; + + /** + * 脱敏类型 + */ + @Schema(description = "脱敏类型", example = "OFF") + private String maskType; + + /** + * 扩展字段[1.是,0.否] + */ + @Schema(description = "扩展字段[1.是,0.否]", example = "false") + private Integer ext; + + /** + * 备注 + */ + @Schema(description = "备注", example = "用户标识字段") + private String memo; + + /** + * 创建时间(范围) + */ + @Schema(description = "创建时间(范围)", example = "['2026-01-01 00:00:00', '2026-01-01 12:00:00']") + private Instant[] gmtCreateRange; + + /** + * 更新时间(范围) + */ + @Schema(description = "更新时间(范围)", example = "['2026-01-01 00:00:00', '2026-01-01 12:00:00']") + private Instant[] gmtModifiedRange; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableColumnUpdateReq.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableColumnUpdateReq.java new file mode 100644 index 0000000..e89865b --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableColumnUpdateReq.java @@ -0,0 +1,161 @@ +package xtools.app.gen.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *Title : GenTableColumnUpdateReq
+ *Description : 表字段信息更新请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GenTableColumnUpdateReq implements Serializable { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID", example = "1") + private Long id; + + /** + * 数据源 ID + */ + @Schema(description = "数据源 ID", example = "1") + private Long datasourceId; + + /** + * 表 ID + */ + @Schema(description = "表 ID", example = "1") + private Long tableId; + + /** + * 是否主键[1.主键,0.非主键] + */ + @Schema(description = "是否主键[1.主键,0.非主键]", example = "1") + private Integer isPk; + + /** + * 数据库列名 + */ + @Schema(description = "数据库列名", example = "user_id") + private String columnName; + + /** + * 数据库列类型 + */ + @Schema(description = "数据库列类型", example = "varchar(64)") + private String columnType; + + /** + * 数据库列长度 + */ + @Schema(description = "数据库列长度", example = "64") + private Integer columnLength; + + /** + * 字段名称 + */ + @Schema(description = "字段名称", example = "userId") + private String fieldName; + + /** + * 字段类型 + */ + @Schema(description = "字段类型", example = "String") + private String fieldType; + + /** + * 字段排序 + */ + @Schema(description = "字段排序", example = "1") + private Integer fieldSort; + + /** + * 字段描述 + */ + @Schema(description = "字段描述", example = "用户ID") + private String fieldComment; + + /** + * 方法名 + */ + @Schema(description = "方法名", example = "getUserId") + private String funName; + + /** + * 最大长度 + */ + @Schema(description = "最大长度", example = "64") + private Integer maxLength; + + /** + * 是否必填[1.是,0.否] + */ + @Schema(description = "是否必填[1.是,0.否]", example = "true") + private Integer isRequired; + + /** + * 是否在列表显示[1.是,0.否] + */ + @Schema(description = "是否在列表显示[1.是,0.否]", example = "true") + private Integer isShowInList; + + /** + * 是否在表单显示[1.是,0.否] + */ + @Schema(description = "是否在表单显示[1.是,0.否]", example = "true") + private Integer isShowInForm; + + /** + * 是否在查询条件显示[1.是,0.否] + */ + @Schema(description = "是否在查询条件显示[1.是,0.否]", example = "true") + private Integer isShowInQuery; + + /** + * 查询方式 + */ + @Schema(description = "查询方式", example = "1") + private Integer queryType; + + /** + * 表单类型 + */ + @Schema(description = "表单类型", example = "1") + private Integer formType; + + /** + * 字典类型 + */ + @Schema(description = "字典类型", example = "user_type") + private String dictType; + + /** + * 脱敏类型 + */ + @Schema(description = "脱敏类型", example = "OFF") + private String maskType; + + /** + * 扩展字段[1.是,0.否] + */ + @Schema(description = "扩展字段[1.是,0.否]", example = "false") + private Integer ext; + + /** + * 备注 + */ + @Schema(description = "备注", example = "用户标识字段") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableInfoReq.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableInfoReq.java new file mode 100644 index 0000000..49e831f --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableInfoReq.java @@ -0,0 +1,32 @@ +package xtools.app.gen.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + *Title : GenTableInfoReq
+ *Description : 表信息请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-20 20:32:22 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class GenTableInfoReq extends GenTableUpdateReq { + + /** + * 字段列表 + */ + @Schema(description = "字段列表", example = "[{\"columnName\": \"user_id\", \"fieldName\": \"userId\", \"fieldType\": \"Long\"}]") + private ListTitle : GenTablePageReq
+ *Description : 表信息分页请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data + +@NoArgsConstructor +@AllArgsConstructor +public class GenTablePageReq implements Serializable { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID", example = "1") + private Long id; + + /** + * 数据源 ID + */ + @Schema(description = "数据源 ID", example = "1") + private Long datasourceId; + + /** + * 表名 + */ + @Schema(description = "表名", example = "sys_user") + private String tableName; + + /** + * 模块名 + */ + @Schema(description = "模块名", example = "system") + private String moduleName; + + /** + * 包名 + */ + @Schema(description = "包名", example = "com.example.project") + private String packageName; + + /** + * 业务名 + */ + @Schema(description = "业务名", example = "用户管理") + private String businessName; + + /** + * 实体类名 + */ + @Schema(description = "实体类名", example = "SysUser") + private String entityName; + + /** + * 属性名 + */ + @Schema(description = "属性名", example = "sysUser") + private String propName; + + /** + * 作者 + */ + @Schema(description = "作者", example = "XuJun") + private String author; + + /** + * 上级菜单ID,对应sys_menu的id + */ + @Schema(description = "上级菜单ID,对应sys_menu的id", example = "100") + private String parentMenuId; + + /** + * 表格操作 + */ + @Schema(description = "表格操作") + private Integer excelOpt; + + /** + * 打开微服务API[0.关闭,1.打开] + */ + @Schema(description = "打开微服务API[0.关闭,1.打开]") + private Integer openApi; + + /** + * 要移除的表前缀,如: sys_ + */ + @Schema(description = "要移除的表前缀,如: sys_", example = "sys_") + private String removeTablePrefix; + + /** + * 页面类型[classic|curd] + */ + @Schema(description = "页面类型[classic|curd]", example = "curd") + private String pageType; + + /** + * 备注 + */ + @Schema(description = "备注", example = "系统用户表") + private String memo; + + /** + * 创建时间(范围) + */ + @Schema(description = "创建时间(范围)", example = "['2026-01-01 00:00:00', '2026-01-01 12:00:00']") + private Instant[] gmtCreateRange; + + /** + * 更新时间(范围) + */ + @Schema(description = "更新时间(范围)", example = "['2026-01-01 00:00:00', '2026-01-01 12:00:00']") + private Instant[] gmtModifiedRange; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableUpdateReq.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableUpdateReq.java new file mode 100644 index 0000000..5118861 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/req/GenTableUpdateReq.java @@ -0,0 +1,114 @@ +package xtools.app.gen.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *Title : GenTableUpdateReq
+ *Description : 表信息更新请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data + +@NoArgsConstructor +@AllArgsConstructor +public class GenTableUpdateReq implements Serializable { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID", example = "1") + private Long id; + + /** + * 数据源 ID + */ + @Schema(description = "数据源 ID", example = "1") + private Long datasourceId; + + /** + * 表名 + */ + @Schema(description = "表名", example = "sys_user") + private String tableName; + + /** + * 模块名 + */ + @Schema(description = "模块名", example = "system") + private String moduleName; + + /** + * 包名 + */ + @Schema(description = "包名", example = "com.example.project") + private String packageName; + + /** + * 业务名 + */ + @Schema(description = "业务名", example = "用户管理") + private String businessName; + + /** + * 实体类名 + */ + @Schema(description = "实体类名", example = "SysUser") + private String entityName; + + /** + * 属性名 + */ + @Schema(description = "属性名", example = "sysUser") + private String propName; + + /** + * 作者 + */ + @Schema(description = "作者", example = "XuJun") + private String author; + + /** + * 上级菜单ID,对应sys_menu的id + */ + @Schema(description = "上级菜单ID,对应sys_menu的id", example = "100") + private String parentMenuId; + + /** + * 表格操作 + */ + @Schema(description = "表格操作") + private Integer excelOpt; + + /** + * 打开微服务API[0.关闭,1.打开] + */ + @Schema(description = "打开微服务API[0.关闭,1.打开]") + private Integer openApi; + + /** + * 要移除的表前缀,如: sys_ + */ + @Schema(description = "要移除的表前缀,如: sys_", example = "sys_") + private String removeTablePrefix; + + /** + * 页面类型[classic|curd] + */ + @Schema(description = "页面类型[classic|curd]", example = "curd") + private String pageType; + + /** + * 备注 + */ + @Schema(description = "备注", example = "系统用户表") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/resp/GenDatasourceResp.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/resp/GenDatasourceResp.java new file mode 100644 index 0000000..ff30c7f --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/resp/GenDatasourceResp.java @@ -0,0 +1,93 @@ +package xtools.app.gen.model.dto.resp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import xtools.boot.api.model.entity.BaseEntity; +import xtools.boot.mask.anntation.Mask; +import xtools.boot.mask.enums.MaskType; + +/** + *Title : GenDatasourceResp
+ *Description : 数据源信息响应对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:06 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class GenDatasourceResp extends BaseEntity { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID", example = "1") + private Long id; + + /** + * 数据源名称 + */ + @Schema(description = "数据源名称", example = "test_db") + private String dbName; + + /** + * 数据库类型[1.MySQL,2.PostgreSQL] + */ + @Schema(description = "数据库类型[1.MySQL,2.PostgreSQL]", example = "1") + private Integer dbType; + + /** + * JDBC 连接地址 + */ + @Schema(description = "JDBC 连接地址", example = "jdbc:mysql://localhost:3306/testdb") + private String jdbcUrl; + + /** + * 用户名 + */ + @Schema(description = "用户名", example = "root") + private String username; + + /** + * 密码 + */ + @Mask(MaskType.PASSWORD) + @Schema(description = "密码", example = "password123") + private String password; + + /** + * 模块名 + */ + @Schema(description = "模块名", example = "system") + private String moduleName; + + /** + * 子模块名 + */ + @Schema(description = "子模块名", example = "user") + private String subModuleName; + + /** + * 包路径 + */ + @Schema(description = "包路径", example = "com.example.project") + private String packageName; + + /** + * 状态[1.正常,0.停用] + */ + @Schema(description = "状态[1.正常,0.停用]", example = "1") + private Integer status; + + /** + * 备注 + */ + @Schema(description = "备注", example = "测试数据源") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/resp/GenTableColumnResp.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/resp/GenTableColumnResp.java new file mode 100644 index 0000000..bf89e92 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/resp/GenTableColumnResp.java @@ -0,0 +1,162 @@ +package xtools.app.gen.model.dto.resp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import xtools.boot.api.model.entity.BaseEntity; + +/** + *Title : GenTableColumnResp
+ *Description : 表字段信息响应对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class GenTableColumnResp extends BaseEntity { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID", example = "1") + private Long id; + + /** + * 数据源 ID + */ + @Schema(description = "数据源 ID", example = "1") + private Long datasourceId; + + /** + * 表 ID + */ + @Schema(description = "表 ID", example = "1") + private Long tableId; + + /** + * 是否主键[1.主键,0.非主键] + */ + @Schema(description = "是否主键[1.主键,0.非主键]", example = "1") + private Integer isPk; + + /** + * 数据库列名 + */ + @Schema(description = "数据库列名", example = "user_id") + private String columnName; + + /** + * 数据库列类型 + */ + @Schema(description = "数据库列类型", example = "varchar(64)") + private String columnType; + + /** + * 数据库列长度 + */ + @Schema(description = "数据库列长度", example = "64") + private Integer columnLength; + + /** + * 字段名称 + */ + @Schema(description = "字段名称", example = "userId") + private String fieldName; + + /** + * 字段类型 + */ + @Schema(description = "字段类型", example = "String") + private String fieldType; + + /** + * 字段排序 + */ + @Schema(description = "字段排序", example = "1") + private Integer fieldSort; + + /** + * 字段描述 + */ + @Schema(description = "字段描述", example = "用户ID") + private String fieldComment; + + /** + * 方法名 + */ + @Schema(description = "方法名", example = "getUserId") + private String funName; + + /** + * 最大长度 + */ + @Schema(description = "最大长度", example = "64") + private Integer maxLength; + + /** + * 是否必填[1.是,0.否] + */ + @Schema(description = "是否必填[1.是,0.否]", example = "true") + private Integer isRequired; + + /** + * 是否在列表显示[1.是,0.否] + */ + @Schema(description = "是否在列表显示[1.是,0.否]", example = "true") + private Integer isShowInList; + + /** + * 是否在表单显示[1.是,0.否] + */ + @Schema(description = "是否在表单显示[1.是,0.否]", example = "true") + private Integer isShowInForm; + + /** + * 是否在查询条件显示[1.是,0.否] + */ + @Schema(description = "是否在查询条件显示[1.是,0.否]", example = "true") + private Integer isShowInQuery; + + /** + * 查询方式 + */ + @Schema(description = "查询方式", example = "1") + private Integer queryType; + + /** + * 表单类型 + */ + @Schema(description = "表单类型", example = "1") + private Integer formType; + + /** + * 字典类型 + */ + @Schema(description = "字典类型", example = "user_type") + private String dictType; + + /** + * 脱敏类型 + */ + @Schema(description = "脱敏类型", example = "OFF") + private String maskType; + + /** + * 扩展字段[1.是,0.否] + */ + @Schema(description = "扩展字段[1.是,0.否]", example = "false") + private Integer ext; + + /** + * 备注 + */ + @Schema(description = "备注", example = "用户标识字段") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/resp/GenTableInfoResp.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/resp/GenTableInfoResp.java new file mode 100644 index 0000000..0d86f5c --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/dto/resp/GenTableInfoResp.java @@ -0,0 +1,32 @@ +package xtools.app.gen.model.dto.resp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + *Title : GenTableInfoResp
+ *Description : 表信息响应对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-20 20:32:22 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class GenTableInfoResp extends GenTableResp { + + /** + * 字段列表 + */ + @Schema(description = "字段列表") + private ListTitle : GenTableResp
+ *Description : 表信息响应对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class GenTableResp extends BaseEntity { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID", example = "1") + private Long id; + + /** + * 数据源 ID + */ + @Schema(description = "数据源 ID", example = "1") + private Long datasourceId; + + /** + * 表名 + */ + @Schema(description = "表名", example = "sys_user") + private String tableName; + + /** + * 模块名 + */ + @Schema(description = "模块名", example = "system") + private String moduleName; + + /** + * 包名 + */ + @Schema(description = "包名", example = "com.example.project") + private String packageName; + + /** + * 业务名 + */ + @Schema(description = "业务名", example = "用户管理") + private String businessName; + + /** + * 实体类名 + */ + @Schema(description = "实体类名", example = "SysUser") + private String entityName; + + /** + * 属性名 + */ + @Schema(description = "属性名", example = "sysUser") + private String propName; + + /** + * 作者 + */ + @Schema(description = "作者", example = "XuJun") + private String author; + + /** + * 上级菜单ID,对应sys_menu的id + */ + @Schema(description = "上级菜单ID,对应sys_menu的id", example = "100") + private String parentMenuId; + + /** + * 表格操作 + */ + @Schema(description = "表格操作") + private Integer excelOpt; + + /** + * 打开微服务API[0.关闭,1.打开] + */ + @Schema(description = "打开微服务API[0.关闭,1.打开]") + private Integer openApi; + + /** + * 要移除的表前缀,如: sys_ + */ + @Schema(description = "要移除的表前缀,如: sys_", example = "sys_") + private String removeTablePrefix; + + /** + * 页面类型[classic|curd] + */ + @Schema(description = "页面类型[classic|curd]", example = "curd") + private String pageType; + + /** + * 备注 + */ + @Schema(description = "备注", example = "系统用户表") + private String memo; + +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/entity/GenDatasource.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/entity/GenDatasource.java new file mode 100644 index 0000000..c25a15c --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/entity/GenDatasource.java @@ -0,0 +1,106 @@ +package xtools.app.gen.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import xtools.boot.api.model.entity.BaseEntity; + +/** + *Title : GenDatasource
+ *Description : 数据源信息实体对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("gen_datasource") +public class GenDatasource extends BaseEntity { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 数据源名称 + */ + @Schema(description = "数据源名称") + @TableField(value = "db_name") + private String dbName; + + /** + * 数据库类型[1.MySQL,2.PostgreSQL] + */ + @Schema(description = "数据库类型[1.MySQL,2.PostgreSQL]") + @TableField(value = "db_type") + private Integer dbType; + + /** + * JDBC 连接地址 + */ + @Schema(description = "JDBC 连接地址") + @TableField(value = "jdbc_url") + private String jdbcUrl; + + /** + * 用户名 + */ + @Schema(description = "用户名") + @TableField(value = "username") + private String username; + + /** + * 密码 + */ + @Schema(description = "密码") + @TableField(value = "password") + private String password; + + /** + * 模块名 + */ + @Schema(description = "模块名") + @TableField(value = "module_name") + private String moduleName; + + /** + * 子模块名 + */ + @Schema(description = "子模块名") + @TableField(value = "sub_module_name") + private String subModuleName; + + /** + * 包路径 + */ + @Schema(description = "包路径") + @TableField(value = "package_name") + private String packageName; + + /** + * 状态[1.正常,0.停用] + */ + @Schema(description = "状态[1.正常,0.停用]") + @TableField(value = "status") + private Integer status; + + /** + * 备注 + */ + @Schema(description = "备注") + @TableField(value = "memo") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/entity/GenTable.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/entity/GenTable.java new file mode 100644 index 0000000..49c13f7 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/entity/GenTable.java @@ -0,0 +1,134 @@ +package xtools.app.gen.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import xtools.boot.api.model.entity.BaseEntity; + +/** + *Title : GenTable
+ *Description : 表信息实体对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-24 22:01:05 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("gen_table") +public class GenTable extends BaseEntity { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 数据源 ID + */ + @Schema(description = "数据源 ID") + @TableField(value = "datasource_id") + private Long datasourceId; + + /** + * 表名 + */ + @Schema(description = "表名") + @TableField(value = "table_name") + private String tableName; + + /** + * 模块名 + */ + @Schema(description = "模块名") + @TableField(value = "module_name") + private String moduleName; + + /** + * 包名 + */ + @Schema(description = "包名") + @TableField(value = "package_name") + private String packageName; + + /** + * 业务名 + */ + @Schema(description = "业务名") + @TableField(value = "business_name") + private String businessName; + + /** + * 实体类名 + */ + @Schema(description = "实体类名") + @TableField(value = "entity_name") + private String entityName; + + /** + * 属性名 + */ + @Schema(description = "属性名") + @TableField(value = "prop_name") + private String propName; + + /** + * 作者 + */ + @Schema(description = "作者") + @TableField(value = "author") + private String author; + + /** + * 上级菜单ID,对应sys_menu的id + */ + @Schema(description = "上级菜单ID,对应sys_menu的id") + @TableField(value = "parent_menu_id") + private String parentMenuId; + + /** + * 表格操作 + */ + @Schema(description = "表格操作") + @TableField(value = "excel_opt") + private Integer excelOpt; + + /** + * 打开微服务API[0.关闭,1.打开] + */ + @Schema(description = "打开微服务API[0.关闭,1.打开]") + @TableField(value = "open_api") + private Integer openApi; + + /** + * 要移除的表前缀,如: sys_ + */ + @Schema(description = "要移除的表前缀,如: sys_") + @TableField(value = "remove_table_prefix") + private String removeTablePrefix; + + /** + * 页面类型[classic|curd] + */ + @Schema(description = "页面类型[classic|curd]") + @TableField(value = "page_type") + private String pageType; + + /** + * 备注 + */ + @Schema(description = "备注") + @TableField(value = "memo") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/entity/GenTableColumn.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/entity/GenTableColumn.java new file mode 100644 index 0000000..f1a1109 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/model/entity/GenTableColumn.java @@ -0,0 +1,190 @@ +package xtools.app.gen.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import xtools.boot.api.model.entity.BaseEntity; + +/** + *Title : GenTableColumn
+ *Description : 表字段信息实体对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-25 14:16:11 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("gen_table_column") +public class GenTableColumn extends BaseEntity { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 数据源 ID + */ + @Schema(description = "数据源 ID") + @TableField(value = "datasource_id") + private Long datasourceId; + + /** + * 表 ID + */ + @Schema(description = "表 ID") + @TableField(value = "table_id") + private Long tableId; + + /** + * 是否主键 + */ + @Schema(description = "是否主键") + @TableField(value = "is_pk") + private Integer isPk; + + /** + * 数据库列名 + */ + @Schema(description = "数据库列名") + @TableField(value = "column_name") + private String columnName; + + /** + * 数据库列类型 + */ + @Schema(description = "数据库列类型") + @TableField(value = "column_type") + private String columnType; + + /** + * 数据库列长度 + */ + @Schema(description = "数据库列长度") + @TableField(value = "column_length") + private Integer columnLength; + + /** + * 字段名称 + */ + @Schema(description = "字段名称") + @TableField(value = "field_name") + private String fieldName; + + /** + * 字段类型 + */ + @Schema(description = "字段类型") + @TableField(value = "field_type") + private String fieldType; + + /** + * 字段排序 + */ + @Schema(description = "字段排序") + @TableField(value = "field_sort") + private Integer fieldSort; + + /** + * 字段描述 + */ + @Schema(description = "字段描述") + @TableField(value = "field_comment") + private String fieldComment; + + /** + * 方法名 + */ + @Schema(description = "方法名") + @TableField(value = "fun_name") + private String funName; + + /** + * 最大长度 + */ + @Schema(description = "最大长度") + @TableField(value = "max_length") + private Integer maxLength; + + /** + * 是否必填 + */ + @Schema(description = "是否必填") + @TableField(value = "is_required") + private Integer isRequired; + + /** + * 是否在列表显示 + */ + @Schema(description = "是否在列表显示") + @TableField(value = "is_show_in_list") + private Integer isShowInList; + + /** + * 是否在表单显示 + */ + @Schema(description = "是否在表单显示") + @TableField(value = "is_show_in_form") + private Integer isShowInForm; + + /** + * 是否在查询条件显示 + */ + @Schema(description = "是否在查询条件显示") + @TableField(value = "is_show_in_query") + private Integer isShowInQuery; + + /** + * 查询方式 + */ + @Schema(description = "查询方式") + @TableField(value = "query_type") + private Integer queryType; + + /** + * 表单类型 + */ + @Schema(description = "表单类型") + @TableField(value = "form_type") + private Integer formType; + + /** + * 字典类型 + */ + @Schema(description = "字典类型") + @TableField(value = "dict_type") + private String dictType; + + /** + * 脱敏类型 + */ + @Schema(description = "脱敏类型") + @TableField(value = "mask_type") + private String maskType; + + /** + * 扩展字段 + */ + @Schema(description = "扩展字段") + @TableField(value = "ext") + private Integer ext; + + /** + * 备注 + */ + @Schema(description = "备注") + @TableField(value = "memo") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/service/GenDatasourceService.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/service/GenDatasourceService.java new file mode 100644 index 0000000..2398aaa --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/service/GenDatasourceService.java @@ -0,0 +1,66 @@ +package xtools.app.gen.service; + +import xtools.app.gen.model.dto.req.GenDatasourceAddReq; +import xtools.app.gen.model.dto.req.GenDatasourcePageReq; +import xtools.app.gen.model.dto.req.GenDatasourceUpdateReq; +import xtools.app.gen.model.dto.resp.GenDatasourceResp; +import xtools.boot.api.model.dto.Result; +import xtools.boot.api.model.dto.page.PageReq; +import xtools.boot.api.model.dto.page.PageResp; + +import java.util.List; + +/** + *Title : GenDatasourceService
+ *Description : GenDatasourceService
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/17 13:14 + */ +public interface GenDatasourceService { + + /** + * 分页查询 + * + * @param pageReq 分页请求 + * @return 分页结果 + */ + ResultTitle : GenService
+ *Description : GenService
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/20 08:43 + */ +public interface GenService { + + /** + * 删除数据源下的所有表信息 + * + * @param datasourceId 数据源 ID + * @return 删除结果 + */ + ResultTitle : GenTableColumnService
+ *Description : GenTableColumnService
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 11:10 + */ +public interface GenTableColumnService { + + /** + * 分页查询 + * + * @param pageReq 分页请求 + * @return 分页结果 + */ + ResultTitle : GenTableService
+ *Description : GenTableService
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 10:20 + */ +public interface GenTableService { + + /** + * 分页查询 + * + * @param pageReq 分页请求 + * @return 分页结果 + */ + ResultTitle : GenDatasourceBaseService
+ *Description : GenDatasourceBaseService
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/17 13:13 + */ +@Component +public class GenDatasourceBaseService extends ServiceImplTitle : GenTableBaseService
+ *Description : GenTableBaseService
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 10:15 + */ +@Component +public class GenTableBaseService extends ServiceImplTitle : GenTableColumnBaseService
+ *Description : GenTableColumnBaseService
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 11:05 + */ +@Component +public class GenTableColumnBaseService extends ServiceImplTitle : GenDatasourceServiceImpl
+ *Description : GenDatasourceServiceImpl
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/17 13:14 + */ +@Primary +@Service +@RequiredArgsConstructor +public class GenDatasourceServiceImpl implements GenDatasourceService { + + private final GenService genService; + + private final GenDatasourceBaseService genDatasourceBaseService; + + private final GenDatasourceConvert genDatasourceConvert; + + /** + * 分页查询 + * + * @param pageReq 分页请求 + * @return 分页结果 + */ + @Override + public ResultTitle : GenServiceImpl
+ *Description : GenServiceImpl
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/20 08:43 + */ +@Primary +@Service +@RequiredArgsConstructor +public class GenServiceImpl implements GenService, BaseParams { + + private final GenProperties genProperties; + + private final GenTableBaseService genTableBaseService; + + private final GenTableService genTableService; + + private final GenTableColumnBaseService genTableColumnBaseService; + + private final GenTableColumnService genTableColumnService; + + private final GenDatasourceBaseService genDatasourceBaseService; + + private final GenConvert genConvert; + + private final GenTableConvert genTableConvert; + + private final GenTableColumnConvert genTableColumnConvert; + + /** + * 删除数据源下的所有表信息 + * + * @param datasourceId 数据源 ID + * @return 删除结果 + */ + @Override + public ResultTitle : GenTableColumnServiceImpl
+ *Description : GenTableColumnServiceImpl
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 11:15 + */ +@Primary +@Service +@RequiredArgsConstructor +public class GenTableColumnServiceImpl implements GenTableColumnService { + + private final GenTableColumnBaseService genTableColumnBaseService; + + private final GenTableColumnConvert genTableColumnConvert; + + /** + * 分页查询 + * + * @param pageReq 分页请求 + * @return 分页结果 + */ + @Override + public ResultTitle : GenTableServiceImpl
+ *Description : GenTableServiceImpl
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/18 10:25 + */ +@Primary +@Service +@RequiredArgsConstructor +public class GenTableServiceImpl implements GenTableService { + + private final GenTableBaseService genTableBaseService; + + private final GenTableConvert genTableConvert; + + /** + * 分页查询 + * + * @param pageReq 分页请求 + * @return 分页结果 + */ + @Override + public ResultTitle : DatasourceUtils
+ *Description : DatasourceUtils
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/01/17 12:30 + */ +public class DatasourceUtils { + + + /** + * 检查数据库连接是否正常 + * + * @param jdbcUrl 数据库连接 URL + * @param username 数据库用户名 + * @param password 数据库密码 + * @return 是否正常 + */ + public static boolean checkConnection(String jdbcUrl, String username, String password) { + // 设置连接属性 + Properties props = new Properties(); + props.setProperty("user", username); + props.setProperty("password", password); + // 10秒连接超时 + props.setProperty("connectTimeout", "10000"); + // 30秒读取超时 + props.setProperty("socketTimeout", "30000"); + + try (Connection connection = DriverManager.getConnection(jdbcUrl, props)) { + // 尝试执行简单查询验证连接 + return connection.isValid(10); + } catch (SQLException e) { + throw new BizError("数据库连接异常"); + } + } + +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/utils/GenUtils.java b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/utils/GenUtils.java new file mode 100644 index 0000000..dc50ff8 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/java/xtools/app/gen/utils/GenUtils.java @@ -0,0 +1,102 @@ +package xtools.app.gen.utils; + +import org.apache.commons.lang3.StringUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; +import xtools.boot.core.utils.SpringContextUtils; + +import java.io.StringWriter; +import java.sql.Types; +import java.util.Map; + +/** + *Title : GenUtils
+ *Description : GenUtils
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/20 09:22 + */ +public class GenUtils { + + /** + * 转换字符串(将aa_bb_cc转换为aaBbCc) + * + * @param string 字符串 + * @return 处理后的字符串 + */ + public static String stringToNameA(String string) { + String lowerCaseStr = string.toLowerCase(); + String[] noDashArray = StringUtils.split(lowerCaseStr, '_'); + StringBuilder noDash = new StringBuilder(noDashArray[0]); + for (int i = 1; i < noDashArray.length; i++) { + noDash.append(StringUtils.capitalize(noDashArray[i])); + } + return noDash.toString(); + } + + /** + * 转换字符串(将aa_bb_cc转换为AaBbCc) + * + * @param string 字符串 + * @return 处理后的字符串 + */ + public static String stringToNameB(String string) { + return StringUtils.capitalize(stringToNameA(string)); + } + + /** + * 转换字符串(将aa_bb_cc转换为AA_BB_CC) + * + * @param string 字符串 + * @return 处理后的字符串 + */ + public static String stringToNameC(String string) { + return string.toUpperCase(); + } + + /** + * 根据数据库字段类型映射 Java 类型 + * + * @param dataType 数据库字段类型 + * @return Java 类型 + */ + public static String columnTypeToJavaType(int dataType) { + return switch (dataType) { + case Types.INTEGER, Types.SMALLINT, Types.TINYINT -> "Integer"; + case Types.BIGINT -> "Long"; + case Types.DOUBLE, Types.FLOAT, Types.REAL -> "Double"; + case Types.DECIMAL, Types.NUMERIC -> "BigDecimal"; + case Types.VARCHAR, Types.CHAR, Types.LONGVARCHAR, Types.NVARCHAR, Types.NCHAR, Types.LONGNVARCHAR -> + "String"; + case Types.DATE, Types.TIME, Types.TIMESTAMP -> "Instant"; + case Types.BOOLEAN, Types.BIT -> "Boolean"; + default -> "Object"; + }; + } + + /** + * 渲染模板 + * + * @param map 数据 + * @param templatePath 模板路径 + * @return 渲染后的模板 + */ + public static String render(MapTitle : ${table.entityName}Api
+ *Description : $!{table.businessName} Api
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +public interface ${table.entityName}Api { + +} diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/call/call.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/call/call.java.vm new file mode 100644 index 0000000..02ac07d --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/call/call.java.vm @@ -0,0 +1,18 @@ +package ${table.packageName}.${subPackageName}; + +import org.springframework.web.service.annotation.HttpExchange; +import ${table.packageName}.api.${table.entityName}Api; + +/** + *Title : ${table.entityName}Call
+ *Description : $!{table.businessName} Call
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@HttpExchange("/${uri}") +public interface ${table.entityName}Call extends ${table.entityName}Api { + +} diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/controller/controller.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/controller/controller.java.vm new file mode 100644 index 0000000..6e51cbf --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/controller/controller.java.vm @@ -0,0 +1,137 @@ +package ${table.packageName}.${subPackageName}; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import xtools.boot.api.model.dto.Result; +import xtools.boot.api.model.dto.page.PageReq; +import xtools.boot.api.model.dto.page.PageResp; +import xtools.boot.api.model.dto.req.IdListReq; +import ${table.packageName}.model.dto.req.${table.entityName}AddReq; +import ${table.packageName}.model.dto.req.${table.entityName}PageReq; +import ${table.packageName}.model.dto.req.${table.entityName}UpdateReq; +import ${table.packageName}.model.dto.resp.${table.entityName}Resp; +import ${table.packageName}.service.${table.entityName}Service; +#if($api) +import ${table.packageName}.api.${table.entityName}Api; +#end +#if($exportExcel || $importExcel) +import ${table.packageName}.model.dto.excel.${table.entityName}Excel; +import xtools.extend.office.FesodUtils; +import xtools.boot.api.exection.BizError; + +import java.io.IOException; +#end +#if($exportExcel) +import java.util.List; + +import xtools.web.HttpServletUtils; +import jakarta.servlet.http.HttpServletResponse; +#end +#if($importExcel) +import org.springframework.web.multipart.MultipartFile; +import xtools.core.CollectionUtils; +import xtools.boot.api.exection.BizWarning; +import org.springframework.web.bind.annotation.RequestParam; +#end + +/** + *Title : ${table.entityName}Controller
+ *Description : $!{table.businessName} Controller
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@RequiredArgsConstructor +@Tag(name = "$!{table.businessName}") +@RestController +@RequestMapping("/${uri}") +public class ${table.entityName}Controller #if($api)implements ${table.entityName}Api #end{ + + private final ${table.entityName}Service ${table.propName}Service; + + @Operation(summary = "分页请求") + @PostMapping("page") + public ResultTitle : ${table.entityName}Convert
+ *Description : $!{table.businessName} Convert
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@Mapper(componentModel = "spring") +public interface ${table.entityName}Convert { + + /** + * 添加请求转实体 + * + * @param req 添加请求 + * @return 实体 + */ + ${table.entityName} addReqToEntity(${table.entityName}AddReq req); + + /** + * 修改请求转实体 + * + * @param req 修改请求 + * @return 实体 + */ + ${table.entityName} updateReqToEntity(${table.entityName}UpdateReq req); + + /** + * 实体转响应 + * + * @param data 实体 + * @return 响应 + */ + ${table.entityName}Resp entityToResp(${table.entityName} data); + + /** + * 批量实体转响应 + * + * @param dataList 批量实体 + * @return 响应 + */ + List<${table.entityName}Resp> entityToRespList(List<${table.entityName}> dataList); + + #if($exportExcel) + /** + * 实体转Excel + * + * @param data 实体 + * @return Excel + */ + ${table.entityName}Excel entityToExcel(${table.entityName} data); + + #end + #if($importExcel) + /** + * Excel转实体 + * + * @param data Excel + * @return 实体 + */ + ${table.entityName} excelToEntity(${table.entityName}Excel data); + + #end +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/mapper/mapper.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/mapper/mapper.java.vm new file mode 100644 index 0000000..cd29f06 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/mapper/mapper.java.vm @@ -0,0 +1,20 @@ +package ${table.packageName}.${subPackageName}; + +import org.apache.ibatis.annotations.Mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import ${table.packageName}.model.entity.${table.entityName}; + +/** + *Title : ${table.entityName}Mapper
+ *Description : $!{table.businessName} Mapper 接口
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@Mapper +public interface ${table.entityName}Mapper extends BaseMapper<${table.entityName}> { + +} diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/addReq.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/addReq.java.vm new file mode 100644 index 0000000..fb742eb --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/addReq.java.vm @@ -0,0 +1,41 @@ +package ${table.packageName}.${subPackageName}; + +#if($importMap.hasInstant) +import java.time.Instant; +#end +#if($importMap.hasBigDecimal) +import java.math.BigDecimal; +#end +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.Serializable; + +/** + *Title : ${table.entityName}AddReq
+ *Description : $!{table.businessName}添加请求对象
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ${table.entityName}AddReq implements Serializable { + +#foreach($column in ${columnList}) + #if(!$column.isPk.equals(1) && !$column.fieldName.equals("gmtCreate") && !$column.fieldName.equals("gmtModified")) + #if("$!column.fieldComment" != "") + /** + * ${column.fieldComment} + */ + @Schema(description = "${column.fieldComment}") + #end + private ${column.fieldType} ${column.fieldName}; + + #end +#end +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/excel.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/excel.java.vm new file mode 100644 index 0000000..e00aebf --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/excel.java.vm @@ -0,0 +1,39 @@ +package ${table.packageName}.${subPackageName}; + +#if($importMap.hasInstant) +import java.time.Instant; +#end +#if($importMap.hasBigDecimal) +import java.math.BigDecimal; +#end +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import org.apache.fesod.sheet.annotation.ExcelProperty; +import java.io.Serializable; + +/** + *Title : ${table.entityName}Excel
+ *Description : $!{table.businessName}Excel对象
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ${table.entityName}Excel implements Serializable { + +#foreach($column in ${columnList}) + #if(!$column.fieldName.equals("gmtCreate") && !$column.fieldName.equals("gmtModified")) + /** + * ${column.fieldComment} + */ + @ExcelProperty("${column.fieldComment}") + private ${column.fieldType} ${column.fieldName}; + + #end +#end +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/pageReq.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/pageReq.java.vm new file mode 100644 index 0000000..e51236b --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/pageReq.java.vm @@ -0,0 +1,53 @@ +package ${table.packageName}.${subPackageName}; + +import java.time.Instant; +#if($importMap.hasBigDecimal) +import java.math.BigDecimal; +#end +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.Serializable; + +/** + *Title : ${table.entityName}PageReq
+ *Description : $!{table.businessName}分页请求对象
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ${table.entityName}PageReq implements Serializable { + +#foreach($column in ${columnList}) + #if(!$column.fieldName.equals("gmtCreate") && !$column.fieldName.equals("gmtModified")) + /** + * ${column.fieldComment} + */ + #if($column.fieldType.equals("Instant")) + @Schema(description = "${column.fieldComment}(范围)", example = "['2026-01-01 00:00:00', '2026-01-01 12:00:00']") + private ${column.fieldType}[] ${column.fieldName}Range; + #else + @Schema(description = "${column.fieldComment}") + private ${column.fieldType} ${column.fieldName}; + #end + + #end +#end + /** + * 创建时间(范围) + */ + @Schema(description = "创建时间(范围)", example = "['2026-01-01 00:00:00', '2026-01-01 12:00:00']") + private Instant[] gmtCreateRange; + + /** + * 更新时间(范围) + */ + @Schema(description = "更新时间(范围)", example = "['2026-01-01 00:00:00', '2026-01-01 12:00:00']") + private Instant[] gmtModifiedRange; +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/resp.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/resp.java.vm new file mode 100644 index 0000000..d92d4eb --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/resp.java.vm @@ -0,0 +1,48 @@ +package ${table.packageName}.${subPackageName}; + +#if($maskList.size() > 0) +import xtools.boot.mask.anntation.Mask; +import xtools.boot.mask.enums.MaskType; +#end +#if($importMap.hasInstant) +import java.time.Instant; +#end +#if($importMap.hasBigDecimal) +import java.math.BigDecimal; +#end +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.v3.oas.annotations.media.Schema; +import xtools.boot.api.model.entity.BaseEntity; + +/** + *Title : ${table.entityName}Resp
+ *Description : $!{table.businessName}响应对象
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class ${table.entityName}Resp extends BaseEntity { + +#foreach($column in ${columnList}) + #if(!$column.fieldName.equals("gmtCreate") && !$column.fieldName.equals("gmtModified")) + /** + * ${column.fieldComment} + */ + @Schema(description = "${column.fieldComment}") + #if("$!column.maskType" != "OFF") + @Mask(MaskType.${column.maskType}) + #end + private ${column.fieldType} ${column.fieldName}; + + #end +#end +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/updateReq.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/updateReq.java.vm new file mode 100644 index 0000000..75244d0 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/dto/updateReq.java.vm @@ -0,0 +1,41 @@ +package ${table.packageName}.${subPackageName}; + +#if($importMap.hasInstant) +import java.time.Instant; +#end +#if($importMap.hasBigDecimal) +import java.math.BigDecimal; +#end +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.Serializable; + +/** + *Title : ${table.entityName}UpdateReq
+ *Description : $!{table.businessName}更新请求对象
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ${table.entityName}UpdateReq implements Serializable { + +#foreach($column in ${columnList}) + #if(!$column.fieldName.equals("gmtCreate") && !$column.fieldName.equals("gmtModified")) + #if("$!column.fieldComment" != "") + /** + * ${column.fieldComment} + */ + @Schema(description = "${column.fieldComment}") + #end + private ${column.fieldType} ${column.fieldName}; + + #end +#end +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/entity/entity.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/entity/entity.java.vm new file mode 100644 index 0000000..6a51675 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/model/entity/entity.java.vm @@ -0,0 +1,51 @@ +package ${table.packageName}.${subPackageName}; + +#if($importMap.hasInstant) +import java.time.Instant; +#end +#if($importMap.hasBigDecimal) +import java.math.BigDecimal; +#end +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import xtools.boot.api.model.entity.BaseEntity; + +/** + *Title : ${table.entityName}
+ *Description : $!{table.businessName}实体对象
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("${table.tableName}") +public class ${table.entityName} extends BaseEntity { + +#foreach($column in ${columnList}) + #if(!$column.fieldName.equals("gmtCreate") && !$column.fieldName.equals("gmtModified")) + /** + * ${column.fieldComment} + */ + @Schema(description = "${column.fieldComment}") + #if($column.isPk.equals(1)) + @TableId(value = "${column.columnName}", type = IdType.ASSIGN_ID) + #else + @TableField(value = "${column.columnName}") + #end + private ${column.fieldType} ${column.fieldName}; + + #end +#end +} \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/service/service.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/service/service.java.vm new file mode 100644 index 0000000..5fc77de --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/service/service.java.vm @@ -0,0 +1,91 @@ +package ${table.packageName}.${subPackageName}; + +import xtools.boot.api.model.dto.Result; +import xtools.boot.api.model.dto.page.PageReq; +import xtools.boot.api.model.dto.page.PageResp; +import xtools.boot.api.model.dto.req.IdListReq; +import ${table.packageName}.model.dto.req.${table.entityName}AddReq; +import ${table.packageName}.model.dto.req.${table.entityName}PageReq; +import ${table.packageName}.model.dto.req.${table.entityName}UpdateReq; +import ${table.packageName}.model.dto.resp.${table.entityName}Resp; +#if($api) +import ${table.packageName}.api.${table.entityName}Api; +#end +#if($exportExcel || $importExcel) +import ${table.packageName}.model.dto.excel.${table.entityName}Excel; +#end +#if($exportExcel) +import java.util.List; +#end + +/** + *Title : ${table.entityName}Service
+ *Description : $!{table.businessName} Service
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +public interface ${table.entityName}Service #if($api)extends ${table.entityName}Api #end{ + + /** + * 分页查询 + * + * @param pageReq 分页请求 + * @return 分页结果 + */ + ResultTitle : ${table.entityName}BaseService
+ *Description : $!{table.businessName} BaseService
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@Component +public class ${table.entityName}BaseService extends ServiceImpl<${table.entityName}Mapper, ${table.entityName}> { +} diff --git a/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/service/serviceImpl.java.vm b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/service/serviceImpl.java.vm new file mode 100644 index 0000000..2e994c0 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-biz/src/main/resources/templates/gen/service/serviceImpl.java.vm @@ -0,0 +1,255 @@ +package ${table.packageName}.${subPackageName}; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import xtools.boot.api.exection.BizError; +import xtools.boot.api.exection.BizWarning; +import xtools.boot.api.model.dto.Result; +import xtools.boot.api.model.dto.page.PageReq; +import xtools.boot.api.model.dto.page.PageResp; +import xtools.boot.api.model.dto.req.IdListReq; +import xtools.boot.db.mybatisplus.utils.QueryUtils; +#if($importMap.hasStringUtils) +import xtools.core.StringUtils; +#end +import ${table.packageName}.convert.${table.entityName}Convert; +import ${table.packageName}.model.dto.req.${table.entityName}AddReq; +import ${table.packageName}.model.dto.req.${table.entityName}PageReq; +import ${table.packageName}.model.dto.req.${table.entityName}UpdateReq; +import ${table.packageName}.model.dto.resp.${table.entityName}Resp; +import ${table.packageName}.model.entity.${table.entityName}; +#if($exportExcel || $importExcel) +import ${table.packageName}.model.dto.excel.${table.entityName}Excel; +#end +import ${table.packageName}.service.${table.entityName}Service; +import ${table.packageName}.service.base.${table.entityName}BaseService; +import java.util.Objects; +#if($exportExcel) +import java.util.List; +#end + +/** + *Title : ${table.entityName}ServiceImpl
+ *Description : $!{table.businessName} ServiceImpl
+ *Company : org.xujun
+ * + * @author : ${table.author} + * @version : ${version} + * @date : ${date} + */ +@Primary +@Service +@RequiredArgsConstructor +public class ${table.entityName}ServiceImpl implements ${table.entityName}Service { + + private final ${table.entityName}BaseService ${table.propName}BaseService; + + private final ${table.entityName}Convert ${table.propName}Convert; + + /** + * 分页查询 + * + * @param pageReq 分页请求 + * @return 分页结果 + */ + @Override + public ResultTitle : GenApplication
+ *Description : GenApplication
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/01/17 12:30 + */ +@Slf4j +@SpringBootApplication +public class GenApplication { + + /** + * Main + * + * @param args 参数 + */ + static void main(String[] args) { + StopWatch sw = new StopWatch(); + sw.start(); + runApp(args); + sw.stop(); + log.info(AppUtils.info(sw.getTotalTimeMillis())); + } + + /** + * 运行 App + * + * @param args 参数 + */ + public static void runApp(String[] args) { + SpringApplication.run(GenApplication.class, args); + } +} diff --git a/xtools-app-gen/xtools-app-gen-boot/src/main/resources/application-app-gen.yml b/xtools-app-gen/xtools-app-gen-boot/src/main/resources/application-app-gen.yml new file mode 100644 index 0000000..271d18a --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-boot/src/main/resources/application-app-gen.yml @@ -0,0 +1,82 @@ +# 代码生成器配置 +gen: + # 下载代码文件名称 + downloadFileName: xtools-code.zip + # 后端项目名称 + backendAppName: xtools-app + # 前端项目名称 + frontendAppName: xtools-manager + # 排除数据表 + excludeTables: + - log + # 默认配置 + defaultConfig: + # 作者 + author: xujun + # 版本 + version: 1.0.0 + # 模块名称 + moduleName: system + # 过滤配置 + filterConfig: + # 列注释过滤(正则) + columnRemarks: + - '\[.*?]' + # 模板配置 + templateConfigs: + TS_API: + templatePath: gen/ts/api.ts.vm + subPackageName: api + extension: .ts + VUE_VIEW: + templatePath: gen/vue/index.vue.vm + subPackageName: view + extension: .vue + Api: + templatePath: gen/api/api.java.vm + subPackageName: api + projectModule: api + Call: + templatePath: gen/call/call.java.vm + subPackageName: call + projectModule: call + Controller: + templatePath: gen/controller/controller.java.vm + subPackageName: controller + Convert: + templatePath: gen/convert/convert.java.vm + subPackageName: convert + BaseService: + templatePath: gen/service/serviceBase.java.vm + subPackageName: service.base + Service: + templatePath: gen/service/service.java.vm + subPackageName: service + ServiceImpl: + templatePath: gen/service/serviceImpl.java.vm + subPackageName: service.impl + Mapper: + templatePath: gen/mapper/mapper.java.vm + subPackageName: mapper + Entity: + templatePath: gen/model/entity/entity.java.vm + subPackageName: model.entity + PageReq: + templatePath: gen/model/dto/pageReq.java.vm + subPackageName: model.dto.req + AddReq: + templatePath: gen/model/dto/addReq.java.vm + subPackageName: model.dto.req + UpdateReq: + templatePath: gen/model/dto/updateReq.java.vm + subPackageName: model.dto.req + Resp: + templatePath: gen/model/dto/resp.java.vm + subPackageName: model.dto.resp + Excel: + templatePath: gen/model/dto/excel.java.vm + subPackageName: model.dto.excel + Sql: + templatePath: gen/sql/db.sql.vm + subPackageName: + extension: .sql diff --git a/xtools-app-gen/xtools-app-gen-boot/src/main/resources/application-nacos.yml b/xtools-app-gen/xtools-app-gen-boot/src/main/resources/application-nacos.yml new file mode 100644 index 0000000..fc864a5 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-boot/src/main/resources/application-nacos.yml @@ -0,0 +1,45 @@ +# Spring 信息 +spring: + cloud: + # Nacos 配置信息 + nacos: + # Nacos 发现配置信息 + discovery: + # Nacos 发现服务器地址 + server-addr: ${NACOS_SERVICE_HOST:127.0.0.1}:${NACOS_SERVICE_PORT:8848} + # Nacos 发现服务器用户名 + username: ${NACOS_SERVICE_USERNAME:nacos} + # Nacos 发现服务器密码 + password: ${NACOS_SERVICE_PASSWORD:nacos} + # Nacos 发现服务器命名空间(默认为Public),可以省略不写 + namespace: ${NACOS_DISCOVERY_NAMESPACE:xtools-cloud} + # 仅ipv4模式 + ip-type: IPv4 + # Nacos 配置中心信息 + config: + # Nacos 配置服务器地址 + server-addr: ${NACOS_SERVICE_HOST:127.0.0.1}:${NACOS_SERVICE_PORT:8848} + # Nacos 配置服务器用户名 + username: ${NACOS_SERVICE_USERNAME:nacos} + # Nacos 配置服务器密码 + password: ${NACOS_SERVICE_PASSWORD:nacos} + # Nacos 配置服务器命名空间(默认为Public),可以省略不写 + namespace: ${NACOS_CONFIG_NAMESPACE:xtools-cloud} + # 配置文件 + config: + import: + # Boot配置文件 + - nacos:application-boot-base.yaml?refreshEnabled=true&group=BOOT + - nacos:application-boot-db.yaml?refreshEnabled=true&group=BOOT + - nacos:application-boot-druid.yaml?refreshEnabled=true&group=BOOT + - nacos:application-boot-knife4j.yaml?refreshEnabled=true&group=BOOT + - nacos:application-boot-log.yaml?refreshEnabled=true&group=BOOT + - nacos:application-boot-mybatis-plus.yaml?refreshEnabled=true&group=BOOT + - nacos:application-boot-monitor.yaml?refreshEnabled=true&group=BOOT + - nacos:application-boot-rabbitmq.yaml?refreshEnabled=true&group=BOOT + - nacos:application-boot-redis.yaml?refreshEnabled=true&group=BOOT + # Cloud配置文件 + - nacos:application-cloud-sentinel.yaml?refreshEnabled=true&group=CLOUD + # Customizer配置文件 + - nacos:application-customizer-log.yaml?refreshEnabled=true&group=CUSTOMIZER + # App配置文件 \ No newline at end of file diff --git a/xtools-app-gen/xtools-app-gen-boot/src/main/resources/application.yml b/xtools-app-gen/xtools-app-gen-boot/src/main/resources/application.yml new file mode 100644 index 0000000..1e77674 --- /dev/null +++ b/xtools-app-gen/xtools-app-gen-boot/src/main/resources/application.yml @@ -0,0 +1,17 @@ +# Spring 配置 +spring: + # 应用配置 + application: + # 应用名称 + name: xtools-app-gen + # 环境配置 + profiles: + active: + - info + - nacos + - app-gen + +# 服务器配置 +server: + # 端口 + port: ${GEN_SERVICE_PORT:18002} \ No newline at end of file diff --git a/xtools-app-monitor/pom.xml b/xtools-app-monitor/pom.xml new file mode 100644 index 0000000..a1d3e28 --- /dev/null +++ b/xtools-app-monitor/pom.xml @@ -0,0 +1,20 @@ + +Title : MonitorApplication
+ *Description : MonitorApplication
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/01/17 12:30 + */ +@Slf4j +@EnableAdminServer +@SpringBootApplication +public class MonitorApplication { + + /** + * Main + * + * @param args 参数 + */ + static void main(String[] args) { + StopWatch sw = new StopWatch(); + sw.start(); + runApp(args); + sw.stop(); + log.info(AppUtils.info(sw.getTotalTimeMillis())); + } + + /** + * 运行App + * + * @param args 参数 + */ + public static void runApp(String[] args) { + SpringApplication.run(MonitorApplication.class, args); + } + +} \ No newline at end of file diff --git a/xtools-app-monitor/xtools-app-monitor-boot/src/main/java/xtools/app/monitor/boot/config/SecurityConfig.java b/xtools-app-monitor/xtools-app-monitor-boot/src/main/java/xtools/app/monitor/boot/config/SecurityConfig.java new file mode 100644 index 0000000..a5abfb0 --- /dev/null +++ b/xtools-app-monitor/xtools-app-monitor-boot/src/main/java/xtools/app/monitor/boot/config/SecurityConfig.java @@ -0,0 +1,77 @@ +package xtools.app.monitor.boot.config; + +import de.codecentric.boot.admin.server.config.AdminServerProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; + +/** + *Title : SecurityConfig
+ *Description : SecurityConfig
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/01/17 12:30 + */ +@Configuration +public class SecurityConfig { + + /** + * Admin配置信息 + **/ + private final String adminContextPath; + + /** + * 构造方法 + * + * @param adminServerProperties AdminServer配置信息 + */ + public SecurityConfig(AdminServerProperties adminServerProperties) { + this.adminContextPath = adminServerProperties.getContextPath(); + } + + /** + * 自定义Security过滤链 + * + * @param httpSecurity HttpSecurity + * @return Security过滤链 + */ + @Bean + SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) { + // 登录成功处理类 + SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); + successHandler.setTargetUrlParameter("redirectTo"); + successHandler.setDefaultTargetUrl(adminContextPath + "/"); + + // 无需授权的资源 + String[] urls = { + // 静态文件 + adminContextPath + "/assets/**", + // 登录页面 + adminContextPath + "/login" + }; + + httpSecurity + .headers(header -> header.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + // 授权机制 + .authorizeHttpRequests(auth -> auth.requestMatchers(urls).permitAll().anyRequest().authenticated()) + // 登录页面配置,用于替换security默认页面 + .formLogin(req -> req.loginPage(adminContextPath + "/login").successHandler(successHandler)) + // 登出页面配置,用于替换security默认页面 + .logout(req -> req.logoutUrl(adminContextPath + "/logout")) + // 启用httpBasic认证模式 + .httpBasic(httpBasic -> { + }) + // 禁用csrf + .csrf(AbstractHttpConfigurer::disable); + return httpSecurity.build(); + } + +} \ No newline at end of file diff --git a/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application-app-monitor.yaml b/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application-app-monitor.yaml new file mode 100644 index 0000000..49f4336 --- /dev/null +++ b/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application-app-monitor.yaml @@ -0,0 +1,9 @@ +spring: + boot: + admin: + # UI配置 + ui: + # 页面标题 + title: ${MONITOR_UI_TITLE:xToolsMonitor} + # 导航栏中显示的品牌 + brand: ${MONITOR_UI_BRAND:xToolsMonitor} \ No newline at end of file diff --git a/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application-info.yml b/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application-info.yml new file mode 100644 index 0000000..6d74815 --- /dev/null +++ b/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application-info.yml @@ -0,0 +1,15 @@ +# App信息 +info: + app: + # 作者 + author: '@project.organization.name@' + # 项目名 + name: '@project.artifactId@' + # 版本号 + version: '@project.version@' + # 项目编码 + encoding: '@project.build.sourceEncoding@' + # Url + url: '@project.organization.url@' + # Java版本 + java: '@java.version@' diff --git a/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application-nacos.yml b/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application-nacos.yml new file mode 100644 index 0000000..ea1a6c1 --- /dev/null +++ b/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application-nacos.yml @@ -0,0 +1,35 @@ +# Spring 信息 +spring: + cloud: + # Nacos 配置信息 + nacos: + # Nacos 发现配置信息 + discovery: + # Nacos 发现服务器地址 + server-addr: ${NACOS_SERVICE_HOST:127.0.0.1}:${NACOS_SERVICE_PORT:8848} + # Nacos 发现服务器用户名 + username: ${NACOS_SERVICE_USERNAME:nacos} + # Nacos 发现服务器密码 + password: ${NACOS_SERVICE_PASSWORD:nacos} + # Nacos 发现服务器命名空间(默认为Public),可以省略不写 + namespace: ${NACOS_DISCOVERY_NAMESPACE:xtools-cloud} + # 仅ipv4模式 + ip-type: IPv4 + # Nacos 配置中心信息 + config: + # Nacos 配置服务器地址 + server-addr: ${NACOS_SERVICE_HOST:127.0.0.1}:${NACOS_SERVICE_PORT:8848} + # Nacos 配置服务器用户名 + username: ${NACOS_SERVICE_USERNAME:nacos} + # Nacos 配置服务器密码 + password: ${NACOS_SERVICE_PASSWORD:nacos} + # Nacos 配置服务器命名空间(默认为Public),可以省略不写 + namespace: ${NACOS_CONFIG_NAMESPACE:xtools-cloud} + # 配置文件 + config: + import: + # Boot配置文件 + - nacos:application-boot-log.yaml?refreshEnabled=true&group=BOOT + - nacos:application-boot-monitor.yaml?refreshEnabled=true&group=BOOT + # App配置文件 + - nacos:application-app-monitor.yaml?refreshEnabled=true&group=APP \ No newline at end of file diff --git a/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application.yml b/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application.yml new file mode 100644 index 0000000..826126d --- /dev/null +++ b/xtools-app-monitor/xtools-app-monitor-boot/src/main/resources/application.yml @@ -0,0 +1,16 @@ +# Spring 配置 +spring: + # 应用配置 + application: + # 应用名称 + name: xtools-app-monitor + # 环境配置 + profiles: + active: + - info + - nacos + +# 服务器配置 +server: + # 端口 + port: ${MONITOR_SERVICE_PORT:18100} \ No newline at end of file diff --git a/xtools-app-monitor/xtools-app-monitor-client/pom.xml b/xtools-app-monitor/xtools-app-monitor-client/pom.xml new file mode 100644 index 0000000..9e14513 --- /dev/null +++ b/xtools-app-monitor/xtools-app-monitor-client/pom.xml @@ -0,0 +1,37 @@ + +Title : BootAdminFilterWhitelist
+ *Description : BootAdminFilterWhitelist
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/3/8 12:28 + */ +@Component +public class BootAdminFilterWhitelist implements FilterWhitelist { + + /** + * 添加过滤器白名单 + * + * @return 过滤器白名单 + */ + @Override + public SetTitle : SecurityConfig
+ *Description : SecurityConfig
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/01/17 12:30 + */ +@Configuration +//@AutoConfiguration(before = ManagementWebSecurityAutoConfiguration.class) +public class BootAdminSecurityConfig { + + /** + * 自定义Security过滤链 + * + * @param httpSecurity HttpSecurity + * @return Security过滤链 + */ + @Bean + SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) { + httpSecurity + // [/actuator/**]下的所有请求需要权限,其他请求全部允许 + .authorizeHttpRequests( + auth -> auth.requestMatchers("/actuator/**").authenticated().anyRequest().permitAll()) + // 启用httpBasic认证模式 + .httpBasic(_ -> { + }) + // 禁用csrf + .csrf(AbstractHttpConfigurer::disable); + return httpSecurity.build(); + } +} \ No newline at end of file diff --git a/xtools-app-monitor/xtools-app-monitor-client/src/main/resources/application-info.yml b/xtools-app-monitor/xtools-app-monitor-client/src/main/resources/application-info.yml new file mode 100644 index 0000000..6d74815 --- /dev/null +++ b/xtools-app-monitor/xtools-app-monitor-client/src/main/resources/application-info.yml @@ -0,0 +1,15 @@ +# App信息 +info: + app: + # 作者 + author: '@project.organization.name@' + # 项目名 + name: '@project.artifactId@' + # 版本号 + version: '@project.version@' + # 项目编码 + encoding: '@project.build.sourceEncoding@' + # Url + url: '@project.organization.url@' + # Java版本 + java: '@java.version@' diff --git a/xtools-app-standalone/Dockerfile b/xtools-app-standalone/Dockerfile new file mode 100644 index 0000000..44eba10 --- /dev/null +++ b/xtools-app-standalone/Dockerfile @@ -0,0 +1,10 @@ +FROM registry.cn-hangzhou.aliyuncs.com/xujun-public/liberica-openjdk-rocky:25.0.1-11 +MAINTAINER org.xujun + +ENV JVM_OPTS="" + +RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone +WORKDIR /data0/app +COPY target/xtools-app-standalone-1.0.0.jar /data0/app/xtools-app-standalone.jar + +ENTRYPOINT ["/bin/sh", "-c", "java ${JVM_OPTS} -jar /data0/app/xtools-app-standalone.jar"] \ No newline at end of file diff --git a/xtools-app-standalone/pom.xml b/xtools-app-standalone/pom.xml new file mode 100644 index 0000000..66fd0ea --- /dev/null +++ b/xtools-app-standalone/pom.xml @@ -0,0 +1,63 @@ + +Title : StandaloneApplication
+ *Description : StandaloneApplication
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/01/17 12:30 + */ +@Slf4j +@SpringBootApplication +public class StandaloneApplication { + + /** + * Main + * + * @param args 参数 + */ + static void main(String[] args) { + StopWatch sw = new StopWatch(); + sw.start(); + runApp(args); + sw.stop(); + log.info(AppUtils.info(sw.getTotalTimeMillis())); + + } + + /** + * 运行 App + * + * @param args 参数 + */ + public static void runApp(String[] args) { + SpringApplication.run(StandaloneApplication.class, args); + } +} diff --git a/xtools-app-standalone/src/main/resources/application-app-gen.yml b/xtools-app-standalone/src/main/resources/application-app-gen.yml new file mode 100644 index 0000000..271d18a --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-app-gen.yml @@ -0,0 +1,82 @@ +# 代码生成器配置 +gen: + # 下载代码文件名称 + downloadFileName: xtools-code.zip + # 后端项目名称 + backendAppName: xtools-app + # 前端项目名称 + frontendAppName: xtools-manager + # 排除数据表 + excludeTables: + - log + # 默认配置 + defaultConfig: + # 作者 + author: xujun + # 版本 + version: 1.0.0 + # 模块名称 + moduleName: system + # 过滤配置 + filterConfig: + # 列注释过滤(正则) + columnRemarks: + - '\[.*?]' + # 模板配置 + templateConfigs: + TS_API: + templatePath: gen/ts/api.ts.vm + subPackageName: api + extension: .ts + VUE_VIEW: + templatePath: gen/vue/index.vue.vm + subPackageName: view + extension: .vue + Api: + templatePath: gen/api/api.java.vm + subPackageName: api + projectModule: api + Call: + templatePath: gen/call/call.java.vm + subPackageName: call + projectModule: call + Controller: + templatePath: gen/controller/controller.java.vm + subPackageName: controller + Convert: + templatePath: gen/convert/convert.java.vm + subPackageName: convert + BaseService: + templatePath: gen/service/serviceBase.java.vm + subPackageName: service.base + Service: + templatePath: gen/service/service.java.vm + subPackageName: service + ServiceImpl: + templatePath: gen/service/serviceImpl.java.vm + subPackageName: service.impl + Mapper: + templatePath: gen/mapper/mapper.java.vm + subPackageName: mapper + Entity: + templatePath: gen/model/entity/entity.java.vm + subPackageName: model.entity + PageReq: + templatePath: gen/model/dto/pageReq.java.vm + subPackageName: model.dto.req + AddReq: + templatePath: gen/model/dto/addReq.java.vm + subPackageName: model.dto.req + UpdateReq: + templatePath: gen/model/dto/updateReq.java.vm + subPackageName: model.dto.req + Resp: + templatePath: gen/model/dto/resp.java.vm + subPackageName: model.dto.resp + Excel: + templatePath: gen/model/dto/excel.java.vm + subPackageName: model.dto.excel + Sql: + templatePath: gen/sql/db.sql.vm + subPackageName: + extension: .sql diff --git a/xtools-app-standalone/src/main/resources/application-app-sys.yaml b/xtools-app-standalone/src/main/resources/application-app-sys.yaml new file mode 100644 index 0000000..24f9fbf --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-app-sys.yaml @@ -0,0 +1,10 @@ +# 系统配置 +sys: + # 用户配置 + user: + # 初始化密码 + passwd: ${SYS_USER_PASSWD:xtools} + # 日志配置 + log: + # 存储类型(elasticsearch|mysql) + type: ${SYS_LOG_TYPE:elasticsearch} \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-boot-base.yaml b/xtools-app-standalone/src/main/resources/application-boot-base.yaml new file mode 100644 index 0000000..a851251 --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-base.yaml @@ -0,0 +1,10 @@ +# Spring 配置 +spring: + # 虚拟线程配置 + threads: + virtual: + enabled: true + # jackson配置 + jackson: + # 不输出null + default-property-inclusion: non_null \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-boot-db.yaml b/xtools-app-standalone/src/main/resources/application-boot-db.yaml new file mode 100644 index 0000000..2a0930e --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-db.yaml @@ -0,0 +1,41 @@ +# 数据库配置 +spring: + datasource: + # 数据源名称 + name: mysqlDataSource + # 数据库驱动 + driverClassName: com.mysql.cj.jdbc.Driver + # 数据库连接地址 + url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:xtools}?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + # 数据库用户名 + username: ${DB_USERNAME:root} + # 数据库密码 + password: ${DB_PASSWORD:root} + # 数据库类型 + type: com.alibaba.druid.pool.DruidDataSource + druid: + # 连接池配置 + # 初始化时建立物理连接的个数.初始化发生在显示调用init方法,或者第一次getConnection时 + initial-size: 1 + # 最小连接池数量 + min-idle: 5 + # 最大连接池数量 + max-active: 30 + # 获取连接时最大等待时间,单位毫秒.配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁 + max-wait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + time-between-eviction-runs-millis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + min-evictable-idle-time-millis: 300000 + # 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'.如果validationQuery为null,testOnBorrow,testOnReturn,testWhileIdle都不会起作用 + validation-query: SELECT 'x' + # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 + test-on-borrow: false + # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 + test-on-return: false + # 建议配置为true,不影响性能,并且保证安全性.申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效 + test-while-idle: true + # 是否缓存preparedStatement,也就是PSCache.PSCache对支持游标的数据库性能提升巨大,比如说oracle.在mysql下建议关闭 + pool-prepared-statements: false + # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true.在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 + max-pool-prepared-statement-per-connection-size: 10 \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-boot-druid.yaml b/xtools-app-standalone/src/main/resources/application-boot-druid.yaml new file mode 100644 index 0000000..996c678 --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-druid.yaml @@ -0,0 +1,35 @@ +# 数据库配置 +spring: + datasource: + druid: + # 使用的过滤器类型 + filters: stat,wall,config + + # WebStatFilter配置 + web-stat-filter: + # 是否启用WebStatFilter + enabled: true + # 过滤地址 + url-pattern: /* + # 过滤地址排除 + exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/actuator,/actuator/*,/druid/*" + + # StatViewServlet配置 + stat-view-servlet: + # 是否启用StatViewServlet + enabled: true + # 监控地址前缀 + url-pattern: /druid/* + # 能否重置数据 + reset-enable: false + # 登录用户名 + login-username: ${DRUID_USERNAME:xtools} + # 登录密码 + login-password: ${DRUID_PASSWORD:xtools321} + # IP白名单 + allow: + # IP黑名单(黑名单优先级高于白名单) + deny: + + # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔 +# aop-patterns: "xtools.app.*,*" \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-boot-elasticsearch.yaml b/xtools-app-standalone/src/main/resources/application-boot-elasticsearch.yaml new file mode 100644 index 0000000..e198c26 --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-elasticsearch.yaml @@ -0,0 +1,9 @@ +# elasticsearch配置 +spring: + elasticsearch: + # elasticsearch地址 + uris: ${ELASTICSEARCH_URIS:http://127.0.0.1:9200} + # 账号 + username: ${ELASTICSEARCH_USERNAME:elastic} + # 密码 + password: ${ELASTICSEARCH_PASSWORD:123456} \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-boot-knife4j.yaml b/xtools-app-standalone/src/main/resources/application-boot-knife4j.yaml new file mode 100644 index 0000000..a863ae1 --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-knife4j.yaml @@ -0,0 +1,22 @@ +# springdoc-openapi项目配置 +springdoc: + swagger-ui: + enabled: true + path: /swagger-ui.html + tags-sorter: alpha + operations-sorter: alpha + api-docs: + enabled: true + path: /v3/api-docs + group-configs: + - group: 'default' + paths-to-match: '/**' + # packages-to-scan: xtools.app + +# knife4j的增强配置,不需要增强可以不配 +knife4j: + # 是否为生产环境,开启生产环境后swagger不可用,需要同时配置production,enable为true + production: false + enable: false + setting: + language: zh_cn \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-boot-log.yaml b/xtools-app-standalone/src/main/resources/application-boot-log.yaml new file mode 100644 index 0000000..ad9fbee --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-log.yaml @@ -0,0 +1,4 @@ +# 日志配置 +logging: + level: + root: info diff --git a/xtools-app-standalone/src/main/resources/application-boot-monitor.yaml b/xtools-app-standalone/src/main/resources/application-boot-monitor.yaml new file mode 100644 index 0000000..ad51ecc --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-monitor.yaml @@ -0,0 +1,38 @@ +# 管理信息配置 +management: + info: + env: + # 是否显示项目信息 + enabled: true + endpoint: + health: + # health endpoint是否必须显示全部细节 + show-details: always + endpoints: + web: + exposure: + # 暴露的管理模块 + include: "*" + +spring: + # Spring安全信息配置 + security: + user: + # 用户名 + name: ${SPRING_SECURITY_USERNAME:admin} + # 密码 + password: ${SPRING_SECURITY_PASSWORD:123456} + cloud: + nacos: + discovery: + metadata: + user: + # 认证用户名 + name: ${spring.security.user.name} + # 认证密码 + password: ${spring.security.user.password} + management: + # 服务器上下文路径服务器路径改变后需要改变监控地址 + context-path: /actuator + # 服务器上下文路径服务器路径改变后需要改变心跳地址 + health: /health \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-boot-mybatis-plus.yaml b/xtools-app-standalone/src/main/resources/application-boot-mybatis-plus.yaml new file mode 100644 index 0000000..c6b316d --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-mybatis-plus.yaml @@ -0,0 +1,8 @@ +# MyBatisPlus 配置 +mybatis-plus: + global-config: + # 控制台是否打印 LOGO + banner: false +# configuration: +# # 打印 SQL +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-boot-rabbitmq.yaml b/xtools-app-standalone/src/main/resources/application-boot-rabbitmq.yaml new file mode 100644 index 0000000..129dbb5 --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-rabbitmq.yaml @@ -0,0 +1,13 @@ +# rabbitmq 配置 +spring: + rabbitmq: + # 主机地址 + host: ${RABBITMQ_HOST:127.0.0.1} + # 端口 + port: ${RABBITMQ_PORT:5672} + # 用户名 + username: ${RABBITMQ_USERNAME:admin} + # 密码 + password: ${RABBITMQ_PASSWORD:123456} + # 虚拟主机 + virtual-host: ${RABBITMQ_VIRTUAL_HOST:xtools-app} \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-boot-redis.yaml b/xtools-app-standalone/src/main/resources/application-boot-redis.yaml new file mode 100644 index 0000000..803265e --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-redis.yaml @@ -0,0 +1,26 @@ +spring: + data: + # Redis 配置 + redis: + # 数据库索引(默认为0) + database: ${REDIS_DATABASE:0} + # 服务器地址 + host: ${REDIS_HOST:127.0.0.1} + # 服务器连接端口 + port: ${REDIS_PORT:6379} + # 服务器连接密码(默认为空) + password: ${REDIS_PASSWORD:123456} + # 连接超时时间(毫秒) + timeout: 100000 + lettuce: + # 连接池中的关闭超时时间 + shutdown-timeout: 100000 + pool: + # 连接池最大连接数(使用负值表示没有限制) + max-active: 50 + # 连接池中的最大空闲连接 + max-idle: 10 + # 连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1 + # 连接池中的最小空闲连接 + min-idle: 5 \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-boot-storage.yaml b/xtools-app-standalone/src/main/resources/application-boot-storage.yaml new file mode 100644 index 0000000..23eb66f --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-storage.yaml @@ -0,0 +1,18 @@ +# 存储配置 +storage: + # 存储类型[file|s3](并且需要引入对应的jar包) + type: ${STORAGE_TYPE:file} + # 文件类型 + file: + # 文件存储路径 + path: ${STORAGE_FILE_PATH:/data/xtools/file} + # S3类型 + s3: + # 服务类型(可为空)[rustfs] + server: ${STORAGE_S3_SERVER:rustfs} + # 地址 + host: ${STORAGE_S3_HOST:http://127.0.0.1:9000} + # 密钥ID + accessKeyId: ${STORAGE_S3_ACCESS_KEY_ID:admin} + # 密钥 + secretAccessKey: ${STORAGE_S3_SECRET_ACCESS_KEY:123456} diff --git a/xtools-app-standalone/src/main/resources/application-boot-xxl-job.yaml b/xtools-app-standalone/src/main/resources/application-boot-xxl-job.yaml new file mode 100644 index 0000000..c8408e9 --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-boot-xxl-job.yaml @@ -0,0 +1,26 @@ +xxl: + job: + admin: + # 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔.执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册; + addresses: ${XXL_JOB_ADMIN_ADDR:http://127.0.0.1:8080/xxl-job-admin} + # 调度中心通讯TOKEN [选填]:非空时启用; + accessToken: ${XXL_JOB_ADMIN_TOKEN:xtools-app-xxl-job} + # 调度中心通讯超时时间[选填],单位秒;默认3s; + timeout: ${XXL_JOB_ADMIN_TIMEOUT:3} + executor: + # 执行器启用开关 [选填]:默认开启,关闭时不进行执行器初始化; + enabled: ${XXL_JOB_ENABLED:false} + # 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册 + appName: ${spring.application.name} + # 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址.从而更灵活支持容器类型执行器动态IP和动态映射端口问题. + address: ${XXL_JOB_ADDR:} + # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯使用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; + ip: ${XXL_JOB_IP:} + # 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; + port: ${XXL_JOB_PORT:9999} + # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; + logPath: ${XXL_JOB_LOG_PATH:} + # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; + logRetentionDays: ${XXL_JOB_LOG_RETENTION_DAYS:30} + # 任务扫描排除路径 [选填] :任务扫描时忽略指定包路径下的Bean;支持配置包路径前缀,多个逗号分隔; + excludedPackage: ${XXL_JOB_EXCLUDED_PACKAGE:} \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-cloud-sentinel.yaml b/xtools-app-standalone/src/main/resources/application-cloud-sentinel.yaml new file mode 100644 index 0000000..7bf0468 --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-cloud-sentinel.yaml @@ -0,0 +1,14 @@ +# Sentinel配置 +spring: + cloud: + sentinel: + # 启动时立即注册 + eager: true + log: + # sentinel日志保存路径 + dir: ${SENTINEL_LOG_DIR:/data/xtools/scp}/${spring.application.name} + transport: + # dashboard服务器地址[默认值:127.0.0.1:8080] + dashboard: ${SENTINEL_DASHBOARD:127.0.0.1:8080} + # 指定客户端ip(防止ipv6的情况) + client-ip: ${CLIENT_IP:} \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-customizer-api.yaml b/xtools-app-standalone/src/main/resources/application-customizer-api.yaml new file mode 100644 index 0000000..9c47d29 --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-customizer-api.yaml @@ -0,0 +1,6 @@ +# api配置 +api: + # 百度api + baidu: + # 百度地图ak + ak: ${API_BAIDU_AK:abc} \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application-customizer-log.yaml b/xtools-app-standalone/src/main/resources/application-customizer-log.yaml new file mode 100644 index 0000000..9403ced --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application-customizer-log.yaml @@ -0,0 +1,22 @@ +# 系统日志配置 +sys: + log: + # 追踪配置 + track: + # 日志追踪忽略路径 + ignore-path: + - /sys/login/captcha/* + - /sys/log/* + - /sys/log/*/* + - /sys/dict/getByCode/* + - /sys/home/* + # LogBus 配置 + bus: + # 是否打印日志 + print: false + # 包含的堆栈信息(开始的包名) + include-stack-trace: + - xtools + - org.xujun + # 日志项最大长度 + logDataItemMax: -1 \ No newline at end of file diff --git a/xtools-app-standalone/src/main/resources/application.yml b/xtools-app-standalone/src/main/resources/application.yml new file mode 100644 index 0000000..a2c9cb9 --- /dev/null +++ b/xtools-app-standalone/src/main/resources/application.yml @@ -0,0 +1,32 @@ +# Spring 配置 +spring: + # 应用配置 + application: + # 应用名称 + name: xtools-app-standalone + # 环境配置 + profiles: + active: + # Boot + - boot-base + - boot-db + - boot-druid + - boot-elasticsearch + - boot-knife4j + - boot-log + - boot-mybatis-plus + - boot-rabbitmq + - boot-redis + - boot-xxl-job + - boot-storage + # Customizer + - customizer-api + - customizer-log + # App + - app-gen + - app-sys + +# 服务器配置 +server: + # 端口 + port: ${STANDALONE_SERVICE_PORT:18000} \ No newline at end of file diff --git a/xtools-app-sys/pom.xml b/xtools-app-sys/pom.xml new file mode 100644 index 0000000..27a7332 --- /dev/null +++ b/xtools-app-sys/pom.xml @@ -0,0 +1,29 @@ + +Title : SysAddressApi
+ *Description : 公用地址表 Api
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-13 15:02:53 + */ +public interface SysAddressApi { + + /** + * 根据code获取地址信息 + * + * @param code Code + * @return 地址信息 + */ + ResultTitle : SysDictItemApi
+ *Description : SysDictItemApi
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/27 10:36 + */ +public interface SysDictItemApi { + + /** + * 根据字典编码查询字典项 + * + * @param dictCode 字典编码 + * @return 字典项 + */ + ResultTitle : SysFileApi
+ *Description : 系统文件表 Api
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-14 13:44:03 + */ +public interface SysFileApi { + + /** + * 根据 ID 查询 + * + * @param id ID + * @return 结果 + */ + ResultTitle : SysParamApi
+ *Description : 系统参数表 Api
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-26 10:15:49 + */ +public interface SysParamApi { + + /** + * 添加 + * + * @param req 添加请求 + * @return 添加结果 + */ + ResultTitle : SysRiskApi
+ *Description : 系统风控表 Api
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-04-08 09:10:45 + */ +public interface SysRiskApi { + + /** + * 根据类型获取数据 + * + * @param type 类型 + * @return 数据 + */ + ResultTitle : SysRiskType
+ *Description : SysRiskType
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/4 16:27 + */ +public enum SysRiskType implements BaseEnum { + + // IP风控 + IP(1, "IP风控"), + // URI风控 + URI(2, "URI风控"), + ; + + /** + * 编码 + */ + private final int code; + + /** + * 说明 + */ + private final String desc; + + + /** + * 构造函数 + * + * @param code 编码 + * @param desc 说明 + */ + SysRiskType(int code, String desc) { + this.code = code; + this.desc = desc; + } + + /** + * 获取所有枚举 + * + * @return 所有枚举 + */ + @Override + public BaseEnum[] all() { + return values(); + } + + /** + * 获取枚举编码 + * + * @return 枚举编码 + */ + @Override + public int code() { + return code; + } + + /** + * 获取枚举说明 + * + * @return 枚举说明 + */ + @Override + public String desc() { + return desc; + } + +} diff --git a/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysFileAddReq.java b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysFileAddReq.java new file mode 100644 index 0000000..c051fd5 --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysFileAddReq.java @@ -0,0 +1,129 @@ +package xtools.app.sys.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.Instant; + +/** + *Title : SysFileAddReq
+ *Description : 系统文件表添加请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-14 13:44:03 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysFileAddReq implements Serializable { + + /** + * 用户id + */ + @Schema(description = "用户id") + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + private String userName; + + /** + * 业务id + */ + @Schema(description = "业务id") + private Long bizId; + + /** + * 业务类型 + */ + @Schema(description = "业务类型") + private String bizType; + + /** + * 权限 + */ + @Schema(description = "权限") + private Integer permission; + + /** + * 桶名称 + */ + @Schema(description = "桶名称") + private String bucket; + + /** + * 桶类型 + */ + @Schema(description = "桶类型") + private String storageType; + + /** + * 文件上传时间 + */ + @Schema(description = "文件上传时间") + private Instant uploadTime; + + /** + * 文件路径 + */ + @Schema(description = "文件路径") + private String filePath; + + /** + * 文件名 + */ + @Schema(description = "文件名") + private String fileName; + + /** + * 文件大小 + */ + @Schema(description = "文件大小") + private Long fileSize; + + /** + * 文件类型 + */ + @Schema(description = "文件类型") + private String fileType; + + /** + * MD5值 + */ + @Schema(description = "MD5值") + private String md5; + + /** + * SM3值 + */ + @Schema(description = "SM3值") + private String sm3; + + /** + * 数据类型 + */ + @Schema(description = "数据类型") + private Integer dataType; + + /** + * 过期时间 + */ + @Schema(description = "过期时间") + private Instant expireTime; + + /** + * 备注 + */ + @Schema(description = "备注") + private String memo; + +} \ No newline at end of file diff --git a/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysFileChangeReq.java b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysFileChangeReq.java new file mode 100644 index 0000000..155bf37 --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysFileChangeReq.java @@ -0,0 +1,42 @@ +package xtools.app.sys.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import xtools.boot.api.enums.FileDataType; + +import java.io.Serializable; +import java.util.List; + +/** + *Title : SysFileAddReq
+ *Description : 系统文件表添加请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-14 13:44:03 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysFileChangeReq implements Serializable { + + /** + * idList + */ + @NotNull(message = "不能为空") + @Schema(description = "Id列表") + private ListTitle : SysFileUpdateReq
+ *Description : 系统文件表更新请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-14 13:44:03 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysFileUpdateReq implements Serializable { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID") + private Long id; + + /** + * 用户id + */ + @Schema(description = "用户id") + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + private String userName; + + /** + * 业务id + */ + @Schema(description = "业务id") + private Long bizId; + + /** + * 业务类型 + */ + @Schema(description = "业务类型") + private String bizType; + + /** + * 权限 + */ + @Schema(description = "权限") + private Integer permission; + + /** + * 桶名称 + */ + @Schema(description = "桶名称") + private String bucket; + + /** + * 桶类型 + */ + @Schema(description = "桶类型") + private String storageType; + + /** + * 文件上传时间 + */ + @Schema(description = "文件上传时间") + private Instant uploadTime; + + /** + * 文件路径 + */ + @Schema(description = "文件路径") + private String filePath; + + /** + * 文件名 + */ + @Schema(description = "文件名") + private String fileName; + + /** + * 文件大小 + */ + @Schema(description = "文件大小") + private Long fileSize; + + /** + * 文件类型 + */ + @Schema(description = "文件类型") + private String fileType; + + /** + * MD5值 + */ + @Schema(description = "MD5值") + private String md5; + + /** + * SM3值 + */ + @Schema(description = "SM3值") + private String sm3; + + /** + * 数据类型 + */ + @Schema(description = "数据类型") + private Integer dataType; + + /** + * 过期时间 + */ + @Schema(description = "过期时间") + private Instant expireTime; + + /** + * 备注 + */ + @Schema(description = "备注") + private String memo; + +} \ No newline at end of file diff --git a/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysParamAddReq.java b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysParamAddReq.java new file mode 100644 index 0000000..79adc3e --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysParamAddReq.java @@ -0,0 +1,52 @@ +package xtools.app.sys.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import xtools.boot.api.anntation.IgnoreXss; + +import java.io.Serializable; + +/** + *Title : SysParamAddReq
+ *Description : 系统参数表添加请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-18 11:35:47 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysParamAddReq implements Serializable { + + /** + * 系统参数key + */ + @Schema(description = "系统参数key") + private String paramKey; + + /** + * 系统参数值 + */ + @IgnoreXss + @Schema(description = "系统参数值") + private String data; + + /** + * 参数值类型 + */ + @Schema(description = "参数值类型") + private Integer dataType; + + /** + * 备注 + */ + @Schema(description = "备注") + private String memo; + +} \ No newline at end of file diff --git a/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysParamUpdateReq.java b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysParamUpdateReq.java new file mode 100644 index 0000000..fac55ca --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/req/SysParamUpdateReq.java @@ -0,0 +1,58 @@ +package xtools.app.sys.model.dto.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import xtools.boot.api.anntation.IgnoreXss; + +import java.io.Serializable; + +/** + *Title : SysParamUpdateReq
+ *Description : 系统参数表更新请求对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-18 11:35:47 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysParamUpdateReq implements Serializable { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID") + private Long id; + + /** + * 系统参数key + */ + @Schema(description = "系统参数key") + private String paramKey; + + /** + * 系统参数值 + */ + @IgnoreXss + @Schema(description = "系统参数值") + private String data; + + /** + * 参数值类型 + */ + @Schema(description = "参数值类型") + private Integer dataType; + + /** + * 备注 + */ + @Schema(description = "备注") + private String memo; + +} \ No newline at end of file diff --git a/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysAddressResp.java b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysAddressResp.java new file mode 100644 index 0000000..a40c3de --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysAddressResp.java @@ -0,0 +1,73 @@ +package xtools.app.sys.model.dto.resp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import xtools.boot.api.model.entity.BaseEntity; + +/** + *Title : SysAddressResp
+ *Description : 公用地址表响应对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-13 15:02:40 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysAddressResp extends BaseEntity { + + /** + * 公用地址-ID + */ + @Schema(description = "公用地址-ID") + private Long id; + + /** + * 公用地址-父ID + */ + @Schema(description = "公用地址-父ID") + private Long parentId; + + /** + * 公用地址-唯一编码 + */ + @Schema(description = "公用地址-唯一编码") + private String code; + + /** + * 公用地址-类型 + */ + @Schema(description = "公用地址-类型") + private Integer type; + + /** + * 公用地址-名称 + */ + @Schema(description = "公用地址-名称") + private String title; + + /** + * 公用地址-经度 + */ + @Schema(description = "公用地址-经度") + private String lng; + + /** + * 公用地址-纬度 + */ + @Schema(description = "公用地址-纬度") + private String lat; + + /** + * 公用地址-备注 + */ + @Schema(description = "公用地址-备注") + private String memo; + +} diff --git a/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysDictItemResp.java b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysDictItemResp.java new file mode 100644 index 0000000..1f5e849 --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysDictItemResp.java @@ -0,0 +1,94 @@ +package xtools.app.sys.model.dto.resp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import xtools.boot.api.model.entity.BaseEntity; + +/** + *Title : SysDictItemResp
+ *Description : 数据字典项表响应对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-28 11:29:51 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysDictItemResp extends BaseEntity { + + + /** + * 主键 ID + */ + @Schema(description = "主键 ID", example = "1") + private Long id; + + + /** + * 关联字典编码,与sys_dict表中的dict_code对应 + */ + @Schema(description = "关联字典编码,与sys_dict表中的dict_code对应", example = "USER_STATUS") + private String dictCode; + + + /** + * 字典项值 + */ + @Schema(description = "字典项值", example = "1") + private String value; + + + /** + * 字典项标签 + */ + @Schema(description = "字典项标签", example = "启用") + private String label; + + + /** + * 标签类型,用于前端样式展示(如success,warning等) + */ + @Schema(description = "标签类型,用于前端样式展示(如success,warning等)", example = "success") + private String tagType; + + + /** + * 状态 + */ + @Schema(description = "状态", example = "1") + private Integer status; + + + /** + * 排序 + */ + @Schema(description = "排序", example = "1") + private Integer sort; + + + /** + * 创建人ID + */ + @Schema(description = "创建人ID", example = "1") + private Long createBy; + + + /** + * 修改人ID + */ + @Schema(description = "修改人ID", example = "1") + private Long updateBy; + + + /** + * 备注 + */ + @Schema(description = "备注", example = "启用状态") + private String memo; +} \ No newline at end of file diff --git a/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysFileResp.java b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysFileResp.java new file mode 100644 index 0000000..137526d --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysFileResp.java @@ -0,0 +1,138 @@ +package xtools.app.sys.model.dto.resp; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import xtools.boot.api.model.entity.BaseEntity; + +import java.time.Instant; + +/** + *Title : SysFileResp
+ *Description : 系统文件表响应对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-14 13:44:03 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysFileResp extends BaseEntity { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID") + private Long id; + + /** + * 用户id + */ + @Schema(description = "用户id") + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + private String userName; + + /** + * 业务id + */ + @Schema(description = "业务id") + private Long bizId; + + /** + * 业务类型 + */ + @Schema(description = "业务类型") + private String bizType; + + /** + * 权限 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING) + @Schema(description = "权限") + private Integer permission; + + /** + * 桶名称 + */ + @Schema(description = "桶名称") + private String bucket; + + /** + * 桶类型 + */ + @Schema(description = "桶类型") + private String storageType; + + /** + * 文件上传时间 + */ + @Schema(description = "文件上传时间") + private Instant uploadTime; + + /** + * 文件路径 + */ + @Schema(description = "文件路径") + private String filePath; + + /** + * 文件名 + */ + @Schema(description = "文件名") + private String fileName; + + /** + * 文件大小 + */ + @Schema(description = "文件大小") + private Long fileSize; + + /** + * 文件类型 + */ + @Schema(description = "文件类型") + private String fileType; + + /** + * MD5值 + */ + @Schema(description = "MD5值") + private String md5; + + /** + * SM3值 + */ + @Schema(description = "SM3值") + private String sm3; + + /** + * 数据类型 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING) + @Schema(description = "数据类型") + private Integer dataType; + + /** + * 过期时间 + */ + @Schema(description = "过期时间") + private Instant expireTime; + + /** + * 备注 + */ + @Schema(description = "备注") + private String memo; + +} \ No newline at end of file diff --git a/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysRiskResp.java b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysRiskResp.java new file mode 100644 index 0000000..ea8e182 --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-api/src/main/java/xtools/app/sys/model/dto/resp/SysRiskResp.java @@ -0,0 +1,67 @@ +package xtools.app.sys.model.dto.resp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import xtools.boot.api.model.entity.BaseEntity; + +/** + *Title : SysRiskResp
+ *Description : 系统风控表响应对象
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-04-08 09:10:45 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysRiskResp extends BaseEntity { + + /** + * 主键 ID + */ + @Schema(description = "主键 ID") + private Long id; + + /** + * 系统类型 + */ + @Schema(description = "系统类型") + private String sysType; + + /** + * 风控类型 + */ + @Schema(description = "风控类型") + private Integer type; + + /** + * 系统参数值 + */ + @Schema(description = "系统参数值") + private String data; + + /** + * 创建人ID + */ + @Schema(description = "创建人ID") + private Long createBy; + + /** + * 更新人ID + */ + @Schema(description = "更新人ID") + private Long updateBy; + + /** + * 备注 + */ + @Schema(description = "备注") + private String memo; + +} \ No newline at end of file diff --git a/xtools-app-sys/xtools-app-sys-auth/pom.xml b/xtools-app-sys/xtools-app-sys-auth/pom.xml new file mode 100644 index 0000000..39532a4 --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-auth/pom.xml @@ -0,0 +1,71 @@ + +Title : AuthFilter
+ *Description : AuthFilter
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/31 21:18 + */ +@Component +public class AuthFilter extends BaseFilter implements Ordered, BaseParams { + + /** + * 微服务标识 + */ + private static final String CLOUD_FLAG = String.valueOf(Boolean.TRUE); + + /** + * 缓存参数 + */ + private static final AppCache CACHE_PARAM = AppCache.AUTH_CLOUD_TOKEN; + + /** + * 权限白名单 + */ + private static final SetTitle : LoginUserHolder
+// *Description : LoginUserHolder
+// *DevelopTools : Idea_x64_v2026.1
+// *DevelopSystem : macOS Sequoia 15.7.5
+// *Company : org.xujun
+// * +// * @author : XuJun +// * @version : 1.0.0 +// * @date : 2026/1/31 21:20 +// */ +//public class AuthHolder { +// +// /** +// * 登录用户信息 +// */ +// private static final ScopedValueTitle : InterfacePermDto
+ *Description : InterfacePermDto
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/2 15:58 + */ +@Data +public class InterfacePermDto implements Serializable { + + /** + * 接口地址 + */ + private String uri; + + /** + * 接口类型 + */ + private String type; + + /** + * 角色 ID 集合 + */ + private ListTitle : LoginUserDto
+ *Description : LoginUserDto
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/31 20:40 + */ +@Data +public class LoginUserDto implements Serializable { + + /** + * 用户 ID + */ + private Long id; + + /** + * 账号 + */ + private String account; + + /** + * 昵称 + */ + private String nickname; + + /** + * 部门 ID + */ + private Long deptId; + + /** + * 角色 ID 集合 + */ + private ListTitle : TokenDto
+ *Description : TokenDto
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/31 14:43 + */ +@Data +public class TokenDto implements Serializable { + + /** + * 数据 Token + */ + @Schema(description = "数据 Token", example = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbi") + private String accessToken; + + /** + * 刷新 Token + */ + @Schema(description = "刷新 Token", example = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbi") + private String refreshToken; + + /** + * 数据 Token过期时间 + */ + @Schema(description = "数据 Token过期时间", example = "1675000000000") + private Long expiryTime; +} diff --git a/xtools-app-sys/xtools-app-sys-auth/src/main/java/xtools/app/sys/auth/utils/AuthUtils.java b/xtools-app-sys/xtools-app-sys-auth/src/main/java/xtools/app/sys/auth/utils/AuthUtils.java new file mode 100644 index 0000000..96b02cd --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-auth/src/main/java/xtools/app/sys/auth/utils/AuthUtils.java @@ -0,0 +1,327 @@ +package xtools.app.sys.auth.utils; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import jakarta.servlet.http.HttpServletRequest; +import xtools.app.common.cache.enums.AppCache; +import xtools.app.sys.auth.model.dto.LoginUserDto; +import xtools.app.sys.auth.model.dto.TokenDto; +import xtools.base.config.BaseParams; +import xtools.boot.api.constant.BootCommonConstant; +import xtools.boot.api.exection.BizError; +import xtools.boot.api.exection.UnauthorizedError; +import xtools.boot.cache.redis.base.RedisService; +import xtools.boot.cache.redis.utils.RedisUtils; +import xtools.boot.core.holder.CommonHolder; +import xtools.core.CollectionUtils; +import xtools.core.StringUtils; +import xtools.core.UuidUtils; +import xtools.core.extend.CheckUtils; +import xtools.web.HeaderUtils; + +import java.time.Instant; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + *Title : AuthUtils
+ *Description : AuthUtils
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/31 20:44 + */ +public class AuthUtils implements BaseParams { + + /** + * 缓存参数 + */ + private static final AppCache CACHE_PARAM = AppCache.AUTH_SYS_USER; + + /** + * accessTokenKey + */ + private static final String ACCESS_TOKEN_KEY = "Authorization"; + + /** + * accessToken + */ + private static final String ACCESS_TOKEN = "accessToken"; + + /** + * refreshToken + */ + private static final String REFRESH_TOKEN = "refreshToken"; + + /** + * user + */ + private static final String USER = "id"; + + /** + * mask + */ + private static final String MASK = "mask"; + + /** + * 缓存 KeyMap + */ + private static final MapTitle : PremUtils
+ *Description : PremUtils
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/2 18:31 + */ +public class PremUtils implements BaseParams { + + /** + * 缓存参数 + */ + private static final AppCache CACHE_PARAM = AppCache.AUTH_SYS_URI; + + /** + * 接口权限类型映射 + */ + private static final MapTitle : AuthWhitelist
+ *Description : AuthWhitelist
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/4/2 11:38 + */ +public interface AuthWhitelist { + + /** + * 添加权限白名单 + * + * @return 权限白名单 + */ + default SetTitle : ApiConfig
+ *Description : ApiConfig
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/16 11:01 + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "api") +public class ApiConfig { + + /** + * 百度 + */ + private Baidu baidu; + + /** + *Title : Baidu
+ *Description : 百度
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026-02-16 11:01:05 + */ + @Data + public static class Baidu { + // 百度地图ak + private String ak; + } +} diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/config/SysAuthWhitelist.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/config/SysAuthWhitelist.java new file mode 100644 index 0000000..9eeb12c --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/config/SysAuthWhitelist.java @@ -0,0 +1,47 @@ +package xtools.app.sys.config; + +import org.springframework.stereotype.Component; +import xtools.app.sys.auth.whitelist.AuthWhitelist; + +import java.util.Set; + +/** + *Title : SysAuthWhitelist
+ *Description : SysAuthWhitelist
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/4/2 14:13 + */ +@Component +public class SysAuthWhitelist implements AuthWhitelist { + + /** + * 添加权限白名单 + * + * @return 权限白名单 + */ + @Override + public SetTitle : SysConfig
+ *Description : SysConfig
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/14 10:19 + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "sys") +public class SysConfig { + + /** + * 用户 + */ + private User user; + + /** + * 日志 + */ + private Log log; + + /** + * 用户 + */ + @Data + public static class User { + + /** + * 密码 + */ + private String passwd = "xtools"; + } + + /** + * 日志 + */ + @Data + public static class Log { + + /** + * 存储类型(elasticsearch|mysql) + */ + private String type = "mysql"; + + /** + * 最大保存天数 + */ + private int maxDays = 2; + } + +} diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/config/SysHttpLogWhitelist.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/config/SysHttpLogWhitelist.java new file mode 100644 index 0000000..f336a79 --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/config/SysHttpLogWhitelist.java @@ -0,0 +1,34 @@ +package xtools.app.sys.config; + +import org.springframework.stereotype.Component; +import xtools.app.common.log.whitelist.HttpLogWhitelist; + +import java.util.Set; + +/** + *Title : SysHttpLogWhitelist
+ *Description : SysHttpLogWhitelist
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/4/2 14:50 + */ +@Component +public class SysHttpLogWhitelist implements HttpLogWhitelist { + + /** + * 添加白名单 + * + * @return 白名单 + */ + @Override + public SetTitle : SysLogMySqlConfig
+ *Description : SysLogMySqlConfig
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/2/14 10:29 + */ +@Slf4j +@Configuration +public class SysLogMySqlConfig { + + /** + * 日志类型mysql + */ + private static final String TYPE_MYSQL = "mysql"; + + + /** + * 获取数据库日志服务 + * + * @return 日志服务 + */ + @Bean + @ConditionalOnProperty(prefix = "sys.log", name = "type", havingValue = TYPE_MYSQL) + public SysLogService getDbSysLogService() { + log.info("系统日志存储类型:{}", TYPE_MYSQL); + return new SysLogServiceImpl(); + } + +} diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysAddressController.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysAddressController.java new file mode 100644 index 0000000..34691e0 --- /dev/null +++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysAddressController.java @@ -0,0 +1,45 @@ +package xtools.app.sys.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotEmpty; +import lombok.RequiredArgsConstructor; +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; +import xtools.app.sys.api.SysAddressApi; +import xtools.app.sys.model.dto.resp.SysAddressResp; +import xtools.app.sys.service.SysAddressService; +import xtools.boot.api.model.dto.Result; + +/** + *Title : SysAddressController
+ *Description : 公用地址表 Controller
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-03-13 15:02:40 + */ +@RequiredArgsConstructor +@Tag(name = "公用地址表") +@RestController +@RequestMapping("/sys/address") +public class SysAddressController implements SysAddressApi { + + private final SysAddressService sysAddressService; + + @Override + @Operation(summary = "根据code获取地址信息") + @GetMapping("/get-by-code/{code}") + public ResultTitle : SysBaseController
+ *Description : SysBaseController
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/29 22:25 + */ +@Slf4j +@Tag(name = "系统基本信息") +@RequiredArgsConstructor +@RestController +@RequestMapping("/sys/base") +public class SysBaseController { + + private final SysUpdateHistoryService sysUpdateHistoryService; + + private final SysBaseService sysBaseService; + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @Operation(summary = "获取用户信息") + @GetMapping("/get-user-info") + public ResultTitle : SysCommonController
+ *Description : SysCommonController
+ *DevelopTools : Idea_x64_v2026.1
+ *DevelopSystem : macOS Sequoia 15.7.5
+ *Company : org.xujun
+ * + * @author : XuJun + * @version : 1.0.0 + * @date : 2026/1/29 22:25 + */ +@Slf4j +@Tag(name = "系统通用") +@RequiredArgsConstructor +@RestController +@RequestMapping("/sys/common") +public class SysCommonController { + + private final SysCommonService sysCommonService; + + @Operation(summary = "获取SM2公钥") + @RequestMapping("/get-sm2-public-key") + public ResultTitle : SysDeptController
+ *Description : 部门管理表 Controller
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-28 14:59:40 + */ +@Tag(name = "部门管理表") +@RequiredArgsConstructor +@RestController +@RequestMapping("/sys/dept") +public class SysDeptController { + + private final SysDeptService sysDeptService; + + @Operation(summary = "分页请求") + @PostMapping("page") + public ResultTitle : SysDictController
+ *Description : 数据字典类型表 Controller
+ *Company : org.xujun
+ * + * @author : xujun + * @version : 1.0.0 + * @date : 2026-01-28 10:34:37 + */ +@Tag(name = "数据字典类型表") +@RequiredArgsConstructor +@RestController +@RequestMapping("/sys/dict") +public class SysDictController { + + private final SysDictService sysDictService; + + @Operation(summary = "分页请求") + @PostMapping("page") + public Result