Merge remote-tracking branch 'origin/main' into gitee

This commit is contained in:
xiaoxian521 2024-01-23 14:00:11 +08:00
commit 9d640eee48
7 changed files with 75 additions and 38 deletions

View File

@ -54,7 +54,7 @@
"@logicflow/extension": "^1.2.19",
"@pureadmin/descriptions": "^1.2.0",
"@pureadmin/table": "^3.0.1",
"@pureadmin/utils": "^2.4.3",
"@pureadmin/utils": "^2.4.4",
"@vueuse/core": "^10.7.2",
"@vueuse/motion": "^2.0.0",
"@wangeditor/editor": "^5.1.23",

8
pnpm-lock.yaml generated
View File

@ -24,8 +24,8 @@ dependencies:
specifier: ^3.0.1
version: 3.0.1(element-plus@2.5.1)(typescript@5.3.3)
'@pureadmin/utils':
specifier: ^2.4.3
version: 2.4.3(echarts@5.4.3)(vue@3.4.14)
specifier: ^2.4.4
version: 2.4.4(echarts@5.4.3)(vue@3.4.14)
'@vueuse/core':
specifier: ^10.7.2
version: 10.7.2(vue@3.4.14)
@ -1763,8 +1763,8 @@ packages:
string-hash: 1.1.3
dev: true
/@pureadmin/utils@2.4.3(echarts@5.4.3)(vue@3.4.14):
resolution: {integrity: sha512-2CT8HIFUWiFZCJnclBRpng5kVQawvZWdAH4ERPnDZGt5pPltGzNNodpsDVHBCKYAbf/xDKpiNUkYwNbPCCIM9Q==}
/@pureadmin/utils@2.4.4(echarts@5.4.3)(vue@3.4.14):
resolution: {integrity: sha512-dH1ml+/U50Te7KlZX8pkA08/o+XKYx8aFyds9aTBC34JDyn0GQSyhe0zFIfGwnFztWMToWn/cyitpXmDEcq3NA==}
peerDependencies:
echarts: '*'
vue: '*'

View File

@ -109,7 +109,6 @@
overflow: visible;
white-space: nowrap;
list-style: none;
transition: transform 0.5s ease-in-out;
.scroll-item {
transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);

View File

