2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-07 09:27:15 +08:00
Files
panel/web/src/views/cert/AccountView.vue
2025-04-13 03:06:22 +08:00

275 lines
6.7 KiB
Vue

<script setup lang="ts">
import {
type MessageReactive,
NButton,
NDataTable,
NInput,
NPopconfirm,
NSpace,
NTag
} from 'naive-ui'
import { useGettext } from 'vue3-gettext'
import cert from '@/api/panel/cert'
const { $gettext } = useGettext()
const props = defineProps({
caProviders: {
type: Array<any>,
required: true
},
algorithms: {
type: Array<any>,
required: true
}
})
const { caProviders, algorithms } = toRefs(props)
let messageReactive: MessageReactive | null = null
const updateAccountModel = ref<any>({
hmac_encoded: '',
email: '',
kid: '',
key_type: 'P256',
ca: 'googlecn'
})
const updateAccountModal = ref(false)
const updateAccount = ref<any>()
const columns: any = [
{
title: $gettext('Email'),
key: 'email',
minWidth: 200,
resizable: true,
ellipsis: { tooltip: true }
},
{
title: 'CA',
key: 'ca',
width: 150,
resizable: true,
ellipsis: { tooltip: true },
render(row: any) {
return h(
NTag,
{
type: 'info',
bordered: false
},
{
default: () => {
return caProviders.value?.find((item: any) => item.value === row.ca)?.label
}
}
)
}
},
{
title: $gettext('Key Type'),
key: 'key_type',
width: 150,
resizable: true,
ellipsis: { tooltip: true }
},
{
title: $gettext('Actions'),
key: 'actions',
width: 200,
align: 'center',
hideInExcel: true,
render(row: any) {
return [
h(
NButton,
{
size: 'small',
type: 'primary',
onClick: () => {
updateAccount.value = row.id
updateAccountModel.value.email = row.email
updateAccountModel.value.hmac_encoded = row.hmac_encoded
updateAccountModel.value.kid = row.kid
updateAccountModel.value.key_type = row.key_type
updateAccountModel.value.ca = row.ca
updateAccountModal.value = true
}
},
{
default: () => $gettext('Modify')
}
),
h(
NPopconfirm,
{
onPositiveClick: () => {
useRequest(cert.accountDelete(row.id)).onSuccess(() => {
window.$message.success($gettext('Deletion successful'))
refresh()
})
}
},
{
default: () => {
return $gettext('Are you sure you want to delete the account?')
},
trigger: () => {
return h(
NButton,
{
size: 'small',
type: 'error',
style: 'margin-left: 15px;'
},
{
default: () => $gettext('Delete')
}
)
}
}
)
]
}
}
]
const { loading, data, page, total, pageSize, pageCount, refresh } = usePagination(
(page, pageSize) => cert.accounts(page, pageSize),
{
initialData: { total: 0, list: [] },
initialPageSize: 20,
total: (res: any) => res.total,
data: (res: any) => res.items
}
)
const handleUpdateAccount = () => {
messageReactive = window.$message.loading(
$gettext('Registering account with CA, please wait patiently'),
{
duration: 0
}
)
useRequest(cert.accountUpdate(updateAccount.value, updateAccountModel.value))
.onSuccess(() => {
refresh()
updateAccountModal.value = false
updateAccountModel.value.email = ''
updateAccountModel.value.hmac_encoded = ''
updateAccountModel.value.kid = ''
window.$message.success($gettext('Update successful'))
})
.onComplete(() => {
messageReactive?.destroy()
})
}
onMounted(() => {
refresh()
window.$bus.on('cert:refresh-account', () => {
refresh()
})
})
onUnmounted(() => {
window.$bus.off('cert:refresh-account')
})
</script>
<template>
<n-space vertical size="large">
<n-data-table
striped
remote
:scroll-x="1000"
:loading="loading"
:columns="columns"
:data="data"
:row-key="(row: any) => row.id"
v-model:page="page"
v-model:pageSize="pageSize"
:pagination="{
page: page,
pageCount: pageCount,
pageSize: pageSize,
itemCount: total,
showQuickJumper: true,
showSizePicker: true,
pageSizes: [20, 50, 100, 200]
}"
/>
</n-space>
<n-modal
v-model:show="updateAccountModal"
preset="card"
:title="$gettext('Modify Account')"
style="width: 60vw"
size="huge"
:bordered="false"
:segmented="false"
>
<n-space vertical>
<n-alert type="info">{{
$gettext(
'Google and SSL.com require obtaining KID and HMAC from their official websites first'
)
}}</n-alert>
<n-alert type="warning">
{{
$gettext(
"Google is not accessible in mainland China, other CAs depend on network conditions, recommend using GoogleCN or Let's Encrypt"
)
}}
</n-alert>
<n-form :model="updateAccountModel">
<n-form-item path="ca" :label="$gettext('CA')">
<n-select
v-model:value="updateAccountModel.ca"
:placeholder="$gettext('Select CA')"
clearable
:options="caProviders"
/>
</n-form-item>
<n-form-item path="key_type" :label="$gettext('Key Type')">
<n-select
v-model:value="updateAccountModel.key_type"
:placeholder="$gettext('Select key type')"
clearable
:options="algorithms"
/>
</n-form-item>
<n-form-item path="email" :label="$gettext('Email')">
<n-input
v-model:value="updateAccountModel.email"
type="text"
@keydown.enter.prevent
:placeholder="$gettext('Enter email address')"
/>
</n-form-item>
<n-form-item path="kid" label="KID">
<n-input
v-model:value="updateAccountModel.kid"
type="text"
@keydown.enter.prevent
:placeholder="$gettext('Enter KID')"
/>
</n-form-item>
<n-form-item path="hmac_encoded" label="HMAC">
<n-input
v-model:value="updateAccountModel.hmac_encoded"
type="text"
@keydown.enter.prevent
:placeholder="$gettext('Enter HMAC')"
/>
</n-form-item>
</n-form>
<n-button type="info" block @click="handleUpdateAccount">{{ $gettext('Submit') }}</n-button>
</n-space>
</n-modal>
</template>
<style scoped lang="scss"></style>