添加分配角色功能.

This commit is contained in:
lijiahang
2023-08-16 17:06:08 +08:00
parent 5ca656409d
commit 2521c856e2
23 changed files with 443 additions and 40 deletions

View File

@@ -70,19 +70,19 @@ public class SystemUserController {
@Operation(summary = "修改用户角色") @Operation(summary = "修改用户角色")
@PreAuthorize("@ss.hasPermission('infra:system-user:update-role')") @PreAuthorize("@ss.hasPermission('infra:system-user:update-role')")
public Integer updateUserRole(@Validated @RequestBody SystemUserUpdateRoleRequest request) { public Integer updateUserRole(@Validated @RequestBody SystemUserUpdateRoleRequest request) {
if (Lists.isEmpty(request.getRoles())) { if (Lists.isEmpty(request.getRoleIdList())) {
// 删除用户角色 // 删除用户角色
return systemUserRoleService.deleteUserRoles(request); return systemUserRoleService.deleteUserRoles(request);
} else { } else {
// 更新用户 // 更新用户
return systemUserRoleService.updateUserRoles(request); return systemUserRoleService.updateUserRoles(request);
} }
} }
@PutMapping("/reset-password") @PutMapping("/reset-password")
@Operation(summary = "重置密码") @Operation(summary = "重置用户密码")
@PreAuthorize("@ss.hasPermission('infra:system-user:reset-password')") @PreAuthorize("@ss.hasPermission('infra:system-user:reset-password')")
public HttpWrapper<?> resetPassword(@Validated @RequestBody UserResetPasswordRequest request) { public HttpWrapper<?> resetUserPassword(@Validated @RequestBody UserResetPasswordRequest request) {
systemUserService.resetPassword(request); systemUserService.resetPassword(request);
return HttpWrapper.ok(); return HttpWrapper.ok();
} }
@@ -104,6 +104,14 @@ public class SystemUserController {
return systemUserService.getSystemUserList(); return systemUserService.getSystemUserList();
} }
@IgnoreLog(IgnoreLogMode.RET)
@GetMapping("/get-roles")
@Operation(summary = "查询用户的角色id")
@PreAuthorize("@ss.hasPermission('infra:system-user:query')")
public List<Long> getUserRoleIdList(@RequestParam("userId") Long userId) {
return systemUserRoleService.getUserRoleIdList(userId);
}
@IgnoreLog(IgnoreLogMode.RET) @IgnoreLog(IgnoreLogMode.RET)
@PostMapping("/query") @PostMapping("/query")
@Operation(summary = "分页查询用户") @Operation(summary = "分页查询用户")

View File

