datai/datai-scenes/datai-scene-salesforce/vue/center/components/EnvironmentTab.vue

331 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="environment-tab">
<el-card shadow="never" class="current-env-card">
<template #header>
<div class="card-header">
<span>当前环境</span>
<el-tag v-if="currentEnvironment" type="success">{{ currentEnvironment.environmentName }}</el-tag>
<el-tag v-else type="info">未设置</el-tag>
</div>
</template>
<el-descriptions v-if="currentEnvironment" :column="2" border>
<el-descriptions-item label="环境名称">
{{ currentEnvironment.environmentName }}
</el-descriptions-item>
<el-descriptions-item label="环境编码">
{{ currentEnvironment.environmentCode }}
</el-descriptions-item>
<el-descriptions-item label="环境描述" :span="2">
{{ currentEnvironment.description || '-' }}
</el-descriptions-item>
<el-descriptions-item label="是否激活">
<el-tag :type="currentEnvironment.isActive ? 'success' : 'danger'">
{{ currentEnvironment.isActive ? '是' : '否' }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="创建时间">
{{ parseTime(currentEnvironment.createTime) }}
</el-descriptions-item>
</el-descriptions>
<el-empty v-else description="暂无当前环境" />
</el-card>
<el-card shadow="never" class="mt10">
<template #header>
<div class="card-header">
<span>环境列表</span>
<el-button type="primary" icon="Plus" @click="handleAdd" v-hasPermi="['setting:environment:add']">新增环境</el-button>
</div>
</template>
<el-table v-loading="loading" :data="environmentList">
<el-table-column label="环境名称" align="center" prop="environmentName" />
<el-table-column label="环境编码" align="center" prop="environmentCode" />
<el-table-column label="环境描述" align="center" prop="description" show-overflow-tooltip />
<el-table-column label="是否激活" align="center" prop="isActive">
<template #default="scope">
<el-tag :type="scope.row.isActive ? 'success' : 'danger'">
{{ scope.row.isActive ? '是' : '否' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="240" fixed="right">
<template #default="scope">
<el-button
v-if="scope.row.isActive && (!currentEnvironment || currentEnvironment.id !== scope.row.id)"
link
type="primary"
icon="Switch"
@click="handleSwitch(scope.row)"
v-hasPermi="['setting:environment:switch']"
>
切换
</el-button>
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['setting:environment:edit']">修改</el-button>
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['setting:environment:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-dialog :title="title" v-model="open" width="600px" append-to-body>
<el-form ref="environmentRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="环境名称" prop="environmentName">
<el-input v-model="form.environmentName" placeholder="请输入环境名称" />
</el-form-item>
<el-form-item label="环境编码" prop="environmentCode">
<el-input v-model="form.environmentCode" placeholder="请输入环境编码dev、test、prod" />
</el-form-item>
<el-form-item label="环境描述" prop="description">
<el-input v-model="form.description" type="textarea" placeholder="请输入环境描述" />
</el-form-item>
<el-form-item label="是否激活" prop="isActive">
<el-switch v-model="form.isActive" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
<el-dialog title="切换环境" v-model="switchOpen" width="500px" append-to-body>
<el-form ref="switchRef" :model="switchForm" :rules="switchRules" label-width="100px">
<el-form-item label="目标环境" prop="environmentCode">
<el-input v-model="switchForm.environmentCode" disabled />
</el-form-item>
<el-form-item label="切换原因" prop="switchReason">
<el-input v-model="switchForm.switchReason" type="textarea" placeholder="请输入切换原因" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitSwitch">确 定</el-button>
<el-button @click="switchOpen = false"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { listEnvironment, getEnvironment, addEnvironment, updateEnvironment, delEnvironment, switchEnvironment, getCurrentEnvironment } from "@/api/setting/environment";
import { ElMessage, ElMessageBox } from 'element-plus';
const { proxy } = getCurrentInstance();
const emit = defineEmits(['environment-switched']);
const environmentList = ref([]);
const currentEnvironment = ref(null);
const loading = ref(true);
const open = ref(false);
const switchOpen = ref(false);
const title = ref("");
const form = ref({});
const switchForm = ref({
environmentCode: '',
switchReason: '手动切换'
});
const rules = {
environmentName: [
{ required: true, message: "环境名称不能为空", trigger: "blur" }
],
environmentCode: [
{ required: true, message: "环境编码不能为空", trigger: "blur" }
]
};
const switchRules = {
switchReason: [
{ required: true, message: "切换原因不能为空", trigger: "blur" }
]
};
const getList = async () => {
loading.value = true;
try {
const response = await listEnvironment({});
if (response.code === 200) {
environmentList.value = response.rows || [];
}
} catch (error) {
console.error('获取环境列表失败:', error);
} finally {
loading.value = false;
}
};
const loadCurrentEnvironment = async () => {
try {
const response = await getCurrentEnvironment();
if (response.code === 200) {
currentEnvironment.value = response.data;
}
} catch (error) {
console.error('获取当前环境失败:', error);
}
};
const handleAdd = () => {
reset();
open.value = true;
title.value = "新增环境";
};
const handleUpdate = async (row) => {
reset();
const id = row.id;
try {
const response = await getEnvironment(id);
if (response.code === 200) {
form.value = response.data;
open.value = true;
title.value = "修改环境";
}
} catch (error) {
console.error('获取环境详情失败:', error);
}
};
const handleDelete = async (row) => {
try {
await ElMessageBox.confirm('是否确认删除环境名称为"' + row.environmentName + '"的数据项?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
});
const response = await delEnvironment(row.id);
if (response.code === 200) {
getList();
loadCurrentEnvironment();
ElMessage.success("删除成功");
} else {
ElMessage.error(response.msg || '删除失败');
}
} catch (error) {
if (error !== 'cancel') {
ElMessage.error(error.msg || '删除失败');
}
}
};
const handleSwitch = (row) => {
switchForm.value.environmentCode = row.environmentCode;
switchForm.value.switchReason = '手动切换';
switchOpen.value = true;
};
const submitSwitch = async () => {
try {
const response = await switchEnvironment(switchForm.value);
if (response.code === 200) {
ElMessage.success(response.msg || '环境切换成功');
switchOpen.value = false;
loadCurrentEnvironment();
emit('environment-switched');
} else {
ElMessage.error(response.msg || '环境切换失败');
}
} catch (error) {
ElMessage.error(error.msg || '环境切换失败');
}
};
const submitForm = async () => {
proxy.$refs.environmentRef.validate(async (valid) => {
if (valid) {
try {
let response;
if (form.value.id != null) {
response = await updateEnvironment(form.value);
} else {
response = await addEnvironment(form.value);
}
if (response.code === 200) {
ElMessage.success("操作成功");
open.value = false;
getList();
loadCurrentEnvironment();
} else {
ElMessage.error(response.msg || '操作失败');
}
} catch (error) {
ElMessage.error(error.msg || '操作失败');
}
}
});
};
const cancel = () => {
open.value = false;
reset();
};
const reset = () => {
form.value = {
id: null,
environmentName: null,
environmentCode: null,
description: null,
isActive: true,
remark: null
};
proxy.resetForm("environmentRef");
};
onMounted(() => {
getList();
loadCurrentEnvironment();
});
</script>
<style scoped>
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
font-weight: bold;
}
.current-env-card {
background: #ffffff;
border: 1px solid #e4e7ed;
}
.current-env-card :deep(.el-card__header) {
background: #f5f7fa;
border-bottom: 1px solid #e4e7ed;
}
.current-env-card :deep(.el-card__body) {
padding: 20px;
}
.current-env-card :deep(.el-descriptions__label) {
background: #f5f7fa;
font-weight: 500;
}
.current-env-card :deep(.el-descriptions__content) {
background: #ffffff;
}
.mt10 {
margin-top: 10px;
}
</style>