update prettier 替换为 oxfmt 格式化整个项目的代码结构
This commit is contained in:
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
/>
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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'))
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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(',');
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
Reference in New Issue
Block a user