Author SHA1 Message Date
odboy 44fa37eac3 feat(role): 添加角色菜单权限分配功能
- 后端新增 listRoleMenuByPid 接口用于获取角色菜单权限
- 前端新增 listRoleMenuByPid API 方法调用接口
- 修改角色页面布局,调整菜单授权区域宽度为6列
- 角色页面导入 listRoleMenuByPid 方法替换原有的 listMenuByPid
- 更新树形菜单数据加载方法,使用新的角色菜单权限接口
- 更改前端主题变量从 cyberorange 暗色主题为 cloudsky 亮色主题
2026-01-25 10:16:26 +08:00
odboy df841d64a2 style(theme): 新增主题 2026-01-25 10:10:03 +08:00
odboy 0514bbb8bb move(theme): 移动主题变量文件到主题目录并更新引用 2026-01-25 10:00:12 +08:00
odboy 833a515353 feat(styles): 更换主题样式为云天主题
- 将默认样式主题从 solarflare 替换为 cloudsky
- 新增 cloudsky、mint、oceanbreeze 三个主题样式文件
- 更新基础色彩变量包括蓝色、红色、绿色等配色方案
- 调整侧边栏菜单颜色、导航栏背景及阴影效果
- 优化面包屑导航、汉堡菜单按钮等组件样式变量
- 添加主题变量的 webpack 导出配置支持
2026-01-25 09:49:59 +08:00
odboy 17d812cba9 feat(styles): 更新主题样式变量配置
- 将默认主题从 technology5 替换为 solarflare 主题
- 新增 arcticaurora 主题样式变量文件
- 新增 solarflare 主题样式变量文件,包含全新的配色方案
- 更新导航栏、侧边栏、面包屑等组件的样式变量
- 添加新的颜色配置和渐变效果支持
2026-01-25 09:39:14 +08:00
odboy 34a3a39fea style(styles): 添加顶部导航栏和面包屑样式变量
- 为profession主题添加navbar、hamburger和breadcrumb相关样式变量
- 为technology4主题添加navbar、hamburger和breadcrumb相关样式变量
- 为technology5主题添加navbar、hamburger和breadcrumb相关样式变量
- 更新variables.scss引用从technology3切换到technology5
- 统一顶部导航栏背景渐变、阴影、悬停效果等样式定义
- 标准化面包屑导航文字颜色、链接颜色和悬停效果配置
2026-01-25 09:32:38 +08:00
odboy 77abc7b0e2 style(styles): 添加导航栏面包屑汉堡菜单样式变量并应用
- 在 variables.technology3.scss 中添加 Navbar 顶部导航栏样式变量
- 在 variables.technology3.scss 中添加 Hamburger 汉堡菜单按钮样式变量
- 在 variables.technology3.scss 中添加 Breadcrumb 面包屑导航样式变量
- 在 Breadcrumb 组件中应用新的面包屑样式变量
- 在 Hamburger 组件中应用新的汉堡菜单样式变量
- 在 Navbar 组件中应用新的导航栏样式变量
- 移除 Breadcrumb 组件中对 variables.technology3 的重复导入
2026-01-25 09:29:14 +08:00
odboy 32619cd138 style(Breadcrumb): 更新面包屑组件样式以增强视觉效果
- 导入新的技术变量文件 variables.technology3
- 将面包屑文字颜色统一设置为白色并增加重要性标记
- 为链接状态添加发光阴影效果和悬停滤镜
- 调整分隔符颜色透明度以改善可读性
- 为非重定向项目添加文本阴影效果
- 优化悬停状态的颜色过渡和阴影效果
2026-01-25 09:23:18 +08:00
odboy 89e2eb66ec style(components): 统一导航组件样式主题配置
- 面包屑组件引入变量样式并优化悬停效果
- 汉堡菜单按钮应用主题颜色和过渡动画
- 导航栏背景改为渐变色并调整阴影效果
- 用户头像添加边框和悬停高亮效果
- 下拉箭头图标应用主题颜色并增加交互反馈
- 所有组件统一使用主题变量替换硬编码颜色值
2026-01-25 09:17:16 +08:00
odboy 2b0b81f2a7 feat(style): 添加多种主题样式配置
- 移除原有 variables.scss 文件中的硬编码颜色变量
- 新增 variables.default.scss 提供默认主题样式
- 新增 variables.profession.scss 提供专业稳重主题
- 新增 variables.technology3.scss 提供科技现代主题(深空极客)
- 新增 variables.technology4.scss 提供科技现代主题(赛博蓝光)
- 新增 variables.technology5.scss 提供科技现代主题(钛银脉冲)
- 通过 @import 机制实现主题切换功能
2026-01-24 09:53:05 +08:00
odboy 1618b9fe25 feat(navbar): 移除布局尺寸选择功能 2026-01-24 09:52:34 +08:00
odboy f05aebf193 fix(CuteLink): 更新默认链接地址
- 将默认链接从 GitHub 地址更改为 Gitee 地址
2026-01-24 09:51:43 +08:00
odboy 5660df5762 fix(CuteLink): 更新默认链接地址
- 将默认链接从 GitHub 地址更改为 Gitee 地址
2026-01-24 09:51:29 +08:00
odboy 82fe3a76a0 style(ui): 更新用户界面样式和按钮组件
- 将用户中心的安全设置链接替换为el-button文本按钮
- 调整登录表单高度从370px增加到390px
2026-01-24 09:51:07 +08:00
odboy eb2d0e02a8 refactor(util): 移除废弃类并优化验证工具类
- 删除 TaskTemplateInfoVo 类
- 删除 ServerException 类
- 删除 KitDistributedIdUtil 类
- 删除 SystemQuartzJobVo 类
- 在 KitBigDecimalUtil 中新增格式化金额方法
- 在 KitDateUtil 中新增获取周几方法
- 在 KitCollUtil 中修复空集合验证逻辑
- 移除 KitStringUtil 中的日期相关代码
- 在 KitValidUtil 中新增多种验证方法
- 修改 SystemMenuController 中的菜单保存逻辑
- 优化 SystemQuartzJobController 中的定时任务操作方法
- 为 SystemQuartzJobTb 添加扩展字段 uuid
2026-01-24 09:50:13 +08:00
odboy 9b61ab35b6 feat(framework): 添加Redis序列化白名单配置功能 2026-01-24 09:48:18 +08:00
odboy a4258a3851 refactor(sql): 移除任务模块相关表 2026-01-24 09:46:14 +08:00
odboy 12ad5eb169 refactor(task): 移除任务模块相关常量、控制器和核心实现类 2026-01-24 09:45:06 +08:00
odboy 8f804da741 update cutejava/cutejava-starter/src/main/resources/application-dev.yml.
mybatis-plus批量插入优化

Signed-off-by: Odboy <tianjun@odboy.cn>
2026-01-19 04:05:44 +00:00
odboy 8b9b58c802 update cutejava/cutejava-starter/src/main/resources/application-prod.yml.
myabtis-plus批量插入优化

Signed-off-by: Odboy <tianjun@odboy.cn>
2026-01-19 04:05:18 +00:00
odboy 1c10dc2ce2 !6 chore(version): 更新项目版本号从1.5.0到1.5.2
Merge pull request !6 from Odboy/dev
2026-01-17 02:19:51 +00:00
odboy 65699dcab4 chore(version): 更新项目版本号从1.5.0到1.5.2 2026-01-17 10:19:14 +08:00
odboy 8a38e532e2 !4 fix(test): 修复测试类中对象实例化错误
Merge pull request !4 from Odboy/dev
2026-01-17 02:10:58 +00:00
odboy df43cd2333 fix(test): 修复测试类中对象实例化错误
- 添加了 SystemDeptTb 类的导入声明
- 将 SystemDeptVo 对象替换为 SystemDeptTb 对象
- 确保测试代码使用正确的数据对象类型
2026-01-17 10:09:50 +08:00
odboy 65e94a204c !3 feat(system): 新增系统组件服务重构部门和用户选择功能
Merge pull request !3 from Odboy/dev
2026-01-17 02:04:58 +00:00
odboy da255fa7e0 feat(system): 新增系统组件服务重构部门和用户选择功能
- 新增 CuteDeptTreeVo 模型类用于部门树形结构
- 重命名并迁移 SystemProductLineTreeVo 到 CuteProductLineSelectProVo
- 重命名并迁移 SystemProductLineVo 到 CuteProductLineSelectVo
- 新增 CuteUserSelectVo 模型类用于用户选择组件
- 新增 CuteBaseService 提供基础部门查询服务
- 新增 CuteDeptTreeService 处理部门树形数据逻辑
- 新增 CuteFileUploadService 管理文件上传功能
- 新增 CuteProductLineSelectProService 和 CuteProductLineSelectService
- 新增 CuteUserSelectService 提供用户选择数据源
- 新增多个 API 控制器包括 CuteDeptTreeApi、CuteFileUploadApi 等
- 更新缓存键常量 USER_INFO 替代 ONLINE_USER
- 移除旧的 SystemComponentController 和相关方法
- 调整 SystemUserInfoDAO 使用新的缓存键名
- 修改 SystemUserVo 中的部门字段类型为 SystemDeptTb
2026-01-17 10:01:42 +08:00
odboy d413ea4469 refactor(system): 优化部门服务中的数据对象使用
- 将 SystemUserVo 中的 dept 字段类型从 SystemDeptVo 改为 SystemDeptTb
- 在 SystemDeptService 中统一使用 SystemDeptTb 对象替代 SystemDeptVo
- 删除了 getDeptVoById 方法并替换为直接使用 getDeptById
- 重构了部门树构建逻辑,优化了部门数据的查询和映射
- 修改了部门删除、查询、验证等相关方法的数据类型处理
- 添加了获取所有部门映射的私有方法以提高查询效率
2026-01-17 09:53:36 +08:00
odboy 4eaa383717 feat(dept): 新增部门树形组件功能
- 创建 CuteDeptTreeVo 模型类用于部门树形结构数据传输
- 实现 CuteDeptTreeService 服务类处理部门树形数据查询逻辑
- 开发 CuteDeptTreeApi 接口提供部门树形数据查询功能
- 将 SystemDeptService 中的 filterRootDeptList 和 queryDeptByArgs 方法改为 public 以便外部调用
- 前端创建 cute-dept-tree API 接口文件封装请求方法
- 更新 CuteDeptTree 组件使用新的部门树形接口并调整数据处理逻辑
- 修改组件 props 类型从 Number/String 改为 String 类型
2026-01-17 09:34:42 +08:00
odboy d113ebfa2f fix(select): 统一选择组件值类型为字符串
- 将 CuteProductLineSelect 组件的 value 类型从 [Number, String] 修改为 String
- 为 CuteProductLineSelectProVo 添加 value 和 label 字段注释说明
- 将 CuteProductLineSelectVo 的 value 字段类型从 Long 修改为 String
- 为 CuteUserSelectVo 添加 deptId、email、phone 字段注释说明
- 在 CuteProductLineSelectService 中将部门 ID 转换为字符串赋值给 value
2026-01-17 09:11:28 +08:00
odboy f2898da525 feat(user): 添加根据用户名列表查询用户基础数据功能
- 在CuteUserSelectService中新增listMetadataByUsernames方法
- 为CuteUserSelectApi添加listMetadataByUsernames接口
- 在前端cute-user-select.js中新增listMetadataByUsernames请求方法
- 修改CuteSingleUserSelect组件支持初始化时根据用户名加载用户信息
- 修改CuteUserSelect组件移除dataSource属性并支持初始化加载
- 更新CuteBusinessDemo演示页面用户字段默认值为空数组
2026-01-17 09:01:10 +08:00
odboy 462abff607 refactor(system): 重构系统组件服务结构
- 将产品线选择组件相关VO类从dal层移动到application层并重命名
- 新增CuteUserSelectVo、CuteBaseService、CuteFileUploadService等服务类
- 创建CuteProductLineSelectProService和CuteProductLineSelectService业务服务
- 新增CuteUserSelectService用户选择服务及对应的API接口
- 修改文件上传API使用新的服务类并添加权限控制
- 更新产品线选择API使用新服务类并移除旧的实现方法
- 删除系统用户服务中的旧用户元数据查询方法
- 更新前端用户选择组件调用新的API接口
- 移除旧的用户元数据选项查询API调用
2026-01-17 06:38:38 +08:00
odboy 89803b3908 feat(api): 添加文件上传组件专用接口支持本地和OSS上传
- 在api store中新增fileUploadApplicationApi和ossUploadApplicationApi两个专用接口地址
- 从getters中移除已废弃的deployUploadApi和databaseUploadApi
- 将上传组件改为使用新的专用接口,并通过mode参数区分本地和OSS上传
- 更新组件文档注释将上传方式从server改为local
- 创建CuteFileUploadApi控制器提供uploadLocal和uploadOSS接口
- 在SystemLocalStorageService中实现uploadLocal方法处理本地文件上传逻辑
- 更新演示页面默认使用本地上传模式
2026-01-17 05:59:42 +08:00
odboy df6dc89b96 feat(component): 添加产品线选择组件并重构系统组件API
- 新增 CuteProductLineSelect 组件API接口
- 重命名 SystemComponentController 为 CuteProductLineSelectProApi
- 迁移部门选择数据源接口到新API路径
- 更新前端组件导入路径和API调用方式
- 修改 CuteDeptTree 组件分页大小限制
- 为文件上传组件添加上传方式配置选项
- 调整字典详情和定时任务模块的API导入路径
2026-01-17 05:28:24 +08:00
odboy 5989b8bc78 !1 refactor(system): 重构系统模块的缓存键和数据对象配置
Merge pull request !1 from Odboy/dev
2026-01-16 11:44:05 +00:00
odboy d41333c766 refactor(system): 重构系统模块的缓存键和数据对象配置 2026-01-16 19:43:27 +08:00
odboy 83c4e28527 feat(user): 优化用户数据对象和查询服务 2026-01-16 19:40:20 +08:00
odboy 1053669077 refactor(websocket): 更新WebSocket消息处理并重构缓存键配置 2026-01-16 19:32:21 +08:00
odboy 96647a055b feat(menu): 添加菜单查询中是否包含按钮类型的参数控制 2026-01-16 19:09:33 +08:00
odboy 02bff29f94 refactor(system): 重构系统服务模块代码结构和功能实现 2026-01-16 18:53:36 +08:00
odboy aaf3d5fa1c !8 refactor(system): 重构系统模块中的菜单和角色关联关系
Merge pull request !8 from Odboy/dev
2026-01-15 13:54:00 +00:00
odboy 9e306aadc5 refactor(system): 重构系统模块中的菜单和角色关联关系 2026-01-15 21:52:56 +08:00
odboy 8918ce781b refactor(menu): 重构菜单服务提升性能和代码质量
- 将控制器返回类型从SystemMenuVo改为SystemMenuTb,避免不必要的对象转换
- 在Mapper层添加listAll默认方法提高数据查询效率
- 移除KitBeanUtil依赖减少代码耦合
- 引入懒加载代理解决循环依赖问题
- 优化菜单创建和编辑逻辑,使用exists方法提升数据库查询性能
- 重写菜单删除逻辑,采用批量操作和层级遍历提升删除效率
- 更新方法签名统一使用SystemMenuTb实体类
- 简化菜单父子关系查询逻辑,提升代码可读性
2026-01-15 19:18:40 +08:00
odboy a93a44c3d4 refactor(role): 优化角色服务中的权限查询和数据操作逻辑 2026-01-15 18:11:07 +08:00
odboy ff723a6044 chore(framework): 更新版权年份至2026年 2026-01-15 17:18:54 +08:00
odboy 0c57ef3d84 fix(quartz): 修复定时任务参数传递和文档注释问题
- 将 QuartzRunnable 中空字符串参数改为 null 值传递
- 为 SystemQuartzJobService 中的方法添加 TestPassed 标记注释
- 添加查询启用定时任务和根据ID查询定时任务的新方法
- 修复前端用户中心页面请求耗时显示的空值问题
- 在定时任务界面添加 Cron 表达式在线生成链接
- 统一后端服务层中查询方法的注释描述用词
2026-01-15 16:59:33 +08:00
odboy bb664df62f refactor(quartz): 重构定时任务相关服务和控制器 2026-01-15 16:17:23 +08:00
odboy 40f4657d6f refactor(storage): 重构本地存储服务的文件上传功能 2026-01-15 15:32:56 +08:00
odboy 6c79c5a0d0 refactor(job): 重构职位服务中的重复检查逻辑 2026-01-15 13:47:49 +08:00
odboy 4fc51fa0b5 refactor(system): 统一查询方法命名规范 2026-01-15 13:17:47 +08:00
odboy bba40ae048 feat(SystemUserJobService): 添加用户岗位绑定功能测试标记 2026-01-15 13:10:12 +08:00
odboy 252ae3765f docs(SystemUserRoleService): 更新用户角色服务类的Java文档注释
- 为批量绑定用户角色方法添加测试通过标记注释
- 为批量解绑用户角色方法添加测试通过标记注释
- 为根据用户ID查询方法添加测试通过标记注释
- 为权限检查方法添加测试通过标记注释
- 为根据用户id列举角色方法添加完整JavaDoc注释
- 为根据用户id列举角色级别方法添加完整JavaDoc注释
2026-01-15 11:17:28 +08:00
odboy 7425577126 refactor(system): 重构系统模块中的用户和角色相关功能 2026-01-15 11:11:30 +08:00
odboy 4d773797cd style(java): 优化代码格式和清理未使用导入 2026-01-15 09:35:18 +08:00
odboy 5178be95b3 Merge remote-tracking branch 'gitee/dev' into dev 2026-01-15 09:30:19 +08:00
odboy 4684b8ea5e refactor(framework): 优化 MyBatis Plus 查询工具类代码 2026-01-15 09:30:07 +08:00
odboy 5875ce0349 !5 refactor(system): 重构系统角色服务代码结构
Merge pull request !5 from Odboy/dev
2026-01-14 13:20:16 +00:00
odboy 31c4c3c0e1 refactor(system): 重构系统角色服务代码结构 2026-01-14 21:19:29 +08:00
odboy cf65b4f5ab feat(dict): 添加字典明细查询功能并重构系统服务代码结构 2026-01-14 20:20:11 +08:00
odboy c008daaaa1 style(operalog): 格式化操作日志切面代码并增强JSON序列化容错性 2026-01-14 20:14:12 +08:00
odboy 85e4557376 refactor(core): 替换 CollectionUtil 为 CollUtil 并优化代码结构 2026-01-14 18:53:52 +08:00
odboy c9db1e58f3 refactor(system): 重构系统模块的数据访问层和服务层
- 修改用户服务中的用户转换逻辑,区分是否包含密码的场景
- 优化部门层级查询性能,减少数据库查询次数
2026-01-14 18:42:13 +08:00
odboy 8e4e783871 !3 chore(config): 更新RSA私钥和Base64密钥配置
Merge pull request !3 from Odboy/dev
2026-01-14 04:47:22 +00:00
odboy 64a9dd2a4f chore(config): 更新RSA私钥和Base64密钥配置 2026-01-14 09:58:00 +08:00
odboy 7f72553ddd fix(starter配置): 追加缺少的配置项 2026-01-14 09:48:54 +08:00
odboy c11fd19351 refactor(constant): 将应用名称和标题常量统一管理 2026-01-13 14:19:30 +08:00
odboy 3b3bfff2c5 fix(util): 优化SQL工具类错误提示信息 2026-01-13 13:34:12 +08:00
odboy 0685e3ba28 refactor(system): 重构系统模块的分页参数处理和代码优化 2026-01-12 18:56:51 +08:00
odboy f41f436dd8 refactor(quartz): 重构定时任务日志查询接口参数处理 2026-01-12 18:54:31 +08:00
odboy 5aa5624350 style(framework): 优化代码风格和日志格式 2026-01-12 17:45:27 +08:00
odboy 8aa0830213 refactor(java): 优化Java代码实现细节 2026-01-12 17:30:23 +08:00
odboy b88254084d style(task) 2026-01-12 15:55:51 +08:00
odboy a55fbe0f06 refactor(task): 优化任务步骤执行逻辑 2026-01-12 15:49:58 +08:00
odboy ff22d3072c refactor(system): 重构系统模块的数据查询和分页功能 2026-01-12 15:12:40 +08:00
odboy 46bb831dea !2 docs(framework): 更新注释和导入包
Merge pull request !2 from Odboy/master
2026-01-09 04:38:43 +00:00
odboy e511ccdd6d docs(framework): 更新注释和导入包 2026-01-09 12:35:16 +08:00
odboy 4c7d250500 refactor(util): 重构工具类代码以改进资源管理和验证逻辑 2026-01-09 11:57:06 +08:00
odboy 42b9adc5bd refactor(framework): 优化代码结构和类型安全 2026-01-09 11:42:45 +08:00
odboy 2ece7de4de perf(security): 提升RSA加密密钥长度至4096位
- 将后端RSA密钥生成器初始化从1024位提升至4096位
- 更新前端RSA公钥配置为新的4096位密钥对
- 增强数据传输安全性并提高加密强度
2026-01-09 11:19:58 +08:00
odboy e5f11bb452 refactor(util): 重构工具类 2026-01-09 11:19:17 +08:00
odboy 00c3fddbf1 refactor(util): 重构工具类 2026-01-09 11:09:08 +08:00
odboy 01761ebf91 refactor(operalog): 优化操作日志切面的时间间隔处理 2026-01-08 19:34:35 +08:00
odboy a071953398 feat(util): 添加参数验证工具类并重构系统服务 2026-01-08 10:24:13 +08:00
odboy b8183844cd refactor(system): 重构系统服务模块的代码结构 2026-01-08 10:23:43 +08:00
odboy 20fb90b373 refactor(controller): 重构控制器代码结构和依赖管理 2026-01-08 09:44:51 +08:00
odboy 67d2170eda refactor(system): 重构系统模块的模型包结构 2026-01-08 09:34:08 +08:00
odboy 547421ad44 refactor(auth): 重构登录认证和验证码功能
- 创建 SystemAuthVo 类用于统一登录返回数据结构
- 创建 SystemCaptchaVo 类用于验证码信息封装
- 将验证码功能从 SystemAuthService 拆分为独立的 SystemCaptchaService
- 登录接口返回类型从 Map 改为 SystemAuthVo
- 验证码接口返回类型从 Map 改为 SystemCaptchaVo
- 登录时验证码校验改为调用 SystemCaptchaService
- 移除 SystemAuthService 中的验证码相关代码
- 统一数据返回格式,提高代码可读性
2026-01-08 09:25:31 +08:00
odboy da6fe40960 refactor(system): 重构系统模块的VO类和定时任务处理 2026-01-07 19:18:05 +08:00
odboy 394d1409e1 refactor(system): 优化角色服务的事务处理和集合操作 2026-01-07 18:40:22 +08:00
odboy 6364b0f577 refactor(system): 统一使用VO对象进行数据传输和处理 2026-01-07 18:37:59 +08:00
odboy e88d535153 refactor(util): 移除多余BeanUtil导入并添加参数验证工具类 2026-01-07 18:09:04 +08:00
odboy 54cae0855b refactor(auth): 优化用户认证信息获取逻辑 2026-01-07 16:26:33 +08:00
odboy b2cae22719 config(proxy): 添加验证码接口代理配置 2026-01-07 16:25:58 +08:00
odboy 1165eabb4b refactor(framework): 优化Bean拷贝工具类并更新相关实体类结构 2026-01-07 16:19:08 +08:00
odboy 595ab093b9 chore(version): 更新项目版本号从1.4.1到1.5.0 2025-12-31 15:58:20 +08:00
odboy 2182e4bd66 refactor(system): 重构系统服务依赖关系和服务调用方式 2025-12-31 15:54:50 +08:00
odboy 467b2a7d93 feat(user): 加入审计日志、用户中心操作日志 2025-12-31 15:19:40 +08:00
odboy bab3ea1a15 refactor(security): 修正静态资源配置 2025-12-31 15:18:18 +08:00
odboy cddb0cff08 refactor(api): 重构系统模块API函数命名规范 2025-12-31 14:36:34 +08:00
odboy 373a23159d refactor(api): 统一API接口命名规范 2025-12-31 14:24:38 +08:00
odboy 48e6e9298a refactor(api): 重构API端点和前端CRUD配置 2025-12-31 13:48:04 +08:00
odboy 5248d75a6e fix(upload): 修复本地文件上传路径生成问题
- 修复了在MAC系统下上传路径中用户名前缺少斜杠的问题
- 确保上传路径格式的一致性
2025-12-31 13:47:09 +08:00
odboy 4a4b3f1690 refactor(api): 重构系统API模块函数顺序和注释 2025-12-31 13:12:28 +08:00
odboy aa77eaf1b6 chore(deps): 更新 axios 依赖版本
- 将 axios 从 1.8.2 版本更新到 1.12.0 版本
- 修复潜在的安全漏洞和 bug
- 提升 HTTP 请求处理的稳定性
2025-12-31 13:12:02 +08:00
odboy 46ba8b966e refactor(system): 重构系统模块中的导出功能实现 2025-12-31 12:42:08 +08:00
odboy 6e778ff337 feat(util): 添加Excel导出工具类并重构导出功能
- 新增KitExcelExporter工具类,支持普通和分页模式导出
- 新增KitExcelPageWriteHelper分页写入工具,解决大数据量OOM问题
- 替换原有的KitXlsxExportUtil导出实现
- 重构部门、字典、岗位、菜单、角色等模块的导出功能
- 实现用户数据分页导出功能,支持大数据量场景
- 优化导出文件响应头设置和编码处理
2025-12-31 12:05:29 +08:00
odboy b15182afde feat(xlsx): 添加Excel导出工具类并重构导出功能
- 新增KitXlsxExportDataTransferRowHandler接口用于数据转换
- 新增KitXlsxExportUtil工具类提供统一的Excel导出功能
- 添加多个ExportRowVo类用于导出数据映射
- 重构部门、字典、岗位、菜单等模块的导出功能使用新工具类
- 添加SystemYesOrNoChConst和SystemZhConst常量接口
- 标记KitFileUtil.downloadExcel方法为废弃
- 优化文件名验证逻辑和字符串类型判断
2025-12-30 18:01:24 +08:00
odboy 88fbe36145 chore(deps): 更新 fastexcel 依赖版本
- 将 fastexcel 版本从 1.2.0 升级到 1.3.0
- 更新 cutejava-springboot3 模块中的 fastexcel 版本属性
2025-12-30 17:52:50 +08:00
odboy 83f75831f0 chore(build): 更新项目依赖版本并优化代码格式
- 升级 Spring Boot 父项目版本至 3.5.9
- 更新 MySQL 连接器版本至 9.4.0
- 更新 MyBatis-Plus 版本至 3.5.14
- 更新 Fastjson2 版本至 2.0.59
- 更新 Hutool 版本至 5.8.41
- 更新 JJWT 版本至 0.12.6
- 更新 Knife4j 版本至 4.5.0
- 更新 Undertow 版本至 2.3.20.Final
- 更新 Oshi 版本至 6.6.5
- 更新 Guava 版本至 33.5.0-jre
- 格式化注解文件中的代码缩进
- 移除多余的空行和注释格式调整
2025-12-30 12:53:51 +08:00
odboy 377b0989f8 refactor(system): 重构系统模块控制器代码结构
- 解决所有接口分页异常
- 剥离控制器校验逻辑
- 解决循环依赖问题
- 解决角色赋权后,权限回显不正确
2025-12-30 12:51:31 +08:00
odboy 79b847f9a4 fix(system): 修复重构导致用户认证失败问题 2025-12-30 10:29:12 +08:00
odboy 866e689ad3 feat(dict): 添加字典明细分页查询功能 2025-12-29 17:18:02 +08:00
odboy 4097e1801f style(java): 统一Springboot3版本代码格式化和优化依赖配置 2025-12-29 12:02:27 +08:00
odboy c1521dcb9a !1 refactor(system): 重构系统模块中的数据查询和删除方法命名
Merge pull request !1 from Odboy/feature_v202512
2025-12-29 03:54:20 +00:00
odboy 5a9dfcbe4d refactor(system): 重构系统模块中的数据查询和删除方法命名 2025-12-28 14:45:09 +08:00
odboy 830e122b79 refactor(service): 重构查询参数命名和方法调用 2025-12-28 13:15:57 +08:00
odboy 765b993101 refactor(system): 重构系统模块中的部门、字典、菜单等服务方法命名和实现
- 统一将修改方法名从 modify* 改为 update*
- 统一将删除方法名从 remove* 改为 delete*
- 统一将查询方法名从 query* 改为 search* 或 list*
- 重构部门服务中的树形结构构建逻辑
- 优化部门上级数据查询方法实现
- 调整数据权限查询方法命名
- 删除未使用的导入和方法
- 修复部门关联验证中的用户查询服务依赖
2025-12-28 10:54:19 +08:00
odboy 3a48388dec refactor(dal): 将数据访问层的查询方法从Mapper接口移至服务层 2025-12-27 16:50:01 +08:00
odboy 05914f1548 refactor(system): 重构系统模块的数据访问层和业务逻辑 2025-12-27 11:59:36 +08:00
odboy 79cb44c522 refactor(role): 重构角色服务的数据访问层实现 2025-12-27 11:55:19 +08:00
odboy fc951973a4 refactor(system): 重构用户模块数据查询逻辑 2025-12-27 11:43:11 +08:00
odboy 8113539fc6 refactor(system): 重构角色模块数据查询逻辑 2025-12-27 11:42:52 +08:00
odboy e31d9d7be8 fix(test): 修复测试类中实体对象类型错误
- 修复SystemApplicationTests中导入SystemUserVo类
- 修正测试数据创建时使用SystemUserVo替换SystemUserTb
- 更新Spring Boot父版本从3.3.13到3.5.9
2025-12-26 15:21:24 +08:00
odboy 137a35ee28 refactor: 解决springboot3版本功能异常问题 2025-12-26 14:43:40 +08:00
odboy 69800ef5c7 style(pom): 格式化pom.xml文件结构
- 统一XML元素的缩进格式
- 调整依赖项和模块的缩进层级
- 优化配置元素的布局结构

