Skip to content

Commit 79c8ee5

Browse files
committed
refactor: role add user count
1 parent 466175f commit 79c8ee5

File tree

5 files changed

+88
-60
lines changed

5 files changed

+88
-60
lines changed

ui/src/api/type/role.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ interface RoleItem {
66
type: RoleTypeEnum,
77
create_user: string,
88
internal: boolean,
9+
user_count?: number,
910
}
1011

1112
interface ChildrenPermissionItem {
@@ -65,4 +66,4 @@ interface FormItemModel {
6566
}
6667
}
6768

68-
export type { RoleItem, FormItemModel, RolePermissionItem, RoleTableDataItem, CreateOrUpdateParams, ChildrenPermissionItem, RoleMemberItem, CreateMemberParamsItem }
69+
export type { RoleItem, FormItemModel, RolePermissionItem, RoleTableDataItem, CreateOrUpdateParams, ChildrenPermissionItem, RoleMemberItem, CreateMemberParamsItem }

ui/src/api/type/workspace.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
interface WorkspaceItem {
22
name: string,
3-
id?: string
3+
id?: string,
4+
user_count?: number,
45
}
56

67
interface CreateWorkspaceMemberParamsItem {
@@ -16,4 +17,4 @@ interface WorkspaceMemberItem {
1617
role_id: string,
1718
role_name: string,
1819
}
19-
export type { WorkspaceItem, CreateWorkspaceMemberParamsItem, WorkspaceMemberItem }
20+
export type { WorkspaceItem, CreateWorkspaceMemberParamsItem, WorkspaceMemberItem }

ui/src/views/role/component/Member.vue

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,44 @@
66
</el-button>
77
<div class="flex complex-search">
88
<el-select class="complex-search__left" v-model="searchType" style="width: 120px">
9-
<el-option :label="$t('views.login.loginForm.username.label')" value="username" />
9+
<el-option :label="$t('views.login.loginForm.username.label')" value="username"/>
1010
</el-select>
1111
<el-input v-if="searchType === 'username'" v-model="searchForm.username" @change="getList"
12-
:placeholder="$t('common.inputPlaceholder')" style="width: 220px" clearable />
12+
:placeholder="$t('common.inputPlaceholder')" style="width: 220px" clearable/>
1313
</div>
1414
</div>
15-
<app-table class="mt-16" :data="tableData" :pagination-config="paginationConfig" @sizeChange="handleSizeChange"
16-
@changePage="getList" v-loading="loading">
17-
<el-table-column prop="nick_name" :label="$t('views.userManage.form.nick_name.label')" />
18-
<el-table-column prop="username" :label="$t('views.userManage.form.username.label')" />
19-
<el-table-column prop="workspace_name" :label="$t('views.role.member.workspace')" />
15+
<app-table class="mt-16" :data="tableData" :pagination-config="paginationConfig"
16+
@sizeChange="handleSizeChange"
17+
@changePage="getList" v-loading="loading">
18+
<el-table-column prop="nick_name" :label="$t('views.userManage.form.nick_name.label')"/>
19+
<el-table-column prop="username" :label="$t('views.userManage.form.username.label')"/>
20+
<el-table-column prop="workspace_name" :label="$t('views.role.member.workspace')"
21+
v-if="currentRole?.type !==RoleTypeEnum.ADMIN"/>
2022
<el-table-column :label="$t('common.operation')" width="100" fixed="right">
2123
<template #default="{ row }">
22-
<el-tooltip effect="dark" :content="`${$t('views.role.member.delete.button')}`" placement="top">
24+
<el-tooltip effect="dark" :content="`${$t('views.role.member.delete.button')}`"
25+
placement="top">
2326
<el-button type="primary" text @click.stop="handleDelete(row)">
2427
<el-icon>
25-
<EditPen />
28+
<Delete/>
2629
</el-icon>
2730
</el-button>
2831
</el-tooltip>
2932
</template>
3033
</el-table-column>
3134
</app-table>
3235
</div>
33-
<AddMemberDrawer ref="addMemberDrawerRef" :currentRole="props.currentRole" @refresh="getList" />
36+
<AddMemberDrawer ref="addMemberDrawerRef" :currentRole="props.currentRole" @refresh="getList"/>
3437
</template>
3538

3639
<script setup lang="ts">
37-
import { onMounted, ref, reactive, watch } from 'vue'
40+
import {onMounted, ref, reactive, watch} from 'vue'
3841
import RoleApi from '@/api/system/role'
39-
import type { RoleItem, RoleMemberItem } from '@/api/type/role'
40-
import { MsgSuccess, MsgConfirm } from '@/utils/message'
41-
import { t } from '@/locales'
42+
import type {RoleItem, RoleMemberItem} from '@/api/type/role'
43+
import {MsgSuccess, MsgConfirm} from '@/utils/message'
44+
import {t} from '@/locales'
4245
import AddMemberDrawer from './AddMemberDrawer.vue'
46+
import {RoleTypeEnum} from "@/enums/system.ts";
4347
4448
const props = defineProps<{
4549
currentRole?: RoleItem
@@ -86,6 +90,7 @@ watch(() => props.currentRole?.id, () => {
8690
})
8791
8892
const addMemberDrawerRef = ref<InstanceType<typeof AddMemberDrawer>>()
93+
8994
function handleAdd() {
9095
addMemberDrawerRef.value?.open();
9196
}
@@ -105,6 +110,7 @@ function handleDelete(row: RoleMemberItem) {
105110
getList()
106111
})
107112
})
108-
.catch(() => { })
113+
.catch(() => {
114+
})
109115
}
110-
</script>
116+
</script>

