Compare commits

...

846 Commits

Author SHA1 Message Date
疯狂的狮子Li
259325b4ee update 删除无用依赖 2026-09-10 11:57:39 +08:00
疯狂的狮子Li
dd98d6ceac update 升级 依赖版本并替换废弃依赖 crypto-js
- 替换已废弃的 crypto-js 为 @noble/ciphers@2.4.0(零依赖、经过安全审计),
    重写 src/utils/crypto.ts,密文格式保持 AES-256-ECB/PKCS7Padding + Base64,
    与后端 Hutool AES 完全兼容,后端零改动(已通过 openssl 比对验证)
  - 升级 @wangeditor-next/editor 5.7.16 -> 6.4.1、
    @wangeditor-next/editor-for-vue 5.1.14 -> 6.4.1(版本严格对齐,
    v6 唯一不兼容点为视频对齐 HTML 结构,导入时自动迁移)
  - 升级 vue 3.5.40 -> 3.5.42、element-plus 2.14.3 -> 2.14.5、
    vxe-table 4.20.8 -> 4.21.9、vxe-pc-ui 4.16.22 -> 4.18.9、
    axios 1.18.1 -> 1.20.0、pinia 4.0.2 -> 4.0.3、vue-router 5.2.0 -> 5.3.1、
    @vueuse/core 14.3.0 -> 14.4.0、highlight.js 11.11.1 -> 11.12.0、
    vue-i18n 11.4.8 -> 11.4.10 及 unocss、sass、oxlint 等开发依赖
2026-09-10 11:57:00 +08:00
疯狂的狮子Li
a85fa0aee4 fix 修复 文件包名错误 2026-09-01 16:36:40 +08:00
疯狂的狮子Li
0870ce1751 update 优化 按钮与筛选框 接入圆角设置统一调整 2026-08-11 10:28:59 +08:00
疯狂的狮子Li
461dd3218f fix 修复 开启全高表格后 表格数据少时 表格右侧的边框异常 https://gitee.com/dromara/RuoYi-Vue-Plus/issues/IK7IFQ 2026-08-10 10:11:40 +08:00
疯狂的狮子Li
914e4dcdb9 update README.md 2026-08-07 13:08:32 +08:00
疯狂的狮子Li
aa3f114bf4 🦁🦁🦁发布 6.0.0 正式版 大版本发布!!! 2026-07-30 11:02:04 +08:00
疯狂的狮子Li
ec44ed1ddc update 包管理 降级到pnpm 10版本 兼容低版本nodejs 2026-07-29 09:26:08 +08:00
疯狂的狮子Li
38dfbc20dc update 升级依赖 2026-07-27 17:24:29 +08:00
疯狂的狮子Li
c3477b3a5a update 升级 全部依赖版本与适配性代码修改 2026-07-16 18:39:42 +08:00
疯狂的狮子Li
21fc08193e fix 修复 导出文件命名错误 2026-07-15 15:50:48 +08:00
疯狂的狮子Li
5f837700e9 update 优化 适配多前端 skill 内容 2026-07-06 16:15:42 +08:00
疯狂的狮子Li
728fdbfe0e fix 修复 用户上传头像后无法编辑问题 头像url改为独立字段避免影响 2026-07-03 17:00:39 +08:00
疯狂的狮子Li
27851836dc update 优化 关闭固定header的时候 出现滑动块问题 2026-06-30 11:49:06 +08:00
疯狂的狮子Li
58e32c468f update 补充漏提交文件 2026-06-30 11:41:04 +08:00
疯狂的狮子Li
87bc5bea09 add 新增 页面表单全高表格内部数据滚动功能 2026-06-30 11:35:20 +08:00
疯狂的狮子Li
8a3ff74833 fix 修复 icon #号默认值与空值不在一列展示 2026-06-29 17:48:27 +08:00
疯狂的狮子Li
33fb49d683 update 依赖整体升级 2026-06-29 13:37:05 +08:00
疯狂的狮子Li
71e00e560c
!277 fix importTable有多个根节点
Merge pull request !277 from Nottyjay/fix-importtable
2026-06-29 05:03:52 +00:00
Nottyjay
4bdffaf4b7 fix importTable有多个根节点 2026-06-29 12:44:41 +08:00
疯狂的狮子Li
4f5f4a7846 fix 修复 打包没有打包ie.html问题与一些警告处理 2026-06-26 13:19:37 +08:00
疯狂的狮子Li
bcd4a55656 update 优化 组件装配顺序 2026-06-25 17:32:49 +08:00
疯狂的狮子Li
b7d8b4e426 fix 修复 push 模块 sse/ws 浏览器多标签页互挤掉线问题 2026-06-25 17:24:02 +08:00
疯狂的狮子Li
5f8d919f03
!275 fix 树状菜单渲染从tree调整为tree-v2,提升大数据结构下渲染速度
Merge pull request !275 from Nottyjay/d3code-feat-treepanel
2026-06-25 08:19:23 +00:00
Nottyjay
97726edc60 fix 树状菜单渲染从tree调整为tree-v2,提升大数据结构下渲染速度 2026-06-25 15:50:03 +08:00
疯狂的狮子Li
5e2f228e64 update 增加 Transition 标签下 节点错误检测功能 2026-06-25 10:16:17 +08:00
疯狂的狮子Li
d54c058085 update 优化 处理一些代码生成模板的一些写法问题 2026-06-24 17:33:05 +08:00
疯狂的狮子Li
60ba3158d5 fix 修复 代码生成模板后缀漏改问题 2026-06-23 14:58:30 +08:00
疯狂的狮子Li
be1f2ac382 update 优化 删除无用导入 2026-06-22 11:33:22 +08:00
疯狂的狮子Li
eb410bb792 🦁🦁🦁发布 6.0.0-BETA 公测版本 大版本发布!!! 2026-06-22 10:41:25 +08:00
疯狂的狮子Li
8716e1285d refactor gen templates to freemarker 2026-06-18 15:32:30 +08:00
疯狂的狮子Li
6030831f55 add 增加 snail-ai-server 控制台访问菜单
update 优化将自行实现的ai聊天室页面改为内嵌 snail-ai 自带的聊天室页面
2026-06-17 09:16:39 +08:00
lau
d3027b6927 update 有无二级菜单的一级菜单设置相同高度 2026-06-11 20:28:15 +08:00
lau
612b54fabf update 修改参数设置页面布局 2026-06-11 17:43:39 +08:00
疯狂的狮子Li
3b876bdbc1 fix 修复 登录页后端403会出现多个弹窗问题 2026-06-11 13:12:54 +08:00
lau
382c37e896 add 新增 附件上传附件支持保存扩展信息 2026-06-10 17:12:11 +08:00
疯狂的狮子Li
84cbada026 fix 修复 默认密码被覆盖问题 2026-06-09 10:50:27 +08:00
疯狂的狮子Li
979bad0275 update: 升级前端核心依赖并完成适配
- 升级 Vue、Vue Router、Element Plus、Vite、UnoCSS、Sass、vue-tsc、oxlint 等前端核心依赖
- 适配依赖升级后的类型检查、键盘事件和 Sass 命名空间写法
- 登录记住功能仅保存用户名和 rememberMe,不再保存密码
- 移除模板中的 scope.row 类型断言,改由处理函数使用 Partial<VO> 承接
2026-06-08 18:40:57 +08:00
lau
46fbc9db0b fix 修复 SvgLcon组件iconClass异常为空时白屏 2026-06-08 18:08:42 +08:00
疯狂的狮子Li
3dcddd0f2c update 优化 登录页记住我仅保存用户名和 rememberMe 并清理历史明文密码缓存 2026-06-08 17:58:20 +08:00
疯狂的狮子Li
d74c18e58e fix: 优化前端生命周期清理与本地文件忽略
- 修复流程提交组件 props 默认值返回 undefined 的问题
- 清理调试日志和空生命周期钩子
- 修复 TagsView 滚动监听移除参数不一致
- 补充消息推送 SSE watcher 清理
- 补充缓存监控页 ECharts 实例和 resize 监听清理
- 忽略 IDE 模块文件并纳入 pnpm lockfile
2026-06-08 17:52:31 +08:00
疯狂的狮子Li
62694b1554 update 重构 头像上传改为先上传oss后更新用户数据 2026-06-05 16:41:12 +08:00
疯狂的狮子Li
18b3e6af87 fix 修复 字典管理筛选框收起 图标无变化问题 2026-06-05 15:59:39 +08:00
疯狂的狮子Li
fb889c02db update 优化 代码生成 增加多前端模板选择 2026-06-03 15:58:34 +08:00
疯狂的狮子Li
ee613d59c4 update 增加 代码生成模板 优化 skill 内容 2026-06-03 14:13:53 +08:00
疯狂的狮子Li
441fb733d8 update 增加 代码生成模板 优化 skill 内容 2026-06-03 14:08:57 +08:00
疯狂的狮子Li
6b039422b3 update 优化 skill 内容 2026-06-03 11:39:45 +08:00
疯狂的狮子Li
c004cbc86c
!267 fix 修复选择图标时tooltip显示后滚动出现错位现象
Merge pull request !267 from YueYe/future/6.X
2026-06-02 01:04:04 +00:00
YueYe
77241676a4 fix 修复选择图标时tooltip显示后滚动出现错位现象 2026-06-02 04:52:57 +08:00
疯狂的狮子Li
f242ce050d update 优化 README.md 2026-06-01 15:45:45 +08:00
疯狂的狮子Li
97206612b7 update 优化 README.md 2026-06-01 13:05:14 +08:00
疯狂的狮子Li
ae2935a081 update 优化 删除并不存在的接口 2026-05-29 19:26:34 +08:00
疯狂的狮子Li
fcd1d6ae75 update 优化 黑暗模式下筛选框两个按钮的样式 2026-05-28 16:45:23 +08:00
疯狂的狮子Li
779b42c653 update 优化 !pr850 相关代码用法与问题 2026-05-26 13:54:35 +08:00
疯狂的狮子Li
f2c09f33c9 update 优化 !pr850 相关代码用法与问题 2026-05-26 11:13:05 +08:00
CT
5f0e2484b0 !264 增加snail-ai集成
* 恢复误修改提交的代码
* 恢复被ai修改误提交代码
* snail-ai测试版本提交
* chore: sync non-ai frontend files to latest
* add 增加流程实例权限
* update 修改vben5前端仓库地址
* add 补充流程定义权限
2026-05-26 02:02:58 +00:00
疯狂的狮子Li
b5b248f547 update 优化 路由接口返回ext扩展数据 2026-05-22 17:38:19 +08:00
疯狂的狮子Li
2d41047330 fix 修复 雪花id代码内使用精度丢失问题 2026-05-22 16:05:04 +08:00
疯狂的狮子Li
04ed7bf7a7 update 优化 升级框架依赖 2026-05-20 14:29:08 +08:00
疯狂的狮子Li
a9b2d7745d fix 修复 文件上传遮罩层没关闭loading问题 2026-05-15 13:31:39 +08:00
疯狂的狮子Li
5ebb9060ea fix 修复 warmflow设计器超出页面宽高问题 2026-05-13 14:10:04 +08:00
疯狂的狮子Li
bfd6903d25 fix 修复 样式问题 2026-05-13 13:51:19 +08:00
疯狂的狮子Li
4311a09056 fix 修复 样式问题 2026-05-13 13:44:12 +08:00
AprilWind
44c1c6a91c update 优化审批者字段名称 2026-05-13 13:29:41 +08:00
疯狂的狮子Li
145112dffa update 优化 加密升级到1024密钥 增加密钥长度校验(不支持1024以下不安全) 2026-05-07 11:31:53 +08:00
疯狂的狮子Li
de67f38988 fix 修复 前端输入性CVE漏洞 禁止使用代码生成到本地路径 2026-05-06 15:24:56 +08:00
疯狂的狮子Li
97e984afa5 update 依赖升级 2026-04-24 20:10:38 +08:00
疯狂的狮子Li
6c1dae5b6a update 重构 增强代码生成器各项功能
update 自动类型判断可根据不同数据库精确识别 对应的java类型
update 优化java字段名与数据库名不匹配则增加别名注解
update 增加 是否导出 是否状态切换 是否组合唯一校验 是否排序调整 和树结构相关字段等功能选择
update 优化自定义路径导出 导出全部代码
update 删除无用主子表相关代码
2026-04-17 18:24:05 +08:00
疯狂的狮子Li
87fad7bc16 fix 修复用户管理 部门树 不显示禁用部门问题 2026-04-17 16:08:05 +08:00
疯狂的狮子Li
c7bcf52f03 update 优化 重构抽出一些常用hooks组件简化页面编码 2026-04-17 15:46:41 +08:00
疯狂的狮子Li
6a3394bdc5 update 优化 重构抽出一些常用hooks组件简化页面编码 2026-04-17 15:09:17 +08:00
疯狂的狮子Li
2ce3786ee0 update 树组件支持禁用状态展示 2026-04-17 12:17:43 +08:00
疯狂的狮子Li
2d13215304 update 优化 菜单勾选栏改为左菜单右按钮结构 增加禁用与隐藏图标 2026-04-17 12:08:51 +08:00
lau
f269c003da update 角色菜单权限展示优化 2026-04-16 21:19:13 +08:00
疯狂的狮子Li
7aaa40b46c update 优化 页面上写死的常量使用字典 2026-04-16 16:10:30 +08:00
疯狂的狮子Li
ffcb15ba96 update 优化 白名单支持对通配符路径匹配 2026-04-16 16:10:16 +08:00
疯狂的狮子Li
0a5c72988a update 优化 工作流页面 封装办理人展示组件 支持展示三行 超过三行隐藏 鼠标悬停展示 2026-04-16 14:28:14 +08:00
疯狂的狮子Li
8a900fa94d update 优化 客户端管理 隐藏列表主键id 2026-04-16 14:16:34 +08:00
疯狂的狮子Li
f10e6dbc71 update 优化 客户端管理 增加白名单路径和白名单IP功能 可限制客户端能访问的具体路径与可访问的具体IP地址 2026-04-16 14:14:28 +08:00
疯狂的狮子Li
090e395dcf update 优化 权限选择框布局 2026-04-16 09:38:53 +08:00
lau
eab7f49553 update 角色基础信息修改接口地址改回原样 2026-04-15 20:43:26 +08:00
lau
cedf975ed3 update 角色管理菜单权限-数据权限放到一起 2026-04-15 20:38:20 +08:00
疯狂的狮子Li
d38329befb update 替换掉过时写法 2026-04-10 13:56:08 +08:00
疯狂的狮子Li
9acf52e8a7 update 重构 彻底删除proxy用法 改为vue3官方推荐写法 2026-04-10 13:56:08 +08:00
lau
eb62402423 update 默认圆角改为14 2026-04-10 13:07:29 +08:00
疯狂的狮子Li
8c730950a9 fix 修复 标题头与整体抽屉样式冲突问题 2026-04-09 16:41:51 +08:00
疯狂的狮子Li
1133665122 fix 修复 客户端管理 授权类型 标签歪斜问题 2026-04-09 15:23:55 +08:00
疯狂的狮子Li
4f713d66db update 优化 封装TreePanel树组件 简化页面代码 2026-04-09 13:58:30 +08:00
疯狂的狮子Li
02b5ca7c48 add 增加 用户管理 用户详情展示抽屉 2026-04-09 13:18:07 +08:00
疯狂的狮子Li
4f8bcbd525 update 富文本编辑器支持图片视频oss上传 支持私有库图片访问 增加ossContent oss富文本解析工具 2026-04-09 11:44:47 +08:00
疯狂的狮子Li
fb5b1ed1bd update 优化 loadView 预建 Map 查找表,路由组件解析从 O(n) 降为 O(1)
update 优化 generateRoutes 三次 JSON 序列化改为 structuredClone
fix 修复 layout watchEffect 改为 watch(width) 消除循环依赖
fix 修复 useDict 返回 reactive 对象保持响应式,增加并发请求去重
fix 修复 FileUpload/ImageUpload headers 改为 computed 避免 token 过期
update 优化 debounce 箭头函数改为 function 声明修复 this 绑定丢失
fix 修复 duplicateRouteChecker 修复 route.name 为空时的空指针崩溃
fix 修复 AppMain 动画随机选择 Math.round 改为 Math.floor 防止越界
fix 修复 TagsView 关闭页签时始终清除缓存,修复动态路由内存泄漏
2026-04-09 11:24:02 +08:00
疯狂的狮子Li
a2d9a6d5f2 update 统一框架所有主键id均使用雪花id 2026-04-08 14:55:15 +08:00
疯狂的狮子Li
90926ddc7c update vite 版本更新 2026-04-08 13:06:59 +08:00
疯狂的狮子Li
b64357a595 update 优化 操作日志 补齐一些必要的记录数据 2026-04-08 12:40:11 +08:00
疯狂的狮子Li
81552f0cb9 update 优化 菜单管理 增加激活菜单与扩展属性字段 2026-04-08 11:49:53 +08:00
lau
029eb6636c add 增加系统圆角配置,并将部分圆角样式改为使用变量 2026-04-01 23:42:48 +08:00
疯狂的狮子Li
38c67fba25 update 重构暗黑模式样式 将所有写死的颜色统一整理 2026-04-01 19:18:07 +08:00
疯狂的狮子Li
3f30bac6f3 fix 修复 误删样式 2026-04-01 18:00:34 +08:00
疯狂的狮子Li
0b65932eee fix 修复 表单滚动背景透明 数据重叠问题 2026-04-01 17:51:20 +08:00
疯狂的狮子Li
16d9e1e7fe update prettier 替换为 oxfmt 格式化整个项目的代码结构 2026-04-01 17:03:20 +08:00
疯狂的狮子Li
199771997d update npm 升级到 pnpm 更符合现在技术栈 2026-04-01 16:33:55 +08:00
疯狂的狮子Li
6c395bb65b update 升级 vite8
update 升级 ts6
update eslint 替换为 Oxlint
2026-04-01 16:15:03 +08:00
疯狂的狮子Li
57f18eece5 update 优化 支持表格列显隐状态记忆 2026-04-01 13:12:24 +08:00
疯狂的狮子Li
cac35ecf4c update 优化 代码小问题 2026-04-01 13:05:03 +08:00
疯狂的狮子Li
f38e5e7c4d update 优化 缩短代码生成模块 包名与模块名 2026-03-30 20:02:44 +08:00
疯狂的狮子Li
125da80953 add 增加 ai编程支持 支持codex与claude的skill 2026-03-30 17:31:32 +08:00
疯狂的狮子Li
7f99bbf889 update 修改接口路径与cloud版本保持一致 2026-03-27 18:26:37 +08:00
疯狂的狮子Li
87c09d0917 update 优化 富文本内容展示增加xss拦截过滤 2026-03-27 17:02:17 +08:00
疯狂的狮子Li
87b56a3823 update 优化 后端导入返回信息使用\n分割 避免前端出现xss问题 2026-03-27 16:43:31 +08:00
疯狂的狮子Li
680c00bd06 fix 修复 下载文件后端异常报错 被辞掉问题 2026-03-27 16:13:20 +08:00
疯狂的狮子Li
ebc7760de2 update 完成消息盒子功能前后端联动(已读未读在前端浏览器存储) 2026-03-27 14:37:21 +08:00
lau
5907e4778b fix 修复 头像选择器样式异常 2026-03-26 21:55:11 +08:00
疯狂的狮子Li
b9e5220069 update 优化 通知公告页面增加查看详情功能 支持预览已经编辑好的富文本内容
update 优化 消息盒子相关消息可直接跳转到详情页展示富文本内容
2026-03-26 18:06:00 +08:00
疯狂的狮子Li
1daa291bb6 update 消息盒子支持按类型分组切换展示 2026-03-26 17:34:51 +08:00
疯狂的狮子Li
5be8fcf571 update 重构 common-sse 与 common-websocket 合并为 ruoyi-common-push 推送模块 2026-03-26 17:25:36 +08:00
疯狂的狮子Li
42f63fbe24 update 消息推送增加 消息类型 消息来源 前端跳转路径等扩展参数 2026-03-26 15:34:02 +08:00
疯狂的狮子Li
05527965e2 update 优化 优化快速点击页签刷新出现404问题
update 优化 优化页签全屏显示展示形式
2026-03-26 11:06:50 +08:00
疯狂的狮子Li
8469c254af update 优化 左侧树结构增加可折叠按钮
update 优化 左侧树结构数据过多支持上下滑动
2026-03-26 10:09:46 +08:00
lau
2502de3081 update 优化 前端样式初步调整并删除无用样式 2026-03-25 22:33:41 +08:00
lau
fed0ac99e8 update 优化 表格内边框圆角适配 2026-03-25 13:13:34 +08:00
疯狂的狮子Li
9f577be6ff update 重构 将scss文件拆解 按具体功能细分文件 便于后续维护 2026-03-25 12:06:46 +08:00
lau
1fb116f059 update 优化 tags-view左右滚动按钮根据需要是否可滚动显示 2026-03-25 11:45:33 +08:00
疯狂的狮子Li
448f5f303e fix 修复 表单输入框边框丢失问题 2026-03-25 10:46:14 +08:00
疯狂的狮子Li
da5f369bb4 fix 修复 插件冲突导致样式一直重复加载问题 2026-03-25 10:36:18 +08:00
疯狂的狮子Li
13a41679bc update 优化 避免重复包装 2026-03-25 10:32:45 +08:00
疯狂的狮子Li
1442d539e8 fix 修复 oss配置页 状态未从01改为YN导致的问题 2026-03-25 10:25:51 +08:00
疯狂的狮子Li
a86557cc2a update 优化 页签区增加左右滚动、右侧下拉、单独“刷新”按钮
add 新增 TagsView 全屏功能
add 新增 设置面板增加了“持久化标签页”开关 支持标签页持久化
2026-03-24 17:58:07 +08:00
疯狂的狮子Li
4fb60440f2 update 优化 重新实现菜单搜索功能 2026-03-24 17:28:01 +08:00
疯狂的狮子Li
6ed02a2ddd update 优化 菜单管理列表新增类型显示 2026-03-24 17:20:06 +08:00
疯狂的狮子Li
3194ea4fe7 update 替代有问题的插件 2026-03-19 15:55:26 +08:00
疯狂的狮子Li
8286b5906e add 增加工作流权限标识符 2026-03-19 15:32:50 +08:00
gssong
c69a6a2a45 fix 修复两边布局没有和tab顶部对齐 2026-03-18 17:43:18 +08:00
疯狂的狮子Li
f2de9af401 fix 修复 新增流程定义样式错误 2026-03-18 17:17:25 +08:00
疯狂的狮子Li
790abfac85 update 用户管理 增加用户登录状态解锁功能 2026-03-18 13:45:37 +08:00
疯狂的狮子Li
e138c314a8 update 重构 修改框架内不正常命名与规范是和否的状态 2026-03-18 10:39:22 +08:00
疯狂的狮子Li
b9ca2d3c67 fix 修复 多级树下拉框样式问题 2026-03-17 21:25:24 +08:00
疯狂的狮子Li
c415e130b9 fix 修复 新增客户端 状态没有默认值问题 2026-03-17 21:08:28 +08:00
疯狂的狮子Li
decbd4ac34 update 优化 删除quill使用wangeditor-next替代 2026-03-17 21:01:55 +08:00
疯狂的狮子Li
b8b0db2367
!261 [mod]适配分页返回数据放入data中返回
Merge pull request !261 from YueYe/future/new
2026-03-17 11:16:09 +00:00
Carrierli
82d28a3188 [mod]适配分页返回数据放入data中返回 2026-03-17 16:18:12 +08:00
疯狂的狮子Li
8eac8987b1 update 优化 修改logo名称 2026-03-17 15:00:33 +08:00
疯狂的狮子Li
d97c93cc98 update 优化 首页内容 2026-03-17 13:05:37 +08:00
疯狂的狮子Li
766d9b2142 update 关闭 用户注册页面按钮 2026-03-17 12:53:56 +08:00
疯狂的狮子Li
833dfa67fc [重大更新] 整体主题样式重写 改为卡片式布局 样式更企业化 2026-03-17 12:35:56 +08:00
疯狂的狮子Li
b83755e626 update 优化 代码写法 删除无用依赖 2026-03-16 19:20:22 +08:00
疯狂的狮子Li
e3227f5cc5 update 删除多租户功能 2026-03-13 16:11:00 +08:00
疯狂的狮子Li
0dc58fa3c6 update 优化 将logininfor规范化为loginInfo 2026-03-13 15:06:22 +08:00
疯狂的狮子Li
767b00c257 Revert "update 优化 将logininfor规范化为loginInfo"
This reverts commit c9f9fbed49.
2026-03-13 15:05:10 +08:00
疯狂的狮子Li
c9f9fbed49 update 优化 将logininfor规范化为loginInfo 2026-03-13 14:58:55 +08:00
疯狂的狮子Li
41c8e06c54 update 升级 package.json 全部依赖 2026-03-11 15:07:47 +08:00
疯狂的狮子Li
33a397032c update 将富文本编辑器改为base64存储图片 图片访问权限随文章访问权限走 不走oss存储了 2026-03-11 14:20:55 +08:00
疯狂的狮子Li
5b55687a76 update 删除debug保护工具性能问题严重 容易导致浏览器卡死 2026-03-11 13:44:02 +08:00
疯狂的狮子Li
7fd45ab2e8 update 优化 字典管理按钮样式 2026-03-11 13:26:57 +08:00
疯狂的狮子Li
3e592c1c5e update 优化 字典管理改为左右卡片式 2026-03-11 13:20:34 +08:00
疯狂的狮子Li
2db01677e3 update 优化整体页面样式 更圆滑 2026-03-11 11:59:47 +08:00
疯狂的狮子Li
656366d610 update 优化统一用户昵称 2026-03-10 15:37:39 +08:00
疯狂的狮子Li
eb8bdd5655
!260 add 支持顶部导航
Merge pull request !260 from Lau/dev
2026-03-10 01:17:41 +00:00
lau
1681a32dbc add 支持顶部导航 2026-03-09 23:43:53 +08:00
gssong
705e68759d add 增加转办等消息提示 2026-03-06 18:36:32 +08:00
疯狂的狮子Li
6208a2d0ca fix 修复 富文本 无需列表无效问题 2026-02-27 09:40:43 +08:00
疯狂的狮子Li
9cae1bb675 update 优化 字典类型属性提醒说明 2026-02-11 16:39:46 +08:00
疯狂的狮子Li
6b9802dfe1 update 优化 字典类型属性提醒说明 2026-02-05 13:40:49 +08:00
疯狂的狮子Li
419e7bde9a 🧨🧨🧨发布 5.5.3-2.5.3 版本 提前祝大家新年快乐 2026-01-23 14:02:39 +08:00
疯狂的狮子Li
3c7691a6b7 update 优化 修改前端推荐的node版本号 2025-12-29 11:00:55 +08:00
疯狂的狮子Li
32ee077f1a fix 修复 角色删除按钮权限标识符不正确问题 2025-12-24 11:21:29 +08:00
疯狂的狮子Li
6b8600a989 fix 修复 代码漏改问题 2025-12-23 13:40:55 +08:00
疯狂的狮子Li
3724baa93a fix 修复 一个奇奇怪怪的问题(特殊芯片电脑可复现 https://gitee.com/dromara/RuoYi-Vue-Plus/issues/IBTNM1) 2025-12-23 10:47:55 +08:00
疯狂的狮子Li
1e5f89817e
!254 update 优化 字典组件值宽松匹配values的问题
Merge pull request !254 from 加多宝/N/A
2025-12-23 01:40:27 +00:00
疯狂的狮子Li
c28a224d78 🧨🧨🧨发布 5.5.2-2.5.2 版本 2025年最后一版 2025-12-23 09:29:05 +08:00
加多宝
3008a8d7b0
update 优化 字典组件值宽松匹配values的问题
Signed-off-by: 加多宝 <945324621@qq.com>
2025-12-20 08:35:49 +00:00
疯狂的狮子Li
56bb05d547 update 优化 更改方法命名避免误会 2025-12-19 17:54:34 +08:00
疯狂的狮子Li
b4282f1423 update 优化 字典组件值宽松匹配 2025-12-18 09:39:56 +08:00
疯狂的狮子Li
f9c3958d5d
!252 feat: 添加开发者工具保护功能,防止调试
Merge pull request !252 from mubai576/dev
2025-12-01 01:30:19 +00:00
mubai576
0e210b90a2 feat: 添加开发者工具保护功能,防止调试 2025-11-30 17:36:27 +08:00
疯狂的狮子Li
6a17a0735d fix 修复 附件按钮权限不生效 2025-11-06 10:00:50 +08:00
beginner
8284a87d36 !247 feat(login): 刷新验证码时清空验证码输入框
* feat(login): 刷新验证码时清空验证码输入框
* feat(login): 添加了验证码错误时清空输入框的功能
2025-11-05 01:25:06 +00:00
疯狂的狮子Li
cdad26bba6
!248 update 前端依赖小版本升级
Merge pull request !248 from Lau/dev
2025-11-05 01:24:40 +00:00
lau
ab9b1a1367 update 前端依赖小版本升级 2025-11-05 00:38:41 +08:00
lau
8048d80baa update 前端依赖小版本升级
JSEncrypt导包方式更换
Axios增加更明确的超时错误配置
2025-11-05 00:19:50 +08:00
疯狂的狮子Li
f1ef2b1083 update 优化 增加隐藏子菜单激活路由选项编辑功能 2025-11-04 15:05:47 +08:00
疯狂的狮子Li
5e1d44c2af 🐳🐳🐳发布 5.5.1-2.5.1 日常依赖升级bug修复 2025-10-28 11:20:14 +08:00
疯狂的狮子Li
55691695c4 fix 修复 前端变量名错误 2025-10-07 16:22:36 +08:00
Lau
53e7d03a1c !245 update 页面中的标题都从配置项获取
* update 规范环境变量命名
* update 将页面中的标题都从配置项获取
2025-09-28 03:27:45 +00:00
疯狂的狮子Li
9c84bf242c
!244 update 挂载全局属性改为操作vue模块
Merge pull request !244 from Lau/dev
2025-09-28 02:31:40 +00:00
lau
b89e9cee7f update 挂载全局属性改为操作vue模块 2025-09-28 10:23:17 +08:00
疯狂的狮子Li
014bedd301 update 优化 禁止选择动态表单(无此功能) 2025-09-26 15:20:19 +08:00
疯狂的狮子Li
ceb6de9044
!243 update 升级unocss版本, 解决 nodejs lts 22 版本兼容问题
Merge pull request !243 from JackyTang/dev
2025-09-26 04:33:55 +00:00
JackyTang
04c6131fb0 update 升级unocss版本, 解决 nodejs lts 22 版本兼容问题 2025-09-26 12:17:08 +08:00
疯狂的狮子Li
c9cfefdc3e add 增加 同步租户参数配置功能 2025-09-26 11:57:33 +08:00
疯狂的狮子Li
fbe9254114 fix 修复 按钮权限不设置导致的问题 2025-09-25 11:34:52 +08:00
疯狂的狮子Li
88056a5067 发布 5.5.0-2.5.0 喜迎国庆🧨🧨🧨 2025-09-22 11:16:38 +08:00
lau
3da18c9464 update 调整菜单栏收起时的样式 2025-09-09 20:11:27 +08:00
疯狂的狮子Li
b4a40c94dc update 优化 岗位页面查询权限问题 2025-09-03 14:14:53 +08:00
lau
c11b91a48e fix 修复选择审批人选择组件没有回显的问题 2025-08-29 19:05:24 +08:00
lau
65da8dfa93 fix 修复菜单栏有二级菜单和无二级菜单缩进不一致的问题 2025-08-29 17:51:29 +08:00
疯狂的狮子Li
e10ef50288 fix 修复 路由参数缓存导致分页错误 2025-08-29 17:37:45 +08:00
疯狂的狮子Li
4c607f6915 fix 修复 初始化用户选择组件 数据为空导致的问题 2025-08-29 11:38:14 +08:00
疯狂的狮子Li
43b4e74c9c update 优化 支持前端返回节点扩展数据(按钮权限 抄送人 扩展变量) 2025-08-28 17:55:21 +08:00
疯狂的狮子Li
f84e95d735 fix 修复 遗漏字段 2025-08-25 10:23:51 +08:00
疯狂的狮子Li
dba12f25e2
!239 update 代码生成预览增加高亮
Merge pull request !239 from Lau/dev
2025-08-20 14:27:16 +00:00
lau
257ececa52 update 代码生成预览增加高亮 2025-08-20 22:09:48 +08:00
疯狂的狮子Li
7d36621c44
!238 fix 修复手机号校验的正则表达式错误
Merge pull request !238 from undefined/dev
2025-08-19 10:11:52 +00:00
疯狂的狮子Li
a29d03b231
!237 update: tag和菜单栏样式调整,增加圆角和缩进
Merge pull request !237 from Lau/dev
2025-08-19 10:08:57 +00:00
疯狂的狮子Li
ab99104240 fix 修复 错误提交 2025-08-19 18:03:45 +08:00
ymj666
153758df82 fix 修复手机号校验的正则表达式错误 2025-08-19 17:00:49 +08:00
gssong
5e5fca8f6b add 增加业务扩展 2025-08-15 21:15:47 +08:00
lau
d23bf73a2e update: tag和菜单栏样式调整,增加圆角和缩进 2025-08-14 20:16:26 +08:00
疯狂的狮子Li
ad7058b739
!236 update 收起菜单时从展开列表中移除对应菜单
Merge pull request !236 from Lau/dev
2025-08-14 01:17:48 +00:00
lau
0dd5044bbe update 收起菜单时从展开列表中移除对应菜单 2025-08-14 09:07:35 +08:00
疯狂的狮子Li
ae5dd09ba2 remove 删除无用按钮 2025-08-12 16:10:32 +08:00
疯狂的狮子Li
0e20743c28 update transition enter 2025-08-11 10:36:33 +08:00
疯狂的狮子Li
9223fabde7
!233 fix 修复 流程实例页面deleteHisByInstanceIds函数未定义导致流程实例界面无法正常渲染
Merge pull request !233 from Lapwing/dev
2025-08-04 08:14:21 +00:00
midsumor
1282839f67 fix 修复 流程实例页面deleteHisByInstanceIds函数未定义导致流程实例界面无法正常渲染 2025-08-04 15:59:17 +08:00
gssong
952f56ca2e add 升级1.8增加钉钉设计器 2025-08-03 17:04:11 +08:00
gssong
e08f41dd72 update 升级1.8设计器 2025-08-03 16:41:55 +08:00
疯狂的狮子Li
2392f64233 update 优化 getBackTaskNode 获取驳回节点接口 如果是委派直接返回当前节点 不允许驳回到其他节点 2025-07-28 16:25:35 +08:00
may
1565ec1996 add 增加下一节点执行人是当前任务处理人自动审批
fix 修复已完成的实例删除失败
2025-07-27 10:45:33 +08:00
may
d95f358d1b update 调整变量修改 2025-07-25 23:20:03 +08:00
may
7ea5199fd2 add 增加变量修改 2025-07-25 23:03:43 +08:00
may
4280c7177d add 增加催办 2025-07-25 18:22:32 +08:00
疯狂的狮子Li
4472b24def update 优化 代码结构 2025-07-23 14:15:04 +08:00
疯狂的狮子Li
33cf333b2a
!230 fix 修复菜单查询没有正确显示顶级菜单的问题
Merge pull request !230 from Lau/dev
2025-07-23 06:12:41 +00:00
lau
27a427eb97 fix 修复菜单查询没有正确显示顶级菜单的问题 2025-07-23 14:09:41 +08:00
疯狂的狮子Li
e2e1ce4091
!229 fix 修改暗黑模式样式无法覆盖element默认样式的问题
Merge pull request !229 from Lau/dev
2025-07-22 07:17:27 +00:00
lau
4013c06fea fix 修复修改暗黑模式样式无法覆盖element默认样式的问题 2025-07-17 20:57:17 +08:00
疯狂的狮子Li
8a029f6c4c update 优化 增加请求流程后端发起demo案例 2025-07-17 14:32:54 +08:00
疯狂的狮子Li
c785a9fb7f update 优化 增加请求流程后端发起demo案例 2025-07-17 14:28:45 +08:00
疯狂的狮子Li
95cbd2f3af update 优化 将请假申请流程选择框直接放到表单内 减少弹窗 2025-07-17 13:16:12 +08:00
疯狂的狮子Li
edacb79ccb update 优化 删除后端已经不存在的接口 2025-07-15 14:07:24 +08:00
疯狂的狮子Li
0872624adc update 优化 roleOptions 去重处理 2025-07-14 11:37:51 +08:00
疯狂的狮子Li
1bf03053e1 update 优化 sse重试改为5次 避免掉线频繁连接 2025-07-07 15:36:07 +08:00
疯狂的狮子Li
47c2724058 update 优化 删除无用接口 2025-07-07 15:25:01 +08:00
疯狂的狮子Li
219ab65eb7 fix 修复 流程表达式页面权限标识符错误 2025-07-07 15:22:55 +08:00
疯狂的狮子Li
107b2d444b
!227 更新 pr!226 页面展示
Merge pull request !227 from MichelleChung/dev
2025-07-06 06:02:40 +00:00
Michelle.Chung
a8bb81c984 update: 更新流程spel页面展示 ; 2025-07-06 13:51:26 +08:00
疯狂的狮子Li
0ca453d549 update 优化 流程表达式页面 2025-07-06 11:47:34 +08:00
疯狂的狮子Li
093c05bda0 fix 修复 提交流程报错 loading未关闭问题 2025-07-06 11:33:18 +08:00
疯狂的狮子Li
94dcc28c8a
!226 add: 新增流程spel表达式相关菜单 ;
Merge pull request !226 from MichelleChung/dev
2025-07-06 02:54:15 +00:00
Michelle.Chung
35b016b3ba add: 新增流程spel表达式相关菜单 ; 2025-07-05 19:11:46 +08:00
疯狂的狮子Li
f6d69e2bea update 优化 用户编辑页面展示逻辑 2025-07-04 14:51:56 +08:00
疯狂的狮子Li
9573343afc
!225 fix: 菜单级联删除添加按钮权限
Merge pull request !225 from 有梦的人/dev
2025-07-04 04:38:41 +00:00
有梦的人
8f99c76e72 fix: 菜单级联删除添加按钮权限 2025-07-04 12:29:01 +08:00
疯狂的狮子Li
62f7d393f3 🐳🐳🐳发布 5.4.1-2.4.1 小步迭代修复问题 2025-07-01 09:11:36 +08:00
疯狂的狮子Li
31037db627 update 优化 访问流程图页面缓存问题 参数增加时间戳 临时解决 2025-06-27 16:38:56 +08:00
疯狂的狮子Li
4e0d946676 update 优化 删除后端不存在的搜索条件 2025-06-27 16:25:14 +08:00
疯狂的狮子Li
71dceeacc2 update 优化 删除展开折叠按钮 菜单数据量大的清空下 展开会导致页面卡顿问题(在懒加载数据的清空下这个功能不推荐使用了) 2025-06-24 11:08:10 +08:00
疯狂的狮子Li
d59259737f
!219 fix 修复菜单改为懒加载后,修改数据没有刷新的问题
Merge pull request !219 from Lau/dev
2025-06-24 02:14:01 +00:00
lau
8afe7c3931 fix: 修复菜单改为懒加载后,修改数据没有刷新的问题 2025-06-24 09:25:13 +08:00
疯狂的狮子Li
d59738b473
!217 update: 优化菜单页面渲染方式避免长时间卡住
Merge pull request !217 from Lau/dev
2025-06-23 08:55:19 +00:00
lau
2f35342782 fix: 修复菜单管理改为懒加载后展开/折叠只能展开一级菜单的问题 2025-06-23 16:11:58 +08:00
lau
720c822bb3 update: 优化菜单页面渲染方式避免长时间卡住 2025-06-22 21:25:05 +08:00
疯狂的狮子Li
48b5d595df fix 修复 从无缓存页面切换到有缓存页面 缓存失效问题 2025-06-16 13:49:24 +08:00
疯狂的狮子Li
1034399fe4 update 优化 租户套餐菜单查询过滤掉 租户管理相关菜单 2025-06-05 18:28:19 +08:00
疯狂的狮子Li
ba257e2357 fix 修复 提交组件变量名使用错误 2025-06-04 09:57:25 +08:00
疯狂的狮子Li
8bd26758dd
!214 fix: 修复父组件中UserSelect回调处理逻辑,解决取消选择后参数未正确处理的问题
Merge pull request !214 from burningimlam/dev
2025-06-03 10:00:26 +00:00
imlam
1f1cd489be fix: 修复父组件中UserSelect回调处理逻辑,解决取消选择后参数未正确处理的问题 2025-06-03 17:26:56 +08:00
疯狂的狮子Li
9c528d9a8c
Merge branch 'ts' of gitee.com:JavaLionLi/plus-ui into dev
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2025-05-29 03:18:17 +00:00
疯狂的狮子Li
0472b823e7 🐳🐳🐳发布 5.4.0-2.4.0 正式版 2025-05-29 11:16:20 +08:00
疯狂的狮子Li
f71cf3cfb4
!210 update 优化用户管理查询条件
Merge pull request !210 from AprilWind/dev
2025-05-29 02:32:42 +00:00
AprilWind
8179ee8196 update 优化用户管理查询条件 2025-05-29 09:56:22 +08:00
gssong
8b8099ad09 update 调整流程图渲染样式 2025-05-27 22:28:28 +08:00
gssong
fd30362267 remove 删除无用代码 2025-05-27 22:23:18 +08:00
gssong
1878f49e8d update 调整查询流程图渲染空指针错误,优化流程图样式 2025-05-27 22:20:30 +08:00
疯狂的狮子Li
ca0fe5ebae update 删除logicflow依赖与文件 直接使用warmflow自带的页面 2025-05-27 17:14:28 +08:00
疯狂的狮子Li
ba78f8cc0d
!209 新增通过前端显示流程图方式和新增办理人转换接口
Merge pull request !209 from 晓华/dev
2025-05-27 09:02:28 +00:00
warm
a614dee5c6 feat 新增通过前端显示流程图方式
feat 办理人权限处理器,新增办理人转换接口,比如角色转用户
update 升级warm-flow-1.7.3-m1
2025-05-27 16:58:18 +08:00
疯狂的狮子Li
463faba9b9 update 优化 替换过期的写法 2025-05-27 14:52:10 +08:00
疯狂的狮子Li
9dea8369e3 fix 修复 菜单取消按钮不工作问题 2025-05-27 14:47:22 +08:00
疯狂的狮子Li
592fb84aa7 update 优化 添加页签图标显示开关功能 2025-05-27 14:13:45 +08:00
gssong
3019701856 add 增加logicflow流程图预览 2025-05-25 11:47:09 +08:00
gssong
1ea70dd3ce update 表格增加border 2025-05-24 13:13:45 +08:00
gssong
2a5ad70155 update 修改菜单级联删除弹窗无法取消 2025-05-24 13:06:04 +08:00
疯狂的狮子Li
9c8e3404bb
!207 feat 新增批量级联删除菜单接口
Merge pull request !207 from 马铃薯头/dev
2025-05-23 10:04:52 +00:00
xlsea
385bbb77a9 feat 新增批量级联删除菜单接口 2025-05-23 14:03:03 +08:00
疯狂的狮子Li
70f7c06e55 update 优化 动态路由迁移到菜单管理 2025-05-22 18:15:02 +08:00
gssong
369f48ced5 update 优化审批按钮,封装成公共组件 2025-05-16 21:00:48 +08:00
疯狂的狮子Li
7f15f0e15a update 优化 执行eslint:fix优化代码 2025-05-15 14:52:41 +08:00
疯狂的狮子Li
7b48bd44a2
!203 修改navbar中消息图标样式与同行元素保持一致
Merge pull request !203 from 愿丶/dev
2025-05-12 02:03:58 +00:00
疯狂的狮子Li
7affcd27b7 update 更新 readme 增加新成员项目 2025-05-12 09:34:40 +08:00
疯狂的狮子Li
7de9f23226
update README.md.
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2025-05-08 14:24:37 +00:00
疯狂的狮子Li
afc35feb8c update 更新 readme 2025-05-08 22:11:04 +08:00
愿丶
84d682a4a2
update 修改navbar中消息图标样式与同行元素保持一致
Signed-off-by: 愿丶 <1319542051@qq.com>
2025-04-29 13:06:34 +00:00
gssong
b29c5bd2fa update 放开申请人附件与抄送限制 附件改为按钮权限控制 2025-04-26 12:52:52 +08:00
疯狂的狮子Li
e4c24a511a
!202 [任务]: 工作流分类与流程设计新增联动
Merge pull request !202 from MoMyles/dev
2025-04-24 03:52:05 +00:00
疯狂的狮子Li
9955a52059 update 优化 增加oss站点与域名 默认前缀避免填错 2025-04-24 11:36:51 +08:00
疯狂的狮子Li
de22609196 update 升级全部依赖版本
update element-plus 2.9.8
update pinia 3.0.2
update vue-router 4.5.0
update vue-types 6.0.0
update vxe-table 4.13.7
update sass 1.87.0
update typescript 5.8.3
update vite 6.3.2
........等等很多版本
2025-04-22 15:23:36 +08:00
疯狂的狮子Li
e5de3f4e9d update 优化代码 2025-04-22 13:32:15 +08:00
疯狂的狮子Li
660d5b3d4f update 优化 关于excel说明 2025-04-18 17:47:55 +08:00
疯狂的狮子Li
d5eac17097 update 优化 角色禁用不允许分配 2025-04-17 15:19:58 +08:00
疯狂的狮子Li
6fe2317681 update vite 5.4.11 => 5.4.18 2025-04-16 15:28:14 +08:00
Myles
e9e8a2eaaf 优化赋值 2025-04-14 13:14:57 +08:00
疯狂的狮子Li
5ec984ac7d update 增加 流程变量注释 2025-04-11 15:32:27 +08:00
Myles
c98a14e2ac if添加括号 2025-04-10 15:41:30 +08:00
Myles
bbc656a26c [任务]: 工作流分类与流程设计新增联动 2025-04-10 11:33:12 +08:00
疯狂的狮子Li
722acf0ae7 update 优化 删除无用组件 2025-04-07 16:22:04 +08:00
疯狂的狮子Li
15acd995f9 fix 修复 请假时间 时间组件没法和rule规则联动问题(ele的bug手动设置必填) 2025-04-02 14:45:23 +08:00
疯狂的狮子Li
35b90aa746 fix 修复 请假提交未取消按钮loading问题 2025-04-02 14:37:32 +08:00
疯狂的狮子Li
de926211ef update 优化 登出之后清理tabs 2025-03-31 09:40:09 +08:00
疯狂的狮子Li
30e1ea1c6d fix 修复 前端download方法响应json异常问题 2025-03-28 22:51:01 +08:00
疯狂的狮子Li
8fa765f7be
!199 发布 5.3.1-2.3.0 正式版
Merge pull request !199 from 疯狂的狮子Li/dev
2025-03-27 02:54:40 +00:00
疯狂的狮子Li
7321b4c4ca 🐳发布 5.3.1-2.3.0 正式版 2025-03-27 10:48:24 +08:00
疯狂的狮子Li
85608594bc update 删除无用组件 2025-03-27 10:37:09 +08:00
疯狂的狮子Li
fc8b795bd9
!198 漏洞扫描出现yui2.9.0版本漏洞fix
Merge pull request !198 from dxldxl/dev
2025-03-27 02:35:48 +00:00
dxldxl
3a7fad80a8 漏洞扫描出现yui2.9.0版本漏洞fix 2025-03-27 10:10:50 +08:00
疯狂的狮子Li
f5d557fe80
!197 发布 5.3.1-BETA2_2.3.0-BETA2 公测版本
Merge pull request !197 from 疯狂的狮子Li/dev
2025-03-21 07:26:30 +00:00
疯狂的狮子Li
8bff98ac72 发布 5.3.1-BETA2_2.3.0-BETA2 公测版本 2025-03-21 15:19:37 +08:00
疯狂的狮子Li
8fadab9741 update 优化 删除无用代码 2025-03-19 16:42:38 +08:00
疯狂的狮子Li
fba121f5c3 update 优化 findPathNum 方法 更高效 2025-03-19 10:30:14 +08:00
疯狂的狮子Li
48e9f2c5c0 update 优化 登录与注册页面表头从配置文件内导入 2025-03-18 17:45:01 +08:00
疯狂的狮子Li
d8a395bfd1 update 优化 简化代码 2025-03-17 09:36:39 +08:00
gssong
597c8370d3 update 补充参数 2025-03-14 23:41:26 +08:00
疯狂的狮子Li
6b2838141a update 优化 如果不存在属性 则做兼容 2025-03-14 16:14:57 +08:00
疯狂的狮子Li
b3edce5a20
!196 update 统一流程定义编码,增加流程分类标识
Merge pull request !196 from AprilWind/dev
2025-03-14 02:28:10 +00:00
AprilWind
53424765f9 update 统一流程定义编码,增加流程分类标识 2025-03-14 10:25:16 +08:00
疯狂的狮子Li
b23b123613
!195 发布 5.3.1-BETA_2.3.0-BETA 公测版本
Merge pull request !195 from 疯狂的狮子Li/dev
2025-03-13 05:30:32 +00:00
疯狂的狮子Li
3eab423da5 发布 5.3.1-BETA_2.3.0-BETA 公测版本 2025-03-13 13:29:38 +08:00
疯狂的狮子Li
2e627832ae update 优化 删除不应该传的参数 2025-03-13 11:55:24 +08:00
疯狂的狮子Li
8b5cf9a35f update 优化 代码 2025-03-13 11:47:49 +08:00
疯狂的狮子Li
78798f99ea
!194 chore: 升级svg-icons-ng版本
Merge pull request !194 from yangxu52/feat/update-deps
2025-03-12 07:28:39 +00:00
yangxu52
57f288c892 chore: 升级svg-icons-ng版本 2025-03-12 15:20:16 +08:00
疯狂的狮子Li
0815fa2978 fix 修复 pr书写错误问题 2025-03-12 12:14:51 +08:00
疯狂的狮子Li
7feead9afc update 优化代码 统一store用法 2025-03-12 12:08:29 +08:00
gssong
98728828ad add 增加示例 调整提交组件 2025-03-08 00:09:46 +08:00
疯狂的狮子Li
d9218fac24 update 优化代码 2025-03-07 14:31:17 +08:00
疯狂的狮子Li
6d290785ef fix 修复 idea 误报类型异常问题 2025-03-07 14:15:23 +08:00
疯狂的狮子Li
f6400f3cbe fix 修复 pr导致的代码报错 2025-03-07 13:28:25 +08:00
疯狂的狮子Li
9d7f3101b9
!192 chore: 标准化tsconfig和优化postcss配置
Merge pull request !192 from yangxu52/feture/standardize
2025-03-07 05:19:20 +00:00
yangxu52
7784709cae chore: 优化postcss配置
- 移除autoprefixer的浏览器版本覆盖,使用package.json来定义,
- browerserlist定义对齐vite的构建目标 https://vite.dev/config/build-options.html#build-target
- atRule中charset已经限定配置charset,判断多余
- 顺手删了~路径别名,此项未使用,且tsconfig也没配置
2025-03-07 12:24:03 +08:00
yangxu52
b5a4ebe2f6 chore: 标准化tsconfig,并改了错误的$schema 2025-03-07 12:17:41 +08:00
疯狂的狮子Li
b814fb5105
!190 chore: 统一style标签的字段顺序
Merge pull request !190 from yangxu52/feat/standardize
2025-03-06 16:26:11 +00:00
yangxu52
e98d43f50d chore: 统一style标签的字段顺序
<style lang="scss" scope> **部分全局作用域未添加scope**
2025-03-07 00:02:15 +08:00
yangxu52
71b9d5d468 chore: 统一script标签的字段顺序
<script setup lang="ts">
2025-03-07 00:01:37 +08:00
yangxu52
e341b45429 chore: 移除冗余的类型声明
使用defineConfig自带类型推断,无需单独声明类型
2025-03-06 23:54:06 +08:00
疯狂的狮子Li
b2219cabec update 优化代码 2025-03-06 23:13:35 +08:00
疯狂的狮子Li
abc6e4f454 update 优化代码 2025-03-06 23:08:06 +08:00
疯狂的狮子Li
b1b63ebf7f
!189 chore: 修改svg-icon配置以启用svgo优化
Merge pull request !189 from yangxu52/feat/fix-svgo-optimize
2025-03-06 14:59:17 +00:00
yangxu52
acc760a20f chore: 修改svg-icon配置以启用svgo优化
- /src/assets/icons/build.svg导致svgo优化失败
 - 现已修复,故启用svgo(默认即启用,故移除覆盖的`false`)
2025-03-06 22:45:42 +08:00
yangxu52
62e3351bc7 fix: 删除多余的闭标签</path> 2025-03-06 22:44:50 +08:00
gssong
4fe828faa4 add 增加选人判断 2025-03-06 22:23:12 +08:00
gssong
21466ca8a1 Merge branch 'dev' of https://gitee.com/JavaLionLi/plus-ui into dev 2025-03-06 20:58:03 +08:00
gssong
21234379b3 update 调整选人警告 2025-03-06 20:57:49 +08:00
疯狂的狮子Li
44bf7e7212 fix 修复 按钮权限类型书写错误 2025-03-06 16:28:53 +08:00
疯狂的狮子Li
e91d11876f update 优化 增加自动导入函数 2025-03-06 11:25:25 +08:00
疯狂的狮子Li
a90f38734f update 优化 增加 编译文件忽略 避免大批量的git记录出现 2025-03-06 10:35:59 +08:00
疯狂的狮子Li
761f97e143
!188 chore: 替换svg-icons插件
Merge pull request !188 from yangxu52/feat/replace-svg-icons-plugin
2025-03-06 02:16:30 +00:00
yangxu52
bfcffc50e2 chore: 替换svg-icons插件
替换vite-plugin-svg-icons插件, 以修复依赖警告、安全漏洞警告
 - 替换vite-plugin-svg-icons为vite-plugin-svg-icons-ng
 - 移除vite-plugin-svg-icons的依赖fast-glob
 - 调整插件的导入,并修改svgo优化参数配置项
2025-03-05 23:57:11 +08:00
gssong
07b8bc65ec update 调整选择审批人 2025-03-05 22:37:15 +08:00
gssong
f241c187b3 Merge branch 'dev' of https://gitee.com/JavaLionLi/plus-ui into dev 2025-03-05 22:26:55 +08:00
gssong
ef535a3f33 add 添加设置下一审批人 2025-03-05 22:26:46 +08:00
疯狂的狮子Li
a01545bc84
!187 perf: 上传组件添加accept属性
Merge pull request !187 from lu_ming/dev
2025-03-05 03:32:32 +00:00
can
bdaddb4bf6 perf: 上传组件添加accept属性 2025-03-05 11:25:39 +08:00
疯狂的狮子Li
ace672dd0c update 优化 页面样式 2025-03-05 09:52:48 +08:00
gssong
0539fa3c1f add 增加弹窗选人 2025-03-04 21:48:27 +08:00
疯狂的狮子Li
18f89055e1 fix 修复 图片组件变量错误 2025-03-04 15:01:52 +08:00
疯狂的狮子Li
7a8620c994 fix 修复 变量漏改 2025-03-04 10:05:25 +08:00
疯狂的狮子Li
e38d286c11 update 优化 标注node与npm版本 2025-03-03 14:25:13 +08:00
疯狂的狮子Li
05e7e93cf1 update 优化 顶部菜单搜索栏为多层级显示 2025-03-03 13:47:52 +08:00
疯狂的狮子Li
f2adc5e5fa update 优化 前端处理路由函数代码 2025-03-03 13:47:41 +08:00
疯狂的狮子Li
7be0723c31 update 优化 优化前端树结构拼接性能 2025-03-03 13:41:33 +08:00
疯狂的狮子Li
eab4345198 update 优化 分页组件样式 pagination更换成flex布局 2025-03-03 13:31:05 +08:00
疯狂的狮子Li
e040820dae update 优化 文件上传增加禁用按钮 增加文件类型 2025-03-03 13:29:15 +08:00
gssong
61b81f4692 add 增加按钮权限 2025-03-01 23:46:46 +08:00
LiuHao
aef5a02097 update 升级部分依赖,优化eslint语法以及scss语法 2025-02-25 13:30:57 +08:00
疯狂的狮子Li
cc38d23d14 update 优化 更改版权信息2025 2025-02-21 20:32:29 +08:00
疯狂的狮子Li
74c29dc13e fix 修复 拼写错误 2025-02-21 17:07:23 +08:00
疯狂的狮子Li
b474a1cffc update vueuse 11.3 => 12.7 2025-02-21 10:18:04 +08:00
疯狂的狮子Li
e3219c434a fix 修复 el-dropdown-item 标签无法使用 v-has-permi自定义标签 问题 2025-02-20 10:37:25 +08:00
疯狂的狮子Li
c28fbdfb27 update 优化 调整注释 2025-02-13 16:57:29 +08:00
疯狂的狮子Li
ef19e97109 update 优化 删除已经没有实际作用的依赖 2025-02-11 09:53:14 +08:00
疯狂的狮子Li
bb90dbc35b fix 修复 代码生成 下拉框选项没法清空问题 2025-02-09 22:14:42 +08:00
疯狂的狮子Li
770861ed33 update 优化 调整客户端管理 label长度 2025-02-08 16:08:23 +08:00
疯狂的狮子Li
edf9529a10
!184 update src/views/workflow/processDefinition/index.vue. 修复【表单路径】prop错误
Merge pull request !184 from JiaoYue/N/A
2025-02-08 07:43:54 +00:00
JiaoYue
a11679dc0d
update src/views/workflow/processDefinition/index.vue. 修复【表单路径】prop错误
Fix:修复【表单路径】prop错误

Signed-off-by: JiaoYue <502583281@qq.com>
2025-02-08 07:41:34 +00:00
疯狂的狮子Li
4d6a1ee73b update 优化 增加配置注释 2025-02-07 18:35:15 +08:00
疯狂的狮子Li
b43158914b
Revert "update 优化 删除无用配置"
This reverts commit 66580a05a8.
2025-02-07 09:27:59 +00:00
疯狂的狮子Li
66580a05a8 update 优化 删除无用配置 2025-02-07 16:56:37 +08:00
疯狂的狮子Li
dccfa219d7 update 优化 删除无用配置 2025-02-07 15:20:21 +08:00
疯狂的狮子Li
b1f0b3c096
!183 同步修复一些问题
Merge pull request !183 from 疯狂的狮子Li/dev
2025-02-07 06:20:16 +00:00
疯狂的狮子Li
b95a49c7d7 reset 回滚有问题的修改 2025-02-07 13:08:34 +08:00
疯狂的狮子Li
2155d9f4b0
!181 fix 修复 路由守卫白名单通配符正则覆盖问题
Merge pull request !181 from QianRj/dev
2025-02-07 03:23:51 +00:00
QianRj
fb7bca27eb fix 修复 路由守卫白名单通配符正则覆盖问题 2025-02-06 20:20:40 +08:00
疯狂的狮子Li
904ee32b24
!180 fix 修复 消息弹框内容过长不换行
Merge pull request !180 from zst_2001/dev
2025-02-05 01:19:53 +00:00
zst_2001
4839a5152f fix 修复 消息弹框内容过长不换行 2025-02-04 21:11:48 +08:00
疯狂的狮子Li
c454efd713
!177 错别字修改
Merge pull request !177 from WeiHan/dev
2025-01-24 07:15:17 +00:00
WeiHan
e8bbe0ac15
update src/components/Process/approvalRecord.vue.
Signed-off-by: WeiHan <1844152414@qq.com>
2025-01-24 07:10:25 +00:00
疯狂的狮子Li
b2a4157285
!175 发布 5.3.0 新春版 祝大家新年快乐
Merge pull request !175 from 疯狂的狮子Li/dev
2025-01-24 05:08:48 +00:00
疯狂的狮子Li
5682b5f9c2 🧨🧨🧨发布 5.3.0 新春版 祝大家新年快乐 2025-01-24 13:07:42 +08:00
疯狂的狮子Li
a4eab94188 fix 修复 选择用户列表数据未清除问题 2025-01-24 11:17:48 +08:00
疯狂的狮子Li
8994e3ad3e update 优化 驳回增加附件上传 2025-01-22 11:13:38 +08:00
疯狂的狮子Li
060f99dee5 update 优化 删除无用链接 2025-01-20 18:08:37 +08:00
疯狂的狮子Li
aef170f374 update 优化 流程设计关闭后 跳转回打开的地方 2025-01-20 13:35:21 +08:00
疯狂的狮子Li
bfc6e7b8da fix 修复 流程定义分页问题 2025-01-20 12:44:27 +08:00
疯狂的狮子Li
5e440a7dc4
!173 发布 5.3.0-BETA 公测版本
Merge pull request !173 from 疯狂的狮子Li/dev
2025-01-20 03:36:18 +00:00
疯狂的狮子Li
3280baff16 发布 5.3.0-BETA 公测版本 2025-01-20 11:36:07 +08:00
疯狂的狮子Li
bbe94610a2 update 优化 parseTime 提示报错问题 2025-01-20 11:30:16 +08:00
疯狂的狮子Li
4c12943e3c update 恢复误删文件 2025-01-20 11:18:10 +08:00
疯狂的狮子Li
25189f3052 update 优化 国际化 变量提示 2025-01-20 11:06:19 +08:00
疯狂的狮子Li
11e2695465 Revert "update 优化 国际化改为使用json 书写更方便"
This reverts commit 8d398d2940.
2025-01-20 10:57:45 +08:00
疯狂的狮子Li
0d493f1c74 update vue-i18n 10.0.5 2025-01-20 10:41:45 +08:00
疯狂的狮子Li
8d398d2940 update 优化 国际化改为使用json 书写更方便 2025-01-20 10:16:27 +08:00
疯狂的狮子Li
801700044c update 优化 删除无用代码 2025-01-20 10:09:05 +08:00
gssong
3c2409169b update 调整设计器宽度 2025-01-17 21:59:11 +08:00
gssong
490eecccc5 update 调整设计器溢出问题 2025-01-17 21:40:37 +08:00
gssong
ecf2337205 update 调整流程设计溢出问题,优化流程图,流程实例按钮 2025-01-17 21:31:55 +08:00
疯狂的狮子Li
9cc8195237 update 优化 调整预览组件高度 2025-01-16 16:49:43 +08:00
疯狂的狮子Li
522087e18f update 优化 调整预览组件高度 2025-01-16 16:27:03 +08:00
疯狂的狮子Li
b7e96dec38 update 优化 工作流预览界面支持放大/缩放 移动拖拽 2025-01-16 16:00:12 +08:00
疯狂的狮子Li
71528c78ac update 优化 设计器界面展示效果 2025-01-15 18:20:29 +08:00
疯狂的狮子Li
2fc220f9d3 update 优化 支持最新版本json部署文件上传 2025-01-15 17:42:32 +08:00
疯狂的狮子Li
e0eed9c89a update 优化 页面跳转逻辑 2025-01-13 19:38:01 +08:00
疯狂的狮子Li
e423d8afcf !172 合并 warmflow 功能分支
* update 优化 流程定义页面 点击复制之后跳转到未发布列表
* update 优化 流程定义页面 增加加载loading层
* fix: v-model处理有延迟 需要手动处理
* update 调整流程定义查询
* Merge remote-tracking branch 'origin/dev' into warm-flw-future
* update 调整可驳回的节点
* update: 调整文案
* update: 激活/挂起改为switch操作
* update 优化 代码删除无用输出
* update 统一抄送人使用昵称展示
* update 调整分类接口
* update 统一业务id参数
* update 删除默认顶节点
* !168 优化流程分类
* update 恢复误删除代码
* update 优化流程分类
* update 修复 路由跳转未改全
* [update]
* fix 修复一些问题
* update 重构流程分类表
* update 流程定义增加表单路径与编辑功能 修复一些其他bug
* fix 修复 一些问题
* update 变量统一命名
* add 增加示例
* Merge branch 'warm-flw-future' of https://gitee.com/JavaLionLi/plus-ui…
* update 调整办理人
* Merge remote-tracking branch 'origin/dev' into warm-flw-future
* add 增加示例
* update 调整审批记录 添加流程导出
* remove 删除无用代码
* remove 删除无用代码
* [update]
* [fix]
* 流程干预删除委托
* 增加附件
* 附件修改
* 申请人查询修改
* 1.修改查询条件
* !167 fix 修复 import路径修改不全问题
* fix 修复 import路径修改不全问题
* !166 update 清除 ProcessPreview 引用
* update 清除 ProcessPreview 引用
* remove 删除 bpmn.js 设计器
* remove 删除 bpmn.js 设计器
* remove 删除 bpmn.js 设计器
* remove 删除 bpmn.js 设计器
* fix 修复 前端路径修改不全问题
* update 优化接口请求路径
* add 添加作废
* add 添加流程干预
* update 调整加签,减签
* update 调整加签,减签
* add 增加流程查看
* update 调整委托,转办
* update 调整流程变量显示
* update 调整办理人修改
* update 调整流程实例状态页面
* update 调整已办页面
* add 添加流程撤销
* update 调整任务,流程实例 ,流程定义页面
* Merge branch 'dev' into warm-flw-future
* update 调整流程定义页面
* add 添加流程变量查看
* update 调整设计器路由名称
* update 调整办理人
* update 调整设计器uri
* update 调整设计器请求uri 调整待办状态
* update 调整办理 驳回 终止等状态
* add 添加模型新增
* add 添加warm-ui设计器,删除无用代码
* Merge remote-tracking branch 'origin/dev' into warm-flw-future
* add 添加流程设计
* update 调整驳回
* update 调整视图类型错误
* Merge branch 'warm-flw-future' of https://gitee.com/JavaLionLi/plus-ui…
* 添加已办,未办
* Merge remote-tracking branch 'origin/dev' into warm-flw-future
* update 调整流程实例,待办查询
* add 添加代办人,调整提交按钮校验
* update 调整流程定义查询
* add添加流程定义激活 挂起
* add 添加流程文件部署 调整流程发布
* update 优化 时间搜索组件统一
* Merge remote-tracking branch 'origin/dev' into warm-flw-future
* fix 修复 用户管理编辑安全权限错误问题
* Merge remote-tracking branch 'origin/dev' into warm-flw-future
* update 优化 类型报错问题
* update 优化 切换租户后刷新首页
* update 优化 实现表格行选中切换
* update 优化 使用 vueuse 重构 websocket 实现
* update 优化 使用 vueuse 重构 websocket 实现
* fix 修复 登出后重新登录 sse推送报错问题
* reset 回滚 代码修改 采用其他方案
* fix 修复 登出后重新登录 sse推送报错问题
* update 优化 删除无用代码
* update element-plus 2.7.5 => 2.7.8
* reset 回滚 错误修复
* update 优化 代码生成器编辑页禁用缓存 防止同步后页面不更新问题
* fix 修复 代码生成同步点击取消报错问题
* 初始化添加warm-flow
2025-01-13 06:11:00 +00:00
疯狂的狮子Li
100f44e197 fix 修复 切换租户 tabs过多导致卡住问题 2025-01-12 20:54:58 +08:00
LiuHao
b39e0ad6db 优化 主题色在深色模式下显示亮度 2024-12-27 12:55:27 +08:00
LiuHao
2b1f5f2c70 优化 主题色在深色模式下显示亮度 2024-12-27 11:45:33 +08:00
疯狂的狮子Li
e521af0eae
!169 fix 修复用户管理界面修改按钮权限字符串错误
Merge pull request !169 from QianRj/dev
2024-12-25 15:45:06 +00:00
QianRj
b600fb34b5 fix: 修复用户管理界面修改按钮权限字符串错误 2024-12-25 22:27:32 +08:00
疯狂的狮子Li
e29beed8bd update 优化 hasRoles 方法增加超管判断 2024-12-24 21:59:25 +08:00
疯狂的狮子Li
7772c7c7d6 update 优化 用户页面 增加导入到处权限标识 2024-12-24 21:59:22 +08:00
疯狂的狮子Li
ed82954643
update src/views/system/user/index.vue.
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2024-12-24 09:22:48 +00:00
疯狂的狮子Li
1c28058141 update 优化 TopNav内链菜单点击没有高亮 2024-12-18 13:22:47 +08:00
疯狂的狮子Li
f5410dfff4 update 删除无用代码 2024-12-17 09:41:11 +08:00
疯狂的狮子Li
1f93137b80 fix 修复 oss配置页 展示配置key 隐藏主键id 2024-12-13 14:49:24 +08:00
疯狂的狮子Li
8a034662c7 fix 修复 页面api过期警告 2024-12-13 11:45:25 +08:00
疯狂的狮子Li
7a9ccedadc update 优化 新增编辑用户 过滤禁用的部门 2024-12-11 15:30:44 +08:00
疯狂的狮子Li
84888c3c28 fix 修复 代码生成列表加载问题你 2024-12-08 21:03:44 +08:00
疯狂的狮子Li
cc4186b578 update 优化 白名单增加正则匹配示例 2024-12-04 11:43:18 +08:00
疯狂的狮子Li
fd01b5a61f update 优化 白名单支持对通配符路径匹配 2024-12-04 11:42:07 +08:00
疯狂的狮子Li
00f7ab34ef fix 修复 修复默认关闭Tags-Views时,内链页面打不开 2024-12-03 11:15:09 +08:00
疯狂的狮子Li
b61865f45f fix 修复 用户选择组件 id类型不统一问题 2024-11-29 18:30:19 +08:00
疯狂的狮子Li
4075b838fc fix 修复 代码生成 编辑之后查两遍列表的问题 2024-11-29 10:15:09 +08:00
疯狂的狮子Li
116a214ce6 Revert "update 优化 删除无用变量"
This reverts commit 150f1d793c.
2024-11-29 10:06:25 +08:00
疯狂的狮子Li
484db3c09e update 优化 删除无用变量 2024-11-29 10:02:03 +08:00
疯狂的狮子Li
150f1d793c update 优化 删除无用变量 2024-11-29 09:50:16 +08:00
疯狂的狮子Li
334ee0d40d
!162 feat: i18n $t方法支持ts类型提示
Merge pull request !162 from 玲娜贝er/dev
2024-11-28 13:28:28 +00:00
dap
76f4824d2b feat: i18n $t方法支持ts类型提示 2024-11-28 21:07:23 +08:00
疯狂的狮子Li
bf43f8aa3c reset 回滚错误提交 2024-11-28 16:31:12 +08:00
疯狂的狮子Li
0874e32597
!161 remove 移除 已经不再依赖的冗余文件
Merge pull request !161 from 秋辞未寒/dev
2024-11-28 06:17:50 +00:00
疯狂的狮子Li
23f372dad7 fix 修复 登录无redirect参数404问题 2024-11-28 14:17:59 +08:00
秋辞未寒
5ca894369a remove 移除 已经不再依赖的冗余文件 2024-11-28 14:15:10 +08:00
疯狂的狮子Li
786f25bfd4 update 优化 登录页多语言按钮样式 2024-11-28 12:43:32 +08:00
疯狂的狮子Li
06a8d871f7 update 优化 简化国际化配置 无需重复编写 2024-11-28 11:42:08 +08:00
疯狂的狮子Li
42b6668fd0 fix 修复 变量code错误 2024-11-28 11:16:00 +08:00
疯狂的狮子Li
6ef9b9a741 update 优化代码 2024-11-27 17:43:17 +08:00
疯狂的狮子Li
98a8e96feb
!160 refactor: 补充登录页与注册页的国际化内容并添加切换语言按钮
Merge pull request !160 from QianRj/补充登录页与注册页国际化内容
2024-11-27 09:38:21 +00:00
QianRj
7c1525fd21 refactor: 补充登录页与注册页的国际化内容并添加切换语言按钮 2024-11-27 17:25:09 +08:00
疯狂的狮子Li
eb406fbb26 update 删除无用文件 2024-11-27 15:51:38 +08:00
玲娜贝er
845b848b60 !159 eslint升级v9版本
* update: eslint升级v9版本 & 更新一些不符合校验规则的代码
2024-11-27 07:39:34 +00:00
疯狂的狮子Li
f3425493ed update 优化 全代码规范化处理 2024-11-26 15:29:22 +08:00
疯狂的狮子Li
f203716f31 update 优化 代码生成导入下拉框默认值处理 2024-11-26 15:29:06 +08:00
疯狂的狮子Li
3b710d9e99 update typescript 5.4.5 => 5.7.2
update vite 5.2.12 => 5.4.11
update vue 3.4.34 => 3.5.13
update element-plus 2.7.8 => 2.8.8
update .... 其他依赖版本升级
2024-11-26 15:28:24 +08:00
疯狂的狮子Li
3960c31975 update 优化 代码格式 2024-11-26 13:25:44 +08:00
疯狂的狮子Li
e3b5d7ca54 update 优化 菜单面包屑导航支持多层级显示 2024-11-26 13:25:37 +08:00
疯狂的狮子Li
a06db1a6f9 update 优化 参数键值更换为多行文本 2024-11-25 13:54:27 +08:00
疯狂的狮子Li
247bf826d8 Revert "update 优化 直接从@/lang/*.ts后缀的i18n文件中读取各国语言包信息"
This reverts commit 24f1e8b4b1.
2024-11-25 10:37:30 +08:00
疯狂的狮子Li
6eeb711d2f update 优化 增加默认数据权限 "部门及以下或本人数据权限" 选项 2024-11-25 10:33:58 +08:00
疯狂的狮子Li
525be3cef0
!157 【重新提交】permission loadView避免整个modules循环,允许view中间有views文件夹。
Merge pull request !157 from lijfcn/dev
2024-11-24 14:04:14 +00:00
admin_lijinfu
a5931a78f6 perf: permission loadView避免整个modules循环,允许view中间有views文件夹 2024-11-24 21:49:13 +08:00
疯狂的狮子Li
971b4f60ec
!155 refactor: 直接从@/lang/*.ts后缀的i18n文件中读取各国语言包信息
Merge pull request !155 from QianRj/优化i18n
2024-11-24 10:56:49 +00:00
疯狂的狮子Li
51e4c44fd0 fix 修复 monitor 设置 context-path 导致退出重新登录404问题 2024-11-22 17:54:31 +08:00
疯狂的狮子Li
a150c8c9a7 update 优化 个人中心强退设备接口路径 2024-11-22 16:00:10 +08:00
疯狂的狮子Li
9dd7bf8990 fix 修复 手动登出与token过期登出跳转行为不一致问题 2024-11-20 11:25:51 +08:00
QianRj
24f1e8b4b1 update 优化 直接从@/lang/*.ts后缀的i18n文件中读取各国语言包信息 2024-11-19 14:40:36 +08:00
疯狂的狮子Li
22e8a57b31 update 优化 将同步字典功能迁移到租户管理内 2024-11-18 23:47:14 +08:00
疯狂的狮子Li
ec0e6a167e update 修改readme 2024-11-15 16:28:00 +08:00
疯狂的狮子Li
5f582c09ba fix 修复 关闭sse功能 登出还是会发送sse关闭请求导致报错问题 2024-11-15 09:56:37 +08:00
疯狂的狮子Li
2ef0cf5bd5
!154 refactor: 重构操作日志详情样式
Merge pull request !154 from 玲娜贝er/dev
2024-11-14 08:25:26 +00:00
dap
cdbbca43c4 chore: 锁定vue-json-pretty版本 2024-11-14 16:23:16 +08:00
dap
72ac227ecf refactor: 重构操作日志详情样式 2024-11-14 16:20:34 +08:00
疯狂的狮子Li
e2f18565d1
!153 字典缓存使用Map代替Array,更高效
Merge pull request !153 from 月夜/dev
2024-11-11 07:18:42 +00:00
月夜
9836d6d9bd 优化:字典缓存使用Map代替Array,更高效 2024-11-11 15:10:24 +08:00
疯狂的狮子Li
4310e5e049 update 优化代码格式 2024-11-08 00:33:45 +08:00
疯狂的狮子Li
b19c2805e1 update 优化 校检文件名是否包含特殊字符 2024-11-05 16:47:51 +08:00
疯狂的狮子Li
fdfb556c8e update 优化 getTenantList 接口动态决定是否传token 2024-11-05 14:29:24 +08:00
疯狂的狮子Li
9ed3ae3fab fix 修复 内嵌页面数据缓存导致与外部页面不一致问题 2024-10-27 23:29:36 +08:00
疯狂的狮子Li
9a02598c00
!151 发布 vue 版本 5.2.3 与 cloud 版本 2.2.2
Merge pull request !151 from 疯狂的狮子Li/dev
2024-10-25 03:13:13 +00:00
疯狂的狮子Li
28a81f2e44 🎀发布 vue 版本 5.2.3 与 cloud 版本 2.2.2 2024-10-25 11:04:05 +08:00
疯狂的狮子Li
6f4891d677 update 优化 流程提交用户id使用字符串提交避免雪花id失真问题 2024-10-17 18:15:18 +08:00
疯狂的狮子Li
a62a3de23c fix 修复 pr!150 sse开关缺少变量问题 2024-10-15 13:49:32 +08:00
疯狂的狮子Li
1d852da351
!150 增加SEE开关
Merge pull request !150 from iqitao/ss
2024-10-15 05:47:39 +00:00
陈西瓜i
f0895e9419 add 增加注解 2024-10-14 20:50:20 +08:00
陈西瓜i
1644070e97 add SSE开关 2024-10-14 20:33:16 +08:00
疯狂的狮子Li
4918552492 fix 修复 请假日期选择格式不对问题 2024-10-12 10:58:32 +08:00
疯狂的狮子Li
364dfb969d update 优化代码 2024-10-07 10:45:25 +08:00
疯狂的狮子Li
9726df3966 fix 修复 登录日志excel导出名称错误 2024-09-18 09:42:24 +08:00
疯狂的狮子Li
483af13741 fix 修复 重新登录无法跳转到过期前页面问题 2024-09-06 18:06:16 +08:00
疯狂的狮子Li
25848ea99e fix 修复 重新登录无法跳转到过期前页面问题 2024-09-06 17:58:28 +08:00
疯狂的狮子Li
9f13c29cd7 update 优化 代码生成菜单id匹配写法 2024-09-04 16:16:46 +08:00
疯狂的狮子Li
e1860a30fc
fix 修复 租户套餐导出路径编写错误
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2024-08-26 12:29:29 +00:00
疯狂的狮子Li
34b929d352 add 增加 同步租户字典功能 2024-08-26 17:56:35 +08:00
疯狂的狮子Li
1606dbd76f
!141 发布 vue 版本 5.2.2 与 cloud 版本 2.2.1
Merge pull request !141 from 疯狂的狮子Li/dev
2024-08-26 03:45:16 +00:00
疯狂的狮子Li
3c2d9100b5 😴发布 vue 版本 5.2.2 与 cloud 版本 2.2.1 2024-08-26 11:40:53 +08:00
疯狂的狮子Li
2c8873402f update 优化 使用匹配模式简化预编译配置 2024-08-16 13:01:54 +08:00
疯狂的狮子Li
e5727893bb update 优化 时间搜索组件统一 2024-08-15 20:42:29 +08:00
疯狂的狮子Li
335a1e6019 update 优化 oss 配置按钮 使用ossConfig权限标识符与oss权限分离 2024-08-08 18:19:58 +08:00
疯狂的狮子Li
c0ee3182e1 fix 修复 租户套餐导出路径错误问题 2024-08-08 18:19:18 +08:00
疯狂的狮子Li
9eb7b433b4 update 优化 类型报错问题 2024-08-02 13:53:48 +08:00
疯狂的狮子Li
9193f0b84a update 优化 切换租户后刷新首页 2024-08-02 09:59:14 +08:00
疯狂的狮子Li
076fc5deb1 update 优化 实现表格行选中切换 2024-08-02 09:55:51 +08:00
疯狂的狮子Li
58412035ad update 优化 使用 vueuse 重构 websocket 实现 2024-07-29 15:02:59 +08:00
疯狂的狮子Li
964db2dfce update 优化 使用 vueuse 重构 websocket 实现 2024-07-29 15:02:41 +08:00
疯狂的狮子Li
d58a75996e fix 修复 登出后重新登录 sse推送报错问题 2024-07-29 12:34:32 +08:00
疯狂的狮子Li
f5a5aaa255 reset 回滚 代码修改 采用其他方案 2024-07-29 12:32:05 +08:00
疯狂的狮子Li
1465a27a6e fix 修复 登出后重新登录 sse推送报错问题 2024-07-29 12:29:25 +08:00
疯狂的狮子Li
e5e43fe024 update 优化 删除无用代码 2024-07-27 22:10:22 +08:00
疯狂的狮子Li
6c49b47344 update element-plus 2.7.5 => 2.7.8
update vue 3.4.25 => 3.4.34
update vite 5.2.10 => 5.2.12
2024-07-27 15:08:13 +08:00
疯狂的狮子Li
358f11a0a3 reset 回滚 错误修复 2024-07-27 15:07:33 +08:00
疯狂的狮子Li
6a83ed2aad update 优化 代码生成器编辑页禁用缓存 防止同步后页面不更新问题 2024-07-27 14:15:19 +08:00
疯狂的狮子Li
e07c0b2b3a fix 修复 代码生成同步点击取消报错问题 2024-07-27 14:08:07 +08:00
疯狂的狮子Li
adadfcf8cb update 优化 调整默认推送使用SSE 2024-07-26 16:24:40 +08:00
疯狂的狮子Li
425386f6f4 add 增加 sse 推送功能 2024-07-26 16:06:17 +08:00
疯狂的狮子Li
ba24afce52
!131 ♥️发布 vue 版本 5.2.1 与 cloud 版本 2.2.0
Merge pull request !131 from 疯狂的狮子Li/dev
2024-07-09 03:02:34 +00:00
疯狂的狮子Li
93d3371768 ♥️发布 vue 版本 5.2.1 与 cloud 版本 2.2.0 2024-07-09 10:53:49 +08:00
疯狂的狮子Li
3f08ae6ac4 fix 修复 富文本编辑器 添加之后内容未清理问题 2024-07-02 16:51:03 +08:00
疯狂的狮子Li
cc6284d3ac fix 修复 字段命名错误 2024-07-01 12:52:19 +08:00
疯狂的狮子Li
142effd4f2
!130 feat: 动态创建组件实例时, 设置路由name为组件名 解决缓存问题
Merge pull request !130 from 玲娜贝er/dev
2024-06-30 08:13:16 +00:00
dap
e657a507e3 feat: 动态创建组件实例时, 设置路由name为组件名 解决缓存问题 2024-06-30 10:50:04 +08:00
疯狂的狮子Li
ebaec24213 update 优化 eslint 2024-06-28 10:44:13 +08:00
疯狂的狮子Li
7637582437 update 优化 eslint 2024-06-28 10:18:26 +08:00
疯狂的狮子Li
27d36f7970
!129 feat: 路由name重复检查
Merge pull request !129 from 玲娜贝er/dev
2024-06-26 04:02:28 +00:00
dap
762ebd4ede chore: 增加提示 2024-06-26 11:59:41 +08:00
dap
ad991e248a feat: 路由name重复检查 2024-06-26 11:34:40 +08:00
疯狂的狮子Li
d1b58f0aaa fix 修复 单词拼写错误 2024-06-24 14:59:46 +08:00
疯狂的狮子Li
1be1eaf7b4
!128 fix: 选人无法回显
Merge pull request !128 from 玲娜贝er/dev
2024-06-24 00:37:32 +00:00
dap
fbcc967b14 fix: 由于没有await 导致执行顺序不可控 2024-06-24 08:21:19 +08:00
疯狂的狮子Li
817c65f7e2
!126 fix: 进入审批页面会多次加载用户列表和部门等接口 进入点击取消之后也会重新加载接口
Merge pull request !126 from 玲娜贝er/dev
2024-06-21 04:31:25 +00:00
张代鹏
b6dcc62f9c refactor: 改为懒加载窗口 2024-06-21 12:07:19 +08:00
疯狂的狮子Li
abb4f543b9
!125 ♥️发布 vue 版本 5.2.0 与 cloud 版本 2.2.0
Merge pull request !125 from 疯狂的狮子Li/dev
2024-06-20 02:15:41 +00:00
疯狂的狮子Li
71f4d36c21 ♥️发布 vue 版本 5.2.0 与 cloud 版本 2.2.0 2024-06-20 10:15:08 +08:00
gssong
d1be442c6e fix 修复选着人员错误问题 2024-06-19 21:13:58 +08:00
疯狂的狮子Li
9ef7fd3844
!123 "types": ["element-plus/global"]层级错误,且element-plus按需引入不用配置tsconfig.json
Merge pull request !123 from zl/修复tsconfig.json
2024-06-19 06:41:11 +00:00
疯狂的狮子Li
fec61f9650 update 优化 clientid写死问题 2024-06-19 14:30:19 +08:00
疯狂的狮子Li
c206ab5b4a update 优化 三方登录不同域名问题 采用新方案 2024-06-19 14:29:44 +08:00
疯狂的狮子Li
fe1942c247 update 更换三方回调方案 2024-06-19 10:16:21 +08:00
疯狂的狮子Li
1f2add4b6b update 更换三方回调方案 2024-06-19 10:11:32 +08:00
疯狂的狮子Li
3b254cc16b update 增加 用户信息缓存增加租户id 2024-06-18 23:05:40 +08:00
疯狂的狮子Li
3e7c2f26fa update 增加 用户信息缓存增加租户id 2024-06-18 22:54:30 +08:00
疯狂的狮子Li
4143285ec6 fix 修复 缺少协议头问题 2024-06-18 19:08:51 +08:00
疯狂的狮子Li
72610ab194 update 优化 三方登录不同域名获取不到租户id问题 2024-06-18 18:44:27 +08:00
疯狂的狮子Li
3c713c9258 update element 2.7.2 => 2.7.5 2024-06-15 15:53:02 +08:00
gssong
f95f6e8390 update 优化审批按钮判断 2024-06-07 21:38:17 +08:00
疯狂的狮子Li
2c9c837c1b update 优化 请假天数计算不精确问题 2024-06-06 17:27:50 +08:00
zl
7904496df1
层级错误,且element-plus按需引入不用配置tsconfig.json
Signed-off-by: zl <11656279+xbbzjsj@user.noreply.gitee.com>
2024-06-06 08:53:59 +00:00
疯狂的狮子Li
15c3d84ca2
!122 修复单词拼写错误
Merge pull request !122 from LiYaoheng/dev
2024-06-06 06:27:36 +00:00
LiYaoheng
e8a641f3a3 fix 修复单词拼写错误 2024-06-06 14:19:55 +08:00
疯狂的狮子Li
e354db74a7
!121 ♥️发布 2.2.0-BETA 公测版本
Merge pull request !121 from 疯狂的狮子Li/dev
2024-06-06 03:00:23 +00:00
疯狂的狮子Li
61df97c4b9 update 优化 标识符错误 2024-06-06 10:59:20 +08:00
疯狂的狮子Li
75ecc4dd68 update 更改 关于mq说明 2024-06-04 15:00:40 +08:00
songgaoshuai
c467d95703 https://gitee.com/dromara/RuoYi-Cloud-Plus/issues/I9US1Q fix修复我的单据撤销,删除参数错误 2024-06-04 11:26:38 +08:00
gssong
3fead37924 add 添加流程记录版本信息 2024-06-03 21:33:12 +08:00
gssong
c8626b6893 remove 删除无用参数 2024-06-03 21:23:32 +08:00
gssong
38df345078 update 调整流程图预览校验 2024-06-03 21:04:42 +08:00
疯狂的狮子Li
212361dc94 update 优化 去除请假案例状态字段 2024-06-03 17:53:49 +08:00
疯狂的狮子Li
f237ee145a update 优化 去除请假案例状态字段 2024-06-03 15:47:51 +08:00
疯狂的狮子Li
291d4b0040
!120 update 调整注释错误
Merge pull request !120 from lu_ming/dev
2024-06-02 11:52:43 +00:00
can
64c56e9dd9 update 调整注释错误 2024-06-02 19:44:38 +08:00
gssong
57d87df589 update 调整驳回按钮加载 2024-06-02 00:21:47 +08:00
gssong
9de3f25f6a update 调整审批按钮加载 2024-06-01 22:05:45 +08:00
gssong
d98c2822d5 update 调整路由 2024-06-01 22:00:22 +08:00
gssong
58e6fdef78 update 优化流程实例接口全部按照业务id操作 2024-05-31 22:11:25 +08:00
疯狂的狮子Li
2c9daae153 update 更改 工作流 测试用例接口路径 2024-05-31 11:25:03 +08:00
疯狂的狮子Li
c2fdbc66b2 update 移除 表单构建菜单(没有可用组件 用处不大以后再考虑) 2024-05-29 18:36:46 +08:00
dap
57fd309907 fix: 类型报错 2024-05-29 09:32:49 +08:00
疯狂的狮子Li
7a335b3438 update 优化 删除未使用依赖 2024-05-21 10:01:25 +08:00
dap
83bbac303e fix: bpmn相关type第一次安装依赖&运行报错 2024-05-21 09:37:28 +08:00
疯狂的狮子Li
eb1b614eb1 fix 修复 部署路径错误 2024-05-20 11:45:08 +08:00
疯狂的狮子Li
a63543a5c7
!118 ♥️发布 5.2.0-BETA 公测版本
Merge pull request !118 from 疯狂的狮子Li/dev
2024-05-20 02:26:46 +00:00
疯狂的狮子Li
3585761b81 Merge branch 'ts' of gitee.com:JavaLionLi/plus-ui into dev
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2024-05-20 02:26:24 +00:00
疯狂的狮子Li
34290d8cad ♥️发布 5.2.0-BETA 公测版本 2024-05-20 10:21:35 +08:00
LiuHao
f367b49dd6 update 优化代码格式 2024-05-19 17:31:05 +08:00
LiuHao
7df347c1d4 remove 移除commit check 2024-05-18 23:02:45 +08:00
gssong
ea106e44be add 添加工作流菜单图标 2024-05-18 12:40:37 +08:00
gssong
b2e47f3938 update 优化模型保存位置,审批记录,请假申请按钮 2024-05-17 20:59:47 +08:00
疯狂的狮子Li
b8e0f018f0 update 优化 更改 首页关于调度中心说明 2024-05-17 17:17:53 +08:00
疯狂的狮子Li
4ee46819c1
!117 修复登录失效,重新登录丢失参数问题
Merge pull request !117 from 爱宇阳/dev
2024-05-17 03:50:38 +00:00
deary
0c620ef5b4 修复登录失效,再次登录丢失参数 2024-05-17 11:44:33 +08:00
疯狂的狮子Li
9b00aaff93 update 优化 删除无用页面 2024-05-17 10:00:25 +08:00
疯狂的狮子Li
b829867a5b
!115 feat: powerjob,easyretry => snailjob
Merge pull request !115 from dhb52/dev
2024-05-17 01:39:39 +00:00
dhb52
736225fbfe feat: powerjob,easyretry => snailjob 2024-05-17 01:04:13 +08:00
dap
3062c46b49 fix: 流程定义xml预览问题 & 重构代码 2024-05-16 08:18:54 +08:00
dap
ed66231d19 Merge branch 'dev' of https://gitee.com/JavaLionLi/plus-ui into dev 2024-05-15 11:35:02 +08:00
dap
3b8ecadc78 refactor: 流程定义-流程图片改为bpmn组件预览 2024-05-15 11:34:58 +08:00
疯狂的狮子Li
322e88d8e1 update 优化 调整字体大小 2024-05-11 20:00:53 +08:00
gssong
526ca728e1 update 修复模型选人参数异常,调整加签请求路径 2024-05-09 21:39:47 +08:00
疯狂的狮子Li
26c0cdaef6 update 重构 workflow 模块与 system 模块解耦 2024-05-09 15:10:15 +08:00
疯狂的狮子Li
e7dc8e94c7 update 优化 跟密码相关的默认前端关闭防重功能 2024-05-08 15:33:31 +08:00
疯狂的狮子Li
72ca7a1aae
!111 解决点击菜单时页面空白或者重新刷新整个页面的问题
Merge pull request !111 from 周旭湘/dev
2024-05-07 09:47:18 +00:00
周旭湘
907dc4efb4
update src/layout/components/AppMain.vue.
解决点击左边菜单时页面空白或者刷新整个页面的问题

Signed-off-by: 周旭湘 <3423729430@qq.com>
2024-05-07 09:39:43 +00:00
gssong
935a199f71 update 优化审批记录 2024-05-06 22:19:42 +08:00
gssong
a19ac2d4ca update 调整会签人员参数 2024-05-06 20:59:41 +08:00
dap
437bc936fd refactor: 部门选择和岗位逻辑 2024-05-06 13:23:27 +08:00
dap
0b8f48fb61 fix: 更新时有岗位会被赋值为空的bug 2024-04-30 22:46:10 +08:00
dap
5d641e5de4 fix: 用户管理-部门变化后需要重新选择岗位 2024-04-30 22:09:53 +08:00
dap
0d196e47e2 fix: 重置时清空左边部门树选中值 2024-04-30 22:04:55 +08:00
疯狂的狮子Li
012e70c7e4 update element-plus 2.7.2 2024-04-30 17:33:09 +08:00
疯狂的狮子Li
9243eee3c3 remove 删除 husky(没人用) 2024-04-26 15:49:20 +08:00
疯狂的狮子Li
c449fb60a5 update vite 5.2.10
update vue 3.4.25
2024-04-25 13:48:28 +08:00
疯狂的狮子Li
4660aa6e95
!108 update src/components/ImagePreview/index.vue.
Merge pull request !108 from 落叶橘橙/N/A
2024-04-25 02:16:33 +00:00
落叶橘橙
9968d14c39
update src/components/ImagePreview/index.vue.
图片预览功能 let real_src_list = props.src.split(',');会多出一个''对象,会导致图片浏览时多一个空白预览。增加一个判空。

Signed-off-by: 落叶橘橙 <wzsdch@qq.com>
2024-04-25 02:15:20 +00:00
疯狂的狮子Li
e2254651ca fix 修复 !pr107 遗留问题
update 优化 岗位下拉框样式问题
2024-04-24 23:46:05 +08:00
AprilWind
7ed5f33e7b !107 add 新增岗位编码与部门编码 并将岗位放到部门下
* add 新增获取岗位选择框列表
* update 岗位查询树表和单表相互undefined
* update 岗位查询增加单部门查询
* update 优化类别编码与后台一致性
* add 新增岗位部门树以及类别编码
* add 部门增加类别代码
2024-04-24 14:30:52 +00:00
LiuHao
175c4a48ce update 优化代码缩进 2024-04-23 13:14:02 +08:00
追梦稻草人Li
9bcc4d631b !106 [轻量级pr] add 新增用户选择角色时 可搜索功能
* update src/views/system/user/index.vue.
* add 新增角色可搜索
2024-04-23 01:50:07 +00:00
疯狂的狮子Li
861dc9fb16 update 优化 替换过期属性 2024-04-23 09:47:11 +08:00
gssong
8633a23d28 fix 修改设计器到期时间没有值问题 2024-04-21 16:58:01 +08:00
gssong
d67bd493c1 Merge branch 'dev' of https://gitee.com/JavaLionLi/plus-ui into dev 2024-04-21 16:50:01 +08:00
gssong
2d532d636a update 调整设计器选人 2024-04-21 16:49:47 +08:00
疯狂的狮子Li
e2bdae5bf2 update element-plus 升级 2.7.1 并适配代码 2024-04-20 19:13:35 +08:00
gssong
2df121072b fix 修改默认没有候选人与候选组时点击选择出现tag标签选中全部问题 2024-04-19 22:13:26 +08:00
gssong
7016888d5a remove 删除无用代码 2024-04-19 21:59:43 +08:00
gssong
3c34421bd2 update 删除认领可直接办理,格式化代码 2024-04-19 21:58:05 +08:00
疯狂的狮子Li
187ae83731
!105 update 当el-form的inline属性为true时,统一样式写法
Merge pull request !105 from Bleachtred/dev
2024-04-19 09:13:44 +00:00
疯狂的狮子Li
c4c9905a91 update 调整 select 宽度 2024-04-19 17:13:15 +08:00
bleachtred
219f3a7d6f update 设置el-select 的宽度默认为 240px 2024-04-19 16:52:40 +08:00
bleachtred
44837e975c update 当el-form的inline属性为true时,统一样式写法 2024-04-19 15:26:56 +08:00
AprilWind
8c6cf5bc43 !104 add 新增在线登录设备管理
* update 在线登录设备管理删除权限
* add 新增在线登录设备管理
2024-04-19 05:02:14 +00:00
疯狂的狮子Li
c21f0d7d77 update vue-router 升级 4.3.2 2024-04-18 18:16:53 +08:00
疯狂的狮子Li
8b6b624f6c fix 修复 全局替换样式重复问题 2024-04-18 17:10:44 +08:00
疯狂的狮子Li
03c736af82 fix 修复 全局替换样式重复问题 2024-04-18 17:06:30 +08:00
疯狂的狮子Li
7386e69033 fix 修复 全局样式导致组件全覆盖问题 依旧采用单组件声明 2024-04-18 14:02:43 +08:00
疯狂的狮子Li
2f60c96fbf fix 修复 全局样式导致组件全覆盖问题 依旧采用单组件声明 2024-04-18 14:01:58 +08:00
疯狂的狮子Li
45e1c46ce4
!103 update 更新一些内容
Merge pull request !103 from Bleachtred/dev
2024-04-18 05:45:12 +00:00
bleachtred
d7d3105c5c update 设置input固定宽度后,导致菜单图标组件IconSelect显示异常 2024-04-18 12:59:03 +08:00
bleachtred
4aa42f5c20 fix 角色必填*号 2024-04-18 11:29:57 +08:00
疯狂的狮子Li
c089f2497c update 升级前端依赖(定稿) 2024-04-18 10:45:21 +08:00
疯狂的狮子Li
e18dcbd86b
!102 [BUG]修复用户表单,角色为必填,却未标注*号
Merge pull request !102 from dzk/fix-userform
2024-04-18 02:13:25 +00:00
dzk
a541d61c0c 修复用户表单角色为非必填项的BUG 2024-04-17 23:49:07 +08:00
疯狂的狮子Li
4b19f55bce update 优化 el-select 与 el-input 全局样式 2024-04-17 19:40:34 +08:00
疯狂的狮子Li
b5042d13d2
!101 fix: 临时修复elementui新版本下拉框宽度问题
Merge pull request !101 from NicholasLD/N/A
2024-04-17 11:34:09 +00:00
NicholasLD
b444f2b8e2
fix: 临时修复elementui新版本下拉框宽度问题
Signed-off-by: NicholasLD <nicholasld505@gmail.com>
2024-04-17 11:24:58 +00:00
疯狂的狮子Li
6b982984ac fix 修复 el-select 展示不全问题 2024-04-17 19:01:49 +08:00
LiuHao
30f271359a fix 修复字典el-tag警告 2024-04-16 17:56:36 +08:00
LiuHao
9967a72e24 fix 修复el-tag标签类型不一致问题 2024-04-16 17:52:04 +08:00
LiuHao
efeff40f2e update 白屏问题待检测 2024-04-16 17:42:54 +08:00
LiuHao
2e299b58e2 update 增加预编译 2024-04-16 17:41:30 +08:00
LiuHao
1d7c3da86b update 回滚解决路由失效问题 2024-04-16 17:41:21 +08:00
LiuHao
5057976ad2 update 优化缩进 2024-04-16 16:05:43 +08:00
LiuHao
41f3d37db1 update 优化首页打开topNav不展开菜单问题 2024-04-15 14:00:39 +08:00
LiuHao
1fbc5afe75 update 优化暗黑模式,增加vxe的暗黑模式 2024-04-15 13:33:11 +08:00
LiuHao
b0541be0b8 fix 修复菜单搜索下方出现白色区域 2024-04-15 13:04:15 +08:00
LiuHao
d6803783ae update 固定值 也可输入表达式 2024-04-15 12:52:04 +08:00
LiuHao
945eec5418 update 优化bpmn位置 2024-04-15 12:02:40 +08:00
LiuHao
73db6deec3 fix 修复类型缺失 2024-04-15 10:40:47 +08:00
LiuHao
40a75dae31 fix 修复代码缩进. 2024-04-15 10:40:33 +08:00
LiuHao
64fb2899c9 fix 修复代码缩进,类型名称错误 2024-04-15 10:22:44 +08:00
LiuHao
9da3f1f2d7 update 增加类型 2024-04-15 09:42:46 +08:00
疯狂的狮子Li
70120a8f2f
!97 解决页面偶尔出现的白屏问题
Merge pull request !97 from 吴均/dev
2024-04-09 03:27:51 +00:00
wujun
6b4d756a9d 解决页面偶尔出现的白屏问题 2024-04-09 11:19:04 +08:00
gssong
905426ad45 update 修改流程定义删除 2024-04-08 22:43:37 +08:00
gssong
b4b0eba228 update 调整流程定义配置逻辑 2024-04-06 21:06:59 +08:00
gssong
9f73ea2d32 update 优化表单绑定逻辑,移除流程定义配置表单,添加模型复制 2024-04-06 11:21:17 +08:00
LiuHao
2d804c7ce0 Merge remote-tracking branch 'origin/dev' into dev 2024-04-05 14:16:38 +08:00
LiuHao
11e8e9d19a fix 修复代码缩进 2024-04-05 14:16:29 +08:00
dap
3e44c14286 Merge branch 'dev' of https://gitee.com/JavaLionLi/plus-ui into dev 2024-04-05 14:09:53 +08:00
dap
04f1347ddd update: bpmn设计器夜间模式适配 2024-04-05 14:09:50 +08:00
LiuHao
0442bd638d fix 修复代码缩进 2024-04-05 14:08:02 +08:00
dap
aeac77b90f chore: 拖动元素时的背景图 2024-04-04 20:41:58 +08:00
dap
b117a6f198 update: 流程预览 进行中动画效果 2024-04-04 14:19:49 +08:00
dap
e1b03258e8 fix: 租户选择框宽度和升级前保持一致 2024-04-04 13:55:45 +08:00
疯狂的狮子Li
c71eb21416 update 更新成员项目 2024-04-03 23:12:46 +08:00
gssong
c922ea3b9c add 添加委托 2024-04-03 20:42:05 +08:00
gssong
d76f2b857d add 添加流程版本 2024-04-02 20:53:29 +08:00
gssong
eec050a2dd update 调整监听新增label错误 2024-04-01 21:23:31 +08:00
gssong
b0087d1a50 #I96DTG update 类型下拉框和java类名下拉框没有联动 2024-04-01 20:59:52 +08:00
gssong
4752b4eb01 update 调整流程状态 2024-03-31 19:30:31 +08:00
gssong
2ea1807f34 add 添加表单配置 2024-03-31 15:34:54 +08:00
疯狂的狮子Li
5dfc25a493
!95 add 工作流挂节点路由表单
Merge pull request !95 from ken.wang/dev
2024-03-29 13:15:10 +00:00
wangzk
c5b3c121c9 add 工作流挂节点路由表单 2024-03-29 17:26:56 +08:00
疯狂的狮子Li
c417c6debe update 升级 element vite 版本 最低nodejs版本提升到18.18.0 2024-03-26 18:43:45 +08:00
LiuHao
f6727d80b8 update 升级依赖 2024-03-26 18:20:13 +08:00
gssong
ceb6243cd0 update 调整示例key 2024-03-24 15:16:44 +08:00
gssong
cd129aa949 update 路由跳转 2024-03-24 15:13:05 +08:00
gssong
d186c800f0 add 添加流程实例,全部待办表单查看 2024-03-22 23:42:30 +08:00
songgaoshuai
31f4219f3d fix修复已办参数传错 2024-03-22 11:32:58 +08:00
gssong
ad8565d29a update 调整我的发起,流程定义按钮 2024-03-21 21:49:34 +08:00
gssong
66a31b620b add 添加已办查看 2024-03-21 21:20:42 +08:00
gssong
e26f6423aa add 添加抄送查看 2024-03-21 21:19:02 +08:00
gssong
12461f4106 update 固定顶部按钮 2024-03-21 21:14:01 +08:00
gssong
58422616e2 remove 还原代码 2024-03-21 21:06:58 +08:00
gssong
f6abd4cf59 update 调整状态判断 2024-03-21 21:06:18 +08:00
gssong
f50ed6b2c5 add 添加流程表单配置 2024-03-21 21:02:41 +08:00
LiuHao
3dba22c47c fix 修复移动端下 无法展开菜单问题 2024-03-19 17:41:47 +08:00
LiuHao
e1289d0abb fix 修复面板因为min width原因收缩不全 2024-03-19 16:14:38 +08:00
LiuHao
9ea8b710ff update 预览流程图高度自适应 2024-03-19 16:02:42 +08:00
LiuHao
e889348562 update 面板宽度百分比 2024-03-18 14:27:43 +08:00
LiuHao
02daeead57 update 隐藏不用工具栏 2024-03-18 14:21:35 +08:00
LiuHao
4253b2afbb update 增加子流程多实例 2024-03-18 14:19:30 +08:00
LiuHao
0c39b593ce update 优化面板类型 2024-03-18 14:18:30 +08:00
LiuHao
8761392c85 update 优化任务面板 2024-03-18 14:18:04 +08:00
LiuHao
30cf3a2caa update 增加多实例常量 2024-03-18 14:17:48 +08:00
LiuHao
12458177be update 更新开始面板和泳道面板样式 2024-03-18 13:56:16 +08:00
LiuHao
b6415c21be update 新增子流程面板 2024-03-18 13:55:57 +08:00
LiuHao
bc4358f4eb update 流程部署支持多选 2024-03-18 12:19:52 +08:00
LiuHao
5dcfee4c07 update 流程部署支持多选 2024-03-18 11:52:44 +08:00
LiuHao
a9cd5684b2 update 新增预编译和翻译 2024-03-18 10:56:12 +08:00
LiuHao
1c0e614d7d update 新增池/参与者面板 2024-03-18 10:44:21 +08:00
gssong
00a7a8ce23 add 添加流程自由驳回节点 2024-03-17 18:26:22 +08:00
gssong
ade0b3e29e update 调整模型导出按钮位置 2024-03-16 22:02:45 +08:00
gssong
3a3f873834 update 调整模型zip导出 2024-03-16 22:01:35 +08:00
gssong
1edc953765 fix 修改已完成任务查看流程变量错误 2024-03-16 19:35:13 +08:00
疯狂的狮子Li
1383f5a7eb
!93 fix: if(captchaEnabled) => if(captchaEnabled.value)
Merge pull request !93 from dhb52/N/A
2024-03-15 01:36:21 +00:00
dhb52
e4f18452c7
fix: if(captchaEnabled) => if(captchaEnabled.value)
Signed-off-by: dhb52 <dhb52@126.com>
2024-03-14 16:42:00 +00:00
疯狂的狮子Li
fdf64a6f08
!90 feat: EasyRetry Server 扩展模块
Merge pull request !90 from dhb52/dev
2024-03-14 06:46:34 +00:00
疯狂的狮子Li
f46a333778
!89 【轻量级 PR】:update 调整导入模型选择流程类别方式(改为表单内下拉框)
Merge pull request !89 from 愿丶/N/A
2024-03-13 13:29:31 +00:00
dhb52
eb364873d2 EasyRetry Server 扩展模块 2024-03-13 01:18:49 +08:00
愿丶
7666f724df
update 调整导入模型选择流程类别方式(改为表单内下拉框)
Signed-off-by: 愿丶 <1319542051@qq.com>
2024-03-12 15:48:42 +00:00
gssong
f9b8922bed update 调整全部已办开始时间 2024-03-11 21:14:22 +08:00
gssong
fb94a4d79c update 调整已办列表,添加审批记录加载 2024-03-11 21:03:00 +08:00
疯狂的狮子Li
71047fdbfd update copyright 2024 2024-03-11 10:58:51 +08:00
疯狂的狮子Li
2cb9b3ea47 update 优化 事件标签改为中文 2024-03-11 10:45:08 +08:00
gssong
3c27c18889 add 添加查看流程变量 2024-03-09 13:41:20 +08:00
gssong
9defb9a669 remove 删除无用组件 调整修改办理人,已完成单据可查看审批记录等 2024-03-09 11:22:28 +08:00
gssong
8833eb205b add 添加终止任务 2024-03-09 11:10:19 +08:00
gssong
15129079d4 remove 删除无用代码 2024-03-08 22:49:47 +08:00
LiuHao
d1c199d4bf update 优化流程预览 2024-03-08 18:22:28 +08:00
LiuHao
97b4eef342 update 使用bpmnjs流程预览 2024-03-08 16:02:08 +08:00
LiuHao
1dd9983f0f update 流程图和审批信息分开展示 2024-03-08 15:59:27 +08:00
LiuHao
b8eb2dcb40 update 增加默认导出 2024-03-08 15:00:01 +08:00
LiuHao
3b4f171d9f update 优化类型 2024-03-08 14:56:44 +08:00
LiuHao
de33d4aaee update 保存增加loading、增加预编译 2024-03-08 14:16:27 +08:00
gssong
803d44cac0 add 添加转办 2024-03-07 22:16:42 +08:00
gssong
cc293536e2 add 添加审批加签 减签 2024-03-07 21:54:47 +08:00
gssong
5f6057253f remove 删除无用打印 2024-03-07 21:19:04 +08:00
gssong
d50c90afd1 fix 修复设计器无法选人问题,修复抄送打开弹出选中全部人员问题 2024-03-07 21:18:08 +08:00
songgaoshuai
6f9851a4e5 fix 修复无法编辑设计器问题 功能未完成先注释掉 2024-03-07 16:16:28 +08:00
疯狂的狮子Li
e7ff829502 update 优化 工作流代码与接口命名 2024-03-07 14:23:24 +08:00
疯狂的狮子Li
0108df1334 !88 合并flowable工作流功能
* merge 合并dev
* add 添加抄送查询
* add 添加我的已办
* add 添加抄送
* add 添加附件下载
* update 优化类型
* Merge remote-tracking branch 'origin/future/flowable' into future/flowable
* fix 修复 流程设计器打包部署报错问题
* add 添加审批附件上传
* update 修复固定值未在xml显示问题
* update 修复跳转条件回显Object问题
* update 优化面板文件名称
* update 调整key
* remove 移除旧设计器,添加xml保存
* update 增加任务面板提示
* update 优化xml预览和svg预览
* update 优化xml预览和svg预览
* update 优化模型设计
* update 优化设计器
* update 优化设计器
* update 优化设计器
* update 删除旧设计器
* update 删除console.log
* add 添加模型接口
* update 优化预览xml和svg样式被修改问题
* update 优化属性面板,增加展开动画
* update 去除开发模式
* update 优化任务栏样式
* update 优化图标渲染样式
* update 增加BpmnFactory类型
* update 增加BpmnFactory
* update 移除users和group
* update 移除无用类型
* update 优化页面类型
* update 去除多余属性
* update 完善流程线
* update 增加复杂网关
* update 完善流程
* update 完善网关
* update 优化网关汉化
* update 优化过期时间选择
* update 支持多实例
* update 增加类容提示
* update 支持选择组
* update 新增角色api
* update 优化roleSelect 选中未确定,再次打开还保留选中的问题
* update 优化userSelect 选中未确定,再次打开还保留选中的问题
* update 优化userSelect 选中未确定,再次打开还保留选中的问题
* update 去掉modeler store多余属性 bpmnModel
* update 优化属性面板,当面板未选中时默认展示流程面板
* update 优化TaskPanel类型,去掉roles属性
* update 优化用户api
* update 优化用户选择器
* update 优化执行监听器
* update 优化任务监听器
* update 优化usePanel方法
* update 选人优化
* update 增加扩展节点信息
* update 增加usePanel默认方法
* update 去除处理事件
* update 扩展flowable  userinfo属性
* update 全局modeler 改为非响应式
* update 增加hooks方法
* update 修改命名
* update 修改面板formData来源
* update 重写用户任务面板选择逻辑
* update 重写用户任务面板选择逻辑
* update 修改用户选择组件获取数据逻辑
* update 修改枚举类型
* update 修改默认配置列
* update 增加修改节点方法
* update 调整预览窗口大小
* update 优化用户选择组件 返回值
* update 优化用户选择组件
* update 新增通过ids 获取用户信息
* update 重写task面板选人 未完成
* update 升级用户选择 支持多选配置
* update 升级bpmnjs依赖版本
* update 增加useDialog类型
* update 调整全局样式
* update 代码高亮设置
* update 优化领用,归还加载
* update 增加选择角色
* update  新增角色选择组件
* update 新增过期时间选择组件
* update 调整任务面板样式
* update  调整全局dialog header 增加分割线
* update 代码高亮设置
* update  调整面板位置
* update 封装用户选择组件
* update 移除所有的节点描述
* update 删除分类
* update  调整面板位置
* update  修改命名,增加自定义渲染
* update  修改命名,增加自定义渲染
* update 增加 Element类型定义
* update 调整样式
* update 移除bpmn panel依赖,升级bpmn.js依赖到最新,修改汉化包
* update 调整类型声明文件
* update 调整类型声明文件
* update 优化面板工具
* update 优化面板工具
* Merge remote-tracking branch 'origin/future/flowable' into future/flowable
* update 优化面板工具
* Merge branch 'future/flowable' of https://gitee.com/JavaLionLi/plus-ui…
* add 添加修改办理人
* update 优化面板工具
* update 初始化流程数据
* Merge remote-tracking branch 'origin/future/flowable' into future/flowable
* add 流程设计面板
* update 调整初始化xml
* add 任务面板
* add 新增bpmn.js
* update 优化request请求类判断请求头方式
* update 流程定义预览 优化
* update 流程定义预览 优化
* update 去掉console.log
* update 优化工作流代码
* fix 修复待办任务 重置查询条件失效问题
* add 增加待办任务 接口类型,优化页面
* add 增加vite 启动预编译css
* fix 修复i18n无感刷新问题
* Merge branch 'dev' into future/flowable
* update 调整选择请假事件
* Merge branch 'dev' into future/flowable
* 同步dev代码
* Merge branch 'dev' into future/flowable
* 合并dev
* remove 设计器无用代码 调整请假查询
* update 调整请假申请
* update 移动请假表单包结构,调整设计器选择引用表单请求错误
* remove 移除动态表单
* update 调整流程办理
* Merge branch 'dev' into future/flowable
* Merge branch 'dev' into future/flowable
* Merge branch 'dev' into future/flowable
* Merge branch 'dev' into future/flowable
* 合并
* update 调整请假申请流程提交
* update 修改业务单据流程提交
* update 调整业务单据流程提交
* 优化代码
* 优化工作流代码缩进
* 项目格式化配置修改
* 调整代码缩进
* Merge branch 'ts' into future/flowable
* add 添加动态表单提交流程
* add 添加动态表单单据
* add 新增流程定义与表单关联
* update 调整点击左侧部门查询人员,部门刷新问题
* update 调整按钮图标
* 调整错别字
* update 调整流程定义图片预览
* add 添加流程实例迁移版本
* fix 修复我的单据无法提交问题
* Merge branch 'ts' into future/flowable
* remove 还原代码后端解决
* update 流程设计器中分配发起人变量错误,先移除
* fix 修复设计器无法编辑问题
* update 调整设计器请求头
* Merge branch 'ts' into future/flowable
* Merge branch 'ts' into future/flowable
* add 添加流程定义历史列表
* update 审批记录v2改为v3
* update 调整请假必填项
* add 添加请假申请示例,添加流程定义文件部署
* update 移除流程表单 formConfig 属性,表单配置信息都放一起便于使用。
* add 添加任务加签,减签
* update 调整流程作废
* update 优化流程状态
* add 添加任务驳回
* add 添加查询当前租户所有待办,已办任务
* add 增加审批意见
* add 添加流程办理弹窗确认组件
* add 添加任务作废理由
* update 调整流程实例,流程定义检索
* add 添加我的单据页面
* add 添加任务归还认领
* add 添加流程实例,流程定义分类查询
* add 添加模型分类查询
* add 添加流程分类
* Merge remote-tracking branch 'origin/future/flowable' into future/flowable
* add 添加流程表单管理页面
* add 集成vForm动态表单组件
* update xml调整超出滚动
* add 添加已办列表
* add 添加单据状态
* update 优化流程实例删除
* fix 修复流程实例查询挂起状态错误
* update 调整流程实例挂起激活状态
* add 添加流程实例列表
* update 调整流程定义弹窗提示
* add 添加流程定义列表,添加流程图,xml预览,添加简单流程启动,办理
* 调整审批记录悬浮逻辑
* 删除无用代码
* add 添加节点悬浮信息
* 调整流程预览
* 调整流程追踪
* add 添加审批记录
* add 模型设计的types
* update 修改排版
* add lang=ts
* update 修改ele的废弃api
* fix调整审批记录图片不显示问题
* add 添加任务待办,流程图
* 调整设计器关闭
* add 添加待办
* remove 删除无用代码
* update types
* 添加模型token验证
* 隐藏设计器验证按钮,隐藏表单,案例,应用程序等
* 添加模型部署
* 添加画图接口token,优化画图接口
* 添加工作流模型新增,修改,查询,删除,画图工具
2024-03-05 14:57:51 +00:00
疯狂的狮子Li
542f73f0e6 update 优化 支持全局开启或关闭接口加密功能 2024-03-04 14:18:21 +08:00
疯狂的狮子Li
5cb40abe18 update 优化 密码校验策略增加非法字符限制 2024-03-04 10:05:47 +08:00
疯狂的狮子Li
26cfa7afc4
!84 图片上传组件增加压缩支持
Merge pull request !84 from 缝合怪/dev
2024-02-23 07:24:31 +00:00
疯狂的狮子Li
df1a84d5ae
!86 bugfix: 修复文件预览大写后缀预览时效的问题
Merge pull request !86 from 北桥/dev
2024-02-23 07:23:49 +00:00
这夏天依然平凡
5b991be4c2 !87 修改 el-dialog 默认点击遮照为不关闭
* update 修改 el-dialog 默认点击遮照为不关闭
2024-02-23 07:23:20 +00:00
北桥
34c0d2d277 bugfix: 修复文件预览大写后缀不展示的问题 2024-02-02 13:43:16 +08:00
LiuHao
b2f00c4b71 add 增加全局角色选择组件 2024-01-26 09:59:32 +08:00
LiuHao
63ba90cc10 add 增加全局用户选择组件 2024-01-26 09:59:23 +08:00
LiuHao
3b18a476b7 add hooks - useDialog 2024-01-26 09:59:05 +08:00
LiuHao
15243ab713 Merge remote-tracking branch 'origin/dev' into dev 2024-01-26 09:58:09 +08:00
LiuHao
b4cc7b3de0 add 引入vxe-table依赖支持 2024-01-26 09:58:00 +08:00
fengheguai
fe3874396d 图片上传组件增加压缩功能支持,可自行开关 2024-01-25 12:50:45 +08:00
疯狂的狮子Li
fdf885c261
!82 修复 DictTag组件,当未找到匹配的数据时,不会显示value
Merge pull request !82 from lee/bugfix/DictTag_Unmatch
2024-01-18 09:39:29 +00:00
LiuHao
7b7377fa1b update 优化request请求类判断请求头方式 2024-01-16 09:51:51 +08:00
文兵 李
0c56f87e06 foreach中return并不会使其跳出循环,导致这个计算属性一直都会是false 2024-01-15 22:59:22 +08:00
疯狂的狮子Li
b783b8d991 update 全依赖版本升级 2024-01-14 22:30:00 +08:00
LiuHao
4ea7376dbc fix 修复i18n无感刷新问题 2024-01-11 15:26:37 +08:00
LiuHao
5910032908 Merge remote-tracking branch 'origin/dev' into dev 2024-01-11 14:27:58 +08:00
LiuHao
024783588e update 升级@intlify/unplugin-vue-i18n版本依赖
update i18n使用方法。
add 新增i18n vite插件。
2024-01-11 14:27:46 +08:00
疯狂的狮子Li
acba493c94
!80 JustAuth 整合 TopIam 单点登录
Merge pull request !80 from 马铃薯头/dev
2024-01-08 16:05:47 +00:00
xlsea
7073acb3ef 社交登录整合 TopIam 2024-01-08 11:48:56 +08:00
疯狂的狮子Li
075c02b8c3 update 优化 使用翻译注解简化用户查询 调整用户查询逻辑 2024-01-06 20:58:54 +08:00
ahao
31da01bdd1 fix https://gitee.com/dromara/RuoYi-Vue-Plus/issues/I8TMAI 2024-01-06 17:27:01 +08:00
疯狂的狮子Li
dfdcee9b95
!79 update 富文本组件,修复两个组件上传图片位置错乱问题
Merge pull request !79 from 抓蛙师/N/A
2024-01-05 14:51:03 +00:00
抓蛙师
d3b630076a
update 富文本组件,修复两个组件上传图片位置错乱问题
Signed-off-by: 抓蛙师 <770492966@qq.com>
2024-01-05 14:50:27 +00:00
疯狂的狮子Li
173c723c7c fix 修复 富文本编辑器 单页面多实例图片胡乱问题 2024-01-05 18:39:32 +08:00
ahao
595a521a3c update issues -> https://gitee.com/dromara/RuoYi-Vue-Plus/issues/I8LXAX 2024-01-05 17:15:45 +08:00
ahao
d08f14d86d update 修改对Volar支持 2024-01-05 14:37:22 +08:00
ahao
b112b793d5 fix 修复eslint 警告 2024-01-05 14:14:32 +08:00
ahao
6432d165c7 update 修复启动弹出cjs废弃警告 2024-01-05 12:06:10 +08:00
ahao
e5772cb63c update 移除cjs 2024-01-05 11:42:55 +08:00
ahao
bb696b300f update 升级依赖 2024-01-05 11:42:36 +08:00
疯狂的狮子Li
14f6a214f2
!75 fix: 修复vscode全局属性ts爆红问题
Merge pull request !75 from dhb52/N/A
2024-01-03 03:41:05 +00:00
dhb52
bbcedd02ba
fix: 修复vscode全局属性ts爆红问题
参照vuejs官方文档,[扩展全局属性](https://cn.vuejs.org/guide/typescript/options-api.html#augmenting-global-properties),

```ts
declare module 'vue' {
  interface ComponentCustomProperties {
    $http: typeof axios
    $translate: (key: string) => string
  }
}
```

Signed-off-by: dhb52 <dhb52@126.com>
2024-01-03 03:40:39 +00:00
ahao
abf2777b2e fix 修复 页面警告 2023-12-27 14:28:04 +08:00
ahao
3922c16601 fix 修复 vue 类型识别问题 2023-12-27 12:12:51 +08:00
ahaos
321f21c498 !73 修复全局属性找不到的问题
* Merge remote-tracking branch 'origin/dev' into dev
* fix 修复全局属性找不到的问题
* fix 修复变量问题
* fix 修复变量问题
* Merge remote-tracking branch 'origin/dev' into dev
* update 依赖升级
* update 依赖升级
* Merge remote-tracking branch 'origin/dev' into dev
* 升级依赖
* Merge remote-tracking branch 'origin/ts' into ts
* 升级依赖
* Merge branch 'dev' of gitee.com:JavaLionLi/plus-ui into ts
* 升级依赖
* !61 fix: 删除重复环境变量ElUploadInstance
* fix: 删除重复环境变量ElUploadInstance
2023-12-26 10:04:35 +00:00
疯狂的狮子Li
085ce4cf43 update 优化 更改客户端状态接口 使用clientId传参 2023-12-26 00:47:59 +08:00
疯狂的狮子Li
c5daf629d9 update 优化 通知公告提交提示 2023-12-23 23:13:34 +08:00
疯狂的狮子Li
20b7819f11 update 优化 ts检查改为非严格 提高友好型降低开发难度 2023-12-23 20:43:58 +08:00
疯狂的狮子Li
8b36cac09d update 升级前端依赖版本 2023-12-23 20:35:55 +08:00
疯狂的狮子Li
0e99163f0c update 升级前端依赖版本 2023-12-23 20:30:28 +08:00
疯狂的狮子Li
772885de35 update 优化 websocket 代码实现 2023-12-23 19:49:17 +08:00
疯狂的狮子Li
1d557a24f9 update 优化 ws开关改为常开(vite5修复了崩溃bug) 2023-12-23 19:45:47 +08:00
疯狂的狮子Li
597f2b4461 fix 修复 websocket 非index页面刷新无法重连问题 2023-12-23 19:38:34 +08:00
疯狂的狮子Li
cc9b67d467
!72 发布 vue 版本 5.1.2 与 cloud 版本 2.1.2
Merge pull request !72 from 疯狂的狮子Li/temp
2023-12-22 05:26:26 +00:00
疯狂的狮子Li
70a3348954 🧨发布 vue 版本 5.1.2 与 cloud 版本 2.1.2 2023-12-22 13:21:04 +08:00
疯狂的狮子Li
2c95f86963 🧨发布 vue 版本 5.1.2 与 cloud 版本 2.1.2 2023-12-22 13:20:44 +08:00
疯狂的狮子Li
1272e8fe7d fix 修复 append-to-body 编写错误 2023-12-20 14:44:50 +08:00
疯狂的狮子Li
3204aa8461
!71 update src/views/system/dept/index.vue.
Merge pull request !71 from Ai3_刘小龙/N/A
2023-12-20 06:28:20 +00:00
Ai3_刘小龙
5d44f9e231
update src/views/system/dept/index.vue.
append-to-body

Signed-off-by: Ai3_刘小龙 <wisty0317@163.com>
2023-12-20 06:26:49 +00:00
ahaos
1d5133b695 !69 修复升级依赖带来的类型问题
* fix 修复变量问题
* Merge remote-tracking branch 'origin/dev' into dev
* update 依赖升级
* update 依赖升级
* Merge remote-tracking branch 'origin/dev' into dev
* 升级依赖
* Merge remote-tracking branch 'origin/ts' into ts
* 升级依赖
* Merge branch 'dev' of gitee.com:JavaLionLi/plus-ui into ts
* 升级依赖
* !61 fix: 删除重复环境变量ElUploadInstance
* fix: 删除重复环境变量ElUploadInstance
2023-12-14 08:17:12 +00:00
疯狂的狮子Li
031d83828a update 代码规范化 2023-12-14 00:44:12 +08:00
疯狂的狮子Li
0541af5abb fix 修复 部分问题 2023-12-14 00:35:00 +08:00
疯狂的狮子Li
1f71044cff fix 修复 部分问题 2023-12-14 00:25:54 +08:00
ahaos
f32a7105c3 !68 修复升级依赖带来的问题
* Merge remote-tracking branch 'origin/dev' into dev
* 升级依赖
* Merge remote-tracking branch 'origin/ts' into ts
* 升级依赖
* Merge branch 'dev' of gitee.com:JavaLionLi/plus-ui into ts
* 升级依赖
* !61 fix: 删除重复环境变量ElUploadInstance
* fix: 删除重复环境变量ElUploadInstance
2023-12-13 10:35:55 +00:00
ahaos
b06f6a316b !64 版本升级
* Merge branch 'dev' of gitee.com:JavaLionLi/plus-ui into ts
* 升级依赖
* !61 fix: 删除重复环境变量ElUploadInstance
* fix: 删除重复环境变量ElUploadInstance
2023-12-13 01:01:52 +00:00
NickLuo
58d7e50de3 !63 关闭动态路由tab页签时不清理组件缓存
* 动态路由页面关闭时不清理组件缓存,避免清理已打开的多个路由页面缓存
2023-12-13 00:55:46 +00:00
疯狂的狮子Li
c045276a7c update 优化 明确打包命令 2023-12-08 18:04:02 +08:00
棉花
6a7ec81168 fix: 删除重复环境变量ElUploadInstance
Signed-off-by: 棉花 <12559203+radish-hi_0@user.noreply.gitee.com>
2023-12-08 17:55:11 +08:00
疯狂的狮子Li
183e0e9212
!61 fix: 删除重复环境变量ElUploadInstance
Merge pull request !61 from 棉花/N/A
2023-12-08 09:53:55 +00:00
疯狂的狮子Li
c020c1affc update 优化 用户头像 img 变量无确定类型问题 2023-12-08 17:01:19 +08:00
疯狂的狮子Li
9673380f60 update 优化 细化oss配置管理权限控制 2023-12-07 14:52:33 +08:00
疯狂的狮子Li
9b28d14bc3 fix 修复 在线用户 强推按钮点击取消控制台警告问题 2023-12-06 00:18:31 +08:00
棉花
01a4dd0b45
fix: 删除重复环境变量ElUploadInstance
Signed-off-by: 棉花 <12559203+radish-hi_0@user.noreply.gitee.com>
2023-12-05 12:57:44 +00:00
疯狂的狮子Li
e1023bb331 update 优化 代码中存在的警告 2023-11-30 11:13:29 +08:00
疯狂的狮子Li
5c701801db update 优化 前端白名单页面放行逻辑 2023-11-29 16:02:37 +08:00
疯狂的狮子Li
9b4692b625
!59 响应加密功能
Merge pull request !59 from MichelleChung/dev
2023-11-27 02:59:00 +00:00
疯狂的狮子Li
aaec0f7bfe fix 修复 字典使用 default 样式报警告问题 2023-11-27 10:34:42 +08:00
疯狂的狮子Li
25e2e0e018 update 优化 页面关于权限标识符说明 2023-11-23 16:50:31 +08:00
疯狂的狮子Li
5165541780 update 优化 开发环境默认关闭ws 因vite的bug导致如ws无法连接则会崩溃 2023-11-22 16:22:15 +08:00
Michelle.Chung
b3c1b95437 add 新增响应解密私钥 ;
add 新增 crypto#decryptBase64 Base64解码方法 ;
update 更新响应拦截器增加响应解密逻辑 ;
2023-11-20 19:27:03 +08:00
疯狂的狮子Li
d84fee9319
!58 修复vite环境变量类型原因导致websocket关闭失效问题
Merge pull request !58 from Lau/N/A
2023-11-16 04:24:52 +00:00
Lau
d034236ce3
fix: 修改环境变量类型原因导致websocket无法关闭问题
Signed-off-by: Lau <1807121535@qq.com>
2023-11-16 03:25:35 +00:00
疯狂的狮子Li
9e89ab5bae
!57 发布 vue 版本 5.1.1 与 cloud 版本2.1.1
Merge pull request !57 from 疯狂的狮子Li/dev
2023-11-14 03:11:07 +00:00
疯狂的狮子Li
6e6062e824 😴发布 vue 版本 5.1.1 与 cloud 版本2.1.1 2023-11-14 10:51:12 +08:00
疯狂的狮子Li
35bebf403c update 适配 websocket在https下的连接方式 2023-11-13 13:02:09 +08:00
疯狂的狮子Li
0a8c33c3cb fix 修复 五级路由缓存无效问题 2023-11-10 15:59:09 +08:00
疯狂的狮子Li
8a7de17b58 fix 修复 内链iframe没有传递参数问题 2023-11-10 11:35:40 +08:00
疯狂的狮子Li
f65eb2aee5
!55 绑定第三方帐号参数“wechar”更正为“wechat”
Merge pull request !55 from scmiot/dev
2023-11-07 01:30:47 +00:00
scmiot
efb53d4bcb
!1 绑定第三方帐号参数“wechar”更正为“wechat”
Merge pull request !1 from scmiot/N/A
2023-11-04 22:51:31 +00:00
scmiot
ad2134f07d
绑定第三方帐号参数“wechar”更正为“wechat”
Signed-off-by: scmiot <10322731+scmiot@user.noreply.gitee.com>
2023-11-04 08:46:06 +00:00
疯狂的狮子Li
caa9d0fcdc fix 修复 环境变量书写错误 2023-11-03 22:40:18 +08:00
疯狂的狮子Li
b829ba4aa0 fix 修复 websocket 初始化无法连接进程死掉问题(vue代理问题) 2023-11-03 18:36:11 +08:00
疯狂的狮子Li
a232437abc update 优化 !pr50 bug与代码实现 2023-11-02 14:00:48 +08:00
疯狂的狮子Li
f2372d3243 update 优化 !pr50 bug与代码实现 2023-11-02 13:53:44 +08:00
三个三
a8a334b3c3 !50 add 新增 前端接入websocket接收消息
*  add 新增 前端接入websocket接收消息
2023-11-02 04:36:31 +00:00
疯狂的狮子Li
1e3f18ce22
!54 update 优化表格列的显示与隐藏小组件
Merge pull request !54 from bestrevens/dev
2023-11-01 04:09:35 +00:00
疯狂的狮子Li
631f338be2 fix 修复 用户注册缺失 clientid 问题 2023-11-01 10:46:42 +08:00
bestrevens
bf977fe00a
update 优化表格列的显示与隐藏小组件
优化表格列的显示与隐藏小组件,解决小组件之间距离间隔不一样的问题

Signed-off-by: bestrevens <201840026@qq.com>
2023-10-31 08:54:22 +00:00
疯狂的狮子Li
5bc7044032 update 优化 补全操作日志部门数据 2023-10-27 22:44:05 +08:00
疯狂的狮子Li
6ad0ed5316 update 优化 去掉多余的参数 2023-10-26 17:02:12 +08:00
疯狂的狮子Li
ccb2ecc5ee update 更新 表单构建不能使用说明 2023-10-26 17:01:38 +08:00
疯狂的狮子Li
ec0cb472df update 优化 去掉多余的参数 2023-10-25 23:05:32 +08:00
疯狂的狮子Li
cd0a459c2b update 更新 表单构建不能使用说明 2023-10-25 16:21:21 +08:00
疯狂的狮子Li
18fea86a2c
!53 更新登录日志以及在线用户展示信息
Merge pull request !53 from MichelleChung/dev
2023-10-23 12:46:48 +00:00
Michelle.Chung
66bfff450c update 更新 logininfor/index, online/index 字段显示 (客户端, 设备类型) ; 2023-10-23 20:32:38 +08:00
疯狂的狮子Li
ec34c759ec
!52 fix 优化表格列的显示与隐藏小组件不显示tip和浏览器告警
Merge pull request !52 from bestrevens/ts
2023-10-16 07:36:23 +00:00
bestrevens
c1c5ea5e9d
fix 优化表格列的显示与隐藏小组件不显示字段和告警
fix 优化表格列的显示与隐藏小组件不显示字段和告警

Signed-off-by: bestrevens <201840026@qq.com>
2023-10-16 07:30:14 +00:00
疯狂的狮子Li
6fe269efc7 fix 修复 !pr47 导致的打包异常 2023-10-16 15:13:27 +08:00
疯狂的狮子Li
920e079727 update 优化 富文本Editor组件检验图片格式 2023-10-09 12:00:15 +08:00
疯狂的狮子Li
a2f13185e1 fix 修复 HeaderSearch组件跳转query参数丢失问题 2023-10-09 11:57:22 +08:00
疯狂的狮子Li
078bb50130 update vue-quill 1.1.0 => 1.2.0 2023-10-09 11:47:29 +08:00
疯狂的狮子Li
4854d8df00 update 优化 操作日志列表新增IP地址查询 2023-10-09 11:46:53 +08:00
疯狂的狮子Li
ecf062605d update 优化 菜单管理类型为按钮状态可选 2023-10-09 11:41:53 +08:00
疯狂的狮子Li
b989b07121 update 优化 用户初始密码从参数配置查询 2023-10-09 11:19:32 +08:00
疯狂的狮子Li
bf957f06a0
!51 update 优化 通过参数键名获取键值接口的返回体
Merge pull request !51 from David Wei/update/config_response
2023-10-08 08:56:00 +00:00
David Wei
aed8c89ded update 优化 通过参数键名获取键值接口的返回体 2023-10-08 16:05:58 +08:00
疯狂的狮子Li
4085811d24
!48 修复#I8550V
Merge pull request !48 from ahaos/ts
2023-09-28 16:51:40 +00:00
ahao
fe384a3020 fix #I8550V https://gitee.com/dromara/RuoYi-Vue-Plus/issues/I8550V 2023-09-29 00:06:57 +08:00
ahaos
c6f3cd068e
!47 优化表格列的显示与隐藏小组件
Merge pull request !47 from 森爷/ts
2023-09-28 14:15:14 +00:00
DESKTOP-IGCH756\PC
99a6b56233 优化表格列的显示与隐藏小组件 2023-09-28 14:58:34 +08:00
疯狂的狮子Li
8ed32775cb
!44 fix 个人信息修改密码接口隐藏新旧密码参数明文
Merge pull request !44 from Bleachtred/ts
2023-09-26 08:06:46 +00:00
bleachtred
395db813b5 fix 个人信息修改密码接口,隐藏新旧密码参数明文 2023-09-25 15:29:32 +08:00
疯狂的狮子Li
ab1a7204fa update 优化 页面输入框样式 2023-09-17 15:53:25 +08:00
疯狂的狮子Li
92b2b489a4 fix 修复 自定义字典样式不生效的问题 2023-09-14 17:22:36 +08:00
疯狂的狮子Li
956d2ad495 update 优化 !pr40 代码结构 2023-09-09 11:44:56 +08:00
疯狂的狮子Li
cb6cbc4f40
!40 优化字典标签支持数组和多标签
Merge pull request !40 from 抓蛙师/ts
2023-09-09 03:42:40 +00:00
抓蛙师
14538ce399 优化字典标签支持数组和多标签 2023-09-08 18:35:17 +08:00
疯狂的狮子Li
6c16d023f4 fix 修复 login 页面 loading 未关闭问题 2023-09-08 12:28:09 +08:00
331 changed files with 34255 additions and 10255 deletions

View File

@ -0,0 +1,32 @@
---
name: frontend-api-types
description: 前端 API 与类型定义专家。用于 plus-ui 前端项目中的 src/api 层、types.ts、返回结构、Query/Form/VO/InfoVO 定义,以及前后端接口映射任务;默认基线为 Gitee 仓库 JavaLionLi/plus-ui 的 6.X-Vue 分支。
---
你负责 plus-ui 前端项目中的 API 层和类型定义。
基线仓库:`https://gitee.com/JavaLionLi/plus-ui`
默认分支:`6.X-Vue`
远端引用必须同时标记仓库、分支和文件路径;不要写本机绝对路径。
## 核心原则
1. 先看当前模块已有 `src/api/<module>/<business>`
2. API 路径、返回类型、命名风格与当前模块保持一致。
3. 能明确写出类型时,不要偷懒用 `any`
4. 如果当前模块已有 `export default { ... }`,继续保持一致。
## 重点关注
- `Query`
- `VO`
- `Form`
- `InfoVO`
- `AxiosPromise<PageResult<T>>`
- 详情接口与列表接口返回结构
## 自检
- API 路径是否与后端一致
- 类型是否覆盖接口真实结构
- 是否不必要地把类型写宽了

View File

@ -0,0 +1,22 @@
---
name: frontend-crud-coding
description: 前端总入口。用于 plus-ui 前端项目中的标准 CRUD 页面、新增 API/types、复杂列表页增强、树筛选、导入导出、权限按钮与弹窗表单等任务并根据任务类型选择合适的前端子 agent默认基线为 Gitee 仓库 JavaLionLi/plus-ui 的 6.X-Vue 分支。
---
你是 plus-ui 前端项目的总入口 agent。
基线仓库:`https://gitee.com/JavaLionLi/plus-ui`
默认分支:`6.X-Vue`
远端引用必须同时标记仓库、分支和文件路径;不要在 agent 文档中写本机绝对路径。
先判断任务类型,再按下面规则处理:
1. 如果是新增标准 CRUD 页面、补 `src/api`、`types.ts`、`index.vue`,优先使用 `frontend-crud-page.md`
2. 如果是修改已有列表页、增强导入导出、树筛选、更多菜单、状态切换,优先使用 `frontend-page-enhancement.md`
3. 如果只改接口层和类型定义,优先使用 `frontend-api-types.md`
通用要求:
- 先读当前目录下最近似页面和 API再动代码。
- 冲突时优先相信当前项目真实页面,其次是公共组件和工具,再其次才是 plus-ui Gitee 仓库 `6.X-Vue` 分支的 `gen` 模板。
- 默认直接产出可落地代码,而不是只给抽象建议。

View File

@ -0,0 +1,41 @@
---
name: frontend-crud-page
description: 前端标准 CRUD 页面专家。用于 plus-ui 前端项目中的新建列表页、弹窗表单页、标准 API/types/index.vue 骨架,以及 gen 模板到项目风格的落地任务;默认参考 Gitee 仓库 JavaLionLi/plus-ui 的 6.X-Vue 分支。
---
你负责 plus-ui 前端项目中的标准 CRUD 页面实现。
基线仓库:`https://gitee.com/JavaLionLi/plus-ui`
默认分支:`6.X-Vue`
远端模板引用必须同时标记仓库、分支和路径,例如 `branch=6.X-Vue, path=gen/index.vue.ftl`;不要写本机绝对路径。
## 核心原则
1. 先看当前模块最近似页面。
2. 再参考 plus-ui Gitee 仓库 `6.X-Vue` 分支中的 `gen` 模板。
3. 默认同时维护:
`src/api/<module>/<business>/index.ts`
`src/api/<module>/<business>/types.ts`
`src/views/<module>/<business>/index.vue`
## 页面规则
- 页面优先使用 `<script setup name="Xxx" lang="ts">`
- 标准结构通常包含:
搜索区、表格区、工具栏、分页、编辑弹窗
- 常见状态:
`loading`、`showSearch`、`ids`、`single`、`multiple`、`total`
- 查询与表单优先使用 `reactive<PageData<Form, Query>>({...})`
## API / types 规则
- 请求统一通过 `@/utils/request`
- 同目录维护 `index.ts``types.ts`
- 标准 CRUD 通常包含:列表、详情、新增、修改、删除
- 列表接口通常返回 `AxiosPromise<PageResult<XxxVO>>`
## 自检
- API 路径是否与后端一致
- `index.ts``types.ts` 是否同步补齐
- 页面是否只是模板裸输出,如果是要继续补强到当前项目风格

View File

@ -0,0 +1,31 @@
---
name: frontend-page-enhancement
description: 复杂前端页面增强专家。用于修改 plus-ui 前端项目中已经存在的列表页、树筛选页、带导入导出和更多菜单的页面,强调增量修改和保留现有交互能力;默认基线为 Gitee 仓库 JavaLionLi/plus-ui 的 6.X-Vue 分支。
---
你负责 plus-ui 前端项目中已有页面的增强,不是重写页面。
基线仓库:`https://gitee.com/JavaLionLi/plus-ui`
默认分支:`6.X-Vue`
远端引用必须同时标记仓库、分支和文件路径;不要写本机绝对路径。
## 核心原则
1. 优先阅读当前页面完整实现。
2. 增量修改,不重写整页。
3. 保留已有树筛选、导入导出、列显隐、更多菜单、状态切换、路由跳转、SCSS 页面壳。
4. 不要把复杂页面退化成 generator 式基础列表页。
## 常见任务
- 调整工具栏和更多菜单
- 增加筛选条件和日期范围
- 增加导入导出能力
- 增加状态切换、快捷操作、确认弹窗
- 补复杂页面的小型子功能
## 自检
- 是否破坏了原页面结构和样式
- 是否误删了已有权限控制或交互能力
- 是否应该拆成子组件而不是继续堆主页面

View File

@ -0,0 +1,151 @@
---
name: frontend-crud-coding
description: 在 plus-ui 前端项目中按真实 Vue 3 + TypeScript + Element Plus + oxlint/oxfmt 代码风格生成或修改页面、API、types、hooks 接入和样式壳。用于新增或修改标准 CRUD 列表页、树表页、系统管理页、监控页、workflow 页面、demo 页面,补齐与后端接口对应的 src/api、types 和 src/views 代码;默认参考 Gitee 仓库 JavaLionLi/plus-ui 的 6.X-Vue 分支,触发后应先读取适用 references再阅读目标模块真实代码和项目内 gen 代码生成模板。
---
# 前端编码规范
先对齐当前前端项目里的真实实现,再参考项目内 `gen` 目录下的代码生成模板。不要只套通用 Vue 模板,也不要把 generator 模板原样复制进来而忽略当前项目已经演进出的 hooks、页面壳、类型入口和下载方式。
## 项目基线
- 基线仓库:`https://gitee.com/JavaLionLi/plus-ui`
- 默认分支:`6.X-Vue`
- 远端引用必须同时标记仓库、分支和文件路径,例如 `https://gitee.com/JavaLionLi/plus-ui/blob/6.X-Vue/gen/index.vue.ftl``branch=6.X-Vue, path=gen/index.vue.ftl`
- 不要在 skill、reference 或 agent 文档中写本机绝对路径;本地文件读取以运行时工作目录为准。
- 如果用户指定其他分支,先按用户分支读取同一仓库的对应文件,并在结果中说明使用的分支。
## 执行流程
1. 判断任务类型:新增标准 CRUD、树表、已有页面增强、复杂业务页、只补 API/types。
2. 按“文档读取规则”读取必要 reference不一次性展开所有资料。
3. 阅读目标目录下最近似的真实代码:
- 标准单表优先看 `src/views/demo/demo/index.vue`、`src/api/demo/demo/*`。
- 树表优先看 `src/views/demo/tree/index.vue`、`src/views/workflow/category/index.vue`。
- 系统复杂页优先看 `src/views/system/user/index.vue`、`system/role`、`system/post`、`system/config`。
- workflow 业务页优先看 `src/views/workflow/*` 同类页面。
4. 新增标准页面前,对照项目内模板确认基础骨架:
- API 模板:`gen/api.ts.ftl`
- types 模板:`gen/types.ts.ftl`
- 标准单表页模板:`gen/index.vue.ftl`
- 树表页模板:`gen/index-tree.vue.ftl`
5. 新增代码时通常同步维护 `src/api/<module>/<business>/index.ts`、`types.ts`、`src/views/<module>/<business>/index.vue`。
6. 增强已有页面时只做增量修改,保留原页面的树筛选、导入导出、列显隐、权限、字典、弹窗和路由跳转能力。
7. 修改完成后按影响范围运行验证:优先 `pnpm exec vue-tsc --noEmit`,改动页面或导入时再跑 `pnpm lint`,大范围变更再跑 `pnpm build`
## 文档读取规则
- 前端 API、types、页面、hooks、样式和验证规则先读 [references/frontend.md](references/frontend.md)。
- 不确定任务边界、需要标准用例或提问方式时,再读 [references/examples.md](references/examples.md)。
- reference 只约束实现方式和自检范围;发生冲突时,以当前模块真实代码和实际调用点为准。
## 优先级规则
发生冲突时按下面顺序决策:
1. 目标目录下最近似页面、API、types 的真实实现。
2. 当前项目公共 hooks、组件、工具和样式约定。
3. 项目内 `gen` 代码生成模板。
4. 通用 Vue 3 / Element Plus 习惯。
也就是说:
- 同模块已有页面怎么写,优先怎么写。
- 没有现成页面时,使用项目内 `gen` 模板作为骨架,再改成当前项目风格。
- 复杂模块不能为了“标准 CRUD”退化成裸模板页。
## 仓库通用规则
- 遵循 [`.editorconfig`](../../../.editorconfig)UTF-8、LF、2 空格缩进Markdown 例外。
- 当前仓库没有 `.prettierrc`,格式脚本是 `pnpm run fmt` 调用 `oxfmt .`lint 脚本是 `pnpm lint` 调用 `oxlint src`
- 页面优先使用 `<script setup name="Xxx" lang="ts">`
- API 返回类型优先从 `@/utils/api-types` 引入 `AxiosPromise`,分页结果从 `@/api/types` 引入 `PageResult`
- 请求统一通过 `@/utils/request`,导出下载使用 `import { download as requestDownload } from '@/utils/request';`
- 标准列表页优先复用 `useLoading`、`useSearchToggle`、`useSearchReset`、`useTableSelection`、`useFormDialog`、`useDateRangeQuery`。
- 页面壳优先使用 `p-2 app-container <module>-<business>-page`、`search-panel`、`toolbar-shell`、`data-table`、`right-toolbar`、`pagination`。
- 新页面不要无故引入另一套状态管理、请求封装、样式体系或权限写法。
## 目录映射规则
通常按下面关系组织代码:
- 后端 `/system/user/*` 对应 `src/api/system/user/*``src/views/system/user/*`
- 后端 `/monitor/xxx/*` 对应 `src/api/monitor/xxx/*``src/views/monitor/xxx/*`
- 后端 `/workflow/xxx/*` 对应 `src/api/workflow/xxx/*``src/views/workflow/xxx/*`
- 后端 `/demo/xxx/*` 对应 `src/api/demo/xxx/*``src/views/demo/xxx/*`
标准新增通常至少包含:
- `src/api/<module>/<business>/index.ts`
- `src/api/<module>/<business>/types.ts`
- `src/views/<module>/<business>/index.vue`
按业务复杂度,可能继续补:
- 导入弹窗
- 详情抽屉或详情页
- 树筛选面板
- 列显隐配置
- 分配/授权子页面
- 自定义 SCSS 样式
## 任务分型
### 1. 标准单表 CRUD
`gen/index.vue.ftl`、`gen/api.ts.ftl`、`gen/types.ts.ftl` 和 `src/views/demo/demo/index.vue` 为主要起点,补齐列表、搜索、分页、新增、编辑、删除、导出、权限、类型和验证。
### 2. 树表 CRUD
`src/views/demo/tree/index.vue`、`src/views/workflow/category/index.vue` 为主要起点。列表接口通常返回数组而不是 `PageResult`,页面使用 `handleTree`、`useTreeTableExpand``Query` 通常不继承 `PageQuery`
### 3. 强业务页面
如果页面包含树筛选、导入导出、更多菜单、状态切换、角色分配、详情抽屉、复杂校验、联动选择或独立路由,优先增量修改现有页面。不要重写成简单 CRUD。
### 4. 工作流页面
workflow 目录优先参考 `src/views/workflow/*`。流程定义、流程实例、任务列表、请假申请等页面通常有业务按钮、弹窗和路由跳转,不要硬套 system 模块。
### 5. 只补 API 和 types
只维护 `src/api/<module>/<business>/index.ts``types.ts`,但仍要与后端路由、返回结构、当前模块导入方式和类型入口一致。
## 输出要求
使用本 skill 时,默认期望产出应满足:
- 类型完整,不把页面逻辑大量写成 `any`
- API 路径、函数名、权限标识与后端接口保持一致。
- 标准页查询、重置、分页、弹窗、提交、删除、导出流程闭环完整。
- 复杂页面保留原有交互能力和业务约束。
- 代码体现当前项目 hooks、页面壳和下载方式而不是 `gen` 模板裸输出。
- 交付前说明运行过的验证命令;如果无法验证,说明原因。
## 快速检查清单
- `AxiosPromise` 是否来自 `@/utils/api-types`
- `PageResult` 是否来自 `@/api/types`
- API `params``data` 是否与后端方法一致。
- 日期范围是否通过 `useDateRangeQuery` 或附近页面现有方式处理。
- 列表 loading 是否通过 `useLoading` 或原页面方式维护。
- 弹窗是否通过 `useFormDialog` 或原页面方式维护。
- 多选状态是否通过 `useTableSelection` 或原页面方式维护。
- 权限指令是否保持同文件一致,默认使用当前项目主流 `v-hasPermi`
- 导出是否使用 `requestDownload('<module>/<business>/export', { ...queryParams.value }, '<name>_<time>.xlsx')`
- 页面壳是否保留 `search-panel`、`table-panel`、`toolbar-shell`、`data-table`、`right-toolbar`、`pagination`。
## 推荐提问方式
推荐把请求描述到下面粒度:
- 目标模块和业务名
- 后端接口前缀
- 是新增页面、修改页面,还是只补 API/types
- 是否需要导入、导出、树筛选、树表、状态切换、字典、权限按钮
- 希望参考哪个现有页面
例如:
- 使用 `$frontend-crud-coding``/system/client` 补一套标准 CRUD 页面,参考 `gen` 模板、`demo/demo` 和 `system/client`
- 使用 `$frontend-crud-coding` 修改 `workflow/category` 列表页,增加导出按钮和状态筛选,保持当前 workflow 风格。

View File

@ -0,0 +1,7 @@
interface:
display_name: "前端编码"
short_description: "按 plus-ui 6.X-Vue 真实代码和 gen 模板编写前端 CRUD"
default_prompt: "使用 $frontend-crud-coding 先读取适用 reference再按 plus-ui Gitee 仓库 6.X-Vue 分支的真实页面、hooks、API/types 约定和项目内 gen 模板实现前端修改。"
policy:
allow_implicit_invocation: true

View File

@ -0,0 +1,126 @@
# 使用案例
## 案例 1新增标准 CRUD 页面
### 用户提问示例
```text
使用 $frontend-crud-coding 为 system/client 补一套前端 CRUD 页面。
后端接口已经有 /system/client/list、/system/client/{id}、POST /system/client、PUT /system/client、DELETE /system/client/{ids}。
请参考 plus-ui Gitee 仓库 6.X-Vue 分支的项目内 gen 模板、src/views/demo/demo/index.vue 和现有 system/client 风格实现。
```
### 期望执行方式
- 先看 `src/api/system/client/*``src/views/system/client/index.vue` 是否已存在。
- 再看 `src/views/demo/demo/index.vue` 的标准 hooks 版 CRUD 骨架。
- 对照项目内 `gen/api.ts.ftl`、`gen/types.ts.ftl`、`gen/index.vue.ftl`。
- 生成或修改 `api/index.ts`、`types.ts`、`views/.../index.vue`。
- 使用 `AxiosPromise` from `@/utils/api-types`、`PageResult` from `@/api/types`、`useLoading`、`useFormDialog`、`useSearchReset`、`useTableSelection`。
## 案例 2新增树表页面
### 用户提问示例
```text
使用 $frontend-crud-coding 为 demo/tree2 新增树表 CRUD接口返回数组字段包含 id、parentId、name、orderNum。
参考 src/views/demo/tree/index.vue 和 workflow/category。
```
### 期望执行方式
- 优先判断这是树表,不生成分页 `PageResult` 页面。
- API 列表返回 `AxiosPromise<Tree2VO[]>`
- `Query` 不继承 `PageQuery`
- 页面使用 `handleTree`、`row-key`、`tree-props`、`useTreeTableExpand`、`el-tree-select`。
- 新增子节点时从当前行带入 `parentId`
## 案例 3修改已有复杂列表页
### 用户提问示例
```text
使用 $frontend-crud-coding 修改 system/user 页面:
1. 新增一个创建时间快捷筛选
2. 导出按钮保留在更多菜单中
3. 保持现有树筛选、导入、列显隐、详情抽屉和角色分配不变
```
### 期望执行方式
- 判断这是“已有复杂页面增强”,不是重新生成 CRUD。
- 优先阅读 `src/views/system/user/index.vue`
- 保留 `TreePanel`、导入弹窗、`right-toolbar` 列显隐、`UserViewDrawer`、角色分配路由、权限控制。
- 只增量修改搜索和查询参数处理。
## 案例 4修改 workflow 页面
### 用户提问示例
```text
使用 $frontend-crud-coding 为 workflow/category 增加状态筛选和导出按钮,保持 workflow 模块自己的树表风格。
```
### 期望执行方式
- 优先看 `src/views/workflow/category/index.vue``src/api/workflow/category/*`
- 判断是否需要后端新增导出接口;前端导出路径保持 `workflow/category/export`
- 不迁移 system/user 的用户专属逻辑。
- 保留树表、`useTreeTableExpand`、`handleTree` 和分类弹窗逻辑。
## 案例 5只补 API 和 types
### 用户提问示例
```text
使用 $frontend-crud-coding 为 monitor/cache 补全前端 API 和 types页面先不改。
```
### 期望执行方式
- 只维护 `src/api/monitor/cache/index.ts``src/api/monitor/cache/types.ts`
- 仍然检查同目录 monitor API 的 `export function` / `export const` 风格。
- 返回类型使用 `AxiosPromise` from `@/utils/api-types`
- 不创建页面,不改路由。
## 案例 6接入后端新增状态切换接口
### 用户提问示例
```text
使用 $frontend-crud-coding 给 system/client 页面接入 PUT /system/client/changeStatus状态字段 status参考 gen 模板。
```
### 期望执行方式
- API 增加 `changeClientStatus(id, status)`
- types 确认 `status` 类型是 string、number 还是 boolean。
- 表格列用 `el-switch`active/inactive 值跟后端字段类型一致。
- 切换失败时回滚原状态。
- 权限使用 `system:client:edit` 或后端实际权限。
## 推荐的高质量任务描述
```text
使用 $frontend-crud-coding 在当前前端项目中新增 `/system/notice` 列表页增强:
1. 保留现有页面
2. 新增状态筛选和导出
3. API 路径沿用后端接口
4. 参考 system/config 的工具栏与导出交互
5. 参考 plus-ui Gitee 仓库 6.X-Vue 分支的 gen 模板补齐缺失 types
```
## 不推荐的任务描述
```text
帮我写个后台页面
```
更好的写法至少补充:
- 模块名
- 业务名
- 后端接口前缀
- 是新增还是修改
- 是否需要分页、导出、树表、字典、权限
- 想参考哪个现有页面

View File

@ -0,0 +1,156 @@
# 前端约定
## 优先参考的代码来源
- 默认远端基线:`https://gitee.com/JavaLionLi/plus-ui`,分支 `6.X-Vue`。引用远端文件时必须同时写明 `branch=6.X-Vue` 和仓库内路径。
- 当前目标目录下最近似页面、API、types。
- 标准单表:`src/views/demo/demo/index.vue`、`src/api/demo/demo/index.ts`、`src/api/demo/demo/types.ts`。
- 树表:`src/views/demo/tree/index.vue`、`src/views/workflow/category/index.vue`。
- 复杂系统页:`src/views/system/user/index.vue`、`src/views/system/role/index.vue`、`src/views/system/post/index.vue`、`src/views/system/config/index.vue`。
- workflow 页:`src/views/workflow/*`、`src/api/workflow/*`。
- 监控页:`src/views/monitor/*`、`src/api/monitor/*`。
- 公共 hooks`src/hooks/async/useLoading.ts`、`src/hooks/dialog/*`、`src/hooks/form/*`、`src/hooks/table/*`、`src/hooks/tree/*`。
- 项目内 generator 模板:
`gen/api.ts.ftl`
`gen/types.ts.ftl`
`gen/index.vue.ftl`
`gen/index-tree.vue.ftl`
## 基础栈与格式
- 技术栈是 Vue 3 + TypeScript + Element Plus + Vite + Pinia。
- 包管理按仓库现状使用 pnpm。
- `.editorconfig` 要求 UTF-8、LF、2 空格缩进。
- 当前仓库没有 `.prettierrc`;格式化使用 `pnpm run fmt`lint 使用 `pnpm lint`
- 不要在一个页面里混入与仓库不一致的格式和写法。
- 不要把本机绝对路径写进 skill 输出或参考文档;跨环境参考统一使用 Gitee 仓库 URL、分支和仓库内相对路径。
## API 文件规则
- 标准 API 文件放在 `src/api/<module>/<business>/index.ts`,同目录维护 `types.ts`
- import 顺序优先跟随附近文件,标准生成页常见形式:
`import type { XxxForm, XxxQuery, XxxVO } from '@/api/<module>/<business>/types';`
`import type { PageResult } from '@/api/types';`
`import type { AxiosPromise } from '@/utils/api-types';`
`import request from '@/utils/request';`
- 不要从 `axios` 引入 `AxiosPromise`
- 列表分页接口通常返回 `AxiosPromise<PageResult<XxxVO>>`
- 树表列表接口通常返回 `AxiosPromise<XxxVO[]>`
- 详情接口返回 `AxiosPromise<XxxVO>`;复杂详情返回单独的 `InfoVO`
- 标准函数命名:
`listXxx` -> `GET /<module>/<business>/list`
`getXxx` -> `GET /<module>/<business>/{id}`
`addXxx` -> `POST /<module>/<business>`
`updateXxx` -> `PUT /<module>/<business>`
`delXxx` -> `DELETE /<module>/<business>/{id or ids}`
`changeXxxStatus` -> `PUT /<module>/<business>/changeStatus`
- query string 用 `params`,请求体用 `data`
- 加密、防重复提交等 headers 直接写在请求配置里,例如用户重置密码中的 `isEncrypt`、`repeatSubmit`。
- 当前仓库有些 API 使用 `export const`,有些使用 `export function`;新增标准 CRUD 优先跟随 `gen/api.ts.ftl` 和相邻模块。
- 只有相邻模块已有 `export default { ... }` 聚合时才新增默认导出。
## 类型文件规则
- 标准类型定义 `VO`、`Form`、`Query`,必要时补 `InfoVO`、`TreeVO`、`ResetPwdForm` 等扩展类型。
- `Form` 通常继承 `BaseEntity`
- 非树表 `Query` 通常继承 `PageQuery`
- 树表 `Query` 通常不继承 `PageQuery`
- ID 字段通常使用 `string | number`,批量删除参数使用 `string | number | Array<string | number>`
- Java 数值类型映射为 `number`Boolean 映射为 `boolean`,日期/文本默认 `string`
- 日期范围查询保留 `params?: any`,不要因为它看起来宽松就删掉。
- 列表对象、表单对象、查询对象职责分开;字段不一致时不要强行复用一个接口。
- 能明确写出类型时不要用 `any`;组件库、字典或历史接口确实无法收窄时再保留。
## Vue 页面结构规则
- 页面优先使用 `<script setup name="Xxx" lang="ts">`
- 标准根节点使用 `class="p-2 app-container <module>-<business>-page"`;已有页面是特殊布局时保持原样。
- 标准列表页结构:
搜索卡片 `search-panel`
表格卡片 `table-panel`
工具栏 `toolbar-shell`
表格 `data-table`
`right-toolbar`
`pagination`
新增/编辑 `el-dialog`
- 搜索区通过 `useSearchToggle` 控制 `showSearch`,头部点击切换。
- 列表 loading 通过 `useLoading(true)``withLoading`
- 选择状态通过 `useTableSelection<XxxVO>(item => item.id)` 返回 `ids`、`single`、`multiple`、`handleSelectionChange`。
- 表单弹窗优先使用 `useFormDialog({ form, formRef, initialFormData })`,返回 `dialog`、`resetForm`、`openDialog`、`showDialog`、`closeDialog`。
- 仅需要简单弹窗状态或一个页面多个弹窗时使用 `useDialogState`
- 日期范围查询优先使用 `useDateRangeQuery()`;带后端参数名时使用 `useDateRangeQuery('CreateTime')` 等相邻页面模式。
- 查询和表单状态通常放在 `reactive<PageData<Form, Query>>({ form, queryParams, rules })`,再 `toRefs(data)`
## 页面行为规则
- `getList` 负责设置 loading、调用列表接口、回填列表和 `total`
- `handleQuery` 先把 `queryParams.value.pageNum = 1`,再调用 `getList()`;树表无分页时只调用 `getList()`
- `resetQuery` 使用 `useSearchReset`,分页页传 `pageNumKey: 'pageNum'`,需要时传 `pageSizeKey``resetExtras`
- `handleAdd` 使用 `openDialog('添加xxx')`;如果有树/联动选项,打开前后按现有页面加载选项。
- `handleUpdate``reset()`,再按行或 `ids.value[0]` 查详情,`Object.assign(form.value, res.data)`,最后 `showDialog('修改xxx')`
- `submitForm` 表单校验通过后设置 `buttonLoading`,根据主键判断新增或修改,成功后 `modal.msgSuccess('操作成功')`、关闭弹窗、刷新列表。
- `handleDelete` 使用 `modal.confirm(...)` 二次确认,再调用删除接口,成功提示并刷新。
- `handleExport` 使用 `requestDownload('<module>/<business>/export', { ...queryParams.value }, '<business>_<timestamp>.xlsx')`
- 状态切换失败时要把 switch 值回滚,参考 generator 模板和现有 `system/user`、`system/role`。
- 导入上传使用 `globalHeaders()`、`import.meta.env.VITE_APP_BASE_API`、`ElUpload`,优先参考 `system/user` 或流程定义页面。
## 字典、权限与公共工具
- 字典使用 `useDict`
`const { sys_normal_disable } = toRefs<any>(useDict('sys_normal_disable'));`
- 新增代码默认使用当前项目主流 `v-hasPermi`
- 如果正在修改的文件已经混用或使用 `v-has-permi`,保持同文件现状,不为统一写法而重排无关代码。
- `el-dropdown-item` 延迟加载导致权限指令不可靠时,使用 `v-if="checkPermi([...])"`,参考 `system/user`
- 常用工具:
`modal` from `@/plugins/modal`
`download as requestDownload` from `@/utils/request`
`useDict` from `@/utils/dict`
`checkPermi` from `@/utils/permission`
`handleTree`、`parseStrEmpty` from `@/utils/ruoyi`
## 组件与样式规则
- 优先复用公共组件:`right-toolbar`、`pagination`、`DictTag` / `dict-tag`、`ImageUpload` / `image-upload`、`ImagePreview` / `image-preview`、`FileUpload` / `file-upload`、`Editor` / `editor`、`TreePanel`。
- 标准页面尽量使用已有页面壳类,不堆大量内联样式。
- 复杂页面需要 scoped SCSS 时优先复用:
`@use '@/assets/styles/components/page-shell' as pageShell;`
再按现有 mixin 使用。
- 不要为了单页需求修改全局组件样式。
- 类名保持模块语义:`system-client-page`、`workflow-category-page`、`demo-demo-page`。
## 树表规则
- 树表列表接口通常返回数组,页面通过 `handleTree<T>(res.data, 'id', 'parentId')` 组树。
- 使用 `row-key`、`:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"`。
- 展开/折叠使用 `useTreeTableExpand`
- 表单中上级节点使用 `el-tree-select`
- 新增子节点时从当前行回填 `parentId`
- 删除确认文案优先使用业务名称,而不是批量 ID 文案。
## 与 gen 模板的关系
- `gen` 是 plus-ui 前端项目内的生成模板;默认远端位置是 `https://gitee.com/JavaLionLi/plus-ui/tree/6.X-Vue/gen`,分支必须标记为 `6.X-Vue`
- 本地仓库存在对应文件时优先读本地 `gen`,但不要把本地绝对路径写入 skill 或交付内容。
- 新增标准单表页面时读取 `gen/index.vue.ftl`、`gen/api.ts.ftl`、`gen/types.ts.ftl`。
- 新增树表页面时读取 `gen/index-tree.vue.ftl`、`gen/api.ts.ftl`、`gen/types.ts.ftl`。
- `gen` 模板是标准骨架,不是最终答案;落地时仍要对照目标模块真实页面和公共 hooks。
- 当前前端项目已经把生成页升级为 hooks 版:`useLoading`、`useFormDialog`、`useSearchReset`、`useTableSelection`、`useDateRangeQuery`。
- 新增标准 CRUD 时,先从 `gen` 确认字段、权限、导出、状态切换、排序、日期范围等,再落成当前项目的实际页面壳。
- 修改已有页面时,不要把现有强业务逻辑替换回 `gen` 的简化逻辑。
## 验证规则
- 只改文档或 skill运行 skill 基础校验即可。
- 改前端 TS/Vue/API/types优先运行 `pnpm exec vue-tsc --noEmit`
- 改页面模板、import、权限或较多文件再运行 `pnpm lint`
- 改公共 hooks、组件、构建相关或大范围页面再运行 `pnpm build`
- 如果验证因为环境、依赖或权限失败,交付时说明失败命令和原因。
## 避免事项
- 不要从 `axios` 引入 `AxiosPromise`
- 不要绕开 `request``requestDownload` 自造请求/下载封装。
- 不要跳过 `types.ts`,把类型全写在页面里。
- 不要删除日期范围 `params`、权限指令、导出、导入、树筛选、列显隐等现有能力。
- 不要为了“更整洁”重写复杂页面的大块业务逻辑。
- 不要在新增标准页里使用与仓库不一致的 UI 壳或状态管理方式。

View File

@ -1,5 +1,6 @@
# 页面标题
VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
VITE_APP_TITLE = RuoYi-Vue-Plus后台管理系统
VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus
# 开发环境配置
VITE_APP_ENV = 'development'
@ -11,15 +12,31 @@ VITE_APP_BASE_API = '/dev-api'
VITE_APP_CONTEXT_PATH = '/'
# 监控地址
VITE_APP_MONITRO_ADMIN = 'http://localhost:9090/admin/applications'
VITE_APP_MONITOR_ADMIN = 'http://localhost:9090/admin/applications'
# powerjob 控制台地址
VITE_APP_POWERJOB_ADMIN = 'http://localhost:7700/'
# SnailJob 控制台地址
VITE_APP_SNAILJOB_ADMIN = 'http://localhost:8800/snail-job'
# SnailAI 控制台地址
VITE_APP_SNAILAI_ADMIN = 'http://localhost:8900/snail-ai'
VITE_APP_PORT = 80
# 接口加密功能开关(如需关闭 后端也必须对应关闭)
VITE_APP_ENCRYPT = true
# 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换
VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
VITE_APP_RSA_PUBLIC_KEY = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvEDuRIOM3oZPWj9Ukoc5pQklR4PFH6/clnjeFqjDLIgDyQvjxhgqAZQA+E9eD6qu6FsXPmK8djcL+nh3cFHz4pX473jDvO3Sve+8yL3VRQ0n2pRgQ2a01MJsy+WwTZCBYWf0VnLRIvANUoWQgy9vz94q7Va44dg7A1/3ICf+xAwIDAQAB'
# 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换
VITE_APP_RSA_PRIVATE_KEY = 'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAObq7yrxfvyieZtTjAYyrdvi59tYTXxjO5ajmPCRSXBY9M9wQ1tli297JN6mnY53UJMNyOFNSZVi8WSFoIXjpR87FmvChJlzeN/dZdd3SEs48Ee66XKeSePYqxa8oO5GKDsnajgpsOHKXSeeVSIysiIPS2/WsEqk0In9P4w3RsRFAgMBAAECgYBiMEWwce24SPICnRzuScBpvmsudrbEDIH7BOd0a6LZlcnLJwZNJ7mJlshPsHNQb+WgEf135+BBGEhioPtn0yuTdEuKP4kB9UdYUKiayWCoWhJpesv7sAD4RDClV7dhuV+gcd1AXD+YzyRIPbGm0VC2U+4q8/+UPRpVjqskbLVTgQJBAPRpou7g3S8n4XB527kq0D8I3+ZYwMxZhszwhrCDpJU319+ucmpLVwYIzDmZVeID2QQdUaDfIEViFHu95xDrGiUCQQDx3YOKn3yaEctk/ERVn7hDAyAXUbd8/pv2b24/M/l1ZevlsFem8U4Jk5Mu64t3z3YGJoymEjQmbucwT01iKhehAkEAxlnccsRmfFh/KkqauKE4M4++NTAd9zlInpUsmZ+cN8UEGnF2RTEzRKBrLOt1uWCqBB7PGiE6DVTVjr7FAQPrSQJAT5yeY87DcONSk9cFlzmPqV8p/QME5rvYEnHzVBKDlkUKNPyqnWToTvaoh9U4fyNmsfeWbEOprszqhFhWHG3GgQJAK8+ynmyFhaw63+Hx2KU5zR4hVuQso2IzrEurGxCxybV6mR7VBerb4502+EPx3PmOgxQL+niUFhcMWxcvBFP9+A=='
# 客户端id
VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
# 统一消息推送开关
VITE_APP_MESSAGE_ENABLED = true
# sse / websocket
VITE_APP_MESSAGE_TRANSPORT = 'sse'
# 统一消息推送路径
VITE_APP_MESSAGE_PATH = '/resource/message'

View File

@ -1,5 +1,6 @@
# 页面标题
VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
VITE_APP_TITLE = RuoYi-Vue-Plus后台管理系统
VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus
# 生产环境配置
VITE_APP_ENV = 'production'
@ -8,10 +9,13 @@ VITE_APP_ENV = 'production'
VITE_APP_CONTEXT_PATH = '/'
# 监控地址
VITE_APP_MONITRO_ADMIN = '/admin/applications'
VITE_APP_MONITOR_ADMIN = '/admin/applications'
# powerjob 控制台地址
VITE_APP_POWERJOB_ADMIN = '/powerjob'
# SnailJob 控制台地址
VITE_APP_SNAILJOB_ADMIN = '/snail-job'
# SnailAI 控制台地址
VITE_APP_SNAILAI_ADMIN = '/snail-ai'
# 生产环境
VITE_APP_BASE_API = '/prod-api'
@ -21,8 +25,21 @@ VITE_BUILD_COMPRESS = gzip
VITE_APP_PORT = 80
# 接口加密功能开关(如需关闭 后端也必须对应关闭)
VITE_APP_ENCRYPT = true
# 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换
VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
VITE_APP_RSA_PUBLIC_KEY = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvEDuRIOM3oZPWj9Ukoc5pQklR4PFH6/clnjeFqjDLIgDyQvjxhgqAZQA+E9eD6qu6FsXPmK8djcL+nh3cFHz4pX473jDvO3Sve+8yL3VRQ0n2pRgQ2a01MJsy+WwTZCBYWf0VnLRIvANUoWQgy9vz94q7Va44dg7A1/3ICf+xAwIDAQAB'
# 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换
VITE_APP_RSA_PRIVATE_KEY = 'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAObq7yrxfvyieZtTjAYyrdvi59tYTXxjO5ajmPCRSXBY9M9wQ1tli297JN6mnY53UJMNyOFNSZVi8WSFoIXjpR87FmvChJlzeN/dZdd3SEs48Ee66XKeSePYqxa8oO5GKDsnajgpsOHKXSeeVSIysiIPS2/WsEqk0In9P4w3RsRFAgMBAAECgYBiMEWwce24SPICnRzuScBpvmsudrbEDIH7BOd0a6LZlcnLJwZNJ7mJlshPsHNQb+WgEf135+BBGEhioPtn0yuTdEuKP4kB9UdYUKiayWCoWhJpesv7sAD4RDClV7dhuV+gcd1AXD+YzyRIPbGm0VC2U+4q8/+UPRpVjqskbLVTgQJBAPRpou7g3S8n4XB527kq0D8I3+ZYwMxZhszwhrCDpJU319+ucmpLVwYIzDmZVeID2QQdUaDfIEViFHu95xDrGiUCQQDx3YOKn3yaEctk/ERVn7hDAyAXUbd8/pv2b24/M/l1ZevlsFem8U4Jk5Mu64t3z3YGJoymEjQmbucwT01iKhehAkEAxlnccsRmfFh/KkqauKE4M4++NTAd9zlInpUsmZ+cN8UEGnF2RTEzRKBrLOt1uWCqBB7PGiE6DVTVjr7FAQPrSQJAT5yeY87DcONSk9cFlzmPqV8p/QME5rvYEnHzVBKDlkUKNPyqnWToTvaoh9U4fyNmsfeWbEOprszqhFhWHG3GgQJAK8+ynmyFhaw63+Hx2KU5zR4hVuQso2IzrEurGxCxybV6mR7VBerb4502+EPx3PmOgxQL+niUFhcMWxcvBFP9+A=='
# 客户端id
VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
# 统一消息推送开关
VITE_APP_MESSAGE_ENABLED = true
# sse / websocket
VITE_APP_MESSAGE_TRANSPORT = 'sse'
# 统一消息推送路径
VITE_APP_MESSAGE_PATH = '/resource/message'

View File

@ -1,17 +0,0 @@
*.sh
node_modules
*.md
*.woff
*.ttf
.vscode
.idea
dist
/public
/docs
.husky
.local
/bin
.eslintrc.js
prettier.config.js
src/assets
tailwind.config.js

View File

@ -1,312 +0,0 @@
{
"globals": {
"ComponentInternalInstance": true,
"TransferKey": true,
"ElFormRules": true,
"CheckboxValueType": true,
"PropType": true,
"DateModelType": true,
"UploadFile": true,
"ElFormInstance": true,
"ElTableInstance": true,
"ElTreeInstance": true,
"ElTreeSelectInstance": true,
"ElSelectInstance": true,
"ElUploadInstance": true,
"ElCardInstance": true,
"ElDialogInstance": true,
"ElInputInstance": true,
"ElInputNumberInstance": true,
"ElRadioInstance": true,
"ElRadioGroupInstance": true,
"ElRadioButtonInstance": true,
"ElCheckboxInstance": true,
"ElCheckboxGroupInstance": true,
"ElSwitchInstance": true,
"ElDatePickerInstance": true,
"ElTimePickerInstance": true,
"ElTimeSelectInstance": true,
"ElScrollbarInstance": true,
"ElCascaderInstance": true,
"ElColorPickerInstance": true,
"ElRateInstance": true,
"ElSliderInstance": true,
"useRouter": true,
"useRoute": true,
"EffectScope": true,
"ElTable": true,
"ElSelect": true,
"ElUpload": true,
"ElForm": true,
"ElTree": true,
"ElMessage": true,
"ElMessageBox": true,
"asyncComputed": true,
"autoResetRef": true,
"computed": true,
"computedAsync": true,
"computedEager": true,
"computedInject": true,
"computedWithControl": true,
"controlledComputed": true,
"controlledRef": true,
"createApp": true,
"createEventHook": true,
"createGlobalState": true,
"createInjectionState": true,
"createReactiveFn": true,
"createSharedComposable": true,
"createUnrefFn": true,
"customRef": true,
"debouncedRef": true,
"debouncedWatch": true,
"defineAsyncComponent": true,
"defineComponent": true,
"eagerComputed": true,
"effectScope": true,
"extendRef": true,
"getCurrentInstance": true,
"getCurrentScope": true,
"h": true,
"ignorableWatch": true,
"inject": true,
"isDefined": true,
"isProxy": true,
"isReactive": true,
"isReadonly": true,
"isRef": true,
"makeDestructurable": true,
"markRaw": true,
"nextTick": true,
"onActivated": true,
"onBeforeMount": true,
"onBeforeUnmount": true,
"onBeforeUpdate": true,
"onClickOutside": true,
"onDeactivated": true,
"onErrorCaptured": true,
"onKeyStroke": true,
"onLongPress": true,
"onMounted": true,
"onRenderTracked": true,
"onRenderTriggered": true,
"onScopeDispose": true,
"onServerPrefetch": true,
"onStartTyping": true,
"onUnmounted": true,
"onUpdated": true,
"pausableWatch": true,
"provide": true,
"reactify": true,
"reactifyObject": true,
"reactive": true,
"reactiveComputed": true,
"reactiveOmit": true,
"reactivePick": true,
"readonly": true,
"ref": true,
"refAutoReset": true,
"refDebounced": true,
"refDefault": true,
"refThrottled": true,
"refWithControl": true,
"resolveComponent": true,
"resolveDirective": true,
"resolveRef": true,
"resolveUnref": true,
"shallowReactive": true,
"shallowReadonly": true,
"shallowRef": true,
"syncRef": true,
"syncRefs": true,
"templateRef": true,
"throttledRef": true,
"throttledWatch": true,
"toRaw": true,
"toReactive": true,
"toRef": true,
"toRefs": true,
"triggerRef": true,
"tryOnBeforeMount": true,
"tryOnBeforeUnmount": true,
"tryOnMounted": true,
"tryOnScopeDispose": true,
"tryOnUnmounted": true,
"unref": true,
"unrefElement": true,
"until": true,
"useActiveElement": true,
"useArrayEvery": true,
"useArrayFilter": true,
"useArrayFind": true,
"useArrayFindIndex": true,
"useArrayFindLast": true,
"useArrayJoin": true,
"useArrayMap": true,
"useArrayReduce": true,
"useArraySome": true,
"useArrayUnique": true,
"useAsyncQueue": true,
"useAsyncState": true,
"useAttrs": true,
"useBase64": true,
"useBattery": true,
"useBluetooth": true,
"useBreakpoints": true,
"useBroadcastChannel": true,
"useBrowserLocation": true,
"useCached": true,
"useClipboard": true,
"useCloned": true,
"useColorMode": true,
"useConfirmDialog": true,
"useCounter": true,
"useCssModule": true,
"useCssVar": true,
"useCssVars": true,
"useCurrentElement": true,
"useCycleList": true,
"useDark": true,
"useDateFormat": true,
"useDebounce": true,
"useDebounceFn": true,
"useDebouncedRefHistory": true,
"useDeviceMotion": true,
"useDeviceOrientation": true,
"useDevicePixelRatio": true,
"useDevicesList": true,
"useDisplayMedia": true,
"useDocumentVisibility": true,
"useDraggable": true,
"useDropZone": true,
"useElementBounding": true,
"useElementByPoint": true,
"useElementHover": true,
"useElementSize": true,
"useElementVisibility": true,
"useEventBus": true,
"useEventListener": true,
"useEventSource": true,
"useEyeDropper": true,
"useFavicon": true,
"useFetch": true,
"useFileDialog": true,
"useFileSystemAccess": true,
"useFocus": true,
"useFocusWithin": true,
"useFps": true,
"useFullscreen": true,
"useGamepad": true,
"useGeolocation": true,
"useIdle": true,
"useImage": true,
"useInfiniteScroll": true,
"useIntersectionObserver": true,
"useInterval": true,
"useIntervalFn": true,
"useKeyModifier": true,
"useLastChanged": true,
"useLocalStorage": true,
"useMagicKeys": true,
"useManualRefHistory": true,
"useMediaControls": true,
"useMediaQuery": true,
"useMemoize": true,
"useMemory": true,
"useMounted": true,
"useMouse": true,
"useMouseInElement": true,
"useMousePressed": true,
"useMutationObserver": true,
"useNavigatorLanguage": true,
"useNetwork": true,
"useNow": true,
"useObjectUrl": true,
"useOffsetPagination": true,
"useOnline": true,
"usePageLeave": true,
"useParallax": true,
"usePermission": true,
"usePointer": true,
"usePointerLock": true,
"usePointerSwipe": true,
"usePreferredColorScheme": true,
"usePreferredContrast": true,
"usePreferredDark": true,
"usePreferredLanguages": true,
"usePreferredReducedMotion": true,
"usePrevious": true,
"useRafFn": true,
"useRefHistory": true,
"useResizeObserver": true,
"useScreenOrientation": true,
"useScreenSafeArea": true,
"useScriptTag": true,
"useScroll": true,
"useScrollLock": true,
"useSessionStorage": true,
"useShare": true,
"useSlots": true,
"useSorted": true,
"useSpeechRecognition": true,
"useSpeechSynthesis": true,
"useStepper": true,
"useStorage": true,
"useStorageAsync": true,
"useStyleTag": true,
"useSupported": true,
"useSwipe": true,
"useTemplateRefsList": true,
"useTextDirection": true,
"useTextSelection": true,
"useTextareaAutosize": true,
"useThrottle": true,
"useThrottleFn": true,
"useThrottledRefHistory": true,
"useTimeAgo": true,
"useTimeout": true,
"useTimeoutFn": true,
"useTimeoutPoll": true,
"useTimestamp": true,
"useTitle": true,
"useToNumber": true,
"useToString": true,
"useToggle": true,
"useTransition": true,
"useUrlSearchParams": true,
"useUserMedia": true,
"useVModel": true,
"useVModels": true,
"useVibrate": true,
"useVirtualList": true,
"useWakeLock": true,
"useWebNotification": true,
"useWebSocket": true,
"useWebWorker": true,
"useWebWorkerFn": true,
"useWindowFocus": true,
"useWindowScroll": true,
"useWindowSize": true,
"watch": true,
"watchArray": true,
"watchAtMost": true,
"watchDebounced": true,
"watchEffect": true,
"watchIgnorable": true,
"watchOnce": true,
"watchPausable": true,
"watchPostEffect": true,
"watchSyncEffect": true,
"watchThrottled": true,
"watchTriggerable": true,
"watchWithFilter": true,
"whenever": true,
"ImportOption": true,
"TreeType": true,
"FieldOption": true,
"PageData": true,
"storeToRefs": true,
"DictDataOption": true,
"UploadOption": true
}
}

View File

@ -1,42 +0,0 @@
module.exports = {
env: {
browser: true,
es2021: true,
node: true
},
parser: 'vue-eslint-parser',
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:@typescript-eslint/recommended',
'./.eslintrc-auto-import.json',
'plugin:prettier/recommended'
],
parserOptions: {
ecmaVersion: '2020',
sourceType: 'module',
parser: '@typescript-eslint/parser'
},
plugins: ['vue', '@typescript-eslint'],
rules: {
'vue/multi-word-component-names': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'vue/no-v-model-argument': 'off',
'@typescript-eslint/ban-types': [
'error',
{
// 关闭空类型检查 {}
extendDefaults: true,
types: {
'{}': false,
Function: false
}
}
]
},
globals: {
DialogOption: 'readonly',
OptionType: 'readonly'
}
};

1
.gitignore vendored
View File

@ -14,6 +14,7 @@ selenium-debug.log
# Editor directories and files
.idea
.vscode
*.iml
*.suo
*.ntvs*
*.njsproj

31
.oxfmtrc.json Normal file
View File

@ -0,0 +1,31 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"ignorePatterns": [
"src/types/components.d.ts",
"src/types/auto-imports.d.ts",
".ai_state",
".claude",
".codex",
"doc"
],
"printWidth": 120,
"singleQuote": true,
"trailingComma": "none",
"arrowParens": "avoid",
"htmlWhitespaceSensitivity": "ignore",
"experimentalSortPackageJson": {
"sortScripts": true
},
"sortImports": {
"newlinesBetween": false,
"groups": [
"type-import",
["value-builtin", "value-external"],
"type-internal",
"value-internal",
["type-parent", "type-sibling", "type-index"],
["value-parent", "value-sibling", "value-index"],
"unknown"
]
}
}

25
.oxlintrc.json Normal file
View File

@ -0,0 +1,25 @@
{
"$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json",
"plugins": ["eslint", "typescript", "unicorn", "oxc", "import", "vue"],
"rules": {
"typescript/no-empty-function": "off",
"typescript/no-explicit-any": "off",
"typescript/no-unused-vars": "off",
"typescript/no-this-alias": "off",
"typescript/no-empty-object-type": "off",
"typescript/no-unused-expressions": "off",
"prefer-rest-params": "off",
"import/no-unassigned-import": "off",
"import/no-named-as-default-member": "off",
"import/no-named-as-default": "off",
"no-shadow": "off",
"unicorn/prefer-add-event-listener": "off",
"unicorn/consistent-function-scoping": "off",
"unicorn/no-instanceof-builtins": "off"
},
"categories": {
"correctness": "error",
"suspicious": "error"
},
"ignorePatterns": [".ai_state", ".claude", ".codex", "doc", "dist/**", "dist-ssr/**", "coverage/**"]
}

View File

@ -1,9 +0,0 @@
/dist/*
.local
.output.js
/node_modules/**
**/*.svg
**/*.sh
/public/*

View File

@ -1,46 +0,0 @@
/**
* 代码格式化配置
*/
module.exports = {
// 一行最多多少个字符
printWidth: 150,
// 指定每个缩进级别的空格数
tabWidth: 2,
// 使用制表符而不是空格缩进行
useTabs: false,
// 在语句末尾是否需要分号
semi: true,
// 是否使用单引号
singleQuote: true,
// 更改引用对象属性的时间 可选值"<as-needed|consistent|preserve>"
quoteProps: 'as-needed',
// 在JSX中使用单引号而不是双引号
jsxSingleQuote: false,
// 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"<none|es5|all>"默认none
trailingComma: 'none',
// 在对象文字中的括号之间打印空格
bracketSpacing: true,
// jsx 标签的反尖括号需要换行
jsxBracketSameLine: false,
embeddedLanguageFormatting: 'off',
// 在单独的箭头函数参数周围包括括号 always(x) => x \ avoidx => x
arrowParens: 'always',
// 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码
rangeStart: 0,
rangeEnd: Infinity,
// 指定要使用的解析器,不需要写文件开头的 @prettier
requirePragma: false,
// 不需要自动在文件开头插入 @prettier
insertPragma: false,
// 使用默认的折行标准 always\never\preserve
proseWrap: 'preserve',
// 指定HTML文件的全局空格敏感度 css\strict\ignore
htmlWhitespaceSensitivity: 'css',
// Vue文件脚本和样式标签缩进
vueIndentScriptAndStyle: false,
// 在 windows 操作系统中换行符通常是回车 (CR) 加换行分隔符 (LF),也就是回车换行(CRLF)
// 然而在 Linux 和 Unix 中只使用简单的换行分隔符 (LF)。
// 对应的控制字符为 "\n" (LF) 和 "\r\n"(CRLF)。auto意为保持现有的行尾
// 换行符使用 lf 结尾是 可选值"<auto|lf|crlf|cr>"
endOfLine: 'auto'
};

109
README.md
View File

@ -1,73 +1,76 @@
## 平台简介
* 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [TS](https://www.typescriptlang.org/) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。
* 配套后端代码仓库地址
* [RuoYi-Vue-Plus 5.X(注意版本号)](https://gitee.com/dromara/RuoYi-Vue-Plus)
* [RuoYi-Cloud-Plus 2.X(注意版本号)](https://gitee.com/dromara/RuoYi-Cloud-Plus)
- 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [TS](https://www.typescriptlang.org/) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。
- 官方项目: 基于 React + Ant Design 版本前端项目 [plus-ui-react](https://gitee.com/JavaLionLi/plus-ui/tree/6.X-React/)
- 成员项目: 基于 vben5(ant-design-vue) 的前端项目 [ruoyi-plus-vben5](https://gitee.com/dapppp/ruoyi-plus-vben5)
- 成员项目: 基于soybean 的前端项目 [ruoyi-plus-soybean](https://gitee.com/xlsea/ruoyi-plus-soybean)
## 配套后端代码仓库地址
| 介绍 | 项目名 | 项目地址 |
| ----------------- | :--------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 🔥 分布式集群框架 | RuoYi-Vue-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus)<br> - [GitHub](https://github.com/dromara/RuoYi-Vue-Plus)<br> - [GitCode](https://gitcode.com/dromara/RuoYi-Vue-Plus) |
| 🔥 微服务框架 | RuoYi-Cloud-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Cloud-Plus)<br>- [GitHub](https://github.com/dromara/RuoYi-Cloud-Plus)<br> - [GitCode](https://gitcode.com/dromara/RuoYi-Cloud-Plus) |
## 分支说明
- 6.X分支(稳定发布主分支 生产可用)
- dev分支(开发分支 开发过程中使用)
## 前端运行
```bash
# 克隆项目
git clone https://gitee.com/JavaLionLi/plus-ui.git
# 安装依赖
npm install --registry=https://registry.npmmirror.com
pnpm install --registry=https://registry.npmmirror.com
# 启动服务
npm run dev
pnpm dev
# 构建生产环境
pnpm build:prod
# 构建生产环境 yarn build:prod
# 前端访问地址 http://localhost:80
```
## 本框架与RuoYi的业务差异
| 业务 | 功能说明 | 本框架 | RuoYi |
|--------|-----------------------------------------|-----|------------------|
| 租户管理 | 系统内租户的管理 如:租户套餐、过期时间、用户数量、企业信息等 | 支持 | 无 |
| 租户套餐管理 | 系统内租户所能使用的套餐管理 如:套餐内所包含的菜单等 | 支持 | 无 |
| 用户管理 | 用户的管理配置 如:新增用户、分配用户所属部门、角色、岗位等 | 支持 | 支持 |
| 部门管理 | 配置系统组织机构(公司、部门、小组) 树结构展现支持数据权限 | 支持 | 支持 |
| 岗位管理 | 配置系统用户所属担任职务 | 支持 | 支持 |
| 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等 | 支持 | 支持 |
| 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | 支持 | 支持 |
| 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | 支持 | 支持 |
| 参数管理 | 对系统动态配置常用参数 | 支持 | 支持 |
| 通知公告 | 系统通知公告信息发布维护 | 支持 | 支持 |
| 操作日志 | 系统正常操作日志记录和查询 系统异常信息日志记录和查询 | 支持 | 支持 |
| 登录日志 | 系统登录日志记录查询包含登录异常 | 支持 | 支持 |
| 文件管理 | 系统文件展示、上传、下载、删除等管理 | 支持 | 无 |
| 文件配置管理 | 系统文件上传、下载所需要的配置信息动态添加、修改、删除等管理 | 支持 | 无 |
| 在线用户管理 | 已登录系统的在线用户信息监控与强制踢出操作 | 支持 | 支持 |
| 定时任务 | 运行报表、任务管理(添加、修改、删除)、日志管理、执行器管理等 | 支持 | 仅支持任务与日志管理 |
| 代码生成 | 多数据源前后端代码的生成java、html、xml、sql支持CRUD下载 | 支持 | 仅支持单数据源 |
| 系统接口 | 根据业务代码自动生成相关的api接口文档 | 支持 | 支持 |
| 服务监控 | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等 | 支持 | 仅支持单机CPU、内存、磁盘监控 |
| 缓存监控 | 对系统的缓存信息查询,命令统计等。 | 支持 | 支持 |
| 在线构建器 | 拖动表单元素生成相应的HTML代码。 | 支持 | 支持 |
| 使用案例 | 系统的一些功能案例 | 支持 | 不支持 |
| 业务 | 功能说明 | 本框架 | RuoYi |
| ------------ | ------------------------------------------------------------- | ------ | ----------------------------- |
| 用户管理 | 用户的管理配置 如:新增用户、分配用户所属部门、角色、岗位等 | 支持 | 支持 |
| 部门管理 | 配置系统组织机构(公司、部门、小组) 树结构展现支持数据权限 | 支持 | 支持 |
| 岗位管理 | 配置系统用户所属担任职务 | 支持 | 支持 |
| 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等 | 支持 | 支持 |
| 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | 支持 | 支持 |
| 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | 支持 | 支持 |
| 参数管理 | 对系统动态配置常用参数 | 支持 | 支持 |
| 通知公告 | 系统通知公告信息发布维护 | 支持 | 支持 |
| 操作日志 | 系统正常操作日志记录和查询 系统异常信息日志记录和查询 | 支持 | 支持 |
| 登录日志 | 系统登录日志记录查询包含登录异常 | 支持 | 支持 |
| 文件管理 | 系统文件展示、上传、下载、删除等管理 | 支持 | 无 |
| 文件配置管理 | 系统文件上传、下载所需要的配置信息动态添加、修改、删除等管理 | 支持 | 无 |
| 在线用户管理 | 已登录系统的在线用户信息监控与强制踢出操作 | 支持 | 支持 |
| 定时任务 | 运行报表、任务管理(添加、修改、删除)、日志管理、执行器管理等 | 支持 | 仅支持任务与日志管理 |
| 代码生成 | 多数据源前后端代码的生成java、html、xml、sql支持CRUD下载 | 支持 | 仅支持单数据源 |
| 系统接口 | 根据业务代码自动生成相关的api接口文档 | 支持 | 支持 |
| 服务监控 | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等 | 支持 | 仅支持单机CPU、内存、磁盘监控 |
| 缓存监控 | 对系统的缓存信息查询,命令统计等。 | 支持 | 支持 |
| 在线构建器 | 拖动表单元素生成相应的HTML代码。 | 支持 | 支持 |
| 使用案例 | 系统的一些功能案例 | 支持 | 不支持 |
## 演示图例
| | |
|--------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|
| ![输入图片说明](https://foruda.gitee.com/images/1680077524361362822/270bb429_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680077619939771291/989bf9b6_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680077681751513929/1c27c5bd_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680077721559267315/74d63e23_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680077765638904515/1b75d4a6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078026375951297/eded7a4b_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078237104531207/0eb1b6a7_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078254306078709/5931e22f_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078287971528493/0b9af60a_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078308138770249/8d3b6696_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078352553634393/db5ef880_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078378238393374/601e4357_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078414983206024/2aae27c1_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078446738419874/ecce7d59_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078475971341775/149e8634_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078491666717143/3fadece7_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078558863188826/fb8ced2a_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078574561685461/ae68a0b2_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078594932772013/9d8bfec6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078626493093532/fcfe4ff6_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078643608812515/0295bd4f_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078685196286463/d7612c81_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078703877318597/56fce0bc_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078716586545643/b6dbd68f_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078734103217688/eb1e6aa6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078759131415480/73c525d8_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078779416197879/75e3ed02_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078802329118061/77e10915_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078893627848351/34a1c342_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078928175016986/f126ec4a_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078941718318363/b68a0f72_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078963175518631/3bb769a1_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078982294090567/b31c343d_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079000642440444/77ca82a9_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680079020995074177/03b7d52e_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079039367822173/76811806_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680079274333484664/4dfdc7c0_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079290467458224/d6715fcf_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299033689126697/868ef1ea_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299052163404649/8d94165d_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299074949590692/27f5bfb5_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299108816841231/619a7c57_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299089818500856/862ba805_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299173744267947/95cb0cd3_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299193694706123/28257dc1_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299147525013883/ebcd9dfe_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299220007761523/dc7e27c9_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299235966983519/35b047e1_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299250884681522/e5731314_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299267028602229/230d5428_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299293149732467/19abcf6c_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299311267192779/e665c668_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299327888096947/283a177f_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299348897579356/caac864e_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299376680669014/452585fb_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299843158459866/ceebbb63_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299432356918392/07abdf6a_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299465584172180/a2b2be12_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299491233431530/d88bfa35_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299513358913413/f2f90032_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299527419238776/549cb852_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299553918371792/43bd3bff_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1780299586662735625/1107a3ee_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1780299613342135530/526d7859_1766278.png "屏幕截图") |

View File

@ -1,12 +0,0 @@
@echo off
echo.
echo [信息] 打包Web工程生成dist文件。
echo.
%~d0
cd %~dp0
cd ..
yarn build:prod
pause

View File

@ -1,12 +0,0 @@
@echo off
echo.
echo [信息] 安装Web工程生成node_modules文件。
echo.
%~d0
cd %~dp0
cd ..
yarn --registry=https://registry.npmmirror.com
pause

View File

@ -1,12 +0,0 @@
@echo off
echo.
echo [信息] 使用 Vite 命令运行 Web 工程。
echo.
%~d0
cd %~dp0
cd ..
yarn dev
pause

View File

@ -1,22 +0,0 @@
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [
2,
'always',
[
'feat', // 新功能 feature
'fix', // 修复 bug
'docs', // 文档注释
'style', // 代码格式
'refactor', // 重构
'perf', // 性能优化
'test', // 增加测试
'chore', // 构建过程或辅助工具的变动
'revert', // 回退
'build' // 打包
]
],
'subject-case': [0]
}
};

104
gen/api.ts.ftl Normal file
View File

@ -0,0 +1,104 @@
import type { ${BusinessName}Form, ${BusinessName}Query, ${BusinessName}VO } from '@/api/${moduleName}/${businessName}/types';
<#if !table.tree>
import type { PageResult } from '@/api/types';
</#if>
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
/**
* 查询${functionName}列表
* @param query
* @returns {*}
*/
export const list${BusinessName} = (query?: ${BusinessName}Query): AxiosPromise<<#if table.tree>${BusinessName}VO[]<#else>PageResult<${BusinessName}VO></#if>> => {
return request({
url: '/${moduleName}/${businessName}/list',
method: 'get',
params: query
});
};
/**
* 查询${functionName}详细
* @param ${pkColumn.javaField}
*/
export const get${BusinessName} = (${pkColumn.javaField}: string | number): AxiosPromise<${BusinessName}VO> => {
return request({
url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
method: 'get'
});
};
/**
* 新增${functionName}
* @param data
*/
export const add${BusinessName} = (data: ${BusinessName}Form) => {
return request({
url: '/${moduleName}/${businessName}',
method: 'post',
data: data
});
};
/**
* 修改${functionName}
* @param data
*/
export const update${BusinessName} = (data: ${BusinessName}Form) => {
return request({
url: '/${moduleName}/${businessName}',
method: 'put',
data: data
});
};
<#if enableStatus>
/**
* 修改${functionName}状态
* @param ${pkColumn.javaField}
* @param status
*/
export const change${BusinessName}Status = (${pkColumn.javaField}: string | number, status: <#if statusColumn.javaType == 'Boolean'>boolean<#elseif statusColumn.javaType == 'String'>string<#else> number</#if>) => {
return request({
url: '/${moduleName}/${businessName}/changeStatus',
method: 'put',
data: {
${pkColumn.javaField},
${statusField}: status
}
});
};
</#if>
<#if enableSort>
/**
* 调整${functionName}排序
* @param ${pkColumn.javaField}
* @param sortValue
*/
export const update${BusinessName}Sort = (${pkColumn.javaField}: string | number, sortValue: <#if sortColumn.javaType == 'String' || sortColumn.javaType == 'LocalDateTime'>string<#else> number</#if>) => {
return request({
url: '/${moduleName}/${businessName}/updateSort',
method: 'put',
data: {
${pkColumn.javaField},
${sortField}: sortValue
}
});
};
</#if>
/**
* 删除${functionName}
* @param ${pkColumn.javaField}
*/
export const del${BusinessName} = (${pkColumn.javaField}: string | number | Array<string | number>) => {
return request({
url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
method: 'delete'
});
};

691
gen/index-tree.vue.ftl Normal file
View File

@ -0,0 +1,691 @@
<template>
<div class="p-2 page-shell ${moduleName}-${businessName}-page">
<div class="search-wrap">
<el-card shadow="hover" class="search-panel" :class="{ 'is-collapsed': !showSearch }">
<template #header>
<div class="panel-heading search-panel-toggle" @click.stop="showSearch = !showSearch">
<div><h3>筛选条件</h3></div>
</div>
</template>
<el-form ref="queryFormRef" :model="queryParams" :inline="true" class="query-form">
<#list columns as column>
<#if column.query>
<#if column.htmlType == "input" || column.htmlType == "textarea">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-input v-model="queryParams.${column.javaField}" placeholder="请输入${column.columnLabel}" clearable @keyup.enter="handleQuery" />
</el-form-item>
<#elseif column.htmlType == "inputNumber">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-input-number v-model="queryParams.${column.javaField}" controls-position="right" />
</el-form-item>
<#elseif (column.htmlType == "select" || column.htmlType == "radio") && column.dictType?has_content>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${column.columnLabel}" clearable>
<el-option v-for="dict in ${column.dictType}" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<#elseif column.htmlType == "switch" && column.dictType?has_content>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${column.columnLabel}" clearable>
<el-option v-for="dict in ${column.dictType}" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<#elseif column.htmlType == "switch">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${column.columnLabel}" clearable>
<#if column.javaType == "Boolean">
<el-option label="是" :value="true" />
<el-option label="否" :value="false" />
<#elseif column.javaType == "Integer" || column.javaType == "Long">
<el-option label="开启" :value="0" />
<el-option label="关闭" :value="1" />
<#else>
<el-option label="开启" value="0" />
<el-option label="关闭" value="1" />
</#if>
</el-select>
</el-form-item>
<#elseif (column.htmlType == "select" || column.htmlType == "radio") && !(column.dictType?has_content)>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${column.columnLabel}" clearable>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<#elseif column.htmlType == "datetime" && column.queryType != "BETWEEN">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-date-picker clearable
v-model="queryParams.${column.javaField}"
type="date"
value-format="YYYY-MM-DD"
placeholder="选择${column.columnLabel}"
/>
</el-form-item>
<#elseif column.htmlType == "datetime" && column.queryType == "BETWEEN">
<el-form-item label="${column.columnLabel}" style="width: 308px">
<el-date-picker
v-model="dateRange${column.capJavaField}"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
/>
</el-form-item>
</#if>
</#if>
</#list>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
<el-card shadow="hover" class="table-panel">
<template #header>
<div class="toolbar-shell">
<div class="table-heading">
<h3>${functionName}列表</h3>
</div>
<div class="toolbar-actions">
<el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['${moduleName}:${businessName}:add']">新增</el-button>
<el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
<#if enableExport>
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['${moduleName}:${businessName}:export']">导出</el-button>
</#if>
<right-toolbar v-model:show-search="showSearch" :search="false" @query-table="getList"></right-toolbar>
</div>
</div>
</template>
<el-table
ref="${businessName}TableRef"
v-loading="loading"
class="data-table"
:data="${businessName}List"
row-key="${treeCode}"
border
:default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>
<#assign firstTreeListField = "">
<#list columns as tempColumn>
<#if !tempColumn.pk && tempColumn.list && "" != tempColumn.javaField && firstTreeListField == "">
<#assign firstTreeListField = tempColumn.javaField>
</#if>
</#list>
<#list columns as column>
<#if column.pk>
<#elseif enableStatus && statusField == column.javaField>
<#if column.javaField == firstTreeListField>
<el-table-column label="${column.columnLabel}" prop="${column.javaField}">
<#else>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}">
</#if>
<template #default="scope">
<el-switch
v-model="scope.row.${column.javaField}"
:active-value="${statusField}ActiveValue"
:inactive-value="${statusField}InactiveValue"
@change="handleStatusChange(scope.row)"
/>
</template>
</el-table-column>
<#elseif enableSort && sortField == column.javaField>
<#if column.javaField == firstTreeListField>
<el-table-column label="${column.columnLabel}" prop="${column.javaField}" width="160">
<#else>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}" width="160">
</#if>
<template #default="scope">
<#if column.javaType == "LocalDateTime">
<el-date-picker
v-model="scope.row.${column.javaField}"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择${column.columnLabel}"
@change="handleSortChange(scope.row)"
/>
<#else>
<el-input-number v-model="scope.row.${column.javaField}" controls-position="right" :min="0" @change="handleSortChange(scope.row)" />
</#if>
</template>
</el-table-column>
<#elseif column.list && column.htmlType == "switch">
<#if column.javaField == firstTreeListField>
<el-table-column label="${column.columnLabel}" prop="${column.javaField}" width="120">
<#else>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}" width="120">
</#if>
<template #default="scope">
<el-switch
v-model="scope.row.${column.javaField}"
<#if column.javaType == "Boolean">
:active-value="true"
:inactive-value="false"
<#elseif column.javaType == "Integer" || column.javaType == "Long">
:active-value="0"
:inactive-value="1"
<#else>
active-value="0"
inactive-value="1"
</#if>
disabled
/>
</template>
</el-table-column>
<#elseif column.list && column.htmlType == "datetime">
<#if column.javaField == firstTreeListField>
<el-table-column label="${column.columnLabel}" prop="${column.javaField}" width="180">
<#else>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}" width="180">
</#if>
<template #default="scope">
<span>{{ parseTime(scope.row.${column.javaField}, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<#elseif column.list && column.htmlType == "imageUpload">
<#if column.javaField == firstTreeListField>
<el-table-column label="${column.columnLabel}" prop="${column.javaField}Url" width="100">
<#else>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}Url" width="100">
</#if>
<template #default="scope">
<image-preview :src="scope.row.${column.javaField}Url" :width="50" :height="50"/>
</template>
</el-table-column>
<#elseif column.list && column.dictColumn>
<#if column.javaField == firstTreeListField>
<el-table-column label="${column.columnLabel}" prop="${column.javaField}">
<#else>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}">
</#if>
<template #default="scope">
<#if column.htmlType == "checkbox">
<dict-tag :options="${column.dictType}" :value="scope.row.${column.javaField} ? scope.row.${column.javaField}.split(',') : []"/>
<#else>
<dict-tag :options="${column.dictType}" :value="scope.row.${column.javaField}"/>
</#if>
</template>
</el-table-column>
<#elseif column.list && "" != column.javaField>
<#if column.javaField == firstTreeListField>
<el-table-column label="${column.columnLabel}" prop="${column.javaField}" />
<#else>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}" />
</#if>
</#if>
</#list>
<#if enableStatus && !statusColumn.list>
<el-table-column label="${statusColumn.columnComment}" align="center" prop="${statusField}">
<template #default="scope">
<el-switch
v-model="scope.row.${statusField}"
:active-value="${statusField}ActiveValue"
:inactive-value="${statusField}InactiveValue"
@change="handleStatusChange(scope.row)"
/>
</template>
</el-table-column>
</#if>
<#if enableSort && !sortColumn.list>
<el-table-column label="${sortColumn.columnComment}" align="center" prop="${sortField}" width="160">
<template #default="scope">
<#if sortColumn.javaType == "LocalDateTime">
<el-date-picker
v-model="scope.row.${sortField}"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择${sortColumn.columnComment}"
@change="handleSortChange(scope.row)"
/>
<#else>
<el-input-number v-model="scope.row.${sortField}" controls-position="right" :min="0" @change="handleSortChange(scope.row)" />
</#if>
</template>
</el-table-column>
</#if>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']" />
</el-tooltip>
<el-tooltip content="新增" placement="top">
<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['${moduleName}:${businessName}:add']" />
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']" />
</el-tooltip>
</template>
</el-table-column>
</el-table>
</el-card>
<!-- 添加或修改${functionName}对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="${businessName}FormRef" :model="form" :rules="rules" label-width="80px">
<#list columns as column>
<#if (column.insert || column.edit) && !column.pk>
<#if "" != treeParentCode && column.javaField == treeParentCode>
<el-form-item label="${column.columnLabel}" prop="${treeParentCode}">
<el-tree-select
v-model="form.${treeParentCode}"
:data="${businessName}Options"
:props="{ value: '${treeCode}', label: '${treeName}', children: 'children' } as any"
value-key="${treeCode}"
placeholder="请选择${column.columnLabel}"
check-strictly
/>
</el-form-item>
<#elseif column.htmlType == "input">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-input v-model="form.${column.javaField}" placeholder="请输入${column.columnLabel}" />
</el-form-item>
<#elseif column.htmlType == "inputNumber">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-input-number v-model="form.${column.javaField}" controls-position="right" />
</el-form-item>
<#elseif column.htmlType == "imageUpload">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<image-upload v-model="form.${column.javaField}"/>
</el-form-item>
<#elseif column.htmlType == "fileUpload">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<file-upload v-model="form.${column.javaField}"/>
</el-form-item>
<#elseif column.htmlType == "editor">
<el-form-item label="${column.columnLabel}">
<editor v-model="form.${column.javaField}" :min-height="192"/>
</el-form-item>
<#elseif column.htmlType == "select" && column.dictType?has_content>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="form.${column.javaField}" placeholder="请选择${column.columnLabel}">
<el-option
v-for="dict in ${column.dictType}"
:key="dict.value"
:label="dict.label"
<#if column.javaType == "Integer" || column.javaType == "Long">
:value="parseInt(dict.value)"
<#else>
:value="dict.value"
</#if>
></el-option>
</el-select>
</el-form-item>
<#elseif column.htmlType == "select" && !(column.dictType?has_content)>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="form.${column.javaField}" placeholder="请选择${column.columnLabel}">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<#elseif column.htmlType == "checkbox" && column.dictType?has_content>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-checkbox-group v-model="form.${column.javaField}">
<el-checkbox
v-for="dict in ${column.dictType}"
:key="dict.value"
:label="dict.value">
{{dict.label}}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<#elseif column.htmlType == "checkbox" && !(column.dictType?has_content)>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-checkbox-group v-model="form.${column.javaField}">
<el-checkbox>请选择字典生成</el-checkbox>
</el-checkbox-group>
</el-form-item>
<#elseif column.htmlType == "radio" && column.dictType?has_content>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-radio-group v-model="form.${column.javaField}">
<el-radio
v-for="dict in ${column.dictType}"
:key="dict.value"
<#if column.javaType == "Integer" || column.javaType == "Long">
:value="parseInt(dict.value)"
<#else>
:value="dict.value"
</#if>
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<#elseif column.htmlType == "radio" && !(column.dictType?has_content)>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-radio-group v-model="form.${column.javaField}">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<#elseif column.htmlType == "switch">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-switch
v-model="form.${column.javaField}"
<#if column.javaType == "Boolean">
:active-value="true"
:inactive-value="false"
<#elseif column.javaType == "Integer" || column.javaType == "Long">
:active-value="0"
:inactive-value="1"
<#else>
active-value="0"
inactive-value="1"
</#if>
/>
</el-form-item>
<#elseif column.htmlType == "datetime">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-date-picker clearable
v-model="form.${column.javaField}"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择${column.columnLabel}"
/>
</el-form-item>
<#elseif column.htmlType == "textarea">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-input v-model="form.${column.javaField}" type="textarea" placeholder="请输入内容" />
</el-form-item>
</#if>
</#if>
</#list>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="${BusinessName}" lang="ts">
import {
add${BusinessName},
<#if enableStatus>
change${BusinessName}Status,
</#if>
del${BusinessName},
get${BusinessName},
list${BusinessName},
<#if enableSort>
update${BusinessName}Sort,
</#if>
update${BusinessName}
} from '@/api/${moduleName}/${businessName}';
import { ${BusinessName}Form, ${BusinessName}Query, ${BusinessName}VO } from '@/api/${moduleName}/${businessName}/types';
import { useLoading } from '@/hooks/async/useLoading';
import { useFormDialog } from '@/hooks/dialog/useFormDialog';
<#if needAddDateRange>
import { useDateRangeQuery } from '@/hooks/form/useDateRangeQuery';
</#if>
import { useSearchReset } from '@/hooks/form/useSearchReset';
import { useSearchToggle } from '@/hooks/form/useSearchToggle';
import { useTreeTableExpand } from '@/hooks/tree/useTreeTableExpand';
<#if needDict>
import { useDict } from '@/utils/dict';
</#if>
import modal from '@/plugins/modal';
import { handleTree } from '@/utils/ruoyi';
<#if enableExport>
import { download as requestDownload } from '@/utils/request';
</#if>
<#if needDict>
const { ${dictsNoSymbol} } = toRefs<any>(useDict(${dicts}));
</#if>
<#if enableStatus>
const ${statusField}ActiveValue = <#if statusColumn.javaType == "Boolean">true<#elseif statusColumn.javaType == "Integer" || statusColumn.javaType == "Long">0<#else>'0'</#if>;
const ${statusField}InactiveValue = <#if statusColumn.javaType == "Boolean">false<#elseif statusColumn.javaType == "Integer" || statusColumn.javaType == "Long">1<#else>'1'</#if>;
</#if>
type ${BusinessName}Option = {
${treeCode}: <#if treeParentColumn.javaType == 'String'>string<#else> number</#if>;
${treeName}: string;
children?: ${BusinessName}Option[];
};
const ${businessName}List = ref<${BusinessName}VO[]>([]);
const ${businessName}Options = ref<${BusinessName}Option[]>([]);
const all${BusinessName}Options = ref<${BusinessName}Option[]>([]);
const buttonLoading = ref(false);
const { showSearch } = useSearchToggle();
const { loading, setLoading, withLoading } = useLoading();
const queryFormRef = ref<ElFormInstance>();
const ${businessName}FormRef = ref<ElFormInstance>();
const ${businessName}TableRef = ref<ElTableInstance>();
const { isExpandAll, handleToggleExpandAll } = useTreeTableExpand<${BusinessName}VO>({
tableRef: ${businessName}TableRef,
data: ${businessName}List
});
<#list columns as column>
<#if column.htmlType == "datetime" && column.queryType == "BETWEEN">
const {
dateRange: dateRange${column.capJavaField},
applyDateRange: apply${column.capJavaField}DateRange,
resetDateRange: reset${column.capJavaField}DateRange
} = useDateRangeQuery('${column.capJavaField}');
</#if>
</#list>
const initFormData: ${BusinessName}Form = {
<#list columns as column>
<#if column.insert || column.edit>
<#if column.htmlType == "checkbox">
${column.javaField}: [],
<#else>
${column.javaField}: undefined,
</#if>
</#if>
</#list>
}
const data = reactive<PageData<${BusinessName}Form, ${BusinessName}Query>>({
form: {...initFormData},
queryParams: {
<#list columns as column>
<#if column.query>
<#if column.htmlType != "datetime" || column.queryType != "BETWEEN">
${column.javaField}: undefined,
</#if>
</#if>
</#list>
params: {
<#list columns as column>
<#if column.query>
<#if column.htmlType == "datetime" && column.queryType == "BETWEEN">
${column.javaField}: undefined,
</#if>
</#if>
</#list>
}
},
rules: {
<#list columns as column>
<#if column.insert || column.edit>
<#if column.required>
${column.javaField}: [
{ required: true, message: "${column.columnLabel}不能为空", trigger: <#if column.htmlType == "select" || column.htmlType == "radio" || column.htmlType == "switch" || column.htmlType == "inputNumber">"change"<#else>"blur"</#if> }
],
</#if>
</#if>
</#list>
}
});
const { queryParams, form, rules } = toRefs(data);
const { dialog, resetForm: reset, openDialog, showDialog, closeDialog } = useFormDialog({
form,
formRef: ${businessName}FormRef,
initialFormData: initFormData
});
/** 查询${functionName}列表 */
const getList = async () => {
await withLoading(async () => {
<#if needAddDateRange>
let params = queryParams.value;
<#list columns as column>
<#if column.htmlType == "datetime" && column.queryType == "BETWEEN">
params = apply${column.capJavaField}DateRange(params);
</#if>
</#list>
const res = await list${BusinessName}(params);
<#else>
const res = await list${BusinessName}(queryParams.value);
</#if>
const data = handleTree<${BusinessName}VO>(res.data, '${treeCode}', '${treeParentCode}');
if (data) {
${businessName}List.value = data;
}
});
};
/** 查询${functionName}下拉树结构 */
const getTreeselect = async (excludeId?: string | number) => {
const res = await list${BusinessName}();
const data: ${BusinessName}Option = { ${treeCode}: ${treeRootValueTsLiteral}, ${treeName}: '顶级节点', children: [] };
data.children = handleTree<${BusinessName}Option>(res.data, '${treeCode}', '${treeParentCode}');
all${BusinessName}Options.value = [data];
${businessName}Options.value = excludeId != null ? filterTreeOptions(all${BusinessName}Options.value, excludeId) : all${BusinessName}Options.value;
};
/** 取消按钮 */
const cancel = () => {
reset();
closeDialog();
};
/** 搜索按钮操作 */
const handleQuery = () => {
getList();
};
const { resetQuery } = useSearchReset({
queryFormRef,
queryParams,
resetExtras: () => {
<#list columns as column>
<#if column.htmlType == "datetime" && column.queryType == "BETWEEN">
reset${column.capJavaField}DateRange();
</#if>
</#list>
},
afterReset: () => {
handleQuery();
}
});
/** 新增按钮操作 */
const handleAdd = (row?: Partial<${BusinessName}VO>) => {
openDialog('添加${functionName}');
getTreeselect();
if (row != null && row.${treeCode}) {
form.value.${treeParentCode} = row.${treeCode};
} else {
form.value.${treeParentCode} = ${treeRootValueTsLiteral};
}
};
/** 修改按钮操作 */
const handleUpdate = async (row: Partial<${BusinessName}VO>) => {
reset();
await getTreeselect(row.${treeCode});
if (row != null) {
form.value.${treeParentCode} = row.${treeParentCode};
}
const res = await get${BusinessName}(row.${pkColumn.javaField});
Object.assign(form.value, res.data);
<#list columns as column>
<#if column.htmlType == "checkbox">
form.value.${column.javaField} = form.value.${column.javaField}.split(",");
</#if>
</#list>
showDialog('修改${functionName}');
};
/** 提交按钮 */
const submitForm = () => {
${businessName}FormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
<#list columns as column>
<#if column.htmlType == "checkbox">
form.value.${column.javaField} = form.value.${column.javaField}.join(",");
</#if>
</#list>
if (form.value.${pkColumn.javaField}) {
await update${BusinessName}(form.value).finally(() => (buttonLoading.value = false));
} else {
await add${BusinessName}(form.value).finally(() => (buttonLoading.value = false));
}
modal.msgSuccess('操作成功');
closeDialog();
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row: Partial<${BusinessName}VO>) => {
await modal.confirm('是否确认删除${functionName}编号为"' + row.${pkColumn.javaField} + '"的数据项?');
setLoading(true);
await del${BusinessName}(row.${pkColumn.javaField}).finally(() => setLoading(false));
await getList();
modal.msgSuccess('删除成功');
};
const filterTreeOptions = (options: ${BusinessName}Option[], excludeId: string | number): ${BusinessName}Option[] => {
return options
.filter(item => item.${treeCode} !== excludeId)
.map(item => ({
...item,
children: item.children ? filterTreeOptions(item.children, excludeId) : []
}));
};
<#if enableStatus>
/** 状态修改 */
const handleStatusChange = async (row: Partial<${BusinessName}VO>) => {
const text = row.${statusField} === ${statusField}ActiveValue ? '启用' : '停用';
try {
await modal.confirm('确认要"' + text + '"吗?');
await change${BusinessName}Status(row.${pkColumn.javaField}, row.${statusField});
modal.msgSuccess(text + '成功');
} catch (err) {
row.${statusField} = row.${statusField} === ${statusField}ActiveValue ? ${statusField}InactiveValue : ${statusField}ActiveValue;
}
};
</#if>
<#if enableSort>
/** 排序调整 */
const handleSortChange = async (row: Partial<${BusinessName}VO>) => {
try {
await update${BusinessName}Sort(row.${pkColumn.javaField}, row.${sortField});
modal.msgSuccess('排序更新成功');
} catch (err) {
await getList();
}
};
</#if>
<#if enableExport>
/** 导出按钮操作 */
const handleExport = () => {
requestDownload(
'${moduleName}/${businessName}/export',
{
...queryParams.value
},
`${businessName}_${r'${new Date().getTime()}'}.xlsx`
);
};
</#if>
onMounted(() => {
getList();
});
</script>

615
gen/index.vue.ftl Normal file
View File

@ -0,0 +1,615 @@
<template>
<div class="p-2 page-shell ${moduleName}-${businessName}-page">
<div class="search-wrap">
<el-card shadow="hover" class="search-panel" :class="{ 'is-collapsed': !showSearch }">
<template #header>
<div class="panel-heading search-panel-toggle" @click.stop="showSearch = !showSearch">
<div><h3>筛选条件</h3></div>
</div>
</template>
<el-form ref="queryFormRef" :model="queryParams" :inline="true" class="query-form">
<#list columns as column>
<#if column.query>
<#if column.htmlType == "input" || column.htmlType == "textarea">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-input v-model="queryParams.${column.javaField}" placeholder="请输入${column.columnLabel}" clearable @keyup.enter="handleQuery" />
</el-form-item>
<#elseif column.htmlType == "inputNumber">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-input-number v-model="queryParams.${column.javaField}" controls-position="right" />
</el-form-item>
<#elseif (column.htmlType == "select" || column.htmlType == "radio") && column.dictType?has_content>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${column.columnLabel}" clearable >
<el-option v-for="dict in ${column.dictType}" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<#elseif column.htmlType == "switch" && column.dictType?has_content>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${column.columnLabel}" clearable >
<el-option v-for="dict in ${column.dictType}" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<#elseif column.htmlType == "switch">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${column.columnLabel}" clearable >
<#if column.javaType == "Boolean">
<el-option label="是" :value="true" />
<el-option label="否" :value="false" />
<#elseif column.javaType == "Integer" || column.javaType == "Long">
<el-option label="开启" :value="0" />
<el-option label="关闭" :value="1" />
<#else>
<el-option label="开启" value="0" />
<el-option label="关闭" value="1" />
</#if>
</el-select>
</el-form-item>
<#elseif (column.htmlType == "select" || column.htmlType == "radio") && !(column.dictType?has_content)>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${column.columnLabel}" clearable >
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<#elseif column.htmlType == "datetime" && column.queryType != "BETWEEN">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-date-picker clearable
v-model="queryParams.${column.javaField}"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择${column.columnLabel}"
/>
</el-form-item>
<#elseif column.htmlType == "datetime" && column.queryType == "BETWEEN" && column.query>
<el-form-item label="${column.columnLabel}" style="width: 308px">
<el-date-picker
v-model="dateRange${column.capJavaField}"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
/>
</el-form-item>
</#if>
</#if>
</#list>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
<el-card shadow="hover" class="table-panel">
<template #header>
<div class="toolbar-shell">
<div class="table-heading">
<h3>${functionName}列表</h3>
</div>
<div class="toolbar-actions">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['${moduleName}:${businessName}:add']">新增</el-button>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
<#if enableExport>
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['${moduleName}:${businessName}:export']">导出</el-button>
</#if>
<right-toolbar v-model:show-search="showSearch" :search="false" @query-table="getList"></right-toolbar>
</div>
</div>
</template>
<el-table v-loading="loading" border class="data-table" :data="${businessName}List" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<#list columns as column>
<#if column.pk && column.list>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}" />
<#elseif enableStatus && statusField == column.javaField>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}">
<template #default="scope">
<el-switch
v-model="scope.row.${column.javaField}"
:active-value="${statusField}ActiveValue"
:inactive-value="${statusField}InactiveValue"
@change="handleStatusChange(scope.row)"
/>
</template>
</el-table-column>
<#elseif enableSort && sortField == column.javaField>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}" width="160">
<template #default="scope">
<#if column.javaType == "LocalDateTime">
<el-date-picker
v-model="scope.row.${column.javaField}"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择${column.columnLabel}"
@change="handleSortChange(scope.row)"
/>
<#else>
<el-input-number v-model="scope.row.${column.javaField}" controls-position="right" :min="0" @change="handleSortChange(scope.row)" />
</#if>
</template>
</el-table-column>
<#elseif column.list && column.htmlType == "switch">
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}" width="120">
<template #default="scope">
<el-switch
v-model="scope.row.${column.javaField}"
<#if column.javaType == "Boolean">
:active-value="true"
:inactive-value="false"
<#elseif column.javaType == "Integer" || column.javaType == "Long">
:active-value="0"
:inactive-value="1"
<#else>
active-value="0"
inactive-value="1"
</#if>
disabled
/>
</template>
</el-table-column>
<#elseif column.list && column.htmlType == "datetime">
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.${column.javaField}, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<#elseif column.list && column.htmlType == "imageUpload">
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}Url" width="100">
<template #default="scope">
<image-preview :src="scope.row.${column.javaField}Url" :width="50" :height="50"/>
</template>
</el-table-column>
<#elseif column.list && column.dictColumn>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}">
<template #default="scope">
<#if column.htmlType == "checkbox">
<dict-tag :options="${column.dictType}" :value="scope.row.${column.javaField} ? scope.row.${column.javaField}.split(',') : []"/>
<#else>
<dict-tag :options="${column.dictType}" :value="scope.row.${column.javaField}"/>
</#if>
</template>
</el-table-column>
<#elseif column.list && "" != column.javaField>
<el-table-column label="${column.columnLabel}" align="center" prop="${column.javaField}" />
</#if>
</#list>
<#if enableStatus && !statusColumn.list>
<el-table-column label="${statusColumn.columnComment}" align="center" prop="${statusField}">
<template #default="scope">
<el-switch
v-model="scope.row.${statusField}"
<#if statusColumn.javaType == "Boolean">
:active-value="true"
:inactive-value="false"
<#elseif statusColumn.javaType == "Integer" || statusColumn.javaType == "Long">
:active-value="0"
:inactive-value="1"
<#else>
active-value="0"
inactive-value="1"
</#if>
@change="handleStatusChange(scope.row)"
/>
</template>
</el-table-column>
</#if>
<#if enableSort && !sortColumn.list>
<el-table-column label="${sortColumn.columnComment}" align="center" prop="${sortField}" width="160">
<template #default="scope">
<#if sortColumn.javaType == "LocalDateTime">
<el-date-picker
v-model="scope.row.${sortField}"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择${sortColumn.columnComment}"
@change="handleSortChange(scope.row)"
/>
<#else>
<el-input-number v-model="scope.row.${sortField}" controls-position="right" :min="0" @change="handleSortChange(scope.row)" />
</#if>
</template>
</el-table-column>
</#if>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改${functionName}对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="${businessName}FormRef" :model="form" :rules="rules" label-width="80px">
<#list columns as column>
<#if (column.insert || column.edit) && !column.pk>
<#if column.htmlType == "input">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-input v-model="form.${column.javaField}" placeholder="请输入${column.columnLabel}" />
</el-form-item>
<#elseif column.htmlType == "inputNumber">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-input-number v-model="form.${column.javaField}" controls-position="right" />
</el-form-item>
<#elseif column.htmlType == "imageUpload">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<image-upload v-model="form.${column.javaField}"/>
</el-form-item>
<#elseif column.htmlType == "fileUpload">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<file-upload v-model="form.${column.javaField}"/>
</el-form-item>
<#elseif column.htmlType == "editor">
<el-form-item label="${column.columnLabel}">
<editor v-model="form.${column.javaField}" :min-height="192"/>
</el-form-item>
<#elseif column.htmlType == "select" && column.dictType?has_content>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="form.${column.javaField}" placeholder="请选择${column.columnLabel}">
<el-option
v-for="dict in ${column.dictType}"
:key="dict.value"
:label="dict.label"
<#if column.javaType == "Integer" || column.javaType == "Long">
:value="parseInt(dict.value)"
<#else>
:value="dict.value"
</#if>
></el-option>
</el-select>
</el-form-item>
<#elseif column.htmlType == "select" && !(column.dictType?has_content)>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-select v-model="form.${column.javaField}" placeholder="请选择${column.columnLabel}">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<#elseif column.htmlType == "checkbox" && column.dictType?has_content>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-checkbox-group v-model="form.${column.javaField}">
<el-checkbox
v-for="dict in ${column.dictType}"
:key="dict.value"
:label="dict.value">
{{dict.label}}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<#elseif column.htmlType == "checkbox" && !(column.dictType?has_content)>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-checkbox-group v-model="form.${column.javaField}">
<el-checkbox>请选择字典生成</el-checkbox>
</el-checkbox-group>
</el-form-item>
<#elseif column.htmlType == "radio" && column.dictType?has_content>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-radio-group v-model="form.${column.javaField}">
<el-radio
v-for="dict in ${column.dictType}"
:key="dict.value"
<#if column.javaType == "Integer" || column.javaType == "Long">
:value="parseInt(dict.value)"
<#else>
:value="dict.value"
</#if>
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<#elseif column.htmlType == "radio" && !(column.dictType?has_content)>
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-radio-group v-model="form.${column.javaField}">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<#elseif column.htmlType == "switch">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-switch
v-model="form.${column.javaField}"
<#if column.javaType == "Boolean">
:active-value="true"
:inactive-value="false"
<#elseif column.javaType == "Integer" || column.javaType == "Long">
:active-value="0"
:inactive-value="1"
<#else>
active-value="0"
inactive-value="1"
</#if>
/>
</el-form-item>
<#elseif column.htmlType == "datetime">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-date-picker clearable
v-model="form.${column.javaField}"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择${column.columnLabel}">
</el-date-picker>
</el-form-item>
<#elseif column.htmlType == "textarea">
<el-form-item label="${column.columnLabel}" prop="${column.javaField}">
<el-input v-model="form.${column.javaField}" type="textarea" placeholder="请输入内容" />
</el-form-item>
</#if>
</#if>
</#list>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="${BusinessName}" lang="ts">
import {
add${BusinessName},
<#if enableStatus>
change${BusinessName}Status,
</#if>
del${BusinessName},
get${BusinessName},
list${BusinessName},
<#if enableSort>
update${BusinessName}Sort,
</#if>
update${BusinessName}
} from '@/api/${moduleName}/${businessName}';
import { ${BusinessName}Form, ${BusinessName}Query, ${BusinessName}VO } from '@/api/${moduleName}/${businessName}/types';
import { useLoading } from '@/hooks/async/useLoading';
import { useFormDialog } from '@/hooks/dialog/useFormDialog';
<#if needAddDateRange>
import { useDateRangeQuery } from '@/hooks/form/useDateRangeQuery';
</#if>
import { useSearchReset } from '@/hooks/form/useSearchReset';
import { useSearchToggle } from '@/hooks/form/useSearchToggle';
import { useTableSelection } from '@/hooks/table/useTableSelection';
<#if needDict>
import { useDict } from '@/utils/dict';
</#if>
<#if needParseTime>
import { parseTime } from '@/utils/ruoyi';
</#if>
import modal from '@/plugins/modal';
<#if enableExport>
import { download as requestDownload } from '@/utils/request';
</#if>
<#if needDict>
const { ${dictsNoSymbol} } = toRefs<any>(useDict(${dicts}));
</#if>
<#if enableStatus>
const ${statusField}ActiveValue = <#if statusColumn.javaType == "Boolean">true<#elseif statusColumn.javaType == "Integer" || statusColumn.javaType == "Long">0<#else>'0'</#if>;
const ${statusField}InactiveValue = <#if statusColumn.javaType == "Boolean">false<#elseif statusColumn.javaType == "Integer" || statusColumn.javaType == "Long">1<#else>'1'</#if>;
</#if>
const ${businessName}List = ref<${BusinessName}VO[]>([]);
const buttonLoading = ref(false);
const { loading, withLoading } = useLoading(true);
const { showSearch } = useSearchToggle();
const total = ref(0);
<#list columns as column>
<#if column.htmlType == "datetime" && column.queryType == "BETWEEN" && column.query>
const {
dateRange: dateRange${column.capJavaField},
applyDateRange: apply${column.capJavaField}DateRange,
resetDateRange: reset${column.capJavaField}DateRange
} = useDateRangeQuery('${column.capJavaField}');
</#if>
</#list>
const queryFormRef = ref<ElFormInstance>();
const ${businessName}FormRef = ref<ElFormInstance>();
const initFormData: ${BusinessName}Form = {
<#list columns as column>
<#if column.insert || column.edit>
<#if column.htmlType == "checkbox">
${column.javaField}: [],
<#else>
${column.javaField}: undefined,
</#if>
</#if>
</#list>
}
const data = reactive<PageData<${BusinessName}Form, ${BusinessName}Query>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
<#list columns as column>
<#if column.query>
<#if column.htmlType != "datetime" || column.queryType != "BETWEEN">
${column.javaField}: undefined,
</#if>
</#if>
</#list>
params: {
<#list columns as column>
<#if column.query>
<#if column.htmlType == "datetime" && column.queryType == "BETWEEN">
${column.javaField}: undefined,
</#if>
</#if>
</#list>
}
},
rules: {
<#list columns as column>
<#if column.insert || column.edit>
<#if column.required>
${column.javaField}: [
{ required: true, message: "${column.columnLabel}不能为空", trigger: <#if column.htmlType == "select" || column.htmlType == "radio" || column.htmlType == "switch" || column.htmlType == "inputNumber">"change"<#else>"blur"</#if> }
],
</#if>
</#if>
</#list>
}
});
const { queryParams, form, rules } = toRefs(data);
const { ids, single, multiple, handleSelectionChange } = useTableSelection<${BusinessName}VO>(item => item.${pkColumn.javaField});
const { dialog, resetForm: reset, openDialog, showDialog, closeDialog } = useFormDialog({
form,
formRef: ${businessName}FormRef,
initialFormData: initFormData
});
/** 查询${functionName}列表 */
const getList = async () => {
await withLoading(async () => {
<#if needAddDateRange>
let params = queryParams.value;
<#list columns as column>
<#if column.htmlType == "datetime" && column.queryType == "BETWEEN" && column.query>
params = apply${column.capJavaField}DateRange(params);
</#if>
</#list>
const res = await list${BusinessName}(params);
<#else>
const res = await list${BusinessName}(queryParams.value);
</#if>
${businessName}List.value = res.data?.rows;
total.value = res.data?.total;
});
};
/** 取消按钮 */
const cancel = () => {
reset();
closeDialog();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
const { resetQuery } = useSearchReset({
queryFormRef,
queryParams,
pageNumKey: 'pageNum',
pageSizeKey: 'pageSize',
initialPageSize: 10,
resetExtras: () => {
<#list columns as column>
<#if column.htmlType == "datetime" && column.queryType == "BETWEEN" && column.query>
reset${column.capJavaField}DateRange();
</#if>
</#list>
},
afterReset: () => {
handleQuery();
}
});
/** 新增按钮操作 */
const handleAdd = () => {
openDialog('添加${functionName}');
};
/** 修改按钮操作 */
const handleUpdate = async (row?: Partial<${BusinessName}VO>) => {
reset();
const _${pkColumn.javaField} = row?.${pkColumn.javaField} || ids.value[0];
const res = await get${BusinessName}(_${pkColumn.javaField});
Object.assign(form.value, res.data);
<#list columns as column>
<#if column.htmlType == "checkbox">
form.value.${column.javaField} = form.value.${column.javaField}.split(",");
</#if>
</#list>
showDialog('修改${functionName}');
};
/** 提交按钮 */
const submitForm = () => {
${businessName}FormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
<#list columns as column>
<#if column.htmlType == "checkbox">
form.value.${column.javaField} = form.value.${column.javaField}.join(",");
</#if>
</#list>
if (form.value.${pkColumn.javaField}) {
await update${BusinessName}(form.value).finally(() => (buttonLoading.value = false));
} else {
await add${BusinessName}(form.value).finally(() => (buttonLoading.value = false));
}
modal.msgSuccess('操作成功');
closeDialog();
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: Partial<${BusinessName}VO>) => {
const _${pkColumn.javaField}s = row?.${pkColumn.javaField} || ids.value;
await modal.confirm('是否确认删除${functionName}编号为"' + _${pkColumn.javaField}s + '"的数据项?');
await del${BusinessName}(_${pkColumn.javaField}s);
modal.msgSuccess('删除成功');
await getList();
};
<#if enableExport>
/** 导出按钮操作 */
const handleExport = () => {
requestDownload(
'${moduleName}/${businessName}/export',
{
...queryParams.value
},
`${businessName}_${r'${new Date().getTime()}'}.xlsx`
);
};
</#if>
<#if enableStatus>
/** 状态修改 */
const handleStatusChange = async (row: Partial<${BusinessName}VO>) => {
const text = row.${statusField} === ${statusField}ActiveValue ? '启用' : '停用';
try {
await modal.confirm('确认要"' + text + '"吗?');
await change${BusinessName}Status(row.${pkColumn.javaField}, row.${statusField});
modal.msgSuccess(text + '成功');
} catch (err) {
row.${statusField} = row.${statusField} === ${statusField}ActiveValue ? ${statusField}InactiveValue : ${statusField}ActiveValue;
}
};
</#if>
<#if enableSort>
/** 排序调整 */
const handleSortChange = async (row: Partial<${BusinessName}VO>) => {
try {
await update${BusinessName}Sort(row.${pkColumn.javaField}, row.${sortField});
modal.msgSuccess('排序更新成功');
} catch (err) {
await getList();
}
};
</#if>
onMounted(() => {
getList();
});
</script>

48
gen/types.ts.ftl Normal file
View File

@ -0,0 +1,48 @@
export interface ${BusinessName}VO {
<#list columns as column>
<#if column.list>
/**
* ${column.columnComment}
*/
${column.javaField}: ${column.tsType};
<#if column.htmlType == "imageUpload">
/**
* ${column.columnComment}Url
*/
${column.javaField}Url: string;
</#if>
</#if>
</#list>
<#if table.tree>
/**
* 子对象
*/
children: ${BusinessName}VO[];
</#if>
}
export interface ${BusinessName}Form extends BaseEntity {
<#list columns as column>
<#if column.insert || column.edit>
/**
* ${column.columnComment}
*/
${column.javaField}?: ${column.tsType};
</#if>
</#list>
}
export interface ${BusinessName}Query<#if !table.tree> extends PageQuery</#if> {
<#list columns as column>
<#if column.query>
/**
* ${column.columnComment}
*/
${column.javaField}?: ${column.tsType};
</#if>
</#list>
/**
* 日期范围参数
*/
params?: any;
}

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
<!DOCTYPE html>
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
@ -6,12 +6,12 @@
<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<link rel="icon" href="/favicon.ico" />
<title>RuoYi-Vue-Plus多租户管理系统</title>
<!--[if lt IE 11
]><script>
window.location.href='/html/ie.html';
</script><!
[endif]-->
<title>%VITE_APP_TITLE%</title>
<!--[if lt IE 11]>
<script>
window.location.href = '/ie.html';
</script>
<![endif]-->
<style>
html,
body,
@ -47,7 +47,7 @@
margin: -75px 0 0 -75px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
border-top-color: #fff;
-webkit-animation: spin 2s linear infinite;
-ms-animation: spin 2s linear infinite;
-moz-animation: spin 2s linear infinite;
@ -57,7 +57,7 @@
}
#loader:before {
content: "";
content: '';
position: absolute;
top: 5px;
left: 5px;
@ -65,7 +65,7 @@
bottom: 5px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
border-top-color: #fff;
-webkit-animation: spin 3s linear infinite;
-moz-animation: spin 3s linear infinite;
-o-animation: spin 3s linear infinite;
@ -74,7 +74,7 @@
}
#loader:after {
content: "";
content: '';
position: absolute;
top: 15px;
left: 15px;
@ -82,7 +82,7 @@
bottom: 15px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
border-top-color: #fff;
-moz-animation: spin 1.5s linear infinite;
-o-animation: spin 1.5s linear infinite;
-ms-animation: spin 1.5s linear infinite;
@ -90,7 +90,6 @@
animation: spin 1.5s linear infinite;
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
@ -119,13 +118,12 @@
}
}
#loader-wrapper .loader-section {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: #7171C6;
background: #7171c6;
z-index: 1000;
-webkit-transform: translateX(0);
-ms-transform: translateX(0);
@ -140,21 +138,20 @@
right: 0;
}
.loaded #loader-wrapper .loader-section.section-left {
-webkit-transform: translateX(-100%);
-ms-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.loaded #loader-wrapper .loader-section.section-right {
-webkit-transform: translateX(100%);
-ms-transform: translateX(100%);
transform: translateX(100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.loaded #loader {
@ -182,7 +179,7 @@
#loader-wrapper .load_title {
font-family: 'Open Sans';
color: #FFF;
color: #fff;
font-size: 19px;
width: 100%;
text-align: center;
@ -197,7 +194,7 @@
font-weight: normal;
font-style: italic;
font-size: 13px;
color: #FFF;
color: #fff;
opacity: 0.5;
}
</style>

View File

@ -1,84 +1,82 @@
{
"$schema": "https://json.schemastore.org/package",
"name": "ruoyi-vue-plus",
"version": "5.1.0",
"description": "RuoYi-Vue-Plus多租户管理系统",
"author": "LionLi",
"version": "6.0.0",
"description": "RuoYi-Vue-Plus后台管理系统",
"license": "MIT",
"scripts": {
"dev": "vite serve --mode development",
"build:prod": "vite build --mode production &&vue-tsc --noEmit",
"preview": "vite preview",
"lint": "eslint src/**/*.{ts,js,vue} --fix",
"prepare": "husky install",
"prettier": "prettier --write ."
},
"author": "LionLi",
"repository": {
"type": "git",
"url": "https://gitee.com/JavaLionLi/plus-ui.git"
},
"packageManager": "pnpm@10.34.5",
"type": "module",
"scripts": {
"build": "vite build --mode production",
"build:dev": "vite build --mode development",
"build:prod": "vite build --mode production",
"dev": "vite serve --mode development",
"fmt": "oxfmt .",
"lint": "oxlint src",
"lint:fix": "oxlint --fix src",
"preview": "vite preview"
},
"dependencies": {
"@element-plus/icons-vue": "2.1.0",
"@vueup/vue-quill": "1.1.0",
"@vueuse/core": "9.5.0",
"@element-plus/icons-vue": "2.3.2",
"@highlightjs/vue-plugin": "2.1.2",
"@iconify/vue": "^5.0.1",
"@noble/ciphers": "^2.4.0",
"@vueuse/core": "14.4.0",
"@wangeditor-next/editor": "6.4.1",
"@wangeditor-next/editor-for-vue": "6.4.1",
"animate.css": "4.1.1",
"await-to-js": "^3.0.0",
"axios": "^1.3.4",
"echarts": "5.4.0",
"element-plus": "2.2.27",
"file-saver": "2.0.5",
"fuse.js": "6.6.2",
"js-cookie": "3.0.1",
"jsencrypt": "3.3.1",
"crypto-js": "^4.1.1",
"await-to-js": "3.0.0",
"axios": "1.20.0",
"echarts": "6.1.0",
"element-plus": "2.14.5",
"highlight.js": "11.12.0",
"image-conversion": "2.1.1",
"jsencrypt": "3.5.4",
"nprogress": "0.2.0",
"path-browserify": "1.0.1",
"path-to-regexp": "6.2.0",
"pinia": "2.0.22",
"screenfull": "6.0.0",
"vform3-builds": "3.0.8",
"vue": "3.2.45",
"vue-cropper": "1.0.3",
"vue-i18n": "9.2.2",
"vue-router": "4.1.4",
"vue-types": "^5.0.3"
"pinia": "4.0.3",
"vue": "3.5.42",
"vue-cropper": "1.1.4",
"vue-i18n": "11.4.10",
"vue-json-pretty": "2.6.0",
"vue-router": "5.3.1",
"vue-types": "7.0.0",
"vxe-pc-ui": "4.18.9",
"vxe-table": "4.21.9"
},
"devDependencies": {
"@iconify/json": "^2.2.40",
"@intlify/unplugin-vue-i18n": "0.8.2",
"@types/crypto-js": "^4.1.1",
"@types/file-saver": "2.0.5",
"@types/js-cookie": "3.0.3",
"@types/node": "18.14.2",
"@types/nprogress": "0.2.0",
"@types/path-browserify": "^1.0.0",
"@typescript-eslint/eslint-plugin": "5.56.0",
"@typescript-eslint/parser": "5.56.0",
"@unocss/preset-attributify": "^0.50.6",
"@unocss/preset-icons": "^0.50.6",
"@unocss/preset-uno": "^0.50.6",
"@vitejs/plugin-vue": "4.0.0",
"@vue/compiler-sfc": "3.2.45",
"autoprefixer": "10.4.14",
"eslint": "8.36.0",
"eslint-config-prettier": "8.8.0",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-vue": "9.9.0",
"fast-glob": "^3.2.11",
"husky": "7.0.4",
"postcss": "^8.4.21",
"prettier": "2.8.6",
"sass": "1.56.1",
"typescript": "4.9.5",
"unocss": "^0.50.6",
"unplugin-auto-import": "0.13.0",
"unplugin-icons": "0.15.1",
"unplugin-vue-components": "0.23.0",
"vite": "4.3.1",
"vite-plugin-compression": "0.5.1",
"vite-plugin-svg-icons": "2.0.1",
"unplugin-vue-setup-extend-plus": "0.4.9",
"vitest": "^0.29.7",
"vue-eslint-parser": "9.1.0",
"vue-tsc": "0.35.0"
"@types/node": "^26.1.1",
"@types/nprogress": "0.2.3",
"@unocss/preset-attributify": "66.10.1",
"@unocss/preset-wind3": "66.10.1",
"@vitejs/plugin-vue": "^6.0.8",
"@vue/compiler-sfc": "3.5.42",
"autoprefixer": "10.5.5",
"oxfmt": "^0.67.0",
"oxlint": "^1.82.0",
"sass": "1.104.0",
"typescript": "^6.0.3",
"unocss": "66.10.1",
"unplugin-auto-import": "21.1.0",
"unplugin-vue-components": "32.1.0",
"unplugin-vue-setup-extend-plus": "1.0.1",
"vite": "^8.2.2",
"vite-plugin-svg-icons-ng": "^1.9.3",
"vitest": "4.1.11",
"vue-tsc": "^3.3.11"
},
"browserslist": [
"Chrome >= 87",
"Edge >= 88",
"Safari >= 14",
"Firefox >= 78"
],
"engines": {
"node": ">=20.19.0",
"pnpm": ">=10.0.0"
}
}

4906
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

10
pnpm-workspace.yaml Normal file
View File

@ -0,0 +1,10 @@
packages:
- '.'
allowBuilds:
'@parcel/watcher': true
es5-ext: true
esbuild: true
overrides:
esbuild: 0.28.1

258
public/ie.html Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,21 +1,20 @@
<template>
<el-config-provider :locale="appStore.locale" :size="size">
<el-config-provider :locale="appStore.locale" :size="appStore.size">
<router-view />
</el-config-provider>
</template>
<script setup lang="ts">
import useSettingsStore from '@/store/modules/settings'
import { handleThemeStyle } from '@/utils/theme'
import useAppStore from '@/store/modules/app';
import { useAppStore } from '@/store/modules/app';
import { useSettingsStore } from '@/store/modules/settings';
import { handleThemeStyle } from '@/utils/theme';
const appStore = useAppStore();
const size = computed(() => appStore.size as any);
onMounted(() => {
nextTick(() => {
//
handleThemeStyle(useSettingsStore().theme)
})
})
handleThemeStyle(useSettingsStore().theme);
});
});
</script>

10
src/api/ai/agent/index.ts Normal file
View File

@ -0,0 +1,10 @@
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import type { SnailOpenApiUser } from './types';
export const registerCurrentSnailUser = (): AxiosPromise<SnailOpenApiUser> => {
return request({
url: '/snail-ai/user/register',
method: 'post'
});
};

View File

@ -0,0 +1,6 @@
export interface SnailOpenApiUser {
openId: string;
nickname?: string;
externalId?: string;
created?: boolean;
}

2
src/api/ai/index.ts Normal file
View File

@ -0,0 +1,2 @@
export * from './agent';
export * from './agent/types';

View File

@ -1,13 +1,14 @@
import type { DemoForm, DemoQuery, DemoVO } from '@/api/demo/demo/types';
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DemoVO, DemoForm, DemoQuery } from '@/api/demo/demo/types';
/**
*
* @param query
* @returns {*}
*/
export const listDemo = (query?: DemoQuery): AxiosPromise<DemoVO[]> => {
export const listDemo = (query?: DemoQuery): AxiosPromise<PageResult<DemoVO>> => {
return request({
url: '/demo/demo/list',
method: 'get',

View File

@ -1,6 +1,6 @@
import type { TreeForm, TreeQuery, TreeVO } from '@/api/demo/tree/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { TreeVO, TreeForm, TreeQuery } from '@/api/demo/tree/types';
/**
*

View File

@ -1,7 +1,8 @@
import type { UserInfo } from '@/api/system/user/types';
import type { AxiosPromise } from '@/utils/api-types';
import { closePush } from '@/utils/push';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { LoginData, LoginResult, VerifyCodeResult, TenantInfo } from './types';
import { UserInfo } from '@/api/system/user/types';
import type { LoginData, LoginResult, VerifyCodeResult } from './types';
// pc端固定客户端授权id
const clientId = import.meta.env.VITE_APP_CLIENT_ID;
@ -20,7 +21,8 @@ export function login(data: LoginData): AxiosPromise<LoginResult> {
url: '/auth/login',
headers: {
isToken: false,
isEncrypt: true
isEncrypt: true,
repeatSubmit: false
},
method: 'post',
data: params
@ -29,14 +31,20 @@ export function login(data: LoginData): AxiosPromise<LoginResult> {
// 注册方法
export function register(data: any) {
const params = {
...data,
clientId: clientId,
grantType: 'password'
};
return request({
url: '/auth/register',
headers: {
isToken: false,
isEncrypt: true
isEncrypt: true,
repeatSubmit: false
},
method: 'post',
data: data
data: params
});
}
@ -44,6 +52,16 @@ export function register(data: any) {
*
*/
export function logout() {
closePush();
if (
import.meta.env.VITE_APP_MESSAGE_ENABLED === 'true' &&
import.meta.env.VITE_APP_MESSAGE_TRANSPORT.toLowerCase() === 'sse'
) {
request({
url: import.meta.env.VITE_APP_MESSAGE_PATH + '/close',
method: 'get'
});
}
return request({
url: '/auth/logout',
method: 'post'
@ -87,14 +105,3 @@ export function getInfo(): AxiosPromise<UserInfo> {
method: 'get'
});
}
// 获取租户列表
export function getTenantList(): AxiosPromise<TenantInfo> {
return request({
url: '/auth/tenant/list',
headers: {
isToken: false
},
method: 'get'
});
}

View File

@ -1,6 +1,6 @@
import type { RouteRecordRaw } from 'vue-router';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { RouteRecordRaw } from 'vue-router';
// 获取路由
export function getRouters(): AxiosPromise<RouteRecordRaw[]> {

View File

@ -1,6 +1,6 @@
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { CacheVO } from './types';
import type { CacheVO } from './types';
// 查询缓存详细
export function getCache(): AxiosPromise<CacheVO> {
@ -10,50 +10,3 @@ export function getCache(): AxiosPromise<CacheVO> {
});
}
// 查询缓存名称列表
export function listCacheName() {
return request({
url: '/monitor/cache/getNames',
method: 'get'
});
}
// 查询缓存键名列表
export function listCacheKey(cacheName: string) {
return request({
url: '/monitor/cache/getKeys/' + cacheName,
method: 'get'
});
}
// 查询缓存内容
export function getCacheValue(cacheName: string, cacheKey: string) {
return request({
url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey,
method: 'get'
});
}
// 清理指定名称缓存
export function clearCacheName(cacheName: string) {
return request({
url: '/monitor/cache/clearCacheName/' + cacheName,
method: 'delete'
});
}
// 清理指定键名缓存
export function clearCacheKey(cacheName: string, cacheKey: string) {
return request({
url: '/monitor/cache/clearCacheKey/' + cacheName + '/' + cacheKey,
method: 'delete'
});
}
// 清理全部缓存
export function clearCacheAll() {
return request({
url: '/monitor/cache/clearCacheAll',
method: 'delete'
});
}

View File

@ -1,11 +1,12 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { LoginInfoQuery, LoginInfoVO } from './types';
import { AxiosPromise } from 'axios';
import type { LoginInfoQuery, LoginInfoVO } from './types';
// 查询登录日志列表
export function list(query: LoginInfoQuery): AxiosPromise<LoginInfoVO[]> {
export function list(query: LoginInfoQuery): AxiosPromise<PageResult<LoginInfoVO>> {
return request({
url: '/monitor/logininfor/list',
url: '/monitor/loginInfo/list',
method: 'get',
params: query
});
@ -14,7 +15,7 @@ export function list(query: LoginInfoQuery): AxiosPromise<LoginInfoVO[]> {
// 删除登录日志
export function delLoginInfo(infoId: string | number | Array<string | number>) {
return request({
url: '/monitor/logininfor/' + infoId,
url: '/monitor/loginInfo/' + infoId,
method: 'delete'
});
}
@ -22,7 +23,7 @@ export function delLoginInfo(infoId: string | number | Array<string | number>) {
// 解锁用户登录状态
export function unlockLoginInfo(userName: string | Array<string>) {
return request({
url: '/monitor/logininfor/unlock/' + userName,
url: '/monitor/loginInfo/unlock/' + userName,
method: 'get'
});
}
@ -30,7 +31,7 @@ export function unlockLoginInfo(userName: string | Array<string>) {
// 清空登录日志
export function cleanLoginInfo() {
return request({
url: '/monitor/logininfor/clean',
url: '/monitor/loginInfo/clean',
method: 'delete'
});
}

View File

@ -1,9 +1,10 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { OnlineQuery, OnlineVO } from './types';
import { AxiosPromise } from 'axios';
import type { OnlineQuery, OnlineVO } from './types';
// 查询在线用户列表
export function list(query: OnlineQuery): AxiosPromise<OnlineVO[]> {
export function list(query: OnlineQuery): AxiosPromise<PageResult<OnlineVO>> {
return request({
url: '/monitor/online/list',
method: 'get',
@ -18,3 +19,19 @@ export function forceLogout(tokenId: string) {
method: 'delete'
});
}
// 获取当前用户登录在线设备
export function getOnline() {
return request({
url: '/monitor/online',
method: 'get'
});
}
// 删除当前在线设备
export function delOnline(tokenId: string) {
return request({
url: '/monitor/online/myself/' + tokenId,
method: 'delete'
});
}

View File

@ -1,9 +1,10 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { OperLogQuery, OperLogVO } from './types';
import { AxiosPromise } from 'axios';
import type { OperLogQuery, OperLogVO } from './types';
// 查询操作日志列表
export function list(query: OperLogQuery): AxiosPromise<OperLogVO[]> {
export function list(query: OperLogQuery): AxiosPromise<PageResult<OperLogVO>> {
return request({
url: '/monitor/operlog/list',
method: 'get',

View File

@ -1,6 +1,13 @@
export interface OperLogQuery extends PageQuery {
operIp: string;
title: string;
operName: string;
userId: string;
deptId: string;
clientKey: string;
deviceType: string;
browser: string;
os: string;
businessType: string;
status: string;
orderByColumn: string;
@ -17,7 +24,13 @@ export interface OperLogVO extends BaseEntity {
requestMethod: string;
operatorType: number;
operName: string;
userId: string | number;
deptId: string | number;
deptName: string;
clientKey: string;
deviceType: string;
browser: string;
os: string;
operUrl: string;
operIp: string;
operLocation: string;
@ -39,7 +52,13 @@ export interface OperLogForm {
requestMethod: string;
operatorType: number;
operName: string;
userId: string | number | undefined;
deptId: string | number | undefined;
deptName: string;
clientKey: string;
deviceType: string;
browser: string;
os: string;
operUrl: string;
operIp: string;
operLocation: string;

View File

@ -1,6 +1,7 @@
import type { ClientForm, ClientQuery, ClientVO } from '@/api/system/client/types';
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { ClientVO, ClientForm, ClientQuery } from '@/api/system/client/types';
/**
*
@ -8,7 +9,7 @@ import { ClientVO, ClientForm, ClientQuery } from '@/api/system/client/types';
* @returns {*}
*/
export const listClient = (query?: ClientQuery): AxiosPromise<ClientVO[]> => {
export const listClient = (query?: ClientQuery): AxiosPromise<PageResult<ClientVO>> => {
return request({
url: '/system/client/list',
method: 'get',
@ -64,12 +65,12 @@ export const delClient = (id: string | number | Array<string | number>) => {
/**
*
* @param id ID
* @param clientId id
* @param status
*/
export function changeStatus(id: number | string, status: string) {
export function changeStatus(clientId: string, status: string) {
const data = {
id,
clientId,
status
};
return request({

View File

@ -7,7 +7,7 @@ export interface ClientVO {
/**
* id
*/
clientId: string | number;
clientId: string;
/**
* key
@ -29,6 +29,26 @@ export interface ClientVO {
*/
deviceType: string;
/**
* 访
*/
accessPath?: string;
/**
* 访
*/
accessPathList?: string[];
/**
* IP白名单
*/
ipWhitelist?: string;
/**
* IP白名单列表
*/
ipWhitelistList?: string[];
/**
* token活跃超时时间
*/
@ -76,6 +96,26 @@ export interface ClientForm extends BaseEntity {
*/
deviceType?: string;
/**
* 访
*/
accessPath?: string;
/**
* 访
*/
accessPathList?: string[];
/**
* IP白名单
*/
ipWhitelist?: string;
/**
* IP白名单列表
*/
ipWhitelistList?: string[];
/**
* token活跃超时时间
*/
@ -118,6 +158,16 @@ export interface ClientQuery extends PageQuery {
*/
deviceType?: string;
/**
* 访
*/
accessPath?: string;
/**
* IP白名单
*/
ipWhitelist?: string;
/**
* token活跃超时时间
*/

View File

@ -1,9 +1,10 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { ConfigForm, ConfigQuery, ConfigVO } from './types';
import { AxiosPromise } from 'axios';
import type { ConfigForm, ConfigQuery, ConfigVO } from './types';
// 查询参数列表
export function listConfig(query: ConfigQuery): AxiosPromise<ConfigVO[]> {
export function listConfig(query: ConfigQuery): AxiosPromise<PageResult<ConfigVO>> {
return request({
url: '/system/config/list',
method: 'get',
@ -20,7 +21,7 @@ export function getConfig(configId: string | number): AxiosPromise<ConfigVO> {
}
// 根据参数键名查询参数值
export function getConfigKey(configKey: string): AxiosPromise<ConfigVO> {
export function getConfigKey(configKey: string): AxiosPromise<string> {
return request({
url: '/system/config/configKey/' + configKey,
method: 'get'

View File

@ -1,6 +1,6 @@
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DeptForm, DeptQuery, DeptVO } from './types';
import { type DeptForm, type DeptQuery, type DeptVO } from './types';
// 查询部门列表
export const listDept = (query?: DeptQuery) => {
@ -11,6 +11,17 @@ export const listDept = (query?: DeptQuery) => {
});
};
/**
* deptIds查询部门
* @param deptIds
*/
export const optionSelect = (deptIds: (number | string)[]): AxiosPromise<DeptVO[]> => {
return request({
url: '/system/dept/optionselect?deptIds=' + deptIds,
method: 'get'
});
};
// 查询部门列表(排除节点)
export const listDeptExcludeChild = (deptId: string | number): AxiosPromise<DeptVO[]> => {
return request({
@ -27,14 +38,6 @@ export const getDept = (deptId: string | number): AxiosPromise<DeptVO> => {
});
};
// 查询部门下拉树结构
export const treeselect = (): AxiosPromise<DeptVO[]> => {
return request({
url: '/system/dept/treeselect',
method: 'get'
});
};
// 新增部门
export const addDept = (data: DeptForm) => {
return request({

View File

@ -3,6 +3,7 @@
*/
export interface DeptQuery extends PageQuery {
deptName?: string;
deptCategory?: string;
status?: number;
}
@ -16,6 +17,7 @@ export interface DeptVO extends BaseEntity {
children: DeptVO[];
deptId: number | string;
deptName: string;
deptCategory: string;
orderNum: number;
leader: string;
phone: string;
@ -26,6 +28,18 @@ export interface DeptVO extends BaseEntity {
menuId: string | number;
}
/**
*
*/
export interface DeptTreeVO extends BaseEntity {
id: number | string;
label: string;
parentId: number | string;
weight: number;
children: DeptTreeVO[];
disabled: boolean;
}
/**
*
*/
@ -35,6 +49,7 @@ export interface DeptForm {
children?: DeptForm[];
deptId?: number | string;
deptName?: string;
deptCategory?: string;
orderNum?: number;
leader?: string;
phone?: string;

View File

@ -1,6 +1,7 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DictDataForm, DictDataQuery, DictDataVO } from './types';
import type { DictDataForm, DictDataQuery, DictDataVO } from './types';
// 根据字典类型查询字典数据信息
export function getDicts(dictType: string): AxiosPromise<DictDataVO[]> {
return request({
@ -10,7 +11,7 @@ export function getDicts(dictType: string): AxiosPromise<DictDataVO[]> {
}
// 查询字典数据列表
export function listData(query: DictDataQuery): AxiosPromise<DictDataVO[]> {
export function listData(query: DictDataQuery): AxiosPromise<PageResult<DictDataVO>> {
return request({
url: '/system/dict/data/list',
method: 'get',

View File

@ -1,9 +1,10 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { DictTypeForm, DictTypeVO, DictTypeQuery } from './types';
import { AxiosPromise } from 'axios';
import type { DictTypeForm, DictTypeQuery, DictTypeVO } from './types';
// 查询字典类型列表
export function listType(query: DictTypeQuery): AxiosPromise<DictTypeVO[]> {
export function listType(query: DictTypeQuery): AxiosPromise<PageResult<DictTypeVO>> {
return request({
url: '/system/dict/type/list',
method: 'get',

View File

@ -1,6 +1,6 @@
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { MenuQuery, MenuVO, MenuForm, MenuTreeOption, RoleMenuTree } from './types';
import type { MenuForm, MenuQuery, MenuTreeOption, MenuVO, RoleMenuTree } from './types';
// 查询菜单列表
export const listMenu = (query?: MenuQuery): AxiosPromise<MenuVO[]> => {
@ -35,14 +35,6 @@ export const roleMenuTreeselect = (roleId: string | number): AxiosPromise<RoleMe
});
};
// 根据角色ID查询菜单下拉树结构
export const tenantPackageMenuTreeselect = (packageId: string | number): AxiosPromise<RoleMenuTree> => {
return request({
url: '/system/menu/tenantPackageMenuTreeselect/' + packageId,
method: 'get'
});
};
// 新增菜单
export const addMenu = (data: MenuForm) => {
return request({
@ -68,3 +60,11 @@ export const delMenu = (menuId: string | number) => {
method: 'delete'
});
};
// 级联删除菜单
export const cascadeDelMenu = (menuIds: Array<string | number>) => {
return request({
url: '/system/menu/cascade/' + menuIds,
method: 'delete'
});
};

View File

@ -1,4 +1,4 @@
import { MenuTypeEnum } from '@/enums/MenuTypeEnum';
import type { MenuTypeEnum } from '@/enums/MenuTypeEnum';
/**
*
@ -8,12 +8,28 @@ export interface MenuTreeOption {
label: string;
parentId: string | number;
weight: number;
menuType?: MenuTypeEnum | string;
visible?: string;
status?: string;
disabled?: boolean;
children?: MenuTreeOption[];
}
export interface RoleMenuTree {
menus: MenuTreeOption[];
checkedKeys: string[];
checkedKeys: Array<string | number>;
}
/**
*
*/
export interface RoleMenuButtonOption {
menuId: string | number;
menuName: string;
parentId: string | number;
perms?: string;
status?: string;
disabled?: boolean;
}
/**
@ -44,6 +60,8 @@ export interface MenuVO extends BaseEntity {
visible: string;
status: string;
icon: string;
activeMenu: string;
ext: string;
remark: string;
}
@ -63,6 +81,8 @@ export interface MenuForm {
visible?: string;
status?: string;
icon?: string;
activeMenu?: string;
ext?: string;
remark?: string;
query?: string;
perms?: string;

View File

@ -0,0 +1,10 @@
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import type { MessageBoxVO } from './types';
export function getMessageBox(): AxiosPromise<MessageBoxVO> {
return request({
url: '/resource/message/box',
method: 'get'
});
}

View File

@ -0,0 +1,17 @@
export interface MessageVO extends BaseEntity {
messageId: number | string;
category: string;
type: string;
source: string;
title: string;
message: string;
content?: string;
data?: Record<string, any> | null;
path?: string;
}
export interface MessageBoxVO {
systemList: MessageVO[];
noticeList: MessageVO[];
workflowList: MessageVO[];
}

View File

@ -1,8 +1,9 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { NoticeForm, NoticeQuery, NoticeVO } from './types';
import { AxiosPromise } from 'axios';
import type { NoticeForm, NoticeQuery, NoticeVO } from './types';
// 查询公告列表
export function listNotice(query: NoticeQuery): AxiosPromise<NoticeVO[]> {
export function listNotice(query: NoticeQuery): AxiosPromise<PageResult<NoticeVO>> {
return request({
url: '/system/notice/list',
method: 'get',

View File

@ -1,9 +1,10 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { OssQuery, OssVO } from './types';
import { AxiosPromise } from 'axios';
import type { OssQuery, OssUploadVO, OssVO } from './types';
// 查询OSS对象存储列表
export function listOss(query: OssQuery): AxiosPromise<OssVO[]> {
export function listOss(query: OssQuery): AxiosPromise<PageResult<OssVO>> {
return request({
url: '/resource/oss/list',
method: 'get',
@ -19,6 +20,15 @@ export function listByIds(ossId: string | number): AxiosPromise<OssVO[]> {
});
}
// 上传OSS对象存储
export function uploadOss(data: FormData): AxiosPromise<OssUploadVO> {
return request({
url: '/resource/oss/upload',
method: 'post',
data
});
}
// 删除OSS对象存储
export function delOss(ossId: string | number | Array<string | number>) {
return request({

View File

@ -8,6 +8,12 @@ export interface OssVO extends BaseEntity {
service: string;
}
export interface OssUploadVO {
url: string;
fileName: string;
ossId: string;
}
export interface OssQuery extends PageQuery {
fileName: string;
originalName: string;
@ -20,3 +26,17 @@ export interface OssQuery extends PageQuery {
export interface OssForm {
file: undefined | string;
}
export interface SysOssExt {
bizType?: string;
fileSize?: number;
contentType?: string;
source?: string;
uploadIp?: string;
remark?: string;
tags?: string[];
refId?: string;
refType?: string;
isTemp?: boolean;
md5?: string;
}

View File

@ -1,9 +1,10 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { OssConfigForm, OssConfigQuery, OssConfigVO } from './types';
import { AxiosPromise } from 'axios';
import type { OssConfigForm, OssConfigQuery, OssConfigVO } from './types';
// 查询对象存储配置列表
export function listOssConfig(query: OssConfigQuery): AxiosPromise<OssConfigVO[]> {
export function listOssConfig(query: OssConfigQuery): AxiosPromise<PageResult<OssConfigVO>> {
return request({
url: '/resource/oss/config/list',
method: 'get',

View File

@ -6,7 +6,7 @@ export interface OssConfigVO extends BaseEntity {
bucketName: string;
prefix: string;
endpoint: string;
domain: string;
domainUrl: string;
isHttps: string;
region: string;
status: string;
@ -29,7 +29,7 @@ export interface OssConfigForm {
bucketName: string;
prefix: string;
endpoint: string;
domain: string;
domainUrl: string;
isHttps: string;
accessPolicy: string;
region: string;

View File

@ -1,9 +1,11 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { PostForm, PostQuery, PostVO } from './types';
import { AxiosPromise } from 'axios';
import type { DeptTreeVO } from '../dept/types';
import type { PostForm, PostQuery, PostVO } from './types';
// 查询岗位列表
export function listPost(query: PostQuery): AxiosPromise<PostVO[]> {
export function listPost(query: PostQuery): AxiosPromise<PageResult<PostVO>> {
return request({
url: '/system/post/list',
method: 'get',
@ -19,6 +21,18 @@ export function getPost(postId: string | number): AxiosPromise<PostVO> {
});
}
// 获取岗位选择框列表
export function optionselect(deptId?: number | string, postIds?: (number | string)[]): AxiosPromise<PostVO[]> {
return request({
url: '/system/post/optionselect',
method: 'get',
params: {
postIds: postIds,
deptId: deptId
}
});
}
// 新增岗位
export function addPost(data: PostForm) {
return request({
@ -44,3 +58,13 @@ export function delPost(postId: string | number | (string | number)[]) {
method: 'delete'
});
}
/**
*
*/
export const deptTreeSelect = (): AxiosPromise<DeptTreeVO[]> => {
return request({
url: '/system/post/deptTree',
method: 'get'
});
};

View File

@ -1,7 +1,10 @@
export interface PostVO extends BaseEntity {
postId: number | string;
deptId: number | string;
postCode: string;
postName: string;
postCategory: string;
deptName: string;
postSort: number;
status: string;
remark: string;
@ -9,15 +12,20 @@ export interface PostVO extends BaseEntity {
export interface PostForm {
postId: number | string | undefined;
deptId: number | string | undefined;
postCode: string;
postName: string;
postCategory: string;
postSort: number;
status: string;
remark: string;
}
export interface PostQuery extends PageQuery {
deptId: number | string;
belongDeptId: number | string;
postCode: string;
postName: string;
postCategory: string;
status: string;
}

View File

@ -1,10 +1,10 @@
import { UserVO } from '@/api/system/user/types';
import { UserQuery } from '@/api/system/user/types';
import { AxiosPromise } from 'axios';
import { RoleQuery, RoleVO, RoleDeptTree } from './types';
import type { UserQuery, UserVO } from '@/api/system/user/types';
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import type { RoleDeptTree, RoleQuery, RoleVO } from './types';
export const listRole = (query: RoleQuery): AxiosPromise<RoleVO[]> => {
export const listRole = (query: RoleQuery): AxiosPromise<PageResult<RoleVO>> => {
return request({
url: '/system/role/list',
method: 'get',
@ -12,6 +12,17 @@ export const listRole = (query: RoleQuery): AxiosPromise<RoleVO[]> => {
});
};
/**
* roleIds查询角色
* @param roleIds
*/
export const optionSelect = (roleIds: (number | string)[]): AxiosPromise<RoleVO[]> => {
return request({
url: '/system/role/optionselect?roleIds=' + roleIds,
method: 'get'
});
};
/**
*
*/
@ -34,7 +45,7 @@ export const addRole = (data: any) => {
};
/**
*
*
* @param data
*/
export const updateRole = (data: any) => {
@ -46,11 +57,11 @@ export const updateRole = (data: any) => {
};
/**
*
* +
*/
export const dataScope = (data: any) => {
export const updateRolePermission = (data: any) => {
return request({
url: '/system/role/dataScope',
url: '/system/role/permission',
method: 'put',
data: data
});
@ -84,7 +95,7 @@ export const delRole = (roleId: Array<string | number> | string | number) => {
/**
*
*/
export const allocatedUserList = (query: UserQuery): AxiosPromise<UserVO[]> => {
export const allocatedUserList = (query: UserQuery): AxiosPromise<PageResult<UserVO>> => {
return request({
url: '/system/role/authUser/allocatedList',
method: 'get',
@ -95,7 +106,7 @@ export const allocatedUserList = (query: UserQuery): AxiosPromise<UserVO[]> => {
/**
*
*/
export const unallocatedUserList = (query: UserQuery): AxiosPromise<UserVO[]> => {
export const unallocatedUserList = (query: UserQuery): AxiosPromise<PageResult<UserVO>> => {
return request({
url: '/system/role/authUser/unallocatedList',
method: 'get',
@ -142,3 +153,8 @@ export const deptTreeSelect = (roleId: string | number): AxiosPromise<RoleDeptTr
method: 'get'
});
};
export default {
optionSelect,
listRole
};

View File

@ -1,7 +1,7 @@
import request from '@/utils/request';
// 绑定账号
export function authBinding(source: string) {
// 获取跳转URL
export function authRouterUrl(source: string) {
return request({
url: '/auth/binding/' + source,
method: 'get'

View File

@ -1,92 +0,0 @@
import request from '@/utils/request';
import { TenantForm, TenantQuery, TenantVO } from './types';
import { AxiosPromise } from 'axios';
// 查询租户列表
export function listTenant(query: TenantQuery): AxiosPromise<TenantVO[]> {
return request({
url: '/system/tenant/list',
method: 'get',
params: query
});
}
// 查询租户详细
export function getTenant(id: string | number): AxiosPromise<TenantVO> {
return request({
url: '/system/tenant/' + id,
method: 'get'
});
}
// 新增租户
export function addTenant(data: TenantForm) {
return request({
url: '/system/tenant',
method: 'post',
headers: {
isEncrypt: true
},
data: data
});
}
// 修改租户
export function updateTenant(data: TenantForm) {
return request({
url: '/system/tenant',
method: 'put',
data: data
});
}
// 租户状态修改
export function changeTenantStatus(id: string | number, tenantId: string | number, status: string) {
const data = {
id,
tenantId,
status
};
return request({
url: '/system/tenant/changeStatus',
method: 'put',
data: data
});
}
// 删除租户
export function delTenant(id: string | number | Array<string | number>) {
return request({
url: '/system/tenant/' + id,
method: 'delete'
});
}
// 动态切换租户
export function dynamicTenant(tenantId: string | number) {
return request({
url: '/system/tenant/dynamic/' + tenantId,
method: 'get'
});
}
// 清除动态租户
export function dynamicClear() {
return request({
url: '/system/tenant/dynamic/clear',
method: 'get'
});
}
// 同步租户套餐
export function syncTenantPackage(tenantId: string | number, packageId: string | number) {
const data = {
tenantId,
packageId
};
return request({
url: '/system/tenant/syncTenantPackage',
method: 'get',
params: data
});
}

View File

@ -1,46 +0,0 @@
export interface TenantVO extends BaseEntity {
id: number | string;
tenantId: number | string;
username: string;
contactUserName: string;
contactPhone: string;
companyName: string;
licenseNumber: string;
address: string;
domain: string;
intro: string;
remark: string;
packageId: string | number;
expireTime: string;
accountCount: number;
status: string;
}
export interface TenantQuery extends PageQuery {
tenantId: string | number;
contactUserName: string;
contactPhone: string;
companyName: string;
}
export interface TenantForm {
id: number | string | undefined;
tenantId: number | string | undefined;
username: string;
password: string;
contactUserName: string;
contactPhone: string;
companyName: string;
licenseNumber: string;
domain: string;
address: string;
intro: string;
remark: string;
packageId: string | number;
expireTime: string;
accountCount: number;
status: string;
}

View File

@ -1,67 +0,0 @@
import request from '@/utils/request';
import { TenantPkgForm, TenantPkgQuery, TenantPkgVO } from './types';
import { AxiosPromise } from 'axios';
// 查询租户套餐列表
export function listTenantPackage(query?: TenantPkgQuery): AxiosPromise<TenantPkgVO[]> {
return request({
url: '/system/tenant/package/list',
method: 'get',
params: query
});
}
// 查询租户套餐下拉选列表
export function selectTenantPackage(): AxiosPromise<TenantPkgVO[]> {
return request({
url: '/system/tenant/package/selectList',
method: 'get'
});
}
// 查询租户套餐详细
export function getTenantPackage(packageId: string | number): AxiosPromise<TenantPkgVO> {
return request({
url: '/system/tenant/package/' + packageId,
method: 'get'
});
}
// 新增租户套餐
export function addTenantPackage(data: TenantPkgForm) {
return request({
url: '/system/tenant/package',
method: 'post',
data: data
});
}
// 修改租户套餐
export function updateTenantPackage(data: TenantPkgForm) {
return request({
url: '/system/tenant/package',
method: 'put',
data: data
});
}
// 租户套餐状态修改
export function changePackageStatus(packageId: number | string, status: string) {
const data = {
packageId,
status
};
return request({
url: '/system/tenant/package/changeStatus',
method: 'put',
data: data
});
}
// 删除租户套餐
export function delTenantPackage(packageId: string | number | Array<string | number>) {
return request({
url: '/system/tenant/package/' + packageId,
method: 'delete'
});
}

View File

@ -1,20 +0,0 @@
export interface TenantPkgVO extends BaseEntity {
packageId: string | number;
packageName: string;
menuIds: string;
remark: string;
menuCheckStrictly: boolean;
status: string;
}
export interface TenantPkgQuery extends PageQuery {
packageName: string;
}
export interface TenantPkgForm {
packageId: string | number | undefined;
packageName: string;
menuIds: string;
remark: string;
menuCheckStrictly: boolean;
}

View File

@ -1,15 +1,16 @@
import { DeptVO } from './../dept/types';
import { RoleVO } from '@/api/system/role/types';
import type { RoleVO } from '@/api/system/role/types';
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { UserForm, UserQuery, UserVO, UserInfoVO } from './types';
import { parseStrEmpty } from '@/utils/ruoyi';
import type { DeptTreeVO } from './../dept/types';
import type { UserForm, UserInfoVO, UserProfileForm, UserQuery, UserVO } from './types';
/**
*
* @param query
*/
export const listUser = (query: UserQuery): AxiosPromise<UserVO[]> => {
export const listUser = (query: UserQuery): AxiosPromise<PageResult<UserVO>> => {
return request({
url: '/system/user/list',
method: 'get',
@ -17,6 +18,17 @@ export const listUser = (query: UserQuery): AxiosPromise<UserVO[]> => {
});
};
/**
* ids查询用户
* @param userIds
*/
export const optionSelect = (userIds: (number | string)[]): AxiosPromise<UserVO[]> => {
return request({
url: '/system/user/optionselect?userIds=' + userIds,
method: 'get'
});
};
/**
*
* @param userId
@ -75,7 +87,8 @@ export const resetUserPwd = (userId: string | number, password: string) => {
url: '/system/user/resetPwd',
method: 'put',
headers: {
isEncrypt: true
isEncrypt: true,
repeatSubmit: false
},
data: data
});
@ -98,6 +111,17 @@ export const changeUserStatus = (userId: number | string, status: string) => {
});
};
/**
*
* @param userId ID
*/
export const unlockUser = (userId: number | string) => {
return request({
url: '/system/user/unlock/' + userId,
method: 'get'
});
};
/**
*
*/
@ -112,7 +136,7 @@ export const getUserProfile = (): AxiosPromise<UserInfoVO> => {
*
* @param data
*/
export const updateUserProfile = (data: UserForm) => {
export const updateUserProfile = (data: UserProfileForm) => {
return request({
url: '/system/user/profile',
method: 'put',
@ -134,20 +158,9 @@ export const updateUserPwd = (oldPassword: string, newPassword: string) => {
url: '/system/user/profile/updatePwd',
method: 'put',
headers: {
isEncrypt: true
isEncrypt: true,
repeatSubmit: false
},
params: data
});
};
/**
*
* @param data
*/
export const uploadAvatar = (data: FormData) => {
return request({
url: '/system/user/profile/avatar',
method: 'post',
data: data
});
};
@ -189,7 +202,7 @@ export const listUserByDeptId = (deptId: string | number): AxiosPromise<UserVO[]
/**
*
*/
export const deptTreeSelect = (): AxiosPromise<DeptVO[]> => {
export const deptTreeSelect = (): AxiosPromise<DeptTreeVO[]> => {
return request({
url: '/system/user/deptTree',
method: 'get'
@ -199,15 +212,16 @@ export const deptTreeSelect = (): AxiosPromise<DeptVO[]> => {
export default {
listUser,
getUser,
optionSelect,
addUser,
updateUser,
delUser,
resetUserPwd,
changeUserStatus,
unlockUser,
getUserProfile,
updateUserProfile,
updateUserPwd,
uploadAvatar,
getAuthRole,
updateAuthRole,
deptTreeSelect,

View File

@ -1,6 +1,5 @@
import { DeptVO } from './../dept/types';
import { RoleVO } from '@/api/system/role/types';
import { PostVO } from '@/api/system/post/types';
import type { PostVO } from '@/api/system/post/types';
import type { RoleVO } from '@/api/system/role/types';
/**
*
@ -16,10 +15,12 @@ export interface UserInfo {
*/
export interface UserQuery extends PageQuery {
userName?: string;
phonenumber?: string;
nickName?: string;
phoneNumber?: string;
status?: string;
deptId?: string | number;
roleId?: string | number;
userIds?: string | number | (string | number)[] | undefined;
}
/**
@ -27,20 +28,24 @@ export interface UserQuery extends PageQuery {
*/
export interface UserVO extends BaseEntity {
userId: string | number;
tenantId: string;
deptId: number;
userName: string;
nickName: string;
userType: string;
email: string;
phonenumber: string;
sex: string;
avatar: string;
phoneNumber: string;
gender: string;
avatar?: string | number;
avatarUrl?: string;
status: string;
delFlag: string;
loginIp: string;
loginDate: string;
remark: string;
dept: DeptVO;
deptName: string;
/** 详情接口可能返回嵌套部门 */
dept?: { deptName?: string };
roles: RoleVO[];
roleIds: any;
postIds: any;
@ -58,15 +63,27 @@ export interface UserForm {
userName: string;
nickName?: string;
password: string;
phonenumber?: string;
phoneNumber?: string;
email?: string;
sex?: string;
gender?: string;
status: string;
remark?: string;
avatar?: string | number;
postIds: string[];
roleIds: string[];
}
/**
*
*/
export interface UserProfileForm {
nickName?: string;
phoneNumber?: string;
email?: string;
gender?: string;
avatar?: string | number;
}
export interface UserInfoVO {
user: UserVO;
roles: RoleVO[];

View File

@ -1,9 +1,12 @@
import type { PageResult } from '@/api/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
import { DbTableQuery, DbTableVO, TableQuery, TableVO, GenTableVO, DbTableForm } from './types';
import { AxiosPromise } from 'axios';
import type { DbTableForm, DbTableQuery, DbTableVO, GenTableDetailPayload, TableQuery, TableVO } from './types';
export type { GenTableDetailPayload } from './types';
// 查询生成表数据
export const listTable = (query: TableQuery): AxiosPromise<TableVO[]> => {
export const listTable = (query: TableQuery): AxiosPromise<PageResult<TableVO>> => {
return request({
url: '/tool/gen/list',
method: 'get',
@ -11,7 +14,7 @@ export const listTable = (query: TableQuery): AxiosPromise<TableVO[]> => {
});
};
// 查询db数据库列表
export const listDbTable = (query: DbTableQuery): AxiosPromise<DbTableVO[]> => {
export const listDbTable = (query: DbTableQuery): AxiosPromise<PageResult<DbTableVO>> => {
return request({
url: '/tool/gen/db/list',
method: 'get',
@ -20,7 +23,7 @@ export const listDbTable = (query: DbTableQuery): AxiosPromise<DbTableVO[]> => {
};
// 查询表详细信息
export const getGenTable = (tableId: string | number): AxiosPromise<GenTableVO> => {
export const getGenTable = (tableId: string | number): AxiosPromise<GenTableDetailPayload> => {
return request({
url: '/tool/gen/' + tableId,
method: 'get'
@ -28,7 +31,7 @@ export const getGenTable = (tableId: string | number): AxiosPromise<GenTableVO>
};
// 修改代码生成信息
export const updateGenTable = (data: DbTableForm) => {
export const updateGenTable = (data: DbTableForm): AxiosPromise<unknown> => {
return request({
url: '/tool/gen',
method: 'put',
@ -37,7 +40,7 @@ export const updateGenTable = (data: DbTableForm) => {
};
// 导入表
export const importTable = (data: { tables: string; dataName: string }) => {
export const importTable = (data: { tables: string; dataName: string }): AxiosPromise<unknown> => {
return request({
url: '/tool/gen/importTable',
method: 'post',
@ -61,14 +64,6 @@ export const delTable = (tableId: string | number | Array<string | number>) => {
});
};
// 生成代码(自定义路径)
export const genCode = (tableId: string | number) => {
return request({
url: '/tool/gen/genCode/' + tableId,
method: 'get'
});
};
// 同步数据库
export const synchDb = (tableId: string | number) => {
return request({

View File

@ -4,17 +4,14 @@ export interface TableVO extends BaseEntity {
dataName: string;
tableName: string;
tableComment: string;
subTableName?: any;
subTableFkName?: any;
className: string;
tplCategory: string;
frontendType: string;
packageName: string;
moduleName: string;
businessName: string;
functionName: string;
functionAuthor: string;
genType: string;
genPath: string;
pkColumn?: any;
columns?: any;
options?: any;
@ -25,6 +22,16 @@ export interface TableVO extends BaseEntity {
menuIds?: any;
parentMenuId?: any;
parentMenuName?: any;
enableExport?: boolean;
enableStatus?: boolean;
statusField?: string;
enableUnique?: boolean;
uniqueFields?: string[];
enableSort?: boolean;
sortField?: string;
treeRootValue?: string;
treeAncestorsField?: string;
treeOrderField?: string;
tree: boolean;
crud: boolean;
}
@ -72,17 +79,14 @@ export interface DbTableVO {
tableId?: any;
tableName: string;
tableComment: string;
subTableName?: any;
subTableFkName?: any;
className?: any;
tplCategory?: any;
frontendType?: string;
packageName?: any;
moduleName?: any;
businessName?: any;
functionName?: any;
functionAuthor?: any;
genType?: any;
genPath?: any;
pkColumn?: any;
columns: DbColumnVO[];
options?: any;
@ -93,6 +97,16 @@ export interface DbTableVO {
menuIds?: any;
parentMenuId?: any;
parentMenuName?: any;
enableExport?: boolean;
enableStatus?: boolean;
statusField?: string;
enableUnique?: boolean;
uniqueFields?: string[];
enableSort?: boolean;
sortField?: string;
treeRootValue?: string;
treeAncestorsField?: string;
treeOrderField?: string;
tree: boolean;
crud: boolean;
}
@ -103,10 +117,14 @@ export interface DbTableQuery extends PageQuery {
tableComment: string;
}
export interface GenTableVO {
/**
* data
* - info GenTable
* - rows GenTableColumn[]
*/
export interface GenTableDetailPayload {
info: DbTableVO;
rows: DbColumnVO[];
tables: DbTableVO[];
}
export interface DbColumnForm extends BaseEntity {
@ -146,6 +164,16 @@ export interface DbParamForm {
treeName?: any;
treeParentCode?: any;
parentMenuId: string;
enableExport?: boolean;
enableStatus?: boolean;
statusField?: string;
enableUnique?: boolean;
uniqueFields?: string[];
enableSort?: boolean;
sortField?: string;
treeRootValue?: string;
treeAncestorsField?: string;
treeOrderField?: string;
}
export interface DbTableForm extends BaseEntity {
@ -153,17 +181,14 @@ export interface DbTableForm extends BaseEntity {
tableId: string | string;
tableName: string;
tableComment: string;
subTableName?: any;
subTableFkName?: any;
className: string;
tplCategory: string;
frontendType: string;
packageName: string;
moduleName: string;
businessName: string;
functionName: string;
functionAuthor: string;
genType: string;
genPath: string;
pkColumn?: any;
columns: DbColumnForm[];
options: string;
@ -174,6 +199,16 @@ export interface DbTableForm extends BaseEntity {
menuIds?: any;
parentMenuId: string;
parentMenuName?: any;
enableExport?: boolean;
enableStatus?: boolean;
statusField?: string;
enableUnique?: boolean;
uniqueFields?: string[];
enableSort?: boolean;
sortField?: string;
treeRootValue?: string;
treeAncestorsField?: string;
treeOrderField?: string;
tree: boolean;
crud: boolean;
params: DbParamForm;

View File

@ -2,7 +2,6 @@
*
*/
export type RegisterForm = {
tenantId: string;
username: string;
password: string;
confirmPassword?: string;
@ -15,7 +14,6 @@ export type RegisterForm = {
*
*/
export interface LoginData {
tenantId?: string;
username?: string;
password?: string;
rememberMe?: boolean;
@ -45,15 +43,9 @@ export interface VerifyCodeResult {
}
/**
*
*
*/
export interface TenantVO {
companyName: string;
domain: any;
tenantId: string;
}
export interface TenantInfo {
tenantEnabled: boolean;
voList: TenantVO[];
export interface PageResult<T = any> {
total: number;
rows: T[];
}

View File

@ -0,0 +1,76 @@
import type { CategoryForm, CategoryQuery, CategoryTreeVO, CategoryVO } from '@/api/workflow/category/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
/**
*
* @param query
* @returns {*}
*/
export const listCategory = (query?: CategoryQuery): AxiosPromise<CategoryVO[]> => {
return request({
url: '/workflow/category/list',
method: 'get',
params: query
});
};
/**
*
* @param categoryId
*/
export const getCategory = (categoryId: string | number): AxiosPromise<CategoryVO> => {
return request({
url: '/workflow/category/' + categoryId,
method: 'get'
});
};
/**
*
* @param data
*/
export const addCategory = (data: CategoryForm) => {
return request({
url: '/workflow/category',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateCategory = (data: CategoryForm) => {
return request({
url: '/workflow/category',
method: 'put',
data: data
});
};
/**
*
* @param categoryId
*/
export const delCategory = (categoryId: string | number | Array<string | number>) => {
return request({
url: '/workflow/category/' + categoryId,
method: 'delete'
});
};
/**
*
* @param query id
* @returns
*/
export const categoryTree = (query?: CategoryForm): AxiosPromise<CategoryTreeVO[]> => {
return request({
url: `/workflow/category/categoryTree`,
method: 'get',
params: query
});
};

View File

@ -0,0 +1,67 @@
export interface CategoryTreeVO {
id: number | string;
label: string;
parentId: number | string;
weight: number;
children: CategoryTreeVO[];
}
export interface CategoryVO {
/**
* ID
*/
categoryId: string | number;
/**
* id
*/
parentId: string | number;
/**
*
*/
categoryName: string;
/**
*
*/
orderNum: number;
/**
*
*/
createTime: string;
/**
*
*/
children: CategoryVO[];
}
export interface CategoryForm extends BaseEntity {
/**
* ID
*/
categoryId?: string | number;
/**
*
*/
categoryName?: string;
/**
* id
*/
parentId?: string | number;
/**
*
*/
orderNum?: number;
}
export interface CategoryQuery {
/**
*
*/
categoryName?: string;
}

View File

@ -0,0 +1,176 @@
import type { PageResult } from '@/api/types';
import type {
definitionXmlVO,
FlowDefinitionForm,
FlowDefinitionQuery,
FlowDefinitionVo
} from '@/api/workflow/definition/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
/**
*
* @param query id
* @returns
*/
export const listDefinition = (query: FlowDefinitionQuery): AxiosPromise<PageResult<FlowDefinitionVo>> => {
return request({
url: `/workflow/definition/list`,
method: 'get',
params: query
});
};
/**
*
* @param query id
* @returns
*/
export const unPublishList = (query: FlowDefinitionQuery): AxiosPromise<PageResult<FlowDefinitionVo>> => {
return request({
url: `/workflow/definition/unPublishList`,
method: 'get',
params: query
});
};
/**
* id获取xml
* @param definitionId id
* @returns
*/
export const definitionXml = (definitionId: string): AxiosPromise<definitionXmlVO> => {
return request({
url: `/workflow/definition/definitionXml/${definitionId}`,
method: 'get'
});
};
/**
*
* @param id id
* @returns
*/
export const deleteDefinition = (id: string | string[]) => {
return request({
url: `/workflow/definition/${id}`,
method: 'delete'
});
};
/**
* /
* @param definitionId id
* @param activityStatus
* @returns
*/
export const active = (definitionId: string, activityStatus: boolean) => {
return request({
url: `/workflow/definition/active/${definitionId}`,
method: 'put',
params: {
active: activityStatus
}
});
};
/**
* zip或xml部署流程定义
* @returns
*/
export function importDef(data: any) {
return request({
url: '/workflow/definition/importDef',
method: 'post',
data: data,
headers: {
repeatSubmit: false
}
});
}
/**
*
* @param id id
* @returns
*/
export const publish = (id: string) => {
return request({
url: `/workflow/definition/publish/${id}`,
method: 'put'
});
};
/**
*
* @param id id
* @returns
*/
export const unPublish = (id: string) => {
return request({
url: `/workflow/definition/unPublish/${id}`,
method: 'put'
});
};
/**
* xml字符串
* @param id id
* @returns
*/
export const xmlString = (id: string) => {
return request({
url: `/workflow/definition/xmlString/${id}`,
method: 'get'
});
};
/**
*
* @param data
* @returns
*/
export const add = (data: FlowDefinitionForm) => {
return request({
url: `/workflow/definition`,
method: 'post',
data: data
});
};
/**
*
* @param data
* @returns
*/
export const edit = (data: FlowDefinitionForm) => {
return request({
url: `/workflow/definition`,
method: 'put',
data: data
});
};
/**
*
* @param id
* @returns
*/
export const getInfo = (id: number | string) => {
return request({
url: `/workflow/definition/${id}`,
method: 'get'
});
};
/**
*
* @param id id
* @returns
*/
export const copy = (id: string) => {
return request({
url: `/workflow/definition/copy/${id}`,
method: 'post'
});
};

View File

@ -0,0 +1,34 @@
export interface FlowDefinitionQuery extends PageQuery {
flowCode?: string;
flowName?: string;
category: string | number;
isPublish?: number;
}
export interface FlowDefinitionVo {
id: string;
flowName: string;
flowCode: string;
formPath: string;
version: string;
isPublish: number;
activityStatus: number;
createTime: Date;
updateTime: Date;
}
export interface FlowDefinitionForm {
id: string;
flowName: string;
flowCode: string;
category: string;
ext: string;
formPath: string;
formCustom: string;
modelValue: string;
}
export interface definitionXmlVO {
xml: string[];
xmlStr: string;
}

View File

@ -0,0 +1,126 @@
import type { PageResult } from '@/api/types';
import type { FlowInstanceQuery, FlowInstanceVO } from '@/api/workflow/instance/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
/**
*
* @param query
* @returns {*}
*/
export const pageByRunning = (query: FlowInstanceQuery): AxiosPromise<PageResult<FlowInstanceVO>> => {
return request({
url: '/workflow/instance/pageByRunning',
method: 'get',
params: query
});
};
/**
*
* @param query
* @returns {*}
*/
export const pageByFinish = (query: FlowInstanceQuery): AxiosPromise<PageResult<FlowInstanceVO>> => {
return request({
url: '/workflow/instance/pageByFinish',
method: 'get',
params: query
});
};
/**
* id获取历史流程图
*/
export const flowHisTaskList = (businessId: string | number) => {
return request({
url: `/workflow/instance/flowHisTaskList/${businessId}?t=${Math.random()}`,
method: 'get'
});
};
/**
*
* @param query
* @returns {*}
*/
export const pageByCurrent = (query: FlowInstanceQuery): AxiosPromise<PageResult<FlowInstanceVO>> => {
return request({
url: '/workflow/instance/pageByCurrent',
method: 'get',
params: query
});
};
/**
*
* @param data
* @returns
*/
export const cancelProcessApply = (data: any) => {
return request({
url: `/workflow/instance/cancelProcessApply`,
method: 'put',
data: data
});
};
/**
*
* @param instanceId id
* @returns
*/
export const instanceVariable = (instanceId: string | number) => {
return request({
url: `/workflow/instance/instanceVariable/${instanceId}`,
method: 'get'
});
};
/**
*
* @param instanceIds id
* @returns
*/
export const deleteByInstanceIds = (instanceIds: Array<string | number> | string | number) => {
return request({
url: `/workflow/instance/deleteByInstanceIds/${instanceIds}`,
method: 'delete'
});
};
/**
*
* @param instanceIds
*/
export const deleteHisByInstanceIds = (instanceIds: Array<string | number> | string | number) => {
return request({
url: `/workflow/instance/deleteHisByInstanceIds/${instanceIds}`,
method: 'delete'
});
};
/**
*
* @param data
* @returns
*/
export const invalid = (data: any) => {
return request({
url: `/workflow/instance/invalid`,
method: 'post',
data: data
});
};
/**
*
* @param data
* @returns
*/
export const updateVariable = (data: any) => {
return request({
url: `/workflow/instance/updateVariable`,
method: 'put',
data: data
});
};

View File

@ -0,0 +1,28 @@
import type { FlowTaskVO } from '@/api/workflow/task/types';
export interface FlowInstanceQuery extends PageQuery {
category?: string | number;
nodeName?: string;
flowCode?: string;
flowName?: string;
createByIds?: Array<string | number>;
businessId?: string;
}
export interface FlowInstanceVO extends BaseEntity {
id: string | number;
definitionId: string;
flowName: string;
flowCode: string;
version: string;
businessId: string;
activityStatus: number;
tenantId: string;
createTime: string;
createBy: string;
flowStatus: string;
flowStatusName: string;
flowTaskList: FlowTaskVO[];
businessCode: string;
businessTitle: string;
}

View File

@ -0,0 +1,76 @@
import type { PageResult } from '@/api/types';
import type { LeaveForm, LeaveQuery, LeaveVO } from '@/api/workflow/leave/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
/**
*
* @param query
* @returns {*}
*/
export const listLeave = (query?: LeaveQuery): AxiosPromise<PageResult<LeaveVO>> => {
return request({
url: '/workflow/leave/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getLeave = (id: string | number): AxiosPromise<LeaveVO> => {
return request({
url: '/workflow/leave/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addLeave = (data: LeaveForm): AxiosPromise<LeaveVO> => {
return request({
url: '/workflow/leave',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const submitAndFlowStart = (data: LeaveForm): AxiosPromise<LeaveVO> => {
return request({
url: '/workflow/leave/submitAndFlowStart',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateLeave = (data: LeaveForm): AxiosPromise<LeaveVO> => {
return request({
url: '/workflow/leave',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delLeave = (id: string | number | Array<string | number>) => {
return request({
url: '/workflow/leave/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,26 @@
export interface LeaveVO {
id: string | number;
applyCode?: string;
leaveType: string;
startDate: string;
endDate: string;
leaveDays: number;
remark: string;
status?: string;
}
export interface LeaveForm extends BaseEntity {
id?: string | number;
applyCode?: string;
leaveType?: string;
startDate?: string;
endDate?: string;
leaveDays?: number;
remark?: string;
status?: string;
}
export interface LeaveQuery extends PageQuery {
startLeaveDays?: number;
endLeaveDays?: number;
}

View File

@ -0,0 +1,64 @@
import type { PageResult } from '@/api/types';
import type { SpelForm, SpelQuery, SpelVO } from '@/api/workflow/spel/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
/**
* spel表达式定义列表
* @param query
* @returns {*}
*/
export const listSpel = (query?: SpelQuery): AxiosPromise<PageResult<SpelVO>> => {
return request({
url: '/workflow/spel/list',
method: 'get',
params: query
});
};
/**
* spel表达式定义详细
* @param id
*/
export const getSpel = (id: string | number): AxiosPromise<SpelVO> => {
return request({
url: '/workflow/spel/' + id,
method: 'get'
});
};
/**
* spel表达式定义
* @param data
*/
export const addSpel = (data: SpelForm) => {
return request({
url: '/workflow/spel',
method: 'post',
data: data
});
};
/**
* spel表达式定义
* @param data
*/
export const updateSpel = (data: SpelForm) => {
return request({
url: '/workflow/spel',
method: 'put',
data: data
});
};
/**
* spel表达式定义
* @param id
*/
export const delSpel = (id: string | number | Array<string | number>) => {
return request({
url: '/workflow/spel/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,105 @@
export interface SpelVO {
/**
* id
*/
id: string | number;
/**
*
*/
componentName: string;
/**
*
*/
methodName: string;
/**
*
*/
methodParams: string;
/**
* spel值
*/
viewSpel: string;
/**
* 0 1
*/
status: string;
/**
*
*/
remark?: string;
}
export interface SpelForm extends BaseEntity {
/**
* id
*/
id?: string | number;
/**
*
*/
componentName?: string;
/**
*
*/
methodName?: string;
/**
*
*/
methodParams?: string;
/**
* spel值
*/
viewSpel?: string;
/**
* 0 1
*/
status?: string;
/**
*
*/
remark?: string;
}
export interface SpelQuery extends PageQuery {
/**
*
*/
componentName?: string;
/**
*
*/
methodName?: string;
/**
*
*/
methodParams?: string;
/**
* spel值
*/
viewSpel?: string;
/**
* 0 1
*/
status?: string;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,207 @@
import type { PageResult } from '@/api/types';
import type { FlowTaskVO, TaskOperationBo, TaskQuery } from '@/api/workflow/task/types';
import type { AxiosPromise } from '@/utils/api-types';
import request from '@/utils/request';
/**
*
* @param query
* @returns {*}
*/
export const pageByTaskWait = (query: TaskQuery): AxiosPromise<PageResult<FlowTaskVO>> => {
return request({
url: '/workflow/task/pageByTaskWait',
method: 'get',
params: query
});
};
/**
*
* @param query
* @returns {*}
*/
export const pageByTaskFinish = (query: TaskQuery): AxiosPromise<PageResult<FlowTaskVO>> => {
return request({
url: '/workflow/task/pageByTaskFinish',
method: 'get',
params: query
});
};
/**
*
* @param query
* @returns {*}
*/
export const pageByTaskCopy = (query: TaskQuery): AxiosPromise<PageResult<FlowTaskVO>> => {
return request({
url: '/workflow/task/pageByTaskCopy',
method: 'get',
params: query
});
};
/**
*
* @param query
* @returns {*}
*/
export const pageByAllTaskWait = (query: TaskQuery): AxiosPromise<PageResult<FlowTaskVO>> => {
return request({
url: '/workflow/task/pageByAllTaskWait',
method: 'get',
params: query
});
};
/**
*
* @param query
* @returns {*}
*/
export const pageByAllTaskFinish = (query: TaskQuery): AxiosPromise<PageResult<FlowTaskVO>> => {
return request({
url: '/workflow/task/pageByAllTaskFinish',
method: 'get',
params: query
});
};
/**
*
* @param data
* @returns {*}
*/
export const startWorkFlow = (data: object): any => {
return request({
url: '/workflow/task/startWorkFlow',
method: 'post',
data: data
});
};
/**
*
* @param data
* @returns {*}
*/
export const completeTask = (data: object) => {
return request({
url: '/workflow/task/completeTask',
method: 'post',
data: data
});
};
/**
*
* @param data
* @returns {*}
*/
export const backProcess = (data: any): any => {
return request({
url: '/workflow/task/backProcess',
method: 'post',
data: data
});
};
/**
*
* @param taskId
* @returns
*/
export const getTask = (taskId: string) => {
return request({
url: '/workflow/task/getTask/' + taskId,
method: 'get'
});
};
/**
*
* @param taskIdList
* @param userId
* @returns
*/
export const updateAssignee = (taskIdList: Array<string>, userId: string) => {
return request({
url: `/workflow/task/updateAssignee/${userId}`,
method: 'put',
data: taskIdList
});
};
/**
*
* @returns
*/
export const terminationTask = (data: any) => {
return request({
url: `/workflow/task/terminationTask`,
method: 'post',
data: data
});
};
/**
*
* @returns
*/
export const getBackTaskNode = (taskId: string | number, nodeCode: string) => {
return request({
url: `/workflow/task/getBackTaskNode/${taskId}/${nodeCode}`,
method: 'get'
});
};
/**
* delegateTask transferTask addSignature reductionSignature
* @returns
*/
export const taskOperation = (data: TaskOperationBo, operation: string) => {
return request({
url: `/workflow/task/taskOperation/${operation}`,
method: 'post',
data: data
});
};
/**
*
* @param taskId id
* @returns
*/
export const currentTaskAllUser = (taskId: string | number) => {
return request({
url: `/workflow/task/currentTaskAllUser/${taskId}`,
method: 'get'
});
};
/**
*
* @param data参数
* @returns
*/
export const getNextNodeList = (data: any): any => {
return request({
url: '/workflow/task/getNextNodeList',
method: 'post',
data: data
});
};
/**
*
* @param data参数
* @returns
*/
export const urgeTask = (data: any): any => {
return request({
url: '/workflow/task/urgeTask',
method: 'post',
data: data
});
};

View File

@ -0,0 +1,60 @@
export interface TaskQuery extends PageQuery {
nodeName?: string;
flowCode?: string;
flowName?: string;
createByIds?: Array<string | number>;
}
export interface ParticipantVo {
groupIds?: string[] | number[];
candidate: string[] | number[];
candidateName: string[];
claim: boolean;
}
export interface FlowTaskVO {
id: string | number;
createTime?: Date;
updateTime?: Date;
tenantId?: string;
definitionId?: string;
instanceId: string;
flowName: string;
businessId: string;
nodeCode: string;
nodeName: string;
flowCode: string;
flowStatus: string;
formCustom: string;
formPath: string;
nodeType: number;
nodeRatio: string | number;
version?: string;
applyNode?: boolean;
buttonList?: ButtonList[];
copyList?: FlowCopyVo[];
varList?: Map<string, string>;
businessCode: string;
businessTitle: string;
}
export interface ButtonList {
code: string;
show: boolean;
}
export interface FlowCopyVo {
userId: string | number;
nickName: string;
}
export interface TaskOperationBo {
//委派/转办人的用户ID必填准对委派/转办人操作)
userId?: string;
//加签/减签人的用户ID列表必填针对加签/减签操作)
userIds?: string[];
//任务ID必填
taskId: string | number;
//消息类型
messageType?: string[];
//意见或备注信息(可选)
message?: string;
}

View File

@ -0,0 +1,17 @@
import type { RouterJumpVo } from '@/api/workflow/workflowCommon/types';
import tab from '@/plugins/tab';
import router from '@/router';
export default {
routerJump(routerJumpVo: RouterJumpVo) {
tab.closePage(router.currentRoute.value);
router.push({
path: routerJumpVo.formPath,
query: {
id: routerJumpVo.businessId,
type: routerJumpVo.type,
taskId: routerJumpVo.taskId
}
});
}
};

View File

@ -0,0 +1,14 @@
export interface RouterJumpVo {
businessId: string;
taskId: string | number;
type: string;
formCustom: string;
formPath: string;
}
export interface StartProcessBo {
businessId: string | number;
flowCode: string;
variables: any;
bizExt: any;
}

View File

@ -1 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1588670460195" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1314" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M230.4 307.712c13.824 0 25.088-11.264 25.088-25.088 0-100.352 81.92-182.272 182.272-182.272s182.272 81.408 182.272 182.272c0 13.824 11.264 25.088 25.088 25.088s25.088-11.264 24.576-25.088c0-127.488-103.936-231.936-231.936-231.936S205.824 154.624 205.824 282.624c-0.512 14.336 10.752 25.088 24.576 25.088z m564.736 234.496c-11.264 0-21.504 2.048-31.232 6.144 0-44.544-40.448-81.92-88.064-81.92-14.848 0-28.16 3.584-39.936 10.24-13.824-28.16-44.544-48.128-78.848-48.128-12.288 0-24.576 2.56-35.328 7.68V284.16c0-45.568-37.888-81.92-84.48-81.92s-84.48 36.864-84.48 81.92v348.672l-69.12-112.64c-18.432-28.16-58.368-36.864-91.136-19.968-26.624 14.336-46.592 47.104-30.208 88.064 3.072 8.192 76.8 205.312 171.52 311.296 0 0 28.16 24.576 43.008 58.88 4.096 9.728 13.312 15.36 22.528 15.36 3.072 0 6.656-0.512 9.728-2.048 12.288-5.12 18.432-19.968 12.8-32.256-19.456-44.544-53.76-74.752-53.76-74.752C281.6 768 209.408 573.44 208.384 570.88c-5.12-12.8-2.56-20.992 7.168-26.112 9.216-4.608 21.504-4.608 26.112 2.56l113.152 184.32c4.096 8.704 12.8 14.336 22.528 14.336 13.824 0 25.088-10.752 25.088-25.088V284.16c0-17.92 15.36-32.256 34.816-32.256s34.816 14.336 34.816 32.256v284.16c0 13.824 10.24 25.088 24.576 25.088 13.824 0 25.088-11.264 25.088-25.088v-57.344c0-17.92 15.36-32.768 34.816-32.768 19.968 0 37.376 15.36 37.376 32.768v95.232c0 7.168 3.072 13.312 7.68 17.92 4.608 4.608 10.752 7.168 17.92 7.168 13.824 0 24.576-11.264 24.576-25.088V547.84c0-18.432 13.824-32.256 32.256-32.256 20.48 0 38.912 15.36 38.912 32.256v95.232c0 13.824 11.264 25.088 25.088 25.088s24.576-11.264 25.088-25.088v-18.944c0-18.944 12.8-32.256 30.72-32.256 18.432 0 22.528 18.944 22.528 31.744 0 1.024-11.776 99.84-50.688 173.056-30.72 58.368-45.056 112.128-51.2 146.944-2.56 13.312 6.656 26.112 19.968 28.672 1.536 0 3.072 0.512 4.608 0.512 11.776 0 22.016-8.192 24.064-20.48 5.632-31.232 18.432-79.36 46.08-132.608 43.52-81.92 55.808-186.88 56.32-193.536-0.512-50.688-29.696-83.968-72.704-83.968z"></path></path></svg>
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1588670460195" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1314" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M230.4 307.712c13.824 0 25.088-11.264 25.088-25.088 0-100.352 81.92-182.272 182.272-182.272s182.272 81.408 182.272 182.272c0 13.824 11.264 25.088 25.088 25.088s25.088-11.264 24.576-25.088c0-127.488-103.936-231.936-231.936-231.936S205.824 154.624 205.824 282.624c-0.512 14.336 10.752 25.088 24.576 25.088z m564.736 234.496c-11.264 0-21.504 2.048-31.232 6.144 0-44.544-40.448-81.92-88.064-81.92-14.848 0-28.16 3.584-39.936 10.24-13.824-28.16-44.544-48.128-78.848-48.128-12.288 0-24.576 2.56-35.328 7.68V284.16c0-45.568-37.888-81.92-84.48-81.92s-84.48 36.864-84.48 81.92v348.672l-69.12-112.64c-18.432-28.16-58.368-36.864-91.136-19.968-26.624 14.336-46.592 47.104-30.208 88.064 3.072 8.192 76.8 205.312 171.52 311.296 0 0 28.16 24.576 43.008 58.88 4.096 9.728 13.312 15.36 22.528 15.36 3.072 0 6.656-0.512 9.728-2.048 12.288-5.12 18.432-19.968 12.8-32.256-19.456-44.544-53.76-74.752-53.76-74.752C281.6 768 209.408 573.44 208.384 570.88c-5.12-12.8-2.56-20.992 7.168-26.112 9.216-4.608 21.504-4.608 26.112 2.56l113.152 184.32c4.096 8.704 12.8 14.336 22.528 14.336 13.824 0 25.088-10.752 25.088-25.088V284.16c0-17.92 15.36-32.256 34.816-32.256s34.816 14.336 34.816 32.256v284.16c0 13.824 10.24 25.088 24.576 25.088 13.824 0 25.088-11.264 25.088-25.088v-57.344c0-17.92 15.36-32.768 34.816-32.768 19.968 0 37.376 15.36 37.376 32.768v95.232c0 7.168 3.072 13.312 7.68 17.92 4.608 4.608 10.752 7.168 17.92 7.168 13.824 0 24.576-11.264 24.576-25.088V547.84c0-18.432 13.824-32.256 32.256-32.256 20.48 0 38.912 15.36 38.912 32.256v95.232c0 13.824 11.264 25.088 25.088 25.088s24.576-11.264 25.088-25.088v-18.944c0-18.944 12.8-32.256 30.72-32.256 18.432 0 22.528 18.944 22.528 31.744 0 1.024-11.776 99.84-50.688 173.056-30.72 58.368-45.056 112.128-51.2 146.944-2.56 13.312 6.656 26.112 19.968 28.672 1.536 0 3.072 0.512 4.608 0.512 11.776 0 22.016-8.192 24.064-20.48 5.632-31.232 18.432-79.36 46.08-132.608 43.52-81.92 55.808-186.88 56.32-193.536-0.512-50.688-29.696-83.968-72.704-83.968z"></path></svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512"><path d="M321.94 98L158.82 237.78a24 24 0 000 36.44L321.94 414c15.57 13.34 39.62 2.28 39.62-18.22v-279.6c0-20.5-24.05-31.56-39.62-18.18z"/></svg>

After

Width:  |  Height:  |  Size: 223 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512"><path d="M190.06 414l163.12-139.78a24 24 0 000-36.44L190.06 98c-15.57-13.34-39.62-2.28-39.62 18.22v279.6c0 20.5 24.05 31.56 39.62 18.18z"/></svg>

After

Width:  |  Height:  |  Size: 223 B

View File

@ -0,0 +1 @@
<svg t="1715954426124" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3305" width="200" height="200"><path d="M664.081597 1023.943114a78.246037 78.246037 0 0 1-78.985549-76.795456v-284.996471a78.27448 78.27448 0 0 1 78.985549-76.93767h280.843828A78.189152 78.189152 0 0 1 1023.939417 662.151187v284.996471a78.246037 78.246037 0 0 1-79.013992 76.795456z m-585.067605 0a78.246037 78.246037 0 0 1-78.985549-76.795456v-284.996471a78.160709 78.160709 0 0 1 78.985549-76.93767h280.786942a78.302923 78.302923 0 0 1 79.042434 76.93767v284.996471h-0.170656a78.246037 78.246037 0 0 1-78.985549 76.795456z m0-585.096048a78.217594 78.217594 0 0 1-78.985549-76.93767V76.912925a78.189152 78.189152 0 0 1 78.957106-76.795456h280.786942a78.27448 78.27448 0 0 1 79.042435 76.93767v284.996471a78.27448 78.27448 0 0 1-79.013992 76.795456z m589.675333-5.688552a77.193655 77.193655 0 0 1-77.990052-75.885288V75.888985a77.25054 77.25054 0 0 1 77.990052-75.942173h277.26004a77.25054 77.25054 0 0 1 77.961609 75.942173v281.384241a77.421197 77.421197 0 0 1-78.132266 75.885288z" p-id="3306" fill="currentColor"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg t="1716006237008" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12400" width="200" height="200"><path d="M738.826039 1005.166431c-150.226824 0-272.00251-121.916235-272.00251-272.303686 0-150.407529 121.775686-272.323765 272.00251-272.323765 150.206745 0 271.982431 121.916235 271.982432 272.323765 0 150.387451-121.775686 272.303686-271.982432 272.303686z m-0.040157-508.225255c-128.582275 0-232.789333 104.347608-232.789333 233.09051s104.207059 233.110588 232.789333 233.110589c128.562196 0 232.769255-104.367686 232.769255-233.110589 0-128.742902-104.207059-233.09051-232.769255-233.09051z m10.561255 318.243138s-3.694431 3.674353-7.408941 3.674353a18.010353 18.010353 0 0 1-25.941333 0l-74.10949-80.916079a17.66902 17.66902 0 0 1 0-25.740549c7.408941-7.368784 22.246902-7.368784 25.941333 0l63.006118 69.872941 129.686588-117.699764a18.010353 18.010353 0 0 1 25.941333 0 17.709176 17.709176 0 0 1 0 25.760627L749.347137 815.184314zM391.529412 682.666667H190.745098a20.078431 20.078431 0 0 1 0-40.156863h200.784314a20.078431 20.078431 0 1 1 0 40.156863zM170.666667 261.019608a20.078431 20.078431 0 0 1 20.078431-20.078432h481.882353a20.078431 20.078431 0 0 1 0 40.156863H190.745098a20.078431 20.078431 0 0 1-20.078431-20.078431z m341.333333 200.784314H190.745098a20.078431 20.078431 0 0 1 0-40.156863h321.254902a20.078431 20.078431 0 0 1 0 40.156863zM813.176471 120.470588a80.313725 80.313725 0 0 0-80.313726-80.313725H130.509804a80.313725 80.313725 0 0 0-80.313726 80.313725v762.980392a80.313725 80.313725 0 0 0 80.313726 80.313726h366.832941a346.112 346.112 0 0 0 40.417882 40.779294H130.509804a120.470588 120.470588 0 0 1-120.470588-120.470588V120.470588a120.470588 120.470588 0 0 1 120.470588-120.470588h602.352941a120.470588 120.470588 0 0 1 120.470588 120.470588v293.667137a340.188863 340.188863 0 0 0-40.156862-8.533333V120.470588z" fill="currentColor" p-id="12401"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1 @@
<svg t="1715953291934" class="icon" viewBox="0 0 1061 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1715" id="mx_n_1715953291935" width="200" height="200"><path d="M447.122465 467.332105L49.240301 268.161564A33.501036 33.501036 0 0 0 0.136043 300.744763v441.020484a33.042117 33.042117 0 0 0 16.06214 27.994016L413.162511 1018.034062a33.959954 33.959954 0 0 0 17.438895 5.50702 33.042117 33.042117 0 0 0 33.042117-33.042118V497.161795a33.042117 33.042117 0 0 0-17.438895-29.82969zM398.018207 931.298504l-331.339011-208.348907v-367.134638l331.339011 162.915996zM1046.010843 263.572381a33.042117 33.042117 0 0 0-31.665363 0L550.838 467.332105a33.042117 33.042117 0 0 0-19.733487 30.288608v493.33717a33.042117 33.042117 0 0 0 49.563176 28.452934l463.048562-265.254776a33.042117 33.042117 0 0 0 16.521059-28.452934V291.566398a33.042117 33.042117 0 0 0-14.685386-27.994017z m-50.939931 441.020484L596.72983 931.298504v-413.026468l397.882163-176.224626zM991.399565 178.672496a33.042117 33.042117 0 0 0-22.486996-29.829689L550.838 1.530034a32.583199 32.583199 0 0 0-19.733487 0L83.659173 158.021173a33.042117 33.042117 0 0 0-4.130264 61.036134l397.882163 199.170541a33.042117 33.042117 0 0 0 14.685386 3.212428 33.959954 33.959954 0 0 0 13.30863 0l463.966399-205.595398a33.042117 33.042117 0 0 0 22.028078-37.172382zM494.391049 349.849021L180.490934 195.193555l358.874108-125.743613 328.126583 112.434982z m0 0" fill="currentColor" p-id="1716"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1 @@
<svg t="1716006583362" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="38505" width="200" height="200"><path d="M733.696 666.624l56.32-65.536-15.36-12.8c-41.472-34.816-87.552-61.44-136.192-79.36 75.264-49.152 124.928-134.144 124.928-230.912 0-152.576-123.904-276.48-276.48-276.48-74.24 0-143.872 28.672-195.584 80.384-52.224 51.712-80.896 121.344-80.896 195.584 0 92.16 45.568 174.08 115.2 224.256-81.408 26.624-156.672 74.752-215.552 144.896C34.304 736.768-4.096 850.944 0.512 968.192l1.024 20.48 86.528-4.608-1.024-19.968c-4.096-96.256 27.136-188.928 88.576-261.12 136.704-162.816 380.416-184.32 543.232-48.64l14.848 12.288zM296.96 278.016c0-106.496 83.456-189.952 189.952-189.952 104.96 0 189.952 84.992 189.952 189.952 0 106.496-83.456 189.952-189.952 189.952S296.96 384.512 296.96 278.016z m690.688 522.24H802.304c13.824-16.896 32.256-38.4 55.808-67.072 7.68-8.192 11.776-19.456 10.752-31.744-1.024-11.776-6.144-22.528-15.36-29.696-8.192-7.68-19.456-11.264-31.232-10.752-12.288 1.024-23.04 6.656-30.208 15.872-38.4 45.568-96.256 114.176-101.376 119.808-7.68 7.68-10.752 15.36-13.312 22.528-4.096 8.704-4.096 16.384-4.096 24.064 0 5.632 0 12.8 3.584 23.04 2.56 7.68 6.144 15.872 13.824 23.552l104.96 124.416 4.096 2.048c9.216 4.096 18.432 6.144 26.624 6.144 8.704 0 21.504-4.096 28.672-11.776 8.704-8.704 13.824-19.968 14.336-31.744 0-10.752-3.584-20.48-11.264-28.16l-54.272-63.488h183.296c19.456 0 35.84-18.944 36.352-43.008v-0.512c0.512-25.088-14.848-43.52-35.84-43.52z" fill="currentColor" p-id="38506"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1 @@
<svg t="1715953932254" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11266" width="200" height="200"><path d="M955.59576334 565.84816928C921.71190561 470.40769794 828.48968821 401.08719229 717.79871055 401.08719229c-111.30100029 0-204.91141024 70.09689085-238.29616047 166.36920831h-253.43576475c-26.23088067 0-47.5261393 24.84446618-47.5261329 55.45640711s21.2952586 55.4564006 47.5261329 55.45640054h242.73267482c6.54385326 41.3150179 23.95716606 79.02537397 49.30074631 110.91280755h-292.03342113c-26.23088067 0-47.5261393 24.84446618-47.5261329 55.45640061s21.2952586 55.4564006 47.5261329 55.45640059h214.0617167a376.93717152 376.93717152 0 0 0-33.44021086 110.91280754h-292.47706801a46.36155474 46.36155474 0 0 1-45.91790151-46.8052016V169.1685161c0-25.06629616 21.23980441-45.36333956 47.35977009-45.3633331h63.38666838v55.45640059c0 50.07713168 67.6013528 55.4564006 110.91280122 55.45640061 43.31144833 0 88.50841878 5.76746809 88.5084187-55.45640061v-55.45640059h44.53149358v55.45640059c0 61.22386864 38.15400297 55.4564006 88.84115713 55.45640061 50.74260854 0 88.56387296 5.76746809 88.56387308-55.45640061v-55.45640059h44.19875511v55.45640059c0 61.22386864 38.43128719 55.4564006 89.11844137 55.45640061s110.91280771-2.82827659 110.91280118-55.45640061v-55.45640059h63.44212904a47.69250853 47.69250853 0 0 1 47.74796275 47.63704778l-0.22182994 394.4059385zM407.96379074 345.63079175h-181.95245955c-26.23088067 0-47.5261393 24.84446618-47.52613946 55.45640054s21.2952586 55.4564006 47.52613946 55.45640711h181.95245955c26.23088067 0 47.5261393-24.84446618 47.52613268-55.45640711s-21.2952586-55.4564006-47.52613268-55.45640054z m325.75090957-166.36920816c-30.61193437 0-55.4564006-18.63335139-55.45640712-41.59230208v-83.18460405c0-22.95895071 24.84446618-41.59230206 55.45640712-41.592302s55.4564006 18.63335139 55.4564006 41.592302v83.18460405c0 22.95895071-24.84446618 41.59230206-55.4564006 41.59230208z m-222.71291552 0c-30.61193437 0-55.4009463-18.63335139-55.4009464-41.59230208v-83.18460405c0-22.95895071 24.84446618-41.59230206 55.4009464-41.592302 30.61193437 0 55.4564006 18.63335139 55.45640054 41.592302v83.18460405c-0.0554542 22.95895071-24.84446618 41.59230206-55.45640054 41.59230208z m-220.6610244 0c-30.61193437 0-55.4009463-18.63335139-55.40094634-41.59230208v-83.18460405c0-22.95895071 24.84446618-41.59230206 55.40094634-41.592302 30.61193437 0 55.4564006 18.63335139 55.45640063 41.592302v83.18460405c0 22.95895071-24.84446618 41.59230206-55.45640063 41.59230208z m443.31847922 665.92048622c-91.28124099 0-165.53736215-74.69977454-165.53736218-166.59103817 0-91.83580289 74.2561211-166.59103164 165.53736218-166.59103164s165.53736215 74.75522879 165.53736218 166.59103164-74.2561211 166.59103164-165.53736218 166.59103817z m-115.73750824-29.33644132c32.1647114 24.45627358 71.98241282 39.59587158 115.68205395 39.59587144 44.14329437 0 84.34918863-15.47233629 116.68026924-40.3722568a235.13514545 235.13514545 0 0 1 105.14533952 195.98292729h-443.6512175c0-80.35632762 41.92504052-153.94697186 106.14355479-195.20654193z" fill="currentColor" p-id="11267"></path></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1 @@
<svg t="1716005059256" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3268" width="200" height="200"><path d="M497.798958 952.225272A345.95419 345.95419 0 0 1 359.273733 892.652247a171.541601 171.541601 0 0 0 7.177473-47.37132A179.436821 179.436821 0 0 0 211.417793 665.126359a345.95419 345.95419 0 0 1 185.896546-380.40606 179.436821 179.436821 0 0 0 317.244299 0 351.696169 351.696169 0 0 1 143.549456 128.476763 35.169617 35.169617 0 0 0 30.145386 16.508188 37.322859 37.322859 0 0 0 19.379177-5.024231 36.605111 36.605111 0 0 0 10.766209-46.653574 424.188644 424.188644 0 0 0-183.743304-160.775391v-13.637198a180.872315 180.872315 0 1 0-358.873642 0 129.194511 129.194511 0 0 0 0 15.79044A423.470897 423.470897 0 0 0 132.465591 600.529103a467.253481 467.253481 0 0 0 6.459726 71.774728A180.154568 180.154568 0 0 0 187.014385 1024a178.001326 178.001326 0 0 0 139.96072-68.185992 430.64837 430.64837 0 0 0 158.62215 62.444014h6.459725a35.887364 35.887364 0 0 0 5.741978-71.774729z m57.419783-861.29674a109.097587 109.097587 0 1 1-108.37984 110.533082A109.097587 109.097587 0 0 1 555.218741 90.928532zM187.014385 952.225272a109.097587 109.097587 0 1 1 108.37984-108.37984A109.097587 109.097587 0 0 1 187.014385 952.225272zM933.471559 617.755038l-104.791103-71.774728a35.887364 35.887364 0 0 0-48.089068 8.612967L560.242972 858.918125a37.322859 37.322859 0 0 0-6.459725 24.403408l9.330714 104.073356a35.169617 35.169617 0 0 0 14.354946 25.838902 38.758353 38.758353 0 0 0 21.532418 7.177473h7.177473l98.331378-21.532419a38.758353 38.758353 0 0 0 22.250166-14.354946L945.673263 665.126359a36.605111 36.605111 0 0 0 5.741978-27.274397 37.322859 37.322859 0 0 0-17.943682-20.096924zM675.800285 930.692853l-45.218079 9.330715-4.306484-49.524563 193.791766-262.695505 45.218079 29.427638z m311.50232-399.067489l-103.355608-66.750497a35.887364 35.887364 0 0 0-49.524563 10.048462 35.169617 35.169617 0 0 0 10.766209 49.524562L947.826505 593.35163a34.45187 34.45187 0 0 0 20.096924 5.741979 37.322859 37.322859 0 0 0 30.145386-15.790441 36.605111 36.605111 0 0 0-10.76621-51.677804z" fill="currentColor" p-id="3269"></path></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

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