|
@@ -58,6 +58,18 @@
|
|
|
</template>
|
|
</template>
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div class="flex batch-operations" v-if="selectedModels.length > 0 && !isShared">
|
|
|
|
|
+ <el-button type="danger" size="small" @click="handleBatchDelete">
|
|
|
|
|
+ 批量删除 ({{ selectedModels.length }})
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ <el-select v-model="batchStatus" placeholder="批量设置状态" size="small" style="width: 140px">
|
|
|
|
|
+ <el-option label="启用" value="SUCCESS" />
|
|
|
|
|
+ <el-option label="暂停下载" value="PAUSE_DOWNLOAD" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ <el-button type="warning" size="small" @click="handleBatchOperate" :disabled="!batchStatus">
|
|
|
|
|
+ 批量设置
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
<el-button
|
|
<el-button
|
|
|
v-if="!isShared && permissionPrecise.create()"
|
|
v-if="!isShared && permissionPrecise.create()"
|
|
|
class="ml-16"
|
|
class="ml-16"
|
|
@@ -84,12 +96,15 @@
|
|
|
>
|
|
>
|
|
|
<ModelCard
|
|
<ModelCard
|
|
|
@change="list_model"
|
|
@change="list_model"
|
|
|
|
|
+ @toggle-select="toggleModelSelection"
|
|
|
:updateModelById="updateModelById"
|
|
:updateModelById="updateModelById"
|
|
|
:model="model"
|
|
:model="model"
|
|
|
:provider_list="provider_list"
|
|
:provider_list="provider_list"
|
|
|
:isShared="isShared"
|
|
:isShared="isShared"
|
|
|
:isSystemShare="isSystemShare"
|
|
:isSystemShare="isSystemShare"
|
|
|
:apiType="apiType"
|
|
:apiType="apiType"
|
|
|
|
|
+ :showCheckbox="!isShared && permissionPrecise.delete(model.id)"
|
|
|
|
|
+ :isSelected="selectedModels.includes(model.id)"
|
|
|
>
|
|
>
|
|
|
</ModelCard>
|
|
</ModelCard>
|
|
|
</el-col>
|
|
</el-col>
|
|
@@ -127,6 +142,8 @@ import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
|
|
|
import useStore from '@/stores'
|
|
import useStore from '@/stores'
|
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
|
import permissionMap from '@/permission'
|
|
import permissionMap from '@/permission'
|
|
|
|
|
+import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
|
|
+import modelApi from '@/api/model/model'
|
|
|
|
|
|
|
|
const route = useRoute()
|
|
const route = useRoute()
|
|
|
const router = useRouter()
|
|
const router = useRouter()
|
|
@@ -166,6 +183,8 @@ const list_model_loading = ref<boolean>(false)
|
|
|
const provider_list = ref<Array<Provider>>([])
|
|
const provider_list = ref<Array<Provider>>([])
|
|
|
|
|
|
|
|
const model_list = ref<Array<Model>>([])
|
|
const model_list = ref<Array<Model>>([])
|
|
|
|
|
+const selectedModels = ref<string[]>([])
|
|
|
|
|
+const batchStatus = ref('')
|
|
|
|
|
|
|
|
const isShared = computed(() => {
|
|
const isShared = computed(() => {
|
|
|
return active_provider.value && active_provider.value.provider === 'share'
|
|
return active_provider.value && active_provider.value.provider === 'share'
|
|
@@ -222,6 +241,50 @@ const search_type_change = () => {
|
|
|
model_search_form.value = { name: '', create_user: '', model_type: '' }
|
|
model_search_form.value = { name: '', create_user: '', model_type: '' }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+const toggleModelSelection = (modelId: string) => {
|
|
|
|
|
+ const index = selectedModels.value.indexOf(modelId)
|
|
|
|
|
+ if (index === -1) {
|
|
|
|
|
+ selectedModels.value.push(modelId)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ selectedModels.value.splice(index, 1)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const handleBatchDelete = async () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await ElMessageBox.confirm(
|
|
|
|
|
+ `确定要删除选中的 ${selectedModels.value.length} 个模型吗?`,
|
|
|
|
|
+ '批量删除确认',
|
|
|
|
|
+ { type: 'warning' }
|
|
|
|
|
+ )
|
|
|
|
|
+ const result = await modelApi.batchDeleteModels(selectedModels.value)
|
|
|
|
|
+ if (result.code === 200) {
|
|
|
|
|
+ ElMessage.success(`成功删除 ${result.data.deleted_count} 个模型`)
|
|
|
|
|
+ selectedModels.value = []
|
|
|
|
|
+ list_model()
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ if (error !== 'cancel') {
|
|
|
|
|
+ ElMessage.error('批量删除失败')
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const handleBatchOperate = async () => {
|
|
|
|
|
+ if (!batchStatus.value) return
|
|
|
|
|
+ try {
|
|
|
|
|
+ const result = await modelApi.batchOperateModels(selectedModels.value, batchStatus.value)
|
|
|
|
|
+ if (result.code === 200) {
|
|
|
|
|
+ ElMessage.success(`成功更新 ${result.data.updated_count} 个模型状态`)
|
|
|
|
|
+ selectedModels.value = []
|
|
|
|
|
+ batchStatus.value = ''
|
|
|
|
|
+ list_model()
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ ElMessage.error('批量操作失败')
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
model.asyncGetProvider(loading).then((ok: any) => {
|
|
model.asyncGetProvider(loading).then((ok: any) => {
|
|
|
active_provider.value = allObj
|
|
active_provider.value = allObj
|
|
@@ -237,5 +300,10 @@ onMounted(() => {
|
|
|
height: calc(var(--app-main-height));
|
|
height: calc(var(--app-main-height));
|
|
|
padding-right: 0 !important;
|
|
padding-right: 0 !important;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ .batch-operations {
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|