!499 【新增】标签页沉浸式效果

Merge pull request !499 from 半栈幼儿员/preschooler
pull/496/MERGE
芋道源码 2024-08-18 09:34:36 +00:00 committed by Gitee
commit 0791a8aedb
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
7 changed files with 79 additions and 14 deletions

View File

@ -126,6 +126,8 @@ const copyConfig = async () => {
message: ${appStore.getMessage}, message: ${appStore.getMessage},
// //
tagsView: ${appStore.getTagsView}, tagsView: ${appStore.getTagsView},
//
tagsViewImmerse: ${appStore.getTagsViewImmerse},
// //
getTagsViewIcon: ${appStore.getTagsViewIcon}, getTagsViewIcon: ${appStore.getTagsViewIcon},
// logo // logo

View File

@ -73,6 +73,13 @@ const tagsViewChange = (show: boolean) => {
appStore.setTagsView(show) appStore.setTagsView(show)
} }
//
const tagsViewImmerse = ref(appStore.getTagsViewImmerse)
const tagsViewImmerseChange = (immerse: boolean) => {
appStore.setTagsViewImmerse(immerse)
}
// //
const tagsViewIcon = ref(appStore.getTagsViewIcon) const tagsViewIcon = ref(appStore.getTagsViewIcon)
@ -181,6 +188,11 @@ watch(
<ElSwitch v-model="tagsView" @change="tagsViewChange" /> <ElSwitch v-model="tagsView" @change="tagsViewChange" />
</div> </div>
<div class="flex items-center justify-between">
<span class="text-14px">{{ t('setting.tagsViewImmerse') }}</span>
<ElSwitch v-model="tagsViewImmerse" @change="tagsViewImmerseChange" />
</div>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<span class="text-14px">{{ t('setting.tagsViewIcon') }}</span> <span class="text-14px">{{ t('setting.tagsViewIcon') }}</span>
<ElSwitch v-model="tagsViewIcon" @change="tagsViewIconChange" /> <ElSwitch v-model="tagsViewIcon" @change="tagsViewIconChange" />

View File

@ -33,6 +33,8 @@ const affixTagArr = ref<RouteLocationNormalizedLoaded[]>([])
const appStore = useAppStore() const appStore = useAppStore()
const tagsViewImmerse = computed(() => appStore.getTagsViewImmerse)
const tagsViewIcon = computed(() => appStore.getTagsViewIcon) const tagsViewIcon = computed(() => appStore.getTagsViewIcon)
const isDark = computed(() => appStore.getIsDark) const isDark = computed(() => appStore.getIsDark)
@ -266,7 +268,7 @@ watch(
class="relative w-full flex bg-[#fff] dark:bg-[var(--el-bg-color)]" class="relative w-full flex bg-[#fff] dark:bg-[var(--el-bg-color)]"
> >
<span <span
:class="`${prefixCls}__tool ${prefixCls}__tool--first`" :class="tagsViewImmerse ? '' : `${prefixCls}__tool ${prefixCls}__tool--first`"
class="h-[var(--tags-view-height)] w-[var(--tags-view-height)] flex cursor-pointer items-center justify-center" class="h-[var(--tags-view-height)] w-[var(--tags-view-height)] flex cursor-pointer items-center justify-center"
@click="move(-200)" @click="move(-200)"
> >
@ -343,6 +345,9 @@ watch(
:tag-item="item" :tag-item="item"
:class="[ :class="[
`${prefixCls}__item`, `${prefixCls}__item`,
tagsViewImmerse ? `${prefixCls}__item--immerse` : '',
tagsViewIcon ? `${prefixCls}__item--icon` : '',
tagsViewImmerse && tagsViewIcon ? `${prefixCls}__item--immerse--icon` : '',
item?.meta?.affix ? `${prefixCls}__item--affix` : '', item?.meta?.affix ? `${prefixCls}__item--affix` : '',
{ {
'is-active': isActive(item) 'is-active': isActive(item)
@ -354,7 +359,7 @@ watch(
<router-link :ref="tagLinksRefs.set" :to="{ ...item }" custom v-slot="{ navigate }"> <router-link :ref="tagLinksRefs.set" :to="{ ...item }" custom v-slot="{ navigate }">
<div <div
@click="navigate" @click="navigate"
class="h-full flex items-center justify-center whitespace-nowrap pl-15px" :class="`h-full flex items-center justify-center whitespace-nowrap pl-15px ${prefixCls}__item--label`"
> >
<Icon <Icon
v-if=" v-if="
@ -384,7 +389,7 @@ watch(
</ElScrollbar> </ElScrollbar>
</div> </div>
<span <span
:class="`${prefixCls}__tool`" :class="tagsViewImmerse ? '' : `${prefixCls}__tool`"
class="h-[var(--tags-view-height)] w-[var(--tags-view-height)] flex cursor-pointer items-center justify-center" class="h-[var(--tags-view-height)] w-[var(--tags-view-height)] flex cursor-pointer items-center justify-center"
@click="move(200)" @click="move(200)"
> >
@ -395,7 +400,7 @@ watch(
/> />
</span> </span>
<span <span
:class="`${prefixCls}__tool`" :class="tagsViewImmerse ? '' : `${prefixCls}__tool`"
class="h-[var(--tags-view-height)] w-[var(--tags-view-height)] flex cursor-pointer items-center justify-center" class="h-[var(--tags-view-height)] w-[var(--tags-view-height)] flex cursor-pointer items-center justify-center"
@click="refreshSelectedTag(selectedTag)" @click="refreshSelectedTag(selectedTag)"
> >
@ -460,7 +465,7 @@ watch(
]" ]"
> >
<span <span
:class="`${prefixCls}__tool`" :class="tagsViewImmerse ? '' : `${prefixCls}__tool`"
class="block h-[var(--tags-view-height)] w-[var(--tags-view-height)] flex cursor-pointer items-center justify-center" class="block h-[var(--tags-view-height)] w-[var(--tags-view-height)] flex cursor-pointer items-center justify-center"
> >
<Icon <Icon
@ -512,7 +517,7 @@ $prefix-cls: #{$namespace}-tags-view;
position: relative; position: relative;
top: 2px; top: 2px;
height: calc(100% - 6px); height: calc(100% - 6px);
padding-right: 25px; padding-right: 15px;
margin-left: 4px; margin-left: 4px;
font-size: 12px; font-size: 12px;
cursor: pointer; cursor: pointer;
@ -533,6 +538,10 @@ $prefix-cls: #{$namespace}-tags-view;
} }
} }
&__item--icon {
padding-right: 20px;
}
&__item:not(.is-active) { &__item:not(.is-active) {
&:hover { &:hover {
color: var(--el-color-primary); color: var(--el-color-primary);
@ -549,6 +558,37 @@ $prefix-cls: #{$namespace}-tags-view;
} }
} }
} }
&__item--immerse {
top: 3px;
padding-right: 35px;
margin: 0 -10px;
border: 1px solid transparent;
-webkit-mask-box-image: url("data:image/svg+xml,%3Csvg width='68' height='34' viewBox='0 0 68 34' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='m27,0c-7.99582,0 -11.95105,0.00205 -12,12l0,6c0,8.284 -0.48549,16.49691 -8.76949,16.49691l54.37857,-0.11145c-8.284,0 -8.60908,-8.10146 -8.60908,-16.38546l0,-6c0.11145,-12.08445 -4.38441,-12 -12,-12l-13,0z' fill='%23409eff'/%3E%3C/svg%3E")
12 27 15;
.#{$prefix-cls}__item--label {
padding-left: 35px;
}
.#{$prefix-cls}__item--close {
right: 20px;
}
}
&__item--immerse--icon {
padding-right: 35px;
}
&__item--immerse:not(.is-active) {
&:hover {
color: var(--el-color-white);
background-color: var(--el-color-primary);
.#{$prefix-cls}__item--close {
:deep(span) {
color: var(--el-color-white) !important;
}
}
}
}
} }
.dark { .dark {

View File

@ -92,6 +92,7 @@ export default {
localeIcon: '多语言图标', localeIcon: '多语言图标',
messageIcon: '消息图标', messageIcon: '消息图标',
tagsView: '标签页', tagsView: '标签页',
tagsViewImmerse: '标签页沉浸',
logo: '标志', logo: '标志',
greyMode: '灰色模式', greyMode: '灰色模式',
fixedHeader: '固定头部', fixedHeader: '固定头部',

View File

@ -21,6 +21,7 @@ interface AppState {
locale: boolean locale: boolean
message: boolean message: boolean
tagsView: boolean tagsView: boolean
tagsViewImmerse: boolean
tagsViewIcon: boolean tagsViewIcon: boolean
logo: boolean logo: boolean
fixedHeader: boolean fixedHeader: boolean
@ -58,6 +59,7 @@ export const useAppStore = defineStore('app', {
locale: true, // 多语言图标 locale: true, // 多语言图标
message: true, // 消息图标 message: true, // 消息图标
tagsView: true, // 标签页 tagsView: true, // 标签页
tagsViewImmerse: false, // 标签页沉浸
tagsViewIcon: true, // 是否显示标签图标 tagsViewIcon: true, // 是否显示标签图标
logo: true, // logo logo: true, // logo
fixedHeader: true, // 固定toolheader fixedHeader: true, // 固定toolheader
@ -131,6 +133,9 @@ export const useAppStore = defineStore('app', {
getTagsView(): boolean { getTagsView(): boolean {
return this.tagsView return this.tagsView
}, },
getTagsViewImmerse(): boolean {
return this.tagsViewImmerse
},
getTagsViewIcon(): boolean { getTagsViewIcon(): boolean {
return this.tagsViewIcon return this.tagsViewIcon
}, },
@ -208,6 +213,9 @@ export const useAppStore = defineStore('app', {
setTagsView(tagsView: boolean) { setTagsView(tagsView: boolean) {
this.tagsView = tagsView this.tagsView = tagsView
}, },
setTagsViewImmerse(tagsViewImmerse: boolean) {
this.tagsViewImmerse = tagsViewImmerse
},
setTagsViewIcon(tagsViewIcon: boolean) { setTagsViewIcon(tagsViewIcon: boolean) {
this.tagsViewIcon = tagsViewIcon this.tagsViewIcon = tagsViewIcon
}, },

View File

@ -276,10 +276,11 @@ const handleLogin = async (params) => {
const code = route?.query?.code as string const code = route?.query?.code as string
const state = route?.query?.state as string const state = route?.query?.state as string
const loginDataLoginForm = { ...loginData.loginForm }
const res = await LoginApi.login({ const res = await LoginApi.login({
// //
username: loginData.loginForm.username, username: loginDataLoginForm.username,
password: loginData.loginForm.password, password: loginDataLoginForm.password,
captchaVerification: params.captchaVerification, captchaVerification: params.captchaVerification,
// //
socialCode: code, socialCode: code,
@ -294,8 +295,8 @@ const handleLogin = async (params) => {
text: '正在加载系统中...', text: '正在加载系统中...',
background: 'rgba(0, 0, 0, 0.7)' background: 'rgba(0, 0, 0, 0.7)'
}) })
if (loginData.loginForm.rememberMe) { if (loginDataLoginForm.rememberMe) {
authUtil.setLoginForm(loginData.loginForm) authUtil.setLoginForm(loginDataLoginForm)
} else { } else {
authUtil.removeLoginForm() authUtil.removeLoginForm()
} }

View File

@ -249,8 +249,9 @@ const handleLogin = async (params) => {
if (!data) { if (!data) {
return return
} }
loginData.loginForm.captchaVerification = params.captchaVerification const loginDataLoginForm = { ...loginData.loginForm }
const res = await LoginApi.login(loginData.loginForm) loginDataLoginForm.captchaVerification = params.captchaVerification
const res = await LoginApi.login(loginDataLoginForm)
if (!res) { if (!res) {
return return
} }
@ -259,8 +260,8 @@ const handleLogin = async (params) => {
text: '正在加载系统中...', text: '正在加载系统中...',
background: 'rgba(0, 0, 0, 0.7)' background: 'rgba(0, 0, 0, 0.7)'
}) })
if (loginData.loginForm.rememberMe) { if (loginDataLoginForm.rememberMe) {
authUtil.setLoginForm(loginData.loginForm) authUtil.setLoginForm(loginDataLoginForm)
} else { } else {
authUtil.removeLoginForm() authUtil.removeLoginForm()
} }