Browse Source

Merge remote-tracking branch 'origin/master'

master^2
La123123 19 hours ago
parent
commit
d4306bc2da
  1. 11
      im-admin-ui/src/api/im/user/index.ts
  2. 38
      im-admin-ui/src/views/im/code/components/alink.vue
  3. 66
      im-admin-ui/src/views/im/code/components/wangye.vue
  4. 255
      im-admin-ui/src/views/im/code/index.vue
  5. 2
      im-admin-ui/src/views/im/customer/index.vue
  6. 174
      im-admin-ui/src/views/im/user/index.vue

11
im-admin-ui/src/api/im/user/index.ts

@ -109,3 +109,14 @@ export const getGroupList = (): AxiosPromise<any> => {
method: 'post' method: 'post'
}); });
}; };
/**
*
*/
export const updateBatchUser = (data: any): AxiosPromise<any> => {
return request({
url: '/im/user/updateBatchUser',
method: 'post',
data: data
});
};

38
im-admin-ui/src/views/im/code/components/alink.vue

@ -0,0 +1,38 @@
<template>
<div class="content">
<div class="code-content-wrap">
<textarea id="NormalCodeTextarealink1" class="code" rows="1">{{ siteUrl }}/chat/index</textarea>
<div class="other-wrap">
<a class="btn btn-blue btn-large mr10" :href="linkUrl3" target="_blank">点击体验</a>
<a class="btn btn-blue btn-large" href="javascript:void(0);" @click="getCopy('NormalCodeTextarealink1')"><span>复制代码</span></a>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'Alink',
props: {
tokeninfo: {},
siteUrl: ''
},
computed: {
linkUrl1() {
return `${location.origin}/chat/index?token=${this.tokeninfo.token_md5}&noCanClose=1`;
},
linkUrl2() {
return `${location.origin}/chat/index?token=${this.tokeninfo.token_md5}&noCanClose=1&deviceType=Mobile`;
},
linkUrl3() {
return `${location.origin}/chat/index?token=${this.tokeninfo.token_md5}&noCanClose=1`;
}
},
mounted() {},
methods: {
getCopy(id) {
this.$emit('cgetCopy', id);
}
}
};
</script>

66
im-admin-ui/src/views/im/code/components/wangye.vue

@ -0,0 +1,66 @@
<template>
<div class="content">
<p class="font-w">使用简介</p>
<p class="text-i">网页内快速接入客服让网页拥有客服窗口请把一下代码复制到网页最底部</p>
<Divider />
<p class="typetitle">获取代码</p>
<div class="fenlei">
<div class="code-content-wrap">
<textarea id="NormalCodeTextarea1" class="code" rows="22">
<script>
(function() {
_s = document.createElement('script');
_s.src="{{ siteUrl }}/customerServer.js"
_s.onload = function(){
var option = {
"authInit":true,
openUrl: '{{ siteUrl }}',
isShowTip: true, // false,true
mobileIcon: '', //
pcIcon: '', // pc
windowStyle:'center',// center
};
var canCustomerServer = new initCustomerServer(option);
canCustomerServer.init();
}
document.head.appendChild(_s)
})();
</script>
</textarea
>
<div class="other-wrap">
<a class="btn btn-blue btn-large mr10" href="javascript:void(0);" @click="jiazai">点击体验</a>
<a class="btn btn-blue btn-large" href="javascript:void(0);" @click="getCopy('NormalCodeTextarea1')"><span>复制代码</span></a>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, defineEmits } from 'vue';
const props = defineProps<{
tokeninfo?: any;
siteUrl?: string;
}>();
const emit = defineEmits<{ (e: 'cgetCopy', id: string): void }>();
function jiazai() {
const token = props.tokeninfo?.token_md5 || '';
window.open(`${location.origin}/chat/index?token=${token}&noCanClose=1`);
}
function getCopy(id: string) {
emit('cgetCopy', id);
}
</script>
<style>
.a {
display: none;
display: block;
border-radius: 8px;
overflow: hidden;
}
</style>