style(annotations): 优化注解类代码格式

- 调整AnonymousAccess注解的结构
- 重新格式化AnonymousDeleteMapping注解的属性布局
- 重新格式化AnonymousGetMapping注解的属性布局
- 重新格式化AnonymousPatchMapping注解的属性布局
- 重新格式化AnonymousPostMapping注解的属性布局
- 统一注解属性的缩进和换行格式
2025-12-26 13:56:15 +08:00
odboy 6ca6fdd567 refactor(system): 重构字典明细查询功能
- 创建 SystemDictDetailVo 视图对象用于数据传输
- 修改控制器返回类型为 SystemDictDetailVo
- 重构查询方法使用 LambdaQueryWrapper 替代 XML 配置
- 移除 SystemDictDetailTb 中的 dict 关联字段
- 添加字典名称查询的辅助方法
- 更新前端组件移除搜索功能并简化工具栏
2025-12-25 16:30:39 +08:00
744 changed files with 33754 additions and 30434 deletions
+43 -1
View File
@@ -24,6 +24,7 @@
- ~~常用的辅助类的类名, 以`Cs`开头~~ - ~~常用的辅助类的类名, 以`Cs`开头~~
- 常用的辅助类的类名, 以`Kit`开头。Kit有套件、装备等意思。 - 常用的辅助类的类名, 以`Kit`开头。Kit有套件、装备等意思。
- 枚举类名,以`Enum`结尾 - 枚举类名,以`Enum`结尾
- 内部调用一律声明this
- 拒绝过度包装 - 拒绝过度包装
- 命名规则(Mapper or Service) - 命名规则(Mapper or Service)
- 简单查询:get + 名词 - 简单查询:get + 名词
@@ -32,6 +33,7 @@
- 搜索(分页)功能:search + 名词 - 搜索(分页)功能:search + 名词
- 统计计数:count + By + 条件 - 统计计数:count + By + 条件
- 存在检查:exists + By + 条件 - 存在检查:exists + By + 条件
- 增删改:save/delete/update
- 例子: 查询分页、查询列表的方法 - 例子: 查询分页、查询列表的方法
- 分页:searchUser(args, page) - 分页:searchUser(args, page)
- 列表:listUser + (args) - 列表:listUser + (args)
@@ -44,6 +46,47 @@
- 单个:getUser + by + (args) - 单个:getUser + by + (args)
- 统计计数:count + By + (args) - 统计计数:count + By + (args)
#### 编码规范:举例说明
1. getUser - 简单查询
核心: 获取单个特定实体。
- 输入: 通常是一个唯一标识符(如ID 123)。
- 筛选: 非常精确,只匹配一个。
- 返回: 单个对象或文档,包含该用户的完整/详细信息。
- 示例: getUser(123) -> 返回 {id: 123, name: “Alice”, email: “...”}
2. listUsers - 列表查询
核心: 获取一个符合简单条件的实体集合,通常是有限的、预定义的。
- 输入: 可能没有参数,或只有非常简单的过滤条件(如 status=‘active’)。
- 筛选: 简单、常规。
- 返回: 一个数组/列表,包含多个用户的基本信息(通常是摘要字段,非完整详情)。
- 通常不分页,或隐式返回所有符合条件的(数据量预期不大)。
- 示例: listUsers() -> 返回 [{id: 1, name: “Alice”}, {id: 2, name: “Bob”}]
- 示例: listUsers({role: ‘admin’}) -> 返回所有管理员用户的列表。
3. queryUsersByCondition - 复杂查询
核心: 基于多个、可能较复杂的条件进行筛选。
- 输入: 一个组合条件对象,可能涉及多个字段的比较(如 age > 18 AND department = ‘Sales’ AND joinDate < ‘2023-01-01’)。
- 筛选: 复杂、灵活,类似数据库的WHERE子句。
- 返回: 一个匹配条件的数组/列表。
- 分页: 可能分页,也可能不分页。关键是它的侧重点在于复杂的“筛选”能力,而非分页机制。(这是标准,但是对于此项目来说,定为不分页的,复杂条件的,列表查询服务)
- 示例: queryUsersByCondition({minAge: 18, department: ‘Sales’, hasCertification: true})
4. searchUsers - 搜索(分页)功能
核心: 针对大量数据进行模糊匹配、全文检索,并强制包含分页机制以管理性能。
- 输入:
- 搜索关键词(可能对多个字段进行模糊匹配)。
- 分页参数(pageNumber, pageSize 或 limit, offset)。
- 可能附加的其他过滤条件。
- 筛选: 通常包含文本搜索(如 name LIKE ‘%Al%’),结果可能按相关性排序。
- 返回: 一个分页响应对象,而不仅仅是数组。
- 包含:data(当前页的数据列表)、total(总匹配数)、page(当前页)、pageSize(每页大小)等元数据。
- 示例: searchUsers({keyword: ‘Al’, page: 1, pageSize: 20}) -> 返回 {data: […], total: 45, page: 1, pageSize: 20}
#### 主要特性 #### 主要特性
- 使用最新技术栈,社区资源丰富。 - 使用最新技术栈,社区资源丰富。
@@ -75,4 +118,3 @@
- cutejava-framework:系统基础框架。提供核心功能,如:权限、数据权限、异常处理、缓存、工具类、接口限流、接口防重、接口幂等。 - cutejava-framework:系统基础框架。提供核心功能,如:权限、数据权限、异常处理、缓存、工具类、接口限流、接口防重、接口幂等。
- cutejava-module-system:系统功能模块。提供用户、角色、菜单、部门、岗位、字典、定时任务、邮件、Minio存储、服务监控等功能 - cutejava-module-system:系统功能模块。提供用户、角色、菜单、部门、岗位、字典、定时任务、邮件、Minio存储、服务监控等功能
- cutejava-module-task:串行任务模块,已实现流水线功能。参考阿里云云效,提供流水线功能,可配置流水线任务,并支持任务依赖、任务参数、任务参数校验、任务参数回填。
-4
View File
@@ -45,7 +45,3 @@ npm run build:prod
2、加速node-sass安装 2、加速node-sass安装
https://www.ydyno.com/archives/1219.html https://www.ydyno.com/archives/1219.html
#### 特别鸣谢
- 感谢 [elunez](https://github.com/elunez/eladmin-mp) 大佬提供的基础框架
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "cutejava-front", "name": "cutejava-front",
"version": "1.4.1", "version": "1.5.0",
"description": "CuteJava 前端源码", "description": "CuteJava 前端源码",
"author": "Odboy", "author": "Odboy",
"license": "Apache-2.0", "license": "Apache-2.0",
@@ -38,7 +38,7 @@
"@riophae/vue-treeselect": "^0.4.0", "@riophae/vue-treeselect": "^0.4.0",
"@wangeditor/editor": "^5.1.23", "@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^1.0.2", "@wangeditor/editor-for-vue": "^1.0.2",
"axios": "1.8.2", "axios": "1.12.0",
"clipboard": "2.0.4", "clipboard": "2.0.4",
"codemirror": "^5.49.2", "codemirror": "^5.49.2",
"core-js": "^2.6.12", "core-js": "^2.6.12",
@@ -0,0 +1,12 @@
import request from '@/utils/request'
export function listMetadata(query) {
return request({
url: 'api/component/CuteDeptTree/listMetadata',
method: 'post',
data: query
})
}
export default { listMetadata }
@@ -0,0 +1,8 @@
import request from '@/utils/request'
export function listMetadata() {
return request({
url: 'api/component/CuteProductLineSelectPro/listMetadata',
method: 'post'
})
}
@@ -0,0 +1,8 @@
import request from '@/utils/request'
export function listMetadata() {
return request({
url: 'api/component/CuteProductLineSelect/listMetadata',
method: 'post'
})
}
@@ -0,0 +1,22 @@
import request from '@/utils/request'
export function listMetadata(query) {
return request({
url: 'api/component/CuteUserSelect/listMetadata',
method: 'post',
data: {
blurry: query
}
})
}
export function listMetadataByUsernames(usernameList = []) {
return request({
url: 'api/component/CuteUserSelect/listMetadataByUsernames',
method: 'post',
data: usernameList
})
}
export default { listMetadata, listMetadataByUsernames }
+2 -2
View File
@@ -15,14 +15,14 @@ export function login(username, password, code, uuid) {
export function getInfo() { export function getInfo() {
return request({ return request({
url: 'auth/info', url: 'api/user/getCurrentUserInfo',
method: 'post' method: 'post'
}) })
} }
export function getCodeImg() { export function getCodeImg() {
return request({ return request({
url: 'auth/captcha/getImage', url: 'captcha/getCode',
method: 'post' method: 'post'
}) })
} }
+6 -6
View File
@@ -1,27 +1,27 @@
import request from '@/utils/request' import request from '@/utils/request'
export function sendResetEmailCaptcha(email) { export function sendResetEmailCode(email) {
return request({ return request({
url: 'api/captcha/sendResetEmailCaptcha?email=' + email, url: 'api/captcha/sendResetEmailCode?email=' + email,
method: 'post' method: 'post'
}) })
} }
export function sendResetPasswordCaptcha(email) { export function sendResetPasswordCode(email) {
return request({ return request({
url: 'api/captcha/sendResetPasswordCaptcha?email=' + email, url: 'api/captcha/sendResetPasswordCode?email=' + email,
method: 'post' method: 'post'
}) })
} }
export function checkEmailCaptcha(email, code, bizCode) { export function verifyCode(email, code, bizCode) {
const params = { const params = {
email: email, email: email,
code: code, code: code,
bizCode: bizCode bizCode: bizCode
} }
return request({ return request({
url: 'api/captcha/checkEmailCaptcha', url: 'api/captcha/verifyCode',
method: 'post', method: 'post',
data: params data: params
}) })
@@ -1,15 +0,0 @@
import request from '@/utils/request'
export function queryDeptSelectDataSource() {
return request({
url: 'api/component/queryDeptSelectDataSource',
method: 'post'
})
}
export function queryDeptSelectProDataSource() {
return request({
url: 'api/component/queryDeptSelectProDataSource',
method: 'post'
})
}
+24 -21
View File
@@ -1,23 +1,8 @@
import request from '@/utils/request' import request from '@/utils/request'
export function queryDeptList(params) { /**
return request({ * 默认入口:add、del、edit、get
url: 'api/dept', */
method: 'post',
data: params
})
}
export function queryDeptSuperiorTree(ids, exclude) {
exclude = exclude !== undefined ? exclude : false
const data = Array.isArray(ids) ? ids : [ids]
return request({
url: 'api/dept/queryDeptSuperiorTree?exclude=' + exclude,
method: 'post',
data: data
})
}
export function add(data) { export function add(data) {
return request({ return request({
url: 'api/dept/saveDept', url: 'api/dept/saveDept',
@@ -28,7 +13,7 @@ export function add(data) {
export function del(ids) { export function del(ids) {
return request({ return request({
url: 'api/dept/removeDeptByIds', url: 'api/dept/deleteDeptByIds',
method: 'post', method: 'post',
data: ids data: ids
}) })
@@ -36,10 +21,28 @@ export function del(ids) {
export function edit(data) { export function edit(data) {
return request({ return request({
url: 'api/dept/modifyDept', url: 'api/dept/updateDeptById',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export default { add, edit, del, queryDeptList, queryDeptSuperiorTree } export function searchDept(params) {
return request({
url: 'api/dept/searchDept',
method: 'post',
data: params
})
}
export function searchDeptTree(ids, exclude) {
exclude = exclude !== undefined ? exclude : false
const data = Array.isArray(ids) ? ids : [ids]
return request({
url: 'api/dept/searchDeptTree?exclude=' + exclude,
method: 'post',
data: data
})
}
export default { add, edit, del, searchDept, searchDeptTree }
@@ -1,5 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
/**
* 默认入口:add、del、edit、get
*/
export function get(dictName) { export function get(dictName) {
const params = { const params = {
page: 1, page: 1,
@@ -9,7 +11,7 @@ export function get(dictName) {
} }
} }
return request({ return request({
url: 'api/dictDetail/queryDictDetailByArgs', url: 'api/dictDetail/searchDictDetail',
method: 'post', method: 'post',
data: params data: params
}) })
@@ -25,7 +27,7 @@ export function add(data) {
export function del(id) { export function del(id) {
return request({ return request({
url: 'api/dictDetail/removeDictDetailById', url: 'api/dictDetail/deleteDictDetailById',
method: 'post', method: 'post',
data: { id: id } data: { id: id }
}) })
@@ -33,7 +35,7 @@ export function del(id) {
export function edit(data) { export function edit(data) {
return request({ return request({
url: 'api/dictDetail/modifyDictDetailById', url: 'api/dictDetail/updateDictDetailById',
method: 'post', method: 'post',
data: data data: data
}) })
+8 -6
View File
@@ -1,5 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
/**
* 默认入口:add、del、edit、get
*/
export function add(data) { export function add(data) {
return request({ return request({
url: 'api/dict/saveDict', url: 'api/dict/saveDict',
@@ -10,7 +12,7 @@ export function add(data) {
export function del(ids) { export function del(ids) {
return request({ return request({
url: 'api/dict/removeDictByIds', url: 'api/dict/deleteDictByIds',
method: 'post', method: 'post',
data: ids data: ids
}) })
@@ -18,18 +20,18 @@ export function del(ids) {
export function edit(data) { export function edit(data) {
return request({ return request({
url: 'api/dict/modifyDictById', url: 'api/dict/updateDictById',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function queryPageDict(data) { export function searchDict(data) {
return request({ return request({
url: 'api/dict', url: 'api/dict/searchDict',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export default { add, edit, del, queryPageDict } export default { add, edit, del, searchDict }
+4 -4
View File
@@ -7,17 +7,17 @@ export function getLastEmailConfig() {
}) })
} }
export function modifyEmailConfig(data) { export function updateEmailConfigById(data) {
return request({ return request({
url: 'api/email/modifyEmailConfig', url: 'api/email/updateEmailConfigById',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function sendEmail(data) { export function send(data) {
return request({ return request({
url: 'api/email/sendEmail', url: 'api/email/send',
method: 'post', method: 'post',
data: data data: data
}) })
+19 -18
View File
@@ -1,20 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
/**
export function queryAllEnableJob() { * 默认入口:add、del、edit、get
const params = { */
page: 1,
size: 9999999,
args: {
enabled: true
}
}
return request({
url: 'api/job/queryAllEnableJob',
method: 'post',
data: params
})
}
export function add(data) { export function add(data) {
return request({ return request({
url: 'api/job/saveJob', url: 'api/job/saveJob',
@@ -25,7 +12,7 @@ export function add(data) {
export function del(ids) { export function del(ids) {
return request({ return request({
url: 'api/job/removeJobByIds', url: 'api/job/deleteJobByIds',
method: 'post', method: 'post',
data: ids data: ids
}) })
@@ -33,10 +20,24 @@ export function del(ids) {
export function edit(data) { export function edit(data) {
return request({ return request({
url: 'api/job/modifyJobById', url: 'api/job/updateJobById',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function searchJob() {
const params = {
page: 1,
size: 9999999,
args: {
enabled: true
}
}
return request({
url: 'api/job/searchJob',
method: 'post',
data: params
})
}
export default { add, edit, del } export default { add, edit, del }
@@ -1,5 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
/**
* 默认入口:add、del、edit、get
*/
export function add(data) { export function add(data) {
return request({ return request({
url: 'api/localStorage/uploadFile', url: 'api/localStorage/uploadFile',
@@ -10,7 +12,7 @@ export function add(data) {
export function del(ids) { export function del(ids) {
return request({ return request({
url: 'api/localStorage/removeFileByIds', url: 'api/localStorage/deleteFileByIds',
method: 'post', method: 'post',
data: ids data: ids
}) })
@@ -18,7 +20,7 @@ export function del(ids) {
export function edit(data) { export function edit(data) {
return request({ return request({
url: 'api/localStorage/modifyLocalStorageById', url: 'api/localStorage/updateLocalStorageById',
method: 'post', method: 'post',
data: data data: data
}) })
+41 -31
View File
@@ -1,15 +1,49 @@
import request from '@/utils/request' import request from '@/utils/request'
export function queryMenuListByPid(pid) { /**
* 默认入口:add、del、edit、get
*/
export function add(data) {
return request({ return request({
url: 'api/menu/queryMenuListByPid?pid=' + pid, url: 'api/menu/saveMenu',
method: 'post',
data: data
})
}
export function del(ids) {
return request({
url: 'api/menu/deleteMenuByIds',
method: 'post',
data: ids
})
}
export function edit(data) {
return request({
url: 'api/menu/updateMenuById',
method: 'post',
data: data
})
}
export function listMenuByPid(pid) {
return request({
url: 'api/menu/listMenuByPid?pid=' + pid,
method: 'post' method: 'post'
}) })
} }
export function queryMenuByArgs(params) { export function listRoleMenuByPid(pid) {
return request({ return request({
url: 'api/menu/queryMenuByArgs', url: 'api/menu/listRoleMenuByPid?pid=' + pid,
method: 'post'
})
}
export function searchMenu(params) {
return request({
url: 'api/menu/searchMenu',
method: 'post', method: 'post',
data: params data: params
}) })
@@ -24,9 +58,9 @@ export function queryMenuSuperior(ids) {
}) })
} }
export function queryChildMenuSet(id) { export function listChildMenuSetByMenuId(id) {
return request({ return request({
url: 'api/menu/queryChildMenuSet?id=' + id, url: 'api/menu/listChildMenuSetByMenuId?id=' + id,
method: 'post' method: 'post'
}) })
} }
@@ -38,28 +72,4 @@ export function buildMenus() {
}) })
} }
export function add(data) { export default { add, edit, del, listMenuByPid, queryMenuSuperior, searchMenu, listChildMenuSetByMenuId }
return request({
url: 'api/menu/saveMenu',
method: 'post',
data: data
})
}
export function del(ids) {
return request({
url: 'api/menu/removeMenuByIds',
method: 'post',
data: ids
})
}
export function edit(data) {
return request({
url: 'api/menu/modifyMenuById',
method: 'post',
data: data
})
}
export default { add, edit, del, queryMenuListByPid, queryMenuSuperior, queryMenuByArgs, queryChildMenuSet }
@@ -1,5 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
/**
* 默认入口:add、del、edit、get
*/
export function add(data) { export function add(data) {
return request({ return request({
url: 'api/ossStorage/uploadFile', url: 'api/ossStorage/uploadFile',
@@ -10,7 +12,7 @@ export function add(data) {
export function del(ids) { export function del(ids) {
return request({ return request({
url: 'api/ossStorage/removeFileByIds', url: 'api/ossStorage/deleteFileByIds',
method: 'post', method: 'post',
data: ids data: ids
}) })
@@ -1,5 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
/**
* 默认入口:add、del、edit、get
*/
export function add(data) { export function add(data) {
return request({ return request({
url: 'api/quartzJob/createQuartzJob', url: 'api/quartzJob/createQuartzJob',
@@ -10,7 +12,7 @@ export function add(data) {
export function del(ids) { export function del(ids) {
return request({ return request({
url: 'api/quartzJob/removeJobByIds', url: 'api/quartzJob/deleteJobByIds',
method: 'post', method: 'post',
data: ids data: ids
}) })
@@ -18,8 +20,8 @@ export function del(ids) {
export function edit(data) { export function edit(data) {
return request({ return request({
url: 'api/quartzJob', url: 'api/quartzJob/updateQuartzJobResumeCron',
method: 'put', method: 'post',
data: data data: data
}) })
} }
+23 -21
View File
@@ -1,13 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
/**
// 获取所有的Role * 默认入口:add、del、edit、get
export function queryRoleList() { */
return request({
url: 'api/role/queryRoleList',
method: 'post'
})
}
export function add(data) { export function add(data) {
return request({ return request({
url: 'api/role/saveRole', url: 'api/role/saveRole',
@@ -18,22 +12,15 @@ export function add(data) {
export function get(id) { export function get(id) {
return request({ return request({
url: 'api/role/queryRoleById', url: 'api/role/getRoleById',
method: 'post', method: 'post',
data: { id: id } data: { id: id }
}) })
} }
export function getLevel() {
return request({
url: 'api/role/queryRoleLevel',
method: 'post'
})
}
export function del(ids) { export function del(ids) {
return request({ return request({
url: 'api/role/removeRoleByIds', url: 'api/role/deleteRoleByIds',
method: 'post', method: 'post',
data: ids data: ids
}) })
@@ -41,18 +28,33 @@ export function del(ids) {
export function edit(data) { export function edit(data) {
return request({ return request({
url: 'api/role/modifyRoleById', url: 'api/role/updateRoleById',
method: 'post', method: 'post',
data: data data: data
}) })
} }
// 获取所有的Role
export function listAllRole() {
return request({
url: 'api/role/listAllRole',
method: 'post'
})
}
export function getCurrentUserRoleLevel() {
return request({
url: 'api/role/getCurrentUserRoleLevel',
method: 'post'
})
}
export function editMenu(data) { export function editMenu(data) {
return request({ return request({
url: 'api/role/modifyBindMenuById', url: 'api/role/updateBindMenuById',
method: 'post', method: 'post',
data data
}) })
} }
export default { add, edit, del, get, editMenu, getLevel } export default { add, edit, del, get, editMenu, getCurrentUserRoleLevel }
+20 -32
View File
@@ -1,6 +1,9 @@
import request from '@/utils/request' import request from '@/utils/request'
import { encrypt } from '@/utils/CsRsaUtil' import { encrypt } from '@/utils/CsRsaUtil'
/**
* 默认入口:add、del、edit、get
*/
export function add(data) { export function add(data) {
return request({ return request({
url: 'api/user/saveUser', url: 'api/user/saveUser',
@@ -11,15 +14,7 @@ export function add(data) {
export function del(ids) { export function del(ids) {
return request({ return request({
url: 'api/user/removeUserByIds', url: 'api/user/deleteUserByIds',
method: 'post',
data: ids
})
}
export function resetPwd(ids) {
return request({
url: 'api/user/resetUserPasswordByIds',
method: 'post', method: 'post',
data: ids data: ids
}) })
@@ -27,58 +22,51 @@ export function resetPwd(ids) {
export function edit(data) { export function edit(data) {
return request({ return request({
url: 'api/user/modifyUserById', url: 'api/user/updateUserById',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function editUser(data) { export function resetUserPasswordByIds(ids) {
return request({ return request({
url: 'api/user/modifyUserCenterInfoById', url: 'api/user/resetUserPasswordByIds',
method: 'post',
data: ids
})
}
export function updateUserCenterInfoById(data) {
return request({
url: 'api/user/updateUserCenterInfoById',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function updatePass(user) { export function updateUserPasswordByUsername(user) {
const data = { const data = {
oldPass: encrypt(user.oldPass), oldPass: encrypt(user.oldPass),
newPass: encrypt(user.newPass) newPass: encrypt(user.newPass)
} }
return request({ return request({
url: 'api/user/modifyUserPasswordByUsername', url: 'api/user/updateUserPasswordByUsername',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function updateEmail(form) { export function updateUserEmailByUsername(form) {
const data = { const data = {
password: encrypt(form.pass), password: encrypt(form.pass),
email: form.email email: form.email
} }
return request({ return request({
url: 'api/user/modifyUserEmailByUsername/' + form.code, url: 'api/user/updateUserEmailByUsername/' + form.code,
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function queryUserMetaPage(query) { export default { add, edit, del, resetUserPasswordByIds }
const params = {
page: 1,
size: 50,
args: {
blurry: query
}
}
return request({
url: 'api/user/queryUserMetadataOptions',
method: 'post',
data: params
})
}
export default { add, edit, del, resetPwd, queryUserMetaPage }
@@ -0,0 +1,100 @@
// 科技现代:极光幻境(梦幻唯美)
// base color
$blue: #6C5CE7;
$light-blue: #A29BFE;
$red: #FF7675;
$pink: #FD79A8;
$green: #00B894;
$tiffany: #81ECEC;
$yellow: #FFEAA7;
$panGreen: #00B894;
// sidebar
$menuText: #B2BEC3;
$menuActiveText: #A29BFE;
$subMenuActiveText: #FFFFFF;
$menuBg: #0F0F1F;
$menuHover: #1A1A35;
$subMenuBg: #14142A;
$subMenuHover: #2C2C5A;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色(从深靛蓝过渡到深紫蓝色)
$navbarBgStart: $menuBg;
$navbarBgEnd: #0A0A18;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(162, 155, 254, 0.18);
$navbarShadowY: 2px;
$navbarShadowBlur: 8px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(162, 155, 254, 0.25);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: rgba(162, 155, 254, 0.1);
// 右侧菜单项文字颜色
$navbarRightMenuColor: $menuText;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: rgba(162, 155, 254, 0.32);
// 头像边框颜色
$navbarAvatarBorderColor: rgba(162, 155, 254, 0.3);
$navbarAvatarHoverBorderColor: $menuActiveText;
$navbarAvatarHoverGlow: rgba(162, 155, 254, 0.42);
// 下拉箭头颜色
$navbarCaretColor: $menuText;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: $menuText;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: 0 0 6px rgba(162, 155, 254, 0.45);
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #F0F1F8;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #F0F1F8;
// Breadcrumb 发光效果
$breadcrumbTextGlow: rgba(162, 155, 254, 0.18);
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $menuActiveText;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: 0 0 6px rgba(162, 155, 254, 0.4);
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: rgba(129, 236, 236, 0.55);
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #F7F8FC;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between/js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -0,0 +1,100 @@
// 赛博橙(热情奔放)
// base color
$blue: #FF5722;
$light-blue: #FF7043;
$red: #FF1744;
$pink: #FF4081;
$green: #00E676;
$tiffany: #69F0AE;
$yellow: #FFD600;
$panGreen: #00E676;
// sidebar
$menuText: #FFCCBC;
$menuActiveText: #FF6D00;
$subMenuActiveText: #FFFFFF;
$menuBg: #261411;
$menuHover: #3D1F1A;
$subMenuBg: #1E0D0B;
$subMenuHover: #502620;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色
$navbarBgStart: $menuBg;
$navbarBgEnd: #1A0E0C;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(255, 109, 0, 0.25);
$navbarShadowY: 2px;
$navbarShadowBlur: 8px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(255, 109, 0, 0.35);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: rgba(255, 109, 0, 0.12);
// 右侧菜单项文字颜色
$navbarRightMenuColor: #FFD0BC;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: rgba(255, 109, 0, 0.4);
// 头像边框颜色
$navbarAvatarBorderColor: rgba(255, 109, 0, 0.4);
$navbarAvatarHoverBorderColor: $menuActiveText;
$navbarAvatarHoverGlow: rgba(255, 109, 0, 0.5);
// 下拉箭头颜色
$navbarCaretColor: #FFCCBC;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: #FFCCBC;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: 0 0 8px rgba(255, 109, 0, 0.5);
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #FFFFFF;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #FFFFFF;
// Breadcrumb 发光效果
$breadcrumbTextGlow: rgba(255, 109, 0, 0.18);
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $menuActiveText;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: 0 0 8px rgba(255, 109, 0, 0.5);
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: rgba(255, 64, 129, 0.6);
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #FFFFFF;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between/js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -0,0 +1,100 @@
// 默认风格
// base color
$blue: #324157;
$light-blue: #3A71A8;
$red: #C03639;
$pink: #E65D6E;
$green: #30B08F;
$tiffany: #4AB7BD;
$yellow: #FEC171;
$panGreen: #30B08F;
// sidebar 默认
$menuText: #bfcbd9;
$menuActiveText: #409EFF;
$subMenuActiveText: #f4f4f5; // https://github.com/ElemeFE/element/issues/12951
$menuBg: #304156;
$menuHover: #263445;
$subMenuBg: #1f2d3d;
$subMenuHover: #001528;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色(从侧边栏颜色过渡到深蓝色)
$navbarBgStart: $menuBg;
$navbarBgEnd: #263445;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(0, 21, 41, 0.15);
$navbarShadowY: 1px;
$navbarShadowBlur: 4px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(0, 21, 41, 0.2);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: rgba(0, 0, 0, 0.025);
// 右侧菜单项文字颜色
$navbarRightMenuColor: #5a5e66;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: transparent;
// 头像边框颜色
$navbarAvatarBorderColor: transparent;
$navbarAvatarHoverBorderColor: transparent;
$navbarAvatarHoverGlow: transparent;
// 下拉箭头颜色
$navbarCaretColor: #5a5e66;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: $menuText;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: transparent;
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #97a8be;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #97a8be;
// Breadcrumb 发光效果
$breadcrumbTextGlow: transparent;
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $menuActiveText;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: transparent;
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: #97a8be;
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #97a8be;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between/js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -0,0 +1,101 @@
// 专业稳重(一般)
// base color
$blue: #3A71A8;
$light-blue: #5A9BDB;
$red: #D5657A;
$pink: #E696A5;
$green: #4AB7BD;
$tiffany: #6BCFD5;
$yellow: #FFD166;
$panGreen: #4AB7BD;
// sidebar
$menuText: #C0C9D5;
$menuActiveText: #FFFFFF;
$subMenuActiveText: #409EFF;
$menuBg: #234781;
$menuHover: #1D3A6B;
$subMenuBg: #152B4F;
$subMenuHover: #2D5BA6;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色(从侧边栏颜色过渡到深蓝色)
$navbarBgStart: $menuBg;
$navbarBgEnd: #1A3055;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(58, 113, 168, 0.2);
$navbarShadowY: 2px;
$navbarShadowBlur: 8px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(90, 155, 219, 0.3);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: rgba(90, 155, 219, 0.15);
// 右侧菜单项文字颜色
$navbarRightMenuColor: $menuText;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: rgba(90, 155, 219, 0.3);
// 头像边框颜色
$navbarAvatarBorderColor: rgba(90, 155, 219, 0.3);
$navbarAvatarHoverBorderColor: $light-blue;
$navbarAvatarHoverGlow: rgba(90, 155, 219, 0.4);
// 下拉箭头颜色
$navbarCaretColor: $menuText;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: $menuText;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: 0 0 6px rgba(90, 155, 219, 0.3);
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #F0F4F8;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #F0F4F8;
// Breadcrumb 发光效果
$breadcrumbTextGlow: rgba(90, 155, 219, 0.2);
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $light-blue;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: 0 0 6px rgba(90, 155, 219, 0.3);
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: rgba(90, 155, 219, 0.4);
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #F5F8FC;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -0,0 +1,100 @@
// 科技现代:太阳耀斑(热烈活力)
// base color
$blue: #FF6B35;
$light-blue: #FF8C42;
$red: #E84C5B;
$pink: #FF7B9C;
$green: #FFC857;
$tiffany: #FF9F45;
$yellow: #FFD93D;
$panGreen: #FFC857;
// sidebar
$menuText: #D4A574;
$menuActiveText: #FF8C42;
$subMenuActiveText: #FFFFFF;
$menuBg: #1A1512;
$menuHover: #2A221D;
$subMenuBg: #221E1A;
$subMenuHover: #3D332C;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色(从深棕色过渡到炭黑色)
$navbarBgStart: $menuBg;
$navbarBgEnd: #15100D;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(255, 140, 66, 0.2);
$navbarShadowY: 2px;
$navbarShadowBlur: 8px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(255, 140, 66, 0.25);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: rgba(255, 140, 66, 0.1);
// 右侧菜单项文字颜色
$navbarRightMenuColor: $menuText;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: rgba(255, 140, 66, 0.3);
// 头像边框颜色
$navbarAvatarBorderColor: rgba(255, 140, 66, 0.3);
$navbarAvatarHoverBorderColor: $menuActiveText;
$navbarAvatarHoverGlow: rgba(255, 140, 66, 0.45);
// 下拉箭头颜色
$navbarCaretColor: $menuText;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: $menuText;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: 0 0 6px rgba(255, 140, 66, 0.4);
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #FDF6EC;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #FDF6EC;
// Breadcrumb 发光效果
$breadcrumbTextGlow: rgba(255, 140, 66, 0.15);
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $menuActiveText;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: 0 0 6px rgba(255, 140, 66, 0.35);
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: rgba(255, 159, 69, 0.5);
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #FFF9F0;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between/js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -0,0 +1,101 @@
// 科技现代:深空极客(好看)
// base color
$blue: #4A90E2;
$light-blue: #66CCFF;
$red: #FF6B6B;
$pink: #FF9E9E;
$green: #66FFCC;
$tiffany: #81D8D0;
$yellow: #FFD93D;
$panGreen: #66FFCC;
// sidebar
$menuText: #A0AABF;
$menuActiveText: #66FFCC;
$subMenuActiveText: #FFFFFF;
$menuBg: #0F1520;
$menuHover: #1C2430;
$subMenuBg: #1A2332;
$subMenuHover: #2A3B5C;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色(从侧边栏颜色过渡到深蓝色)
$navbarBgStart: $menuBg;
$navbarBgEnd: #162035;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(74, 144, 226, 0.15);
$navbarShadowY: 2px;
$navbarShadowBlur: 8px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(74, 144, 226, 0.2);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: rgba(74, 144, 226, 0.1);
// 右侧菜单项文字颜色
$navbarRightMenuColor: $menuText;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: rgba(102, 255, 204, 0.3);
// 头像边框颜色
$navbarAvatarBorderColor: rgba(102, 255, 204, 0.3);
$navbarAvatarHoverBorderColor: $menuActiveText;
$navbarAvatarHoverGlow: rgba(102, 255, 204, 0.4);
// 下拉箭头颜色
$navbarCaretColor: $menuText;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: $menuText;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: 0 0 6px $menuActiveText;
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #FFFFFF;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #FFFFFF;
// Breadcrumb 发光效果
$breadcrumbTextGlow: rgba(102, 255, 204, 0.3);
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $menuActiveText;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: 0 0 6px rgba(102, 255, 204, 0.4);
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: rgba(102, 255, 204, 0.5);
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #FFFFFF;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -0,0 +1,101 @@
// 科技现代:赛博蓝光(好看)
// base color
$blue: #4FC3F7;
$light-blue: #81D4FA;
$red: #FF8A80;
$pink: #FFB3B8;
$green: #80DEEA;
$tiffany: #81D4FA;
$yellow: #FFD54F;
$panGreen: #80DEEA;
// sidebar
$menuText: #B0B8D0;
$menuActiveText: #4FC3F7;
$subMenuActiveText: #FFFFFF;
$menuBg: #0A0E17;
$menuHover: #151A2A;
$subMenuBg: #12182D;
$subMenuHover: #1E3A8A;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色(从侧边栏颜色过渡到深蓝紫色)
$navbarBgStart: $menuBg;
$navbarBgEnd: #0D1422;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(79, 195, 247, 0.15);
$navbarShadowY: 2px;
$navbarShadowBlur: 8px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(79, 195, 247, 0.2);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: rgba(79, 195, 247, 0.1);
// 右侧菜单项文字颜色
$navbarRightMenuColor: $menuText;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: rgba(79, 195, 247, 0.3);
// 头像边框颜色
$navbarAvatarBorderColor: rgba(79, 195, 247, 0.3);
$navbarAvatarHoverBorderColor: $menuActiveText;
$navbarAvatarHoverGlow: rgba(79, 195, 247, 0.4);
// 下拉箭头颜色
$navbarCaretColor: $menuText;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: $menuText;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: 0 0 6px $menuActiveText;
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #FFFFFF;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #FFFFFF;
// Breadcrumb 发光效果
$breadcrumbTextGlow: rgba(79, 195, 247, 0.2);
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $menuActiveText;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: 0 0 6px rgba(79, 195, 247, 0.4);
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: rgba(79, 195, 247, 0.5);
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #FFFFFF;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -0,0 +1,101 @@
// 科技现代:钛银脉冲(好看)
// base color
$blue: #393E7C;
$light-blue: #4A50A0;
$red: #E84C5B;
$pink: #FF7B9C;
$green: #4AB7BD;
$tiffany: #64D2FF;
$yellow: #FFD166;
$panGreen: #4AB7BD;
// sidebar
$menuText: #CCCCCC;
$menuActiveText: #00E5FF;
$subMenuActiveText: #FFFFFF;
$menuBg: #1A1A2E;
$menuHover: #222244;
$subMenuBg: #252545;
$subMenuHover: #393E7C;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色(从侧边栏颜色过渡到深紫色)
$navbarBgStart: $menuBg;
$navbarBgEnd: #141426;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(0, 229, 255, 0.15);
$navbarShadowY: 2px;
$navbarShadowBlur: 8px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(0, 229, 255, 0.2);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: rgba(0, 229, 255, 0.1);
// 右侧菜单项文字颜色
$navbarRightMenuColor: $menuText;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: rgba(0, 229, 255, 0.3);
// 头像边框颜色
$navbarAvatarBorderColor: rgba(0, 229, 255, 0.3);
$navbarAvatarHoverBorderColor: $menuActiveText;
$navbarAvatarHoverGlow: rgba(0, 229, 255, 0.4);
// 下拉箭头颜色
$navbarCaretColor: $menuText;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: $menuText;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: 0 0 6px $menuActiveText;
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #FFFFFF;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #FFFFFF;
// Breadcrumb 发光效果
$breadcrumbTextGlow: rgba(0, 229, 255, 0.2);
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $menuActiveText;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: 0 0 6px rgba(0, 229, 255, 0.4);
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: rgba(0, 229, 255, 0.5);
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #FFFFFF;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between/js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -0,0 +1,100 @@
// 清新明亮:天空云朵(清新舒适)
// base color
$blue: #5BA3F0;
$light-blue: #7BC4FF;
$red: #FF6B8A;
$pink: #FF8FA8;
$green: #6BCB77;
$tiffany: #7FD1AE;
$yellow: #FFD93D;
$panGreen: #6BCB77;
// sidebar
$menuText: #2A3A4A;
$menuActiveText: #2B7BD9;
$subMenuActiveText: #2B7BD9;
$menuBg: #FFFFFF;
$menuHover: #F0F5FF;
$subMenuBg: #F8FAFC;
$subMenuHover: #E1E8F5;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色(从白色过渡到浅蓝)
$navbarBgStart: #FFFFFF;
$navbarBgEnd: #F5F9FF;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(91, 163, 240, 0.15);
$navbarShadowY: 1px;
$navbarShadowBlur: 4px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(91, 163, 240, 0.2);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: #F0F5FF;
// 右侧菜单项文字颜色
$navbarRightMenuColor: #5A6C7D;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: rgba(91, 163, 240, 0.2);
// 头像边框颜色
$navbarAvatarBorderColor: rgba(91, 163, 240, 0.25);
$navbarAvatarHoverBorderColor: $menuActiveText;
$navbarAvatarHoverGlow: rgba(91, 163, 240, 0.3);
// 下拉箭头颜色
$navbarCaretColor: #5A6C7D;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: #5A6C7D;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: 0 0 4px rgba(91, 163, 240, 0.3);
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #3A4A5A;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #3A4A5A;
// Breadcrumb 发光效果
$breadcrumbTextGlow: transparent;
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $menuActiveText;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: transparent;
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: rgba(91, 163, 240, 0.4);
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #2A3A4A;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between/js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -0,0 +1,100 @@
// 清新明亮:薄荷清新(清爽自然)
// base color
$blue: #5F9EA0;
$light-blue: #7DD3C0;
$red: #FF7F7F;
$pink: #FFA8A8;
$green: #95E1D3;
$tiffany: #B8F2E6;
$yellow: #FFEAA7;
$panGreen: #95E1D3;
// sidebar
$menuText: #3A4A5A;
$menuActiveText: #5F9EA0;
$subMenuActiveText: #5F9EA0;
$menuBg: #FAFEFC;
$menuHover: #F0FAF7;
$subMenuBg: #FCFDFB;
$subMenuHover: #E5F5F0;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色(从白色过渡到淡薄荷色)
$navbarBgStart: #FFFFFF;
$navbarBgEnd: #F5FFFA;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(95, 158, 160, 0.12);
$navbarShadowY: 1px;
$navbarShadowBlur: 4px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(95, 158, 160, 0.15);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: #F0FAF7;
// 右侧菜单项文字颜色
$navbarRightMenuColor: #5A6B7A;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: rgba(95, 158, 160, 0.2);
// 头像边框颜色
$navbarAvatarBorderColor: rgba(95, 158, 160, 0.25);
$navbarAvatarHoverBorderColor: $menuActiveText;
$navbarAvatarHoverGlow: rgba(95, 158, 160, 0.3);
// 下拉箭头颜色
$navbarCaretColor: #5A6B7A;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: #5A6B7A;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: 0 0 4px rgba(95, 158, 160, 0.3);
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #3A4A5A;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #3A4A5A;
// Breadcrumb 发光效果
$breadcrumbTextGlow: transparent;
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $menuActiveText;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: transparent;
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: rgba(90, 107, 122, 0.4);
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #2A3A4A;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between/js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -0,0 +1,100 @@
// 清新明亮:海风浅蓝(宁静舒适)
// base color
$blue: #4A90E2;
$light-blue: #6BB3FF;
$red: #FF7F7F;
$pink: #FFA3A3;
$green: #7DD3C0;
$tiffany: #9CE6DC;
$yellow: #FFEAA7;
$panGreen: #7DD3C0;
// sidebar
$menuText: #3A4A5A;
$menuActiveText: #4A90E2;
$subMenuActiveText: #4A90E2;
$menuBg: #F5FAFF;
$menuHover: #EBF4FF;
$subMenuBg: #F8FCFF;
$subMenuHover: #D9EBFF;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// ===== Navbar 顶部导航栏样式变量 =====
// Navbar 背景渐变色(从白色过渡到浅蓝色)
$navbarBgStart: #FFFFFF;
$navbarBgEnd: #F5FAFF;
// Navbar 阴影颜色和透明度
$navbarShadowColor: rgba(74, 144, 226, 0.12);
$navbarShadowY: 1px;
$navbarShadowBlur: 4px;
$navbarShadowSpread: 0px;
// Navbar 底部边框颜色和透明度
$navbarBorderColor: rgba(74, 144, 226, 0.15);
$navbarBorderWidth: 1px;
// Navbar 悬停背景色(hamburger 和右侧菜单项)
$navbarHoverBg: #EBF4FF;
// 右侧菜单项文字颜色
$navbarRightMenuColor: #5A6C7D;
// 右侧菜单项悬停效果颜色
$navbarRightMenuHoverColor: $menuActiveText;
$navbarRightMenuHoverGlow: rgba(74, 144, 226, 0.2);
// 头像边框颜色
$navbarAvatarBorderColor: rgba(74, 144, 226, 0.25);
$navbarAvatarHoverBorderColor: $menuActiveText;
$navbarAvatarHoverGlow: rgba(74, 144, 226, 0.3);
// 下拉箭头颜色
$navbarCaretColor: #5A6C7D;
// ===== Hamburger 汉堡菜单按钮样式变量 =====
// Hamburger 默认颜色
$hamburgerColor: #5A6C7D;
// Hamburger 激活状态颜色
$hamburgerActiveColor: $menuActiveText;
// Hamburger 发光效果
$hamburgerGlow: 0 0 4px rgba(74, 144, 226, 0.3);
// ===== Breadcrumb 面包屑导航样式变量 =====
// Breadcrumb 文字颜色
$breadcrumbTextColor: #3A4A5A;
// Breadcrumb 链接颜色(可点击项)
$breadcrumbLinkColor: #3A4A5A;
// Breadcrumb 发光效果
$breadcrumbTextGlow: transparent;
// Breadcrumb 悬停颜色
$breadcrumbHoverColor: $menuActiveText;
// Breadcrumb 悬停发光效果
$breadcrumbHoverGlow: transparent;
// Breadcrumb 分隔符颜色
$breadcrumbSeparatorColor: rgba(90, 108, 125, 0.4);
// Breadcrumb 当前页面文字颜色(不可点击项)
$breadcrumbNoRedirectColor: #2A3A4A;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between/js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -1,36 +1 @@
// base color @import 'themes/light/variables.cloudsky';
$blue:#324157;
$light-blue:#3A71A8;
$red:#C03639;
$pink: #E65D6E;
$green: #30B08F;
$tiffany: #4AB7BD;
$yellow:#FEC171;
$panGreen: #30B08F;
// sidebar
$menuText:#bfcbd9;
$menuActiveText:#409EFF;
$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
$menuBg:#304156;
$menuHover:#263445;
$subMenuBg:#1f2d3d;
$subMenuHover:#001528;
// 左侧菜单栏宽度
$sideBarWidth: 250px;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}
@@ -70,15 +70,57 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "~@/assets/styles/variables";
.app-breadcrumb.el-breadcrumb { .app-breadcrumb.el-breadcrumb {
display: inline-block; display: inline-block;
font-size: 14px; font-size: 14px;
line-height: 50px; line-height: 50px;
margin-left: 8px; margin-left: 8px;
::v-deep .el-breadcrumb__item {
.el-breadcrumb__inner {
color: $breadcrumbTextColor !important;
font-weight: 500;
transition: all 0.3s ease;
&.is-link {
color: $breadcrumbLinkColor !important;
text-shadow: 0 0 4px $breadcrumbTextGlow;
&:hover {
color: $breadcrumbHoverColor !important;
filter: drop-shadow($breadcrumbHoverGlow);
}
}
&:hover {
color: $breadcrumbHoverColor !important;
filter: drop-shadow($breadcrumbHoverGlow);
}
}
.el-breadcrumb__separator {
color: $breadcrumbSeparatorColor;
}
}
a {
color: $breadcrumbLinkColor !important;
font-weight: 500;
text-shadow: 0 0 4px $breadcrumbTextGlow;
&:hover {
color: $breadcrumbHoverColor !important;
filter: drop-shadow($breadcrumbHoverGlow);
}
}
.no-redirect { .no-redirect {
color: #97a8be; color: $breadcrumbNoRedirectColor !important;
cursor: text; cursor: text;
font-weight: 500;
text-shadow: 0 0 4px $breadcrumbTextGlow;
} }
} }
</style> </style>
+4 -2
View File
@@ -17,8 +17,10 @@ function CRUD(options) {
idField: 'id', idField: 'id',
// 标题 // 标题
title: '', title: '',
// 请求数据的url // 请求数据的url, @Controller注解的路径
url: '', url: '',
// 分页查询路由,@PostMapping注解的路径
searchRouter: '',
// 表格数据 // 表格数据
data: [], data: [],
// 选择项 // 选择项
@@ -134,7 +136,7 @@ function CRUD(options) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
crud.loading = true crud.loading = true
// 请求数据 // 请求数据
initData(crud.url, crud.getQueryParams()).then(data => { initData(crud.url + crud.searchRouter, crud.getQueryParams()).then(data => {
const table = crud.getTable() const table = crud.getTable()
if (table && table.lazy) { // 懒加载子节点数据,清掉已加载的数据 if (table && table.lazy) { // 懒加载子节点数据,清掉已加载的数据
table.store.states.treeData = {} table.store.states.treeData = {}
+1 -1
View File
@@ -1,5 +1,5 @@
import Vue from 'vue' import Vue from 'vue'
import { get as getDictDetail } from '@/api/system/dictDetail' import { get as getDictDetail } from '@/api/system/dict-detail'
export default class Dict { export default class Dict {
constructor(dict) { constructor(dict) {
@@ -1,6 +1,6 @@
<template> <template>
<a <a
href="https://github.com/odboy-tianjun/cutejava" href="https://gitee.com/odboy-tianjun/cutejava"
target="_blank" target="_blank"
class="github-corner" class="github-corner"
aria-label="View source on Github" aria-label="View source on Github"
@@ -32,15 +32,25 @@ export default {
} }
</script> </script>
<style scoped> <style lang="scss" scoped>
@import "~@/assets/styles/variables";
.hamburger { .hamburger {
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
width: 20px; width: 20px;
height: 20px; height: 20px;
fill: $hamburgerColor;
transition: all 0.3s ease;
} }
.hamburger.is-active { .hamburger.is-active {
transform: rotate(180deg); transform: rotate(180deg);
fill: $hamburgerActiveColor;
filter: drop-shadow($hamburgerGlow);
}
.hamburger:hover {
fill: $hamburgerActiveColor;
} }
</style> </style>
+34 -13
View File
@@ -12,10 +12,9 @@
<screenfull id="screenfull" class="right-menu-item hover-effect" /> <screenfull id="screenfull" class="right-menu-item hover-effect" />
</el-tooltip> </el-tooltip>
<el-tooltip content="布局设置" effect="dark" placement="bottom"> <!--<el-tooltip content="布局设置" effect="dark" placement="bottom">-->
<size-select id="size-select" class="right-menu-item hover-effect" /> <!-- <size-select id="size-select" class="right-menu-item hover-effect" />-->
</el-tooltip> <!--</el-tooltip>-->
</template> </template>
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
@@ -50,7 +49,7 @@ import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb' import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger' import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull' import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect' // import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch' import Search from '@/components/HeaderSearch'
import Avatar from '@/assets/images/avatar.png' import Avatar from '@/assets/images/avatar.png'
@@ -59,7 +58,7 @@ export default {
Breadcrumb, Breadcrumb,
Hamburger, Hamburger,
Screenfull, Screenfull,
SizeSelect, // SizeSelect,
Search Search
}, },
data() { data() {
@@ -110,23 +109,30 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "~@/assets/styles/variables";
.navbar { .navbar {
height: 50px; height: 50px;
overflow: hidden; overflow: hidden;
position: relative; position: relative;
background: #fff; background: linear-gradient(90deg, $navbarBgStart 0%, $navbarBgEnd 100%);
box-shadow: 0 1px 4px rgba(0,21,41,.08); box-shadow: 0 $navbarShadowY $navbarShadowBlur $navbarShadowSpread $navbarShadowColor;
border-bottom: $navbarBorderWidth solid $navbarBorderColor;
.hamburger-container { .hamburger-container {
line-height: 46px; line-height: 46px;
height: 100%; height: 100%;
float: left; float: left;
cursor: pointer; cursor: pointer;
transition: background .3s; transition: all 0.3s ease;
-webkit-tap-highlight-color:transparent; -webkit-tap-highlight-color:transparent;
&:hover { &:hover {
background: rgba(0, 0, 0, .025) background: $navbarHoverBg;
.hamburger {
color: $menuActiveText;
filter: drop-shadow($hamburgerGlow);
}
} }
} }
@@ -153,15 +159,17 @@ export default {
padding: 0 8px; padding: 0 8px;
height: 100%; height: 100%;
font-size: 18px; font-size: 18px;
color: #5a5e66; color: $menuText;
vertical-align: text-bottom; vertical-align: text-bottom;
&.hover-effect { &.hover-effect {
cursor: pointer; cursor: pointer;
transition: background .3s; transition: all 0.3s ease;
&:hover { &:hover {
background: rgba(0, 0, 0, .025) background: $navbarHoverBg;
color: $navbarRightMenuHoverColor;
filter: drop-shadow(0 0 8px $navbarRightMenuHoverGlow);
} }
} }
} }
@@ -178,6 +186,13 @@ export default {
width: 40px; width: 40px;
height: 40px; height: 40px;
border-radius: 10px; border-radius: 10px;
border: 2px solid $navbarAvatarBorderColor;
transition: all 0.3s ease;
&:hover {
border-color: $navbarAvatarHoverBorderColor;
box-shadow: 0 0 15px $navbarAvatarHoverGlow;
}
} }
.el-icon-caret-bottom { .el-icon-caret-bottom {
@@ -186,6 +201,12 @@ export default {
right: -20px; right: -20px;
top: 25px; top: 25px;
font-size: 12px; font-size: 12px;
color: $navbarCaretColor;
transition: all 0.3s ease;
&:hover {
color: $menuActiveText;
}
} }
} }
} }
+17 -5
View File
@@ -19,6 +19,8 @@ export default {
url: '', url: '',
// 查询数据的参数 // 查询数据的参数
params: {}, params: {},
// 是否自定义参数
isCustomParams: false,
// 待查询的对象 // 待查询的对象
query: {}, query: {},
// 等待时间 // 等待时间
@@ -76,11 +78,21 @@ export default {
Object.keys(this.params).length !== 0 && Object.keys(this.params).forEach(item => { Object.keys(this.params).length !== 0 && Object.keys(this.params).forEach(item => {
if (this.params[item] === null || this.params[item] === '') this.params[item] = undefined if (this.params[item] === null || this.params[item] === '') this.params[item] = undefined
}) })
return { if (this.isCustomParams) {
page: this.page, return {
size: this.size, page: this.page,
...this.query, size: this.size,
...this.params args: {
...this.params
}
}
} else {
return {
page: this.page,
size: this.size,
...this.query,
...this.params
}
} }
}, },
// 改变页码 // 改变页码
+4 -3
View File
@@ -3,8 +3,6 @@
* @type {any} * @type {any}
*/ */
const getters = { const getters = {
deployUploadApi: state => state.api.deployUploadApi,
databaseUploadApi: state => state.api.databaseUploadApi,
size: state => state.app.size, size: state => state.app.size,
sidebar: state => state.app.sidebar, sidebar: state => state.app.sidebar,
device: state => state.app.device, device: state => state.app.device,
@@ -24,6 +22,9 @@ const getters = {
swaggerApi: state => state.api.swaggerApi, swaggerApi: state => state.api.swaggerApi,
websocketApi: state => state.api.websocketApi, websocketApi: state => state.api.websocketApi,
sidebarRouters: state => state.permission.sidebarRouters, sidebarRouters: state => state.permission.sidebarRouters,
statusConst: state => state.pipeline.statusConst statusConst: state => state.pipeline.statusConst,
// 上传组件专用
fileUploadApplicationApi: state => state.api.fileUploadApplicationApi,
ossUploadApplicationApi: state => state.api.ossUploadApplicationApi
} }
export default getters export default getters
+4 -1
View File
@@ -5,7 +5,7 @@ const api = {
// 图片上传 // 图片上传
imagesUploadApi: baseUrl + '/api/localStorage/uploadPicture', imagesUploadApi: baseUrl + '/api/localStorage/uploadPicture',
// 修改头像 // 修改头像
updateAvatarApi: baseUrl + '/api/user/modifyUserAvatar', updateAvatarApi: baseUrl + '/api/user/updateUserAvatar',
// Sql 监控 // Sql 监控
druidSqlApi: baseUrl + '/druid/index.html', druidSqlApi: baseUrl + '/druid/index.html',
// websocket // websocket
@@ -16,6 +16,9 @@ const api = {
fileUploadApi: baseUrl + '/api/localStorage/uploadFile', fileUploadApi: baseUrl + '/api/localStorage/uploadFile',
// oss上传 // oss上传
ossUploadApi: baseUrl + '/api/ossStorage/uploadFile', ossUploadApi: baseUrl + '/api/ossStorage/uploadFile',
// 上传组件专用
fileUploadApplicationApi: baseUrl + '/api/component/CuteFileUpload/uploadLocal',
ossUploadApplicationApi: baseUrl + '/api/component/CuteFileUpload/uploadOSS',
// baseUrl, // baseUrl,
baseApi: baseUrl baseApi: baseUrl
} }
+5 -2
View File
@@ -2,8 +2,11 @@ import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
// 密钥对生成 http://web.chacuo.net/netrsakeypair // 密钥对生成 http://web.chacuo.net/netrsakeypair
const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' + const publicKey = 'MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAg975XAOL1zg5EOcSSGPIcxwx5DxcvPD2rBRQa0/o1HTF25cnsU9uSHfzP+qohkDG76kDk+1FA/cuQda4CDAmK2fWW' +
'2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ==' 'q7KgglKd08hRkByjLuRsXu5WVApAAG15ItNM0CrXI7P47aOan+6YPU0Ni1+4WYQnwxfRYdUaKgY5G5gb3S+hx6VO1iN1KuRMBJ7y5FMh1WNJOM9bQb3X1pvaJ73drTpy1wJHAvfP80iG2+sSh0FfcOxCoRNEff' +
'CUsU2bYNH6dG6mXIDvo6XZStspwUfSitfgOER207uvBCCVyFlas+2Xs09yyAoJNjaWmeCPfA7uJvJrXUft/SMy8JNIXBY40vlwk4d4FE6OKOG9Wn0oRlofRKZ7NGvpUxEA5zOW6g2LsHKUUXpgOfu59M6ZHxviGM' +
't26WxJiq/ifVKJE3yVgx0MVIGEFTrG+spOCVsDYMSHnVsPEUdL6g5FV2YLyqNHljBqUqwyOEfUinp7hPRxrLJDMyX6GWy7y48Djg0wyh2hXro/ygVrZ6jcSd7MUAd2lYueUKK8Bey7OzIcOJ6GveHdLzGrspbbkn' +
'DuRsbcInR5bD6l7YA4vpnLsbiOH2wbKJWXNnxRwN5KuWSpwHDHhARB8f4wWrewUKIOxcFI/eJ6ke6D52JMOKhiGeZKn+2/giHwrPGkTREe47Ose6UvTMCAwEAAQ=='
// 加密 // 加密
export function encrypt(txt) { export function encrypt(txt) {
@@ -30,13 +30,13 @@
<script> <script>
import { queryDeptList } from '@/api/system/dept' import CuteDeptTreeApi from '@/api/application/cute-dept-tree'
export default { export default {
name: 'CuteDeptTree', name: 'CuteDeptTree',
props: { props: {
value: { value: {
type: [Number, String], type: String,
required: false, required: false,
default: null default: null
} }
@@ -61,15 +61,11 @@ export default {
params['pid'] = node.data.id params['pid'] = node.data.id
} }
setTimeout(() => { setTimeout(() => {
queryDeptList({ CuteDeptTreeApi.listMetadata(params).then(res => {
page: 1,
size: 9999999,
args: params
}).then(res => {
if (resolve) { if (resolve) {
resolve(res.content) resolve(res)
} else { } else {
this.deptData = res.content this.deptData = res
} }
}) })
}, 100) }, 100)
@@ -14,7 +14,7 @@
:headers="headers" :headers="headers"
:on-success="handleSuccess" :on-success="handleSuccess"
:on-error="handleError" :on-error="handleError"
:action="ossUploadApi" :action="mode === 'oss' ? ossUploadApplicationApi: fileUploadApplicationApi"
> >
<i class="el-icon-upload" /> <i class="el-icon-upload" />
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
@@ -34,6 +34,14 @@ export default {
type: Object, type: Object,
required: true, required: true,
default: null default: null
},
/**
* 上传方式:local、oss
*/
mode: {
type: String,
required: true,
default: 'oss'
} }
}, },
data() { data() {
@@ -44,7 +52,8 @@ export default {
computed: { computed: {
...mapGetters([ ...mapGetters([
'baseApi', 'baseApi',
'ossUploadApi' 'fileUploadApplicationApi',
'ossUploadApplicationApi'
]) ])
}, },
methods: { methods: {
@@ -13,7 +13,7 @@
:headers="headers" :headers="headers"
:on-success="handleSuccess" :on-success="handleSuccess"
:on-error="handleError" :on-error="handleError"
:action="ossUploadApi" :action="mode === 'oss' ? ossUploadApplicationApi: fileUploadApplicationApi"
> >
<el-button size="small" type="primary">点击上传</el-button> <el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传不超过100MB的文件</div> <div slot="tip" class="el-upload__tip">只能上传不超过100MB的文件</div>
@@ -32,6 +32,14 @@ export default {
type: Object, type: Object,
required: true, required: true,
default: null default: null
},
/**
* 上传方式:local、oss
*/
mode: {
type: String,
required: true,
default: 'oss'
} }
}, },
data() { data() {
@@ -42,7 +50,8 @@ export default {
computed: { computed: {
...mapGetters([ ...mapGetters([
'baseApi', 'baseApi',
'ossUploadApi' 'fileUploadApplicationApi',
'ossUploadApplicationApi'
]) ])
}, },
methods: { methods: {
@@ -25,14 +25,14 @@
<script> <script>
import { queryDeptSelectDataSource } from '@/api/system/component' import { listMetadata } from '@/api/application/cute-product-line-select'
import CsMessage from '@/utils/elementui/CsMessage' import CsMessage from '@/utils/elementui/CsMessage'
export default { export default {
name: 'CuteProductLineSelect', name: 'CuteProductLineSelect',
props: { props: {
value: { value: {
type: [Number, String], type: String,
default: null default: null
}, },
disabled: { disabled: {
@@ -56,7 +56,7 @@ export default {
}, },
methods: { methods: {
fetchDeptData() { fetchDeptData() {
queryDeptSelectDataSource().then(data => { listMetadata().then(data => {
this.deptOptions = data this.deptOptions = data
}).catch(error => { }).catch(error => {
console.error('获取部门数据失败:', error) console.error('获取部门数据失败:', error)
@@ -17,7 +17,7 @@
<script> <script>
import { queryDeptSelectProDataSource } from '@/api/system/component' import { listMetadata } from '@/api/application/cute-product-line-select-pro'
import CsMessage from '@/utils/elementui/CsMessage' import CsMessage from '@/utils/elementui/CsMessage'
export default { export default {
@@ -62,7 +62,7 @@ export default {
}) })
}, },
fetchDeptData() { fetchDeptData() {
queryDeptSelectProDataSource().then(data => { listMetadata().then(data => {
this.deptOptions = this.cleanEmptyChildren(data) this.deptOptions = this.cleanEmptyChildren(data)
// console.error('deptOptions', this.deptOptions) // console.error('deptOptions', this.deptOptions)
}).catch(error => { }).catch(error => {
@@ -28,7 +28,7 @@
<script> <script>
import UserService from '@/api/system/user' import CuteUserSelectApi from '@/api/application/cute-user-select'
export default { export default {
name: 'CuteSingleUserSelect', name: 'CuteSingleUserSelect',
@@ -41,7 +41,7 @@ export default {
}, },
data() { data() {
return { return {
user: this.value, user: [],
loading: false, loading: false,
options: [] options: []
} }
@@ -51,21 +51,28 @@ export default {
this.user = newVal this.user = newVal
} }
}, },
async mounted() {
const that = this
if (that.value && that.value.length > 0) {
that.options = await CuteUserSelectApi.listMetadataByUsernames(that.value)
that.users = that.value
}
},
methods: { methods: {
remoteMethod(query) { remoteMethod(query) {
if (query !== '') { if (query !== '') {
this.loading = true this.loading = true
setTimeout(() => { setTimeout(() => {
this.loading = false this.loading = false
this.queryUserMetaPage(query) this.listMetadata(query)
}, 200) }, 200)
} else { } else {
this.options = [] this.options = []
} }
}, },
queryUserMetaPage(query, options) { listMetadata(query, options) {
const that = this const that = this
UserService.queryUserMetaPage(query).then(res => { CuteUserSelectApi.listMetadata(query).then(res => {
that.options = res that.options = res
}) })
}, },
@@ -28,7 +28,7 @@
<script> <script>
import UserService from '@/api/system/user' import CuteUserSelectApi from '@/api/application/cute-user-select'
export default { export default {
name: 'CuteUserSelect', name: 'CuteUserSelect',
@@ -37,16 +37,11 @@ export default {
type: Array, type: Array,
required: false, required: false,
default: null default: null
},
dataSource: {
type: Array,
required: false,
default: null
} }
}, },
data() { data() {
return { return {
users: this.value, users: [],
loading: false, loading: false,
options: [] options: []
} }
@@ -56,9 +51,11 @@ export default {
this.users = newVal this.users = newVal
} }
}, },
mounted() { async mounted() {
if (this.dataSource && this.dataSource.length > 0) { const that = this
this.options = this.dataSource if (that.value && that.value.length > 0) {
that.options = await CuteUserSelectApi.listMetadataByUsernames(that.value)
that.users = that.value
} }
}, },
methods: { methods: {
@@ -67,15 +64,15 @@ export default {
this.loading = true this.loading = true
setTimeout(() => { setTimeout(() => {
this.loading = false this.loading = false
this.queryUserMetaPage(query) this.listMetadata(query)
}, 200) }, 200)
} else { } else {
this.options = [] this.options = []
} }
}, },
queryUserMetaPage(query, options) { listMetadata(query, options) {
const that = this const that = this
UserService.queryUserMetaPage(query).then(res => { CuteUserSelectApi.listMetadata(query).then(res => {
that.options = res that.options = res
}) })
}, },
@@ -26,7 +26,7 @@ export default {
href: { href: {
type: String, type: String,
required: true, required: true,
default: 'https://github.com/odboy-tianjun' default: 'https://gitee.com/odboy-tianjun'
} }
} }
} }
@@ -65,7 +65,7 @@ export default {
data() { data() {
return { return {
form: { form: {
user: null, user: [],
dept: null, dept: null,
productLine: null, productLine: null,
productLinePro: null productLinePro: null
@@ -78,7 +78,7 @@ export default {
} }
}, },
fetch: async(queryParams) => { fetch: async(queryParams) => {
return DictService.queryPageDict(queryParams) return DictService.searchDict(queryParams)
}, },
pageProps: { pageProps: {
current: 1, current: 1,
@@ -11,7 +11,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="文件上传" prop="fileUrl"> <el-form-item label="文件上传" prop="fileUrl">
<cute-file-drag-upload v-model="form" /> <cute-file-drag-upload v-model="form" mode="local" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="submitForm('form')">提 交</el-button> <el-button type="primary" @click="submitForm('form')">提 交</el-button>
@@ -11,7 +11,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="文件上传" prop="fileUrl"> <el-form-item label="文件上传" prop="fileUrl">
<cute-file-upload v-model="form" /> <cute-file-upload v-model="form" mode="local" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="submitForm('form')">提 交</el-button> <el-button type="primary" @click="submitForm('form')">提 交</el-button>
@@ -105,7 +105,7 @@ export default {
} }
}, },
fetch: async(queryParams) => { fetch: async(queryParams) => {
return DictService.queryPageDict(queryParams) return DictService.searchDict(queryParams)
}, },
columns: [ columns: [
{ prop: 'name', label: '名称' }, { prop: 'name', label: '名称' },
+1 -1
View File
@@ -220,7 +220,7 @@ export default {
.login-form-box { .login-form-box {
width: 360px; width: 360px;
height: 370px; height: 390px;
background-color: #FFFFFF; background-color: #FFFFFF;
} }
@@ -140,7 +140,7 @@ export default {
name: 'Dept', name: 'Dept',
components: { Treeselect, crudOperation, rrOperation, udOperation, DateRangePicker }, components: { Treeselect, crudOperation, rrOperation, udOperation, DateRangePicker },
cruds() { cruds() {
return CRUD({ title: '部门', url: 'api/dept', crudMethod: { ...crudDept }}) return CRUD({ title: '部门', url: 'api/dept', searchRouter: '/searchDept', crudMethod: { ...crudDept }})
}, },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
// 设置数据字典 // 设置数据字典
@@ -175,7 +175,7 @@ export default {
args: { pid: tree.id } args: { pid: tree.id }
} }
setTimeout(() => { setTimeout(() => {
crudDept.queryDeptList(params).then(res => { crudDept.searchDept(params).then(res => {
resolve(res.content) resolve(res.content)
}) })
}, 100) }, 100)
@@ -195,7 +195,7 @@ export default {
} }
}, },
getSupDepts(id) { getSupDepts(id) {
crudDept.queryDeptSuperiorTree(id, true).then(res => { crudDept.searchDeptTree(id, true).then(res => {
const data = res.content const data = res.content
this.buildDepts(data) this.buildDepts(data)
this.depts = data this.depts = data
@@ -212,7 +212,7 @@ export default {
}) })
}, },
getDepts() { getDepts() {
crudDept.queryDeptList({ crudDept.searchDept({
page: 1, page: 1,
size: 9999999, size: 9999999,
args: { enabled: true } args: { enabled: true }
@@ -228,7 +228,7 @@ export default {
// 获取弹窗内部门数据 // 获取弹窗内部门数据
loadDepts({ action, parentNode, callback }) { loadDepts({ action, parentNode, callback }) {
if (action === LOAD_CHILDREN_OPTIONS) { if (action === LOAD_CHILDREN_OPTIONS) {
crudDept.queryDeptList({ crudDept.searchDept({
page: 1, page: 1,
size: 9999999, size: 9999999,
args: { enabled: true, pid: parentNode.id } args: { enabled: true, pid: parentNode.id }
@@ -4,22 +4,6 @@
<div class="my-code">点击字典查看详情</div> <div class="my-code">点击字典查看详情</div>
</div> </div>
<div v-else> <div v-else>
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<el-input
v-model="query.label"
clearable
size="small"
placeholder="输入字典标签查询"
style="width: 200px;"
class="filter-item"
@keyup.enter.native="toQuery"
/>
<rrOperation />
</div>
</div>
<!--表单组件--> <!--表单组件-->
<el-dialog <el-dialog
append-to-body append-to-body
@@ -88,20 +72,19 @@
</template> </template>
<script> <script>
import crudDictDetail from '@/api/system/dictDetail' import crudDictDetail from '@/api/system/dict-detail'
import CRUD, { form, header, presenter } from '@crud/crud' import CRUD, { form, header, presenter } from '@crud/crud'
import pagination from '@crud/Pagination' import pagination from '@crud/Pagination'
import rrOperation from '@crud/RR.operation'
import udOperation from '@crud/UD.operation' import udOperation from '@crud/UD.operation'
const defaultForm = { id: null, label: null, value: null, dictSort: 999 } const defaultForm = { id: null, label: null, value: null, dictSort: 999 }
export default { export default {
components: { pagination, rrOperation, udOperation }, components: { pagination, udOperation },
cruds() { cruds() {
return [ return [
CRUD({ CRUD({
title: '字典详情', url: 'api/dictDetail', query: { dictName: '' }, title: '字典详情', url: 'api/dictDetail', searchRouter: '/searchDictDetail', query: { dictName: '' },
crudMethod: { ...crudDictDetail }, crudMethod: { ...crudDictDetail },
optShow: { optShow: {
add: true, add: true,
@@ -114,7 +114,7 @@ export default {
components: { crudOperation, pagination, rrOperation, udOperation, dictDetail }, components: { crudOperation, pagination, rrOperation, udOperation, dictDetail },
cruds() { cruds() {
return [ return [
CRUD({ title: '字典', url: 'api/dict', crudMethod: { ...crudDict }}) CRUD({ title: '字典', url: 'api/dict', searchRouter: '/searchDict', crudMethod: { ...crudDict }})
] ]
}, },
mixins: [presenter(), header(), form(defaultForm)], mixins: [presenter(), header(), form(defaultForm)],
@@ -27,7 +27,7 @@
</template> </template>
<script> <script>
import { getLastEmailConfig, modifyEmailConfig } from '@/api/system/email' import { getLastEmailConfig, updateEmailConfigById } from '@/api/system/email'
export default { export default {
name: 'Config', name: 'Config',
@@ -67,7 +67,7 @@ export default {
this.$refs['form'].validate((valid) => { this.$refs['form'].validate((valid) => {
if (valid) { if (valid) {
this.loading = true this.loading = true
modifyEmailConfig(this.form).then(res => { updateEmailConfigById(this.form).then(res => {
this.$notify({ this.$notify({
title: '修改成功', title: '修改成功',
type: 'success', type: 'success',
@@ -21,7 +21,7 @@
</template> </template>
<script> <script>
import { sendEmail } from '@/api/system/email' import { send } from '@/api/system/email'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import E from 'wangeditor' import E from 'wangeditor'
import { UploadFile } from '@/utils/CsDomUtil' import { UploadFile } from '@/utils/CsDomUtil'
@@ -74,7 +74,7 @@ export default {
this.$refs['form'].validate((valid) => { this.$refs['form'].validate((valid) => {
if (valid) { if (valid) {
this.loading = true this.loading = true
sendEmail(this.form).then(res => { send(this.form).then(res => {
this.$notify({ this.$notify({
title: '发送成功', title: '发送成功',
type: 'success', type: 'success',
@@ -70,6 +70,7 @@ export default {
return CRUD({ return CRUD({
title: '岗位', title: '岗位',
url: 'api/job', url: 'api/job',
searchRouter: '/searchJob',
crudMethod: { ...crudJob } crudMethod: { ...crudJob }
}) })
}, },
@@ -137,7 +137,7 @@
ref="table" ref="table"
v-loading="crud.loading" v-loading="crud.loading"
lazy lazy
:load="queryMenuByArgs" :load="searchMenu"
:data="crud.data" :data="crud.data"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}" :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
row-key="id" row-key="id"
@@ -239,7 +239,7 @@ export default {
name: 'Menu', name: 'Menu',
components: { Treeselect, IconSelect, crudOperation, rrOperation, udOperation, DateRangePicker }, components: { Treeselect, IconSelect, crudOperation, rrOperation, udOperation, DateRangePicker },
cruds() { cruds() {
return CRUD({ title: '菜单', url: 'api/menu', crudMethod: { ...crudMenu }}) return CRUD({ title: '菜单', url: 'api/menu', searchRouter: '/searchMenu', crudMethod: { ...crudMenu }})
}, },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
data() { data() {
@@ -273,14 +273,14 @@ export default {
this.menus.push({ id: 0, label: '顶级类目', children: null }) this.menus.push({ id: 0, label: '顶级类目', children: null })
} }
}, },
queryMenuByArgs(tree, treeNode, resolve) { searchMenu(tree, treeNode, resolve) {
const params = { const params = {
page: 1, page: 1,
size: 9999999, size: 9999999,
args: { pid: tree.id } args: { pid: tree.id }
} }
setTimeout(() => { setTimeout(() => {
crudMenu.queryMenuByArgs(params).then(res => { crudMenu.searchMenu(params).then(res => {
resolve(res.content) resolve(res.content)
}) })
}, 100) }, 100)
@@ -298,7 +298,7 @@ export default {
}, },
loadMenus({ action, parentNode, callback }) { loadMenus({ action, parentNode, callback }) {
if (action === LOAD_CHILDREN_OPTIONS) { if (action === LOAD_CHILDREN_OPTIONS) {
crudMenu.queryMenuListByPid(parentNode.id).then(res => { crudMenu.listMenuByPid(parentNode.id).then(res => {
parentNode.children = res.map(function(obj) { parentNode.children = res.map(function(obj) {
if (!obj.leaf) { if (!obj.leaf) {
obj.children = null obj.children = null
@@ -85,7 +85,7 @@ export default {
name: 'OnlineUser', name: 'OnlineUser',
components: { pagination, crudOperation, rrOperation }, components: { pagination, crudOperation, rrOperation },
cruds() { cruds() {
return CRUD({ url: 'api/user/online', title: '在线用户' }) return CRUD({ url: 'api/user/online', searchRouter: '/searchOnlineUser', title: '在线用户' })
}, },
mixins: [presenter(), header(), crud()], mixins: [presenter(), header(), crud()],
data() { data() {
@@ -28,6 +28,7 @@
>日志 >日志
</el-button> </el-button>
</crudOperation> </crudOperation>
<el-link type="primary" href="https://cron.ciding.cc/" target="_blank">Cron在线表达式生成</el-link>
<Log ref="log" /> <Log ref="log" />
</div> </div>
<!--Form表单--> <!--Form表单-->
@@ -166,7 +167,7 @@
</template> </template>
<script> <script>
import crudJob from '@/api/system/quartzJob' import crudJob from '@/api/system/quartz-job'
import Log from './log' import Log from './log'
import CRUD, { crud, form, header, presenter } from '@crud/crud' import CRUD, { crud, form, header, presenter } from '@crud/crud'
import rrOperation from '@crud/RR.operation' import rrOperation from '@crud/RR.operation'
@@ -192,7 +193,7 @@ export default {
name: 'QuartzJob', name: 'QuartzJob',
components: { Log, pagination, crudOperation, rrOperation, DateRangePicker }, components: { Log, pagination, crudOperation, rrOperation, DateRangePicker },
cruds() { cruds() {
return CRUD({ title: '定时任务', url: 'api/quartzJob', crudMethod: { ...crudJob }}) return CRUD({ title: '定时任务', url: 'api/quartzJob', searchRouter: '/searchQuartzJob', crudMethod: { ...crudJob }})
}, },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
data() { data() {
@@ -73,7 +73,7 @@
<el-pagination <el-pagination
:total="total" :total="total"
:current-page="page" :current-page="page"
:page-size="6" :page-size="size"
style="margin-top:8px;" style="margin-top:8px;"
layout="total, prev, pager, next" layout="total, prev, pager, next"
@size-change="sizeChange" @size-change="sizeChange"
@@ -109,8 +109,14 @@ export default {
}, },
// 获取数据前设置好接口地址 // 获取数据前设置好接口地址
beforeInit() { beforeInit() {
this.url = 'api/quartzJob/logs' this.url = 'api/quartzJob/searchQuartzLog'
this.size = 6 this.page = 1
this.isCustomParams = true
this.params = {
jobName: this.query.jobName,
createTime: this.query.createTime,
isSuccess: this.query.isSuccess
}
return true return true
}, },
// 异常详情 // 异常详情
+11 -11
View File
@@ -68,7 +68,7 @@
</el-dialog> </el-dialog>
<el-row :gutter="15"> <el-row :gutter="15">
<!--角色管理--> <!--角色管理-->
<el-col :xs="24" :sm="24" :md="16" :lg="16" :xl="17" style="margin-bottom: 10px"> <el-col span="18" style="margin-bottom: 10px">
<el-card class="box-card" shadow="never"> <el-card class="box-card" shadow="never">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span class="role-span">角色列表</span> <span class="role-span">角色列表</span>
@@ -113,7 +113,7 @@
</el-card> </el-card>
</el-col> </el-col>
<!-- 菜单授权 --> <!-- 菜单授权 -->
<el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="7"> <el-col span="6">
<el-card class="box-card" shadow="never"> <el-card class="box-card" shadow="never">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<el-tooltip class="item" effect="dark" content="选择指定角色分配菜单" placement="top"> <el-tooltip class="item" effect="dark" content="选择指定角色分配菜单" placement="top">
@@ -152,8 +152,8 @@
<script> <script>
import crudRoles from '@/api/system/role' import crudRoles from '@/api/system/role'
import { queryDeptList, queryDeptSuperiorTree } from '@/api/system/dept' import { searchDept, searchDeptTree } from '@/api/system/dept'
import { queryChildMenuSet, queryMenuListByPid } from '@/api/system/menu' import { listChildMenuSetByMenuId, listRoleMenuByPid } from '@/api/system/menu'
import CRUD, { crud, form, header, presenter } from '@crud/crud' import CRUD, { crud, form, header, presenter } from '@crud/crud'
import rrOperation from '@crud/RR.operation' import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation' import crudOperation from '@crud/CRUD.operation'
@@ -168,7 +168,7 @@ export default {
name: 'Role', name: 'Role',
components: { Treeselect, pagination, crudOperation, rrOperation, udOperation, DateRangePicker }, components: { Treeselect, pagination, crudOperation, rrOperation, udOperation, DateRangePicker },
cruds() { cruds() {
return CRUD({ title: '角色', url: 'api/role', crudMethod: { ...crudRoles }}) return CRUD({ title: '角色', url: 'api/role', searchRouter: '/searchRole', crudMethod: { ...crudRoles }})
}, },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
data() { data() {
@@ -190,14 +190,14 @@ export default {
} }
}, },
created() { created() {
crudRoles.getLevel().then(data => { crudRoles.getCurrentUserRoleLevel().then(data => {
this.level = data.level this.level = data.level
}) })
}, },
methods: { methods: {
getMenuDatas(node, resolve) { getMenuDatas(node, resolve) {
setTimeout(() => { setTimeout(() => {
queryMenuListByPid(node.data.id ? node.data.id : 0).then(res => { listRoleMenuByPid(node.data.id ? node.data.id : 0).then(res => {
resolve(res) resolve(res)
}) })
}, 100) }, 100)
@@ -261,7 +261,7 @@ export default {
}, },
menuChange(menu) { menuChange(menu) {
// 获取该节点的所有子节点,id 包含自身 // 获取该节点的所有子节点,id 包含自身
queryChildMenuSet(menu.id).then(childIds => { listChildMenuSetByMenuId(menu.id).then(childIds => {
// 判断是否在 menuIds 中,如果存在则删除,否则添加 // 判断是否在 menuIds 中,如果存在则删除,否则添加
if (this.menuIds.indexOf(menu.id) !== -1) { if (this.menuIds.indexOf(menu.id) !== -1) {
for (let i = 0; i < childIds.length; i++) { for (let i = 0; i < childIds.length; i++) {
@@ -313,7 +313,7 @@ export default {
}, },
// 获取部门数据 // 获取部门数据
getDepts() { getDepts() {
queryDeptList({ searchDept({
page: 1, page: 1,
size: 9999999, size: 9999999,
args: { enabled: true } args: { enabled: true }
@@ -331,7 +331,7 @@ export default {
depts.forEach(dept => { depts.forEach(dept => {
ids.push(dept.id) ids.push(dept.id)
}) })
queryDeptSuperiorTree(ids).then(res => { searchDeptTree(ids).then(res => {
const date = res.content const date = res.content
this.buildDepts(date) this.buildDepts(date)
this.depts = date this.depts = date
@@ -350,7 +350,7 @@ export default {
// 获取弹窗内部门数据 // 获取弹窗内部门数据
loadDepts({ action, parentNode, callback }) { loadDepts({ action, parentNode, callback }) {
if (action === LOAD_CHILDREN_OPTIONS) { if (action === LOAD_CHILDREN_OPTIONS) {
queryDeptList({ searchDept({
page: 1, page: 1,
size: 9999999, size: 9999999,
args: { enabled: true, pid: parentNode.id } args: { enabled: true, pid: parentNode.id }
@@ -154,7 +154,7 @@ export default {
return { return {
show: false, show: false,
monitor: null, monitor: null,
url: 'api/monitor/queryServerMonitorInfo', url: 'api/monitor/getServerMonitorInfo',
data: {}, data: {},
cpuInfo: { cpuInfo: {
tooltip: { tooltip: {
@@ -125,7 +125,7 @@
<script> <script>
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import crudFile from '@/api/system/localStorage' import crudFile from '@/api/system/local-storage'
import CRUD, { crud, form, header, presenter } from '@crud/crud' import CRUD, { crud, form, header, presenter } from '@crud/crud'
import rrOperation from '@crud/RR.operation' import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation' import crudOperation from '@crud/CRUD.operation'
@@ -136,7 +136,7 @@ const defaultForm = { id: null, name: '' }
export default { export default {
components: { pagination, crudOperation, rrOperation, DateRangePicker }, components: { pagination, crudOperation, rrOperation, DateRangePicker },
cruds() { cruds() {
return CRUD({ title: '文件', url: 'api/localStorage', crudMethod: { ...crudFile }}) return CRUD({ title: '文件', url: 'api/localStorage', searchRouter: '/searchLocalStorage', crudMethod: { ...crudFile }})
}, },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
data() { data() {
@@ -94,7 +94,7 @@
<script> <script>
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import crudFile from '@/api/system/ossStorage' import crudFile from '@/api/system/oss-storage'
import CRUD, { crud, form, header, presenter } from '@crud/crud' import CRUD, { crud, form, header, presenter } from '@crud/crud'
import rrOperation from '@crud/RR.operation' import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation' import crudOperation from '@crud/CRUD.operation'
@@ -107,7 +107,7 @@ const defaultForm = { id: null }
export default { export default {
components: { pagination, crudOperation, rrOperation, DateRangePicker }, components: { pagination, crudOperation, rrOperation, DateRangePicker },
cruds() { cruds() {
return CRUD({ title: '文件', url: 'api/ossStorage', crudMethod: { ...crudFile }}) return CRUD({ title: '文件', url: 'api/ossStorage', searchRouter: '/searchOssStorage', crudMethod: { ...crudFile }})
}, },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
data() { data() {
+11 -11
View File
@@ -55,8 +55,8 @@
<svg-icon icon-class="anq" /> <svg-icon icon-class="anq" />
安全设置 安全设置
<div class="user-right"> <div class="user-right">
<a @click="$refs.pass.dialog = true">修改密码</a> <el-button type="text" style="padding: 0" @click="$refs.pass.dialog = true">修改密码</el-button>
<a @click="$refs.email.dialog = true">修改邮箱</a> <el-button type="text" style="padding: 0" @click="$refs.email.dialog = true">修改邮箱</el-button>
</div> </div>
</li> </li>
</ul> </ul>
@@ -98,15 +98,15 @@
<!-- 操作日志 --> <!-- 操作日志 -->
<el-tab-pane label="操作日志" name="second"> <el-tab-pane label="操作日志" name="second">
<el-table v-loading="loading" :data="data" style="width: 100%;"> <el-table v-loading="loading" :data="data" style="width: 100%;">
<el-table-column prop="description" label="行为" /> <el-table-column prop="bizName" label="业务名称" />
<el-table-column prop="requestIp" label="IP" /> <el-table-column prop="requestIp" label="IP" />
<el-table-column :show-overflow-tooltip="true" prop="address" label="IP来源" /> <el-table-column :show-overflow-tooltip="true" prop="address" label="IP来源" />
<el-table-column prop="browser" label="浏览器" /> <el-table-column prop="browserInfo" label="浏览器" />
<el-table-column prop="time" label="请求耗时" align="center"> <el-table-column prop="executeTime" label="请求耗时" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="scope.row.time <= 300">{{ scope.row.time }}ms</el-tag> <el-tag v-if="scope.row.executeTime <= 300">{{ scope.row.time || 0 }}ms</el-tag>
<el-tag v-else-if="scope.row.time <= 1000" type="warning">{{ scope.row.time }}ms</el-tag> <el-tag v-else-if="scope.row.executeTime <= 1000" type="warning">{{ scope.row.executeTime || 0 }}ms</el-tag>
<el-tag v-else type="danger">{{ scope.row.time }}ms</el-tag> <el-tag v-else type="danger">{{ scope.row.executeTime || 0 }}ms</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@@ -151,7 +151,7 @@ import { getToken } from '@/utils/auth'
import store from '@/store' import store from '@/store'
import { IsValidPhone } from '@/utils/CsValidateUtil' import { IsValidPhone } from '@/utils/CsValidateUtil'
import crud from '@/mixins/crud' import crud from '@/mixins/crud'
import { editUser } from '@/api/system/user' import { updateUserCenterInfoById } from '@/api/system/user'
import Avatar from '@/assets/images/avatar.png' import Avatar from '@/assets/images/avatar.png'
export default { export default {
@@ -211,7 +211,7 @@ export default {
} }
}, },
beforeInit() { beforeInit() {
this.url = 'api/logs/user' this.url = 'api/logs/searchUserLog'
return true return true
}, },
cropUploadSuccess(jsonData, field) { cropUploadSuccess(jsonData, field) {
@@ -223,7 +223,7 @@ export default {
this.$refs['form'].validate((valid) => { this.$refs['form'].validate((valid) => {
if (valid) { if (valid) {
this.saveLoading = true this.saveLoading = true
editUser(this.form).then(() => { updateUserCenterInfoById(this.form).then(() => {
this.editSuccessNotify() this.editSuccessNotify()
store.dispatch('GetInfo').then(() => { store.dispatch('GetInfo').then(() => {
}) })
@@ -34,9 +34,9 @@
<script> <script>
import store from '@/store' import store from '@/store'
import { validEmail } from '@/utils/CsValidateUtil' import { IsValidEmail } from '@/utils/CsValidateUtil'
import { updateEmail } from '@/api/system/user' import { updateUserEmailByUsername } from '@/api/system/user'
import { sendResetEmailCaptcha } from '@/api/system/code' import { sendResetEmailCode } from '@/api/system/code'
export default { export default {
props: { props: {
@@ -51,7 +51,7 @@ export default {
callback(new Error('新邮箱不能为空')) callback(new Error('新邮箱不能为空'))
} else if (value === this.email) { } else if (value === this.email) {
callback(new Error('新邮箱不能与旧邮箱相同')) callback(new Error('新邮箱不能与旧邮箱相同'))
} else if (validEmail(value)) { } else if (IsValidEmail(value)) {
callback() callback()
} else { } else {
callback(new Error('邮箱格式错误')) callback(new Error('邮箱格式错误'))
@@ -83,7 +83,7 @@ export default {
this.codeLoading = true this.codeLoading = true
this.buttonName = '验证码发送中' this.buttonName = '验证码发送中'
const _this = this const _this = this
sendResetEmailCaptcha(this.form.email).then(res => { sendResetEmailCode(this.form.email).then(res => {
this.$message({ this.$message({
showClose: true, showClose: true,
message: '发送成功,验证码有效期5分钟', message: '发送成功,验证码有效期5分钟',
@@ -113,7 +113,7 @@ export default {
this.$refs['form'].validate((valid) => { this.$refs['form'].validate((valid) => {
if (valid) { if (valid) {
this.loading = true this.loading = true
updateEmail(this.form).then(res => { updateUserEmailByUsername(this.form).then(res => {
this.loading = false this.loading = false
this.resetForm() this.resetForm()
this.$notify({ this.$notify({
@@ -30,7 +30,7 @@
<script> <script>
import store from '@/store' import store from '@/store'
import { updatePass } from '@/api/system/user' import { updateUserPasswordByUsername } from '@/api/system/user'
export default { export default {
data() { data() {
@@ -69,7 +69,7 @@ export default {
this.$refs['form'].validate((valid) => { this.$refs['form'].validate((valid) => {
if (valid) { if (valid) {
this.loading = true this.loading = true
updatePass(this.form).then(res => { updateUserPasswordByUsername(this.form).then(res => {
this.resetForm() this.resetForm()
this.$notify({ this.$notify({
title: '密码修改成功,请重新登录', title: '密码修改成功,请重新登录',
+11 -11
View File
@@ -196,9 +196,9 @@
<script> <script>
import crudUser from '@/api/system/user' import crudUser from '@/api/system/user'
import { IsValidPhone } from '@/utils/CsValidateUtil' import { IsValidPhone } from '@/utils/CsValidateUtil'
import { queryDeptList, queryDeptSuperiorTree } from '@/api/system/dept' import { searchDept, searchDeptTree } from '@/api/system/dept'
import { getLevel, queryRoleList } from '@/api/system/role' import { getCurrentUserRoleLevel, listAllRole } from '@/api/system/role'
import { queryAllEnableJob } from '@/api/system/job' import { searchJob } from '@/api/system/job'
import CRUD, { crud, form, header, presenter } from '@crud/crud' import CRUD, { crud, form, header, presenter } from '@crud/crud'
import rrOperation from '@crud/RR.operation' import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation' import crudOperation from '@crud/CRUD.operation'
@@ -228,7 +228,7 @@ export default {
name: 'User', name: 'User',
components: { CuteDeptTree, Treeselect, crudOperation, rrOperation, udOperation, pagination, DateRangePicker }, components: { CuteDeptTree, Treeselect, crudOperation, rrOperation, udOperation, pagination, DateRangePicker },
cruds() { cruds() {
return CRUD({ title: '用户', url: 'api/user', crudMethod: { ...crudUser }}) return CRUD({ title: '用户', url: 'api/user', searchRouter: '/aggregationSearchUser', crudMethod: { ...crudUser }})
}, },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
// 数据字典 // 数据字典
@@ -401,7 +401,7 @@ export default {
this.crud.toQuery() this.crud.toQuery()
}, },
getDepts() { getDepts() {
queryDeptList({ searchDept({
page: 1, page: 1,
size: 9999999, size: 9999999,
args: { enabled: true } args: { enabled: true }
@@ -415,7 +415,7 @@ export default {
}) })
}, },
getSupDepts(deptId) { getSupDepts(deptId) {
queryDeptSuperiorTree(deptId).then(res => { searchDeptTree(deptId).then(res => {
const date = res.content const date = res.content
this.buildDepts(date) this.buildDepts(date)
this.depts = date this.depts = date
@@ -434,7 +434,7 @@ export default {
// 获取弹窗内部门数据 // 获取弹窗内部门数据
loadDepts({ action, parentNode, callback }) { loadDepts({ action, parentNode, callback }) {
if (action === LOAD_CHILDREN_OPTIONS) { if (action === LOAD_CHILDREN_OPTIONS) {
queryDeptList({ searchDept({
page: 1, page: 1,
size: 9999999, size: 9999999,
args: { enabled: true, pid: parentNode.id } args: { enabled: true, pid: parentNode.id }
@@ -469,21 +469,21 @@ export default {
}, },
// 获取弹窗内角色数据 // 获取弹窗内角色数据
getRoles() { getRoles() {
queryRoleList().then(res => { listAllRole().then(res => {
this.roles = res this.roles = res
}).catch(() => { }).catch(() => {
}) })
}, },
// 获取弹窗内岗位数据 // 获取弹窗内岗位数据
getJobs() { getJobs() {
queryAllEnableJob().then(res => { searchJob().then(res => {
this.jobs = res.content this.jobs = res.content
}).catch(() => { }).catch(() => {
}) })
}, },
// 获取权限级别 // 获取权限级别
getRoleLevel() { getRoleLevel() {
getLevel().then(res => { getCurrentUserRoleLevel().then(res => {
this.level = res.level this.level = res.level
}).catch(() => { }).catch(() => {
}) })
@@ -502,7 +502,7 @@ export default {
ids.push(val.id) ids.push(val.id)
}) })
console.log(ids) console.log(ids)
crudUser.resetPwd(ids).then(() => { crudUser.resetUserPasswordByIds(ids).then(() => {
this.crud.notify('重置成功, 用户新密码:123456', CRUD.NOTIFICATION_TYPE.SUCCESS) this.crud.notify('重置成功, 用户新密码:123456', CRUD.NOTIFICATION_TYPE.SUCCESS)
}).catch(() => { }).catch(() => {
}) })
+7
View File
@@ -41,6 +41,13 @@ module.exports = {
pathRewrite: { pathRewrite: {
'^/auth': 'auth' '^/auth': 'auth'
} }
},
'/captcha': {
target: process.env.VUE_APP_BASE_API,
changeOrigin: true,
pathRewrite: {
'^/captcha': 'captcha'
}
} }
} }
}, },
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>cutejava</artifactId> <artifactId>cutejava</artifactId>
<groupId>cn.odboy</groupId> <groupId>cn.odboy</groupId>
<version>1.4.1</version> <version>1.5.2</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>cutejava-framework</artifactId> <artifactId>cutejava-framework</artifactId>
<name>公共模块</name> <name>公共模块</name>
</project> </project>
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -15,7 +15,12 @@
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.*; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/** /**
* 用于标记匿名访问方法 * 用于标记匿名访问方法
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,15 +13,17 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.*;
/** /**
* Annotation for mapping HTTP {@code DELETE} requests onto specific handler methods. 支持匿名访问 DeleteMapping * Annotation for mapping HTTP {@code DELETE} requests onto specific handler methods. 支持匿名访问 DeleteMapping
* *
@@ -38,38 +40,38 @@ import java.lang.annotation.*;
@RequestMapping(method = RequestMethod.DELETE) @RequestMapping(method = RequestMethod.DELETE)
public @interface AnonymousDeleteMapping { public @interface AnonymousDeleteMapping {
/** /**
* Alias for {@link RequestMapping#name}. * Alias for {@link RequestMapping#name}.
*/ */
@AliasFor(annotation = RequestMapping.class) String name() default ""; @AliasFor(annotation = RequestMapping.class) String name() default "";
/** /**
* Alias for {@link RequestMapping#value}. * Alias for {@link RequestMapping#value}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] value() default {}; @AliasFor(annotation = RequestMapping.class) String[] value() default {};
/** /**
* Alias for {@link RequestMapping#path}. * Alias for {@link RequestMapping#path}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] path() default {}; @AliasFor(annotation = RequestMapping.class) String[] path() default {};
/** /**
* Alias for {@link RequestMapping#params}. * Alias for {@link RequestMapping#params}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] params() default {}; @AliasFor(annotation = RequestMapping.class) String[] params() default {};
/** /**
* Alias for {@link RequestMapping#headers}. * Alias for {@link RequestMapping#headers}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] headers() default {}; @AliasFor(annotation = RequestMapping.class) String[] headers() default {};
/** /**
* Alias for {@link RequestMapping#consumes}. * Alias for {@link RequestMapping#consumes}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};
/** /**
* Alias for {@link RequestMapping#produces}. * Alias for {@link RequestMapping#produces}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] produces() default {}; @AliasFor(annotation = RequestMapping.class) String[] produces() default {};
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,15 +13,17 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.*;
/** /**
* Annotation for mapping HTTP {@code GET} requests onto specific handler methods. * Annotation for mapping HTTP {@code GET} requests onto specific handler methods.
* <p> * <p>
@@ -36,40 +38,40 @@ import java.lang.annotation.*;
@RequestMapping(method = RequestMethod.GET) @RequestMapping(method = RequestMethod.GET)
public @interface AnonymousGetMapping { public @interface AnonymousGetMapping {
/** /**
* Alias for {@link RequestMapping#name}. * Alias for {@link RequestMapping#name}.
*/ */
@AliasFor(annotation = RequestMapping.class) String name() default ""; @AliasFor(annotation = RequestMapping.class) String name() default "";
/** /**
* Alias for {@link RequestMapping#value}. * Alias for {@link RequestMapping#value}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] value() default {}; @AliasFor(annotation = RequestMapping.class) String[] value() default {};
/** /**
* Alias for {@link RequestMapping#path}. * Alias for {@link RequestMapping#path}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] path() default {}; @AliasFor(annotation = RequestMapping.class) String[] path() default {};
/** /**
* Alias for {@link RequestMapping#params}. * Alias for {@link RequestMapping#params}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] params() default {}; @AliasFor(annotation = RequestMapping.class) String[] params() default {};
/** /**
* Alias for {@link RequestMapping#headers}. * Alias for {@link RequestMapping#headers}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] headers() default {}; @AliasFor(annotation = RequestMapping.class) String[] headers() default {};
/** /**
* Alias for {@link RequestMapping#consumes}. * Alias for {@link RequestMapping#consumes}.
* *
* @since 4.3.5 * @since 4.3.5
*/ */
@AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};
/** /**
* Alias for {@link RequestMapping#produces}. * Alias for {@link RequestMapping#produces}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] produces() default {}; @AliasFor(annotation = RequestMapping.class) String[] produces() default {};
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,15 +13,17 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.*;
/** /**
* Annotation for mapping HTTP {@code PATCH} requests onto specific handler methods. 支持匿名访问 PatchMapping * Annotation for mapping HTTP {@code PATCH} requests onto specific handler methods. 支持匿名访问 PatchMapping
* *
@@ -38,38 +40,38 @@ import java.lang.annotation.*;
@RequestMapping(method = RequestMethod.PATCH) @RequestMapping(method = RequestMethod.PATCH)
public @interface AnonymousPatchMapping { public @interface AnonymousPatchMapping {
/** /**
* Alias for {@link RequestMapping#name}. * Alias for {@link RequestMapping#name}.
*/ */
@AliasFor(annotation = RequestMapping.class) String name() default ""; @AliasFor(annotation = RequestMapping.class) String name() default "";
/** /**
* Alias for {@link RequestMapping#value}. * Alias for {@link RequestMapping#value}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] value() default {}; @AliasFor(annotation = RequestMapping.class) String[] value() default {};
/** /**
* Alias for {@link RequestMapping#path}. * Alias for {@link RequestMapping#path}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] path() default {}; @AliasFor(annotation = RequestMapping.class) String[] path() default {};
/** /**
* Alias for {@link RequestMapping#params}. * Alias for {@link RequestMapping#params}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] params() default {}; @AliasFor(annotation = RequestMapping.class) String[] params() default {};
/** /**
* Alias for {@link RequestMapping#headers}. * Alias for {@link RequestMapping#headers}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] headers() default {}; @AliasFor(annotation = RequestMapping.class) String[] headers() default {};
/** /**
* Alias for {@link RequestMapping#consumes}. * Alias for {@link RequestMapping#consumes}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};
/** /**
* Alias for {@link RequestMapping#produces}. * Alias for {@link RequestMapping#produces}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] produces() default {}; @AliasFor(annotation = RequestMapping.class) String[] produces() default {};
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,15 +13,17 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.*;
/** /**
* Annotation for mapping HTTP {@code POST} requests onto specific handler methods. 支持匿名访问 PostMapping * Annotation for mapping HTTP {@code POST} requests onto specific handler methods. 支持匿名访问 PostMapping
* *
@@ -38,38 +40,38 @@ import java.lang.annotation.*;
@RequestMapping(method = RequestMethod.POST) @RequestMapping(method = RequestMethod.POST)
public @interface AnonymousPostMapping { public @interface AnonymousPostMapping {
/** /**
* Alias for {@link RequestMapping#name}. * Alias for {@link RequestMapping#name}.
*/ */
@AliasFor(annotation = RequestMapping.class) String name() default ""; @AliasFor(annotation = RequestMapping.class) String name() default "";
/** /**
* Alias for {@link RequestMapping#value}. * Alias for {@link RequestMapping#value}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] value() default {}; @AliasFor(annotation = RequestMapping.class) String[] value() default {};
/** /**
* Alias for {@link RequestMapping#path}. * Alias for {@link RequestMapping#path}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] path() default {}; @AliasFor(annotation = RequestMapping.class) String[] path() default {};
/** /**
* Alias for {@link RequestMapping#params}. * Alias for {@link RequestMapping#params}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] params() default {}; @AliasFor(annotation = RequestMapping.class) String[] params() default {};
/** /**
* Alias for {@link RequestMapping#headers}. * Alias for {@link RequestMapping#headers}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] headers() default {}; @AliasFor(annotation = RequestMapping.class) String[] headers() default {};
/** /**
* Alias for {@link RequestMapping#consumes}. * Alias for {@link RequestMapping#consumes}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};
/** /**
* Alias for {@link RequestMapping#produces}. * Alias for {@link RequestMapping#produces}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] produces() default {}; @AliasFor(annotation = RequestMapping.class) String[] produces() default {};
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,15 +13,17 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.*;
/** /**
* Annotation for mapping HTTP {@code PUT} requests onto specific handler methods. 支持匿名访问 PutMapping * Annotation for mapping HTTP {@code PUT} requests onto specific handler methods. 支持匿名访问 PutMapping
* *
@@ -38,38 +40,38 @@ import java.lang.annotation.*;
@RequestMapping(method = RequestMethod.PUT) @RequestMapping(method = RequestMethod.PUT)
public @interface AnonymousPutMapping { public @interface AnonymousPutMapping {
/** /**
* Alias for {@link RequestMapping#name}. * Alias for {@link RequestMapping#name}.
*/ */
@AliasFor(annotation = RequestMapping.class) String name() default ""; @AliasFor(annotation = RequestMapping.class) String name() default "";
/** /**
* Alias for {@link RequestMapping#value}. * Alias for {@link RequestMapping#value}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] value() default {}; @AliasFor(annotation = RequestMapping.class) String[] value() default {};
/** /**
* Alias for {@link RequestMapping#path}. * Alias for {@link RequestMapping#path}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] path() default {}; @AliasFor(annotation = RequestMapping.class) String[] path() default {};
/** /**
* Alias for {@link RequestMapping#params}. * Alias for {@link RequestMapping#params}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] params() default {}; @AliasFor(annotation = RequestMapping.class) String[] params() default {};
/** /**
* Alias for {@link RequestMapping#headers}. * Alias for {@link RequestMapping#headers}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] headers() default {}; @AliasFor(annotation = RequestMapping.class) String[] headers() default {};
/** /**
* Alias for {@link RequestMapping#consumes}. * Alias for {@link RequestMapping#consumes}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};
/** /**
* Alias for {@link RequestMapping#produces}. * Alias for {@link RequestMapping#produces}.
*/ */
@AliasFor(annotation = RequestMapping.class) String[] produces() default {}; @AliasFor(annotation = RequestMapping.class) String[] produces() default {};
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@@ -27,17 +26,20 @@ import lombok.Setter;
* @date 2025-07-23 * @date 2025-07-23
*/ */
public class KitArgs { public class KitArgs {
@Getter
@Setter
public static class FindByLongId extends KitObject {
@NotNull(message = "id必填")
private Long id;
}
@Getter @Getter
@Setter @Setter
public static class DeleteById extends KitObject { public static class FindByLongId extends KitObject {
@NotNull(message = "id必填")
private Long id; @NotNull(message = "id必填")
} private Long id;
}
@Getter
@Setter
public static class DeleteById extends KitObject {
@NotNull(message = "id必填")
private Long id;
}
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,23 +13,22 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.Date;
@Getter @Getter
@Setter @Setter
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class KitBaseCreateTimeTb extends KitObject { public class KitBaseCreateTimeTb extends KitObject {
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private Date createTime; @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime;
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,27 +13,25 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.Date;
@Getter @Getter
@Setter @Setter
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class KitBaseTimeTb extends KitObject { public class KitBaseTimeTb extends KitObject {
@TableField(fill = FieldFill.INSERT)
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT)
@Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime; private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime;
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,23 +13,22 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.Date;
@Getter @Getter
@Setter @Setter
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class KitBaseUpdateTimeTb extends KitObject { public class KitBaseUpdateTimeTb extends KitObject {
@Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime;
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,55 +13,55 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field;
import java.util.Date;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedBy;
import java.lang.reflect.Field;
import java.util.Date;
@Getter @Getter
@Setter @Setter
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class KitBaseUserCreateTimeTb extends KitObject { public class KitBaseUserCreateTimeTb extends KitObject {
@CreatedBy @CreatedBy
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name = "创建人", hidden = true) @ApiModelProperty(value = "创建人", hidden = true)
private String createBy; private String
createBy;
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime;
@TableField(fill = FieldFill.INSERT) @Override
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) public String toString() {
private Date createTime; ToStringBuilder builder = new ToStringBuilder(this);
Field[] fields = this.getClass().getDeclaredFields();
@Override try {
public String toString() { for (Field f : fields) {
ToStringBuilder builder = new ToStringBuilder(this); f.setAccessible(true);
Field[] fields = this.getClass().getDeclaredFields(); builder.append(f.getName(), f.get(this)).append("\n");
try { }
for (Field f : fields) { } catch (Exception e) {
f.setAccessible(true); builder.append("toString builder encounter an error");
builder.append(f.getName(), f.get(this)).append("\n");
}
} catch (Exception e) {
builder.append("toString builder encounter an error");
}
return builder.toString();
} }
return builder.toString();
}
/* 分组校验 */ /* 分组校验 */
public @interface Create { public @interface Create {
}
/* 分组校验 */ }
public @interface Update {
} /* 分组校验 */
public @interface Update {
}
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,20 +13,18 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableLogic;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedBy;
import java.util.Date;
/** /**
* 逻辑删除通用模型 * 逻辑删除通用模型
* *
@@ -36,22 +34,24 @@ import java.util.Date;
@Getter @Getter
@Setter @Setter
public class KitBaseUserTimeLogicTb extends KitObject { public class KitBaseUserTimeLogicTb extends KitObject {
@CreatedBy
@TableField(value = "create_by", fill = FieldFill.INSERT) @CreatedBy
@Schema(name = "创建人", hidden = true) @TableField(value = "create_by", fill = FieldFill.INSERT)
private String createBy; @ApiModelProperty(value = "创建人", hidden = true)
@LastModifiedBy private String createBy;
@TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) @LastModifiedBy
@Schema(name = "更新人", hidden = true) @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
private String updateBy; @ApiModelProperty(value = "更新人", hidden = true)
@TableField(value = "create_time", fill = FieldFill.INSERT) private String updateBy;
@Schema(name = "创建时间", hidden = true) @TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime; @ApiModelProperty(value = "创建时间", hidden = true)
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private Date createTime;
@Schema(name = "更新时间", hidden = true) @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime; @ApiModelProperty(value = "更新时间", hidden = true)
@Schema(name = "数据有效性", hidden = true) private Date updateTime;
@TableLogic @ApiModelProperty(value = "数据有效性", hidden = true)
@TableField("available") @TableLogic
private Integer available; @TableField("available")
private Integer
available;
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,12 +13,13 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field;
import java.util.Date;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -26,52 +27,49 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedBy;
import java.lang.reflect.Field;
import java.util.Date;
@Getter @Getter
@Setter @Setter
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class KitBaseUserTimeTb extends KitObject { public class KitBaseUserTimeTb extends KitObject {
@CreatedBy @CreatedBy
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name = "创建人", hidden = true) @ApiModelProperty(value = "创建人", hidden = true)
private String createBy; private String
createBy;
@LastModifiedBy
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新人", hidden = true)
private String updateBy;
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime;
@LastModifiedBy @Override
@TableField(fill = FieldFill.INSERT_UPDATE) public String toString() {
@Schema(name = "更新人", hidden = true) ToStringBuilder builder = new ToStringBuilder(this);
private String updateBy; Field[] fields = this.getClass().getDeclaredFields();
try {
@TableField(fill = FieldFill.INSERT) for (Field f : fields) {
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) f.setAccessible(true);
private Date createTime; builder.append(f.getName(), f.get(this)).append("\n");
}
@TableField(fill = FieldFill.INSERT_UPDATE) } catch (Exception e) {
@Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) builder.append("toString builder encounter an error");
private Date updateTime;
@Override
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this);
Field[] fields = this.getClass().getDeclaredFields();
try {
for (Field f : fields) {
f.setAccessible(true);
builder.append(f.getName(), f.get(this)).append("\n");
}
} catch (Exception e) {
builder.append("toString builder encounter an error");
}
return builder.toString();
} }
return builder.toString();
}
/* 分组校验 */ /* 分组校验 */
public @interface Create { public @interface Create {
}
/* 分组校验 */ }
public @interface Update {
} /* 分组校验 */
public @interface Update {
}
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,10 +13,8 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
/** /**
@@ -26,6 +24,6 @@ import java.io.Serializable;
* @date 2022-01-12 * @date 2022-01-12
*/ */
public class KitObject implements Serializable { public class KitObject implements Serializable {
@Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,18 +13,16 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serializable;
/** /**
* 数据分页参数 * 数据分页参数
* *
@@ -35,13 +33,14 @@ import java.io.Serializable;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class KitPageArgs<T> implements Serializable { public class KitPageArgs<T> implements Serializable {
@NotNull(message = "参数page不能为空")
@Min(value = 1, message = "参数page最小值为1") @NotNull(message = "参数page不能为空")
@Schema(name = "页码", example = "1") @Min(value = 1, message = "参数page最小值为1")
private Integer page; @ApiModelProperty(value = "页码", example = "1")
@NotNull(message = "参数size不能为空") private Integer page;
@Min(value = 1, message = "参数size最小值为1") @NotNull(message = "参数size不能为空")
@Schema(name = "每页数据量", example = "10") @Min(value = 1, message = "参数size最小值为1")
private Integer size; @ApiModelProperty(value = "每页数据量", example = "10")
private T args; private Integer size;
private T args;
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,18 +13,16 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.ArrayList;
import java.util.List;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
/** /**
* 结果封装类 * 结果封装类
*/ */
@@ -33,20 +31,21 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class KitPageResult<T> extends KitObject { public class KitPageResult<T> extends KitObject {
private List<T> content;
private long totalElements;
public static <T> KitPageResult<T> emptyListData() { private List<T> content;
KitPageResult<T> result = new KitPageResult<>(); private long totalElements;
result.setTotalElements(0);
result.setContent(new ArrayList<>());
return result;
}
public static <T> KitPageResult<T> listData(IPage<T> page) { public static <T> KitPageResult<T> emptyListData() {
KitPageResult<T> result = new KitPageResult<>(); KitPageResult<T> result = new KitPageResult<>();
result.setTotalElements(page.getTotal()); result.setTotalElements(0);
result.setContent(page.getRecords()); result.setContent(new ArrayList<>());
return result; return result;
} }
public static <T> KitPageResult<T> listData(IPage<T> page) {
KitPageResult<T> result = new KitPageResult<>();
result.setTotalElements(page.getTotal());
result.setContent(page.getRecords());
return result;
}
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,12 +13,14 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import lombok.*;
import java.util.Map; import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/** /**
* 元数据选项 * 元数据选项
@@ -32,7 +34,8 @@ import java.util.Map;
@NoArgsConstructor @NoArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class KitSelectOptionVo extends KitObject { public class KitSelectOptionVo extends KitObject {
private String label;
private String value; private String label;
private Map<String, Object> ext; private String value;
private Map<String, Object> ext;
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,31 +13,30 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.constant; package cn.odboy.constant;
/** /**
* 验证码配置枚举 * 验证码配置枚举
*/ */
public enum CaptchaCodeEnum { public enum CaptchaCodeEnum {
/** /**
* 算数 * 算数
*/ */
ARITHMETIC, ARITHMETIC,
/** /**
* 中文 * 中文
*/ */
CHINESE, CHINESE,
/** /**
* 中文闪图 * 中文闪图
*/ */
CHINESE_GIF, CHINESE_GIF,
/** /**
* 闪图 * 闪图
*/ */
GIF, GIF,
/** /**
* 静态 * 静态
*/ */
SPEC SPEC
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.constant; package cn.odboy.constant;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@@ -22,9 +21,8 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum FileTypeEnum { public enum FileTypeEnum {
/* 文件类型 */ /* 文件类型 */
IMAGE("image", "图片"), DOC("doc", "文档"), VOICE("voice", "音频"), VIDEO("video", "视频"), OTHER("other", "其他"); IMAGE("image", "图片"), DOC("doc", "文档"), VOICE("voice", "音频"), VIDEO("video", "视频"), OTHER("other", "其他");
private final String code;
private final String code; private final String description;
private final String description;
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.constant; package cn.odboy.constant;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@@ -22,48 +21,41 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum RequestMethodEnum { public enum RequestMethodEnum {
/**
* 搜寻 @AnonymousGetMapping
*/
GET("GET"),
/**
* 搜寻 @AnonymousPostMapping
*/
POST("POST"),
/**
* 搜寻 @AnonymousPutMapping
*/
PUT("PUT"),
/**
* 搜寻 @AnonymousPatchMapping
*/
PATCH("PATCH"),
/**
* 搜寻 @AnonymousDeleteMapping
*/
DELETE("DELETE"),
/**
* 否则就是所有 Request 接口都放行
*/
ALL("All");
/**
* Request 类型
*/
private final String type;
/** public static RequestMethodEnum find(String type) {
* 搜寻 @AnonymousGetMapping for (RequestMethodEnum value : RequestMethodEnum.values()) {
*/ if (value.getType().equals(type)) {
GET("GET"), return value;
}
/**
* 搜寻 @AnonymousPostMapping
*/
POST("POST"),
/**
* 搜寻 @AnonymousPutMapping
*/
PUT("PUT"),
/**
* 搜寻 @AnonymousPatchMapping
*/
PATCH("PATCH"),
/**
* 搜寻 @AnonymousDeleteMapping
*/
DELETE("DELETE"),
/**
* 否则就是所有 Request 接口都放行
*/
ALL("All");
/**
* Request 类型
*/
private final String type;
public static RequestMethodEnum find(String type) {
for (RequestMethodEnum value : RequestMethodEnum.values()) {
if (value.getType().equals(type)) {
return value;
}
}
return ALL;
} }
return ALL;
}
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -13,41 +13,39 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.constant; package cn.odboy.constant;
/** /**
* 常用静态常量 * 常用静态常量
*/ */
public interface SystemConst { public interface SystemConst {
/**
* win 系统
*/
String WIN = "win";
/** /**
* mac 系统 * win 系统
*/ */
String MAC = "mac"; String WIN = "win";
/**
/** * mac 系统
* 请求头名称 */
*/ String MAC = "mac";
String HEADER_NAME = "Authorization"; /**
* 请求头名称
/** */
* Token前缀 String HEADER_NAME = "Authorization";
*/ /**
String TOKEN_PREFIX = "Bearer"; * Token前缀
*/
/** String TOKEN_PREFIX = "Bearer";
* 小数点 /**
*/ * 小数点
String SYMBOL_DOT = "."; */
String SYMBOL_EQUAL = "="; String SYMBOL_DOT = ".";
String SYMBOL_ADD = "+"; String SYMBOL_EQUAL = "=";
String SYMBOL_SUBTRACT = "-"; String SYMBOL_ADD = "+";
String SYMBOL_AT = "@"; String SYMBOL_SUBTRACT = "-";
String PROPERTY_OS_NAME = "os.name"; String SYMBOL_AT = "@";
String OS_NAME_WINDOWS = "Windows"; String PROPERTY_OS_NAME = "os.name";
String OS_NAME_WINDOWS = "Windows";
String CURRENT_APP_NAME = "cutejava";
String CURRENT_APP_TITLE = "CuteJava";
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -30,8 +30,9 @@ import org.springframework.stereotype.Component;
@Slf4j @Slf4j
@Component @Component
public class BeanLoadFinishListener implements ApplicationListener<ContextRefreshedEvent> { public class BeanLoadFinishListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) { @Override
log.info("所有的Bean都加载完毕了"); public void onApplicationEvent(ContextRefreshedEvent event) {
} log.info("所有的Bean都加载完毕了");
}
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2021-2025 Odboy * Copyright 2021-2026 Odboy
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -17,14 +17,13 @@
package cn.odboy.framework.context; package cn.odboy.framework.context;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import java.net.InetAddress;
import java.net.UnknownHostException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import java.net.InetAddress;
import java.net.UnknownHostException;
/** /**
* 主要目的是输出应用的服务地址 * 主要目的是输出应用的服务地址
* *
@@ -33,22 +32,24 @@ import java.net.UnknownHostException;
*/ */
@Slf4j @Slf4j
public class BootApplication { public class BootApplication {
protected static void inited(ConfigurableApplicationContext application) throws UnknownHostException {
Environment env = application.getEnvironment();
String ip = InetAddress.getLocalHost().getHostAddress();
String port = env.getProperty("server.port");
String path = StrUtil.isEmpty(env.getProperty("config.servlet.context-path")) ? "" : env.getProperty("config.servlet.context-path");
log.info("""
----------------------------------------------------------
\tApplication is running! Access URLs:
\tLocal: \t\thttp://localhost:{}{}
\tExternal: \thttp://{}:{}{}
\tSwagger文档: \thttp://{}:{}{}/doc.html
----------------------------------------------------------""", port, path, ip, port, path, ip, port, path);
}
@Bean protected static void inited(ConfigurableApplicationContext application) throws UnknownHostException {
public KitSpringBeanHolder springBeanHolder() { Environment env = application.getEnvironment();
return new KitSpringBeanHolder(); String ip = InetAddress.getLocalHost().getHostAddress();
} String port = env.getProperty("server.port");
String path = StrUtil.isEmpty(env.getProperty("config.servlet.context-path")) ? ""
: env.getProperty("config.servlet.context-path");
log.info("""
----------------------------------------------------------
\tApplication is running! Access URLs:
\tLocal: \t\thttp://localhost:{}{}
\tExternal: \thttp://{}:{}{}
\tSwagger文档: \thttp://{}:{}{}/doc.html
----------------------------------------------------------""", port, path, ip, port, path, ip, port, path);
}
@Bean
public KitSpringBeanHolder springBeanHolder() {
return new KitSpringBeanHolder();
}
} }

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