@@ -7,6 +7,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import java.io.Serializable; import java.io.Serializable;
@@ -26,6 +27,7 @@ public class SystemUserCreateRequest implements Serializable {
@NotBlank @NotBlank
@Size(max = 32) @Size(max = 32)
@Pattern(regexp = "^[a-zA-Z0-9]{4,32}$")
@Schema(description = "用户名") @Schema(description = "用户名")
private String username; private String username;

View File

@@ -8,7 +8,7 @@ import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.Set; import java.util.List;
/** /**
* 用户 更新角色请求对象 * 用户 更新角色请求对象
@@ -28,7 +28,7 @@ public class SystemUserUpdateRoleRequest implements Serializable {
@Schema(description = "id") @Schema(description = "id")
private Long id; private Long id;
@Schema(description = "角色编码") @Schema(description = "roleIdList")
private Set<String> roles; private List<Long> roleIdList;
} }

View File

@@ -31,9 +31,6 @@ public class SystemUserVO implements Serializable {
@Schema(description = "用户名") @Schema(description = "用户名")
private String username; private String username;
@Schema(description = "密码")
private String password;
@Schema(description = "花名") @Schema(description = "花名")
private String nickname; private String nickname;

View File

@@ -13,6 +13,14 @@ import java.util.List;
*/ */
public interface SystemUserRoleService { public interface SystemUserRoleService {
/**
* 查询用户 roleId
*
* @param userId userId
* @return roleId
*/
List<Long> getUserRoleIdList(Long userId);
/** /**
* 删除用户角色 * 删除用户角色
* *

View File

@@ -20,9 +20,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -45,6 +43,11 @@ public class SystemUserRoleServiceImpl implements SystemUserRoleService {
@Resource @Resource
private SystemUserRoleDAO systemUserRoleDAO; private SystemUserRoleDAO systemUserRoleDAO;
@Override
public List<Long> getUserRoleIdList(Long userId) {
return systemUserRoleDAO.selectRoleIdByUserId(userId);
}
@Override @Override
public Integer deleteUserRoles(SystemUserUpdateRoleRequest request) { public Integer deleteUserRoles(SystemUserUpdateRoleRequest request) {
Long userId = request.getId(); Long userId = request.getId();
@@ -61,20 +64,20 @@ public class SystemUserRoleServiceImpl implements SystemUserRoleService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Integer updateUserRoles(SystemUserUpdateRoleRequest request) { public Integer updateUserRoles(SystemUserUpdateRoleRequest request) {
Long userId = request.getId(); Long userId = request.getId();
Set<String> roleCodeList = request.getRoles(); List<Long> roleIdList = request.getRoleIdList();
// 查询用户 // 查询用户
SystemUserDO record = systemUserDAO.selectById(userId); SystemUserDO record = systemUserDAO.selectById(userId);
Valid.notNull(record, ErrorMessage.USER_ABSENT); Valid.notNull(record, ErrorMessage.USER_ABSENT);
// 查询角色 // 查询角色
List<SystemRoleDO> userRoles = systemRoleDAO.selectByCodeList(roleCodeList); List<SystemRoleDO> userRoles = systemRoleDAO.selectBatchIds(roleIdList);
// 检查角色是否存在 // 检查角色是否存在
if (userRoles.size() != roleCodeList.size()) { if (roleIdList.size() != userRoles.size()) {
// 有不存在的角色 // 有不存在的角色
List<String> userRoleCodes = userRoles.stream() List<Long> userRoleIdLists = userRoles.stream()
.map(SystemRoleDO::getCode) .map(SystemRoleDO::getId)
.collect(Collectors.toList()); .collect(Collectors.toList());
for (String roleCode : roleCodeList) { for (Long roleId : roleIdList) {
Valid.in(roleCode, userRoleCodes, ErrorMessage.ROLE_CODE_ABSENT, roleCode); Valid.in(roleId, userRoleIdLists, ErrorMessage.ROLE_CODE_ABSENT, roleId);
} }
} }
// 删除用户角色关联 // 删除用户角色关联
@@ -90,7 +93,10 @@ public class SystemUserRoleServiceImpl implements SystemUserRoleService {
effect += addUserRoles.size(); effect += addUserRoles.size();
// 更新缓存中的角色 // 更新缓存中的角色
RedisUtils.<LoginUser>processSetJson(UserCacheKeyDefine.USER_INFO, s -> { RedisUtils.<LoginUser>processSetJson(UserCacheKeyDefine.USER_INFO, s -> {
s.setRoles(new ArrayList<>(roleCodeList)); List<String> roleCodeList = userRoles.stream()
.map(SystemRoleDO::getCode)
.collect(Collectors.toList());
s.setRoles(roleCodeList);
}, userId); }, userId);
return effect; return effect;
} }

View File

@@ -144,8 +144,7 @@ public class SystemUserServiceImpl implements SystemUserService {
.like(SystemUserDO::getNickname, request.getNickname()) .like(SystemUserDO::getNickname, request.getNickname())
.like(SystemUserDO::getMobile, request.getMobile()) .like(SystemUserDO::getMobile, request.getMobile())
.like(SystemUserDO::getEmail, request.getEmail()) .like(SystemUserDO::getEmail, request.getEmail())
.eq(SystemUserDO::getStatus, request.getStatus()) .eq(SystemUserDO::getStatus, request.getStatus());
.orderByDesc(SystemUserDO::getId);
// 查询 // 查询
return systemUserDAO.of() return systemUserDAO.of()
.wrapper(wrapper) .wrapper(wrapper)

View File

@@ -20,7 +20,7 @@ export interface UserCreateRequest {
*/ */
export interface UserUpdateRequest extends UserCreateRequest { export interface UserUpdateRequest extends UserCreateRequest {
id: number; id: number;
roles?: Array<number>; roleIdList?: Array<number>;
password?: string; password?: string;
} }
@@ -106,6 +106,13 @@ export function getUserList() {
return axios.get<UserQueryResponse[]>('/infra/system-user/list'); return axios.get<UserQueryResponse[]>('/infra/system-user/list');
} }
/**
* 查询用户的 roleId
*/
export function getUserRoleIdList(userId: number) {
return axios.get<Array<number>>('/infra/system-user/get-roles', { params: { userId } });
}
/** /**
* 分页查询用户 * 分页查询用户
*/ */

View File

@@ -0,0 +1,60 @@
<template>
<a-select v-model:model-value="value"
:options="optionData()"
:allow-search="true"
:multiple="multiple"
:loading="loading"
:filter-option="filterOption"
placeholder="请选择角色" />
</template>
<script lang="ts">
export default {
name: 'user-role-selector'
};
</script>
<script lang="ts" setup>
import { computed } from 'vue';
import { useCacheStore } from '@/store';
import { SelectOptionData } from '@arco-design/web-vue';
import { RoleStatusEnum } from '@/views/user/role/types/enum.types';
const props = defineProps({
modelValue: Object,
loading: Boolean,
multiple: Boolean,
});
const emits = defineEmits(['update:modelValue']);
const value = computed({
get() {
return props.modelValue;
},
set(e) {
emits('update:modelValue', e);
}
});
// 选项数据
const cacheStore = useCacheStore();
const optionData = (): SelectOptionData[] => {
return cacheStore.roles.map(s => {
return {
label: `${s.name} (${s.code})`,
disabled: s.status === RoleStatusEnum.DISABLED.value,
value: s.id,
};
});
};
// 搜索
const filterOption = (searchValue: string, option: { label: string; }) => {
return option.label.toLowerCase().indexOf(searchValue.toLowerCase()) > -1;
};
</script>
<style scoped>
</style>

View File

@@ -110,7 +110,7 @@ const useAppStore = defineStore('app', {
// 未配置菜单 // 未配置菜单
if (this.serverMenu.length === 0) { if (this.serverMenu.length === 0) {
Notification.error({ Notification.error({
content: '该用户未配置菜单, 请先配置', content: '该用户未配置菜单, 请先联系管理员配置',
closable: true, closable: true,
}); });
} }

View File

@@ -1,10 +1,12 @@
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
import { CacheState } from './types'; import { CacheState } from './types';
import { MenuQueryResponse } from '@/api/system/menu'; import { MenuQueryResponse } from '@/api/system/menu';
import { RoleQueryResponse } from '@/api/user/role';
const useCacheStore = defineStore('cache', { const useCacheStore = defineStore('cache', {
state: (): CacheState => ({ state: (): CacheState => ({
menus: [] menus: [],
roles: [],
}), }),
getters: {}, getters: {},
@@ -13,16 +15,30 @@ const useCacheStore = defineStore('cache', {
/** /**
* 更新菜单 * 更新菜单
*/ */
updateMenu(menus: MenuQueryResponse[]) { updateMenus(menus: MenuQueryResponse[]) {
this.menus = menus; this.menus = menus;
}, },
/** /**
* 清空菜单 * 清空菜单
*/ */
resetMenu() { resetMenus() {
this.menus = []; this.menus = [];
}, },
/**
* 更新角色
*/
updateRoles(roles: RoleQueryResponse[]) {
this.roles = roles;
},
/**
* 清空角色
*/
resetRoles() {
this.roles = [];
},
}, },
}); });

View File

@@ -1,7 +1,9 @@
import { MenuQueryResponse } from '@/api/system/menu'; import { MenuQueryResponse } from '@/api/system/menu';
import { RoleQueryResponse } from '@/api/user/role';
export interface CacheState { export interface CacheState {
menus: MenuQueryResponse[], menus: MenuQueryResponse[],
roles: RoleQueryResponse[],
[key: string]: unknown; [key: string]: unknown;
} }

View File

@@ -2,7 +2,7 @@
<div class="content"> <div class="content">
<a-result class="result" status="403" subtitle="您没有访问该资源的权限" /> <a-result class="result" status="403" subtitle="您没有访问该资源的权限" />
<div class="operation-row"> <div class="operation-row">
<a-button class="mr8" key="back" type="primary" @click="to('login')">重新登录</a-button> <a-button class="mr8" key="back" type="primary" @click="logout">重新登录</a-button>
<a-button key="back" type="primary" @click="to('workplace')">返回工作台</a-button> <a-button key="back" type="primary" @click="to('workplace')">返回工作台</a-button>
</div> </div>
</div> </div>
@@ -10,11 +10,19 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { useUserStore } from '@/store';
const router = useRouter(); const router = useRouter();
const to = (name: string) => { const to = (name: string) => {
router.push({ name: name }); router.push({ name: name });
}; };
// 重新登录
const logout = () => {
const userStore = useUserStore();
userStore.logout();
to('login');
};
</script> </script>
<script lang="ts"> <script lang="ts">

View File

@@ -2,7 +2,7 @@
<div class="content"> <div class="content">
<a-result class="result" status="404" subtitle="糟糕! 页面不见了!" /> <a-result class="result" status="404" subtitle="糟糕! 页面不见了!" />
<div class="operation-row"> <div class="operation-row">
<a-button class="mr8" key="back" type="primary" @click="to('login')">重新登录</a-button> <a-button class="mr8" key="back" type="primary" @click="logout">重新登录</a-button>
<a-button key="back" type="primary" @click="to('workplace')">返回工作台</a-button> <a-button key="back" type="primary" @click="to('workplace')">返回工作台</a-button>
</div> </div>
</div> </div>
@@ -10,11 +10,19 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { useUserStore } from '@/store';
const router = useRouter(); const router = useRouter();
const to = (name: string) => { const to = (name: string) => {
router.push({ name: name }); router.push({ name: name });
}; };
// 重新登录
const logout = () => {
const userStore = useUserStore();
userStore.logout();
to('login');
};
</script> </script>
<script lang="ts"> <script lang="ts">

View File

@@ -260,7 +260,7 @@
setFetchLoading(true); setFetchLoading(true);
const { data } = await getMenuList(formModel); const { data } = await getMenuList(formModel);
tableRenderData.value = data as MenuQueryResponse[]; tableRenderData.value = data as MenuQueryResponse[];
cacheStore.updateMenu(tableRenderData.value); cacheStore.updateMenus(tableRenderData.value);
} finally { } finally {
setFetchLoading(false); setFetchLoading(false);
} }
@@ -303,7 +303,7 @@
// 卸载时清除 menu cache // 卸载时清除 menu cache
onUnmounted(() => { onUnmounted(() => {
cacheStore.resetMenu(); cacheStore.resetMenus();
}); });
</script> </script>

View File

@@ -74,7 +74,7 @@
if (!cacheStore.menus?.length) { if (!cacheStore.menus?.length) {
// 加载菜单 // 加载菜单
const { data: menuData } = await getMenuList({}); const { data: menuData } = await getMenuList({});
cacheStore.updateMenu(menuData); cacheStore.updateMenus(menuData);
} }
// 获取角色菜单 // 获取角色菜单
const { data: roleMenuIdList } = await getRoleMenuId(record.id); const { data: roleMenuIdList } = await getRoleMenuId(record.id);

View File

@@ -83,7 +83,7 @@
</a-button> </a-button>
</a-popconfirm> </a-popconfirm>
<!-- 绑定菜单 --> <!-- 绑定菜单 -->
<a-button v-permission="['infra:system-menu:bind']" <a-button v-permission="['infra:system-role:bind-menu']"
:disabled="record.code === 'admin'" :disabled="record.code === 'admin'"
type="text" type="text"
size="mini" size="mini"

View File

@@ -34,7 +34,7 @@
// 卸载时清除 menu cache // 卸载时清除 menu cache
onUnmounted(() => { onUnmounted(() => {
const cacheStore = useCacheStore(); const cacheStore = useCacheStore();
cacheStore.resetMenu(); cacheStore.resetMenus();
}); });
</script> </script>

View File

@@ -24,16 +24,16 @@
<a-form-item field="username" label="用户名"> <a-form-item field="username" label="用户名">
<a-input v-model="formModel.username" :disabled="!isAddHandle" placeholder="请输入用户名" /> <a-input v-model="formModel.username" :disabled="!isAddHandle" placeholder="请输入用户名" />
</a-form-item> </a-form-item>
<!-- 花名 -->
<a-form-item field="nickname" label="花名">
<a-input v-model="formModel.nickname" placeholder="请输入花名" />
</a-form-item>
<!-- 密码 --> <!-- 密码 -->
<a-form-item v-if="isAddHandle" <a-form-item v-if="isAddHandle"
field="password" field="password"
label="密码"> label="密码">
<a-input-password v-model="formModel.password" placeholder="请输入密码" /> <a-input-password v-model="formModel.password" placeholder="请输入密码" />
</a-form-item> </a-form-item>
<!-- 花名 -->
<a-form-item field="nickname" label="花名">
<a-input v-model="formModel.nickname" placeholder="请输入花名" />
</a-form-item>
<!-- 手机号 --> <!-- 手机号 -->
<a-form-item field="mobile" label="手机号"> <a-form-item field="mobile" label="手机号">
<a-input v-model="formModel.mobile" placeholder="请输入手机号" /> <a-input v-model="formModel.mobile" placeholder="请输入手机号" />

View File

@@ -0,0 +1,123 @@
<template>
<a-modal v-model:visible="visible"
body-class="modal-form"
title-align="start"
title="重置密码"
:top="120"
:align-center="false"
:draggable="true"
:mask-closable="false"
:unmount-on-close="true"
:ok-button-props="{ disabled: loading }"
:cancel-button-props="{ disabled: loading }"
:on-before-ok="handlerOk"
@close="handleClose">
<a-spin :loading="loading">
<a-form :model="formModel"
ref="formRef"
label-align="right"
:style="{ width: '460px' }"
:label-col-props="{ span: 6 }"
:wrapper-col-props="{ span: 18 }">
<!-- 用户名 -->
<a-form-item field="username" label="用户名">
<a-input v-model="formModel.username" :disabled="true" />
</a-form-item>
<!-- 花名 -->
<a-form-item field="nickname" label="花名">
<a-input v-model="formModel.nickname" :disabled="true" />
</a-form-item>
<!-- 密码 -->
<a-form-item field="password" label="新密码" :rules="password">
<a-input-password v-model="formModel.password" placeholder="请输入新密码" />
</a-form-item>
</a-form>
</a-spin>
</a-modal>
</template>
<script lang="ts">
export default {
name: 'user-user-reset-password-form-modal'
};
</script>
<script lang="ts" setup>
import { reactive, ref } from 'vue';
import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible';
import { password } from '../types/form.rules';
import { resetUserPassword } from '@/api/user/user';
import { Message } from '@arco-design/web-vue';
import { md5 } from '@/utils';
const { visible, setVisible } = useVisible();
const { loading, setLoading } = useLoading();
const defaultForm = () => {
return {
id: undefined,
username: undefined,
nickname: undefined,
password: undefined,
};
};
const formRef = ref<any>();
const formModel = reactive<Record<string, any>>(defaultForm());
// 打开
const open = (record: any) => {
renderForm({ ...defaultForm(), ...record });
setVisible(true);
};
// 渲染表单
const renderForm = (record: any) => {
Object.keys(formModel).forEach(k => {
formModel[k] = record[k];
});
};
defineExpose({ open });
// 确定
const handlerOk = async () => {
setLoading(true);
try {
// 验证参数
const error = await formRef.value.validate();
if (error) {
return false;
}
// 修改
await resetUserPassword({
id: formModel.id,
password: md5(formModel.password)
} as any);
Message.success('修改成功');
// 清空
handlerClear();
} catch (e) {
return false;
} finally {
setLoading(false);
}
};
// 关闭
const handleClose = () => {
handlerClear();
};
// 清空
const handlerClear = () => {
setLoading(false);
setVisible(false);
};
</script>
<style lang="less" scoped>
</style>

View File

@@ -107,6 +107,7 @@
<!-- 重置密码 --> <!-- 重置密码 -->
<a-button type="text" <a-button type="text"
size="mini" size="mini"
:disabled="record.id === userStore.id"
v-permission="['infra:system-user:reset-password']" v-permission="['infra:system-user:reset-password']"
@click="emits('openResetPassword', record)"> @click="emits('openResetPassword', record)">
重置密码 重置密码

View File

@@ -0,0 +1,141 @@
<template>
<a-modal v-model:visible="visible"
body-class="modal-form"
title-align="start"
title="分配角色"
:top="120"
:align-center="false"
:draggable="true"
:mask-closable="false"
:unmount-on-close="true"
:ok-button-props="{ disabled: saveLoading }"
:cancel-button-props="{ disabled: saveLoading }"
:on-before-ok="handlerOk"
@close="handleClose">
<a-spin :loading="saveLoading">
<a-form :model="formModel"
ref="formRef"
label-align="right"
:style="{ width: '460px' }"
:label-col-props="{ span: 6 }"
:wrapper-col-props="{ span: 18 }">
<!-- 用户名 -->
<a-form-item field="username" label="用户名">
<a-input v-model="formModel.username" :disabled="true" />
</a-form-item>
<!-- 花名 -->
<a-form-item field="nickname" label="花名">
<a-input v-model="formModel.nickname" :disabled="true" />
</a-form-item>
<!-- 角色 -->
<a-form-item field="roles" label="角色">
<user-role-selector v-model="formModel.roleIdList"
:loading="roleLoading"
:multiple="true" />
</a-form-item>
</a-form>
</a-spin>
</a-modal>
</template>
<script lang="ts">
export default {
name: 'user-user-update-roles-form-modal'
};
</script>
<script lang="ts" setup>
import { reactive, ref } from 'vue';
import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible';
import { Message } from '@arco-design/web-vue';
import UserRoleSelector from '@/components/user/role/user-role-selector.vue';
import { getRoleList } from '@/api/user/role';
import { useCacheStore } from '@/store';
import { getUserRoleIdList, updateUserRole } from '@/api/user/user';
const { visible, setVisible } = useVisible();
const { loading: saveLoading, setLoading: setSaveLoading } = useLoading();
const { loading: roleLoading, setLoading: setRoleLoading } = useLoading();
const defaultForm = () => {
return {
id: undefined,
username: undefined,
nickname: undefined,
roleIdList: undefined,
};
};
const formRef = ref<any>();
const formModel = reactive<Record<string, any>>(defaultForm());
const cacheStore = useCacheStore();
// 打开
const open = (record: any) => {
renderForm({ ...defaultForm(), ...record });
setVisible(true);
loadRoles();
};
// 渲染表单
const renderForm = (record: any) => {
Object.keys(formModel).forEach(k => {
formModel[k] = record[k];
});
};
// 加载角色
const loadRoles = async () => {
try {
setRoleLoading(true);
// 获取全部角色
if (!cacheStore.roles?.length) {
const { data } = await getRoleList();
cacheStore.updateRoles(data);
}
// 加载用户角色
const { data: roleIdList } = await getUserRoleIdList(formModel.id);
formModel.roleIdList = roleIdList;
} finally {
setRoleLoading(false);
}
};
defineExpose({ open });
// 确定
const handlerOk = async () => {
setSaveLoading(true);
try {
await updateUserRole({
id: formModel.id,
roleIdList: formModel.roleIdList
});
Message.success('修改成功');
// 清空
handlerClear();
} catch (e) {
return false;
} finally {
setSaveLoading(false);
}
};
// 关闭
const handleClose = () => {
handlerClear();
};
// 清空
const handlerClear = () => {
setSaveLoading(false);
setRoleLoading(false);
setVisible(false);
};
</script>
<style lang="less" scoped>
</style>

View File

@@ -3,11 +3,17 @@
<!-- 表格 --> <!-- 表格 -->
<user-table ref="table" <user-table ref="table"
@openAdd="() => modal.openAdd()" @openAdd="() => modal.openAdd()"
@openUpdate="(e) => modal.openUpdate(e)" /> @openUpdate="(e) => modal.openUpdate(e)"
@openResetPassword="(e) => resetModal.open(e)"
@openUpdateRole="(e) => updateRoleModal.open(e)" />
<!-- 添加修改模态框 --> <!-- 添加修改模态框 -->
<user-form-modal ref="modal" <user-form-modal ref="modal"
@added="() => table.addedCallback()" @added="() => table.addedCallback()"
@updated="() => table.updatedCallback()" /> @updated="() => table.updatedCallback()" />
<!-- 重置密码模态框 -->
<user-reset-password-form-modal ref="resetModal" />
<!-- 分配角色模态框 -->
<user-update-roles-form-modal ref="updateRoleModal" />
</div> </div>
</template> </template>
@@ -20,10 +26,21 @@
<script lang="ts" setup> <script lang="ts" setup>
import UserTable from './components/user-table.vue'; import UserTable from './components/user-table.vue';
import UserFormModal from './components/user-form-modal.vue'; import UserFormModal from './components/user-form-modal.vue';
import { ref } from 'vue'; import UserResetPasswordFormModal from './components/user-reset-password-form-modal.vue';
import UserUpdateRolesFormModal from './components/user-update-roles-form-modal.vue';
import { ref, onUnmounted } from 'vue';
import { useCacheStore } from '@/store';
const table = ref(); const table = ref();
const modal = ref(); const modal = ref();
const resetModal = ref();
const updateRoleModal = ref();
// 卸载时清除 role cache
onUnmounted(() => {
const cacheStore = useCacheStore();
cacheStore.resetRoles();
});
</script> </script>