255
im-admin-ui/src/views/im/code/index.vue

@ -0,0 +1,255 @@
<template>
<div class="getCode_container">
<div class="content">
<el-card shadow="never">
<el-collapse v-model="activeName" accordion>
<el-collapse-item title="超链接" name="1">
<alink :tokeninfo="token" :site-url="siteUrl" @cget-copy="getCopy"></alink>
</el-collapse-item>
<el-collapse-item title="网页内嵌" name="2">
<wangye :tokeninfo="token" :site-url="siteUrl" @cget-copy="getCopy"></wangye>
</el-collapse-item>
</el-collapse>
</el-card>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, computed, onMounted, getCurrentInstance } from 'vue';
// import { useStore } from 'vuex';
// import { adminAppCustomer, appReset } from '@/api/kefu';
import alink from './components/alink.vue';
import wangye from './components/wangye.vue';
// import kaifa from './components/kaifa';
// import setting from './components/setting';
const activeName = ref('1');
const { proxy } = getCurrentInstance() as any;
// const store = useStore();
// const isMobile = computed(() => store.state.media?.isMobile);
// const categoryId = computed(() => store.state.userLevel?.categoryId);
// const labelWidth = computed(() => (isMobile.value ? undefined : 75));
// const labelPosition = computed(() => (isMobile.value ? 'top' : 'left'));
const token = ref<any>('');
const canfrime = ref(false);
const srcUrl = ref(`${location.origin}/customerServer.js`);
const siteUrl = ref(`${location.origin}`);
const cloneTip = ref(false);
const canCustomerServer = ref('');
const linkUrl = computed(() => `${location.origin}/chat/index?token=${token.value?.token_md5}&noCanClose=1`);
// onMounted(() => {
// getAdminAppCustomer();
// });
// async function getAdminAppCustomer() {
// try {
// const mod: any = await import('@/api/kefu');
// if (mod && typeof mod.adminAppCustomer === 'function') {
// const res: any = await mod.adminAppCustomer();
// if (res.status === 200 && res.data?.list?.length) {
// token.value = res.data.list[0];
// }
// }
// } catch (e) {
// // ignore if module not present
// }
// }
function resetToken() {
canfrime.value = true;
}
// async function confirme() {
// if (!token.value?.id) return;
// try {
// const mod: any = await import('@/api/kefu');
// if (mod && typeof mod.appReset === 'function') {
// const res: any = await mod.appReset(token.value.id);
// if (res?.status === 200) {
// token.value = { ...token.value, token: res.data.token };
// proxy?.$Message?.success('token ');
// }
// }
// } catch (e) {
// // ignore
// }
// canfrime.value = false;
// }
function cancel() {
canfrime.value = false;
}
function getCopy(id: string) {
const elem = document.getElementById(id);
if (!elem) return;
const content = copyToClipboard(elem as HTMLElement);
if (content) cloneTip.value = true;
}
function copyToClipboard(elem: HTMLElement) {
const targetId = '_hiddenCopyText_';
let target: HTMLTextAreaElement | HTMLInputElement | null = null as any;
const tagName = elem.tagName;
const isInput = tagName === 'INPUT' || tagName === 'TEXTAREA';
let origSelectionStart: number | undefined;
let origSelectionEnd: number | undefined;
if (isInput) {
target = elem as HTMLInputElement;
origSelectionStart = (elem as HTMLInputElement).selectionStart as number;
origSelectionEnd = (elem as HTMLInputElement).selectionEnd as number;
} else {
target = document.getElementById(targetId) as HTMLTextAreaElement;
if (!target) {
target = document.createElement('textarea');
target.style.position = 'absolute';
target.style.left = '-9999px';
target.style.top = '0';
target.id = targetId;
document.body.appendChild(target);
}
target.textContent = elem.textContent || '';
}
const currentFocus = document.activeElement as HTMLElement | null;
target.focus();
(target as HTMLTextAreaElement).setSelectionRange(0, (target as HTMLTextAreaElement).value.length);
let succeed = false;
try {
succeed = document.execCommand('copy');
} catch (e) {
succeed = false;
}
if (currentFocus && typeof currentFocus.focus === 'function') {
currentFocus.focus();
}
if (isInput && target) {
(elem as HTMLInputElement).setSelectionRange(origSelectionStart as number, origSelectionEnd as number);
} else if (target) {
target.textContent = '';
}
proxy?.$Message?.success('已成功复制到粘贴板');
return succeed;
}
</script>
<style>
.getCode_container {
.content {
width: 100%;
color: #323437;
background: #ffffff;
margin-top: 18px;
font-size: 13px;
padding: 10px;
}
.font-w {
font-weight: 800;
margin: 10px 0;
}
.text-i {
text-indent: 2em;
}
.content > p {
margin-bottom: 6px;
}
.code-content-wrap {
clear: both;
border: 1px solid #e4e4e4;
border-radius: 3px;
padding: 12px 17px;
background-color: #f8f8f8;
}
.other-wrap {
margin: 4px 0;
text-align: right;
}
.textarea {
border: none;
/* height: 40px; */
width: 100%;
outline: 0;
resize: none;
background-color: #f8f8f8;
font-family: Arial;
color: #323437;
line-height: 24px;
text-align: left;
}
.code {
border: none;
/* height: 40px; */
width: 100%;
outline: 0;
resize: none;
background-color: #f8f8f8;
font-family: Arial;
color: #323437;
line-height: 24px;
text-align: left;
}
.btn {
display: inline-block;
zoom: 1;
padding: 6px 16px;
border: 1px solid #d9dbdc;
border-radius: 2px;
line-height: 1;
color: #323437;
cursor: pointer;
outline: 0;
}
.btn.btn-blue {
color: #fff;
background-color: #4f97e7;
border-color: #3085e3;
}
.setting-highlight {
color: #f15755;
margin-left: 5px;
line-height: 30px;
}
.fenlei {
margin: 10px 0;
border: 1px solid #eee;
padding: 30px;
padding-bottom: 10px;
border-radius: 6px;
}
.typetitle {
padding: 4px 7px;
font-size: 18px;
}
}
</style>
<style scoped>
.ivu-modal-confirm {
display: flex;
align-items: center;
}
.modimg {
width: 40px !important;
height: 40px !important;
margin-right: 30px;
}
</style>

