Skip to content

Commit 7c306b9

Browse files
committed
feat: upgrade database to MySQL and enhance member management UI with select dropdowns and permission logic
1 parent c758a35 commit 7c306b9

2 files changed

Lines changed: 115 additions & 18 deletions

File tree

frontend/src/views/resource/MemberEditDialog.vue

Lines changed: 108 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,59 @@
1515
:rules="formRules"
1616
:label-col="{ style: { width: '100px' } }"
1717
:wrapper-col="{ flex: 1 }">
18-
<a-form-item
19-
:label="$t('pages.member.form.user')"
20-
name="user">
21-
<a-input
22-
:placeholder="$t('pages.member.form.user.placeholder')"
23-
v-model:value="formData.user"
24-
:disabled="modal.type === 'edit'" />
25-
</a-form-item>
2618
<a-form-item
2719
:label="$t('pages.member.form.tenant')"
2820
name="tenant">
29-
<a-input
21+
<a-select
22+
v-model:value="formData.tenant"
23+
show-search
24+
:disabled="modal.type === 'edit'"
3025
:placeholder="$t('pages.member.form.tenant.placeholder')"
31-
v-model:value="formData.tenant" />
26+
:filter-option="filterSpaceOption">
27+
<a-select-option
28+
v-for="item in spaceOptions"
29+
:key="item.value"
30+
:value="item.value"
31+
:label="item.label">
32+
{{ item.label }}
33+
</a-select-option>
34+
</a-select>
35+
</a-form-item>
36+
<a-form-item
37+
:label="$t('pages.member.form.user')"
38+
name="user">
39+
<a-select
40+
v-model:value="formData.user"
41+
show-search
42+
:disabled="modal.type === 'edit'"
43+
:placeholder="$t('pages.member.form.user.placeholder')"
44+
:filter-option="filterUserOption">
45+
<a-select-option
46+
v-for="item in userOptions"
47+
:key="item.value"
48+
:value="item.value"
49+
:label="item.label">
50+
{{ item.label }}
51+
</a-select-option>
52+
</a-select>
3253
</a-form-item>
3354
<a-form-item
3455
:label="$t('pages.member.form.role')"
3556
name="role">
3657
<a-select
3758
:placeholder="$t('pages.member.form.role.placeholder')"
3859
v-model:value="formData.role">
39-
<a-select-option value="owner">owner</a-select-option>
4060
<a-select-option value="admin">admin</a-select-option>
61+
<a-select-option value="user">user</a-select-option>
4162
<a-select-option value="viewer">viewer</a-select-option>
4263
</a-select>
4364
</a-form-item>
4465
<a-form-item
4566
:label="$t('pages.member.form.permission')"
4667
name="permission">
47-
<a-checkbox-group v-model:value="formData.permissions">
68+
<a-checkbox-group
69+
v-model:value="formData.permissions"
70+
disabled>
4871
<a-checkbox value="read">{{ $t('pages.member.form.permission.read') }}</a-checkbox>
4972
<a-checkbox value="write">{{ $t('pages.member.form.permission.write') }}</a-checkbox>
5073
<a-checkbox value="delete">{{ $t('pages.member.form.permission.delete') }}</a-checkbox>
@@ -56,7 +79,7 @@
5679

