Compare commits

..

22 Commits
master ... 2025

Author SHA1 Message Date
caishi ff175048a6 日程-换行不隐藏 2025-07-30 09:52:20 +08:00
caishi 34c8d196e8 日程 2025-07-28 14:20:00 +08:00
caishi 634925b8a6 2025 版本更新 2025-07-09 10:20:29 +08:00
caishi cc9fd46f3c 放开大会日程-默认图片修改 2025-07-02 19:03:41 +08:00
caishi fa07a17ca4 banner 适配小屏 2025-06-23 17:02:27 +08:00
caishi 9192c62ba8 Merge branch '2025' of https://gitlink.org.cn/Gitlink/meeting into 2025 2025-06-23 16:43:45 +08:00
caishi 759237a614 conflct 2025-06-23 16:43:24 +08:00
qiukai 6051acd007 往届回顾放开 2025-06-18 09:08:59 +08:00
qiukai 3e5ec84587 时间显示问题 2025-06-18 08:56:31 +08:00
qiukai ebe9b981b1 2025版调整 2025-06-17 17:11:33 +08:00
黄心宇 bf99d0c261 跳转修改 2025-06-16 20:03:07 +08:00
caishi a9fb130824 顺序 2025-05-12 17:23:47 +08:00
caishi 8f310d5326 地址配置 2025-05-12 11:01:33 +08:00
caishi 483e30c319 顺序 2025-05-12 10:59:55 +08:00
caishi 407e21b519 2025大会首页 2025-05-09 15:16:29 +08:00
黄心宇 e0c114e499 兼容新年分还没新增对应内容 2025-01-07 17:13:51 +08:00
caishi cd8ec4c8b2 文案+协办单位修改 2024-10-19 10:54:30 +08:00
caishi d6fc7943be 开源大会2024版 2024-09-18 15:12:51 +08:00
caishi 88be3f289d 2024开源大会-需求修改 2024-08-22 15:18:07 +08:00
caishi c9838db137 2024版开源大会-初始 2024-08-16 14:15:06 +08:00
黄心宇 8fe7bfb207 兼容往年版本 2024-08-02 17:16:28 +08:00
黄心宇 29556da4a9 2024仅开放首页 2024-06-19 11:27:52 +08:00
74 changed files with 2551 additions and 218 deletions

View File

@ -2,13 +2,17 @@ import { defineConfig } from "umi";
export default defineConfig({
routes: [
{ path: '/', component: 'homePage' },
// { path: '/', component: 'v2025/homepage' },
// 2024 年版本链接
{ path: '/', component: 'home' },
{ path: "/organization", component: "organization" },
{ path: "/information", component: "information" },
{ path: "/information/detail/:id", component: "information/detail" },
{ path: "/contact", component: "information/detail" },
{ path: "/register", component: "information/detail" },
{ path: "/docs", component: "docs" },
{ path: "/register", component: "meetingInfos/detail" },
{ path: "/guide", component: "meetingInfos/detail" },
{ path: "/information", component: "meetingInfos" },
{ path: "/exhibition", component: "exhibition" },
{ path: "/forum", component: "home/specialForum" },
{ path: "/information/detail/:id", component: "meetingInfos/detail" },
],
npmClient: 'pnpm',
alias: {
@ -17,7 +21,8 @@ export default defineConfig({
},
proxy: {
'/api': {
'target': 'https://testgetway.trustie.net/',
// 'target': 'https://testgetway.trustie.net/',
'target': 'https://gateway.gitlink.org.cn/',
'changeOrigin': true,
// 'pathRewrite': { '^/api' : '' },
},

37
package-lock.json generated
View File

@ -14,6 +14,8 @@
"js-base64": "^3.7.5",
"katex": "^0.16.8",
"marked": "1.2.9",
"react-slick": "^0.30.2",
"slick-carousel": "^1.8.1",
"swiper": "^9.4.1",
"umi": "^4.0.71"
},
@ -7632,6 +7634,11 @@
"node": ">=10.13.0"
}
},
"node_modules/enquire.js": {
"version": "2.1.6",
"resolved": "https://registry.npmmirror.com/enquire.js/-/enquire.js-2.1.6.tgz",
"integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw=="
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
@ -10155,6 +10162,12 @@
"node": ">=10"
}
},
"node_modules/jquery": {
"version": "3.7.1",
"resolved": "https://registry.npmmirror.com/jquery/-/jquery-3.7.1.tgz",
"integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
"peer": true
},
"node_modules/js-base64": {
"version": "3.7.5",
"resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.5.tgz",
@ -13005,6 +13018,22 @@
"react": ">=15"
}
},
"node_modules/react-slick": {
"version": "0.30.2",
"resolved": "https://registry.npmmirror.com/react-slick/-/react-slick-0.30.2.tgz",
"integrity": "sha512-XvQJi7mRHuiU3b9irsqS9SGIgftIfdV5/tNcURTb5LdIokRA5kIIx3l4rlq2XYHfxcSntXapoRg/GxaVOM1yfg==",
"dependencies": {
"classnames": "^2.2.5",
"enquire.js": "^2.1.6",
"json2mq": "^0.2.0",
"lodash.debounce": "^4.0.8",
"resize-observer-polyfill": "^1.5.0"
},
"peerDependencies": {
"react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/reactcss": {
"version": "1.2.3",
"resolved": "https://registry.npmmirror.com/reactcss/-/reactcss-1.2.3.tgz",
@ -13688,6 +13717,14 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"peer": true
},
"node_modules/slick-carousel": {
"version": "1.8.1",
"resolved": "https://registry.npmmirror.com/slick-carousel/-/slick-carousel-1.8.1.tgz",
"integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
"peerDependencies": {
"jquery": ">=1.8.0"
}
},
"node_modules/sonic-boom": {
"version": "2.8.0",
"resolved": "https://registry.npmmirror.com/sonic-boom/-/sonic-boom-2.8.0.tgz",

View File

@ -17,6 +17,8 @@
"js-base64": "^3.7.5",
"katex": "^0.16.8",
"marked": "1.2.9",
"react-slick": "^0.30.2",
"slick-carousel": "^1.8.1",
"swiper": "^9.4.1",
"umi": "^4.0.71"
},

View File

@ -29,6 +29,12 @@ dependencies:
marked:
specifier: 1.2.9
version: 1.2.9
react-slick:
specifier: ^0.30.2
version: 0.30.3(react-dom@18.2.0)(react@18.2.0)
slick-carousel:
specifier: ^1.8.1
version: 1.8.1(jquery@3.7.1)
swiper:
specifier: ^9.4.1
version: 9.4.1
@ -2398,6 +2404,7 @@ packages:
/@humanwhocodes/config-array@0.11.10:
resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==}
engines: {node: '>=10.10.0'}
deprecated: Use @eslint/config-array instead
dependencies:
'@humanwhocodes/object-schema': 1.2.1
debug: 4.3.4(supports-color@5.5.0)
@ -2413,6 +2420,7 @@ packages:
/@humanwhocodes/object-schema@1.2.1:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
deprecated: Use @eslint/object-schema instead
dev: false
/@iconify/types@2.0.0:
@ -3086,7 +3094,7 @@ packages:
'@types/history': 4.7.11
'@types/react': 18.2.13
'@types/react-router': 5.1.20
redux: 3.7.2
redux: 4.2.1
dev: true
/@types/react-router@5.1.20:
@ -3630,7 +3638,7 @@ packages:
axios: 0.27.2
babel-plugin-import: 1.13.6
dayjs: 1.11.8
dva-core: 2.0.4(redux@3.7.2)
dva-core: 2.0.4(redux@4.2.1)
dva-immer: 1.0.1(dva@2.5.0-beta.2)
dva-loading: 3.0.24(dva-core@2.0.4)
event-emitter: 0.3.5
@ -3948,6 +3956,7 @@ packages:
/acorn-import-assertions@1.9.0(acorn@8.9.0):
resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==}
deprecated: package has been renamed to acorn-import-attributes
peerDependencies:
acorn: ^8
dependencies:
@ -4989,6 +4998,7 @@ packages:
/debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
requiresBuild: true
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
@ -5212,7 +5222,7 @@ packages:
warning: 3.0.0
dev: true
/dva-core@2.0.4(redux@3.7.2):
/dva-core@2.0.4(redux@4.2.1):
resolution: {integrity: sha512-Zh39llFyItu9HKXKfCZVf9UFtDTcypdAjGBew1S+wK8BGVzFpm1GPTdd6uIMeg7O6STtCvt2Qv+RwUut1GFynA==}
peerDependencies:
redux: 4.x
@ -5222,7 +5232,7 @@ packages:
global: 4.4.0
invariant: 2.2.4
is-plain-object: 2.0.4
redux: 3.7.2
redux: 4.2.1
redux-saga: 0.16.2
warning: 3.0.0
dev: true
@ -5243,7 +5253,7 @@ packages:
dva-core: ^1.1.0 || ^1.5.0-0 || ^1.6.0-0
dependencies:
'@babel/runtime': 7.21.0
dva-core: 2.0.4(redux@3.7.2)
dva-core: 2.0.4(redux@4.2.1)
dev: true
/dva@2.5.0-beta.2(react-dom@18.2.0)(react@18.2.0):
@ -5320,6 +5330,10 @@ packages:
tapable: 2.2.1
dev: false
/enquire.js@2.1.6:
resolution: {integrity: sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==}
dev: false
/entities@2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
dev: false
@ -5596,6 +5610,7 @@ packages:
/eslint@8.43.0:
resolution: {integrity: sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
hasBin: true
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0)
@ -6824,6 +6839,10 @@ packages:
supports-color: 8.1.1
dev: false
/jquery@3.7.1:
resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==}
dev: false
/js-base64@3.7.5:
resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==}
dev: false
@ -7081,7 +7100,6 @@ packages:
/lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
dev: true
/lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
@ -7290,6 +7308,7 @@ packages:
/ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
requiresBuild: true
dev: false
optional: true
@ -8271,6 +8290,7 @@ packages:
/prr@1.0.1:
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
requiresBuild: true
dev: false
optional: true
@ -9110,6 +9130,21 @@ packages:
react: 18.2.0
dev: false
/react-slick@0.30.3(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-B4x0L9GhkEWUMApeHxr/Ezp2NncpGc+5174R02j+zFiWuYboaq98vmxwlpafZfMjZic1bjdIqqmwLDcQY0QaFA==}
peerDependencies:
react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
dependencies:
classnames: 2.3.2
enquire.js: 2.1.6
json2mq: 0.2.0
lodash.debounce: 4.0.8
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
resize-observer-polyfill: 1.5.1
dev: false
/react@18.1.0:
resolution: {integrity: sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==}
engines: {node: '>=0.10.0'}
@ -9344,6 +9379,7 @@ packages:
/rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
dependencies:
glob: 7.2.3
@ -9416,6 +9452,7 @@ packages:
/sax@1.2.4:
resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
requiresBuild: true
dev: false
optional: true
@ -9540,6 +9577,14 @@ packages:
is-fullwidth-code-point: 3.0.0
dev: false
/slick-carousel@1.8.1(jquery@3.7.1):
resolution: {integrity: sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==}
peerDependencies:
jquery: '>=1.8.0'
dependencies:
jquery: 3.7.1
dev: false
/sonic-boom@2.8.0:
resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==}
dependencies:

View File

@ -1,4 +1,17 @@
@font-face {
font-family: Alimama ShuHeiTi;
src: url(../font/AlimamaShuHeiTi-Bold.ttf);
}
@font-face {
font-family: Alibaba PuHuiTi;
src: url(../font/ALIBABA-PUHUITI-MEDIUM.TTF);
}
@font-face {
font-family: YouSheBiaoTiHei;
src: url(../font/YouSheBiaoTiHei-2.ttf);
}
@font-face {
font-family: RuiZiYunZiKuXingKaiGB;
src: url(../font/RuiZiYunZiKuXingKaiGB-2.ttf);
}

