|
|
@@ -7,7 +7,7 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="storage-manager" v-loading="pageLoading">
|
|
|
+ <el-card class="list-card" v-loading="pageLoading">
|
|
|
<div class="storage-actions">
|
|
|
<el-button type="primary" :loading="initLoading" @click="handleInit">
|
|
|
<el-icon><SetUp /></el-icon>
|
|
|
@@ -68,207 +68,207 @@
|
|
|
</div>
|
|
|
<el-empty v-if="!engines.length" class="empty" description="暂无引擎" />
|
|
|
</div>
|
|
|
+ </el-card>
|
|
|
+
|
|
|
+ <el-drawer
|
|
|
+ v-model="drawerVisible"
|
|
|
+ :title="selectedProvider ? `${formatProviderLabel(selectedProvider)} 配置` : '编辑存储引擎'"
|
|
|
+ direction="rtl"
|
|
|
+ size="760px"
|
|
|
+ >
|
|
|
+ <template v-if="selectedProvider">
|
|
|
+ <div class="drawer-intro">
|
|
|
+ <div class="drawer-intro__title">{{ formatProviderLabel(selectedProvider) }}</div>
|
|
|
+ <div class="drawer-intro__desc">
|
|
|
+ 修改当前存储引擎配置后保存,可直接在此执行重新加载与连通测试。
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- <el-drawer
|
|
|
- v-model="drawerVisible"
|
|
|
- :title="selectedProvider ? `${formatProviderLabel(selectedProvider)} 配置` : '编辑存储引擎'"
|
|
|
- direction="rtl"
|
|
|
- size="760px"
|
|
|
- >
|
|
|
- <template v-if="selectedProvider">
|
|
|
- <div class="drawer-intro">
|
|
|
- <div class="drawer-intro__title">{{ formatProviderLabel(selectedProvider) }}</div>
|
|
|
- <div class="drawer-intro__desc">
|
|
|
- 修改当前存储引擎配置后保存,可直接在此执行重新加载与连通测试。
|
|
|
+ <el-form :model="form" label-position="top">
|
|
|
+ <template v-if="selectedProvider === 'local'">
|
|
|
+ <el-form-item label="存储前缀">
|
|
|
+ <el-input v-model="form.local.path_prefix" placeholder="例如 knowledge/files" />
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="selectedProvider === 'minio'">
|
|
|
+ <div class="form-grid">
|
|
|
+ <el-form-item label="Endpoint">
|
|
|
+ <el-input v-model="form.minio.endpoint" placeholder="127.0.0.1:9000" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Mode">
|
|
|
+ <el-input v-model="form.minio.mode" placeholder="docker" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Access Key ID">
|
|
|
+ <el-input v-model="form.minio.access_key_id" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Secret Access Key">
|
|
|
+ <el-input v-model="form.minio.secret_access_key" show-password />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Bucket">
|
|
|
+ <el-input v-model="form.minio.bucket_name" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Path Prefix">
|
|
|
+ <el-input v-model="form.minio.path_prefix" />
|
|
|
+ </el-form-item>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ <el-form-item label="Use SSL">
|
|
|
+ <el-switch v-model="form.minio.use_ssl" />
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
|
|
|
- <el-form :model="form" label-position="top">
|
|
|
- <template v-if="selectedProvider === 'local'">
|
|
|
- <el-form-item label="存储前缀">
|
|
|
- <el-input v-model="form.local.path_prefix" placeholder="例如 knowledge/files" />
|
|
|
- </el-form-item>
|
|
|
- </template>
|
|
|
-
|
|
|
- <template v-else-if="selectedProvider === 'minio'">
|
|
|
- <div class="form-grid">
|
|
|
- <el-form-item label="Endpoint">
|
|
|
- <el-input v-model="form.minio.endpoint" placeholder="127.0.0.1:9000" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Mode">
|
|
|
- <el-input v-model="form.minio.mode" placeholder="docker" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Access Key ID">
|
|
|
- <el-input v-model="form.minio.access_key_id" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Secret Access Key">
|
|
|
- <el-input v-model="form.minio.secret_access_key" show-password />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Bucket">
|
|
|
- <el-input v-model="form.minio.bucket_name" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Path Prefix">
|
|
|
- <el-input v-model="form.minio.path_prefix" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- <el-form-item label="Use SSL">
|
|
|
- <el-switch v-model="form.minio.use_ssl" />
|
|
|
- </el-form-item>
|
|
|
- </template>
|
|
|
-
|
|
|
- <template v-else-if="selectedProvider === 'cos'">
|
|
|
- <div class="form-grid">
|
|
|
- <el-form-item label="App ID">
|
|
|
- <el-input v-model="form.cos.app_id" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Region">
|
|
|
- <el-input v-model="form.cos.region" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Secret ID">
|
|
|
- <el-input v-model="form.cos.secret_id" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Secret Key">
|
|
|
- <el-input v-model="form.cos.secret_key" show-password />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Bucket">
|
|
|
- <el-input v-model="form.cos.bucket_name" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Path Prefix">
|
|
|
- <el-input v-model="form.cos.path_prefix" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
- <template v-else-if="selectedProvider === 'tos'">
|
|
|
- <div class="form-grid">
|
|
|
- <el-form-item label="Endpoint">
|
|
|
- <el-input v-model="form.tos.endpoint" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Region">
|
|
|
- <el-input v-model="form.tos.region" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Access Key">
|
|
|
- <el-input v-model="form.tos.access_key" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Secret Key">
|
|
|
- <el-input v-model="form.tos.secret_key" show-password />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Bucket">
|
|
|
- <el-input v-model="form.tos.bucket_name" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Path Prefix">
|
|
|
- <el-input v-model="form.tos.path_prefix" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
- <template v-else-if="selectedProvider === 's3'">
|
|
|
- <div class="form-grid">
|
|
|
- <el-form-item label="Endpoint">
|
|
|
- <el-input v-model="form.s3.endpoint" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Region">
|
|
|
- <el-input v-model="form.s3.region" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Access Key">
|
|
|
- <el-input v-model="form.s3.access_key" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Secret Key">
|
|
|
- <el-input v-model="form.s3.secret_key" show-password />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Bucket">
|
|
|
- <el-input v-model="form.s3.bucket_name" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Path Prefix">
|
|
|
- <el-input v-model="form.s3.path_prefix" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
- <template v-else-if="selectedProvider === 'ks3'">
|
|
|
- <div class="form-grid">
|
|
|
- <el-form-item label="Endpoint">
|
|
|
- <el-input v-model="form.ks3.endpoint" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Region">
|
|
|
- <el-input v-model="form.ks3.region" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Access Key">
|
|
|
- <el-input v-model="form.ks3.access_key" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Secret Key">
|
|
|
- <el-input v-model="form.ks3.secret_key" show-password />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Bucket">
|
|
|
- <el-input v-model="form.ks3.bucket_name" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Path Prefix">
|
|
|
- <el-input v-model="form.ks3.path_prefix" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
- <template v-else-if="selectedProvider === 'oss'">
|
|
|
- <div class="form-grid">
|
|
|
- <el-form-item label="Endpoint">
|
|
|
- <el-input v-model="form.oss.endpoint" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Region">
|
|
|
- <el-input v-model="form.oss.region" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Access Key">
|
|
|
- <el-input v-model="form.oss.access_key" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Secret Key">
|
|
|
- <el-input v-model="form.oss.secret_key" show-password />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Bucket">
|
|
|
- <el-input v-model="form.oss.bucket_name" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Path Prefix">
|
|
|
- <el-input v-model="form.oss.path_prefix" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Temp Bucket">
|
|
|
- <el-input v-model="form.oss.temp_bucket_name" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Temp Region">
|
|
|
- <el-input v-model="form.oss.temp_region" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- <el-form-item label="Use Temp Bucket">
|
|
|
- <el-switch v-model="form.oss.use_temp_bucket" />
|
|
|
+ <template v-else-if="selectedProvider === 'cos'">
|
|
|
+ <div class="form-grid">
|
|
|
+ <el-form-item label="App ID">
|
|
|
+ <el-input v-model="form.cos.app_id" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Region">
|
|
|
+ <el-input v-model="form.cos.region" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Secret ID">
|
|
|
+ <el-input v-model="form.cos.secret_id" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Secret Key">
|
|
|
+ <el-input v-model="form.cos.secret_key" show-password />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Bucket">
|
|
|
+ <el-input v-model="form.cos.bucket_name" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Path Prefix">
|
|
|
+ <el-input v-model="form.cos.path_prefix" />
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="selectedProvider === 'tos'">
|
|
|
+ <div class="form-grid">
|
|
|
+ <el-form-item label="Endpoint">
|
|
|
+ <el-input v-model="form.tos.endpoint" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Region">
|
|
|
+ <el-input v-model="form.tos.region" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Access Key">
|
|
|
+ <el-input v-model="form.tos.access_key" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Secret Key">
|
|
|
+ <el-input v-model="form.tos.secret_key" show-password />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Bucket">
|
|
|
+ <el-input v-model="form.tos.bucket_name" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Path Prefix">
|
|
|
+ <el-input v-model="form.tos.path_prefix" />
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="selectedProvider === 's3'">
|
|
|
+ <div class="form-grid">
|
|
|
+ <el-form-item label="Endpoint">
|
|
|
+ <el-input v-model="form.s3.endpoint" />
|
|
|
</el-form-item>
|
|
|
- </template>
|
|
|
+ <el-form-item label="Region">
|
|
|
+ <el-input v-model="form.s3.region" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Access Key">
|
|
|
+ <el-input v-model="form.s3.access_key" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Secret Key">
|
|
|
+ <el-input v-model="form.s3.secret_key" show-password />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Bucket">
|
|
|
+ <el-input v-model="form.s3.bucket_name" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Path Prefix">
|
|
|
+ <el-input v-model="form.s3.path_prefix" />
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
|
|
|
- <el-form-item label="设为默认">
|
|
|
- <el-switch v-model="form.is_default" />
|
|
|
+ <template v-else-if="selectedProvider === 'ks3'">
|
|
|
+ <div class="form-grid">
|
|
|
+ <el-form-item label="Endpoint">
|
|
|
+ <el-input v-model="form.ks3.endpoint" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Region">
|
|
|
+ <el-input v-model="form.ks3.region" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Access Key">
|
|
|
+ <el-input v-model="form.ks3.access_key" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Secret Key">
|
|
|
+ <el-input v-model="form.ks3.secret_key" show-password />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Bucket">
|
|
|
+ <el-input v-model="form.ks3.bucket_name" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Path Prefix">
|
|
|
+ <el-input v-model="form.ks3.path_prefix" />
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="selectedProvider === 'oss'">
|
|
|
+ <div class="form-grid">
|
|
|
+ <el-form-item label="Endpoint">
|
|
|
+ <el-input v-model="form.oss.endpoint" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Region">
|
|
|
+ <el-input v-model="form.oss.region" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Access Key">
|
|
|
+ <el-input v-model="form.oss.access_key" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Secret Key">
|
|
|
+ <el-input v-model="form.oss.secret_key" show-password />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Bucket">
|
|
|
+ <el-input v-model="form.oss.bucket_name" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Path Prefix">
|
|
|
+ <el-input v-model="form.oss.path_prefix" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Temp Bucket">
|
|
|
+ <el-input v-model="form.oss.temp_bucket_name" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Temp Region">
|
|
|
+ <el-input v-model="form.oss.temp_region" />
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ <el-form-item label="Use Temp Bucket">
|
|
|
+ <el-switch v-model="form.oss.use_temp_bucket" />
|
|
|
</el-form-item>
|
|
|
- </el-form>
|
|
|
- </template>
|
|
|
-
|
|
|
- <template #footer>
|
|
|
- <div class="drawer-footer">
|
|
|
- <el-button @click="drawerVisible = false">取消</el-button>
|
|
|
- <el-button
|
|
|
- @click="reloadSelectedProvider"
|
|
|
- :loading="providerLoading === selectedProvider"
|
|
|
- >
|
|
|
- 重新加载
|
|
|
- </el-button>
|
|
|
- <el-button
|
|
|
- type="primary"
|
|
|
- plain
|
|
|
- :disabled="!selectedProvider"
|
|
|
- :loading="selectedProvider ? testingProvider === selectedProvider : false"
|
|
|
- @click="selectedProvider && testProvider(selectedProvider)"
|
|
|
- >
|
|
|
- 测试连接
|
|
|
- </el-button>
|
|
|
- <el-button type="primary" :loading="saving" @click="saveConfig">保存配置</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-drawer>
|
|
|
- </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <el-form-item label="设为默认">
|
|
|
+ <el-switch v-model="form.is_default" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template #footer>
|
|
|
+ <div class="drawer-footer">
|
|
|
+ <el-button @click="drawerVisible = false">取消</el-button>
|
|
|
+ <el-button
|
|
|
+ @click="reloadSelectedProvider"
|
|
|
+ :loading="providerLoading === selectedProvider"
|
|
|
+ >
|
|
|
+ 重新加载
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ plain
|
|
|
+ :disabled="!selectedProvider"
|
|
|
+ :loading="selectedProvider ? testingProvider === selectedProvider : false"
|
|
|
+ @click="selectedProvider && testProvider(selectedProvider)"
|
|
|
+ >
|
|
|
+ 测试连接
|
|
|
+ </el-button>
|
|
|
+ <el-button type="primary" :loading="saving" @click="saveConfig">保存配置</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-drawer>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -724,23 +724,24 @@ onMounted(async () => {
|
|
|
}
|
|
|
|
|
|
.page-head {
|
|
|
- margin-bottom: 18px;
|
|
|
+ margin-bottom: 20px;
|
|
|
|
|
|
h1 {
|
|
|
margin: 0;
|
|
|
font-size: 28px;
|
|
|
+ color: var(--text-primary);
|
|
|
}
|
|
|
|
|
|
p {
|
|
|
margin: 6px 0 0;
|
|
|
- color: var(--text-tertiary);
|
|
|
+ font-size: 14px;
|
|
|
+ color: var(--text-secondary);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-.storage-manager {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- gap: 16px;
|
|
|
+.list-card {
|
|
|
+ border-radius: 18px;
|
|
|
+ margin-bottom: 16px;
|
|
|
}
|
|
|
|
|
|
.storage-actions {
|
|
|
@@ -748,6 +749,7 @@ onMounted(async () => {
|
|
|
align-items: center;
|
|
|
gap: 8px;
|
|
|
flex-wrap: wrap;
|
|
|
+ margin-bottom: 16px;
|
|
|
|
|
|
.el-button + .el-button {
|
|
|
margin-left: 0;
|