fixbug: 🐛 修复不能分页查询问题

This commit is contained in:
Bunny 2024-10-04 17:10:24 +08:00
parent f1493875ee
commit 3342c0a07f
8 changed files with 206 additions and 100 deletions

View File

@ -1,119 +1,44 @@
<script lang="tsx" setup> <script lang="ts" setup>
import { computed, onMounted, reactive, ref } from 'vue'; import { computed, onMounted, ref } from 'vue';
import { columns } from '@/views/system/adminUser/utils/columns'; import { columns } from '@/views/system/adminUser/utils/columns';
import PureTableBar from '@/components/TableBar/src/bar'; import PureTableBar from '@/components/TableBar/src/bar';
import AddFill from '@iconify-icons/ri/add-circle-line'; import AddFill from '@iconify-icons/ri/add-circle-line';
import PureTable from '@pureadmin/table'; import PureTable from '@pureadmin/table';
import { onAdd, onDelete, onSearch, onUpdate, updateUserStatus } from '@/views/system/adminUser/utils/hooks'; import { onAdd, onAssignRolesToUser, onDelete, onResetPassword, onSearch, onUpdate, onUploadAvatar, updateUserStatus } from '@/views/system/adminUser/utils/hooks';
import Delete from '@iconify-icons/ep/delete'; import Delete from '@iconify-icons/ep/delete';
import EditPen from '@iconify-icons/ep/edit-pen'; import EditPen from '@iconify-icons/ep/edit-pen';
import Refresh from '@iconify-icons/ep/refresh'; import Refresh from '@iconify-icons/ep/refresh';
import { selectUserinfo } from '@/components/Table/Userinfo/columns'; import { selectUserinfo } from '@/components/Table/Userinfo/columns';
import { $t } from '@/plugins/i18n'; import { $t } from '@/plugins/i18n';
import { useAdminUserStore } from '@/store/system/adminUser.ts';
import ResetPasswordDialog from '@/components/Table/ResetPasswords.vue';
import { useRenderIcon } from '@/components/CommonIcon/src/hooks'; import { useRenderIcon } from '@/components/CommonIcon/src/hooks';
import userAvatar from '@/assets/user.jpg'; import userAvatar from '@/assets/user.jpg';
import Upload from '@iconify-icons/ri/upload-line'; import Upload from '@iconify-icons/ri/upload-line';
import Role from '@iconify-icons/ri/admin-line'; import Role from '@iconify-icons/ri/admin-line';
import Password from '@iconify-icons/ri/lock-password-line'; import Password from '@iconify-icons/ri/lock-password-line';
import More from '@iconify-icons/ep/more-filled'; import More from '@iconify-icons/ep/more-filled';
import { addDialog } from '@/components/BaseDialog/index'; import { useAdminUserStore } from '@/store/system/adminUser';
import { deviceDetection } from '@pureadmin/utils'; import { ErrorTypes } from 'xgplayer/es/error';
import CropperPreview from '@/components/CropperPreview';
import AssignUserToRole from '@/views/system/adminUser/assign-user-to-role.vue';
import { useRoleStore } from '@/store/system/role';
const tableRef = ref(); const tableRef = ref();
const formRef = ref(); const formRef = ref();
const cropRef = ref();
const assignRolesRef = ref();
const roleStore = useRoleStore();
//
const avatarInfo = ref();
const adminUserStore = useAdminUserStore(); const adminUserStore = useAdminUserStore();
// Ref const buttonClass = computed(() => ['!h-[20px]', 'reset-margin', '!text-gray-500', 'dark:!text-white', 'dark:hover:!text-primary']);
const ruleFormByRestPasswordRef = ref();
//
const restPasswordForm = reactive({
userId: void 0,
password: '',
});
/** 上传头像 */ /**
const onUploadAvatar = (row: any) => { * * 当前页改变时
addDialog({ */
title: '裁剪、上传头像', const onCurrentPageChange = async (value: number) => {
width: '40%', adminUserStore.pagination.currentPage = value;
closeOnClickModal: false,
fullscreen: deviceDetection(),
contentRenderer: () =>
h(CropperPreview, {
ref: cropRef,
imgSrc: row.avatar || userAvatar,
onCropper: info => (avatarInfo.value = info),
}),
beforeSure: async done => {
console.log('裁剪后的图片信息:', avatarInfo.value);
// 使avatarInfo.valuerow
done();
await onSearch(); await onSearch();
},
closeCallBack: () => cropRef.value.hidePopover(),
});
}; };
/** /**
* * 重置密码 * * 当分页发生变化
* @param row * @param value
*/ */
const onResetPassword = (row: any) => { const onPageSizeChange = async (value: number) => {
addDialog({ adminUserStore.pagination.pageSize = value;
title: `重置 ${row.username} 用户的密码`, await onSearch();
width: '30%',
draggable: true,
closeOnClickModal: false,
fullscreenIcon: true,
destroyOnClose: true,
contentRenderer: () => <ResetPasswordDialog ref={ruleFormByRestPasswordRef} form={restPasswordForm} />,
beforeSure: (done: any) => {
ruleFormByRestPasswordRef.value.ruleFormRef.validate(async (valid: any) => {
if (valid) {
//
const data = { userId: row.id, password: restPasswordForm.password };
const result = await adminUserStore.updateAdminUserPasswordByManager(data);
//
if (!result) return;
done();
}
});
},
});
};
/**
* 为用户分配角色
* @param row
*/
const onAssignRolesToUser = (row: any) => {
addDialog({
title: `${row.username} 分配角色`,
width: '30%',
draggable: true,
closeOnClickModal: false,
fullscreenIcon: true,
contentRenderer: () => <AssignUserToRole ref={assignRolesRef} userId={row.id} />,
beforeSure: async (done: any) => {
//
const data = { userId: row.id, roleIds: assignRolesRef.value.assignRoles };
const result = await roleStore.assignRolesToUsers(data);
//
if (!result) return;
done();
},
});
}; };
/** /**
@ -126,11 +51,6 @@ const resetForm = async formEl => {
await onSearch(); await onSearch();
}; };
/**
* * 按钮类
*/
const buttonClass = computed(() => ['!h-[20px]', 'reset-margin', '!text-gray-500', 'dark:!text-white', 'dark:hover:!text-primary']);
onMounted(() => { onMounted(() => {
onSearch(); onSearch();
}); });
@ -179,6 +99,7 @@ onMounted(() => {
:data="adminUserStore.datalist" :data="adminUserStore.datalist"
:header-cell-style="{ background: 'var(--el-fill-color-light)', color: 'var(--el-text-color-primary)' }" :header-cell-style="{ background: 'var(--el-fill-color-light)', color: 'var(--el-text-color-primary)' }"
:loading="adminUserStore.loading" :loading="adminUserStore.loading"
:pagination="adminUserStore.pagination"
:size="size" :size="size"
adaptive adaptive
align-whole="center" align-whole="center"
@ -187,6 +108,8 @@ onMounted(() => {
row-key="id" row-key="id"
showOverflowTooltip showOverflowTooltip
table-layout="auto" table-layout="auto"
@page-size-change="onPageSizeChange"
@page-current-change="onCurrentPageChange"
> >
<!-- 显示头像 --> <!-- 显示头像 -->
<template #avatar="{ row }"> <template #avatar="{ row }">

View File

@ -1,15 +1,31 @@
import { addDialog } from '@/components/BaseDialog/index'; import { addDialog } from '@/components/BaseDialog/index';
import AdminUserDialog from '@/views/system/adminUser/admin-user-dialog.vue'; import AdminUserDialog from '@/views/system/adminUser/admin-user-dialog.vue';
import { useAdminUserStore } from '@/store/system/adminUser.ts'; import { useAdminUserStore } from '@/store/system/adminUser.ts';
import { h, ref } from 'vue'; import { h, reactive, ref } from 'vue';
import { messageBox } from '@/utils/message'; import { messageBox } from '@/utils/message';
import type { FormItemProps } from '@/views/system/adminUser/utils/types'; import type { FormItemProps } from '@/views/system/adminUser/utils/types';
import { $t } from '@/plugins/i18n'; import { $t } from '@/plugins/i18n';
import { isAddUserinfo } from '@/views/system/adminUser/utils/columns'; import { isAddUserinfo } from '@/views/system/adminUser/utils/columns';
import { useRoleStore } from '@/store/system/role';
import ResetPasswordDialog from '@/views/system/adminUser/reset-passwords.vue';
import { deviceDetection } from '@pureadmin/utils';
import CropperPreview from '@/components/CropperPreview';
import AssignUserToRole from '@/views/system/adminUser/assign-user-to-role.vue';
export const formRef = ref(); export const formRef = ref();
const cropRef = ref();
const assignRolesRef = ref();
const roleStore = useRoleStore();
// 上传头像信息
const avatarInfo = ref();
const adminUserStore = useAdminUserStore(); const adminUserStore = useAdminUserStore();
// 重置密码表单校验Ref
const ruleFormByRestPasswordRef = ref();
// 重置密码表单
const restPasswordForm = reactive({
userId: void 0,
password: '',
});
/** /**
* * * *
@ -139,3 +155,79 @@ export const updateUserStatus = async (row: any) => {
if (!result) return; if (!result) return;
await onSearch(); await onSearch();
}; };
/* 上传头像 */
export const onUploadAvatar = (row: any) => {
addDialog({
title: '裁剪、上传头像',
width: '40%',
closeOnClickModal: false,
fullscreen: deviceDetection(),
contentRenderer: () =>
h(CropperPreview, {
ref: cropRef,
imgSrc: row.avatar || userAvatar,
onCropper: info => (avatarInfo.value = info),
}),
beforeSure: async done => {
console.log('裁剪后的图片信息:', avatarInfo.value);
// 根据实际业务使用avatarInfo.value和row里的某些字段去调用上传头像接口即可
done();
await onSearch();
},
closeCallBack: () => cropRef.value.hidePopover(),
});
};
/**
* *
* @param row
*/
export const onResetPassword = (row: any) => {
addDialog({
title: `重置 ${row.username} 用户的密码`,
width: '30%',
draggable: true,
closeOnClickModal: false,
fullscreenIcon: true,
destroyOnClose: true,
contentRenderer: () => <ResetPasswordDialog ref={ruleFormByRestPasswordRef} form={restPasswordForm} />,
beforeSure: (done: any) => {
ruleFormByRestPasswordRef.value.ruleFormRef.validate(async (valid: any) => {
if (valid) {
// 更新用户密码
const data = { userId: row.id, password: restPasswordForm.password };
const result = await adminUserStore.updateAdminUserPasswordByManager(data);
// 更新成功关闭弹窗
if (!result) return;
done();
}
});
},
});
};
/**
*
* @param row
*/
export const onAssignRolesToUser = (row: any) => {
addDialog({
title: `${row.username} 分配角色`,
width: '30%',
draggable: true,
closeOnClickModal: false,
fullscreenIcon: true,
contentRenderer: () => <AssignUserToRole ref={assignRolesRef} userId={row.id} />,
beforeSure: async (done: any) => {
// 分配用户角色
const data = { userId: row.id, roleIds: assignRolesRef.value.assignRoles };
const result = await roleStore.assignRolesToUsers(data);
// 更新成功关闭弹窗
if (!result) return;
done();
},
});
};

View File

@ -17,6 +17,27 @@ const tableRef = ref();
const formRef = ref(); const formRef = ref();
const deptStore = useDeptStore(); const deptStore = useDeptStore();
/**
* * 当前页改变时
*/
const onCurrentPageChange = async (value: number) => {
deptStore.pagination.currentPage = value;
await onSearch();
};
/**
* * 当分页发生变化
* @param value
*/
const onPageSizeChange = async (value: number) => {
deptStore.pagination.pageSize = value;
await onSearch();
};
/**
* 重置表单
* @param formEl
*/
const resetForm = async formEl => { const resetForm = async formEl => {
if (!formEl) return; if (!formEl) return;
formEl.resetFields(); formEl.resetFields();
@ -62,6 +83,7 @@ onMounted(() => {
:data="deptStore.datalist" :data="deptStore.datalist"
:header-cell-style="{ background: 'var(--el-fill-color-light)', color: 'var(--el-text-color-primary)' }" :header-cell-style="{ background: 'var(--el-fill-color-light)', color: 'var(--el-text-color-primary)' }"
:loading="deptStore.loading" :loading="deptStore.loading"
:pagination="deptStore.pagination"
:size="size" :size="size"
adaptive adaptive
align-whole="center" align-whole="center"
@ -70,6 +92,8 @@ onMounted(() => {
row-key="id" row-key="id"
showOverflowTooltip showOverflowTooltip
table-layout="auto" table-layout="auto"
@page-size-change="onPageSizeChange"
@page-current-change="onCurrentPageChange"
> >
<template #createUser="{ row }"> <template #createUser="{ row }">
<el-button link type="primary" @click="selectUserinfo(row.createUser)">{{ $t('table.createUser') }} </el-button> <el-button link type="primary" @click="selectUserinfo(row.createUser)">{{ $t('table.createUser') }} </el-button>

View File

@ -17,6 +17,23 @@ const tableRef = ref();
const formRef = ref(); const formRef = ref();
const menuIconStore = useMenuIconStore(); const menuIconStore = useMenuIconStore();
/**
* * 当前页改变时
*/
const onCurrentPageChange = async (value: number) => {
menuIconStore.pagination.currentPage = value;
await onSearch();
};
/**
* * 当分页发生变化
* @param value
*/
const onPageSizeChange = async (value: number) => {
menuIconStore.pagination.pageSize = value;
await onSearch();
};
/** /**
* * 选择多行 * * 选择多行
* @param rows * @param rows
@ -72,6 +89,7 @@ onMounted(() => {
:data="menuIconStore.datalist" :data="menuIconStore.datalist"
:header-cell-style="{ background: 'var(--el-fill-color-light)', color: 'var(--el-text-color-primary)' }" :header-cell-style="{ background: 'var(--el-fill-color-light)', color: 'var(--el-text-color-primary)' }"
:loading="menuIconStore.loading" :loading="menuIconStore.loading"
:pagination="menuIconStore.pagination"
:size="size" :size="size"
adaptive adaptive
align-whole="center" align-whole="center"
@ -80,6 +98,8 @@ onMounted(() => {
row-key="id" row-key="id"
showOverflowTooltip showOverflowTooltip
table-layout="auto" table-layout="auto"
@page-size-change="onPageSizeChange"
@page-current-change="onCurrentPageChange"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
> >
<template #iconName="{ row }"> <template #iconName="{ row }">

View File

@ -25,10 +25,17 @@ defineExpose({ formRef });
<el-input v-model="form.iconName" autocomplete="off" type="text" /> <el-input v-model="form.iconName" autocomplete="off" type="text" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('menuIcon_preview')"> <el-form-item v-show="form.iconName" :label="$t('menuIcon_preview')">
<div class="flex justify-center"> <div class="flex justify-center">
<component :is="useRenderIcon(form.iconName)" class="flex justify-center" style="font-size: 30px" /> <component :is="useRenderIcon(form.iconName)" class="flex justify-center" style="font-size: 30px" />
</div> </div>
</el-form-item> </el-form-item>
<!-- icon 官网 -->
<el-form-item :label="$t('systemMenuIcon.officialWebsite')">
<el-link :title="$t('systemMenuIcon.officialWebsite')" :underline="false" href="https://icon-sets.iconify.design/" target="_blank" type="primary">
{{ $t('systemMenuIcon.officialWebsite') }}
</el-link>
</el-form-item>
</el-form> </el-form>
</template> </template>

View File

@ -17,6 +17,23 @@ const tableRef = ref();
const formRef = ref(); const formRef = ref();
const powerStore = usePowerStore(); const powerStore = usePowerStore();
/**
* * 当前页改变时
*/
const onCurrentPageChange = async (value: number) => {
powerStore.pagination.currentPage = value;
await onSearch();
};
/**
* * 当分页发生变化
* @param value
*/
const onPageSizeChange = async (value: number) => {
powerStore.pagination.pageSize = value;
await onSearch();
};
/** /**
* * 选择多行 * * 选择多行
* @param rows * @param rows
@ -82,6 +99,7 @@ onMounted(() => {
:data="powerStore.datalist" :data="powerStore.datalist"
:header-cell-style="{ background: 'var(--el-fill-color-light)', color: 'var(--el-text-color-primary)' }" :header-cell-style="{ background: 'var(--el-fill-color-light)', color: 'var(--el-text-color-primary)' }"
:loading="powerStore.loading" :loading="powerStore.loading"
:pagination="powerStore.pagination"
:size="size" :size="size"
adaptive adaptive
align-whole="center" align-whole="center"
@ -90,6 +108,8 @@ onMounted(() => {
row-key="id" row-key="id"
showOverflowTooltip showOverflowTooltip
table-layout="auto" table-layout="auto"
@page-size-change="onPageSizeChange"
@page-current-change="onCurrentPageChange"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
> >
<template #createUser="{ row }"> <template #createUser="{ row }">

View File

@ -17,6 +17,23 @@ const tableRef = ref();
const formRef = ref(); const formRef = ref();
const roleStore = useRoleStore(); const roleStore = useRoleStore();
/**
* * 当前页改变时
*/
const onCurrentPageChange = async (value: number) => {
roleStore.pagination.currentPage = value;
await onSearch();
};
/**
* * 当分页发生变化
* @param value
*/
const onPageSizeChange = async (value: number) => {
roleStore.pagination.pageSize = value;
await onSearch();
};
/** /**
* * 选择多行 * * 选择多行
* @param rows * @param rows
@ -73,6 +90,7 @@ onMounted(() => {
:data="roleStore.datalist" :data="roleStore.datalist"
:header-cell-style="{ background: 'var(--el-fill-color-light)', color: 'var(--el-text-color-primary)' }" :header-cell-style="{ background: 'var(--el-fill-color-light)', color: 'var(--el-text-color-primary)' }"
:loading="roleStore.loading" :loading="roleStore.loading"
:pagination="roleStore.pagination"
:size="size" :size="size"
adaptive adaptive
align-whole="center" align-whole="center"
@ -81,6 +99,8 @@ onMounted(() => {
row-key="id" row-key="id"
showOverflowTooltip showOverflowTooltip
table-layout="auto" table-layout="auto"
@page-size-change="onPageSizeChange"
@page-current-change="onCurrentPageChange"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
> >
<template #createUser="{ row }"> <template #createUser="{ row }">