@ -38,6 +38,7 @@ const {
pureSetting,
activeIndex,
getTabStyle,
isScrolling,
iconIsActive,
linkIsActive,
currentSelect,
@ -138,6 +139,37 @@ const handleScroll = (offset: number): void => {
translateX.value = 0;
}
}
isScrolling.value = false;
};
const handleWheel = (event: WheelEvent): void => {
isScrolling.value = true;
const scrollIntensity = Math.abs(event.deltaX) + Math.abs(event.deltaY);
let offset = 0;
if (event.deltaX < 0) {
offset = scrollIntensity > 0 ? scrollIntensity : 100;
} else {
offset = scrollIntensity > 0 ? -scrollIntensity : -100;
}
smoothScroll(offset);
};
const smoothScroll = (offset: number): void => {
const scrollAmount = 20; //
let remaining = Math.abs(offset);
const scrollStep = () => {
const scrollOffset = Math.sign(offset) * Math.min(scrollAmount, remaining);
handleScroll(scrollOffset);
remaining -= Math.abs(scrollOffset);
if (remaining > 0) {
requestAnimationFrame(scrollStep);
}
};
requestAnimationFrame(scrollStep);
};
function dynamicRouteTag(value: string): void {
@ -525,7 +557,11 @@ onBeforeUnmount(() => {
<span v-show="isShowArrow" class="arrow-left">
<IconifyIconOffline :icon="ArrowLeftSLine" @click="handleScroll(200)" />
</span>
<div ref="scrollbarDom" class="scroll-container">
<div
ref="scrollbarDom"
class="scroll-container"
@wheel.prevent="handleWheel"
>
<div ref="tabDom" class="tab select-none" :style="getTabStyle">
<div
v-for="(item, index) in multiTags"

View File

@ -48,14 +48,17 @@ function init() {
watch(
() => currentRoute.fullPath,
path => {
if (
currentRoute.name === "Redirect" &&
path.includes(props.frameInfo?.fullPath)
) {
frameSrc.value = path; // redirect
loading.value = true;
}
//
if (props.frameInfo?.fullPath === path) {
frameSrc.value = props.frameInfo?.frameSrc;
}
//
if (path.indexOf("/redirect/") > -1) {
frameSrc.value = props.frameInfo?.fullPath;
loading.value = true;
}
}
);

View File

@ -42,6 +42,7 @@ export function useTags() {
const activeIndex = ref(-1);
// 当前右键选中的路由信息
const currentSelect = ref({});
const isScrolling = ref(false);
/** 显示模式,默认灵动模式 */
const showModel = ref(
@ -152,7 +153,8 @@ export function useTags() {
const getTabStyle = computed((): CSSProperties => {
return {
transform: `translateX(${translateX.value}px)`
transform: `translateX(${translateX.value}px)`,
transition: isScrolling.value ? "none" : "transform 0.5s ease-in-out"
};
});
@ -228,6 +230,7 @@ export function useTags() {
pureSetting,
activeIndex,
getTabStyle,
isScrolling,
iconIsActive,
linkIsActive,
currentSelect,

View File

@ -1,13 +1,4 @@
<script setup lang="ts">
import {
ref,
toRaw,
reactive,
watch,
computed,
onMounted,
onBeforeUnmount
} from "vue";
import { useI18n } from "vue-i18n";
import Motion from "./utils/motion";
import { useRouter } from "vue-router";
@ -15,10 +6,12 @@ import { message } from "@/utils/message";
import { loginRules } from "./utils/rule";
import phone from "./components/phone.vue";
import TypeIt from "@/components/ReTypeit";
import { debounce } from "@pureadmin/utils";
import qrCode from "./components/qrCode.vue";
import regist from "./components/regist.vue";
import update from "./components/update.vue";
import { useNav } from "@/layout/hooks/useNav";
import { useEventListener } from "@vueuse/core";
import type { FormInstance } from "element-plus";
import { $t, transformI18n } from "@/plugins/i18n";
import { operates, thirdParty } from "./utils/enums";
@ -27,6 +20,7 @@ import { useUserStoreHook } from "@/store/modules/user";
import { initRouter, getTopMenu } from "@/router/utils";
import { bg, avatar, illustration } from "./utils/static";
import { ReImageVerify } from "@/components/ReImageVerify";
import { ref, toRaw, reactive, watch, computed } from "vue";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { useTranslationLang } from "@/layout/hooks/useTranslationLang";
import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange";
@ -48,6 +42,7 @@ const loginDay = ref(7);
const router = useRouter();
const loading = ref(false);
const checked = ref(false);
const disabled = ref(false);
const ruleFormRef = ref<FormInstance>();
const currentPage = computed(() => {
return useUserStoreHook().currentPage;
@ -68,42 +63,42 @@ const ruleForm = reactive({
});
const onLogin = async (formEl: FormInstance | undefined) => {
loading.value = true;
if (!formEl) return;
await formEl.validate((valid, fields) => {
if (valid) {
loading.value = true;
useUserStoreHook()
.loginByUsername({ username: ruleForm.username, password: "admin123" })
.then(res => {
if (res.success) {
//
return initRouter().then(() => {
router.push(getTopMenu(true).path);
message("登录成功", { type: "success" });
disabled.value = true;
router
.push(getTopMenu(true).path)
.then(() => {
message("登录成功", { type: "success" });
})
.finally(() => (disabled.value = false));
});
}
})
.finally(() => (loading.value = false));
} else {
loading.value = false;
return fields;
}
});
};
/** 使用公共函数,避免`removeEventListener`失效 */
function onkeypress({ code }: KeyboardEvent) {
if (code === "Enter") {
onLogin(ruleFormRef.value);
}
}
const immediateDebounce: any = debounce(
formRef => onLogin(formRef),
1000,
true
);
onMounted(() => {
window.document.addEventListener("keypress", onkeypress);
});
onBeforeUnmount(() => {
window.document.removeEventListener("keypress", onkeypress);
useEventListener(document, "keypress", ({ code }) => {
if (code === "Enter" && !disabled.value && !loading.value)
immediateDebounce(ruleFormRef.value);
});
watch(imgCode, value => {
@ -270,6 +265,7 @@ watch(loginDay, value => {
size="default"
type="primary"
:loading="loading"
:disabled="disabled"
@click="onLogin(ruleFormRef)"
>
{{ t("login.login") }}