ui/src/views/role/index.vue

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,23 @@
55
<div class="flex h-full">
66
<div class="role-left border-r p-16">
77
<div class="p-8 pb-0">
8-
<el-input v-model="filterText" :placeholder="$t('common.search')" prefix-icon="Search" clearable />
8+
<el-input v-model="filterText" :placeholder="$t('common.search')" prefix-icon="Search"
9+
clearable/>
910
</div>
1011
<div class="list-height-left mt-8">
1112
<el-scrollbar v-loading="loading">
1213
<div class="role-left_title color-secondary lighter">
1314
<span>{{ $t('views.role.internalRole') }}</span>
1415
</div>
15-
<common-list :data="filterInternalRole" @click="clickRole" :default-active="currentRole?.id">
16+
<common-list :data="filterInternalRole" @click="clickRole"
17+
:default-active="currentRole?.id">
1618
<template #default="{ row }">
1719
<div class="flex-between">
1820
<span class="mr-8">{{ row.role_name }}</span>
1921
<el-dropdown :teleported="false">
2022
<el-button text>
2123
<el-icon class="color-secondary">
22-
<MoreFilled />
24+
<MoreFilled/>
2325
</el-icon>
2426
</el-button>
2527
<template #dropdown>
@@ -42,28 +44,32 @@
4244
</template>
4345
</common-list>
4446
<div class="role-left_divider">
45-
<el-divider />
47+
<el-divider/>
4648
</div>
4749
<div class="role-left_title">
4850
<span class="color-secondary lighter">{{ $t('views.role.customRole') }}</span>
49-
<el-tooltip effect="dark" :content="`${$t('common.create')}${$t('views.role.customRole')}`"
50-
placement="top">
51+
<el-tooltip effect="dark"
52+
:content="`${$t('common.create')}${$t('views.role.customRole')}`"
53+
placement="top">
5154
<el-button type="primary" text @click="createOrUpdateRole()">
5255
<AppIcon iconName="app-copy"></AppIcon>
5356
</el-button>
5457
</el-tooltip>
5558
</div>
56-
<common-list :data="filterCustomRole" @click="clickRole" :default-active="currentRole?.id">
59+
<common-list :data="filterCustomRole" @click="clickRole"
60+
:default-active="currentRole?.id">
5761
<template #default="{ row }">
5862
<div class="flex-between">
5963
<span>
6064
{{ row.role_name }}
61-
<span class="color-input-placeholder ml-4">({{ roleTypeMap[row.type as RoleTypeEnum] }})</span>
65+
<span class="color-input-placeholder ml-4">({{
66+
roleTypeMap[row.type as RoleTypeEnum]
67+
}})</span>
6268
</span>
6369
<el-dropdown :teleported="false">
6470
<el-button text>
6571
<el-icon class="color-secondary">
66-
<MoreFilled />
72+
<MoreFilled/>
6773
</el-icon>
6874
</el-button>
6975
<template #dropdown>
@@ -95,42 +101,46 @@
95101
<div class="flex align-center">
96102
<span>
97103
{{ currentRole?.role_name }}
98-
<span v-if="currentRole?.type && !currentRole.internal" class="color-input-placeholder ml-4">({{
99-
roleTypeMap[currentRole?.type as
100-
RoleTypeEnum] }})
104+
<span v-if="currentRole?.type && !currentRole.internal"
105+
class="color-input-placeholder ml-4">({{
106+
roleTypeMap[currentRole?.type as
107+
RoleTypeEnum]
108+
}})
101109
</span>
102110
</span>
103-
<el-divider direction="vertical" class="mr-8 ml-8" />
104-
<AppIcon iconName="app-wordspace" style="font-size: 16px" class="color-input-placeholder"></AppIcon>
111+
<el-divider direction="vertical" class="mr-8 ml-8"/>
112+
<AppIcon iconName="app-wordspace" style="font-size: 16px"
113+
class="color-input-placeholder"></AppIcon>
105114
<span class="color-input-placeholder ml-4">
106-
数字
115+
{{ currentRole?.user_count }}
107116
</span>
108117
</div>
109118
<el-radio-group v-model="currentTab">
110-
<el-radio-button v-for="item in tabList" :key="item.value" :label="item.label" :value="item.value" />
119+
<el-radio-button v-for="item in tabList" :key="item.value" :label="item.label"
120+
:value="item.value"/>
111121
</el-radio-group>
112122
</div>
113-
<PermissionConfiguration v-if="currentTab === 'permission'" :currentRole="currentRole" />
114-
<Member v-else :currentRole="currentRole" />
123+
<PermissionConfiguration v-if="currentTab === 'permission'" :currentRole="currentRole"/>
124+
<Member v-else :currentRole="currentRole"/>
115125
</div>
116126
</div>
117127
</el-card>
118128

