|
|
@@ -1,43 +1,29 @@
|
|
|
<template>
|
|
|
- 222
|
|
|
<div>
|
|
|
<PageWrapper dense contentFullHeight contentClass="flex">
|
|
|
<OrganizationIdTree @select="handleSelect" ref="organizationIdTreeRef" />
|
|
|
- <BasicTable
|
|
|
- style="flex: auto"
|
|
|
- :clickToRowSelect="false"
|
|
|
- @register="registerTable"
|
|
|
- class="w-3/4 xl:w-4/5"
|
|
|
- >
|
|
|
+ <BasicTable style="flex: auto" :clickToRowSelect="false" @register="registerTable" class="w-3/4 xl:w-4/5">
|
|
|
<template #toolbar>
|
|
|
<Authority>
|
|
|
<a-button type="primary" @click="handleCreate">新增账号</a-button>
|
|
|
</Authority>
|
|
|
<Authority value="api:yt:user:delete">
|
|
|
- <Popconfirm
|
|
|
- title="您确定要批量删除数据"
|
|
|
- ok-text="确定"
|
|
|
- cancel-text="取消"
|
|
|
- @confirm="handleDeleteOrBatchDelete(null)"
|
|
|
- >
|
|
|
+ <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消" @confirm="handleDeleteOrBatchDelete(null)">
|
|
|
<a-button color="error" :disabled="hasBatchDelete"> 批量删除 </a-button>
|
|
|
</Popconfirm>
|
|
|
</Authority>
|
|
|
</template>
|
|
|
<template #status="{ record }">
|
|
|
- <Tag
|
|
|
- :color="
|
|
|
- record.userStatusEnum === 'NORMAL'
|
|
|
- ? 'green'
|
|
|
- : record.userStatusEnum === 'DISABLED'
|
|
|
- ? 'red'
|
|
|
- : 'orange'
|
|
|
- "
|
|
|
- >
|
|
|
+ <Tag :color="record.userStatusEnum === 'NORMAL'
|
|
|
+ ? 'green'
|
|
|
+ : record.userStatusEnum === 'DISABLED'
|
|
|
+ ? 'red'
|
|
|
+ : 'orange'
|
|
|
+ ">
|
|
|
{{
|
|
|
record.userStatusEnum === 'NORMAL'
|
|
|
- ? '正常'
|
|
|
- : record.userStatusEnum === 'DISABLED'
|
|
|
+ ? '正常'
|
|
|
+ : record.userStatusEnum === 'DISABLED'
|
|
|
? '已禁用'
|
|
|
: '已过期'
|
|
|
}}
|
|
|
@@ -49,211 +35,239 @@
|
|
|
</Tag>
|
|
|
</template>
|
|
|
<template #action="{ record }">
|
|
|
- <TableAction
|
|
|
- :actions="[
|
|
|
- {
|
|
|
- label: '进入',
|
|
|
- icon: 'ant-design:login-outlined',
|
|
|
- tooltip: '以客户用户身份登录',
|
|
|
- onClick: handleLoginCustomAdmin.bind(null, record),
|
|
|
- ifShow: !isAdmin(role),
|
|
|
- },
|
|
|
- {
|
|
|
- label: '用户详情',
|
|
|
- // auth: 'api:yt:user:get',
|
|
|
- icon: 'clarity:info-standard-line',
|
|
|
- tooltip: '用户详情',
|
|
|
- onClick: handleView.bind(null, record),
|
|
|
- ifShow: record.level != 0,
|
|
|
- },
|
|
|
- {
|
|
|
- label: '编辑',
|
|
|
- // auth: 'api:yt:user:update',
|
|
|
- icon: 'clarity:note-edit-line',
|
|
|
- tooltip: '编辑',
|
|
|
- onClick: handleEdit.bind(null, record),
|
|
|
- ifShow: record.level != 0,
|
|
|
+ <TableAction :actions="[
|
|
|
+ // {
|
|
|
+ // label: '进入',
|
|
|
+ // icon: 'ant-design:login-outlined',
|
|
|
+ // tooltip: '以客户用户身份登录',
|
|
|
+ // onClick: handleLoginCustomAdmin.bind(null, record),
|
|
|
+ // ifShow: !isAdmin(role),
|
|
|
+ // },
|
|
|
+ // {
|
|
|
+ // label: '用户详情',
|
|
|
+ // // auth: 'api:yt:user:get',
|
|
|
+ // icon: 'clarity:info-standard-line',
|
|
|
+ // tooltip: '用户详情',
|
|
|
+ // onClick: handleView.bind(null, record),
|
|
|
+ // ifShow: record.level != 0,
|
|
|
+ // },
|
|
|
+ {
|
|
|
+ label: '编辑',
|
|
|
+ // auth: 'api:yt:user:update',
|
|
|
+ icon: 'clarity:note-edit-line',
|
|
|
+ tooltip: '编辑',
|
|
|
+ onClick: handleEdit.bind(null, record),
|
|
|
+ ifShow: record.level != 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '权限设置',
|
|
|
+ icon: 'ant-design:key-outlined',
|
|
|
+ onClick: power.bind(null, record),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '删除',
|
|
|
+ // auth: 'api:yt:user:delete',
|
|
|
+ icon: 'ant-design:delete-outlined',
|
|
|
+ color: 'error',
|
|
|
+ tooltip: '删除',
|
|
|
+ ifShow: record.level != 0,
|
|
|
+ popConfirm: {
|
|
|
+ title: '是否确认删除',
|
|
|
+ confirm: handleDeleteOrBatchDelete.bind(null, record),
|
|
|
},
|
|
|
- ]"
|
|
|
- :drop-down-actions="[
|
|
|
- {
|
|
|
- label: '删除',
|
|
|
- // auth: 'api:yt:user:delete',
|
|
|
- icon: 'ant-design:delete-outlined',
|
|
|
- color: 'error',
|
|
|
- tooltip: '删除',
|
|
|
- ifShow: record.level != 0,
|
|
|
- popConfirm: {
|
|
|
- title: '是否确认删除',
|
|
|
- confirm: handleDeleteOrBatchDelete.bind(null, record),
|
|
|
- },
|
|
|
- },
|
|
|
- {
|
|
|
- label: '解锁',
|
|
|
- auth: 'api:yt:user:delete',
|
|
|
- icon: 'ant-design:key-outlined',
|
|
|
- color: 'error',
|
|
|
- tooltip: '解锁',
|
|
|
- ifShow: record.level != 0,
|
|
|
- popConfirm: {
|
|
|
- title: '是否确认解锁',
|
|
|
- confirm: unlock.bind(null, record),
|
|
|
- },
|
|
|
- },
|
|
|
- ]"
|
|
|
- />
|
|
|
+ },
|
|
|
+ ]" :drop-down-actions="[
|
|
|
+ // {
|
|
|
+ // label: '删除',
|
|
|
+ // // auth: 'api:yt:user:delete',
|
|
|
+ // icon: 'ant-design:delete-outlined',
|
|
|
+ // color: 'error',
|
|
|
+ // tooltip: '删除',
|
|
|
+ // ifShow: record.level != 0,
|
|
|
+ // popConfirm: {
|
|
|
+ // title: '是否确认删除',
|
|
|
+ // confirm: handleDeleteOrBatchDelete.bind(null, record),
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ // {
|
|
|
+ // label: '解锁',
|
|
|
+ // auth: 'api:yt:user:delete',
|
|
|
+ // icon: 'ant-design:key-outlined',
|
|
|
+ // color: 'error',
|
|
|
+ // tooltip: '解锁',
|
|
|
+ // ifShow: record.level != 0,
|
|
|
+ // popConfirm: {
|
|
|
+ // title: '是否确认解锁',
|
|
|
+ // confirm: unlock.bind(null, record),
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+]" />
|
|
|
</template>
|
|
|
</BasicTable>
|
|
|
<AccountModal @register="registerModal" @success="handleSuccess" />
|
|
|
</PageWrapper>
|
|
|
+ <PowerDrawer @register="registerDrawer" @success="handleSuccess"></PowerDrawer>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script lang="ts">
|
|
|
- import { defineComponent, reactive, nextTick, toRaw } from 'vue';
|
|
|
- import { BasicTable, useTable, TableAction } from '/@/components/Table';
|
|
|
- import { deleteUser, getAccountList, alterUnlock } from '/@/api/system/system';
|
|
|
- import { PageWrapper } from '/@/components/Page';
|
|
|
- import { useResetOrganizationTree, OrganizationIdTree } from '/@/views/common/organizationIdTree';
|
|
|
- import { Tag, Popconfirm } from 'ant-design-vue';
|
|
|
- import { useModal } from '/@/components/Modal';
|
|
|
- import AccountModal from './AccountModal.vue';
|
|
|
- import { columns, searchFormSchema } from './account.data';
|
|
|
- import { useGo } from '/@/hooks/web/usePage';
|
|
|
- import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
|
|
|
- import { Authority } from '/@/components/Authority';
|
|
|
- import { getMyInfo, getPermCode, getUserToken } from '/@/api/sys/user';
|
|
|
- import { useUserStore } from '/@/store/modules/user';
|
|
|
- import { usePermissionStore } from '/@/store/modules/permission';
|
|
|
- import { router } from '/@/router';
|
|
|
- import { RoleEnum } from '/@/enums/roleEnum';
|
|
|
- import { RouteRecordRaw } from 'vue-router';
|
|
|
- import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
|
|
|
- import { PageEnum } from '/@/enums/pageEnum';
|
|
|
- import { getAuthCache } from '/@/utils/auth';
|
|
|
- import { USER_INFO_KEY } from '/@/enums/cacheEnum';
|
|
|
- import { isAdmin } from '/@/enums/roleEnum';
|
|
|
+import { defineComponent, reactive, nextTick, toRaw } from 'vue';
|
|
|
+import { BasicTable, useTable, TableAction } from '/@/components/Table';
|
|
|
+import { deleteUser, getAccountList, alterUnlock } from '/@/api/system/system';
|
|
|
+import { PageWrapper } from '/@/components/Page';
|
|
|
+import { useResetOrganizationTree, OrganizationIdTree } from '/@/views/common/organizationIdTree';
|
|
|
+import { Tag, Popconfirm } from 'ant-design-vue';
|
|
|
+import { useModal } from '/@/components/Modal';
|
|
|
+import AccountModal from './AccountModal.vue';
|
|
|
+import { columns, searchFormSchema } from './account.data';
|
|
|
+import { useGo } from '/@/hooks/web/usePage';
|
|
|
+import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
|
|
|
+import { Authority } from '/@/components/Authority';
|
|
|
+import { getMyInfo, getPermCode, getUserToken } from '/@/api/sys/user';
|
|
|
+import { useUserStore } from '/@/store/modules/user';
|
|
|
+import { usePermissionStore } from '/@/store/modules/permission';
|
|
|
+import { router } from '/@/router';
|
|
|
+import { RoleEnum } from '/@/enums/roleEnum';
|
|
|
+import { RouteRecordRaw } from 'vue-router';
|
|
|
+import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
|
|
|
+import { PageEnum } from '/@/enums/pageEnum';
|
|
|
+import { getAuthCache } from '/@/utils/auth';
|
|
|
+import { USER_INFO_KEY } from '/@/enums/cacheEnum';
|
|
|
+import { isAdmin } from '/@/enums/roleEnum';
|
|
|
+import { useDrawer } from '/@/components/Drawer';
|
|
|
+import PowerDrawer from './PowerDrawer.vue';
|
|
|
|
|
|
- export default defineComponent({
|
|
|
- name: 'AccountManagement',
|
|
|
- components: {
|
|
|
- BasicTable,
|
|
|
- PageWrapper,
|
|
|
- OrganizationIdTree,
|
|
|
- AccountModal,
|
|
|
- TableAction,
|
|
|
- Tag,
|
|
|
- Authority,
|
|
|
- Popconfirm,
|
|
|
- },
|
|
|
- setup() {
|
|
|
- const userInfo: any = getAuthCache(USER_INFO_KEY);
|
|
|
- const role: string = userInfo?.roles[0];
|
|
|
|
|
|
- const go = useGo();
|
|
|
- const [registerModal, { openModal }] = useModal();
|
|
|
- let searchInfo = reactive<Recordable>({});
|
|
|
- const { organizationIdTreeRef, resetFn } = useResetOrganizationTree(searchInfo);
|
|
|
- const [registerTable, { reload, setProps }] = useTable({
|
|
|
- title: '账号列表',
|
|
|
- api: getAccountList,
|
|
|
- rowKey: 'id',
|
|
|
- columns,
|
|
|
- searchInfo,
|
|
|
- formConfig: {
|
|
|
- labelWidth: 120,
|
|
|
- schemas: searchFormSchema,
|
|
|
- // autoSubmitOnEnter: true,
|
|
|
- resetFunc: resetFn,
|
|
|
- },
|
|
|
- useSearchForm: true,
|
|
|
- showTableSetting: true,
|
|
|
- bordered: true,
|
|
|
- actionColumn: {
|
|
|
- width: 240,
|
|
|
- title: '操作',
|
|
|
- dataIndex: 'action',
|
|
|
- slots: { customRender: 'action' },
|
|
|
- fixed: 'right',
|
|
|
- },
|
|
|
- });
|
|
|
- const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete(
|
|
|
- deleteUser,
|
|
|
- handleSuccess,
|
|
|
- setProps
|
|
|
- );
|
|
|
- nextTick(() => {
|
|
|
- setProps(selectionOptions);
|
|
|
- });
|
|
|
+export default defineComponent({
|
|
|
+ name: 'AccountManagement',
|
|
|
+ components: {
|
|
|
+ BasicTable,
|
|
|
+ PageWrapper,
|
|
|
+ OrganizationIdTree,
|
|
|
+ AccountModal,
|
|
|
+ TableAction,
|
|
|
+ Tag,
|
|
|
+ Authority,
|
|
|
+ Popconfirm,
|
|
|
+ PowerDrawer,
|
|
|
+ },
|
|
|
+ setup() {
|
|
|
+ const userInfo: any = getAuthCache(USER_INFO_KEY);
|
|
|
+ const role: string = userInfo?.roles[0];
|
|
|
+ const [registerDrawer, { openDrawer }] = useDrawer();
|
|
|
+ const go = useGo();
|
|
|
+ const [registerModal, { openModal }] = useModal();
|
|
|
+ let searchInfo = reactive<Recordable>({});
|
|
|
+ const { organizationIdTreeRef, resetFn } = useResetOrganizationTree(searchInfo);
|
|
|
+ const [registerTable, { reload, setProps }] = useTable({
|
|
|
+ title: '账号列表',
|
|
|
+ api: getAccountList,
|
|
|
+ rowKey: 'id',
|
|
|
+ columns,
|
|
|
+ searchInfo,
|
|
|
+ formConfig: {
|
|
|
+ labelWidth: 120,
|
|
|
+ schemas: searchFormSchema,
|
|
|
+ // autoSubmitOnEnter: true,
|
|
|
+ resetFunc: resetFn,
|
|
|
+ },
|
|
|
+ useSearchForm: true,
|
|
|
+ showTableSetting: true,
|
|
|
+ bordered: true,
|
|
|
+ actionColumn: {
|
|
|
+ width: 240,
|
|
|
+ title: '操作',
|
|
|
+ dataIndex: 'action',
|
|
|
+ slots: { customRender: 'action' },
|
|
|
+ fixed: 'right',
|
|
|
+ },
|
|
|
+ });
|
|
|
+ const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete(
|
|
|
+ deleteUser,
|
|
|
+ handleSuccess,
|
|
|
+ setProps
|
|
|
+ );
|
|
|
+ nextTick(() => {
|
|
|
+ setProps(selectionOptions);
|
|
|
+ });
|
|
|
|
|
|
- function handleCreate() {
|
|
|
- openModal(true, {
|
|
|
- isUpdate: false,
|
|
|
- });
|
|
|
- }
|
|
|
+ function handleCreate() {
|
|
|
+ openModal(true, {
|
|
|
+ isUpdate: false,
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- function unlock(data) {
|
|
|
- alterUnlock(data.tbUser).then(() => {
|
|
|
- reload();
|
|
|
- });
|
|
|
- }
|
|
|
- function handleEdit(record: Recordable) {
|
|
|
- openModal(true, {
|
|
|
- record,
|
|
|
- isUpdate: true,
|
|
|
- });
|
|
|
- }
|
|
|
- function handleSuccess() {
|
|
|
+ function unlock(data) {
|
|
|
+ alterUnlock(data.tbUser).then(() => {
|
|
|
reload();
|
|
|
- }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ function handleEdit(record: Recordable) {
|
|
|
+ openModal(true, {
|
|
|
+ record,
|
|
|
+ isUpdate: true,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ function handleSuccess() {
|
|
|
+ reload();
|
|
|
+ }
|
|
|
|
|
|
- function handleSelect(organization) {
|
|
|
- searchInfo.organizationId = organization;
|
|
|
- reload();
|
|
|
- }
|
|
|
+ function handleSelect(organization) {
|
|
|
+ searchInfo.organizationId = organization;
|
|
|
+ reload();
|
|
|
+ }
|
|
|
|
|
|
- function handleView(record: Recordable) {
|
|
|
- go('/system/account_detail/' + record.id);
|
|
|
- }
|
|
|
- const userStore = useUserStore();
|
|
|
+ function handleView(record: Recordable) {
|
|
|
+ go('/system/account_detail/' + record.id);
|
|
|
+ }
|
|
|
+ const userStore = useUserStore();
|
|
|
|
|
|
- const permissionStore = usePermissionStore();
|
|
|
- async function handleLoginCustomAdmin(record: { tbUser: string; id: string }) {
|
|
|
- try {
|
|
|
- const { token, refreshToken } = await getUserToken(record.id);
|
|
|
- userStore.storeToken(token, refreshToken);
|
|
|
- const userInfo = await getMyInfo();
|
|
|
- const permissionList = await getPermCode();
|
|
|
- permissionStore.setPermCodeList(permissionList);
|
|
|
- userStore.setUserInfo(userInfo);
|
|
|
- userStore.setRoleList(userInfo.roles as RoleEnum[]);
|
|
|
- const routes = await permissionStore.buildRoutesAction();
|
|
|
- routes.forEach((route) => {
|
|
|
- router.addRoute(route as unknown as RouteRecordRaw);
|
|
|
- });
|
|
|
- router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
|
|
|
- permissionStore.setDynamicAddedRoute(true);
|
|
|
- go(PageEnum.BASE_HOME);
|
|
|
- } catch (error) {
|
|
|
- } finally {
|
|
|
- }
|
|
|
+ const permissionStore = usePermissionStore();
|
|
|
+ async function handleLoginCustomAdmin(record: { tbUser: string; id: string }) {
|
|
|
+ try {
|
|
|
+ const { token, refreshToken } = await getUserToken(record.id);
|
|
|
+ userStore.storeToken(token, refreshToken);
|
|
|
+ const userInfo = await getMyInfo();
|
|
|
+ const permissionList = await getPermCode();
|
|
|
+ permissionStore.setPermCodeList(permissionList);
|
|
|
+ userStore.setUserInfo(userInfo);
|
|
|
+ userStore.setRoleList(userInfo.roles as RoleEnum[]);
|
|
|
+ const routes = await permissionStore.buildRoutesAction();
|
|
|
+ routes.forEach((route) => {
|
|
|
+ router.addRoute(route as unknown as RouteRecordRaw);
|
|
|
+ });
|
|
|
+ router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
|
|
|
+ permissionStore.setDynamicAddedRoute(true);
|
|
|
+ go(PageEnum.BASE_HOME);
|
|
|
+ } catch (error) {
|
|
|
+ } finally {
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+ function power(record: Recordable) {
|
|
|
+ openDrawer(true, {
|
|
|
+ record,
|
|
|
+ isUpdate: true,
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- return {
|
|
|
- handleLoginCustomAdmin,
|
|
|
- registerTable,
|
|
|
- registerModal,
|
|
|
- handleCreate,
|
|
|
- handleEdit,
|
|
|
- handleSuccess,
|
|
|
- handleSelect,
|
|
|
- handleView,
|
|
|
- unlock,
|
|
|
- organizationIdTreeRef,
|
|
|
- hasBatchDelete,
|
|
|
- handleDeleteOrBatchDelete,
|
|
|
- isAdmin,
|
|
|
- role,
|
|
|
- };
|
|
|
- },
|
|
|
- });
|
|
|
+ return {
|
|
|
+ registerDrawer,
|
|
|
+ power,
|
|
|
+ handleLoginCustomAdmin,
|
|
|
+ registerTable,
|
|
|
+ registerModal,
|
|
|
+ handleCreate,
|
|
|
+ handleEdit,
|
|
|
+ handleSuccess,
|
|
|
+ handleSelect,
|
|
|
+ handleView,
|
|
|
+ unlock,
|
|
|
+ organizationIdTreeRef,
|
|
|
+ hasBatchDelete,
|
|
|
+ handleDeleteOrBatchDelete,
|
|
|
+ isAdmin,
|
|
|
+ role,
|
|
|
+ };
|
|
|
+ },
|
|
|
+});
|
|
|
</script>
|