查询用户角色.

This commit is contained in:
lijiahang
2024-04-26 16:01:06 +08:00
parent 1decd92bd9
commit 4fb4afdd53
11 changed files with 35 additions and 199 deletions

View File

@@ -40,4 +40,12 @@ public interface SystemRoleDAO extends IMapper<SystemRoleDO> {
*/
Long getRoleIdByUserIdAndRoleCode(@Param("userId") Long userId, @Param("code") String code);
/**
* 查询用户角色
*
* @param userId userId
* @return roles
*/
List<SystemRoleDO> selectRoleByUserId(@Param("userId") Long userId);
}

View File

@@ -8,6 +8,7 @@ import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 用户 视图响应对象
@@ -61,4 +62,7 @@ public class SystemUserVO implements Serializable {
@Schema(description = "修改人")
private String updater;
@Schema(description = "用户角色")
private List<SystemRoleVO> roles;
}

View File

@@ -1,5 +1,6 @@
import type { DataGrid, Pagination } from '@/types/global';
import type { TableData } from '@arco-design/web-vue/es/table/interface';
import type { RoleQueryResponse } from '@/api/user/role';
import axios from 'axios';
/**
@@ -55,6 +56,7 @@ export interface UserQueryResponse extends TableData {
updateTime: number;
creator: string;
updater: string;
roles: Array<RoleQueryResponse>;
}
/**

View File

@@ -6,7 +6,7 @@
<!-- <a-link target="_blank" href="https://github.com/lijiahangmax/orion-ops-pro">教程</a-link> -->
<a-link target="_blank" href="https://github.com/lijiahangmax/orion-ops-pro">github</a-link>
<a-link target="_blank" href="https://gitee.com/lijiahangmax/orion-ops-pro">gitee</a-link>
<a-link target="_blank" href="https://lijiahangmax.gitee.io/orion-ops-pro">文档</a-link>
<a-link target="_blank" href="https://lijiahangmax.github.io/orion-ops-pro">文档</a-link>
<a-link target="_blank" href="https://github.com/lijiahangmax/orion-ops-pro/blob/main/LICENSE">License</a-link>
<a-link target="_blank" :href="`https://github.com/lijiahangmax/orion-ops-pro/releases/tag/v${version}`">v{{ version }} 开源版</a-link>
</a-space>

View File

@@ -1,189 +0,0 @@
<!--<script lang="tsx">-->
<!-- import type { RouteMeta, RouteRecordRaw } from 'vue-router';-->
<!-- import { useRoute, useRouter } from 'vue-router';-->
<!-- import { compile, computed, defineComponent, h, ref } from 'vue';-->
<!-- import { useAppStore } from '@/store';-->
<!-- import { listenerRouteChange } from '@/utils/route-listener';-->
<!-- import { openWindow, regexUrl } from '@/utils';-->
<!-- import { openNewRoute } from '@/router';-->
<!-- import useMenuTree from './use-menu-tree';-->
<!-- export default defineComponent({-->
<!-- name: 'menuTree',-->
<!-- emit: ['collapse'],-->
<!-- setup() {-->
<!-- const appStore = useAppStore();-->
<!-- const router = useRouter();-->
<!-- const route = useRoute();-->
<!-- const { menuTree } = useMenuTree();-->
<!-- const collapsed = computed({-->
<!-- get() {-->
<!-- if (appStore.device === 'desktop') return appStore.menuCollapse;-->
<!-- return false;-->
<!-- },-->
<!-- set(value: boolean) {-->
<!-- appStore.updateSettings({ menuCollapse: value });-->
<!-- },-->
<!-- });-->
<!-- const topMenu = computed(() => appStore.topMenu);-->
<!-- const openKeys = ref<string[]>([]);-->
<!-- const selectedKey = ref<string[]>([]);-->
<!-- // 跳转路由-->
<!-- const goto = (e: any, item: RouteRecordRaw) => {-->
<!-- // 打开外链-->
<!-- if (regexUrl.test(item.path)) {-->
<!-- openWindow(item.path);-->
<!-- return;-->
<!-- }-->
<!-- const { hideInMenu, activeMenu, newWindow } = item.meta as RouteMeta;-->
<!-- // 新页面打开-->
<!-- if (newWindow || e.ctrlKey) {-->
<!-- openNewRoute({-->
<!-- name: item.name,-->
<!-- });-->
<!-- return;-->
<!-- }-->
<!-- // 设置 selectedKey-->
<!-- if (route.name === item.name && !hideInMenu && !activeMenu) {-->
<!-- selectedKey.value = [item.name as string];-->
<!-- return;-->
<!-- }-->
<!-- // 触发跳转-->
<!-- router.push({-->
<!-- name: item.name,-->
<!-- });-->
<!-- };-->
<!-- const findMenuOpenKeys = (target: string) => {-->
<!-- const result: string[] = [];-->
<!-- let isFind = false;-->
<!-- const backtrack = (item: RouteRecordRaw, keys: string[]) => {-->
<!-- if (item.name === target) {-->
<!-- isFind = true;-->
<!-- result.push(...keys);-->
<!-- return;-->
<!-- }-->
<!-- if (item.children?.length) {-->
<!-- item.children.forEach((el) => {-->
<!-- backtrack(el, [...keys, el.name as string]);-->
<!-- });-->
<!-- }-->
<!-- };-->
<!-- menuTree.value.forEach((el: RouteRecordRaw) => {-->
<!-- if (isFind) return;-->
<!-- backtrack(el, [el.name as string]);-->
<!-- });-->
<!-- return result;-->
<!-- };-->
<!-- // 监听路由 设置打开的 key-->
<!-- listenerRouteChange((newRoute) => {-->
<!-- const { activeMenu, hideInMenu } = newRoute.meta;-->
<!-- if (!hideInMenu || activeMenu) {-->
<!-- const menuOpenKeys = findMenuOpenKeys(-->
<!-- (activeMenu || newRoute.name) as string-->
<!-- );-->
<!-- const keySet = new Set([...menuOpenKeys, ...openKeys.value]);-->
<!-- openKeys.value = [...keySet];-->
<!-- selectedKey.value = [-->
<!-- activeMenu || menuOpenKeys[menuOpenKeys.length - 1],-->
<!-- ];-->
<!-- }-->
<!-- }, true);-->
<!-- // 展开菜单-->
<!-- const setCollapse = (val: boolean) => {-->
<!-- if (appStore.device === 'desktop')-->
<!-- appStore.updateSettings({ menuCollapse: val });-->
<!-- };-->
<!-- // 渲染菜单-->
<!-- const renderSubMenu = () => {-->
<!-- function travel(_route: RouteRecordRaw[], nodes = []) {-->
<!-- if (_route) {-->
<!-- _route.forEach((element) => {-->
<!-- // This is demo, modify nodes as needed-->
<!-- const icon = element?.meta?.icon-->
<!-- ? () => h(compile(`<${element?.meta?.icon}/>`))-->
<!-- : null;-->
<!-- const node =-->
<!-- element?.children && element?.children.length !== 0 ? (-->
<!-- <a-sub-menu-->
<!-- key={element?.name}-->
<!-- v-slots={{-->
<!-- icon,-->
<!-- // 去除国际化 title: () => h(compile(t(element?.meta?.locale || ''))),-->
<!-- title: () => h(compile(element?.meta?.locale || '')),-->
<!-- }}-->
<!-- >-->
<!-- {travel(element?.children)}-->
<!-- </a-sub-menu>-->
<!-- ) : (-->
<!-- <a-menu-item-->
<!-- key={element?.name}-->
<!-- v-slots={{ icon }}-->
<!-- onClick={($event: any) => goto($event, element)}-->
<!-- >-->
<!-- {element?.meta?.locale || ''}-->
<!-- </a-menu-item>-->
<!-- );-->
<!-- nodes.push(node as never);-->
<!-- });-->
<!-- }-->
<!-- return nodes;-->
<!-- }-->
<!-- return travel(menuTree.value);-->
<!-- };-->
<!-- return () => (-->
<!-- <a-menu-->
<!-- mode={topMenu.value ? 'horizontal' : 'vertical'}-->
<!-- v-model:collapsed={collapsed.value}-->
<!-- v-model:open-keys={openKeys.value}-->
<!-- show-collapse-button={appStore.device !== 'mobile'}-->
<!-- auto-open={false}-->
<!-- selected-keys={selectedKey.value}-->
<!-- auto-open-selected={true}-->
<!-- level-indent={34}-->
<!-- style="height: 100%; width:100%;"-->
<!-- onCollapse={setCollapse}-->
<!-- >-->
<!-- {renderSubMenu()}-->
<!-- </a-menu>-->
<!-- );-->
<!-- },-->
<!-- });-->
<!--</script>-->
<!--<style lang="less" scoped>-->
<!-- :deep(.arco-menu-inner) {-->
<!-- .arco-menu-inline-header {-->
<!-- display: flex;-->
<!-- align-items: center;-->
<!-- }-->
<!-- .arco-icon {-->
<!-- &:not(.arco-icon-down) {-->
<!-- font-size: 18px;-->
<!-- }-->
<!-- }-->
<!-- .arco-menu-icon {-->
<!-- margin-right: 10px !important;-->
<!-- }-->
<!-- .arco-menu-indent-list {-->
<!-- width: 28px;-->
<!-- display: inline-block;-->
<!-- }-->
<!-- .arco-menu-title {-->
<!-- user-select: none;-->
<!-- }-->
<!-- }-->
<!--</style>-->

View File

@@ -1,8 +1,8 @@
<template>
<a-card class="general-card"
title="帮助文档"
:header-style="{ paddingBottom: '0' }"
:body-style="{ padding: '8px 20px 8px 20px' }">
:header-style="{ paddingBottom: '4px' }"
:body-style="{ padding: '0px 20px 8px 20px' }">
<a-row>
<a-col :span="12">
<a-link target="_blank" href="https://github.com/lijiahangmax/orion-ops-pro">github</a-link>
@@ -14,7 +14,13 @@
<a-link target="_blank" href="https://github.com/lijiahangmax/orion-ops-pro/blob/main/LICENSE">License</a-link>
</a-col>
<a-col :span="12">
<a-link target="_blank" href="https://lijiahangmax.gitee.io/orion-ops-pro">操作文档</a-link>
<a-link target="_blank" href="https://github.com/lijiahangmax/orion-ops-pro/issues">上报 bug</a-link>
</a-col>
<a-col :span="12">
<a-link target="_blank" href="https://lijiahangmax.github.io/orion-ops-pro">操作文档</a-link>
</a-col>
<a-col :span="12">
<a-link target="_blank" href="https://lijiahangmax.github.io/orion-ops-pro/#/about/change-log">更新文档</a-link>
</a-col>
</a-row>
</a-card>

View File

@@ -1,8 +1,7 @@
<template>
<a-card class="general-card"
title="快捷操作"
:header-style="{ paddingBottom: '0' }"
:body-style="{ padding: '20px 20px 0 20px' }">
:body-style="{ padding: '0 20px' }">
<a-row :gutter="8">
<a-col v-for="link in links"
:key="link.meta.locale as string"

View File

@@ -12,8 +12,7 @@
<!-- 操作日志 -->
<a-card class="general-card"
title="操作日志"
:header-style="{ paddingBottom: '0' }"
:body-style="{ padding: '8px 20px 8px 20px' }">
:body-style="{ padding: '0 20px 8px 20px' }">
<operator-log-simple-table :current="true"
:handle-column="false" />
</a-card>

View File

@@ -1,5 +1,5 @@
<template>
<a-spin :loading="loading" style="width: 400px;">
<a-spin :loading="loading" style="width: 520px;">
<!-- 头像 -->
<div class="avatar-container">
<div class="avatar-wrapper">
@@ -33,6 +33,10 @@
<a-form-item field="email" label="邮箱">
<a-input v-model="formModel.email" placeholder="请输入邮箱" />
</a-form-item>
<!-- 角色 -->
<a-form-item field="roles" label="角色" disabled>
<a-input-tag v-model="roles" placeholder="角色" />
</a-form-item>
</a-form>
<!-- 操作 -->
<div class="handler-container">
@@ -68,6 +72,7 @@
const nickname = ref('');
const formRef = ref();
const formModel = ref<UserUpdateRequest>({});
const roles = ref<Array<string>>([]);
// 修改用户信息
const save = async () => {
@@ -103,6 +108,7 @@
u = data;
}
formModel.value = pick(u, 'id', 'username', 'nickname', 'mobile', 'email');
roles.value = (u.roles || []).map(s => `${s.name}(${s.code})`);
nickname.value = u.nickname?.substring(0, 1);
} catch (e) {
} finally {

View File

@@ -13,6 +13,8 @@ const columns = [
title: '角色名称',
dataIndex: 'name',
slotName: 'name',
ellipsis: true,
tooltip: true,
}, {
title: '角色编码',
dataIndex: 'code',

View File

@@ -127,7 +127,6 @@
<!-- 分配角色 -->
<a-button type="text"
size="mini"
:disabled="record.id === userStore.id"
v-permission="['infra:system-user:grant-role']"
@click="emits('openGrantRole', record)">
分配角色