Compare commits

...

49 Commits

Author SHA1 Message Date
1a031d0be2 Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 23:22:08 +08:00
张 元山
1179c99782 Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 23:22:02 +08:00
张 元山
3d96acdc4e fix pdf 2025-05-30 23:21:27 +08:00
664b66b414 实现图表完整功能;接入2个新的数据接口 2025-05-30 23:21:20 +08:00
齐斌
51a52f9696 更新 FiEE, Inc. 的商业行为和道德规范、提名与公司治理委员会章程以及审计委员会章程的格式和内容,确保文件的一致性和可读性。 2025-05-30 23:18:51 +08:00
张 元山
2471bcd0a7 Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 22:46:10 +08:00
张 元山
917f76dac3 fix press-releases 2025-05-30 22:46:08 +08:00
齐斌
4930853816 Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 22:45:46 +08:00
齐斌
ad5d6f7b1a 将所有相关 Vue 组件中的 API 提交地址从 'https://common.szjixun.cn/api/stock/submit/data' 更新为 'https://erpapi-out.szjixun.cn/api/stock/submit/data',以确保正确的 API 调用。 2025-05-30 22:45:45 +08:00
张 元山
fa19e8bc87 fix news 2025-05-30 22:39:30 +08:00
张 元山
dbc8ecb84e fix annualreports 2025-05-30 22:25:23 +08:00
张 元山
afb01fab8e fix home 2025-05-30 22:19:35 +08:00
齐斌
363d1e1f9e Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 21:24:53 +08:00
齐斌
98cd9fbbe0 在所有相关的 Vue 组件中添加了 axios 导入,并将 handleSubmit 函数修改为异步函数,以便在提交表单时处理 API 请求并根据响应状态更新提交状态。 2025-05-30 21:24:52 +08:00
张 元山
af39cb7bb3 fix footer 2025-05-30 20:33:37 +08:00
张 元山
624824e956 Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 20:31:02 +08:00
张 元山
047a1ebc88 fix footer 2025-05-30 20:31:01 +08:00
齐斌
4933765a4c 删掉部分成员 2025-05-30 20:17:21 +08:00
齐斌
9bd9c0b95a Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 20:11:43 +08:00
齐斌
5614ddf4ef 删掉计算器 2025-05-30 20:11:42 +08:00
张 元山
59202a8471 Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 20:10:48 +08:00
张 元山
ad11498a31 fix myhome 2025-05-30 20:10:47 +08:00
齐斌
f1a90c8b6a Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 20:10:03 +08:00
齐斌
283f73d2c3 更改简介 2025-05-30 20:10:02 +08:00
张 元山
37d9be4c38 fix myhome 2025-05-30 19:46:08 +08:00
张 元山
0971e78597 fix myhome 2025-05-30 19:38:01 +08:00
张 元山
7eb791d38e Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 19:19:14 +08:00
张 元山
a0ada9e66a fix style 2025-05-30 19:19:12 +08:00
齐斌
d0f3fbc1dd 修改文件 2025-05-30 19:00:37 +08:00
张 元山
ae0d82ae16 fix secfilingsDefail 2025-05-30 17:19:04 +08:00
张 元山
7b78b04f38 fix secfilings 2025-05-30 17:17:02 +08:00
齐斌
be833783f2 Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 17:04:49 +08:00
齐斌
de9fb51ec3 addData 2025-05-30 17:04:48 +08:00
张 元山
16241a203d fix secfilingsdetail 2025-05-30 16:51:52 +08:00
张 元山
78d8364816 fix year select 2025-05-30 16:46:30 +08:00
8fff836596 Merge branch 'LiWenHao' 2025-05-30 16:32:32 +08:00
3022ec9756 修改 颜色 2025-05-30 16:32:19 +08:00
张 元山
abb1c220cf Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 16:18:55 +08:00
张 元山
81de59b9eb fix secfilings 2025-05-30 16:18:53 +08:00
126bf56327 修改 2025-05-30 16:13:25 +08:00
208a426324 Merge branch 'wyfMain-dev' 2025-05-30 15:44:59 +08:00
f55a24ea63 Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website into LiWenHao 2025-05-30 15:39:05 +08:00
2f94959e19 修改文字 添加时间 删除文字 2025-05-30 15:38:49 +08:00
张 元山
d71e435ee1 Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 15:33:37 +08:00
张 元山
42b2313857 add secfilings 2025-05-30 15:33:35 +08:00
齐斌
0a5088449a Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/fiee-official-website 2025-05-30 15:27:06 +08:00
齐斌
ba62f71796 addData 2025-05-30 15:27:05 +08:00
969a16577e 删除首页标题 2025-05-30 14:24:15 +08:00
齐斌
8a9002a9e3 changestock 2025-05-30 13:53:22 +08:00
82 changed files with 35783 additions and 1946 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -1,137 +1,34 @@
<template>
<div class="custom-echarts">
<div id="myEcharts" class="myChart"></div>
</div>
</template>
<script setup>
import { onMounted } from 'vue'
import * as echarts from 'echarts'
//eCharts
const initEcharts = () => {
// domecharts
var myCharts = echarts.init(document.getElementById('myEcharts'))
//
myCharts.setOption({
title: {
text: 'FiEE, Inc. Stock Price History',
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
snap: true,
label: {
backgroundColor: '#6a7985'
}
},
formatter: function (params) {
const p = params[0];
return `${p.axisValue}<br/>Price: ${p.data}`;
}
},
xAxis: {
data: ['2013', '2015', '2017', '2019', '2021', '2023', '2025'],
type: 'category',
boundaryGap: false,
},
yAxis: {
type: 'value',
position: 'right',
interval: 25,
max: 75.0,
show: true,
},
series: [
{
name: '销量',
type: 'line',
data: [5, 20, 36, 10, 10, 20],
symbol: 'none',
lineStyle: {
color: '#2c6288'
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#2c6288'
},
{
offset: 1,
color: '#F4F6F8'
}
]
},
},
},
],
dataZoom: [
{
type: 'inside',
},
{
type: 'slider',
show: true,
dataBackground: {
lineStyle: {
color: '#2C6288'
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 1, color: '#2c6288' },
{ offset: 0, color: '#F4F6F8' }
]
}
}
},
selectedDataBackground: {
lineStyle: {
color: '#2C6288'
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 1, color: '#2c6288' },
{ offset: 0, color: '#F4F6F8' }
]
}
}
},
fillerColor: 'rgba(44, 98, 136, 0.3)',
realtime: false,
},
],
})
}
onMounted(() => {
initEcharts()
})
</script>
<style lang="scss" scoped>
.custom-echarts {
.myChart {
width: 1000px;
height: 400px;
}
}
</style>
<script setup>
import { computed } from 'vue'
import { useWindowSize } from '@vueuse/core'
import size375 from '@/components/customEcharts/size375/index.vue'
import size768 from '@/components/customEcharts/size375/index.vue'
import size1440 from '@/components/customEcharts/size1920/index.vue'
import size1920 from '@/components/customEcharts/size1920/index.vue'
import { useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
const router = useRouter()
const { width } = useWindowSize()
const { t } = useI18n()
const viewComponent = computed(() => {
const viewWidth = width.value
if (viewWidth <= 500) {
return size375
} else if (viewWidth <= 960) {
return size768
} else if (viewWidth <= 1500) {
return size1440
} else if (viewWidth <= 1920 || viewWidth > 1920) {
return size1920
}
})
</script>
<template>
<component :is="viewComponent" />
</template>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,593 @@
<template>
<div class="custom-echarts">
<div>
<div class="echarts-header">
<div class="echarts-header-title">
<span>FiEE, Inc. Stock Price History</span>
</div>
<div class="echarts-search-area">
<div class="echarts-search-byRange">
<text style="font-size: 0.9rem; font-weight: 400; color: #666666;">
Range
</text>
<div class="search-range-list">
<div
class="search-range-list-each"
v-for="(item, index) in state.searchRange"
:key="index"
@click="changeSearchRange(item)"
>
<span>{{ item }}</span>
</div>
</div>
</div>
<div class="echarts-search-byDate">
<n-date-picker
v-model:value="state.selectHistoricStartDate"
type="date"
:is-date-disabled="disableAfterDate"
@update:value="changeSearchRangeStartDate"
input-readonly
/>
<!-- <n-icon size="16">
<ArrowForwardOutline />
</n-icon> -->
<span>to</span>
<n-date-picker
v-model:value="state.selectHistoricEndDate"
type="date"
:is-date-disabled="disablePreviousDate"
@update:value="changeSearchRangeEndDate"
input-readonly
/>
</div>
</div>
</div>
</div>
<div id="myEcharts" class="myChart"></div>
</div>
</template>
<script setup>
import { onMounted, watch, reactive } from 'vue'
import * as echarts from 'echarts'
import markPointerIcon from '@/assets/image/icon/echarts_markPointer.png'
import axios from 'axios'
import { NDatePicker, NIcon } from 'naive-ui'
import { ArrowForwardOutline } from '@vicons/ionicons5'
const state = reactive({
searchRange: ['1m', '3m', 'YTD', '1Y', '5Y', '10Y', 'Max'],
selectHistoricStartDate: '2009-10-07',
selectHistoricEndDate: new Date(),
})
let myCharts = null
let historicData = []
let xAxisData = []
//eCharts
const initEcharts = (data) => {
historicData = data
xAxisData = data.map((item) => {
return new Date(item.date).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
})
const yAxisData = data.map((item) => item.price)
console.error(xAxisData, yAxisData)
// domecharts
myCharts = echarts.init(document.getElementById('myEcharts'))
//
myCharts.setOption({
// title: {
// text: 'FiEE, Inc. Stock Price History',
// },
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
snap: true,
label: {
backgroundColor: '#6a7985',
},
},
formatter: function (params) {
const p = params[0]
return `<span style="font-size: 1.1rem; font-weight: 600;">${p.axisValue}</span><br/><span style="font-size: 0.9rem; font-weight: 400;">Price: ${p.data}</span>`
},
},
xAxis: {
data: xAxisData,
type: 'category',
boundaryGap: false,
inverse: true,
axisLine: {
lineStyle: {
color: '#CCD6EB',
},
},
axisLabel: {
color: '#323232',
fontWeight: 'bold',
// formatter: function (value) {
// return value ? value.split('-')[0] : ''
// },
// interval: function (index, value) {
// if (index === 0) return true;
// const axisData = this && this.axis && this.axis.data ? this.axis.data : [];
// if (!axisData[index - 1]) return true;
// return value.split('-')[0] !== axisData[index - 1].split('-')[0];
// },
},
},
yAxis: {
type: 'value',
position: 'right',
interval: 25,
// max: 75.0,
show: true,
axisLabel: {
color: '#323232',
fontWeight: 'bold',
formatter: function (value) {
return value > 0 ? value.toFixed(2) : value
},
},
},
series: [
{
data: yAxisData,
type: 'line',
sampling: 'lttb',
symbol: 'none',
lineStyle: {
color: '#2c6288',
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#2c6288',
},
{
offset: 1,
color: '#F4F6F8',
},
],
},
},
markPoint: {
symbol: 'image://' + markPointerIcon,
symbolSize: 24,
data: [],
},
},
],
dataZoom: [
{
type: 'inside',
},
{
type: 'slider',
show: true,
dataBackground: {
lineStyle: {
color: '#2C6288',
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 1, color: '#2c6288' },
{ offset: 0, color: '#F4F6F8' },
],
},
},
},
selectedDataBackground: {
lineStyle: {
color: '#2C6288',
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 1, color: '#2c6288' },
{ offset: 0, color: '#F4F6F8' },
],
},
},
},
fillerColor: 'rgba(44, 98, 136, 0.3)',
realtime: false,
},
],
})
// showTip markPoint
myCharts.on('showTip', function (params) {
if (params) {
const dataIndex = params.dataIndex
const x = myCharts.getOption().xAxis[0].data[dataIndex]
const y = myCharts.getOption().series[0].data[dataIndex]
myCharts.setOption({
series: [
{
markPoint: {
symbol: 'image://' + markPointerIcon,
symbolSize: 24,
data: [{ coord: [x, y] }],
},
},
],
})
}
})
// markPoint
myCharts.on('globalout', function () {
myCharts.setOption({
series: [
{
markPoint: {
symbol: 'image://' + markPointerIcon,
symbolSize: 24,
data: [],
},
},
],
})
})
myCharts.on('dataZoom', function (params) {
// dataZoom
const option = myCharts.getOption()
const xAxisData = option.xAxis[0].data
const dataZoom = option.dataZoom[1] || option.dataZoom[0]
// dataZoom startValue endValue
let startValue = dataZoom.endValue
let endValue = dataZoom.startValue
//
if (typeof startValue === 'number') {
startValue = xAxisData[startValue]
}
if (typeof endValue === 'number') {
endValue = xAxisData[endValue]
}
//
state.selectHistoricStartDate = new Date(startValue)
state.selectHistoricEndDate = new Date(endValue)
})
}
onMounted(() => {
getHistoricalData()
})
//
const getHistoricalData = async () => {
let now = new Date()
let toDate =
now.getFullYear() +
'-' +
String(now.getMonth() + 1).padStart(2, '0') +
'-' +
String(now.getDate()).padStart(2, '0')
let url =
'https://common.szjixun.cn/api/stock/history/base/list?from=2009-10-07&to=' +
toDate
const res = await axios.get(url)
if (res.status === 200) {
if (res.data.status === 0) {
initEcharts(res.data.data)
}
}
}
//
function findClosestDateIndex(data, targetDateStr) {
let left = 0,
right = data.length - 1
const target = new Date(targetDateStr).getTime()
let res = data.length - 1 //
while (left <= right) {
const mid = Math.floor((left + right) / 2)
const midTime = new Date(data[mid].date).getTime()
if (midTime > target) {
left = mid + 1
} else {
res = mid
right = mid - 1
}
}
return res
}
//
function findClosestDateIndexDescLeft(data, targetDateStr) {
let left = 0,
right = data.length - 1
const target = new Date(targetDateStr).getTime()
let res = -1 // -1
while (left <= right) {
const mid = Math.floor((left + right) / 2)
const midTime = new Date(data[mid].date).getTime()
if (midTime < target) {
right = mid - 1 //
} else {
res = mid //
left = mid + 1 //
}
}
return res
}
//
const changeSearchRange = (range, dateTime) => {
const now = new Date()
let startDate = ''
let endDate = ''
if (range === '1m') {
const last = new Date(now)
last.setMonth(now.getMonth() - 1)
startDate = last.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === '3m') {
const last = new Date(now)
last.setMonth(now.getMonth() - 3)
startDate = last.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === 'YTD') {
startDate = new Date(now.getFullYear(), 0, 1).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === '1Y') {
const last = new Date(now)
last.setFullYear(now.getFullYear() - 1)
startDate = last.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === '5Y') {
const last = new Date(now)
last.setFullYear(now.getFullYear() - 5)
startDate = last.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === '10Y') {
const last = new Date(now)
last.setFullYear(now.getFullYear() - 10)
startDate = last.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === 'Max') {
startDate = ''
endDate = ''
} else if (range === 'startDateTime') {
startDate = dateTime
endDate = ''
} else if (range === 'endDateTime') {
startDate = ''
endDate = dateTime
}
if (startDate || endDate) {
// historicData xAxisData initEcharts
if (
typeof historicData !== 'undefined' &&
typeof xAxisData !== 'undefined'
) {
let startValue = xAxisData[0]
if (startDate) {
const idx = findClosestDateIndex(historicData, startDate)
// historicData[idx].date xAxisData
startValue = new Date(historicData[idx].date).toLocaleDateString(
'en-US',
{
month: 'short',
day: 'numeric',
year: 'numeric',
},
)
}
let endValue = endDate
if (endDate) {
console.warn(endDate)
const idx = findClosestDateIndexDescLeft(historicData, endDate)
console.warn(idx)
// historicData[idx].date xAxisData
endValue = new Date(historicData[idx].date).toLocaleDateString(
'en-US',
{
month: 'short',
day: 'numeric',
year: 'numeric',
},
)
console.warn(endValue)
}
if (startDate) {
myCharts.setOption({
dataZoom: {
endValue: startValue,
},
})
state.selectHistoricStartDate = new Date(startValue)
}
if (endDate) {
myCharts.setOption({
dataZoom: {
startValue: endValue,
},
})
state.selectHistoricEndDate = new Date(endValue)
}
}
} else {
myCharts.setOption({
dataZoom: {
startValue: '',
endValue: '',
},
})
state.selectHistoricStartDate = new Date('2009-10-07')
state.selectHistoricEndDate = new Date()
}
}
// 2009-10-07
const disableAfterDate = (date) => {
return date < new Date('2009-10-06') || date > new Date()
}
//
const disablePreviousDate = (date) => {
return date < new Date(state.selectHistoricStartDate) || date > new Date()
}
//
const changeSearchRangeStartDate = (date) => {
console.error(date)
changeSearchRange(
'startDateTime',
new Date(date).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
}),
)
}
//
const changeSearchRangeEndDate = (date) => {
console.error(date)
changeSearchRange(
'endDateTime',
new Date(date).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
}),
)
}
</script>
<style lang="scss" scoped>
.custom-echarts {
.myChart {
width: 100%;
height: 25rem;
}
.echarts-header {
.echarts-header-title {
span {
font-size: 2rem;
font-weight: 600;
color: #323232;
}
}
.echarts-search-area {
padding: 2rem 0 0;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
.echarts-search-byRange {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 10px;
.search-range-list {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 10px;
.search-range-list-each {
padding: 5px 10px;
border-radius: 5px;
background-color: #f3f4f6;
cursor: pointer;
span {
font-weight: 600;
font-size: 0.9rem;
}
}
}
}
.echarts-search-byDate {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 0.4rem;
}
}
}
}
</style>

View File

@ -0,0 +1,595 @@
<template>
<div class="custom-echarts">
<div>
<div class="echarts-header">
<div class="echarts-header-title">
<span>FiEE, Inc. Stock Price History</span>
</div>
<div class="echarts-search-area">
<div class="echarts-search-byRange">
<text style="font-size: 0.9rem; font-weight: 400; color: #666666;">
Range
</text>
<div class="search-range-list">
<div
class="search-range-list-each"
v-for="(item, index) in state.searchRange"
:key="index"
@click="changeSearchRange(item)"
>
<span>{{ item }}</span>
</div>
</div>
</div>
<div class="echarts-search-byDate">
<n-date-picker
v-model:value="state.selectHistoricStartDate"
type="date"
:is-date-disabled="disableAfterDate"
@update:value="changeSearchRangeStartDate"
input-readonly
/>
<!-- <n-icon size="30">
<ArrowForwardOutline />
</n-icon> -->
<span>to</span>
<n-date-picker
v-model:value="state.selectHistoricEndDate"
type="date"
:is-date-disabled="disablePreviousDate"
@update:value="changeSearchRangeEndDate"
input-readonly
/>
</div>
</div>
</div>
</div>
<div id="myEcharts" class="myChart"></div>
</div>
</template>
<script setup>
import { onMounted, watch, reactive } from 'vue'
import * as echarts from 'echarts'
import markPointerIcon from '@/assets/image/icon/echarts_markPointer.png'
import axios from 'axios'
import { NDatePicker } from 'naive-ui'
import { ArrowForwardOutline } from '@vicons/ionicons5'
const state = reactive({
searchRange: ['1m', '3m', 'YTD', '1Y', '5Y', '10Y', 'Max'],
selectHistoricStartDate: '2009-10-07',
selectHistoricEndDate: new Date(),
})
let myCharts = null
let historicData = []
let xAxisData = []
//eCharts
const initEcharts = (data) => {
historicData = data
xAxisData = data.map((item) => {
return new Date(item.date).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
})
const yAxisData = data.map((item) => item.price)
console.error(xAxisData, yAxisData)
// domecharts
myCharts = echarts.init(document.getElementById('myEcharts'))
//
myCharts.setOption({
// title: {
// text: 'FiEE, Inc. Stock Price History',
// },
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line',
snap: true,
label: {
backgroundColor: '#6a7985',
},
},
formatter: function (params) {
const p = params[0]
return `<span style="font-size: 1.1rem; font-weight: 600;">${p.axisValue}</span><br/><span style="font-size: 0.9rem; font-weight: 400;">Price: ${p.data}</span>`
},
},
xAxis: {
data: xAxisData,
type: 'category',
boundaryGap: false,
inverse: true,
axisLine: {
lineStyle: {
color: '#CCD6EB',
},
},
axisLabel: {
color: '#323232',
fontWeight: 'bold',
// formatter: function (value) {
// return value ? value.split('-')[0] : ''
// },
// interval: function (index, value) {
// if (index === 0) return true;
// const axisData = this && this.axis && this.axis.data ? this.axis.data : [];
// if (!axisData[index - 1]) return true;
// return value.split('-')[0] !== axisData[index - 1].split('-')[0];
// },
},
},
yAxis: {
type: 'value',
position: 'right',
interval: 25,
// max: 75.0,
show: true,
axisLabel: {
color: '#323232',
fontWeight: 'bold',
formatter: function (value) {
return value > 0 ? value.toFixed(2) : value
},
},
},
series: [
{
data: yAxisData,
type: 'line',
sampling: 'lttb',
symbol: 'none',
lineStyle: {
color: '#2c6288',
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#2c6288',
},
{
offset: 1,
color: '#F4F6F8',
},
],
},
},
markPoint: {
symbol: 'image://' + markPointerIcon,
symbolSize: 24,
data: [],
},
},
],
dataZoom: [
{
type: 'inside',
},
{
type: 'slider',
show: true,
dataBackground: {
lineStyle: {
color: '#2C6288',
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 1, color: '#2c6288' },
{ offset: 0, color: '#F4F6F8' },
],
},
},
},
selectedDataBackground: {
lineStyle: {
color: '#2C6288',
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 1, color: '#2c6288' },
{ offset: 0, color: '#F4F6F8' },
],
},
},
},
fillerColor: 'rgba(44, 98, 136, 0.3)',
realtime: false,
},
],
})
// showTip markPoint
myCharts.on('showTip', function (params) {
if (params) {
const dataIndex = params.dataIndex
const x = myCharts.getOption().xAxis[0].data[dataIndex]
const y = myCharts.getOption().series[0].data[dataIndex]
myCharts.setOption({
series: [
{
markPoint: {
symbol: 'image://' + markPointerIcon,
symbolSize: 24,
data: [{ coord: [x, y] }],
},
},
],
})
}
})
// markPoint
myCharts.on('globalout', function () {
myCharts.setOption({
series: [
{
markPoint: {
symbol: 'image://' + markPointerIcon,
symbolSize: 24,
data: [],
},
},
],
})
})
myCharts.on('dataZoom', function (params) {
// dataZoom
const option = myCharts.getOption()
const xAxisData = option.xAxis[0].data
const dataZoom = option.dataZoom[1] || option.dataZoom[0]
// dataZoom startValue endValue
let startValue = dataZoom.endValue
let endValue = dataZoom.startValue
//
if (typeof startValue === 'number') {
startValue = xAxisData[startValue]
}
if (typeof endValue === 'number') {
endValue = xAxisData[endValue]
}
//
state.selectHistoricStartDate = new Date(startValue)
state.selectHistoricEndDate = new Date(endValue)
})
}
onMounted(() => {
getHistoricalData()
})
//
const getHistoricalData = async () => {
let now = new Date()
let toDate =
now.getFullYear() +
'-' +
String(now.getMonth() + 1).padStart(2, '0') +
'-' +
String(now.getDate()).padStart(2, '0')
let url =
'https://common.szjixun.cn/api/stock/history/base/list?from=2009-10-07&to=' +
toDate
const res = await axios.get(url)
if (res.status === 200) {
if (res.data.status === 0) {
initEcharts(res.data.data)
}
}
}
//
function findClosestDateIndex(data, targetDateStr) {
let left = 0,
right = data.length - 1
const target = new Date(targetDateStr).getTime()
let res = data.length - 1 //
while (left <= right) {
const mid = Math.floor((left + right) / 2)
const midTime = new Date(data[mid].date).getTime()
if (midTime > target) {
left = mid + 1
} else {
res = mid
right = mid - 1
}
}
return res
}
//
function findClosestDateIndexDescLeft(data, targetDateStr) {
let left = 0,
right = data.length - 1
const target = new Date(targetDateStr).getTime()
let res = -1 // -1
while (left <= right) {
const mid = Math.floor((left + right) / 2)
const midTime = new Date(data[mid].date).getTime()
if (midTime < target) {
right = mid - 1 //
} else {
res = mid //
left = mid + 1 //
}
}
return res
}
//
const changeSearchRange = (range, dateTime) => {
const now = new Date()
let startDate = ''
let endDate = ''
if (range === '1m') {
const last = new Date(now)
last.setMonth(now.getMonth() - 1)
startDate = last.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === '3m') {
const last = new Date(now)
last.setMonth(now.getMonth() - 3)
startDate = last.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === 'YTD') {
startDate = new Date(now.getFullYear(), 0, 1).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === '1Y') {
const last = new Date(now)
last.setFullYear(now.getFullYear() - 1)
startDate = last.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === '5Y') {
const last = new Date(now)
last.setFullYear(now.getFullYear() - 5)
startDate = last.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === '10Y') {
const last = new Date(now)
last.setFullYear(now.getFullYear() - 10)
startDate = last.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
endDate = new Date(new Date()).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
} else if (range === 'Max') {
startDate = ''
endDate = ''
} else if (range === 'startDateTime') {
startDate = dateTime
endDate = ''
} else if (range === 'endDateTime') {
startDate = ''
endDate = dateTime
}
if (startDate || endDate) {
// historicData xAxisData initEcharts
if (
typeof historicData !== 'undefined' &&
typeof xAxisData !== 'undefined'
) {
let startValue = xAxisData[0]
if (startDate) {
const idx = findClosestDateIndex(historicData, startDate)
// historicData[idx].date xAxisData
startValue = new Date(historicData[idx].date).toLocaleDateString(
'en-US',
{
month: 'short',
day: 'numeric',
year: 'numeric',
},
)
}
let endValue = endDate
if (endDate) {
console.warn(endDate)
const idx = findClosestDateIndexDescLeft(historicData, endDate)
console.warn(idx)
// historicData[idx].date xAxisData
endValue = new Date(historicData[idx].date).toLocaleDateString(
'en-US',
{
month: 'short',
day: 'numeric',
year: 'numeric',
},
)
console.warn(endValue)
}
if (startDate) {
myCharts.setOption({
dataZoom: {
endValue: startValue,
},
})
state.selectHistoricStartDate = new Date(startValue)
}
if (endDate) {
myCharts.setOption({
dataZoom: {
startValue: endValue,
},
})
state.selectHistoricEndDate = new Date(endValue)
}
}
} else {
myCharts.setOption({
dataZoom: {
startValue: '',
endValue: '',
},
})
state.selectHistoricStartDate = new Date('2009-10-07')
state.selectHistoricEndDate = new Date()
}
}
// 2009-10-07
const disableAfterDate = (date) => {
return date < new Date('2009-10-06') || date > new Date()
}
//
const disablePreviousDate = (date) => {
return date < new Date(state.selectHistoricStartDate) || date > new Date()
}
//
const changeSearchRangeStartDate = (date) => {
console.error(date)
changeSearchRange(
'startDateTime',
new Date(date).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
}),
)
}
//
const changeSearchRangeEndDate = (date) => {
console.error(date)
changeSearchRange(
'endDateTime',
new Date(date).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
}),
)
}
</script>
<style lang="scss" scoped>
.custom-echarts {
.myChart {
width: 100%;
height: 25rem;
}
.echarts-header {
.echarts-header-title {
span {
font-size: 2rem;
font-weight: 600;
color: #323232;
}
}
.echarts-search-area {
padding: 2rem 0 0;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: center;
.echarts-search-byRange {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 0.7rem;
.search-range-list {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 0.7rem;
.search-range-list-each {
padding: 0.2rem 0.3rem;
border-radius: 5px;
background-color: #f3f4f6;
cursor: pointer;
span {
font-weight: 600;
font-size: 0.9rem;
}
}
}
}
.echarts-search-byDate {
padding: 1.5rem 0 0;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 0.4rem;
}
}
}
}
</style>

View File

@ -6,7 +6,6 @@
<div class="footer-links">
<span @click="handleLink('privacyPolicy')">Privacy Policy</span>
<span @click="handleLink('termsOfUse')">Terms of use</span>
<span @click="handleLink('cookiesSettings')">Cookies Settings</span>
<span @click="handleLink('siteMap')">Site Map</span>
</div>
</div>
@ -14,14 +13,22 @@
</template>
<script setup>
import { useRouter } from 'vue-router'
const router = useRouter()
import { useRouter } from "vue-router";
const router = useRouter();
import privacyPolicy from "@/assets/file/footer/FiEE, Inc. _ Privacy policy.pdf";
import termsOfUse from "@/assets/file/footer/FiEE, Inc. _ Terms of Use.pdf";
import siteMap from "@/assets/file/footer/FiEE, Inc. _ Site Map.pdf";
//
const handleLink = (link) => {
console.log(link)
router.push(link)
}
if (link === "privacyPolicy") {
window.open(privacyPolicy, "_blank");
} else if (link === "termsOfUse") {
window.open(termsOfUse, "_blank");
} else if (link === "siteMap") {
window.open(siteMap, "_blank");
}
};
</script>
<style scoped lang="scss">

View File

@ -6,9 +6,6 @@
<div class="footer-links">
<span @click="handleLink('privacyPolicy')">Privacy Policy</span>
<span @click="handleLink('termsOfUse')">Terms of use</span>
</div>
<div class="footer-links">
<span @click="handleLink('cookiesSettings')">Cookies Settings</span>
<span @click="handleLink('siteMap')">Site Map</span>
</div>
</div>
@ -16,13 +13,23 @@
</template>
<script setup>
import { useRouter } from 'vue-router'
const router = useRouter()
import { useRouter } from "vue-router";
const router = useRouter();
import privacyPolicy from "@/assets/file/footer/FiEE, Inc. _ Privacy policy.pdf";
import termsOfUse from "@/assets/file/footer/FiEE, Inc. _ Terms of Use.pdf";
import siteMap from "@/assets/file/footer/FiEE, Inc. _ Site Map.pdf";
//
const handleLink = (link) => {
router.push(link)
}
if (link === "privacyPolicy") {
window.open(privacyPolicy, "_blank");
} else if (link === "termsOfUse") {
window.open(termsOfUse, "_blank");
} else if (link === "siteMap") {
window.open(siteMap, "_blank");
}
};
</script>
<style scoped lang="scss">
@ -50,7 +57,6 @@ const handleLink = (link) => {
padding: 0 0.8rem;
cursor: pointer;
font-size: 0.75rem;
min-width: 8.5rem;
display: inline-block;
text-align: left;
}

View File

