fix page style
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 134 KiB |
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 134 KiB |
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 874 KiB |
Before Width: | Height: | Size: 272 KiB After Width: | Height: | Size: 874 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 8.2 KiB |
@ -6,7 +6,7 @@
|
|||||||
>
|
>
|
||||||
<div class="header-container">
|
<div class="header-container">
|
||||||
<div class="logo" @click="handleToHome">
|
<div class="logo" @click="handleToHome">
|
||||||
<NImage width="80" height="80" :src="FiEELogo" preview-disabled />
|
<NImage width="100" height="100" :src="FiEELogo" preview-disabled />
|
||||||
</div>
|
</div>
|
||||||
<div class="header-menu">
|
<div class="header-menu">
|
||||||
<NMenu
|
<NMenu
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
>
|
>
|
||||||
<div class="header-container">
|
<div class="header-container">
|
||||||
<div class="logo" @click="handleToHome">
|
<div class="logo" @click="handleToHome">
|
||||||
<NImage width="80" height="80" :src="FiEELogo" preview-disabled />
|
<NImage width="90" height="90" :src="FiEELogo" preview-disabled />
|
||||||
</div>
|
</div>
|
||||||
<div class="header-menu">
|
<div class="header-menu">
|
||||||
<NMenu
|
<NMenu
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<div class="header-container">
|
<div class="header-container">
|
||||||
<div class="logo" @click="handleToHome">
|
<div class="logo" @click="handleToHome">
|
||||||
<NImage
|
<NImage
|
||||||
style="width: 60px; height: 60px; max-width: 100%"
|
style="width: 120px; height: 30px; max-width: 100%"
|
||||||
:src="FiEELogo"
|
:src="FiEELogo"
|
||||||
preview-disabled
|
preview-disabled
|
||||||
/>
|
/>
|
||||||
|
@ -137,7 +137,6 @@ const solutions = computed(() => [
|
|||||||
}
|
}
|
||||||
|
|
||||||
.home-page {
|
.home-page {
|
||||||
background-image: url("@/assets/image/bg-mobile.png");
|
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
|
@ -138,7 +138,6 @@ const solutions = computed(() => [
|
|||||||
}
|
}
|
||||||
|
|
||||||
.home-page {
|
.home-page {
|
||||||
background-image: url("@/assets/image/bg-mobile.png");
|
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
|
@ -152,7 +152,7 @@ const getCommitteeRole = (name, committee) => {
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.role-badge.chair {
|
.role-badge.chair {
|
||||||
color: orange;
|
color: #00baff;
|
||||||
}
|
}
|
||||||
.title h1 {
|
.title h1 {
|
||||||
position: relative;
|
position: relative;
|
||||||
@ -165,7 +165,7 @@ const getCommitteeRole = (name, committee) => {
|
|||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
width: 80px;
|
width: 80px;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
background: #895bff;
|
background: #ff7bac;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
}
|
}
|
||||||
@ -235,7 +235,7 @@ const getCommitteeRole = (name, committee) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.table-header {
|
.table-header {
|
||||||
background: #f9f6ff;
|
background: #fff0f6;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
@ -359,7 +359,7 @@ const getCommitteeRole = (name, committee) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.director-link {
|
.director-link {
|
||||||
color: #895bff;
|
color: #ff7bac;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
@ -151,7 +151,7 @@ const getCommitteeRole = (name, committee) => {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
/* 紫色主题变量 */
|
/* 紫色主题变量 */
|
||||||
.role-badge.chair {
|
.role-badge.chair {
|
||||||
color: orange;
|
color: #00baff;
|
||||||
}
|
}
|
||||||
:root {
|
:root {
|
||||||
--primary: #895bff;
|
--primary: #895bff;
|
||||||
@ -178,7 +178,7 @@ const getCommitteeRole = (name, committee) => {
|
|||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
width: 80px;
|
width: 80px;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
background: #895bff;
|
background: #ff7bac;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
}
|
}
|
||||||
@ -232,7 +232,7 @@ const getCommitteeRole = (name, committee) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.table-header {
|
.table-header {
|
||||||
background: #f9f6ff;
|
background: #fff0f6;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
@ -356,7 +356,7 @@ const getCommitteeRole = (name, committee) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.director-link {
|
.director-link {
|
||||||
color: #895bff;
|
color: #ff7bac;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
@ -161,11 +161,6 @@ const getInitials = (name) => {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.role-badge.chair {
|
|
||||||
background-color: #e6f2ff;
|
|
||||||
color: #0066cc;
|
|
||||||
}
|
|
||||||
|
|
||||||
.role-badge.member {
|
.role-badge.member {
|
||||||
background-color: #f0f0f0;
|
background-color: #f0f0f0;
|
||||||
color: #555;
|
color: #555;
|
||||||
@ -181,7 +176,7 @@ const getInitials = (name) => {
|
|||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
width: 80px;
|
width: 80px;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
background: #895bff;
|
background: #ff7bac;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
}
|
}
|
||||||
@ -260,6 +255,7 @@ const getInitials = (name) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.card-header {
|
.card-header {
|
||||||
|
color: #ff7bac;
|
||||||
padding: 1.25rem;
|
padding: 1.25rem;
|
||||||
background: var(--bg-light);
|
background: var(--bg-light);
|
||||||
border-bottom: 1px solid #f0f0f0;
|
border-bottom: 1px solid #f0f0f0;
|
||||||
@ -326,8 +322,8 @@ const getInitials = (name) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.role-badge.chair {
|
.role-badge.chair {
|
||||||
background: rgba(137, 91, 255, 0.15);
|
background-color: #e6f2ff;
|
||||||
color: var(--primary-dark);
|
color: #00baff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.committee-name {
|
.committee-name {
|
||||||
|
@ -163,7 +163,7 @@ const getInitials = (name) => {
|
|||||||
|
|
||||||
.role-badge.chair {
|
.role-badge.chair {
|
||||||
background-color: #e6f2ff;
|
background-color: #e6f2ff;
|
||||||
color: #0066cc;
|
color: #00baff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.role-badge.member {
|
.role-badge.member {
|
||||||
@ -181,7 +181,7 @@ const getInitials = (name) => {
|
|||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
width: 80px;
|
width: 80px;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
background: #895bff;
|
background: #ff7bac;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
}
|
}
|
||||||
@ -260,6 +260,7 @@ const getInitials = (name) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.card-header {
|
.card-header {
|
||||||
|
color: #ff7bac;
|
||||||
padding: 1.25rem;
|
padding: 1.25rem;
|
||||||
background: var(--bg-light);
|
background: var(--bg-light);
|
||||||
border-bottom: 1px solid #f0f0f0;
|
border-bottom: 1px solid #f0f0f0;
|
||||||
@ -325,11 +326,6 @@ const getInitials = (name) => {
|
|||||||
color: var(--primary);
|
color: var(--primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
.role-badge.chair {
|
|
||||||
background: rgba(137, 91, 255, 0.15);
|
|
||||||
color: var(--primary-dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
.committee-name {
|
.committee-name {
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
|
@ -66,7 +66,6 @@ const otherDirectors = [
|
|||||||
}
|
}
|
||||||
|
|
||||||
.home-page {
|
.home-page {
|
||||||
background-image: url("@/assets/image/bg-mobile.png");
|
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
|
@ -189,7 +189,6 @@ const stats = ref([
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.home-page {
|
.home-page {
|
||||||
background-image: url("@/assets/image/bg-mobile.png");
|
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
|
@ -3,20 +3,38 @@ import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
|
|||||||
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
||||||
|
|
||||||
function copyEmail() {
|
function copyEmail() {
|
||||||
navigator.clipboard.writeText('fiee@dlkadvisory.com');
|
navigator.clipboard.writeText("fiee@dlkadvisory.com");
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<main
|
||||||
<main ref="main" class="flex-center min-h-80vh bg-[url('@/assets/image/bg-pc.png')] rounded-3xl to-accent w-100vw animate-fade-in bg-[url('@/assets/image/bg-pc.png')]" >
|
ref="main"
|
||||||
|
class="flex-center min-h-80vh bg-[url('@/assets/image/bg-pc.png')] rounded-3xl to-accent w-100vw animate-fade-in bg-[url('@/assets/image/bg-pc.png')]"
|
||||||
|
>
|
||||||
<div class="w-full flex flex-col items-center gap-5 py-12 px-6">
|
<div class="w-full flex flex-col items-center gap-5 py-12 px-6">
|
||||||
<h1 class="text-4xl font-bold text-primary animate-fade-in-down animate-delay-0">Investor Contacts</h1>
|
<h1
|
||||||
<div class="text-2xl font-semibold text-gray-800 animate-fade-in-down animate-delay-200">FiEE Inc.</div>
|
class="text-4xl font-bold text-primary animate-fade-in-down animate-delay-0"
|
||||||
<div class="text-xl text-secondary animate-fade-in-down animate-delay-400">Investor Relations</div>
|
>
|
||||||
<div class="text-lg text-gray-600 flex items-center gap-2 animate-fade-in-down animate-delay-600">
|
Investor Contacts
|
||||||
|
</h1>
|
||||||
|
<div
|
||||||
|
class="text-2xl font-semibold text-gray-800 animate-fade-in-down animate-delay-200"
|
||||||
|
>
|
||||||
|
FiEE Inc.
|
||||||
|
</div>
|
||||||
|
<div class="text-xl text-#ff7bac animate-fade-in-down animate-delay-400">
|
||||||
|
Investor Relations
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="text-lg text-gray-600 flex items-center gap-2 animate-fade-in-down animate-delay-600"
|
||||||
|
>
|
||||||
<span>Email:</span>
|
<span>Email:</span>
|
||||||
<span class="transition-colors duration-300 cursor-pointer text-accent hover:text-primary active:text-secondary select-all" @click="copyEmail">fiee@dlkadvisory.com</span>
|
<span
|
||||||
|
class="transition-colors duration-300 cursor-pointer text-#00baff hover:text-primary active:text-secondary select-all"
|
||||||
|
@click="copyEmail"
|
||||||
|
>fiee@dlkadvisory.com</span
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
@ -37,9 +55,16 @@ function copyEmail() {
|
|||||||
.animate-fade-in-down {
|
.animate-fade-in-down {
|
||||||
animation: fade-in-down 0.8s cubic-bezier(0.23, 1, 0.32, 1) both;
|
animation: fade-in-down 0.8s cubic-bezier(0.23, 1, 0.32, 1) both;
|
||||||
}
|
}
|
||||||
.animate-delay-0 { animation-delay: 0s; }
|
.animate-delay-0 {
|
||||||
.animate-delay-200 { animation-delay: 0.2s; }
|
animation-delay: 0s;
|
||||||
.animate-delay-400 { animation-delay: 0.4s; }
|
}
|
||||||
.animate-delay-600 { animation-delay: 0.6s; }
|
.animate-delay-200 {
|
||||||
|
animation-delay: 0.2s;
|
||||||
|
}
|
||||||
|
.animate-delay-400 {
|
||||||
|
animation-delay: 0.4s;
|
||||||
|
}
|
||||||
|
.animate-delay-600 {
|
||||||
|
animation-delay: 0.6s;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -3,28 +3,43 @@ import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
|
|||||||
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
||||||
|
|
||||||
function copyEmail() {
|
function copyEmail() {
|
||||||
navigator.clipboard.writeText('fiee@dlkadvisory.com');
|
navigator.clipboard.writeText("fiee@dlkadvisory.com");
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<header className="header">
|
<header className="header"></header>
|
||||||
|
<main
|
||||||
</header>
|
ref="main"
|
||||||
<main ref="main" class="flex-center min-h-80vh bg-[url('@/assets/image/bg-pc.png')] rounded-3xl to-accent w-100vw animate-fade-in bg-[url('@/assets/image/bg-pc.png')]">
|
class="flex-center min-h-80vh bg-[url('@/assets/image/bg-pc.png')] rounded-3xl to-accent w-100vw animate-fade-in bg-[url('@/assets/image/bg-pc.png')]"
|
||||||
|
>
|
||||||
<div class="w-full flex flex-col items-center gap-6 py-16 px-8">
|
<div class="w-full flex flex-col items-center gap-6 py-16 px-8">
|
||||||
<h1 class="text-5xl font-bold text-primary animate-fade-in-down animate-delay-0">Investor Contacts</h1>
|
<h1
|
||||||
<div class="text-3xl font-semibold text-gray-800 animate-fade-in-down animate-delay-200">FiEE Inc.</div>
|
class="text-5xl font-bold text-primary animate-fade-in-down animate-delay-0"
|
||||||
<div class="text-2xl text-secondary animate-fade-in-down animate-delay-400">Investor Relations</div>
|
>
|
||||||
<div class="text-xl text-gray-600 flex items-center gap-2 animate-fade-in-down animate-delay-600">
|
Investor Contacts
|
||||||
|
</h1>
|
||||||
|
<div
|
||||||
|
class="text-3xl font-semibold text-gray-800 animate-fade-in-down animate-delay-200"
|
||||||
|
>
|
||||||
|
FiEE Inc.
|
||||||
|
</div>
|
||||||
|
<div class="text-2xl text-#ff7bac animate-fade-in-down animate-delay-400">
|
||||||
|
Investor Relations
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="text-xl text-gray-600 flex items-center gap-2 animate-fade-in-down animate-delay-600"
|
||||||
|
>
|
||||||
<span>Email:</span>
|
<span>Email:</span>
|
||||||
<span class="transition-colors duration-300 cursor-pointer text-accent hover:text-primary active:text-secondary select-all" @click="copyEmail">fiee@dlkadvisory.com</span>
|
<span
|
||||||
|
class="transition-colors duration-300 cursor-pointer text-#00baff hover:text-primary active:text-secondary select-all"
|
||||||
|
@click="copyEmail"
|
||||||
|
>fiee@dlkadvisory.com</span
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
<footer>
|
<footer></footer>
|
||||||
|
|
||||||
</footer>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -42,9 +57,16 @@ function copyEmail() {
|
|||||||
.animate-fade-in-down {
|
.animate-fade-in-down {
|
||||||
animation: fade-in-down 0.8s cubic-bezier(0.23, 1, 0.32, 1) both;
|
animation: fade-in-down 0.8s cubic-bezier(0.23, 1, 0.32, 1) both;
|
||||||
}
|
}
|
||||||
.animate-delay-0 { animation-delay: 0s; }
|
.animate-delay-0 {
|
||||||
.animate-delay-200 { animation-delay: 0.2s; }
|
animation-delay: 0s;
|
||||||
.animate-delay-400 { animation-delay: 0.4s; }
|
}
|
||||||
.animate-delay-600 { animation-delay: 0.6s; }
|
.animate-delay-200 {
|
||||||
|
animation-delay: 0.2s;
|
||||||
|
}
|
||||||
|
.animate-delay-400 {
|
||||||
|
animation-delay: 0.4s;
|
||||||
|
}
|
||||||
|
.animate-delay-600 {
|
||||||
|
animation-delay: 0.6s;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -1,24 +1,43 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
||||||
function copyEmail() {
|
function copyEmail() {
|
||||||
navigator.clipboard.writeText('fiee@dlkadvisory.com');
|
navigator.clipboard.writeText("fiee@dlkadvisory.com");
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<main
|
||||||
<main ref="main" class="flex flex-col items-center from-primary to-accent w-[100vw] mt-8 animate-fade-in px-4 py-8 pt-500px">
|
ref="main"
|
||||||
|
class="flex flex-col items-center from-primary to-accent w-[100vw] mt-8 animate-fade-in px-4 py-8 pt-500px"
|
||||||
|
>
|
||||||
<div class="w-full flex flex-col items-center gap-4 px-2">
|
<div class="w-full flex flex-col items-center gap-4 px-2">
|
||||||
<h1 class="text-2xl font-bold text-primary animate-fade-in-down animate-delay-0">Investor Contacts</h1>
|
<h1
|
||||||
<div class="text-lg font-semibold text-gray-800 animate-fade-in-down animate-delay-200">FiEE Inc.</div>
|
class="text-2xl font-bold text-primary animate-fade-in-down animate-delay-0"
|
||||||
<div class="text-base text-secondary animate-fade-in-down animate-delay-400">Investor Relations</div>
|
>
|
||||||
<div class="text-sm text-gray-600 flex items-center gap-1 animate-fade-in-down animate-delay-600">
|
Investor Contacts
|
||||||
|
</h1>
|
||||||
|
<div
|
||||||
|
class="text-lg font-semibold text-gray-800 animate-fade-in-down animate-delay-200"
|
||||||
|
>
|
||||||
|
FiEE Inc.
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="text-base text-#ff7bac animate-fade-in-down animate-delay-400"
|
||||||
|
>
|
||||||
|
Investor Relations
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="text-sm text-gray-600 flex items-center gap-1 animate-fade-in-down animate-delay-600"
|
||||||
|
>
|
||||||
<span>Email:</span>
|
<span>Email:</span>
|
||||||
<span class="transition-colors duration-300 cursor-pointer text-accent hover:text-primary active:text-secondary select-all" @click="copyEmail">fiee@dlkadvisory.com</span>
|
<span
|
||||||
|
class="transition-colors duration-300 cursor-pointer text-#00baff hover:text-primary active:text-secondary select-all"
|
||||||
|
@click="copyEmail"
|
||||||
|
>fiee@dlkadvisory.com</span
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -35,11 +54,20 @@ function copyEmail() {
|
|||||||
.animate-fade-in-down {
|
.animate-fade-in-down {
|
||||||
animation: fade-in-down 0.8s cubic-bezier(0.23, 1, 0.32, 1) both;
|
animation: fade-in-down 0.8s cubic-bezier(0.23, 1, 0.32, 1) both;
|
||||||
}
|
}
|
||||||
.animate-delay-0 { animation-delay: 0s; }
|
.animate-delay-0 {
|
||||||
.animate-delay-200 { animation-delay: 0.2s; }
|
animation-delay: 0s;
|
||||||
.animate-delay-400 { animation-delay: 0.4s; }
|
}
|
||||||
.animate-delay-600 { animation-delay: 0.6s; }
|
.animate-delay-200 {
|
||||||
|
animation-delay: 0.2s;
|
||||||
|
}
|
||||||
|
.animate-delay-400 {
|
||||||
|
animation-delay: 0.4s;
|
||||||
|
}
|
||||||
|
.animate-delay-600 {
|
||||||
|
animation-delay: 0.6s;
|
||||||
|
}
|
||||||
|
|
||||||
.max-w-343px { max-width: 343px; }
|
.max-w-343px {
|
||||||
|
max-width: 343px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -1,19 +1,38 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
||||||
function copyEmail() {
|
function copyEmail() {
|
||||||
navigator.clipboard.writeText('fiee@dlkadvisory.com');
|
navigator.clipboard.writeText("fiee@dlkadvisory.com");
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<main ref="main" class="flex flex-col items-center from-primary to-accent w-[100vw] mt-12 animate-fade-in px-6 py-10 pt-500px">
|
<main
|
||||||
|
ref="main"
|
||||||
|
class="flex flex-col items-center from-primary to-accent w-[100vw] mt-12 animate-fade-in px-6 py-10 pt-500px"
|
||||||
|
>
|
||||||
<div class="w-full flex flex-col items-center gap-5 px-4">
|
<div class="w-full flex flex-col items-center gap-5 px-4">
|
||||||
<h1 class="text-3xl font-bold text-primary animate-fade-in-down animate-delay-0">Investor Contacts</h1>
|
<h1
|
||||||
<div class="text-xl font-semibold text-gray-800 animate-fade-in-down animate-delay-200">FiEE Inc.</div>
|
class="text-3xl font-bold text-primary animate-fade-in-down animate-delay-0"
|
||||||
<div class="text-lg text-secondary animate-fade-in-down animate-delay-400">Investor Relations</div>
|
>
|
||||||
<div class="text-base text-gray-600 flex items-center gap-2 animate-fade-in-down animate-delay-600">
|
Investor Contacts
|
||||||
|
</h1>
|
||||||
|
<div
|
||||||
|
class="text-xl font-semibold text-gray-800 animate-fade-in-down animate-delay-200"
|
||||||
|
>
|
||||||
|
FiEE Inc.
|
||||||
|
</div>
|
||||||
|
<div class="text-lg text-#ff7bac animate-fade-in-down animate-delay-400">
|
||||||
|
Investor Relations
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="text-base text-gray-600 flex items-center gap-2 animate-fade-in-down animate-delay-600"
|
||||||
|
>
|
||||||
<span>Email:</span>
|
<span>Email:</span>
|
||||||
<span class="transition-colors duration-300 cursor-pointer text-accent hover:text-primary active:text-secondary select-all" @click="copyEmail">fiee@dlkadvisory.com</span>
|
<span
|
||||||
|
class="transition-colors duration-300 cursor-pointer text-#00baff hover:text-primary active:text-secondary select-all"
|
||||||
|
@click="copyEmail"
|
||||||
|
>fiee@dlkadvisory.com</span
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
@ -33,9 +52,16 @@ function copyEmail() {
|
|||||||
.animate-fade-in-down {
|
.animate-fade-in-down {
|
||||||
animation: fade-in-down 0.8s cubic-bezier(0.23, 1, 0.32, 1) both;
|
animation: fade-in-down 0.8s cubic-bezier(0.23, 1, 0.32, 1) both;
|
||||||
}
|
}
|
||||||
.animate-delay-0 { animation-delay: 0s; }
|
.animate-delay-0 {
|
||||||
.animate-delay-200 { animation-delay: 0.2s; }
|
animation-delay: 0s;
|
||||||
.animate-delay-400 { animation-delay: 0.4s; }
|
}
|
||||||
.animate-delay-600 { animation-delay: 0.6s; }
|
.animate-delay-200 {
|
||||||
|
animation-delay: 0.2s;
|
||||||
|
}
|
||||||
|
.animate-delay-400 {
|
||||||
|
animation-delay: 0.4s;
|
||||||
|
}
|
||||||
|
.animate-delay-600 {
|
||||||
|
animation-delay: 0.6s;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -1,76 +1,141 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
const form = ref({
|
const form = ref({
|
||||||
firstName: "",
|
firstName: "",
|
||||||
lastName: "",
|
lastName: "",
|
||||||
email: "",
|
email: "",
|
||||||
company: "",
|
company: "",
|
||||||
phone: "",
|
phone: "",
|
||||||
alertType: "all"
|
alertType: "all",
|
||||||
});
|
});
|
||||||
const submitted = ref(false);
|
const submitted = ref(false);
|
||||||
|
|
||||||
async function handleSubmit(e) {
|
async function handleSubmit(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const res = await axios.post('https://erpapi-out.szjixun.cn/api/stock/submit/data', form.value)
|
const res = await axios.post(
|
||||||
if(res.data.status === 0){
|
"https://erpapi-out.szjixun.cn/api/stock/submit/data",
|
||||||
|
form.value
|
||||||
|
);
|
||||||
|
if (res.data.status === 0) {
|
||||||
submitted.value = true;
|
submitted.value = true;
|
||||||
}else{
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<main
|
||||||
<main ref="main" class="relative min-h-[80vh] flex-center bg-[url('@/assets/image/bg-pc.png')] overflow-hidden">
|
ref="main"
|
||||||
|
class="relative min-h-[80vh] flex-center bg-[url('@/assets/image/bg-pc.png')] overflow-hidden"
|
||||||
|
>
|
||||||
<!-- 粒子背景 -->
|
<!-- 粒子背景 -->
|
||||||
<div class="absolute inset-0 z-0 pointer-events-none animate-bg-move"></div>
|
<div class="absolute inset-0 z-0 pointer-events-none animate-bg-move"></div>
|
||||||
<!-- 表单卡片/提交成功卡片 -->
|
<!-- 表单卡片/提交成功卡片 -->
|
||||||
<div class="relative z-10 w-[600px] max-w-[90vw] p-8 bg-white/80 rounded-2xl shadow-xl backdrop-blur-md animate-bounce-in">
|
<div
|
||||||
|
class="relative z-10 w-[600px] max-w-[90vw] p-8 bg-white/80 rounded-2xl shadow-xl backdrop-blur-md animate-bounce-in"
|
||||||
|
>
|
||||||
<template v-if="!submitted">
|
<template v-if="!submitted">
|
||||||
<h2 class="text-2xl font-bold text-#8A5AFB mb-2 tracking-wide">E-Mail Alerts</h2>
|
<h2 class="text-2xl font-bold text-#ff7bac mb-2 tracking-wide">
|
||||||
|
E-Mail Alerts
|
||||||
|
</h2>
|
||||||
<p class="text-sm text-gray-500 mb-5">* Required Fields</p>
|
<p class="text-sm text-gray-500 mb-5">* Required Fields</p>
|
||||||
<form class="space-y-3" @submit="handleSubmit">
|
<form class="space-y-3" @submit="handleSubmit">
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1">* First Name</label>
|
<label class="block text-gray-700 font-semibold mb-1"
|
||||||
<input v-model="form.firstName" type="text" class="w-full px-3 py-2 rounded-lg border border-gray-300 ring-2 ring-#8A5AFB/20) transition-all duration-300 outline-none bg-white/90" />
|
>* First Name</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.firstName"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-2 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1">* Last Name</label>
|
<label class="block text-gray-700 font-semibold mb-1"
|
||||||
<input v-model="form.lastName" type="text" class="w-full px-3 py-2 rounded-lg border border-gray-300 ring-2 ring-#8A5AFB/20) transition-all duration-300 outline-none bg-white/90" />
|
>* Last Name</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.lastName"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-2 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1">* Email</label>
|
<label class="block text-gray-700 font-semibold mb-1"
|
||||||
<input v-model="form.email" type="email" class="w-full px-3 py-2 rounded-lg border border-gray-300 ring-2 ring-#8A5AFB/20) transition-all duration-300 outline-none bg-white/90" />
|
>* Email</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.email"
|
||||||
|
type="email"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-2 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1">* Company</label>
|
<label class="block text-gray-700 font-semibold mb-1"
|
||||||
<input v-model="form.company" type="text" class="w-full px-3 py-2 rounded-lg border border-gray-300 ring-2 ring-#8A5AFB/20) transition-all duration-300 outline-none bg-white/90" />
|
>* Company</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.company"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-2 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1">Phone</label>
|
<label class="block text-gray-700 font-semibold mb-1">Phone</label>
|
||||||
<input v-model="form.phone" type="tel" class="w-full px-3 py-2 rounded-lg border border-gray-300 ring-2 ring-#8A5AFB/20) transition-all duration-300 outline-none bg-white/90" />
|
<input
|
||||||
|
v-model="form.phone"
|
||||||
|
type="tel"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-2 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="w-full py-2.5 rounded-xl bg-#8A5AFB text-white font-bold text-base active:scale-95 transition-all duration-200 animate-bounce-in animate-delay-200">
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="w-full py-2.5 rounded-xl text-white font-bold text-base active:scale-95 transition-all duration-200 animate-bounce-in animate-delay-200 submit-btn"
|
||||||
|
>
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="flex flex-col items-center justify-center min-h-[280px] animate-bounce-in">
|
<div
|
||||||
<span class="i-mdi:check-circle-outline text-green-500 text-4xl mb-3"></span>
|
class="flex flex-col items-center justify-center min-h-[280px] animate-bounce-in"
|
||||||
<h2 class="text-xl font-bold text-#8A5AFB mb-2">Submitted successfully!</h2>
|
>
|
||||||
<div class="text-gray-700 text-sm mb-3">The information you submitted is as follows:</div>
|
<span
|
||||||
<div class="w-full bg-white/80 rounded-xl shadow p-3 space-y-2 text-gray-800 text-sm">
|
class="i-mdi:check-circle-outline text-green-500 text-4xl mb-3"
|
||||||
<div><span class="font-semibold">First Name:</span>{{ form.firstName }}</div>
|
></span>
|
||||||
<div><span class="font-semibold">Last Name:</span>{{ form.lastName }}</div>
|
<h2 class="text-xl font-bold text-#ff7bac mb-2">
|
||||||
<div><span class="font-semibold">Email:</span>{{ form.email }}</div>
|
Submitted successfully!
|
||||||
<div><span class="font-semibold">Company:</span>{{ form.company }}</div>
|
</h2>
|
||||||
<div><span class="font-semibold">Phone:</span>{{ form.phone || 'Not filled in' }}</div>
|
<div class="text-gray-700 text-sm mb-3">
|
||||||
<div><span class="font-semibold">Alert Type:</span>{{ form.alertType === 'all' ? 'All Alerts' : 'Customize Alerts' }}</div>
|
The information you submitted is as follows:
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="w-full bg-white/80 rounded-xl shadow p-3 space-y-2 text-gray-800 text-sm"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">First Name:</span
|
||||||
|
>{{ form.firstName }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Last Name:</span>{{ form.lastName }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Email:</span>{{ form.email }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Company:</span>{{ form.company }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Phone:</span
|
||||||
|
>{{ form.phone || "Not filled in" }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Alert Type:</span
|
||||||
|
>{{
|
||||||
|
form.alertType === "all" ? "All Alerts" : "Customize Alerts"
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -80,5 +145,7 @@ async function handleSubmit(e) {
|
|||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
/* 可选:自定义粒子或渐变动画背景 */
|
/* 可选:自定义粒子或渐变动画背景 */
|
||||||
|
.submit-btn {
|
||||||
|
background: linear-gradient(to right, #ff7bac, #00ffff);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -1,87 +1,154 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
|
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
const form = ref({
|
const form = ref({
|
||||||
firstName: "",
|
firstName: "",
|
||||||
lastName: "",
|
lastName: "",
|
||||||
email: "",
|
email: "",
|
||||||
company: "",
|
company: "",
|
||||||
phone: "",
|
phone: "",
|
||||||
alertType: "all"
|
alertType: "all",
|
||||||
});
|
});
|
||||||
const submitted = ref(false);
|
const submitted = ref(false);
|
||||||
|
|
||||||
async function handleSubmit(e) {
|
async function handleSubmit(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const res = await axios.post('https://erpapi-out.szjixun.cn/api/stock/submit/data', form.value)
|
const res = await axios.post(
|
||||||
if(res.data.status === 0){
|
"https://erpapi-out.szjixun.cn/api/stock/submit/data",
|
||||||
|
form.value
|
||||||
|
);
|
||||||
|
if (res.data.status === 0) {
|
||||||
submitted.value = true;
|
submitted.value = true;
|
||||||
}else{
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<header class="header">
|
<header class="header"></header>
|
||||||
</header>
|
<main
|
||||||
<main ref="main" class="relative min-h-[80vh] flex-center bg-[url('@/assets/image/bg-pc.png')] overflow-hidden">
|
ref="main"
|
||||||
|
class="relative min-h-[80vh] flex-center bg-[url('@/assets/image/bg-pc.png')] overflow-hidden"
|
||||||
|
>
|
||||||
<!-- 粒子背景 -->
|
<!-- 粒子背景 -->
|
||||||
<div class="absolute inset-0 z-0 pointer-events-none animate-bg-move"></div>
|
<div class="absolute inset-0 z-0 pointer-events-none animate-bg-move"></div>
|
||||||
<!-- 表单卡片/提交成功卡片 -->
|
<!-- 表单卡片/提交成功卡片 -->
|
||||||
<div class="relative z-10 w-[480px] max-w-[90vw] p-10 bg-white/80 rounded-3xl shadow-2xl backdrop-blur-md animate-bounce-in">
|
<div
|
||||||
|
class="relative z-10 w-[480px] max-w-[90vw] p-10 bg-white/80 rounded-3xl shadow-2xl backdrop-blur-md animate-bounce-in"
|
||||||
|
>
|
||||||
<template v-if="!submitted">
|
<template v-if="!submitted">
|
||||||
<h2 class="text-3xl font-bold text-#8A5AFB mb-2 tracking-wide">E-Mail Alerts</h2>
|
<h2 class="text-3xl font-bold text-#ff7bac mb-2 tracking-wide">
|
||||||
|
E-Mail Alerts
|
||||||
|
</h2>
|
||||||
<p class="text-sm text-gray-500 mb-6">* Required Fields</p>
|
<p class="text-sm text-gray-500 mb-6">* Required Fields</p>
|
||||||
<form class="space-y-4" @submit="handleSubmit">
|
<form class="space-y-4" @submit="handleSubmit">
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1">* First Name</label>
|
<label class="block text-gray-700 font-semibold mb-1"
|
||||||
<input v-model="form.firstName" type="text" class="w-full px-4 py-2 rounded-lg border border-gray-300 ring-2 ring-#8A5AFB/20) transition-all duration-300 outline-none bg-white/90" />
|
>* First Name</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.firstName"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-4 py-2 rounded-lg ring-2 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1">* Last Name</label>
|
<label class="block text-gray-700 font-semibold mb-1"
|
||||||
<input v-model="form.lastName" type="text" class="w-full px-4 py-2 rounded-lg border border-gray-300 ring-2 ring-#8A5AFB/20) transition-all duration-300 outline-none bg-white/90" />
|
>* Last Name</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.lastName"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-4 py-2 rounded-lg ring-2 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1">* Email</label>
|
<label class="block text-gray-700 font-semibold mb-1"
|
||||||
<input v-model="form.email" type="email" class="w-full px-4 py-2 rounded-lg border border-gray-300 ring-2 ring-#8A5AFB/20) transition-all duration-300 outline-none bg-white/90" />
|
>* Email</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.email"
|
||||||
|
type="email"
|
||||||
|
class="w-full px-4 py-2 rounded-lg ring-2 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1">* Company</label>
|
<label class="block text-gray-700 font-semibold mb-1"
|
||||||
<input v-model="form.company" type="text" class="w-full px-4 py-2 rounded-lg border border-gray-300 ring-2 ring-#8A5AFB/20) transition-all duration-300 outline-none bg-white/90" />
|
>* Company</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.company"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-4 py-2 rounded-lg ring-2 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1">Phone</label>
|
<label class="block text-gray-700 font-semibold mb-1">Phone</label>
|
||||||
<input v-model="form.phone" type="tel" class="w-full px-4 py-2 rounded-lg border border-gray-300 ring-2 ring-#8A5AFB/20) transition-all duration-300 outline-none bg-white/90" />
|
<input
|
||||||
|
v-model="form.phone"
|
||||||
|
type="tel"
|
||||||
|
class="w-full px-4 py-2 rounded-lg ring-2 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="w-full py-3 rounded-xl bg-#8A5AFB text-white font-bold text-lg active:scale-95 transition-all duration-200 animate-bounce-in animate-delay-200">
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="w-full py-3 rounded-xl text-white font-bold text-lg active:scale-95 transition-all duration-200 animate-bounce-in animate-delay-200 submit-btn"
|
||||||
|
>
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="flex flex-col items-center justify-center min-h-[300px] animate-bounce-in">
|
<div
|
||||||
<span class="i-mdi:check-circle-outline text-green-500 text-5xl mb-4"></span>
|
class="flex flex-col items-center justify-center min-h-[300px] animate-bounce-in"
|
||||||
<h2 class="text-2xl font-bold text-#8A5AFB mb-2">Submitted successfully!</h2>
|
>
|
||||||
<div class="text-gray-700 text-base mb-4">The information you submitted is as follows:</div>
|
<span
|
||||||
<div class="w-full bg-white/80 rounded-xl shadow p-4 space-y-2 text-gray-800">
|
class="i-mdi:check-circle-outline text-green-500 text-5xl mb-4"
|
||||||
<div><span class="font-semibold">First Name:</span>{{ form.firstName }}</div>
|
></span>
|
||||||
<div><span class="font-semibold">Last Name:</span>{{ form.lastName }}</div>
|
<h2 class="text-2xl font-bold text-#ff7bac mb-2">
|
||||||
<div><span class="font-semibold">Email:</span>{{ form.email }}</div>
|
Submitted successfully!
|
||||||
<div><span class="font-semibold">Company:</span>{{ form.company }}</div>
|
</h2>
|
||||||
<div><span class="font-semibold">Phone:</span>{{ form.phone || 'Not filled in' }}</div>
|
<div class="text-gray-700 text-base mb-4">
|
||||||
<div><span class="font-semibold">Alert Type:</span>{{ form.alertType === 'all' ? 'All Alerts' : 'Customize Alerts' }}</div>
|
The information you submitted is as follows:
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="w-full bg-white/80 rounded-xl shadow p-4 space-y-2 text-gray-800"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">First Name:</span
|
||||||
|
>{{ form.firstName }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Last Name:</span>{{ form.lastName }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Email:</span>{{ form.email }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Company:</span>{{ form.company }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Phone:</span
|
||||||
|
>{{ form.phone || "Not filled in" }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Alert Type:</span
|
||||||
|
>{{
|
||||||
|
form.alertType === "all" ? "All Alerts" : "Customize Alerts"
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
<footer>
|
<footer></footer>
|
||||||
</footer>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
/* 可选:自定义粒子或渐变动画背景 */
|
/* 可选:自定义粒子或渐变动画背景 */
|
||||||
</style>
|
.submit-btn {
|
||||||
|
background: linear-gradient(to right, #ff7bac, #00ffff);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@ -1,73 +1,142 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from "vue";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
const form = ref({
|
const form = ref({
|
||||||
firstName: '',
|
firstName: "",
|
||||||
lastName: '',
|
lastName: "",
|
||||||
email: '',
|
email: "",
|
||||||
company: '',
|
company: "",
|
||||||
phone: '',
|
phone: "",
|
||||||
alertType: 'all',
|
alertType: "all",
|
||||||
});
|
});
|
||||||
const submitted = ref(false);
|
const submitted = ref(false);
|
||||||
|
|
||||||
async function handleSubmit(e) {
|
async function handleSubmit(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const res = await axios.post('https://erpapi-out.szjixun.cn/api/stock/submit/data', form.value)
|
const res = await axios.post(
|
||||||
if(res.data.status === 0){
|
"https://erpapi-out.szjixun.cn/api/stock/submit/data",
|
||||||
|
form.value
|
||||||
|
);
|
||||||
|
if (res.data.status === 0) {
|
||||||
submitted.value = true;
|
submitted.value = true;
|
||||||
}else{
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<main class="min-h-60vh flex flex-col items-center justify-center relative px-4 py-8">
|
<main
|
||||||
|
class="min-h-60vh flex flex-col items-center justify-center relative px-4 py-8"
|
||||||
|
>
|
||||||
<!-- Card -->
|
<!-- Card -->
|
||||||
<div class="w-full max-w-90vw p-4 bg-white/95 rounded-2xl shadow-lg animate-bounce-in">
|
<div
|
||||||
|
class="w-full max-w-90vw p-4 bg-white/95 rounded-2xl shadow-lg animate-bounce-in"
|
||||||
|
>
|
||||||
<template v-if="!submitted">
|
<template v-if="!submitted">
|
||||||
<h2 class="text-xl font-bold text-#8A5AFB mb-2 text-center tracking-wide">E-Mail Alerts</h2>
|
<h2
|
||||||
|
class="text-xl font-bold text-#ff7bac mb-2 text-center tracking-wide"
|
||||||
|
>
|
||||||
|
E-Mail Alerts
|
||||||
|
</h2>
|
||||||
<p class="text-xs text-gray-500 mb-4 text-center">* Required Fields</p>
|
<p class="text-xs text-gray-500 mb-4 text-center">* Required Fields</p>
|
||||||
<form class="flex flex-col gap-3" @submit="handleSubmit">
|
<form class="flex flex-col gap-3" @submit="handleSubmit">
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1 text-sm">* First Name</label>
|
<label class="block text-gray-700 font-semibold mb-1 text-sm"
|
||||||
<input v-model="form.firstName" type="text" class="w-full px-3 py-2 rounded-lg border border-gray-300 outline-none bg-white/90 text-sm" />
|
>* First Name</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.firstName"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-8 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1 text-sm">* Last Name</label>
|
<label class="block text-gray-700 font-semibold mb-1 text-sm"
|
||||||
<input v-model="form.lastName" type="text" class="w-full px-3 py-2 rounded-lg border border-gray-300 outline-none bg-white/90 text-sm" />
|
>* Last Name</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.lastName"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-8 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1 text-sm">* Email</label>
|
<label class="block text-gray-700 font-semibold mb-1 text-sm"
|
||||||
<input v-model="form.email" type="email" class="w-full px-3 py-2 rounded-lg border border-gray-300 outline-none bg-white/90 text-sm" />
|
>* Email</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.email"
|
||||||
|
type="email"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-8 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1 text-sm">* Company</label>
|
<label class="block text-gray-700 font-semibold mb-1 text-sm"
|
||||||
<input v-model="form.company" type="text" class="w-full px-3 py-2 rounded-lg border border-gray-300 outline-none bg-white/90 text-sm" />
|
>* Company</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.company"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-8 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1 text-sm">Phone</label>
|
<label class="block text-gray-700 font-semibold mb-1 text-sm"
|
||||||
<input v-model="form.phone" type="tel" class="w-full px-3 py-2 rounded-lg border border-gray-300 outline-none bg-white/90 text-sm" />
|
>Phone</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.phone"
|
||||||
|
type="tel"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-8 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="w-full py-3 rounded-xl bg-#8A5AFB text-white font-bold text-base active:scale-95 transition-all duration-200 animate-bounce-in animate-delay-200 mt-2">
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="w-full py-3 rounded-xl text-white font-bold text-base active:scale-95 transition-all duration-200 animate-bounce-in animate-delay-200 mt-2 submit-btn"
|
||||||
|
>
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="flex flex-col items-center justify-center min-h-[200px] animate-bounce-in">
|
<div
|
||||||
<span class="i-mdi:check-circle-outline text-green-500 text-4xl mb-3"></span>
|
class="flex flex-col items-center justify-center min-h-[200px] animate-bounce-in"
|
||||||
<h2 class="text-lg font-bold text-#8A5AFB mb-2">Submitted successfully!</h2>
|
>
|
||||||
<div class="text-gray-700 text-sm mb-3">The information you submitted is as follows:</div>
|
<span
|
||||||
<div class="w-full bg-white/90 rounded-xl shadow p-3 space-y-1 text-gray-800 text-sm">
|
class="i-mdi:check-circle-outline text-green-500 text-4xl mb-3"
|
||||||
<div><span class="font-semibold">First Name:</span>{{ form.firstName }}</div>
|
></span>
|
||||||
<div><span class="font-semibold">Last Name:</span>{{ form.lastName }}</div>
|
<h2 class="text-lg font-bold text-#ff7bac mb-2">
|
||||||
<div><span class="font-semibold">Email:</span>{{ form.email }}</div>
|
Submitted successfully!
|
||||||
<div><span class="font-semibold">Company:</span>{{ form.company }}</div>
|
</h2>
|
||||||
<div><span class="font-semibold">Phone:</span>{{ form.phone || '(Not filled)' }}</div>
|
<div class="text-gray-700 text-sm mb-3">
|
||||||
<div><span class="font-semibold">Alert Type:</span>{{ form.alertType === 'all' ? 'All Alerts' : 'Customize Alerts' }}</div>
|
The information you submitted is as follows:
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="w-full bg-white/90 rounded-xl shadow p-3 space-y-1 text-gray-800 text-sm"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">First Name:</span
|
||||||
|
>{{ form.firstName }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Last Name:</span>{{ form.lastName }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Email:</span>{{ form.email }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Company:</span>{{ form.company }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Phone:</span
|
||||||
|
>{{ form.phone || "(Not filled)" }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Alert Type:</span
|
||||||
|
>{{
|
||||||
|
form.alertType === "all" ? "All Alerts" : "Customize Alerts"
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -77,5 +146,7 @@ async function handleSubmit(e) {
|
|||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
/* Keep mobile background simple */
|
/* Keep mobile background simple */
|
||||||
|
.submit-btn {
|
||||||
|
background: linear-gradient(to right, #ff7bac, #00ffff);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -1,85 +1,157 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
|
import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
|
||||||
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
const form = ref({
|
const form = ref({
|
||||||
firstName: '',
|
firstName: "",
|
||||||
lastName: '',
|
lastName: "",
|
||||||
email: '',
|
email: "",
|
||||||
company: '',
|
company: "",
|
||||||
phone: '',
|
phone: "",
|
||||||
alertType: 'all',
|
alertType: "all",
|
||||||
});
|
});
|
||||||
const submitted = ref(false);
|
const submitted = ref(false);
|
||||||
|
|
||||||
async function handleSubmit(e) {
|
async function handleSubmit(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const res = await axios.post('https://erpapi-out.szjixun.cn/api/stock/submit/data', form.value)
|
const res = await axios.post(
|
||||||
if(res.data.status === 0){
|
"https://erpapi-out.szjixun.cn/api/stock/submit/data",
|
||||||
|
form.value
|
||||||
|
);
|
||||||
|
if (res.data.status === 0) {
|
||||||
submitted.value = true;
|
submitted.value = true;
|
||||||
}else{
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
||||||
<main ref="main">
|
<main ref="main">
|
||||||
<main class="min-h-70vh flex flex-col items-center justify-center relative px-6 py-10">
|
<main
|
||||||
<div class="w-[640px] max-w-90vw p-6 bg-white/95 rounded-2xl shadow-lg animate-bounce-in">
|
class="min-h-70vh flex flex-col items-center justify-center relative px-6 py-10"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="w-[840px] max-w-90vw p-6 bg-white/95 rounded-2xl shadow-lg animate-bounce-in"
|
||||||
|
>
|
||||||
<template v-if="!submitted">
|
<template v-if="!submitted">
|
||||||
<h2 class="text-2xl font-bold text-#8A5AFB mb-3 text-center tracking-wide">E-Mail Alerts</h2>
|
<h2
|
||||||
<p class="text-sm text-gray-500 mb-5 text-center">* Required Fields</p>
|
class="text-2xl font-bold text-#ff7bac mb-3 text-center tracking-wide"
|
||||||
|
>
|
||||||
|
E-Mail Alerts
|
||||||
|
</h2>
|
||||||
|
<p class="text-sm text-gray-500 mb-5 text-center">
|
||||||
|
* Required Fields
|
||||||
|
</p>
|
||||||
<form class="flex flex-col gap-4" @submit="handleSubmit">
|
<form class="flex flex-col gap-4" @submit="handleSubmit">
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1.5 text-base">* First Name</label>
|
<label class="block text-gray-700 font-semibold mb-1.5 text-base"
|
||||||
<input v-model="form.firstName" type="text" class="w-full px-4 py-2.5 rounded-lg border border-gray-300 outline-none bg-white/90 text-base" />
|
>* First Name</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.firstName"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-4 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1.5 text-base">* Last Name</label>
|
<label class="block text-gray-700 font-semibold mb-1.5 text-base"
|
||||||
<input v-model="form.lastName" type="text" class="w-full px-4 py-2.5 rounded-lg border border-gray-300 outline-none bg-white/90 text-base" />
|
>* Last Name</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.lastName"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-4 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1.5 text-base">* Email</label>
|
<label class="block text-gray-700 font-semibold mb-1.5 text-base"
|
||||||
<input v-model="form.email" type="email" class="w-full px-4 py-2.5 rounded-lg border border-gray-300 outline-none bg-white/90 text-base" />
|
>* Email</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.email"
|
||||||
|
type="email"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-4 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1.5 text-base">* Company</label>
|
<label class="block text-gray-700 font-semibold mb-1.5 text-base"
|
||||||
<input v-model="form.company" type="text" class="w-full px-4 py-2.5 rounded-lg border border-gray-300 outline-none bg-white/90 text-base" />
|
>* Company</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.company"
|
||||||
|
type="text"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-4 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-gray-700 font-semibold mb-1.5 text-base">Phone</label>
|
<label class="block text-gray-700 font-semibold mb-1.5 text-base"
|
||||||
<input v-model="form.phone" type="tel" class="w-full px-4 py-2.5 rounded-lg border border-gray-300 outline-none bg-white/90 text-base" />
|
>Phone</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
v-model="form.phone"
|
||||||
|
type="tel"
|
||||||
|
class="w-full px-3 py-2 rounded-lg ring-4 ring-#ff7bac/20) transition-all duration-300 outline-none bg-white/90 border-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="w-full py-3.5 rounded-xl bg-#8A5AFB text-white font-bold text-lg active:scale-95 transition-all duration-200 animate-bounce-in animate-delay-200 mt-3">
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="w-full py-3.5 rounded-xl text-white font-bold text-lg active:scale-95 transition-all duration-200 animate-bounce-in animate-delay-200 mt-3 submit-btn"
|
||||||
|
>
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="flex flex-col items-center justify-center min-h-[240px] animate-bounce-in">
|
<div
|
||||||
<span class="i-mdi:check-circle-outline text-green-500 text-5xl mb-4"></span>
|
class="flex flex-col items-center justify-center min-h-[240px] animate-bounce-in"
|
||||||
<h2 class="text-xl font-bold text-#8A5AFB mb-3">Submitted successfully!</h2>
|
>
|
||||||
<div class="text-gray-700 text-base mb-4">The information you submitted is as follows:</div>
|
<span
|
||||||
<div class="w-full bg-white/90 rounded-xl shadow p-4 space-y-2 text-gray-800 text-base">
|
class="i-mdi:check-circle-outline text-green-500 text-5xl mb-4"
|
||||||
<div><span class="font-semibold">First Name:</span>{{ form.firstName }}</div>
|
></span>
|
||||||
<div><span class="font-semibold">Last Name:</span>{{ form.lastName }}</div>
|
<h2 class="text-xl font-bold text-#ff7bac mb-3">
|
||||||
<div><span class="font-semibold">Email:</span>{{ form.email }}</div>
|
Submitted successfully!
|
||||||
<div><span class="font-semibold">Company:</span>{{ form.company }}</div>
|
</h2>
|
||||||
<div><span class="font-semibold">Phone:</span>{{ form.phone || '(Not filled)' }}</div>
|
<div class="text-gray-700 text-base mb-4">
|
||||||
<div><span class="font-semibold">Alert Type:</span>{{ form.alertType === 'all' ? 'All Alerts' : 'Customize Alerts' }}</div>
|
The information you submitted is as follows:
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="w-full bg-white/90 rounded-xl shadow p-4 space-y-2 text-gray-800 text-base"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">First Name:</span
|
||||||
|
>{{ form.firstName }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Last Name:</span
|
||||||
|
>{{ form.lastName }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Email:</span>{{ form.email }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Company:</span>{{ form.company }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Phone:</span
|
||||||
|
>{{ form.phone || "(Not filled)" }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-semibold">Alert Type:</span
|
||||||
|
>{{
|
||||||
|
form.alertType === "all" ? "All Alerts" : "Customize Alerts"
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
/* Keep tablet background simple */
|
/* Keep tablet background simple */
|
||||||
|
.submit-btn {
|
||||||
|
background: linear-gradient(to right, #ff7bac, #00ffff);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<template #content>
|
<template #content>
|
||||||
<main class="p-[35px] max-w-[1200px] mx-auto">
|
<main class="p-[35px] max-w-[1200px] mx-auto">
|
||||||
<div class="title mb-[20px]">
|
<div class="title mb-[20px]">
|
||||||
{{ t('events_calendar.title') }}
|
{{ t("events_calendar.title") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="search-container">
|
<div class="search-container">
|
||||||
<n-date-picker
|
<n-date-picker
|
||||||
@ -12,12 +12,8 @@
|
|||||||
type="date"
|
type="date"
|
||||||
class="search-date-picker"
|
class="search-date-picker"
|
||||||
></n-date-picker>
|
></n-date-picker>
|
||||||
<n-button
|
<n-button @click="handleSearch" class="search-button">
|
||||||
type="primary"
|
{{ t("events_calendar.search.button") }}
|
||||||
@click="handleSearch"
|
|
||||||
class="search-button"
|
|
||||||
>
|
|
||||||
{{ t('events_calendar.search.button') }}
|
|
||||||
</n-button>
|
</n-button>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
@ -27,21 +23,21 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import customDefaultPage from '@/components/customDefaultPage/index.vue'
|
import customDefaultPage from "@/components/customDefaultPage/index.vue";
|
||||||
import { reactive } from 'vue'
|
import { reactive } from "vue";
|
||||||
import { NDatePicker, NButton } from 'naive-ui'
|
import { NDatePicker, NButton } from "naive-ui";
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n();
|
||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
selectedDateValue: null, //选中值
|
selectedDateValue: null, //选中值
|
||||||
})
|
});
|
||||||
|
|
||||||
const handleSearch = () => {
|
const handleSearch = () => {
|
||||||
// 搜索处理逻辑
|
// 搜索处理逻辑
|
||||||
// console.log('搜索:', state.selectedDateValue)
|
// console.log('搜索:', state.selectedDateValue)
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -75,4 +71,8 @@ const handleSearch = () => {
|
|||||||
padding: 20px 16px;
|
padding: 20px 16px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
.search-button {
|
||||||
|
background: #ff7bac;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<template #content>
|
<template #content>
|
||||||
<main class="p-[35px] max-w-[1800px] mx-auto">
|
<main class="p-[35px] max-w-[1800px] mx-auto">
|
||||||
<div class="title mb-[20px]">
|
<div class="title mb-[20px]">
|
||||||
{{ t('events_calendar.title') }}
|
{{ t("events_calendar.title") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="search-container">
|
<div class="search-container">
|
||||||
<n-date-picker
|
<n-date-picker
|
||||||
@ -12,12 +12,8 @@
|
|||||||
type="date"
|
type="date"
|
||||||
class="search-date-picker"
|
class="search-date-picker"
|
||||||
></n-date-picker>
|
></n-date-picker>
|
||||||
<n-button
|
<n-button @click="handleSearch" class="search-button">
|
||||||
type="primary"
|
{{ t("events_calendar.search.button") }}
|
||||||
@click="handleSearch"
|
|
||||||
class="search-button"
|
|
||||||
>
|
|
||||||
{{ t('events_calendar.search.button') }}
|
|
||||||
</n-button>
|
</n-button>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
@ -27,21 +23,21 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import customDefaultPage from '@/components/customDefaultPage/index.vue'
|
import customDefaultPage from "@/components/customDefaultPage/index.vue";
|
||||||
import { reactive } from 'vue'
|
import { reactive } from "vue";
|
||||||
import { NDatePicker, NButton } from 'naive-ui'
|
import { NDatePicker, NButton } from "naive-ui";
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n();
|
||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
selectedDateValue: null, //选中值
|
selectedDateValue: null, //选中值
|
||||||
})
|
});
|
||||||
|
|
||||||
const handleSearch = () => {
|
const handleSearch = () => {
|
||||||
// 搜索处理逻辑
|
// 搜索处理逻辑
|
||||||
// console.log('搜索:', state.selectedDateValue)
|
// console.log('搜索:', state.selectedDateValue)
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -81,4 +77,8 @@ const handleSearch = () => {
|
|||||||
padding: 20px 16px;
|
padding: 20px 16px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
.search-button {
|
||||||
|
background: #ff7bac;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
<div
|
<div
|
||||||
class="absolute inset-0 bg-gradient-to-r from-[#f5f0ff] to-white opacity-80"
|
class="absolute inset-0 bg-gradient-to-r from-[#f5f0ff] to-white opacity-80"
|
||||||
></div>
|
></div>
|
||||||
<div class="relative p-8 flex flex-col h-full">
|
<div class="relative p-8 flex flex-col h-full back-line">
|
||||||
<div class="flex items-center mb-6 max-h-[3.5rem]">
|
<div class="flex items-center mb-6 max-h-[3.5rem]">
|
||||||
<div
|
<div
|
||||||
class="bg-[#895bff] p-3 rounded-lg shadow-md mr-6 transform hover:rotate-6 transition-transform duration-300 governance-icon"
|
class="bg-[#ff7bac] p-3 rounded-lg shadow-md mr-6 transform hover:rotate-6 transition-transform duration-300 governance-icon"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
@ -36,10 +36,14 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<n-tooltip trigger="hover" :disabled="!item.showTooltip" width="trigger">
|
<n-tooltip
|
||||||
|
trigger="hover"
|
||||||
|
:disabled="!item.showTooltip"
|
||||||
|
width="trigger"
|
||||||
|
>
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<h1
|
<h1
|
||||||
:ref="el => setTitleRef(el, index)"
|
:ref="(el) => setTitleRef(el, index)"
|
||||||
style="
|
style="
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
@ -63,9 +67,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mt-auto">
|
<div class="mt-auto">
|
||||||
<a
|
<a
|
||||||
class="inline-flex items-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-white bg-[#895bff] hover:bg-[#7a4de6] transition-all duration-300 transform hover:scale-105 shadow-md"
|
class="inline-flex items-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-white bg-[#ff7bac] hover:bg-[#ff7bac] transition-all duration-300 transform hover:scale-105 shadow-md"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
style="font-size: 16px; cursor: pointer;"
|
style="font-size: 16px; cursor: pointer"
|
||||||
@click="handleViewDocument(item)"
|
@click="handleViewDocument(item)"
|
||||||
>
|
>
|
||||||
View Document
|
View Document
|
||||||
@ -91,16 +95,16 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { reactive, onMounted, ref, nextTick, watch } from 'vue'
|
import { reactive, onMounted, ref, nextTick, watch } from "vue";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
import { NTooltip } from 'naive-ui'
|
import { NTooltip } from "naive-ui";
|
||||||
|
|
||||||
import quarterlyPdfone from '@/assets/file/FiEE, Inc._Audit Committee Charter.pdf'
|
import quarterlyPdfone from "@/assets/file/FiEE, Inc._Audit Committee Charter.pdf";
|
||||||
import quarterlyPdftwo from '@/assets/file/FiEE, Inc. _Code of Business Conduct and Ethics.pdf'
|
import quarterlyPdftwo from "@/assets/file/FiEE, Inc. _Code of Business Conduct and Ethics.pdf";
|
||||||
|
|
||||||
import quarterlyPdfthree from '@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf'
|
import quarterlyPdfthree from "@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf";
|
||||||
|
|
||||||
import quarterlyPdffour from '@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf'
|
import quarterlyPdffour from "@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf";
|
||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
list: [
|
list: [
|
||||||
@ -133,57 +137,62 @@ const state = reactive({
|
|||||||
// date: 'May 30, 2025',
|
// date: 'May 30, 2025',
|
||||||
// },
|
// },
|
||||||
],
|
],
|
||||||
})
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
state.list.forEach((item, idx) => {
|
state.list.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getGovernanceDisplay()
|
getGovernanceDisplay();
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
watch(() => state.list, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => state.list,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
//获取官网展示文档
|
//获取官网展示文档
|
||||||
const getGovernanceDisplay = () => {
|
const getGovernanceDisplay = () => {
|
||||||
// let url = 'https://erpapi.fiee.com/api/fiee/fiee/governance/display'
|
// let url = 'https://erpapi.fiee.com/api/fiee/fiee/governance/display'
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/governance/display'
|
let url = "https://erpapi.fiee.com/api/fiee/governance/display";
|
||||||
let params = {}
|
let params = {};
|
||||||
axios
|
axios
|
||||||
.get(url, { params })
|
.get(url, { params })
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
state.list = res.data.data.data || []
|
state.list = res.data.data.data || [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
// console.log(err)
|
// console.log(err)
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
// 查看文档
|
// 查看文档
|
||||||
const handleViewDocument = (item) => {
|
const handleViewDocument = (item) => {
|
||||||
@ -192,9 +201,9 @@ const handleViewDocument = (item) => {
|
|||||||
`${import.meta.env.VITE_PAGE_URL}/office?url=${
|
`${import.meta.env.VITE_PAGE_URL}/office?url=${
|
||||||
item.attachment
|
item.attachment
|
||||||
}&attachmentName=${item.attachmentName}`,
|
}&attachmentName=${item.attachmentName}`,
|
||||||
'_blank',
|
"_blank"
|
||||||
)
|
);
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -210,7 +219,7 @@ const handleViewDocument = (item) => {
|
|||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
width: 80px;
|
width: 80px;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
background: #895bff;
|
background: #ff7bac;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
}
|
}
|
||||||
@ -263,4 +272,7 @@ const handleViewDocument = (item) => {
|
|||||||
transform: translateY(0px) rotate(0deg);
|
transform: translateY(0px) rotate(0deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.back-line {
|
||||||
|
background: linear-gradient(to right, #fff0f6, #ffffff);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
<div
|
<div
|
||||||
class="absolute inset-0 bg-gradient-to-r from-[#f5f0ff] to-white opacity-80"
|
class="absolute inset-0 bg-gradient-to-r from-[#f5f0ff] to-white opacity-80"
|
||||||
></div>
|
></div>
|
||||||
<div class="relative p-8 flex flex-col h-full">
|
<div class="relative p-8 flex flex-col h-full back-line">
|
||||||
<div class="flex items-center mb-6 max-h-[3.5rem]">
|
<div class="flex items-center mb-6 max-h-[3.5rem]">
|
||||||
<div
|
<div
|
||||||
class="bg-[#895bff] p-3 rounded-lg shadow-md mr-6 transform hover:rotate-6 transition-transform duration-300 governance-icon"
|
class="bg-[#ff7bac] p-3 rounded-lg shadow-md mr-6 transform hover:rotate-6 transition-transform duration-300 governance-icon"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
@ -36,10 +36,14 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<n-tooltip trigger="hover" :disabled="!item.showTooltip" width="trigger">
|
<n-tooltip
|
||||||
|
trigger="hover"
|
||||||
|
:disabled="!item.showTooltip"
|
||||||
|
width="trigger"
|
||||||
|
>
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<h1
|
<h1
|
||||||
:ref="el => setTitleRef(el, index)"
|
:ref="(el) => setTitleRef(el, index)"
|
||||||
style="
|
style="
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
@ -63,9 +67,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mt-auto">
|
<div class="mt-auto">
|
||||||
<a
|
<a
|
||||||
class="inline-flex items-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-white bg-[#895bff] hover:bg-[#7a4de6] transition-all duration-300 transform hover:scale-105 shadow-md"
|
class="inline-flex items-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-white bg-[#ff7bac] hover:bg-[#ff7bac] transition-all duration-300 transform hover:scale-105 shadow-md"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
style="font-size: 16px; cursor: pointer;"
|
style="font-size: 16px; cursor: pointer"
|
||||||
@click="handleViewDocument(item)"
|
@click="handleViewDocument(item)"
|
||||||
>
|
>
|
||||||
View Document
|
View Document
|
||||||
@ -91,16 +95,16 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { reactive, onMounted, ref, nextTick, watch } from 'vue'
|
import { reactive, onMounted, ref, nextTick, watch } from "vue";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
import { NTooltip } from 'naive-ui'
|
import { NTooltip } from "naive-ui";
|
||||||
|
|
||||||
import quarterlyPdfone from '@/assets/file/FiEE, Inc._Audit Committee Charter.pdf'
|
import quarterlyPdfone from "@/assets/file/FiEE, Inc._Audit Committee Charter.pdf";
|
||||||
import quarterlyPdftwo from '@/assets/file/FiEE, Inc. _Code of Business Conduct and Ethics.pdf'
|
import quarterlyPdftwo from "@/assets/file/FiEE, Inc. _Code of Business Conduct and Ethics.pdf";
|
||||||
|
|
||||||
import quarterlyPdfthree from '@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf'
|
import quarterlyPdfthree from "@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf";
|
||||||
|
|
||||||
import quarterlyPdffour from '@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf'
|
import quarterlyPdffour from "@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf";
|
||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
list: [
|
list: [
|
||||||
@ -133,57 +137,62 @@ const state = reactive({
|
|||||||
// date: 'May 30, 2025',
|
// date: 'May 30, 2025',
|
||||||
// },
|
// },
|
||||||
],
|
],
|
||||||
})
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
state.list.forEach((item, idx) => {
|
state.list.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getGovernanceDisplay()
|
getGovernanceDisplay();
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
watch(() => state.list, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => state.list,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
//获取官网展示文档
|
//获取官网展示文档
|
||||||
const getGovernanceDisplay = () => {
|
const getGovernanceDisplay = () => {
|
||||||
// let url = 'https://erpapi.fiee.com/api/fiee/fiee/governance/display'
|
// let url = 'https://erpapi.fiee.com/api/fiee/fiee/governance/display'
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/governance/display'
|
let url = "https://erpapi.fiee.com/api/fiee/governance/display";
|
||||||
let params = {}
|
let params = {};
|
||||||
axios
|
axios
|
||||||
.get(url, { params })
|
.get(url, { params })
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
state.list = res.data.data.data || []
|
state.list = res.data.data.data || [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
// console.log(err)
|
// console.log(err)
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
// 查看文档
|
// 查看文档
|
||||||
const handleViewDocument = (item) => {
|
const handleViewDocument = (item) => {
|
||||||
@ -192,9 +201,9 @@ const handleViewDocument = (item) => {
|
|||||||
`${import.meta.env.VITE_PAGE_URL}/office?url=${
|
`${import.meta.env.VITE_PAGE_URL}/office?url=${
|
||||||
item.attachment
|
item.attachment
|
||||||
}&attachmentName=${item.attachmentName}`,
|
}&attachmentName=${item.attachmentName}`,
|
||||||
'_blank',
|
"_blank"
|
||||||
)
|
);
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -210,7 +219,7 @@ const handleViewDocument = (item) => {
|
|||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
width: 80px;
|
width: 80px;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
background: #895bff;
|
background: #ff7bac;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
}
|
}
|
||||||
@ -263,4 +272,7 @@ const handleViewDocument = (item) => {
|
|||||||
transform: translateY(0px) rotate(0deg);
|
transform: translateY(0px) rotate(0deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.back-line {
|
||||||
|
background: linear-gradient(to right, #fff0f6, #ffffff);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -12,10 +12,10 @@
|
|||||||
<div
|
<div
|
||||||
class="absolute inset-0 bg-gradient-to-r from-[#f5f0ff] to-white opacity-80"
|
class="absolute inset-0 bg-gradient-to-r from-[#f5f0ff] to-white opacity-80"
|
||||||
></div>
|
></div>
|
||||||
<div class="relative p-8 flex flex-col h-full">
|
<div class="relative p-8 flex flex-col h-full back-line">
|
||||||
<div class="flex items-center mb-6 max-h-[3.5rem]">
|
<div class="flex items-center mb-6 max-h-[3.5rem]">
|
||||||
<div
|
<div
|
||||||
class="bg-[#895bff] p-3 rounded-lg shadow-md mr-6 transform hover:rotate-6 transition-transform duration-300 governance-icon"
|
class="bg-[#ff7bac] p-3 rounded-lg shadow-md mr-6 transform hover:rotate-6 transition-transform duration-300 governance-icon"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
@ -33,7 +33,11 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<n-tooltip trigger="click" :disabled="!item.showTooltip" width="trigger">
|
<n-tooltip
|
||||||
|
trigger="click"
|
||||||
|
:disabled="!item.showTooltip"
|
||||||
|
width="trigger"
|
||||||
|
>
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<h1
|
<h1
|
||||||
:ref="(el) => setTitleRef(el, index)"
|
:ref="(el) => setTitleRef(el, index)"
|
||||||
@ -59,9 +63,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mt-auto">
|
<div class="mt-auto">
|
||||||
<a
|
<a
|
||||||
class="inline-flex items-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-white bg-[#895bff] hover:bg-[#7a4de6] transition-all duration-300 transform hover:scale-105 shadow-md"
|
class="inline-flex items-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-white bg-[#ff7bac] hover:bg-[#ff7bac] transition-all duration-300 transform hover:scale-105 shadow-md"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
style="cursor: pointer;"
|
style="cursor: pointer"
|
||||||
@click="handleViewDocument(item)"
|
@click="handleViewDocument(item)"
|
||||||
>
|
>
|
||||||
View Document
|
View Document
|
||||||
@ -87,16 +91,16 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { reactive, onMounted, ref, nextTick, watch } from 'vue'
|
import { reactive, onMounted, ref, nextTick, watch } from "vue";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
import { NTooltip } from 'naive-ui'
|
import { NTooltip } from "naive-ui";
|
||||||
|
|
||||||
import quarterlyPdfone from '@/assets/file/FiEE, Inc._Audit Committee Charter.pdf'
|
import quarterlyPdfone from "@/assets/file/FiEE, Inc._Audit Committee Charter.pdf";
|
||||||
import quarterlyPdftwo from '@/assets/file/FiEE, Inc. _Code of Business Conduct and Ethics.pdf'
|
import quarterlyPdftwo from "@/assets/file/FiEE, Inc. _Code of Business Conduct and Ethics.pdf";
|
||||||
|
|
||||||
import quarterlyPdfthree from '@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf'
|
import quarterlyPdfthree from "@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf";
|
||||||
|
|
||||||
import quarterlyPdffour from '@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf'
|
import quarterlyPdffour from "@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf";
|
||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
list: [
|
list: [
|
||||||
@ -129,57 +133,62 @@ const state = reactive({
|
|||||||
// date: 'May 30, 2025',
|
// date: 'May 30, 2025',
|
||||||
// },
|
// },
|
||||||
],
|
],
|
||||||
})
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
state.list.forEach((item, idx) => {
|
state.list.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getGovernanceDisplay()
|
getGovernanceDisplay();
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
watch(() => state.list, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => state.list,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
//获取官网展示文档
|
//获取官网展示文档
|
||||||
const getGovernanceDisplay = () => {
|
const getGovernanceDisplay = () => {
|
||||||
// let url = 'https://erpapi.fiee.com/api/fiee/fiee/governance/display'
|
// let url = 'https://erpapi.fiee.com/api/fiee/fiee/governance/display'
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/governance/display'
|
let url = "https://erpapi.fiee.com/api/fiee/governance/display";
|
||||||
let params = {}
|
let params = {};
|
||||||
axios
|
axios
|
||||||
.get(url, { params })
|
.get(url, { params })
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
state.list = res.data.data.data || []
|
state.list = res.data.data.data || [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
// console.log(err)
|
// console.log(err)
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
// 查看文档
|
// 查看文档
|
||||||
const handleViewDocument = (item) => {
|
const handleViewDocument = (item) => {
|
||||||
@ -188,9 +197,9 @@ const handleViewDocument = (item) => {
|
|||||||
`${import.meta.env.VITE_PAGE_URL}/office?url=${
|
`${import.meta.env.VITE_PAGE_URL}/office?url=${
|
||||||
item.attachment
|
item.attachment
|
||||||
}&attachmentName=${item.attachmentName}`,
|
}&attachmentName=${item.attachmentName}`,
|
||||||
'_blank',
|
"_blank"
|
||||||
)
|
);
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -206,7 +215,7 @@ const handleViewDocument = (item) => {
|
|||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
width: 80px;
|
width: 80px;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
background: #895bff;
|
background: #ff7bac;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
}
|
}
|
||||||
@ -259,4 +268,7 @@ const handleViewDocument = (item) => {
|
|||||||
transform: translateY(0px) rotate(0deg);
|
transform: translateY(0px) rotate(0deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.back-line {
|
||||||
|
background: linear-gradient(to right, #fff0f6, #ffffff);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -12,10 +12,10 @@
|
|||||||
<div
|
<div
|
||||||
class="absolute inset-0 bg-gradient-to-r from-[#f5f0ff] to-white opacity-80"
|
class="absolute inset-0 bg-gradient-to-r from-[#f5f0ff] to-white opacity-80"
|
||||||
></div>
|
></div>
|
||||||
<div class="relative p-8 flex flex-col h-full">
|
<div class="relative p-8 flex flex-col h-full back-line">
|
||||||
<div class="flex items-center mb-6 max-h-[3.5rem]">
|
<div class="flex items-center mb-6 max-h-[3.5rem]">
|
||||||
<div
|
<div
|
||||||
class="bg-[#895bff] p-3 rounded-lg shadow-md mr-6 transform hover:rotate-6 transition-transform duration-300 governance-icon"
|
class="bg-[#ff7bac] p-3 rounded-lg shadow-md mr-6 transform hover:rotate-6 transition-transform duration-300 governance-icon"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
@ -33,7 +33,11 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<n-tooltip trigger="click" :disabled="!item.showTooltip" width="trigger">
|
<n-tooltip
|
||||||
|
trigger="click"
|
||||||
|
:disabled="!item.showTooltip"
|
||||||
|
width="trigger"
|
||||||
|
>
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<h1
|
<h1
|
||||||
:ref="(el) => setTitleRef(el, index)"
|
:ref="(el) => setTitleRef(el, index)"
|
||||||
@ -59,9 +63,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mt-auto">
|
<div class="mt-auto">
|
||||||
<a
|
<a
|
||||||
class="inline-flex items-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-white bg-[#895bff] hover:bg-[#7a4de6] transition-all duration-300 transform hover:scale-105 shadow-md"
|
class="inline-flex items-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-white bg-[#ff7bac] hover:bg-[#ff7bac] transition-all duration-300 transform hover:scale-105 shadow-md"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
style="cursor: pointer;"
|
style="cursor: pointer"
|
||||||
@click="handleViewDocument(item)"
|
@click="handleViewDocument(item)"
|
||||||
>
|
>
|
||||||
View Document
|
View Document
|
||||||
@ -87,16 +91,16 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { reactive, onMounted, ref, nextTick, watch } from 'vue'
|
import { reactive, onMounted, ref, nextTick, watch } from "vue";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
import { NTooltip } from 'naive-ui'
|
import { NTooltip } from "naive-ui";
|
||||||
|
|
||||||
import quarterlyPdfone from '@/assets/file/FiEE, Inc._Audit Committee Charter.pdf'
|
import quarterlyPdfone from "@/assets/file/FiEE, Inc._Audit Committee Charter.pdf";
|
||||||
import quarterlyPdftwo from '@/assets/file/FiEE, Inc. _Code of Business Conduct and Ethics.pdf'
|
import quarterlyPdftwo from "@/assets/file/FiEE, Inc. _Code of Business Conduct and Ethics.pdf";
|
||||||
|
|
||||||
import quarterlyPdfthree from '@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf'
|
import quarterlyPdfthree from "@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf";
|
||||||
|
|
||||||
import quarterlyPdffour from '@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf'
|
import quarterlyPdffour from "@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf";
|
||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
list: [
|
list: [
|
||||||
@ -129,57 +133,62 @@ const state = reactive({
|
|||||||
// date: 'May 30, 2025',
|
// date: 'May 30, 2025',
|
||||||
// },
|
// },
|
||||||
],
|
],
|
||||||
})
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
state.list.forEach((item, idx) => {
|
state.list.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getGovernanceDisplay()
|
getGovernanceDisplay();
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
watch(() => state.list, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => state.list,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
//获取官网展示文档
|
//获取官网展示文档
|
||||||
const getGovernanceDisplay = () => {
|
const getGovernanceDisplay = () => {
|
||||||
// let url = 'https://erpapi.fiee.com/api/fiee/fiee/governance/display'
|
// let url = 'https://erpapi.fiee.com/api/fiee/fiee/governance/display'
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/governance/display'
|
let url = "https://erpapi.fiee.com/api/fiee/governance/display";
|
||||||
let params = {}
|
let params = {};
|
||||||
axios
|
axios
|
||||||
.get(url, { params })
|
.get(url, { params })
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
state.list = res.data.data.data || []
|
state.list = res.data.data.data || [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
// console.log(err)
|
// console.log(err)
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
// 查看文档
|
// 查看文档
|
||||||
const handleViewDocument = (item) => {
|
const handleViewDocument = (item) => {
|
||||||
@ -188,9 +197,9 @@ const handleViewDocument = (item) => {
|
|||||||
`${import.meta.env.VITE_PAGE_URL}/office?url=${
|
`${import.meta.env.VITE_PAGE_URL}/office?url=${
|
||||||
item.attachment
|
item.attachment
|
||||||
}&attachmentName=${item.attachmentName}`,
|
}&attachmentName=${item.attachmentName}`,
|
||||||
'_blank',
|
"_blank"
|
||||||
)
|
);
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -206,7 +215,7 @@ const handleViewDocument = (item) => {
|
|||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
width: 80px;
|
width: 80px;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
background: #895bff;
|
background: #ff7bac;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
}
|
}
|
||||||
@ -259,4 +268,7 @@ const handleViewDocument = (item) => {
|
|||||||
transform: translateY(0px) rotate(0deg);
|
transform: translateY(0px) rotate(0deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.back-line {
|
||||||
|
background: linear-gradient(to right, #fff0f6, #ffffff);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -99,7 +99,7 @@ const getInitials = (name) => {
|
|||||||
|
|
||||||
/* 顶部大图区域 */
|
/* 顶部大图区域 */
|
||||||
.hero-section {
|
.hero-section {
|
||||||
background: linear-gradient(135deg, #1a2a6c, #b21f1f, #fdbb2d);
|
background: linear-gradient(135deg, #00ffff, #b21f1f, #ff7bac);
|
||||||
background-size: 400% 400%;
|
background-size: 400% 400%;
|
||||||
animation: gradientBG 15s ease infinite;
|
animation: gradientBG 15s ease infinite;
|
||||||
color: white;
|
color: white;
|
||||||
@ -182,11 +182,12 @@ const getInitials = (name) => {
|
|||||||
/* 个人资料区 */
|
/* 个人资料区 */
|
||||||
.card-profile {
|
.card-profile {
|
||||||
padding: 2rem;
|
padding: 2rem;
|
||||||
background: linear-gradient(
|
/* background: linear-gradient(
|
||||||
135deg,
|
135deg,
|
||||||
#7a4dff 0%,
|
#7a4dff 0%,
|
||||||
#895bff 100%
|
#895bff 100%
|
||||||
); /* 主色调接近 #895bff */
|
); */
|
||||||
|
background: #ff7bac;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,7 +218,7 @@ const getInitials = (name) => {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 1.8rem;
|
font-size: 1.8rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #895bff;
|
color: #ffbfd7;
|
||||||
}
|
}
|
||||||
|
|
||||||
.profile-info {
|
.profile-info {
|
||||||
|
@ -99,7 +99,7 @@ const getInitials = (name) => {
|
|||||||
|
|
||||||
/* 顶部大图区域 */
|
/* 顶部大图区域 */
|
||||||
.hero-section {
|
.hero-section {
|
||||||
background: linear-gradient(135deg, #1a2a6c, #b21f1f, #fdbb2d);
|
background: linear-gradient(135deg, #00ffff, #b21f1f, #ff7bac);
|
||||||
background-size: 400% 400%;
|
background-size: 400% 400%;
|
||||||
animation: gradientBG 15s ease infinite;
|
animation: gradientBG 15s ease infinite;
|
||||||
color: white;
|
color: white;
|
||||||
@ -182,11 +182,12 @@ const getInitials = (name) => {
|
|||||||
/* 个人资料区 */
|
/* 个人资料区 */
|
||||||
.card-profile {
|
.card-profile {
|
||||||
padding: 2rem;
|
padding: 2rem;
|
||||||
background: linear-gradient(
|
/* background: linear-gradient(
|
||||||
135deg,
|
135deg,
|
||||||
#7a4dff 0%,
|
#7a4dff 0%,
|
||||||
#895bff 100%
|
#895bff 100%
|
||||||
); /* 主色调接近 #895bff */
|
); */
|
||||||
|
background: #ff7bac;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,7 +218,7 @@ const getInitials = (name) => {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 1.8rem;
|
font-size: 1.8rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #895bff;
|
color: #ffbfd7;
|
||||||
}
|
}
|
||||||
|
|
||||||
.profile-info {
|
.profile-info {
|
||||||
|
@ -101,7 +101,7 @@ const getInitials = (name) => {
|
|||||||
|
|
||||||
/* 顶部大图区域 */
|
/* 顶部大图区域 */
|
||||||
.hero-section {
|
.hero-section {
|
||||||
background: linear-gradient(135deg, #1a2a6c, #b21f1f, #fdbb2d);
|
background: linear-gradient(135deg, #00ffff, #b21f1f, #ff7bac);
|
||||||
background-size: 400% 400%;
|
background-size: 400% 400%;
|
||||||
animation: gradientBG 15s ease infinite;
|
animation: gradientBG 15s ease infinite;
|
||||||
color: white;
|
color: white;
|
||||||
@ -171,7 +171,12 @@ const getInitials = (name) => {
|
|||||||
/* 个人资料区 */
|
/* 个人资料区 */
|
||||||
.card-profile {
|
.card-profile {
|
||||||
padding: 1.5rem;
|
padding: 1.5rem;
|
||||||
background: linear-gradient(135deg, #7a4dff 0%, #895bff 100%);
|
/* background: linear-gradient(
|
||||||
|
135deg,
|
||||||
|
#7a4dff 0%,
|
||||||
|
#895bff 100%
|
||||||
|
); */
|
||||||
|
background: #ff7bac;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +207,7 @@ const getInitials = (name) => {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #895bff;
|
color: #ffbfd7;
|
||||||
}
|
}
|
||||||
|
|
||||||
.profile-info {
|
.profile-info {
|
||||||
|
@ -105,7 +105,7 @@ const getInitials = (name) => {
|
|||||||
|
|
||||||
/* 顶部大图区域 */
|
/* 顶部大图区域 */
|
||||||
.hero-section {
|
.hero-section {
|
||||||
background: linear-gradient(135deg, #1a2a6c, #b21f1f, #fdbb2d);
|
background: linear-gradient(135deg, #00ffff, #b21f1f, #ff7bac);
|
||||||
background-size: 400% 400%;
|
background-size: 400% 400%;
|
||||||
animation: gradientBG 15s ease infinite;
|
animation: gradientBG 15s ease infinite;
|
||||||
color: white;
|
color: white;
|
||||||
@ -173,10 +173,16 @@ const getInitials = (name) => {
|
|||||||
transform: translateY(-5px);
|
transform: translateY(-5px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 个人资料区 */
|
||||||
/* 个人资料区 */
|
/* 个人资料区 */
|
||||||
.card-profile {
|
.card-profile {
|
||||||
padding: 1.5rem;
|
padding: 1.5rem;
|
||||||
background: linear-gradient(135deg, #7a4dff 0%, #895bff 100%);
|
/* background: linear-gradient(
|
||||||
|
135deg,
|
||||||
|
#7a4dff 0%,
|
||||||
|
#895bff 100%
|
||||||
|
); */
|
||||||
|
background: #ff7bac;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,7 +213,7 @@ const getInitials = (name) => {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #895bff;
|
color: #ffbfd7;
|
||||||
}
|
}
|
||||||
|
|
||||||
.profile-info {
|
.profile-info {
|
||||||
|
@ -102,7 +102,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
style="font-size: 18px;flex-shrink: 0; margin: 0 0 0 0.6rem;"
|
style="font-size: 18px; flex-shrink: 0; margin: 0 0 0 0.6rem"
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
@click="handleLink(item)"
|
@click="handleLink(item)"
|
||||||
>
|
>
|
||||||
@ -115,11 +115,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="newList.length === 0" class="flex justify-center items-center">
|
<div
|
||||||
|
v-if="newList.length === 0"
|
||||||
|
class="flex justify-center items-center"
|
||||||
|
>
|
||||||
<img
|
<img
|
||||||
src="@/assets/image/icon/default-empty.png"
|
src="@/assets/image/icon/default-empty.png"
|
||||||
alt="empty"
|
alt="empty"
|
||||||
style="width: 109px; height: 60px;"
|
style="width: 109px; height: 60px"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -231,10 +234,10 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref, onUnmounted, computed, nextTick, watch } from "vue";
|
import { onMounted, ref, onUnmounted, computed, nextTick, watch } from "vue";
|
||||||
import { NTooltip } from 'naive-ui'
|
import { NTooltip } from "naive-ui";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { useStockQuote } from "@/store/stock-quote/index.js";
|
import { useStockQuote } from "@/store/stock-quote/index.js";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
||||||
|
|
||||||
getStockQuate();
|
getStockQuate();
|
||||||
@ -258,29 +261,29 @@ const newList = ref([
|
|||||||
|
|
||||||
// 获取新闻发布(展示在首页的)
|
// 获取新闻发布(展示在首页的)
|
||||||
const getPressReleasesDisplay = () => {
|
const getPressReleasesDisplay = () => {
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/pressreleases/display'
|
let url = "https://erpapi.fiee.com/api/fiee/pressreleases/display";
|
||||||
let params = {
|
let params = {
|
||||||
page: 1,
|
page: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
display: 2, // 1: 不展示在首页 2: 展示在首页
|
display: 2, // 1: 不展示在首页 2: 展示在首页
|
||||||
}
|
};
|
||||||
// console.log(params)
|
// console.log(params)
|
||||||
axios.post(url, params).then((res) => {
|
axios.post(url, params).then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
res.data.data?.data?.forEach((item) => {
|
res.data.data?.data?.forEach((item) => {
|
||||||
item.time = new Date(item.createdAt).toLocaleDateString('en-US', {
|
item.time = new Date(item.createdAt).toLocaleDateString("en-US", {
|
||||||
month: 'long',
|
month: "long",
|
||||||
day: 'numeric',
|
day: "numeric",
|
||||||
year: 'numeric',
|
year: "numeric",
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
newList.value = res.data.data?.data || []
|
newList.value = res.data.data?.data || [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
if (contentRef.value && "IntersectionObserver" in window) {
|
if (contentRef.value && "IntersectionObserver" in window) {
|
||||||
@ -306,35 +309,40 @@ onMounted(() => {
|
|||||||
// 回退方案:如果不支持IntersectionObserver则直接显示
|
// 回退方案:如果不支持IntersectionObserver则直接显示
|
||||||
isInView.value = true;
|
isInView.value = true;
|
||||||
}
|
}
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
newList.value.forEach((item, idx) => {
|
newList.value.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
watch(() => newList.value, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => newList.value,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
if (observer) {
|
if (observer) {
|
||||||
@ -355,7 +363,6 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.home-page {
|
.home-page {
|
||||||
background-image: url("@/assets/image/bg-mobile.png");
|
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
@ -368,7 +375,7 @@ const handleLink = (item) => {
|
|||||||
}
|
}
|
||||||
/* 顶部大图区域 */
|
/* 顶部大图区域 */
|
||||||
.hero-section {
|
.hero-section {
|
||||||
background: linear-gradient(135deg, #1a2a6c, #895bff, #fdbb2d);
|
background: linear-gradient(135deg, #00ffff, #b21f1f, #ff7bac);
|
||||||
background-size: 400% 400%;
|
background-size: 400% 400%;
|
||||||
animation: gradientBG 15s ease infinite;
|
animation: gradientBG 15s ease infinite;
|
||||||
color: white;
|
color: white;
|
||||||
@ -419,7 +426,7 @@ const handleLink = (item) => {
|
|||||||
.section-title {
|
.section-title {
|
||||||
font-size: 1.5rem; /* 18px */
|
font-size: 1.5rem; /* 18px */
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
color: #895bff;
|
color: #ff7bac;
|
||||||
}
|
}
|
||||||
.section-titles {
|
.section-titles {
|
||||||
font-size: 2.5rem;
|
font-size: 2.5rem;
|
||||||
@ -525,7 +532,7 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
/* 股票信息卡片样式 */
|
/* 股票信息卡片样式 */
|
||||||
.stock-card {
|
.stock-card {
|
||||||
border-top: 4px solid #895bff;
|
border-top: 4px solid #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stock-data {
|
.stock-data {
|
||||||
@ -551,7 +558,7 @@ const handleLink = (item) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.positive {
|
.positive {
|
||||||
color: #895bff;
|
color: #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stock-chart-placeholder {
|
.stock-chart-placeholder {
|
||||||
@ -575,7 +582,7 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
/* 活动预告卡片样式 */
|
/* 活动预告卡片样式 */
|
||||||
.events-card {
|
.events-card {
|
||||||
border-top: 4px solid #10b981;
|
border-top: 4px solid #00ffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.event-item {
|
.event-item {
|
||||||
@ -628,7 +635,7 @@ const handleLink = (item) => {
|
|||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 30px;
|
padding: 30px;
|
||||||
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);
|
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);
|
||||||
border-left: 4px solid #895bff;
|
border-left: 4px solid #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-date {
|
.news-date {
|
||||||
|
@ -102,7 +102,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
style="font-size: 18px;flex-shrink: 0; margin: 0 0 0 0.6rem;"
|
style="font-size: 18px; flex-shrink: 0; margin: 0 0 0 0.6rem"
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
@click="handleLink(item)"
|
@click="handleLink(item)"
|
||||||
>
|
>
|
||||||
@ -115,11 +115,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="newList.length === 0" class="flex justify-center items-center">
|
<div
|
||||||
|
v-if="newList.length === 0"
|
||||||
|
class="flex justify-center items-center"
|
||||||
|
>
|
||||||
<img
|
<img
|
||||||
src="@/assets/image/icon/default-empty.png"
|
src="@/assets/image/icon/default-empty.png"
|
||||||
alt="empty"
|
alt="empty"
|
||||||
style="width: 109px; height: 60px;"
|
style="width: 109px; height: 60px"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -221,10 +224,10 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref, onUnmounted, computed, nextTick, watch } from "vue";
|
import { onMounted, ref, onUnmounted, computed, nextTick, watch } from "vue";
|
||||||
import { NTooltip } from 'naive-ui'
|
import { NTooltip } from "naive-ui";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { useStockQuote } from "@/store/stock-quote/index.js";
|
import { useStockQuote } from "@/store/stock-quote/index.js";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
||||||
getStockQuate();
|
getStockQuate();
|
||||||
// 示例数据
|
// 示例数据
|
||||||
@ -245,29 +248,29 @@ const newList = ref([
|
|||||||
|
|
||||||
// 获取新闻发布(展示在首页的)
|
// 获取新闻发布(展示在首页的)
|
||||||
const getPressReleasesDisplay = () => {
|
const getPressReleasesDisplay = () => {
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/pressreleases/display'
|
let url = "https://erpapi.fiee.com/api/fiee/pressreleases/display";
|
||||||
let params = {
|
let params = {
|
||||||
page: 1,
|
page: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
display: 2, // 1: 不展示在首页 2: 展示在首页
|
display: 2, // 1: 不展示在首页 2: 展示在首页
|
||||||
}
|
};
|
||||||
// console.log(params)
|
// console.log(params)
|
||||||
axios.post(url, params).then((res) => {
|
axios.post(url, params).then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
res.data.data?.data?.forEach((item) => {
|
res.data.data?.data?.forEach((item) => {
|
||||||
item.time = new Date(item.createdAt).toLocaleDateString('en-US', {
|
item.time = new Date(item.createdAt).toLocaleDateString("en-US", {
|
||||||
month: 'long',
|
month: "long",
|
||||||
day: 'numeric',
|
day: "numeric",
|
||||||
year: 'numeric',
|
year: "numeric",
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
newList.value = res.data.data?.data || []
|
newList.value = res.data.data?.data || [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
const { t: $t } = useI18n();
|
const { t: $t } = useI18n();
|
||||||
const contentRef = ref(null);
|
const contentRef = ref(null);
|
||||||
@ -297,35 +300,40 @@ onMounted(() => {
|
|||||||
// 回退方案:如果不支持IntersectionObserver则直接显示
|
// 回退方案:如果不支持IntersectionObserver则直接显示
|
||||||
isInView.value = true;
|
isInView.value = true;
|
||||||
}
|
}
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
newList.value.forEach((item, idx) => {
|
newList.value.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
watch(() => newList.value, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => newList.value,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
if (observer) {
|
if (observer) {
|
||||||
@ -359,7 +367,7 @@ const handleLink = (item) => {
|
|||||||
}
|
}
|
||||||
/* 顶部大图区域 */
|
/* 顶部大图区域 */
|
||||||
.hero-section {
|
.hero-section {
|
||||||
background: linear-gradient(135deg, #1a2a6c, #895bff, #fdbb2d);
|
background: linear-gradient(135deg, #00ffff, #b21f1f, #ff7bac);
|
||||||
background-size: 400% 400%;
|
background-size: 400% 400%;
|
||||||
animation: gradientBG 15s ease infinite;
|
animation: gradientBG 15s ease infinite;
|
||||||
color: white;
|
color: white;
|
||||||
@ -410,7 +418,7 @@ const handleLink = (item) => {
|
|||||||
.section-title {
|
.section-title {
|
||||||
font-size: 1.5rem; /* 18px */
|
font-size: 1.5rem; /* 18px */
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
color: #895bff;
|
color: #ff7bac;
|
||||||
}
|
}
|
||||||
.section-titles {
|
.section-titles {
|
||||||
font-size: 2.5rem;
|
font-size: 2.5rem;
|
||||||
@ -516,7 +524,7 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
/* 股票信息卡片样式 */
|
/* 股票信息卡片样式 */
|
||||||
.stock-card {
|
.stock-card {
|
||||||
border-top: 4px solid #895bff;
|
border-top: 4px solid #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stock-data {
|
.stock-data {
|
||||||
@ -542,7 +550,7 @@ const handleLink = (item) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.positive {
|
.positive {
|
||||||
color: #895bff;
|
color: #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stock-chart-placeholder {
|
.stock-chart-placeholder {
|
||||||
@ -566,7 +574,7 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
/* 活动预告卡片样式 */
|
/* 活动预告卡片样式 */
|
||||||
.events-card {
|
.events-card {
|
||||||
border-top: 4px solid #10b981;
|
border-top: 4px solid #00ffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.event-item {
|
.event-item {
|
||||||
@ -619,7 +627,7 @@ const handleLink = (item) => {
|
|||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 30px;
|
padding: 30px;
|
||||||
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);
|
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);
|
||||||
border-left: 4px solid #895bff;
|
border-left: 4px solid #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-date {
|
.news-date {
|
||||||
|
@ -102,7 +102,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
style="font-size: 18px;flex-shrink: 0;margin: 0 0 0 0.6rem;"
|
style="font-size: 18px; flex-shrink: 0; margin: 0 0 0 0.6rem"
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
@click="handleLink(item)"
|
@click="handleLink(item)"
|
||||||
>
|
>
|
||||||
@ -115,11 +115,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="newList.length === 0" class="flex justify-center items-center">
|
<div
|
||||||
|
v-if="newList.length === 0"
|
||||||
|
class="flex justify-center items-center"
|
||||||
|
>
|
||||||
<img
|
<img
|
||||||
src="@/assets/image/icon/default-empty.png"
|
src="@/assets/image/icon/default-empty.png"
|
||||||
alt="empty"
|
alt="empty"
|
||||||
style="width: 109px; height: 60px;"
|
style="width: 109px; height: 60px"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -231,10 +234,10 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref, onUnmounted, computed, nextTick, watch } from "vue";
|
import { onMounted, ref, onUnmounted, computed, nextTick, watch } from "vue";
|
||||||
import { NTooltip } from 'naive-ui'
|
import { NTooltip } from "naive-ui";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { useStockQuote } from "@/store/stock-quote/index.js";
|
import { useStockQuote } from "@/store/stock-quote/index.js";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
||||||
getStockQuate();
|
getStockQuate();
|
||||||
const { t: $t } = useI18n();
|
const { t: $t } = useI18n();
|
||||||
@ -256,29 +259,29 @@ const newList = ref([
|
|||||||
|
|
||||||
// 获取新闻发布(展示在首页的)
|
// 获取新闻发布(展示在首页的)
|
||||||
const getPressReleasesDisplay = () => {
|
const getPressReleasesDisplay = () => {
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/pressreleases/display'
|
let url = "https://erpapi.fiee.com/api/fiee/pressreleases/display";
|
||||||
let params = {
|
let params = {
|
||||||
page: 1,
|
page: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
display: 2, // 1: 不展示在首页 2: 展示在首页
|
display: 2, // 1: 不展示在首页 2: 展示在首页
|
||||||
}
|
};
|
||||||
// console.log(params)
|
// console.log(params)
|
||||||
axios.post(url, params).then((res) => {
|
axios.post(url, params).then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
res.data.data?.data?.forEach((item) => {
|
res.data.data?.data?.forEach((item) => {
|
||||||
item.time = new Date(item.createdAt).toLocaleDateString('en-US', {
|
item.time = new Date(item.createdAt).toLocaleDateString("en-US", {
|
||||||
month: 'long',
|
month: "long",
|
||||||
day: 'numeric',
|
day: "numeric",
|
||||||
year: 'numeric',
|
year: "numeric",
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
newList.value = res.data.data?.data || []
|
newList.value = res.data.data?.data || [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
if (contentRef.value && "IntersectionObserver" in window) {
|
if (contentRef.value && "IntersectionObserver" in window) {
|
||||||
@ -304,35 +307,40 @@ onMounted(() => {
|
|||||||
// 回退方案:如果不支持IntersectionObserver则直接显示
|
// 回退方案:如果不支持IntersectionObserver则直接显示
|
||||||
isInView.value = true;
|
isInView.value = true;
|
||||||
}
|
}
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
newList.value.forEach((item, idx) => {
|
newList.value.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
watch(() => newList.value, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => newList.value,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
if (observer) {
|
if (observer) {
|
||||||
@ -353,7 +361,6 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.home-page {
|
.home-page {
|
||||||
background-image: url("@/assets/image/bg-mobile.png");
|
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
@ -366,7 +373,7 @@ const handleLink = (item) => {
|
|||||||
}
|
}
|
||||||
/* 顶部大图区域 */
|
/* 顶部大图区域 */
|
||||||
.hero-section {
|
.hero-section {
|
||||||
background: linear-gradient(135deg, #1a2a6c, #895bff, #fdbb2d);
|
background: linear-gradient(135deg, #00ffff, #b21f1f, #ff7bac);
|
||||||
background-size: 400% 400%;
|
background-size: 400% 400%;
|
||||||
animation: gradientBG 15s ease infinite;
|
animation: gradientBG 15s ease infinite;
|
||||||
color: white;
|
color: white;
|
||||||
@ -417,7 +424,7 @@ const handleLink = (item) => {
|
|||||||
.section-title {
|
.section-title {
|
||||||
font-size: 1.5rem; /* 18px */
|
font-size: 1.5rem; /* 18px */
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
color: #895bff;
|
color: #ff7bac;
|
||||||
}
|
}
|
||||||
.section-titles {
|
.section-titles {
|
||||||
font-size: 2.5rem;
|
font-size: 2.5rem;
|
||||||
@ -523,7 +530,7 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
/* 股票信息卡片样式 */
|
/* 股票信息卡片样式 */
|
||||||
.stock-card {
|
.stock-card {
|
||||||
border-top: 4px solid #895bff;
|
border-top: 4px solid #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stock-data {
|
.stock-data {
|
||||||
@ -549,7 +556,7 @@ const handleLink = (item) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.positive {
|
.positive {
|
||||||
color: #895bff;
|
color: #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stock-chart-placeholder {
|
.stock-chart-placeholder {
|
||||||
@ -573,7 +580,7 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
/* 活动预告卡片样式 */
|
/* 活动预告卡片样式 */
|
||||||
.events-card {
|
.events-card {
|
||||||
border-top: 4px solid #10b981;
|
border-top: 4px solid #00ffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.event-item {
|
.event-item {
|
||||||
@ -626,7 +633,7 @@ const handleLink = (item) => {
|
|||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 30px;
|
padding: 30px;
|
||||||
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);
|
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);
|
||||||
border-left: 4px solid #895bff;
|
border-left: 4px solid #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-date {
|
.news-date {
|
||||||
|
@ -102,7 +102,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
style="font-size: 18px;flex-shrink: 0; margin: 0 0 0 0.9rem;"
|
style="font-size: 18px; flex-shrink: 0; margin: 0 0 0 0.9rem"
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
@click="handleLink(item)"
|
@click="handleLink(item)"
|
||||||
>
|
>
|
||||||
@ -115,11 +115,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="newList.length === 0" class="flex justify-center items-center">
|
<div
|
||||||
|
v-if="newList.length === 0"
|
||||||
|
class="flex justify-center items-center"
|
||||||
|
>
|
||||||
<img
|
<img
|
||||||
src="@/assets/image/icon/default-empty.png"
|
src="@/assets/image/icon/default-empty.png"
|
||||||
alt="empty"
|
alt="empty"
|
||||||
style="width: 109px; height: 60px;"
|
style="width: 109px; height: 60px"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -231,10 +234,10 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref, onUnmounted, computed, nextTick, watch } from "vue";
|
import { onMounted, ref, onUnmounted, computed, nextTick, watch } from "vue";
|
||||||
import { NTooltip } from 'naive-ui'
|
import { NTooltip } from "naive-ui";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { useStockQuote } from "@/store/stock-quote/index.js";
|
import { useStockQuote } from "@/store/stock-quote/index.js";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
||||||
|
|
||||||
getStockQuate();
|
getStockQuate();
|
||||||
@ -281,61 +284,66 @@ onMounted(() => {
|
|||||||
// 回退方案:如果不支持IntersectionObserver则直接显示
|
// 回退方案:如果不支持IntersectionObserver则直接显示
|
||||||
isInView.value = true;
|
isInView.value = true;
|
||||||
}
|
}
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
newList.value.forEach((item, idx) => {
|
newList.value.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
watch(() => newList.value, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => newList.value,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
// 获取新闻发布(展示在首页的)
|
// 获取新闻发布(展示在首页的)
|
||||||
const getPressReleasesDisplay = () => {
|
const getPressReleasesDisplay = () => {
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/pressreleases/display'
|
let url = "https://erpapi.fiee.com/api/fiee/pressreleases/display";
|
||||||
let params = {
|
let params = {
|
||||||
page: 1,
|
page: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
display: 2, // 1: 不展示在首页 2: 展示在首页
|
display: 2, // 1: 不展示在首页 2: 展示在首页
|
||||||
}
|
};
|
||||||
// console.log(params)
|
// console.log(params)
|
||||||
axios.post(url, params).then((res) => {
|
axios.post(url, params).then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
res.data.data?.data?.forEach((item) => {
|
res.data.data?.data?.forEach((item) => {
|
||||||
item.time = new Date(item.createdAt).toLocaleDateString('en-US', {
|
item.time = new Date(item.createdAt).toLocaleDateString("en-US", {
|
||||||
month: 'long',
|
month: "long",
|
||||||
day: 'numeric',
|
day: "numeric",
|
||||||
year: 'numeric',
|
year: "numeric",
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
newList.value = res.data.data?.data || []
|
newList.value = res.data.data?.data || [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
if (observer) {
|
if (observer) {
|
||||||
@ -356,7 +364,6 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.home-page {
|
.home-page {
|
||||||
background-image: url("@/assets/image/bg-mobile.png");
|
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
@ -369,7 +376,7 @@ const handleLink = (item) => {
|
|||||||
}
|
}
|
||||||
/* 顶部大图区域 */
|
/* 顶部大图区域 */
|
||||||
.hero-section {
|
.hero-section {
|
||||||
background: linear-gradient(135deg, #1a2a6c, #895bff, #fdbb2d);
|
background: linear-gradient(135deg, #00ffff, #b21f1f, #ff7bac);
|
||||||
background-size: 400% 400%;
|
background-size: 400% 400%;
|
||||||
animation: gradientBG 15s ease infinite;
|
animation: gradientBG 15s ease infinite;
|
||||||
color: white;
|
color: white;
|
||||||
@ -420,7 +427,7 @@ const handleLink = (item) => {
|
|||||||
.section-title {
|
.section-title {
|
||||||
font-size: 1.5rem; /* 18px */
|
font-size: 1.5rem; /* 18px */
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
color: #895bff;
|
color: #ff7bac;
|
||||||
}
|
}
|
||||||
.section-titles {
|
.section-titles {
|
||||||
font-size: 2.5rem;
|
font-size: 2.5rem;
|
||||||
@ -526,7 +533,7 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
/* 股票信息卡片样式 */
|
/* 股票信息卡片样式 */
|
||||||
.stock-card {
|
.stock-card {
|
||||||
border-top: 4px solid #895bff;
|
border-top: 4px solid #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stock-data {
|
.stock-data {
|
||||||
@ -552,7 +559,7 @@ const handleLink = (item) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.positive {
|
.positive {
|
||||||
color: #895bff;
|
color: #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stock-chart-placeholder {
|
.stock-chart-placeholder {
|
||||||
@ -576,7 +583,7 @@ const handleLink = (item) => {
|
|||||||
|
|
||||||
/* 活动预告卡片样式 */
|
/* 活动预告卡片样式 */
|
||||||
.events-card {
|
.events-card {
|
||||||
border-top: 4px solid #10b981;
|
border-top: 4px solid #00ffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.event-item {
|
.event-item {
|
||||||
@ -629,7 +636,7 @@ const handleLink = (item) => {
|
|||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 30px;
|
padding: 30px;
|
||||||
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);
|
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);
|
||||||
border-left: 4px solid #895bff;
|
border-left: 4px solid #ff7bac;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-date {
|
.news-date {
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<n-infinite-scroll :distance="0" @load="doLoadMore">
|
<n-infinite-scroll :distance="0" @load="doLoadMore">
|
||||||
<main class="p-[35px] max-w-[1200px] mx-auto">
|
<main class="p-[35px] max-w-[1200px] mx-auto">
|
||||||
<div class="title mb-[20px]">
|
<div class="title mb-[20px]">
|
||||||
{{ t('press_releases.title') }}
|
{{ t("press_releases.title") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="search-container">
|
<div class="search-container">
|
||||||
<n-select
|
<n-select
|
||||||
@ -17,12 +17,8 @@
|
|||||||
:placeholder="t('press_releases.search.placeholder')"
|
:placeholder="t('press_releases.search.placeholder')"
|
||||||
class="search-input"
|
class="search-input"
|
||||||
/>
|
/>
|
||||||
<n-button
|
<n-button @click="handleSearch" class="search-button w-[80px]">
|
||||||
type="primary"
|
{{ t("press_releases.search.button") }}
|
||||||
@click="handleSearch"
|
|
||||||
class="search-button w-[80px]"
|
|
||||||
>
|
|
||||||
{{ t('press_releases.search.button') }}
|
|
||||||
</n-button>
|
</n-button>
|
||||||
</div>
|
</div>
|
||||||
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
|
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
|
||||||
@ -30,7 +26,14 @@
|
|||||||
<div class="news-item-date">{{ item.date }}</div>
|
<div class="news-item-date">{{ item.date }}</div>
|
||||||
<div
|
<div
|
||||||
class="news-item-title text-[#0078d7] cursor-pointer"
|
class="news-item-title text-[#0078d7] cursor-pointer"
|
||||||
style="word-break: break-word; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis;"
|
style="
|
||||||
|
word-break: break-word;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
"
|
||||||
@click="handleNewClick(item)"
|
@click="handleNewClick(item)"
|
||||||
>
|
>
|
||||||
{{ item.title }}
|
{{ item.title }}
|
||||||
@ -53,11 +56,11 @@
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{item.summary}}
|
{{ item.summary }}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div slot="content">
|
<div slot="content">
|
||||||
{{item.summary}}
|
{{ item.summary }}
|
||||||
</div>
|
</div>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
</div>
|
</div>
|
||||||
@ -72,7 +75,7 @@ import customDefaultPage from "@/components/customDefaultPage/index.vue";
|
|||||||
import { reactive, onMounted, watch, nextTick, ref } from "vue";
|
import { reactive, onMounted, watch, nextTick, ref } from "vue";
|
||||||
import { NSelect, NInput, NButton, NInfiniteScroll, NTooltip } from "naive-ui";
|
import { NSelect, NInput, NButton, NInfiniteScroll, NTooltip } from "naive-ui";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
|
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@ -117,80 +120,85 @@ const state = reactive({
|
|||||||
currentPage: 1, //当前页码
|
currentPage: 1, //当前页码
|
||||||
});
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
state.filterNewsData.forEach((item, idx) => {
|
state.filterNewsData.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// state.filterNewsData = state.newsData;
|
// state.filterNewsData = state.newsData;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
watch(() => state.filterNewsData, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => state.filterNewsData,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
// 获取新闻列表
|
// 获取新闻列表
|
||||||
const getPressReleasesDisplay = () => {
|
const getPressReleasesDisplay = () => {
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/pressreleases/display'
|
let url = "https://erpapi.fiee.com/api/fiee/pressreleases/display";
|
||||||
let params = {
|
let params = {
|
||||||
query: state.inputValue,
|
query: state.inputValue,
|
||||||
page: state.currentPage,
|
page: state.currentPage,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
timeStart: state.selectedValue
|
timeStart: state.selectedValue
|
||||||
? state.selectedValue === 'all_years'
|
? state.selectedValue === "all_years"
|
||||||
? null
|
? null
|
||||||
: new Date(state.selectedValue).getTime()
|
: new Date(state.selectedValue).getTime()
|
||||||
: null,
|
: null,
|
||||||
}
|
};
|
||||||
// console.log(params)
|
// console.log(params)
|
||||||
axios.post(url, params).then((res) => {
|
axios.post(url, params).then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
res.data.data?.data?.forEach((item) => {
|
res.data.data?.data?.forEach((item) => {
|
||||||
item.date = new Date(item.createdAt).toLocaleDateString('en-US', {
|
item.date = new Date(item.createdAt).toLocaleDateString("en-US", {
|
||||||
month: 'short',
|
month: "short",
|
||||||
day: 'numeric',
|
day: "numeric",
|
||||||
year: 'numeric',
|
year: "numeric",
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
if (state.currentPage === 1) {
|
if (state.currentPage === 1) {
|
||||||
state.filterNewsData = res.data.data?.data || []
|
state.filterNewsData = res.data.data?.data || [];
|
||||||
} else {
|
} else {
|
||||||
state.filterNewsData = [
|
state.filterNewsData = [
|
||||||
...state.filterNewsData,
|
...state.filterNewsData,
|
||||||
...(res.data.data?.data || []),
|
...(res.data.data?.data || []),
|
||||||
]
|
];
|
||||||
}
|
}
|
||||||
if (state.filterNewsData.length < (res.data.data?.total || 0)) {
|
if (state.filterNewsData.length < (res.data.data?.total || 0)) {
|
||||||
state.hasMore = true
|
state.hasMore = true;
|
||||||
} else {
|
} else {
|
||||||
state.hasMore = false
|
state.hasMore = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
const handleFilter = () => {
|
const handleFilter = () => {
|
||||||
// 筛选逻辑
|
// 筛选逻辑
|
||||||
@ -227,16 +235,16 @@ watch(
|
|||||||
() => [state.selectedValue, state.inputValue],
|
() => [state.selectedValue, state.inputValue],
|
||||||
() => {
|
() => {
|
||||||
// handleFilter();
|
// handleFilter();
|
||||||
state.currentPage = 1
|
state.currentPage = 1;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleSearch = () => {
|
const handleSearch = () => {
|
||||||
// 手动触发筛选(保留这个函数以保持兼容性)
|
// 手动触发筛选(保留这个函数以保持兼容性)
|
||||||
// handleFilter();
|
// handleFilter();
|
||||||
state.currentPage = 1
|
state.currentPage = 1;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
// console.log("筛选结果:", state.filterNewsData);
|
// console.log("筛选结果:", state.filterNewsData);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -252,15 +260,15 @@ const handleNewClick = (item) => {
|
|||||||
//加载更多数据
|
//加载更多数据
|
||||||
const doLoadMore = () => {
|
const doLoadMore = () => {
|
||||||
if (!state.hasMore || state.loading) {
|
if (!state.hasMore || state.loading) {
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
// console.log('触底了')
|
// console.log('触底了')
|
||||||
state.loading = true
|
state.loading = true;
|
||||||
state.currentPage++
|
state.currentPage++;
|
||||||
getPressReleasesDisplay().finally(() => {
|
getPressReleasesDisplay().finally(() => {
|
||||||
state.loading = false
|
state.loading = false;
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -309,4 +317,8 @@ const doLoadMore = () => {
|
|||||||
padding: 20px 16px;
|
padding: 20px 16px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
.search-button {
|
||||||
|
background: #ff7bac;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<n-infinite-scroll :distance="0" @load="doLoadMore">
|
<n-infinite-scroll :distance="0" @load="doLoadMore">
|
||||||
<main class="p-[35px] max-w-[1200px] mx-auto">
|
<main class="p-[35px] max-w-[1200px] mx-auto">
|
||||||
<div class="title mb-[20px]">
|
<div class="title mb-[20px]">
|
||||||
{{ t('press_releases.title') }}
|
{{ t("press_releases.title") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="search-container">
|
<div class="search-container">
|
||||||
<n-select
|
<n-select
|
||||||
@ -17,12 +17,8 @@
|
|||||||
:placeholder="t('press_releases.search.placeholder')"
|
:placeholder="t('press_releases.search.placeholder')"
|
||||||
class="search-input"
|
class="search-input"
|
||||||
/>
|
/>
|
||||||
<n-button
|
<n-button @click="handleSearch" class="search-button w-[60px]">
|
||||||
type="primary"
|
{{ t("press_releases.search.button") }}
|
||||||
@click="handleSearch"
|
|
||||||
class="search-button w-[60px]"
|
|
||||||
>
|
|
||||||
{{ t('press_releases.search.button') }}
|
|
||||||
</n-button>
|
</n-button>
|
||||||
</div>
|
</div>
|
||||||
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
|
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
|
||||||
@ -30,7 +26,14 @@
|
|||||||
<div class="news-item-date">{{ item.date }}</div>
|
<div class="news-item-date">{{ item.date }}</div>
|
||||||
<div
|
<div
|
||||||
class="news-item-title text-[#0078d7] cursor-pointer"
|
class="news-item-title text-[#0078d7] cursor-pointer"
|
||||||
style="word-break: break-word; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis;"
|
style="
|
||||||
|
word-break: break-word;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
"
|
||||||
@click="handleNewClick(item)"
|
@click="handleNewClick(item)"
|
||||||
>
|
>
|
||||||
{{ item.title }}
|
{{ item.title }}
|
||||||
@ -53,11 +56,11 @@
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{item.summary}}
|
{{ item.summary }}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div slot="content">
|
<div slot="content">
|
||||||
{{item.summary}}
|
{{ item.summary }}
|
||||||
</div>
|
</div>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
</div>
|
</div>
|
||||||
@ -72,7 +75,7 @@ import customDefaultPage from "@/components/customDefaultPage/index.vue";
|
|||||||
import { reactive, onMounted, watch, nextTick, ref } from "vue";
|
import { reactive, onMounted, watch, nextTick, ref } from "vue";
|
||||||
import { NSelect, NInput, NButton, NInfiniteScroll, NTooltip } from "naive-ui";
|
import { NSelect, NInput, NButton, NInfiniteScroll, NTooltip } from "naive-ui";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
|
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@ -117,80 +120,85 @@ const state = reactive({
|
|||||||
currentPage: 1, //当前页码
|
currentPage: 1, //当前页码
|
||||||
});
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
state.filterNewsData.forEach((item, idx) => {
|
state.filterNewsData.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// state.filterNewsData = state.newsData;
|
// state.filterNewsData = state.newsData;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
watch(() => state.filterNewsData, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => state.filterNewsData,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
// 获取新闻列表
|
// 获取新闻列表
|
||||||
const getPressReleasesDisplay = () => {
|
const getPressReleasesDisplay = () => {
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/pressreleases/display'
|
let url = "https://erpapi.fiee.com/api/fiee/pressreleases/display";
|
||||||
let params = {
|
let params = {
|
||||||
query: state.inputValue,
|
query: state.inputValue,
|
||||||
page: state.currentPage,
|
page: state.currentPage,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
timeStart: state.selectedValue
|
timeStart: state.selectedValue
|
||||||
? state.selectedValue === 'all_years'
|
? state.selectedValue === "all_years"
|
||||||
? null
|
? null
|
||||||
: new Date(state.selectedValue).getTime()
|
: new Date(state.selectedValue).getTime()
|
||||||
: null,
|
: null,
|
||||||
}
|
};
|
||||||
// console.log(params)
|
// console.log(params)
|
||||||
axios.post(url, params).then((res) => {
|
axios.post(url, params).then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
res.data.data?.data?.forEach((item) => {
|
res.data.data?.data?.forEach((item) => {
|
||||||
item.date = new Date(item.createdAt).toLocaleDateString('en-US', {
|
item.date = new Date(item.createdAt).toLocaleDateString("en-US", {
|
||||||
month: 'short',
|
month: "short",
|
||||||
day: 'numeric',
|
day: "numeric",
|
||||||
year: 'numeric',
|
year: "numeric",
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
if (state.currentPage === 1) {
|
if (state.currentPage === 1) {
|
||||||
state.filterNewsData = res.data.data?.data || []
|
state.filterNewsData = res.data.data?.data || [];
|
||||||
} else {
|
} else {
|
||||||
state.filterNewsData = [
|
state.filterNewsData = [
|
||||||
...state.filterNewsData,
|
...state.filterNewsData,
|
||||||
...(res.data.data?.data || []),
|
...(res.data.data?.data || []),
|
||||||
]
|
];
|
||||||
}
|
}
|
||||||
if (state.filterNewsData.length < (res.data.data?.total || 0)) {
|
if (state.filterNewsData.length < (res.data.data?.total || 0)) {
|
||||||
state.hasMore = true
|
state.hasMore = true;
|
||||||
} else {
|
} else {
|
||||||
state.hasMore = false
|
state.hasMore = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
const handleFilter = () => {
|
const handleFilter = () => {
|
||||||
// 筛选逻辑
|
// 筛选逻辑
|
||||||
@ -227,16 +235,16 @@ watch(
|
|||||||
() => [state.selectedValue, state.inputValue],
|
() => [state.selectedValue, state.inputValue],
|
||||||
() => {
|
() => {
|
||||||
// handleFilter();
|
// handleFilter();
|
||||||
state.currentPage = 1
|
state.currentPage = 1;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleSearch = () => {
|
const handleSearch = () => {
|
||||||
// 手动触发筛选(保留这个函数以保持兼容性)
|
// 手动触发筛选(保留这个函数以保持兼容性)
|
||||||
// handleFilter();
|
// handleFilter();
|
||||||
state.currentPage = 1
|
state.currentPage = 1;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
// console.log("筛选结果:", state.filterNewsData);
|
// console.log("筛选结果:", state.filterNewsData);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -252,15 +260,15 @@ const handleNewClick = (item) => {
|
|||||||
//加载更多数据
|
//加载更多数据
|
||||||
const doLoadMore = () => {
|
const doLoadMore = () => {
|
||||||
if (!state.hasMore || state.loading) {
|
if (!state.hasMore || state.loading) {
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
// console.log('触底了')
|
// console.log('触底了')
|
||||||
state.loading = true
|
state.loading = true;
|
||||||
state.currentPage++
|
state.currentPage++;
|
||||||
getPressReleasesDisplay().finally(() => {
|
getPressReleasesDisplay().finally(() => {
|
||||||
state.loading = false
|
state.loading = false;
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -309,4 +317,8 @@ const doLoadMore = () => {
|
|||||||
padding: 20px 16px;
|
padding: 20px 16px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
.search-button {
|
||||||
|
background: #ff7bac;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="press-releases-page">
|
<div class="press-releases-page">
|
||||||
<n-infinite-scroll :distance="0" @load="doLoadMore">
|
<n-infinite-scroll :distance="0" @load="doLoadMore">
|
||||||
<main
|
<main class="p-[80px] mx-auto" style="max-width: 100vw; min-width: 285px">
|
||||||
class="p-[80px] mx-auto"
|
|
||||||
style="max-width: 100vw; min-width: 285px;"
|
|
||||||
>
|
|
||||||
<div class="title mb-[24px]">
|
<div class="title mb-[24px]">
|
||||||
{{ t('press_releases.title') }}
|
{{ t("press_releases.title") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="search-container">
|
<div class="search-container">
|
||||||
<n-select
|
<n-select
|
||||||
@ -23,13 +20,8 @@
|
|||||||
clearable
|
clearable
|
||||||
:font-size="72"
|
:font-size="72"
|
||||||
/>
|
/>
|
||||||
<n-button
|
<n-button @click="handleSearch" class="search-button" :font-size="72">
|
||||||
type="primary"
|
{{ t("press_releases.search.button") }}
|
||||||
@click="handleSearch"
|
|
||||||
class="search-button"
|
|
||||||
:font-size="72"
|
|
||||||
>
|
|
||||||
{{ t('press_releases.search.button') }}
|
|
||||||
</n-button>
|
</n-button>
|
||||||
</div>
|
</div>
|
||||||
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
|
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
|
||||||
@ -37,7 +29,14 @@
|
|||||||
<div class="news-item-date">{{ item.date }}</div>
|
<div class="news-item-date">{{ item.date }}</div>
|
||||||
<div
|
<div
|
||||||
class="news-item-title text-[#0078d7] cursor-pointer"
|
class="news-item-title text-[#0078d7] cursor-pointer"
|
||||||
style="word-break: break-word; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis;"
|
style="
|
||||||
|
word-break: break-word;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
"
|
||||||
@click="handleNewClick(item)"
|
@click="handleNewClick(item)"
|
||||||
>
|
>
|
||||||
{{ item.title }}
|
{{ item.title }}
|
||||||
@ -60,11 +59,11 @@
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{item.summary}}
|
{{ item.summary }}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div slot="content">
|
<div slot="content">
|
||||||
{{item.summary}}
|
{{ item.summary }}
|
||||||
</div>
|
</div>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
</div>
|
</div>
|
||||||
@ -79,7 +78,7 @@ import customDefaultPage from "@/components/customDefaultPage/index.vue";
|
|||||||
import { reactive, onMounted, watch, nextTick, ref } from "vue";
|
import { reactive, onMounted, watch, nextTick, ref } from "vue";
|
||||||
import { NSelect, NInput, NButton, NInfiniteScroll, NTooltip } from "naive-ui";
|
import { NSelect, NInput, NButton, NInfiniteScroll, NTooltip } from "naive-ui";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
|
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@ -124,80 +123,85 @@ const state = reactive({
|
|||||||
currentPage: 1, //当前页码
|
currentPage: 1, //当前页码
|
||||||
});
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
state.filterNewsData.forEach((item, idx) => {
|
state.filterNewsData.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// state.filterNewsData = state.newsData;
|
// state.filterNewsData = state.newsData;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
watch(() => state.filterNewsData, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => state.filterNewsData,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
// 获取新闻列表
|
// 获取新闻列表
|
||||||
const getPressReleasesDisplay = () => {
|
const getPressReleasesDisplay = () => {
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/pressreleases/display'
|
let url = "https://erpapi.fiee.com/api/fiee/pressreleases/display";
|
||||||
let params = {
|
let params = {
|
||||||
query: state.inputValue,
|
query: state.inputValue,
|
||||||
page: state.currentPage,
|
page: state.currentPage,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
timeStart: state.selectedValue
|
timeStart: state.selectedValue
|
||||||
? state.selectedValue === 'all_years'
|
? state.selectedValue === "all_years"
|
||||||
? null
|
? null
|
||||||
: new Date(state.selectedValue).getTime()
|
: new Date(state.selectedValue).getTime()
|
||||||
: null,
|
: null,
|
||||||
}
|
};
|
||||||
// console.log(params)
|
// console.log(params)
|
||||||
axios.post(url, params).then((res) => {
|
axios.post(url, params).then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
res.data.data?.data?.forEach((item) => {
|
res.data.data?.data?.forEach((item) => {
|
||||||
item.date = new Date(item.createdAt).toLocaleDateString('en-US', {
|
item.date = new Date(item.createdAt).toLocaleDateString("en-US", {
|
||||||
month: 'short',
|
month: "short",
|
||||||
day: 'numeric',
|
day: "numeric",
|
||||||
year: 'numeric',
|
year: "numeric",
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
if (state.currentPage === 1) {
|
if (state.currentPage === 1) {
|
||||||
state.filterNewsData = res.data.data?.data || []
|
state.filterNewsData = res.data.data?.data || [];
|
||||||
} else {
|
} else {
|
||||||
state.filterNewsData = [
|
state.filterNewsData = [
|
||||||
...state.filterNewsData,
|
...state.filterNewsData,
|
||||||
...(res.data.data?.data || []),
|
...(res.data.data?.data || []),
|
||||||
]
|
];
|
||||||
}
|
}
|
||||||
if (state.filterNewsData.length < (res.data.data?.total || 0)) {
|
if (state.filterNewsData.length < (res.data.data?.total || 0)) {
|
||||||
state.hasMore = true
|
state.hasMore = true;
|
||||||
} else {
|
} else {
|
||||||
state.hasMore = false
|
state.hasMore = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
const handleFilter = () => {
|
const handleFilter = () => {
|
||||||
// 筛选逻辑
|
// 筛选逻辑
|
||||||
@ -234,16 +238,16 @@ watch(
|
|||||||
() => [state.selectedValue, state.inputValue],
|
() => [state.selectedValue, state.inputValue],
|
||||||
() => {
|
() => {
|
||||||
// handleFilter();
|
// handleFilter();
|
||||||
state.currentPage = 1
|
state.currentPage = 1;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleSearch = () => {
|
const handleSearch = () => {
|
||||||
// 手动触发筛选(保留这个函数以保持兼容性)
|
// 手动触发筛选(保留这个函数以保持兼容性)
|
||||||
// handleFilter();
|
// handleFilter();
|
||||||
state.currentPage = 1
|
state.currentPage = 1;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
// console.log("筛选结果:", state.filterNewsData);
|
// console.log("筛选结果:", state.filterNewsData);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -259,15 +263,15 @@ const handleNewClick = (item) => {
|
|||||||
//加载更多数据
|
//加载更多数据
|
||||||
const doLoadMore = () => {
|
const doLoadMore = () => {
|
||||||
if (!state.hasMore || state.loading) {
|
if (!state.hasMore || state.loading) {
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
// console.log('触底了')
|
// console.log('触底了')
|
||||||
state.loading = true
|
state.loading = true;
|
||||||
state.currentPage++
|
state.currentPage++;
|
||||||
getPressReleasesDisplay().finally(() => {
|
getPressReleasesDisplay().finally(() => {
|
||||||
state.loading = false
|
state.loading = false;
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -346,4 +350,8 @@ const doLoadMore = () => {
|
|||||||
color: #333;
|
color: #333;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
}
|
}
|
||||||
|
.search-button {
|
||||||
|
background: #ff7bac;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="press-releases-page">
|
<div class="press-releases-page">
|
||||||
<n-infinite-scroll :distance="0" @load="doLoadMore">
|
<n-infinite-scroll :distance="0" @load="doLoadMore">
|
||||||
<main class="p-[35px] mx-auto" style="max-width: calc(100% - 100px);">
|
<main class="p-[35px] mx-auto" style="max-width: calc(100% - 100px)">
|
||||||
<div class="title mb-[20px]">
|
<div class="title mb-[20px]">
|
||||||
{{ t('press_releases.title') }}
|
{{ t("press_releases.title") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="search-container">
|
<div class="search-container">
|
||||||
<n-select
|
<n-select
|
||||||
@ -17,12 +17,8 @@
|
|||||||
:placeholder="t('press_releases.search.placeholder')"
|
:placeholder="t('press_releases.search.placeholder')"
|
||||||
class="search-input"
|
class="search-input"
|
||||||
/>
|
/>
|
||||||
<n-button
|
<n-button @click="handleSearch" class="search-button w-[120px]">
|
||||||
type="primary"
|
{{ t("press_releases.search.button") }}
|
||||||
@click="handleSearch"
|
|
||||||
class="search-button w-[120px]"
|
|
||||||
>
|
|
||||||
{{ t('press_releases.search.button') }}
|
|
||||||
</n-button>
|
</n-button>
|
||||||
</div>
|
</div>
|
||||||
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
|
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
|
||||||
@ -30,7 +26,14 @@
|
|||||||
<div class="news-item-date">{{ item.date }}</div>
|
<div class="news-item-date">{{ item.date }}</div>
|
||||||
<div
|
<div
|
||||||
class="news-item-title text-[#0078d7] cursor-pointer"
|
class="news-item-title text-[#0078d7] cursor-pointer"
|
||||||
style="word-break: break-word; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis;"
|
style="
|
||||||
|
word-break: break-word;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
"
|
||||||
@click="handleNewClick(item)"
|
@click="handleNewClick(item)"
|
||||||
>
|
>
|
||||||
{{ item.title }}
|
{{ item.title }}
|
||||||
@ -53,11 +56,11 @@
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
{{item.summary}}
|
{{ item.summary }}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div slot="content">
|
<div slot="content">
|
||||||
{{item.summary}}
|
{{ item.summary }}
|
||||||
</div>
|
</div>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
</div>
|
</div>
|
||||||
@ -72,7 +75,7 @@ import customDefaultPage from "@/components/customDefaultPage/index.vue";
|
|||||||
import { reactive, onMounted, watch, nextTick, ref } from "vue";
|
import { reactive, onMounted, watch, nextTick, ref } from "vue";
|
||||||
import { NSelect, NInput, NButton, NInfiniteScroll, NTooltip } from "naive-ui";
|
import { NSelect, NInput, NButton, NInfiniteScroll, NTooltip } from "naive-ui";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import axios from 'axios'
|
import axios from "axios";
|
||||||
|
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@ -117,80 +120,85 @@ const state = reactive({
|
|||||||
currentPage: 1, //当前页码
|
currentPage: 1, //当前页码
|
||||||
});
|
});
|
||||||
|
|
||||||
const titleRefs = ref([])
|
const titleRefs = ref([]);
|
||||||
|
|
||||||
const setTitleRef = (el, idx) => {
|
const setTitleRef = (el, idx) => {
|
||||||
if (el) titleRefs.value[idx] = el
|
if (el) titleRefs.value[idx] = el;
|
||||||
}
|
};
|
||||||
|
|
||||||
const checkAllTitleOverflow = () => {
|
const checkAllTitleOverflow = () => {
|
||||||
state.filterNewsData.forEach((item, idx) => {
|
state.filterNewsData.forEach((item, idx) => {
|
||||||
const el = titleRefs.value[idx]
|
const el = titleRefs.value[idx];
|
||||||
if (!el) {
|
if (!el) {
|
||||||
item.showTooltip = false
|
item.showTooltip = false;
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
item.showTooltip = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
|
item.showTooltip =
|
||||||
})
|
el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// state.filterNewsData = state.newsData;
|
// state.filterNewsData = state.newsData;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
checkAllTitleOverflow()
|
checkAllTitleOverflow();
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
watch(() => state.filterNewsData, () => {
|
watch(
|
||||||
nextTick(() => {
|
() => state.filterNewsData,
|
||||||
checkAllTitleOverflow()
|
() => {
|
||||||
})
|
nextTick(() => {
|
||||||
}, { deep: true })
|
checkAllTitleOverflow();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
// 获取新闻列表
|
// 获取新闻列表
|
||||||
const getPressReleasesDisplay = () => {
|
const getPressReleasesDisplay = () => {
|
||||||
let url = 'https://erpapi.fiee.com/api/fiee/pressreleases/display'
|
let url = "https://erpapi.fiee.com/api/fiee/pressreleases/display";
|
||||||
let params = {
|
let params = {
|
||||||
query: state.inputValue,
|
query: state.inputValue,
|
||||||
page: state.currentPage,
|
page: state.currentPage,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
timeStart: state.selectedValue
|
timeStart: state.selectedValue
|
||||||
? state.selectedValue === 'all_years'
|
? state.selectedValue === "all_years"
|
||||||
? null
|
? null
|
||||||
: new Date(state.selectedValue).getTime()
|
: new Date(state.selectedValue).getTime()
|
||||||
: null,
|
: null,
|
||||||
}
|
};
|
||||||
// console.log(params)
|
// console.log(params)
|
||||||
axios.post(url, params).then((res) => {
|
axios.post(url, params).then((res) => {
|
||||||
// console.log(res)
|
// console.log(res)
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
if (res.data.status === 0) {
|
if (res.data.status === 0) {
|
||||||
res.data.data?.data?.forEach((item) => {
|
res.data.data?.data?.forEach((item) => {
|
||||||
item.date = new Date(item.createdAt).toLocaleDateString('en-US', {
|
item.date = new Date(item.createdAt).toLocaleDateString("en-US", {
|
||||||
month: 'short',
|
month: "short",
|
||||||
day: 'numeric',
|
day: "numeric",
|
||||||
year: 'numeric',
|
year: "numeric",
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
if (state.currentPage === 1) {
|
if (state.currentPage === 1) {
|
||||||
state.filterNewsData = res.data.data?.data || []
|
state.filterNewsData = res.data.data?.data || [];
|
||||||
} else {
|
} else {
|
||||||
state.filterNewsData = [
|
state.filterNewsData = [
|
||||||
...state.filterNewsData,
|
...state.filterNewsData,
|
||||||
...(res.data.data?.data || []),
|
...(res.data.data?.data || []),
|
||||||
]
|
];
|
||||||
}
|
}
|
||||||
if (state.filterNewsData.length < (res.data.data?.total || 0)) {
|
if (state.filterNewsData.length < (res.data.data?.total || 0)) {
|
||||||
state.hasMore = true
|
state.hasMore = true;
|
||||||
} else {
|
} else {
|
||||||
state.hasMore = false
|
state.hasMore = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
const handleFilter = () => {
|
const handleFilter = () => {
|
||||||
// 筛选逻辑
|
// 筛选逻辑
|
||||||
@ -227,16 +235,16 @@ watch(
|
|||||||
() => [state.selectedValue, state.inputValue],
|
() => [state.selectedValue, state.inputValue],
|
||||||
() => {
|
() => {
|
||||||
// handleFilter();
|
// handleFilter();
|
||||||
state.currentPage = 1
|
state.currentPage = 1;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleSearch = () => {
|
const handleSearch = () => {
|
||||||
// 手动触发筛选(保留这个函数以保持兼容性)
|
// 手动触发筛选(保留这个函数以保持兼容性)
|
||||||
// handleFilter();
|
// handleFilter();
|
||||||
state.currentPage = 1
|
state.currentPage = 1;
|
||||||
getPressReleasesDisplay()
|
getPressReleasesDisplay();
|
||||||
// console.log("筛选结果:", state.filterNewsData);
|
// console.log("筛选结果:", state.filterNewsData);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -252,15 +260,15 @@ const handleNewClick = (item) => {
|
|||||||
//加载更多数据
|
//加载更多数据
|
||||||
const doLoadMore = () => {
|
const doLoadMore = () => {
|
||||||
if (!state.hasMore || state.loading) {
|
if (!state.hasMore || state.loading) {
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
// console.log('触底了')
|
// console.log('触底了')
|
||||||
state.loading = true
|
state.loading = true;
|
||||||
state.currentPage++
|
state.currentPage++;
|
||||||
getPressReleasesDisplay().finally(() => {
|
getPressReleasesDisplay().finally(() => {
|
||||||
state.loading = false
|
state.loading = false;
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -309,4 +317,8 @@ const doLoadMore = () => {
|
|||||||
padding: 20px 16px;
|
padding: 20px 16px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
.search-button {
|
||||||
|
background: #ff7bac;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,19 +1,31 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
|
import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
|
||||||
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
||||||
import {useStockQuote} from '@/store/stock-quote/index.js'
|
import { useStockQuote } from "@/store/stock-quote/index.js";
|
||||||
const {getStockQuate,stockQuote,formatted}=useStockQuote()
|
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
||||||
|
|
||||||
getStockQuate()
|
getStockQuate();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<main
|
||||||
<main ref="main" class="flex pt-80px flex-col md:flex-row justify-center items-center gap-24 rounded-3xl">
|
ref="main"
|
||||||
|
class="flex pt-80px flex-col md:flex-row justify-center items-center gap-24 rounded-3xl"
|
||||||
|
>
|
||||||
<!-- 左侧大号价格 -->
|
<!-- 左侧大号价格 -->
|
||||||
<section class="flex flex-col items-center justify-center glass-card p-24 rounded-2xl shadow-xl">
|
<section
|
||||||
<div class="text-8xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.price }}</div>
|
class="flex flex-col items-center justify-center glass-card p-24 rounded-2xl shadow-xl"
|
||||||
<div class="mt-8 text-2xl text-gray-500 font-semibold tracking-widest mb-8px">NASDAQ: <span class="text-black">FIEE</span></div>
|
>
|
||||||
|
<div
|
||||||
|
class="text-8xl font-extrabold text-#ff7bac animate-bg-move select-none drop-shadow-lg"
|
||||||
|
>
|
||||||
|
${{ stockQuote.price }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="mt-8 text-2xl text-gray-500 font-semibold tracking-widest mb-8px"
|
||||||
|
>
|
||||||
|
NASDAQ: <span class="text-black">FIEE</span>
|
||||||
|
</div>
|
||||||
<div class="text-gray-500">{{ formatted }}</div>
|
<div class="text-gray-500">{{ formatted }}</div>
|
||||||
</section>
|
</section>
|
||||||
<!-- 右侧信息卡片 -->
|
<!-- 右侧信息卡片 -->
|
||||||
@ -24,9 +36,14 @@ getStockQuate()
|
|||||||
</div>
|
</div>
|
||||||
<div class="info-card">
|
<div class="info-card">
|
||||||
<div class="text-base text-gray-400">% Change</div>
|
<div class="text-base text-gray-400">% Change</div>
|
||||||
<div class="text-3xl font-bold"
|
<div
|
||||||
:class="stockQuote.change?.includes('-') ? 'text-green-500' : 'text-red-500'">
|
class="text-3xl font-bold"
|
||||||
{{ stockQuote.change }}</div>
|
:class="
|
||||||
|
stockQuote.change?.includes('-') ? 'text-green-500' : 'text-red-500'
|
||||||
|
"
|
||||||
|
>
|
||||||
|
{{ stockQuote.change }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-card">
|
<div class="info-card">
|
||||||
<div class="text-base text-gray-400">Day's Range</div>
|
<div class="text-base text-gray-400">Day's Range</div>
|
||||||
@ -46,19 +63,17 @@ getStockQuate()
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
/* 玻璃拟态和卡片动画可用 UnoCSS 快捷方式实现,若未配置可加如下样式 */
|
/* 玻璃拟态和卡片动画可用 UnoCSS 快捷方式实现,若未配置可加如下样式 */
|
||||||
.glass-card {
|
.glass-card {
|
||||||
backdrop-filter: blur(16px);
|
backdrop-filter: blur(16px);
|
||||||
background: rgba(255,255,255,0.6);
|
background: rgba(255, 255, 255, 0.6);
|
||||||
border: 1px solid rgba(255,255,255,0.3);
|
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||||
box-shadow: 0 8px 32px 0 rgba(31,38,135,0.18);
|
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.18);
|
||||||
}
|
}
|
||||||
.info-card {
|
.info-card {
|
||||||
@apply glass-card p-5 rounded-xl flex flex-col items-start gap-1 hover:scale-105 transition-transform duration-300;
|
@apply glass-card p-5 rounded-xl flex flex-col items-start gap-1 hover:scale-105 transition-transform duration-300;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -1,19 +1,29 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import {useStockQuote} from '@/store/stock-quote/index.js'
|
import { useStockQuote } from "@/store/stock-quote/index.js";
|
||||||
const {getStockQuate,stockQuote,formatted}=useStockQuote()
|
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
||||||
|
|
||||||
getStockQuate()
|
getStockQuate();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<main
|
<main
|
||||||
ref="main"
|
ref="main"
|
||||||
class="flex pt-100px flex-col md:flex-row justify-center items-center gap-32 rounded-3xl "
|
class="flex pt-100px flex-col md:flex-row justify-center items-center gap-32 rounded-3xl"
|
||||||
>
|
>
|
||||||
<!-- 左侧大号价格 -->
|
<!-- 左侧大号价格 -->
|
||||||
<section class="flex flex-col items-center justify-center glass-card p-32 rounded-2xl shadow-xl ">
|
<section
|
||||||
<div class="text-9xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.price }}</div>
|
class="flex flex-col items-center justify-center glass-card p-32 rounded-2xl shadow-xl"
|
||||||
<div class="mt-10 text-3xl text-gray-500 font-semibold tracking-widest mb-10px">NASDAQ: <span class="text-black">FIEE</span></div>
|
>
|
||||||
|
<div
|
||||||
|
class="text-9xl font-extrabold text-#ff7bac animate-bg-move select-none drop-shadow-lg"
|
||||||
|
>
|
||||||
|
${{ stockQuote.price }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="mt-10 text-3xl text-gray-500 font-semibold tracking-widest mb-10px"
|
||||||
|
>
|
||||||
|
NASDAQ: <span class="text-black">FIEE</span>
|
||||||
|
</div>
|
||||||
<div class="text-gray-500">{{ formatted }}</div>
|
<div class="text-gray-500">{{ formatted }}</div>
|
||||||
</section>
|
</section>
|
||||||
<!-- 右侧信息卡片 -->
|
<!-- 右侧信息卡片 -->
|
||||||
@ -27,9 +37,14 @@ getStockQuate()
|
|||||||
<!-- <div class="text-3xl font-bold"
|
<!-- <div class="text-3xl font-bold"
|
||||||
:class="stockQuote.change?.[1]?.startsWith('-') ? 'text-red-500' : (stockQuote.change?.[1]?.startsWith('+') ? 'text-green-500' : '')">
|
:class="stockQuote.change?.[1]?.startsWith('-') ? 'text-red-500' : (stockQuote.change?.[1]?.startsWith('+') ? 'text-green-500' : '')">
|
||||||
{{ stockQuote.change?.join('') }}</div> -->
|
{{ stockQuote.change?.join('') }}</div> -->
|
||||||
<div class="text-3xl font-bold"
|
<div
|
||||||
:class="stockQuote.change?.includes('-') ? 'text-green-500' : 'text-red-500'">
|
class="text-3xl font-bold"
|
||||||
{{ stockQuote.change }}</div>
|
:class="
|
||||||
|
stockQuote.change?.includes('-') ? 'text-green-500' : 'text-red-500'
|
||||||
|
"
|
||||||
|
>
|
||||||
|
{{ stockQuote.change }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-card">
|
<div class="info-card">
|
||||||
<div class="text-lg text-gray-400">Day's Range</div>
|
<div class="text-lg text-gray-400">Day's Range</div>
|
||||||
@ -55,11 +70,11 @@ getStockQuate()
|
|||||||
/* 玻璃拟态和卡片动画可用 UnoCSS 快捷方式实现,若未配置可加如下样式 */
|
/* 玻璃拟态和卡片动画可用 UnoCSS 快捷方式实现,若未配置可加如下样式 */
|
||||||
.glass-card {
|
.glass-card {
|
||||||
backdrop-filter: blur(16px);
|
backdrop-filter: blur(16px);
|
||||||
background: rgba(255,255,255,0.6);
|
background: rgba(255, 255, 255, 0.6);
|
||||||
border: 1px solid rgba(255,255,255,0.3);
|
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||||
box-shadow: 0 8px 32px 0 rgba(31,38,135,0.18);
|
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.18);
|
||||||
}
|
}
|
||||||
.info-card {
|
.info-card {
|
||||||
@apply glass-card p-6 rounded-xl flex flex-col items-start gap-1 hover:scale-105 transition-transform duration-300;
|
@apply glass-card p-6 rounded-xl flex flex-col items-start gap-1 hover:scale-105 transition-transform duration-300;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,15 +1,27 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { useStockQuote } from '@/store/stock-quote/index.js';
|
import { useStockQuote } from "@/store/stock-quote/index.js";
|
||||||
const { getStockQuate, stockQuote ,formatted} = useStockQuote();
|
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
||||||
getStockQuate();
|
getStockQuate();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<main class="min-h-60vh flex flex-col items-center justify-start px-2 py-5 pt-500px">
|
<main
|
||||||
|
class="min-h-60vh flex flex-col items-center justify-start px-2 py-5 pt-500px"
|
||||||
|
>
|
||||||
<!-- 价格卡片 -->
|
<!-- 价格卡片 -->
|
||||||
<section class="w-full max-w-90vw flex flex-col items-center justify-center glass-card p-4 rounded-2xl shadow mb-5">
|
<section
|
||||||
<div class="text-4xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.price }}</div>
|
class="w-full max-w-90vw flex flex-col items-center justify-center glass-card p-4 rounded-2xl shadow mb-5"
|
||||||
<div class="mt-2 text-sm text-gray-500 font-semibold tracking-widest mb-0px">NASDAQ: <span class="text-black">FIEE</span></div>
|
>
|
||||||
|
<div
|
||||||
|
class="text-4xl font-extrabold text-#ff7bac animate-bg-move select-none drop-shadow-lg"
|
||||||
|
>
|
||||||
|
${{ stockQuote.price }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="mt-2 text-sm text-gray-500 font-semibold tracking-widest mb-0px"
|
||||||
|
>
|
||||||
|
NASDAQ: <span class="text-black">FIEE</span>
|
||||||
|
</div>
|
||||||
<div class="text-gray-500 text-60px">{{ formatted }}</div>
|
<div class="text-gray-500 text-60px">{{ formatted }}</div>
|
||||||
</section>
|
</section>
|
||||||
<!-- 信息卡片列表 -->
|
<!-- 信息卡片列表 -->
|
||||||
@ -21,9 +33,14 @@ getStockQuate();
|
|||||||
<div class="info-card">
|
<div class="info-card">
|
||||||
<div class="text-xs text-gray-400">% Change</div>
|
<div class="text-xs text-gray-400">% Change</div>
|
||||||
|
|
||||||
<div class="text-lg font-bold"
|
<div
|
||||||
:class="stockQuote.change?.includes('-') ? 'text-green-500' : 'text-red-500'">
|
class="text-lg font-bold"
|
||||||
{{ stockQuote.change }}</div>
|
:class="
|
||||||
|
stockQuote.change?.includes('-') ? 'text-green-500' : 'text-red-500'
|
||||||
|
"
|
||||||
|
>
|
||||||
|
{{ stockQuote.change }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-card">
|
<div class="info-card">
|
||||||
<div class="text-xs text-gray-400">Day's Range</div>
|
<div class="text-xs text-gray-400">Day's Range</div>
|
||||||
@ -48,14 +65,14 @@ getStockQuate();
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.glass-card {
|
.glass-card {
|
||||||
backdrop-filter: blur(10px);
|
backdrop-filter: blur(10px);
|
||||||
background: rgba(255,255,255,0.92);
|
background: rgba(255, 255, 255, 0.92);
|
||||||
border: 1px solid rgba(200,200,255,0.18);
|
border: 1px solid rgba(200, 200, 255, 0.18);
|
||||||
box-shadow: 0 2px 8px 0 rgba(31,38,135,0.08);
|
box-shadow: 0 2px 8px 0 rgba(31, 38, 135, 0.08);
|
||||||
}
|
}
|
||||||
.info-card {
|
.info-card {
|
||||||
background: rgba(255,255,255,0.95);
|
background: rgba(255, 255, 255, 0.95);
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
box-shadow: 0 1px 4px 0 rgba(31,38,135,0.06);
|
box-shadow: 0 1px 4px 0 rgba(31, 38, 135, 0.06);
|
||||||
padding: 12px 10px;
|
padding: 12px 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -1,19 +1,30 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
|
import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
|
||||||
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
|
||||||
import { useStockQuote } from '@/store/stock-quote/index.js';
|
import { useStockQuote } from "@/store/stock-quote/index.js";
|
||||||
const { getStockQuate, stockQuote ,formatted} = useStockQuote();
|
const { getStockQuate, stockQuote, formatted } = useStockQuote();
|
||||||
getStockQuate();
|
getStockQuate();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
||||||
<main ref="main">
|
<main ref="main">
|
||||||
<main class="min-h-60vh flex flex-col items-center justify-start px-4 py-6 pt-500px">
|
<main
|
||||||
|
class="min-h-60vh flex flex-col items-center justify-start px-4 py-6 pt-500px"
|
||||||
|
>
|
||||||
<!-- 价格卡片 -->
|
<!-- 价格卡片 -->
|
||||||
<section class="w-full max-w-80vw flex flex-col items-center justify-center glass-card p-6 rounded-2xl shadow mb-6">
|
<section
|
||||||
<div class="text-5xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.price }}</div>
|
class="w-full max-w-80vw flex flex-col items-center justify-center glass-card p-6 rounded-2xl shadow mb-6"
|
||||||
<div class="mt-3 text-base text-gray-500 font-semibold tracking-widest mb-0px">NASDAQ: <span class="text-black">FIEE</span></div>
|
>
|
||||||
|
<div
|
||||||
|
class="text-5xl font-extrabold text-#ff7bac animate-bg-move select-none drop-shadow-lg"
|
||||||
|
>
|
||||||
|
${{ stockQuote.price }}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="mt-3 text-base text-gray-500 font-semibold tracking-widest mb-0px"
|
||||||
|
>
|
||||||
|
NASDAQ: <span class="text-black">FIEE</span>
|
||||||
|
</div>
|
||||||
<div class="text-gray-500 text-70px">{{ formatted }}</div>
|
<div class="text-gray-500 text-70px">{{ formatted }}</div>
|
||||||
</section>
|
</section>
|
||||||
<!-- 信息卡片列表 -->
|
<!-- 信息卡片列表 -->
|
||||||
@ -24,9 +35,16 @@ getStockQuate();
|
|||||||
</div>
|
</div>
|
||||||
<div class="info-card">
|
<div class="info-card">
|
||||||
<div class="text-sm text-gray-400">% Change</div>
|
<div class="text-sm text-gray-400">% Change</div>
|
||||||
<div class="text-xl font-bold"
|
<div
|
||||||
:class="stockQuote.change?.includes('-') ? 'text-green-500' : 'text-red-500'">
|
class="text-xl font-bold"
|
||||||
{{ stockQuote.change }}</div>
|
:class="
|
||||||
|
stockQuote.change?.includes('-')
|
||||||
|
? 'text-green-500'
|
||||||
|
: 'text-red-500'
|
||||||
|
"
|
||||||
|
>
|
||||||
|
{{ stockQuote.change }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-card">
|
<div class="info-card">
|
||||||
<div class="text-sm text-gray-400">Day's Range</div>
|
<div class="text-sm text-gray-400">Day's Range</div>
|
||||||
@ -52,14 +70,14 @@ getStockQuate();
|
|||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.glass-card {
|
.glass-card {
|
||||||
backdrop-filter: blur(10px);
|
backdrop-filter: blur(10px);
|
||||||
background: rgba(255,255,255,0.92);
|
background: rgba(255, 255, 255, 0.92);
|
||||||
border: 1px solid rgba(200,200,255,0.18);
|
border: 1px solid rgba(200, 200, 255, 0.18);
|
||||||
box-shadow: 0 3px 12px 0 rgba(31,38,135,0.08);
|
box-shadow: 0 3px 12px 0 rgba(31, 38, 135, 0.08);
|
||||||
}
|
}
|
||||||
.info-card {
|
.info-card {
|
||||||
background: rgba(255,255,255,0.95);
|
background: rgba(255, 255, 255, 0.95);
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
box-shadow: 0 2px 6px 0 rgba(31,38,135,0.06);
|
box-shadow: 0 2px 6px 0 rgba(31, 38, 135, 0.06);
|
||||||
padding: 16px 14px;
|
padding: 16px 14px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@ -67,4 +85,3 @@ getStockQuate();
|
|||||||
gap: 4px;
|
gap: 4px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|