diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index 98226d9cd36c44f0488192390c1ece336a51e1a8..cb7058aa8ed76afb3ef00c390cd9c812fe15b714 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -315,6 +315,9 @@ "watchThrottled": true, "watchTriggerable": true, "watchWithFilter": true, - "whenever": true + "whenever": true, + "Slot": true, + "Slots": true, + "createRef": true } } diff --git a/README.md b/README.md index 3b7bd1817cdaa11d008585e4dffa80e68654f9da..1c89bf95f18852950fbb7e0e24b39f1e6cf87ca9 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ - 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [TS](https://www.typescriptlang.org/) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。 - 成员项目: 基于 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) ## 配套后端代码仓库地址 @@ -10,6 +11,11 @@ | 🔥 分布式集群框架 | RuoYi-Vue-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus)
- [GitHub](https://github.com/dromara/RuoYi-Vue-Plus)
- [GitCode](https://gitcode.com/dromara/RuoYi-Vue-Plus) | | 🔥 微服务框架 | RuoYi-Cloud-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Cloud-Plus)
- [GitHub](https://github.com/dromara/RuoYi-Cloud-Plus)
- [GitCode](https://gitcode.com/dromara/RuoYi-Cloud-Plus) | +## 分支说明 + +- ts分支(稳定发布主分支 生产可用) +- dev分支(开发分支 开发过程中使用) + ## 前端运行 ```bash diff --git a/package.json b/package.json index df8c23e8244841a47807d4c98d361870295923e6..fdfe767ada9d7632c8652ee83101849d8d440ed0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package", "name": "ruoyi-vue-plus", - "version": "5.3.1-2.3.0", + "version": "5.4.0-2.4.0", "description": "RuoYi-Vue-Plus多租户管理系统", "author": "LionLi", "license": "MIT", @@ -23,31 +23,31 @@ "@element-plus/icons-vue": "2.3.1", "@highlightjs/vue-plugin": "2.1.0", "@vueup/vue-quill": "1.2.0", - "@vueuse/core": "12.7.0", + "@vueuse/core": "13.1.0", "animate.css": "4.1.1", "await-to-js": "3.0.0", - "axios": "1.7.8", + "axios": "1.8.4", "crypto-js": "4.2.0", - "echarts": "5.5.0", - "element-plus": "2.8.8", + "echarts": "5.6.0", + "element-plus": "2.9.8", "file-saver": "2.0.5", "highlight.js": "11.9.0", "image-conversion": "2.1.1", "js-cookie": "3.0.5", "jsencrypt": "3.3.2", "nprogress": "0.2.0", - "pinia": "2.2.6", + "pinia": "3.0.2", "screenfull": "6.0.2", "vue": "3.5.13", "vue-cropper": "1.1.1", - "vue-i18n": "10.0.5", + "vue-i18n": "11.1.3", "vue-json-pretty": "2.4.0", - "vue-router": "4.4.5", - "vue-types": "5.1.3", - "vxe-table": "4.5.22" + "vue-router": "4.5.0", + "vue-types": "6.0.0", + "vxe-table": "4.13.7" }, "devDependencies": { - "@iconify/json": "2.2.276", + "@iconify/json": "^2.2.276", "@types/crypto-js": "4.2.2", "@types/file-saver": "2.0.7", "@types/js-cookie": "3.0.6", @@ -56,8 +56,8 @@ "@unocss/preset-attributify": "66.0.0", "@unocss/preset-icons": "66.0.0", "@unocss/preset-uno": "66.0.0", - "@vitejs/plugin-vue": "5.2.1", - "@vue/compiler-sfc": "3.4.23", + "@vitejs/plugin-vue": "5.2.3", + "@vue/compiler-sfc": "3.5.13", "@vue/eslint-config-prettier": "10.2.0", "@vue/eslint-config-typescript": "14.4.0", "autoprefixer": "10.4.20", @@ -66,19 +66,22 @@ "eslint-plugin-vue": "9.32.0", "globals": "16.0.0", "prettier": "3.5.2", - "sass": "1.84.0", - "typescript": "~5.7.3", + "sass": "1.87.0", + "typescript": "~5.8.3", "unocss": "66.0.0", - "unplugin-auto-import": "0.17.5", - "unplugin-icons": "0.18.5", - "unplugin-vue-components": "28.0.0", + "unplugin-auto-import": "19.1.2", + "unplugin-icons": "22.1.0", + "unplugin-vue-components": "28.5.0", "unplugin-vue-setup-extend-plus": "1.0.1", - "vite": "5.4.11", + "vite": "6.3.2", "vite-plugin-compression": "0.5.1", - "vite-plugin-svg-icons-ng": "^1.2.2", - "vite-plugin-vue-devtools": "7.7.1", - "vitest": "3.0.5", - "vue-tsc": "^2.2.2" + "vite-plugin-svg-icons-ng": "^1.4.0", + "vite-plugin-vue-devtools": "7.7.5", + "vitest": "3.1.2", + "vue-tsc": "^2.2.8" + }, + "overrides": { + "quill": "2.0.2" }, "engines": { "node": ">=18.18.0", diff --git a/src/api/system/dept/index.ts b/src/api/system/dept/index.ts index f16cb2ca4f9851446ceda45f26fd4f99718f9c7f..617750671f0b2bad7c989a9cfbabc434d8c66d85 100644 --- a/src/api/system/dept/index.ts +++ b/src/api/system/dept/index.ts @@ -1,6 +1,6 @@ import request from '@/utils/request'; import { AxiosPromise } from 'axios'; -import {DeptForm, DeptQuery, DeptTreeVO, DeptVO} from './types'; +import { DeptForm, DeptQuery, DeptTreeVO, DeptVO } from './types'; // 查询部门列表 export const listDept = (query?: DeptQuery) => { diff --git a/src/api/system/menu/index.ts b/src/api/system/menu/index.ts index 7a0cf74ac6cb74f27bc769fbfa7327d3c3785987..81461fdb4d22c3a932ccf41c5b8c34e9abcd2c25 100644 --- a/src/api/system/menu/index.ts +++ b/src/api/system/menu/index.ts @@ -68,3 +68,11 @@ export const delMenu = (menuId: string | number) => { method: 'delete' }); }; + +// 级联删除菜单 +export const cascadeDelMenu = (menuIds: Array) => { + return request({ + url: '/system/menu/cascade/' + menuIds, + method: 'delete' + }); +}; diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts index 0867c48f7c35a7f6601a2def764532e884d81340..a61ad14db750fa24c1d04aa8cd94dda37ec8c73e 100644 --- a/src/api/system/user/index.ts +++ b/src/api/system/user/index.ts @@ -1,4 +1,4 @@ -import {DeptTreeVO, DeptVO} from './../dept/types'; +import { DeptTreeVO, DeptVO } from './../dept/types'; import { RoleVO } from '@/api/system/role/types'; import request from '@/utils/request'; import { AxiosPromise } from 'axios'; diff --git a/src/api/system/user/types.ts b/src/api/system/user/types.ts index cb7fc4122fc343d2b33e4fb703c58822209a1150..304e3bcdb70084ef9ffc3c37f43ab246f1d4d289 100644 --- a/src/api/system/user/types.ts +++ b/src/api/system/user/types.ts @@ -15,6 +15,7 @@ export interface UserInfo { */ export interface UserQuery extends PageQuery { userName?: string; + nickName?: string; phonenumber?: string; status?: string; deptId?: string | number; diff --git a/src/api/workflow/instance/index.ts b/src/api/workflow/instance/index.ts index 42d748d4c4caa53bf1f791897a8ad7e02b88bf33..fde16a2feff3c03e389660058f8d6026ebb30daa 100644 --- a/src/api/workflow/instance/index.ts +++ b/src/api/workflow/instance/index.ts @@ -31,9 +31,9 @@ export const pageByFinish = (query: FlowInstanceQuery): AxiosPromise { +export const flowHisTaskList = (businessId: string | number) => { return request({ - url: `/workflow/instance/flowImage/${businessId}` + '?t' + Math.random(), + url: `/workflow/instance/flowHisTaskList/${businessId}` + '?t' + Math.random(), method: 'get' }); }; diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss index f19abe4b474a90ab01ca72b8c56c194ffcc4ee7b..7410b6fb8d0d12b3bef86d81b0a9ccd1924a125d 100644 --- a/src/assets/styles/sidebar.scss +++ b/src/assets/styles/sidebar.scss @@ -26,7 +26,7 @@ z-index: 1001; overflow: hidden; -webkit-box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); - box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.1); // reset element-ui css .horizontal-collapse-transition { diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index fd91abcbb5cb2d76365c352f02db917c7dbe73a9..a9cdef4289f5c54172c9494d0a751970bebcfa7b 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -44,7 +44,7 @@ const findPathNum = (str, char = '/') => { return str.split(char).length - 1; }; const getMatched = (pathList, routeList, matched) => { - let data = routeList.find((item) => item.path == pathList[0] || (item.name += '').toLowerCase() == pathList[0]); + const data = routeList.find((item) => item.path == pathList[0] || (item.name += '').toLowerCase() == pathList[0]); if (data) { matched.push(data); if (data.children && pathList.length) { diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue index ba70fbba0c072d5b5b534bd92796fb653898170b..67394aae49b2d75ef72867fd689c23d6191c543c 100644 --- a/src/components/Editor/index.vue +++ b/src/components/Editor/index.vue @@ -95,7 +95,7 @@ const options = ref({ }); const styles = computed(() => { - let style: any = {}; + const style: any = {}; if (props.minHeight) { style.minHeight = `${props.minHeight}px`; } @@ -121,9 +121,9 @@ const handleUploadSuccess = (res: any) => { // 如果上传成功 if (res.code === 200) { // 获取富文本实例 - let quill = toRaw(quillEditorRef.value).getQuill(); + const quill = toRaw(quillEditorRef.value).getQuill(); // 获取光标位置 - let length = quill.selection.savedRange.index; + const length = quill.selection.savedRange.index; // 插入图片,res为服务器返回的图片链接地址 quill.insertEmbed(length, 'image', res.data.url); // 调整光标到最后 diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue index 7256585b8f9034c7253d2cb67d737e03d9248338..1767b1b0d97d00a0fda1b3eeb5f0069b4dc34f3b 100644 --- a/src/components/FileUpload/index.vue +++ b/src/components/FileUpload/index.vue @@ -176,7 +176,7 @@ const handleUploadSuccess = (res: any, file: UploadFile) => { // 删除文件 const handleDelete = (index: number) => { - let ossId = fileList.value[index].ossId; + const ossId = fileList.value[index].ossId; delOss(ossId); fileList.value.splice(index, 1); emit('update:modelValue', listToString(fileList.value)); diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue index 98e6479106d46e683f4294467e0348298fe5b79b..afe02c76b2d6ff8b2b1b4a9c611464c816d796c9 100644 --- a/src/components/ImagePreview/index.vue +++ b/src/components/ImagePreview/index.vue @@ -27,7 +27,7 @@ const realSrc = computed(() => { if (!props.src) { return; } - let real_src = props.src.split(',')[0]; + const real_src = props.src.split(',')[0]; return real_src; }); @@ -35,8 +35,8 @@ const realSrcList = computed(() => { if (!props.src) { return []; } - let real_src_list = props.src.split(','); - let srcList: string[] = []; + const real_src_list = props.src.split(','); + const srcList: string[] = []; real_src_list.forEach((item: string) => { if (item.trim() === '') { return; diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue index 2e53dcb50be25673a0e37edf6fb156c28001011b..f81e4bcab0171ba879d4286724ef8e09505bf644 100644 --- a/src/components/ImageUpload/index.vue +++ b/src/components/ImageUpload/index.vue @@ -189,7 +189,7 @@ const handleUploadSuccess = (res: any, file: UploadFile) => { const handleDelete = (file: UploadFile): boolean => { const findex = fileList.value.map((f) => f.name).indexOf(file.name); if (findex > -1 && uploadList.value.length === number.value) { - let ossId = fileList.value[findex].ossId; + const ossId = fileList.value[findex].ossId; delOss(ossId); fileList.value.splice(findex, 1); emit('update:modelValue', listToString(fileList.value)); @@ -225,7 +225,7 @@ const handlePictureCardPreview = (file: any) => { const listToString = (list: any[], separator?: string) => { let strs = ''; separator = separator || ','; - for (let i in list) { + for (const i in list) { if (undefined !== list[i].ossId && list[i].url.indexOf('blob:') !== 0) { strs += list[i].ossId + separator; } diff --git a/src/components/Process/approvalButton.vue b/src/components/Process/approvalButton.vue new file mode 100644 index 0000000000000000000000000000000000000000..cb4fe8dd0810d4e52f643c749244b9b368b4165e --- /dev/null +++ b/src/components/Process/approvalButton.vue @@ -0,0 +1,56 @@ + + diff --git a/src/components/Process/approvalRecord.vue b/src/components/Process/approvalRecord.vue index 84fbfb14804b91a2d21a8f4ec04a652869dac7b7..2413f08bf1b1106f40e5930ab6c16448534aa073 100644 --- a/src/components/Process/approvalRecord.vue +++ b/src/components/Process/approvalRecord.vue @@ -3,21 +3,7 @@ -
- - - -
+
@@ -73,10 +59,10 @@
diff --git a/src/components/Process/flowChart.vue b/src/components/Process/flowChart.vue new file mode 100644 index 0000000000000000000000000000000000000000..3c4dd684c873ac52ed0162063f04b745442e84ab --- /dev/null +++ b/src/components/Process/flowChart.vue @@ -0,0 +1,40 @@ +