feat: 升级前端框架,适配手机端

This commit is contained in:
xiaojunnuo
2025-03-06 21:11:07 +08:00
659 changed files with 37406 additions and 873 deletions
@@ -0,0 +1,41 @@
<template>
<div class="flex flex-between full-w">
<div class="flex">
<span v-if="!settingStore.isComm">
<span>Powered by</span>
<a> handsfree.work </a>
</span>
<template v-if="siteInfo.licenseTo">
<a-divider type="vertical" />
<a :href="siteInfo.licenseToUrl || ''">{{ siteInfo.licenseTo }}</a>
</template>
<template v-if="sysPublic.icpNo">
<a-divider type="vertical" />
<span>
<a href="https://beian.miit.gov.cn/" target="_blank">{{ sysPublic.icpNo }}</a>
</span>
</template>
</div>
<div class="ml-5">v{{ version }}</div>
</div>
</template>
<script setup lang="ts">
import { computed, onMounted, ref } from "vue";
import { useSettingStore } from "/@/store/modules/settings";
defineOptions({
name: "Footer"
});
const version = ref(import.meta.env.VITE_APP_VERSION);
const settingStore = useSettingStore();
const sysPublic = computed(() => {
return settingStore.sysPublic;
});
const siteInfo = computed(() => {
return settingStore.siteInfo;
});
</script>
@@ -25,14 +25,14 @@
<script lang="ts">
import i18n from "../../../i18n";
import { computed, inject } from "vue";
import * as _ from "lodash-es";
import { forEach } from "lodash-es";
export default {
name: "FsLocale",
setup() {
const languages = computed(() => {
const map: any = i18n.global.messages?.value || {};
const list: any = [];
_.forEach(map, (item, key) => {
forEach(map, (item, key) => {
list.push({
key,
label: item.label
@@ -0,0 +1,82 @@
<script lang="ts" setup>
import { BasicLayout, LockScreen, UserDropdown } from "/@/vben/layouts";
import { computed, onErrorCaptured, onMounted } from "vue";
import { preferences } from "/@/vben/preferences";
import { useAccessStore } from "/@/vben/stores";
import { useUserStore } from "/@/store/modules/user";
import VipButton from "/@/components/vip-button/index.vue";
import TutorialButton from "/@/components/tutorial/index.vue";
import { useSettingStore } from "/@/store/modules/settings";
import Footer from "./components/footer/index.vue";
const userStore = useUserStore();
const accessStore = useAccessStore();
const menus = computed(() => [
// {
// handler: () => {
// openWindow(VBEN_DOC_URL, {
// target: "_blank"
// });
// },
// icon: BookOpenText,
// text: $t("ui.widgets.document")
// }
]);
const avatar = computed(() => {
return userStore.userInfo?.avatar ?? preferences.app.defaultAvatar;
});
async function handleLogout() {
await userStore.logout(true);
}
const settingStore = useSettingStore();
const sysPublic = computed(() => {
return settingStore.sysPublic;
});
const siteInfo = computed(() => {
return settingStore.siteInfo;
});
onErrorCaptured((e) => {
console.error("ErrorCaptured:", e);
// notification.error({ message: e.message });
//阻止错误向上传递
return false;
});
onMounted(async () => {
await settingStore.checkUrlBound();
});
</script>
<template>
<BasicLayout @clear-preferences-and-logout="handleLogout">
<template #user-dropdown>
<UserDropdown :avatar :menus :text="userStore.userInfo?.nickName" description="development@handsfree.work" tag-text="Pro" @logout="handleLogout" />
</template>
<template #lock-screen>
<LockScreen :avatar @to-login="handleLogout" />
</template>
<template #header-right-0>
<div class="hover:bg-accent ml-1 mr-2 cursor-pointer rounded-full p-1.5 pl-3 pr-3">
<tutorial-button v-if="!settingStore.isComm" class="flex-center header-btn" />
</div>
<div class="hover:bg-accent ml-1 mr-2 cursor-pointer rounded-full p-1.5 pl-3 pr-3">
<vip-button class="flex-center header-btn" mode="nav" />
</div>
</template>
<template #footer>
<Footer></Footer>
</template>
</BasicLayout>
</template>
<style lang="less">
.header-btn {
font-size: 14px;
}
</style>
@@ -73,6 +73,8 @@ const sysPublic: Ref<SysPublicSetting> = computed(() => {
background-size: 100%;
//padding: 50px 0 84px;
position: relative;
display: flex;
flex-direction: column;
.user-layout-content {
height: 100%;