feat: 新增常规设置页面,支持关闭行为与语言切换

新增常规设置路由和页面,实现关闭行为(每次询问/保持选择)与应用语言的持久化配置;封装卡片式单选组组件复用在关闭弹窗和设置页;修改关闭逻辑,根据关闭行为决定是否显示确认弹窗,同步更新多语言文案和类型定义。
This commit is contained in:
Yuhang Wu
2026-10-16 11:38:00 +08:00
parent dbde020d7e
commit 5c1ce2fa5c
10 changed files with 286 additions and 89 deletions
+86
View File
@@ -0,0 +1,86 @@
<template>
<!-- 卡片式单选组:标题 + 描述纵向排列,选中时整卡高亮。关闭弹窗与「设置 - 常规」共用 -->
<a-radio-group v-model:value="model" class="card-radio-group" :disabled="disabled">
<a-radio
v-for="option in options"
:key="String(option.value)"
:value="option.value"
class="card-radio"
>
<span class="card-radio-title">{{ option.label }}</span>
<span v-if="option.description" class="card-radio-desc">{{ option.description }}</span>
</a-radio>
</a-radio-group>
</template>
<script setup lang="ts" generic="T extends string | number">
withDefaults(
defineProps<{
options: { value: T; label: string; description?: string }[]
disabled?: boolean
}>(),
{ disabled: false },
)
const model = defineModel<T>({ required: true })
</script>
<style scoped lang="scss">
.card-radio-group {
display: flex;
flex-direction: column;
gap: 10px;
width: 100%;
}
.card-radio {
display: flex;
align-items: flex-start;
width: 100%;
margin-inline-end: 0;
padding: 10px 12px;
border-radius: 10px;
border: 1px solid rgba(15, 23, 42, 0.1);
transition: border-color 0.2s ease, background-color 0.2s ease;
&:hover {
border-color: rgba(99, 102, 241, 0.5);
}
// 选中态高亮
&.ant-radio-wrapper-checked {
border-color: #6366f1;
background-color: rgba(99, 102, 241, 0.08);
}
:deep(.ant-radio) {
margin-top: 2px;
}
:deep(> span:last-child) {
display: flex;
flex-direction: column;
gap: 2px;
padding-inline-end: 0;
}
}
.dark .card-radio {
border-color: rgba(255, 255, 255, 0.12);
&.ant-radio-wrapper-checked {
border-color: #6366f1;
background-color: rgba(99, 102, 241, 0.16);
}
}
.card-radio-title {
font-weight: 500;
}
.card-radio-desc {
font-size: 12px;
line-height: 1.4;
opacity: 0.6;
}
</style>