5780
<script setup>
5881
import { cloneDeep } from 'lodash-es'
59-
import { ref } from 'vue'
82+
import { ref, watch } from 'vue'
6083
import { config } from '@/config'
6184
import apis from '@/apis'
6285
import { useForm, useModal } from '@/hooks'
@@ -73,6 +96,71 @@ const { t } = useI18n()
7396
const cancelText = ref(t('button.cancel'))
7497
const okText = ref(t('button.confirm'))
7598
99+
const userOptions = ref([])
100+
const spaceOptions = ref([])
101+
102+
async function loadUsers() {
103+
try {
104+
const result = await apis.users.getUsersList({ pageSize: 100, current: 1 }).catch(() => null)
105+
const list = []
106+
if (result && config('http.code.success') === result.success && result.data) {
107+
list.push(
108+
...result.data.map((user) => ({
109+
label: user.name ? `${user.name} (${user.username})` : user.username,
110+
value: user.username,
111+
}))
112+
)
113+
}
114+
userOptions.value = list
115+
} catch (e) {
116+
console.error('加载成员列表失败:', e)
117+
}
118+
}
119+
120+
async function loadSpaces() {
121+
try {
122+
const result = await apis.space.getSpaceList({ pageSize: 100, current: 1 }).catch(() => null)
123+
const list = []
124+
if (result && config('http.code.success') === result.success && result.data) {
125+
list.push(
126+
...result.data.map((space) => ({
127+
label: space.name ? `${space.name} (${space.code})` : space.code,
128+
value: space.code,
129+
}))
130+
)
131+
}
132+
spaceOptions.value = list
133+
} catch (e) {
134+
console.error('加载空间列表失败:', e)
135+
}
136+
}
137+
138+
function filterUserOption(input, option) {
139+
const label = option.label || ''
140+
return label.toLowerCase().includes(input.toLowerCase())
141+
}
142+
143+
function filterSpaceOption(input, option) {
144+
const label = option.label || ''
145+
return label.toLowerCase().includes(input.toLowerCase())
146+
}
147+
148+
loadUsers()
149+
loadSpaces()
150+
151+
watch(
152+
() => formData.value.role,
153+
(newRole) => {
154+
if (newRole === 'admin') {
155+
formData.value.permissions = ['read', 'write', 'delete']
156+
} else if (newRole === 'user') {
157+
formData.value.permissions = ['read', 'write']
158+
} else if (newRole === 'viewer') {
159+
formData.value.permissions = ['read']
160+
}
161+
}
162+
)
163+
76164
const permToBits = { read: 1, write: 2, delete: 4 }
77165
const bitsToPerms = (bits) => {
78166
const perms = []
@@ -94,7 +182,12 @@ function handleCreate() {
94182
type: 'create',
95183
title: t('pages.member.add'),
96184
})
97-
formData.value = { permissions: ['read'] }
185+
formData.value = {
186+
user: undefined,
187+
tenant: undefined,
188+
role: undefined,
189+
permissions: ['read'],
190+
}
98191
}
99192
100193
async function handleEdit(record = {}) {
@@ -121,7 +214,7 @@ function handleOk() {
121214
user: values.user,
122215
tenant: values.tenant,
123216
role: values.role,
124-
permission: permsToBits(values.permissions || []),
217+
permission: permsToBits(formData.value.permissions || []),
125218
}
126219
let result = null
127220
switch (modal.value.type) {

frontend/src/views/resource/ServiceDetail.vue

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,17 +225,17 @@
225225
<template #bodyCell="{ column, record }">
226226
<template v-if="'permission' === column.key">
227227
<a-tag
228-
v-if="record.permission & 1"
228+
v-if="hasPermission(record.permission, 1)"
229229
color="green"
230230
>{{ $t('pages.member.form.permission.read') }}</a-tag
231231
>
232232
<a-tag
233-
v-if="record.permission & 2"
233+
v-if="hasPermission(record.permission, 2)"
234234
color="blue"
235235
>{{ $t('pages.member.form.permission.write') }}</a-tag
236236
>
237237
<a-tag
238-
v-if="record.permission & 4"
238+
v-if="hasPermission(record.permission, 4)"
239239
color="red"
240240
>{{ $t('pages.member.form.permission.delete') }}</a-tag
241241
>
@@ -397,6 +397,10 @@ defineOptions({
397397
name: 'serviceDetail',
398398
})
399399
400+
const hasPermission = (permission, bit) => {
401+
return (Number(permission) & bit) === bit
402+
}
403+
400404
const route = useRoute()
401405
const { t } = useI18n()
402406
const serviceId = ref(route.params.id)

0 commit comments

Comments
 (0)