!131 ♥️发布 vue 版本 5.2.1 与 cloud 版本 2.2.0
Merge pull request !131 from 疯狂的狮子Li/dev
| | |
| | | { |
| | | "name": "ruoyi-vue-plus", |
| | | "version": "5.2.0", |
| | | "version": "5.2.1", |
| | | "description": "RuoYi-Vue-Pluså¤ç§æ·ç®¡çç³»ç»", |
| | | "author": "LionLi", |
| | | "license": "MIT", |
| | |
| | | export const selectListFormManage = (): AxiosPromise<FormManageVO[]> => { |
| | | return request({ |
| | | url: '/workflow/formManage/list/selectList', |
| | | method: 'get', |
| | | method: 'get' |
| | | }); |
| | | }; |
| | | |
| | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | remork: string; |
| | | remark: string; |
| | | } |
| | | |
| | | export interface FormManageForm extends BaseEntity { |
| | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | remork?: string; |
| | | remark?: string; |
| | | } |
| | | |
| | | export interface FormManageQuery extends PageQuery { |
| | |
| | | */ |
| | | export const getInfo = (id: string): AxiosPromise<ModelForm> => { |
| | | return request({ |
| | | url: '/workflow/model/getInfo/'+id, |
| | | url: '/workflow/model/getInfo/' + id, |
| | | method: 'get' |
| | | }); |
| | | }; |
| | |
| | | method: 'post', |
| | | data: data |
| | | }); |
| | | }; |
| | | }; |
| | |
| | | export interface ModelForm { |
| | | id: string, |
| | | id: string; |
| | | name: string; |
| | | key: string; |
| | | categoryCode: string; |
| | | xml:string, |
| | | svg:string, |
| | | xml: string; |
| | | svg: string; |
| | | description: string; |
| | | } |
| | | |
| | |
| | | * 表å管ç |
| | | */ |
| | | wfFormManageVo: FormManageVO; |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | |
| | | rules: Rules, |
| | | translate |
| | | ) { |
| | | // @ts-ignore |
| | | // @ts-expect-error 忽ç¥å¼å¸¸ |
| | | super(config, injector, eventBus, contextPad, modeling, elementFactory, connect, create, popupMenu, canvas, rules, translate); |
| | | |
| | | this._contextPad = contextPad; |
| | |
| | | () => props.modelValue, |
| | | (v: string) => { |
| | | if (v !== content.value) { |
| | | content.value = v === undefined ? '<p></p>' : v; |
| | | content.value = v || '<p></p>'; |
| | | } |
| | | }, |
| | | { immediate: true } |
| | |
| | | let real_src_list = props.src.split(','); |
| | | let srcList: string[] = []; |
| | | real_src_list.forEach((item: string) => { |
| | | if(item.trim() === '') { |
| | | if (item.trim() === '') { |
| | | return; |
| | | } |
| | | return srcList.push(item); |
| | |
| | | //åæ¾ç¨æ·id |
| | | userIdList: { |
| | | type: Array, |
| | | default: [] |
| | | default: () => [] |
| | | } |
| | | }); |
| | | const deptTreeRef = ref(ElTree); |
| | |
| | | const props = defineProps({ |
| | | taskVariables: { |
| | | type: Object as () => Record<string, any>, |
| | | default: {} |
| | | default: () => {} |
| | | } |
| | | }); |
| | | //é®ç½©å± |
| | |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥ç¨æ·åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ææºå·ç " prop="phonenumber"> |
| | | <el-input |
| | | v-model="queryParams.phonenumber" |
| | | placeholder="请è¾å
¥ææºå·ç " |
| | | clearable |
| | | @keyup.enter="handleQuery" |
| | | /> |
| | | <el-input v-model="queryParams.phonenumber" placeholder="请è¾å
¥ææºå·ç " clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> |
| | | <el-button icon="Refresh" @click="() => resetQuery()">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | |
| | | getList(); |
| | | }; |
| | | /** éç½®æé®æä½ */ |
| | | const resetQuery = () => { |
| | | const resetQuery = (refresh = true) => { |
| | | dateRange.value = ['', '']; |
| | | queryFormRef.value?.resetFields(); |
| | | queryParams.value.pageNum = 1; |
| | | queryParams.value.deptId = undefined; |
| | | deptTreeRef.value?.setCurrentKey(undefined); |
| | | handleQuery(); |
| | | refresh && handleQuery(); |
| | | }; |
| | | |
| | | const handleCheckboxChange = (checked) => { |
| | |
| | | |
| | | watch( |
| | | () => userDialog.visible.value, |
| | | (newValue: boolean) => { |
| | | async (newValue: boolean) => { |
| | | if (newValue) { |
| | | initSelectUser(); |
| | | await getTreeSelect(); // åå§åé¨é¨æ°æ® |
| | | await getList(); // åå§ååè¡¨æ°æ® |
| | | await initSelectUser(); |
| | | } else { |
| | | tableRef.value.clearCheckboxReserve(); |
| | | tableRef.value.clearCheckboxRow(); |
| | | resetQuery(); |
| | | resetQuery(false); |
| | | selectUserList.value = []; |
| | | } |
| | | } |
| | | ); |
| | | |
| | | onMounted(() => { |
| | | getTreeSelect(); // åå§åé¨é¨æ°æ® |
| | | getList(); // åå§ååè¡¨æ°æ® |
| | | }); |
| | | |
| | | defineExpose({ |
| | | open: userDialog.openDialog, |
| | |
| | | openDialog, |
| | | closeDialog |
| | | }; |
| | | }; |
| | | }; |
| | |
| | | <template> |
| | | <section class="app-main"> |
| | | <router-view v-slot="{ Component, route }"> |
| | | <transition :enter-active-class="animante" mode="out-in"> |
| | | <div> |
| | | <keep-alive :include="tagsViewStore.cachedViews" v-if="!route.meta.noCache"> |
| | | <component v-if="!route.meta.link" :is="Component" :key="route.path" /> |
| | | </keep-alive> |
| | | <component v-if="!route.meta.link && route.meta.noCache" :is="Component" :key="route.path" /> |
| | | </div> |
| | | <transition v-if="!route.meta.noCache" :enter-active-class="animante" mode="out-in"> |
| | | <keep-alive v-if="!route.meta.noCache" :include="tagsViewStore.cachedViews"> |
| | | <component :is="Component" v-if="!route.meta.link" :key="route.path" /> |
| | | </keep-alive> |
| | | </transition> |
| | | <transition v-if="route.meta.noCache" :enter-active-class="animante" mode="out-in"> |
| | | <component :is="Component" v-if="!route.meta.link && route.meta.noCache" :key="route.path" /> |
| | | </transition> |
| | | </router-view> |
| | | <iframe-toggle /> |
| | |
| | | const state = route.query.state as string; |
| | | const source = route.query.source as string; |
| | | const stateJson = JSON.parse(atob(state)); |
| | | const tenantId = stateJson.tenantId as string ? stateJson.tenantId as string : '000000'; |
| | | const tenantId = (stateJson.tenantId as string) ? (stateJson.tenantId as string) : '000000'; |
| | | const domain = stateJson.domain as string; |
| | | |
| | | const processResponse = async (res: any) => { |
| | |
| | | next(); |
| | | } else { |
| | | const redirect = encodeURIComponent(to.fullPath || '/'); |
| | | next(`/login?redirect=${redirect}`) // å¦åå
¨é¨éå®åå°ç»å½é¡µ |
| | | next(`/login?redirect=${redirect}`); // å¦åå
¨é¨éå®åå°ç»å½é¡µ |
| | | NProgress.done(); |
| | | } |
| | | } |
| | |
| | | import ParentView from '@/components/ParentView/index.vue'; |
| | | import InnerLink from '@/layout/components/InnerLink/index.vue'; |
| | | |
| | | import { createCustomNameComponent } from '@/utils/createCustomNameComponent'; |
| | | |
| | | // å¹é
viewsé颿æç.vueæä»¶ |
| | | const modules = import.meta.glob('./../../views/**/*.vue'); |
| | | export const usePermissionStore = defineStore('permission', () => { |
| | |
| | | setSidebarRouters(constantRoutes.concat(sidebarRoutes)); |
| | | setDefaultRoutes(sidebarRoutes); |
| | | setTopbarRoutes(defaultRoutes); |
| | | // è·¯ç±nameé夿£æ¥ |
| | | duplicateRouteChecker(asyncRoutes, sidebarRoutes); |
| | | return new Promise<RouteRecordRaw[]>((resolve) => resolve(rewriteRoutes)); |
| | | }; |
| | | |
| | |
| | | } else if (route.component?.toString() === 'InnerLink') { |
| | | route.component = InnerLink; |
| | | } else { |
| | | route.component = loadView(route.component); |
| | | route.component = loadView(route.component, route.name as string); |
| | | } |
| | | if (route.children != null && route.children && route.children.length) { |
| | | route.children = filterAsyncRouter(route.children, route, type); |
| | |
| | | return res; |
| | | }; |
| | | |
| | | export const loadView = (view: any) => { |
| | | export const loadView = (view: any, name: string) => { |
| | | let res; |
| | | for (const path in modules) { |
| | | const dir = path.split('views/')[1].split('.vue')[0]; |
| | | if (dir === view) { |
| | | res = () => modules[path](); |
| | | res = createCustomNameComponent(modules[path], { name }); |
| | | } |
| | | } |
| | | return res; |
| | |
| | | return usePermissionStore(store); |
| | | }; |
| | | |
| | | interface Route { |
| | | name?: string | symbol; |
| | | path: string; |
| | | children?: Route[]; |
| | | } |
| | | |
| | | /** |
| | | * æ£æ¥è·¯ç±nameæ¯å¦éå¤ |
| | | * @param localRoutes æ¬å°è·¯ç± |
| | | * @param routes å¨æè·¯ç± |
| | | */ |
| | | function duplicateRouteChecker(localRoutes: Route[], routes: Route[]) { |
| | | // å±å¹³ |
| | | function flatRoutes(routes: Route[]) { |
| | | const res: Route[] = []; |
| | | routes.forEach((route) => { |
| | | if (route.children) { |
| | | res.push(...flatRoutes(route.children)); |
| | | } else { |
| | | res.push(route); |
| | | } |
| | | }); |
| | | return res; |
| | | } |
| | | |
| | | const allRoutes = flatRoutes([...localRoutes, ...routes]); |
| | | |
| | | const nameList: string[] = []; |
| | | allRoutes.forEach((route) => { |
| | | const name = route.name.toString(); |
| | | if (name && nameList.includes(name)) { |
| | | const message = `è·¯ç±åç§°: [${name}] éå¤, ä¼é æ 404`; |
| | | console.error(message); |
| | | ElNotification({ |
| | | title: 'è·¯ç±åç§°éå¤', |
| | | message, |
| | | type: 'error' |
| | | }); |
| | | return; |
| | | } |
| | | nameList.push(route.name.toString()); |
| | | }); |
| | | } |
| | | |
| | | export default usePermissionStore; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * åå°è¿åçè·¯ç±å¨æçæname è§£å³ç¼åé®é¢ |
| | | * æè°¢ @fourteendp |
| | | * è¯¦è§ https://github.com/vbenjs/vue-vben-admin/issues/3927 |
| | | */ |
| | | import { Component, defineComponent, h } from 'vue'; |
| | | |
| | | interface Options { |
| | | name?: string; |
| | | } |
| | | |
| | | export function createCustomNameComponent(loader: () => Promise<any>, options: Options = {}): () => Promise<Component> { |
| | | const { name } = options; |
| | | let component: Component | null = null; |
| | | |
| | | const load = async () => { |
| | | try { |
| | | const { default: loadedComponent } = await loader(); |
| | | component = loadedComponent; |
| | | } catch (error) { |
| | | console.error(`Cannot resolve component ${name}, error:`, error); |
| | | } |
| | | }; |
| | | |
| | | return async () => { |
| | | if (!component) { |
| | | await load(); |
| | | } |
| | | |
| | | return Promise.resolve( |
| | | defineComponent({ |
| | | name, |
| | | render() { |
| | | return h(component as Component); |
| | | } |
| | | }) |
| | | ); |
| | | }; |
| | | } |
| | |
| | | * é¨ç½²æ¹å¼ Docker 容å¨ç¼æ ä¸é®é¨ç½²ä¸å¡é群<br /> |
| | | * å½é
å SpringMessage Springæ åå½é
åæ¹æ¡<br /> |
| | | </p> |
| | | <p><b>å½åçæ¬:</b> <span>v5.2.0</span></p> |
| | | <p><b>å½åçæ¬:</b> <span>v5.2.1</span></p> |
| | | <p> |
| | | <el-tag type="danger">¥å
è´¹å¼æº</el-tag> |
| | | </p> |
| | |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥ç¨æ·åç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="ç»å½ç¶æ" clearable > |
| | | <el-select v-model="queryParams.status" placeholder="ç»å½ç¶æ" clearable> |
| | | <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-input v-model="queryParams.operName" placeholder="请è¾å
¥æä½äººå" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç±»å" prop="businessType"> |
| | | <el-select v-model="queryParams.businessType" placeholder="æä½ç±»å" clearable > |
| | | <el-select v-model="queryParams.businessType" placeholder="æä½ç±»å" clearable> |
| | | <el-option v-for="dict in sys_oper_type" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="æä½ç¶æ" clearable > |
| | | <el-select v-model="queryParams.status" placeholder="æä½ç¶æ" clearable> |
| | | <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-input v-model="queryParams.clientSecret" placeholder="请è¾å
¥å®¢æ·ç«¯ç§é¥" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="ç¶æ" clearable > |
| | | <el-select v-model="queryParams.status" placeholder="ç¶æ" clearable> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-input v-model="queryParams.configKey" placeholder="请è¾å
¥åæ°é®å" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç³»ç»å
ç½®" prop="configType"> |
| | | <el-select v-model="queryParams.configType" placeholder="ç³»ç»å
ç½®" clearable > |
| | | <el-select v-model="queryParams.configType" placeholder="ç³»ç»å
ç½®" clearable> |
| | | <el-option v-for="dict in sys_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-input v-model="queryParams.deptCategory" placeholder="请è¾å
¥ç±»å«ç¼ç " clearable style="width: 240px" @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="é¨é¨ç¶æ" clearable > |
| | | <el-select v-model="queryParams.status" placeholder="é¨é¨ç¶æ" clearable> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-input v-model="queryParams.menuName" placeholder="请è¾å
¥èååç§°" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="èåç¶æ" clearable > |
| | | <el-select v-model="queryParams.status" placeholder="èåç¶æ" clearable> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-form-item label="æä»¶åç¼" prop="fileSuffix"> |
| | | <el-input v-model="queryParams.fileSuffix" placeholder="请è¾å
¥æä»¶åç¼" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="å建æ¶é´" style="width: 308px;"> |
| | | <el-form-item label="å建æ¶é´" style="width: 308px"> |
| | | <el-date-picker |
| | | v-model="dateRangeCreateTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | |
| | | showTable.value = true; |
| | | }; |
| | | function checkFileSuffix(fileSuffix: string | string[]) { |
| | | const arr = [".png", ".jpg", ".jpeg"]; |
| | | const arr = ['.png', '.jpg', '.jpeg']; |
| | | const suffixArray = Array.isArray(fileSuffix) ? fileSuffix : [fileSuffix]; |
| | | return suffixArray.some(suffix => arr.includes(suffix.toLowerCase())); |
| | | return suffixArray.some((suffix) => arr.includes(suffix.toLowerCase())); |
| | | } |
| | | /** åæ¶æé® */ |
| | | function cancel() { |
| | |
| | | <el-input v-model="queryParams.roleKey" placeholder="请è¾å
¥æéå符" clearable @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="è§è²ç¶æ" clearable > |
| | | <el-select v-model="queryParams.status" placeholder="è§è²ç¶æ" clearable> |
| | | <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-tab-pane label="ç¬¬ä¸æ¹åºç¨" name="thirdParty"> |
| | | <thirdParty :auths="state.auths" /> |
| | | </el-tab-pane> |
| | | <el-tab-pane label="å¨çº¿è®¾å¤" name="onlinDevice"> |
| | | <onlinDevice :devices="state.devices" /> |
| | | <el-tab-pane label="å¨çº¿è®¾å¤" name="onlineDevice"> |
| | | <onlineDevice :devices="state.devices" /> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </el-card> |
| | |
| | | import UserInfo from './userInfo.vue'; |
| | | import ResetPwd from './resetPwd.vue'; |
| | | import ThirdParty from './thirdParty.vue'; |
| | | import OnlinDevice from './onlineDevice.vue'; |
| | | import OnlineDevice from './onlineDevice.vue'; |
| | | import { getAuthList } from '@/api/system/social/auth'; |
| | | import { getUserProfile } from '@/api/system/user'; |
| | | import { getOnline } from '@/api/monitor/online'; |
| | |
| | | <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="Delete" @click="handldDelOnline(scope.row)"> |
| | | </el-button> |
| | | <el-button link type="primary" icon="Delete" @click="handldDelOnline(scope.row)"> </el-button> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | }) |
| | | .catch(() => {}); |
| | | }; |
| | | |
| | | </script> |
| | |
| | | message: 'é¿åº¦å¨ 6 å° 20 个å符', |
| | | trigger: 'blur' |
| | | }, |
| | | { pattern: /^[^<>"'|\\]+$/, message: "ä¸è½å
å«éæ³å符ï¼< > \" ' \\\ |", trigger: "blur" } |
| | | { pattern: /^[^<>"'|\\]+$/, message: 'ä¸è½å
å«éæ³å符ï¼< > " \' \\\ |', trigger: 'blur' } |
| | | ], |
| | | confirmPassword: [ |
| | | { required: true, message: '确认å¯ç ä¸è½ä¸ºç©º', trigger: 'blur' }, |
| | |
| | | <script lang="ts" setup> |
| | | import { authUnlock, authBinding } from '@/api/system/social/auth'; |
| | | import { propTypes } from '@/utils/propTypes'; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import useUserStore from '@/store/modules/user'; |
| | | |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å°å" align="center" prop="router" /> |
| | | <el-table-column label="夿³¨" align="center" prop="remork" /> |
| | | <el-table-column label="夿³¨" align="center" prop="remark" /> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-tooltip content="ä¿®æ¹" placement="top"> |
| | |
| | | </template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remork"> |
| | | <el-input v-model="form.remork" type="textarea" placeholder="请è¾å
¥å
容" /> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å
容" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | |
| | | id: undefined, |
| | | formName: undefined, |
| | | formType: 'static', |
| | | remork: undefined |
| | | remark: undefined |
| | | }; |
| | | const data = reactive<PageData<FormManageForm, FormManageQuery>>({ |
| | | form: { ...initFormData }, |