mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-03-14 01:34:47 +08:00
fix: 修复容器部分 bug
This commit is contained in:
parent
0b79c91d6f
commit
cd89caa0c4
@ -500,7 +500,7 @@ func handleErr(install model.AppInstall, err error, out string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getAppFromRepo(downloadPath, version string) error {
|
func getAppFromRepo(downloadPath, version string) error {
|
||||||
downloadUrl := fmt.Sprintf(downloadPath)
|
downloadUrl := downloadPath
|
||||||
appDir := constant.AppResourceDir
|
appDir := constant.AppResourceDir
|
||||||
|
|
||||||
global.LOG.Infof("download file from %s", downloadUrl)
|
global.LOG.Infof("download file from %s", downloadUrl)
|
||||||
|
@ -18,6 +18,11 @@
|
|||||||
v-model="detailInfo"
|
v-model="detailInfo"
|
||||||
:readOnly="true"
|
:readOnly="true"
|
||||||
/>
|
/>
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button @click="codeVisiable = false">{{ $t('commons.button.cancel') }}</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
</el-drawer>
|
</el-drawer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -813,7 +813,7 @@ export default {
|
|||||||
|
|
||||||
monitor: 'Monitor',
|
monitor: 'Monitor',
|
||||||
enableMonitor: 'Enable',
|
enableMonitor: 'Enable',
|
||||||
storeDays: 'Expiration time (day)',
|
storeDays: 'Expiration days',
|
||||||
cleanMonitor: 'Clearing monitoring records',
|
cleanMonitor: 'Clearing monitoring records',
|
||||||
|
|
||||||
message: 'Message',
|
message: 'Message',
|
||||||
|
@ -818,7 +818,7 @@ export default {
|
|||||||
|
|
||||||
monitor: '监控',
|
monitor: '监控',
|
||||||
enableMonitor: '监控状态',
|
enableMonitor: '监控状态',
|
||||||
storeDays: 'Retention days (days)',
|
storeDays: '保存天数',
|
||||||
cleanMonitor: '清空监控记录',
|
cleanMonitor: '清空监控记录',
|
||||||
|
|
||||||
message: '通知',
|
message: '通知',
|
||||||
|
@ -59,8 +59,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<span class="dialog-footer">
|
<span class="dialog-footer">
|
||||||
<el-button @click="drawerVisiable = false">{{ $t('commons.button.cancel') }}</el-button>
|
<el-button :disabled="loading" @click="drawerVisiable = false">
|
||||||
<el-button type="primary" @click="onSubmit(formRef)">
|
{{ $t('commons.button.cancel') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button type="primary" :disabled="loading" @click="onSubmit(formRef)">
|
||||||
{{ $t('commons.button.confirm') }}
|
{{ $t('commons.button.confirm') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</span>
|
</span>
|
||||||
|
@ -101,7 +101,6 @@ import { Container } from '@/api/interface/container';
|
|||||||
import { useDeleteData } from '@/hooks/use-delete-data';
|
import { useDeleteData } from '@/hooks/use-delete-data';
|
||||||
import { LoadFile } from '@/api/modules/files';
|
import { LoadFile } from '@/api/modules/files';
|
||||||
import router from '@/routers';
|
import router from '@/routers';
|
||||||
import { MsgSuccess } from '@/utils/message';
|
|
||||||
|
|
||||||
const data = ref();
|
const data = ref();
|
||||||
const selects = ref<any>([]);
|
const selects = ref<any>([]);
|
||||||
@ -175,7 +174,6 @@ const onDelete = async (row: Container.ComposeInfo) => {
|
|||||||
};
|
};
|
||||||
await useDeleteData(composeOperator, param, 'commons.msg.delete');
|
await useDeleteData(composeOperator, param, 'commons.msg.delete');
|
||||||
search();
|
search();
|
||||||
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const dialogEditRef = ref();
|
const dialogEditRef = ref();
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
<el-form-item v-else :rules="Rules.requiredSelect" prop="dockerfile">
|
<el-form-item v-else :rules="Rules.requiredSelect" prop="dockerfile">
|
||||||
<el-input clearable v-model="form.dockerfile">
|
<el-input clearable v-model="form.dockerfile">
|
||||||
<template #prepend>
|
<template #prepend>
|
||||||
<FileList @choose="loadBuildDir" :dir="true"></FileList>
|
<FileList @choose="loadBuildDir"></FileList>
|
||||||
</template>
|
</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
@ -6,12 +6,17 @@
|
|||||||
<el-form :model="deleteForm" label-position="top">
|
<el-form :model="deleteForm" label-position="top">
|
||||||
<el-row type="flex" justify="center">
|
<el-row type="flex" justify="center">
|
||||||
<el-col :span="22">
|
<el-col :span="22">
|
||||||
<el-form-item :label="$t('container.imageDelete')" prop="tagName">
|
<el-form-item :label="$t('container.tag')" prop="tagName">
|
||||||
<el-checkbox v-model="isByID" :label="deleteForm.id" @change="changeDeleteType" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item :label="$t('container.imageDeleteTag')" prop="tagName">
|
|
||||||
<el-checkbox-group v-model="deleteForm.deleteTags">
|
<el-checkbox-group v-model="deleteForm.deleteTags">
|
||||||
<el-checkbox v-for="item in deleteForm.tags" :key="item" :value="item" :label="item" />
|
<div>
|
||||||
|
<el-checkbox
|
||||||
|
style="width: 100%"
|
||||||
|
v-for="item in deleteForm.tags"
|
||||||
|
:key="item"
|
||||||
|
:value="item"
|
||||||
|
:label="item"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</el-checkbox-group>
|
</el-checkbox-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@ -35,21 +40,16 @@ import { useDeleteData } from '@/hooks/use-delete-data';
|
|||||||
import DrawerHeader from '@/components/drawer-header/index.vue';
|
import DrawerHeader from '@/components/drawer-header/index.vue';
|
||||||
|
|
||||||
const deleteVisiable = ref(false);
|
const deleteVisiable = ref(false);
|
||||||
const isByID = ref();
|
|
||||||
const deleteForm = reactive({
|
const deleteForm = reactive({
|
||||||
id: '',
|
|
||||||
tags: [] as Array<string>,
|
tags: [] as Array<string>,
|
||||||
deleteTags: [] as Array<string>,
|
deleteTags: [] as Array<string>,
|
||||||
});
|
});
|
||||||
|
|
||||||
interface DialogProps {
|
interface DialogProps {
|
||||||
id: string;
|
|
||||||
tags: Array<string>;
|
tags: Array<string>;
|
||||||
}
|
}
|
||||||
const acceptParams = (params: DialogProps) => {
|
const acceptParams = (params: DialogProps) => {
|
||||||
isByID.value = false;
|
|
||||||
deleteVisiable.value = true;
|
deleteVisiable.value = true;
|
||||||
deleteForm.id = params.id.replaceAll('sha256:', '').substring(0, 12);
|
|
||||||
deleteForm.deleteTags = [];
|
deleteForm.deleteTags = [];
|
||||||
deleteForm.tags = params.tags;
|
deleteForm.tags = params.tags;
|
||||||
};
|
};
|
||||||
@ -58,20 +58,10 @@ const handleClose = () => {
|
|||||||
};
|
};
|
||||||
const emit = defineEmits<{ (e: 'search'): void }>();
|
const emit = defineEmits<{ (e: 'search'): void }>();
|
||||||
|
|
||||||
const changeDeleteType = () => {
|
|
||||||
if (isByID.value) {
|
|
||||||
deleteForm.deleteTags = deleteForm.tags;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const batchDelete = async () => {
|
const batchDelete = async () => {
|
||||||
let names: Array<string> = [];
|
let names: Array<string> = [];
|
||||||
if (!isByID.value) {
|
for (const item of deleteForm.deleteTags) {
|
||||||
for (const item of deleteForm.deleteTags) {
|
names.push(item);
|
||||||
names.push(item);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
names.push(deleteForm.id);
|
|
||||||
}
|
}
|
||||||
await useDeleteData(imageRemove, { names: names }, 'commons.msg.delete');
|
await useDeleteData(imageRemove, { names: names }, 'commons.msg.delete');
|
||||||
deleteVisiable.value = false;
|
deleteVisiable.value = false;
|
||||||
|
@ -49,11 +49,12 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column :label="$t('container.size')" prop="size" min-width="70" fix />
|
<el-table-column :label="$t('container.size')" prop="size" min-width="70" fix />
|
||||||
<el-table-column :label="$t('commons.table.createdAt')" min-width="80" fix>
|
<el-table-column
|
||||||
<template #default="{ row }">
|
prop="createdAt"
|
||||||
{{ dateFormatSimple(row.createdAt) }}
|
min-width="90"
|
||||||
</template>
|
:label="$t('commons.table.date')"
|
||||||
</el-table-column>
|
:formatter="dateFormat"
|
||||||
|
/>
|
||||||
<fu-table-operations
|
<fu-table-operations
|
||||||
width="200px"
|
width="200px"
|
||||||
:ellipsis="10"
|
:ellipsis="10"
|
||||||
@ -78,7 +79,7 @@
|
|||||||
import ComplexTable from '@/components/complex-table/index.vue';
|
import ComplexTable from '@/components/complex-table/index.vue';
|
||||||
import TableSetting from '@/components/table-setting/index.vue';
|
import TableSetting from '@/components/table-setting/index.vue';
|
||||||
import { reactive, onMounted, ref } from 'vue';
|
import { reactive, onMounted, ref } from 'vue';
|
||||||
import { dateFormatSimple } from '@/utils/util';
|
import { dateFormat } from '@/utils/util';
|
||||||
import { Container } from '@/api/interface/container';
|
import { Container } from '@/api/interface/container';
|
||||||
import LayoutContent from '@/layout/layout-content.vue';
|
import LayoutContent from '@/layout/layout-content.vue';
|
||||||
import Pull from '@/views/container/image/pull/index.vue';
|
import Pull from '@/views/container/image/pull/index.vue';
|
||||||
@ -88,9 +89,10 @@ import Save from '@/views/container/image/save/index.vue';
|
|||||||
import Load from '@/views/container/image/load/index.vue';
|
import Load from '@/views/container/image/load/index.vue';
|
||||||
import Build from '@/views/container/image/build/index.vue';
|
import Build from '@/views/container/image/build/index.vue';
|
||||||
import Delete from '@/views/container/image/delete/index.vue';
|
import Delete from '@/views/container/image/delete/index.vue';
|
||||||
import { searchImage, listImageRepo, loadDockerStatus } from '@/api/modules/container';
|
import { searchImage, listImageRepo, loadDockerStatus, imageRemove } from '@/api/modules/container';
|
||||||
import i18n from '@/lang';
|
import i18n from '@/lang';
|
||||||
import router from '@/routers';
|
import router from '@/routers';
|
||||||
|
import { useDeleteData } from '@/hooks/use-delete-data';
|
||||||
|
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
|
|
||||||
@ -157,7 +159,7 @@ const onOpenload = () => {
|
|||||||
|
|
||||||
const buttons = [
|
const buttons = [
|
||||||
{
|
{
|
||||||
label: 'Tag',
|
label: i18n.global.t('container.tag'),
|
||||||
click: (row: Container.ImageInfo) => {
|
click: (row: Container.ImageInfo) => {
|
||||||
let params = {
|
let params = {
|
||||||
repos: repos.value,
|
repos: repos.value,
|
||||||
@ -188,7 +190,11 @@ const buttons = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: i18n.global.t('commons.button.delete'),
|
label: i18n.global.t('commons.button.delete'),
|
||||||
click: (row: Container.ImageInfo) => {
|
click: async (row: Container.ImageInfo) => {
|
||||||
|
if (row.tags.length <= 1) {
|
||||||
|
await useDeleteData(imageRemove, { names: [row.id] }, 'commons.msg.delete');
|
||||||
|
return;
|
||||||
|
}
|
||||||
let params = {
|
let params = {
|
||||||
id: row.id,
|
id: row.id,
|
||||||
tags: row.tags,
|
tags: row.tags,
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
<el-row type="flex" justify="center">
|
<el-row type="flex" justify="center">
|
||||||
<el-col :span="22">
|
<el-col :span="22">
|
||||||
<el-form ref="formRef" label-position="top" :model="form" label-width="80px">
|
<el-form ref="formRef" label-position="top" :model="form" label-width="80px">
|
||||||
<el-form-item label="Tag" :rules="Rules.requiredSelect" prop="tagName">
|
<el-form-item :label="$t('container.tag')" :rules="Rules.requiredSelect" prop="tagName">
|
||||||
<el-select filterable v-model="form.tagName">
|
<el-select filterable v-model="form.tagName">
|
||||||
<el-option v-for="item in form.tags" :key="item" :value="item" :label="item" />
|
<el-option v-for="item in form.tags" :key="item" :value="item" :label="item" />
|
||||||
</el-select>
|
</el-select>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<el-form v-loading="loading" label-position="top" ref="formRef" :model="form" label-width="80px">
|
<el-form v-loading="loading" label-position="top" ref="formRef" :model="form" label-width="80px">
|
||||||
<el-row type="flex" justify="center">
|
<el-row type="flex" justify="center">
|
||||||
<el-col :span="22">
|
<el-col :span="22">
|
||||||
<el-form-item label="Tag" :rules="Rules.requiredSelect" prop="tagName">
|
<el-form-item :label="$t('container.tag')" :rules="Rules.requiredSelect" prop="tagName">
|
||||||
<el-select filterable v-model="form.tagName">
|
<el-select filterable v-model="form.tagName">
|
||||||
<el-option
|
<el-option
|
||||||
:disabled="item.indexOf(':<none>') !== -1"
|
:disabled="item.indexOf(':<none>') !== -1"
|
||||||
|
@ -59,11 +59,13 @@
|
|||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column :label="$t('commons.table.createdAt')" min-width="80" fix>
|
<el-table-column
|
||||||
<template #default="{ row }">
|
prop="createdAt"
|
||||||
{{ dateFormatSimple(row.createdAt) }}
|
:label="$t('commons.table.createdAt')"
|
||||||
</template>
|
min-width="80"
|
||||||
</el-table-column>
|
fix
|
||||||
|
:formatter="dateFormat"
|
||||||
|
/>
|
||||||
<fu-table-operations :buttons="buttons" :label="$t('commons.table.operate')" />
|
<fu-table-operations :buttons="buttons" :label="$t('commons.table.operate')" />
|
||||||
</ComplexTable>
|
</ComplexTable>
|
||||||
</template>
|
</template>
|
||||||
@ -80,7 +82,7 @@ import TableSetting from '@/components/table-setting/index.vue';
|
|||||||
import OperatorDialog from '@/views/container/repo/operator/index.vue';
|
import OperatorDialog from '@/views/container/repo/operator/index.vue';
|
||||||
import DeleteDialog from '@/views/container/repo/delete/index.vue';
|
import DeleteDialog from '@/views/container/repo/delete/index.vue';
|
||||||
import { reactive, onMounted, ref } from 'vue';
|
import { reactive, onMounted, ref } from 'vue';
|
||||||
import { dateFormatSimple } from '@/utils/util';
|
import { dateFormat } from '@/utils/util';
|
||||||
import { Container } from '@/api/interface/container';
|
import { Container } from '@/api/interface/container';
|
||||||
import { deleteImageRepo, loadDockerStatus, searchImageRepo } from '@/api/modules/container';
|
import { deleteImageRepo, loadDockerStatus, searchImageRepo } from '@/api/modules/container';
|
||||||
import i18n from '@/lang';
|
import i18n from '@/lang';
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<template #header>
|
<template #header>
|
||||||
<DrawerHeader :header="$t('database.requirepass')" :back="handleClose" />
|
<DrawerHeader :header="$t('database.requirepass')" :back="handleClose" />
|
||||||
</template>
|
</template>
|
||||||
<el-form v-loading="loading" ref="formRef" :model="form" label-width="80px">
|
<el-form v-loading="loading" ref="formRef" :model="form" label-position="top">
|
||||||
<el-row type="flex" justify="center">
|
<el-row type="flex" justify="center">
|
||||||
<el-col :span="22">
|
<el-col :span="22">
|
||||||
<el-form-item :label="$t('database.requirepass')" :rules="Rules.requiredInput" prop="password">
|
<el-form-item :label="$t('database.requirepass')" :rules="Rules.requiredInput" prop="password">
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
{{ s3Data.bucket }}
|
{{ s3Data.bucket }}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('commons.table.createdAt')">
|
<el-form-item :label="$t('commons.table.createdAt')">
|
||||||
{{ dateFormatSimple(s3Data.createdAt) }}
|
{{ dateFormat(0, 0, s3Data.createdAt) }}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
<el-alert v-else center class="alert" style="height: 167px" :closable="false">
|
<el-alert v-else center class="alert" style="height: 167px" :closable="false">
|
||||||
@ -96,7 +96,7 @@
|
|||||||
{{ ossData.bucket }}
|
{{ ossData.bucket }}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('commons.table.createdAt')">
|
<el-form-item :label="$t('commons.table.createdAt')">
|
||||||
{{ dateFormatSimple(ossData.createdAt) }}
|
{{ dateFormat(0, 0, ossData.createdAt) }}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
<el-alert v-else center class="alert" style="height: 167px" :closable="false">
|
<el-alert v-else center class="alert" style="height: 167px" :closable="false">
|
||||||
@ -133,7 +133,7 @@
|
|||||||
{{ minioData.bucket }}
|
{{ minioData.bucket }}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('commons.table.createdAt')">
|
<el-form-item :label="$t('commons.table.createdAt')">
|
||||||
{{ dateFormatSimple(minioData.createdAt) }}
|
{{ dateFormat(0, 0, minioData.createdAt) }}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
<el-alert v-else center class="alert" style="height: 167px" :closable="false">
|
<el-alert v-else center class="alert" style="height: 167px" :closable="false">
|
||||||
@ -172,7 +172,7 @@
|
|||||||
{{ sftpData.bucket }}
|
{{ sftpData.bucket }}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('commons.table.createdAt')">
|
<el-form-item :label="$t('commons.table.createdAt')">
|
||||||
{{ dateFormatSimple(sftpData.createdAt) }}
|
{{ dateFormat(0, 0, sftpData.createdAt) }}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
<el-alert v-else center class="alert" style="height: 167px" :closable="false">
|
<el-alert v-else center class="alert" style="height: 167px" :closable="false">
|
||||||
@ -188,7 +188,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { dateFormatSimple, dateFormat } from '@/utils/util';
|
import { dateFormat } from '@/utils/util';
|
||||||
import { onMounted, ref } from 'vue';
|
import { onMounted, ref } from 'vue';
|
||||||
import LayoutContent from '@/layout/layout-content.vue';
|
import LayoutContent from '@/layout/layout-content.vue';
|
||||||
import { getBackupList, deleteBackup } from '@/api/modules/setting';
|
import { getBackupList, deleteBackup } from '@/api/modules/setting';
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div v-loading="loading">
|
||||||
<LayoutContent v-loading="loading" :title="$t('setting.panel')" :divider="true">
|
<LayoutContent :title="$t('setting.panel')" :divider="true">
|
||||||
<template #main>
|
<template #main>
|
||||||
<el-form :model="form" ref="panelFormRef" label-position="left" v-loading="loading" label-width="160px">
|
<el-form :model="form" ref="panelFormRef" label-position="left" label-width="160px">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="1"><br /></el-col>
|
<el-col :span="1"><br /></el-col>
|
||||||
<el-col :span="10">
|
<el-col :span="10">
|
||||||
@ -195,6 +195,7 @@ const onSave = async (formEl: FormInstance | undefined, key: string, val: any) =
|
|||||||
break;
|
break;
|
||||||
case 'SessionTimeout':
|
case 'SessionTimeout':
|
||||||
if (Number(val) < 300) {
|
if (Number(val) < 300) {
|
||||||
|
loading.value = false;
|
||||||
MsgError(i18n.t('setting.sessionTimeoutError'));
|
MsgError(i18n.t('setting.sessionTimeoutError'));
|
||||||
search();
|
search();
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user