UnisKB/ui/src/views/theme/index.vue

194 lines
6.2 KiB
Vue
Raw Normal View History

2024-07-09 09:50:37 +00:00
<template>
2024-07-12 09:13:11 +00:00
<div class="theme-setting">
<h4 class="p-16-24">外观设置</h4>
2024-07-11 10:13:52 +00:00
<el-scrollbar>
2024-07-12 09:13:11 +00:00
<div class="p-24 pt-0">
<div class="app-card p-24">
<h5 class="mb-16">平台显示主题</h5>
<el-radio-group
v-model="themeForm.theme"
class="app-radio-button-group"
2024-07-12 11:04:08 +00:00
@change="changeTheme"
2024-07-12 09:13:11 +00:00
>
<template v-for="(item, index) in themeList" :key="index">
<el-radio-button :label="item.label" :value="item.value" />
</template>
2024-07-11 10:13:52 +00:00
</el-radio-group>
</div>
2024-07-12 09:13:11 +00:00
<div class="app-card p-24 mt-16">
<h5 class="mb-16">平台登陆设置</h5>
<el-card shadow="never" class="layout-bg">
<div class="flex-between">
<h5 class="mb-16">页面预览</h5>
<el-button type="primary" link> 恢复默认 </el-button>
2024-07-11 10:13:52 +00:00
</div>
2024-07-12 09:13:11 +00:00
<div class="theme-preview">
2024-07-12 11:04:08 +00:00
<el-row :gutter="8">
2024-07-12 09:13:11 +00:00
<el-col :span="16">
<LoginPreview />
</el-col>
<el-col :span="8">
<div class="theme-form">
<el-card shadow="never" class="mb-8">
<div class="flex-between mb-8">
<span class="lighter">网站 Logo</span>
<el-button size="small"> 替换图片 </el-button>
</div>
<el-text type="info" size="small"
>顶部网站显示的 Logo建议尺寸 48 x 48支持 JPGPNGSVG大小不超过
200KB</el-text
>
</el-card>
<el-card shadow="never" class="mb-8">
<div class="flex-between mb-8">
<span class="lighter">登录 Logo</span>
<el-button size="small"> 替换图片 </el-button>
</div>
<el-text type="info" size="small"
>登录页面右侧 Logo建议尺寸 204*52支持 JPGPNGSVG大小不超过
200KB</el-text
>
</el-card>
<el-card shadow="never" class="mb-8">
<div class="flex-between mb-8">
<span class="lighter">登录背景图</span>
<el-button size="small"> 替换图片 </el-button>
</div>
<el-text type="info" size="small">
左侧背景图矢量图建议尺寸 576*900位图建议尺寸1152*1800支持
JPGPNGSVG大小不超过 5M
</el-text>
</el-card>
<el-form
ref="themeFormRef"
:model="themeForm"
label-position="top"
require-asterisk-position="right"
:rules="rules"
@submit.prevent
>
<el-form-item label="网站名称" prop="title">
<el-input v-model="themeForm.title" placeholder="请输入网站名称">
</el-input>
<el-text type="info"> 显示在网页 Tab 的平台名称 </el-text>
</el-form-item>
<el-form-item label="欢迎语" prop="slogan">
<el-input v-model="themeForm.slogan" placeholder="请输入欢迎语"> </el-input>
<el-text type="info"> 产品 Logo 下的 欢迎语 </el-text>
</el-form-item>
</el-form>
</div></el-col
>
</el-row>
2024-07-11 10:13:52 +00:00
</div>
2024-07-12 09:13:11 +00:00
<div class="mt-16">
<el-text type="info">默认为 MaxKB 登录界面支持自定义设置</el-text>
2024-07-11 10:13:52 +00:00
</div>
2024-07-12 09:13:11 +00:00
</el-card>
2024-07-11 10:13:52 +00:00
</div>
</div>
</el-scrollbar>
2024-07-12 09:13:11 +00:00
<div class="theme-setting__operate w-full p-16-24">
2024-07-12 11:04:08 +00:00
<el-button @click="resetTheme"></el-button>
2024-07-12 09:13:11 +00:00
<el-button type="primary"> 保存并应用 </el-button>
</div>
2024-07-11 10:13:52 +00:00
</div>
2024-07-09 09:50:37 +00:00
</template>
2024-07-11 10:13:52 +00:00
<script lang="ts" setup>
2024-07-12 11:04:08 +00:00
import { ref, reactive, watch } from 'vue'
2024-07-12 09:13:11 +00:00
import type { FormInstance, FormRules } from 'element-plus'
import LoginPreview from './LoginPreview.vue'
2024-07-12 11:04:08 +00:00
import { useElementPlusTheme } from 'use-element-plus-theme'
2024-07-12 09:13:11 +00:00
const themeList = [
2024-07-11 10:13:52 +00:00
{
2024-07-12 09:13:11 +00:00
label: '默认',
value: '#3370FF',
loginBackground: '@/assets/theme/default.jpg'
2024-07-11 10:13:52 +00:00
},
{
2024-07-12 09:13:11 +00:00
label: '活力橙',
value: '#FF8800',
loginBackground: '@/assets/theme/orange.jpg'
2024-07-11 10:13:52 +00:00
},
{
2024-07-12 09:13:11 +00:00
label: '松石绿',
value: '#00B69D',
loginBackground: '@/assets/theme/green.jpg'
2024-07-11 10:13:52 +00:00
},
2024-07-12 09:13:11 +00:00
{
label: '商务蓝',
value: '#4954E6',
loginBackground: '@/assets/theme/default.jpg'
},
{
label: '神秘紫',
value: '#7F3BF5',
loginBackground: '@/assets/theme/purple.jpg'
},
{
label: '胭脂红',
value: '#F01D94',
loginBackground: '@/assets/theme/red.jpg'
2024-07-11 10:13:52 +00:00
}
2024-07-12 09:13:11 +00:00
]
const themeFormRef = ref<FormInstance>()
const themeForm = ref({
theme: '#3370FF',
icon: '',
loginLogo: '',
loginImage: '',
title: 'MaxKB',
slogan: '欢迎使用 MaxKB 智能知识库'
2024-07-11 10:13:52 +00:00
})
2024-07-12 09:13:11 +00:00
const rules = reactive<FormRules>({
title: [{ required: true, message: '请输入网站标题', trigger: 'blur' }],
slogan: [{ required: true, message: '请输入欢迎语', trigger: 'blur' }]
2024-07-11 10:13:52 +00:00
})
2024-07-12 09:13:11 +00:00
2024-07-12 11:04:08 +00:00
const { changeTheme } = useElementPlusTheme(themeForm.value.theme)
function resetTheme() {
themeForm.value.theme = '#3370FF'
changeTheme(themeForm.value.theme)
}
watch(
() => themeForm.value.theme,
(val) => {
if (val) {
console.log(val)
}
}
)
2024-07-11 10:13:52 +00:00
</script>
2024-07-12 09:13:11 +00:00
<style lang="scss" scoped>
.theme-setting {
height: 100%;
display: flex;
flex-direction: column;
2024-07-11 10:13:52 +00:00
box-sizing: border-box;
2024-07-12 09:13:11 +00:00
position: relative;
padding-bottom: 64px;
&__operate {
position: absolute;
bottom: 0;
right: 0;
left: 0;
background: #ffffff;
text-align: right;
box-sizing: border-box;
box-shadow: 0px -2px 4px 0px rgba(31, 35, 41, 0.08);
}
.theme-preview {
min-width: 1000px;
2024-07-11 10:13:52 +00:00
}
}
</style>