2
im-admin-ui/src/views/im/customer/index.vue

@ -111,7 +111,7 @@
</div> </div>
</template> </template>
<script setup name="User" lang="ts"> <script setup name="Customer" lang="ts">
import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd } from '@/api/im/user/customer'; import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd } from '@/api/im/user/customer';
import { UserVO, UserQuery, UserForm } from '@/api/im/user/types'; import { UserVO, UserQuery, UserForm } from '@/api/im/user/types';
import { to } from 'await-to-js'; import { to } from 'await-to-js';

174
im-admin-ui/src/views/im/user/index.vue

@ -23,7 +23,7 @@
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['im:user:export']">导出</el-button> <el-button v-hasPermi="['im:user:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@ -31,7 +31,20 @@
</transition> </transition>
<el-card shadow="never"> <el-card shadow="never">
<template #header>
<el-row :gutter="10">
<el-col :span="1.5">
<el-button v-hasPermi="['im:user:labelIds']" type="primary" plain icon="Plus" @click="handleLabelIds()">批量设置标签</el-button>
</el-col>
<el-col :span="1.5">
<el-button v-hasPermi="['im:user:groupIds']" type="primary" plain icon="Plus" @click="handleGroupIds()">批量设置分组</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="用户名" align="center" prop="userName" /> <el-table-column label="用户名" align="center" prop="userName" />
<el-table-column label="用户昵称" align="center" prop="nickName" /> <el-table-column label="用户昵称" align="center" prop="nickName" />
<el-table-column label="用户头像" align="center" prop="headImageThumb" width="100"> <el-table-column label="用户头像" align="center" prop="headImageThumb" width="100">
@ -47,10 +60,10 @@
<el-table-column label="标签" align="center" prop="labelIds" width="200"> <el-table-column label="标签" align="center" prop="labelIds" width="200">
<template #default="scope"> <template #default="scope">
<el-tag <el-tag
v-for="labelId in (scope.row.labelIds || '').split(',').filter(id => id)" v-for="labelId in (scope.row.labelIds || '').split(',').filter((id) => id)"
:key="labelId" :key="labelId"
size="small" size="small"
style="margin-right: 5px; margin-bottom: 5px;" style="margin-right: 5px; margin-bottom: 5px"
> >
{{ getLabelNameById(labelId) }} {{ getLabelNameById(labelId) }}
</el-tag> </el-tag>
@ -59,21 +72,23 @@
<el-table-column label="群组" align="center" prop="groupIds" width="200"> <el-table-column label="群组" align="center" prop="groupIds" width="200">
<template #default="scope"> <template #default="scope">
<el-tag <el-tag
v-for="groupId in (scope.row.groupIds || '').split(',').filter(id => id)" v-for="groupId in (scope.row.groupIds || '').split(',').filter((id) => id)"
:key="groupId" :key="groupId"
type="info" type="info"
size="small" size="small"
style="margin-right: 5px; margin-bottom: 5px;" style="margin-right: 5px; margin-bottom: 5px"
> >
{{ getGroupNameById(groupId) }} {{ getGroupNameById(groupId) }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<!--
<el-table-column label="是否被封禁" align="center" prop="isBanned"> <el-table-column label="是否被封禁" align="center" prop="isBanned">
<template #default="scope"> <template #default="scope">
<dict-tag :options="im_bool" :value="scope.row.isBanned" /> <dict-tag :options="im_bool" :value="scope.row.isBanned" />
</template> </template>
</el-table-column> </el-table-column>
-->
<el-table-column label="注册时间" align="center" prop="createdTime" width="180"> <el-table-column label="注册时间" align="center" prop="createdTime" width="180">
<template #default="scope"> <template #default="scope">
<span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span>
@ -86,17 +101,21 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" v-hasPermi="['im:user:query']" @click="handleDetail(scope.row)">详情</el-button> <!--
<el-button v-if="scope.row.isBanned" link type="danger" v-hasPermi="['im:user:ban']" @click="unbanHandle(scope.row)">解封</el-button> <el-button v-hasPermi="['im:user:query']" link type="primary" @click="handleDetail(scope.row)">详情</el-button>
<el-button v-else link type="danger" v-hasPermi="['im:user:ban']" @click="banHandle(scope.row)">封禁</el-button> <el-button v-if="scope.row.isBanned" v-hasPermi="['im:user:ban']" link type="danger" @click="unbanHandle(scope.row)">解封</el-button>
<el-button v-else v-hasPermi="['im:user:ban']" link type="danger" @click="banHandle(scope.row)">封禁</el-button>
-->
<el-button v-hasPermi="['im:user:label']" link type="primary" @click="handleLabel(scope.row)">设置标签</el-button>
<el-button v-hasPermi="['im:user:group']" link type="primary" @click="handleGroup(scope.row)">设置分组</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
</el-card> </el-card>
<!-- 添加或修改用户对话框 --> <!-- 添加或修改用户对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body> <el-dialog v-model="dialog.visible" :title="dialog.title" width="800px" append-to-body>
<el-form ref="userFormRef" :model="form" :rules="rules" label-width="100px" disabled> <el-form ref="userFormRef" :model="form" :rules="rules" label-width="100px" disabled>
<el-form-item label="用户头像" prop="headImage"> <el-form-item label="用户头像" prop="headImage">
<image-preview v-if="form.headImageThumb" :src="form.headImageThumb" :full-src="form.headImage" :width="100" :height="100" /> <image-preview v-if="form.headImageThumb" :src="form.headImageThumb" :full-src="form.headImage" :width="100" :height="100" />
@ -114,28 +133,28 @@
<el-input v-model="form.signature" /> <el-input v-model="form.signature" />
</el-form-item> </el-form-item>
<el-form-item label="最后登录时间" prop="lastLoginTime"> <el-form-item label="最后登录时间" prop="lastLoginTime">
<el-date-picker clearable v-model="form.lastLoginTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"> </el-date-picker> <el-date-picker v-model="form.lastLoginTime" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss"> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="注册时间" prop="createdTime"> <el-form-item label="注册时间" prop="createdTime">
<el-date-picker clearable v-model="form.createdTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"> </el-date-picker> <el-date-picker v-model="form.createdTime" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss"> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="标签" prop="labelIds"> <el-form-item label="标签" prop="labelIds">
<el-tag <el-tag
v-for="labelId in (form.labelIds || '').split(',').filter(id => id)" v-for="labelId in (form.labelIds || '').split(',').filter((id) => id)"
:key="labelId" :key="labelId"
size="small" size="small"
style="margin-right: 5px; margin-bottom: 5px;" style="margin-right: 5px; margin-bottom: 5px"
> >
{{ getLabelNameById(labelId) }} {{ getLabelNameById(labelId) }}
</el-tag> </el-tag>
</el-form-item> </el-form-item>
<el-form-item label="群组" prop="groupIds"> <el-form-item label="群组" prop="groupIds">
<el-tag <el-tag
v-for="groupId in (form.groupIds || '').split(',').filter(id => id)" v-for="groupId in (form.groupIds || '').split(',').filter((id) => id)"
:key="groupId" :key="groupId"
type="info" type="info"
size="small" size="small"
style="margin-right: 5px; margin-bottom: 5px;" style="margin-right: 5px; margin-bottom: 5px"
> >
{{ getGroupNameById(groupId) }} {{ getGroupNameById(groupId) }}
</el-tag> </el-tag>
@ -153,11 +172,40 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<!-- 设置标签对话框 -->
<el-dialog v-model="labelDialogVisible" title="设置标签" width="520px">
<div>
<el-select v-model="selectedLabelIds" multiple filterable placeholder="请选择标签" style="width: 100%">
<el-option v-for="opt in labelOptions" :key="opt.id" :label="opt.labelName" :value="opt.id" />
</el-select>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancelLabel">取消</el-button>
<el-button type="primary" @click="confirmLabel">保存</el-button>
</div>
</template>
</el-dialog>
<!-- 设置分组对话框 -->
<el-dialog v-model="groupDialogVisible" title="设置分组" width="520px">
<div>
<el-select v-model="selectedGroupIds" multiple filterable placeholder="请选择群组" style="width: 100%">
<el-option v-for="opt in groupOptions" :key="opt.id" :label="opt.groupName" :value="opt.id" />
</el-select>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancelGroup">取消</el-button>
<el-button type="primary" @click="confirmGroup">保存</el-button>
</div>
</template>
</el-dialog>
</div> </div>
</template> </template>
<script setup name="User" lang="ts"> <script setup name="User" lang="ts">
import { listUser, getUser, ban, unban, getLabelList, getGroupList } from '@/api/im/user'; import { listUser, getUser, ban, unban, getLabelList, getGroupList, updateBatchUser } from '@/api/im/user';
import { UserVO, UserQuery, UserForm } from '@/api/im/user/types'; import { UserVO, UserQuery, UserForm } from '@/api/im/user/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@ -205,8 +253,8 @@ const data = reactive<PageData<UserForm, UserQuery>>({
pageSize: 10, pageSize: 10,
userName: undefined, userName: undefined,
nickName: undefined, nickName: undefined,
labelIds: [], labelIds: [] as any,
groupIds: [], groupIds: [] as any,
params: {} params: {}
}, },
rules: {} rules: {}
@ -216,6 +264,90 @@ const { queryParams, form, rules } = toRefs(data);
const { im_bool } = toRefs<any>(proxy?.useDict('im_bool')); const { im_bool } = toRefs<any>(proxy?.useDict('im_bool'));
const { sys_user_sex } = toRefs<any>(proxy?.useDict('sys_user_sex')); const { sys_user_sex } = toRefs<any>(proxy?.useDict('sys_user_sex'));
// /
const labelDialogVisible = ref(false);
const groupDialogVisible = ref(false);
const editingUser = ref<UserVO | null>(null);
const selectedLabelIds = ref<Array<string | number>>([]);
const selectedGroupIds = ref<Array<string | number>>([]);
/** 打开标签设置窗口 */
const handleLabel = (row?: UserVO) => {
editingUser.value = row || userList.value.find((u) => u.id === ids.value[0]) || null;
if (!editingUser.value) {
proxy?.$modal?.msgError('请先选择一个用户');
return;
}
selectedLabelIds.value = (editingUser.value.labelIds || '')
.toString()
.split(',')
.filter((id) => id)
.map((v) => (Number(v).toString() === v ? Number(v) : v));
labelDialogVisible.value = true;
};
const cancelLabel = () => {
labelDialogVisible.value = false;
editingUser.value = null;
selectedLabelIds.value = [];
};
const confirmLabel = async () => {
if (!editingUser.value) return;
const payload: any = { id: editingUser.value.id, labelIds: selectedLabelIds.value.join(',') };
// optimistic update in UI
editingUser.value.labelIds = payload.labelIds;
try {
const mod: any = await await updateBatchUser(payload);
if (mod && typeof mod.updateUser === 'function') {
await mod.updateUser(payload);
}
} catch (e) {
// ignore if API not present
}
labelDialogVisible.value = false;
proxy?.$modal?.msgSuccess('设置标签成功');
await getList();
};
/** 打开群组设置窗口 */
const handleGroup = (row?: UserVO) => {
editingUser.value = row || userList.value.find((u) => u.id === ids.value[0]) || null;
if (!editingUser.value) {
proxy?.$modal?.msgError('请先选择一个用户');
return;
}
selectedGroupIds.value = (editingUser.value.groupIds || '')
.toString()
.split(',')
.filter((id) => id)
.map((v) => (Number(v).toString() === v ? Number(v) : v));
groupDialogVisible.value = true;
};
const cancelGroup = () => {
groupDialogVisible.value = false;
editingUser.value = null;
selectedGroupIds.value = [];
};
const confirmGroup = async () => {
if (!editingUser.value) return;
const payload: any = { id: editingUser.value.id, groupIds: selectedGroupIds.value.join(',') };
editingUser.value.groupIds = payload.groupIds;
try {
const mod: any = await updateBatchUser(payload);
if (mod && typeof mod.updateUser === 'function') {
await mod.updateUser(payload);
}
} catch (e) {
// ignore
}
groupDialogVisible.value = false;
proxy?.$modal?.msgSuccess('设置分组成功');
await getList();
};
/** 查询用户列表 */ /** 查询用户列表 */
const getList = async () => { const getList = async () => {
loading.value = true; loading.value = true;
@ -247,8 +379,8 @@ const handleQuery = () => {
const resetQuery = () => { const resetQuery = () => {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
// //
queryParams.value.labelIds = []; queryParams.value.labelIds = [] as any;
queryParams.value.groupIds = []; queryParams.value.groupIds = [] as any;
handleQuery(); handleQuery();
console.log('handleQuery'); console.log('handleQuery');
}; };

Loading…
Cancel
Save