2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 07:57:21 +08:00

fix: 创建数据库用户时如果赋予权限的数据库不存在时显示异常,close #785

This commit is contained in:
2025-05-31 17:23:47 +08:00
parent c597e6b99c
commit f245ff06c5
5 changed files with 121 additions and 87 deletions

View File

@@ -78,6 +78,9 @@ func (r databaseUserRepo) Create(req *request.DatabaseUserCreate) error {
return err
}
for name := range slices.Values(req.Privileges) {
if err = mysql.DatabaseCreate(name); err != nil {
return err
}
if err = mysql.PrivilegesGrant(req.Username, name, req.Host); err != nil {
return err
}
@@ -99,6 +102,9 @@ func (r databaseUserRepo) Create(req *request.DatabaseUserCreate) error {
return err
}
for name := range slices.Values(req.Privileges) {
if err = postgres.DatabaseCreate(name); err != nil {
return err
}
if err = postgres.PrivilegesGrant(req.Username, name); err != nil {
return err
}
@@ -145,6 +151,9 @@ func (r databaseUserRepo) Update(req *request.DatabaseUserUpdate) error {
}
}
for name := range slices.Values(req.Privileges) {
if err = mysql.DatabaseCreate(name); err != nil {
return err
}
if err = mysql.PrivilegesGrant(user.Username, name, user.Host); err != nil {
return err
}
@@ -163,6 +172,9 @@ func (r databaseUserRepo) Update(req *request.DatabaseUserUpdate) error {
}
}
for name := range slices.Values(req.Privileges) {
if err = postgres.DatabaseCreate(name); err != nil {
return err
}
if err = postgres.PrivilegesGrant(user.Username, name); err != nil {
return err
}

View File

@@ -71,7 +71,15 @@ func (r *Postgres) Prepare(query string) (*sql.Stmt, error) {
}
func (r *Postgres) DatabaseCreate(name string) error {
_, err := r.Exec(fmt.Sprintf("CREATE DATABASE %s", name))
// postgres 不支持 CREATE DATABASE IF NOT EXISTS但是为了保持与 MySQL 一致,先检查数据库是否存在
exist, err := r.DatabaseExist(name)
if err != nil {
return err
}
if exist {
return nil
}
_, err = r.Exec(fmt.Sprintf("CREATE DATABASE %s", name))
return err
}

View File

@@ -59,64 +59,71 @@ watch(
:segmented="false"
@close="show = false"
>
<n-form :model="createModel">
<n-form-item path="server_id" :label="$gettext('Server')">
<n-select
v-model:value="createModel.server_id"
@keydown.enter.prevent
:placeholder="$gettext('Select server')"
:options="servers"
/>
</n-form-item>
<n-form-item path="username" :label="$gettext('Username')">
<n-input
v-model:value="createModel.username"
type="text"
@keydown.enter.prevent
:placeholder="$gettext('Enter username')"
/>
</n-form-item>
<n-form-item path="password" :label="$gettext('Password')">
<n-input
v-model:value="createModel.password"
type="password"
show-password-on="click"
@keydown.enter.prevent
:placeholder="$gettext('Enter password')"
/>
</n-form-item>
<n-form-item path="host-select" :label="$gettext('Host (MySQL only)')">
<n-select
v-model:value="createModel.host"
@keydown.enter.prevent
:placeholder="$gettext('Select host')"
:options="hostType"
/>
</n-form-item>
<n-form-item v-if="createModel.host === ''" path="host" :label="$gettext('Specific Host')">
<n-input
v-model:value="createModel.host"
type="text"
@keydown.enter.prevent
:placeholder="$gettext('Enter supported host address')"
/>
</n-form-item>
<n-form-item path="privileges" :label="$gettext('Privileges')">
<n-dynamic-input
v-model:value="createModel.privileges"
:placeholder="$gettext('Enter database name')"
/>
</n-form-item>
<n-form-item path="remark" :label="$gettext('Comment')">
<n-input
v-model:value="createModel.remark"
type="textarea"
@keydown.enter.prevent
:placeholder="$gettext('Enter database user comment')"
/>
</n-form-item>
</n-form>
<n-button type="info" block @click="handleCreate">{{ $gettext('Submit') }}</n-button>
<n-flex vertical>
<n-alert type="info">
{{
$gettext('If the privilege databases does not exist, it will be created automatically. ')
}}
</n-alert>
<n-form :model="createModel">
<n-form-item path="server_id" :label="$gettext('Server')">
<n-select
v-model:value="createModel.server_id"
@keydown.enter.prevent
:placeholder="$gettext('Select server')"
:options="servers"
/>
</n-form-item>
<n-form-item path="username" :label="$gettext('Username')">
<n-input
v-model:value="createModel.username"
type="text"
@keydown.enter.prevent
:placeholder="$gettext('Enter username')"
/>
</n-form-item>
<n-form-item path="password" :label="$gettext('Password')">
<n-input
v-model:value="createModel.password"
type="password"
show-password-on="click"
@keydown.enter.prevent
:placeholder="$gettext('Enter password')"
/>
</n-form-item>
<n-form-item path="host-select" :label="$gettext('Host (MySQL only)')">
<n-select
v-model:value="createModel.host"
@keydown.enter.prevent
:placeholder="$gettext('Select host')"
:options="hostType"
/>
</n-form-item>
<n-form-item v-if="createModel.host === ''" path="host" :label="$gettext('Specific Host')">
<n-input
v-model:value="createModel.host"
type="text"
@keydown.enter.prevent
:placeholder="$gettext('Enter supported host address')"
/>
</n-form-item>
<n-form-item path="privileges" :label="$gettext('Privileges')">
<n-dynamic-input
v-model:value="createModel.privileges"
:placeholder="$gettext('Enter database name')"
/>
</n-form-item>
<n-form-item path="remark" :label="$gettext('Comment')">
<n-input
v-model:value="createModel.remark"
type="textarea"
@keydown.enter.prevent
:placeholder="$gettext('Enter database user comment')"
/>
</n-form-item>
</n-form>
<n-button type="info" block @click="handleCreate">{{ $gettext('Submit') }}</n-button>
</n-flex>
</n-modal>
</template>

View File

@@ -27,7 +27,7 @@ watch(
() => show.value,
(value) => {
if (value && id.value) {
useRequest(database.serverGet(id.value)).onSuccess(({ data }) => {
useRequest(database.serverGet(id.value)).onSuccess(({ data }: { data: any }) => {
updateModel.value.name = data.name
updateModel.value.host = data.host
updateModel.value.port = data.port

View File

@@ -24,7 +24,7 @@ watch(
() => show.value,
(value) => {
if (value && id.value) {
useRequest(database.userGet(id.value)).onSuccess(({ data }) => {
useRequest(database.userGet(id.value)).onSuccess(({ data }: { data: any }) => {
updateModel.value.password = data.password
updateModel.value.privileges = data.privileges
updateModel.value.remark = data.remark
@@ -45,32 +45,39 @@ watch(
:segmented="false"
@close="show = false"
>
<n-form :model="updateModel">
<n-form-item path="password" :label="$gettext('Password')">
<n-input
v-model:value="updateModel.password"
type="password"
show-password-on="click"
@keydown.enter.prevent
:placeholder="$gettext('Enter password')"
/>
</n-form-item>
<n-form-item path="privileges" :label="$gettext('Privileges')">
<n-dynamic-input
v-model:value="updateModel.privileges"
:placeholder="$gettext('Enter database name')"
/>
</n-form-item>
<n-form-item path="remark" :label="$gettext('Comment')">
<n-input
v-model:value="updateModel.remark"
type="textarea"
@keydown.enter.prevent
:placeholder="$gettext('Enter database user comment')"
/>
</n-form-item>
</n-form>
<n-button type="info" block @click="handleUpdate">{{ $gettext('Submit') }}</n-button>
<n-flex vertical>
<n-alert type="info">
{{
$gettext('If the privilege databases does not exist, it will be created automatically. ')
}}
</n-alert>
<n-form :model="updateModel">
<n-form-item path="password" :label="$gettext('Password')">
<n-input
v-model:value="updateModel.password"
type="password"
show-password-on="click"
@keydown.enter.prevent
:placeholder="$gettext('Enter password')"
/>
</n-form-item>
<n-form-item path="privileges" :label="$gettext('Privileges')">
<n-dynamic-input
v-model:value="updateModel.privileges"
:placeholder="$gettext('Enter database name')"
/>
</n-form-item>
<n-form-item path="remark" :label="$gettext('Comment')">
<n-input
v-model:value="updateModel.remark"
type="textarea"
@keydown.enter.prevent
:placeholder="$gettext('Enter database user comment')"
/>
</n-form-item>
</n-form>
<n-button type="info" block @click="handleUpdate">{{ $gettext('Submit') }}</n-button>
</n-flex>
</n-modal>
</template>