update prettier 替换为 oxfmt 格式化整个项目的代码结构

This commit is contained in:
疯狂的狮子Li
2026-04-01 17:03:20 +08:00
parent 199771997d
commit 16d9e1e7fe
131 changed files with 3750 additions and 1571 deletions
+7 -5
View File
@@ -2,7 +2,9 @@
<el-breadcrumb class="app-breadcrumb" separator="/">
<transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
<span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta?.title }}</span>
<span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">
{{ item.meta?.title }}
</span>
<a v-else @click.prevent="handleLink(item)">{{ item.meta?.title }}</a>
</el-breadcrumb-item>
</transition-group>
@@ -31,20 +33,20 @@ const getBreadcrumb = () => {
});
getMatched(pathList, permissionStore.defaultRoutes, matched);
} else {
matched = route.matched.filter((item) => item.meta && item.meta.title);
matched = route.matched.filter(item => item.meta && item.meta.title);
}
// 判断是否为首页
if (!isDashboard(matched[0])) {
matched = [{ path: '/index', meta: { title: '首页' } }].concat(matched);
}
levelList.value = matched.filter((item) => item.meta && item.meta.title && item.meta.breadcrumb !== false);
levelList.value = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false);
};
const findPathNum = (str, char = '/') => {
if (typeof str !== 'string' || str.length === 0) return 0;
return str.split(char).length - 1;
};
const getMatched = (pathList, routeList, matched) => {
const 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) {
@@ -60,7 +62,7 @@ const isDashboard = (route: RouteLocationMatched) => {
}
return name.trim() === 'Index';
};
const handleLink = (item) => {
const handleLink = item => {
const { redirect, path } = item;
redirect ? router.push(redirect) : router.push(path);
};
+14 -10
View File
@@ -3,7 +3,10 @@
<template v-for="(item, index) in options">
<template v-if="isValueMatch(item.value)">
<span
v-if="(item.elTagType === 'default' || item.elTagType === '') && (item.elTagClass === '' || item.elTagClass == null)"
v-if="
(item.elTagType === 'default' || item.elTagType === '') &&
(item.elTagClass === '' || item.elTagClass == null)
"
:key="item.value"
:index="index"
:class="item.elTagClass"
@@ -50,16 +53,17 @@ const props = withDefaults(defineProps<Props>(), {
const values = computed(() => {
if (props.value === '' || props.value === null || typeof props.value === 'undefined') return [];
if (typeof props.value === 'number' || typeof props.value === 'boolean') return [props.value]
return Array.isArray(props.value) ? props.value.map((item) => '' + item) : String(props.value).split(props.separator);
if (typeof props.value === 'number' || typeof props.value === 'boolean') return [props.value];
return Array.isArray(props.value) ? props.value.map(item => '' + item) : String(props.value).split(props.separator);
});
const unmatch = computed(() => {
if (props.options?.length == 0 || props.value === '' || props.value === null || typeof props.value === 'undefined') return false;
if (props.options?.length == 0 || props.value === '' || props.value === null || typeof props.value === 'undefined')
return false;
// 传入值为非数组
let unmatch = false; // 添加一个标志来判断是否有未匹配项
values.value.forEach((item) => {
if (!props.options.some((v) => v.value == item)) {
values.value.forEach(item => {
if (!props.options.some(v => v.value == item)) {
unmatch = true; // 如果有未匹配项,将标志设置为true
}
});
@@ -70,8 +74,8 @@ const unmatchArray = computed(() => {
// 记录未匹配的项
const itemUnmatchArray: Array<string | number> = [];
if (props.value !== '' && props.value !== null && typeof props.value !== 'undefined') {
values.value.forEach((item) => {
if (!props.options.some((v) => v.value === item)) {
values.value.forEach(item => {
if (!props.options.some(v => v.value === item)) {
itemUnmatchArray.push(item);
}
});
@@ -88,8 +92,8 @@ const handleArray = (array: Array<string | number>) => {
};
const isValueMatch = (itemValue: any) => {
return values.value.some(val => val == itemValue)
}
return values.value.some(val => val == itemValue);
};
</script>
<style lang="scss" scoped>
+3 -8
View File
@@ -1,11 +1,6 @@
<template>
<div class="editor-shell">
<EditorToolbar
:editor="editorRef"
:default-config="toolbarConfig"
mode="default"
class="editor-toolbar"
/>
<EditorToolbar :editor="editorRef" :default-config="toolbarConfig" mode="default" class="editor-toolbar" />
<div class="editor-body" :style="styles">
<WangEditor
v-model="content"
@@ -139,7 +134,7 @@ const syncReadOnly = () => {
watch(
() => props.modelValue,
(value) => {
value => {
const nextValue = value || '';
if (nextValue !== content.value) {
content.value = nextValue;
@@ -148,7 +143,7 @@ watch(
{ immediate: true }
);
watch(content, (value) => {
watch(content, value => {
if (value !== props.modelValue) {
emit('update:modelValue', value);
}
+11 -9
View File
@@ -23,10 +23,12 @@
<div v-if="showTip && !disabled" class="el-upload__tip">
请上传
<template v-if="fileSize">
大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
大小不超过
<b style="color: #f56c6c">{{ fileSize }}MB</b>
</template>
<template v-if="fileType">
格式为 <b style="color: #f56c6c">{{ fileType.join('/') }}</b>
格式为
<b style="color: #f56c6c">{{ fileType.join('/') }}</b>
</template>
的文件
</div>
@@ -34,7 +36,7 @@
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
<li v-for="(file, index) in fileList" :key="file.uid" class="el-upload-list__item ele-upload-list__item-content">
<el-link :href="`${file.url}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
<span class="el-icon-document">{{ getFileName(file.name) }}</span>
</el-link>
<div class="ele-upload-list__item-content-action">
<el-button type="danger" v-if="!disabled" link @click="handleDelete(index)">删除</el-button>
@@ -81,11 +83,11 @@ const showTip = computed(() => props.isShowTip && (props.fileType || props.fileS
const fileUploadRef = ref<ElUploadInstance>();
// 监听 fileType 变化,更新 fileAccept
const fileAccept = computed(() => props.fileType.map((type) => `.${type}`).join(','));
const fileAccept = computed(() => props.fileType.map(type => `.${type}`).join(','));
watch(
() => props.modelValue,
async (val) => {
async val => {
if (val) {
let temp = 1;
// 首先将值转为数组
@@ -94,7 +96,7 @@ watch(
list = val;
} else {
const res = await listByIds(val);
list = res.data.map((oss) => {
list = res.data.map(oss => {
return {
name: oss.originalName,
url: oss.url,
@@ -103,7 +105,7 @@ watch(
});
}
// 然后将数组转为对象数组
fileList.value = list.map((item) => {
fileList.value = list.map(item => {
item = { name: item.name, url: item.url, ossId: item.ossId };
item.uid = item.uid || new Date().getTime() + temp++;
return item;
@@ -185,7 +187,7 @@ const handleDelete = (index: number) => {
// 上传结束处理
const uploadedSuccessfully = () => {
if (number.value > 0 && uploadList.value.length === number.value) {
fileList.value = fileList.value.filter((f) => f.url !== undefined).concat(uploadList.value);
fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value);
uploadList.value = [];
number.value = 0;
emit('update:modelValue', listToString(fileList.value));
@@ -207,7 +209,7 @@ const getFileName = (name: string) => {
const listToString = (list: any[], separator?: string) => {
let strs = '';
separator = separator || ',';
list.forEach((item) => {
list.forEach(item => {
if (item.ossId) {
strs += item.ossId + separator;
}
+8 -1
View File
@@ -1,6 +1,13 @@
<template>
<div style="padding: 0 15px" @click="toggleClick">
<svg :class="{ 'is-active': isActive }" class="hamburger" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64">
<svg
:class="{ 'is-active': isActive }"
class="hamburger"
viewBox="0 0 1024 1024"
xmlns="http://www.w3.org/2000/svg"
width="64"
height="64"
>
<path
d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"
/>
+14 -5
View File
@@ -1,5 +1,5 @@
<template>
<div class="relative" :style="{ 'width': width }">
<div class="relative" :style="{ width: width }">
<el-input v-model="modelValue" readonly placeholder="点击选择图标" @click="visible = !visible">
<template #prepend>
<svg-icon :icon-class="modelValue" />
@@ -8,7 +8,10 @@
<el-popover shadow="none" :visible="visible" placement="bottom-end" trigger="click" :width="450">
<template #reference>
<div class="cursor-pointer text-[#999] absolute right-[10px] top-0 height-[32px] leading-[32px]" @click="visible = !visible">
<div
class="cursor-pointer text-[#999] absolute right-[10px] top-0 height-[32px] leading-[32px]"
@click="visible = !visible"
>
<CaretTop v-show="visible" />
<CaretBottom v-show="!visible" />
</div>
@@ -31,7 +34,13 @@
<el-scrollbar height="w-[200px]">
<ul class="icon-list">
<el-tooltip v-for="(iconName, index) in iconNames" :key="index" :content="iconName" placement="bottom" effect="light">
<el-tooltip
v-for="(iconName, index) in iconNames"
:key="index"
:content="iconName"
placement="bottom"
effect="light"
>
<li :class="['icon-item', { active: modelValue == iconName }]" @click="selectedIcon(iconName)">
<svg-icon color="var(--el-text-color-regular)" :icon-class="iconName" />
</li>
@@ -64,7 +73,7 @@ const customIcon = ref('');
*/
const filterIcons = () => {
if (filterValue.value) {
iconNames.value = icons.filter((iconName) => iconName.includes(filterValue.value));
iconNames.value = icons.filter(iconName => iconName.includes(filterValue.value));
} else {
iconNames.value = icons;
}
@@ -87,7 +96,7 @@ const applyCustomIcon = () => {
watch(
() => props.modelValue,
(value) => {
value => {
customIcon.value = value?.includes(':') ? value : '';
},
{ immediate: true }
+7 -1
View File
@@ -1,5 +1,11 @@
<template>
<el-image :src="`${realSrc}`" fit="cover" :style="`width:${realWidth};height:${realHeight};`" :preview-src-list="realSrcList" preview-teleported>
<el-image
:src="`${realSrc}`"
fit="cover"
:style="`width:${realWidth};height:${realHeight};`"
:preview-src-list="realSrcList"
preview-teleported
>
<template #error>
<div class="image-slot">
<el-icon><picture-filled /></el-icon>
+8 -6
View File
@@ -26,10 +26,12 @@
<div v-if="showTip" class="el-upload__tip">
请上传
<template v-if="fileSize">
大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
大小不超过
<b style="color: #f56c6c">{{ fileSize }}MB</b>
</template>
<template v-if="fileType">
格式为 <b style="color: #f56c6c">{{ fileType.join('/') }}</b>
格式为
<b style="color: #f56c6c">{{ fileType.join('/') }}</b>
</template>
的文件
</div>
@@ -89,7 +91,7 @@ const showTip = computed(() => props.isShowTip && (props.fileType || props.fileS
const imageUploadRef = ref<ElUploadInstance>();
// 监听 fileType 变化,更新 fileAccept
const fileAccept = computed(() => props.fileType.map((type) => `.${type}`).join(','));
const fileAccept = computed(() => props.fileType.map(type => `.${type}`).join(','));
watch(
() => props.modelValue,
@@ -104,7 +106,7 @@ watch(
list = res.data;
}
// 然后将数组转为对象数组
fileList.value = list.map((item) => {
fileList.value = list.map(item => {
// 字符串回显处理 如果此处存的是url可直接回显 如果存的是id需要调用接口查出来
let itemData;
if (typeof item === 'string') {
@@ -187,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);
const findex = fileList.value.map(f => f.name).indexOf(file.name);
if (findex > -1 && uploadList.value.length === number.value) {
const ossId = fileList.value[findex].ossId;
delOss(ossId);
@@ -201,7 +203,7 @@ const handleDelete = (file: UploadFile): boolean => {
// 上传结束处理
const uploadedSuccessfully = () => {
if (number.value > 0 && uploadList.value.length === number.value) {
fileList.value = fileList.value.filter((f) => f.url !== undefined).concat(uploadList.value);
fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value);
uploadList.value = [];
number.value = 0;
emit('update:modelValue', listToString(fileList.value));
+2 -2
View File
@@ -5,8 +5,8 @@
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item :disabled="appStore.language === 'zh_CN'" command="zh_CN"> 中文 </el-dropdown-item>
<el-dropdown-item :disabled="appStore.language === 'en_US'" command="en_US"> English </el-dropdown-item>
<el-dropdown-item :disabled="appStore.language === 'zh_CN'" command="zh_CN">中文</el-dropdown-item>
<el-dropdown-item :disabled="appStore.language === 'en_US'" command="en_US">English</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
+9 -1
View File
@@ -1,5 +1,13 @@
<template>
<el-dialog v-model="visible" :title="props.title" width="50%" draggable :before-close="cancel" center :close-on-click-modal="false">
<el-dialog
v-model="visible"
:title="props.title"
width="50%"
draggable
:before-close="cancel"
center
:close-on-click-modal="false"
>
<el-form v-loading="loading" ref="ruleFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="消息提醒" prop="messageType">
<el-checkbox-group v-model="form.messageType">
+20 -5
View File
@@ -1,10 +1,23 @@
<template>
<div style="display: flex; justify-content: space-between">
<div>
<el-button v-if="submitButtonShow" :loading="props.buttonLoading" type="info" @click="submitForm('draft', mode)">暂存</el-button>
<el-button v-if="submitButtonShow" :loading="props.buttonLoading" type="primary" @click="submitForm('submit', mode)"> </el-button>
<el-button v-if="approvalButtonShow" :loading="props.buttonLoading" type="primary" @click="approvalVerifyOpen">审批</el-button>
<el-button v-if="props.id && props.status !== 'draft'" type="primary" @click="handleApprovalRecord">流程进度</el-button>
<el-button v-if="submitButtonShow" :loading="props.buttonLoading" type="info" @click="submitForm('draft', mode)">
暂存
</el-button>
<el-button
v-if="submitButtonShow"
:loading="props.buttonLoading"
type="primary"
@click="submitForm('submit', mode)"
>
</el-button>
<el-button v-if="approvalButtonShow" :loading="props.buttonLoading" type="primary" @click="approvalVerifyOpen">
审批
</el-button>
<el-button v-if="props.id && props.status !== 'draft'" type="primary" @click="handleApprovalRecord">
流程进度
</el-button>
<slot />
</div>
<div>
@@ -40,7 +53,9 @@ const handleApprovalRecord = () => {
const submitButtonShow = computed(() => {
return (
props.pageType === 'add' ||
(props.pageType === 'update' && props.status && (props.status === 'draft' || props.status === 'cancel' || props.status === 'back'))
(props.pageType === 'update' &&
props.status &&
(props.status === 'draft' || props.status === 'cancel' || props.status === 'back'))
);
});
+50 -11
View File
@@ -1,6 +1,13 @@
<template>
<div class="container">
<el-dialog v-model="visible" draggable title="审批记录" :width="props.width" :height="props.height" :close-on-click-modal="false">
<el-dialog
v-model="visible"
draggable
title="审批记录"
:width="props.width"
:height="props.height"
:close-on-click-modal="false"
>
<el-tabs v-model="tabActiveName" class="demo-tabs">
<el-tab-pane v-loading="loading" label="流程图" name="image" style="height: 68vh">
<flowChart :ins-id="insId" v-if="insId" />
@@ -13,9 +20,11 @@
<el-table-column prop="approveName" :show-overflow-tooltip="true" label="办理人" sortable align="center">
<template #default="scope">
<template v-if="scope.row.approveName">
<el-tag v-for="(item, index) in scope.row.approveName.split(',')" :key="index" type="success">{{ item }}</el-tag>
<el-tag v-for="(item, index) in scope.row.approveName.split(',')" :key="index" type="success">
{{ item }}
</el-tag>
</template>
<template v-else> <el-tag type="success"></el-tag></template>
<template v-else><el-tag type="success"></el-tag></template>
</template>
</el-table-column>
<el-table-column prop="flowStatus" label="状态" width="80" sortable align="center">
@@ -23,9 +32,29 @@
<dict-tag :options="wf_task_status" :value="scope.row.flowStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="message" label="审批意见" :show-overflow-tooltip="true" sortable align="center"></el-table-column>
<el-table-column prop="createTime" label="开始时间" width="160" :show-overflow-tooltip="true" sortable align="center"></el-table-column>
<el-table-column prop="updateTime" label="结束时间" width="160" :show-overflow-tooltip="true" sortable align="center"></el-table-column>
<el-table-column
prop="message"
label="审批意见"
:show-overflow-tooltip="true"
sortable
align="center"
></el-table-column>
<el-table-column
prop="createTime"
label="开始时间"
width="160"
:show-overflow-tooltip="true"
sortable
align="center"
></el-table-column>
<el-table-column
prop="updateTime"
label="结束时间"
width="160"
:show-overflow-tooltip="true"
sortable
align="center"
></el-table-column>
<el-table-column
prop="runDuration"
label="运行时长"
@@ -36,12 +65,22 @@
></el-table-column>
<el-table-column prop="attachmentList" width="120" label="附件" align="center">
<template #default="scope">
<el-popover v-if="scope.row.attachmentList && scope.row.attachmentList.length > 0" placement="right" :width="310" trigger="click">
<el-popover
v-if="scope.row.attachmentList && scope.row.attachmentList.length > 0"
placement="right"
:width="310"
trigger="click"
>
<template #reference>
<el-button type="primary" style="margin-right: 16px">附件</el-button>
</template>
<el-table border :data="scope.row.attachmentList">
<el-table-column prop="originalName" width="202" :show-overflow-tooltip="true" label="附件名称"></el-table-column>
<el-table-column
prop="originalName"
width="202"
:show-overflow-tooltip="true"
label="附件名称"
></el-table-column>
<el-table-column prop="name" width="80" align="center" :show-overflow-tooltip="true" label="操作">
<template #default="tool">
<el-button type="text" @click="handleDownload(tool.row.ossId)">下载</el-button>
@@ -81,14 +120,14 @@ const init = async (businessId: string | number) => {
loading.value = true;
tabActiveName.value = 'image';
historyList.value = [];
flowHisTaskList(businessId).then((resp) => {
flowHisTaskList(businessId).then(resp => {
if (resp.data) {
historyList.value = resp.data.list;
insId.value = resp.data.instanceId;
if (historyList.value.length > 0) {
historyList.value.forEach((item) => {
historyList.value.forEach(item => {
if (item.ext) {
getIds(item.ext).then((res) => {
getIds(item.ext).then(res => {
item.attachmentList = res.data;
});
} else {
+50 -13
View File
@@ -1,6 +1,19 @@
<template>
<el-dialog v-model="visible" draggable title="流程干预" :width="props.width" :height="props.height" :close-on-click-modal="false">
<el-descriptions v-loading="loading" class="margin-top" :title="`${task.flowName}(${task.flowCode})`" :column="2" border>
<el-dialog
v-model="visible"
draggable
title="流程干预"
:width="props.width"
:height="props.height"
:close-on-click-modal="false"
>
<el-descriptions
v-loading="loading"
class="margin-top"
:title="`${task.flowName}(${task.flowCode})`"
:column="2"
border
>
<el-descriptions-item label="任务名称">{{ task.nodeName }}</el-descriptions-item>
<el-descriptions-item label="节点编码">{{ task.nodeCode }}</el-descriptions-item>
<el-descriptions-item label="开始时间">{{ task.createTime }}</el-descriptions-item>
@@ -10,7 +23,14 @@
</el-descriptions>
<template #footer>
<span class="dialog-footer">
<el-button v-if="task.flowStatus === 'waiting'" :disabled="buttonDisabled" type="primary" @click="openTransferTask"> 转办 </el-button>
<el-button
v-if="task.flowStatus === 'waiting'"
:disabled="buttonDisabled"
type="primary"
@click="openTransferTask"
>
转办
</el-button>
<el-button
v-if="task.flowStatus === 'waiting' && Number(task.nodeRatio) > 0"
:disabled="buttonDisabled"
@@ -27,21 +47,38 @@
>
减签
</el-button>
<el-button v-if="task.flowStatus === 'waiting'" :disabled="buttonDisabled" type="danger" @click="handleTerminationTask"> 终止 </el-button>
<el-button
v-if="task.flowStatus === 'waiting'"
:disabled="buttonDisabled"
type="danger"
@click="handleTerminationTask"
>
终止
</el-button>
</span>
</template>
<!-- 转办 -->
<UserSelect ref="transferTaskRef" :multiple="false" @confirm-call-back="handleTransferTask"></UserSelect>
<!-- 加签组件 -->
<UserSelect ref="multiInstanceUserRef" :multiple="true" @confirm-call-back="addMultiInstanceUser"></UserSelect>
<el-dialog v-model="deleteSignatureVisible" draggable title="减签人员" width="700px" height="400px" append-to-body :close-on-click-modal="false"
><div>
<el-dialog
v-model="deleteSignatureVisible"
draggable
title="减签人员"
width="700px"
height="400px"
append-to-body
:close-on-click-modal="false"
>
<div>
<el-table :data="deleteUserList" border>
<el-table-column prop="nodeName" label="任务名称" />
<el-table-column prop="nickName" label="办理人" />
<el-table-column label="操作" align="center" width="160">
<template #default="scope">
<el-button type="danger" size="small" icon="Delete" @click="deleteMultiInstanceUser(scope.row)">删除</el-button>
<el-button type="danger" size="small" icon="Delete" @click="deleteMultiInstanceUser(scope.row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
@@ -96,7 +133,7 @@ const task = ref<FlowTaskVO>({
const open = (taskId: string) => {
visible.value = true;
getTask(taskId).then((response) => {
getTask(taskId).then(response => {
loading.value = false;
buttonDisabled.value = false;
task.value = response.data;
@@ -108,7 +145,7 @@ const openTransferTask = () => {
transferTaskRef.value.open();
};
//转办
const handleTransferTask = async (data) => {
const handleTransferTask = async data => {
if (data && data.length > 0) {
const taskOperationBo = reactive<TaskOperationBo>({
userId: data[0].userId,
@@ -135,10 +172,10 @@ const openMultiInstanceUser = async () => {
multiInstanceUserRef.value.open();
};
//加签
const addMultiInstanceUser = async (data) => {
const addMultiInstanceUser = async data => {
if (data && data.length > 0) {
const taskOperationBo = reactive<TaskOperationBo>({
userIds: data.map((e) => e.userId),
userIds: data.map(e => e.userId),
taskId: task.value.id,
message: '',
messageType: ['1']
@@ -158,7 +195,7 @@ const addMultiInstanceUser = async (data) => {
}
};
//减签
const deleteMultiInstanceUser = async (row) => {
const deleteMultiInstanceUser = async row => {
await proxy?.$modal.confirm('是否确认提交?');
loading.value = true;
buttonDisabled.value = true;
@@ -181,7 +218,7 @@ const handleTaskUser = async () => {
const data = await currentTaskAllUser(task.value.id);
deleteUserList.value = data.data;
if (deleteUserList.value && deleteUserList.value.length > 0) {
deleteUserList.value.forEach((e) => {
deleteUserList.value.forEach(e => {
e.nodeName = task.value.nodeName;
});
}
+86 -29
View File
@@ -1,5 +1,13 @@
<template>
<el-dialog v-model="dialog.visible" :title="dialog.title" width="50%" draggable :before-close="cancel" center :close-on-click-modal="false">
<el-dialog
v-model="dialog.visible"
:title="dialog.title"
width="50%"
draggable
:before-close="cancel"
center
:close-on-click-modal="false"
>
<el-form v-loading="loading" :model="form" label-width="120px">
<el-form-item label="消息提醒">
<el-checkbox-group v-model="form.messageType">
@@ -9,15 +17,29 @@
</el-checkbox-group>
</el-form-item>
<el-form-item label="附件" v-if="buttonObj.file">
<fileUpload v-model="form.fileId" :file-type="['png', 'jpg', 'jpeg', 'doc', 'docx', 'xlsx', 'xls', 'ppt', 'txt', 'pdf']" :file-size="20" />
<fileUpload
v-model="form.fileId"
:file-type="['png', 'jpg', 'jpeg', 'doc', 'docx', 'xlsx', 'xls', 'ppt', 'txt', 'pdf']"
:file-size="20"
/>
</el-form-item>
<el-form-item label="抄送" v-if="buttonObj.copy">
<el-button type="primary" icon="Plus" circle @click="openUserSelectCopy" />
<el-tag v-for="user in selectCopyUserList" :key="user.userId" closable style="margin: 2px" @close="handleCopyCloseTag(user)">
<el-tag
v-for="user in selectCopyUserList"
:key="user.userId"
closable
style="margin: 2px"
@close="handleCopyCloseTag(user)"
>
{{ user.nickName }}
</el-tag>
</el-form-item>
<el-form-item v-if="buttonObj.pop && nestNodeList && nestNodeList.length > 0" label="下一步审批人" prop="assigneeMap">
<el-form-item
v-if="buttonObj.pop && nestNodeList && nestNodeList.length > 0"
label="下一步审批人"
prop="assigneeMap"
>
<div v-for="(item, index) in nestNodeList" :key="index" style="margin-bottom: 5px; width: 500px">
<span>{{ item.nodeName }}</span>
<el-input v-if="false" v-model="form.assigneeMap[item.nodeCode]" />
@@ -34,11 +56,21 @@
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button :disabled="buttonDisabled" type="primary" @click="handleCompleteTask"> 提交 </el-button>
<el-button v-if="task.flowStatus === 'waiting' && buttonObj.trust" :disabled="buttonDisabled" type="primary" @click="openDelegateTask">
<el-button :disabled="buttonDisabled" type="primary" @click="handleCompleteTask">提交</el-button>
<el-button
v-if="task.flowStatus === 'waiting' && buttonObj.trust"
:disabled="buttonDisabled"
type="primary"
@click="openDelegateTask"
>
委托
</el-button>
<el-button v-if="task.flowStatus === 'waiting' && buttonObj.transfer" :disabled="buttonDisabled" type="primary" @click="openTransferTask">
<el-button
v-if="task.flowStatus === 'waiting' && buttonObj.transfer"
:disabled="buttonDisabled"
type="primary"
@click="openTransferTask"
>
转办
</el-button>
<el-button
@@ -65,14 +97,24 @@
>
终止
</el-button>
<el-button v-if="task.flowStatus === 'waiting' && buttonObj.back" :disabled="buttonDisabled" type="danger" @click="handleBackProcessOpen">
<el-button
v-if="task.flowStatus === 'waiting' && buttonObj.back"
:disabled="buttonDisabled"
type="danger"
@click="handleBackProcessOpen"
>
退回
</el-button>
<el-button :disabled="buttonDisabled" @click="cancel">取消</el-button>
</span>
</template>
<!-- 抄送 -->
<UserSelect ref="userSelectCopyRef" :multiple="true" :data="selectCopyUserIds" @confirm-call-back="userSelectCopyCallBack"></UserSelect>
<UserSelect
ref="userSelectCopyRef"
:multiple="true"
:data="selectCopyUserIds"
@confirm-call-back="userSelectCopyCallBack"
></UserSelect>
<!-- 转办 -->
<UserSelect ref="transferTaskRef" :multiple="false" @confirm-call-back="handleTransferTask"></UserSelect>
<!-- 委托 -->
@@ -93,7 +135,12 @@
<el-form v-if="task.flowStatus === 'waiting'" v-loading="backLoading" :model="backForm" label-width="120px">
<el-form-item label="驳回节点">
<el-select v-model="backForm.nodeCode" clearable placeholder="请选择" style="width: 300px">
<el-option v-for="item in taskNodeList" :key="item.nodeCode" :label="item.nodeName" :value="item.nodeCode" />
<el-option
v-for="item in taskNodeList"
:key="item.nodeCode"
:label="item.nodeName"
:value="item.nodeCode"
/>
</el-select>
</el-form-item>
<el-form-item label="消息提醒">
@@ -122,14 +169,24 @@
</template>
</el-dialog>
<!-- 驳回结束 -->
<el-dialog v-model="deleteSignatureVisible" draggable title="减签人员" width="700px" height="400px" append-to-body :close-on-click-modal="false">
<el-dialog
v-model="deleteSignatureVisible"
draggable
title="减签人员"
width="700px"
height="400px"
append-to-body
:close-on-click-modal="false"
>
<div>
<el-table :data="deleteUserList" border>
<el-table-column prop="nodeName" label="任务名称" />
<el-table-column prop="nickName" label="办理人" />
<el-table-column label="操作" align="center" width="160">
<template #default="scope">
<el-button type="danger" size="small" icon="Delete" @click="deleteMultiInstanceUser(scope.row)">删除 </el-button>
<el-button type="danger" size="small" icon="Delete" @click="deleteMultiInstanceUser(scope.row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
@@ -265,11 +322,11 @@ const openDialog = async (id?: string) => {
const response = await getTask(taskId.value);
task.value = response.data;
buttonObj.value = {};
task.value.buttonList?.forEach((e) => {
task.value.buttonList?.forEach(e => {
buttonObj.value[e.code] = e.show;
});
selectCopyUserList.value = task.value.copyList;
selectCopyUserIds.value = task.value.copyList.map((e) => e.userId).join(',');
selectCopyUserIds.value = task.value.copyList.map(e => e.userId).join(',');
varNodeList.value = task.value.varList;
console.log('varNodeList', varNodeList.value);
buttonDisabled.value = false;
@@ -294,7 +351,7 @@ const handleCompleteTask = async () => {
form.value.variables = props.taskVariables;
let verify = false;
if (buttonObj.value.pop && nestNodeList.value && nestNodeList.value.length > 0) {
nestNodeList.value.forEach((e) => {
nestNodeList.value.forEach(e => {
if (
Object.keys(form.value.assigneeMap).length === 0 ||
form.value.assigneeMap[e.nodeCode] === '' ||
@@ -313,7 +370,7 @@ const handleCompleteTask = async () => {
}
if (selectCopyUserList.value && selectCopyUserList.value.length > 0) {
const flowCopyList = [];
selectCopyUserList.value.forEach((e) => {
selectCopyUserList.value.forEach(e => {
const copyUser = {
userId: e.userId,
nickName: e.nickName
@@ -382,26 +439,26 @@ const openUserSelectCopy = () => {
const userSelectCopyCallBack = (data: FlowCopyVo[]) => {
if (data && data.length > 0) {
selectCopyUserList.value = data;
selectCopyUserIds.value = selectCopyUserList.value.map((item) => item.userId).join(',');
selectCopyUserIds.value = selectCopyUserList.value.map(item => item.userId).join(',');
}
};
//删除抄送人员
const handleCopyCloseTag = (user: FlowCopyVo) => {
const userId = user.userId;
// 使用split删除用户
const index = selectCopyUserList.value.findIndex((item) => item.userId === userId);
const index = selectCopyUserList.value.findIndex(item => item.userId === userId);
selectCopyUserList.value.splice(index, 1);
selectCopyUserIds.value = selectCopyUserList.value.map((item) => item.userId).join(',');
selectCopyUserIds.value = selectCopyUserList.value.map(item => item.userId).join(',');
};
//加签
const openMultiInstanceUser = async () => {
multiInstanceUserRef.value.open();
};
//加签
const addMultiInstanceUser = async (data) => {
const addMultiInstanceUser = async data => {
if (data && data.length > 0) {
const taskOperationBo = reactive<TaskOperationBo>({
userIds: data.map((e) => e.userId),
userIds: data.map(e => e.userId),
taskId: taskId.value,
message: form.value.message,
messageType: ['1']
@@ -421,7 +478,7 @@ const addMultiInstanceUser = async (data) => {
}
};
//减签
const deleteMultiInstanceUser = async (row) => {
const deleteMultiInstanceUser = async row => {
await proxy?.$modal.confirm('是否确认提交?');
loading.value = true;
buttonDisabled.value = true;
@@ -444,7 +501,7 @@ const openTransferTask = () => {
transferTaskRef.value.open();
};
//转办
const handleTransferTask = async (data) => {
const handleTransferTask = async data => {
if (data && data.length > 0) {
const taskOperationBo = reactive<TaskOperationBo>({
userId: data[0].userId,
@@ -472,7 +529,7 @@ const openDelegateTask = () => {
delegateTaskRef.value.open();
};
//委托
const handleDelegateTask = async (data) => {
const handleDelegateTask = async data => {
if (data && data.length > 0) {
const taskOperationBo = reactive<TaskOperationBo>({
userId: data[0].userId,
@@ -515,14 +572,14 @@ const handleTaskUser = async () => {
const data = await currentTaskAllUser(taskId.value);
deleteUserList.value = data.data;
if (deleteUserList.value && deleteUserList.value.length > 0) {
deleteUserList.value.forEach((e) => {
deleteUserList.value.forEach(e => {
e.nodeName = task.value.nodeName;
});
}
deleteSignatureVisible.value = true;
};
// 选择人员
const choosePeople = async (data) => {
const choosePeople = async data => {
if (!data.permissionFlag) {
proxy?.$modal.msgError('没有可选择的人员,请联系管理员!');
}
@@ -531,11 +588,11 @@ const choosePeople = async (data) => {
porUserRef.value.open();
};
//确认选择
const handlePopUser = async (userList) => {
const userIds = userList.map((item) => {
const handlePopUser = async userList => {
const userIds = userList.map(item => {
return item.userId;
});
const nickNames = userList.map((item) => {
const nickNames = userList.map(item => {
return item.nickName;
});
form.value.assigneeMap[nodeCode.value] = userIds.join(',');
+9 -3
View File
@@ -1,7 +1,13 @@
<template>
<div class="top-right-btn" :style="style">
<el-row class="toolbar-row">
<el-tooltip v-if="search" class="item" effect="dark" :content="showSearch ? '隐藏搜索' : '显示搜索'" placement="top">
<el-tooltip
v-if="search"
class="item"
effect="dark"
:content="showSearch ? '隐藏搜索' : '显示搜索'"
placement="top"
>
<el-button circle icon="Search" @click="toggleSearch()" />
</el-tooltip>
<el-tooltip class="item" effect="dark" content="刷新" placement="top">
@@ -77,7 +83,7 @@ function saveStorage() {
// 更改数据列的显示和隐藏
function columnChange(...args: any[]) {
props.columns?.forEach((item) => {
props.columns?.forEach(item => {
item.visible = args[1].checkedKeys.includes(item.key);
});
saveStorage();
@@ -96,7 +102,7 @@ onMounted(() => {
}
} catch (e) {}
}
props.columns?.forEach((item) => {
props.columns?.forEach(item => {
if (item.visible) {
columnRef.value?.setChecked(item.key, true, false);
}
+104 -85
View File
@@ -1,80 +1,99 @@
<template>
<div>
<el-dialog v-model="roleDialog.visible.value" :title="roleDialog.title.value" width="80%" append-to-body class="role-select-dialog">
<el-dialog
v-model="roleDialog.visible.value"
:title="roleDialog.title.value"
width="80%"
append-to-body
class="role-select-dialog"
>
<div class="p-2 role-select-shell">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch">
<el-card shadow="hover" class="search-panel selector-card">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" class="query-form">
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="queryParams.roleName" placeholder="请输入角色名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="权限字符" prop="roleKey">
<el-input v-model="queryParams.roleKey" 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-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="hover" class="table-panel selector-card">
<template #header>
<div class="toolbar-shell selector-header">
<div class="table-heading">
<h3>角色列表</h3>
</div>
<div v-if="selectRoleList.length" class="selector-tags">
<el-tag v-for="role in selectRoleList" :key="role.roleId" closable @close="handleCloseTag(role)">
{{ role.roleName }}
</el-tag>
</div>
</div>
</template>
<vxe-table
ref="tableRef"
class="selector-table"
height="400px"
border
show-overflow
:data="roleList"
:loading="loading"
:row-config="{ keyField: 'roleId' }"
:checkbox-config="{ reserve: true, checkRowKeys: defaultSelectRoleIds }"
highlight-current-row
@checkbox-all="handleCheckboxAll"
@checkbox-change="handleCheckboxChange"
<transition
:enter-active-class="proxy?.animate.searchAnimate.enter"
:leave-active-class="proxy?.animate.searchAnimate.leave"
>
<vxe-column type="checkbox" width="50" align="center" />
<vxe-column v-if="false" key="roleId" label="角色编号" />
<vxe-column field="roleName" title="角色名称" />
<vxe-column field="roleKey" title="权限字符" />
<vxe-column field="roleSort" title="显示顺序" width="100" />
<vxe-column title="状态" align="center" width="100">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status"></dict-tag>
</template>
</vxe-column>
<vxe-column field="createTime" title="创建时间" align="center">
<template #default="scope">
<span>{{ proxy.parseTime(scope.row.createTime) }}</span>
</template>
</vxe-column>
</vxe-table>
<div v-show="showSearch">
<el-card shadow="hover" class="search-panel selector-card">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" class="query-form">
<el-form-item label="角色名称" prop="roleName">
<el-input
v-model="queryParams.roleName"
placeholder="请输入角色名称"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="权限字符" prop="roleKey">
<el-input
v-model="queryParams.roleKey"
placeholder="请输入权限字符"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<pagination
v-if="total > 0"
v-model:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="pageList"
/>
</el-card>
<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>
</transition>
<el-card shadow="hover" class="table-panel selector-card">
<template #header>
<div class="toolbar-shell selector-header">
<div class="table-heading">
<h3>角色列表</h3>
</div>
<div v-if="selectRoleList.length" class="selector-tags">
<el-tag v-for="role in selectRoleList" :key="role.roleId" closable @close="handleCloseTag(role)">
{{ role.roleName }}
</el-tag>
</div>
</div>
</template>
<vxe-table
ref="tableRef"
class="selector-table"
height="400px"
border
show-overflow
:data="roleList"
:loading="loading"
:row-config="{ keyField: 'roleId' }"
:checkbox-config="{ reserve: true, checkRowKeys: defaultSelectRoleIds }"
highlight-current-row
@checkbox-all="handleCheckboxAll"
@checkbox-change="handleCheckboxChange"
>
<vxe-column type="checkbox" width="50" align="center" />
<vxe-column v-if="false" key="roleId" label="角色编号" />
<vxe-column field="roleName" title="角色名称" />
<vxe-column field="roleKey" title="权限字符" />
<vxe-column field="roleSort" title="显示顺序" width="100" />
<vxe-column title="状态" align="center" width="100">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status"></dict-tag>
</template>
</vxe-column>
<vxe-column field="createTime" title="创建时间" align="center">
<template #default="scope">
<span>{{ proxy.parseTime(scope.row.createTime) }}</span>
</template>
</vxe-column>
</vxe-table>
<pagination
v-if="total > 0"
v-model:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="pageList"
/>
</el-card>
</div>
<template #footer>
<el-button @click="close">取消</el-button>
@@ -134,7 +153,7 @@ const confirm = () => {
roleDialog.closeDialog();
};
const computedIds = (data) => {
const computedIds = data => {
if (data instanceof Array) {
return [...data];
} else if (typeof data === 'string') {
@@ -152,7 +171,7 @@ const computedIds = (data) => {
*/
const getList = () => {
loading.value = true;
api.listRole(proxy?.addDateRange(queryParams.value, dateRange.value)).then((res) => {
api.listRole(proxy?.addDateRange(queryParams.value, dateRange.value)).then(res => {
roleList.value = res.data?.rows;
total.value = res.data?.total;
loading.value = false;
@@ -160,8 +179,8 @@ const getList = () => {
};
const pageList = async () => {
await getList();
const roles = roleList.value.filter((item) => {
return selectRoleList.value.some((role) => role.roleId === item.roleId);
const roles = roleList.value.filter(item => {
return selectRoleList.value.some(role => role.roleId === item.roleId);
});
await tableRef.value.setCheckboxRow(roles, true);
};
@@ -180,7 +199,7 @@ const resetQuery = () => {
handleQuery();
};
const handleCheckboxChange = (checked) => {
const handleCheckboxChange = checked => {
if (!prop.multiple && checked.checked) {
tableRef.value.setCheckboxRow(selectRoleList.value, false);
selectRoleList.value = [];
@@ -189,22 +208,22 @@ const handleCheckboxChange = (checked) => {
if (checked.checked) {
selectRoleList.value.push(row);
} else {
selectRoleList.value = selectRoleList.value.filter((item) => {
selectRoleList.value = selectRoleList.value.filter(item => {
return item.roleId !== row.roleId;
});
}
};
const handleCheckboxAll = (checked) => {
const handleCheckboxAll = checked => {
const rows = roleList.value;
if (checked.checked) {
rows.forEach((row) => {
if (!selectRoleList.value.some((item) => item.roleId === row.roleId)) {
rows.forEach(row => {
if (!selectRoleList.value.some(item => item.roleId === row.roleId)) {
selectRoleList.value.push(row);
}
});
} else {
selectRoleList.value = selectRoleList.value.filter((item) => {
return !rows.some((row) => row.roleId === item.roleId);
selectRoleList.value = selectRoleList.value.filter(item => {
return !rows.some(row => row.roleId === item.roleId);
});
}
};
@@ -212,7 +231,7 @@ const handleCheckboxAll = (checked) => {
const handleCloseTag = (user: RoleVO) => {
const roleId = user.roleId;
// 使用split删除用户
const index = selectRoleList.value.findIndex((item) => item.roleId === roleId);
const index = selectRoleList.value.findIndex(item => item.roleId === roleId);
const rows = selectRoleList.value[index];
tableRef.value?.setCheckboxRow(rows, false);
selectRoleList.value.splice(index, 1);
@@ -224,7 +243,7 @@ const initSelectRole = async () => {
if (defaultSelectRoleIds.value.length > 0) {
const { data } = await api.optionSelect(defaultSelectRoleIds.value);
selectRoleList.value = data;
const users = roleList.value.filter((item) => {
const users = roleList.value.filter(item => {
return defaultSelectRoleIds.value.includes(String(item.roleId));
});
await nextTick(() => {
+6 -1
View File
@@ -6,7 +6,12 @@
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-for="item of sizeOptions" :key="item.value" :disabled="size === item.value" :command="item.value">
<el-dropdown-item
v-for="item of sizeOptions"
:key="item.value"
:disabled="size === item.value"
:command="item.value"
>
{{ item.label }}
</el-dropdown-item>
</el-dropdown-menu>
+30 -15
View File
@@ -1,19 +1,34 @@
<template>
<el-menu class="mix-topnav-menu" :default-active="activeMenu" mode="horizontal" :ellipsis="false" @select="handleSelect">
<el-menu
class="mix-topnav-menu"
:default-active="activeMenu"
mode="horizontal"
:ellipsis="false"
@select="handleSelect"
>
<template v-for="(item, index) in topMenus">
<el-menu-item v-if="index < visibleNumber" :key="index" :index="item.path"
><svg-icon v-if="item.meta && item.meta.icon && item.meta.icon !== '#'" :icon-class="item.meta ? item.meta.icon : ''" />
{{ item.meta?.title }}</el-menu-item
>
<el-menu-item v-if="index < visibleNumber" :key="index" :index="item.path">
<svg-icon
v-if="item.meta && item.meta.icon && item.meta.icon !== '#'"
:icon-class="item.meta ? item.meta.icon : ''"
/>
{{ item.meta?.title }}
</el-menu-item>
</template>
<!-- 顶部菜单超出数量折叠 -->
<el-sub-menu v-if="topMenus.length > visibleNumber" class="el-sub-menu__hide-arrow" popper-class="mix-topnav-popper" index="more">
<el-sub-menu
v-if="topMenus.length > visibleNumber"
class="el-sub-menu__hide-arrow"
popper-class="mix-topnav-popper"
index="more"
>
<template #title>更多菜单</template>
<template v-for="(item, index) in topMenus">
<el-menu-item v-if="index >= visibleNumber" :key="index" :index="item.path"
><svg-icon :icon-class="item.meta ? item.meta.icon : ''" /> {{ item.meta?.title }}</el-menu-item
>
<el-menu-item v-if="index >= visibleNumber" :key="index" :index="item.path">
<svg-icon :icon-class="item.meta ? item.meta.icon : ''" />
{{ item.meta?.title }}
</el-menu-item>
</template>
</el-sub-menu>
</el-menu>
@@ -46,7 +61,7 @@ const routers = computed(() => permissionStore.getTopbarRoutes());
// 顶部显示菜单
const topMenus = computed(() => {
const topMenus: RouteRecordRaw[] = [];
routers.value.map((menu) => {
routers.value.map(menu => {
if (menu.hidden !== true) {
// 兼容顶部栏一级菜单内部跳转
if (menu.path === '/' && menu.children) {
@@ -62,8 +77,8 @@ const topMenus = computed(() => {
// 设置子路由
const childrenMenus = computed(() => {
const childrenMenus: RouteRecordRaw[] = [];
routers.value.map((router) => {
router.children?.forEach((item) => {
routers.value.map(router => {
router.children?.forEach(item => {
if (item.parentPath === undefined) {
if (router.path === '/') {
item.path = '/' + item.path;
@@ -110,13 +125,13 @@ const setVisibleNumber = () => {
};
const handleSelect = (key: string) => {
const route = routers.value.find((item) => item.path === key);
const route = routers.value.find(item => item.path === key);
if (isHttp(key)) {
// http(s):// 路径新窗口打开
window.open(key, '_blank');
} else if (!route || !route.children) {
// 没有子路由路径内部打开
const routeMenu = childrenMenus.value.find((item) => item.path === key);
const routeMenu = childrenMenus.value.find(item => item.path === key);
if (routeMenu && routeMenu.query) {
const query = JSON.parse(routeMenu.query);
router.push({ path: key, query: query });
@@ -134,7 +149,7 @@ const handleSelect = (key: string) => {
const activeRoutes = (key: string) => {
const routes: RouteRecordRaw[] = [];
if (childrenMenus.value && childrenMenus.value.length > 0) {
childrenMenus.value.map((item) => {
childrenMenus.value.map(item => {
if (key == item.parentPath || (key == 'index' && '' == item.path)) {
routes.push(item);
}
+71 -23
View File
@@ -1,20 +1,45 @@
<template>
<div>
<el-dialog v-model="userDialog.visible.value" :title="userDialog.title.value" width="80%" append-to-body class="user-select-dialog">
<el-dialog
v-model="userDialog.visible.value"
:title="userDialog.title.value"
width="80%"
append-to-body
class="user-select-dialog"
>
<div class="p-2 user-select-shell">
<el-row :gutter="12" class="selector-layout">
<!-- 部门树 -->
<el-col :lg="treeCollapsed ? 1 : 5" :xs="24" class="tree-panel-col" :class="{ 'is-collapsed': treeCollapsed }">
<el-card shadow="hover" class="side-panel tree-panel-shell selector-card selector-side-card" :class="{ 'is-collapsed': treeCollapsed }">
<el-col
:lg="treeCollapsed ? 1 : 5"
:xs="24"
class="tree-panel-col"
:class="{ 'is-collapsed': treeCollapsed }"
>
<el-card
shadow="hover"
class="side-panel tree-panel-shell selector-card selector-side-card"
:class="{ 'is-collapsed': treeCollapsed }"
>
<template #header>
<div class="panel-heading search-panel-toggle tree-panel-header" :class="{ 'is-collapsed': treeCollapsed }" @click.stop="treeCollapsed = !treeCollapsed">
<div
class="panel-heading search-panel-toggle tree-panel-header"
:class="{ 'is-collapsed': treeCollapsed }"
@click.stop="treeCollapsed = !treeCollapsed"
>
<div v-show="!treeCollapsed" class="table-heading">
<h3>部门结构</h3>
</div>
</div>
</template>
<template v-if="!treeCollapsed">
<el-input v-model="deptName" class="selector-dept-input" placeholder="请输入部门名称" prefix-icon="Search" clearable />
<el-input
v-model="deptName"
class="selector-dept-input"
placeholder="请输入部门名称"
prefix-icon="Search"
clearable
/>
<el-tree
ref="deptTreeRef"
class="selector-tree"
@@ -30,17 +55,35 @@
</template>
</el-card>
</el-col>
<el-col :lg="treeCollapsed ? 23 : 19" :xs="24" class="tree-content-col" :class="{ 'is-tree-collapsed': treeCollapsed }">
<el-col
:lg="treeCollapsed ? 23 : 19"
:xs="24"
class="tree-content-col"
:class="{ 'is-tree-collapsed': treeCollapsed }"
>
<div class="p-2user-select-main">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<transition
:enter-active-class="proxy?.animate.searchAnimate.enter"
:leave-active-class="proxy?.animate.searchAnimate.leave"
>
<div v-show="showSearch">
<el-card shadow="hover" class="search-panel selector-card">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" class="query-form">
<el-form-item label="用户名称" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable @keyup.enter="handleQuery" />
<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>
@@ -74,7 +117,12 @@
:data="userList"
:loading="loading"
:row-config="{ keyField: 'userId', isHover: true }"
:checkbox-config="{ reserve: true, trigger: 'row', highlight: true, showHeader: prop.multiple }"
:checkbox-config="{
reserve: true,
trigger: 'row',
highlight: true,
showHeader: prop.multiple
}"
@checkbox-all="handleCheckboxAll"
@checkbox-change="handleCheckboxChange"
>
@@ -189,12 +237,12 @@ const confirm = () => {
userDialog.closeDialog();
};
const computedIds = (data) => {
const computedIds = data => {
if (data === '' || data === null || data === undefined) {
return [];
}
if (data instanceof Array) {
return data.map((item) => String(item));
return data.map(item => String(item));
} else if (typeof data === 'string') {
return data.split(',');
} else if (typeof data === 'number') {
@@ -229,8 +277,8 @@ const getList = async () => {
const pageList = async () => {
await getList();
const users = userList.value.filter((item) => {
return selectUserList.value.some((user) => user.userId === item.userId);
const users = userList.value.filter(item => {
return selectUserList.value.some(user => user.userId === item.userId);
});
await tableRef.value.setCheckboxRow(users, true);
};
@@ -256,7 +304,7 @@ const resetQuery = (refresh = true) => {
refresh && handleQuery();
};
const handleCheckboxChange = (checked) => {
const handleCheckboxChange = checked => {
if (!prop.multiple && checked.checked) {
tableRef.value.setCheckboxRow(selectUserList.value, false);
selectUserList.value = [];
@@ -265,22 +313,22 @@ const handleCheckboxChange = (checked) => {
if (checked.checked) {
selectUserList.value.push(row);
} else {
selectUserList.value = selectUserList.value.filter((item) => {
selectUserList.value = selectUserList.value.filter(item => {
return item.userId !== row.userId;
});
}
};
const handleCheckboxAll = (checked) => {
const handleCheckboxAll = checked => {
const rows = userList.value;
if (checked.checked) {
rows.forEach((row) => {
if (!selectUserList.value.some((item) => item.userId === row.userId)) {
rows.forEach(row => {
if (!selectUserList.value.some(item => item.userId === row.userId)) {
selectUserList.value.push(row);
}
});
} else {
selectUserList.value = selectUserList.value.filter((item) => {
return !rows.some((row) => row.userId === item.userId);
selectUserList.value = selectUserList.value.filter(item => {
return !rows.some(row => row.userId === item.userId);
});
}
};
@@ -288,7 +336,7 @@ const handleCheckboxAll = (checked) => {
const handleCloseTag = (user: UserVO) => {
const userId = user.userId;
// 使用split删除用户
const index = selectUserList.value.findIndex((item) => item.userId === userId);
const index = selectUserList.value.findIndex(item => item.userId === userId);
const rows = selectUserList.value[index];
tableRef.value?.setCheckboxRow(rows, false);
selectUserList.value.splice(index, 1);
@@ -298,7 +346,7 @@ const initSelectUser = async () => {
if (defaultSelectUserIds.value.length > 0) {
const { data } = await api.optionSelect(defaultSelectUserIds.value);
selectUserList.value = data;
const users = userList.value.filter((item) => {
const users = userList.value.filter(item => {
return defaultSelectUserIds.value.includes(String(item.userId));
});
await nextTick(() => {