@ -1,52 +1,58 @@
<template>
<!-- 通用页脚 -->
<div class="custom-footer">
<span>&copy; 2025 FiEE, Inc. All Rights Reserved.</span>
<div class="footer-links">
<span @click="handleLink('privacyPolicy')">Privacy Policy</span>
<span @click="handleLink('termsOfUse')">Terms of use</span>
<span @click="handleLink('cookiesSettings')">Cookies Settings</span>
<span @click="handleLink('siteMap')">Site Map</span>
</div>
<!-- 通用页脚 -->
<div class="custom-footer">
<span>&copy; 2025 FiEE, Inc. All Rights Reserved.</span>
<div class="footer-links">
<span @click="handleLink('privacyPolicy')">Privacy Policy</span>
<span @click="handleLink('termsOfUse')">Terms of use</span>
<span @click="handleLink('siteMap')">Site Map</span>
</div>
</template>
<script setup>
import { useRouter } from 'vue-router'
const router = useRouter()
//
const handleLink = (link) => {
console.log(link)
router.push(link)
</div>
</template>
<script setup>
import { useRouter } from "vue-router";
const router = useRouter();
import privacyPolicy from "@/assets/file/footer/FiEE, Inc. _ Privacy policy.pdf";
import termsOfUse from "@/assets/file/footer/FiEE, Inc. _ Terms of Use.pdf";
import siteMap from "@/assets/file/footer/FiEE, Inc. _ Site Map.pdf";
//
const handleLink = (link) => {
if (link === "privacyPolicy") {
window.open(privacyPolicy, "_blank");
} else if (link === "termsOfUse") {
window.open(termsOfUse, "_blank");
} else if (link === "siteMap") {
window.open(siteMap, "_blank");
}
</script>
<style scoped lang="scss">
.custom-footer {
width: 100%;
text-align: center;
padding: 24px 0;
color: #888;
// font-size: 15px;
font-size: 1.05rem;
background: #f7f8fa;
letter-spacing: 1px;
border-top: 1px solid #ececec;
z-index: 100;
padding: 1rem 0;
.footer-links {
margin: 0.4rem 0 0;
span {
border-right: 1px solid #d2d2d7;
padding: 0 10px;
cursor: pointer;
}
span:nth-last-child(1) {
border: 0;
}
};
</script>
<style scoped lang="scss">
.custom-footer {
width: 100%;
text-align: center;
padding: 24px 0;
color: #888;
// font-size: 15px;
font-size: 1.05rem;
background: #f7f8fa;
letter-spacing: 1px;
border-top: 1px solid #ececec;
z-index: 100;
padding: 1rem 0;
.footer-links {
margin: 0.4rem 0 0;
span {
border-right: 1px solid #d2d2d7;
padding: 0 10px;
cursor: pointer;
}
span:nth-last-child(1) {
border: 0;
}
}
</style>
}
</style>

View File

@ -48,15 +48,20 @@ export const useHeaderMenuConfig = () => {
label: t("header_menu.financial_information.title"),
key: "financial_information",
children: [
{
label: t("header_menu.financial_information.sec_filings"),
key: "sec_filings",
href: "/secfilings",
},
{
label: t("header_menu.financial_information.sec_filings"),
key: "sec_filings",
href: "/secfilings",
label: t("header_menu.financial_information.annual_reports"),
key: "annual_reports",
href: "/annualreports",
},
{
label: t("header_menu.financial_information.quarterly_results"),
key: "quarterly_results",
href: "/quarterlyresults",
label: t("header_menu.financial_information.quarterly_reports"),
key: "quarterly_reports",
href: "/quarterlyreports",
},
],
},
@ -74,11 +79,11 @@ export const useHeaderMenuConfig = () => {
key: "historic_stock_price",
href:'/historic-stock'
},
{
label: t("header_menu.stock_information.investment_calculator"),
key: "investment_calculator",
href:'/calculator'
},
// {
// label: t("header_menu.stock_information.investment_calculator"),
// key: "investment_calculator",
// href:'/calculator'
// },
],
},
{

29049
src/dict/secFiles.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -488,7 +488,7 @@ export default {
title: "Financials",
overview: {
title: "Company Financial Overview",
desc: "This page offers access to our <strong>Annual Reports</strong> and <strong>SEC Filings</strong>. These sections provide key financial data and regulatory documents, keeping you informed about our financial performance and compliance.",
desc: "This page offers access to our <strong>Annual Reports</strong>. These sections provide key financial data and regulatory documents, keeping you informed about our financial performance and compliance.",
},
annual_reports: {
title: "Annual Reports",
@ -498,12 +498,12 @@ export default {
},
sec: {
title: "SEC Filings",
desc: "To Access All Of Our Fillings With Sec Sites, Please",
click_here: "Click Here",
desc: "To access all of our filings with the SEC, please",
click_here: "click here",
},
},
quarterlyresults: {
title: "Quarterly Results",
quarterlyreports: {
title: "Quarterly Reports",
search: {
placeholder: "Search",
button: "Go",
@ -525,7 +525,8 @@ export default {
financial_information: {
title: "Financial Information",
sec_filings: "SEC Filings",
quarterly_results: "Quarterly Results",
annual_reports: "Annual Reports",
quarterly_reports: "Quarterly Reports",
},
stock_information: {
title: "Stock Information",
@ -561,10 +562,9 @@ export default {
CONTAIN: {
TITLEONE: {
TITLE: "Company Positioning",
CONTENT:
"To empower global talents through innovative technology solutions",
CONTENT: "",
CONTENTTWO:
"Leveraging IoT, connectivity, and Al artificial intelligence to create targeted, multilingual digital brands, fostering a global community of Key Opinion Leaders and providing unparalleled value throughout the digital content lifecycle",
"Leveraging IoT, connectivity, and Al to create targeted, multilingual digital brands, fostering a global community of Key Opinion Leaders and providing unparalleled value throughout the digital content lifecycle",
},
},
CONTAINY: {
@ -607,7 +607,7 @@ export default {
TITLETWO: {
TITLE: "About FiEE, Inc.",
CONTENT:
'FiEE, Inc. (NASDAQ: MINM) formerly Minim, Inc. was founded in 1977. We have a historical track record of delivering a comprehensive WiFi/Software as a Service platform in the market. After years of development, we made the strategic decision to transition to a Software First Model in 2023 to expand our technology portfolio and revenue streams. in 2025, we rebranded ourselves as a technology company leveraging our expertise in IoT, connectivity, and artificial intelligence ("AI") to explore new business prospects and extend our global footprint.',
'FiEE, Inc. (NASDAQ: MINM), formerly Minim, Inc., was founded in 1977. We have a historical track record of delivering a comprehensive WiFi/Software as a Service platform in the market. After years of development, we made the strategic decision to transition to a Software First Model in 2023 to expand our technology portfolio and revenue streams. In 2025, we rebranded ourselves as a technology company leveraging our expertise in IoT, connectivity, and artificial intelligence ("AI") to explore new business prospects and extend our global footprint.',
CONTENTTWO:
'into four key categories: Cloud-Managed Connectivity (WiFi) Platform, IoT Hardware Sales & Licensing, SAAS Solutions, and Professional To-C and To-B Services & Support. Notably, we have introduced our innovative Software as a Service ("SaaS") solutions, which integrate our AI and data analytics capabilities into content creation and brand management. This initiative has led to the nurturing of a robust pool of Key Opinion Leaders (KOLs) on major social media platforms worldwide, assisting them in developing, managing, and optimizing their digital presence across global platforms. Our services include customized graphics and posts, short videos, and editorial calendars tailored to align with brand objectives.',
CONTENTTHREE:
@ -710,18 +710,18 @@ export default {
TITLE: "Wai Chung Li",
TITLETWO: "Chief Executive Officer",
CONTENT:
"Mr. Li is the Chief Executive Officer, Mr. Li has extensive experience in accounting, corporate management and finance management. His role encompasses the oversight of our daily business operations and plays a vital part in the overall management of our Group.With a track record spanning prestigious roles at Deloitte China, Shanghai Prime Machinery Company Limited, Lens Technology Co., Ltd., and more, Mr. Li brings invaluable expertise to lead the our team.",
"Mr. Li is our Chief Executive Officer. Mr. Li has extensive experience in accounting, corporate management and finance management. His role encompasses the oversight of our daily business operations and plays a vital part in the overall management of our Group.With a track record spanning prestigious roles at Deloitte China, Shanghai Prime Machinery Company Limited, Lens Technology Co., Ltd., and more, Mr. Li brings invaluable expertise to our team.",
CONTENTTWO:
"He served as chair of the Audit Committees for Fulu Holdings and Taizhou Water Group in Hong Kong, and Nedschroef in the Netherlands, showcasing his global leadership. Holding key positions in investment management, business consulting, and directorial roles in publicly listed companies.",
"He served as chair of the Audit Committees for Fulu Holdings and Taizhou Water Group in Hong Kong, and Nedschroef in the Netherlands, showcasing his global leadership. Mr. Li has previously held key positions in investment management, business consulting, and directorial roles in publicly listed companies.",
CONTENTTHREE: "",
},
TWO: {
TITLE: "Cao Yu",
TITLETWO: "Chief Financial Officer, Secretary, Treasurer and Director",
CONTENTONE:
"Ms. Cao is our Chief Financial Officer, Secretary, Treasurer and Director, Ms. Cao has a wealth of experience in financial management. She oversees financial operations, strategic planning, risk management, and reporting to ensure our financial health and compliance with regulations.",
"Ms. Cao is our Chief Financial Officer. Secretary, Treasurer and Director. Ms. Cao has a wealth of experience in financial management. She oversees financial operations, strategic planning, risk management, and reporting to ensure our financial health and compliance with regulations.",
CONTENTTWO:
"Ms. Cao was previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversaw its financial matters from November 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 to October 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida Plastic Profile Products Co., Ltd.",
"Ms. Cao previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversaw its financial matters from November 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 to October 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida Plastic Profile Products Co., Ltd.",
},
},
};

View File

@ -48,10 +48,10 @@ const routes = [
component: () => import("@/views/email-alerts/index.vue"),
},
{
path: "/quarterlyresults",
name: "QuarterlyResults",
path: "/quarterlyreports",
name: "quarterlyreports",
component: () =>
import("@/views/financialinformation/quarterlyresults/index.vue"),
import("@/views/financialinformation/quarterlyreports/index.vue"),
},
{
path: "/secfilings",
@ -59,11 +59,28 @@ const routes = [
component: () =>
import("@/views/financialinformation/secfilings/index.vue"),
},
{
path: "/secfilingsDefail",
name: "SecFilingsDetail",
component: () =>
import("@/views/financialinformation/secfilingsdetail/index.vue"),
},
{
path: "/annualreports",
name: "AnnualReports",
component: () =>
import("@/views/financialinformation/annualreports/index.vue"),
},
{
path: "/press-releases",
name: "press-releases",
component: () => import("@/views/press-releases/index.vue"),
},
{
path: "/news",
name: "news",
component: () => import("@/views/news/index.vue"),
},
{
path: "/events-calendar",
name: "events-calendar",

View File

@ -67,8 +67,15 @@ const getLastTradingDay = () => {
const formatted = ref(getLastTradingDay())
const getStockQuate= async()=>{
const res = await axios.get('https://saas-test.szjixun.cn/api/fiee/chart/forward/test')
stockQuote.value=res.data
// const res = await axios.get('https://saas-test.szjixun.cn/api/fiee/chart/forward/test')
const res = await axios.get('https://common.szjixun.cn/api/stock/company/data')
console.error(res)
if(res.status === 200){
if(res.data.status === 0){
stockQuote.value=res.data.data
console.error(stockQuote.value)
}
}
}
return {
formatted,

View File

@ -52,11 +52,15 @@
<template v-if="getCommitteeRole(director.name, 'Audit')">
<div
class="role-badge"
:class="
getCommitteeRole(director.name, 'Audit').toLowerCase()
"
:class="{
[getCommitteeRole(
director.name,
'Audit'
)?.toLowerCase()]: true,
chair: getCommitteeRole(director.name, 'Audit') === 'Chair',
}"
>
<span class="badge-icon"></span>
{{ getCommitteeRole(director.name, "Audit") }}
</div>
</template>
</div>
@ -67,14 +71,17 @@
<template v-if="getCommitteeRole(director.name, 'Compensation')">
<div
class="role-badge"
:class="
getCommitteeRole(
:class="{
[getCommitteeRole(
director.name,
'Compensation'
).toLowerCase()
"
)?.toLowerCase()]: true,
chair:
getCommitteeRole(director.name, 'Compensation') ===
'Chair',
}"
>
<span class="badge-icon"></span>
{{ getCommitteeRole(director.name, "Compensation") }}
</div>
</template>
</div>
@ -85,11 +92,16 @@
<template v-if="getCommitteeRole(director.name, 'Governance')">
<div
class="role-badge"
:class="
getCommitteeRole(director.name, 'Governance').toLowerCase()
"
:class="{
[getCommitteeRole(
director.name,
'Governance'
)?.toLowerCase()]: true,
chair:
getCommitteeRole(director.name, 'Governance') === 'Chair',
}"
>
<span class="badge-icon"></span>
{{ getCommitteeRole(director.name, "Governance") }}
</div>
</template>
</div>
@ -102,34 +114,34 @@
<script setup>
const otherDirectors = [
{
name: "Cao Yu",
title: "Chief Financial Officer, Secretary, Treasurer and Director",
},
{ name: "David Lazar", title: "Director" },
// {
// name: "Cao Yu",
// title: "Chief Financial Officer, Secretary, Treasurer and Director",
// },
// { name: "David Lazar", title: "Director" },
{ name: "Hu Bin", title: "Director" },
{ name: "David Natan", title: "Director" },
{ name: "Chan Oi Fat", title: "Director" },
];
// - API
// Updated committee roles according to requirements
const committeeRoles = {
"Cao Yu": {},
"David Lazar": {},
"Hu Bin": {
Compensation: "Chair",
Governance: "Member",
Audit: "Chair",
Audit: "Member",
Compensation: "Member",
Governance: "Chair",
},
"David Natan": {
Compensation: "Chair",
Governance: "Member",
Audit: "Chair",
Compensation: "Member",
Governance: "Member",
},
"Chan Oi Fat": {
Audit: "Member",
Compensation: "Chair",
Governance: "Member",
Audit: "Chair",
},
};
@ -139,6 +151,9 @@ const getCommitteeRole = (name, committee) => {
</script>
<style scoped>
.role-badge.chair {
color: orange;
}
.title h1 {
position: relative;

View File

@ -1,7 +1,6 @@
<template>
<div class="committees-page">
<!-- 标题区 -->
<div class="title mb-[50px] text-center">
<h1 style="font-size: 40px; margin-top: 60px">Committee Composition</h1>
</div>
@ -41,7 +40,6 @@
>
{{ director.name }}
</router-link>
<!-- <p class="director-title">{{ director.title }}</p> -->
</div>
</div>
</div>
@ -52,11 +50,15 @@
<template v-if="getCommitteeRole(director.name, 'Audit')">
<div
class="role-badge"
:class="
getCommitteeRole(director.name, 'Audit').toLowerCase()
"
:class="{
[getCommitteeRole(
director.name,
'Audit'
)?.toLowerCase()]: true,
chair: getCommitteeRole(director.name, 'Audit') === 'Chair',
}"
>
<span class="badge-icon"></span>
{{ getCommitteeRole(director.name, "Audit") }}
</div>
</template>
</div>
@ -67,14 +69,17 @@
<template v-if="getCommitteeRole(director.name, 'Compensation')">
<div
class="role-badge"
:class="
getCommitteeRole(
:class="{
[getCommitteeRole(
director.name,
'Compensation'
).toLowerCase()
"
)?.toLowerCase()]: true,
chair:
getCommitteeRole(director.name, 'Compensation') ===
'Chair',
}"
>
<span class="badge-icon"></span>
{{ getCommitteeRole(director.name, "Compensation") }}
</div>
</template>
</div>
@ -85,11 +90,16 @@
<template v-if="getCommitteeRole(director.name, 'Governance')">
<div
class="role-badge"
:class="
getCommitteeRole(director.name, 'Governance').toLowerCase()
"
:class="{
[getCommitteeRole(
director.name,
'Governance'
)?.toLowerCase()]: true,
chair:
getCommitteeRole(director.name, 'Governance') === 'Chair',
}"
>
<span class="badge-icon"></span>
{{ getCommitteeRole(director.name, "Governance") }}
</div>
</template>
</div>
@ -102,34 +112,34 @@
<script setup>
const otherDirectors = [
{
name: "Cao Yu",
title: "Chief Financial Officer, Secretary, Treasurer and Director",
},
{ name: "David Lazar", title: "Director" },
// {
// name: "Cao Yu",
// title: "Chief Financial Officer, Secretary, Treasurer and Director",
// },
// { name: "David Lazar", title: "Director" },
{ name: "Hu Bin", title: "Director" },
{ name: "David Natan", title: "Director" },
{ name: "Chan Oi Fat", title: "Director" },
];
// - API
// Updated committee roles according to requirements
const committeeRoles = {
"Cao Yu": {},
"David Lazar": {},
"Hu Bin": {
Compensation: "Chair",
Governance: "Member",
Audit: "Chair",
Audit: "Member",
Compensation: "Member",
Governance: "Chair",
},
"David Natan": {
Compensation: "Chair",
Governance: "Member",
Audit: "Chair",
Compensation: "Member",
Governance: "Member",
},
"Chan Oi Fat": {
Audit: "Member",
Compensation: "Chair",
Governance: "Member",
Audit: "Chair",
},
};
@ -140,6 +150,9 @@ const getCommitteeRole = (name, committee) => {
<style scoped>
/* 紫色主题变量 */
.role-badge.chair {
color: orange;
}
:root {
--primary: #895bff;
--primary-light: #a07cff;

View File

@ -40,14 +40,18 @@
v-for="(committee, idx) in getCommittees(director.name)"
:key="idx"
>
<div
class="role-badge"
:class="
getCommitteeRole(director.name, committee).toLowerCase()
"
>
<span>{{ getCommitteeRole(director.name, committee) }}</span>
<span class="committee-name"></span>
<div class="committee-position">
<div
class="role-badge"
:class="
getCommitteeRole(director.name, committee).toLowerCase()
"
>
<span>{{ getCommitteeShortName(committee) }}</span>
</div>
<div style="font-size: 16px" class="role-title">
{{ getCommitteeRole(director.name, committee) }}
</div>
</div>
</template>
</div>
@ -63,43 +67,50 @@ import { ref, computed } from "vue";
//
const otherDirectors = [
{
name: "Cao Yu",
title: "Chief Financial Officer, Secretary, Treasurer and Director",
},
{ name: "David Lazar", title: "Director" },
// {
// name: "Cao Yu",
// title: "Chief Financial Officer, Secretary, Treasurer and Director",
// },
// { name: "David Lazar", title: "Director" },
{ name: "Hu Bin", title: "Director" },
{ name: "David Natan", title: "Director" },
{ name: "Chan Oi Fat", title: "Director" },
];
//
// - (Chair/Member)
const committeeRoles = {
"Cao Yu": {},
"David Lazar": {},
"Hu Bin": {
Compensation: "Audit Committee ",
Governance: "Compensation Committee",
Audit: "Nominating Committee",
Audit: "Member",
Compensation: "Member",
Governance: "Chair",
},
"David Natan": {
Compensation: "Audit Committee ",
Governance: "Compensation Committee",
Audit: "Nominating Committee",
Audit: "Chair",
Compensation: "Member",
Governance: "Member",
},
"Chan Oi Fat": {
Compensation: "Audit Committee ",
Governance: "Compensation Committee",
Audit: "Nominating Committee",
Audit: "Member",
Compensation: "Chair",
Governance: "Member",
},
};
//
const committeeFullNames = {
Audit: "Audit Committee",
Compensation: "Compensation Committee",
Governance: "Nominating and Corporate Governance Committee",
};
//
const getCommittees = (name) => {
return Object.keys(committeeRoles[name] || {});
};
//
// (Chair/Member)
const getCommitteeRole = (name, committee) => {
return committeeRoles[name]?.[committee] || "";
};
@ -125,6 +136,40 @@ const getInitials = (name) => {
</script>
<style scoped>
/* 添加这些样式来显示职位类型 */
.committee-position {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 8px;
}
.role-title {
font-size: 12px;
color: #666;
margin-top: 4px;
text-transform: capitalize;
}
/* 保持原有的角色徽章样式 */
.role-badge {
padding: 6px 12px;
border-radius: 20px;
font-size: 14px;
font-weight: 500;
display: inline-flex;
align-items: center;
}
.role-badge.chair {
background-color: #e6f2ff;
color: #0066cc;
}
.role-badge.member {
background-color: #f0f0f0;
color: #555;
}
.title h1 {
position: relative;

View File

@ -40,14 +40,18 @@
v-for="(committee, idx) in getCommittees(director.name)"
:key="idx"
>
<div
class="role-badge"
:class="
getCommitteeRole(director.name, committee).toLowerCase()
"
>
<span>{{ getCommitteeRole(director.name, committee) }}</span>
<span class="committee-name"></span>
<div class="committee-position">
<div
class="role-badge"
:class="
getCommitteeRole(director.name, committee).toLowerCase()
"
>
<span>{{ getCommitteeShortName(committee) }}</span>
</div>
<div style="font-size: 16px" class="role-title">
{{ getCommitteeRole(director.name, committee) }}
</div>
</div>
</template>
</div>
@ -63,43 +67,50 @@ import { ref, computed } from "vue";
//
const otherDirectors = [
{
name: "Cao Yu",
title: "Chief Financial Officer, Secretary, Treasurer and Director",
},
{ name: "David Lazar", title: "Director" },
// {
// name: "Cao Yu",
// title: "Chief Financial Officer, Secretary, Treasurer and Director",
// },
// { name: "David Lazar", title: "Director" },
{ name: "Hu Bin", title: "Director" },
{ name: "David Natan", title: "Director" },
{ name: "Chan Oi Fat", title: "Director" },
];
//
// - (Chair/Member)
const committeeRoles = {
"Cao Yu": {},
"David Lazar": {},
"Hu Bin": {
Compensation: "Audit Committee ",
Governance: "Compensation Committee",
Audit: "Nominating Committee",
Audit: "Member",
Compensation: "Member",
Governance: "Chair",
},
"David Natan": {
Compensation: "Audit Committee ",
Governance: "Compensation Committee",
Audit: "Nominating Committee",
Audit: "Chair",
Compensation: "Member",
Governance: "Member",
},
"Chan Oi Fat": {
Compensation: "Audit Committee ",
Governance: "Compensation Committee",
Audit: "Nominating Committee",
Audit: "Member",
Compensation: "Chair",
Governance: "Member",
},
};
//
const committeeFullNames = {
Audit: "Audit Committee",
Compensation: "Compensation Committee",
Governance: "Nominating and Corporate Governance Committee",
};
//
const getCommittees = (name) => {
return Object.keys(committeeRoles[name] || {});
};
//
// (Chair/Member)
const getCommitteeRole = (name, committee) => {
return committeeRoles[name]?.[committee] || "";
};
@ -125,6 +136,40 @@ const getInitials = (name) => {
</script>
<style scoped>
/* 添加这些样式来显示职位类型 */
.committee-position {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 8px;
}
.role-title {
font-size: 12px;
color: #666;
margin-top: 4px;
text-transform: capitalize;
}
/* 保持原有的角色徽章样式 */
.role-badge {
padding: 6px 12px;
border-radius: 20px;
font-size: 14px;
font-weight: 500;
display: inline-flex;
align-items: center;
}
.role-badge.chair {
background-color: #e6f2ff;
color: #0066cc;
}
.role-badge.member {
background-color: #f0f0f0;
color: #555;
}
.title h1 {
position: relative;

View File

@ -10,10 +10,14 @@
:key="index"
class="director-item"
>
<n-h2 class="director-name">{{ director.name }}</n-h2>
<n-text class="director-title">{{ director.title }}</n-text>
<n-h2 style="font-size: 18px" class="director-name">{{
director.name
}}</n-h2>
<n-text style="font-size: 16px" class="director-title">{{
director.title
}}</n-text>
<n-divider class="divider" />
<!-- <n-p class="director-bio">{{ director.contain }}</n-p> -->
<n-p class="director-bio">{{ director.contain }}</n-p>
</div>
</div>
</div>
@ -22,24 +26,25 @@
<script setup>
const otherDirectors = [
{
name: "Hu Bin",
title: "Chairman of the Board of Directors",
contain:
"Served as a director of DC International Service Trade GmbH since December 2024. Prior to that, Mr. Hu worked as a freelancer in the tourism industry from April 2001 to October 2024. From April 1994 to October 2000, he served as the general manager of Suzhou Wintime Advertising Co., Ltd. Before that, he served as the general manager of Suzhou Bauhaus Advertising Design Co., Ltd. from August 1992 to April 1994, where he was engaged in computer-aided design and 3D computer animation production. Mr. Hu began his career at Suzhou Advertising Company in October 1989, where he worked as a designer responsible for graphic design, platemaking, printing, and interior decoration. Mr. Hu graduated from Suzhou Academy of Arts in 1989.",
},
{
name: "Cao Yu",
title: "Chief Financial Officer, Secretary, Treasurer and Director",
contain:
"Cao Yu, age 34, previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversees its financial matters fromNovember 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 toOctober 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida PlasticProfile Products Co., Ltd.",
"Previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversees its financial matters from November 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 to October 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida Plastic Profile Products Co., Ltd.",
},
{
name: "David Lazar",
title: "Director",
contain:
"David E. Lazar, age 34, has served as the Chief Executive Officer of OpGen, Inc., a precision medicine company listed on the Nasdaq (OPGN) since April11, 2024, where he also servs as a director and board chairman, beginning on March 25, 2024. Mr. Lazar served as the Chief Executive Officer of TitanPharmaceuticals Inc. listed on the Nasdaq (TTNP) from August 2022 through April 11, 2024, where he also served as a director and board chairman fromAugust 2022 until October 2023. He has also served as the CEO of Custodian Ventures LLC, a company which specializes in assisting distressed publiccompanies through custodianship, since February 2018, and Activist Investing LLC, an actively managed private investment fund, since March 2018.Previously, Mr. Lazar served as Managing Partner at Zenith Partners International Inc., a boutique consulting firm, from July 2012 to April 2018. In his roleas Chief Eecutive Officer of Custodian Ventures LLC, Mr. Lazar has successfully served as a custodian to numerous public companies across a widerange of industries.",
},
{
name: "Hu Bin",
title: "Director",
contain:
"Hu Bin,age 55, has served as a director of DC International Service Trade GmbH since December 2024. Prior to that, Mr. Hu worked as a freelancer in thetourism industry from April 2001 to October 2024. From April 1994 to October 2000, he served as the general manager of Suzhou Wintime AdvertisingCo., Ltd. Before that, he served as the general manager of Suzhou Bauhaus Advertising Design Co., Ltd. from August 1992 to April 1994, where he wasengaged in computer-aided design and 3D computer animation production. Mr. Hu began his career at Suzhou Advertising Company in October 1989,where he worked as a designer responsible for graphic design, platemaking, printing, and interior decoration. Mr. Hu graduated from Suzhou Academy of Arts in 1989.",
"Currently serves as President and Chief Executive Officer of Natan & Associates, LLC, a consulting firm offering chief financial officer services to public and private companies in a variety of industries, since 2007. Mr. Natan previously served as a Director of the Company from November 2023 to February 2025. From February 2010 to May 2020, Mr. Natan served as Chief Executive Officer of ForceField Energy, Inc. (OTCMKTS: FNRG), a company focused on the solar industry and LED lighting products. From February 2002 to November 2007, Mr. Natan served as Executive Vice President of Reporting and Chief Financial Officer of PharmaNet Development Group, Inc., a drug development services company, and, from June 1995 to February 2002, as Chief Financial Officer and Vice President of Global Technovations, Inc., a manufacturer and marketer of oil analysis instruments and speakers and speaker components. Prior to that, Mr. Natan served in various roles of increasing responsibility with Deloitte & Touche LLP, a global consulting firm. Mr. Natan currently serves as a member of the Board of Directors and Chair of the Audit Committee of Sunshine Biopharma, Inc. (Nasdaq: SBFM), a pharmaceutical and nutritional supplement company, since February 2022. Previously, Mr. Natan has served as a director for the following public companies: Global Technovations, Forcefield Energy, Titan Pharmaceuticals (Nasdaq: TTNP), Vivakor Inc. (Nasdaq: VIVK), NetBrands Corp. (OTC: NBND), and OpGen Inc. (OTC: OPGN), and Cyclacel Pharmaceuticals (Nasdaq: CYCC). Mr. Natan holds a B.A. in Economics from Boston University.",
},
{
name: "David Natan",
title: "Director",
@ -50,7 +55,7 @@ const otherDirectors = [
name: "Chan Oi Fat",
title: "Director",
contain:
"Chan Oi Fat, age 46, has served as Vice President Finance of SML Group Corporation since March 2018 and as Company Secretary of China LeonInspection Holding Limited (HKEX: 1586) since February 2018 and of Raily Aesthetic Medicine International Holdings Limited (HKEX: 2135) sinceNovember 2020. He is an independent non-executive director of Huajin International Holdings Limited (HKEX: 2738) (since March 2025) and UBoTHolding Limited (HKEX GEM: 8529) (since May 2024) and previously served as an independent non-executive director of China Saftower InternationalHolding Group Limited (HKEX GEM: 8623) from June 2020 to December 2023 and Shanghai Prime Machinery Company Limited (HKEX: 2345) fromJune 2014 to January 2021. Mr. Chan holds a B.B.A. (Hons) in Accountancy from the City University of Hong Kong (2000) and is a member of theAssociation of Chartered Certified Accountants (since 2003) and the Hong Kong Institute of Certified Public Accountants (since 2004).",
"Served as Vice President Finance of SML Group Corporation since March 2018 and as Company Secretary of China Leon Inspection Holding Limited (HKEX: 1586) since February 2018 and of Raily Aesthetic Medicine International Holdings Limited (HKEX: 2135) since November 2020. He is an independent non-executive director of Huajin International Holdings Limited (HKEX: 2738) (since March 2025) and UBoT Holding Limited (HKEX GEM: 8529) (since May 2024) and previously served as an independent non-executive director of China Saftower International Holding Group Limited (HKEX GEM: 8623) from June 2020 to December 2023 and Shanghai Prime Machinery Company Limited (HKEX: 2345) from June 2014 to January 2021. Mr. Chan holds a B.B.A. (Hons) in Accountancy from the City University of Hong Kong (2000) and is a member of the Association of Chartered Certified Accountants (since 2003) and the Hong Kong Institute of Certified Public Accountants (since 2004).",
},
];
</script>

View File

@ -13,7 +13,7 @@
<n-h2 class="director-name">{{ director.name }}</n-h2>
<n-text class="director-title">{{ director.title }}</n-text>
<n-divider class="divider" />
<!-- <n-p class="director-bio">{{ director.contain }}</n-p> -->
<n-p class="director-bio">{{ director.contain }}</n-p>
</div>
</div>
</div>
@ -22,24 +22,25 @@
<script setup>
const otherDirectors = [
{
name: "Hu Bin",
title: "Chairman of the Board of Directors",
contain:
"Served as a director of DC International Service Trade GmbH since December 2024. Prior to that, Mr. Hu worked as a freelancer in the tourism industry from April 2001 to October 2024. From April 1994 to October 2000, he served as the general manager of Suzhou Wintime Advertising Co., Ltd. Before that, he served as the general manager of Suzhou Bauhaus Advertising Design Co., Ltd. from August 1992 to April 1994, where he was engaged in computer-aided design and 3D computer animation production. Mr. Hu began his career at Suzhou Advertising Company in October 1989, where he worked as a designer responsible for graphic design, platemaking, printing, and interior decoration. Mr. Hu graduated from Suzhou Academy of Arts in 1989.",
},
{
name: "Cao Yu",
title: "Chief Financial Officer, Secretary, Treasurer and Director",
contain:
"Cao Yu, age 34, previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversees its financial matters fromNovember 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 toOctober 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida PlasticProfile Products Co., Ltd.",
"Previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversees its financial matters from November 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 to October 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida Plastic Profile Products Co., Ltd.",
},
{
name: "David Lazar",
title: "Director",
contain:
"David E. Lazar, age 34, has served as the Chief Executive Officer of OpGen, Inc., a precision medicine company listed on the Nasdaq (OPGN) since April11, 2024, where he also servs as a director and board chairman, beginning on March 25, 2024. Mr. Lazar served as the Chief Executive Officer of TitanPharmaceuticals Inc. listed on the Nasdaq (TTNP) from August 2022 through April 11, 2024, where he also served as a director and board chairman fromAugust 2022 until October 2023. He has also served as the CEO of Custodian Ventures LLC, a company which specializes in assisting distressed publiccompanies through custodianship, since February 2018, and Activist Investing LLC, an actively managed private investment fund, since March 2018.Previously, Mr. Lazar served as Managing Partner at Zenith Partners International Inc., a boutique consulting firm, from July 2012 to April 2018. In his roleas Chief Eecutive Officer of Custodian Ventures LLC, Mr. Lazar has successfully served as a custodian to numerous public companies across a widerange of industries.",
},
{
name: "Hu Bin",
title: "Director",
contain:
"Hu Bin,age 55, has served as a director of DC International Service Trade GmbH since December 2024. Prior to that, Mr. Hu worked as a freelancer in thetourism industry from April 2001 to October 2024. From April 1994 to October 2000, he served as the general manager of Suzhou Wintime AdvertisingCo., Ltd. Before that, he served as the general manager of Suzhou Bauhaus Advertising Design Co., Ltd. from August 1992 to April 1994, where he wasengaged in computer-aided design and 3D computer animation production. Mr. Hu began his career at Suzhou Advertising Company in October 1989,where he worked as a designer responsible for graphic design, platemaking, printing, and interior decoration. Mr. Hu graduated from Suzhou Academy of Arts in 1989.",
"Currently serves as President and Chief Executive Officer of Natan & Associates, LLC, a consulting firm offering chief financial officer services to public and private companies in a variety of industries, since 2007. Mr. Natan previously served as a Director of the Company from November 2023 to February 2025. From February 2010 to May 2020, Mr. Natan served as Chief Executive Officer of ForceField Energy, Inc. (OTCMKTS: FNRG), a company focused on the solar industry and LED lighting products. From February 2002 to November 2007, Mr. Natan served as Executive Vice President of Reporting and Chief Financial Officer of PharmaNet Development Group, Inc., a drug development services company, and, from June 1995 to February 2002, as Chief Financial Officer and Vice President of Global Technovations, Inc., a manufacturer and marketer of oil analysis instruments and speakers and speaker components. Prior to that, Mr. Natan served in various roles of increasing responsibility with Deloitte & Touche LLP, a global consulting firm. Mr. Natan currently serves as a member of the Board of Directors and Chair of the Audit Committee of Sunshine Biopharma, Inc. (Nasdaq: SBFM), a pharmaceutical and nutritional supplement company, since February 2022. Previously, Mr. Natan has served as a director for the following public companies: Global Technovations, Forcefield Energy, Titan Pharmaceuticals (Nasdaq: TTNP), Vivakor Inc. (Nasdaq: VIVK), NetBrands Corp. (OTC: NBND), and OpGen Inc. (OTC: OPGN), and Cyclacel Pharmaceuticals (Nasdaq: CYCC). Mr. Natan holds a B.A. in Economics from Boston University.",
},
{
name: "David Natan",
title: "Director",
@ -50,7 +51,7 @@ const otherDirectors = [
name: "Chan Oi Fat",
title: "Director",
contain:
"Chan Oi Fat, age 46, has served as Vice President Finance of SML Group Corporation since March 2018 and as Company Secretary of China LeonInspection Holding Limited (HKEX: 1586) since February 2018 and of Raily Aesthetic Medicine International Holdings Limited (HKEX: 2135) sinceNovember 2020. He is an independent non-executive director of Huajin International Holdings Limited (HKEX: 2738) (since March 2025) and UBoTHolding Limited (HKEX GEM: 8529) (since May 2024) and previously served as an independent non-executive director of China Saftower InternationalHolding Group Limited (HKEX GEM: 8623) from June 2020 to December 2023 and Shanghai Prime Machinery Company Limited (HKEX: 2345) fromJune 2014 to January 2021. Mr. Chan holds a B.B.A. (Hons) in Accountancy from the City University of Hong Kong (2000) and is a member of theAssociation of Chartered Certified Accountants (since 2003) and the Hong Kong Institute of Certified Public Accountants (since 2004).",
"Served as Vice President Finance of SML Group Corporation since March 2018 and as Company Secretary of China Leon Inspection Holding Limited (HKEX: 1586) since February 2018 and of Raily Aesthetic Medicine International Holdings Limited (HKEX: 2135) since November 2020. He is an independent non-executive director of Huajin International Holdings Limited (HKEX: 2738) (since March 2025) and UBoT Holding Limited (HKEX GEM: 8529) (since May 2024) and previously served as an independent non-executive director of China Saftower International Holding Group Limited (HKEX GEM: 8623) from June 2020 to December 2023 and Shanghai Prime Machinery Company Limited (HKEX: 2345) from June 2014 to January 2021. Mr. Chan holds a B.B.A. (Hons) in Accountancy from the City University of Hong Kong (2000) and is a member of the Association of Chartered Certified Accountants (since 2003) and the Hong Kong Institute of Certified Public Accountants (since 2004).",
},
];
</script>

View File

@ -13,7 +13,7 @@
<n-h2 class="director-name">{{ director.name }}</n-h2>
<n-text class="director-title">{{ director.title }}</n-text>
<n-divider class="divider" />
<!-- <n-p class="director-bio">{{ director.contain }}</n-p> -->
<n-p class="director-bio">{{ director.contain }}</n-p>
</div>
</div>
</div>
@ -22,24 +22,25 @@
<script setup>
const otherDirectors = [
{
name: "Hu Bin",
title: "Chairman of the Board of Directors",
contain:
"Served as a director of DC International Service Trade GmbH since December 2024. Prior to that, Mr. Hu worked as a freelancer in the tourism industry from April 2001 to October 2024. From April 1994 to October 2000, he served as the general manager of Suzhou Wintime Advertising Co., Ltd. Before that, he served as the general manager of Suzhou Bauhaus Advertising Design Co., Ltd. from August 1992 to April 1994, where he was engaged in computer-aided design and 3D computer animation production. Mr. Hu began his career at Suzhou Advertising Company in October 1989, where he worked as a designer responsible for graphic design, platemaking, printing, and interior decoration. Mr. Hu graduated from Suzhou Academy of Arts in 1989.",
},
{
name: "Cao Yu",
title: "Chief Financial Officer, Secretary, Treasurer and Director",
contain:
"Cao Yu, age 34, previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversees its financial matters fromNovember 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 toOctober 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida PlasticProfile Products Co., Ltd.",
"Previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversees its financial matters from November 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 to October 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida Plastic Profile Products Co., Ltd.",
},
{
name: "David Lazar",
title: "Director",
contain:
"David E. Lazar, age 34, has served as the Chief Executive Officer of OpGen, Inc., a precision medicine company listed on the Nasdaq (OPGN) since April11, 2024, where he also servs as a director and board chairman, beginning on March 25, 2024. Mr. Lazar served as the Chief Executive Officer of TitanPharmaceuticals Inc. listed on the Nasdaq (TTNP) from August 2022 through April 11, 2024, where he also served as a director and board chairman fromAugust 2022 until October 2023. He has also served as the CEO of Custodian Ventures LLC, a company which specializes in assisting distressed publiccompanies through custodianship, since February 2018, and Activist Investing LLC, an actively managed private investment fund, since March 2018.Previously, Mr. Lazar served as Managing Partner at Zenith Partners International Inc., a boutique consulting firm, from July 2012 to April 2018. In his roleas Chief Eecutive Officer of Custodian Ventures LLC, Mr. Lazar has successfully served as a custodian to numerous public companies across a widerange of industries.",
},
{
name: "Hu Bin",
title: "Director",
contain:
"Hu Bin,age 55, has served as a director of DC International Service Trade GmbH since December 2024. Prior to that, Mr. Hu worked as a freelancer in thetourism industry from April 2001 to October 2024. From April 1994 to October 2000, he served as the general manager of Suzhou Wintime AdvertisingCo., Ltd. Before that, he served as the general manager of Suzhou Bauhaus Advertising Design Co., Ltd. from August 1992 to April 1994, where he wasengaged in computer-aided design and 3D computer animation production. Mr. Hu began his career at Suzhou Advertising Company in October 1989,where he worked as a designer responsible for graphic design, platemaking, printing, and interior decoration. Mr. Hu graduated from Suzhou Academy of Arts in 1989.",
"Currently serves as President and Chief Executive Officer of Natan & Associates, LLC, a consulting firm offering chief financial officer services to public and private companies in a variety of industries, since 2007. Mr. Natan previously served as a Director of the Company from November 2023 to February 2025. From February 2010 to May 2020, Mr. Natan served as Chief Executive Officer of ForceField Energy, Inc. (OTCMKTS: FNRG), a company focused on the solar industry and LED lighting products. From February 2002 to November 2007, Mr. Natan served as Executive Vice President of Reporting and Chief Financial Officer of PharmaNet Development Group, Inc., a drug development services company, and, from June 1995 to February 2002, as Chief Financial Officer and Vice President of Global Technovations, Inc., a manufacturer and marketer of oil analysis instruments and speakers and speaker components. Prior to that, Mr. Natan served in various roles of increasing responsibility with Deloitte & Touche LLP, a global consulting firm. Mr. Natan currently serves as a member of the Board of Directors and Chair of the Audit Committee of Sunshine Biopharma, Inc. (Nasdaq: SBFM), a pharmaceutical and nutritional supplement company, since February 2022. Previously, Mr. Natan has served as a director for the following public companies: Global Technovations, Forcefield Energy, Titan Pharmaceuticals (Nasdaq: TTNP), Vivakor Inc. (Nasdaq: VIVK), NetBrands Corp. (OTC: NBND), and OpGen Inc. (OTC: OPGN), and Cyclacel Pharmaceuticals (Nasdaq: CYCC). Mr. Natan holds a B.A. in Economics from Boston University.",
},
{
name: "David Natan",
title: "Director",
@ -50,7 +51,7 @@ const otherDirectors = [
name: "Chan Oi Fat",
title: "Director",
contain:
"Chan Oi Fat, age 46, has served as Vice President Finance of SML Group Corporation since March 2018 and as Company Secretary of China LeonInspection Holding Limited (HKEX: 1586) since February 2018 and of Raily Aesthetic Medicine International Holdings Limited (HKEX: 2135) sinceNovember 2020. He is an independent non-executive director of Huajin International Holdings Limited (HKEX: 2738) (since March 2025) and UBoTHolding Limited (HKEX GEM: 8529) (since May 2024) and previously served as an independent non-executive director of China Saftower InternationalHolding Group Limited (HKEX GEM: 8623) from June 2020 to December 2023 and Shanghai Prime Machinery Company Limited (HKEX: 2345) fromJune 2014 to January 2021. Mr. Chan holds a B.B.A. (Hons) in Accountancy from the City University of Hong Kong (2000) and is a member of theAssociation of Chartered Certified Accountants (since 2003) and the Hong Kong Institute of Certified Public Accountants (since 2004).",
"Served as Vice President Finance of SML Group Corporation since March 2018 and as Company Secretary of China Leon Inspection Holding Limited (HKEX: 1586) since February 2018 and of Raily Aesthetic Medicine International Holdings Limited (HKEX: 2135) since November 2020. He is an independent non-executive director of Huajin International Holdings Limited (HKEX: 2738) (since March 2025) and UBoT Holding Limited (HKEX GEM: 8529) (since May 2024) and previously served as an independent non-executive director of China Saftower International Holding Group Limited (HKEX GEM: 8623) from June 2020 to December 2023 and Shanghai Prime Machinery Company Limited (HKEX: 2345) from June 2014 to January 2021. Mr. Chan holds a B.B.A. (Hons) in Accountancy from the City University of Hong Kong (2000) and is a member of the Association of Chartered Certified Accountants (since 2003) and the Hong Kong Institute of Certified Public Accountants (since 2004).",
},
];
</script>

View File

@ -1,139 +1,7 @@
<template>
<div class="home-page">
<div class="directors-page">
<template>
<div class="home-page">
<div class="directors-page">
<h1 class="page-title">Board of Directors</h1>
<n-divider />
<div class="directors-list">
<div
v-for="(director, index) in otherDirectors"
:key="index"
class="director-item"
>
<n-h2 class="director-name">{{ director.name }}</n-h2>
<n-text class="director-title">{{ director.title }}</n-text>
<n-divider class="divider" />
<!-- <n-p class="director-bio">{{ director.contain }}</n-p> -->
</div>
</div>
</div>
</div>
</template>
<script setup>
const otherDirectors = [
{
name: "Cao Yu",
title: "Chief Financial Officer, Secretary, Treasurer and Director",
contain:
"Cao Yu, age 34, previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversees its financial matters fromNovember 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 toOctober 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida PlasticProfile Products Co., Ltd.",
},
{
name: "David Lazar",
title: "Director",
contain:
"David E. Lazar, age 34, has served as the Chief Executive Officer of OpGen, Inc., a precision medicine company listed on the Nasdaq (OPGN) since April11, 2024, where he also servs as a director and board chairman, beginning on March 25, 2024. Mr. Lazar served as the Chief Executive Officer of TitanPharmaceuticals Inc. listed on the Nasdaq (TTNP) from August 2022 through April 11, 2024, where he also served as a director and board chairman fromAugust 2022 until October 2023. He has also served as the CEO of Custodian Ventures LLC, a company which specializes in assisting distressed publiccompanies through custodianship, since February 2018, and Activist Investing LLC, an actively managed private investment fund, since March 2018.Previously, Mr. Lazar served as Managing Partner at Zenith Partners International Inc., a boutique consulting firm, from July 2012 to April 2018. In his roleas Chief Eecutive Officer of Custodian Ventures LLC, Mr. Lazar has successfully served as a custodian to numerous public companies across a widerange of industries.",
},
{
name: "Hu Bin",
title: "Director",
contain:
"Hu Bin,age 55, has served as a director of DC International Service Trade GmbH since December 2024. Prior to that, Mr. Hu worked as a freelancer in thetourism industry from April 2001 to October 2024. From April 1994 to October 2000, he served as the general manager of Suzhou Wintime AdvertisingCo., Ltd. Before that, he served as the general manager of Suzhou Bauhaus Advertising Design Co., Ltd. from August 1992 to April 1994, where he wasengaged in computer-aided design and 3D computer animation production. Mr. Hu began his career at Suzhou Advertising Company in October 1989,where he worked as a designer responsible for graphic design, platemaking, printing, and interior decoration. Mr. Hu graduated from Suzhou Academy of Arts in 1989.",
},
{
name: "David Natan",
title: "Director",
contain:
"David Natan,age 72, currently serves as President and Chief Executive Officer of Natan & Associates, LLC, a consulting firm offering chief financialofficer services to public and private companies in a variety of industries, since 2007. Mr. Natan previously served as a Director of the Company fromNovember 2023 to February 2025. From February 2010 to May 2020, Mr. Natan served as Chief Executive Officer of ForceField Energy, Inc.(OTCMKTS: FNRG), a company focused on the solar industry and LED lighting products. From February 2002 to November 2007, Mr. Natan served asExecutive Vice President of Reporting and Chief Financial Officer of PharmaNet Development Group, Inc., a drug development services company, and,from June 1995 to February 2002, as Chief Financial Officer and Vice President of Global Technovations, Inc., a manufacturer and marketer of oil analysisinstruments and speakers and speaker components. Prior to that, Mr. Natan served in various roles of increasing responsibility with Deloitte & Touche LLP,a global consulting firm. Mr. Natan currently serves as a member of the Board of Directors and Chair of the Audit Committee of Sunshine Biopharma, Inc.(Nasdaq: SBFM), a pharmaceutical and nutritional supplement company, since February 2022. Previously, Mr. Natan has served as a director for thefollowing public companies: Global Technovations, Forcefield Energy, Titan Pharmaceuticals (Nasdaq: TTNP), Vivakor Inc. (Nasdaq: VIVK), NetBrandsCorp. (OTC: NBND), and OpGen Inc. (OTC: OPGN), and Cyclacel Pharmaceuticals (Nasdaq: CYCC). Mr. Natan holds a B.A. in Economics from Boston University.",
},
{
name: "Chan Oi Fat",
title: "Director",
contain:
"Chan Oi Fat, age 46, has served as Vice President Finance of SML Group Corporation since March 2018 and as Company Secretary of China LeonInspection Holding Limited (HKEX: 1586) since February 2018 and of Raily Aesthetic Medicine International Holdings Limited (HKEX: 2135) sinceNovember 2020. He is an independent non-executive director of Huajin International Holdings Limited (HKEX: 2738) (since March 2025) and UBoTHolding Limited (HKEX GEM: 8529) (since May 2024) and previously served as an independent non-executive director of China Saftower InternationalHolding Group Limited (HKEX GEM: 8623) from June 2020 to December 2023 and Shanghai Prime Machinery Company Limited (HKEX: 2345) fromJune 2014 to January 2021. Mr. Chan holds a B.B.A. (Hons) in Accountancy from the City University of Hong Kong (2000) and is a member of theAssociation of Chartered Certified Accountants (since 2003) and the Hong Kong Institute of Certified Public Accountants (since 2004).",
},
];
</script>
<style scoped>
.home-page {
background-image: url("@/assets/image/bg.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
.directors-page {
max-width: 900px;
margin: 0 auto;
padding: 60px 24px;
}
.page-title {
font-size: 2.5rem; /* 18px */
margin-bottom: 30px;
color: #333;
}
.directors-list {
display: flex;
flex-direction: column;
gap: 48px;
margin-top: 40px;
}
.director-item {
padding-bottom: 48px;
border-bottom: 1px solid #f0f0f0;
}
.director-item:last-child {
border-bottom: none;
padding-bottom: 0;
}
.director-name {
margin-bottom: 8px;
font-size: 28px;
font-weight: 500;
color: #1a1a1a;
}
.director-title {
font-size: 18px;
color: #666;
display: block;
margin-bottom: 24px;
}
.divider {
margin: 16px 0;
background-color: #f0f0f0;
}
.director-bio {
line-height: 1.8;
color: #4a4a4a;
font-size: 16px;
}
@media (min-width: 768px) {
.directors-page {
padding: 80px 40px;
}
.director-name {
font-size: 32px;
}
.director-title {
font-size: 20px;
}
}
</style>
<h1 class="page-title">Board of Directors</h1>
<n-divider />
<div class="directors-list">
@ -142,10 +10,14 @@
:key="index"
class="director-item"
>
<n-h2 class="director-name">{{ director.name }}</n-h2>
<n-text class="director-title">{{ director.title }}</n-text>
<n-h2 style="font-size: 18px" class="director-name">{{
director.name
}}</n-h2>
<n-text style="font-size: 16px" class="director-title">{{
director.title
}}</n-text>
<n-divider class="divider" />
<!-- <n-p class="director-bio">{{ director.contain }}</n-p> -->
<n-p class="director-bio">{{ director.contain }}</n-p>
</div>
</div>
</div>
@ -154,24 +26,25 @@
<script setup>
const otherDirectors = [
{
name: "Hu Bin",
title: "Chairman of the Board of Directors",
contain:
"Served as a director of DC International Service Trade GmbH since December 2024. Prior to that, Mr. Hu worked as a freelancer in the tourism industry from April 2001 to October 2024. From April 1994 to October 2000, he served as the general manager of Suzhou Wintime Advertising Co., Ltd. Before that, he served as the general manager of Suzhou Bauhaus Advertising Design Co., Ltd. from August 1992 to April 1994, where he was engaged in computer-aided design and 3D computer animation production. Mr. Hu began his career at Suzhou Advertising Company in October 1989, where he worked as a designer responsible for graphic design, platemaking, printing, and interior decoration. Mr. Hu graduated from Suzhou Academy of Arts in 1989.",
},
{
name: "Cao Yu",
title: "Chief Financial Officer, Secretary, Treasurer and Director",
contain:
"Cao Yu, age 34, previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversees its financial matters fromNovember 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 toOctober 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida PlasticProfile Products Co., Ltd.",
"Previously served as the treasury director of Taifeng Cultural Communication Co., Ltd where she oversees its financial matters from November 2018 to November 2024. Prior to that, Ms. Cao served as a business manager of Yangfeng Art Exchange Co., Ltd from February 2016 to October 2018. From March 2011 to January 2016, she served as the treasury officer of financial department of Suzhou Industrial Park Xinfushida Plastic Profile Products Co., Ltd.",
},
{
name: "David Lazar",
title: "Director",
contain:
"David E. Lazar, age 34, has served as the Chief Executive Officer of OpGen, Inc., a precision medicine company listed on the Nasdaq (OPGN) since April11, 2024, where he also servs as a director and board chairman, beginning on March 25, 2024. Mr. Lazar served as the Chief Executive Officer of TitanPharmaceuticals Inc. listed on the Nasdaq (TTNP) from August 2022 through April 11, 2024, where he also served as a director and board chairman fromAugust 2022 until October 2023. He has also served as the CEO of Custodian Ventures LLC, a company which specializes in assisting distressed publiccompanies through custodianship, since February 2018, and Activist Investing LLC, an actively managed private investment fund, since March 2018.Previously, Mr. Lazar served as Managing Partner at Zenith Partners International Inc., a boutique consulting firm, from July 2012 to April 2018. In his roleas Chief Eecutive Officer of Custodian Ventures LLC, Mr. Lazar has successfully served as a custodian to numerous public companies across a widerange of industries.",
},
{
name: "Hu Bin",
title: "Director",
contain:
"Hu Bin,age 55, has served as a director of DC International Service Trade GmbH since December 2024. Prior to that, Mr. Hu worked as a freelancer in thetourism industry from April 2001 to October 2024. From April 1994 to October 2000, he served as the general manager of Suzhou Wintime AdvertisingCo., Ltd. Before that, he served as the general manager of Suzhou Bauhaus Advertising Design Co., Ltd. from August 1992 to April 1994, where he wasengaged in computer-aided design and 3D computer animation production. Mr. Hu began his career at Suzhou Advertising Company in October 1989,where he worked as a designer responsible for graphic design, platemaking, printing, and interior decoration. Mr. Hu graduated from Suzhou Academy of Arts in 1989.",
"Currently serves as President and Chief Executive Officer of Natan & Associates, LLC, a consulting firm offering chief financial officer services to public and private companies in a variety of industries, since 2007. Mr. Natan previously served as a Director of the Company from November 2023 to February 2025. From February 2010 to May 2020, Mr. Natan served as Chief Executive Officer of ForceField Energy, Inc. (OTCMKTS: FNRG), a company focused on the solar industry and LED lighting products. From February 2002 to November 2007, Mr. Natan served as Executive Vice President of Reporting and Chief Financial Officer of PharmaNet Development Group, Inc., a drug development services company, and, from June 1995 to February 2002, as Chief Financial Officer and Vice President of Global Technovations, Inc., a manufacturer and marketer of oil analysis instruments and speakers and speaker components. Prior to that, Mr. Natan served in various roles of increasing responsibility with Deloitte & Touche LLP, a global consulting firm. Mr. Natan currently serves as a member of the Board of Directors and Chair of the Audit Committee of Sunshine Biopharma, Inc. (Nasdaq: SBFM), a pharmaceutical and nutritional supplement company, since February 2022. Previously, Mr. Natan has served as a director for the following public companies: Global Technovations, Forcefield Energy, Titan Pharmaceuticals (Nasdaq: TTNP), Vivakor Inc. (Nasdaq: VIVK), NetBrands Corp. (OTC: NBND), and OpGen Inc. (OTC: OPGN), and Cyclacel Pharmaceuticals (Nasdaq: CYCC). Mr. Natan holds a B.A. in Economics from Boston University.",
},
{
name: "David Natan",
title: "Director",
@ -182,50 +55,40 @@ const otherDirectors = [
name: "Chan Oi Fat",
title: "Director",
contain:
"Chan Oi Fat, age 46, has served as Vice President Finance of SML Group Corporation since March 2018 and as Company Secretary of China LeonInspection Holding Limited (HKEX: 1586) since February 2018 and of Raily Aesthetic Medicine International Holdings Limited (HKEX: 2135) sinceNovember 2020. He is an independent non-executive director of Huajin International Holdings Limited (HKEX: 2738) (since March 2025) and UBoTHolding Limited (HKEX GEM: 8529) (since May 2024) and previously served as an independent non-executive director of China Saftower InternationalHolding Group Limited (HKEX GEM: 8623) from June 2020 to December 2023 and Shanghai Prime Machinery Company Limited (HKEX: 2345) fromJune 2014 to January 2021. Mr. Chan holds a B.B.A. (Hons) in Accountancy from the City University of Hong Kong (2000) and is a member of theAssociation of Chartered Certified Accountants (since 2003) and the Hong Kong Institute of Certified Public Accountants (since 2004).",
"Served as Vice President Finance of SML Group Corporation since March 2018 and as Company Secretary of China Leon Inspection Holding Limited (HKEX: 1586) since February 2018 and of Raily Aesthetic Medicine International Holdings Limited (HKEX: 2135) since November 2020. He is an independent non-executive director of Huajin International Holdings Limited (HKEX: 2738) (since March 2025) and UBoT Holding Limited (HKEX GEM: 8529) (since May 2024) and previously served as an independent non-executive director of China Saftower International Holding Group Limited (HKEX GEM: 8623) from June 2020 to December 2023 and Shanghai Prime Machinery Company Limited (HKEX: 2345) from June 2014 to January 2021. Mr. Chan holds a B.B.A. (Hons) in Accountancy from the City University of Hong Kong (2000) and is a member of the Association of Chartered Certified Accountants (since 2003) and the Hong Kong Institute of Certified Public Accountants (since 2004).",
},
];
</script>
<style scoped>
:root {
--primary-color: #333;
--secondary-color: #666;
--divider-color: #f0f0f0;
--mobile-padding: 16px;
--tablet-padding: 24px;
}
.home-page {
background-image: url("@/assets/image/bg-mobile.png");
background-size: cover;
background-image: url("@/assets/image/bg.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
.directors-page {
max-width: 1200px;
max-width: 900px;
margin: 0 auto;
padding: clamp(2rem, 5vw, 4rem)
clamp(var(--mobile-padding), 4vw, var(--tablet-padding));
padding: 60px 24px;
}
.page-title {
font-size: clamp(1.75rem, 4vw, 2.5rem);
margin-bottom: clamp(1.5rem, 3vw, 2rem);
color: var(--primary-color);
font-size: 2.5rem; /* 18px */
margin-bottom: 30px;
color: #333;
}
.directors-list {
display: flex;
flex-direction: column;
gap: clamp(2rem, 4vw, 3rem);
margin-top: clamp(1.5rem, 3vw, 2.5rem);
gap: 48px;
margin-top: 40px;
}
.director-item {
padding-bottom: clamp(2rem, 4vw, 3rem);
border-bottom: 1px solid var(--divider-color);
padding-bottom: 48px;
border-bottom: 1px solid #f0f0f0;
}
.director-item:last-child {
@ -234,43 +97,41 @@ const otherDirectors = [
}
.director-name {
margin-bottom: clamp(0.5rem, 1vw, 0.75rem);
font-size: clamp(1.25rem, 3vw, 1.75rem);
margin-bottom: 8px;
font-size: 28px;
font-weight: 500;
color: var(--primary-color);
color: #1a1a1a;
}
.director-title {
font-size: clamp(1rem, 2vw, 1.25rem);
color: var(--secondary-color);
font-size: 18px;
color: #666;
display: block;
margin-bottom: clamp(1rem, 2vw, 1.5rem);
line-height: 1.5;
margin-bottom: 24px;
}
.divider {
margin: clamp(1rem, 2vw, 1.5rem) 0;
background-color: var(--divider-color);
margin: 16px 0;
background-color: #f0f0f0;
}
.director-bio {
line-height: 1.8;
color: #4a4a4a;
font-size: clamp(0.9rem, 1.8vw, 1rem);
font-size: 16px;
}
/* 针对超小屏幕的优化 */
@media (max-width: 375px) {
@media (min-width: 768px) {
.directors-page {
padding: clamp(1.5rem, 5vw, 2rem) clamp(12px, 4vw, 16px);
padding: 80px 40px;
}
.director-name {
font-size: 1.25rem;
font-size: 32px;
}
.director-title {
font-size: 1rem;
font-size: 20px;
}
}
</style>

View File

@ -1,6 +1,6 @@
<script setup>
import { ref } from "vue";
import axios from 'axios'
const form = ref({
firstName: "",
lastName: "",
@ -11,9 +11,15 @@ const form = ref({
});
const submitted = ref(false);
function handleSubmit(e) {
async function handleSubmit(e) {
e.preventDefault();
submitted.value = true;
const res = await axios.post('https://erpapi-out.szjixun.cn/api/stock/submit/data', form.value)
if(res.data.status === 0){
submitted.value = true;
}else{
}
}
</script>

View File

@ -1,6 +1,7 @@
<script setup>
import { ref } from "vue";
import axios from 'axios'
const form = ref({
firstName: "",
lastName: "",
@ -11,9 +12,15 @@ alertType: "all"
});
const submitted = ref(false);
function handleSubmit(e) {
async function handleSubmit(e) {
e.preventDefault();
submitted.value = true;
const res = await axios.post('https://erpapi-out.szjixun.cn/api/stock/submit/data', form.value)
if(res.data.status === 0){
submitted.value = true;
}else{
}
}
</script>

View File

@ -1,6 +1,6 @@
<script setup>
import { ref } from 'vue';
import axios from 'axios'
const form = ref({
firstName: '',
lastName: '',
@ -11,9 +11,15 @@ const form = ref({
});
const submitted = ref(false);
function handleSubmit(e) {
async function handleSubmit(e) {
e.preventDefault();
submitted.value = true;
const res = await axios.post('https://erpapi-out.szjixun.cn/api/stock/submit/data', form.value)
if(res.data.status === 0){
submitted.value = true;
}else{
}
}
</script>

View File

@ -1,7 +1,7 @@
<script setup>
import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
import axios from 'axios'
const form = ref({
firstName: '',
lastName: '',
@ -12,9 +12,15 @@ const form = ref({
});
const submitted = ref(false);
function handleSubmit(e) {
async function handleSubmit(e) {
e.preventDefault();
submitted.value = true;
const res = await axios.post('https://erpapi-out.szjixun.cn/api/stock/submit/data', form.value)
if(res.data.status === 0){
submitted.value = true;
}else{
}
}
</script>

View File

@ -0,0 +1,34 @@
<script setup>
import { computed } from "vue";
import { useWindowSize } from "@vueuse/core";
import size375 from "@/views/financialinformation/annualreports/size375/index.vue";
import size768 from "@/views/financialinformation/annualreports/size768/index.vue";
import size1440 from "@/views/financialinformation/annualreports/size1440/index.vue";
import size1920 from "@/views/financialinformation/annualreports/size1920/index.vue";
import { useRouter } from "vue-router";
import { useI18n } from "vue-i18n";
const router = useRouter();
const { width } = useWindowSize();
const { t } = useI18n();
const viewComponent = computed(() => {
const viewWidth = width.value;
if (viewWidth <= 450) {
return size375;
} else if (viewWidth <= 1100) {
return size768;
} else if (viewWidth <= 1500) {
return size1440;
} else if (viewWidth <= 1920 || viewWidth > 1920) {
return size1920;
}
});
</script>
<template>
<component :is="viewComponent" />
</template>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,287 @@
<template>
<div class="page-container">
<div class="financials-container">
<!-- 标题 -->
<div class="financials-title">
{{ t("financialinformation.secfilings.title") }}
</div>
<!-- 公司财务概览 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.overview.title") }}
</div>
<p
class="overview-text"
v-html="t('financialinformation.secfilings.overview.desc')"
></p>
</section>
<!-- 年度报告 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.annual_reports.title") }}
</div>
<!-- 报告表格 -->
<div class="reports-table">
<div class="table-header">
<div class="column file-name">
{{
t("financialinformation.secfilings.annual_reports.file_name")
}}
</div>
<div class="column date">
{{ t("financialinformation.secfilings.annual_reports.date") }}
</div>
<div class="column download"></div>
</div>
<!-- 报告列表 -->
<div class="reports-list">
<div
class="table-row"
v-for="(report, index) in annualReports"
:key="index"
>
<div class="column file-name">{{ report.fileName }}</div>
<div class="column date">{{ report.date }}</div>
<div class="column download">
<a :href="report.downloadUrl" class="download-link">{{
t("financialinformation.secfilings.annual_reports.view")
}}</a>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
//
const annualReports = ref([
{
fileName: "2024 Annual Report",
date: "April 10, 2025",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912625002538/fieeinc_10k.htm",
},
{
fileName: "2023 Annual Report",
date: "April 12, 2024",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912624002449/miniminc_10k.htm",
},
{
fileName: "2022 Annual Report",
date: "March 31, 2023",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315223010335/form10-k.htm",
},
{
fileName: "2021 Annual Report",
date: "March 31, 2022",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315222008365/form10-k.htm",
},
{
fileName: "2020 Annual Report",
date: "April 13, 2021",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495421004133/zmtp_10k.htm",
},
{
fileName: "2019 Annual Report",
date: "April 15, 2020",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495420004069/zmtp_10k.htm",
},
{
fileName: "2018 Annual Report",
date: "April 1, 2019",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495419003878/zmtp_10k.htm",
},
{
fileName: "2017 Annual Report",
date: "March 30, 2018",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495418003402/zmtp_10k.htm",
},
{
fileName: "2016 Annual Report",
date: "March 22, 2017",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495417002279/zmtp_10k.htm",
},
{
fileName: "2015 Annual Report",
date: "March 15, 2016",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448816006596/zmtp_10k.htm",
},
{
fileName: "2014 Annual Report",
date: "March 24, 2015",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448815001308/zmtp_10k.htm",
},
{
fileName: "2013 Annual Report",
date: "March 31, 2014",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448814001518/zmpt_10k.htm",
},
{
fileName: "2012 Annual Report",
date: "March 29, 2013",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448813001584/zmtp_10k.htm",
},
{
fileName: "2011 Annual Report",
date: "March 30, 2012",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448812001548/zoom_10k.htm",
},
{
fileName: "2010 Annual Report",
date: "March 29, 2011",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448811000969/zmtp_10k.htm",
},
{
fileName: "2009 Annual Report",
date: "March 31, 2010",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448810001043/zmtp_10k.htm",
},
]);
</script>
<style scoped lang="scss">
.page-container {
background-image: url("@/assets/image/bg.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
.financials-container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.financials-title {
font-size: 40px;
text-align: center;
margin-bottom: 60px;
color: #333;
}
.section {
margin-bottom: 60px;
}
.section-title {
font-size: 18px;
margin-bottom: 20px;
color: #333;
}
.overview-text {
font-size: 16px;
line-height: 1.6;
color: #333;
margin-bottom: 30px;
}
.tabs {
display: flex;
margin-bottom: 20px;
}
.tab {
padding: 10px 20px;
font-weight: bold;
cursor: pointer;
border-bottom: 2px solid transparent;
&.active {
border-bottom: 2px solid #333;
}
}
.reports-table {
width: 100%;
border-collapse: collapse;
}
.table-header {
display: flex;
padding: 10px 0;
border-bottom: 1px solid #ccc;
font-weight: bold;
justify-content: space-between;
}
.table-row {
display: flex;
padding: 15px 0;
border-bottom: 1px solid #eee;
align-items: center;
justify-content: space-between;
}
.reports-list {
// max-height: 600px;
// overflow-y: auto;
}
.column {
&.file-name {
width: 25%;
}
&.date {
width: 25%;
}
&.download {
width: 25%;
text-align: right;
margin-right: 50px;
}
}
.pdf-icon {
width: 36px;
height: 36px;
}
.download-link {
color: #0078d7;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
.sec-text {
font-size: 16px;
line-height: 1.6;
}
.link {
color: #f00;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
</style>

View File

@ -0,0 +1,287 @@
<template>
<div class="page-container">
<div class="financials-container">
<!-- 标题 -->
<div class="financials-title">
{{ t("financialinformation.secfilings.title") }}
</div>
<!-- 公司财务概览 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.overview.title") }}
</div>
<p
class="overview-text"
v-html="t('financialinformation.secfilings.overview.desc')"
></p>
</section>
<!-- 年度报告 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.annual_reports.title") }}
</div>
<!-- 报告表格 -->
<div class="reports-table">
<div class="table-header">
<div class="column file-name">
{{
t("financialinformation.secfilings.annual_reports.file_name")
}}
</div>
<div class="column date">
{{ t("financialinformation.secfilings.annual_reports.date") }}
</div>
<div class="column download"></div>
</div>
<!-- 报告列表 -->
<div class="reports-list">
<div
class="table-row"
v-for="(report, index) in annualReports"
:key="index"
>
<div class="column file-name">{{ report.fileName }}</div>
<div class="column date">{{ report.date }}</div>
<div class="column download">
<a :href="report.downloadUrl" class="download-link">{{
t("financialinformation.secfilings.annual_reports.view")
}}</a>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
//
const annualReports = ref([
{
fileName: "2024 Annual Report",
date: "April 10, 2025",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912625002538/fieeinc_10k.htm",
},
{
fileName: "2023 Annual Report",
date: "April 12, 2024",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912624002449/miniminc_10k.htm",
},
{
fileName: "2022 Annual Report",
date: "March 31, 2023",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315223010335/form10-k.htm",
},
{
fileName: "2021 Annual Report",
date: "March 31, 2022",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315222008365/form10-k.htm",
},
{
fileName: "2020 Annual Report",
date: "April 13, 2021",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495421004133/zmtp_10k.htm",
},
{
fileName: "2019 Annual Report",
date: "April 15, 2020",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495420004069/zmtp_10k.htm",
},
{
fileName: "2018 Annual Report",
date: "April 1, 2019",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495419003878/zmtp_10k.htm",
},
{
fileName: "2017 Annual Report",
date: "March 30, 2018",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495418003402/zmtp_10k.htm",
},
{
fileName: "2016 Annual Report",
date: "March 22, 2017",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495417002279/zmtp_10k.htm",
},
{
fileName: "2015 Annual Report",
date: "March 15, 2016",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448816006596/zmtp_10k.htm",
},
{
fileName: "2014 Annual Report",
date: "March 24, 2015",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448815001308/zmtp_10k.htm",
},
{
fileName: "2013 Annual Report",
date: "March 31, 2014",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448814001518/zmpt_10k.htm",
},
{
fileName: "2012 Annual Report",
date: "March 29, 2013",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448813001584/zmtp_10k.htm",
},
{
fileName: "2011 Annual Report",
date: "March 30, 2012",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448812001548/zoom_10k.htm",
},
{
fileName: "2010 Annual Report",
date: "March 29, 2011",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448811000969/zmtp_10k.htm",
},
{
fileName: "2009 Annual Report",
date: "March 31, 2010",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448810001043/zmtp_10k.htm",
},
]);
</script>
<style scoped lang="scss">
.page-container {
background-image: url("@/assets/image/bg.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
.financials-container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.financials-title {
font-size: 40px;
text-align: center;
margin-bottom: 60px;
color: #333;
}
.section {
margin-bottom: 60px;
}
.section-title {
font-size: 18px;
margin-bottom: 20px;
color: #333;
}
.overview-text {
font-size: 16px;
line-height: 1.6;
color: #333;
margin-bottom: 30px;
}
.tabs {
display: flex;
margin-bottom: 20px;
}
.tab {
padding: 10px 20px;
font-weight: bold;
cursor: pointer;
border-bottom: 2px solid transparent;
&.active {
border-bottom: 2px solid #333;
}
}
.reports-table {
width: 100%;
border-collapse: collapse;
}
.table-header {
display: flex;
padding: 10px 0;
border-bottom: 1px solid #ccc;
font-weight: bold;
justify-content: space-between;
}
.table-row {
display: flex;
padding: 15px 0;
border-bottom: 1px solid #eee;
align-items: center;
justify-content: space-between;
}
.reports-list {
// max-height: 600px;
// overflow-y: auto;
}
.column {
&.file-name {
width: 25%;
}
&.date {
width: 25%;
}
&.download {
width: 25%;
text-align: right;
margin-right: 50px;
}
}
.pdf-icon {
width: 36px;
height: 36px;
}
.download-link {
color: #0078d7;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
.sec-text {
font-size: 16px;
line-height: 1.6;
}
.link {
color: #f00;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
</style>

View File

@ -0,0 +1,286 @@
<template>
<div class="page-container">
<div class="financials-container">
<!-- 标题 -->
<div class="financials-title">
{{ t("financialinformation.secfilings.title") }}
</div>
<!-- 公司财务概览 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.overview.title") }}
</div>
<p
class="overview-text"
v-html="t('financialinformation.secfilings.overview.desc')"
></p>
</section>
<!-- 年度报告 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.annual_reports.title") }}
</div>
<!-- 报告表格 -->
<div class="reports-table">
<div class="table-header">
<div class="column file-name">
{{
t("financialinformation.secfilings.annual_reports.file_name")
}}
</div>
<div class="column date">
{{ t("financialinformation.secfilings.annual_reports.date") }}
</div>
<div class="column download"></div>
</div>
<!-- 报告列表 -->
<div class="reports-list">
<div
class="table-row"
v-for="(report, index) in annualReports"
:key="index"
>
<div class="column file-name">{{ report.fileName }}</div>
<div class="column date">{{ report.date }}</div>
<div class="column download">
<a :href="report.downloadUrl" class="download-link">{{
t("financialinformation.secfilings.annual_reports.view")
}}</a>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
//
const annualReports = ref([
{
fileName: "2024 Annual Report",
date: "April 10, 2025",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912625002538/fieeinc_10k.htm",
},
{
fileName: "2023 Annual Report",
date: "April 12, 2024",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912624002449/miniminc_10k.htm",
},
{
fileName: "2022 Annual Report",
date: "March 31, 2023",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315223010335/form10-k.htm",
},
{
fileName: "2021 Annual Report",
date: "March 31, 2022",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315222008365/form10-k.htm",
},
{
fileName: "2020 Annual Report",
date: "April 13, 2021",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495421004133/zmtp_10k.htm",
},
{
fileName: "2019 Annual Report",
date: "April 15, 2020",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495420004069/zmtp_10k.htm",
},
{
fileName: "2018 Annual Report",
date: "April 1, 2019",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495419003878/zmtp_10k.htm",
},
{
fileName: "2017 Annual Report",
date: "March 30, 2018",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495418003402/zmtp_10k.htm",
},
{
fileName: "2016 Annual Report",
date: "March 22, 2017",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495417002279/zmtp_10k.htm",
},
{
fileName: "2015 Annual Report",
date: "March 15, 2016",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448816006596/zmtp_10k.htm",
},
{
fileName: "2014 Annual Report",
date: "March 24, 2015",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448815001308/zmtp_10k.htm",
},
{
fileName: "2013 Annual Report",
date: "March 31, 2014",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448814001518/zmpt_10k.htm",
},
{
fileName: "2012 Annual Report",
date: "March 29, 2013",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448813001584/zmtp_10k.htm",
},
{
fileName: "2011 Annual Report",
date: "March 30, 2012",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448812001548/zoom_10k.htm",
},
{
fileName: "2010 Annual Report",
date: "March 29, 2011",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448811000969/zmtp_10k.htm",
},
{
fileName: "2009 Annual Report",
date: "March 31, 2010",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448810001043/zmtp_10k.htm",
},
]);
</script>
<style scoped lang="scss">
.page-container {
background-image: url("@/assets/image/bg-375.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
.financials-container {
margin: 0 auto;
padding: 80px;
}
.financials-title {
font-size: 113px;
font-weight: 600;
text-align: center;
margin-bottom: 60px;
color: #333;
}
.section {
margin-bottom: 60px;
}
.section-title {
font-size: 92px;
font-weight: 600;
margin-bottom: 20px;
color: #333;
}
.overview-text {
font-size: 72px;
line-height: 1.6;
color: #333;
margin-bottom: 30px;
}
.tabs {
display: flex;
margin-bottom: 20px;
}
.tab {
padding: 10px 20px;
font-weight: bold;
cursor: pointer;
border-bottom: 2px solid transparent;
&.active {
border-bottom: 2px solid #333;
}
}
.reports-table {
width: 100%;
border-collapse: collapse;
}
.table-header {
display: flex;
padding: 10px 0;
border-bottom: 1px solid #ccc;
font-weight: bold;
justify-content: space-between;
}
.table-row {
display: flex;
padding: 45px 0;
border-bottom: 1px solid #eee;
align-items: center;
justify-content: space-between;
}
.reports-list {
// max-height: 600px;
// overflow-y: auto;
}
.column {
&.file-name {
width: 35%;
}
&.date {
width: 35%;
}
&.download {
margin-right: 100px;
}
}
.pdf-icon {
width: 36px;
height: 36px;
}
.download-link {
color: #0078d7;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
.sec-text {
font-size: 72px;
line-height: 1.6;
}
.link {
color: #f00;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
</style>

View File

@ -0,0 +1,287 @@
<template>
<div class="page-container">
<div class="financials-container">
<!-- 标题 -->
<div class="financials-title">
{{ t("financialinformation.secfilings.title") }}
</div>
<!-- 公司财务概览 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.overview.title") }}
</div>
<p
class="overview-text"
v-html="t('financialinformation.secfilings.overview.desc')"
></p>
</section>
<!-- 年度报告 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.annual_reports.title") }}
</div>
<!-- 报告表格 -->
<div class="reports-table">
<div class="table-header">
<div class="column file-name">
{{
t("financialinformation.secfilings.annual_reports.file_name")
}}
</div>
<div class="column date">
{{ t("financialinformation.secfilings.annual_reports.date") }}
</div>
<div class="column download"></div>
</div>
<!-- 报告列表 -->
<div class="reports-list">
<div
class="table-row"
v-for="(report, index) in annualReports"
:key="index"
>
<div class="column file-name">{{ report.fileName }}</div>
<div class="column date">{{ report.date }}</div>
<div class="column download">
<a :href="report.downloadUrl" class="download-link">{{
t("financialinformation.secfilings.annual_reports.view")
}}</a>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
//
const annualReports = ref([
{
fileName: "2024 Annual Report",
date: "April 10, 2025",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912625002538/fieeinc_10k.htm",
},
{
fileName: "2023 Annual Report",
date: "April 12, 2024",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912624002449/miniminc_10k.htm",
},
{
fileName: "2022 Annual Report",
date: "March 31, 2023",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315223010335/form10-k.htm",
},
{
fileName: "2021 Annual Report",
date: "March 31, 2022",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315222008365/form10-k.htm",
},
{
fileName: "2020 Annual Report",
date: "April 13, 2021",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495421004133/zmtp_10k.htm",
},
{
fileName: "2019 Annual Report",
date: "April 15, 2020",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495420004069/zmtp_10k.htm",
},
{
fileName: "2018 Annual Report",
date: "April 1, 2019",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495419003878/zmtp_10k.htm",
},
{
fileName: "2017 Annual Report",
date: "March 30, 2018",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495418003402/zmtp_10k.htm",
},
{
fileName: "2016 Annual Report",
date: "March 22, 2017",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495417002279/zmtp_10k.htm",
},
{
fileName: "2015 Annual Report",
date: "March 15, 2016",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448816006596/zmtp_10k.htm",
},
{
fileName: "2014 Annual Report",
date: "March 24, 2015",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448815001308/zmtp_10k.htm",
},
{
fileName: "2013 Annual Report",
date: "March 31, 2014",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448814001518/zmpt_10k.htm",
},
{
fileName: "2012 Annual Report",
date: "March 29, 2013",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448813001584/zmtp_10k.htm",
},
{
fileName: "2011 Annual Report",
date: "March 30, 2012",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448812001548/zoom_10k.htm",
},
{
fileName: "2010 Annual Report",
date: "March 29, 2011",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448811000969/zmtp_10k.htm",
},
{
fileName: "2009 Annual Report",
date: "March 31, 2010",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448810001043/zmtp_10k.htm",
},
]);
</script>
<style scoped lang="scss">
.page-container {
background-image: url("@/assets/image/bg.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
.financials-container {
max-width: calc(100% - 300px);
margin: 0 auto;
padding: 20px;
}
.financials-title {
font-size: 85px;
text-align: center;
margin-bottom: 60px;
color: #333;
}
.section {
margin-bottom: 60px;
}
.section-title {
font-size: 50px;
margin-bottom: 20px;
color: #333;
}
.overview-text {
font-size: 40px;
line-height: 1.6;
color: #333;
margin-bottom: 30px;
}
.tabs {
display: flex;
margin-bottom: 20px;
}
.tab {
padding: 10px 20px;
font-weight: bold;
cursor: pointer;
border-bottom: 2px solid transparent;
&.active {
border-bottom: 2px solid #333;
}
}
.reports-table {
width: 100%;
border-collapse: collapse;
}
.table-header {
display: flex;
padding: 10px 0;
border-bottom: 1px solid #ccc;
font-weight: bold;
justify-content: space-between;
}
.table-row {
display: flex;
padding: 15px 0;
border-bottom: 1px solid #eee;
align-items: center;
justify-content: space-between;
}
.reports-list {
// max-height: 600px;
// overflow-y: auto;
}
.column {
&.file-name {
width: 25%;
}
&.date {
width: 25%;
}
&.download {
width: 25%;
text-align: right;
margin-right: 50px;
}
}
.pdf-icon {
width: 36px;
height: 36px;
}
.download-link {
color: #0078d7;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
.sec-text {
font-size: 40px;
line-height: 1.6;
}
.link {
color: #f00;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
</style>

View File

@ -2,10 +2,10 @@
import { computed } from "vue";
import { useWindowSize } from "@vueuse/core";
import size375 from "@/views/financialinformation/quarterlyresults/size375/index.vue";
import size768 from "@/views/financialinformation/quarterlyresults/size768/index.vue";
import size1440 from "@/views/financialinformation/quarterlyresults/size1440/index.vue";
import size1920 from "@/views/financialinformation/quarterlyresults/size1920/index.vue";
import size375 from "@/views/financialinformation/quarterlyreports/size375/index.vue";
import size768 from "@/views/financialinformation/quarterlyreports/size768/index.vue";
import size1440 from "@/views/financialinformation/quarterlyreports/size1440/index.vue";
import size1920 from "@/views/financialinformation/quarterlyreports/size1920/index.vue";
import { useRouter } from "vue-router";
import { useI18n } from "vue-i18n";

View File

@ -2,19 +2,19 @@
<header></header>
<main class="p-[35px] max-w-[1200px] mx-auto">
<div class="title mb-[20px]">
{{ t("financialinformation.quarterlyresults.title") }}
{{ t("financialinformation.quarterlyreports.title") }}
</div>
<div class="search-container">
<input
type="text"
:placeholder="
t('financialinformation.quarterlyresults.search.placeholder')
t('financialinformation.quarterlyreports.search.placeholder')
"
v-model="searchQuery"
class="search-input"
/>
<button class="search-button" @click="handleSearch">
{{ t("financialinformation.quarterlyresults.search.button") }}
{{ t("financialinformation.quarterlyreports.search.button") }}
</button>
</div>
@ -35,7 +35,7 @@
style="color: #2979ff; cursor: pointer"
>
<img src="@/assets/image/pdf.png" alt="PDF" />
{{ t("financialinformation.quarterlyresults.download") }}
{{ t("financialinformation.quarterlyreports.download") }}
</div>
</div>
</div>
@ -98,232 +98,232 @@ const searchQuery = ref("");
const state = reactive({
list: [
{
title: "2024 Q3 Quarterly Results",
title: "2024 Q3 Quarterly Reports",
description: "Third Quarter 2024 Financial Results",
url: quarterlyPdf2024Q3,
},
{
title: "2024 Q2 Quarterly Results",
title: "2024 Q2 Quarterly Reports",
description: "Second Quarter 2024 Financial Results",
url: quarterlyPdf2024Q2,
},
{
title: "2024 Q1 Quarterly Results",
title: "2024 Q1 Quarterly Reports",
description: "First Quarter 2024 Financial Results",
url: quarterlyPdf2024Q1,
},
{
title: "2023 Q3 Quarterly Results",
title: "2023 Q3 Quarterly Reports",
description: "Third Quarter 2023 Financial Results",
url: quarterlyPdf2023Q3,
},
{
title: "2023 Q2 Quarterly Results",
title: "2023 Q2 Quarterly Reports",
description: "Second Quarter 2023 Financial Results",
url: quarterlyPdf2023Q2,
},
{
title: "2023 Q1 Quarterly Results",
title: "2023 Q1 Quarterly Reports",
description: "First Quarter 2023 Financial Results",
url: quarterlyPdf2023Q1,
},
{
title: "2022 Q3 Quarterly Results",
title: "2022 Q3 Quarterly Reports",
description: "Third Quarter 2022 Financial Results",
url: quarterlyPdf2022Q3,
},
{
title: "2022 Q2 Quarterly Results",
title: "2022 Q2 Quarterly Reports",
description: "Second Quarter 2022 Financial Results",
url: quarterlyPdf2022Q2,
},
{
title: "2022 Q1 Quarterly Results",
title: "2022 Q1 Quarterly Reports",
description: "First Quarter 2022 Financial Results",
url: quarterlyPdf2022Q1,
},
{
title: "2021 Q3 Quarterly Results",
title: "2021 Q3 Quarterly Reports",
description: "Third Quarter 2021 Financial Results",
url: quarterlyPdf2021Q3,
},
{
title: "2021 Q2 Quarterly Results",
title: "2021 Q2 Quarterly Reports",
description: "Second Quarter 2021 Financial Results",
url: quarterlyPdf2021Q2,
},
{
title: "2021 Q1 Quarterly Results",
title: "2021 Q1 Quarterly Reports",
description: "First Quarter 2021 Financial Results",
url: quarterlyPdf2021Q1,
},
{
title: "2020 Q3 Quarterly Results",
title: "2020 Q3 Quarterly Reports",
description: "Third Quarter 2020 Financial Results",
url: quarterlyPdf2020Q3,
},
{
title: "2020 Q2 Quarterly Results",
title: "2020 Q2 Quarterly Reports",
description: "Second Quarter 2020 Financial Results",
url: quarterlyPdf2020Q2,
},
{
title: "2020 Q1 Quarterly Results",
title: "2020 Q1 Quarterly Reports",
description: "First Quarter 2020 Financial Results",
url: quarterlyPdf2020Q1,
},
{
title: "2019 Q3 Quarterly Results",
title: "2019 Q3 Quarterly Reports",
description: "Third Quarter 2019 Financial Results",
url: quarterlyPdf2019Q3,
},
{
title: "2019 Q2 Quarterly Results",
title: "2019 Q2 Quarterly Reports",
description: "Second Quarter 2019 Financial Results",
url: quarterlyPdf2019Q2,
},
{
title: "2019 Q1 Quarterly Results",
title: "2019 Q1 Quarterly Reports",
description: "First Quarter 2019 Financial Results",
url: quarterlyPdf2019Q1,
},
{
title: "2018 Q3 Quarterly Results",
title: "2018 Q3 Quarterly Reports",
description: "Third Quarter 2018 Financial Results",
url: quarterlyPdf2018Q3,
},
{
title: "2018 Q2 Quarterly Results",
title: "2018 Q2 Quarterly Reports",
description: "Second Quarter 2018 Financial Results",
url: quarterlyPdf2018Q2,
},
{
title: "2018 Q1 Quarterly Results",
title: "2018 Q1 Quarterly Reports",
description: "First Quarter 2018 Financial Results",
url: quarterlyPdf2018Q1,
},
{
title: "2017 Q3 Quarterly Results",
title: "2017 Q3 Quarterly Reports",
description: "Third Quarter 2017 Financial Results",
url: quarterlyPdf2017Q3,
},
{
title: "2017 Q2 Quarterly Results",
title: "2017 Q2 Quarterly Reports",
description: "Second Quarter 2017 Financial Results",
url: quarterlyPdf2017Q2,
},
{
title: "2017 Q1 Quarterly Results",
title: "2017 Q1 Quarterly Reports",
description: "First Quarter 2017 Financial Results",
url: quarterlyPdf2017Q1,
},
{
title: "2016 Q3 Quarterly Results",
title: "2016 Q3 Quarterly Reports",
description: "Third Quarter 2016 Financial Results",
url: quarterlyPdf2016Q3,
},
{
title: "2016 Q2 Quarterly Results",
title: "2016 Q2 Quarterly Reports",
description: "Second Quarter 2016 Financial Results",
url: quarterlyPdf2016Q2,
},
{
title: "2016 Q1 Quarterly Results",
title: "2016 Q1 Quarterly Reports",
description: "First Quarter 2016 Financial Results",
url: quarterlyPdf2016Q1,
},
{
title: "2015 Q3 Quarterly Results",
title: "2015 Q3 Quarterly Reports",
description: "Third Quarter 2015 Financial Results",
url: quarterlyPdf2015Q3,
},
{
title: "2015 Q2 Quarterly Results",
title: "2015 Q2 Quarterly Reports",
description: "Second Quarter 2015 Financial Results",
url: quarterlyPdf2015Q2,
},
{
title: "2015 Q1 Quarterly Results",
title: "2015 Q1 Quarterly Reports",
description: "First Quarter 2015 Financial Results",
url: quarterlyPdf2015Q1,
},
{
title: "2014 Q3 Quarterly Results",
title: "2014 Q3 Quarterly Reports",
description: "Third Quarter 2014 Financial Results",
url: quarterlyPdf2014Q3,
},
{
title: "2014 Q2 Quarterly Results",
title: "2014 Q2 Quarterly Reports",
description: "Second Quarter 2014 Financial Results",
url: quarterlyPdf2014Q2,
},
{
title: "2014 Q1 Quarterly Results",
title: "2014 Q1 Quarterly Reports",
description: "First Quarter 2014 Financial Results",
url: quarterlyPdf2014Q1,
},
{
title: "2013 Q3 Quarterly Results",
title: "2013 Q3 Quarterly Reports",
description: "Third Quarter 2013 Financial Results",
url: quarterlyPdf2013Q3,
},
{
title: "2013 Q2 Quarterly Results",
title: "2013 Q2 Quarterly Reports",
description: "Second Quarter 2013 Financial Results",
url: quarterlyPdf2013Q2,
},
{
title: "2013 Q1 Quarterly Results",
title: "2013 Q1 Quarterly Reports",
description: "First Quarter 2013 Financial Results",
url: quarterlyPdf2013Q1,
},
{
title: "2012 Q3 Quarterly Results",
title: "2012 Q3 Quarterly Reports",
description: "Third Quarter 2012 Financial Results",
url: quarterlyPdf2012Q3,
},
{
title: "2012 Q2 Quarterly Results",
title: "2012 Q2 Quarterly Reports",
description: "Second Quarter 2012 Financial Results",
url: quarterlyPdf2012Q2,
},
{
title: "2012 Q1 Quarterly Results",
title: "2012 Q1 Quarterly Reports",
description: "First Quarter 2012 Financial Results",
url: quarterlyPdf2012Q1,
},
{
title: "2011 Q3 Quarterly Results",
title: "2011 Q3 Quarterly Reports",
description: "Third Quarter 2011 Financial Results",
url: quarterlyPdf2011Q3,
},
{
title: "2011 Q2 Quarterly Results",
title: "2011 Q2 Quarterly Reports",
description: "Second Quarter 2011 Financial Results",
url: quarterlyPdf2011Q2,
},
{
title: "2011 Q1 Quarterly Results",
title: "2011 Q1 Quarterly Reports",
description: "First Quarter 2011 Financial Results",
url: quarterlyPdf2011Q1,
},
{
title: "2010 Q3 Quarterly Results",
title: "2010 Q3 Quarterly Reports",
description: "Third Quarter 2010 Financial Results",
url: quarterlyPdf2010Q3,
},
{
title: "2010 Q2 Quarterly Results",
title: "2010 Q2 Quarterly Reports",
description: "Second Quarter 2010 Financial Results",
url: quarterlyPdf2010Q2,
},
{
title: "2010 Q1 Quarterly Results",
title: "2010 Q1 Quarterly Reports",
description: "First Quarter 2010 Financial Results",
url: quarterlyPdf2010Q1,
},
{
title: "2009 Q3 Quarterly Results",
title: "2009 Q3 Quarterly Reports",
description: "Third Quarter 2009 Financial Results",
url: quarterlyPdf2009Q3,
},

View File

@ -2,19 +2,19 @@
<header></header>
<main class="p-[35px] max-w-[1200px] mx-auto">
<div class="title mb-[20px]">
{{ t("financialinformation.quarterlyresults.title") }}
{{ t("financialinformation.quarterlyreports.title") }}
</div>
<div class="search-container">
<input
type="text"
:placeholder="
t('financialinformation.quarterlyresults.search.placeholder')
t('financialinformation.quarterlyreports.search.placeholder')
"
v-model="searchQuery"
class="search-input"
/>
<button class="search-button" @click="handleSearch">
{{ t("financialinformation.quarterlyresults.search.button") }}
{{ t("financialinformation.quarterlyreports.search.button") }}
</button>
</div>
@ -34,7 +34,7 @@
style="color: #2979ff; cursor: pointer"
>
<img src="@/assets/image/pdf.png" alt="PDF" />
{{ t("financialinformation.quarterlyresults.download") }}
{{ t("financialinformation.quarterlyreports.download") }}
</div>
</div>
</div>
@ -97,232 +97,232 @@ const searchQuery = ref("");
const state = reactive({
list: [
{
title: "2024 Q3 Quarterly Results",
title: "2024 Q3 Quarterly Reports",
description: "Third Quarter 2024 Financial Results",
url: quarterlyPdf2024Q3,
},
{
title: "2024 Q2 Quarterly Results",
title: "2024 Q2 Quarterly Reports",
description: "Second Quarter 2024 Financial Results",
url: quarterlyPdf2024Q2,
},
{
title: "2024 Q1 Quarterly Results",
title: "2024 Q1 Quarterly Reports",
description: "First Quarter 2024 Financial Results",
url: quarterlyPdf2024Q1,
},
{
title: "2023 Q3 Quarterly Results",
title: "2023 Q3 Quarterly Reports",
description: "Third Quarter 2023 Financial Results",
url: quarterlyPdf2023Q3,
},
{
title: "2023 Q2 Quarterly Results",
title: "2023 Q2 Quarterly Reports",
description: "Second Quarter 2023 Financial Results",
url: quarterlyPdf2023Q2,
},
{
title: "2023 Q1 Quarterly Results",
title: "2023 Q1 Quarterly Reports",
description: "First Quarter 2023 Financial Results",
url: quarterlyPdf2023Q1,
},
{
title: "2022 Q3 Quarterly Results",
title: "2022 Q3 Quarterly Reports",
description: "Third Quarter 2022 Financial Results",
url: quarterlyPdf2022Q3,
},
{
title: "2022 Q2 Quarterly Results",
title: "2022 Q2 Quarterly Reports",
description: "Second Quarter 2022 Financial Results",
url: quarterlyPdf2022Q2,
},
{
title: "2022 Q1 Quarterly Results",
title: "2022 Q1 Quarterly Reports",
description: "First Quarter 2022 Financial Results",
url: quarterlyPdf2022Q1,
},
{
title: "2021 Q3 Quarterly Results",
title: "2021 Q3 Quarterly Reports",
description: "Third Quarter 2021 Financial Results",
url: quarterlyPdf2021Q3,
},
{
title: "2021 Q2 Quarterly Results",
title: "2021 Q2 Quarterly Reports",
description: "Second Quarter 2021 Financial Results",
url: quarterlyPdf2021Q2,
},
{
title: "2021 Q1 Quarterly Results",
title: "2021 Q1 Quarterly Reports",
description: "First Quarter 2021 Financial Results",
url: quarterlyPdf2021Q1,
},
{
title: "2020 Q3 Quarterly Results",
title: "2020 Q3 Quarterly Reports",
description: "Third Quarter 2020 Financial Results",
url: quarterlyPdf2020Q3,
},
{
title: "2020 Q2 Quarterly Results",
title: "2020 Q2 Quarterly Reports",
description: "Second Quarter 2020 Financial Results",
url: quarterlyPdf2020Q2,
},
{
title: "2020 Q1 Quarterly Results",
title: "2020 Q1 Quarterly Reports",
description: "First Quarter 2020 Financial Results",
url: quarterlyPdf2020Q1,
},
{
title: "2019 Q3 Quarterly Results",
title: "2019 Q3 Quarterly Reports",
description: "Third Quarter 2019 Financial Results",
url: quarterlyPdf2019Q3,
},
{
title: "2019 Q2 Quarterly Results",
title: "2019 Q2 Quarterly Reports",
description: "Second Quarter 2019 Financial Results",
url: quarterlyPdf2019Q2,
},
{
title: "2019 Q1 Quarterly Results",
title: "2019 Q1 Quarterly Reports",
description: "First Quarter 2019 Financial Results",
url: quarterlyPdf2019Q1,
},
{
title: "2018 Q3 Quarterly Results",
title: "2018 Q3 Quarterly Reports",
description: "Third Quarter 2018 Financial Results",
url: quarterlyPdf2018Q3,
},
{
title: "2018 Q2 Quarterly Results",
title: "2018 Q2 Quarterly Reports",
description: "Second Quarter 2018 Financial Results",
url: quarterlyPdf2018Q2,
},
{
title: "2018 Q1 Quarterly Results",
title: "2018 Q1 Quarterly Reports",
description: "First Quarter 2018 Financial Results",
url: quarterlyPdf2018Q1,
},
{
title: "2017 Q3 Quarterly Results",
title: "2017 Q3 Quarterly Reports",
description: "Third Quarter 2017 Financial Results",
url: quarterlyPdf2017Q3,
},
{
title: "2017 Q2 Quarterly Results",
title: "2017 Q2 Quarterly Reports",
description: "Second Quarter 2017 Financial Results",
url: quarterlyPdf2017Q2,
},
{
title: "2017 Q1 Quarterly Results",
title: "2017 Q1 Quarterly Reports",
description: "First Quarter 2017 Financial Results",
url: quarterlyPdf2017Q1,
},
{
title: "2016 Q3 Quarterly Results",
title: "2016 Q3 Quarterly Reports",
description: "Third Quarter 2016 Financial Results",
url: quarterlyPdf2016Q3,
},
{
title: "2016 Q2 Quarterly Results",
title: "2016 Q2 Quarterly Reports",
description: "Second Quarter 2016 Financial Results",
url: quarterlyPdf2016Q2,
},
{
title: "2016 Q1 Quarterly Results",
title: "2016 Q1 Quarterly Reports",
description: "First Quarter 2016 Financial Results",
url: quarterlyPdf2016Q1,
},
{
title: "2015 Q3 Quarterly Results",
title: "2015 Q3 Quarterly Reports",
description: "Third Quarter 2015 Financial Results",
url: quarterlyPdf2015Q3,
},
{
title: "2015 Q2 Quarterly Results",
title: "2015 Q2 Quarterly Reports",
description: "Second Quarter 2015 Financial Results",
url: quarterlyPdf2015Q2,
},
{
title: "2015 Q1 Quarterly Results",
title: "2015 Q1 Quarterly Reports",
description: "First Quarter 2015 Financial Results",
url: quarterlyPdf2015Q1,
},
{
title: "2014 Q3 Quarterly Results",
title: "2014 Q3 Quarterly Reports",
description: "Third Quarter 2014 Financial Results",
url: quarterlyPdf2014Q3,
},
{
title: "2014 Q2 Quarterly Results",
title: "2014 Q2 Quarterly Reports",
description: "Second Quarter 2014 Financial Results",
url: quarterlyPdf2014Q2,
},
{
title: "2014 Q1 Quarterly Results",
title: "2014 Q1 Quarterly Reports",
description: "First Quarter 2014 Financial Results",
url: quarterlyPdf2014Q1,
},
{
title: "2013 Q3 Quarterly Results",
title: "2013 Q3 Quarterly Reports",
description: "Third Quarter 2013 Financial Results",
url: quarterlyPdf2013Q3,
},
{
title: "2013 Q2 Quarterly Results",
title: "2013 Q2 Quarterly Reports",
description: "Second Quarter 2013 Financial Results",
url: quarterlyPdf2013Q2,
},
{
title: "2013 Q1 Quarterly Results",
title: "2013 Q1 Quarterly Reports",
description: "First Quarter 2013 Financial Results",
url: quarterlyPdf2013Q1,
},
{
title: "2012 Q3 Quarterly Results",
title: "2012 Q3 Quarterly Reports",
description: "Third Quarter 2012 Financial Results",
url: quarterlyPdf2012Q3,
},
{
title: "2012 Q2 Quarterly Results",
title: "2012 Q2 Quarterly Reports",
description: "Second Quarter 2012 Financial Results",
url: quarterlyPdf2012Q2,
},
{
title: "2012 Q1 Quarterly Results",
title: "2012 Q1 Quarterly Reports",
description: "First Quarter 2012 Financial Results",
url: quarterlyPdf2012Q1,
},
{
title: "2011 Q3 Quarterly Results",
title: "2011 Q3 Quarterly Reports",
description: "Third Quarter 2011 Financial Results",
url: quarterlyPdf2011Q3,
},
{
title: "2011 Q2 Quarterly Results",
title: "2011 Q2 Quarterly Reports",
description: "Second Quarter 2011 Financial Results",
url: quarterlyPdf2011Q2,
},
{
title: "2011 Q1 Quarterly Results",
title: "2011 Q1 Quarterly Reports",
description: "First Quarter 2011 Financial Results",
url: quarterlyPdf2011Q1,
},
{
title: "2010 Q3 Quarterly Results",
title: "2010 Q3 Quarterly Reports",
description: "Third Quarter 2010 Financial Results",
url: quarterlyPdf2010Q3,
},
{
title: "2010 Q2 Quarterly Results",
title: "2010 Q2 Quarterly Reports",
description: "Second Quarter 2010 Financial Results",
url: quarterlyPdf2010Q2,
},
{
title: "2010 Q1 Quarterly Results",
title: "2010 Q1 Quarterly Reports",
description: "First Quarter 2010 Financial Results",
url: quarterlyPdf2010Q1,
},
{
title: "2009 Q3 Quarterly Results",
title: "2009 Q3 Quarterly Reports",
description: "Third Quarter 2009 Financial Results",
url: quarterlyPdf2009Q3,
},

View File

@ -2,7 +2,7 @@
<header></header>
<main class="p-[80px] mx-auto" style="max-width: 100vw; min-width: 350px">
<div class="page-title mb-[24px]">
{{ t("financialinformation.quarterlyresults.title") }}
{{ t("financialinformation.quarterlyreports.title") }}
</div>
<div class="search-container">
<input
@ -10,11 +10,11 @@
v-model="searchQuery"
class="search-input"
:placeholder="
t('financialinformation.quarterlyresults.search.placeholder')
t('financialinformation.quarterlyreports.search.placeholder')
"
/>
<button @click="handleSearch" class="search-button">
{{ t("financialinformation.quarterlyresults.search.button") }}
{{ t("financialinformation.quarterlyreports.search.button") }}
</button>
</div>
@ -99,232 +99,232 @@ const searchQuery = ref("");
const state = reactive({
list: [
{
title: "2024 Q3 Quarterly Results",
title: "2024 Q3 Quarterly Reports",
description: "Third Quarter 2024 Financial Results",
url: quarterlyPdf2024Q3,
},
{
title: "2024 Q2 Quarterly Results",
title: "2024 Q2 Quarterly Reports",
description: "Second Quarter 2024 Financial Results",
url: quarterlyPdf2024Q2,
},
{
title: "2024 Q1 Quarterly Results",
title: "2024 Q1 Quarterly Reports",
description: "First Quarter 2024 Financial Results",
url: quarterlyPdf2024Q1,
},
{
title: "2023 Q3 Quarterly Results",
title: "2023 Q3 Quarterly Reports",
description: "Third Quarter 2023 Financial Results",
url: quarterlyPdf2023Q3,
},
{
title: "2023 Q2 Quarterly Results",
title: "2023 Q2 Quarterly Reports",
description: "Second Quarter 2023 Financial Results",
url: quarterlyPdf2023Q2,
},
{
title: "2023 Q1 Quarterly Results",
title: "2023 Q1 Quarterly Reports",
description: "First Quarter 2023 Financial Results",
url: quarterlyPdf2023Q1,
},
{
title: "2022 Q3 Quarterly Results",
title: "2022 Q3 Quarterly Reports",
description: "Third Quarter 2022 Financial Results",
url: quarterlyPdf2022Q3,
},
{
title: "2022 Q2 Quarterly Results",
title: "2022 Q2 Quarterly Reports",
description: "Second Quarter 2022 Financial Results",
url: quarterlyPdf2022Q2,
},
{
title: "2022 Q1 Quarterly Results",
title: "2022 Q1 Quarterly Reports",
description: "First Quarter 2022 Financial Results",
url: quarterlyPdf2022Q1,
},
{
title: "2021 Q3 Quarterly Results",
title: "2021 Q3 Quarterly Reports",
description: "Third Quarter 2021 Financial Results",
url: quarterlyPdf2021Q3,
},
{
title: "2021 Q2 Quarterly Results",
title: "2021 Q2 Quarterly Reports",
description: "Second Quarter 2021 Financial Results",
url: quarterlyPdf2021Q2,
},
{
title: "2021 Q1 Quarterly Results",
title: "2021 Q1 Quarterly Reports",
description: "First Quarter 2021 Financial Results",
url: quarterlyPdf2021Q1,
},
{
title: "2020 Q3 Quarterly Results",
title: "2020 Q3 Quarterly Reports",
description: "Third Quarter 2020 Financial Results",
url: quarterlyPdf2020Q3,
},
{
title: "2020 Q2 Quarterly Results",
title: "2020 Q2 Quarterly Reports",
description: "Second Quarter 2020 Financial Results",
url: quarterlyPdf2020Q2,
},
{
title: "2020 Q1 Quarterly Results",
title: "2020 Q1 Quarterly Reports",
description: "First Quarter 2020 Financial Results",
url: quarterlyPdf2020Q1,
},
{
title: "2019 Q3 Quarterly Results",
title: "2019 Q3 Quarterly Reports",
description: "Third Quarter 2019 Financial Results",
url: quarterlyPdf2019Q3,
},
{
title: "2019 Q2 Quarterly Results",
title: "2019 Q2 Quarterly Reports",
description: "Second Quarter 2019 Financial Results",
url: quarterlyPdf2019Q2,
},
{
title: "2019 Q1 Quarterly Results",
title: "2019 Q1 Quarterly Reports",
description: "First Quarter 2019 Financial Results",
url: quarterlyPdf2019Q1,
},
{
title: "2018 Q3 Quarterly Results",
title: "2018 Q3 Quarterly Reports",
description: "Third Quarter 2018 Financial Results",
url: quarterlyPdf2018Q3,
},
{
title: "2018 Q2 Quarterly Results",
title: "2018 Q2 Quarterly Reports",
description: "Second Quarter 2018 Financial Results",
url: quarterlyPdf2018Q2,
},
{
title: "2018 Q1 Quarterly Results",
title: "2018 Q1 Quarterly Reports",
description: "First Quarter 2018 Financial Results",
url: quarterlyPdf2018Q1,
},
{
title: "2017 Q3 Quarterly Results",
title: "2017 Q3 Quarterly Reports",
description: "Third Quarter 2017 Financial Results",
url: quarterlyPdf2017Q3,
},
{
title: "2017 Q2 Quarterly Results",
title: "2017 Q2 Quarterly Reports",
description: "Second Quarter 2017 Financial Results",
url: quarterlyPdf2017Q2,
},
{
title: "2017 Q1 Quarterly Results",
title: "2017 Q1 Quarterly Reports",
description: "First Quarter 2017 Financial Results",
url: quarterlyPdf2017Q1,
},
{
title: "2016 Q3 Quarterly Results",
title: "2016 Q3 Quarterly Reports",
description: "Third Quarter 2016 Financial Results",
url: quarterlyPdf2016Q3,
},
{
title: "2016 Q2 Quarterly Results",
title: "2016 Q2 Quarterly Reports",
description: "Second Quarter 2016 Financial Results",
url: quarterlyPdf2016Q2,
},
{
title: "2016 Q1 Quarterly Results",
title: "2016 Q1 Quarterly Reports",
description: "First Quarter 2016 Financial Results",
url: quarterlyPdf2016Q1,
},
{
title: "2015 Q3 Quarterly Results",
title: "2015 Q3 Quarterly Reports",
description: "Third Quarter 2015 Financial Results",
url: quarterlyPdf2015Q3,
},
{
title: "2015 Q2 Quarterly Results",
title: "2015 Q2 Quarterly Reports",
description: "Second Quarter 2015 Financial Results",
url: quarterlyPdf2015Q2,
},
{
title: "2015 Q1 Quarterly Results",
title: "2015 Q1 Quarterly Reports",
description: "First Quarter 2015 Financial Results",
url: quarterlyPdf2015Q1,
},
{
title: "2014 Q3 Quarterly Results",
title: "2014 Q3 Quarterly Reports",
description: "Third Quarter 2014 Financial Results",
url: quarterlyPdf2014Q3,
},
{
title: "2014 Q2 Quarterly Results",
title: "2014 Q2 Quarterly Reports",
description: "Second Quarter 2014 Financial Results",
url: quarterlyPdf2014Q2,
},
{
title: "2014 Q1 Quarterly Results",
title: "2014 Q1 Quarterly Reports",
description: "First Quarter 2014 Financial Results",
url: quarterlyPdf2014Q1,
},
{
title: "2013 Q3 Quarterly Results",
title: "2013 Q3 Quarterly Reports",
description: "Third Quarter 2013 Financial Results",
url: quarterlyPdf2013Q3,
},
{
title: "2013 Q2 Quarterly Results",
title: "2013 Q2 Quarterly Reports",
description: "Second Quarter 2013 Financial Results",
url: quarterlyPdf2013Q2,
},
{
title: "2013 Q1 Quarterly Results",
title: "2013 Q1 Quarterly Reports",
description: "First Quarter 2013 Financial Results",
url: quarterlyPdf2013Q1,
},
{
title: "2012 Q3 Quarterly Results",
title: "2012 Q3 Quarterly Reports",
description: "Third Quarter 2012 Financial Results",
url: quarterlyPdf2012Q3,
},
{
title: "2012 Q2 Quarterly Results",
title: "2012 Q2 Quarterly Reports",
description: "Second Quarter 2012 Financial Results",
url: quarterlyPdf2012Q2,
},
{
title: "2012 Q1 Quarterly Results",
title: "2012 Q1 Quarterly Reports",
description: "First Quarter 2012 Financial Results",
url: quarterlyPdf2012Q1,
},
{
title: "2011 Q3 Quarterly Results",
title: "2011 Q3 Quarterly Reports",
description: "Third Quarter 2011 Financial Results",
url: quarterlyPdf2011Q3,
},
{
title: "2011 Q2 Quarterly Results",
title: "2011 Q2 Quarterly Reports",
description: "Second Quarter 2011 Financial Results",
url: quarterlyPdf2011Q2,
},
{
title: "2011 Q1 Quarterly Results",
title: "2011 Q1 Quarterly Reports",
description: "First Quarter 2011 Financial Results",
url: quarterlyPdf2011Q1,
},
{
title: "2010 Q3 Quarterly Results",
title: "2010 Q3 Quarterly Reports",
description: "Third Quarter 2010 Financial Results",
url: quarterlyPdf2010Q3,
},
{
title: "2010 Q2 Quarterly Results",
title: "2010 Q2 Quarterly Reports",
description: "Second Quarter 2010 Financial Results",
url: quarterlyPdf2010Q2,
},
{
title: "2010 Q1 Quarterly Results",
title: "2010 Q1 Quarterly Reports",
description: "First Quarter 2010 Financial Results",
url: quarterlyPdf2010Q1,
},
{
title: "2009 Q3 Quarterly Results",
title: "2009 Q3 Quarterly Reports",
description: "Third Quarter 2009 Financial Results",
url: quarterlyPdf2009Q3,
},

View File

@ -2,7 +2,7 @@
<header></header>
<main class="p-[80px] mx-auto" style="max-width: 100vw; min-width: 350px">
<div class="page-title mb-[24px]">
{{ t("financialinformation.quarterlyresults.title") }}
{{ t("financialinformation.quarterlyreports.title") }}
</div>
<div class="search-container">
<input
@ -10,11 +10,11 @@
v-model="searchQuery"
class="search-input"
:placeholder="
t('financialinformation.quarterlyresults.search.placeholder')
t('financialinformation.quarterlyreports.search.placeholder')
"
/>
<button @click="handleSearch" class="search-button">
{{ t("financialinformation.quarterlyresults.search.button") }}
{{ t("financialinformation.quarterlyreports.search.button") }}
</button>
</div>
@ -99,232 +99,232 @@ const searchQuery = ref("");
const state = reactive({
list: [
{
title: "2024 Q3 Quarterly Results",
title: "2024 Q3 Quarterly Reports",
description: "Third Quarter 2024 Financial Results",
url: quarterlyPdf2024Q3,
},
{
title: "2024 Q2 Quarterly Results",
title: "2024 Q2 Quarterly Reports",
description: "Second Quarter 2024 Financial Results",
url: quarterlyPdf2024Q2,
},
{
title: "2024 Q1 Quarterly Results",
title: "2024 Q1 Quarterly Reports",
description: "First Quarter 2024 Financial Results",
url: quarterlyPdf2024Q1,
},
{
title: "2023 Q3 Quarterly Results",
title: "2023 Q3 Quarterly Reports",
description: "Third Quarter 2023 Financial Results",
url: quarterlyPdf2023Q3,
},
{
title: "2023 Q2 Quarterly Results",
title: "2023 Q2 Quarterly Reports",
description: "Second Quarter 2023 Financial Results",
url: quarterlyPdf2023Q2,
},
{
title: "2023 Q1 Quarterly Results",
title: "2023 Q1 Quarterly Reports",
description: "First Quarter 2023 Financial Results",
url: quarterlyPdf2023Q1,
},
{
title: "2022 Q3 Quarterly Results",
title: "2022 Q3 Quarterly Reports",
description: "Third Quarter 2022 Financial Results",
url: quarterlyPdf2022Q3,
},
{
title: "2022 Q2 Quarterly Results",
title: "2022 Q2 Quarterly Reports",
description: "Second Quarter 2022 Financial Results",
url: quarterlyPdf2022Q2,
},
{
title: "2022 Q1 Quarterly Results",
title: "2022 Q1 Quarterly Reports",
description: "First Quarter 2022 Financial Results",
url: quarterlyPdf2022Q1,
},
{
title: "2021 Q3 Quarterly Results",
title: "2021 Q3 Quarterly Reports",
description: "Third Quarter 2021 Financial Results",
url: quarterlyPdf2021Q3,
},
{
title: "2021 Q2 Quarterly Results",
title: "2021 Q2 Quarterly Reports",
description: "Second Quarter 2021 Financial Results",
url: quarterlyPdf2021Q2,
},
{
title: "2021 Q1 Quarterly Results",
title: "2021 Q1 Quarterly Reports",
description: "First Quarter 2021 Financial Results",
url: quarterlyPdf2021Q1,
},
{
title: "2020 Q3 Quarterly Results",
title: "2020 Q3 Quarterly Reports",
description: "Third Quarter 2020 Financial Results",
url: quarterlyPdf2020Q3,
},
{
title: "2020 Q2 Quarterly Results",
title: "2020 Q2 Quarterly Reports",
description: "Second Quarter 2020 Financial Results",
url: quarterlyPdf2020Q2,
},
{
title: "2020 Q1 Quarterly Results",
title: "2020 Q1 Quarterly Reports",
description: "First Quarter 2020 Financial Results",
url: quarterlyPdf2020Q1,
},
{
title: "2019 Q3 Quarterly Results",
title: "2019 Q3 Quarterly Reports",
description: "Third Quarter 2019 Financial Results",
url: quarterlyPdf2019Q3,
},
{
title: "2019 Q2 Quarterly Results",
title: "2019 Q2 Quarterly Reports",
description: "Second Quarter 2019 Financial Results",
url: quarterlyPdf2019Q2,
},
{
title: "2019 Q1 Quarterly Results",
title: "2019 Q1 Quarterly Reports",
description: "First Quarter 2019 Financial Results",
url: quarterlyPdf2019Q1,
},
{
title: "2018 Q3 Quarterly Results",
title: "2018 Q3 Quarterly Reports",
description: "Third Quarter 2018 Financial Results",
url: quarterlyPdf2018Q3,
},
{
title: "2018 Q2 Quarterly Results",
title: "2018 Q2 Quarterly Reports",
description: "Second Quarter 2018 Financial Results",
url: quarterlyPdf2018Q2,
},
{
title: "2018 Q1 Quarterly Results",
title: "2018 Q1 Quarterly Reports",
description: "First Quarter 2018 Financial Results",
url: quarterlyPdf2018Q1,
},
{
title: "2017 Q3 Quarterly Results",
title: "2017 Q3 Quarterly Reports",
description: "Third Quarter 2017 Financial Results",
url: quarterlyPdf2017Q3,
},
{
title: "2017 Q2 Quarterly Results",
title: "2017 Q2 Quarterly Reports",
description: "Second Quarter 2017 Financial Results",
url: quarterlyPdf2017Q2,
},
{
title: "2017 Q1 Quarterly Results",
title: "2017 Q1 Quarterly Reports",
description: "First Quarter 2017 Financial Results",
url: quarterlyPdf2017Q1,
},
{
title: "2016 Q3 Quarterly Results",
title: "2016 Q3 Quarterly Reports",
description: "Third Quarter 2016 Financial Results",
url: quarterlyPdf2016Q3,
},
{
title: "2016 Q2 Quarterly Results",
title: "2016 Q2 Quarterly Reports",
description: "Second Quarter 2016 Financial Results",
url: quarterlyPdf2016Q2,
},
{
title: "2016 Q1 Quarterly Results",
title: "2016 Q1 Quarterly Reports",
description: "First Quarter 2016 Financial Results",
url: quarterlyPdf2016Q1,
},
{
title: "2015 Q3 Quarterly Results",
title: "2015 Q3 Quarterly Reports",
description: "Third Quarter 2015 Financial Results",
url: quarterlyPdf2015Q3,
},
{
title: "2015 Q2 Quarterly Results",
title: "2015 Q2 Quarterly Reports",
description: "Second Quarter 2015 Financial Results",
url: quarterlyPdf2015Q2,
},
{
title: "2015 Q1 Quarterly Results",
title: "2015 Q1 Quarterly Reports",
description: "First Quarter 2015 Financial Results",
url: quarterlyPdf2015Q1,
},
{
title: "2014 Q3 Quarterly Results",
title: "2014 Q3 Quarterly Reports",
description: "Third Quarter 2014 Financial Results",
url: quarterlyPdf2014Q3,
},
{
title: "2014 Q2 Quarterly Results",
title: "2014 Q2 Quarterly Reports",
description: "Second Quarter 2014 Financial Results",
url: quarterlyPdf2014Q2,
},
{
title: "2014 Q1 Quarterly Results",
title: "2014 Q1 Quarterly Reports",
description: "First Quarter 2014 Financial Results",
url: quarterlyPdf2014Q1,
},
{
title: "2013 Q3 Quarterly Results",
title: "2013 Q3 Quarterly Reports",
description: "Third Quarter 2013 Financial Results",
url: quarterlyPdf2013Q3,
},
{
title: "2013 Q2 Quarterly Results",
title: "2013 Q2 Quarterly Reports",
description: "Second Quarter 2013 Financial Results",
url: quarterlyPdf2013Q2,
},
{
title: "2013 Q1 Quarterly Results",
title: "2013 Q1 Quarterly Reports",
description: "First Quarter 2013 Financial Results",
url: quarterlyPdf2013Q1,
},
{
title: "2012 Q3 Quarterly Results",
title: "2012 Q3 Quarterly Reports",
description: "Third Quarter 2012 Financial Results",
url: quarterlyPdf2012Q3,
},
{
title: "2012 Q2 Quarterly Results",
title: "2012 Q2 Quarterly Reports",
description: "Second Quarter 2012 Financial Results",
url: quarterlyPdf2012Q2,
},
{
title: "2012 Q1 Quarterly Results",
title: "2012 Q1 Quarterly Reports",
description: "First Quarter 2012 Financial Results",
url: quarterlyPdf2012Q1,
},
{
title: "2011 Q3 Quarterly Results",
title: "2011 Q3 Quarterly Reports",
description: "Third Quarter 2011 Financial Results",
url: quarterlyPdf2011Q3,
},
{
title: "2011 Q2 Quarterly Results",
title: "2011 Q2 Quarterly Reports",
description: "Second Quarter 2011 Financial Results",
url: quarterlyPdf2011Q2,
},
{
title: "2011 Q1 Quarterly Results",
title: "2011 Q1 Quarterly Reports",
description: "First Quarter 2011 Financial Results",
url: quarterlyPdf2011Q1,
},
{
title: "2010 Q3 Quarterly Results",
title: "2010 Q3 Quarterly Reports",
description: "Third Quarter 2010 Financial Results",
url: quarterlyPdf2010Q3,
},
{
title: "2010 Q2 Quarterly Results",
title: "2010 Q2 Quarterly Reports",
description: "Second Quarter 2010 Financial Results",
url: quarterlyPdf2010Q2,
},
{
title: "2010 Q1 Quarterly Results",
title: "2010 Q1 Quarterly Reports",
description: "First Quarter 2010 Financial Results",
url: quarterlyPdf2010Q1,
},
{
title: "2009 Q3 Quarterly Results",
title: "2009 Q3 Quarterly Reports",
description: "Third Quarter 2009 Financial Results",
url: quarterlyPdf2009Q3,
},

View File

@ -1,183 +1,317 @@
<template>
<div class="page-container">
<div class="financials-container">
<div class="sec-filings-container">
<!-- 标题 -->
<div class="financials-title">
{{ t("financialinformation.secfilings.title") }}
<div class="page-title">SEC Filings</div>
<!-- 筛选器 -->
<div class="filters">
<div class="filter-group">
<label class="filter-label">Filing year</label>
<n-select
v-model:value="state.selectedYear"
:options="state.yearOptions"
placeholder="- Any -"
style="width: 150px"
clearable
@update:value="handleYearChange"
/>
</div>
<div class="filter-group">
<label class="filter-label">Items per page:</label>
<n-select
v-model:value="state.pageSize"
:options="state.pageSizeOptions"
style="width: 150px"
@update:value="handlePageSizeChange"
/>
</div>
</div>
<!-- 公司财务概览 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.overview.title") }}
</div>
<p
class="overview-text"
v-html="t('financialinformation.secfilings.overview.desc')"
></p>
</section>
<!-- 表格 -->
<div class="table-container">
<n-data-table
:columns="columns"
:data="paginatedData"
:pagination="false"
:bordered="false"
:size="'medium'"
:row-key="(row) => row.idx"
/>
<!-- 年度报告 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.annual_reports.title") }}
</div>
<!-- 分页器 -->
<div class="pagination-container">
<n-pagination
v-model:page="state.currentPage"
v-model:page-size="state.pageSize"
show-size-picker
show-quick-jumper
:item-count="filteredData.length"
:page-sizes="[10, 25, 50]"
@update:page="handlePageChange"
@update:page-size="handlePageSizeChange"
>
<template #prev>
<span> Previous</span>
</template>
<template #next>
<span>Next </span>
</template>
</n-pagination>
<!-- 报告表格 -->
<div class="reports-table">
<div class="table-header">
<div class="column file-name">
{{
t("financialinformation.secfilings.annual_reports.file_name")
}}
</div>
<div class="column date">
{{ t("financialinformation.secfilings.annual_reports.date") }}
</div>
<div class="column download"></div>
</div>
<!-- 报告列表 -->
<div class="reports-list">
<div
class="table-row"
v-for="(report, index) in annualReports"
:key="index"
>
<div class="column file-name">{{ report.fileName }}</div>
<div class="column date">{{ report.date }}</div>
<div class="column download">
<a :href="report.downloadUrl" class="download-link">{{
t("financialinformation.secfilings.annual_reports.view")
}}</a>
</div>
</div>
<div class="pagination-info">
Displaying {{ startIndex }} - {{ endIndex }} of
{{ filteredData.length }} results
</div>
</div>
</section>
<!-- SEC文件 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.sec.title") }}
</div>
<p class="sec-text">
{{ t("financialinformation.secfilings.sec.desc") }}
<a
href="https://www.sec.gov/cgi-bin/browse-edgar?company=FiEE&match=starts-with&filenum=&State=&Country=&SIC=&myowner=exclude&action=getcompany"
class="link"
>{{ t("financialinformation.secfilings.sec.click_here") }}</a
>.
</p>
</section>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import { reactive, computed, h, onMounted } from "vue";
import { NSelect, NDataTable, NPagination, NButton, NIcon } from "naive-ui";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
import { fileList } from "@/dict/secFiles.js";
const { t } = useI18n();
//
const annualReports = ref([
const router = useRouter();
import iconLink from "@/assets/image/icon/icon-link.png";
// 使 reactive
const state = reactive({
selectedYear: null,
pageSize: 10,
currentPage: 1,
//
yearOptions: [
{ label: "- Any -", value: null },
{ label: "2025", value: 2025 },
{ label: "2024", value: 2024 },
{ label: "2023", value: 2023 },
{ label: "2022", value: 2022 },
{ label: "2021", value: 2021 },
{ label: "2020", value: 2020 },
{ label: "2019", value: 2019 },
{ label: "2018", value: 2018 },
{ label: "2017", value: 2017 },
{ label: "2016", value: 2016 },
{ label: "2015", value: 2015 },
{ label: "2014", value: 2014 },
{ label: "2013", value: 2013 },
{ label: "2012", value: 2012 },
{ label: "2011", value: 2011 },
{ label: "2010", value: 2010 },
{ label: "2009", value: 2009 },
],
//
pageSizeOptions: [
{ label: "10", value: 10 },
{ label: "25", value: 25 },
{ label: "50", value: 50 },
],
// SEC
secFilingsData: [],
});
onMounted(() => {
//
const monthNames = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
state.secFilingsData = fileList.map((item, index) => {
// filingDate
// 1. "Feb 04, 2019"
// 2. "2025-10-24" ISO
let year = null;
let formattedDate = item.filingDate;
if (item.filingDate) {
if (item.filingDate.includes(", ")) {
// "Feb 04, 2019"
year = parseInt(item.filingDate.split(", ")[1]);
} else if (item.filingDate.includes("-")) {
// "2025-10-24" "Oct 24, 2025"
const dateParts = item.filingDate.split("-");
const yearPart = parseInt(dateParts[0]);
const monthPart = parseInt(dateParts[1]);
const dayPart = parseInt(dateParts[2]);
year = yearPart;
const monthName = monthNames[monthPart - 1]; // 10
const dayFormatted = dayPart.toString().padStart(2, "0");
formattedDate = `${monthName} ${dayFormatted}, ${yearPart}`;
}
}
return {
...item,
formattedDate: formattedDate, //
year: year,
};
});
});
//
const columns = [
{
fileName: "2024 Annual Report",
date: "April 10, 2025",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912625002538/fieeinc_10k.htm",
title: "Filing Date",
key: "formattedDate",
sorter: "default",
width: 150,
},
{
fileName: "2023 Annual Report",
date: "April 12, 2024",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912624002449/miniminc_10k.htm",
title: "Form",
key: "form",
sorter: "default",
width: 120,
render: (row) => {
return h(
"a",
{
href: "javascript:void(0)",
style: {
color: "#0078d7",
textDecoration: "none",
cursor: "pointer",
},
onClick: (e) => {
e.preventDefault();
router.push({
path: "/secfilingsDefail",
query: {
filingDate: row.filingDate,
},
});
},
onMouseover: (e) => {
e.target.style.textDecoration = "underline";
},
onMouseout: (e) => {
e.target.style.textDecoration = "none";
},
},
row.form
);
},
},
{
fileName: "2022 Annual Report",
date: "March 31, 2023",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315223010335/form10-k.htm",
title: "Description",
key: "description",
sorter: "default",
ellipsis: {
tooltip: true,
},
},
{
fileName: "2021 Annual Report",
date: "March 31, 2022",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315222008365/form10-k.htm",
title: "View",
key: "view",
width: 150,
render: (row) => {
return h(
"div",
{
style: {
display: "flex",
gap: "8px",
},
},
[
h(
"a",
{
href: row.fileLink,
style: {
color: "#0078d7",
textDecoration: "none",
fontSize: "12px",
},
onMouseover: (e) => {
e.target.style.textDecoration = "underline";
},
onMouseout: (e) => {
e.target.style.textDecoration = "none";
},
},
h("img", {
src: iconLink,
alt: "link",
style: {
width: "24px",
height: "24px",
},
})
),
]
);
},
},
{
fileName: "2020 Annual Report",
date: "April 13, 2021",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495421004133/zmtp_10k.htm",
},
{
fileName: "2019 Annual Report",
date: "April 15, 2020",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495420004069/zmtp_10k.htm",
},
{
fileName: "2018 Annual Report",
date: "April 1, 2019",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495419003878/zmtp_10k.htm",
},
{
fileName: "2017 Annual Report",
date: "March 30, 2018",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495418003402/zmtp_10k.htm",
},
{
fileName: "2016 Annual Report",
date: "March 22, 2017",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495417002279/zmtp_10k.htm",
},
{
fileName: "2015 Annual Report",
date: "March 15, 2016",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448816006596/zmtp_10k.htm",
},
{
fileName: "2014 Annual Report",
date: "March 24, 2015",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448815001308/zmtp_10k.htm",
},
{
fileName: "2013 Annual Report",
date: "March 31, 2014",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448814001518/zmpt_10k.htm",
},
{
fileName: "2012 Annual Report",
date: "March 29, 2013",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448813001584/zmtp_10k.htm",
},
{
fileName: "2011 Annual Report",
date: "March 30, 2012",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448812001548/zoom_10k.htm",
},
{
fileName: "2010 Annual Report",
date: "March 29, 2011",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448811000969/zmtp_10k.htm",
},
{
fileName: "2009 Annual Report",
date: "March 31, 2010",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448810001043/zmtp_10k.htm",
},
]);
];
//
const filteredData = computed(() => {
let data = state.secFilingsData;
if (state.selectedYear) {
data = data.filter((item) => item.year === state.selectedYear);
}
return data;
});
//
const paginatedData = computed(() => {
const start = (state.currentPage - 1) * state.pageSize;
const end = start + state.pageSize;
return filteredData.value.slice(start, end);
});
//
const totalPages = computed(() => {
return Math.ceil(filteredData.value.length / state.pageSize);
});
//
const startIndex = computed(() => {
return (state.currentPage - 1) * state.pageSize + 1;
});
//
const endIndex = computed(() => {
const end = state.currentPage * state.pageSize;
return Math.min(end, filteredData.value.length);
});
//
const handleYearChange = (value) => {
state.selectedYear = value;
state.currentPage = 1;
};
//
const handlePageChange = (page) => {
state.currentPage = page;
};
//
const handlePageSizeChange = (size) => {
state.pageSize = size;
state.currentPage = 1;
};
</script>
<style scoped lang="scss">
@ -186,117 +320,103 @@ const annualReports = ref([
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
.financials-container {
max-width: 1200px;
margin: 0 auto;
min-height: 100vh;
padding: 20px;
}
.financials-title {
.sec-filings-container {
max-width: 1200px;
margin: 0 auto;
padding: 40px;
}
.page-title {
font-size: 40px;
text-align: center;
margin-bottom: 60px;
font-weight: bold;
color: #333;
margin-bottom: 40px;
}
.section {
margin-bottom: 60px;
}
.section-title {
font-size: 18px;
margin-bottom: 20px;
color: #333;
}
.overview-text {
font-size: 16px;
line-height: 1.6;
color: #333;
.filters {
display: flex;
gap: 40px;
margin-bottom: 30px;
align-items: end;
}
.tabs {
.filter-group {
display: flex;
margin-bottom: 20px;
flex-direction: column;
gap: 8px;
}
.tab {
padding: 10px 20px;
font-weight: bold;
cursor: pointer;
border-bottom: 2px solid transparent;
.filter-label {
font-size: 18px;
color: #333;
font-weight: 500;
}
&.active {
border-bottom: 2px solid #333;
.table-container {
.n-data-table {
--n-th-color: #f5f5f5;
--n-th-text-color: #333;
--n-td-color: #fff;
--n-border-color: #e0e0e0;
}
}
.reports-table {
width: 100%;
border-collapse: collapse;
}
.table-header {
.pagination-container {
display: flex;
padding: 10px 0;
border-bottom: 1px solid #ccc;
font-weight: bold;
justify-content: space-between;
}
.table-row {
display: flex;
padding: 15px 0;
border-bottom: 1px solid #eee;
align-items: center;
justify-content: space-between;
}
.reports-list {
// max-height: 600px;
// overflow-y: auto;
}
.column {
&.file-name {
width: 25%;
}
&.date {
width: 25%;
}
&.download {
width: 25%;
text-align: right;
margin-right: 50px;
}
margin-top: 20px;
padding: 20px 0;
}
.pdf-icon {
width: 36px;
height: 36px;
}
.download-link {
color: #0078d7;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
.sec-text {
.pagination-info {
font-size: 16px;
line-height: 1.6;
color: #666;
}
.link {
color: #f00;
text-decoration: none;
:deep(.n-data-table-th) {
background-color: #9e9e9e !important;
color: white !important;
font-weight: bold;
text-align: left;
}
&:hover {
text-decoration: underline;
:deep(.n-data-table-td) {
border-bottom: 1px solid #e0e0e0;
}
:deep(.n-data-table-tr:hover .n-data-table-td) {
background-color: #f9f9f9;
}
:deep(.n-select) {
.n-base-selection {
border: 1px solid #ccc;
border-radius: 4px;
}
}
:deep(.n-pagination) {
.n-pagination-item {
border: 1px solid #ccc;
&.n-pagination-item--active {
background-color: #969696;
border-color: #969696;
color: white;
}
}
.n-pagination-quick-jumper {
font-size: 16px;
}
.n-pagination-sizes {
font-size: 16px;
}
}
</style>

View File

@ -1,183 +1,318 @@
<template>
<div class="page-container">
<div class="financials-container">
<div class="sec-filings-container">
<!-- 标题 -->
<div class="financials-title">
{{ t("financialinformation.secfilings.title") }}
<div class="page-title">SEC Filings</div>
<!-- 筛选器 -->
<div class="filters">
<div class="filter-group">
<label class="filter-label">Filing year</label>
<n-select
v-model:value="state.selectedYear"
:options="state.yearOptions"
placeholder="- Any -"
style="width: 150px"
clearable
@update:value="handleYearChange"
/>
</div>
<div class="filter-group">
<label class="filter-label">Items per page:</label>
<n-select
v-model:value="state.pageSize"
:options="state.pageSizeOptions"
style="width: 150px"
@update:value="handlePageSizeChange"
/>
</div>
</div>
<!-- 公司财务概览 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.overview.title") }}
</div>
<p
class="overview-text"
v-html="t('financialinformation.secfilings.overview.desc')"
></p>
</section>
<!-- 表格 -->
<div class="table-container">
<n-data-table
:columns="columns"
:data="paginatedData"
:pagination="false"
:bordered="false"
:size="'medium'"
:row-key="(row) => row.idx"
/>
<!-- 年度报告 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.annual_reports.title") }}
</div>
<!-- 分页器 -->
<div class="pagination-container">
<n-pagination
v-model:page="state.currentPage"
v-model:page-size="state.pageSize"
show-size-picker
show-quick-jumper
:item-count="filteredData.length"
:page-sizes="[10, 25, 50]"
@update:page="handlePageChange"
@update:page-size="handlePageSizeChange"
>
<template #prev>
<span> Previous</span>
</template>
<template #next>
<span>Next </span>
</template>
</n-pagination>
<!-- 报告表格 -->
<div class="reports-table">
<div class="table-header">
<div class="column file-name">
{{
t("financialinformation.secfilings.annual_reports.file_name")
}}
</div>
<div class="column date">
{{ t("financialinformation.secfilings.annual_reports.date") }}
</div>
<div class="column download"></div>
</div>
<!-- 报告列表 -->
<div class="reports-list">
<div
class="table-row"
v-for="(report, index) in annualReports"
:key="index"
>
<div class="column file-name">{{ report.fileName }}</div>
<div class="column date">{{ report.date }}</div>
<div class="column download">
<a :href="report.downloadUrl" class="download-link">{{
t("financialinformation.secfilings.annual_reports.view")
}}</a>
</div>
</div>
<div class="pagination-info">
Displaying {{ startIndex }} - {{ endIndex }} of
{{ filteredData.length }} results
</div>
</div>
</section>
<!-- SEC文件 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.sec.title") }}
</div>
<p class="sec-text">
{{ t("financialinformation.secfilings.sec.desc") }}
<a
href="https://www.sec.gov/cgi-bin/browse-edgar?company=FiEE&match=starts-with&filenum=&State=&Country=&SIC=&myowner=exclude&action=getcompany"
class="link"
>{{ t("financialinformation.secfilings.sec.click_here") }}</a
>.
</p>
</section>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import { reactive, computed, h, onMounted } from "vue";
import { NSelect, NDataTable, NPagination, NButton, NIcon } from "naive-ui";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
import { fileList } from "@/dict/secFiles.js";
const { t } = useI18n();
//
const annualReports = ref([
const router = useRouter();
import iconLink from "@/assets/image/icon/icon-link.png";
// 使 reactive
const state = reactive({
selectedYear: null,
pageSize: 10,
currentPage: 1,
//
yearOptions: [
{ label: "- Any -", value: null },
{ label: "2025", value: 2025 },
{ label: "2024", value: 2024 },
{ label: "2023", value: 2023 },
{ label: "2022", value: 2022 },
{ label: "2021", value: 2021 },
{ label: "2020", value: 2020 },
{ label: "2019", value: 2019 },
{ label: "2018", value: 2018 },
{ label: "2017", value: 2017 },
{ label: "2016", value: 2016 },
{ label: "2015", value: 2015 },
{ label: "2014", value: 2014 },
{ label: "2013", value: 2013 },
{ label: "2012", value: 2012 },
{ label: "2011", value: 2011 },
{ label: "2010", value: 2010 },
{ label: "2009", value: 2009 },
],
//
pageSizeOptions: [
{ label: "10", value: 10 },
{ label: "25", value: 25 },
{ label: "50", value: 50 },
],
// SEC
secFilingsData: [],
});
onMounted(() => {
//
const monthNames = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
state.secFilingsData = fileList.map((item, index) => {
// filingDate
// 1. "Feb 04, 2019"
// 2. "2025-10-24" ISO
let year = null;
let formattedDate = item.filingDate;
if (item.filingDate) {
if (item.filingDate.includes(", ")) {
// "Feb 04, 2019"
year = parseInt(item.filingDate.split(", ")[1]);
} else if (item.filingDate.includes("-")) {
// "2025-10-24" "Oct 24, 2025"
const dateParts = item.filingDate.split("-");
const yearPart = parseInt(dateParts[0]);
const monthPart = parseInt(dateParts[1]);
const dayPart = parseInt(dateParts[2]);
year = yearPart;
const monthName = monthNames[monthPart - 1]; // 10
const dayFormatted = dayPart.toString().padStart(2, "0");
formattedDate = `${monthName} ${dayFormatted}, ${yearPart}`;
}
}
return {
...item,
formattedDate: formattedDate, //
year: year,
};
});
});
//
const columns = [
{
fileName: "2024 Annual Report",
date: "April 10, 2025",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912625002538/fieeinc_10k.htm",
title: "Filing Date",
key: "formattedDate",
sorter: "default",
width: 150,
},
{
fileName: "2023 Annual Report",
date: "April 12, 2024",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912624002449/miniminc_10k.htm",
title: "Form",
key: "form",
sorter: "default",
width: 120,
render: (row) => {
return h(
"a",
{
href: "javascript:void(0)",
style: {
color: "#0078d7",
textDecoration: "none",
cursor: "pointer",
},
onClick: (e) => {
e.preventDefault();
router.push({
path: "/secfilingsDefail",
query: {
idx: row.idx,
},
});
},
onMouseover: (e) => {
e.target.style.textDecoration = "underline";
},
onMouseout: (e) => {
e.target.style.textDecoration = "none";
},
},
row.form
);
},
},
{
fileName: "2022 Annual Report",
date: "March 31, 2023",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315223010335/form10-k.htm",
title: "Description",
key: "description",
sorter: "default",
ellipsis: {
tooltip: true,
},
},
{
fileName: "2021 Annual Report",
date: "March 31, 2022",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315222008365/form10-k.htm",
title: "View",
key: "view",
width: 150,
render: (row) => {
return h(
"div",
{
style: {
display: "flex",
gap: "8px",
},
},
[
h(
"a",
{
href: row.fileLink,
style: {
color: "#0078d7",
textDecoration: "none",
fontSize: "12px",
},
onMouseover: (e) => {
e.target.style.textDecoration = "underline";
},
onMouseout: (e) => {
e.target.style.textDecoration = "none";
},
},
h("img", {
src: iconLink,
alt: "link",
style: {
width: "24px",
height: "24px",
},
})
),
]
);
},
},
{
fileName: "2020 Annual Report",
date: "April 13, 2021",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495421004133/zmtp_10k.htm",
},
{
fileName: "2019 Annual Report",
date: "April 15, 2020",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495420004069/zmtp_10k.htm",
},
{
fileName: "2018 Annual Report",
date: "April 1, 2019",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495419003878/zmtp_10k.htm",
},
{
fileName: "2017 Annual Report",
date: "March 30, 2018",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495418003402/zmtp_10k.htm",
},
{
fileName: "2016 Annual Report",
date: "March 22, 2017",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495417002279/zmtp_10k.htm",
},
{
fileName: "2015 Annual Report",
date: "March 15, 2016",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448816006596/zmtp_10k.htm",
},
{
fileName: "2014 Annual Report",
date: "March 24, 2015",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448815001308/zmtp_10k.htm",
},
{
fileName: "2013 Annual Report",
date: "March 31, 2014",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448814001518/zmpt_10k.htm",
},
{
fileName: "2012 Annual Report",
date: "March 29, 2013",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448813001584/zmtp_10k.htm",
},
{
fileName: "2011 Annual Report",
date: "March 30, 2012",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448812001548/zoom_10k.htm",
},
{
fileName: "2010 Annual Report",
date: "March 29, 2011",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448811000969/zmtp_10k.htm",
},
{
fileName: "2009 Annual Report",
date: "March 31, 2010",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448810001043/zmtp_10k.htm",
},
]);
];
//
const filteredData = computed(() => {
let data = state.secFilingsData;
if (state.selectedYear) {
data = data.filter((item) => item.year === state.selectedYear);
}
return data;
});
//
const paginatedData = computed(() => {
const start = (state.currentPage - 1) * state.pageSize;
const end = start + state.pageSize;
return filteredData.value.slice(start, end);
});
//
const totalPages = computed(() => {
return Math.ceil(filteredData.value.length / state.pageSize);
});
//
const startIndex = computed(() => {
return (state.currentPage - 1) * state.pageSize + 1;
});
//
const endIndex = computed(() => {
const end = state.currentPage * state.pageSize;
return Math.min(end, filteredData.value.length);
});
//
const handleYearChange = (value) => {
state.selectedYear = value;
state.currentPage = 1;
};
//
const handlePageChange = (page) => {
state.currentPage = page;
};
//
const handlePageSizeChange = (size) => {
state.pageSize = size;
state.currentPage = 1;
};
</script>
<style scoped lang="scss">
@ -186,117 +321,103 @@ const annualReports = ref([
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
.financials-container {
max-width: 1200px;
margin: 0 auto;
min-height: 100vh;
padding: 20px;
}
.financials-title {
font-size: 40px;
text-align: center;
margin-bottom: 60px;
color: #333;
.sec-filings-container {
max-width: 1200px;
margin: 0 auto;
padding: 40px;
}
.section {
margin-bottom: 60px;
.page-title {
font-size: 32px;
font-weight: bold;
color: #333;
margin-bottom: 40px;
}
.section-title {
font-size: 18px;
margin-bottom: 20px;
color: #333;
}
.overview-text {
font-size: 16px;
line-height: 1.6;
color: #333;
.filters {
display: flex;
gap: 40px;
margin-bottom: 30px;
align-items: end;
}
.tabs {
.filter-group {
display: flex;
margin-bottom: 20px;
flex-direction: column;
gap: 8px;
}
.tab {
padding: 10px 20px;
font-weight: bold;
cursor: pointer;
border-bottom: 2px solid transparent;
.filter-label {
font-size: 14px;
color: #333;
font-weight: 500;
}
&.active {
border-bottom: 2px solid #333;
.table-container {
.n-data-table {
--n-th-color: #f5f5f5;
--n-th-text-color: #333;
--n-td-color: #fff;
--n-border-color: #e0e0e0;
}
}
.reports-table {
width: 100%;
border-collapse: collapse;
}
.table-header {
.pagination-container {
display: flex;
padding: 10px 0;
border-bottom: 1px solid #ccc;
font-weight: bold;
justify-content: space-between;
}
.table-row {
display: flex;
padding: 15px 0;
border-bottom: 1px solid #eee;
align-items: center;
justify-content: space-between;
margin-top: 20px;
padding: 20px 0;
}
.reports-list {
// max-height: 600px;
// overflow-y: auto;
}
.column {
&.file-name {
width: 25%;
}
&.date {
width: 25%;
}
&.download {
width: 25%;
text-align: right;
margin-right: 50px;
.pagination-info {
font-size: 14px;
color: #666;
}
:deep(.n-data-table-th) {
background-color: #9e9e9e !important;
color: white !important;
font-weight: bold;
text-align: left;
}
:deep(.n-data-table-td) {
border-bottom: 1px solid #e0e0e0;
}
:deep(.n-data-table-tr:hover .n-data-table-td) {
background-color: #f9f9f9;
}
:deep(.n-select) {
.n-base-selection {
border: 1px solid #ccc;
border-radius: 4px;
}
}
.pdf-icon {
width: 36px;
height: 36px;
}
:deep(.n-pagination) {
.n-pagination-item {
border: 1px solid #ccc;
.download-link {
color: #0078d7;
text-decoration: none;
&:hover {
text-decoration: underline;
&.n-pagination-item--active {
background-color: #969696;
border-color: #969696;
color: white;
}
}
}
.sec-text {
font-size: 16px;
line-height: 1.6;
}
.n-pagination-quick-jumper {
font-size: 14px;
}
.link {
color: #f00;
text-decoration: none;
&:hover {
text-decoration: underline;
.n-pagination-sizes {
font-size: 14px;
}
}
</style>

View File

@ -1,301 +1,422 @@
<template>
<div class="page-container">
<div class="financials-container">
<div class="sec-filings-container">
<!-- 标题 -->
<div class="financials-title">
{{ t("financialinformation.secfilings.title") }}
<div class="page-title">SEC Filings</div>
<!-- 筛选器 -->
<div class="filters">
<div class="filter-group">
<label class="filter-label">Filing year</label>
<n-select
v-model:value="state.selectedYear"
:options="state.yearOptions"
placeholder="- Any -"
style="width: 150px"
clearable
@update:value="handleYearChange"
/>
</div>
<div class="filter-group">
<label class="filter-label">Items per page:</label>
<n-select
v-model:value="state.pageSize"
:options="state.pageSizeOptions"
style="width: 150px"
@update:value="handlePageSizeChange"
/>
</div>
</div>
<!-- 公司财务概览 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.overview.title") }}
</div>
<p
class="overview-text"
v-html="t('financialinformation.secfilings.overview.desc')"
></p>
</section>
<!-- 表格 -->
<div class="table-container">
<n-data-table
:columns="columns"
:data="paginatedData"
:pagination="false"
:row-key="(row) => row.idx"
:bordered="false"
:single-line="false"
:scroll-x="600"
/>
<!-- 年度报告 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.annual_reports.title") }}
</div>
<!-- 分页器 -->
<div class="pagination-container mt-[40px]">
<n-pagination
v-model:page="state.currentPage"
v-model:page-size="state.pageSize"
show-size-picker
:item-count="filteredData.length"
:page-sizes="[10, 25, 50]"
@update:page="handlePageChange"
@update:page-size="handlePageSizeChange"
>
<template #prev>
<span></span>
</template>
<template #next>
<span> </span>
</template>
</n-pagination>
<!-- 报告表格 -->
<div class="reports-table">
<div class="table-header">
<div class="column file-name">
{{
t("financialinformation.secfilings.annual_reports.file_name")
}}
</div>
<div class="column date">
{{ t("financialinformation.secfilings.annual_reports.date") }}
</div>
<div class="column download"></div>
</div>
<!-- 报告列表 -->
<div class="reports-list">
<div
class="table-row"
v-for="(report, index) in annualReports"
:key="index"
>
<div class="column file-name">{{ report.fileName }}</div>
<div class="column date">{{ report.date }}</div>
<div class="column download">
<a :href="report.downloadUrl" class="download-link">{{
t("financialinformation.secfilings.annual_reports.view")
}}</a>
</div>
</div>
<div class="pagination-info mt-[40px]">
Displaying {{ startIndex }} - {{ endIndex }} of
{{ filteredData.length }} results
</div>
</div>
</section>
<!-- SEC文件 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.sec.title") }}
</div>
<p class="sec-text">
{{ t("financialinformation.secfilings.sec.desc") }}
<a
href="https://www.sec.gov/cgi-bin/browse-edgar?company=FiEE&match=starts-with&filenum=&State=&Country=&SIC=&myowner=exclude&action=getcompany"
class="link"
>{{ t("financialinformation.secfilings.sec.click_here") }}</a
>.
</p>
</section>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import { reactive, computed, h, onMounted } from "vue";
import { NSelect, NDataTable, NPagination, NButton, NIcon } from "naive-ui";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
import { fileList } from "@/dict/secFiles.js";
const { t } = useI18n();
const router = useRouter();
import iconLink from "@/assets/image/icon/icon-link.png";
// 使 reactive
const state = reactive({
selectedYear: null,
pageSize: 10,
currentPage: 1,
//
const annualReports = ref([
//
yearOptions: [
{ label: "- Any -", value: null },
{ label: "2025", value: 2025 },
{ label: "2024", value: 2024 },
{ label: "2023", value: 2023 },
{ label: "2022", value: 2022 },
{ label: "2021", value: 2021 },
{ label: "2020", value: 2020 },
{ label: "2019", value: 2019 },
{ label: "2018", value: 2018 },
{ label: "2017", value: 2017 },
{ label: "2016", value: 2016 },
{ label: "2015", value: 2015 },
{ label: "2014", value: 2014 },
{ label: "2013", value: 2013 },
{ label: "2012", value: 2012 },
{ label: "2011", value: 2011 },
{ label: "2010", value: 2010 },
{ label: "2009", value: 2009 },
],
//
pageSizeOptions: [
{ label: "10", value: 10 },
{ label: "25", value: 25 },
{ label: "50", value: 50 },
],
// SEC
secFilingsData: [],
});
onMounted(() => {
//
const monthNames = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
state.secFilingsData = fileList.map((item, index) => {
// filingDate
// 1. "Feb 04, 2019"
// 2. "2025-10-24" ISO
let year = null;
let formattedDate = item.filingDate;
if (item.filingDate) {
if (item.filingDate.includes(", ")) {
// "Feb 04, 2019"
year = parseInt(item.filingDate.split(", ")[1]);
} else if (item.filingDate.includes("-")) {
// "2025-10-24" "Oct 24, 2025"
const dateParts = item.filingDate.split("-");
const yearPart = parseInt(dateParts[0]);
const monthPart = parseInt(dateParts[1]);
const dayPart = parseInt(dateParts[2]);
year = yearPart;
const monthName = monthNames[monthPart - 1]; // 10
const dayFormatted = dayPart.toString().padStart(2, "0");
formattedDate = `${monthName} ${dayFormatted}, ${yearPart}`;
}
}
return {
...item,
formattedDate: formattedDate, //
year: year,
};
});
});
//
const columns = [
{
fileName: "2024 Annual Report",
date: "April 10, 2025",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912625002538/fieeinc_10k.htm",
title: "Filing Date",
key: "formattedDate",
sorter: "default",
width: 150,
},
{
fileName: "2023 Annual Report",
date: "April 12, 2024",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912624002449/miniminc_10k.htm",
title: "Form",
key: "form",
sorter: "default",
width: 120,
render: (row) => {
return h(
"a",
{
href: "javascript:void(0)",
style: {
color: "#0078d7",
textDecoration: "none",
cursor: "pointer",
},
onClick: (e) => {
e.preventDefault();
router.push({
path: "/secfilingsDefail",
query: {
filingDate: row.filingDate,
},
});
},
onMouseover: (e) => {
e.target.style.textDecoration = "underline";
},
onMouseout: (e) => {
e.target.style.textDecoration = "none";
},
},
row.form
);
},
},
{
fileName: "2022 Annual Report",
date: "March 31, 2023",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315223010335/form10-k.htm",
title: "Description",
key: "description",
sorter: "default",
ellipsis: {
tooltip: true,
},
},
{
fileName: "2021 Annual Report",
date: "March 31, 2022",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315222008365/form10-k.htm",
title: "View",
key: "view",
width: 80,
render: (row) => {
return h(
"div",
{
style: {
display: "flex",
gap: "8px",
},
},
[
h(
"a",
{
href: row.fileLink,
style: {
color: "#0078d7",
textDecoration: "none",
fontSize: "12px",
},
onMouseover: (e) => {
e.target.style.textDecoration = "underline";
},
onMouseout: (e) => {
e.target.style.textDecoration = "none";
},
},
h("img", {
src: iconLink,
alt: "link",
style: {
width: "24px",
height: "24px",
},
})
),
]
);
},
},
{
fileName: "2020 Annual Report",
date: "April 13, 2021",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495421004133/zmtp_10k.htm",
},
{
fileName: "2019 Annual Report",
date: "April 15, 2020",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495420004069/zmtp_10k.htm",
},
{
fileName: "2018 Annual Report",
date: "April 1, 2019",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495419003878/zmtp_10k.htm",
},
{
fileName: "2017 Annual Report",
date: "March 30, 2018",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495418003402/zmtp_10k.htm",
},
{
fileName: "2016 Annual Report",
date: "March 22, 2017",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495417002279/zmtp_10k.htm",
},
{
fileName: "2015 Annual Report",
date: "March 15, 2016",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448816006596/zmtp_10k.htm",
},
{
fileName: "2014 Annual Report",
date: "March 24, 2015",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448815001308/zmtp_10k.htm",
},
{
fileName: "2013 Annual Report",
date: "March 31, 2014",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448814001518/zmpt_10k.htm",
},
{
fileName: "2012 Annual Report",
date: "March 29, 2013",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448813001584/zmtp_10k.htm",
},
{
fileName: "2011 Annual Report",
date: "March 30, 2012",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448812001548/zoom_10k.htm",
},
{
fileName: "2010 Annual Report",
date: "March 29, 2011",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448811000969/zmtp_10k.htm",
},
{
fileName: "2009 Annual Report",
date: "March 31, 2010",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448810001043/zmtp_10k.htm",
},
]);
];
//
const filteredData = computed(() => {
let data = state.secFilingsData;
if (state.selectedYear) {
data = data.filter((item) => item.year === state.selectedYear);
}
return data;
});
//
const paginatedData = computed(() => {
const start = (state.currentPage - 1) * state.pageSize;
const end = start + state.pageSize;
return filteredData.value.slice(start, end);
});
//
const totalPages = computed(() => {
return Math.ceil(filteredData.value.length / state.pageSize);
});
//
const startIndex = computed(() => {
return (state.currentPage - 1) * state.pageSize + 1;
});
//
const endIndex = computed(() => {
const end = state.currentPage * state.pageSize;
return Math.min(end, filteredData.value.length);
});
//
const handleYearChange = (value) => {
state.selectedYear = value;
state.currentPage = 1;
};
//
const handlePageChange = (page) => {
state.currentPage = page;
};
//
const handlePageSizeChange = (size) => {
state.pageSize = size;
state.currentPage = 1;
};
</script>
<style scoped lang="scss">
.page-container {
background-image: url("@/assets/image/bg-375.png");
background-image: url("@/assets/image/bg.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
min-height: 100vh;
padding: 20px;
}
.financials-container {
.sec-filings-container {
margin: 0 auto;
padding: 80px;
}
.financials-title {
.page-title {
font-size: 113px;
font-weight: 600;
text-align: center;
margin-bottom: 60px;
font-weight: bold;
color: #333;
margin-bottom: 40px;
}
.section {
margin-bottom: 60px;
}
.section-title {
font-size: 92px;
font-weight: 600;
margin-bottom: 20px;
color: #333;
}
.overview-text {
font-size: 72px;
line-height: 1.6;
color: #333;
.filters {
display: flex;
gap: 40px;
margin-bottom: 30px;
align-items: end;
}
.tabs {
.filter-group {
display: flex;
margin-bottom: 20px;
flex-direction: column;
gap: 26px;
}
.tab {
padding: 10px 20px;
font-weight: bold;
cursor: pointer;
border-bottom: 2px solid transparent;
.filter-label {
font-size: 92px;
color: #333;
font-weight: 500;
}
&.active {
border-bottom: 2px solid #333;
.table-container {
.n-data-table {
--n-th-color: #f5f5f5;
--n-th-text-color: #333;
--n-td-color: #fff;
--n-border-color: #e0e0e0;
}
}
.reports-table {
width: 100%;
border-collapse: collapse;
}
.table-header {
.pagination-container {
display: flex;
padding: 10px 0;
border-bottom: 1px solid #ccc;
font-weight: bold;
flex-wrap: wrap; //
justify-content: space-between;
}
.table-row {
display: flex;
padding: 45px 0;
border-bottom: 1px solid #eee;
align-items: center;
justify-content: space-between;
}
.reports-list {
// max-height: 600px;
// overflow-y: auto;
}
.column {
&.file-name {
width: 35%;
}
&.date {
width: 35%;
}
&.download {
margin-right: 100px;
}
margin-top: 60px;
padding: 20px 0;
}
.pdf-icon {
width: 36px;
height: 36px;
}
.download-link {
color: #0078d7;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
.sec-text {
.pagination-info {
font-size: 72px;
line-height: 1.6;
color: #666;
}
.link {
color: #f00;
text-decoration: none;
:deep(.n-data-table-th) {
background-color: #9e9e9e !important;
color: white !important;
font-weight: bold;
text-align: left;
}
&:hover {
text-decoration: underline;
:deep(.n-data-table-td) {
border-bottom: 1px solid #e0e0e0;
}
:deep(.n-data-table-tr:hover .n-data-table-td) {
background-color: #f9f9f9;
}
:deep(.n-select) {
.n-base-selection {
border: 1px solid #ccc;
border-radius: 4px;
}
}
:deep(.n-pagination) {
.n-pagination-item {
border: 1px solid #ccc;
&.n-pagination-item--active {
background-color: #969696;
border-color: #969696;
color: white;
}
}
.n-pagination-quick-jumper {
font-size: 72px;
}
.n-pagination-sizes {
font-size: 72px;
}
}
</style>

View File

@ -1,183 +1,317 @@
<template>
<div class="page-container">
<div class="financials-container">
<div class="sec-filings-container">
<!-- 标题 -->
<div class="financials-title">
{{ t("financialinformation.secfilings.title") }}
<div class="page-title">SEC Filings</div>
<!-- 筛选器 -->
<div class="filters">
<div class="filter-group">
<label class="filter-label">Filing year</label>
<n-select
v-model:value="state.selectedYear"
:options="state.yearOptions"
placeholder="- Any -"
style="width: 150px"
clearable
@update:value="handleYearChange"
/>
</div>
<div class="filter-group">
<label class="filter-label">Items per page:</label>
<n-select
v-model:value="state.pageSize"
:options="state.pageSizeOptions"
style="width: 150px"
@update:value="handlePageSizeChange"
/>
</div>
</div>
<!-- 公司财务概览 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.overview.title") }}
</div>
<p
class="overview-text"
v-html="t('financialinformation.secfilings.overview.desc')"
></p>
</section>
<!-- 表格 -->
<div class="table-container">
<n-data-table
:columns="columns"
:data="paginatedData"
:pagination="false"
:bordered="false"
:size="'medium'"
:row-key="(row) => row.idx"
/>
<!-- 年度报告 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.annual_reports.title") }}
</div>
<!-- 分页器 -->
<div class="pagination-container">
<n-pagination
class="w-full"
v-model:page="state.currentPage"
v-model:page-size="state.pageSize"
show-size-picker
show-quick-jumper
:item-count="filteredData.length"
:page-sizes="[10, 25, 50]"
@update:page="handlePageChange"
@update:page-size="handlePageSizeChange"
>
<template #prev>
<span> Previous</span>
</template>
<template #next>
<span>Next </span>
</template>
</n-pagination>
<!-- 报告表格 -->
<div class="reports-table">
<div class="table-header">
<div class="column file-name">
{{
t("financialinformation.secfilings.annual_reports.file_name")
}}
</div>
<div class="column date">
{{ t("financialinformation.secfilings.annual_reports.date") }}
</div>
<div class="column download"></div>
</div>
<!-- 报告列表 -->
<div class="reports-list">
<div
class="table-row"
v-for="(report, index) in annualReports"
:key="index"
>
<div class="column file-name">{{ report.fileName }}</div>
<div class="column date">{{ report.date }}</div>
<div class="column download">
<a :href="report.downloadUrl" class="download-link">{{
t("financialinformation.secfilings.annual_reports.view")
}}</a>
</div>
</div>
<div class="pagination-info w-full mt-[20px]">
Displaying {{ startIndex }} - {{ endIndex }} of
{{ filteredData.length }} results
</div>
</div>
</section>
<!-- SEC文件 -->
<section class="section">
<div class="section-title">
{{ t("financialinformation.secfilings.sec.title") }}
</div>
<p class="sec-text">
{{ t("financialinformation.secfilings.sec.desc") }}
<a
href="https://www.sec.gov/cgi-bin/browse-edgar?company=FiEE&match=starts-with&filenum=&State=&Country=&SIC=&myowner=exclude&action=getcompany"
class="link"
>{{ t("financialinformation.secfilings.sec.click_here") }}</a
>.
</p>
</section>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import { reactive, computed, h, onMounted } from "vue";
import { NSelect, NDataTable, NPagination, NButton, NIcon } from "naive-ui";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
import { fileList } from "@/dict/secFiles.js";
const { t } = useI18n();
//
const annualReports = ref([
const router = useRouter();
import iconLink from "@/assets/image/icon/icon-link.png";
// 使 reactive
const state = reactive({
selectedYear: null,
pageSize: 10,
currentPage: 1,
//
yearOptions: [
{ label: "- Any -", value: null },
{ label: "2025", value: 2025 },
{ label: "2024", value: 2024 },
{ label: "2023", value: 2023 },
{ label: "2022", value: 2022 },
{ label: "2021", value: 2021 },
{ label: "2020", value: 2020 },
{ label: "2019", value: 2019 },
{ label: "2018", value: 2018 },
{ label: "2017", value: 2017 },
{ label: "2016", value: 2016 },
{ label: "2015", value: 2015 },
{ label: "2014", value: 2014 },
{ label: "2013", value: 2013 },
{ label: "2012", value: 2012 },
{ label: "2011", value: 2011 },
{ label: "2010", value: 2010 },
{ label: "2009", value: 2009 },
],
//
pageSizeOptions: [
{ label: "10", value: 10 },
{ label: "25", value: 25 },
{ label: "50", value: 50 },
],
// SEC
secFilingsData: [],
});
onMounted(() => {
//
const monthNames = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
state.secFilingsData = fileList.map((item, index) => {
// filingDate
// 1. "Feb 04, 2019"
// 2. "2025-10-24" ISO
let year = null;
let formattedDate = item.filingDate;
if (item.filingDate) {
if (item.filingDate.includes(", ")) {
// "Feb 04, 2019"
year = parseInt(item.filingDate.split(", ")[1]);
} else if (item.filingDate.includes("-")) {
// "2025-10-24" "Oct 24, 2025"
const dateParts = item.filingDate.split("-");
const yearPart = parseInt(dateParts[0]);
const monthPart = parseInt(dateParts[1]);
const dayPart = parseInt(dateParts[2]);
year = yearPart;
const monthName = monthNames[monthPart - 1]; // 10
const dayFormatted = dayPart.toString().padStart(2, "0");
formattedDate = `${monthName} ${dayFormatted}, ${yearPart}`;
}
}
return {
...item,
formattedDate: formattedDate, //
year: year,
};
});
});
//
const columns = [
{
fileName: "2024 Annual Report",
date: "April 10, 2025",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912625002538/fieeinc_10k.htm",
title: "Filing Date",
key: "formattedDate",
sorter: "default",
width: 150,
},
{
fileName: "2023 Annual Report",
date: "April 12, 2024",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000182912624002449/miniminc_10k.htm",
title: "Form",
key: "form",
sorter: "default",
width: 120,
render: (row) => {
return h(
"a",
{
href: "javascript:void(0)",
style: {
color: "#0078d7",
textDecoration: "none",
cursor: "pointer",
},
onClick: (e) => {
e.preventDefault();
router.push({
path: "/secfilingsDefail",
query: {
filingDate: row.filingDate,
},
});
},
onMouseover: (e) => {
e.target.style.textDecoration = "underline";
},
onMouseout: (e) => {
e.target.style.textDecoration = "none";
},
},
row.form
);
},
},
{
fileName: "2022 Annual Report",
date: "March 31, 2023",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315223010335/form10-k.htm",
title: "Description",
key: "description",
sorter: "default",
ellipsis: {
tooltip: true,
},
},
{
fileName: "2021 Annual Report",
date: "March 31, 2022",
downloadUrl:
"https://www.sec.gov/ix?doc=/Archives/edgar/data/1467761/000149315222008365/form10-k.htm",
title: "View",
key: "view",
render: (row) => {
return h(
"div",
{
style: {
display: "flex",
gap: "8px",
},
},
[
h(
"a",
{
href: row.fileLink,
style: {
color: "#0078d7",
textDecoration: "none",
fontSize: "12px",
},
onMouseover: (e) => {
e.target.style.textDecoration = "underline";
},
onMouseout: (e) => {
e.target.style.textDecoration = "none";
},
},
h("img", {
src: iconLink,
alt: "link",
style: {
width: "24px",
height: "24px",
},
})
),
]
);
},
},
{
fileName: "2020 Annual Report",
date: "April 13, 2021",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495421004133/zmtp_10k.htm",
},
{
fileName: "2019 Annual Report",
date: "April 15, 2020",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495420004069/zmtp_10k.htm",
},
{
fileName: "2018 Annual Report",
date: "April 1, 2019",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495419003878/zmtp_10k.htm",
},
{
fileName: "2017 Annual Report",
date: "March 30, 2018",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495418003402/zmtp_10k.htm",
},
{
fileName: "2016 Annual Report",
date: "March 22, 2017",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000165495417002279/zmtp_10k.htm",
},
{
fileName: "2015 Annual Report",
date: "March 15, 2016",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448816006596/zmtp_10k.htm",
},
{
fileName: "2014 Annual Report",
date: "March 24, 2015",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448815001308/zmtp_10k.htm",
},
{
fileName: "2013 Annual Report",
date: "March 31, 2014",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448814001518/zmpt_10k.htm",
},
{
fileName: "2012 Annual Report",
date: "March 29, 2013",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448813001584/zmtp_10k.htm",
},
{
fileName: "2011 Annual Report",
date: "March 30, 2012",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448812001548/zoom_10k.htm",
},
{
fileName: "2010 Annual Report",
date: "March 29, 2011",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448811000969/zmtp_10k.htm",
},
{
fileName: "2009 Annual Report",
date: "March 31, 2010",
downloadUrl:
"https://www.sec.gov/Archives/edgar/data/1467761/000135448810001043/zmtp_10k.htm",
},
]);
];
//
const filteredData = computed(() => {
let data = state.secFilingsData;
if (state.selectedYear) {
data = data.filter((item) => item.year === state.selectedYear);
}
return data;
});
//
const paginatedData = computed(() => {
const start = (state.currentPage - 1) * state.pageSize;
const end = start + state.pageSize;
return filteredData.value.slice(start, end);
});
//
const totalPages = computed(() => {
return Math.ceil(filteredData.value.length / state.pageSize);
});
//
const startIndex = computed(() => {
return (state.currentPage - 1) * state.pageSize + 1;
});
//
const endIndex = computed(() => {
const end = state.currentPage * state.pageSize;
return Math.min(end, filteredData.value.length);
});
//
const handleYearChange = (value) => {
state.selectedYear = value;
state.currentPage = 1;
};
//
const handlePageChange = (page) => {
state.currentPage = page;
};
//
const handlePageSizeChange = (size) => {
state.pageSize = size;
state.currentPage = 1;
};
</script>
<style scoped lang="scss">
@ -186,117 +320,104 @@ const annualReports = ref([
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
min-height: 100vh;
padding: 20px;
}
.financials-container {
.sec-filings-container {
max-width: calc(100% - 300px);
margin: 0 auto;
padding: 20px;
}
.financials-title {
.page-title {
font-size: 85px;
text-align: center;
margin-bottom: 60px;
font-weight: bold;
color: #333;
margin-bottom: 40px;
}
.section {
margin-bottom: 60px;
}
.section-title {
font-size: 50px;
margin-bottom: 20px;
color: #333;
}
.overview-text {
font-size: 40px;
line-height: 1.6;
color: #333;
.filters {
display: flex;
gap: 40px;
margin-bottom: 30px;
align-items: end;
}
.tabs {
.filter-group {
display: flex;
margin-bottom: 20px;
flex-direction: column;
gap: 8px;
}
.tab {
padding: 10px 20px;
font-weight: bold;
cursor: pointer;
border-bottom: 2px solid transparent;
.filter-label {
font-size: 50px;
color: #333;
font-weight: 500;
}
&.active {
border-bottom: 2px solid #333;
.table-container {
.n-data-table {
--n-th-color: #f5f5f5;
--n-th-text-color: #333;
--n-td-color: #fff;
--n-border-color: #e0e0e0;
}
}
.reports-table {
width: 100%;
border-collapse: collapse;
}
.table-header {
.pagination-container {
display: flex;
padding: 10px 0;
border-bottom: 1px solid #ccc;
font-weight: bold;
flex-wrap: wrap; //
justify-content: space-between;
}
.table-row {
display: flex;
padding: 15px 0;
border-bottom: 1px solid #eee;
align-items: center;
justify-content: space-between;
}
.reports-list {
// max-height: 600px;
// overflow-y: auto;
}
.column {
&.file-name {
width: 25%;
}
&.date {
width: 25%;
}
&.download {
width: 25%;
text-align: right;
margin-right: 50px;
}
margin-top: 20px;
padding: 20px 0;
}
.pdf-icon {
width: 36px;
height: 36px;
}
.download-link {
color: #0078d7;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
.sec-text {
.pagination-info {
font-size: 40px;
line-height: 1.6;
color: #666;
}
.link {
color: #f00;
text-decoration: none;
:deep(.n-data-table-th) {
background-color: #9e9e9e !important;
color: white !important;
font-weight: bold;
text-align: left;
}
&:hover {
text-decoration: underline;
:deep(.n-data-table-td) {
border-bottom: 1px solid #e0e0e0;
}
:deep(.n-data-table-tr:hover .n-data-table-td) {
background-color: #f9f9f9;
}
:deep(.n-select) {
.n-base-selection {
border: 1px solid #ccc;
border-radius: 4px;
}
}
:deep(.n-pagination) {
.n-pagination-item {
border: 1px solid #ccc;
&.n-pagination-item--active {
background-color: #969696;
border-color: #969696;
color: white;
}
}
.n-pagination-quick-jumper {
font-size: 40px;
}
.n-pagination-sizes {
font-size: 40px;
}
}
</style>

View File

@ -0,0 +1,34 @@
<script setup>
import { computed } from "vue";
import { useWindowSize } from "@vueuse/core";
import size375 from "@/views/financialinformation/secfilingsdetail/size375/index.vue";
import size768 from "@/views/financialinformation/secfilingsdetail/size768/index.vue";
import size1440 from "@/views/financialinformation/secfilingsdetail/size1440/index.vue";
import size1920 from "@/views/financialinformation/secfilingsdetail/size1920/index.vue";
import { useRouter } from "vue-router";
import { useI18n } from "vue-i18n";
const router = useRouter();
const { width } = useWindowSize();
const { t } = useI18n();
const viewComponent = computed(() => {
const viewWidth = width.value;
if (viewWidth <= 450) {
return size375;
} else if (viewWidth <= 1100) {
return size768;
} else if (viewWidth <= 1500) {
return size1440;
} else if (viewWidth <= 1920 || viewWidth > 1920) {
return size1920;
}
});
</script>
<template>
<component :is="viewComponent" />
</template>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,201 @@
<template>
<div class="page-container">
<div class="sec-filing-detail-container">
<!-- 标题 -->
<div class="page-title">SEC Filing Details</div>
<!-- Document Details 部分 -->
<div class="section">
<h2 class="section-title">Document Details</h2>
<div class="details-grid">
<div class="detail-item">
<span class="detail-label">Form:</span>
<a :href="filingData.htmlLink" class="detail-value link">{{
filingData.form
}}</a>
</div>
<div class="detail-item">
<span class="detail-label">Filing Date:</span>
<span class="detail-value">{{ filingData.filingDate }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Form Description:</span>
<span class="detail-value">{{ filingData.formDescription }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Company:</span>
<span class="detail-value">{{ filingData.company }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Issuer:</span>
<span class="detail-value">{{ filingData.issuer }}</span>
</div>
</div>
</div>
<!-- Filing Formats 部分 -->
<div class="section">
<h2 class="section-title">Filing Formats</h2>
<div class="formats-list">
<div class="format-item">
<img :src="iconLink" alt="link" class="format-icon" />
<a :href="filingData.htmlLink" class="format-link" target="_blank"
>View HTML</a
>
</div>
</div>
</div>
<!-- XBRL 部分 -->
<div
v-if="
Array.isArray(filingData.dataFiles) && filingData.dataFiles.length > 0
"
class="section"
>
<h2 class="section-title">XBRL</h2>
<div class="formats-list">
<div
class="format-item"
v-for="(item, idx) in filingData.dataFiles"
:key="idx"
>
<img :src="iconLink" alt="link" class="format-icon" />
<a :href="item.fileUrl" class="format-link" target="_blank">{{
item.description
}}</a>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import iconLink from "@/assets/image/icon/icon-link.png";
import { fileList } from "@/dict/secFiles.js";
import { useRoute } from "vue-router";
// props
const filingData = ref({
form: "",
filingDate: "",
formDescription: "",
company: "",
issuer: "",
htmlLink: "#",
});
const route = useRoute();
onMounted(() => {
const { idx } = route.query;
const file = fileList.find((item) => item.idx == idx);
if (file) {
filingData.value = {
form: file.form,
filingDate: file.filingDate,
formDescription: file.formDescription,
htmlLink: file.fileLink || "#",
dataFiles: file.dataFiles || [],
company: "FiEE, Inc. ",
issuer: "FiEE, Inc. ",
};
}
console.log(filingData.value);
});
</script>
<style scoped lang="scss">
.page-container {
background-image: url("@/assets/image/bg.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
min-height: 100vh;
padding: 20px;
}
.sec-filing-detail-container {
max-width: 1200px;
margin: 0 auto;
padding: 40px;
}
.page-title {
font-size: 40px;
font-weight: bold;
color: #333;
margin-bottom: 40px;
}
.section {
margin-bottom: 40px;
}
.section-title {
font-size: 18px;
font-weight: bold;
color: #333;
margin-bottom: 20px;
}
.details-grid {
display: grid;
gap: 15px;
}
.detail-item {
display: flex;
align-items: flex-start;
gap: 10px;
}
.detail-label {
font-weight: bold;
color: #333;
min-width: 150px;
flex-shrink: 0;
}
.detail-value {
color: #333;
line-height: 1.5;
}
.link {
color: #0078d7;
text-decoration: underline;
cursor: pointer;
&:hover {
text-decoration: none;
}
}
.formats-list {
display: flex;
flex-direction: column;
gap: 10px;
}
.format-item {
display: flex;
align-items: center;
gap: 8px;
}
.format-icon {
width: 24px;
height: 24px;
}
.format-link {
color: #0078d7;
text-decoration: underline;
font-size: 14px;
&:hover {
text-decoration: none;
}
}
</style>

View File

@ -0,0 +1,200 @@
<template>
<div class="page-container">
<div class="sec-filing-detail-container">
<!-- 标题 -->
<div class="page-title">SEC Filing Details</div>
<!-- Document Details 部分 -->
<div class="section">
<h2 class="section-title">Document Details</h2>
<div class="details-grid">
<div class="detail-item">
<span class="detail-label">Form:</span>
<a :href="filingData.htmlLink" class="detail-value link">{{
filingData.form
}}</a>
</div>
<div class="detail-item">
<span class="detail-label">Filing Date:</span>
<span class="detail-value">{{ filingData.filingDate }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Form Description:</span>
<span class="detail-value">{{ filingData.formDescription }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Company:</span>
<span class="detail-value">{{ filingData.company }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Issuer:</span>
<span class="detail-value">{{ filingData.issuer }}</span>
</div>
</div>
</div>
<!-- Filing Formats 部分 -->
<div class="section">
<h2 class="section-title">Filing Formats</h2>
<div class="formats-list">
<div class="format-item">
<img :src="iconLink" alt="link" class="format-icon" />
<a :href="filingData.htmlLink" class="format-link" target="_blank"
>View HTML</a
>
</div>
</div>
</div>
<!-- XBRL 部分 -->
<div
v-if="
Array.isArray(filingData.dataFiles) && filingData.dataFiles.length > 0
"
class="section"
>
<h2 class="section-title">XBRL</h2>
<div class="formats-list">
<div
class="format-item"
v-for="(item, idx) in filingData.dataFiles"
:key="idx"
>
<img :src="iconLink" alt="link" class="format-icon" />
<a :href="item.fileUrl" class="format-link" target="_blank">{{
item.description
}}</a>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import iconLink from "@/assets/image/icon/icon-link.png";
import { fileList } from "@/dict/secFiles.js";
import { useRoute } from "vue-router";
// props
const filingData = ref({
form: "",
filingDate: "",
formDescription: "",
company: "",
issuer: "",
htmlLink: "#",
});
const route = useRoute();
onMounted(() => {
const { idx } = route.query;
const file = fileList.find((item) => item.idx == idx);
if (file) {
filingData.value = {
form: file.form,
filingDate: file.filingDate,
formDescription: file.formDescription,
htmlLink: file.fileLink || "#",
dataFiles: file.dataFiles || [],
company: "FiEE, Inc. ",
issuer: "FiEE, Inc. ",
};
}
});
</script>
<style scoped lang="scss">
.page-container {
background-image: url("@/assets/image/bg.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
min-height: 100vh;
padding: 20px;
}
.sec-filing-detail-container {
max-width: 1200px;
margin: 0 auto;
padding: 40px;
}
.page-title {
font-size: 32px;
font-weight: bold;
color: #333;
margin-bottom: 40px;
}
.section {
margin-bottom: 40px;
}
.section-title {
font-size: 24px;
font-weight: bold;
color: #333;
margin-bottom: 20px;
}
.details-grid {
display: grid;
gap: 15px;
}
.detail-item {
display: flex;
align-items: flex-start;
gap: 10px;
}
.detail-label {
font-weight: bold;
color: #333;
min-width: 150px;
flex-shrink: 0;
}
.detail-value {
color: #333;
line-height: 1.5;
}
.link {
color: #0078d7;
text-decoration: underline;
cursor: pointer;
&:hover {
text-decoration: none;
}
}
.formats-list {
display: flex;
flex-direction: column;
gap: 10px;
}
.format-item {
display: flex;
align-items: center;
gap: 8px;
}
.format-icon {
width: 24px;
height: 24px;
}
.format-link {
color: #0078d7;
text-decoration: underline;
font-size: 14px;
&:hover {
text-decoration: none;
}
}
</style>

View File

@ -0,0 +1,200 @@
<template>
<div class="page-container">
<div class="sec-filing-detail-container">
<!-- 标题 -->
<div class="page-title">SEC Filing Details</div>
<!-- Document Details 部分 -->
<div class="section">
<h2 class="section-title">Document Details</h2>
<div class="details-grid">
<div class="detail-item">
<span class="detail-label">Form:</span>
<a :href="filingData.htmlLink" class="detail-value link">{{
filingData.form
}}</a>
</div>
<div class="detail-item">
<span class="detail-label">Filing Date:</span>
<span class="detail-value">{{ filingData.filingDate }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Form Description:</span>
<span class="detail-value">{{ filingData.formDescription }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Company:</span>
<span class="detail-value">{{ filingData.company }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Issuer:</span>
<span class="detail-value">{{ filingData.issuer }}</span>
</div>
</div>
</div>
<!-- Filing Formats 部分 -->
<div class="section">
<h2 class="section-title">Filing Formats</h2>
<div class="formats-list">
<div class="format-item">
<img :src="iconLink" alt="link" class="format-icon" />
<a :href="filingData.htmlLink" class="format-link" target="_blank"
>View HTML</a
>
</div>
</div>
</div>
<!-- XBRL 部分 -->
<div
v-if="
Array.isArray(filingData.dataFiles) && filingData.dataFiles.length > 0
"
class="section"
>
<h2 class="section-title">XBRL</h2>
<div class="formats-list">
<div
class="format-item"
v-for="(item, idx) in filingData.dataFiles"
:key="idx"
>
<img :src="iconLink" alt="link" class="format-icon" />
<a :href="item.fileUrl" class="format-link" target="_blank">{{
item.description
}}</a>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import iconLink from "@/assets/image/icon/icon-link.png";
import { fileList } from "@/dict/secFiles.js";
import { useRoute } from "vue-router";
// props
const filingData = ref({
form: "",
filingDate: "",
formDescription: "",
company: "",
issuer: "",
htmlLink: "#",
});
const route = useRoute();
onMounted(() => {
const { idx } = route.query;
const file = fileList.find((item) => item.idx == idx);
if (file) {
filingData.value = {
form: file.form,
filingDate: file.filingDate,
formDescription: file.formDescription,
htmlLink: file.fileLink || "#",
dataFiles: file.dataFiles || [],
company: "FiEE, Inc. ",
issuer: "FiEE, Inc. ",
};
}
console.log(filingData.value);
});
</script>
<style scoped lang="scss">
.page-container {
background-image: url("@/assets/image/bg.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
min-height: 100vh;
padding: 20px;
}
.sec-filing-detail-container {
margin: 0 auto;
padding: 80px;
}
.page-title {
font-size: 113px;
font-weight: bold;
color: #333;
margin-bottom: 40px;
}
.section {
margin-bottom: 40px;
}
.section-title {
font-size: 92px;
font-weight: bold;
color: #333;
margin-bottom: 20px;
}
.details-grid {
display: grid;
gap: 30px;
}
.detail-item {
display: flex;
align-items: flex-start;
gap: 40px;
}
.detail-label {
font-weight: bold;
color: #333;
min-width: 150px;
flex-shrink: 0;
}
.detail-value {
color: #333;
line-height: 1.5;
}
.link {
color: #0078d7;
text-decoration: underline;
cursor: pointer;
&:hover {
text-decoration: none;
}
}
.formats-list {
display: flex;
flex-direction: column;
gap: 40px;
}
.format-item {
display: flex;
align-items: center;
gap: 16px;
}
.format-icon {
width: 96px;
height: 96px;
}
.format-link {
color: #0078d7;
text-decoration: underline;
font-size: 72px;
&:hover {
text-decoration: none;
}
}
</style>

View File

@ -0,0 +1,201 @@
<template>
<div class="page-container">
<div class="sec-filing-detail-container">
<!-- 标题 -->
<div class="page-title">SEC Filing Details</div>
<!-- Document Details 部分 -->
<div class="section">
<h2 class="section-title">Document Details</h2>
<div class="details-grid">
<div class="detail-item">
<span class="detail-label">Form:</span>
<a :href="filingData.htmlLink" class="detail-value link">{{
filingData.form
}}</a>
</div>
<div class="detail-item">
<span class="detail-label">Filing Date:</span>
<span class="detail-value">{{ filingData.filingDate }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Form Description:</span>
<span class="detail-value">{{ filingData.formDescription }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Company:</span>
<span class="detail-value">{{ filingData.company }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Issuer:</span>
<span class="detail-value">{{ filingData.issuer }}</span>
</div>
</div>
</div>
<!-- Filing Formats 部分 -->
<div class="section">
<h2 class="section-title">Filing Formats</h2>
<div class="formats-list">
<div class="format-item">
<img :src="iconLink" alt="link" class="format-icon" />
<a :href="filingData.htmlLink" class="format-link" target="_blank"
>View HTML</a
>
</div>
</div>
</div>
<!-- XBRL 部分 -->
<div
v-if="
Array.isArray(filingData.dataFiles) && filingData.dataFiles.length > 0
"
class="section"
>
<h2 class="section-title">XBRL</h2>
<div class="formats-list">
<div
class="format-item"
v-for="(item, idx) in filingData.dataFiles"
:key="idx"
>
<img :src="iconLink" alt="link" class="format-icon" />
<a :href="item.fileUrl" class="format-link" target="_blank">{{
item.description
}}</a>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import iconLink from "@/assets/image/icon/icon-link.png";
import { fileList } from "@/dict/secFiles.js";
import { useRoute } from "vue-router";
// props
const filingData = ref({
form: "",
filingDate: "",
formDescription: "",
company: "",
issuer: "",
htmlLink: "#",
});
const route = useRoute();
onMounted(() => {
const { idx } = route.query;
const file = fileList.find((item) => item.idx == idx);
if (file) {
filingData.value = {
form: file.form,
filingDate: file.filingDate,
formDescription: file.formDescription,
htmlLink: file.fileLink || "#",
dataFiles: file.dataFiles || [],
company: "FiEE, Inc. ",
issuer: "FiEE, Inc. ",
};
}
console.log(filingData.value);
});
</script>
<style scoped lang="scss">
.page-container {
background-image: url("@/assets/image/bg.png");
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
min-height: 100vh;
padding: 20px;
}
.sec-filing-detail-container {
max-width: calc(100% - 300px);
margin: 0 auto;
padding: 20px;
}
.page-title {
font-size: 85px;
font-weight: bold;
color: #333;
margin-bottom: 40px;
}
.section {
margin-bottom: 40px;
}
.section-title {
font-size: 50px;
font-weight: bold;
color: #333;
margin-bottom: 20px;
}
.details-grid {
display: grid;
gap: 25px;
}
.detail-item {
display: flex;
align-items: flex-start;
gap: 20px;
}
.detail-label {
font-weight: bold;
color: #333;
min-width: 150px;
flex-shrink: 0;
}
.detail-value {
color: #333;
line-height: 1.5;
}
.link {
color: #0078d7;
text-decoration: underline;
cursor: pointer;
&:hover {
text-decoration: none;
}
}
.formats-list {
display: flex;
flex-direction: column;
gap: 20px;
}
.format-item {
display: flex;
align-items: center;
gap: 16px;
}
.format-icon {
width: 68px;
height: 68px;
}
.format-link {
color: #0078d7;
text-decoration: underline;
font-size: 40px;
&:hover {
text-decoration: none;
}
}
</style>

View File

@ -72,12 +72,12 @@
<script setup>
import { reactive } from "vue";
import quarterlyPdfone from "@/assets/file/AUDIT COMMITTEE CHARTER.pdf";
import quarterlyPdftwo from "@/assets/file/CODE OF BUSINESS CONDUCT AND ETHICS.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 quarterlyPdfthree from "@/assets/file/COMPENSATION COMMITTEE CHARTER.pdf";
import quarterlyPdfthree from "@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf";
import quarterlyPdffour from "@/assets/file/NOMINATING AND CORPORATE GOVERNANCE COMMITTEE CHARTER.pdf";
import quarterlyPdffour from "@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf";
const state = reactive({
list: [

View File

@ -39,6 +39,7 @@
<h1 style="font-size: 18px" class="">
{{ item.title }}
</h1>
<text> {{ item.date }}</text>
</div>
</div>
<div class="mt-auto">
@ -72,12 +73,12 @@
<script setup>
import { reactive } from "vue";
import quarterlyPdfone from "@/assets/file/AUDIT COMMITTEE CHARTER.pdf";
import quarterlyPdftwo from "@/assets/file/CODE OF BUSINESS CONDUCT AND ETHICS.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 quarterlyPdfthree from "@/assets/file/COMPENSATION COMMITTEE CHARTER.pdf";
import quarterlyPdfthree from "@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf";
import quarterlyPdffour from "@/assets/file/NOMINATING AND CORPORATE GOVERNANCE COMMITTEE CHARTER.pdf";
import quarterlyPdffour from "@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf";
const state = reactive({
list: [
@ -86,28 +87,28 @@ const state = reactive({
description:
"Defines the purpose, composition, and responsibilities of the Audit Committee in overseeing financial reporting and disclosure.",
url: quarterlyPdfone,
date: "Last updated: March 2025",
date: "May 30, 2025",
},
{
title: "CODE OF BUSINESS CONDUCT AND ETHICS",
description:
"Establishes the ethical standards and legal compliance expectations for all directors, officers and employees.",
url: quarterlyPdftwo,
date: "Last updated: January 2025",
date: "May 30, 2025",
},
{
title: "COMPENSATION COMMITTEE CHARTER",
description:
"Outlines the duties and responsibilities for overseeing executive compensation and benefit plans.",
url: quarterlyPdfthree,
date: "Last updated: February 2025",
date: "May 30, 2025",
},
{
title: "NOMINATING AND CORPORATE GOVERNANCE COMMITTEE CHARTER",
description:
"Provides the framework for director nominations and corporate governance matters.",
url: quarterlyPdffour,
date: "Last updated: April 2025",
date: "May 30, 2025",
},
],
});

View File

@ -68,12 +68,12 @@
<script setup>
import { reactive } from "vue";
import quarterlyPdfone from "@/assets/file/AUDIT COMMITTEE CHARTER.pdf";
import quarterlyPdftwo from "@/assets/file/CODE OF BUSINESS CONDUCT AND ETHICS.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 quarterlyPdfthree from "@/assets/file/COMPENSATION COMMITTEE CHARTER.pdf";
import quarterlyPdfthree from "@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf";
import quarterlyPdffour from "@/assets/file/NOMINATING AND CORPORATE GOVERNANCE COMMITTEE CHARTER.pdf";
import quarterlyPdffour from "@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf";
const state = reactive({
list: [

View File

@ -68,12 +68,12 @@
<script setup>
import { reactive } from "vue";
import quarterlyPdfone from "@/assets/file/AUDIT COMMITTEE CHARTER.pdf";
import quarterlyPdftwo from "@/assets/file/CODE OF BUSINESS CONDUCT AND ETHICS.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 quarterlyPdfthree from "@/assets/file/COMPENSATION COMMITTEE CHARTER.pdf";
import quarterlyPdfthree from "@/assets/file/FiEE, Inc._Compensation Committee Charter.pdf";
import quarterlyPdffour from "@/assets/file/NOMINATING AND CORPORATE GOVERNANCE COMMITTEE CHARTER.pdf";
import quarterlyPdffour from "@/assets/file/FiEE, Inc. _Nominating and Corporate Governance Committee Charter.pdf";
const state = reactive({
list: [

View File

@ -1,15 +1,18 @@
<template>
<div class="historic-data-container" style="margin-bottom: 40px">
<img
<!-- <img
src="@/assets/image/historic-stock.png"
alt="1"
style="max-width: 100%; margin: 0 auto"
/>
/> -->
<div class="echarts-container">
<customEcharts></customEcharts>
</div>
<div class="header mt-[20px]">
<div class="title">Historical Data</div>
<div class="filter-container">
<n-dropdown
<!-- <n-dropdown
trigger="click"
:options="periodOptions"
@select="handlePeriodChange"
@ -19,7 +22,7 @@
{{ state.selectedPeriod }}
<n-icon><chevron-down-outline /></n-icon>
</n-button>
</n-dropdown>
</n-dropdown> -->
<n-dropdown
trigger="click"
@ -92,6 +95,7 @@ import {
ArrowUpOutline,
} from "@vicons/ionicons5";
import defaultTableData from "../data";
import customEcharts from '@/components/customEcharts/index.vue'
console.log("defaultTableData", defaultTableData);
//

View File

@ -1,10 +1,10 @@
<template>
<div class="historic-data-container" style="margin-bottom: 40px;">
<img
<!-- <img
src="@/assets/image/historic-stock.png"
alt="1"
style="max-width: 100%; margin: 0 auto;"
/>
/> -->
<div class="echarts-container">
<customEcharts></customEcharts>
</div>
@ -12,7 +12,7 @@
<div class="header mt-[20px]">
<div class="title">Historical Data</div>
<div class="filter-container">
<n-dropdown
<!-- <n-dropdown
trigger="click"
:options="periodOptions"
@select="handlePeriodChange"
@ -22,7 +22,7 @@
{{ state.selectedPeriod }}
<n-icon><chevron-down-outline /></n-icon>
</n-button>
</n-dropdown>
</n-dropdown> -->
<n-dropdown
trigger="click"
@ -127,7 +127,7 @@ const pageSizeOptions = [
const state = reactive({
selectedPeriod: 'Daily',
selectedDuration: '3 Months',
selectedDuration: '6 Months',
tableData: [],
currentPage: 1,
pageSize: 50,
@ -216,6 +216,7 @@ const handlePeriodChange = (key) => {
const handleDurationChange = (key) => {
state.selectedDuration = key
state.currentPage = 1
getPageData()
}
@ -299,42 +300,86 @@ const getPageDefaultData = async () => {
}
const getPageData = async () => {
let range = ''
let now = new Date()
const last = new Date(now)
last.setMonth(now.getMonth() - 6)
let fromDate = last
let toDate =
now.getFullYear() +
'-' +
String(now.getMonth() + 1).padStart(2, '0') +
'-' +
String(now.getDate()).padStart(2, '0')
if (state.selectedDuration === '3 Months') {
range = '3M'
const last = new Date(now)
last.setMonth(now.getMonth() - 3)
fromDate = last
} else if (state.selectedDuration === '6 Months') {
range = '6M'
const last = new Date(now)
last.setMonth(now.getMonth() - 6)
fromDate = last
} else if (state.selectedDuration === 'Year to Date') {
range = 'YTD'
fromDate = new Date(now.getFullYear(), 0, 1)
} else if (state.selectedDuration === '1 Year') {
range = '1Y'
const last = new Date(now)
last.setFullYear(now.getFullYear() - 1)
fromDate = last
} else if (state.selectedDuration === '5 Years') {
range = '5Y'
const last = new Date(now)
last.setFullYear(now.getFullYear() - 5)
fromDate = last
} else if (state.selectedDuration === '10 Years') {
range = '10Y'
const last = new Date(now)
last.setFullYear(now.getFullYear() - 10)
fromDate = last
} else if (state.selectedDuration === 'Full History') {
range = 'Max'
fromDate = new Date('2009-10-07')
}
let url = `https://stockanalysis.com/api/symbol/a/OTC-MINM/history?period=${state.selectedPeriod}&range=${range}`
let finalFromDate =
fromDate.getFullYear() +
'-' +
String(fromDate.getMonth() + 1).padStart(2, '0') +
'-' +
String(fromDate.getDate()).padStart(2, '0')
// let url = `https://stockanalysis.com/api/symbol/a/OTC-MINM/history?period=${state.selectedPeriod}&range=${range}`
let url =
'https://common.szjixun.cn/api/stock/history/list?from=' +
finalFromDate +
'&to=' +
toDate
const res = await axios.get(url)
if (res.data.status === 200) {
// "Nov 26, 2024"
let resultData = res.data.data.map((item) => {
return {
date: new Date(item.t).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
}),
open: item.o != null ? Number(item.o).toFixed(2) : '',
high: item.h != null ? Number(item.h).toFixed(2) : '',
low: item.l != null ? Number(item.l).toFixed(2) : '',
close: item.c != null ? Number(item.c).toFixed(2) : '',
adjClose: item.a != null ? Number(item.a).toFixed(2) : '',
change: item.ch != null ? Number(item.ch).toFixed(2) + '%' : '',
volume: item.v,
}
})
state.tableData = resultData
console.error(res)
if (res.status === 200) {
if (res.data.status === 0) {
// "Nov 26, 2024"
let resultData = res.data.data.map((item) => {
return {
date: new Date(item.date).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
}),
open: item.open != null ? Number(item.open).toFixed(2) : '',
high: item.high != null ? Number(item.high).toFixed(2) : '',
low: item.low != null ? Number(item.low).toFixed(2) : '',
close: item.close != null ? Number(item.close).toFixed(2) : '',
adjClose: item.close != null ? Number(item.close).toFixed(2) : '',
change:
item.changePercent != null
? Number(item.changePercent).toFixed(2) + '%'
: '',
volume: item.volume,
}
})
state.tableData = resultData
}
}
}
</script>

View File

@ -1,15 +1,18 @@
<template>
<div class="historic-data-container" style="margin-bottom: 40px">
<img
<!-- <img
src="@/assets/image/historic-stock-375.png"
alt="1"
style="max-width: 100%; margin: 0 auto"
/>
/> -->
<div class="echarts-container">
<customEcharts></customEcharts>
</div>
<div class="header mt-[80px]">
<div class="title">Historical Data</div>
<div class="filter-container">
<n-dropdown
<!-- <n-dropdown
trigger="click"
:options="periodOptions"
@select="handlePeriodChange"
@ -19,7 +22,7 @@
{{ state.selectedPeriod }}
<n-icon><chevron-down-outline /></n-icon>
</n-button>
</n-dropdown>
</n-dropdown> -->
<n-dropdown
trigger="click"
@ -90,6 +93,7 @@ import {
ArrowUpOutline,
} from "@vicons/ionicons5";
import defaultTableData from "../data";
import customEcharts from '@/components/customEcharts/index.vue'
console.log("defaultTableData", defaultTableData);
//

View File

@ -1,15 +1,18 @@
<template>
<div class="historic-data-container" style="margin-bottom: 40px">
<img
<!-- <img
src="@/assets/image/historic-stock.png"
alt="1"
style="max-width: 100%; margin: 0 auto"
/>
/> -->
<div class="echarts-container">
<customEcharts></customEcharts>
</div>
<div class="header mt-[20px]">
<div class="title">Historical Data</div>
<div class="filter-container">
<n-dropdown
<!-- <n-dropdown
trigger="click"
:options="periodOptions"
@select="handlePeriodChange"
@ -19,7 +22,7 @@
{{ state.selectedPeriod }}
<n-icon><chevron-down-outline /></n-icon>
</n-button>
</n-dropdown>
</n-dropdown> -->
<n-dropdown
trigger="click"
@ -92,6 +95,7 @@ import {
ArrowUpOutline,
} from "@vicons/ionicons5";
import defaultTableData from "../data";
import customEcharts from '@/components/customEcharts/index.vue'
console.log("defaultTableData", defaultTableData);
//

View File

@ -66,24 +66,26 @@
<div class="news-card">
<!-- <div class="news-date">De 15. 2023</div> -->
<!-- <h3 class="news-title">{{ $t("HOME.CONTAINY.NEWS.LATEST_TITLE") }}</h3> -->
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.TITLETWO") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.TITLETHTEE") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.CONTENTTHREE") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.CONTENTFOUR") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.CONTENTFIVE") }}
</p>
<!-- <a href="#" class="news-link"
>{{ $t("HOME.CONTAINY.NEWS.READ_MORE") }} </a
> -->
<div style="font-size: 18px">
<div>May 30, 2025 EDT</div>
<div style="font-size: 18px">
FiEE, Inc. Announces Relisting on Nasdaq
</div>
<div
style="font-size: 18px"
class="cursor-pointer"
@click="handleLink('/news')"
>
View Press Release<img
class="ml-[10px]"
src="@/assets/image/icon/icon-new.png"
alt=""
style="width: 20px; height: 20px"
/>
</div>
</div>
</div>
</section>
<!-- 新增股票信息与活动预告双栏模块 -->
@ -107,7 +109,7 @@
$t("HOME.CONTAINY.STOCK_INFO.LAST_PRICE")
}}</span>
<span style="font-size: 18px" class="data-value"
>${{ stockQuote.Open }}</span
>${{ stockQuote.open }}</span
>
</div>
<div class="data-row">
@ -115,8 +117,7 @@
$t("HOME.CONTAINY.STOCK_INFO.CHANGE")
}}</span>
<span style="font-size: 18px" class="data-value positive"
>{{ stockQuote.change?.[0] || "--" }}
{{ stockQuote.change?.[1] || "--" }}</span
>{{ stockQuote.change || "--" }}</span
>
</div>
<div class="data-row">
@ -132,7 +133,7 @@
$t("HOME.CONTAINY.STOCK_INFO.VOLUME")
}}</span>
<span style="font-size: 18px" class="data-value">{{
stockQuote.Volume
stockQuote.volume
}}</span>
</div>
<div class="data-row">
@ -140,7 +141,7 @@
$t("HOME.CONTAINY.STOCK_INFO.MARKET_CAP")
}}</span>
<span style="font-size: 18px" class="data-value"
>${{ stockQuote.MarketCap }}</span
>${{ stockQuote.marketCap }}</span
>
</div>
</div>
@ -236,6 +237,11 @@ onUnmounted(() => {
observer.disconnect();
}
});
import { useRouter } from "vue-router";
const router = useRouter();
const handleLink = (link) => {
router.push(link);
};
</script>
<style scoped>
@ -528,13 +534,6 @@ onUnmounted(() => {
margin-bottom: 15px;
}
.news-excerpt {
color: black;
line-height: 0.8;
margin-bottom: 20px;
font-size: 18px;
}
.news-link {
color: #895bff;
font-weight: 600;

View File

@ -65,24 +65,27 @@
<div class="news-card">
<!-- <div class="news-date">De 15. 2023</div> -->
<!-- <h3 class="news-title">{{ $t("HOME.CONTAINY.NEWS.LATEST_TITLE") }}</h3> -->
<p class="news-excerpt">
{{ $t("HOME.CONTAINY.NEWS.TITLETWO") }}
</p>
<p class="news-excerpt">
{{ $t("HOME.CONTAINY.NEWS.TITLETHTEE") }}
</p>
<p class="news-excerpt">
{{ $t("HOME.CONTAINY.NEWS.CONTENTTHREE") }}
</p>
<p class="news-excerpt">
{{ $t("HOME.CONTAINY.NEWS.CONTENTFOUR") }}
</p>
<p class="news-excerpt">
{{ $t("HOME.CONTAINY.NEWS.CONTENTFIVE") }}
</p>
<!-- <a href="#" class="news-link"
>{{ $t("HOME.CONTAINY.NEWS.READ_MORE") }} </a
> -->
<div style="font-size: 18px">
<div>May 30, 2025 EDT</div>
<div style="font-size: 18px">
FiEE, Inc. Announces Relisting on Nasdaq
</div>
<div
style="font-size: 18px"
class="cursor-pointer"
@click="handleLink('/news')"
>
View Press Release<img
class="ml-[10px]"
src="@/assets/image/icon/icon-new.png"
alt=""
style="width: 20px; height: 20px"
/>
</div>
</div>
</div>
</section>
<!-- 新增股票信息与活动预告双栏模块 -->
@ -103,15 +106,14 @@
<span class="data-label">{{
$t("HOME.CONTAINY.STOCK_INFO.LAST_PRICE")
}}</span>
<span class="data-value">${{ stockQuote.Open }}</span>
<span class="data-value">${{ stockQuote.open }}</span>
</div>
<div class="data-row">
<span class="data-label">{{
$t("HOME.CONTAINY.STOCK_INFO.CHANGE")
}}</span>
<span class="data-value positive"
>{{ stockQuote.change?.[0] || "--" }}
{{ stockQuote.change?.[1] || "--" }}</span
>{{ stockQuote.change || "--" }}</span
>
</div>
<div class="data-row">
@ -124,13 +126,13 @@
<span class="data-label">{{
$t("HOME.CONTAINY.STOCK_INFO.VOLUME")
}}</span>
<span class="data-value">{{ stockQuote.Volume }}</span>
<span class="data-value">{{ stockQuote.volume }}</span>
</div>
<div class="data-row">
<span class="data-label">{{
$t("HOME.CONTAINY.STOCK_INFO.MARKET_CAP")
}}</span>
<span class="data-value">${{ stockQuote.MarketCap }}</span>
<span class="data-value">${{ stockQuote.marketCap }}</span>
</div>
</div>
</div>
@ -225,6 +227,11 @@ onUnmounted(() => {
observer.disconnect();
}
});
import { useRouter } from "vue-router";
const router = useRouter();
const handleLink = (link) => {
router.push(link);
};
</script>
<style scoped>

View File

@ -66,24 +66,26 @@
<div class="news-card">
<!-- <div class="news-date">De 15. 2023</div> -->
<!-- <h3 class="news-title">{{ $t("HOME.CONTAINY.NEWS.LATEST_TITLE") }}</h3> -->
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.TITLETWO") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.TITLETHTEE") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.CONTENTTHREE") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.CONTENTFOUR") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.CONTENTFIVE") }}
</p>
<!-- <a href="#" class="news-link"
>{{ $t("HOME.CONTAINY.NEWS.READ_MORE") }} </a
> -->
<div style="font-size: 18px">
<div>May 30, 2025 EDT</div>
<div style="font-size: 18px">
FiEE, Inc. Announces Relisting on Nasdaq
</div>
<div
style="font-size: 18px"
class="cursor-pointer mt-[20px]"
@click="handleLink('/news')"
>
View Press Release<img
class="ml-[10px]"
src="@/assets/image/icon/icon-new.png"
alt=""
style="width: 20px; height: 20px"
/>
</div>
</div>
</div>
</section>
<!-- 新增股票信息与活动预告双栏模块 -->
@ -107,7 +109,7 @@
$t("HOME.CONTAINY.STOCK_INFO.LAST_PRICE")
}}</span>
<span style="font-size: 18px" class="data-value"
>${{ stockQuote.Open }}</span
>${{ stockQuote.open }}</span
>
</div>
<div class="data-row">
@ -115,8 +117,7 @@
$t("HOME.CONTAINY.STOCK_INFO.CHANGE")
}}</span>
<span style="font-size: 18px" class="data-value positive"
>{{ stockQuote.change?.[0] || "--" }}
{{ stockQuote.change?.[1] || "--" }}</span
>{{ stockQuote.change || "--" }}</span
>
</div>
<div class="data-row">
@ -132,7 +133,7 @@
$t("HOME.CONTAINY.STOCK_INFO.VOLUME")
}}</span>
<span style="font-size: 18px" class="data-value">{{
stockQuote.Volume
stockQuote.volume
}}</span>
</div>
<div class="data-row">
@ -140,7 +141,7 @@
$t("HOME.CONTAINY.STOCK_INFO.MARKET_CAP")
}}</span>
<span style="font-size: 18px" class="data-value"
>${{ stockQuote.MarketCap }}</span
>${{ stockQuote.marketCap }}</span
>
</div>
</div>
@ -234,6 +235,11 @@ onUnmounted(() => {
observer.disconnect();
}
});
import { useRouter } from "vue-router";
const router = useRouter();
const handleLink = (link) => {
router.push(link);
};
</script>
<style scoped>

View File

@ -66,24 +66,25 @@
<div class="news-card">
<!-- <div class="news-date">De 15. 2023</div> -->
<!-- <h3 class="news-title">{{ $t("HOME.CONTAINY.NEWS.LATEST_TITLE") }}</h3> -->
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.TITLETWO") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.TITLETHTEE") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.CONTENTTHREE") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.CONTENTFOUR") }}
</p>
<p style="font-size: 18px">
{{ $t("HOME.CONTAINY.NEWS.CONTENTFIVE") }}
</p>
<!-- <a href="#" class="news-link"
>{{ $t("HOME.CONTAINY.NEWS.READ_MORE") }} </a
> -->
<div style="font-size: 18px">
<div>May 30, 2025 EDT</div>
<div style="font-size: 18px">
FiEE, Inc. Announces Relisting on Nasdaq
</div>
<div
style="font-size: 18px"
class="cursor-pointer mt-[10px]"
@click="handleLink('/news')"
>
View Press Release<img
class="ml-[10px]"
src="@/assets/image/icon/icon-new.png"
alt=""
style="width: 20px; height: 20px"
/>
</div>
</div>
</div>
</section>
<!-- 新增股票信息与活动预告双栏模块 -->
@ -107,7 +108,7 @@
$t("HOME.CONTAINY.STOCK_INFO.LAST_PRICE")
}}</span>
<span style="font-size: 18px" class="data-value"
>${{ stockQuote.Open }}</span
>${{ stockQuote.open }}</span
>
</div>
<div class="data-row">
@ -115,8 +116,7 @@
$t("HOME.CONTAINY.STOCK_INFO.CHANGE")
}}</span>
<span style="font-size: 18px" class="data-value positive"
>{{ stockQuote.change?.[0] || "--" }}
{{ stockQuote.change?.[1] || "--" }}</span
>{{ stockQuote.change || "--" }}</span
>
</div>
<div class="data-row">
@ -132,7 +132,7 @@
$t("HOME.CONTAINY.STOCK_INFO.VOLUME")
}}</span>
<span style="font-size: 18px" class="data-value">{{
stockQuote.Volume
stockQuote.volume
}}</span>
</div>
<div class="data-row">
@ -140,7 +140,7 @@
$t("HOME.CONTAINY.STOCK_INFO.MARKET_CAP")
}}</span>
<span style="font-size: 18px" class="data-value"
>${{ stockQuote.MarketCap }}</span
>${{ stockQuote.marketCap }}</span
>
</div>
</div>
@ -236,6 +236,11 @@ onUnmounted(() => {
observer.disconnect();
}
});
import { useRouter } from "vue-router";
const router = useRouter();
const handleLink = (link) => {
router.push(link);
};
</script>
<style scoped>

29
src/views/news/index.vue Normal file
View File

@ -0,0 +1,29 @@
<template>
<div class="new-releases-page">
<component :is="viewComponent" />
</div>
</template>
<script setup>
import size375 from "@/views/news/size375/index.vue";
import size768 from "@/views/news/size768/index.vue";
import size1440 from "@/views/news/size1440/index.vue";
import size1920 from "@/views/news/size1920/index.vue";
import { computed } from "vue";
import { useWindowSize } from "@vueuse/core";
const { width } = useWindowSize();
const viewComponent = computed(() => {
const viewWidth = width.value;
if (viewWidth <= 450) {
return size375;
} else if (viewWidth <= 768) {
return size768;
} else if (viewWidth <= 1500) {
return size1440;
} else if (viewWidth <= 1920 || viewWidth > 1920) {
return size1920;
}
});
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,116 @@
<template>
<div class="page-container">
<p style="font-size: 24px">
<strong>FiEE, Inc. Announces Relisting on Nasdaq</strong>
</p>
<p>May 30, 2025</p>
<p>
<em>Company will resume trading under its existing symbols MINM </em>
</p>
<p>
<strong>Hong Kong, May 30, 2025 </strong> FiEE, Inc. (FiEE, Inc. or the
Company), a technology company integrating IoT, connectivity and AI to
redefine brand management solutions in the digital era, is pleased to
announce that The Nasdaq Stock Market LLC (Nasdaq) has approved its
application for the relisting of the Companys ordinary shares. Trading is
expected to commence on Nasdaq at the opening of trading on Monday, 2
June, 2025 under the ticker symbol MINM.
</p>
<p>
<strong>Rafael Li, Chief Executive Officer of FiEE,</strong> commented,
"We are honored to announce our successful relisting on Nasdaq, a
significant milestone that reflects our unwavering commitment to
operational excellence and strategic growth. We extend our sincere
gratitude to the Nasdaq team for their prompt review and approval of our
application, affirming our compliance with all initial listing criteria.
</p>
<p>
FiEE, Inc. is currently undergoing a strategic transformation aimed at
capitalizing on broader market opportunities. Central to this evolution is
our integrated approach, where cyber-hardened IoT connectivity converges
with AI-driven content creation and audience targeting. This synergy is
designed to empower Key Opinion Leaders (KOLs) and brands to achieve
accelerated growth and deeper audience engagement. Leveraging
IoT-connectivity solutions, AI and big data analytics, we are capable to
deliver intelligent, multimedia and multilingual contents tailored to
diverse audiences. Coupling with AI targeting analysis, we enhance
audience targeting capabilities, ensuring effective content placement and
personalized promotions.
</p>
<p>
As we advance, our focus remains on continuous innovation and strategic
initiatives that drive long-term growth and shareholder value.
</p>
<p><strong>About FiEE, Inc.</strong></p>
<p>
FiEE, Inc., (NASDAQ: MINM), formerly Minim, Inc., was founded in 1977. It
has a historical track record of delivering comprehensive WiFi/Software as
a Service platform in the market. After years of development, it made the
strategic decision to transition to a Software First Model in 2023 to
expand our technology portfolio and revenue streams. In 2025, FiEE, Inc.
rebranded itself as a technology company leveraging the expertise in IoT,
connectivity, and artificial intelligence ("AI") to explore new business
prospects and extend our global footprint.
</p>
<p>
Our services are structured into four key categories: Cloud-Managed
Connectivity (WiFi) Platform, IoT Hardware Sales &amp; Licensing, SAAS
Solutions, and Professional To-C and To-B Services &amp; Support. Notably,
we have introduced our innovative Software as a Service ("SaaS")
solutions, which integrate our AI and data analytics capabilities into
content creation and brand management. This initiative has led to the
nurturing of a robust pool of Key Opinion Leaders (KOLs) on major social
media platforms worldwide, assisting them in developing, managing, and
optimizing their digital presence across global platforms. Our services
include customized graphics and posts, short videos, and editorial
calendars tailored to align with brand objectives.
</p>
<p>
<strong>Forward-Looking Statements</strong><br />This communication
contains forward-looking statements which include, but are not limited to,
statements regarding the Companys listing of its ordinary shares on
Nasdaq; the impact of the listing; the Companys business strategy,
including its strategic transformation; and the Companys ability to drive
long-term growth and shareholder value. These forward-looking statements
are subject to the safe harbor provisions under the Private Securities
Litigation Reform Act of 1995. The Companys expectations and beliefs
regarding these matters may not materialize. Actual outcomes and results
may differ materially from those contemplated by these forward-looking
statements as a result of uncertainties, risks, and changes in
circumstances, including but not limited to risks and uncertainties
related to: the ability of the Company to maintain compliance with the
Nasdaq continued listing standards; the impact of fluctuations in global
financial markets on the Companys business and the actions it may take in
response thereto; the Companys ability to execute its plans and
strategies; and the impact of government laws and regulations. Additional
risks and uncertainties that could cause actual outcomes and results to
differ materially from those contemplated by the forward-looking
statements are included under the caption Risk Factors in the Companys
Quarterly Report on Form 10-Q for the quarter ended March 31, 2025 and
elsewhere in the Companys subsequent reports on Form 10-K, Form 10-Q or
Form 8-K filed with the U.S. Securities and Exchange Commission from time
to time and available at www.sec.gov.
</p>
<p><strong>Media</strong></p>
<p><a href="mailto:fiee@dlkadvisory.com">fiee@dlkadvisory.com</a></p>
<p>Source: FiEE, Inc.</p>
</div>
</template>
<script setup>
import { reactive } from "vue";
import { NSelect, NInput, NButton } from "naive-ui";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const state = reactive({});
</script>
<style scoped lang="scss">
.page-container {
max-width: 1200px;
margin: 0 auto;
padding: 40px;
}
</style>

View File

@ -0,0 +1,116 @@
<template>
<div class="page-container">
<p style="font-size: 24px">
<strong>FiEE, Inc. Announces Relisting on Nasdaq</strong>
</p>
<p>May 30, 2025</p>
<p>
<em>Company will resume trading under its existing symbols MINM </em>
</p>
<p>
<strong>Hong Kong, May 30, 2025 </strong> FiEE, Inc. (FiEE, Inc. or the
Company), a technology company integrating IoT, connectivity and AI to
redefine brand management solutions in the digital era, is pleased to
announce that The Nasdaq Stock Market LLC (Nasdaq) has approved its
application for the relisting of the Companys ordinary shares. Trading is
expected to commence on Nasdaq at the opening of trading on Monday, 2
June, 2025 under the ticker symbol MINM.
</p>
<p>
<strong>Rafael Li, Chief Executive Officer of FiEE,</strong> commented,
"We are honored to announce our successful relisting on Nasdaq, a
significant milestone that reflects our unwavering commitment to
operational excellence and strategic growth. We extend our sincere
gratitude to the Nasdaq team for their prompt review and approval of our
application, affirming our compliance with all initial listing criteria.
</p>
<p>
FiEE, Inc. is currently undergoing a strategic transformation aimed at
capitalizing on broader market opportunities. Central to this evolution is
our integrated approach, where cyber-hardened IoT connectivity converges
with AI-driven content creation and audience targeting. This synergy is
designed to empower Key Opinion Leaders (KOLs) and brands to achieve
accelerated growth and deeper audience engagement. Leveraging
IoT-connectivity solutions, AI and big data analytics, we are capable to
deliver intelligent, multimedia and multilingual contents tailored to
diverse audiences. Coupling with AI targeting analysis, we enhance
audience targeting capabilities, ensuring effective content placement and
personalized promotions.
</p>
<p>
As we advance, our focus remains on continuous innovation and strategic
initiatives that drive long-term growth and shareholder value.
</p>
<p><strong>About FiEE, Inc.</strong></p>
<p>
FiEE, Inc., (NASDAQ: MINM), formerly Minim, Inc., was founded in 1977. It
has a historical track record of delivering comprehensive WiFi/Software as
a Service platform in the market. After years of development, it made the
strategic decision to transition to a Software First Model in 2023 to
expand our technology portfolio and revenue streams. In 2025, FiEE, Inc.
rebranded itself as a technology company leveraging the expertise in IoT,
connectivity, and artificial intelligence ("AI") to explore new business
prospects and extend our global footprint.
</p>
<p>
Our services are structured into four key categories: Cloud-Managed
Connectivity (WiFi) Platform, IoT Hardware Sales &amp; Licensing, SAAS
Solutions, and Professional To-C and To-B Services &amp; Support. Notably,
we have introduced our innovative Software as a Service ("SaaS")
solutions, which integrate our AI and data analytics capabilities into
content creation and brand management. This initiative has led to the
nurturing of a robust pool of Key Opinion Leaders (KOLs) on major social
media platforms worldwide, assisting them in developing, managing, and
optimizing their digital presence across global platforms. Our services
include customized graphics and posts, short videos, and editorial
calendars tailored to align with brand objectives.
</p>
<p>
<strong>Forward-Looking Statements</strong><br />This communication
contains forward-looking statements which include, but are not limited to,
statements regarding the Companys listing of its ordinary shares on
Nasdaq; the impact of the listing; the Companys business strategy,
including its strategic transformation; and the Companys ability to drive
long-term growth and shareholder value. These forward-looking statements
are subject to the safe harbor provisions under the Private Securities
Litigation Reform Act of 1995. The Companys expectations and beliefs
regarding these matters may not materialize. Actual outcomes and results
may differ materially from those contemplated by these forward-looking
statements as a result of uncertainties, risks, and changes in
circumstances, including but not limited to risks and uncertainties
related to: the ability of the Company to maintain compliance with the
Nasdaq continued listing standards; the impact of fluctuations in global
financial markets on the Companys business and the actions it may take in
response thereto; the Companys ability to execute its plans and
strategies; and the impact of government laws and regulations. Additional
risks and uncertainties that could cause actual outcomes and results to
differ materially from those contemplated by the forward-looking
statements are included under the caption Risk Factors in the Companys
Quarterly Report on Form 10-Q for the quarter ended March 31, 2025 and
elsewhere in the Companys subsequent reports on Form 10-K, Form 10-Q or
Form 8-K filed with the U.S. Securities and Exchange Commission from time
to time and available at www.sec.gov.
</p>
<p><strong>Media</strong></p>
<p><a href="mailto:fiee@dlkadvisory.com">fiee@dlkadvisory.com</a></p>
<p>Source: FiEE, Inc.</p>
</div>
</template>
<script setup>
import { reactive } from "vue";
import { NSelect, NInput, NButton } from "naive-ui";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const state = reactive({});
</script>
<style scoped lang="scss">
.page-container {
max-width: 1200px;
margin: 0 auto;
padding: 40px;
}
</style>

View File

@ -0,0 +1,116 @@
<template>
<div class="page-container">
<p style="font-size: 24px">
<strong>FiEE, Inc. Announces Relisting on Nasdaq</strong>
</p>
<p>May 30, 2025</p>
<p>
<em>Company will resume trading under its existing symbols MINM </em>
</p>
<p>
<strong>Hong Kong, May 30, 2025 </strong> FiEE, Inc. (FiEE, Inc. or the
Company), a technology company integrating IoT, connectivity and AI to
redefine brand management solutions in the digital era, is pleased to
announce that The Nasdaq Stock Market LLC (Nasdaq) has approved its
application for the relisting of the Companys ordinary shares. Trading is
expected to commence on Nasdaq at the opening of trading on Monday, 2
June, 2025 under the ticker symbol MINM.
</p>
<p>
<strong>Rafael Li, Chief Executive Officer of FiEE,</strong> commented,
"We are honored to announce our successful relisting on Nasdaq, a
significant milestone that reflects our unwavering commitment to
operational excellence and strategic growth. We extend our sincere
gratitude to the Nasdaq team for their prompt review and approval of our
application, affirming our compliance with all initial listing criteria.
</p>
<p>
FiEE, Inc. is currently undergoing a strategic transformation aimed at
capitalizing on broader market opportunities. Central to this evolution is
our integrated approach, where cyber-hardened IoT connectivity converges
with AI-driven content creation and audience targeting. This synergy is
designed to empower Key Opinion Leaders (KOLs) and brands to achieve
accelerated growth and deeper audience engagement. Leveraging
IoT-connectivity solutions, AI and big data analytics, we are capable to
deliver intelligent, multimedia and multilingual contents tailored to
diverse audiences. Coupling with AI targeting analysis, we enhance
audience targeting capabilities, ensuring effective content placement and
personalized promotions.
</p>
<p>
As we advance, our focus remains on continuous innovation and strategic
initiatives that drive long-term growth and shareholder value.
</p>
<p><strong>About FiEE, Inc.</strong></p>
<p>
FiEE, Inc., (NASDAQ: MINM), formerly Minim, Inc., was founded in 1977. It
has a historical track record of delivering comprehensive WiFi/Software as
a Service platform in the market. After years of development, it made the
strategic decision to transition to a Software First Model in 2023 to
expand our technology portfolio and revenue streams. In 2025, FiEE, Inc.
rebranded itself as a technology company leveraging the expertise in IoT,
connectivity, and artificial intelligence ("AI") to explore new business
prospects and extend our global footprint.
</p>
<p>
Our services are structured into four key categories: Cloud-Managed
Connectivity (WiFi) Platform, IoT Hardware Sales &amp; Licensing, SAAS
Solutions, and Professional To-C and To-B Services &amp; Support. Notably,
we have introduced our innovative Software as a Service ("SaaS")
solutions, which integrate our AI and data analytics capabilities into
content creation and brand management. This initiative has led to the
nurturing of a robust pool of Key Opinion Leaders (KOLs) on major social
media platforms worldwide, assisting them in developing, managing, and
optimizing their digital presence across global platforms. Our services
include customized graphics and posts, short videos, and editorial
calendars tailored to align with brand objectives.
</p>
<p>
<strong>Forward-Looking Statements</strong><br />This communication
contains forward-looking statements which include, but are not limited to,
statements regarding the Companys listing of its ordinary shares on
Nasdaq; the impact of the listing; the Companys business strategy,
including its strategic transformation; and the Companys ability to drive
long-term growth and shareholder value. These forward-looking statements
are subject to the safe harbor provisions under the Private Securities
Litigation Reform Act of 1995. The Companys expectations and beliefs
regarding these matters may not materialize. Actual outcomes and results
may differ materially from those contemplated by these forward-looking
statements as a result of uncertainties, risks, and changes in
circumstances, including but not limited to risks and uncertainties
related to: the ability of the Company to maintain compliance with the
Nasdaq continued listing standards; the impact of fluctuations in global
financial markets on the Companys business and the actions it may take in
response thereto; the Companys ability to execute its plans and
strategies; and the impact of government laws and regulations. Additional
risks and uncertainties that could cause actual outcomes and results to
differ materially from those contemplated by the forward-looking
statements are included under the caption Risk Factors in the Companys
Quarterly Report on Form 10-Q for the quarter ended March 31, 2025 and
elsewhere in the Companys subsequent reports on Form 10-K, Form 10-Q or
Form 8-K filed with the U.S. Securities and Exchange Commission from time
to time and available at www.sec.gov.
</p>
<p><strong>Media</strong></p>
<p><a href="mailto:fiee@dlkadvisory.com">fiee@dlkadvisory.com</a></p>
<p>Source: FiEE, Inc.</p>
</div>
</template>
<script setup>
import { reactive } from "vue";
import { NSelect, NInput, NButton } from "naive-ui";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const state = reactive({});
</script>
<style scoped lang="scss">
.page-container {
max-width: 1200px;
margin: 0 auto;
padding: 40px;
}
</style>

View File

@ -0,0 +1,116 @@
<template>
<div class="page-container">
<p style="font-size: 24px">
<strong>FiEE, Inc. Announces Relisting on Nasdaq</strong>
</p>
<p>May 30, 2025</p>
<p>
<em>Company will resume trading under its existing symbols MINM </em>
</p>
<p>
<strong>Hong Kong, May 30, 2025 </strong> FiEE, Inc. (FiEE, Inc. or the
Company), a technology company integrating IoT, connectivity and AI to
redefine brand management solutions in the digital era, is pleased to
announce that The Nasdaq Stock Market LLC (Nasdaq) has approved its
application for the relisting of the Companys ordinary shares. Trading is
expected to commence on Nasdaq at the opening of trading on Monday, 2
June, 2025 under the ticker symbol MINM.
</p>
<p>
<strong>Rafael Li, Chief Executive Officer of FiEE,</strong> commented,
"We are honored to announce our successful relisting on Nasdaq, a
significant milestone that reflects our unwavering commitment to
operational excellence and strategic growth. We extend our sincere
gratitude to the Nasdaq team for their prompt review and approval of our
application, affirming our compliance with all initial listing criteria.
</p>
<p>
FiEE, Inc. is currently undergoing a strategic transformation aimed at
capitalizing on broader market opportunities. Central to this evolution is
our integrated approach, where cyber-hardened IoT connectivity converges
with AI-driven content creation and audience targeting. This synergy is
designed to empower Key Opinion Leaders (KOLs) and brands to achieve
accelerated growth and deeper audience engagement. Leveraging
IoT-connectivity solutions, AI and big data analytics, we are capable to
deliver intelligent, multimedia and multilingual contents tailored to
diverse audiences. Coupling with AI targeting analysis, we enhance
audience targeting capabilities, ensuring effective content placement and
personalized promotions.
</p>
<p>
As we advance, our focus remains on continuous innovation and strategic
initiatives that drive long-term growth and shareholder value.
</p>
<p><strong>About FiEE, Inc.</strong></p>
<p>
FiEE, Inc., (NASDAQ: MINM), formerly Minim, Inc., was founded in 1977. It
has a historical track record of delivering comprehensive WiFi/Software as
a Service platform in the market. After years of development, it made the
strategic decision to transition to a Software First Model in 2023 to
expand our technology portfolio and revenue streams. In 2025, FiEE, Inc.
rebranded itself as a technology company leveraging the expertise in IoT,
connectivity, and artificial intelligence ("AI") to explore new business
prospects and extend our global footprint.
</p>
<p>
Our services are structured into four key categories: Cloud-Managed
Connectivity (WiFi) Platform, IoT Hardware Sales &amp; Licensing, SAAS
Solutions, and Professional To-C and To-B Services &amp; Support. Notably,
we have introduced our innovative Software as a Service ("SaaS")
solutions, which integrate our AI and data analytics capabilities into
content creation and brand management. This initiative has led to the
nurturing of a robust pool of Key Opinion Leaders (KOLs) on major social
media platforms worldwide, assisting them in developing, managing, and
optimizing their digital presence across global platforms. Our services
include customized graphics and posts, short videos, and editorial
calendars tailored to align with brand objectives.
</p>
<p>
<strong>Forward-Looking Statements</strong><br />This communication
contains forward-looking statements which include, but are not limited to,
statements regarding the Companys listing of its ordinary shares on
Nasdaq; the impact of the listing; the Companys business strategy,
including its strategic transformation; and the Companys ability to drive
long-term growth and shareholder value. These forward-looking statements
are subject to the safe harbor provisions under the Private Securities
Litigation Reform Act of 1995. The Companys expectations and beliefs
regarding these matters may not materialize. Actual outcomes and results
may differ materially from those contemplated by these forward-looking
statements as a result of uncertainties, risks, and changes in
circumstances, including but not limited to risks and uncertainties
related to: the ability of the Company to maintain compliance with the
Nasdaq continued listing standards; the impact of fluctuations in global
financial markets on the Companys business and the actions it may take in
response thereto; the Companys ability to execute its plans and
strategies; and the impact of government laws and regulations. Additional
risks and uncertainties that could cause actual outcomes and results to
differ materially from those contemplated by the forward-looking
statements are included under the caption Risk Factors in the Companys
Quarterly Report on Form 10-Q for the quarter ended March 31, 2025 and
elsewhere in the Companys subsequent reports on Form 10-K, Form 10-Q or
Form 8-K filed with the U.S. Securities and Exchange Commission from time
to time and available at www.sec.gov.
</p>
<p><strong>Media</strong></p>
<p><a href="mailto:fiee@dlkadvisory.com">fiee@dlkadvisory.com</a></p>
<p>Source: FiEE, Inc.</p>
</div>
</template>
<script setup>
import { reactive } from "vue";
import { NSelect, NInput, NButton } from "naive-ui";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const state = reactive({});
</script>
<style scoped lang="scss">
.page-container {
max-width: 1200px;
margin: 0 auto;
padding: 40px;
}
</style>

View File

@ -4,26 +4,26 @@
</div>
</template>
<script setup>
import size375 from '@/views/press-releases/size375/index.vue'
import size768 from '@/views/press-releases/size375/index.vue'
import size1440 from '@/views/press-releases/size1920/index.vue'
import size1920 from '@/views/press-releases/size1920/index.vue'
import { computed } from 'vue'
import { useWindowSize } from '@vueuse/core'
import size375 from "@/views/press-releases/size375/index.vue";
import size768 from "@/views/press-releases/size768/index.vue";
import size1440 from "@/views/press-releases/size1440/index.vue";
import size1920 from "@/views/press-releases/size1920/index.vue";
import { computed } from "vue";
import { useWindowSize } from "@vueuse/core";
const { width } = useWindowSize()
const { width } = useWindowSize();
const viewComponent = computed(() => {
const viewWidth = width.value
const viewWidth = width.value;
if (viewWidth <= 450) {
return size375
return size375;
} else if (viewWidth <= 768) {
return size768
return size768;
} else if (viewWidth <= 1500) {
return size1440
return size1440;
} else if (viewWidth <= 1920 || viewWidth > 1920) {
return size1920
return size1920;
}
})
});
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,192 @@
<template>
<div class="press-releases-page">
<customDefaultPage>
<template #content>
<main class="p-[35px] max-w-[1200px] mx-auto">
<div class="title mb-[20px]">
{{ t("press_releases.title") }}
</div>
<div class="search-container">
<n-select
:options="state.selectOptions"
v-model:value="state.selectedValue"
class="search-select"
/>
<n-input
v-model:value="state.inputValue"
type="text"
:placeholder="t('press_releases.search.placeholder')"
class="search-input"
/>
<n-button
type="primary"
@click="handleSearch"
class="search-button w-[80px]"
>
{{ t("press_releases.search.button") }}
</n-button>
</div>
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
<div class="news-item mt-[10px]">
<div class="news-item-date">{{ item.date }}</div>
<div
class="news-item-title text-[#0078d7] overflow-hidden whitespace-nowrap text-ellipsis cursor-pointer"
@click="handleNewClick(item)"
>
{{ item.title }}
</div>
<div class="news-item-content">
{{
item.content.length > 230
? item.content.substring(0, 230) + "..."
: item.content
}}
</div>
</div>
</div>
</main>
</template>
</customDefaultPage>
</div>
</template>
<script setup>
import customDefaultPage from "@/components/customDefaultPage/index.vue";
import { reactive, onMounted, watch } from "vue";
import { NSelect, NInput, NButton } from "naive-ui";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
const router = useRouter();
const { t } = useI18n();
const state = reactive({
selectedValue: "all_years", //
selectOptions: [
{
label: "All Years",
value: "all_years",
},
...Array.from({ length: 2025 - 1990 + 1 }, (_, i) => {
const year = 2025 - i;
return { label: String(year), value: String(year) };
}),
], //
inputValue: "", //
newsData: [
{
date: "May 30, 2025",
title: "FiEE, Inc. Announces Relisting on Nasdaq",
content:
'Hong Kong, May 30, 2025 — FiEE, Inc. ("FiEE, Inc." or the "Company"), a technology company integrating IoT, connectivity and AI to redefine brand management solutions...',
},
],
filterNewsData: [],
});
onMounted(() => {
state.filterNewsData = state.newsData;
});
const handleFilter = () => {
//
let filteredData = [...state.newsData];
//
if (state.selectedValue !== "all_years") {
filteredData = filteredData.filter((item) => {
// "May 30, 2025"
const dateMatch = item.date.match(/\b\d{4}\b/);
if (dateMatch) {
const year = dateMatch[0];
return year === state.selectedValue;
}
return false;
});
}
// title content
if (state.inputValue && state.inputValue.trim() !== "") {
const searchText = state.inputValue.toLowerCase().trim();
filteredData = filteredData.filter((item) => {
const titleMatch = item.title.toLowerCase().includes(searchText);
const contentMatch = item.content.toLowerCase().includes(searchText);
return titleMatch || contentMatch;
});
}
state.filterNewsData = filteredData;
};
// watcher
watch(
() => [state.selectedValue, state.inputValue],
() => {
handleFilter();
},
{ immediate: true }
);
const handleSearch = () => {
//
handleFilter();
console.log("筛选结果:", state.filterNewsData);
};
const handleNewClick = (item) => {
router.push({
path: "/news",
query: {
date: item.date,
},
});
};
</script>
<style scoped lang="scss">
.title {
font-size: 40px;
color: #333;
}
.search-container {
margin-bottom: 20px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 10px;
}
.search-select {
width: 7rem;
:deep(.n-base-selection) {
padding: 4px 0;
}
}
.search-input {
width: 240px;
}
:deep(.n-input) {
.n-input__input {
padding: 4px 0;
// border: 1px solid #ccc;
border-radius: 4px;
}
}
:deep(.n-select) {
.n-select__input {
padding: 8px 12px;
border: 1px solid #ccc;
border-radius: 4px;
}
}
:deep(.n-button) {
padding: 20px 16px;
border-radius: 4px;
}
</style>

View File

@ -4,7 +4,7 @@
<template #content>
<main class="p-[35px] max-w-[1200px] mx-auto">
<div class="title mb-[20px]">
{{ t('press_releases.title') }}
{{ t("press_releases.title") }}
</div>
<div class="search-container">
<n-select
@ -21,11 +21,29 @@
<n-button
type="primary"
@click="handleSearch"
class="search-button"
class="search-button w-[60px]"
>
{{ t('press_releases.search.button') }}
{{ t("press_releases.search.button") }}
</n-button>
</div>
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
<div class="news-item mt-[10px]">
<div class="news-item-date">{{ item.date }}</div>
<div
class="news-item-title text-[#0078d7] overflow-hidden whitespace-nowrap text-ellipsis cursor-pointer"
@click="handleNewClick(item)"
>
{{ item.title }}
</div>
<div class="news-item-content">
{{
item.content.length > 230
? item.content.substring(0, 230) + "..."
: item.content
}}
</div>
</div>
</div>
</main>
</template>
</customDefaultPage>
@ -33,32 +51,96 @@
</template>
<script setup>
import customDefaultPage from '@/components/customDefaultPage/index.vue'
import { reactive } from 'vue'
import { NSelect, NInput, NButton } from 'naive-ui'
import { useI18n } from 'vue-i18n'
import customDefaultPage from "@/components/customDefaultPage/index.vue";
import { reactive, onMounted, watch } from "vue";
import { NSelect, NInput, NButton } from "naive-ui";
import { useI18n } from "vue-i18n";
const { t } = useI18n()
import { useRouter } from "vue-router";
const router = useRouter();
const { t } = useI18n();
const state = reactive({
selectedValue: 'all_years', //
selectedValue: "all_years", //
selectOptions: [
{
label: 'All Years',
value: 'all_years',
label: "All Years",
value: "all_years",
},
...Array.from({ length: 2025 - 1990 + 1 }, (_, i) => {
const year = 2025 - i
return { label: String(year), value: String(year) }
})
const year = 2025 - i;
return { label: String(year), value: String(year) };
}),
], //
inputValue: '', //
})
inputValue: "", //
newsData: [
{
date: "May 30, 2025",
title: "FiEE, Inc. Announces Relisting on Nasdaq",
content:
'Hong Kong, May 30, 2025 — FiEE, Inc. ("FiEE, Inc." or the "Company"), a technology company integrating IoT, connectivity and AI to redefine brand management solutions...',
},
],
filterNewsData: [],
});
onMounted(() => {
state.filterNewsData = state.newsData;
});
const handleFilter = () => {
//
let filteredData = [...state.newsData];
//
if (state.selectedValue !== "all_years") {
filteredData = filteredData.filter((item) => {
// "May 30, 2025"
const dateMatch = item.date.match(/\b\d{4}\b/);
if (dateMatch) {
const year = dateMatch[0];
return year === state.selectedValue;
}
return false;
});
}
// title content
if (state.inputValue && state.inputValue.trim() !== "") {
const searchText = state.inputValue.toLowerCase().trim();
filteredData = filteredData.filter((item) => {
const titleMatch = item.title.toLowerCase().includes(searchText);
const contentMatch = item.content.toLowerCase().includes(searchText);
return titleMatch || contentMatch;
});
}
state.filterNewsData = filteredData;
};
// watcher
watch(
() => [state.selectedValue, state.inputValue],
() => {
handleFilter();
},
{ immediate: true }
);
const handleSearch = () => {
//
console.log('搜索:', state.inputValue)
}
//
handleFilter();
console.log("筛选结果:", state.filterNewsData);
};
const handleNewClick = (item) => {
router.push({
path: "/news",
query: {
date: item.date,
},
});
};
</script>
<style scoped lang="scss">

View File

@ -4,10 +4,10 @@
<template #content>
<main
class="p-[80px] mx-auto"
style="max-width: 100vw; min-width: 375px;"
style="max-width: 100vw; min-width: 285px"
>
<div class="title mb-[24px]">
{{ t('press_releases.title') }}
{{ t("press_releases.title") }}
</div>
<div class="search-container">
<n-select
@ -30,9 +30,27 @@
class="search-button"
:font-size="72"
>
{{ t('press_releases.search.button') }}
{{ t("press_releases.search.button") }}
</n-button>
</div>
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
<div class="news-item mt-[10px]">
<div class="news-item-date">{{ item.date }}</div>
<div
class="news-item-title text-[#0078d7] overflow-hidden whitespace-nowrap text-ellipsis cursor-pointer"
@click="handleNewClick(item)"
>
{{ item.title }}
</div>
<div class="news-item-content">
{{
item.content.length > 230
? item.content.substring(0, 230) + "..."
: item.content
}}
</div>
</div>
</div>
</main>
</template>
</customDefaultPage>
@ -40,32 +58,96 @@
</template>
<script setup>
import customDefaultPage from '@/components/customDefaultPage/index.vue'
import { reactive } from 'vue'
import { NSelect, NInput, NButton } from 'naive-ui'
import { useI18n } from 'vue-i18n'
import customDefaultPage from "@/components/customDefaultPage/index.vue";
import { reactive, onMounted, watch } from "vue";
import { NSelect, NInput, NButton } from "naive-ui";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
const { t } = useI18n()
const router = useRouter();
const { t } = useI18n();
const state = reactive({
selectedValue: 'all_years', //
selectedValue: "all_years", //
selectOptions: [
{
label: 'All Years',
value: 'all_years',
label: "All Years",
value: "all_years",
},
...Array.from({ length: 2025 - 1990 + 1 }, (_, i) => {
const year = 2025 - i
return { label: String(year), value: String(year) }
const year = 2025 - i;
return { label: String(year), value: String(year) };
}),
], //
inputValue: '', //
})
inputValue: "", //
newsData: [
{
date: "May 30, 2025",
title: "FiEE, Inc. Announces Relisting on Nasdaq",
content:
'Hong Kong, May 30, 2025 — FiEE, Inc. ("FiEE, Inc." or the "Company"), a technology company integrating IoT, connectivity and AI to redefine brand management solutions...',
},
],
filterNewsData: [],
});
onMounted(() => {
state.filterNewsData = state.newsData;
});
const handleFilter = () => {
//
let filteredData = [...state.newsData];
//
if (state.selectedValue !== "all_years") {
filteredData = filteredData.filter((item) => {
// "May 30, 2025"
const dateMatch = item.date.match(/\b\d{4}\b/);
if (dateMatch) {
const year = dateMatch[0];
return year === state.selectedValue;
}
return false;
});
}
// title content
if (state.inputValue && state.inputValue.trim() !== "") {
const searchText = state.inputValue.toLowerCase().trim();
filteredData = filteredData.filter((item) => {
const titleMatch = item.title.toLowerCase().includes(searchText);
const contentMatch = item.content.toLowerCase().includes(searchText);
return titleMatch || contentMatch;
});
}
state.filterNewsData = filteredData;
};
// watcher
watch(
() => [state.selectedValue, state.inputValue],
() => {
handleFilter();
},
{ immediate: true }
);
const handleSearch = () => {
//
console.log('搜索:', state.inputValue)
}
//
handleFilter();
console.log("筛选结果:", state.filterNewsData);
};
const handleNewClick = (item) => {
router.push({
path: "/news",
query: {
date: item.date,
},
});
};
</script>
<style scoped lang="scss">
@ -119,4 +201,29 @@ const handleSearch = () => {
padding: 20px 16px;
border-radius: 4px;
}
.news-item {
padding: 16px;
border-bottom: 1px solid #eee;
margin-bottom: 16px;
}
.news-item-date {
font-size: 72px;
color: #666;
margin-bottom: 8px;
}
.news-item-title {
font-size: 92px;
font-weight: bold;
margin-bottom: 8px;
line-height: 1.4;
}
.news-item-content {
font-size: 72px;
color: #333;
line-height: 1.6;
}
</style>

View File

@ -0,0 +1,192 @@
<template>
<div class="press-releases-page">
<customDefaultPage>
<template #content>
<main class="p-[35px] mx-auto" style="max-width: calc(100% - 100px)">
<div class="title mb-[20px]">
{{ t("press_releases.title") }}
</div>
<div class="search-container">
<n-select
:options="state.selectOptions"
v-model:value="state.selectedValue"
class="search-select"
/>
<n-input
v-model:value="state.inputValue"
type="text"
:placeholder="t('press_releases.search.placeholder')"
class="search-input"
/>
<n-button
type="primary"
@click="handleSearch"
class="search-button w-[120px]"
>
{{ t("press_releases.search.button") }}
</n-button>
</div>
<div v-for="(item, idx) in state.filterNewsData" :key="idx">
<div class="news-item mt-[10px]">
<div class="news-item-date">{{ item.date }}</div>
<div
class="news-item-title text-[#0078d7] overflow-hidden whitespace-nowrap text-ellipsis cursor-pointer"
@click="handleNewClick(item)"
>
{{ item.title }}
</div>
<div class="news-item-content">
{{
item.content.length > 230
? item.content.substring(0, 230) + "..."
: item.content
}}
</div>
</div>
</div>
</main>
</template>
</customDefaultPage>
</div>
</template>
<script setup>
import customDefaultPage from "@/components/customDefaultPage/index.vue";
import { reactive, onMounted, watch } from "vue";
import { NSelect, NInput, NButton } from "naive-ui";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
const router = useRouter();
const { t } = useI18n();
const state = reactive({
selectedValue: "all_years", //
selectOptions: [
{
label: "All Years",
value: "all_years",
},
...Array.from({ length: 2025 - 1990 + 1 }, (_, i) => {
const year = 2025 - i;
return { label: String(year), value: String(year) };
}),
], //
inputValue: "", //
newsData: [
{
date: "May 30, 2025",
title: "FiEE, Inc. Announces Relisting on Nasdaq",
content:
'Hong Kong, May 30, 2025 — FiEE, Inc. ("FiEE, Inc." or the "Company"), a technology company integrating IoT, connectivity and AI to redefine brand management solutions...',
},
],
filterNewsData: [],
});
onMounted(() => {
state.filterNewsData = state.newsData;
});
const handleFilter = () => {
//
let filteredData = [...state.newsData];
//
if (state.selectedValue !== "all_years") {
filteredData = filteredData.filter((item) => {
// "May 30, 2025"
const dateMatch = item.date.match(/\b\d{4}\b/);
if (dateMatch) {
const year = dateMatch[0];
return year === state.selectedValue;
}
return false;
});
}
// title content
if (state.inputValue && state.inputValue.trim() !== "") {
const searchText = state.inputValue.toLowerCase().trim();
filteredData = filteredData.filter((item) => {
const titleMatch = item.title.toLowerCase().includes(searchText);
const contentMatch = item.content.toLowerCase().includes(searchText);
return titleMatch || contentMatch;
});
}
state.filterNewsData = filteredData;
};
// watcher
watch(
() => [state.selectedValue, state.inputValue],
() => {
handleFilter();
},
{ immediate: true }
);
const handleSearch = () => {
//
handleFilter();
console.log("筛选结果:", state.filterNewsData);
};
const handleNewClick = (item) => {
router.push({
path: "/news",
query: {
date: item.date,
},
});
};
</script>
<style scoped lang="scss">
.title {
font-size: 40px;
color: #333;
}
.search-container {
margin-bottom: 20px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 25px;
}
.search-select {
width: 360px;
:deep(.n-base-selection) {
padding: 4px 0;
}
}
.search-input {
width: 360px;
}
:deep(.n-input) {
.n-input__input {
padding: 4px 0;
// border: 1px solid #ccc;
border-radius: 4px;
}
}
:deep(.n-select) {
.n-select__input {
padding: 8px 12px;
border: 1px solid #ccc;
border-radius: 4px;
}
}
:deep(.n-button) {
padding: 20px 16px;
border-radius: 4px;
}
</style>

View File

@ -12,7 +12,7 @@ getStockQuate()
<main 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">
<div class="text-8xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.change?.[0].slice(0,4) }}</div>
<div class="text-8xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.change?.slice(0,4) }}</div>
<div class="mt-8 text-2xl text-gray-500 font-semibold tracking-widest mb-8px">NASDAQ: <span class="text-black">MINM</span></div>
<div class="text-gray-500">{{ formatted }}</div>
</section>
@ -20,29 +20,29 @@ getStockQuate()
<section class="grid grid-cols-2 gap-12">
<div class="info-card">
<div class="text-base text-gray-400">Open</div>
<div class="text-2xl font-bold">{{ stockQuote.Open }}</div>
<div class="text-2xl font-bold">{{ stockQuote.open }}</div>
</div>
<div class="info-card">
<div class="text-base text-gray-400">Change</div>
<div class="text-3xl font-bold"
:class="stockQuote.change?.[1]?.startsWith('-') ? 'text-red-500' : (stockQuote.change?.[1]?.startsWith('+') ? 'text-green-500' : '')">
{{ stockQuote.change?.join('') }}</div>
:class="stockQuote.change?.includes('-') ? 'text-red-500' : (stockQuote.change?.includes('+') ? 'text-green-500' : '')">
{{ stockQuote.change }}</div>
</div>
<div class="info-card">
<div class="text-base text-gray-400">Day's Range</div>
<div class="text-2xl font-bold">{{ stockQuote.DaysRange }}</div>
<div class="text-2xl font-bold">{{ stockQuote.daysRange }}</div>
</div>
<div class="info-card">
<div class="text-base text-gray-400">52-Week Range</div>
<div class="text-2xl font-bold">{{ stockQuote.Week52Range }}</div>
<div class="text-2xl font-bold">{{ stockQuote.week52Range }}</div>
</div>
<div class="info-card">
<div class="text-base text-gray-400">Volume</div>
<div class="text-2xl font-bold">{{ stockQuote.Volume }}</div>
<div class="text-2xl font-bold">{{ stockQuote.volume }}</div>
</div>
<div class="info-card">
<div class="text-base text-gray-400">Market Cap</div>
<div class="text-2xl font-bold">{{ stockQuote.MarketCap }}</div>
<div class="text-2xl font-bold">{{ stockQuote.marketCap }}</div>
</div>
</section>
</main>

View File

@ -12,7 +12,7 @@ getStockQuate()
>
<!-- 左侧大号价格 -->
<section class="flex flex-col items-center justify-center glass-card p-32 rounded-2xl shadow-xl ">
<div class="text-9xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.change?.[0].slice(0,4) }}</div>
<div class="text-9xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.change?.slice(0,4) }}</div>
<div class="mt-10 text-3xl text-gray-500 font-semibold tracking-widest mb-10px">NASDAQ: <span class="text-black">MINM</span></div>
<div class="text-gray-500">{{ formatted }}</div>
</section>
@ -20,29 +20,32 @@ getStockQuate()
<section class="grid grid-cols-2 gap-16">
<div class="info-card">
<div class="text-lg text-gray-400">Open</div>
<div class="text-3xl font-bold">{{ stockQuote.Open }}</div>
<div class="text-3xl font-bold">{{ stockQuote.open }}</div>
</div>
<div class="info-card">
<div class="text-lg text-gray-400">Change</div>
<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' : '')">
{{ stockQuote.change?.join('') }}</div>
{{ stockQuote.change?.join('') }}</div> -->
<div class="text-3xl font-bold"
:class="stockQuote.change?.includes('-') ? 'text-red-500' : (stockQuote.change?.includes('+') ? 'text-green-500' : '')">
{{ stockQuote.change }}</div>
</div>
<div class="info-card">
<div class="text-lg text-gray-400">Day's Range</div>
<div class="text-3xl font-bold">{{ stockQuote.DaysRange }}</div>
<div class="text-3xl font-bold">{{ stockQuote.daysRange }}</div>
</div>
<div class="info-card">
<div class="text-lg text-gray-400">52-Week Range</div>
<div class="text-3xl font-bold">{{ stockQuote.Week52Range }}</div>
<div class="text-3xl font-bold">{{ stockQuote.week52Range }}</div>
</div>
<div class="info-card">
<div class="text-lg text-gray-400">Volume</div>
<div class="text-3xl font-bold">{{ stockQuote.Volume }}</div>
<div class="text-3xl font-bold">{{ stockQuote.volume }}</div>
</div>
<div class="info-card">
<div class="text-lg text-gray-400">Market Cap</div>
<div class="text-3xl font-bold">{{ stockQuote.MarketCap }}</div>
<div class="text-3xl font-bold">{{ stockQuote.marketCap }}</div>
</div>
</section>
</main>

View File

@ -8,7 +8,7 @@ getStockQuate();
<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">
<div class="text-4xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.change?.[0].slice(0,4) }}</div>
<div class="text-4xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.change?.slice(0,4) }}</div>
<div class="mt-2 text-sm text-gray-500 font-semibold tracking-widest mb-0px">NASDAQ: <span class="text-black">MINM</span></div>
<div class="text-gray-500 text-60px">{{ formatted }}</div>
</section>
@ -16,30 +16,30 @@ getStockQuate();
<section class="w-full max-w-90vw grid grid-cols-2 gap-2">
<div class="info-card">
<div class="text-xs text-gray-400">Open</div>
<div class="text-lg font-bold">{{ stockQuote.Open }}</div>
<div class="text-lg font-bold">{{ stockQuote.open }}</div>
</div>
<div class="info-card">
<div class="text-xs text-gray-400">Change</div>
<div class="text-lg font-bold"
:class="stockQuote.change?.[1]?.startsWith('-') ? 'text-red-500' : (stockQuote.change?.[1]?.startsWith('+') ? 'text-green-500' : '')">
{{ stockQuote.change?.join('') }}</div>
:class="stockQuote.change?.includes('-') ? 'text-red-500' : (stockQuote.change?.includes('+') ? 'text-green-500' : '')">
{{ stockQuote.change }}</div>
</div>
<div class="info-card">
<div class="text-xs text-gray-400">Day's Range</div>
<div class="text-lg font-bold">{{ stockQuote.DaysRange }}</div>
<div class="text-lg font-bold">{{ stockQuote.daysRange }}</div>
</div>
<div class="info-card">
<div class="text-xs text-gray-400">52-Week Range</div>
<div class="text-lg font-bold">{{ stockQuote.Week52Range }}</div>
<div class="text-lg font-bold">{{ stockQuote.week52Range }}</div>
</div>
<div class="info-card">
<div class="text-xs text-gray-400">Volume</div>
<div class="text-lg font-bold">{{ stockQuote.Volume }}</div>
<div class="text-lg font-bold">{{ stockQuote.volume }}</div>
</div>
<div class="info-card">
<div class="text-xs text-gray-400">Market Cap</div>
<div class="text-lg font-bold">{{ stockQuote.MarketCap }}</div>
<div class="text-lg font-bold">{{ stockQuote.marketCap }}</div>
</div>
</section>
</main>

View File

@ -12,7 +12,7 @@ getStockQuate();
<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">
<div class="text-5xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.change?.[0].slice(0,4) }}</div>
<div class="text-5xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">${{ stockQuote.change?.slice(0,4) }}</div>
<div class="mt-3 text-base text-gray-500 font-semibold tracking-widest mb-0px">NASDAQ: <span class="text-black">MINM</span></div>
<div class="text-gray-500 text-70px">{{ formatted }}</div>
</section>
@ -20,29 +20,29 @@ getStockQuate();
<section class="w-full max-w-80vw grid grid-cols-3 gap-4">
<div class="info-card">
<div class="text-sm text-gray-400">Open</div>
<div class="text-xl font-bold">{{ stockQuote.Open }}</div>
<div class="text-xl font-bold">{{ stockQuote.open }}</div>
</div>
<div class="info-card">
<div class="text-sm text-gray-400">Change</div>
<div class="text-xl font-bold"
:class="stockQuote.change?.[1]?.startsWith('-') ? 'text-red-500' : (stockQuote.change?.[1]?.startsWith('+') ? 'text-green-500' : '')">
{{ stockQuote.change?.join('') }}</div>
:class="stockQuote.change?.includes('-') ? 'text-red-500' : (stockQuote.change?.includes('+') ? 'text-green-500' : '')">
{{ stockQuote.change }}</div>
</div>
<div class="info-card">
<div class="text-sm text-gray-400">Day's Range</div>
<div class="text-xl font-bold">{{ stockQuote.DaysRange }}</div>
<div class="text-xl font-bold">{{ stockQuote.daysRange }}</div>
</div>
<div class="info-card">
<div class="text-sm text-gray-400">52-Week Range</div>
<div class="text-xl font-bold">{{ stockQuote.Week52Range }}</div>
<div class="text-xl font-bold">{{ stockQuote.week52Range }}</div>
</div>
<div class="info-card">
<div class="text-sm text-gray-400">Volume</div>
<div class="text-xl font-bold">{{ stockQuote.Volume }}</div>
<div class="text-xl font-bold">{{ stockQuote.volume }}</div>
</div>
<div class="info-card">
<div class="text-sm text-gray-400">Market Cap</div>
<div class="text-xl font-bold">{{ stockQuote.MarketCap }}</div>
<div class="text-xl font-bold">{{ stockQuote.marketCap }}</div>
</div>
</section>
</main>