Leeflour's picture
Upload 197 files
d0dd276 verified
<script setup>
import { ref } from 'vue'
import BasicConfig from './BasicConfig.vue'
import FeaturesConfig from './FeaturesConfig.vue'
import VertexConfig from './VertexConfig.vue'
const basicConfigRef = ref(null)
const featuresConfigRef = ref(null)
const managementPassword = ref('')
const saveMessage = ref('')
const messageType = ref('') // 'success' or 'error'
async function handleSaveAllConfigs() {
saveMessage.value = ''
messageType.value = ''
if (!managementPassword.value) {
saveMessage.value = '请输入管理密码'
messageType.value = 'error'
return
}
const results = []
let allSucceeded = true
if (basicConfigRef.value) {
const result = await basicConfigRef.value.saveComponentConfigs(managementPassword.value)
results.push(result)
if (!result.success) {
allSucceeded = false
}
}
if (featuresConfigRef.value) {
const result = await featuresConfigRef.value.saveComponentConfigs(managementPassword.value)
results.push(result)
if (!result.success) {
allSucceeded = false
}
}
const messages = results.map(r => r.message).filter(m => m).join('\n');
saveMessage.value = messages || (allSucceeded ? '所有配置已成功保存。' : '部分配置保存失败。');
messageType.value = allSucceeded ? 'success' : 'error';
// 清空密码
managementPassword.value = ''
}
</script>
<template>
<div class="config-section">
<BasicConfig ref="basicConfigRef" />
<FeaturesConfig ref="featuresConfigRef" />
<div class="shared-save-area">
<div class="password-input-group">
<input
type="password"
v-model="managementPassword"
placeholder="请输入管理密码"
class="management-password-input"
/>
</div>
<button @click="handleSaveAllConfigs" class="save-all-button">保存所有配置</button>
</div>
<div v-if="saveMessage" :class="['save-message', messageType]">
<p v-for="(line, index) in saveMessage.split('\n')" :key="index">{{ line }}</p>
</div>
<VertexConfig />
</div>
</template>
<style scoped>
.config-section {
padding: 20px;
background-color: var(--color-background);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-md);
max-width: 800px;
margin: 20px auto;
}
.shared-save-area {
display: flex;
align-items: center; /* 垂直居中对齐 */
gap: 10px; /* 输入框和按钮之间的间距 */
padding: 15px;
background-color: var(--stats-item-bg);
border-radius: var(--radius-md);
margin-top: 20px;
margin-bottom: 15px;
border: 1px solid var(--card-border);
}
.password-input-group {
flex-grow: 1; /* 让密码输入框占据更多空间 */
}
.management-password-input {
width: 100%;
padding: 10px 12px;
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
background-color: var(--color-input-bg);
color: var(--color-text);
font-size: 14px;
}
.management-password-input:focus {
outline: none;
border-color: var(--button-primary);
box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.2);
}
.save-all-button {
padding: 10px 20px;
background: var(--gradient-primary);
color: white;
border: none;
border-radius: var(--radius-md);
cursor: pointer;
font-weight: 500;
font-size: 14px;
transition: all 0.3s ease;
white-space: nowrap; /* 防止按钮文字换行 */
}
.save-all-button:hover {
opacity: 0.9;
box-shadow: var(--shadow-sm);
}
.save-message {
margin-top: 10px;
padding: 10px;
border-radius: var(--radius-md);
font-size: 14px;
text-align: left;
white-space: pre-wrap; /* 保留换行符 */
}
.save-message.success {
background-color: rgba(74, 222, 128, 0.1);
color: #34d399;
border: 1px solid rgba(74, 222, 128, 0.3);
}
.save-message.error {
background-color: rgba(248, 113, 113, 0.1);
color: #f87171;
border: 1px solid rgba(248, 113, 113, 0.3);
}
@media (max-width: 768px) {
.config-section {
padding: 15px;
}
.shared-save-area {
flex-direction: column; /* 在小屏幕上堆叠 */
align-items: stretch; /* 在小屏幕上拉伸项目以填充宽度 */
}
.save-all-button {
width: 100%; /* 按钮宽度也100% */
}
}
</style>