View File

@ -30,6 +30,7 @@
box-sizing: border-box;
min-width: 200px;
margin: 0 auto;
background-color: #F8F9FF;
}
@media (max-width: 767px) {

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
public/image/b_qr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

BIN
src/assets/img2024/box.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

BIN
src/assets/img2024/left.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

BIN
src/assets/img2025/back.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

BIN
src/assets/img2025/left.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@ -8,7 +8,7 @@ function MemberItem(props) {
{
data.name && <>
<img src={ data.imageUrl } alt="" className="head-img"/>
<span className="task-hide">{ data.name }</span>
<span className="task-hide guestName"><span>{ data.name }</span></span>
<Tooltip title={ data.introduction }>
<p className="task-hide-2">{ data.introduction }</p>
</Tooltip>

View File

@ -7,6 +7,7 @@
align-items: center;
border-bottom: 1.5px solid linear-gradient(90deg,#08428e 0%,#019765 100%);
margin-bottom: 35px;
margin: 0px 50px 32px 50px!important;
.head-img {
width: 200px;
height: 250px;
@ -14,18 +15,24 @@
object-fit: cover;
background-color: #B6B6BB;
}
span {
&>span {
height: 29px;
line-height: 29px;
min-width: 84px;
position: absolute;
bottom: 66px;
left: 2px;
width: 196px;
bottom: 78px;
left: -42px;
background: linear-gradient(#2AAC62 0%, #3B80BD 48%, #5E33C4 100%);
font-weight: 700;
color: #ffffff;
font-size: 18px;
line-height: 40px;
background-image:linear-gradient(180deg,rgba(0, 0, 0, 0) 0%,rgba(0, 0, 0, 0.47) 100%);
text-align: center;
padding: 0 10px;
transform: skew(-18deg);
span{
transform: skew(20deg);
display: block;
}
}
p {
margin-top: 15px;
@ -39,6 +46,6 @@
bottom: -5px;
width: 100%;
height: 1.5px;
background-image: linear-gradient(90deg,#08428e 0%,#019765 100%);
background: linear-gradient( 225deg, #2AAC62 0%, #3B80BD 48%, #5E33C4 100%);
}
}

95
src/constants/equity.js Normal file
View File

@ -0,0 +1,95 @@
const str = "<li>以钻石赞助单位身份参与大会的组织活动</li><li>副总裁或以上层级领导担任开幕式主论坛Keynote speaker 演讲时长15分钟</li>"
+"<li>可在主论坛上进行重要发布</li>"
+"<li>大会所有对外宣传提及钻石赞助单位名称</li>"
+"<li>享有晚宴独家冠名</li>"
+"<li>晚宴开始前及间隙播放钻石赞助单位宣传片</li>"
+"<li>在本次会议当日晚宴中邀请一位钻石赞助单位代表入座主桌并在本次会议晚宴上提供给钻石赞助单位10分钟演讲机会主要介绍本单位技术、成果、产品、解决方案等内容演讲顺序优先</li>"
+"<li>获得在本次大会举办两场专题技术研讨会(分论坛/专场)的机会,可按需求定内容,主办方负责该会场常规费用包括:场租、投影设备以及配套服务</li>"
+"<li>主办方为钻石赞助单位专题技术研讨会(分论坛/专场)演讲专家提供免费注册资格(差旅自理),并按照大会嘉宾同等待遇安排接送机</li>"
+"<li>钻石赞助单位可冠名该专题技术研讨会(分论坛/专场)</li>"
+"<li>会议开场前或中场休息时循环播放钻石赞助单位提供的企业宣传视频视频内容需主办方确认限3分钟内内容会务组提前审核</li>"
+"<li>该分论坛的直播画面右下方即会议背景板上出现钻石赞助单位LOGO</li>"
+"<li>主论坛主KV出现钻石赞助单位名字或LOGO放在赞助单位第一位</li>"
+"<li>大会会议纸袋印制钻石赞助单位名字或LOGO</li>"
+"<li>会议资料袋中装入宣传资料(需赞助单位自行准备资料)</li>"
+"<li>8位嘉宾大会期间享受VIP待遇贵宾接送机、免食宿跨城差旅费用自理优先安排</li>"
+"<li>大会报名系统进行特别设置,甄别参加分论坛代表信息</li>"
+"<li>会议网页和启智社区微信公众号对钻石赞助单位相关信息进行发布</li>"
+"<li>会议网页及启智社区官网设置钻石赞助单位网站链接</li>"
+"<li>会议网页放置钻石赞助单位banner广告</li>";
const str1 = "<li>以铂金赞助单位身份参与大会的组织活动</li><li>副总裁或以上层级领导担任第二场主论坛Keynote speaker 演讲时长15分钟</li>"
+"<li>在本次会议当日晚宴中邀请一位铂金赞助单位代表入座2号桌并在本次会议晚宴上提供给铂金赞助单位10分钟演讲机会主要介绍本单位技术、成果、产品、解决方案等内容</li>"
+"<li>获得在本次大会举办一场专题技术研讨会(分论坛/专场)的机会,可按需求定内容,主办方负责该会场常规费用包括:场租、投影设备以及配套服务</li>"
+"<li>主办方为铂金单位专题技术研讨会(分论坛/专场)专家提供免费注册资格(差旅自理),并按照大会嘉宾同等待遇安排接送机</li>"
+"<li>铂金赞助单位可冠名该专题技术研讨会(分论坛/专场)</li>"
+"<li>铂金赞助单位专题技术研讨会(分论坛/专场)开始前及间隙播放视频影像宣传资料</li>"
+"<li>该专题技术研讨会(分论坛/专场的直播画面右下方即会议背景板上出现铂金赞助单位LOGO</li>"
+"<li>在会议手册上放置铂金赞助单位宣传信息(限于文字及图片)的机会,由主办方进行统一排版</li>"
+"<li>会议开场前或中场休息时循环播放铂金单位提供的企业宣传视频视频内容需主办方确认限3分钟内内容会务组提前审核</li>"
+"<li>主论坛主KV出现铂金赞助单位名字或LOGO</li>"
+"<li>大会会议纸袋印制铂金赞助单位名字或LOGO</li>"
+"<li>会议资料袋中装入宣传资料(需赞助单位自行准备资料)</li>"
+"<li>主论坛开始前及间隙(茶歇及午间)播放铂金赞助单位视频影像宣传资料</li>"
+"<li>5位嘉宾大会期间享受VIP待遇贵宾接送机、免食宿跨城差旅费用自理优先安排贵宾座次</li>"
+"<li>铂金赞助单位可获得20个本次会议免注册费参会名额差旅费用自理</li>"
+"<li>铂金赞助单位可获得2个标准展位</li>"
+"<li>通过专业媒体渠道/开发者社群宣传专场相关信息,为铂金赞助单位分论坛吸引专业听众或开发者造势</li>"
+"<li>大会会刊插页广告</li>"
+"<li>会议网页及启智社区官网设置铂金赞助单位网站链接</li>";
+"<li>会议网页和启智社区微信公众号对钻石赞助单位相关信息进行发布</li>"
+"<li>大会报名系统进行特别设置,甄别参加分论坛代表信息</li>"
+"<li>优先得到启智社区培训资源/启智集结号资源支持,推动协办单位相关项目进高校,与高校课堂结合</li>";
const str2 = "<li>以黄金赞助单位身份参与大会的组织活动</li><li>在本次会议当日晚宴中邀请一位黄金赞助单位代表入座2号桌并在本次会议晚宴上提供给黄金赞助单位10分钟演讲机会主要介绍本单位技术、成果、产品、解决方案等内容</li>"
+"<li>获得在本次大会举办一场专题技术研讨会(分论坛/专场)的机会,可按需求定内容,主办方负责该会场常规费用包括:场租、投影设备以及配套服务</li>"
+"<li>主办方为黄金单位专题技术研讨会(分论坛/专场)专家提供免费注册资格(差旅自理)</li>"
+"<li>在会议手册上放置黄金赞助单位宣传信息(限于文字及图片)的机会,由主办方进行统一排版</li>"
+"<li>主论坛主KV出现黄金赞助单位名字或LOGO</li>"
+"<li>大会会议纸袋印制黄金赞助单位名字或LOGO</li>"
+"<li>会议资料袋中装入宣传资料(需赞助单位自行准备资料)</li>"
+"<li>2位嘉宾大会期间享受VIP待遇贵宾接送机、免食宿跨城差旅费用自理优先安排贵宾座次</li>"
+"<li>黄金赞助单位可获得10个本次会议免注册费参会名额差旅费用自理</li>"
+"<li>黄金赞助单位可获得1个标准展位</li>"
+"<li>大会会刊插页广告</li>"
+"<li>会议网页及启智社区官网设置钻石赞助单位网站链接</li>"
+"<li>优先得到启智社区培训资源/启智集结号资源支持,推动协办单位相关项目进高校,与高校课堂结合</li>";
const str3 = "<li>享有晚宴独家冠名权</li><li>晚宴开始前及间隙播放晚宴赞助单位宣传片</li>"
+"<li>在本次会议当日晚宴中邀请一位晚宴赞助单位代表入座主桌并在本次会议晚宴上提供给晚宴赞助单位10分钟演讲机会主要介绍本单位技术、成果、产品、解决方案等内容演讲顺序优先</li>"
+"<li>获得在会议手册上放置晚宴赞助单位宣传信息(限于文字及图片)的机会,由主办方进行统一排版</li>"
+"<li>主论坛主KV赞助单位名单上出现晚宴赞助单位名字或LOGO</li>"
+"<li>大会会议纸袋印制晚宴赞助单位名字或LOGO</li>"
+"<li>2位嘉宾大会期间享受VIP待遇贵宾接送机、免食宿跨城差旅费用自理优先安排贵宾座次</li>"
+"<li>可获得5个本次会议免注册费参会名额差旅费用自理</li>"
+"<li>可获得1个大会标准展位</li>";
const str4 = "<li>以白银赞助单位身份参与大会的组织活动</li><li>在本次会议当日晚宴中邀请一位白银赞助单位代表出席晚宴</li>"
+"<li>获得在本次大会举办一场专题技术研讨会(分论坛/专场)的机会,可按需求定内容,主办方负责该会场常规费用包括:场租、投影设备以及配套服务</li>"
+"<li>主办方为白银赞助单位专题技术研讨会(分论坛/专场)专家提供免费注册资格(差旅自理)</li>"
+"<li>获得在会议手册上放置白银赞助单位宣传信息(限于文字及图片)的机会,由主办方进行统一排版</li>"
+"<li>主论坛主KV出现白银赞助单位名字或LOGO</li>"
+"<li>赞助单位可获得5个本次会议免注册费参会名额差旅费用自理</li>"
+"<li>可获得5个本次会议免注册费参会名额差旅费用自理</li>"
+"<li>大会会刊插页广告</li>";
export const cate =[
{
name:"钻石赞助单位",money:"150",str:str
},
{
name:"铂金赞助单位",money:"100",str:str1
},
{
name:"黄金赞助单位",money:"50",str:str2
},
{
name:"晚宴独家赞助单位",money:"50",str:str3
},
{
name:"白银独家赞助单位",money:"25",str:str4
}
]

View File

@ -1,36 +1,54 @@
export const menu = [
{
name: '首页',
link: ''
},
{
name: '组织机构',
link: 'organization'
},
{
name: '大会资讯',
link: 'information'
},
// {
// name: '组织机构',
// link: 'organization'
// },
// {
// name: '专题论坛',
// link: 'forum'
// },
{
name: '参会注册',
link: 'register'
},
{
name: '会议指南',
link: 'guide'
},
// {
// name: '赞助展览',
// link: 'exhibition'
// },
// {
// name: '会议资讯',
// link: 'information'
// },
{
name: '往届回顾',
link: '/',
showSubMenu: true,
history: [{ year: 2022, link: 'https://chinaosc.ccf.org.cn/2022/'}]
history: [
{ year: 2024, link: 'https://chinaosc.ccf.org.cn/2024'},
{ year: 2023, link: 'https://chinaosc.ccf.org.cn/2023'},
{ year: 2022, link: 'https://chinaosc.ccf.org.cn/2022'},
]
},
{
name: '联系我们',
link: 'contact'
}
// {
// name: '联系我们',
// link: 'contact'
// }
]
export const defaultPage = {
'/register': 300,
'/contact': 299
'/register': 931,
'/contact': 299,
'/guide': 988,
}
export const information = {
@ -59,7 +77,59 @@ export const information = {
}
]
}
export const information2024 = {
title: '会议资讯',
desc: '',
category: [
{
title: '最新动态',
eng: 'news',
anchor: 'forum',
},
// {
// title: '会议指南',
// eng: 'Conference Guide',
// anchor: 'guide',
// },
{
title: '会议通知',
eng: 'Meeting Notice',
anchor: 'notice',
},
{
title: '新闻宣传',
eng: 'Publicity',
anchor: 'news',
}
]
}
export const exhibition = {
title: '赞助展览',
desc: '',
category: [
{
title: '条件要求',
eng: 'Condition requirements',
anchor: 'comdition',
},
{
title: '赞助等级与权益',
eng: 'Sponsorship level benefits',
anchor: 'grade',
},
{
title: '展览信息',
eng: 'exhibition information',
anchor: 'notice',
},
{
title: '组委会联系方式',
eng: 'contact information',
anchor: 'info',
}
]
}
export const homePage = [
{
title: '会议议程',
@ -80,6 +150,10 @@ export const homePage = [
]
export const agendaDateList = ['10月21日', '10月22日']
export const fourBeginTime = '2025-08-02 09:00'
export const fourDate = ['8月1日', '8月2日', '8月3日']
export const fourDateId = [945, 946]
export const docId = [1021,947, 984]
export const meetingAgenda = {
tencentMeeting: {
@ -97,8 +171,18 @@ export const meetingAgenda = {
}
export const config = {
zoneKey: 'kydhgw',
zoneId: 6,
'2023': {
zoneKey: 'kydhgw',
zoneId: 6,
},
'2024': {
zoneKey: 'china2024osc',
zoneId: 29
},
'2025': {
zoneKey: 'china2025osc',
zoneId: 33
}
}
export const hidenMemberType = ['与会嘉宾', '院士嘉宾']

View File

@ -1,39 +1,52 @@
import style from './index.module.less'
import QRCode from 'img/w_qr.png'
import BRCode from 'img/b_qr.png'
import beiAn from 'img/beian.png'
function Footer(){
return (
<div className={style.footer}>
<div className={style.footerContent}>
<div className={style.host}>
<span>主办单位</span>
<span>中国计算机学会</span>
{/* <span></span>
<span>鹏城实验室</span>
<span>AITISA联盟</span> */}
</div>
<div className={style.host}>
<span>承办单位</span>
<span>CCF开源发展委员会</span>
<span>鹏城实验室</span>
<span>新一代人工智能产业技术创新战略联盟AITISA</span>
</div>
<div className={style.host}>
<span>协办单位</span>
<span>华为技术有限公司</span>
<span>中电金信软件有限公司</span>
{/* <span></span>
<span>华为昇腾开源社区</span>
<span>昇思MindSpore开源社区</span> */}
</div>
{/* <div className={style.host}>
<span></span>
<span>Datawhale开源社区</span>
<span>燧原科技</span>
<span>天数智芯</span>
</div> */}
<div className={style.qrCode}>
<div>
<img src={QRCode} alt="" />
<img src={BRCode} alt="" />
</div>
<span>CCF官方公众号</span>
<span>报名参会</span>
</div>
{/* <div className={ style.qrCode }>
<div className={ style.qrCode }>
<div>
<img src="http://fpoimg.com/200x200" alt="" />
</div>
<span>CCF官方公众号</span>
</div> */}
<div className={style.host}>
<span>主办单位</span>
<span>中国计算机学会</span>
<span>开放原子开源基金会</span>
</div>
<div className={style.host}>
<span>承办单位</span>
<span>国防科技大学计算机学院</span>
<span>湖南先进技术研究院</span>
<span>CCF开源发展委员会</span>
</div>
<div className={style.host}>
<span>协办单位</span>
<span>中国电子信息产业集团有限公司</span>
<span>长沙市国链安全可靠计算机产业促进中心</span>
<img src={QRCode} alt="" />
</div>
<span>官方公众号</span>
</div>
</div>
<div className={style.copyright}>
<a href="https://beian.miit.gov.cn/" target="_blank">京ICP备13000930号-4</a>
@ -42,7 +55,7 @@ function Footer(){
target="_blank"
href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802032778"
>
京公网安备11010802032778号
京公网安备 11010802032778
</a>
</div>
</div>

View File

@ -1,8 +1,7 @@
import { useEffect , useState } from 'react';
import { Link, useLocation } from 'umi';
import { Link, useLocation, useModel } from 'umi';
import { menu } from '../constants/info'
import style from './index.module.less'
import icon from '../favicon.png'
import { throttle } from '../utils/util'
@ -10,11 +9,13 @@ function Header(){
const location = useLocation();
const [showSubMenu, setShowSubMenu] = useState(false)
const [ headerOpacity, setHeaderOpacity ] = useState( location.pathname === '/' ? 0.35 : 1)
const { isCurrent } = useModel('defaultConfig')
const matchItem = (item) => {
return item === location.pathname.split('/')[1]
}
useEffect(()=>{
if (location.pathname === '/') {
window.addEventListener('scroll', throttleHandleScroll);
@ -46,22 +47,36 @@ function Header(){
{
menu && menu.length > 0 && menu.map((item, key) => {
return (
<li key={key}
className={`${matchItem(item.link) ? `${style.menuItem} ${style.menuItemActive}` : style.menuItem}`}
onMouseOver={ () => { item.showSubMenu && setShowSubMenu( true ) } }
onMouseOut={ () => { item.showSubMenu && setShowSubMenu( false ) } }
>
<Link to={`/${item.link}`}>{ item.name }</Link>
{
item.history && <ul className={ `${ style.dropDown } ${ showSubMenu ? style.dropDownShow : '' }` } style={{ height : showSubMenu ? `${ item.history.length * 46}px` : 0 }}>
{
item.history.map((e => {
return <li className={ style.dropDownItem } key={ e.year }><a href={ e.link } target="_blank">{e.year}</a></li>
}))
}
</ul>
<>
{!item.history && <li key={key}
className={`${matchItem(item.link) ? `${style.menuItem} ${style.menuItemActive}` : style.menuItem}`}
onMouseOver={ () => { item.showSubMenu && setShowSubMenu( true ) } }
onMouseOut={ () => { item.showSubMenu && setShowSubMenu( false ) } }
>
<Link to={`/${ !isCurrent ? `/2023/${item.link}` : item.link}`}>{ item.name }</Link>
{/* {
item.history &&
<ul className={ `${ style.dropDown } ${ showSubMenu ? style.dropDownShow : '' }` } style={{ height : showSubMenu ? `${ item.history.length * 46}px` : 0 }}>
{
item.history.map((e => {
return <li className={ style.dropDownItem } key={ e.year }><a href={ e.link } target="_blank">{e.year}</a></li>
}))
}
</ul>
} */}
</li>}
{item.history &&
item.history.map((e => {
return <li key={key}
className={style.menuItem}z
>
<a href={e.link} target="_blank">{e.year}年大会</a>
</li>
// <li className={ style.dropDownItem } key={ e.year }><a href={ e.link } target="_blank">{e.year}</a></li>
}))
}
</li>
</>
)
})
}

View File

@ -5,23 +5,22 @@ import "github-markdown-css/github-markdown-light.css"
const { Content } = Layout;
import Header from './header'
import Footer from './footer'
import { Outlet, useLocation } from 'umi'
import { Outlet, useLocation, useModel } from 'umi'
const App = () => {
const location = useLocation();
const { isCurrent } = useModel('defaultConfig')
return (
<Layout className={ style.layout }>
<Header
>
</Header>
<Header/>
<Content className={ style.layoutContent }>
<div className={ style.siteLayoutContent } style={{ paddingTop: location.pathname === '/' ? '0' : '68px' }}>
<Outlet/>
</div>
</Content>
<Footer></Footer>
{/* <Footer></Footer> */}
</Layout>
);
};

View File

@ -9,12 +9,12 @@ html body {
z-index: 1000;
top: 0;
display: flex;
height:68px;
height:64px;
width: 100%;
align-items: center;
background-color:rgba(27, 62, 154);
box-shadow:0px 3px 6px rgba(56, 70, 87, 0.16);
padding-left: 360px;
padding-left: 25%;
color:#ffffff;
font-size:15px;
.headerInfo {
@ -53,7 +53,7 @@ html body {
position: absolute;
width: 100%;
left: 0;
top: 68px;
top: 64px;
background-color: #ffffff;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
@ -87,7 +87,7 @@ html body {
}
.siteLayoutContent {
// padding-bottom: 60px;
background: #ffffff;
background: #F2F5FF;
flex-grow: 1;
display: flex;
flex-direction: column;
@ -96,7 +96,7 @@ html body {
padding: 0;
height: 383px;
width: 100%;
background: #1f2534 url('img/footer-bg.png') no-repeat;
background: #1f2534 url('../assets/img2024/footer.png') no-repeat;
background-size: 100% 100%;
color: #ffffff;
display: flex;
@ -107,30 +107,29 @@ html body {
width: 1200px;
display: flex;
flex: 1;
margin-top: 50px;
margin-top: 70px;
.qrCode {
display: flex;
flex-direction: column;
margin-right: 80px;
margin-right: 50px;
align-items: center;
&:last-child {
margin-right: 70px;
margin-right: 0px;
}
div {
width: 200px;
height: 200px;
background: url('img/qr-bg.png') no-repeat;
background-size: 100% 100%;
width: 150px;
height: 150px;
display: flex;
align-items: center;
justify-self: center;
border-radius: 4px 4px 4px 4px;
border: 1px dashed rgba(255,255,255,0.42);
background: rgba(202,218,239,0.17);
img {
margin: auto;
width: 176px;
height: 176px;
background-image: linear-gradient(180deg,#bfd0ec 0%,#ffffff 100%);
border-radius: 4px;
padding: 10px;
width: 94%;
}
}
span {
@ -142,7 +141,7 @@ html body {
.host {
display: flex;
flex-direction: column;
margin-right: 125px;
margin-right: auto;
span {
opacity: 77%;
color: #ffffff;
@ -154,6 +153,7 @@ html body {
font-weight: 700;
color: #ffffff;
font-size: 16px;
height: 16px;
}
}
@ -176,4 +176,12 @@ html body {
display: flex;
flex-direction: column;
}
}
@media screen and (max-width: 1200px) {
.layout {
.header {
padding-left: 70px;
}
}
}

View File

@ -1,9 +1,12 @@
import { useState, useEffect } from 'react';
import { getDirList } from '../utils/request/api';
import { extractYear } from '../utils/util'
export default function Page() {
const [dirList, setDirList] = useState({});
const [isCurrent, setIsCurrent] = useState(false);
const urlYear = extractYear(window.location.pathname)
useEffect(() => {
getDirList().then((res) => {
if (res && res.rows.length > 0) {
@ -11,13 +14,18 @@ export default function Page() {
res.rows.map(e => {
idList[e.name] = e.id
})
console.log(idList)
setDirList(idList);
}
});
setIsCurrent( isCurrentYear(urlYear) )
}, []);
const isCurrentYear = (year) => {
const currentYear = new Date().getFullYear();
return year == currentYear;
}
return {
dirList,
dirList, isCurrent
};
};

View File

@ -0,0 +1,101 @@
import './index.less'
import '../home/index.less'
import { useState , useEffect } from 'react';
import { exhibition } from '../../constants/info';
import { cate } from '../../constants/equity';
function Index() {
const [ anchorName , setAnchorName ] = useState("comdition");
const [ active , setActive ] = useState(0);
const [ str , setStr ] = useState("");
useEffect(()=>{
if(cate && cate.length > 0){
setStr(cate[0].str);
}
},[cate])
const scrollToAnchor = (anchorName) => {
if (anchorName) {
setAnchorName(anchorName)
let anchorElement = document.getElementById(anchorName);
if(anchorElement) { anchorElement.scrollIntoView({block: 'start', behavior: 'smooth'}); }
}
}
return <div className="content meetingTwentyFour">
<div className="anchorHeader">
{
exhibition.category &&
exhibition.category.map((e, k) => {
return <>
<div key={ k } onClick={() => { scrollToAnchor(e.anchor) }} className={`tab-item ${anchorName === e.anchor ?"active":""}`}>{ e.title }</div>
{k < exhibition.category.length-1 && <span>/</span>}
</>
})
}
</div>
<div className='exhibitionBox'>
<div>
<div className="anchor" id={ exhibition.category[0].anchor }></div>
<div className='titles left'>
<span className='name'>{ exhibition.category[0].title }</span>
<span className='subName'>{exhibition.category[0].eng.toUpperCase()}</span>
</div>
<ul className='liInfo'>
<li>赞助及展览单位应有良好的社会声誉企业高校研究院所均可</li>
<li>如企业赞助其产品或服务应是所在行业知名品牌或新兴品牌</li>
<li>赞助单位及其产品或服务应与人工智能芯片或算力智能科学与技术有关</li>
</ul>
</div>
<div>
<div className="anchor" id={ exhibition.category[1].anchor }></div>
<div className='titles left'>
<span className='name'>{ exhibition.category[1].title }</span>
<span className='subName'>{exhibition.category[1].eng.toUpperCase()}</span>
</div>
<div className='equities'>
<ul className='equityUl'>
{
cate && cate.map((i,k)=>{
return(
<li className={active ===k ?"active":""} onClick={()=>{setActive(k);setStr(i.str)}}>{i.name}<span>{i.money}</span></li>
)
})
}
</ul>
<div className='equityBox'>
<div style={{textAlign:"center",marginBottom:27}}><span className='equityTitle'>权益回归</span></div>
<div dangerouslySetInnerHTML={{__html:str}}></div>
</div>
</div>
</div>
<div>
<div className="anchor" id={ exhibition.category[2].anchor }></div>
<div className='titles left'>
<span className='name'>{ exhibition.category[2].title }</span>
<span className='subName'>{exhibition.category[2].eng.toUpperCase()}</span>
</div>
<ul className='liInfo dot'>
<div>标准展位费用5/</div>
<li>在会议手册上体现参加标展的单位名称或logo</li>
<li>获得大会标准展位一个可自行对展位进行进一步装饰</li>
<li>可获得5个本次会议免注册费参会名额差旅费用自理</li>
</ul>
</div>
<div>
<div className="anchor" id={ exhibition.category[3].anchor }></div>
<div className='titles left'>
<span className='name'>{ exhibition.category[3].title }</span>
<span className='subName'>{exhibition.category[3].eng.toUpperCase()}</span>
</div>
<div className='connectPerson'>
<p>联系人赵海英老师 </p><p> 0755-85902473</p><p> secretariat@openi.org.cn</p>
</div>
</div>
</div>
</div>
}
export default Index

View File

@ -0,0 +1,142 @@
.exhibitionBox{
width: 1200px;
background: #F8F9FF;
border-radius: 18px 18px 18px 18px;
border: 3px solid #FFFFFF;
margin:0px auto 50px;
padding:30px;
.liInfo{
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 16px;
color: #191919;
line-height: 34px;
padding-left: 20px;
li{list-style-type: decimal;}
&>div{
font-family: PingFang SC, PingFang SC;
font-weight: bold;
font-size: 18px;
color: #191919;
margin-bottom: 30px;
margin-left: -20px;
}
&.dot{
li{
position: relative;
margin-bottom: 12px;
list-style-type: none;
&::before{
position: absolute;
left: -20px;
content: "";
width: 8px;
height: 8px;
background: #0116D4;
border-radius: 50%;
top: 13px;
}
}
}
}
.connectPerson{
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 16px;
color: #191919;
line-height: 34px;
}
.equities{
display: flex;
justify-content: flex-start;
.equityUl{
width: 378px;
li{
height: 70px;
line-height: 70px;
padding:0px 25px;
background: #FFFFFF;
box-shadow: 0px 0px 10px 1px rgba(50,57,124,0.05);
border-radius: 8px 8px 8px 8px;
font-family: Alibaba PuHuiTi, Alibaba PuHuiTi;
font-weight: 400;
font-size: 18px;
color: #191919;
margin-bottom: 35px;
display: flex;
align-items: center;
justify-content: space-between;
width: 282px;
position: relative;
cursor: pointer;
span{
font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
font-weight: 400;
font-size: 28px;
color: #0116D4;
}
&.active::after{
position: absolute;
left: 0px;
top: 0px;
height: 100%;
content: "";
background-image: url(../../assets/img2024/box.png);
width: 378px;
background-size: 100%;
}
&.active::before{
position: absolute;
left: 0px;
top: 15px;
content: "";
width: 9px;
height: 38px;
background: linear-gradient(#2AAC62 0%, #3B80BD 48%, #5E33C4 100%);
border-radius: 0px 4px 4px 0px;
}
}
}
.equityBox{
flex: 1;
background: rgba(9,52,218,0.02);
border-radius: 22px 22px 22px 22px;
border: 2px solid rgba(53,66,186,0.37);
padding:28px;
.equityTitle{
width: 136px;
height: 36px;
line-height: 36px;
background-image: url(../../assets/img2024/equity.png);
background-size: 100%;
text-align: center;
font-family: PingFang SC, PingFang SC;
font-weight: bold;
font-size: 18px;
color: #FFFFFF;
display: inline-block;
}
li,p{
position: relative;
list-style-type: none;
padding-left: 18px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 15px;
color: #3F3E46;
line-height: 22px;
margin-bottom: 18px;
&::before{
position: absolute;
left: 0px;
content: "";
width: 8px;
height: 8px;
background: #0116D4;
border-radius: 50%;
top: 7px;
}
}
}
}
}

139
src/pages/home/index.jsx Normal file
View File

@ -0,0 +1,139 @@
import './index.less';
import { fourBeginTime } from '../../constants/info';
import { getBaseInfo , getPartnerList } from '../../utils/request/api';
import { useState, useEffect } from 'react';
import Guest from './sub/guest';
import MeetingLine from './sub/meetingLine';
import FastTrack from './sub/fastTrack';
import Trends from './sub/trends';
function HomePage(){
const [ mainInfo, setMainInfo ] = useState({})
const [ countDownTime , setCountDownTime ] = useState("");
const [ partner, setPartner ] = useState([])
useEffect(()=>{
getMainInfo();
getPartner();
setTimeout(function() {
getTime();
}, 1000);
},[])
const getMainInfo = () => {
getBaseInfo().then(result => {
setMainInfo(result.data);
}).catch(console.error())
}
const isMobile = () => {
const hasTouchScreen = window.matchMedia("(pointer: coarse)").matches;
const isMobileDevice = /Mobi|Android/i.test(navigator.userAgent);
return hasTouchScreen || isMobileDevice;
};
//
function getTime(){
// deadline
const deadline = new Date(fourBeginTime);
//
const now = new Date();
//
const timeLeft = deadline - now;
countdown(timeLeft);
}
function countdown(timeLeft) {
let time;
if(timeLeft <= 0) {
time = {day:"00",hour:"00",minute:"00",second:"00"}
return;
}
const daysLeft = Math.floor(timeLeft / ( 1000 * 60 * 60 * 24));
const hoursLeft = Math.floor((timeLeft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
const minutesLeft = Math.floor((timeLeft % (1000 * 60 * 60)) / (1000 * 60));
const secondsLeft = Math.floor((timeLeft % (1000 * 60)) / 1000);
time = {day:daysLeft,hour:hoursLeft,minute:minutesLeft,second:secondsLeft}
setCountDownTime(time);
setTimeout(function() {
countdown(timeLeft - 1000);
}, 1000);
}
const getPartner = () => {
getPartnerList().then(res => {
setPartner(res.rows);
}).catch(console.error())
}
return(
<div className="page">
<div className="banner" style={isMobile() ? {height:"unset"}:{}}>
<img src={ mainInfo && mainInfo.bannerList && mainInfo.bannerList.split(',')[0]} alt=""/>
</div>
<div className='meetingTwentyFour'>
{/* 2024年开源大会首页内容 */}
<div className='contents'>
<div className='titles'>
<span className='name'>大会简介</span>
<span className='subName'>{'Conference Introduction'.toUpperCase()}</span>
</div>
<div className="intro-content" dangerouslySetInnerHTML={{__html: mainInfo.introductionContent}} />
<div className='countdown'>
<div className='countdownTitle'>距大会开始还剩</div>
<div className='countdownTime'>
<span>{countDownTime?.day || "00"}</span>
<font></font>
<span>{countDownTime?.hour || "00"}</span>
<font></font>
<span>{countDownTime?.minute || "00"}</span>
<font></font>
<span>{countDownTime?.second || "00"}</span>
<font></font>
</div>
</div>
</div>
<MeetingLine/>
<Guest/>
{/* <FastTrack/> */}
<Trends />
<div className="contents fourPart">
<div className='titles'>
<span className='name'>合作伙伴</span>
<span className='subName'>{'cooperative partner'.toUpperCase()}</span>
</div>
<div className="partner-content">
{
partner.map((e, k) => {
return (
e.zonePartnersList.length > 0 ?
<div className="partner-type" key={ k }>
<div className="type-title">
<span>{ e.typeName }</span>
</div>
<div className="type-content">
{
e.zonePartnersList.map((i, subK) => {
return <a key={ subK } href={ i.link } target="_blank">
<div>
<img src={ i.logo } alt=""/>
</div>
</a>
})
}
</div>
</div>
:''
)
})
}
</div>
</div>
</div>
</div>
)
}
export default HomePage;

694
src/pages/home/index.less Normal file
View File

@ -0,0 +1,694 @@
// ----------------------------------2024
.moreNews{
display: inline-block;
padding:4px 14px;
height: 32px;
line-height: 22px;
border-radius: 5px;
border: 1px solid #0116D4;
color: #0116D4!important;
}
.banner {
height: 100vh;
width: 100%;
position: relative;
img {
width: 100%;
height: 100%;
}
}
.meetingTwentyFour{
width: 100%;
background: #F2F5FF;
.titles{
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
font-family: Alibaba PuHuiTi;
padding:38px 0px 20px 0px;
&.left{
align-items: flex-start;
padding-top: 20px;
.subName{
font-weight: 400;
font-size: 23px;
color: #0E1015;
letter-spacing: 2px;
}
.name{
font-weight: 500;
font-size: 24px;
color: #0E1015;
&::after{
width: 45px;
top: 20px;
height: 45px;
}
&::before{
left: 0px;
}
}
}
.name{
position: relative;
font-weight: 500;
font-size: 32px;
color: #0E1015;
letter-spacing: 3px;
padding:15px 30px 15px 40px;
&::before{
position: absolute;
content: "";
width: 15px;
height: 15px;
background-image: url(../../assets/img2024/left.png);
left: -5px;
top:10px
}
&::after{
position: absolute;
content: "";
width: 67px;
height: 67px;
background-image: url(../../assets/img2024/right.png);
left: 100%;
top:0px;
background-size: 100%;
}
}
.subName{
font-weight: 400;
font-size: 34px;
color: #0E1015;
letter-spacing: 8px;
opacity: 0.1;
}
}
.contents{
width: 1200px;
margin:0px auto;
padding-bottom: 32px;
.intro-content{
font-family: PingFang SC;
font-weight: 400;
font-size: 15px;
color: #0D1346;
line-height: 34px;
text-align: left;
white-space: break-spaces;
margin-bottom: 28px;
text-indent: 2em;
}
.countdown{
background-image: url(../../assets/img2024/countdown.png);
height: 200px;
background-size: 100% 100%;
display: flex;
padding-top: 28px;
box-sizing: border-box;
justify-content: flex-start;
flex-direction: column;
align-items: center;
.countdownTitle{
background-image: url(../../assets/img2024/cdTitle.png);
background-size: 100% 100%;
width: 179px;
height: 30px;
line-height: 20px;
font-weight: bold;
font-size: 16px;
color: #FFFFFF;
letter-spacing: 4px;
text-align: right;
}
.countdownTime{
display: flex;
align-items: center;
justify-content: center;
width: 100%;
margin-top: 38px;
span{
display: block;
background-image: url(../../assets/img2024/cdback.png);
background-size: 100% 100%;
width: 117px;
height: 69px;
line-height: 69px;
font-weight: 400;
font-size: 52px;
color: #FFD532;
letter-spacing: 5px;
text-align: center;
font-family: Alibaba PuHuiTi;
}
font{
margin:0px 28px;
font-size: 18px;
color: #FFFFFF;
}
}
}
}
}
.schedule-content{
display: flex;
align-items: flex-start;
.schedule-date{
width: 73px;
height: 73px;
border-radius: 50%;
background: linear-gradient( 125deg, #7012B7 0%, #3368C4 100%);
color: #fff;
font-size: 25px;
line-height: 24px;
padding: 15px 10px;
text-align: center;
font-family: YouSheBiaoTiHei;
}
.agenda-detail {
border-top: 1px solid rgba(49, 91, 205, 0.41);
position: relative;
width: 100%;
margin:40px 0px;
.top-dot {
position: absolute;
width:12px;
height:12px;
background: #0116D4;
border-radius: 50%;
right: 0;
top: 0;
transform: translate(50%, -50%);
}
.dashed-line {
width: 85px;
border-bottom: 1px dashed rgba(13, 65, 197, 1);
position: absolute;
top: 22px;
left: -8px;
transform: rotate(34deg);
}
.agenda-list {
margin-left: 71px;
padding-left: 33px;
margin-top: 46px;
position: relative;
&::before{
content: "";
left: -1px;
height: calc(100% - 26px);
border-left: 1px dashed rgba(13, 65, 197, 1);
top: 0px;
position: absolute;
}
.agenda-items{
&>p{
display: flex;
width: 100%;
border-bottom: 1px solid #aaafbe3a;
line-height: 18px;
font-size: 15px;
padding:22px 0px;
align-items: center;
&::before {
left: -10px;
position: absolute;
content: '';
width: 18.4px;
height: 18.4px;
background: url('../../assets/img2024/item-dot.png') no-repeat;
background-size: 100% 100%;
}
&>span{
&:nth-child(1){
width: 15%;
}
&:nth-child(2){
width: 22%;
}
&:nth-child(3){
width: 63%;
display: block;
}
}
}
}
.agenda-item {
position: relative;
height: 43px;
border-bottom: 1px solid #aaafbe3a;
margin-bottom: 24px;
line-height: 18px;
font-size: 15px;
span {
white-space: pre;
display: flex;
&>span{
&:nth-child(1){
width: 15%;
}
&:nth-child(2){
width: 22%;
}
&:nth-child(3){
overflow: hidden;
white-space: nowrap!important;
text-overflow: ellipsis;
width: 63%;
display: block;
}
}
}
&::before {
left: -43px;
position: absolute;
content: '';
width: 18.4px;
height: 18.4px;
background: url('../../assets/img2024/item-dot.png') no-repeat;
background-size: 100% 100%;
}
}
}
.agenda-list2 {
margin-left: 71px;
margin-top: 46px;
border-left: 1px dashed #0d41c5;
display: flex;
flex-wrap: wrap;
.agenda-item2 {
position: relative;
width: 330px;
padding: 26px 14px;
background: url('img/homePage/item-bg.png') no-repeat;
background-size: 100% 100%;
margin-left: 18px;
margin-top: 26px;
p {
margin-bottom: 12px;
color:#4c5876;
font-size:14px;
line-height:24px;
a {
margin-right: 35px;
}
}
.item-title {
width: 300px;
margin-bottom: 19px;
color:#1f2329;
font-size:16px;
display: flex;
align-items: center;
img {
width: 20px;
height: 20px;
margin-right: 8px;
}
}
&:nth-child(3n + 1)::before {
left: -27px;
position: absolute;
top: 50%;
transform: translate(0, -50%);
content: '';
width: 18.4px;
height: 18.4px;
background: url('img/homePage/item-dot.png') no-repeat;
background-size: 100% 100%;
}
.meeting-card {
background: unset;
max-height: 300px;
overflow: hidden;
}
}
}
}
}
.guestContent{
div[class~="slick-track"]{
display: flex;
div[class~="slick-slide"]{
width: 1200px!important;
}
}
ul[class~="slick-dots"] > li{
width: 33px;
height: 6px;
background: rgba(0,0,0,0.11);
border-radius: 4px 4px 4px 4px;
&>button::before{
content: "";
width: 100%;
padding:0px;
height: 100%;
}
&.slick-active{
width: 70px;
background: linear-gradient( 90deg, #12B759 0%, #533BBD 48%, #3368C4 100%);
}
}
.guestlist{
display: flex!important;
width: 1200px!important;
flex-wrap: wrap;
justify-content: center;
.guestInfo{
width: 200px;
margin:22px 16px;
text-align: center;
.guestName{
font-weight: bold;
font-size: 17px;
color: #191919;
margin:20px 0px 10px;
}
.guestDesc{
font-weight: 400;
font-size: 15px;
color: #191919;
line-height: 24px;
height: 72px;
word-break: break-all;
}
}
li{
img{
width: 180px;
height: 250px;
border: 2px solid #ffffff;
object-fit: cover;
margin:0px auto;
}
}
}
}
.trackImgs{
display: flex;
padding-top: 37px;
li{
position: relative;
width: 159px;
margin-right: 37px;
height: 282px;
transition: 0.5s;
cursor: pointer;
.trackInfos{
position: absolute;
z-index: 2;
padding:24px 35px 26px 35px;
background-color: #fff;
box-shadow: 0px 0px 12px 1px rgba(63,49,205,0.07);
border-radius: 18px;
right: 0px;
width: 340px;
top: 0px;
opacity: 0;
height: 100%;
transition: 0.5s;
display: none;
background-image: url(../../assets/img2024/tracklogo.png);
.trackInfoTitle{
letter-spacing: 4px;
font-weight: 600;
font-size: 18px;
color: #191919;
line-height: 26px;
margin-bottom: 10px;
display: block;
z-index: 3;
position: relative;
&::before{
position: absolute;
z-index: 3;
left: -35px;
top: -5px;
width: 11px;
height: 39px;
content: '';
background-image:url(../../assets/img2024/colorleft.png) ;
}
}
&>p{
margin-bottom: 18px;
font-weight: 400;
font-size: 15px;
color: #3D3D3D;
line-height: 28px;
font-family: Alibaba PuHuiTi, Alibaba PuHuiTi;
word-break: break-all;
white-space: pre-wrap;
height: 135px;
}
a{
background: linear-gradient(#2AAC62 0%, #3B80BD 48%, #5E33C4 100%);
color: #fff!important;
font-weight: 400;
font-size: 15px;
height: 36px;
line-height: 36px;
padding:0px 10px;
border-radius: 4px;
display: inline-block;
img{
width: 28px;
height: 8px;
margin-left: 5px;
}
}
}
.trackTitle{
position: absolute;
left: 20px;
top: 74px;
writing-mode: vertical-rl;
letter-spacing: 4px;
font-weight: 600;
font-size: 18px;
color: #191919;
line-height: 26px;
z-index: 3;
}
&::before{
position: absolute;
z-index: 3;
left: 1px;
top: 80px;
width: 11px;
height: 39px;
content: '';
background-image:url(../../assets/img2024/colorleft.png) ;
}
&:last-child{
margin-right: 0px;
}
&.active{
width: 610px;
.trackTitle{top: 25px;left: 307px;writing-mode:unset;display: none;}
&::before{left: 270px;top: 21px;display: none;}
.trackInfos{opacity: 1;display: block;}
}
img{
width: 100%;
height: 100%;
max-width: 307px;
visibility: visible;
}
}
}
.trendsContent{
display: flex;
align-items: flex-start;
&>img{
border-radius: 27px;
margin-left: 14px;
}
}
.trendsList{
display: flex;
flex-wrap: wrap;
flex: 1;
li{
width: calc(50% - 30px);
display: flex;
padding-bottom: 16px;
border-bottom: 1px solid rgba(101,99,120,0.21);
margin:16px 30px 16px 0px;
position: relative;
.leftDate{
display: flex;
flex-direction: column;
align-items: center;
margin-right: 12px;
font-weight: 400;
font-size: 14px;
color: #696874;
padding:0px 18px;
border-right: 1px solid rgba(101,99,120,0.21);
span{
&:first-child{
font-weight: 800;
font-size: 22px;
color: #0116D4;
margin-bottom: 8px;
}
}
}
.rightInfos{
flex:1;
width: 0;
.rightTitle{
font-weight: bold;
font-size: 16px;
color: #191919;
margin-bottom: 14px;
cursor: pointer;
width: 100%;
&>a:hover{
color: #0116D4;
}
}
.rightSubTitle{
font-weight: 400;
font-size: 14px;
color: #696874;
width: 100%;
&.hide{
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
&.hide-2{
line-height: 26px;
height: 52px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
}
}
&:hover .rightInfos .rightTitle{
color: #0116D4;
}
&::after{
content: "";
position: absolute;
left: 0px;
bottom: -1px;
width: 0px;
background-color: #0116D4;
height: 1px;
transition: 0.6s;
}
&:hover::after{
width: 100%;
}
}
}
.fourPart{
.type-title{
position: relative;
font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
font-weight: 400;
font-size: 24px;
color: #151313;
margin: 35px 0px;
&::after{
content: "";
position: absolute;
width: 32px;
left: 0px;
bottom: -12px;
height: 2px;
background: linear-gradient( 90deg, #5374B4 0%, #853CB8 100%);
border-radius: 0px 0px 0px 0px;
border: 1px solid rgba(0,0,0,0);
}
}
.type-content {
display: flex;
flex-wrap: wrap;
div {
margin-right: 25px;
padding: 6px;
background-color:#ffffff;
border-radius:4px;
box-shadow:0px 0px 6px rgba(28, 48, 175, 0.03);
height: 60px;
width: 170px;
line-height: 1;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
}
img {
max-height: 45px;
max-width: 148px;
}
}
}
// 头部定位----会议资讯、赞助展览可用
.anchorHeader{
padding:45px 0px;
margin:0px auto;
display: flex;
justify-content: center;
font-family: Alibaba PuHuiTi, Alibaba PuHuiTi;
font-weight: 400;
font-size: 22px;
color: #0E1015;
letter-spacing: 3px;
.tab-item{
padding:0px 40px;
cursor: pointer;
&.active{
color: rgba(1, 22, 212, 1);
}
}
span{
color: rgba(1, 22, 212, 0.37);
}
}
// 顶部banner----会议资讯详情、专题论坛可用
.pubBox{
.topBanner{
width: 100%;
height: 360px;
background: url('../../assets/img2024/banner_2025.png');
background-size: 100% 100%;
margin-top: -4px;
}
.contentBox{
width: 1200px;
margin:-57px auto 50px;
background: #F8F9FF;
border-radius: 18px 18px 18px 18px;
border: 3px solid #FFFFFF;
}
}
@media screen and (max-width: 1920px) {
.banner{
img{
object-fit: cover;
}
}
}
@media screen and (max-width: 1400px) {
/* 针对手机设备的样式 */
.banner{
height: unset;
}
}

View File

@ -0,0 +1,98 @@
import './index.less'
import '../index.less'
import { useEffect , useState } from 'react';
import { getFroumItem , getHomeDocList } from '../../../utils/request/api';
import { fourDate } from '../../../constants/info';
import { Base64 } from 'js-base64';
import { Spin } from 'antd';
import empty from 'img/empty.png'
function Index() {
const [ datas, setDatas ] = useState([]);
const [ articles, setArticles ] = useState([]);
const [ isSpin, setIsSpin ] = useState(true);
useEffect(()=>{
getDirList();
},[])
useEffect(()=>{
if(articles && articles.length>0){
getDetails();
}
},[articles])
async function getDetails(){
let list = datas;
for(let i=0;i<articles.length;i++){
let id = articles[i];
let result = await getFroumItem(id);
list.push(result.data);
}
// list = list.sort(function (a, b) {
// return a.id - b.id;
// })
const groupedItems = groupBy(list, 'keywords');
setIsSpin(false);
setDatas(groupedItems);
}
const getDirList = () => {
getHomeDocList(745,{pageNum:1,pageSize:6}).then(result => {
setArticles(result.rows && result.rows.map(i=>{return i.id}));
}).catch(console.error())
}
const groupBy = (array, key) => {
return array.reduce((result, currentItem) => {
// 使 key key使
const groupKey = typeof key === 'function' ? key(currentItem) : currentItem[key];
// result
if (!result[groupKey]) {
result[groupKey] = [];
}
//
result[groupKey].push(currentItem);
return result;
}, {});
};
return <div className="meetingTwentyFour pubBox">
<div className='topBanner'></div>
<div className='contentBox meetingTwentyFour'>
<div className='titles'>
<span className='name'>专题论坛</span>
<span className='subName'>{'Special Agenda'.toUpperCase()}</span>
</div>
{
datas ? fourDate && fourDate.map((i,k)=>{
let lineItem = datas[`2024年${i}`];
return(
lineItem && <div className='forumLists' key={k}>
<p className='date'>2024{i}</p>
{
lineItem && lineItem.length > 0 && lineItem.map((item,key)=>{
let content = Base64.decode(item.content);
return(
<div className='date-line'key={key}>
<span className='time-line box-item'>{item.name}</span>
<div className='dataList box-item' dangerouslySetInnerHTML={{__html:content}}></div>
</div>
)
})
}
</div>
)
}):
<img className="empty" src={ empty } alt="" />
}
{isSpin &&<div style={{minHeight:400,display:"flex",alignItems:'center',justifyContent:"center"}}><Spin spinning={true} /></div>}
</div>
</div>
}
export default Index

View File

@ -0,0 +1,68 @@
.forumLists{
padding:14px 40px;
.date{
margin-bottom: 10px;
background: rgba(9,52,218,0.1);
border-radius: 4px 4px 4px 4px;
border: 1px solid rgba(53,66,186,0.05);
height: 54px;
line-height: 54px;
text-align: center;
font-weight: bold;
font-size: 18px;
color: #2433BB;
}
.date-line{
display: flex;
.box-item{
background: rgba(9,52,218,0.02);
border-radius: 4px 4px 4px 4px;
border: 1px solid rgba(53,66,186,0.05);
margin-bottom: 10px;
font-family: Alibaba PuHuiTi, Alibaba PuHuiTi;
font-weight: 400;
font-size: 15px;
color: #191919;
}
.time-line{
display: flex;
align-items: center;
justify-content: center;
min-width: 200px;
}
.dataList{
margin-left: 10px;
flex: 1;
li{
height: 54px;
line-height: 54px;
padding:0px 25px;
display: flex;
&>a{
color: #0116D4;
width: 42%;
padding-right: 10px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
&:last-child{
width: 16%;
padding-right:0px;
}
}
span{
width: 42%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
span:first-child{
cursor: pointer;
}
&:hover span > a, &:hover span:first-child{
color: #0116D4;
}
}
}
}
}

View File

@ -0,0 +1,58 @@
import '../index.less'
import { useState, useEffect } from 'react';
import track1 from '../../../assets/img2024/track1.png';
import track2 from '../../../assets/img2024/track2.png';
import track3 from '../../../assets/img2024/track3.png';
import track4 from '../../../assets/img2024/track4.png';
import arrow from '../../../assets/img2024/arrow.png';
import { Button } from 'antd';
import { Link } from 'umi'
function FastTrack(){
const [ activeIndex , setActiveIndex ] = useState(1);
return(
<div className='contents guestContent'>
<div className='titles'>
<span className='name'>快速通道</span>
<span className='subName'>{'fast track'.toUpperCase()}</span>
</div>
<ul className='trackImgs'>
<li className={activeIndex === 1 ? "active" :""} onClick={()=>setActiveIndex(1)}>
<span className='trackTitle'>参会注册</span><img src={track1} />
<div className='trackInfos'>
<span className='trackInfoTitle'>参会注册</span>
<p>CCF中国开源大会需付费注册参加报名CCF中国开源大会的参会人员可参加同期举办的第五届Openl/O启智开发者大会及系列论坛</p>
<Link to='/register'>了解详情<img src={arrow}/></Link>
</div>
</li>
<li className={activeIndex === 2 ? "active" :""} onClick={()=>setActiveIndex(2)}>
<span className='trackTitle'>住宿预订</span><img src={track2} />
<div className='trackInfos'>
<span className='trackInfoTitle'>住宿预订</span>
<p>一站式解决您的参会需求获取会议地址票务信息交通指南以及我们为您精心挑选的酒店列表确保每位参会者都能享受到便捷的交通和舒适的住宿体验让您的会议旅程无忧</p>
<Link to='/information/detail/766'>了解详情<img src={arrow}/></Link>
</div>
</li>
<li className={activeIndex === 3 ? "active" :""} onClick={()=>setActiveIndex(3)}>
<span className='trackTitle'>赞助展览</span><img src={track3} />
<div className='trackInfos'>
<span className='trackInfoTitle'>赞助展览</span>
<p>探索创新前沿我们的赞助展览区汇集了开源先锋和新兴企业这里不仅是展示尖端技术和产品的平台也是建立商业联系发现合作机会的理想场所加入我们共同见证并塑造行业未来</p>
<Link to='/exhibition'>了解详情<img src={arrow}/></Link>
</div>
</li>
<li className={activeIndex === 4 ? "active" :""} onClick={()=>setActiveIndex(4)}>
<span className='trackTitle'>专题论坛</span><img src={track4} />
<div className='trackInfos'>
<span className='trackInfoTitle'>专题论坛</span>
<p>深入探讨行业热点专题论坛汇集开源领域专家和思想领袖加入我们参与深度对话拓展视野共同推动开源发展</p>
<Link to='/forum'>了解详情<img src={arrow}/></Link>
</div>
</li>
</ul>
</div>
)
}
export default FastTrack;

View File

@ -0,0 +1,67 @@
import '../index.less'
import Slider from 'react-slick';
import { useState, useEffect } from 'react';
import { getMemberList } from '../../../utils/request/api';
import 'slick-carousel/slick/slick.css';
import 'slick-carousel/slick/slick-theme.css';
const settings = {
infinite: true,
speed: 500,
arrows: false,
adaptiveHeight: true,
autoplay:true,
dots:true
};
function guest(){
const [ topics ,setTopics ] = useState([]);
useEffect(()=>{
getList();
},[])
const getList = () => {
getMemberList().then(res => {
getUnit(res.rows)
})
}
function getUnit(array){
const newArray = [];
for(let i = 0; i< array.length;) {
newArray.push({list:array.slice(i, i += 9)});
}
setTopics(newArray)
}
return(
<div className='contents guestContent'>
<div className='titles'>
<span className='name'>大会嘉宾</span>
<span className='subName'>{'Conference guests'.toUpperCase()}</span>
</div>
<Slider {...settings}>
{
topics && topics.map((i,k)=>{
return(
<ul className='guestlist' key={k}>
{
i.list.map((item,key)=>{
return(
<div className='guestInfo' key={key}>
<li>
<img src={item.imageUrl} />
</li>
<p className='guestName'>{item.name}</p>
<p className='guestDesc'>{item.introduction}</p>
</div>
)
})
}
</ul>
)
})
}
</Slider>
</div>
)
}
export default guest;

View File

@ -0,0 +1,99 @@
import '../index.less'
import { fourDate , fourDateId ,docId} from '../../../constants/info'
import { getDocList , getDocDetail } from '../../../utils/request/api'
import { useState, useEffect } from 'react';
import { Base64 } from 'js-base64';
import empty from 'img/empty.png'
function MeetingLine(){
const [ mainList, setMainList ] = useState([]);
useEffect(()=>{
// getMeetingAgendas();
getdocdetailByid();
},[])
function getDetail(id){
return new Promise((resolve, reject) => {
getDocDetail(id).then(res=>{
resolve(res.data.content ? Base64.decode(res.data.content) : "");
})
})
}
async function getdocdetailByid(){
const requestList = [];
docId.map(e => {
requestList.push(getDetail(e))
})
Promise.all(requestList).then(res => {
setMainList(res);
})
}
//
// async function getMeetingAgendas(){
// const requestList = [];
// fourDateId.map(e => {
// requestList.push(getList(e, e.anchor))
// })
// Promise.all(requestList).then(res => {
// setMainList(res);
// })
// }
// const getList = (id) => {
// return new Promise((resolve, reject) => {
// getDocList(id).then(res => {
// const list = res.rows;
// resolve({ id, list: list });
// })
// })
// }
return(
<div className='contents'>
<div className='titles'>
<span className='name'>大会日程</span>
<span className='subName'>{'Conference schedule'.toUpperCase()}</span>
</div>
{
mainList && mainList.map((i,k)=>{
return(
<div key={k} className='schedule-content'>
<span className='schedule-date'>{fourDate[k]}</span>
<div className="agenda-detail">
<div className="top-dot"></div>
<div className="bottom-dot"></div>
<div className="dashed-line"></div>
<div className="agenda-list">
{/* {
i.list.length > 0 ? i.list.map((item,key) => {
return <p className="agenda-item" key={key}>
<span dangerouslySetInnerHTML={{
__html: content
}}></span>
</p>
}):
<img className="empty" src={ empty } alt="" />
} */}
{
i ?
<div className="agenda-items" dangerouslySetInnerHTML={{
__html: i
}}/>:
<img className="empty" src={ empty } alt="" />
}
</div>
</div>
</div>
)
})
}
</div>
)
}
export default MeetingLine;

View File

@ -0,0 +1,68 @@
import '../index.less';
import { useState, useEffect } from 'react';
import TrendsBanner from '../../../assets/img2024/trends.png';
import blueArrow from '../../../assets/img2024/blueArrow.png';
import { getHomeOverviewList } from '../../../utils/request/api';
import empty from 'img/empty.png'
import { Link } from 'umi';
function Trends(){
const [ lists, setLists ] = useState([]);
useEffect(()=>{
getTrends();
},[])
const getTrends = () => {
getHomeOverviewList().then(result => {
let rows = result.rows;
let getIds = ["最新动态",'会议通知','新闻宣传'];//,'','','宿'
let filter = rows.filter(i=>getIds.includes(i.name) && i.cmsDocList);
let list = filter && filter.length>0 && filter.map(i=>{return i.cmsDocList})//
let sortList = list.flat().sort((a,b)=>{return b.id-a.id});//id
setLists(sortList.slice(0,6));
}).catch(console.error())
}
return(
<div className='contents'>
<div className='titles'>
<span className='name'>大会动态</span>
<span className='subName'>{'Conference News'.toUpperCase()}</span>
</div>
{
lists && lists.length>0 ?
<>
<div className='trendsContent'>
<ul className='trendsList'>
{lists.map((i,k)=>{
return(
<li key={k} style={{width:(+lists.length === 1) ? '100%':"calc(50% - 30px)"}}>
<div className='leftDate'>
<span>{new Date(i.publishTime).getDate()}</span>
<span>{new Date(i.publishTime).getFullYear()}-{new Date(i.publishTime).getMonth()+1}</span>
</div>
<div className='rightInfos'>
<p className='rightTitle task-hide'><Link to={`/information/detail/${i.id}`}>{i.name}</Link></p>
<p className='rightSubTitle task-hide'>{i.summary}</p>
</div>
</li>
)
})
}
</ul>
<img src={lists[0].headImg || TrendsBanner} alt="" width={400} />
</div>
<div style={{textAlign:"center",marginTop:18}}><Link to="/information" className="moreNews">更多资讯<img src={blueArrow} alt="" style={{marginLeft:5}}/></Link></div>
</>
:
<img className="empty" src={ empty } alt="" />
}
</div>
)
}
export default Trends;

View File

@ -4,11 +4,13 @@ import ConferenceGuide from './conferenceGuide';
import Member from './member';
import greenRight from 'img/homePage/green-right.png'
import titleIcon from 'img/homePage/title-icon.png'
import { homePage } from '../../constants/info'
import { homePage , fourBeginTime } from '../../constants/info'
import { getBaseInfo, getPartnerList } from '../../utils/request/api'
import { useRef, useState, useEffect } from 'react';
import { throttle } from '../../utils/util'
import empty from 'img/empty.png'
import { useModel , useParams } from 'umi';
import Home from '../home/index';
function HomePage(){
@ -19,6 +21,8 @@ function HomePage(){
const [ show, setShow ] = useState(false)
const [ mainInfo, setMainInfo ] = useState({})
const [ partner, setPartner ] = useState([])
const { isCurrent } = useModel('defaultConfig');
const { year } = useParams();
useEffect(()=>{
if (document.documentElement.scrollTop > 200) {
@ -100,114 +104,115 @@ function HomePage(){
<img src={ mainInfo && mainInfo.bannerList && mainInfo.bannerList.split(',')[0]} alt=""/>
{/* <div className='mainTitle'>{mainInfo && mainInfo.mainTitle}</div> */}
</div>
<div className="fixed-menu" style={{ opacity: fixedMenuOpacity }}>
<div className="guide-line" style={{ marginTop: `${ active * 56 + 9}px` }}><div></div><div></div></div>
<div>
{ year && year === "2023" && <>
<div className="fixed-menu" style={{ opacity: fixedMenuOpacity }}>
<div className="guide-line" style={{ marginTop: `${ active * 56 + 9}px` }}><div></div><div></div></div>
<div>
{
homePage && homePage.length > 0 && homePage.map((item, key) => {
return (
<div key={key}
className={`${matchItem( key ) ? 'menu-item menu-item-active' : 'menu-item'}`}
>
<a onClick={() => { scrollToAnchor(item.id) }}>{ item.title }</a>
</div>
)
})
}
</div>
</div>
<div className="introduction" style={{ opacity: introductionOpacity }}>
<div className="module-header">
<img src={ titleIcon } alt="" />
<div className="title">
<span>大会介绍</span>
<span>INTRODUCTION TO THE CONFERENCE</span>
</div>
</div>
<div className="intro-content task-hide-6" dangerouslySetInnerHTML={{
__html: mainInfo.introductionContent
}}>
{/* { mainInfo.introductionContent } */}
</div>
<ul className="menu">
{
homePage && homePage.length > 0 && homePage.map((item, key) => {
return (
<div key={key}
className={`${matchItem( key ) ? 'menu-item menu-item-active' : 'menu-item'}`}
<li key={key}
className={`${matchItem(item.id) ? 'menu-item menu-item-active' : 'menu-item'}`}
// onMouseOver={ () => { this.setState( {showSubMenu: key }) } }
// onMouseOut={ () => { this.setState( {showSubMenu: -1 }) } }
>
<a onClick={() => { scrollToAnchor(item.id) }}>{ item.title }</a>
</div>
</li>
)
})
}
</ul>
</div>
</div>
<div className="introduction" style={{ opacity: introductionOpacity }}>
<div className="module-header">
<img src={ titleIcon } alt="" />
<div className="title">
<span>大会介绍</span>
<span>INTRODUCTION TO THE CONFERENCE</span>
<MeetingAgenda></MeetingAgenda>
<ConferenceGuide></ConferenceGuide>
<div className="back-img-4">
<Member></Member>
<div className="partner wrapper" id="partner">
<div className="module-header">
<img src={ titleIcon } alt="" />
<div className="title">
<span>合作伙伴</span>
<span>PARTNERS</span>
</div>
</div>
{
show ?
<div className="partner-content">
{
partner.map((e, k) => {
return (
e.zonePartnersList.length > 0 ?
<div className="partner-type" key={ k }>
<div className="type-title">
<img src={ greenRight } alt="" className="title-icon"/>
<span>{ e.typeName }</span>
{/* <div className="device"></div> */}
</div>
<div className="type-content">
{
e.zonePartnersList.map((i, subK) => {
return <a key={ subK } href={ i.link } target="_blank">
<div>
<img src={ i.logo } alt=""/>
</div>
</a>
})
}
</div>
</div>
:''
)
})
}
</div>:
<img className="empty" src={ empty } alt="" />
}
{/* <div className="partner-type">
<div className="type-title">
<img src={ greenRight } alt="" className="title-icon"/>
<span>主办单位</span>
<div className="device"></div>
</div>
<div className="type-content">
{
[1,2,3].map((i, k) => {
return <img src="http://fpoimg.com/160x40" alt="" key={ k }/>
})
}
</div>
</div> */}
<div></div>
</div>
</div>
<div className="intro-content task-hide-6" dangerouslySetInnerHTML={{
__html: mainInfo.introductionContent
}}>
{/* { mainInfo.introductionContent } */}
</div>
<ul className="menu">
{
homePage && homePage.length > 0 && homePage.map((item, key) => {
return (
<li key={key}
className={`${matchItem(item.id) ? 'menu-item menu-item-active' : 'menu-item'}`}
// onMouseOver={ () => { this.setState( {showSubMenu: key }) } }
// onMouseOut={ () => { this.setState( {showSubMenu: -1 }) } }
>
<a onClick={() => { scrollToAnchor(item.id) }}>{ item.title }</a>
</li>
)
})
}
</ul>
</div>
<MeetingAgenda></MeetingAgenda>
<ConferenceGuide></ConferenceGuide>
<div className="back-img-4">
<Member></Member>
<div className="partner wrapper" id="partner">
<div className="module-header">
<img src={ titleIcon } alt="" />
<div className="title">
<span>合作伙伴</span>
<span>PARTNERS</span>
</div>
</div>
{
show ?
<div className="partner-content">
{
partner.map((e, k) => {
return (
e.zonePartnersList.length > 0 ?
<div className="partner-type" key={ k }>
<div className="type-title">
<img src={ greenRight } alt="" className="title-icon"/>
<span>{ e.typeName }</span>
{/* <div className="device"></div> */}
</div>
<div className="type-content">
{
e.zonePartnersList.map((i, subK) => {
return <a key={ subK } href={ i.link } target="_blank">
<div>
<img src={ i.logo } alt=""/>
</div>
</a>
})
}
</div>
</div>
:''
)
})
}
</div>:
<img className="empty" src={ empty } alt="" />
}
{/* <div className="partner-type">
<div className="type-title">
<img src={ greenRight } alt="" className="title-icon"/>
<span>主办单位</span>
<div className="device"></div>
</div>
<div className="type-content">
{
[1,2,3].map((i, k) => {
return <img src="http://fpoimg.com/160x40" alt="" key={ k }/>
})
}
</div>
</div> */}
<div></div>
</div>
</div>
</>
}
</div>
)
}

View File

@ -535,4 +535,4 @@
}
.ant-carousel .slick-dots-bottom {
bottom: -10px;
}
}

View File

@ -134,7 +134,7 @@
}
}
.detail-info{
background-color:#fefefe;
background-color:#f8f9ff;
border-radius:4px;
box-shadow:0px 0px 15px rgba(30, 47, 162, 0.06);
padding:30px 35px 50px;

View File

@ -0,0 +1,70 @@
import './index.less'
import '../home/index.less'
import RenderHtml from '../../components/renderHtml'
import { useLocation, useParams } from 'umi';
import { Base64 } from 'js-base64';
import { Breadcrumb , Divider } from 'antd';
import views from 'img/views.png'
import { useEffect } from 'react';
import { getDocDetail } from '../../utils/request/api'
import { useState } from 'react';
import { defaultPage } from '../../constants/info'
function Detail() {
const location = useLocation();
const { id } = location.pathname.includes('information') ? useParams() : { id: defaultPage[location.pathname] };
const [ detail, setDetail ] = useState({});
const [ cmsDir , setCmsDir ] = useState(undefined);
const [ content , setContent]=useState(undefined);
useEffect(()=>{
getDetail();
},[id])
const getDetail = () => {
getDocDetail(id).then(res => {
setDetail(res.data);
setCmsDir(res.data.cmsDir);
setContent(Base64.decode(res.data.content));
})
}
return <div className="meetingTwentyFour pubBox">
<div className='topBanner'></div>
{
detail &&
<div className="detail-content contentBox">
{
location.pathname.includes('information') && <Breadcrumb separator=">">
{ cmsDir && <Breadcrumb.Item href="/information">{ cmsDir.name }</Breadcrumb.Item> }
<Breadcrumb.Item>正文</Breadcrumb.Item>
</Breadcrumb>
}
<div className="detail-info">
{
location.pathname.includes('information') && <>
<div className="info-text-main">
<p className="info-name">{ detail.name }</p>
<ul className="info-ul-value">
{ cmsDir && <li>发布于{ detail.publishTime }</li> }
{ detail.visits && <li><img src={ views } alt="" /><span>浏览数</span>{ detail.visits }</li> }
</ul>
</div>
<Divider dashed={true} />
</>
}
{
content ?
<RenderHtml className="informations_detail imageLayerParent" value={ content } url={ location } />
:
<span>暂无详情~</span>
}
</div>
</div>
}
</div>
}
export default Detail

View File

@ -0,0 +1,113 @@
import './index.less'
import '../home/index.less'
import { Spin, Divider } from 'antd';
import { useState , useEffect } from 'react';
import { information2024 } from '../../constants/info';
import { getDocList } from '../../utils/request/api'
import empty from 'img/empty.png'
import { useModel } from 'umi';
import { Link } from 'umi';
function Information() {
const [ isSpin , setIsSpin ] = useState(false);
const [ anchorName , setAnchorName ] = useState("forum");
const [ informationList , setInformationList ] = useState([]);
const { dirList } = useModel('defaultConfig')
useEffect(()=>{
if ( JSON.stringify(dirList) !== '{}' ) {
getAllLists();
}
},[dirList])
const getAllLists = () => {
setIsSpin(true);
const requestList = [];
information2024.category.map(e => {
// let title = e.title==="" ? "" : e.title;
dirList[e.title] && requestList.push(getList(dirList[e.title], e.anchor))
})
Promise.all(requestList).then(res => {
let totalList = {}
res.map(e => {
totalList[e.name] = e.list
})
setInformationList(totalList)
setIsSpin(false)
})
}
const getList = (id, name) => {
return new Promise((resolve, reject) => {
getDocList(id).then(res => {
const list = res.rows
list.forEach(e => {
if (e.publishTime) {
let time = e.publishTime.split('/');
e.date1 = `${time[0]}${time[1]}`;
e.date2 = `${time[2]}`;
} else {
e.date1 = e.date2 = '-'
}
})
resolve({ name, list: list });
})
})
}
const scrollToAnchor = (anchorName) => {
if (anchorName) {
setAnchorName(anchorName)
let anchorElement = document.getElementById(anchorName);
if(anchorElement) { anchorElement.scrollIntoView({block: 'start', behavior: 'smooth'}); }
}
}
return <div className="content meetingTwentyFour">
<div className="anchorHeader">
{
information2024.category &&
information2024.category.map((e, k) => {
return <>
<div key={ k } onClick={() => { scrollToAnchor(e.anchor) }} className={`tab-item ${anchorName === e.anchor ?"active":""}`}>{ e.title }</div>
{ k<information2024.category.length-1 && <span>/</span>}
</>
})
}
</div>
<Spin spinning={isSpin}>
<div className='meetingInfos'>
{
information2024.category.map((e) => {
return <div key={ e.anchor }>
<div className="anchor" id={ e.anchor }></div>
<div className='titles'>
<span className='name'>{ e.title }</span>
<span className='subName'>{e.eng.toUpperCase()}</span>
</div>
<div className="content-wrapper">
{
informationList[e.anchor] && informationList[e.anchor].length > 0 ? informationList[e.anchor].map(( e, k ) => {
return <div className="content-item" key={ k }>
<div className='leftDate'>
<span>{ e.date2 }</span>
<span>{ e.date1 }</span>
</div>
<div className="rightInfos">
<p className="rightTitle task-hide"><Link to={ `/information/detail/${ e.id }` }>{ e.name }</Link></p>
<p className="rightSubTitle task-hide-2">{ e.summary }</p>
</div>
</div>
}):
<img className="empty" src={ empty } alt="" />
}
</div>
</div>
})
}
</div>
</Spin>
</div>
}
export default Information

View File

@ -0,0 +1,118 @@
.meetingInfos{
background: #F8F9FF;
border-radius: 18px 18px 18px 18px;
border: 3px solid #FFFFFF;
width: 1200px;
margin:0px auto;
.content-wrapper{
padding:0px 30px;
.content-item{
display: flex;
padding:20px 0px;
border-bottom: 1px solid rgba(101,99,120,0.21);
margin:16px 30px 16px 0px;
position: relative;
&:hover .rightInfos .rightTitle,a:hover{
color: #0116D4;
}
&::after{
content: "";
position: absolute;
left: 0px;
bottom: -1px;
width: 0px;
background-color: #0116D4;
height: 1px;
transition: 0.6s;
}
&:hover::after{
width: 100%;
}
.leftDate{
display: flex;
flex-direction: column;
align-items: center;
margin-right: 12px;
font-weight: 400;
font-size: 14px;
color: #696874;
width: 95px;
border-right: 1px solid rgba(101,99,120,0.21);
span{
&:first-child{
font-weight: 800;
font-size: 22px;
color: #0116D4;
margin-bottom: 16px;
}
}
}
.rightInfos{
flex:1;
.rightTitle{
font-weight: bold;
font-size: 17px;
color: #191919;
margin-bottom: 14px;
cursor: pointer;
}
.rightSubTitle{
font-weight: 400;
font-size: 15px;
color: #696874;
line-height: 26px;
}
}
}
}
}
//------------详情
.detail-content{
padding:30px;
.markdown-body{
background-color: #F8F9FF;
}
nav[class~="ant-breadcrumb"]{
margin-bottom: 30px;
}
a[class~="ant-breadcrumb-link"]:hover{
background-color: unset;
}
a[class~="ant-breadcrumb-link"]{
color: rgba(1, 22, 212, 1);
}
.info-text-main{
text-align: center;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.info-name{
font-family: PingFang SC, PingFang SC;
font-weight: bold;
font-size: 20px;
color: #191919;
letter-spacing: 2px;
}
.info-ul-value{
display: flex;
margin:20px 0px 0px;
align-items: center;
li{
padding:0px 25px;
font-weight: 400;
font-size: 14px;
color: #4C5876;
display: flex;
align-items: center;
span{
margin:0px 3px;
}
img{
margin-top: 3px;
}
}
}
}
}

View File

@ -1,4 +1,5 @@
import './index.less'
import './index.less';
import '../home/index.less';
import { Spin } from 'antd';
import { useState , useEffect } from 'react';
import MemberItem from '../../components/memberitem'
@ -23,17 +24,16 @@ function Organization() {
}
return <div className="organization">
<div className="back-img"></div>
return <div className="organization meetingTwentyFour">
{/* <div className="back-img"></div> */}
<Spin spinning={isSpin}>
{
organization && organization.length > 0 && organization.map((i, k) => {
if (!hidenMemberType.includes(i.typeName)) {
return <div className="module" key={ k }>
<div className="module-title">
<img src={ arraw } alt="" />
<span>{ i.typeName }</span>
<img src={ arraw } alt="" />
<div className='titles'>
<span className='name'>{ i.typeName }</span>
<span className='subName'>{'Special Agenda'.toUpperCase()}</span>
</div>
<p className="module-desc">{ i.typeIntroduction }</p>
{

View File

@ -0,0 +1,66 @@
import React, { useEffect , useState } from 'react';
import styles from './index.less';
import leftIcon from '../../../assets/img2025/left.png';
import back from '../../../assets/img2025/back.png';
import rightIcon from '../../../assets/img2025/right.png';
function Index() {
const [timeLeft, setTimeLeft] = useState({
days: 0,
hours: 0,
minutes: 0,
seconds: 0
});
useEffect(()=>{
const targetDate = new Date('2025-08-02T00:08:00');
const intervalId = setInterval(() => {
const now = new Date();
const difference = targetDate - now;
if (difference <= 0) {
clearInterval(intervalId);
setTimeLeft({
days: 0,
hours: 0,
minutes: 0,
seconds: 0
});
} else {
const days = Math.floor(difference / (1000 * 60 * 60 * 24));
const hours = Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
const minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60));
const seconds = Math.floor((difference % (1000 * 60)) / 1000);
setTimeLeft({
days,
hours,
minutes,
seconds
});
}
}, 1000);
return () => {
clearInterval(intervalId);
};
},[])
return <div className={styles.fiveContent}>
{/* <img src={back} alt="" width={"100%"}/> */}
<div className={styles.infoContent}>
<p className={styles.titles}>
<img src={leftIcon} width={27}/>
<span>距大会开始还剩</span>
<img src={rightIcon} width={27}/>
</p>
<p className={styles.times}>
<span><em>{timeLeft?.days}</em></span>
<span><em>{timeLeft?.hours}</em></span>
<span><em>{timeLeft?.minutes}</em></span>
<span><em>{timeLeft?.seconds}</em></span>
</p>
</div>
</div>
}
export default Index

View File

@ -0,0 +1,54 @@
.fiveContent{
background-image: url(../../../assets/img2025/back.png);
background-size: 100% 100%;
object-fit: cover;
height: 100vh;
min-height: 100vh;
position: relative;
color: #fff;
.infoContent{
position: absolute;
right: 3%;
bottom:15%;
width: 60%;
.titles{
display: flex;
align-items: center;
justify-content: center;
font-size:26px;
font-family: RuiZiYunZiKuXingKaiGB;
img{
margin-right: 25px;
&:last-child{
margin-left: 25px;
margin-right: 0px;
transform: rotateX(180deg);
}
}
}
.times{
display: flex;
align-items: center;
justify-content: center;
margin-top: 26px;
font-size: 20px;
span{
display: block;
background-image: url(../../../assets/img2025/timeback.png);
width: 129px;
height: 75px;
line-height: 75px;
background-size: 100% 100%;
font-size:62px;
margin:0 38px;
text-align: center;
em{
background:linear-gradient(182.26deg,#e38f8f 4.73%,#f7ebf9 42.75%,#8097ff 91.28%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
}
}
}
}

View File

@ -1,7 +1,7 @@
import http from './index'
import { config } from '../../constants/info';
import { getConfig } from '../util';
/**
* 获取基础信息
@ -10,7 +10,7 @@ import { config } from '../../constants/info';
*/
export function getBaseInfo(params) {
return http({
url: `/api/zone/open/zoneKey/${config.zoneKey}`,
url: `/api/zone/open/zoneKey/${getConfig().zoneKey}`,
method: 'get',
params
});
@ -50,7 +50,7 @@ export function getSubAgenda(cateId, params) {
*/
export function gethomePageDocList() {
return http({
url: `/api/cms/doc/open/zone/${config.zoneId}/homePageDocList`,
url: `/api/cms/doc/open/zone/${getConfig().zoneId}/homePageDocList`,
method: 'get',
});
}
@ -61,7 +61,7 @@ export function gethomePageDocList() {
*/
export function getMemberList() {
return http({
url: `/api/zone/open/${config.zoneId}/member/homePageList`,
url: `/api/zone/open/${getConfig().zoneId}/member/homePageList`,
method: 'get',
});
}
@ -72,7 +72,7 @@ export function getMemberList() {
*/
export function getPartnerList() {
return http({
url: `/api/zone/open/${config.zoneId}/partners/list`,
url: `/api/zone/open/${getConfig().zoneId}/partners/list`,
method: 'get',
});
}
@ -83,7 +83,7 @@ export function getPartnerList() {
*/
export function getOrganization(){
return http({
url:`/api/zone/open/${config.zoneId}/member/overviewList`,
url:`/api/zone/open/${getConfig().zoneId}/member/overviewList`,
method: 'get',
})
}
@ -106,7 +106,35 @@ export function getDocDetail(id){
*/
export function getDirList(){
return http({
url:`/api/cms/doc/open/zone/${config.zoneId}/dirList`,
url:`/api/cms/doc/open/zone/${getConfig().zoneId}/dirList`,
method: 'get',
})
}
}
/**
* 获取大会动态(专区的新闻动态)
* @returns
*/
export function getHomeOverviewList(){
return http({
url:`/api/cms/doc/open/zone/${getConfig().zoneId}/docOverviewList`,
method: 'get'
})
}
export function getHomeDocList(id,params){
return http({
url:`/api/cms/doc/open/dir/${id}/docList`,
method: 'get',
params
})
}
/**
* 获取专区论坛
* @returns
*/
export function getFroumItem(id){
return http({
url:`/api/cms/doc/open/${id}`,
method: 'get',
})
}

View File

@ -1,3 +1,5 @@
import { config } from '../constants/info';
export function throttle(fn, delay){
let timer = null; // 使用定时器实现
@ -6,8 +8,19 @@ export function throttle(fn, delay){
if(!timer){
fn.apply(_this, arguments);
timer = setTimeout(function (){
timer = null;
timer = null;
}, delay);
}
}
}
export function extractYear(url) {
// 使用正则表达式提取四位数字作为年份
const match = url.match(/(\d{4})/)
return match ? match[0] : new Date().getFullYear();
}
export function getConfig() {
const year = extractYear(window.location.pathname)
return config[year] || config[Object.keys(config).pop()]
}