119-
<CreateOrUpdateRoleDialog ref="createOrUpdateRoleDialogRef" @refresh="refresh" />
129+
<CreateOrUpdateRoleDialog ref="createOrUpdateRoleDialogRef" @refresh="refresh"/>
120130
</div>
121131
</template>
122132

123133
<script lang="ts" setup>
124-
import { onMounted, ref, watch } from 'vue'
134+
import {onMounted, ref, watch} from 'vue'
125135
import RoleApi from '@/api/system/role'
126-
import { t } from '@/locales'
136+
import {t} from '@/locales'
127137
import PermissionConfiguration from './component/PermissionConfiguration.vue'
128138
import Member from './component/Member.vue'
129139
import CreateOrUpdateRoleDialog from './component/CreateOrUpdateRoleDialog.vue'
130-
import type { RoleItem } from '@/api/type/role'
131-
import { RoleTypeEnum } from '@/enums/system'
132-
import { roleTypeMap } from './index'
133-
import { MsgSuccess, MsgConfirm } from '@/utils/message'
140+
import type {RoleItem} from '@/api/type/role'
141+
import {RoleTypeEnum} from '@/enums/system'
142+
import {roleTypeMap} from './index'
143+
import {MsgSuccess, MsgConfirm} from '@/utils/message'
134144
135145
const filterText = ref('')
136146
const loading = ref(false)
@@ -182,6 +192,7 @@ function clickRole(item: RoleItem) {
182192
}
183193
184194
const createOrUpdateRoleDialogRef = ref<InstanceType<typeof CreateOrUpdateRoleDialog>>()
195+
185196
function createOrUpdateRole(item?: RoleItem) {
186197
createOrUpdateRoleDialogRef.value?.open(item);
187198
}
@@ -202,7 +213,8 @@ function deleteRole(item: RoleItem) {
202213
currentRole.value = item.id === currentRole.value?.id ? internalRoleList.value[0] : currentRole.value
203214
})
204215
})
205-
.catch(() => { })
216+
.catch(() => {
217+
})
206218
}
207219
208220

