fix: 优化设置页部分显示效果
This commit is contained in:
@@ -1,19 +1,13 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
const {
|
const props = defineProps<{
|
||||||
goToLogs,
|
|
||||||
openDevTools,
|
|
||||||
mirrorConfigStatus,
|
|
||||||
refreshingConfig,
|
|
||||||
refreshMirrorConfig,
|
|
||||||
goToMirrorTest
|
|
||||||
} = defineProps<{
|
|
||||||
goToLogs: () => void
|
goToLogs: () => void
|
||||||
openDevTools: () => void
|
openDevTools: () => void
|
||||||
mirrorConfigStatus: { isUsingCloudConfig: boolean; version: string; lastUpdated: string; source: 'cloud' | 'fallback' }
|
|
||||||
refreshingConfig: boolean
|
refreshingConfig: boolean
|
||||||
refreshMirrorConfig: () => Promise<void>
|
refreshMirrorConfig: () => Promise<void>
|
||||||
goToMirrorTest: () => void
|
goToMirrorTest: () => void
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
|
const { goToLogs, openDevTools, refreshingConfig, refreshMirrorConfig, goToMirrorTest } = props
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
|
|||||||
@@ -2,19 +2,23 @@
|
|||||||
import { QuestionCircleOutlined } from '@ant-design/icons-vue'
|
import { QuestionCircleOutlined } from '@ant-design/icons-vue'
|
||||||
import type { SettingsData } from '@/types/settings'
|
import type { SettingsData } from '@/types/settings'
|
||||||
|
|
||||||
const { settings, sendTaskResultTimeOptions, handleSettingChange, testNotify, testingNotify } = defineProps<{
|
const props = defineProps<{
|
||||||
settings: SettingsData
|
settings: SettingsData
|
||||||
sendTaskResultTimeOptions: { label: string; value: string }[]
|
sendTaskResultTimeOptions: { label: string; value: string }[]
|
||||||
handleSettingChange: (category: keyof SettingsData, key: string, value: any) => Promise<void>
|
handleSettingChange: (category: keyof SettingsData, key: string, value: any) => Promise<void>
|
||||||
testNotify: () => Promise<void>
|
testNotify: () => Promise<void>
|
||||||
testingNotify: boolean
|
testingNotify: boolean
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
|
const { settings, sendTaskResultTimeOptions, handleSettingChange, testNotify, testingNotify } = props
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div class="form-section">
|
<div class="form-section">
|
||||||
<div class="section-header">
|
<div class="section-header">
|
||||||
<h3>通知内容</h3>
|
<h3>通知内容</h3>
|
||||||
|
<a-button type="primary" :loading="testingNotify" @click="testNotify" size="small" class="section-update-button primary-style">发送测试通知</a-button>
|
||||||
</div>
|
</div>
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :span="8">
|
<a-col :span="8">
|
||||||
@@ -319,17 +323,73 @@ const { settings, sendTaskResultTimeOptions, handleSettingChange, testNotify, te
|
|||||||
</a-row>
|
</a-row>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-section">
|
<!-- 测试按钮已移至“通知内容”标题右侧 -->
|
||||||
<div class="section-header">
|
|
||||||
<h3>通知测试</h3>
|
|
||||||
</div>
|
|
||||||
<a-row :gutter="24">
|
|
||||||
<a-col :span="24">
|
|
||||||
<a-space>
|
|
||||||
<a-button type="primary" :loading="testingNotify" @click="testNotify">发送测试通知</a-button>
|
|
||||||
</a-space>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/* Header layout */
|
||||||
|
.section-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Doc link and header action parity */
|
||||||
|
.section-header .section-update-button {
|
||||||
|
/* Apply doc-link visual tokens to the local update button only.
|
||||||
|
Do NOT touch global .section-doc-link so the real doc button remains unchanged. */
|
||||||
|
color: var(--ant-color-primary) !important;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
padding: 4px 8px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid var(--ant-color-primary);
|
||||||
|
transition: all 0.18s ease;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-header .section-update-button:hover {
|
||||||
|
color: var(--ant-color-primary-hover) !important;
|
||||||
|
background-color: var(--ant-color-primary-bg);
|
||||||
|
border-color: var(--ant-color-primary-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Primary gradient style for the update button */
|
||||||
|
|
||||||
|
.section-header .section-update-button.primary-style {
|
||||||
|
/* Keep gradient but match doc-link height/rounded corners for parity */
|
||||||
|
height: 32px;
|
||||||
|
padding: 4px 8px; /* same vertical padding as doc-link */
|
||||||
|
font-size: 14px; /* same as doc-link for visual parity */
|
||||||
|
font-weight: 500;
|
||||||
|
border-radius: 4px; /* same radius as doc-link */
|
||||||
|
box-shadow: 0 2px 8px rgba(22, 119, 255, 0.18);
|
||||||
|
transition: transform 0.16s ease, box-shadow 0.16s ease;
|
||||||
|
background: linear-gradient(135deg, var(--ant-color-primary), var(--ant-color-primary-hover)) !important;
|
||||||
|
border: 1px solid var(--ant-color-primary) !important; /* subtle border to match doc-link rhythm */
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-header .section-update-button.primary-style:hover {
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 6px 20px rgba(22, 119, 255, 0.22);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 640px) {
|
||||||
|
.section-header {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
.section-header .section-update-button {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ const { version, backendUpdateInfo } = defineProps<{
|
|||||||
<div class="section-header">
|
<div class="section-header">
|
||||||
<h3>项目链接</h3>
|
<h3>项目链接</h3>
|
||||||
</div>
|
</div>
|
||||||
<a-row :gutter="24">
|
<div class="link-grid">
|
||||||
<a-col :span="8">
|
<div class="link-item">
|
||||||
<div class="link-card">
|
<div class="link-card">
|
||||||
<div class="link-icon"><HomeOutlined /></div>
|
<div class="link-icon"><HomeOutlined /></div>
|
||||||
<div class="link-content">
|
<div class="link-content">
|
||||||
@@ -23,18 +23,18 @@ const { version, backendUpdateInfo } = defineProps<{
|
|||||||
<a href="https://auto-mas.top" target="_blank" class="link-button">访问官网</a>
|
<a href="https://auto-mas.top" target="_blank" class="link-button">访问官网</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a-col>
|
</div>
|
||||||
<a-col :span="8">
|
<div class="link-item">
|
||||||
<div class="link-card">
|
<div class="link-card">
|
||||||
<div class="link-icon"><GithubOutlined /></div>
|
<div class="link-icon"><GithubOutlined /></div>
|
||||||
<div class="link-content">
|
<div class="link-content">
|
||||||
<h4>GitHub仓库</h4>
|
<h4>GitHub仓库</h4>
|
||||||
<p>查看源代码、提交issue和贡献</p>
|
<p>查看源代码、提交issue和捐赠</p>
|
||||||
<a href="https://github.com/AUTO-MAS-Project/AUTO-MAS" target="_blank" class="link-button">访问仓库</a>
|
<a href="https://github.com/AUTO-MAS-Project/AUTO-MAS" target="_blank" class="link-button">访问仓库</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a-col>
|
</div>
|
||||||
<a-col :span="8">
|
<div class="link-item">
|
||||||
<div class="link-card">
|
<div class="link-card">
|
||||||
<div class="link-icon"><QqOutlined /></div>
|
<div class="link-icon"><QqOutlined /></div>
|
||||||
<div class="link-content">
|
<div class="link-content">
|
||||||
@@ -43,8 +43,8 @@ const { version, backendUpdateInfo } = defineProps<{
|
|||||||
<a href="https://qm.qq.com/q/bd9fISNoME" target="_blank" class="link-button">加入群聊</a>
|
<a href="https://qm.qq.com/q/bd9fISNoME" target="_blank" class="link-button">加入群聊</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a-col>
|
</div>
|
||||||
</a-row>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-section">
|
<div class="form-section">
|
||||||
@@ -74,3 +74,30 @@ const { version, backendUpdateInfo } = defineProps<{
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/* Responsive grid for link cards: ensures cards expand to fill available width */
|
||||||
|
.link-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
|
||||||
|
gap: 24px;
|
||||||
|
align-items: stretch;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-item {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure link-card fills its grid cell */
|
||||||
|
.link-card {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-content {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -34,11 +34,17 @@ const version = (import.meta as any).env?.VITE_APP_VERSION || '获取版本失
|
|||||||
const backendUpdateInfo = ref<VersionOut | null>(null)
|
const backendUpdateInfo = ref<VersionOut | null>(null)
|
||||||
|
|
||||||
// 镜像配置状态
|
// 镜像配置状态
|
||||||
const mirrorConfigStatus = ref({
|
type MirrorConfigStatus = {
|
||||||
|
isUsingCloudConfig: boolean
|
||||||
|
version?: string
|
||||||
|
lastUpdated?: string
|
||||||
|
source: 'cloud' | 'fallback'
|
||||||
|
}
|
||||||
|
const mirrorConfigStatus = ref<MirrorConfigStatus>({
|
||||||
isUsingCloudConfig: false,
|
isUsingCloudConfig: false,
|
||||||
version: '',
|
version: undefined,
|
||||||
lastUpdated: '',
|
lastUpdated: undefined,
|
||||||
source: 'fallback' as 'cloud' | 'fallback',
|
source: 'fallback',
|
||||||
})
|
})
|
||||||
const refreshingConfig = ref(false)
|
const refreshingConfig = ref(false)
|
||||||
|
|
||||||
@@ -324,9 +330,12 @@ onMounted(() => {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
/* 统一样式,使用 :deep 作用到子组件内部 */
|
/* 统一样式,使用 :deep 作用到子组件内部 */
|
||||||
.settings-container {
|
.settings-container {
|
||||||
max-width: 1200px;
|
/* Allow the settings page to expand with the window width */
|
||||||
margin: 0 auto;
|
width: 100%;
|
||||||
|
max-width: none;
|
||||||
|
margin: 0;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
.settings-header {
|
.settings-header {
|
||||||
margin-bottom: 24px;
|
margin-bottom: 24px;
|
||||||
@@ -340,6 +349,7 @@ onMounted(() => {
|
|||||||
.settings-content {
|
.settings-content {
|
||||||
background: var(--ant-color-bg-container);
|
background: var(--ant-color-bg-container);
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
.settings-tabs {
|
.settings-tabs {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@@ -356,6 +366,7 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
:deep(.tab-content) {
|
:deep(.tab-content) {
|
||||||
padding: 24px;
|
padding: 24px;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
:deep(.form-section) {
|
:deep(.form-section) {
|
||||||
margin-bottom: 32px;
|
margin-bottom: 32px;
|
||||||
@@ -536,6 +547,7 @@ onMounted(() => {
|
|||||||
color: #fff !important;
|
color: #fff !important;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
/* link-grid styles moved into TabOthers.vue (scoped) */
|
||||||
:deep(.info-item) {
|
:deep(.info-item) {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|||||||
Reference in New Issue
Block a user