ui/src/views/workspace/index.vue

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,38 @@
66
<div class="workspace-left border-r p-16">
77
<div class="workspace-left_title">
88
<h4 class="medium">{{ $t('views.workspace.list') }}</h4>
9-
<el-tooltip effect="dark" :content="`${$t('common.create')}${$t('views.workspace.title')}`" placement="top">
9+
<el-tooltip effect="dark"
10+
:content="`${$t('common.create')}${$t('views.workspace.title')}`"
11+
placement="top">
1012
<el-button type="primary" text @click="createOrUpdateWorkspace()">
1113
<AppIcon iconName="app-copy"></AppIcon>
1214
</el-button>
1315
</el-tooltip>
1416
</div>
1517
<div class="p-8">
16-
<el-input v-model="filterText" :placeholder="$t('common.search')" prefix-icon="Search" clearable />
18+
<el-input v-model="filterText" :placeholder="$t('common.search')" prefix-icon="Search"
19+
clearable/>
1720
</div>
1821
<div class="list-height-left">
1922
<el-scrollbar v-loading="loading">
20-
<common-list :data="filterList" @click="clickWorkspace" :default-active="currentWorkspace?.id">
23+
<common-list :data="filterList" @click="clickWorkspace"
24+
:default-active="currentWorkspace?.id">
2125
<template #default="{ row }">
2226
<div class="flex-between">
2327
<span>{{ row.name }}</span>
2428
<el-dropdown :teleported="false">
2529
<el-button text>
2630
<el-icon class="color-secondary">
27-
<MoreFilled />
31+
<MoreFilled/>
2832
</el-icon>
2933
</el-button>
3034
<template #dropdown>
3135
<el-dropdown-menu style="min-width: 80px">
3236
<el-dropdown-item @click.stop="createOrUpdateWorkspace(row)" class="p-8">
3337
<AppIcon iconName="app-copy"></AppIcon>
3438
{{
35-
$t('common.rename') }}
39+
$t('common.rename')
40+
}}
3641
</el-dropdown-item>
3742
<el-dropdown-item @click.stop="deleteWorkspace(row)" class="border-t p-8">
3843
<AppIcon iconName="app-copy"></AppIcon>
@@ -57,29 +62,30 @@
5762
<div class="workspace-right" v-loading="loading">
5863
<div class="flex align-center" style="margin-bottom: 20px;">
5964
<h4 class="medium">{{ currentWorkspace?.name }}</h4>
60-
<el-divider direction="vertical" class="mr-8 ml-8" />
61-
<AppIcon iconName="app-wordspace" style="font-size: 16px" class="color-input-placeholder"></AppIcon>
65+
<el-divider direction="vertical" class="mr-8 ml-8"/>
66+
<AppIcon iconName="app-wordspace" style="font-size: 16px"
67+
class="color-input-placeholder"></AppIcon>
6268
<span class="color-input-placeholder ml-4">
63-
数字
69+
{{ currentWorkspace?.user_count }}
6470
</span>
6571
</div>
66-
<Member :currentWorkspace="currentWorkspace" />
72+
<Member :currentWorkspace="currentWorkspace"/>
6773
</div>
6874
</div>
6975
</el-card>
7076

71-
<CreateOrUpdateWorkspaceDialog ref="createOrUpdateWorkspaceDialogRef" @refresh="refresh" />
77+
<CreateOrUpdateWorkspaceDialog ref="createOrUpdateWorkspaceDialogRef" @refresh="refresh"/>
7278
</div>
7379
</template>
7480

7581
<script lang="ts" setup>
76-
import { onMounted, ref, watch } from 'vue'
82+
import {onMounted, ref, watch} from 'vue'
7783
import WorkspaceApi from '@/api/workspace'
78-
import { t } from '@/locales'
84+
import {t} from '@/locales'
7985
import Member from './component/Member.vue'
8086
import CreateOrUpdateWorkspaceDialog from './component/CreateOrUpdateWorkspaceDialog.vue'
81-
import type { WorkspaceItem } from '@/api/type/workspace'
82-
import { MsgSuccess, MsgConfirm } from '@/utils/message'
87+
import type {WorkspaceItem} from '@/api/type/workspace'
88+
import {MsgSuccess, MsgConfirm} from '@/utils/message'
8389
8490
const filterText = ref('')
8591
const loading = ref(false)
@@ -126,6 +132,7 @@ function clickWorkspace(item: WorkspaceItem) {
126132
}
127133
128134
const createOrUpdateWorkspaceDialogRef = ref<InstanceType<typeof CreateOrUpdateWorkspaceDialog>>()
135+
129136
function createOrUpdateWorkspace(item?: WorkspaceItem) {
130137
createOrUpdateWorkspaceDialogRef.value?.open(item);
131138
}
@@ -147,7 +154,8 @@ function deleteWorkspace(item: WorkspaceItem) {
147154
currentWorkspace.value = item.id === currentWorkspace.value?.id ? list.value[0] : currentWorkspace.value
148155
})
149156
})
150-
.catch(() => { })
157+
.catch(() => {
158+
})
151159
}
152160
</script>
153161

0 commit comments

Comments
 (0)