You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by lu...@apache.org on 2023/12/21 14:31:55 UTC
(doris-website) branch master updated: Release new version (#365)
This is an automated email from the ASF dual-hosted git repository.
luzhijing pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-website.git
The following commit(s) were added to refs/heads/master by this push:
new 0064eb735cb Release new version (#365)
0064eb735cb is described below
commit 0064eb735cb83702258cff63c57cf4a260ac8af4
Author: Jeffrey <co...@gmail.com>
AuthorDate: Thu Dec 21 22:31:47 2023 +0800
Release new version (#365)
---
...ful-Until-we-Found-the-Replacement-for-Druid.md | 1 +
blog/Annoucing.md | 1 +
...f-an-Entire-MySQL-Database-for-Data-Analysis.md | 1 +
blog/BestPractice_Kwai.md | 3 +-
...Times-More-Cost-Effective-Than-Elasticsearch.md | 1 +
...ng-a-Data-Warehouse-for-Traditional-Industry.md | 1 +
...xt-Generation-Data-Lakehouse-10X-Performance.md | 1 +
...r-Financial-Risk-Management-What-to-Consider.md | 1 +
...ection-How-Fast-Data-Queries-Are-Implemented.md | 1 +
...n-thousand-Dashboards-Without-Causing-a-Mess.md | 1 +
blog/Flink-realtime-write.md | 1 +
...o-Build-a-Simple-but-Solid-Data-Architecture.md | 1 +
...eased-Database-Query-Concurrency-by-20-Times.md | 1 +
...uery-Speed-to-Make-the-Most-out-of-Your-Data.md | 1 +
...k-the-Data-Update-Mechanism-of-Your-Database.md | 1 +
blog/JD_OLAP.md | 1 +
blog/LY.md | 3 +-
...-to-That-Poor-BI-Engineer-We-Need-Fast-Joins.md | 1 +
...Per-Day-and-Keep-Big-Queries-Within-1-Second.md | 1 +
blog/NIO.md | 1 +
blog/Netease.md | 1 +
...asticsearch-and-PostgreSQL-with-Apache-Doris.md | 1 +
blog/Say-Goodbye-to-OOM-Crashes.md | 1 +
...to-Building-a-High-Performing-Risk-Data-Mart.md | 1 +
...-Why-We-Went-from-ClickHouse-to-Apache-Doris.md | 1 +
blog/Tencent-LLM.md | 3 +
...orage-for-Hot-and-Cold-Data-What-Why-and-How.md | 1 +
blog/Understanding-Data-Compaction-in-3-Minutes.md | 1 +
blog/Use-Apache-Doris-with-AI-chatbots.md | 1 +
...chitecture-for-40-Percent-Faster-Performance.md | 1 +
...expect-from-apache-doris-as-a-data-warehouse.md | 3 +
...appens-in-real-time-is-analyzed-in-real-time.md | 1 +
...-by-enabling-seven-times-faster-log-analysis.md | 1 +
...he-doris-upgrading-an-observability-platform.md | 1 +
...e-iov-data-analytics-helps-prevent-accidents.md | 1 +
...s-a-next-generation-real-time-data-warehouse.md | 3 +
blog/jd.md | 3 +-
...instead-of-clickhouse-mysql-presto-and-hbase.md | 1 +
blog/linkedcare.md | 1 +
blog/log-analysis-elasticsearch-vs-apache-doris.md | 3 +
blog/meituan.md | 1 +
...rom-clickhouse-to-apache-doris-what-happened.md | 1 +
blog/principle-of-Doris-SQL-parsing.md | 11 +-
blog/principle-of-Doris-Stream-Load.md | 1 +
blog/release-2.0.2.md | 1 +
blog/release-note-0.15.0.md | 1 +
blog/release-note-1.0.0.md | 1 +
blog/release-note-1.1.0.md | 1 +
blog/release-note-1.1.1.md | 1 +
blog/release-note-1.1.2.md | 1 +
blog/release-note-1.1.3.md | 1 +
blog/release-note-1.1.4.md | 1 +
blog/release-note-1.1.5.md | 1 +
blog/release-note-1.2.0.md | 1 +
blog/release-note-1.2.1.md | 1 +
blog/release-note-1.2.2.md | 3 +-
blog/release-note-1.2.3.md | 1 +
blog/release-note-1.2.4.md | 1 +
blog/release-note-1.2.5.md | 1 +
blog/release-note-1.2.6.md | 1 +
blog/release-note-1.2.7.md | 1 +
blog/release-note-2.0.0.md | 1 +
blog/release-note-2.0.1.md | 1 +
blog/release-note-2.0.3.md | 1 +
blog/ssb.md | 1 +
blog/summit.md | 1 +
blog/tpch.md | 1 +
blog/xiaomi.md | 1 +
blog/xiaomi_vector.md | 1 +
cspell.json | 4 +-
docusaurus.config.js | 145 +--
package.json | 4 +
src/components/Icons/arrow-down-icon.tsx | 24 +
src/components/Icons/arrow-right-icon.tsx | 24 +
src/components/Icons/arrow.tsx | 31 +-
src/components/Icons/checked-icon.tsx | 15 +
src/components/Icons/external-link-arrow-icon.tsx | 33 +
src/components/Icons/external-link-icon.tsx | 23 +
src/components/Icons/mail.tsx | 4 +-
src/components/Icons/medium.tsx | 15 +
src/components/Icons/new-icon.tsx | 16 +
src/components/Icons/twitter.tsx | 10 +-
src/components/Icons/youtube.tsx | 17 +-
src/components/More/index.tsx | 7 +-
src/components/Newsletter/style.scss | 2 -
src/components/PageBanner/index.tsx | 48 +-
src/components/PageBanner/styles.scss | 54 +-
src/components/PageColumn/index.tsx | 7 +-
src/components/PageColumn/styles.scss | 13 +-
src/components/PageHeader/index.tsx | 20 +
src/components/PageHeader/style.scss | 18 +
src/components/ReadMore/index.tsx | 43 +
src/components/VersionsDoc/styles.scss | 6 +
.../achievement-banner/achievement-banner.data.ts | 6 +
.../achievement-banner/achievement-banner.scss | 22 +
.../achievement-banner/achievement-banner.tsx | 19 +
src/components/blogs/components/head-blogs.tsx | 50 +
.../collapse-box/collapse-box-header.tsx | 31 +
src/components/collapse-box/collapse-box.tsx | 64 +
.../core-capabilities-card.tsx | 14 +
src/components/core-capabilities-card/style.scss | 36 +
.../download-form/download-form-simple.tsx | 51 +
src/components/download-form/download-form.tsx | 96 ++
.../components/icons/cluster-management-icon.tsx | 12 +
.../components/icons/connectors-icon.tsx | 18 +
.../icons/distributions-packaging-icon.tsx | 13 +
.../ecomsystem-category/components/tab-item.tsx | 34 +
.../ecomsystem-category/ecomsystem-category.tsx | 54 +
.../ecomsystem-layout/ecomsystem-layout.tsx | 42 +
src/components/ecomsystem/ecomsystem.data.ts | 5 +
src/components/external-link/external-link.scss | 17 +
src/components/external-link/external-link.tsx | 22 +
src/components/form-select/form-select.scss | 82 ++
src/components/form-select/form-select.tsx | 61 +
src/components/get-started/get-started.data.ts | 17 +
src/components/get-started/get-started.tsx | 30 +
src/components/link-arrow/index.tsx | 44 +
src/components/progress/progress.tsx | 9 +
src/constant/core-capabilities.data.tsx | 133 ++
.../{download.data.ts => download-archive.data.ts} | 0
src/constant/download.data.ts | 1054 ++++++---------
src/constant/generate-user.mjs | 20 +
src/constant/newsletter.data.ts | 36 +-
src/constant/user.data.tsx | 41 +
src/constant/users.data.json | 1334 +++++++++++++++++++
src/constant/various-analytics.data.tsx | 143 +++
src/hooks/use-animation-frame.ts | 26 +
src/pages/{download => _download}/index.scss | 2 +-
src/pages/{download => _download}/index.tsx | 0
src/pages/download/index.scss | 309 +----
src/pages/download/index.tsx | 732 +++--------
src/pages/ecosystem/cluster-management/index.tsx | 65 +
src/pages/ecosystem/connectors/index.tsx | 79 ++
.../distributions-and-packaging/index.tsx | 62 +
src/pages/ecosystem/index.scss | 8 +
src/pages/ecosystem/index.tsx | 4 +
src/pages/index.scss | 200 ++-
src/pages/index.tsx | 564 ++++++--
src/pages/users/index.scss | 12 +-
src/pages/users/index.tsx | 174 +--
src/pages/users/user-item.css | 32 +
src/pages/users/user-item.tsx | 33 +
src/scss/_variables.scss | 36 +-
src/scss/common.scss | 68 +-
src/scss/components/blog.scss | 6 +-
src/scss/components/breadcrumbs.scss | 13 +-
src/scss/components/markdown.scss | 77 +-
src/scss/components/navbar.scss | 141 +-
src/scss/components/pagination-nav.scss | 10 +-
src/scss/components/search.scss | 26 +-
src/scss/components/sidebar.scss | 1 -
src/scss/custom.scss | 26 +-
src/theme/AnnouncementBar/index.tsx | 2 +-
src/theme/AnnouncementBar/styles.module.css | 115 +-
src/theme/BlogFooter/index.tsx | 39 +
src/theme/BlogLayout/index.tsx | 60 +-
src/theme/BlogLayout/style.scss | 6 +-
src/theme/BlogListItem/HeadItem/index.tsx | 94 ++
src/theme/BlogListItem/index.tsx | 133 +-
src/theme/BlogListPage/index.tsx | 94 +-
src/theme/BlogPostItem/index.tsx | 77 +-
src/theme/BlogPostItem/styles.scss | 30 +-
src/theme/DocSidebar/Desktop/Content/index.js | 42 +
.../DocSidebar/Desktop/Content/styles.module.css | 16 +
src/theme/DocSidebar/Desktop/index.tsx | 6 +-
src/theme/DocSidebar/Desktop/styles.scss | 142 +--
src/theme/DocSidebarItem/Category/index.tsx | 172 +++
src/theme/DocSidebarItem/Category/style.scss | 63 +
src/theme/Footer/index.tsx | 25 +-
src/theme/Footer/styles.scss | 65 +-
src/theme/Navbar/ColorModeToggle/index.js | 22 +
src/theme/Navbar/ColorModeToggle/styles.module.css | 3 +
src/theme/Navbar/Content/index.tsx | 80 +-
src/theme/Navbar/Layout/index.tsx | 50 +
src/theme/Navbar/Layout/styles.module.css | 7 +
src/theme/Navbar/Logo/index.js | 11 +
src/theme/Navbar/MobileSidebar/Header/index.js | 32 +
src/theme/Navbar/MobileSidebar/Layout/index.js | 22 +
.../Navbar/MobileSidebar/PrimaryMenu/index.d.ts | 2 -
.../Navbar/MobileSidebar/PrimaryMenu/index.tsx | 12 +-
.../Navbar/MobileSidebar/SecondaryMenu/index.tsx | 36 +
src/theme/Navbar/MobileSidebar/Toggle/index.js | 22 +
src/theme/Navbar/MobileSidebar/index.js | 23 +
src/theme/Navbar/Search/index.js | 6 +
src/theme/Navbar/Search/styles.module.css | 13 +
src/theme/Navbar/index.js | 10 +
.../NavbarItem/DocsVersionDropdownNavbarItem.js | 18 -
.../NavbarItem/DocsVersionDropdownNavbarItem.tsx | 70 +
src/theme/NavbarItem/DropdownNavbarItem.js | 130 ++
.../NavbarItem/LocaleDropdownNavbarItem/index.tsx | 42 +-
.../LocaleDropdownNavbarItem/styles.scss | 79 +-
src/theme/NavbarItem/style.scss | 21 +
src/theme/NotFound.js | 62 +
src/theme/SearchBar/SearchBar.jsx | 273 ++--
src/theme/SearchBar/SearchBar.module.css | 267 ++--
static/images/1.2.1-release.png | Bin 0 -> 52903 bytes
static/images/1.2.2-release.png | Bin 0 -> 53046 bytes
static/images/1.2.3-release.png | Bin 0 -> 53069 bytes
static/images/1.2.4-release.png | Bin 0 -> 52976 bytes
static/images/1.2.5-release.png | Bin 0 -> 53048 bytes
static/images/1.2.6-release.png | Bin 0 -> 53122 bytes
static/images/1.2.7.png | Bin 0 -> 77332 bytes
static/images/2.0.1.png | Bin 0 -> 77750 bytes
static/images/2.0.2.png | Bin 0 -> 78016 bytes
static/images/Iov.png | Bin 0 -> 602805 bytes
...-of-the-next-generation-analytical-database.png | Bin 0 -> 28989 bytes
...ul-until-we-found-the-replacement-for-druid.png | Bin 0 -> 296460 bytes
static/images/best-practice-in-duyansoft.png | Bin 0 -> 205253 bytes
static/images/best-practice.png | Bin 0 -> 176125 bytes
...g-a-data-warehouse-for-traditional-industry.png | Bin 0 -> 289005 bytes
...lution-10-times-more-cost-effective-than-es.jpg | Bin 0 -> 208046 bytes
...building-the-next-generation-data-lakehouse.jpg | Bin 0 -> 197577 bytes
static/images/cases-bg-ELT.png | Bin 0 -> 943341 bytes
static/images/cases-bg-ad-hoc.png | Bin 0 -> 930442 bytes
static/images/cases-bg-customer.png | Bin 0 -> 932989 bytes
static/images/cases-bg-datalake.png | Bin 0 -> 945291 bytes
static/images/cases-bg-log.png | Bin 0 -> 945386 bytes
static/images/cases-bg-real-time.png | Bin 0 -> 926970 bytes
...-the-data-update-mechanism-of-your-database.jpg | Bin 0 -> 195129 bytes
static/images/chevron-down.svg | 3 +
static/images/china-unicom.png | Bin 0 -> 758040 bytes
static/images/cigna-cmb.png | Bin 0 -> 431061 bytes
static/images/clickhouse-kudu-to-doris.png | Bin 0 -> 297172 bytes
static/images/common.png | Bin 0 -> 93035 bytes
static/images/docs-logo.svg | 19 +
static/images/doris-intro.png | Bin 0 -> 487398 bytes
static/images/doris-summit-asia.png | Bin 0 -> 269368 bytes
static/images/doris-wechat.png | Bin 0 -> 15726 bytes
static/images/e-commerce.png | Bin 0 -> 641470 bytes
static/images/ecomsystem/cluster-manage.png | Bin 0 -> 151766 bytes
static/images/ecomsystem/dbt.png | Bin 0 -> 24782 bytes
static/images/ecomsystem/doris-operator.png | Bin 0 -> 106193 bytes
static/images/ecomsystem/download-bg.png | Bin 0 -> 1633352 bytes
static/images/ecomsystem/flink.png | Bin 0 -> 34389 bytes
static/images/ecomsystem/selectdb.png | Bin 0 -> 330535 bytes
static/images/ecomsystem/spark.png | Bin 0 -> 25210 bytes
static/images/ecomsystem/velodb.png | Bin 0 -> 379839 bytes
static/images/empty-data.png | Bin 0 -> 37784 bytes
static/images/es-vs-doris.png | Bin 0 -> 483048 bytes
static/images/financial-risk.png | Bin 0 -> 512591 bytes
.../how-fast-data-queries-are-implemented.png | Bin 0 -> 187834 bytes
...-build-a-simple-but-solid-data-architecture.png | Bin 0 -> 333833 bytes
...ased-database-query-concurrency-by-20-times.jpg | Bin 0 -> 194865 bytes
static/images/icon/slack.svg | 14 +
static/images/jd.jpg | Bin 0 -> 336887 bytes
static/images/listen-to-that-poor-bi-engineer.png | Bin 0 -> 311815 bytes
static/images/live-streaming.png | Bin 0 -> 525690 bytes
static/images/newsletter-1.png | Bin 0 -> 180165 bytes
static/images/newsletter-2.png | Bin 0 -> 476796 bytes
static/images/newsletter-3.png | Bin 0 -> 473027 bytes
static/images/newsletter-4.jpeg | Bin 0 -> 15143 bytes
static/images/nio.png | Bin 0 -> 446037 bytes
static/images/release-notes.png | Bin 0 -> 37532 bytes
...he-hive-es-and-postgresql-with-apache-doris.png | Bin 0 -> 276379 bytes
static/images/say-goodbye-to-oom-crashes.jpg | Bin 0 -> 181793 bytes
static/images/search-icon.svg | 3 +
static/images/start-bg.jpg | Bin 0 -> 25020 bytes
...o-building-a-high-performing-risk-data-mart.png | Bin 0 -> 297688 bytes
static/images/tech-sharing.png | Bin 0 -> 220330 bytes
static/images/tencent-data-engineer.png | Bin 0 -> 230554 bytes
.../the-tencent-experience-with-apache-doris.png | Bin 0 -> 399088 bytes
.../tiered-storage-for-hot-and-cold-cata.jpg | Bin 0 -> 179640 bytes
static/images/tme.png | Bin 0 -> 177530 bytes
static/images/top-news.png | Bin 0 -> 6007 bytes
.../understanding-data-compaction-in-3-minutes.jpg | Bin 0 -> 194786 bytes
static/images/user-jd.jpg | Bin 0 -> 326327 bytes
...ustrial Bank Co.Ltd.jpg => Industrial Bank.jpg} | Bin
.../Technology/{AISPEACH.jpg => AISPEECH.jpg} | Bin
static/images/wechat-qrc.png | Bin 0 -> 19306 bytes
static/images/what-is-doris.png | Bin 306760 -> 908574 bytes
...hitecture-for-40-percent-faster-performance.png | Bin 0 -> 304629 bytes
tailwind.config.js | 20 +
versioned_sidebars/version-2.0-sidebars.json | 1345 ++++++++++++++++++++
273 files changed, 8187 insertions(+), 2705 deletions(-)
diff --git a/blog/AB-Testing-was-a-Handful-Until-we-Found-the-Replacement-for-Druid.md b/blog/AB-Testing-was-a-Handful-Until-we-Found-the-Replacement-for-Druid.md
index 7360d3981be..20c29d53e92 100644
--- a/blog/AB-Testing-was-a-Handful-Until-we-Found-the-Replacement-for-Druid.md
+++ b/blog/AB-Testing-was-a-Handful-Until-we-Found-the-Replacement-for-Druid.md
@@ -5,6 +5,7 @@
'date': '2023-06-01',
'author': 'Heyu Dou, Xinxin Wang',
'tags': ['Best Practice'],
+ "image": '/images/ab-testing-was-a-handful-until-we-found-the-replacement-for-druid.png'
}
---
diff --git a/blog/Annoucing.md b/blog/Annoucing.md
index f998fa7a55e..df1b3f7ba93 100644
--- a/blog/Annoucing.md
+++ b/blog/Annoucing.md
@@ -5,6 +5,7 @@
'date': '2022-06-16',
'author': 'morningman',
'tags': ['Top News'],
+ "image": '/images/live-streaming.png'
}
---
diff --git a/blog/Auto-Synchronization-of-an-Entire-MySQL-Database-for-Data-Analysis.md b/blog/Auto-Synchronization-of-an-Entire-MySQL-Database-for-Data-Analysis.md
index 833e35ea107..e0f4da6a0d3 100644
--- a/blog/Auto-Synchronization-of-an-Entire-MySQL-Database-for-Data-Analysis.md
+++ b/blog/Auto-Synchronization-of-an-Entire-MySQL-Database-for-Data-Analysis.md
@@ -5,6 +5,7 @@
'date': '2023-08-16',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/tech-sharing.png'
}
---
diff --git a/blog/BestPractice_Kwai.md b/blog/BestPractice_Kwai.md
index ff79bb5847d..56021d70ce2 100644
--- a/blog/BestPractice_Kwai.md
+++ b/blog/BestPractice_Kwai.md
@@ -5,7 +5,8 @@
'summary': "This article mainly focuses on the practice of Apache Doris on Elasticsearch (DOE) in Kwai's business.Kwai’s commercial report engine provides advertisers with real-time query service for multi-dimensional analysis reports. And it also provides query service for multi-dimensional analysis reports for internal users. The engine is committed to dealing with high-performance, high-concurrency, and high-stability query problems in multi-dimensional analysis report cases. Afte [...]
'date': '2022-12-14',
'author': 'Xiang He',
- 'tags': ['Best Practice']
+ 'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Building-A-Log-Analytics-Solution-10-Times-More-Cost-Effective-Than-Elasticsearch.md b/blog/Building-A-Log-Analytics-Solution-10-Times-More-Cost-Effective-Than-Elasticsearch.md
index 8b7ece70a26..7954ad923f9 100644
--- a/blog/Building-A-Log-Analytics-Solution-10-Times-More-Cost-Effective-Than-Elasticsearch.md
+++ b/blog/Building-A-Log-Analytics-Solution-10-Times-More-Cost-Effective-Than-Elasticsearch.md
@@ -5,6 +5,7 @@
'date': '2023-05-26',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/building-a-log-analytics-solution-10-times-more-cost-effective-than-es.jpg'
}
---
diff --git a/blog/Building-a-Data-Warehouse-for-Traditional-Industry.md b/blog/Building-a-Data-Warehouse-for-Traditional-Industry.md
index 03352a62a46..f33ebe0b198 100644
--- a/blog/Building-a-Data-Warehouse-for-Traditional-Industry.md
+++ b/blog/Building-a-Data-Warehouse-for-Traditional-Industry.md
@@ -5,6 +5,7 @@
'date': '2023-05-12',
'author': 'Herman Seah',
'tags': ['Best Practice'],
+ "image": '/images/building-a-data-warehouse-for-traditional-industry.png'
}
---
diff --git a/blog/Building-the-Next-Generation-Data-Lakehouse-10X-Performance.md b/blog/Building-the-Next-Generation-Data-Lakehouse-10X-Performance.md
index b12c6cf7076..bb3877349ba 100644
--- a/blog/Building-the-Next-Generation-Data-Lakehouse-10X-Performance.md
+++ b/blog/Building-the-Next-Generation-Data-Lakehouse-10X-Performance.md
@@ -5,6 +5,7 @@
'date': '2023-03-14',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/building-the-next-generation-data-lakehouse.jpg'
}
---
diff --git a/blog/Choosing-an-OLAP-Engine-for-Financial-Risk-Management-What-to-Consider.md b/blog/Choosing-an-OLAP-Engine-for-Financial-Risk-Management-What-to-Consider.md
index 13bc1e6d354..75d50feb256 100644
--- a/blog/Choosing-an-OLAP-Engine-for-Financial-Risk-Management-What-to-Consider.md
+++ b/blog/Choosing-an-OLAP-Engine-for-Financial-Risk-Management-What-to-Consider.md
@@ -5,6 +5,7 @@
'date': '2023-08-17',
'author': 'Jianbo Liu',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Database-Dissection-How-Fast-Data-Queries-Are-Implemented.md b/blog/Database-Dissection-How-Fast-Data-Queries-Are-Implemented.md
index fc98db5f58e..54c7f8c5db7 100644
--- a/blog/Database-Dissection-How-Fast-Data-Queries-Are-Implemented.md
+++ b/blog/Database-Dissection-How-Fast-Data-Queries-Are-Implemented.md
@@ -5,6 +5,7 @@
'date': '2023-07-16',
'author': 'Rong Hou',
'tags': ['Best Practice'],
+ "image": '/images/how-fast-data-queries-are-implemented.png'
}
---
diff --git a/blog/Database-in-Fintech-How-to-Support-ten-thousand-Dashboards-Without-Causing-a-Mess.md b/blog/Database-in-Fintech-How-to-Support-ten-thousand-Dashboards-Without-Causing-a-Mess.md
index 5b3fe7ed520..8d9f3aab654 100644
--- a/blog/Database-in-Fintech-How-to-Support-ten-thousand-Dashboards-Without-Causing-a-Mess.md
+++ b/blog/Database-in-Fintech-How-to-Support-ten-thousand-Dashboards-Without-Causing-a-Mess.md
@@ -5,6 +5,7 @@
'date': '2023-08-05',
'author': 'Hou Lan',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Flink-realtime-write.md b/blog/Flink-realtime-write.md
index 1e37a433629..eeb443a60b5 100644
--- a/blog/Flink-realtime-write.md
+++ b/blog/Flink-realtime-write.md
@@ -5,6 +5,7 @@
'date': '2022-07-29',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/tech-sharing.png'
}
---
diff --git a/blog/For-Entry-Level-Data-Engineers-How-to-Build-a-Simple-but-Solid-Data-Architecture.md b/blog/For-Entry-Level-Data-Engineers-How-to-Build-a-Simple-but-Solid-Data-Architecture.md
index 75b88fa1eb3..7162d3d19aa 100644
--- a/blog/For-Entry-Level-Data-Engineers-How-to-Build-a-Simple-but-Solid-Data-Architecture.md
+++ b/blog/For-Entry-Level-Data-Engineers-How-to-Build-a-Simple-but-Solid-Data-Architecture.md
@@ -5,6 +5,7 @@
'date': '2023-07-31',
'author': 'Zhenwei Liu',
'tags': ['Best Practice'],
+ "image": '/images/how-to-build-a-simple-but-solid-data-architecture.png'
}
---
diff --git a/blog/How-We-Increased-Database-Query-Concurrency-by-20-Times.md b/blog/How-We-Increased-Database-Query-Concurrency-by-20-Times.md
index b41b1930871..ecd33d7a69f 100644
--- a/blog/How-We-Increased-Database-Query-Concurrency-by-20-Times.md
+++ b/blog/How-We-Increased-Database-Query-Concurrency-by-20-Times.md
@@ -5,6 +5,7 @@
'date': '2023-04-14',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/how-we-increased-database-query-concurrency-by-20-times.jpg'
}
---
diff --git a/blog/Improving-Query-Speed-to-Make-the-Most-out-of-Your-Data.md b/blog/Improving-Query-Speed-to-Make-the-Most-out-of-Your-Data.md
index ac7fffd6602..1033c3c71bc 100644
--- a/blog/Improving-Query-Speed-to-Make-the-Most-out-of-Your-Data.md
+++ b/blog/Improving-Query-Speed-to-Make-the-Most-out-of-Your-Data.md
@@ -5,6 +5,7 @@
'date': '2023-02-27',
'author': 'Junfei Liu',
'tags': ['Best Practice'],
+ "image": '/images/best-practice-in-duyansoft.png'
}
---
diff --git a/blog/Is-Your-Latest-Data-Really-the-Latest-Check-the-Data-Update-Mechanism-of-Your-Database.md b/blog/Is-Your-Latest-Data-Really-the-Latest-Check-the-Data-Update-Mechanism-of-Your-Database.md
index 6e7bed6cfb3..e3841ab440c 100644
--- a/blog/Is-Your-Latest-Data-Really-the-Latest-Check-the-Data-Update-Mechanism-of-Your-Database.md
+++ b/blog/Is-Your-Latest-Data-Really-the-Latest-Check-the-Data-Update-Mechanism-of-Your-Database.md
@@ -5,6 +5,7 @@
'date': '2023-07-24',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/check-the-data-update-mechanism-of-your-database.jpg'
}
---
diff --git a/blog/JD_OLAP.md b/blog/JD_OLAP.md
index bb9bf30690e..bd7f31d3e12 100644
--- a/blog/JD_OLAP.md
+++ b/blog/JD_OLAP.md
@@ -5,6 +5,7 @@
'date': '2022-12-02',
'author': 'Li Zhe',
'tags': ['Best Practice'],
+ "image": '/images/user-jd.jpg'
}
---
diff --git a/blog/LY.md b/blog/LY.md
index 87da0681746..a41da6e4aed 100644
--- a/blog/LY.md
+++ b/blog/LY.md
@@ -5,7 +5,8 @@
"summary" : "Established in 2015, LY Digital is a financial service platform for tourism industry under LY. Com. In 2020, LY Digital introduced Apache Doris to build a data warehouse because of its rich data import methods, excellent parallel computing capabilities, and low maintenance costs. This article describes the evolution of data warehouse in LY Digital and why we switch to Apache Doris. ",
"date": "2022-12-19",
'author': 'Xing Wang',
- 'tags': ['Best Practice']
+ 'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Listen-to-That-Poor-BI-Engineer-We-Need-Fast-Joins.md b/blog/Listen-to-That-Poor-BI-Engineer-We-Need-Fast-Joins.md
index 4e67311983a..95c6e024550 100644
--- a/blog/Listen-to-That-Poor-BI-Engineer-We-Need-Fast-Joins.md
+++ b/blog/Listen-to-That-Poor-BI-Engineer-We-Need-Fast-Joins.md
@@ -5,6 +5,7 @@
'date': '2023-07-10',
'author': 'Baoming Zhang',
'tags': ['Best Practice'],
+ "image": '/images/listen-to-that-poor-bi-engineer.png'
}
diff --git a/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second.md b/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second.md
index d87b520abb2..13bc55383c1 100644
--- a/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second.md
+++ b/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second.md
@@ -5,6 +5,7 @@
'date': '2023-09-16',
'author': 'Yuqi Liu',
'tags': ['Best Practice'],
+ "image": '/images/china-unicom.png'
}
---
diff --git a/blog/NIO.md b/blog/NIO.md
index 8d5b7efcf7a..fe9d77c51ea 100644
--- a/blog/NIO.md
+++ b/blog/NIO.md
@@ -6,6 +6,7 @@ Recently, NIO planned to enter the U.S. market alongside other western markets b
'date': '2022-11-28',
'author': 'Huaidong Tang',
'tags': ['Best Practice'],
+ "image": '/images/nio.png'
}
---
diff --git a/blog/Netease.md b/blog/Netease.md
index 95e5988625a..5d2296d5d4f 100644
--- a/blog/Netease.md
+++ b/blog/Netease.md
@@ -5,6 +5,7 @@
'date': '2022-11-30',
'author': 'Xiaodong Liu',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris.md b/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris.md
index 2d07e649cfa..e65f961f950 100644
--- a/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris.md
+++ b/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris.md
@@ -5,6 +5,7 @@
'date': '2023-07-01',
'author': 'Tao Wang',
'tags': ['Best Practice'],
+ "image": '/images/replacing-apache-hive-es-and-postgresql-with-apache-doris.png'
}
---
diff --git a/blog/Say-Goodbye-to-OOM-Crashes.md b/blog/Say-Goodbye-to-OOM-Crashes.md
index 89cc3cac595..81c39eb225f 100644
--- a/blog/Say-Goodbye-to-OOM-Crashes.md
+++ b/blog/Say-Goodbye-to-OOM-Crashes.md
@@ -5,6 +5,7 @@
'date': '2023-06-16',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/say-goodbye-to-oom-crashes.jpg'
}
diff --git a/blog/Step-by-step-Guide-to-Building-a-High-Performing-Risk-Data-Mart.md b/blog/Step-by-step-Guide-to-Building-a-High-Performing-Risk-Data-Mart.md
index a00ace822ee..3469acfa61c 100644
--- a/blog/Step-by-step-Guide-to-Building-a-High-Performing-Risk-Data-Mart.md
+++ b/blog/Step-by-step-Guide-to-Building-a-High-Performing-Risk-Data-Mart.md
@@ -5,6 +5,7 @@
'date': '2023-04-20',
'author': 'Jacob Chow',
'tags': ['Best Practice'],
+ "image": '/images/step-by-step-guide-to-building-a-high-performing-risk-data-mart.png'
}
---
diff --git a/blog/Tencent-Data-Engineers-Why-We-Went-from-ClickHouse-to-Apache-Doris.md b/blog/Tencent-Data-Engineers-Why-We-Went-from-ClickHouse-to-Apache-Doris.md
index 828d15fa1b0..3860417da27 100644
--- a/blog/Tencent-Data-Engineers-Why-We-Went-from-ClickHouse-to-Apache-Doris.md
+++ b/blog/Tencent-Data-Engineers-Why-We-Went-from-ClickHouse-to-Apache-Doris.md
@@ -5,6 +5,7 @@
'date': '2023-03-07',
'author': 'Jun Zhang & Kai Dai',
'tags': ['Best Practice'],
+ "image": '/images/tencent-data-engineer.png'
}
---
diff --git a/blog/Tencent-LLM.md b/blog/Tencent-LLM.md
index 9fd14fe9afa..9cc27dd3ff3 100644
--- a/blog/Tencent-LLM.md
+++ b/blog/Tencent-LLM.md
@@ -5,6 +5,9 @@
'date': '2023-08-29',
'author': 'Jun Zhang & Lei Luo',
'tags': ['Best Practice'],
+ 'picked': "true",
+ 'order': "3",
+ "image": '/images/tme.png'
}
---
diff --git a/blog/Tiered-Storage-for-Hot-and-Cold-Data-What-Why-and-How.md b/blog/Tiered-Storage-for-Hot-and-Cold-Data-What-Why-and-How.md
index 10dbf39d147..1df76bb243c 100644
--- a/blog/Tiered-Storage-for-Hot-and-Cold-Data-What-Why-and-How.md
+++ b/blog/Tiered-Storage-for-Hot-and-Cold-Data-What-Why-and-How.md
@@ -5,6 +5,7 @@
'date': '2023-06-23',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/tiered-storage-for-hot-and-cold-cata.jpg'
}
---
diff --git a/blog/Understanding-Data-Compaction-in-3-Minutes.md b/blog/Understanding-Data-Compaction-in-3-Minutes.md
index 718c3b9e006..e7972fc696d 100644
--- a/blog/Understanding-Data-Compaction-in-3-Minutes.md
+++ b/blog/Understanding-Data-Compaction-in-3-Minutes.md
@@ -5,6 +5,7 @@
'date': '2023-06-09',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/understanding-data-compaction-in-3-minutes.jpg'
}
---
diff --git a/blog/Use-Apache-Doris-with-AI-chatbots.md b/blog/Use-Apache-Doris-with-AI-chatbots.md
index 18a43c8a148..d8c70201456 100644
--- a/blog/Use-Apache-Doris-with-AI-chatbots.md
+++ b/blog/Use-Apache-Doris-with-AI-chatbots.md
@@ -5,6 +5,7 @@
'date': '2022-11-24',
'author': 'Zhao Wei',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Zipping-up-the-Lambda-Architecture-for-40-Percent-Faster-Performance.md b/blog/Zipping-up-the-Lambda-Architecture-for-40-Percent-Faster-Performance.md
index 04c7514f9d2..b7654b08c40 100644
--- a/blog/Zipping-up-the-Lambda-Architecture-for-40-Percent-Faster-Performance.md
+++ b/blog/Zipping-up-the-Lambda-Architecture-for-40-Percent-Faster-Performance.md
@@ -5,6 +5,7 @@
'date': '2023-05-05',
'author': 'Tongyang Han',
'tags': ['Best Practice'],
+ "image": '/images/zipping-up-the-lambda-architecture-for-40-percent-faster-performance.png'
}
---
diff --git a/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse.md b/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse.md
index f80d49bd738..09f1f4d0a93 100644
--- a/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse.md
+++ b/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse.md
@@ -5,6 +5,9 @@
'date': '2023-11-10',
'author': 'Apache Doris',
'tags': ['Top News'],
+ 'picked': "true",
+ 'order': "1",
+ "image": '/images/doris-summit-asia.png'
}
---
diff --git a/blog/data-analysis-for-live-streaming-what-happens-in-real-time-is-analyzed-in-real-time.md b/blog/data-analysis-for-live-streaming-what-happens-in-real-time-is-analyzed-in-real-time.md
index 7c2ac870c48..378569f0b56 100644
--- a/blog/data-analysis-for-live-streaming-what-happens-in-real-time-is-analyzed-in-real-time.md
+++ b/blog/data-analysis-for-live-streaming-what-happens-in-real-time-is-analyzed-in-real-time.md
@@ -5,6 +5,7 @@
'date': '2023-10-30',
'author': 'He Gong',
'tags': ['Best Practice'],
+ "image": '/images/live-streaming.png'
}
---
diff --git a/blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis.md b/blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis.md
index 7ea61bf2e0e..ff477820173 100644
--- a/blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis.md
+++ b/blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis.md
@@ -5,6 +5,7 @@
'date': '2023-12-07',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
diff --git a/blog/from-elasticsearch-to-apache-doris-upgrading-an-observability-platform.md b/blog/from-elasticsearch-to-apache-doris-upgrading-an-observability-platform.md
index e52e824f65d..bb951f1c778 100644
--- a/blog/from-elasticsearch-to-apache-doris-upgrading-an-observability-platform.md
+++ b/blog/from-elasticsearch-to-apache-doris-upgrading-an-observability-platform.md
@@ -5,6 +5,7 @@
'date': '2023-12-14',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents.md b/blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents.md
index 28799b08a5f..409fca832b3 100644
--- a/blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents.md
+++ b/blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents.md
@@ -5,6 +5,7 @@
'date': '2023-11-29',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/Iov.png'
}
---
diff --git a/blog/introduction-to-apache-doris-a-next-generation-real-time-data-warehouse.md b/blog/introduction-to-apache-doris-a-next-generation-real-time-data-warehouse.md
index 176f42ffc22..c45d888caf5 100644
--- a/blog/introduction-to-apache-doris-a-next-generation-real-time-data-warehouse.md
+++ b/blog/introduction-to-apache-doris-a-next-generation-real-time-data-warehouse.md
@@ -5,6 +5,9 @@
'date': '2023-10-03',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ 'picked': "true",
+ 'order': "2",
+ "image": '/images/doris-intro.png'
}
---
diff --git a/blog/jd.md b/blog/jd.md
index 5d87c256e80..e5e6bce6303 100644
--- a/blog/jd.md
+++ b/blog/jd.md
@@ -5,6 +5,7 @@
'date': '2022-07-20',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/user-jd.jpg'
}
---
@@ -213,4 +214,4 @@ In addition to the sampling tools and OLAP Exporter mentioned above, the JD OLAP
- In the business use, we also encountered problems such as task scheduling-related, import task configuration-related and query-related problems, which are driving the JD OLAP team to understand Doris more deeply. We plan to promote the use of materialized views to further improve the efficiency of queries; use Bitmap to support accurate de-duplication of UV and other metrics; use audit logs to make it easier to count large and slow queries; and solve the scheduling problem of real-tim [...]
\ No newline at end of file
+ In the business use, we also encountered problems such as task scheduling-related, import task configuration-related and query-related problems, which are driving the JD OLAP team to understand Doris more deeply. We plan to promote the use of materialized views to further improve the efficiency of queries; use Bitmap to support accurate de-duplication of UV and other metrics; use audit logs to make it easier to count large and slow queries; and solve the scheduling problem of real-tim [...]
diff --git a/blog/less-components-higher-performance-apache-doris-instead-of-clickhouse-mysql-presto-and-hbase.md b/blog/less-components-higher-performance-apache-doris-instead-of-clickhouse-mysql-presto-and-hbase.md
index 445155919a0..3ac7c9b52ab 100644
--- a/blog/less-components-higher-performance-apache-doris-instead-of-clickhouse-mysql-presto-and-hbase.md
+++ b/blog/less-components-higher-performance-apache-doris-instead-of-clickhouse-mysql-presto-and-hbase.md
@@ -5,6 +5,7 @@
'date': '2023-11-22',
'author': 'CIGNA & CMB',
'tags': ['Best Practice'],
+ "image": '/images/cigna-cmb.png'
}
---
diff --git a/blog/linkedcare.md b/blog/linkedcare.md
index 575f1d8053d..f3713b5217b 100644
--- a/blog/linkedcare.md
+++ b/blog/linkedcare.md
@@ -6,6 +6,7 @@
'date': '2023-01-28',
'author': 'Yi Yang',
'tags': ['Best Practice'],
+ "image": '/images/clickhouse-kudu-to-doris.png'
}
---
diff --git a/blog/log-analysis-elasticsearch-vs-apache-doris.md b/blog/log-analysis-elasticsearch-vs-apache-doris.md
index e0a6668d82e..1ed3e9018d1 100644
--- a/blog/log-analysis-elasticsearch-vs-apache-doris.md
+++ b/blog/log-analysis-elasticsearch-vs-apache-doris.md
@@ -5,6 +5,9 @@
'date': '2023-09-28',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ 'picked': "true",
+ 'order': "3",
+ "image": '/images/es-vs-doris.png'
}
---
diff --git a/blog/meituan.md b/blog/meituan.md
index adcf4ecac69..30bb50531b9 100644
--- a/blog/meituan.md
+++ b/blog/meituan.md
@@ -5,6 +5,7 @@
'date': '2022-07-20',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/migrating-from-clickhouse-to-apache-doris-what-happened.md b/blog/migrating-from-clickhouse-to-apache-doris-what-happened.md
index effb5a38946..44c7af977d3 100644
--- a/blog/migrating-from-clickhouse-to-apache-doris-what-happened.md
+++ b/blog/migrating-from-clickhouse-to-apache-doris-what-happened.md
@@ -5,6 +5,7 @@
'date': '2023-10-11',
'author': 'Chuang Li',
'tags': ['Best Practice'],
+ "image": '/images/e-commerce.png'
}
---
diff --git a/blog/principle-of-Doris-SQL-parsing.md b/blog/principle-of-Doris-SQL-parsing.md
index 4161aedf4ac..3d96bce39a0 100644
--- a/blog/principle-of-Doris-SQL-parsing.md
+++ b/blog/principle-of-Doris-SQL-parsing.md
@@ -1,10 +1,11 @@
---
{
-'title': 'Doris analysis: Doris SQL principle analysis',
-'summary': "This article mainly introduces the principle of Doris SQL parsing.Since there are many types of SQL, this article focuses on the analysis of query SQL. Doris's SQL analysis will be explained deeply in the algorithm principle and code implementation.",
-'date': '2022-08-25',
-'author': 'Apache Doris',
-'tags': ['Tech Sharing'],
+ 'title': 'Doris analysis: Doris SQL principle analysis',
+ 'summary': "This article mainly introduces the principle of Doris SQL parsing.Since there are many types of SQL, this article focuses on the analysis of query SQL. Doris's SQL analysis will be explained deeply in the algorithm principle and code implementation.",
+ 'date': '2022-08-25',
+ 'author': 'Apache Doris',
+ 'tags': ['Tech Sharing'],
+ "image": '/images/tech-sharing.png'
}
---
diff --git a/blog/principle-of-Doris-Stream-Load.md b/blog/principle-of-Doris-Stream-Load.md
index 65127799be6..731fa4ce804 100644
--- a/blog/principle-of-Doris-Stream-Load.md
+++ b/blog/principle-of-Doris-Stream-Load.md
@@ -5,6 +5,7 @@
'date': '2022-09-08',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+"image": '/images/tech-sharing.png'
}
---
diff --git a/blog/release-2.0.2.md b/blog/release-2.0.2.md
index 6918f4fc8d6..712a5f3880d 100644
--- a/blog/release-2.0.2.md
+++ b/blog/release-2.0.2.md
@@ -5,6 +5,7 @@
'date': '2023-10-13',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/2.0.2.png'
}
---
diff --git a/blog/release-note-0.15.0.md b/blog/release-note-0.15.0.md
index cafb40df866..58033424b64 100644
--- a/blog/release-note-0.15.0.md
+++ b/blog/release-note-0.15.0.md
@@ -5,6 +5,7 @@
'date': '2021-11-29',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.0.0.md b/blog/release-note-1.0.0.md
index c35933d4f0e..c737a52781e 100644
--- a/blog/release-note-1.0.0.md
+++ b/blog/release-note-1.0.0.md
@@ -5,6 +5,7 @@
'date': '2022-04-18',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.0.md b/blog/release-note-1.1.0.md
index 8c5879f3948..013dadd6066 100644
--- a/blog/release-note-1.1.0.md
+++ b/blog/release-note-1.1.0.md
@@ -5,6 +5,7 @@
'date': '2022-07-14',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.1.md b/blog/release-note-1.1.1.md
index 48d9f41225d..0e1ec36986e 100644
--- a/blog/release-note-1.1.1.md
+++ b/blog/release-note-1.1.1.md
@@ -5,6 +5,7 @@
'date': '2022-09-13',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.2.md b/blog/release-note-1.1.2.md
index edba045110a..ee9b3c26a88 100644
--- a/blog/release-note-1.1.2.md
+++ b/blog/release-note-1.1.2.md
@@ -5,6 +5,7 @@
'date': '2022-09-13',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.3.md b/blog/release-note-1.1.3.md
index fb7bdbe8de2..7c7cd1e3088 100644
--- a/blog/release-note-1.1.3.md
+++ b/blog/release-note-1.1.3.md
@@ -5,6 +5,7 @@
'date': '2022-10-17',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.4.md b/blog/release-note-1.1.4.md
index 80f13854bb9..eb7c48cc097 100644
--- a/blog/release-note-1.1.4.md
+++ b/blog/release-note-1.1.4.md
@@ -5,6 +5,7 @@
'date': '2022-11-11',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.5.md b/blog/release-note-1.1.5.md
index e1b1111a2d3..b18ec0cf228 100644
--- a/blog/release-note-1.1.5.md
+++ b/blog/release-note-1.1.5.md
@@ -5,6 +5,7 @@
'date': '2022-12-19',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.2.0.md b/blog/release-note-1.2.0.md
index 236558253ba..64ef54d49e0 100644
--- a/blog/release-note-1.2.0.md
+++ b/blog/release-note-1.2.0.md
@@ -5,6 +5,7 @@
'date': '2022-12-7',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.2.1.md b/blog/release-note-1.2.1.md
index 4aefe317085..c07399e5372 100644
--- a/blog/release-note-1.2.1.md
+++ b/blog/release-note-1.2.1.md
@@ -5,6 +5,7 @@
'date': '2023-01-04',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.1-release.png'
}
---
diff --git a/blog/release-note-1.2.2.md b/blog/release-note-1.2.2.md
index 0f029d2ac6b..7be8c434a2b 100644
--- a/blog/release-note-1.2.2.md
+++ b/blog/release-note-1.2.2.md
@@ -5,6 +5,7 @@
'date': '2023-02-15',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.2-release.png'
}
---
@@ -249,4 +250,4 @@ Thanks to ALL who contributed to this release!
@zhannngchen
-@zy-kkk
\ No newline at end of file
+@zy-kkk
diff --git a/blog/release-note-1.2.3.md b/blog/release-note-1.2.3.md
index ec6a109a655..f2427e17d11 100644
--- a/blog/release-note-1.2.3.md
+++ b/blog/release-note-1.2.3.md
@@ -5,6 +5,7 @@
'date': '2023-03-19',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.3-release.png'
}
---
diff --git a/blog/release-note-1.2.4.md b/blog/release-note-1.2.4.md
index a78753a8c94..d8a9719c10d 100644
--- a/blog/release-note-1.2.4.md
+++ b/blog/release-note-1.2.4.md
@@ -5,6 +5,7 @@
'date': '2023-06-05',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.4-release.png'
}
---
diff --git a/blog/release-note-1.2.5.md b/blog/release-note-1.2.5.md
index 4ed497bd6ec..8c0bd6a5b16 100644
--- a/blog/release-note-1.2.5.md
+++ b/blog/release-note-1.2.5.md
@@ -5,6 +5,7 @@
'date': '2023-06-18',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.5-release.png'
}
---
diff --git a/blog/release-note-1.2.6.md b/blog/release-note-1.2.6.md
index ccd35142b81..0858a4f7eaa 100644
--- a/blog/release-note-1.2.6.md
+++ b/blog/release-note-1.2.6.md
@@ -5,6 +5,7 @@
'date': '2023-07-17',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.6-release.png'
}
---
diff --git a/blog/release-note-1.2.7.md b/blog/release-note-1.2.7.md
index e5e173bbba5..107701a04ae 100644
--- a/blog/release-note-1.2.7.md
+++ b/blog/release-note-1.2.7.md
@@ -5,6 +5,7 @@
'date': '2023-09-04',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.7.png'
}
---
diff --git a/blog/release-note-2.0.0.md b/blog/release-note-2.0.0.md
index c30f2a25cfc..c1caf40d1e0 100644
--- a/blog/release-note-2.0.0.md
+++ b/blog/release-note-2.0.0.md
@@ -5,6 +5,7 @@
'date': '2023-08-16',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-2.0.1.md b/blog/release-note-2.0.1.md
index b23b7fa4c4b..0245f787c71 100644
--- a/blog/release-note-2.0.1.md
+++ b/blog/release-note-2.0.1.md
@@ -5,6 +5,7 @@
'date': '2023-09-04',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/2.0.1.png'
}
---
diff --git a/blog/release-note-2.0.3.md b/blog/release-note-2.0.3.md
index 4e62d49d8ce..c7044eaccca 100644
--- a/blog/release-note-2.0.3.md
+++ b/blog/release-note-2.0.3.md
@@ -5,6 +5,7 @@
'date': '2023-12-14',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/ssb.md b/blog/ssb.md
index 9689cb36c95..9f98b144038 100644
--- a/blog/ssb.md
+++ b/blog/ssb.md
@@ -5,6 +5,7 @@
'date': '2022-11-22',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/tech-sharing.png'
}
---
diff --git a/blog/summit.md b/blog/summit.md
index 8c89a36c8ed..a39dba2b1d0 100644
--- a/blog/summit.md
+++ b/blog/summit.md
@@ -6,6 +6,7 @@
'date': '2023-01-19',
'author': 'Mingyu Chen',
'tags': ['Top News'],
+ "image": '/images/a-glimpse-of-the-next-generation-analytical-database.png'
}
---
diff --git a/blog/tpch.md b/blog/tpch.md
index 4fc18095b0f..f9f77b89799 100644
--- a/blog/tpch.md
+++ b/blog/tpch.md
@@ -5,6 +5,7 @@
'date': '2022-11-22',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/tech-sharing.png'
}
---
diff --git a/blog/xiaomi.md b/blog/xiaomi.md
index 219d6eebc8e..4bc70e006c6 100644
--- a/blog/xiaomi.md
+++ b/blog/xiaomi.md
@@ -5,6 +5,7 @@
'date': '2022-07-20',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/xiaomi_vector.md b/blog/xiaomi_vector.md
index e8bc45f6566..37063b0da52 100644
--- a/blog/xiaomi_vector.md
+++ b/blog/xiaomi_vector.md
@@ -5,6 +5,7 @@
'date': '2022-12-08',
'author': 'ZuoWei',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/cspell.json b/cspell.json
index 0e836378f56..1d009decc6c 100644
--- a/cspell.json
+++ b/cspell.json
@@ -5,7 +5,9 @@
"dictionaries": [],
"words": [
"Moka",
- "releasenotes"
+ "releasenotes",
+ "swiper",
+ "Velo"
],
"ignoreWords": [],
"import": []
diff --git a/docusaurus.config.js b/docusaurus.config.js
index dfb74a08551..d6c2bd47e69 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -6,27 +6,27 @@ const lightCodeTheme = themes.dracula;
const VERSIONS = require('./versions.json');
function getDocsVersions() {
- const result = {}
+ const result = {};
VERSIONS.map(version => {
- if (version === "current") {
- result[version] = {
- label: 'dev',
+ if (version === 'current') {
+ result[version] = {
+ label: 'Dev',
path: 'dev',
banner: 'unreleased',
badge: false,
- }
+ };
} else {
result[version] = {
banner: 'none',
badge: false,
- }
+ };
}
- })
+ });
return result;
}
function getLatestVersion() {
- return VERSIONS.includes('2.0') ? '2.0' : VERSIONS[0]
+ return VERSIONS.includes('2.0') ? '2.0' : VERSIONS[0];
}
/** @type {import('@docusaurus/types').Config} */
@@ -45,7 +45,7 @@ const config = {
locales: ['en', 'zh-CN'],
localeConfigs: {
en: {
- label: 'EN',
+ label: 'English',
htmlLang: 'en-US',
},
'zh-CN': {
@@ -56,11 +56,12 @@ const config = {
},
// scripts: ['/js/redirect.js'],
stylesheets: [
- 'https://fonts.googleapis.com/css?family=Montserrat:500',
- 'https://fonts.googleapis.com/css?family=Noto+Sans+SC:400',
+ 'https://cdn-font.hyperos.mi.com/font/css?family=MiSans:100,200,300,400,450,500,600,650,700,900:Chinese_Simplify,Latin&display=swap',
+ 'https://cdn-font.hyperos.mi.com/font/css?family=MiSans_Latin:100,200,300,400,450,500,600,650,700,900:Latin&display=swap',
],
organizationName: 'apache/doris-website', // Usually your GitHub org/user name.
projectName: 'apache/doris-website', // Usually your repo name.
+ customFields: {},
plugins: [
'docusaurus-plugin-sass',
versionsPlugin,
@@ -133,6 +134,17 @@ const config = {
],
},
],
+ async function tailwindcssPlugin(context, options) {
+ return {
+ name: 'docusaurus-tailwindcss',
+ configurePostCss(postcssOptions) {
+ // Appends TailwindCSS and AutoPrefixer.
+ postcssOptions.plugins.push(require('tailwindcss'));
+ postcssOptions.plugins.push(require('autoprefixer'));
+ return postcssOptions;
+ },
+ };
+ },
[
'@docusaurus/plugin-client-redirects',
{
@@ -197,6 +209,8 @@ const config = {
docsRouteBasePath: '/',
indexBlog: false,
explicitSearchResultPath: true,
+ searchBarShortcut: true,
+ searchBarShortcutHint: true,
},
],
],
@@ -205,7 +219,7 @@ const config = {
({
announcementBar: {
id: 'support_us',
- content: `<a href="https://github.com/apache/doris" target="_blank" style="display: flex; width: 100%; align-items: center; justify-content: center; margin-left: 4px; text-decoration: none; color: white">Do you like Apache Doris?Give us a 🌟 on GitHub
+ content: `<a href="https://github.com/apache/doris" target="_blank" style="display: flex; width: 100%; align-items: center; justify-content: center; margin-left: 4px; text-decoration: none; color: white">Do you ❤️ Doris? Give us a 🌟 on GitHub
<img style="width: 1.2rem; height: 1.2rem; margin-left: 0.4rem;" src="/images/github-white-icon.svg">
</a>`,
backgroundColor: '#3C2FD4',
@@ -219,74 +233,42 @@ const config = {
src: 'https://cdnd.selectdb.com/images/logo.svg',
},
items: [
- { to: '/', label: 'Home', position: 'left', exact: true },
+ // { to: '/', label: 'Home', position: 'left', exact: true },
{
- type: 'dropdown',
position: 'left',
label: 'Docs',
to: '/docs/get-starting/quick-start',
- items: [
- {
- label: 'Getting Started',
- to: '/docs/get-starting/quick-start',
- align: 'left',
- },
- {
- label: 'Install and Deploy',
- to: '/docs/install/standard-deployment',
- align: 'left',
- },
- {
- label: 'FAQ',
- to: '/docs/faq/install-faq',
- align: 'left',
- },
- // {
- // label: 'More Docs',
- // to: '/docs/dev/get-starting/',
- // align: 'left',
- // }
- ],
},
- { to: '/blog', label: 'Blogs', position: 'left' },
+ { to: '/blog', label: 'Blog', position: 'left' },
+ { to: '/users', label: 'Users', position: 'left' },
{
- label: 'Community',
- type: 'dropdown',
- to: '/community/join-community',
+ label: 'Discussions',
+ to: 'https://github.com/apache/doris/discussions',
position: 'left',
- // docsPluginId: 'community',
- items: [
- {
- label: 'Join Community',
- to: '/community/join-community',
- align: 'left',
- },
- {
- label: 'Doris Team',
- to: '/community/team',
- align: 'left',
- },
- {
- label: 'How to Contribute',
- to: '/community/how-to-contribute/',
- align: 'left',
- },
- {
- label: 'Developer Guide',
- to: '/community/developer-guide/debug-tool',
- align: 'left',
- },
- ],
},
- { to: '/users', label: 'User Stories', position: 'left' },
{
- type: 'docsVersionDropdown',
+ label: 'Ecosystem',
+ to: '/ecosystem/cluster-management',
+ position: 'left',
+ },
+ // {
+ // label: 'Community',
+ // to: '/community/join-community',
+ // position: 'left',
+ // },
+ {
+ type: 'search',
position: 'right',
+ className: 'docs-search',
},
{
type: 'localeDropdown',
position: 'right',
},
+ {
+ type: 'docsVersionDropdown',
+ position: 'right',
+ },
// {
// href: 'https://github.com/apache/doris',
// className: 'header-right-button-github',
@@ -344,38 +326,43 @@ const config = {
href: '/learning',
},
{
- label: 'Blogs',
+ label: 'Blog',
href: '/blog',
},
{
- label: 'User Stories',
+ label: 'Ecosystem',
+ href: '/ecosystem/cluster-management',
+ },
+ {
+ label: 'Users',
href: '/users',
},
- // {
- // label: 'Courses (coming soon)',
- // href: '/courses',
- // },
+ {
+ label: 'Discussions',
+ href: 'https://github.com/apache/doris/discussions',
+ },
],
},
{
- title: 'Community Support',
+ title: 'Community',
items: [
{
- label: 'Doris Team',
- href: '/community/team',
- },
- {
- label: 'How to Contribute',
+ label: 'How to contribute',
href: '/community/how-to-contribute/',
},
{
- label: 'Source Code',
+ label: 'Source code',
href: 'https://github.com/apache/doris/',
},
+
{
- label: 'Improvement Proposal',
+ label: 'Improvement proposal',
href: 'https://github.com/apache/doris/discussions',
},
+ {
+ label: 'Doris team',
+ href: '/community/team',
+ },
{
label: 'Roadmap',
href: 'https://github.com/apache/doris/issues/16392',
diff --git a/package.json b/package.json
index 22a8fbf23e8..fc4391fe515 100644
--- a/package.json
+++ b/package.json
@@ -25,14 +25,18 @@
"@docusaurus/preset-classic": "^2.4.1",
"@easyops-cn/docusaurus-search-local": "^0.30.2",
"@mdx-js/react": "^1.6.22",
+ "antd": "^5.12.2",
+ "autoprefixer": "^10.4.16",
"clsx": "^1.1.1",
"docusaurus-plugin-sass": "^0.2.3",
+ "postcss": "^8.4.32",
"prism-react-renderer": "^2.0.4",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-github-button": "^0.1.11",
"sass": "^1.63.2",
"swiper": "^9.0.5",
+ "tailwindcss": "^3.3.6",
"vitpress-generate-pdf": "^1.1.4"
},
"devDependencies": {
diff --git a/src/components/Icons/arrow-down-icon.tsx b/src/components/Icons/arrow-down-icon.tsx
new file mode 100644
index 00000000000..577be0ac1c2
--- /dev/null
+++ b/src/components/Icons/arrow-down-icon.tsx
@@ -0,0 +1,24 @@
+import React from 'react';
+
+interface ArrowDownIconProps {
+ className?: string;
+}
+export function ArrowDownIcon(props: ArrowDownIconProps) {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width="1em"
+ height="1em"
+ viewBox="0 0 16 16"
+ fill="none"
+ className={props.className}
+ >
+ <path
+ d="M4 6L7.57574 9.57574C7.81005 9.81005 8.18995 9.81005 8.42426 9.57574L12 6"
+ stroke="currentColor"
+ strokeWidth="1.2"
+ strokeLinecap="round"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/Icons/arrow-right-icon.tsx b/src/components/Icons/arrow-right-icon.tsx
new file mode 100644
index 00000000000..4f1d9083ba3
--- /dev/null
+++ b/src/components/Icons/arrow-right-icon.tsx
@@ -0,0 +1,24 @@
+import React from 'react';
+
+interface ArrowRightIconProps {
+ className?: string;
+}
+export function ArrowRightIcon(props: ArrowRightIconProps) {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width="1em"
+ height="1em"
+ viewBox="0 0 16 16"
+ fill="none"
+ className={props.className}
+ >
+ <path
+ d="M6 4.00024L9.57574 7.57598C9.81005 7.8103 9.81005 8.19019 9.57574 8.42451L6 12.0002"
+ stroke="currentColor"
+ strokeWidth="1.2"
+ strokeLinecap="round"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/Icons/arrow.tsx b/src/components/Icons/arrow.tsx
index 9e4f1d8f4ef..fec1b7f692d 100644
--- a/src/components/Icons/arrow.tsx
+++ b/src/components/Icons/arrow.tsx
@@ -2,22 +2,21 @@ import React from 'react';
export default function ArrowIcon() {
return (
- <svg width="1rem" height="1rem" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
- <g clipPath="url(#clip0_424_3506)">
- <path
- d="M13.0662 7.23986C13.1278 7.17546 13.1628 7.08866 13.1628 6.99906C13.1628 6.90946 13.1278 6.82266 13.0662 6.75826M13.0662 6.75686L6.85865 0.274863C6.58565 -0.0107372 6.13205 0.00746314 5.86044 0.291663C5.58884 0.575863 5.58745 1.03506 5.85905 1.31926L11.291 6.99766L5.85905 12.6747C5.58605 12.9603 5.58885 13.4195 5.86045 13.7023C6.13065 13.9879 6.58565 14.0061 6.85725 13.7205L13.0648 7.23846L13.0648 6.75686L13.0662 6.75686Z"
- fill="currentColor"
- />
- <path
- d="M8.24886 7.24361C8.31046 7.17921 8.34406 7.09241 8.34406 7.00281C8.34406 6.91321 8.30906 6.82641 8.24886 6.76201M8.24886 6.76061L2.04126 0.278611C1.76826 -0.00698851 1.31466 0.011211 1.04306 0.295411C0.771462 0.579611 0.770062 1.03881 1.04166 1.32301L6.47366 7.00141L1.04166 12.6798C0.768663 12.9654 0.771463 13.4246 1.04306 13.7074C1.31466 13.9916 1.76966 14.0098 2.04126 13.7242L8.24886 7.24221L8.24886 6.76061V6.76061Z"
- fill="currentColor"
- />
- </g>
- <defs>
- <clipPath id="clip0_424_3506">
- <rect width="14" height="14" fill="currentColor" transform="translate(0 14) rotate(-90)" />
- </clipPath>
- </defs>
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">
+ <path
+ d="M10.1251 13.5L14.625 9L10.1251 4.5"
+ stroke="#444FD9"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M3.37506 9.00049L14.6251 9.00049"
+ stroke="#444FD9"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
</svg>
);
}
diff --git a/src/components/Icons/checked-icon.tsx b/src/components/Icons/checked-icon.tsx
new file mode 100644
index 00000000000..98429084d1f
--- /dev/null
+++ b/src/components/Icons/checked-icon.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+
+export function CheckedIcon() {
+ return (
+ <span>
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
+ <rect width="16" height="16" fill="white" />
+ <path
+ d="M1.5 8.19781L2.81207 6.84098L6.14286 10.2844L13.1861 3L14.5 4.35875L6.14286 13L1.5 8.19781Z"
+ fill="#0065FD"
+ />
+ </svg>
+ </span>
+ );
+}
diff --git a/src/components/Icons/external-link-arrow-icon.tsx b/src/components/Icons/external-link-arrow-icon.tsx
new file mode 100644
index 00000000000..b57e24454fd
--- /dev/null
+++ b/src/components/Icons/external-link-arrow-icon.tsx
@@ -0,0 +1,33 @@
+import React from 'react';
+
+interface ExternalLinkArrowIconProps {
+ className?: string;
+}
+
+export function ExternalLinkArrowIcon(props: ExternalLinkArrowIconProps) {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ className="transition-slide"
+ width="16"
+ height="14"
+ viewBox="0 0 16 14"
+ fill="none"
+ >
+ <path
+ d="M9.37549 12.3542L14.8755 6.85419L9.37549 1.35419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M1.12549 6.85419L14.8755 6.85419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/Icons/external-link-icon.tsx b/src/components/Icons/external-link-icon.tsx
new file mode 100644
index 00000000000..96f5a13a956
--- /dev/null
+++ b/src/components/Icons/external-link-icon.tsx
@@ -0,0 +1,23 @@
+import React from 'react';
+
+export function ExternalLinkIcon() {
+ return (
+ <svg width="1rem" height="1rem" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path
+ d="M14.8497 8.99993L14.8497 14.5349C14.8497 14.8332 14.6079 15.0749 14.3097 15.0749H3.68966C3.39142 15.0749 3.14966 14.8332 3.14966 14.5349V3.46493C3.14966 3.16669 3.39142 2.92493 3.68966 2.92493H8.53166"
+ stroke="currentColor"
+ strokeWidth="1.5"
+ strokeLinecap="round"
+ strokeLinejoin="round"
+ />
+ <path
+ d="M11.4746 2.92493H14.3096C14.6078 2.92493 14.8496 3.16669 14.8496 3.46493V6.29993"
+ stroke="currentColor"
+ strokeWidth="1.5"
+ strokeLinecap="round"
+ strokeLinejoin="round"
+ />
+ <path d="M13.9944 3.82495L8.90322 8.91612" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
+ </svg>
+ );
+}
diff --git a/src/components/Icons/mail.tsx b/src/components/Icons/mail.tsx
index bf98a4b29ca..06f459ce141 100644
--- a/src/components/Icons/mail.tsx
+++ b/src/components/Icons/mail.tsx
@@ -2,9 +2,9 @@ import React from 'react';
export function MailIcon() {
return (
- <svg width="2em" height="2em" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" viewBox="0 0 32 32" fill="none">
<path
- d="M5.6003 6H26.3997C27.8186 6 28.982 7.10964 29 8.46946L16.0045 15.454L3.01202 8.47829C3.02405 7.11258 4.1784 6 5.6003 6ZM3.01202 11.1508L3 23.5011C3 24.8756 4.16938 26 5.6003 26H26.3997C27.8306 26 29 24.8756 29 23.5011V11.145L16.3111 17.8028C16.1157 17.9058 15.8813 17.9058 15.6889 17.8028L3.01202 11.1508V11.1508Z"
+ d="M5.6003 6H26.3997C27.8186 6 28.982 7.10964 29 8.46946L16.0045 15.454L3.01202 8.47829C3.02405 7.11258 4.1784 6 5.6003 6ZM3.01202 11.1508L3 23.5011C3 24.8756 4.16938 26 5.6003 26H26.3997C27.8306 26 29 24.8756 29 23.5011V11.145L16.3111 17.8028C16.1157 17.9058 15.8813 17.9058 15.6889 17.8028L3.01202 11.1508Z"
fill="currentColor"
/>
</svg>
diff --git a/src/components/Icons/medium.tsx b/src/components/Icons/medium.tsx
new file mode 100644
index 00000000000..893aac21a80
--- /dev/null
+++ b/src/components/Icons/medium.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+
+export function MediumIcon() {
+ return (
+ <svg width="2em" height="2em" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <g id="Frame">
+ <path
+ id="Vector"
+ d="M17.7967 16.5385C17.8029 18.53 16.9746 20.4425 15.4937 21.8559C14.0128 23.2693 12.0004 24.0681 9.89836 24.0769C7.79633 24.0681 5.78391 23.2693 4.30302 21.8559C2.82212 20.4425 1.99383 18.53 2.00003 16.5385C1.99383 14.5469 2.82212 12.6344 4.30302 11.221C5.78391 9.80759 7.79633 9.00878 9.89836 9C12.0004 9.00878 14.0128 9.80759 15.4937 11.221C16.9746 12.6344 17.8029 14.5469 17.7967 16.5385ZM26.4533 16.5385C26.4533 20.4514 24.6917 23.6348 22.51 23.6348C20.3283 23.6348 1 [...]
+ fill="currentColor"
+ />
+ </g>
+ </svg>
+ );
+}
diff --git a/src/components/Icons/new-icon.tsx b/src/components/Icons/new-icon.tsx
new file mode 100644
index 00000000000..4cb1e37b248
--- /dev/null
+++ b/src/components/Icons/new-icon.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+export function NewIcon(props: any) {
+ return (
+ <svg {...props} width="43" height="23" viewBox="0 0 43 23" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path
+ d="M2 22.9092C0.895431 22.9092 -1.06778e-08 22.0137 -2.38494e-08 20.9092L-2.49335e-07 2.00009C-2.62507e-07 0.895518 0.89543 8.96347e-05 2 8.96215e-05L37.1011 8.9203e-05C37.9412 8.91929e-05 38.6917 0.525021 38.9798 1.3141L42.38 10.626C42.4577 10.8387 42.4609 11.0715 42.389 11.2863L38.9569 21.5438C38.684 22.3594 37.9202 22.9092 37.0602 22.9092L2 22.9092Z"
+ fill="#23C343"
+ />
+ <path
+ d="M6.98 5.45859H8.52L13.63 12.8926H13.686V5.45859H15.212V15.4546H13.728L8.562 7.93659H8.506V15.4546H6.98V5.45859ZM20.1052 8.02059C21.2812 8.02059 22.1912 8.41259 22.8072 9.22459C23.3672 9.95259 23.6612 10.9606 23.6752 12.2486H18.1872C18.2432 12.9486 18.4252 13.4946 18.7612 13.8726C19.0972 14.2366 19.5592 14.4326 20.1472 14.4326C20.6652 14.4326 21.0852 14.3066 21.4072 14.0686C21.6592 13.8726 21.8692 13.5506 22.0652 13.1306H23.5492C23.3812 13.8026 23.0592 14.3766 22.5552 1 [...]
+ fill="white"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/Icons/twitter.tsx b/src/components/Icons/twitter.tsx
index 1b8b788cc7f..3166cd7d944 100644
--- a/src/components/Icons/twitter.tsx
+++ b/src/components/Icons/twitter.tsx
@@ -2,14 +2,14 @@ import React from 'react';
export function TwitterIcon() {
return (
- <svg width="2rem" height="2rem" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" viewBox="0 0 32 32" fill="none">
<path
- d="M3 3H10.6067L29 29H21.3933L3 3ZM6.31485 4.69302L22.3127 27.307H25.6852L9.68727 4.69302H6.31485Z"
- fill="white"
+ d="M4.625 4.625H11.2809L27.375 27.375H20.7191L4.625 4.625ZM7.52549 6.10639L21.5236 25.8936H24.4746L10.4764 6.10639H7.52549Z"
+ fill="currentColor"
/>
<path
- d="M14.202 18.8346L5.18225 29H3L13.2092 17.4314L14.202 18.8346ZM18.4342 14.0647L28.2518 3H25.9448L17.4314 12.6471L18.4342 14.0647Z"
- fill="white"
+ d="M14.4268 18.4803L6.53447 27.375H4.625L13.5581 17.2525L14.4268 18.4803ZM18.1299 14.3066L26.7203 4.625H24.7017L17.2525 13.0662L18.1299 14.3066Z"
+ fill="currentColor"
/>
</svg>
);
diff --git a/src/components/Icons/youtube.tsx b/src/components/Icons/youtube.tsx
index ed32f467cba..5682bc247d0 100644
--- a/src/components/Icons/youtube.tsx
+++ b/src/components/Icons/youtube.tsx
@@ -2,18 +2,11 @@ import React from 'react';
export function YoutubeIcon() {
return (
- <svg width="2rem" height="2rem" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
- <g clipPath="url(#clip0_3462_1106)">
- <path
- d="M30.3048 7.66776C30.7927 8.14769 31.1465 8.74331 31.3319 9.39705C31.7949 11.91 32.0182 14.46 31.9988 17.0138C32.0164 19.558 31.7931 22.0982 31.3319 24.6017C31.1465 25.2554 30.7927 25.851 30.3048 26.3309C29.8169 26.8109 29.2115 27.1589 28.5469 27.3413C26.026 28 16.0142 28 16.0142 28C16.0142 28 5.97317 28 3.48158 27.3413C2.81702 27.1589 2.21154 26.8109 1.72366 26.3309C1.23579 25.851 0.882017 25.2554 0.696547 24.6017C0.22555 22.0991 -0.00754264 19.5589 0.000288097 17. [...]
- fill="white"
- />
- </g>
- <defs>
- <clipPath id="clip0_3462_1106">
- <rect width="32" height="32" fill="white" />
- </clipPath>
- </defs>
+ <svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" viewBox="0 0 32 32" fill="none">
+ <path
+ d="M28.5167 7.83429C28.9436 8.25423 29.2532 8.77539 29.4154 9.34742C29.8205 11.5462 30.0159 13.7775 29.999 16.0121C30.0144 18.2382 29.819 20.4609 29.4154 22.6515C29.2532 23.2235 28.9436 23.7446 28.5167 24.1645C28.0898 24.5845 27.5601 24.889 26.9785 25.0486C24.7728 25.625 16.0124 25.625 16.0124 25.625C16.0124 25.625 7.22652 25.625 5.04638 25.0486C4.46489 24.889 3.9351 24.5845 3.5082 24.1645C3.08132 23.7446 2.77176 23.2235 2.60948 22.6515C2.19736 20.4617 1.9934 18.239 2.000 [...]
+ fill="currentColor"
+ />
</svg>
);
}
diff --git a/src/components/More/index.tsx b/src/components/More/index.tsx
index f9fe552eeb6..af8cbfcb3c6 100644
--- a/src/components/More/index.tsx
+++ b/src/components/More/index.tsx
@@ -1,17 +1,18 @@
import Link from '@docusaurus/Link';
import Translate from '@docusaurus/Translate';
-import React, { ReactNode } from 'react';
+import React, { CSSProperties, ReactNode } from 'react';
import ArrowIcon from '../Icons/arrow';
import './styles.scss';
interface MoreProps {
link: string;
text?: ReactNode;
+ style?: CSSProperties;
}
export default function More(props: MoreProps) {
- const { link, text = <Translate id="learnmore">Learn More</Translate> } = props;
+ const { link, text = <Translate id="learnmore">Learn More</Translate>, style } = props;
return (
- <div className="more">
+ <div style={style} className="more">
<Link to={link}>
{text}
<ArrowIcon />
diff --git a/src/components/Newsletter/style.scss b/src/components/Newsletter/style.scss
index da1aab225a5..2c892d526fb 100644
--- a/src/components/Newsletter/style.scss
+++ b/src/components/Newsletter/style.scss
@@ -25,7 +25,6 @@
gap: 8px;
align-self: stretch;
color: #252734;
- font-family: PingFang SC;
font-size: 0.75rem;
margin-bottom: 1.2rem;
font-style: normal;
@@ -35,7 +34,6 @@
.newsletter-title {
color: #484954;
- font-family: PingFang SC;
font-size: 1rem;
font-style: normal;
font-weight: 500;
diff --git a/src/components/PageBanner/index.tsx b/src/components/PageBanner/index.tsx
index c5b982d4053..9129b5442f2 100644
--- a/src/components/PageBanner/index.tsx
+++ b/src/components/PageBanner/index.tsx
@@ -38,6 +38,28 @@ export default function PageBanner(props: PageBannerProps): JSX.Element {
key={index}
>
{btn.label}
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width="19"
+ height="18"
+ viewBox="0 0 19 18"
+ fill="none"
+ >
+ <path
+ d="M10.6251 13.5L15.125 9L10.6251 4.5"
+ stroke="currentColor"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M3.87506 9.00055L15.1251 9.00055"
+ stroke="currentColor"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
</Link>
) : (
<div
@@ -46,14 +68,34 @@ export default function PageBanner(props: PageBannerProps): JSX.Element {
key={index}
>
{btn.label}
+ <svg
+ style={{ display: 'inline-block' }}
+ xmlns="http://www.w3.org/2000/svg"
+ width="19"
+ height="18"
+ viewBox="0 0 19 18"
+ fill="none"
+ >
+ <path
+ d="M10.6251 13.5L15.125 9L10.6251 4.5"
+ stroke="#444FD9"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M3.87506 9.00055L15.1251 9.00055"
+ stroke="#444FD9"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
</div>
),
)}
</div>
</div>
- <div className="banner-img-wrap">
- <img className="banner-img" src={bannerImg} alt="" />
- </div>
</div>
</section>
);
diff --git a/src/components/PageBanner/styles.scss b/src/components/PageBanner/styles.scss
index c03ce6179c9..07e9c291335 100644
--- a/src/components/PageBanner/styles.scss
+++ b/src/components/PageBanner/styles.scss
@@ -1,23 +1,19 @@
.banner-section {
- height: calc(100vh - var(--global-header-height) - 10rem);
+ // height: calc(100vh - var(--global-header-height) - 10rem);
.banner-container {
height: 100%;
width: 100%;
- display: flex;
- align-items: center;
- justify-content: space-between;
.banner-info {
- margin-top: -2rem;
+ margin-top: var(--ifm-navbar-height);
}
.banner-title-wrap {
- max-width: 72rem;
- text-align: left;
}
.banner-sub-title {
+ text-align: center;
font-size: 1.25rem;
line-height: 1.5;
color: var(--global-colors-text);
@@ -27,21 +23,29 @@
.banner-title {
font-size: var(--global-font-size-bigger);
- font-weight: 700;
- line-height: 1;
+ font-weight: 500;
+ line-height: 4rem;
+ text-align: center;
color: var(--global-colors-text-black);
+ .highlight {
+ color: var(--ifm-color-primary);
+ }
}
.banner-buttons {
display: flex;
+ justify-content: center;
align-items: center;
- margin-top: 2.5rem;
+ margin-top: 4rem;
.button {
+ display: flex;
+ gap: 0.25rem;
+ align-items: center;
padding: 0.75rem 2.4rem;
font-size: var(--global-font-size-default);
border: none;
- transition: all .3s;
+ transition: all 0.3s;
font-weight: 500;
border: 1px solid transparent;
@@ -49,8 +53,8 @@
// box-shadow: 10px 16px 18px rgba(195, 203, 235, 0.2);
}
- &+.button {
- margin-left: 0.7rem;
+ & + .button {
+ margin-left: 2rem;
}
&.primary {
@@ -63,7 +67,7 @@
}
&.default {
- background-color: #F0F1FC;
+ background-color: #f0f1fc;
color: var(--ifm-color-primary);
&:hover {
@@ -93,14 +97,13 @@
@media screen and (min-width: 1300px) and (max-width: 1600px) {
.banner-section {
- height: calc(100vh - var(--global-header-height) - 10rem);
+ // height: calc(100vh - var(--global-header-height) - 10rem);
}
}
@media (max-width: 1299px) {
.banner-section {
height: auto;
- padding: 10rem 5rem;
}
}
@@ -122,7 +125,24 @@
.banner-info {
margin-top: 3rem;
margin-bottom: 5rem;
+ .banner-title {
+ font-size: 2.25rem;
+ line-height: 1.5;
+ font-weight: 500;
+ }
+ .banner-sub-title {
+ font-size: 1rem;
+ margin-top: 1.2rem;
+ font-weight: 400;
+ }
+ }
+ .banner-buttons {
+ .button {
+ padding: 0.45rem 1.2rem;
+ font-size: 1rem;
+ font-weight: normal;
+ }
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/components/PageColumn/index.tsx b/src/components/PageColumn/index.tsx
index b541e051a25..c41ceb920c3 100644
--- a/src/components/PageColumn/index.tsx
+++ b/src/components/PageColumn/index.tsx
@@ -1,5 +1,5 @@
import clsx from 'clsx';
-import React, { ComponentProps, JSXElementConstructor, ReactNode } from 'react';
+import React, { CSSProperties, ComponentProps, JSXElementConstructor, ReactNode } from 'react';
import './styles.scss';
interface PageColumnProps extends ComponentProps<JSXElementConstructor<any>> {
@@ -7,11 +7,12 @@ interface PageColumnProps extends ComponentProps<JSXElementConstructor<any>> {
title: string | ReactNode;
footer?: ReactNode;
subTitle?: string | ReactNode;
+ wrapperStyle?: CSSProperties;
}
export default function PageColumn(props: PageColumnProps): JSX.Element {
- const { align = 'center', title, footer, children, subTitle } = props;
+ const { align = 'center', title, footer, children, subTitle, wrapperStyle, className } = props;
return (
- <div className={clsx('page-column', align, footer && 'has-footer')}>
+ <div style={wrapperStyle} className={clsx('page-column', className, align, footer && 'has-footer')}>
<h1 className="page-column-title">
<div className="container">{title}</div>
</h1>
diff --git a/src/components/PageColumn/styles.scss b/src/components/PageColumn/styles.scss
index b432c4cea67..59e4cc158a5 100644
--- a/src/components/PageColumn/styles.scss
+++ b/src/components/PageColumn/styles.scss
@@ -2,8 +2,13 @@
padding: 6.25rem 0;
font-size: 1.25rem;
color: var(--global-colors-text-primary);
- line-height: 2.0;
+ line-height: 2;
+ .page-column-title {
+ font-size: 44px;
+ font-weight: 540;
+ line-height: 70px;
+ }
&.left {
text-align: left;
@@ -47,13 +52,13 @@
@media (max-width: 996px) {
.page-column {
&-title {
- font-size: var(--global-font-size-larger)
+ font-size: var(--global-font-size-larger);
}
.col {
- &+.col {
+ & + .col {
margin-top: 1rem;
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/components/PageHeader/index.tsx b/src/components/PageHeader/index.tsx
new file mode 100644
index 00000000000..fbf0603c30c
--- /dev/null
+++ b/src/components/PageHeader/index.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import './style.scss';
+
+interface PageHeaderProps {
+ title: string;
+ subtitle?: string;
+ extra?: any;
+ [any: string]: any;
+ className?: string;
+}
+
+export default function PageHeader(props: PageHeaderProps) {
+ return (
+ <div className={`page-header bg-[#F7F9FE] pt-10 pb-20 ${props.className}`}>
+ <h1 className="title">{props.title}</h1>
+ <div className="subtitle mt-4">{props.subtitle}</div>
+ {props?.extra && props?.extra}
+ </div>
+ );
+}
diff --git a/src/components/PageHeader/style.scss b/src/components/PageHeader/style.scss
new file mode 100644
index 00000000000..4a1d596d23c
--- /dev/null
+++ b/src/components/PageHeader/style.scss
@@ -0,0 +1,18 @@
+.page-header {
+ .title {
+ color: var(--n-1, #1d1d1d);
+ text-align: center;
+ font-size: 44px;
+ font-style: normal;
+ font-weight: 540;
+ letter-spacing: 0.88px;
+ }
+ .subtitle {
+ color: var(--1, #252734);
+ text-align: center;
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 330;
+ line-height: 28px; /* 155.556% */
+ }
+}
diff --git a/src/components/ReadMore/index.tsx b/src/components/ReadMore/index.tsx
new file mode 100644
index 00000000000..cb09e9f2cff
--- /dev/null
+++ b/src/components/ReadMore/index.tsx
@@ -0,0 +1,43 @@
+import Link from '@docusaurus/Link';
+import React from 'react';
+
+interface ReadMoreProps {
+ to: string;
+ className?: string;
+}
+
+export default function ReadMore(props: ReadMoreProps) {
+ return (
+ <Link
+ className={`flex group text-primary items-center cursor-pointer hover:no-underline ${props?.className}`}
+ to={props.to}
+ >
+ <span className="mr-2 ">Read more</span>
+ <span className="transition-slide">
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ className="transition-slide"
+ width="16"
+ height="14"
+ viewBox="0 0 16 14"
+ fill="none"
+ >
+ <path
+ d="M9.37549 12.3542L14.8755 6.85419L9.37549 1.35419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M1.12549 6.85419L14.8755 6.85419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
+ </span>
+ </Link>
+ );
+}
diff --git a/src/components/VersionsDoc/styles.scss b/src/components/VersionsDoc/styles.scss
index f6f8d69c718..10f645bb15c 100644
--- a/src/components/VersionsDoc/styles.scss
+++ b/src/components/VersionsDoc/styles.scss
@@ -3,6 +3,12 @@
display: inline-block;
margin-bottom: 1rem;
max-width: 100%;
+ &.paragraph {
+ margin-left: 1rem;
+ .version-tags {
+ margin-bottom: 0;
+ }
+ }
&.paragraph:before {
content: '';
position: absolute;
diff --git a/src/components/achievement-banner/achievement-banner.data.ts b/src/components/achievement-banner/achievement-banner.data.ts
new file mode 100644
index 00000000000..1ee1fd0f8e6
--- /dev/null
+++ b/src/components/achievement-banner/achievement-banner.data.ts
@@ -0,0 +1,6 @@
+export const AchievementBannerItemsData = [
+ { title: '10K+', content: 'Github stars' },
+ { title: '4000+', content: 'Enterprise users at scale' },
+ { title: '600+', content: 'Total contributors' },
+ { title: '120+', content: 'Monthly active contributors' },
+];
diff --git a/src/components/achievement-banner/achievement-banner.scss b/src/components/achievement-banner/achievement-banner.scss
new file mode 100644
index 00000000000..741c03a2c52
--- /dev/null
+++ b/src/components/achievement-banner/achievement-banner.scss
@@ -0,0 +1,22 @@
+.achievement-banner-wrapper {
+ display: flex;
+ gap: 24px;
+ margin-bottom: 5rem;
+ margin-top: 7.5rem;
+
+ .achievement-banner-item {
+ width: 282px;
+ text-align: center;
+ color: var(--global-colors-text-secondary);
+ font-size: 1.25rem;
+ line-height: 1.6;
+ div ~ div {
+ margin-top: 0.25rem;
+ }
+ .highlight {
+ color: var(--ifm-color-primary);
+ font-weight: 540;
+ font-size: 2.5rem;
+ }
+ }
+}
diff --git a/src/components/achievement-banner/achievement-banner.tsx b/src/components/achievement-banner/achievement-banner.tsx
new file mode 100644
index 00000000000..2d8824fc2ea
--- /dev/null
+++ b/src/components/achievement-banner/achievement-banner.tsx
@@ -0,0 +1,19 @@
+import React from 'react';
+import { AchievementBannerItemsData } from './achievement-banner.data';
+import './achievement-banner.scss';
+
+export function AchievementBanner() {
+ return (
+ <section
+ className="container achievement-banner-wrapper flex-col lg:flex-row items-center lg:mt-[7.5rem];
+ "
+ >
+ {AchievementBannerItemsData.map(({ title, content }) => (
+ <div className="achievement-banner-item" key={title}>
+ <div className="highlight">{title}</div>
+ <div>{content}</div>
+ </div>
+ ))}
+ </section>
+ );
+}
diff --git a/src/components/blogs/components/head-blogs.tsx b/src/components/blogs/components/head-blogs.tsx
new file mode 100644
index 00000000000..77c5d122e5e
--- /dev/null
+++ b/src/components/blogs/components/head-blogs.tsx
@@ -0,0 +1,50 @@
+import React from 'react';
+import { IBlog } from '../blogs.type';
+import BlogItem from './blog-item';
+import BlogListItem from '@site/src/theme/BlogListItem';
+
+function getHeadData() {
+ return {
+ data: [],
+ };
+}
+
+export default function HeadBlogs(props) {
+ const blogs = props.blogs;
+ const topNews = blogs.filter(blog => +blog.frontMatter.order === 1)[0];
+ const news = blogs.filter(blog => blog.frontMatter.title !== topNews.frontMatter.title);
+ return (
+ <>
+ <div className="flex lg:flex-row flex-col lg:max-w-7xl">
+ <div className="mb-4 lg:mb-0 lg:flex-1 lg:pr-6">
+ <BlogListItem
+ large={true}
+ headBlog={true}
+ frontMatter={topNews.frontMatter}
+ assets={topNews.assets}
+ metadata={topNews.metadata}
+ truncated={topNews.metadata.truncated}
+ />
+ </div>
+ <ul className="space-y-4 lg:flex-1">
+ {news
+ .filter(BlogPostContent => BlogPostContent.frontMatter.picked)
+ .sort((a, b) => +a.frontMatter.order - +b.frontMatter.order)
+ .map((BlogPostContent, i) => (
+ <BlogListItem
+ headBlog={true}
+ large={false}
+ key={BlogPostContent.metadata.permalink + i}
+ frontMatter={BlogPostContent.frontMatter}
+ assets={BlogPostContent.assets}
+ metadata={BlogPostContent.metadata}
+ truncated={BlogPostContent.metadata.truncated}
+ >
+ <BlogPostContent />
+ </BlogListItem>
+ ))}
+ </ul>
+ </div>
+ </>
+ );
+}
diff --git a/src/components/collapse-box/collapse-box-header.tsx b/src/components/collapse-box/collapse-box-header.tsx
new file mode 100644
index 00000000000..705d833b4e7
--- /dev/null
+++ b/src/components/collapse-box/collapse-box-header.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { useState } from 'react';
+import { ArrowDownIcon } from '../Icons/arrow-down-icon';
+
+export function CollapseBoxHeader({
+ title,
+ defaultExpand = true,
+ disabled = false,
+}: {
+ title: string;
+ defaultExpand?: boolean;
+ disabled?: boolean;
+}) {
+ const [expand, setExpand] = useState<boolean>(defaultExpand);
+ return (
+ <div
+ onClick={() => {
+ if (disabled) return;
+ setExpand(!expand);
+ }}
+ className={`peer flex cursor-pointer items-center justify-between rounded-t-lg bg-[#F7F9FE] px-[1rem] py-[0.75rem] lg:px-[3rem] lg:py-[1.5rem] text-2xl font-medium leading-[2.5rem] font-misans ${
+ disabled ? 'cursor-default' : 'cursor-pointer'
+ } ${expand ? 'expand' : ' rounded-b-lg'}`}
+ >
+ {title}
+ {!disabled && (
+ <ArrowDownIcon className={`text-[#0065FD] text-3xl lg:text-2xl ${expand ? 'rotate-180' : ''}`} />
+ )}
+ </div>
+ );
+}
diff --git a/src/components/collapse-box/collapse-box.tsx b/src/components/collapse-box/collapse-box.tsx
new file mode 100644
index 00000000000..92a8eec9160
--- /dev/null
+++ b/src/components/collapse-box/collapse-box.tsx
@@ -0,0 +1,64 @@
+import React, { ReactNode } from 'react';
+import { CheckedIcon } from '../Icons/checked-icon';
+import { CollapseBoxHeader } from './collapse-box-header';
+
+interface CollapseBoxProps {
+ title: string;
+ description: string | React.ReactNode;
+ characteristic?: string[];
+ rightContent?: ReactNode;
+ newLink?: ReactNode;
+ moreLink?: ReactNode;
+ showListIcon?: boolean;
+ notes?: string | ReactNode;
+ expand?: boolean;
+ className?: string;
+ disabledExpand?: boolean;
+}
+
+export default function CollapseBox({
+ title,
+ description,
+ characteristic = [],
+ rightContent,
+ newLink,
+ moreLink,
+ showListIcon = true,
+ notes,
+ expand,
+ className,
+ disabledExpand = false,
+}: CollapseBoxProps) {
+ return (
+ <div className={`mt-[5.5rem] w-full rounded-lg border border-[#DFE5F0] ${className}`}>
+ <CollapseBoxHeader title={title} defaultExpand={expand} disabled={disabledExpand} />
+ <div className="grid grid-rows-[0fr] overflow-hidden transition-all peer-[.expand]:grid-rows-[1fr]">
+ <div className="min-h-0 ">
+ <div className="flex flex-col flex-wrap items-center justify-between p-4 sm:p-[3rem] lg:flex-row lg:items-start">
+ <div className="w-full lg:mr-32 lg:flex-1">
+ {newLink}
+ {description && (
+ <div className={`text-base leading-[1.625rem] text-[#1D1D1D]`}>{description}</div>
+ )}
+ {characteristic?.length > 0 && (
+ <div className="flex">
+ <ul>
+ {characteristic?.map(e => (
+ <li key={e} className="mt-4 flex items-center space-x-2">
+ {showListIcon && <CheckedIcon />}
+ <div className="text-[#5F6368]">{e}</div>
+ </li>
+ ))}
+ </ul>
+ </div>
+ )}
+ {moreLink && <div className="flex mt-6 items-center">{moreLink}</div>}
+ {notes && <div className="mt-8 text-[#8592A6] text-xs leading-5">{notes}</div>}
+ </div>
+ <div className="w-full pt-8 lg:w-[27.25rem] lg:pt-0">{rightContent}</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ );
+}
diff --git a/src/components/core-capabilities-card/core-capabilities-card.tsx b/src/components/core-capabilities-card/core-capabilities-card.tsx
new file mode 100644
index 00000000000..e4b5bde6e8c
--- /dev/null
+++ b/src/components/core-capabilities-card/core-capabilities-card.tsx
@@ -0,0 +1,14 @@
+import React from 'react';
+import './style.scss';
+
+export function CoreCapabilitiesCard({ title, content, icon }: { title: string; content: string; icon: any }) {
+ return (
+ <div>
+ <div className="core-capabilities-icon">{icon}</div>
+ <div className="core-capabilities-card">
+ <div className="title">{title}</div>
+ <div className="content">{content}</div>
+ </div>
+ </div>
+ );
+}
diff --git a/src/components/core-capabilities-card/style.scss b/src/components/core-capabilities-card/style.scss
new file mode 100644
index 00000000000..cf7d5e7686e
--- /dev/null
+++ b/src/components/core-capabilities-card/style.scss
@@ -0,0 +1,36 @@
+.core-capabilities-card {
+ background-color: var(--global-colors-white);
+ padding: 2.5rem 2rem 3.375rem;
+ border-radius: 8px;
+ height: calc(100% - 5rem);
+ text-align: left;
+
+ .title {
+ font-size: 1.25rem;
+ font-weight: 450;
+ line-height: 1.6;
+ margin-bottom: 0.75rem;
+ }
+
+ .content {
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.875;
+ }
+}
+
+.core-capabilities-icon {
+ width: 4rem;
+ height: 4rem;
+ background-color: var(--global-colors-white);
+ position: relative;
+ transform: translateY(50%);
+ border-radius: 50%;
+ left: 1.5rem;
+ svg {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ }
+}
diff --git a/src/components/download-form/download-form-simple.tsx b/src/components/download-form/download-form-simple.tsx
new file mode 100644
index 00000000000..8e7e39bc6bc
--- /dev/null
+++ b/src/components/download-form/download-form-simple.tsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import { Form } from 'antd';
+import { Option } from '@site/src/constant/download.data';
+import FormSelect from '../form-select/form-select';
+import { useForm } from 'antd/es/form/Form';
+interface DownloadFormSimpleProps {
+ versions: Option[];
+}
+export default function DownloadFormSimple(props: DownloadFormSimpleProps) {
+ const { versions } = props;
+ const [form] = useForm();
+
+ const getVersionLinkByKeys = (version: string[]) => {
+ const versionNode = versions.find(({ value }) => value === version[0]);
+ const node = versionNode?.children.find(({ value }) => value === version[1]);
+ return node?.source || null;
+ };
+
+ return (
+ <div className="rounded-lg border border-b-[0.375rem] border-[#0065FD] px-8 pt-[3.125rem] pb-[2.1875rem]">
+ <div className="mb-8 text-xl font-medium">Downloads</div>
+ <Form
+ form={form}
+ onFinish={val => {
+ window.open(getVersionLinkByKeys(val.version), '_blank');
+ return;
+ }}
+ initialValues={{
+ version: [versions[0].value, versions[0].children[0].value],
+ }}
+ >
+ <Form.Item name="version" rules={[{ required: true }]}>
+ <FormSelect
+ placeholder="Version"
+ label="version"
+ isCascader={true}
+ displayRender={label => {
+ return label.length > 0 ? label[label.length - 1] : '';
+ }}
+ options={versions}
+ />
+ </Form.Item>
+ <Form.Item style={{ marginBottom: 0 }} colon={false}>
+ <button type="submit" className="button-primary w-full text-lg">
+ Download
+ </button>
+ </Form.Item>
+ </Form>
+ </div>
+ );
+}
diff --git a/src/components/download-form/download-form.tsx b/src/components/download-form/download-form.tsx
new file mode 100644
index 00000000000..46044b72d8f
--- /dev/null
+++ b/src/components/download-form/download-form.tsx
@@ -0,0 +1,96 @@
+import React, { useEffect, useState } from 'react';
+import { Form } from 'antd';
+import { Option } from '@site/src/constant/download.data';
+import FormSelect from '../form-select/form-select';
+import { useForm, useWatch } from 'antd/es/form/Form';
+import { ExternalLinkArrowIcon } from '../Icons/external-link-arrow-icon';
+
+interface DownloadFormProps {
+ versions: Option[];
+}
+export default function DownloadForm(props: DownloadFormProps) {
+ const { versions } = props;
+ const [form] = useForm();
+ const version = useWatch('version', form);
+ const architecture = useWatch('architecture', form);
+
+ const getOptions = (version: string) => {
+ const options = versions.find(item => item.value === version);
+ return options.children;
+ };
+
+ const getVersionLinkByKeys = (version, cpu, type) => {
+ const versionNode = versions.find(item => item.value === version);
+ const node = versionNode.children.find(item => item.value === cpu);
+ return node?.[type] || null;
+ };
+
+ useEffect(() => {
+ const currentVersion = versions.find(item => form.getFieldValue('version') === item.value).children;
+ form.setFieldValue('architecture', currentVersion[0].value);
+ }, [version]);
+
+ return (
+ <div className="rounded-lg border border-b-[0.375rem] border-[#444FD9] px-8 pt-[3.125rem] pb-[2.1875rem]">
+ <div className="mb-8 text-xl font-medium">Available downloads</div>
+ <Form
+ form={form}
+ onFinish={val => {
+ window.open(getVersionLinkByKeys(val.version, val.architecture, 'gz'), '_blank');
+ return;
+ }}
+ initialValues={{
+ version: versions[0].value,
+ }}
+ >
+ <Form.Item name="version" rules={[{ required: true }]}>
+ <FormSelect placeholder="Version" label="version" isCascader={false} options={versions} />
+ </Form.Item>
+ <Form.Item noStyle shouldUpdate>
+ {({ getFieldValue }) => (
+ <Form.Item name="architecture" rules={[{ required: true }]}>
+ <FormSelect
+ placeholder="Architecture"
+ label="Architecture"
+ isCascader={false}
+ options={getOptions(getFieldValue('version'))}
+ />
+ </Form.Item>
+ )}
+ </Form.Item>
+
+ <Form.Item style={{ marginBottom: 0 }} colon={false}>
+ <button type="submit" className="button-primary w-full text-lg">
+ Download
+ </button>
+ </Form.Item>
+ <div className="flex justify-center mt-[1.5rem]">
+ <div
+ className="inline-flex items-center text-[#444FD9] cursor-pointer hover:underline"
+ onClick={() => {
+ window.open(getVersionLinkByKeys(version, architecture, 'asc'), '_blank');
+ }}
+ >
+ asc
+ </div>
+ <div
+ className="inline-flex items-center ml-[4.375rem] text-[#444FD9] cursor-pointer hover:underline"
+ onClick={() => {
+ window.open(getVersionLinkByKeys(version, architecture, 'sha512'), '_blank');
+ }}
+ >
+ sha512
+ </div>
+ <div
+ className="inline-flex items-center ml-[4.375rem] text-[#444FD9] cursor-pointer hover:underline"
+ onClick={() => {
+ window.open(getVersionLinkByKeys(version, architecture, 'source'), '_blank');
+ }}
+ >
+ source code
+ </div>
+ </div>
+ </Form>
+ </div>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-category/components/icons/cluster-management-icon.tsx b/src/components/ecomsystem/ecomsystem-category/components/icons/cluster-management-icon.tsx
new file mode 100644
index 00000000000..4489f9cb1ac
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-category/components/icons/cluster-management-icon.tsx
@@ -0,0 +1,12 @@
+import React from 'react';
+
+export function ClusterManagementIcon() {
+ return (
+ <svg width="54" height="54" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <rect width="54" height="54" rx="6.75" fill="white" />
+ <path d="M27 6L37 11.5V22.5L27 28L17 22.5V11.5L27 6Z" fill="#444FD9" />
+ <path d="M16 25L26 30.5V41.5L16 47L6 41.5V30.5L16 25Z" fill="#444FD9" />
+ <path d="M48 30.5L38 25L28 30.5V41.5L38 47L48 41.5V30.5Z" fill="#444FD9" />
+ </svg>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-category/components/icons/connectors-icon.tsx b/src/components/ecomsystem/ecomsystem-category/components/icons/connectors-icon.tsx
new file mode 100644
index 00000000000..18ac059f909
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-category/components/icons/connectors-icon.tsx
@@ -0,0 +1,18 @@
+import React from 'react';
+
+export function ConnectorsIcon() {
+ return (
+ <svg width="54" height="54" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <rect width="54" height="54" fill="white" />
+ <path
+ d="M33.9239 11.8825C40.7908 14.6313 45.6413 21.347 45.6413 29.1956C45.6413 30.4391 45.5195 31.6542 45.2872 32.8296C47.0243 34.1033 48.1521 36.1591 48.1521 38.4782C48.1521 42.3442 45.0181 45.4782 41.1521 45.4782C39.8622 45.4782 38.6537 45.1293 37.616 44.5207C34.6034 46.6116 30.9448 47.8369 26.9999 47.8369C23.0551 47.8369 19.3965 46.6116 16.3839 44.5207C15.3461 45.1293 14.1377 45.4782 12.8478 45.4782C8.98179 45.4782 5.84778 42.3442 5.84778 38.4782C5.84778 36.1591 6.97558 34 [...]
+ fill="#444FD9"
+ />
+ <path
+ d="M32.4402 12.1033L32.567 12.9551L33.3664 13.2751C39.6835 15.8037 44.1413 21.9809 44.1413 29.1956C44.1413 30.341 44.0291 31.4587 43.8157 32.5388L43.6307 33.4749L44.4002 34.0392C45.7685 35.0426 46.6521 36.6571 46.6521 38.4782C46.6521 41.5158 44.1897 43.9782 41.1521 43.9782C40.1361 43.9782 39.1887 43.7041 38.3748 43.2268L37.5481 42.742L36.7608 43.2884C33.9912 45.2106 30.6294 46.3369 26.9999 46.3369C23.3705 46.3369 20.0087 45.2106 17.2391 43.2884L16.4518 42.742L15.625 43.22 [...]
+ stroke="#444FD9"
+ strokeWidth="3"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-category/components/icons/distributions-packaging-icon.tsx b/src/components/ecomsystem/ecomsystem-category/components/icons/distributions-packaging-icon.tsx
new file mode 100644
index 00000000000..e445f0ce6bb
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-category/components/icons/distributions-packaging-icon.tsx
@@ -0,0 +1,13 @@
+import React from 'react';
+
+export function DistributionsAndPackagingIcon() {
+ return (
+ <svg width="54" height="54" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <rect width="54" height="54" fill="white" />
+ <path
+ d="M8.48254 16.7281L17.3847 21.1986L35.9022 11.8995L29.0641 8.46558C27.7647 7.81307 26.2353 7.81307 24.9359 8.46558L8.48254 16.7281ZM19.9648 22.4942L38.4822 13.1952L45.5175 16.7281L27 26.0272L19.9648 22.4942ZM47 18.5749L28.1538 28.039V47.0238L44.4487 38.8409C46.0123 38.0557 47 36.4506 47 34.6948V18.5749ZM25.8462 47.0238V28.039L7 18.5749V34.6948C7 36.4506 7.9877 38.0557 9.55132 38.8409L25.8462 47.0238Z"
+ fill="#444FD9"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-category/components/tab-item.tsx b/src/components/ecomsystem/ecomsystem-category/components/tab-item.tsx
new file mode 100644
index 00000000000..771ec171e0c
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-category/components/tab-item.tsx
@@ -0,0 +1,34 @@
+import Link from '@docusaurus/Link';
+import React from 'react';
+import { ReactNode } from 'react';
+
+interface PriceTabProps {
+ title: string;
+ content: string;
+ icon: ReactNode;
+ active: boolean;
+ url: string;
+ setActive: () => void;
+}
+
+export function TabItem({ title, content, icon, active, setActive, url }: PriceTabProps) {
+ return (
+ <Link
+ to={url}
+ onClick={() => {
+ setActive();
+ }}
+ className={`lg:h-[7.75rem] w-full cursor-pointer rounded-lg bg-[#fff] px-4 lg:px-6 py-8 shadow-[0px_2px_8px_0px_rgba(49,77,136,0.16)] lg:flex-1 ${
+ active ? 'border-b-4 border-[#0065FD]' : ''
+ } hover:no-underline`}
+ >
+ <div className="flex items-center">
+ <div className={`pr-[0.75rem] text-[3.375rem] `}>{icon}</div>
+ <div>
+ <div className="text-base text-[#202124] font-misans sm:text-xl">{title}</div>
+ <div className=" pt-[0.3125rem] text-sm tracking-[-0.01rem] text-[#5F6368]">{content}</div>
+ </div>
+ </div>
+ </Link>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-category/ecomsystem-category.tsx b/src/components/ecomsystem/ecomsystem-category/ecomsystem-category.tsx
new file mode 100644
index 00000000000..e49be97a497
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-category/ecomsystem-category.tsx
@@ -0,0 +1,54 @@
+import { useLocation } from '@docusaurus/router';
+import React, { useState } from 'react';
+import { EcomsystemCategoryEnum } from '../ecomsystem.data';
+import { ClusterManagementIcon } from './components/icons/cluster-management-icon';
+import { ConnectorsIcon } from './components/icons/connectors-icon';
+import { DistributionsAndPackagingIcon } from './components/icons/distributions-packaging-icon';
+import { TabItem } from './components/tab-item';
+
+export default function EcomsystemCategory() {
+ const location = useLocation();
+ const pathnames = location.pathname.split('/');
+
+ const current = pathnames.length > 0 ? pathnames[pathnames.length - 1] : '';
+ let currentActive: EcomsystemCategoryEnum = EcomsystemCategoryEnum.ClusterManagement;
+
+ if (current === EcomsystemCategoryEnum.ClusterManagement) {
+ currentActive = EcomsystemCategoryEnum.ClusterManagement;
+ } else if (current === EcomsystemCategoryEnum.Connectors) {
+ currentActive = EcomsystemCategoryEnum.Connectors;
+ } else {
+ currentActive = EcomsystemCategoryEnum.DistributionsAndPackaging;
+ }
+
+ const [active, setActive] = useState<EcomsystemCategoryEnum | string>(currentActive);
+
+ return (
+ <div className="container mx-auto flex flex-col flex-wrap items-center justify-center gap-6 lg:flex-row -mt-[1.5rem]">
+ <TabItem
+ url={EcomsystemCategoryEnum.ClusterManagement}
+ setActive={() => setActive(EcomsystemCategoryEnum.ClusterManagement)}
+ active={active === EcomsystemCategoryEnum.ClusterManagement}
+ icon={<ClusterManagementIcon />}
+ title="Cluster management"
+ content="Easily deploy and maintain Doris clusters"
+ />
+ <TabItem
+ url={EcomsystemCategoryEnum.Connectors}
+ setActive={() => setActive(EcomsystemCategoryEnum.Connectors)}
+ active={active === EcomsystemCategoryEnum.Connectors}
+ icon={<ConnectorsIcon />}
+ title="Connectors"
+ content="Integrate with Flink, Spark, dbt and more"
+ />
+ <TabItem
+ url={EcomsystemCategoryEnum.DistributionsAndPackaging}
+ setActive={() => setActive(EcomsystemCategoryEnum.DistributionsAndPackaging)}
+ active={active === EcomsystemCategoryEnum.DistributionsAndPackaging}
+ icon={<DistributionsAndPackagingIcon />}
+ title={'Distributions'}
+ content="Complement Apache Doris"
+ />
+ </div>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout.tsx b/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout.tsx
new file mode 100644
index 00000000000..5085a36b85d
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout.tsx
@@ -0,0 +1,42 @@
+import { translate } from '@docusaurus/Translate';
+import React, { PropsWithChildren } from 'react';
+import PageHeader from '@site/src/components/PageHeader';
+import Layout from '@site/src/theme/Layout';
+import EcomsystemCategory from '@site/src/components/ecomsystem/ecomsystem-category/ecomsystem-category';
+import { ExternalLinkArrowIcon } from '../../Icons/external-link-arrow-icon';
+import GetStarted from '@site/src/components/get-started/get-started';
+import ExternalLink from '@site/src/components/external-link/external-link';
+
+export default function EcomsystemLayout(props: PropsWithChildren) {
+ const { children } = props;
+ return (
+ <Layout
+ title={translate({ id: 'ecosystem.title', message: 'Ecosystem' })}
+ // TODO update description
+ description={translate({
+ id: 'homepage.banner.subTitle',
+ message: 'An easy-to-use, high-performance and unified analytical database',
+ })}
+ wrapperClassName="ecosystem"
+ >
+ <PageHeader
+ title="Ecosystem"
+ subtitle="Break complexity in data integration and cluster management."
+ className="pt-20 px-4"
+ extra={
+ <div className="flex justify-center mt-5">
+ <ExternalLink
+ style={{ height: '3.25rem' }}
+ to="/docs/ecosystem/datax"
+ label="Explore more tools"
+ linkIcon={<ExternalLinkArrowIcon />}
+ ></ExternalLink>
+ </div>
+ }
+ />
+ <EcomsystemCategory />
+ {children}
+ <GetStarted />
+ </Layout>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem.data.ts b/src/components/ecomsystem/ecomsystem.data.ts
new file mode 100644
index 00000000000..5e8895cc559
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem.data.ts
@@ -0,0 +1,5 @@
+export enum EcomsystemCategoryEnum {
+ ClusterManagement = 'cluster-management',
+ Connectors = 'connectors',
+ DistributionsAndPackaging = 'distributions-and-packaging',
+}
diff --git a/src/components/external-link/external-link.scss b/src/components/external-link/external-link.scss
new file mode 100644
index 00000000000..43fee411901
--- /dev/null
+++ b/src/components/external-link/external-link.scss
@@ -0,0 +1,17 @@
+.external-link {
+ & + .external-link {
+ margin-left: 1.5rem;
+ }
+ > svg {
+ margin-left: 0.25rem;
+ margin-top: 1px;
+ }
+ &.primary-btn {
+ background: #444fd9;
+ color: #fff;
+ min-width: 10rem;
+ border-radius: 4px;
+ padding: 0 1.25rem;
+ height: 3rem;
+ }
+}
diff --git a/src/components/external-link/external-link.tsx b/src/components/external-link/external-link.tsx
new file mode 100644
index 00000000000..fa28345279b
--- /dev/null
+++ b/src/components/external-link/external-link.tsx
@@ -0,0 +1,22 @@
+import Link, { Props } from '@docusaurus/Link';
+import React, { ReactNode } from 'react';
+import { ExternalLinkIcon } from '../Icons/external-link-icon';
+import './external-link.scss';
+
+interface ExternalLinkProps extends Props {
+ label: string | ReactNode;
+ linkIcon?: boolean | ReactNode;
+ className?: string;
+}
+export default function ExternalLink(props: ExternalLinkProps) {
+ const { className = 'primary-btn', label, linkIcon = <ExternalLinkIcon />, ...rest } = props;
+ return (
+ <Link
+ {...rest}
+ className={`flex group items-center justify-center hover:no-underline external-link ${className}`}
+ >
+ <span className="mr-2">{label}</span>
+ <span className="transition-slide">{linkIcon}</span>
+ </Link>
+ );
+}
diff --git a/src/components/form-select/form-select.scss b/src/components/form-select/form-select.scss
new file mode 100644
index 00000000000..f23fb893a20
--- /dev/null
+++ b/src/components/form-select/form-select.scss
@@ -0,0 +1,82 @@
+.form-select {
+ .ant-select:not(.ant-select-customize-input) {
+ &.ant-select-focused {
+ .ant-select-selector {
+ box-shadow: none !important;
+ border-color: #444fd9 !important;
+ }
+ }
+ &:hover {
+ .ant-select-selector {
+ border-color: #444fd9 !important;
+ }
+ }
+ .ant-select-selector {
+ border-color: #dfe5f0;
+ }
+ .ant-select-arrow {
+ color: #4c576c;
+ font-size: 16px;
+ }
+ }
+}
+.form-select-select {
+ padding: 0.375rem 0;
+ border: 0.5px solid #dfe5f0;
+ box-shadow: 0px 2px 8px 0px rgba(49, 77, 136, 0.16);
+ &.ant-select-dropdown {
+ .ant-select-item-option-selected:not(.ant-select-item-option-disabled) {
+ color: #444fd9;
+ font-weight: 400;
+ background-color: transparent;
+ &:hover {
+ background-color: #f7f9fe;
+ }
+ }
+ .ant-select-item {
+ border-radius: 0;
+ }
+ }
+}
+
+.form-cascader {
+ border: 0.5px solid #dfe5f0;
+ box-shadow: 0px 2px 8px 0px rgba(49, 77, 136, 0.16);
+ .ant-cascader-menus {
+ .ant-cascader-menu {
+ padding: 6px 0;
+ @media (min-width: 640px) {
+ &:first-child {
+ min-width: 180px;
+ }
+ &:last-child {
+ min-width: 192px;
+ }
+ }
+
+ li.ant-cascader-menu-item-active {
+ color: #444fd9;
+ font-weight: 400;
+ background-color: transparent;
+ &:hover {
+ background-color: #f7f9fe;
+ }
+ .ant-cascader-menu-item-expand-icon {
+ color: #444fd9;
+ }
+ }
+ }
+ li.ant-cascader-menu-item {
+ .ant-cascader-menu-item-content {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ &:hover {
+ color: #1d1d1d;
+ background-color: #f7f9fe;
+ border-radius: 0;
+ }
+ }
+ }
+}
diff --git a/src/components/form-select/form-select.tsx b/src/components/form-select/form-select.tsx
new file mode 100644
index 00000000000..9c6d7075eeb
--- /dev/null
+++ b/src/components/form-select/form-select.tsx
@@ -0,0 +1,61 @@
+import { Cascader, Select } from 'antd';
+import React, { ReactNode } from 'react';
+import { ArrowDownIcon } from '../Icons/arrow-down-icon';
+import { Option } from '@site/src/constant/download.data';
+import './form-select.scss';
+
+export interface FormSelectProps {
+ value?: string | string[];
+ onChange?: (value: string | string[]) => void;
+ placeholder: string;
+ label: string;
+ options: Option[];
+ isCascader?: boolean;
+ displayRender?: (label, selectedOptions) => ReactNode;
+}
+
+export default function FormSelect({
+ value = '',
+ onChange,
+ label,
+ placeholder,
+ options,
+ isCascader = false,
+ displayRender = label => {
+ return label.length > 0 ? label[0] : '';
+ },
+}: FormSelectProps) {
+ return (
+ <div className="group relative z-0 w-full form-select">
+ {isCascader ? (
+ <Cascader
+ displayRender={displayRender}
+ suffixIcon={<ArrowDownIcon />}
+ allowClear={false}
+ value={value as string[]}
+ onChange={e => {
+ return onChange && onChange(e as string[]);
+ }}
+ options={options}
+ className={`peer block h-[3.5rem] w-full appearance-none rounded-lg bg-transparent text-sm text-[#1D1D1D] focus:border-blue-600 focus:outline-none focus:ring-0 dark:border-gray-600 dark:text-white dark:focus:border-blue-500`}
+ popupClassName="form-cascader"
+ />
+ ) : (
+ <Select
+ suffixIcon={<ArrowDownIcon />}
+ popupClassName="form-select-select"
+ value={value}
+ onChange={e => onChange && onChange(e || '')}
+ className={`peer block h-[3.5rem] w-full appearance-none rounded-lg bg-transparent text-sm text-[#1D1D1D] focus:border-blue-600 focus:outline-none focus:ring-0 dark:border-gray-600 dark:text-white dark:focus:border-blue-500`}
+ options={options}
+ />
+ )}
+ <label
+ htmlFor={label}
+ className="absolute left-2 top-5 z-10 origin-[0] -translate-y-7 scale-75 transform bg-[#fff] px-1 text-sm text-[#8592A6] duration-300 peer-placeholder-shown:translate-y-0 peer-placeholder-shown:scale-100 peer-hover:text-blue peer-focus:-translate-y-7 peer-focus:scale-75 peer-focus:font-medium peer-focus:text-blue-600 peer-[.ant-input-status-error]:text-[#ff4d4f] peer-[.ant-select-open]:text-blue-500 dark:text-gray-400"
+ >
+ {placeholder}
+ </label>
+ </div>
+ );
+}
diff --git a/src/components/get-started/get-started.data.ts b/src/components/get-started/get-started.data.ts
new file mode 100644
index 00000000000..7f3a6841b48
--- /dev/null
+++ b/src/components/get-started/get-started.data.ts
@@ -0,0 +1,17 @@
+export const GET_STARTED_DATA = {
+ title: 'Start a real-time analytical journey with Apache Doris',
+ description: '',
+ buttons: [
+ {
+ to: '/download',
+ text: 'Download',
+ className: 'w-[10.5rem] h-[3rem] bg-white rounded-lg text-[#444FD9]',
+ },
+ {
+ to: '/download#runAnywhere',
+ text: 'Run anywhere',
+ className:
+ 'w-[10.5rem] bg-transparent h-[3rem] rounded-lg text-white border-white border-[0.5px] border-solid hover:text-white',
+ },
+ ],
+};
diff --git a/src/components/get-started/get-started.tsx b/src/components/get-started/get-started.tsx
new file mode 100644
index 00000000000..0c6099d7493
--- /dev/null
+++ b/src/components/get-started/get-started.tsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import ExternalLink from '../external-link/external-link';
+import { ExternalLinkArrowIcon } from '../Icons/external-link-arrow-icon';
+import { GET_STARTED_DATA } from './get-started.data';
+
+export default function GetStarted() {
+ const data = GET_STARTED_DATA;
+ return (
+ <div className="relative overflow-hidden py-[5.5rem] bg-center bg-cover bg-[url(@site/static/images/ecomsystem/download-bg.png)]">
+ {/* <div className="border-[rgba(255, 255, 255, 0.63)] absolute top-0 h-[40rem] w-[40rem] -translate-x-2/3 -translate-y-2/3 transform rounded-full border-[20rem] bg-transparent opacity-10"></div>
+ <div className="border-[rgba(255, 255, 255, 0.63)] absolute bottom-0 right-0 h-[40rem] w-[40rem] translate-x-1/2 translate-y-1/2 transform rounded-full border-[20rem] bg-transparent opacity-10"></div> */}
+ <div className="container mx-auto">
+ <h2 className="text-center text-[2.75rem] font-[540] text-white lg:text-title-md">{data.title}</h2>
+ {data?.description && <div className="mt-4 text-center text-white">{data.description}</div>}
+ <div className="relative z-[1] mt-12 flex justify-center space-x-4 lg:space-x-10">
+ {data.buttons.map((item, index) => {
+ return (
+ <ExternalLink
+ label={item.text}
+ key={index}
+ {...item}
+ linkIcon={<ExternalLinkArrowIcon />}
+ />
+ );
+ })}
+ </div>
+ </div>
+ </div>
+ );
+}
diff --git a/src/components/link-arrow/index.tsx b/src/components/link-arrow/index.tsx
new file mode 100644
index 00000000000..1d5688eba94
--- /dev/null
+++ b/src/components/link-arrow/index.tsx
@@ -0,0 +1,44 @@
+import Link from '@docusaurus/Link';
+import React from 'react';
+
+interface ReadMoreProps {
+ to: string;
+ className?: string;
+ text: string | React.ReactNode;
+}
+
+export default function LinkWithArrow(props: ReadMoreProps) {
+ return (
+ <Link
+ className={`flex group text-primary items-center text-base cursor-pointer hover:no-underline ${props?.className}`}
+ to={props.to}
+ >
+ <span className="mr-2">{props.text}</span>
+ <span className="transition-slide">
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ className="transition-slide"
+ width="16"
+ height="14"
+ viewBox="0 0 16 14"
+ fill="none"
+ >
+ <path
+ d="M9.37549 12.3542L14.8755 6.85419L9.37549 1.35419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M1.12549 6.85419L14.8755 6.85419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
+ </span>
+ </Link>
+ );
+}
diff --git a/src/components/progress/progress.tsx b/src/components/progress/progress.tsx
new file mode 100644
index 00000000000..79d8cf4c2f0
--- /dev/null
+++ b/src/components/progress/progress.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+export function Progress({ percent }: { percent: number }) {
+ return (
+ <div className="h-0.5 w-[calc(100%-1.5rem)] bg-neutral-200 dark:bg-neutral-600 progress">
+ <div className="h-0.5 bg-primary" style={{ width: `${percent}%` }}></div>
+ </div>
+ );
+}
diff --git a/src/constant/core-capabilities.data.tsx b/src/constant/core-capabilities.data.tsx
new file mode 100644
index 00000000000..fa5b6402a48
--- /dev/null
+++ b/src/constant/core-capabilities.data.tsx
@@ -0,0 +1,133 @@
+import React from 'react';
+
+export const CoreCapabilitiesData = [
+ {
+ title: 'Real-time ingestion and storage',
+ content:
+ 'Push-based micro-batch and pull-based streaming data ingestion within a second. Storage engine with real-time upsert, append and pre-aggregation.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <path
+ d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48ZM22.6666 29.3337L18.6666 25.3337L11.9999 25.3337C11.9999 25.3337 12.7333 21.2937 14.6666 20.0004C16.8266 18.5604 21.3333 20.0004 21.3333 20.0004L21.1748 20.3173C21.2272 20.2336 21.28 20.1502 21.3333 20.067C22.8868 17.583 25.0501 15.5377 27.6173 14.1258C30.1844 12.7138 33.0702 11.9822 35.9999 12.0003C35.9999 15.627 34.9599 22.0003 27.9999 26.667C27.9999 2 [...]
+ fill="#444FD9"
+ />
+ <path
+ d="M14.9332 29.2177C12.9332 30.8977 12.2665 35.8844 12.2665 35.8844C12.2665 35.8844 17.2532 35.2177 18.9332 33.2177C19.8799 32.0977 19.8665 30.3777 18.8132 29.3377C18.2949 28.8431 17.6123 28.5572 16.8962 28.5351C16.1801 28.5129 15.481 28.756 14.9332 29.2177Z"
+ fill="#DFE0F7"
+ />
+ </svg>
+ ),
+ },
+ {
+ title: 'Lightning-fast query',
+ content:
+ 'Optimize for high-concurrency and high-throughput queries with columnar storage engine, MPP architecture, cost based query optimizer, vectorized execution engine.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <g clip-path="url(#clip0_1665_614)">
+ <path
+ d="M26.9393 20.9393C27.5251 20.3536 28.4748 20.3536 29.0606 20.9393C29.6464 21.5251 29.6464 22.4749 29.0606 23.0607L25.0606 27.0607C24.4748 27.6464 23.5251 27.6464 22.9393 27.0607C22.3535 26.4749 22.3535 25.5251 22.9393 24.9393L26.9393 20.9393Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M0 24C0 10.7452 10.7452 0 24 0C37.2548 0 48 10.7452 48 24C48 37.2548 37.2548 48 24 48C10.7452 48 0 37.2548 0 24ZM23.9999 15C17.6487 15 12.4999 20.1487 12.4999 26.5C12.4999 32.8513 17.6487 38 23.9999 38C30.3512 38 35.4999 32.8513 35.4999 26.5C35.4999 20.1487 30.3512 15 23.9999 15Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M20 9.5C19.1716 9.5 18.5 10.1716 18.5 11C18.5 11.8284 19.1716 12.5 20 12.5H22.5001V15.0969C22.991 15.033 23.4916 15 24 15C24.5084 15 25.0091 15.033 25.5001 15.0969V12.5H28C28.8284 12.5 29.5 11.8284 29.5 11C29.5 10.1716 28.8284 9.5 28 9.5H20Z"
+ fill="#C0C3F1"
+ />
+ <path
+ d="M35.1546 14.0334C34.5649 13.4561 33.6195 13.4636 33.039 14.0502C32.4585 14.6369 32.461 15.5823 33.0446 16.1659L34.9393 18.0607C35.5251 18.6464 36.4749 18.6464 37.0607 18.0607C37.6464 17.4749 37.6464 16.5251 37.0607 15.9393L36.2598 15.1385C36.2154 15.0799 36.1662 15.0238 36.112 14.9708L35.1546 14.0334Z"
+ fill="#C0C3F1"
+ />
+ </g>
+ <defs>
+ <clipPath id="clip0_1665_614">
+ <rect width="48" height="48" fill="white" />
+ </clipPath>
+ </defs>
+ </svg>
+ ),
+ },
+ {
+ title: 'Federated querying',
+ content:
+ 'Federated querying of data lakes such as Hive, Iceberg and Hudi, and databases such as MySQL and PostgreSQL.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <path
+ d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48ZM14.9999 13H28.9999C30.1045 13 30.9999 13.8954 30.9999 15V29C30.9999 30.1046 30.1045 31 28.9999 31H14.9999C13.8954 31 12.9999 30.1046 12.9999 29V15C12.9999 13.8954 13.8954 13 14.9999 13Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M16.9999 31V33C16.9999 34.1046 17.8954 35 18.9999 35H32.9999C34.1045 35 34.9999 34.1046 34.9999 33V19C34.9999 17.8954 34.1045 17 32.9999 17H30.9999V29C30.9999 30.1046 30.1045 31 28.9999 31H16.9999Z"
+ fill="#C0C3F1"
+ />
+ </svg>
+ ),
+ },
+ {
+ title: 'Semi-structured data',
+ content:
+ 'Compound data types such as Array, Map and JSON. Variant data type to support auto data type inference of JSON data. NGram bloomfilter and inverted index for text searches.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <path
+ fill-rule="evenodd"
+ clip-rule="evenodd"
+ d="M48 24C48 37.2548 37.2548 48 24 48C10.7452 48 0 37.2548 0 24C0 10.7452 10.7452 0 24 0C37.2548 0 48 10.7452 48 24ZM9.99994 15C9.99994 13.8954 10.8954 13 11.9999 13H35.9999C37.1045 13 37.9999 13.8954 37.9999 15V24H36.7852V19.4688H35.1562V24H34.7232L32.4551 19.4688H30.8203V24H29.5723V23.0723C29.5723 22.4551 29.498 21.916 29.3496 21.4551C29.2051 20.9902 28.9961 20.6035 28.7227 20.2949C28.4492 19.9824 28.125 19.748 27.75 19.5918C27.375 19.4316 26.959 19.3516 26.502 19.3 [...]
+ fill="#444FD9"
+ />
+ <path
+ fill-rule="evenodd"
+ clip-rule="evenodd"
+ d="M20.6661 25.3384C20.6934 25.4634 20.7071 25.6021 20.7071 25.7544C20.7071 25.938 20.6778 26.1021 20.6192 26.2466C20.5606 26.3911 20.463 26.5063 20.3262 26.5923C20.1934 26.6782 20.0137 26.7212 19.7872 26.7212C19.588 26.7212 19.4102 26.6958 19.254 26.645C19.1016 26.5903 18.9727 26.5103 18.8672 26.4048C18.7618 26.2954 18.6837 26.1509 18.6329 25.9712C18.5821 25.7876 18.5567 25.5669 18.5567 25.3091H16.8399C16.8399 25.7935 16.9161 26.2134 17.0684 26.5688C17.2208 26.9204 1 [...]
+ fill="#DFE0F7"
+ />
+ </svg>
+ ),
+ },
+ {
+ title: 'Elastic architecture',
+ content:
+ 'Distributed design for linear scalability. Workload isolation and tiered storage for efficient resource management. Supports shared-nothing clusters as well as separation of storage and compute.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <path
+ d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48ZM12.8707 14.7307C14.6213 15.8848 18.5703 18 23.9999 18C29.4296 18 33.3786 15.8848 35.1292 14.7307C35.7319 14.3334 36.5033 14.3838 36.805 15.0396C37.3401 16.2026 37.9999 18.5408 37.9999 23C37.9999 27.4592 37.3401 29.7974 36.805 30.9604C36.5033 31.6162 35.7319 31.6666 35.1292 31.2693C33.3786 30.1152 29.4296 28 23.9999 28C18.5703 28 14.6213 30.1152 12.8707 [...]
+ fill="#444FD9"
+ />
+ <path
+ d="M12.8708 13.7308C14.6214 14.8849 18.5704 17.0001 24 17.0001C29.4296 17.0001 33.3786 14.8849 35.1292 13.7308C35.7319 13.3335 36.5033 13.384 36.8051 14.0397C37.3401 15.2027 38 17.5409 38 22.0001C38 26.4593 37.3401 28.7975 36.8051 29.9605C36.5033 30.6163 35.7319 30.6667 35.1292 30.2694C33.3786 29.1153 29.4296 27.0001 24 27.0001C18.5704 27.0001 14.6214 29.1153 12.8708 30.2694C12.2681 30.6667 11.4967 30.6163 11.1949 29.9605C10.6599 28.7975 10 26.4593 10 22.0001C10 17.54 [...]
+ fill="white"
+ />
+ <path
+ d="M10.0007 22.25C10.0002 22.3327 10 22.416 10 22.5001C10 27.4153 11.2026 31.2568 12.0315 33.3208C12.3553 34.127 13.4296 34.2488 14.0796 33.6725C15.7504 32.1912 19.0572 30.0001 24 30.0001C28.9428 30.0001 32.2496 32.1912 33.9204 33.6725C34.5704 34.2488 35.6447 34.127 35.9685 33.3208C36.7974 31.2568 38 27.4153 38 22.5001C38 22.416 37.9998 22.3327 37.9993 22.25C37.9752 26.547 37.33 28.8194 36.8051 29.9605C36.5033 30.6163 35.7319 30.6667 35.1292 30.2694C33.3786 29.1153 29 [...]
+ fill="#C0C3F1"
+ />
+ </svg>
+ ),
+ },
+ {
+ title: 'Open ecosystem',
+ content:
+ 'Compatible with MySQL protocol and ANSI SQL, easily integrated with BI tools. Provide open data API to be accessible for external compute engines like Spark, Flink and ML/AI.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <path
+ fill-rule="evenodd"
+ clip-rule="evenodd"
+ d="M48 24C48 37.2548 37.2548 48 24 48C10.7452 48 0 37.2548 0 24C0 10.7452 10.7452 0 24 0C37.2548 0 48 10.7452 48 24ZM24.2579 24.9953C24.1724 24.9984 24.0864 25 24.0001 25C20.1341 25 17.0001 21.866 17.0001 18C17.0001 14.134 20.1341 11 24.0001 11C27.8661 11 31.0001 14.134 31.0001 18C31.0001 19.4893 30.535 20.8699 29.7421 22.0047C29.8277 22.0016 29.9137 22 30 22C33.866 22 37 25.134 37 29C37 32.866 33.866 36 30 36C26.134 36 23 32.866 23 29C23 27.5107 23.4651 26.1301 24.25 [...]
+ fill="#444FD9"
+ />
+ <path
+ fill-rule="evenodd"
+ clip-rule="evenodd"
+ d="M24 25.3924C23.3652 26.446 23 27.6803 23 29C23 30.3197 23.3652 31.554 24 32.6076C22.7751 34.6404 20.5463 36 18 36C14.134 36 11 32.866 11 29C11 25.134 14.134 22 18 22C20.5463 22 22.7751 23.3596 24 25.3924Z"
+ fill="#C0C3F1"
+ />
+ </svg>
+ ),
+ },
+];
diff --git a/src/constant/download.data.ts b/src/constant/download-archive.data.ts
similarity index 100%
copy from src/constant/download.data.ts
copy to src/constant/download-archive.data.ts
diff --git a/src/constant/download.data.ts b/src/constant/download.data.ts
index 78f1e2a24e2..2948bc8f7e4 100644
--- a/src/constant/download.data.ts
+++ b/src/constant/download.data.ts
@@ -1,700 +1,374 @@
-interface item {
+export interface Option {
label: string;
- links: {
- source: string;
- signature: string;
- sha512: string;
- };
+ value: string;
+ gz?: string;
+ asc?: string;
+ sha512?: string;
+ source?: string;
+ children?: Option[];
+ majorVersion?: string;
}
-export interface DownloadLinkProps {
- id: string;
- sh?: item;
- items: item[];
-}
-
-const APACHE_LINK = 'https://www.apache.org/dyn/mirrors/mirrors.cgi?action=download&filename=';
-const APACHE_DOWNLOAD_LINK = 'https://downloads.apache.org/';
-const CHINA_MIRROR_LINK = 'https://mirrors.tuna.tsinghua.edu.cn/apache/';
-
-const FLINK_CONNECTOR_LINK = 'https://dist.apache.org/repos/dist/release/';
-const CHINA_FLINK_CONNECTOR_MIRROR_LINK = CHINA_MIRROR_LINK;
-
-const SPARK_CONNECTOR_LINK = 'https://dist.apache.org/repos/dist/release/';
-const CHINA_SPARK_CONNECTOR_MIRROR_LINK = CHINA_MIRROR_LINK;
-
-const ALL_RELEASE_LINK = 'https://archive.apache.org/dist/';
-// There is no mirror site for archieve in China, so use same link.
-const CHINA_ALL_RELEASE_MIRROR_LINK = 'https://archive.apache.org/dist/';
-
-const ORIGIN = 'https://apache-doris-releases.oss-accelerate.aliyuncs.com/';
-const APACHE_ARCHIVE = 'https://archive.apache.org/dist/';
-
-export function getAllDownloadLinks(locale: string) {
- const sources = locale.toLocaleUpperCase() === 'EN' ? APACHE_LINK : CHINA_MIRROR_LINK;
- const shSource = locale.toLocaleUpperCase() === 'EN' ? 'apache' : 'tsinghua';
- return [
- {
- id: '2.0.3-intel-avx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.3-bin-x64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.3-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.3-intel-noavx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.3-bin-x64-noavx2.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.3-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.3-arm-jdk8',
- sh: {
- label: 'apache-doris-2.0.3-bin-arm64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.3-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.2-intel-avx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.2-bin-x64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.2-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.2-intel-noavx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.2-bin-x64-noavx2.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.2-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.2-arm-jdk8',
- sh: {
- label: 'apache-doris-2.0.2-bin-arm64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.2-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.1.1-intel-avx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.1.1-bin-x64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.1.1-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.1.1-intel-noavx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.1.1-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.1.1-arm-jdk8',
- sh: {
- label: 'apache-doris-2.0.1.1-bin-arm64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.1.1-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.2.7.1-intel-avx2-jdk8',
- sh: {
- label: 'apache-doris-1.2.7.1-bin-x64.tar.xz',
- links: {
- source: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz`,
- signature: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz.asc`,
- sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-1.2.7.1-src.tar.gz',
- links: {
- source: `${APACHE_ARCHIVE}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.2.7.1-intel-noavx2-jdk8',
- sh: {
- label: 'apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz',
- links: {
- source: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz`,
- signature: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz.asc`,
- sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-1.2.7.1-src.tar.gz',
- links: {
- source: `${APACHE_ARCHIVE}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.2.7.1-arm-jdk8',
- sh: {
- label: 'apache-doris-1.2.7.1-bin-arm64.tar.xz',
- links: {
- source: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz`,
- signature: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz.asc`,
- sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-1.2.7.1-src.tar.gz',
- links: {
- source: `${APACHE_ARCHIVE}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.1.5-intel-avx2-jdk8',
- items: [
- {
- label: 'apache-doris-fe-1.1.5-bin.tar.gz',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.sha512`,
- },
- },
- {
- label: 'apache-doris-be-1.1.5-bin-x86_64.tar.gz',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.1.5-intel-noavx2-jdk8',
- items: [
- {
- label: 'apache-doris-fe-1.1.5-bin.tar.gz',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.sha512`,
- },
- },
- {
- label: 'apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.1.5-arm-jdk8',
- items: [
- {
- label: 'apache-doris-fe-1.1.5-bin.tar.gz',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.sha512`,
- },
- },
- {
- label: 'apache-doris-1.1.5-bin-arm.tar.gz ',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-arm.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-arm.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-arm.tar.gz.sha512`,
- },
- },
- ],
- },
- ];
-}
-
-export function getAllFlinkConnectorDownloadLinks(locale: string) {
- const sources = locale.toLocaleUpperCase() === 'EN' ? FLINK_CONNECTOR_LINK : CHINA_FLINK_CONNECTOR_MIRROR_LINK;
- return [
- {
- version: '1.4.0',
- date: '2023-06-16',
- flink: '1.17',
- scala: '2.12, 2.11',
- doris: '1.0+',
- download: `${sources}doris/flink-connector/1.4.0/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.3.0',
- date: '2022-12-07',
- flink: '1.16',
- scala: '2.12, 2.11',
- doris: '1.0+',
- download: `${sources}doris/flink-connector/1.3.0/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.2.1',
- date: '2022-12-07',
- flink: '1.15',
- scala: '2.12, 2.11',
- doris: '1.0+',
- download: `${sources}doris/flink-connector/1.2.1/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.1.1',
- date: '2021-12-07',
- flink: '1.14',
- scala: '2.12, 2.11',
- doris: '1.0+',
- download: `${sources}doris/flink-connector/1.1.1/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.2.0',
- date: '2022-08-15',
- flink: '1.15',
- scala: '2.12, 2.11',
- doris: '1.0+',
- download: `${sources}doris/flink-connector/1.2.0/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.1.0',
- date: '2022-07-11',
- flink: '1.14',
- scala: '2.12, 2.11',
- doris: '0.15+',
- download: `${sources}doris/flink-connector/1.1.0/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.0.3',
- date: '2021-03-18',
- flink: '1.14, 1.13, 1.12, 1.11',
- scala: '2.12, 2.11',
- doris: '0.15+',
- download: `${sources}doris/flink-connector/1.0.3/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- ];
-}
-export function getAllSparkConnectorDownloadLinks(locale: string) {
- const sources = locale.toLocaleUpperCase() === 'EN' ? SPARK_CONNECTOR_LINK : CHINA_SPARK_CONNECTOR_MIRROR_LINK;
- return [
- {
- version: '1.1.0',
- date: '2022-07-11',
- spark: '3.2, 3.1, 2.3',
- scala: '2.12, 2.11',
- doris: '0.15+',
- download: `${sources}doris/spark-connector/1.1.0/`,
- github: 'https://github.com/apache/doris-spark-connector',
- },
- {
- version: '1.0.1',
- date: '2021-03-18',
- spark: '3.1, 2.3',
- scala: '2.12, 2.11',
- doris: '0.15+',
- download: `${sources}doris/spark-connector/1.0.1/`,
- github: 'https://github.com/apache/doris-spark-connector',
- },
- ];
+export enum CPUEnum {
+ X64 = 'x64 (avx2)',
+ X64NoAvx2 = 'x64 (no avx2)',
+ ARM64 = 'arm64',
}
-export function getAllRelease(locale: string) {
- const sources = locale.toLocaleUpperCase() === 'EN' ? ALL_RELEASE_LINK : CHINA_ALL_RELEASE_MIRROR_LINK;
- return [
- {
- version: '2.0.3 ( Latest )',
- date: '2023-12-14',
- note: '/docs/releasenotes/release-2.0.3/',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- }
- ]
- },
- {
- version: '2.0.2',
- date: '2023-10-07',
- note: '/docs/dev/releasenotes/release-2.0.2',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- }
- ]
- },
- {
- version: '2.0.1',
- date: '2023-09-26',
- note: '/docs/dev/releasenotes/release-2.0.1',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- }
- ]
- },
- {
- version: '2.0.0',
- date: '2023-08-11',
- note: '/docs/dev/releasenotes/release-2.0.1',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.0-bin-x64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.1/apache-doris-2.0.0-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.0-bin-x64-noavx2.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.0/apache-doris-2.0.0-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-2.0.0-bin-arm64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.0/apache-doris-2.0.0-src.tar.gz`,
- }
- ]
- },
- {
- version: '1.2.7.1',
- date: '2023-09-04',
- note: '/docs/dev/releasenotes/release-1.2.7.1',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- }
- ]
- },
- {
- version: '1.2.6',
- date: '2023-07-17',
- note: '/docs/dev/releasenotes/release-1.2.6',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.6-bin-x64.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.6-rc03/apache-doris-1.2.6-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.6-bin-x64-noavx2.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.6-rc03/apache-doris-1.2.6-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-1.2.6-bin-arm64.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.6-rc03/apache-doris-1.2.6-src.tar.gz`,
- }
- ]
- },
- {
- version: '1.2.4',
- date: '2023-04-27',
- note: '/docs/dev/releasenotes/release-1.2.4',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.4.1-bin-x86_64.tar.xz`,
- source: `${sources}doris/1.2/1.2.4.1-rc01/apache-doris-1.2.4.1-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.4.1-bin-x86_64-noavx2.tar.xz`,
- source: `${sources}doris/1.2/1.2.4.1-rc01/apache-doris-1.2.4.1-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-1.2.4.1-bin-aarch64.tar.xz`,
- source: `${sources}doris/1.2/1.2.4.1-rc01/apache-doris-1.2.4.1-src.tar.gz`,
- }
- ]
- },
- {
- version: '1.2.3',
- date: '2023-03-20',
- note: '/docs/dev/releasenotes/release-1.2.3',
- download: `${sources}doris/1.2/1.2.3-rc02/`,
- },
- {
- version: '1.2.2 ',
- date: '2023-02-14',
- note: '/docs/dev/releasenotes/release-1.2.2',
- download: `${sources}doris/1.2/1.2.2-rc01/`,
- },
- {
- version: '1.2.1',
- date: '2023-01-04',
- note: '/docs/dev/releasenotes/release-1.2.1',
- download: `${sources}doris/1.2/1.2.1-rc01/`,
- },
- {
- version: '1.1.5',
- date: '2022-12-20',
- note: '/docs/dev/releasenotes/release-1.1.5',
- download: `${sources}doris/1.1/1.1.5-rc02/`,
- },
- {
- version: '1.1.4',
- date: '2022-11-11',
- note: '/docs/dev/releasenotes/release-1.1.4',
- download: `${sources}doris/1.1/1.1.4-rc01/`,
- },
- {
- version: '1.1.3',
- date: '2022-10-17',
- note: '/docs/dev/releasenotes/release-1.1.3',
- download: `${sources}doris/1.1/1.1.3-rc02/`,
- },
- {
- version: '1.1.2',
- date: '2022-09-13',
- note: '/docs/dev/releasenotes/release-1.1.2',
- download: `${sources}doris/1.1/1.1.2-rc05/`,
- },
- {
- version: '1.1.1',
- date: '2022-07-29',
- note: '/docs/dev/releasenotes/release-1.1.1',
- download: `${sources}doris/1.1/1.1.1/`,
- },
- {
- version: '1.1.0',
- date: '2022-07-14',
- note: '/docs/dev/releasenotes/release-1.1.0',
- download: `${sources}doris/1.1/1.1.0-rc05/`,
- },
- {
- version: '0.15.0',
- date: '2021-11-29',
- note: 'https://github.com/apache/doris/issues/6806',
- download: `${sources}doris/0.15.0-incubating/`,
- },
- {
- version: '0.14.0',
- date: '2021-05-26',
- note: 'https://github.com/apache/doris/issues/5374',
- download: `${sources}doris/0.14.0-incubating/`,
- },
- {
- version: '0.13.0',
- date: '2020-10-24',
- note: 'https://github.com/apache/doris/issues/4370',
- download: `${sources}doris/0.13.0-incubating/`,
- },
- ];
+export enum SuffixEnum {
+ GZ = '.tar.gz',
+ ASC = '.tar.gz.asc',
+ SHA512 = '.tar.gz.sha512',
}
-export enum VersionEnum {
- Latest = '2.0.3',
- Prev = '1.2.7.1',
- Earlier = '1.1.5',
-}
+const ORIGIN = 'https://apache-doris-releases.oss-accelerate.aliyuncs.com/';
-export enum CPUEnum {
- IntelAvx2 = 'intel-avx2',
- IntelNoAvx2 = 'intel-noavx2',
- ARM = 'arm',
-}
+export const DORIS_VERSIONS: Option[] = [
+ {
+ label: '2.0.3',
+ value: '2.0.3',
+ majorVersion: '2.0',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.3/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.3/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.3/',
+ },
+ ],
+ },
+ {
+ label: '2.0.2',
+ value: '2.0.2',
+ majorVersion: '2.0',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-2.0.2.1-bin-x64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.2.1-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.2.1-bin-x64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.2.1/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-2.0.2.1-bin-x64-noavx2.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.2.1-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.2.1-bin-x64-noavx2.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.2.1/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-2.0.2.1-bin-arm64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.2.1-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.2.1-bin-arm64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.2.1/',
+ },
+ ],
+ },
+ {
+ label: '2.0.1',
+ value: '2.0.1',
+ majorVersion: '2.0',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.1.1/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.1.1/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.1.1/',
+ },
+ ],
+ },
+ {
+ label: '2.0.0',
+ value: '2.0.0',
+ majorVersion: '2.0',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-2.0.0-bin-x64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.0-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.0-bin-x64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.0/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-2.0.0-bin-x64-noavx2.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.0-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.0-bin-x64-noavx2.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.0/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-2.0.0-bin-arm64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.0-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.0-bin-arm64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.0/',
+ },
+ ],
+ },
+ {
+ label: '1.2.7',
+ value: '1.2.7',
+ majorVersion: '1.2',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.7.1/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.7.1/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.7.1/',
+ },
+ ],
+ },
+ {
+ label: '1.2.6',
+ value: '1.2.6',
+ majorVersion: '1.2',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-1.2.6-bin-x64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.6-bin-x64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.6-bin-x64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.6-rc03/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-1.2.6-bin-x64-noavx2.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.6-bin-x64-noavx2.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.6-bin-x64-noavx2.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.6-rc03/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-1.2.6-bin-arm64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.6-bin-arm64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.6-bin-arm64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.6-rc03/',
+ },
+ ],
+ },
+ {
+ label: '1.2.5',
+ value: '1.2.5',
+ majorVersion: '1.2',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-1.2.5-bin-x86_64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.5-bin-x86_64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.5-bin-x86_64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.5-rc01/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-1.2.5-bin-x86_64-noavx2.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.5-bin-x86_64-noavx2.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.5-bin-x86_64-noavx2.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.5-rc01/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-1.2.5-bin-aarch64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.5-bin-aarch64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.5-bin-aarch64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.5-rc01/',
+ },
+ ],
+ },
+ {
+ label: '1.2.4',
+ value: '1.2.4',
+ majorVersion: '1.2',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-1.2.4.1-bin-x86_64.tar.xz`,
+ asc: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ sha512: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ source: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-1.2.5-bin-x86_64-noavx2.tar.xz`,
+ asc: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ sha512: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ source: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-1.2.5-bin-aarch64.tar.xz`,
+ asc: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ sha512: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ source: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ },
+ ],
+ },
+];
-export enum CPUDownloadEnum {
- IntelAvx2 = 'x86_64',
- IntelNoAvx2 = 'x86_64-noavx2',
- ARM = 'arm',
-}
+export const OLD_VERSIONS: Option[] = [
+ {
+ label: '1.2',
+ value: '1.2',
+ children: [
+ {
+ label: '1.2.3',
+ value: '1.2.3',
+ source: 'https://archive.apache.org/dist/doris/1.2/1.2.3-rc02/',
+ },
+ {
+ label: '1.2.2',
+ value: '1.2.2',
+ source: 'https://archive.apache.org/dist/doris/1.2/1.2.2-rc01/',
+ },
+ {
+ label: '1.2.1',
+ value: '1.2.1',
+ source: 'https://archive.apache.org/dist/doris/1.2/1.2.1-rc01/',
+ },
+ ],
+ },
+ {
+ label: '1.1',
+ value: '1.1',
+ children: [
+ {
+ label: '1.1.5',
+ value: '1.1.5',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.5-rc02/',
+ },
+ {
+ label: '1.1.4',
+ value: '1.1.4',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.4-rc01/',
+ },
+ {
+ label: '1.1.3',
+ value: '1.1.3',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.3-rc02/',
+ },
+ {
+ label: '1.1.2',
+ value: '1.1.2',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.2-rc05/',
+ },
+ {
+ label: '1.1.1',
+ value: '1.1.1',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.1-rc03/',
+ },
+ {
+ label: '1.1.0',
+ value: '1.1.0',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.0-rc05/',
+ },
+ ],
+ },
+ {
+ label: '0.x',
+ value: '0.x',
+ children: [
+ {
+ label: '0.15.0',
+ value: '0.15.0',
+ source: 'https://archive.apache.org/dist/doris/0.15.0-incubating/',
+ },
+ {
+ label: '0.14.0',
+ value: '0.14.0',
+ source: 'https://archive.apache.org/dist/doris/0.14.0-incubating/',
+ },
+ {
+ label: '0.13.0',
+ value: '0.13.0',
+ source: 'https://archive.apache.org/dist/doris/0.13.0-incubating/',
+ },
+ ],
+ },
+];
-export enum JDKEnum {
- JDK8 = 'jdk8',
- JDK11 = 'jdk11',
-}
+export const RUN_ANYWHERE = [
+ {
+ title: 'Doris on bare metal',
+ description: 'A platform for visualized cluster deployment on bare metal or VM.',
+ link: 'https://doris.apache.org/docs/install/standard-deployment',
+ },
+ {
+ title: 'Doris on K8s',
+ description: 'Create, configure and manage Doris clusters on Kubernetes',
+ link: 'https://doris.apache.org/docs/install/k8s-deploy',
+ },
+ {
+ title: 'Doris on AWS',
+ description: 'Deploy Doris on AWS with CloudFormation templates',
+ link: 'https://doris-cf-template.s3.amazonaws.com/cloudformation_doris.template.yaml',
+ },
+];
diff --git a/src/constant/generate-user.mjs b/src/constant/generate-user.mjs
new file mode 100644
index 00000000000..6e35e7e1b11
--- /dev/null
+++ b/src/constant/generate-user.mjs
@@ -0,0 +1,20 @@
+import USERS_JSON from './users.json' assert { type: "json" };
+
+import fs from 'fs';
+function generateUser() {
+ const USERS = USERS_JSON.map((user, index) => {
+ const newUser = {};
+ newUser.story = user['公司介绍'];
+ newUser.name = user['英文名字'].trim();
+ newUser.category = user['行业分类'];
+ newUser.category = user['行业分类'];
+ newUser.logo = user['英文名字'].trim();
+ newUser.order = index;
+ newUser.to = user['博客链接'];
+ newUser.image = `/images/user-logo/${newUser.category}/${newUser.name}.jpg`;
+ return newUser;
+ });
+ fs.writeFileSync('./src/constant/users.data.json', JSON.stringify(USERS))
+}
+
+generateUser();
\ No newline at end of file
diff --git a/src/constant/newsletter.data.ts b/src/constant/newsletter.data.ts
index 2c4642c2db4..a3109a7755b 100644
--- a/src/constant/newsletter.data.ts
+++ b/src/constant/newsletter.data.ts
@@ -1,18 +1,32 @@
export const NEWSLETTER_DATA = [
{
- tag: 'Best Practice',
- title: 'Empowering cyber security by enabling 7 times faster log analysis',
- to: 'blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis',
+ tags: ['Top News'],
+ title: 'Apache Doris Summit Asia 2023: what can you expect from Apache Doris as a data warehouse?',
+ content:
+ 'When it is cranberry and pumpkin season, we had the unforgettable Apache Doris Summit Asia 2023 with our remarkable committers, users, and community partners, to honor what we have achieved in the past year, and provide a preview of where we are going next.',
+ to: '/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse',
+ image: 'newsletter-1.png',
},
- {
- tag: 'Release Notes',
- title: 'Apache Doris 2.0.3 just released ',
- to: 'https://doris.apache.org/blog/release-note-2.0.3',
- hot: true,
+ {
+ tags: ['Tech Sharing'],
+ title: 'Introduction to Apache Doris: a next-generation real-time data warehouse',
+ content:
+ 'This is a technical overview of Apache Doris, introducing how it enables fast query performance with its architectural design, features, and mechanisms.',
+ to: '/blog/introduction-to-apache-doris-a-next-generation-real-time-data-warehouse',
+ image: 'newsletter-2.png',
},
{
- tag: 'Top News',
- title: `Apache Doris Summit Asia 2023: What can you expect from Apache Doris as a data warehouse?`,
- to: '/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse',
+ tags: ['Tech Sharing'],
+ title: 'Log analysis: Elasticsearch vs Apache Doris',
+ content: `As a major part of a company's data asset, logs brings values to businesses in three aspects: system observability, cyber security, and data analysis. They are your first resort for troubleshooting, your reference for improving system security, and your data mine where you can extract information that points to business growth.`,
+ to: '/blog/log-analysis-elasticsearch-vs-apache-doris',
+ image: 'newsletter-3.png',
+ },
+ {
+ tags: ['Best Practice'],
+ title: 'LLM-powered OLAP: the Tencent application with Apache Doris',
+ content: `The exploration of a LLM+OLAP solution is a bumpy journey, but phew, it now works well for the Tencent case, and they're writing down every lesson learned to share with you.`,
+ to: '/blog/Tencent-LLM',
+ image: 'newsletter-4.jpeg',
},
];
diff --git a/src/constant/user.data.tsx b/src/constant/user.data.tsx
new file mode 100644
index 00000000000..3bcb2a5d3de
--- /dev/null
+++ b/src/constant/user.data.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+
+export const USER_STORIES_CATEGORIES = [
+ 'All',
+ 'Finance',
+ 'Technology',
+ 'Media & Entertainment',
+ 'Telecom & Manufacturing',
+ 'FMCG & Logistics',
+ 'Commercial Distribution',
+];
+
+export const USER_STORIES = [
+ {
+ title: '“Processing 10 billions rows of data every day with 10,000 QPS and achieve a query latency of just 150ms”',
+ author: {
+ name: 'Li Zhe',
+ title: 'Senior software engineer, JD.com',
+ },
+ to: 'blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents',
+ image: 'user-jd.jpg',
+ },
+ {
+ title: '“Reducing costs and increasing service availability, large language models empower Doris-based OLAP service”',
+ author: {
+ name: 'Jun Zhang, Lei Luo',
+ title: 'Senior software engineer, Tencent',
+ },
+ to: 'blog/Tencent-LLM',
+ image: 'tme.png',
+ },
+ {
+ title: '“Digest 15 billion logs per day and keep big queries within 1 second. We use Doris to deploy multiple petabyte scale clusters on dozens of machines”',
+ author: {
+ name: 'Yuqi Liu',
+ title: 'Senior software engineer, China Unicom',
+ },
+ to: 'blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second',
+ image: 'china-unicom.png',
+ },
+];
diff --git a/src/constant/users.data.json b/src/constant/users.data.json
new file mode 100644
index 00000000000..5da0aec61bb
--- /dev/null
+++ b/src/constant/users.data.json
@@ -0,0 +1,1334 @@
+[
+ {
+ "story": "Amazon Web Services (AWS) is a leading cloud computing platform that offers a wide range of scalable and reliable cloud services. AWS for Apache Doris is coming soon, enabling businesses to effortlessly scale their data analytics capabilities to handle massive workloads.",
+ "name": "AWS",
+ "category": "Commercial Distribution",
+ "logo": "AWS",
+ "order": 0,
+ "to": null,
+ "image": "/images/user-logo/Commercial Distribution/AWS.jpg"
+ },
+ {
+ "story": "Powered by Apache Doris, VeloDB is a modern data warehouse designed for swift analytics on large-scale real-time data. VeloDB Inc, the commercial company of Apache Doris, delivers real-time analytics products and solutions to enterprise users worldwide.",
+ "name": "VeloDB",
+ "category": "Commercial Distribution",
+ "logo": "VeloDB",
+ "order": 1,
+ "to": null,
+ "image": "/images/user-logo/Commercial Distribution/VeloDB.jpg"
+ },
+ {
+ "story": "SelectDB is a modern data warehouse for lightning-fast analytics on real-time data at scale, offering fully managed cloud-native data warehouse services and self-managed software on premises, VMs, or Kubernetes.",
+ "name": "SelectDB",
+ "category": "Commercial Distribution",
+ "logo": "SelectDB",
+ "order": 2,
+ "to": null,
+ "image": "/images/user-logo/Commercial Distribution/SelectDB.jpg"
+ },
+ {
+ "story": "Tencent Cloud House-D is a fully-managed cloud data warehouse service built on Apache Doris.",
+ "name": "Tencent Cloud",
+ "category": "Commercial Distribution",
+ "logo": "Tencent Cloud",
+ "order": 3,
+ "to": null,
+ "image": "/images/user-logo/Commercial Distribution/Tencent Cloud.jpg"
+ },
+ {
+ "story": "Alibaba Cloud is a global leader in cloud computing and artificial intelligence, offering a fully managed service built on Apache Doris for real-time analytics.",
+ "name": "Alibaba Cloud",
+ "category": "Commercial Distribution",
+ "logo": "Alibaba Cloud",
+ "order": 4,
+ "to": null,
+ "image": "/images/user-logo/Commercial Distribution/Alibaba Cloud.jpg"
+ },
+ {
+ "story": "A global phenomenon, where users create and share short videos, showcasing their talent and connecting with a vibrant community. With Doris, the platform process data efficiently and enhance user experiences",
+ "name": "TikTok",
+ "category": "Media & Entertainment",
+ "logo": "TikTok",
+ "order": 5,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/TikTok.jpg"
+ },
+ {
+ "story": "Huawei is a leading global communications technology company that provides comprehensive digital solutions including 5G, cloud computing, and artificial intelligence. Huawei uses Apache Doris to process and analyze real-time data to improve business efficiency and competitiveness.",
+ "name": "Huawei",
+ "category": "Technology",
+ "logo": "Huawei",
+ "order": 6,
+ "to": null,
+ "image": "/images/user-logo/Technology/Huawei.jpg"
+ },
+ {
+ "story": "Tencent is the largest internet company in the world and one of the highest grossing multimedia companies in the world. Tencent has multiple businesses using Apache Doris to perform real-time analysis on user behavior data, better supporting business analysis and decision-making.",
+ "name": "Tencent",
+ "category": "Technology",
+ "logo": "Tencent",
+ "order": 7,
+ "to": null,
+ "image": "/images/user-logo/Technology/Tencent.jpg"
+ },
+ {
+ "story": "Alibaba is a leading global Internet technology company with a wide range of business activities, including e-commerce, cloud computing, digital media and entertainment. Within Alibaba, multiple businesses are already using Apache Doris to support business strategies and product optimization through real-time data analysis.",
+ "name": "Alibaba.com",
+ "category": "Technology",
+ "logo": "Alibaba.com",
+ "order": 8,
+ "to": null,
+ "image": "/images/user-logo/Technology/Alibaba.com.jpg"
+ },
+ {
+ "story": "As a top-tier supply chain-based technology and service provider, JD.com uses Apache Doris for multi-dimensional analysis of real-time and offline data to empower their customer service.",
+ "name": "JD.com",
+ "category": "Technology",
+ "logo": "JD.com",
+ "order": 9,
+ "to": "https://doris.apache.org/blog/JD_OLAP",
+ "image": "/images/user-logo/Technology/JD.com.jpg"
+ },
+ {
+ "story": "Xiaomi, one of the world's biggest smartphone and consumer electronics manufacturer has applied Apache Doris to multiple aspects of its business, from dashboarding, A/B testing, to user behavior and business growth analytics.",
+ "name": "Xiaomi",
+ "category": "Technology",
+ "logo": "Xiaomi",
+ "order": 10,
+ "to": "https://doris.apache.org/blog/xiaomi_vector",
+ "image": "/images/user-logo/Technology/Xiaomi.jpg"
+ },
+ {
+ "story": "A leading tech giant renowned for its expertise in artificial intelligence, cloud computing, and search engine technologies and dedicated to innovations in internet-related services.",
+ "name": "Baidu",
+ "category": "Technology",
+ "logo": "Baidu",
+ "order": 11,
+ "to": null,
+ "image": "/images/user-logo/Technology/Baidu.jpg"
+ },
+ {
+ "story": "ByteDance is a technology company focusing on mobile information, social entertainment and social platforms. ByteDance uses Apache Doris to conduct real-time analysis and processing of real-time data streams to provide real-time business support",
+ "name": "ByteDance",
+ "category": "Technology",
+ "logo": "ByteDance",
+ "order": 12,
+ "to": null,
+ "image": "/images/user-logo/Technology/ByteDance.jpg"
+ },
+ {
+ "story": "The Bank of China is one of the largest commercial banks in China, using Apache Doris to enhance its business reporting analysis capabilities and improve the efficiency of business decision-making.",
+ "name": "Bank of China",
+ "category": "Finance",
+ "logo": "Bank of China",
+ "order": 13,
+ "to": null,
+ "image": "/images/user-logo/Finance/Bank of China.jpg"
+ },
+ {
+ "story": "Postal Savings Bank of China has built a real-time anti-fraud platform based on Apache Doris, which greatly improves the timeliness of data, and the query of business reports takes only a few seconds, reducing storage costs by 70%.",
+ "name": "Postal Savings Bank of China",
+ "category": "Finance",
+ "logo": "Postal Savings Bank of China",
+ "order": 14,
+ "to": null,
+ "image": "/images/user-logo/Finance/Postal Savings Bank of China.jpg"
+ },
+ {
+ "story": "WeLab is one of the fastest-growing pan-Asian fintech platforms, with over 60 million individual users and over 700 enterprise customers. Apache Doris plays a crucial role in WeLab's real-time big data platform, effectively supporting important scenarios such as real-time self-service BI reporting and user behavior analysis.",
+ "name": "WeLab",
+ "category": "Finance",
+ "logo": "WeLab",
+ "order": 15,
+ "to": null,
+ "image": "/images/user-logo/Finance/WeLab.jpg"
+ },
+ {
+ "story": "Fuse is the largest insurance technology company in Indonesia, using Apache Doris to accelerate insurance BI reporting and real-time data analytics capabilities.",
+ "name": "FUSE",
+ "category": "Finance",
+ "logo": "FUSE",
+ "order": 16,
+ "to": null,
+ "image": "/images/user-logo/Finance/FUSE.jpg"
+ },
+ {
+ "story": "Citic Securities has built a real-time data warehouse using Apache Doris, replacing Impala and Greenplum, and upgraded multiple data applications such as Adhoc, reporting, and cockpit.",
+ "name": "CITIC Securities",
+ "category": "Finance",
+ "logo": "CITIC Securities",
+ "order": 17,
+ "to": null,
+ "image": "/images/user-logo/Finance/CITIC Securities.jpg"
+ },
+ {
+ "story": "One of the largest state-owned oil and gas companies in the world. Engaged in exploration, production, refining, and marketing, CNPC plays a pivotal role in China's energy industry.",
+ "name": "CNPC",
+ "category": "Telecom & Manufacturing",
+ "logo": "CNPC",
+ "order": 18,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/CNPC.jpg"
+ },
+ {
+ "story": "China Mobile is the largest telecommunication company in China. With an extensive network coverage and a wide range of services, it provides mobile voice and data services to millions of customers in China.",
+ "name": "China Mobile",
+ "category": "Telecom & Manufacturing",
+ "logo": "China Mobile",
+ "order": 19,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/China Mobile.jpg"
+ },
+ {
+ "story": "China Unicom, one of the world's biggest telecommunication service providers, uses Apache Doris for log analytics and ensures stable data digestion of 15 billion logs per day and queries on super large datasets to be executed within one second. ",
+ "name": "China Unicom",
+ "category": "Telecom & Manufacturing",
+ "logo": "China Unicom",
+ "order": 20,
+ "to": "https://doris.apache.org/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second",
+ "image": "/images/user-logo/Telecom & Manufacturing/China Unicom.jpg"
+ },
+ {
+ "story": "Glodwind is a leading wind turbine manufacturer and renewable energy solutions provider, specializing in design, manufacturing and installation.",
+ "name": "Goldwind",
+ "category": "Telecom & Manufacturing",
+ "logo": "Goldwind",
+ "order": 21,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Goldwind.jpg"
+ },
+ {
+ "story": "An online programming platform that help software engineers and students enhance their coding skills and prepare them for technical interviews.",
+ "name": "Leetcode",
+ "category": "Technology",
+ "logo": "Leetcode",
+ "order": 22,
+ "to": null,
+ "image": "/images/user-logo/Technology/Leetcode.jpg"
+ },
+ {
+ "story": "miHoYo is a leading interactive entertainment company, known for their popular games like Genshin Impact, Honkai Impact 3rd, and Tears of Themis.",
+ "name": "miHoYo",
+ "category": "Media & Entertainment",
+ "logo": "miHoYo",
+ "order": 23,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/miHoYo.jpg"
+ },
+ {
+ "story": "NetEase introduces Apache Doris into its data management platform and gains improved performance and simpler tag management for its e-commerce business.",
+ "name": "NetEase",
+ "category": "Media & Entertainment",
+ "logo": "NetEase",
+ "order": 24,
+ "to": "https://doris.apache.org/blog/Netease",
+ "image": "/images/user-logo/Media & Entertainment/NetEase.jpg"
+ },
+ {
+ "story": "Temu provides one-stop destination for affordable items, perfect for home decor, electronic, pet supplies, sports and toy selections. ",
+ "name": "Temu",
+ "category": "Media & Entertainment",
+ "logo": "Temu",
+ "order": 25,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Temu.jpg"
+ },
+ {
+ "story": "Online media and technology company that operates platforms such as Sina Weibo and Sina.com, providing news, entertainment, social networking, and e-commerce services to a vast user base",
+ "name": "Sina",
+ "category": "Media & Entertainment",
+ "logo": "Sina",
+ "order": 26,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Sina.jpg"
+ },
+ {
+ "story": "Tencent Music, a music streaming service provider with 800 million monthly active users, has transitioned from ClickHouse to Apache Doris and benefited from the convenience of partial column updates, lower storage costs, and easier maintenance.",
+ "name": "TME",
+ "category": "Media & Entertainment",
+ "logo": "TME",
+ "order": 27,
+ "to": "https://doris.apache.org/blog/Tencent-LLM",
+ "image": "/images/user-logo/Media & Entertainment/TME.jpg"
+ },
+ {
+ "story": "A premier online brand that is indispensable in the daily lives of millions of users, providing a network of web properties and community-based/web 2.0 products.",
+ "name": "Sohu.com",
+ "category": "Media & Entertainment",
+ "logo": "Sohu.com",
+ "order": 28,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Sohu.com.jpg"
+ },
+ {
+ "story": "Trusted by 45M users and growing , NewsBreak is one of the best local & breaking news source in the US, featuring local weather, alerts, deals, events and more.",
+ "name": "NewsBreak",
+ "category": "Media & Entertainment",
+ "logo": "NewsBreak",
+ "order": 29,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/NewsBreak.jpg"
+ },
+ {
+ "story": "A popular dating app, known for its user-friendly interface and innovative features that facilitate meaningful connections and relationships.",
+ "name": "Tantan",
+ "category": "Media & Entertainment",
+ "logo": "Tantan",
+ "order": 30,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Tantan.jpg"
+ },
+ {
+ "story": "A mobile application focused on personal well-being and self-improvement, offering features like mindfulness exercises and personal development resources.",
+ "name": "Soul App",
+ "category": "Media & Entertainment",
+ "logo": "Soul App",
+ "order": 31,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Soul App.jpg"
+ },
+ {
+ "story": "A fitness app that offers a wide range of workout programs, personalized training plans, and a supportive community to help users achieve their fitness goals.",
+ "name": "Keep",
+ "category": "Media & Entertainment",
+ "logo": "Keep",
+ "order": 32,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Keep.jpg"
+ },
+ {
+ "story": "Kwai, a social network for short videos, uses Apache Doris in replacement of the \"Druid + ClickHouse\" solution and thus increases efficiency in aggregated analysis of large datasets.",
+ "name": "Kwai",
+ "category": "Media & Entertainment",
+ "logo": "Kwai",
+ "order": 33,
+ "to": "https://doris.apache.org/blog/BestPractice_Kwai",
+ "image": "/images/user-logo/Media & Entertainment/Kwai.jpg"
+ },
+ {
+ "story": "a prominent gaming company known for developing and publishing high-quality mobile games. With a diverse portfolio and a large user base, offering immersive gaming experiences to players worldwide.",
+ "name": "37 Interactive Entertainment",
+ "category": "Media & Entertainment",
+ "logo": "37 Interactive Entertainment",
+ "order": 34,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/37 Interactive Entertainment.jpg"
+ },
+ {
+ "story": "HUYA Inc. is a prominent live streaming platform, offering a diverse range of content including gaming, esports, and entertainment.",
+ "name": "HUYA Inc",
+ "category": "Media & Entertainment",
+ "logo": "HUYA Inc",
+ "order": 35,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/HUYA Inc.jpg"
+ },
+ {
+ "story": "This electric vehicle manufacturer tried a fair share of OLAP systems and settled on Apache Doris after considering performance, semantics, system compatibility, and maintenance costs.",
+ "name": "NIO",
+ "category": "Telecom & Manufacturing",
+ "logo": "NIO",
+ "order": 36,
+ "to": "https://doris.apache.org/blog/NIO",
+ "image": "/images/user-logo/Telecom & Manufacturing/NIO.jpg"
+ },
+ {
+ "story": "A renowned Japanese automobile manufacturer known for its diverse range of cars, motorcycles, and outboard motors. With a reputation for reliability and innovation, Suzuki vehicles are popular worldwide.\n",
+ "name": "Suzuki",
+ "category": "Telecom & Manufacturing",
+ "logo": "Suzuki",
+ "order": 37,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Suzuki.jpg"
+ },
+ {
+ "story": "A renowned automotive company that has been manufacturing and selling vehicles, known for its innovation and quality, Ford offers a wide range of cars, trucks, and SUVs globally.",
+ "name": "Ford",
+ "category": "Telecom & Manufacturing",
+ "logo": "Ford",
+ "order": 38,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Ford.jpg"
+ },
+ {
+ "story": "A coffee company and coffeehouse chain that rapidly expanded in a short period. Known for its convenient mobile ordering and delivery services, Luckin Coffee offers a variety of coffee beverages and snacks to customers across China.",
+ "name": "Luckin Coffee",
+ "category": "FMCG & Logistics",
+ "logo": "Luckin Coffee",
+ "order": 39,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Luckin Coffee.jpg"
+ },
+ {
+ "story": "JD Logistics, a subsidiary of JD.com, is a leading logistics company with an extensive network and advanced technology. It offers efficient warehousing, transportation, and supply chain solutions, enabling seamless e-commerce operations across industries.\n",
+ "name": "JD Logistics",
+ "category": "FMCG & Logistics",
+ "logo": "JD Logistics",
+ "order": 40,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/JD Logistics.jpg"
+ },
+ {
+ "story": "Anta as a sportswear company renowned for its innovative designs and high-performance athletic footwear and apparel. With a focus on quality and style, Anta caters to athletes and fitness enthusiasts worldwide.",
+ "name": "Anta",
+ "category": "FMCG & Logistics",
+ "logo": "Anta",
+ "order": 41,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Anta.jpg"
+ },
+ {
+ "story": "Cabbeen is a fashion brand known for its contemporary and trendy clothing designs, with a focus on blending traditional elements with modern aesthetics.",
+ "name": "Cabbeen",
+ "category": "FMCG & Logistics",
+ "logo": "Cabbeen",
+ "order": 42,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Cabbeen.jpg"
+ },
+ {
+ "story": "Semi is a modern lifestyle brand for adults committed to developing innovative, and affordable fashion.",
+ "name": "Semi",
+ "category": "FMCG & Logistics",
+ "logo": "Semi",
+ "order": 43,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Semi.jpg"
+ },
+ {
+ "story": "A fashion brand to present lifestyles of contemporary successful men and echo the spirit of successful men in various fields.",
+ "name": "Septwolves",
+ "category": "FMCG & Logistics",
+ "logo": "Septwolves",
+ "order": 44,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Septwolves.jpg"
+ },
+ {
+ "story": "Yonghui Superstores is a Chinese reatail chain known for its comprehensive selection of groceries and household products, providing a convenient and pleasant shopping experience for consumers.",
+ "name": "Yonghui Superstores",
+ "category": "FMCG & Logistics",
+ "logo": "Yonghui Superstores",
+ "order": 45,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Yonghui Superstores.jpg"
+ },
+ {
+ "story": "A leading restaurant company in China, operatin popular barnds such as KFC, Pizza Hut, and Taco Bell. With a focus on delivering delicious and convenient dining experiences, Yum China has become a trusted choice for Chinese consumers.",
+ "name": "YumChina",
+ "category": "FMCG & Logistics",
+ "logo": "YumChina",
+ "order": 46,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/YumChina.jpg"
+ },
+ {
+ "story": "An international dairy company based in the Netherlands, specializing in the production and distribution of infant and toddler nutrition products, Ausnutria ensures high-quality and safe nutritional solutions for babies and young children worldwide.",
+ "name": "Ausnutria",
+ "category": "FMCG & Logistics",
+ "logo": "Ausnutria",
+ "order": 47,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Ausnutria.jpg"
+ },
+ {
+ "story": "AfterShip is a leading shipment tracking platform that enables businesses and consumers to track and monitor their packages from various courier services in real-time. It provides transparency and convenience in package delivery management.",
+ "name": "Aftership",
+ "category": "FMCG & Logistics",
+ "logo": "Aftership",
+ "order": 48,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Aftership.jpg"
+ },
+ {
+ "story": "SF Express is a leading logistics and courier services company, providing efficient and reliable domestic and international shipping solutions while serving businesses and individuals worldwide.",
+ "name": "SF Express",
+ "category": "FMCG & Logistics",
+ "logo": "SF Express",
+ "order": 49,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/SF Express.jpg"
+ },
+ {
+ "story": "Uda Express aims to provide safe, convenient, efficient and integrated global logistic services for worldwide e-commerce platforms, buyers or sellers, traders or dealers and final consumers.\n",
+ "name": "Uda Express",
+ "category": "FMCG & Logistics",
+ "logo": "Uda Express",
+ "order": 50,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Uda Express.jpg"
+ },
+ {
+ "story": "A leading Chinese logistics company specializing in express delivery services, provides reliable and fast delivery solutions for businesses and consumers across China.",
+ "name": "ZTO Express",
+ "category": "FMCG & Logistics",
+ "logo": "ZTO Express",
+ "order": 51,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/ZTO Express.jpg"
+ },
+ {
+ "story": "YT Express understands the high demand for fresh and medical products specific cold chain equipment and the timeliness and efficiency of transportation.\n\n\n",
+ "name": "YT Express",
+ "category": "FMCG & Logistics",
+ "logo": "YT Express",
+ "order": 52,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/YT Express.jpg"
+ },
+ {
+ "story": "An education platform, Koolearn, offers a wide range of courses and study materials for students and adult learners, providing interactive and personalized learning experiences.",
+ "name": "Koolearn",
+ "category": "Media & Entertainment",
+ "logo": "Koolearn",
+ "order": 53,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Koolearn.jpg"
+ },
+ {
+ "story": "VIPKid platform connects paying students with teachers in the United States and Canada. Its online-classroom portal enables students to receive 25-minute English language lessons from fluent English-speaking teachers.",
+ "name": "vipkid",
+ "category": "Media & Entertainment",
+ "logo": "vipkid",
+ "order": 54,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/vipkid.jpg"
+ },
+ {
+ "story": "This leading local life service platform uses Apache Doris as a high-performance OLAP engine to address challenges in its real-time and offline data processing.",
+ "name": "Meituan",
+ "category": "Media & Entertainment",
+ "logo": "Meituan",
+ "order": 55,
+ "to": "https://doris.apache.org/blog/meituan",
+ "image": "/images/user-logo/Media & Entertainment/Meituan.jpg"
+ },
+ {
+ "story": "Homeware solutions helps you enjoy a genuine, comfortable life. Lifewit specializes in creating innovative products for the home, travel, and organization to enhance everyday living experiences.",
+ "name": "Lifewit",
+ "category": "Media & Entertainment",
+ "logo": "Lifewit",
+ "order": 56,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Lifewit.jpg"
+ },
+ {
+ "story": "Lenovo is a global technology leader that designs, develops, and manufactures innovative products, including laptops, tablets, smartphones, and servers. Lenovo serves customers across the global.",
+ "name": "Lenovo",
+ "category": "Telecom & Manufacturing",
+ "logo": "Lenovo",
+ "order": 57,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Lenovo.jpg"
+ },
+ {
+ "story": "Volvo, as automobile manufacturer, known for its commitment to safety, reliability. With a diverse lineup of cars, Volvo combines luxury with practicality to cater to discerning customers worldwide.",
+ "name": "Volvo",
+ "category": "Telecom & Manufacturing",
+ "logo": "Volvo",
+ "order": 58,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Volvo.jpg"
+ },
+ {
+ "story": "A leading global home appliance and HVAC solutions provider based in China. With a wide range of products including air conditioners, refrigerators, washing machines, and more. ",
+ "name": "Midea",
+ "category": "Telecom & Manufacturing",
+ "logo": "Midea",
+ "order": 59,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Midea.jpg"
+ },
+ {
+ "story": "Haidilao is a renowned Chinese hot pot restaurant chain known for its exceptional service, quality ingredients, and unwavering commitment to customer satisfaction",
+ "name": "Haidilao",
+ "category": "FMCG & Logistics",
+ "logo": "Haidilao",
+ "order": 60,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Haidilao.jpg"
+ },
+ {
+ "story": "Xtep caters to sports enthusiasts and athletes, offering stylish and functional sportswear options, specialized in designing and manufacturing athletic footwear, apparel, and accessories.",
+ "name": "Xtep",
+ "category": "FMCG & Logistics",
+ "logo": "Xtep",
+ "order": 61,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Xtep.jpg"
+ },
+ {
+ "story": "Taikang Insurance has established an insurance business analysis platform using Doris, providing tens of thousands of front-line users with insurance business data analysis, with query time taking only a few seconds.",
+ "name": "Taikang Insurance Group",
+ "category": "Finance",
+ "logo": "Taikang Insurance Group",
+ "order": 62,
+ "to": null,
+ "image": "/images/user-logo/Finance/Taikang Insurance Group.jpg"
+ },
+ {
+ "story": "With over 227 million retail customers and 693 million Internet users, Ping An is one of the largest financial services companies in the world. Currently, multiple businesses within Ping An Group are using Apache Doris, including life insurance, property insurance, and financial technology.",
+ "name": "Ping An Insurance Group",
+ "category": "Finance",
+ "logo": "Ping An Insurance Group",
+ "order": 63,
+ "to": null,
+ "image": "/images/user-logo/Finance/Ping An Insurance Group.jpg"
+ },
+ {
+ "story": "CIGNA & CMB, an insurance company, uses Apache Doris as an all-in-one OLAP platform to undertake their customer-facing, analyst-facing, and management-facing data analytics workloads.",
+ "name": "Cigna & CMB",
+ "category": "Finance",
+ "logo": "Cigna & CMB",
+ "order": 64,
+ "to": "https://doris.apache.org/blog/less-components-higher-performance-apache-doris-instead-of-clickhouse-mysql-presto-and-hbase",
+ "image": "/images/user-logo/Finance/Cigna & CMB.jpg"
+ },
+ {
+ "story": "China Everbright Bank is a large joint-stock commercial bank that has introduced Apache Doris into its data platform to accelerate queries on the data lake and enhance real-time report analysis efficiency.",
+ "name": "China Everbright Bank",
+ "category": "Finance",
+ "logo": "China Everbright Bank",
+ "order": 65,
+ "to": null,
+ "image": "/images/user-logo/Finance/China Everbright Bank.jpg"
+ },
+ {
+ "story": "Based on Apache Doris, Guangfa Securities has established a data metric service platform to accelerate the query speed of Hive data and provide data support for upper-level analysis applications.",
+ "name": "GF Securities",
+ "category": "Finance",
+ "logo": "GF Securities",
+ "order": 66,
+ "to": null,
+ "image": "/images/user-logo/Finance/GF Securities.jpg"
+ },
+ {
+ "story": "Bosera Fund has upgraded its data warehouse system using Apache Doris, replacing both Teradata and Oracle, and achieved significant improvement in ETL/batch data processing efficiency.",
+ "name": "Bosera Funds",
+ "category": "Finance",
+ "logo": "Bosera Funds",
+ "order": 67,
+ "to": null,
+ "image": "/images/user-logo/Finance/Bosera Funds.jpg"
+ },
+ {
+ "story": "Harvest Fund upgraded its original data warehouse system to Apache Doris to achieve more efficient data processing and analysis, resulting in better performance, lower costs, and higher reliability.",
+ "name": "Harvest Funds",
+ "category": "Finance",
+ "logo": "Harvest Funds",
+ "order": 68,
+ "to": null,
+ "image": "/images/user-logo/Finance/Harvest Funds.jpg"
+ },
+ {
+ "story": "With Apache Doris, this fintech service provider is able to handle 10,000 active financial metrics in 10,000 dashboards with 30% less ETL efforts, and reduced the query response time on tables of 100 million rows from 5s to 63ms.",
+ "name": "OneConnect",
+ "category": "Finance",
+ "logo": "OneConnect",
+ "order": 69,
+ "to": "https://doris.apache.org/blog/Database-in-Fintech-How-to-Support-ten-thousand-Dashboards-Without-Causing-a-Mess",
+ "image": "/images/user-logo/Finance/OneConnect.jpg"
+ },
+ {
+ "story": "An AI-driven fintech service provider utilizes Apache Doris for big data processing and analytics and thus benefits from enhanced performance, flexible workload management, high service availability, and effortless maintenance.",
+ "name": "Qifu Technology",
+ "category": "Finance",
+ "logo": "Qifu Technology",
+ "order": 70,
+ "to": null,
+ "image": "/images/user-logo/Finance/Qifu Technology.jpg"
+ },
+ {
+ "story": "An AI-driven technology company in Asia-Pacific committed to providing fintech products and services for consumers, enterprises and merchants.",
+ "name": "Advance Intelligence Group",
+ "category": "Technology",
+ "logo": "Advance Intelligence Group",
+ "order": 71,
+ "to": null,
+ "image": "/images/user-logo/Technology/Advance Intelligence Group.jpg"
+ },
+ {
+ "story": "The cyber security service provider builds its log storage and analysis system and realizes 3X data writing speed, 7X query execution speed, and visualized management.",
+ "name": "QAX-Cyber Security Services",
+ "category": "Technology",
+ "logo": "QAX-Cyber Security Services",
+ "order": 72,
+ "to": "https://doris.apache.org/blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis",
+ "image": "/images/user-logo/Technology/QAX-Cyber Security Services.jpg"
+ },
+ {
+ "story": "The due diligence platform replaces Apache Hive, Elasticsearch, and PostgreSQL with Apache Doris and achieves higher speed in ad-hoc analysis and user segmentation. ",
+ "name": "Tianyancha",
+ "category": "Technology",
+ "logo": "Tianyancha",
+ "order": 73,
+ "to": "https://doris.apache.org/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris",
+ "image": "/images/user-logo/Technology/Tianyancha.jpg"
+ },
+ {
+ "story": "A cloud-based transportation management system designed to streamline and optimize logistics operations. It offers comprehensive solutions for planning, execution, and monitoring of shipments, enhancing efficiency and visibility throughout the supply chain.",
+ "name": "TMS",
+ "category": "FMCG & Logistics",
+ "logo": "TMS",
+ "order": 74,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/TMS.jpg"
+ },
+ {
+ "story": "Orange Connex provides digital supply chain solutions for e-commerce worldwide. After putting Apache Doris into production, it reduces its data computation latency from 2 hours to 3 minutes.",
+ "name": "Orange Connex",
+ "category": "FMCG & Logistics",
+ "logo": "Orange Connex",
+ "order": 75,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Orange Connex.jpg"
+ },
+ {
+ "story": "A SaaS provider that offers inventory management, membership marketing, and cashier services for retailers including supermarkets, fresh produce stores, and clothing stores.",
+ "name": "Zhonglun Network",
+ "category": "Technology",
+ "logo": "Zhonglun Network",
+ "order": 76,
+ "to": null,
+ "image": "/images/user-logo/Technology/Zhonglun Network.jpg"
+ },
+ {
+ "story": "The SaaS provider adopts Apache Doris as a solution to improve data processing efficiency, particularly addressing multi-dimensional table maintenance and high-concurrency queries. ",
+ "name": "Duyan Soft",
+ "category": "Technology",
+ "logo": "Duyan Soft",
+ "order": 77,
+ "to": "https://doris.apache.org/blog/Improving-Query-Speed-to-Make-the-Most-out-of-Your-Data",
+ "image": "/images/user-logo/Technology/Duyan Soft.jpg"
+ },
+ {
+ "story": "The conversational AI services and natural language interaction solutions provider unifies their real-time and offline analytics workloads with Apache Doris, which empowers their chatbot services with its flexible functionalities and high performance.",
+ "name": "AISPEECH",
+ "category": "Technology",
+ "logo": "AISPEECH",
+ "order": 78,
+ "to": "https://doris.apache.org/blog/Use-Apache-Doris-with-AI-chatbots",
+ "image": "/images/user-logo/Technology/AISPEECH.jpg"
+ },
+ {
+ "story": "A publicly listed company that empowers logistics and delivery with internet technologies. It provides intelligent industrial logistics services and also engages in online industries including gaming.",
+ "name": "Boton",
+ "category": "Technology",
+ "logo": "Boton",
+ "order": 79,
+ "to": null,
+ "image": "/images/user-logo/Technology/Boton.jpg"
+ },
+ {
+ "story": "A full-stack cloud computing solution provider dedicated to secure and reliable cloud services, efficient resource management, and industry-specific cloud applications.",
+ "name": "Sugon",
+ "category": "Technology",
+ "logo": "Sugon",
+ "order": 80,
+ "to": null,
+ "image": "/images/user-logo/Technology/Sugon.jpg"
+ },
+ {
+ "story": "A prominent technology conglomerate dedicated to providing cutting-edge solutions in various industries, including artificial intelligence, cloud computing, big data analytics, and telecommunications.",
+ "name": "Wasu",
+ "category": "Technology",
+ "logo": "Wasu",
+ "order": 81,
+ "to": null,
+ "image": "/images/user-logo/Technology/Wasu.jpg"
+ },
+ {
+ "story": "A leading AI technology company based in China, specializing in AI chips and software, aims to empower various industries with innovative AI solutions and drive the development of intelligent systems.",
+ "name": "Horizon Robotics",
+ "category": "Telecom & Manufacturing",
+ "logo": "Horizon Robotics",
+ "order": 82,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Horizon Robotics.jpg"
+ },
+ {
+ "story": "Youdao Inc. focuses on language-related products and services. It offers language learning platforms, translation tools, and smart devices, aiming to enhance communication and knowledge acquisition for users.\n",
+ "name": "Youdao",
+ "category": "Media & Entertainment",
+ "logo": "Youdao",
+ "order": 83,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Youdao.jpg"
+ },
+ {
+ "story": "LY Digital provides fintech solution for the hospitality industry. It streamlines its data architecture by introducing the powerful and feature-rich Apache Doris, and thus benefits from faster data access and queries.",
+ "name": "LY Digit",
+ "category": "Finance",
+ "logo": "LY Digit",
+ "order": 84,
+ "to": "https://doris.apache.org/blog/LY",
+ "image": "/images/user-logo/Finance/LY Digit.jpg"
+ },
+ {
+ "story": "A messaging and communication app that allows users to engage in real-time conversations, coordinate strategies, and build camaraderie in the vibrant voice chat rooms.",
+ "name": "TTChat",
+ "category": "Media & Entertainment",
+ "logo": "TTChat",
+ "order": 85,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/TTChat.jpg"
+ },
+ {
+ "story": "The live streaming platform uses Apache Doris to unify its stream processing and batch processing pipelines to make its data architecture faster, simpler, and more cost-effective.",
+ "name": "DouYu",
+ "category": "Media & Entertainment",
+ "logo": "DouYu",
+ "order": 86,
+ "to": "https://doris.apache.org/blog/Zipping-up-the-Lambda-Architecture-for-40-Percent-Faster-Performance",
+ "image": "/images/user-logo/Media & Entertainment/DouYu.jpg"
+ },
+ {
+ "story": "This all-category Q&A website supports its data management platform with Apache Doris and benefits from fast data ingestion and fast query response.",
+ "name": "Zhihu Inc",
+ "category": "Media & Entertainment",
+ "logo": "Zhihu Inc",
+ "order": 87,
+ "to": "https://doris.apache.org/blog/Database-Dissection-How-Fast-Data-Queries-Are-Implemented",
+ "image": "/images/user-logo/Media & Entertainment/Zhihu Inc.jpg"
+ },
+ {
+ "story": "An online grocery platform offers convenient and fast delivery of fresh produce, groceries, and daily essentials. It aims to simplify shopping experience for customers.",
+ "name": "Dingdong",
+ "category": "Media & Entertainment",
+ "logo": "Dingdong",
+ "order": 88,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Dingdong.jpg"
+ },
+ {
+ "story": "This health technology SaaS software company details the evolution of its data service architecture from ClickHouse to Apache Doris.",
+ "name": "Linkedcare",
+ "category": "Technology",
+ "logo": "Linkedcare",
+ "order": 89,
+ "to": "https://doris.apache.org/blog/linkedcare",
+ "image": "/images/user-logo/Technology/Linkedcare.jpg"
+ },
+ {
+ "story": "LeTV specializes in internet-based services, smart devices, and content production. It offers a range of products including smartphones, smart TVs, and streaming services.",
+ "name": "LeTV",
+ "category": "Media & Entertainment",
+ "logo": "LeTV",
+ "order": 90,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/LeTV.jpg"
+ },
+ {
+ "story": "An online recruitment platform promotes instant direct chats between Bosses and job seekers, delivers accurate recommendation results, and is powered by proprietary AI algorithms and big data insights.",
+ "name": "Boss Zhipin",
+ "category": "Media & Entertainment",
+ "logo": "Boss Zhipin",
+ "order": 91,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Boss Zhipin.jpg"
+ },
+ {
+ "story": "An cosmetic surgery platform listed on Nasdaq. Its social media-style credit evaluation system gains a strong user trust. ",
+ "name": "Soyoung",
+ "category": "Media & Entertainment",
+ "logo": "Soyoung",
+ "order": 92,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Soyoung.jpg"
+ },
+ {
+ "story": "Jiyue is Geely Holding;s next-generation automotive robocar brand, positioned as premium intelligent, committed to building leading intelligent automotive robots. ",
+ "name": "Jiyue Auto",
+ "category": "Telecom & Manufacturing",
+ "logo": "Jiyue Auto",
+ "order": 93,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Jiyue Auto.jpg"
+ },
+ {
+ "story": "Wuling Motors specializes in producing affordable and practical vehicles, known for its compact cars and commercial vehicles, it has gained popularity in both domestic and international markets.",
+ "name": "Wuling Motors",
+ "category": "Telecom & Manufacturing",
+ "logo": "Wuling Motors",
+ "order": 94,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Wuling Motors.jpg"
+ },
+ {
+ "story": "This is a car manufacturer who connects 4 million cars together and has to process 100 billion pieces of CAN data every day. Apache Doris ensures real-time data analytics performance for it.",
+ "name": "Chang'an Automobile",
+ "category": "Telecom & Manufacturing",
+ "logo": "Chang'an Automobile",
+ "order": 95,
+ "to": "https://doris.apache.org/blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents",
+ "image": "/images/user-logo/Telecom & Manufacturing/Chang'an Automobile.jpg"
+ },
+ {
+ "story": "Lotus as a renowned British automotive manufacturer, producing high-performance sports cars and racing vehicles.",
+ "name": "LOTUS",
+ "category": "Telecom & Manufacturing",
+ "logo": "LOTUS",
+ "order": 96,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/LOTUS.jpg"
+ },
+ {
+ "story": "Great Wall Motors is a prominent Chinese automobile manufacturer specializing in SUVs, pickup trucks, and electric vehicles.",
+ "name": "Great Wall",
+ "category": "Telecom & Manufacturing",
+ "logo": "Great Wall",
+ "order": 97,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Great Wall.jpg"
+ },
+ {
+ "story": "Chery is recognized for its wide range of vehicles, including sedans, SUVs, and electric cars. With a focus on innovation and quality, Chery has established itself as a prominent player in the global automotive market.",
+ "name": "Chery",
+ "category": "Telecom & Manufacturing",
+ "logo": "Chery",
+ "order": 98,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Chery.jpg"
+ },
+ {
+ "story": "Envision Energy is dedicated to advancing clean and sustainable energy worldwide, with expertise in wind turbines, energy management software, and smart grid solutions",
+ "name": "Envision Energy",
+ "category": "Telecom & Manufacturing",
+ "logo": "Envision Energy",
+ "order": 99,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Envision Energy.jpg"
+ },
+ {
+ "story": "A leading provider of custom, end-to-end network, cloud and data center services for China, APAC and beyond.",
+ "name": "China Telecom",
+ "category": "Telecom & Manufacturing",
+ "logo": "China Telecom",
+ "order": 100,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/China Telecom.jpg"
+ },
+ {
+ "story": "CTYun is a cloud computing and infrastructure service provider. With a portfolio of cloud solutions, CTYun empowers businesses with secure, scalable, and reliable cloud computing capabilities",
+ "name": "CTYun",
+ "category": "Telecom & Manufacturing",
+ "logo": "CTYun",
+ "order": 101,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/CTYun.jpg"
+ },
+ {
+ "story": "Cisco is a multinational technology conglomerate specialized in networking solutions. It enables seamless connectivity, digital transformation and secure communications for businesses and organizations worldwide.",
+ "name": "Cisco",
+ "category": "Telecom & Manufacturing",
+ "logo": "Cisco",
+ "order": 102,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Cisco.jpg"
+ },
+ {
+ "story": "ZTE expertise in 5G technology, networking and mobile devices, offering innovative solutions that drive connectivity and digital transformation in the telecommunications industry.",
+ "name": "ZTE",
+ "category": "Telecom & Manufacturing",
+ "logo": "ZTE",
+ "order": 103,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/ZTE.jpg"
+ },
+ {
+ "story": "Huolala operates as cargo service platforms, providing intelligent freight information sharing, personal goods transportation, enterprise freight, and other cargo services. Huolala offers its services worldwide.\n\n",
+ "name": "HuoLaLa",
+ "category": "FMCG & Logistics",
+ "logo": "HuoLaLa",
+ "order": 104,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/HuoLaLa.jpg"
+ },
+ {
+ "story": "Deppon Express, as a logistics company providing comprehensive express delivery and supply chain solutions, ensuring reliable and efficient delivery services for businesses and individuals.",
+ "name": "Deppon Express",
+ "category": "FMCG & Logistics",
+ "logo": "Deppon Express",
+ "order": 105,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Deppon Express.jpg"
+ },
+ {
+ "story": "A fintech company that leverage leading technologies to provide financial service including digital payment, small-scale loans, investment and wealth managements.",
+ "name": "Du Xiaoman Financial",
+ "category": "Finance",
+ "logo": "Du Xiaoman Financial",
+ "order": 106,
+ "to": null,
+ "image": "/images/user-logo/Finance/Du Xiaoman Financial.jpg"
+ },
+ {
+ "story": "Xingye Bank is a large joint-stock commercial bank that has introduced Apache Doris into its big data platform to accelerate real-time data analysis efficiency and provide data support for business operations and management decisions.",
+ "name": "Industrial Bank",
+ "category": "Finance",
+ "logo": "Industrial Bank",
+ "order": 107,
+ "to": null,
+ "image": "/images/user-logo/Finance/Industrial Bank.jpg"
+ },
+ {
+ "story": "A leading provider of electronic payment and financial technology solutions that focuses on building a global payment ecosystem and offering secure and convenient online payment services for both merchants and consumers.",
+ "name": "UMS",
+ "category": "Finance",
+ "logo": "UMS",
+ "order": 108,
+ "to": null,
+ "image": "/images/user-logo/Finance/UMS.jpg"
+ },
+ {
+ "story": "Caitong Securities has used Apache Doris to summarize and analyze real-time data, quickly generating various reports, providing strong support for business development and decision-making.",
+ "name": "Caitong Securities",
+ "category": "Finance",
+ "logo": "Caitong Securities",
+ "order": 109,
+ "to": null,
+ "image": "/images/user-logo/Finance/Caitong Securities.jpg"
+ },
+ {
+ "story": "A listed digital payment services provider that also offers cash, business, and supply chain management solutions for retailers, banks, and e-commerce companies.",
+ "name": "Lakala",
+ "category": "Finance",
+ "logo": "Lakala",
+ "order": 110,
+ "to": null,
+ "image": "/images/user-logo/Finance/Lakala.jpg"
+ },
+ {
+ "story": "An electronic payment services provider that focuses on comprehensive payment solutions that cater to the needs of travelers, encompassing air travel, accommodation, and retail purchases. ",
+ "name": "Easy Pay",
+ "category": "Finance",
+ "logo": "Easy Pay",
+ "order": 111,
+ "to": null,
+ "image": "/images/user-logo/Finance/Easy Pay.jpg"
+ },
+ {
+ "story": "A consumer financing company that focuses on the small and medium financing services beyond the coverage of traditional bank services to achieve inclusive finance.",
+ "name": "Mucfc.com",
+ "category": "Finance",
+ "logo": "Mucfc.com",
+ "order": 112,
+ "to": null,
+ "image": "/images/user-logo/Finance/Mucfc.com.jpg"
+ },
+ {
+ "story": "A digital insurance provider that offers innovative insurance products for all walks of life and enhances its own operation efficiency and risk control effectiveness by cutting-edge technologies.",
+ "name": "ZhongAn Insurance",
+ "category": "Finance",
+ "logo": "ZhongAn Insurance",
+ "order": 113,
+ "to": null,
+ "image": "/images/user-logo/Finance/ZhongAn Insurance.jpg"
+ },
+ {
+ "story": "A fintech service provider that focuses on comprehensive, scenario-based digital solutions from financing, marketing, to event and customer management.",
+ "name": "InRice.com",
+ "category": "Finance",
+ "logo": "InRice.com",
+ "order": 114,
+ "to": null,
+ "image": "/images/user-logo/Finance/InRice.com.jpg"
+ },
+ {
+ "story": "A financial risk control and marketing services provider that leverages the power of artificial intelligence to empower decision-making for various industries. ",
+ "name": "Bairong Inc",
+ "category": "Finance",
+ "logo": "Bairong Inc",
+ "order": 115,
+ "to": null,
+ "image": "/images/user-logo/Finance/Bairong Inc.jpg"
+ },
+ {
+ "story": "The SaaS provider utilizes Apache Doris to support self-service BI by enabling fast join queries. It also helps in improving efficiency of privileged queries.",
+ "name": "Moka",
+ "category": "Technology",
+ "logo": "Moka",
+ "order": 116,
+ "to": "https://doris.apache.org/blog/Listen-to-That-Poor-BI-Engineer-We-Need-Fast-Joins",
+ "image": "/images/user-logo/Technology/Moka.jpg"
+ },
+ {
+ "story": "Apache Doris ensures quick computation and high data integrity for A/B testing on a big real-time data size with millions of operations per second. Each operation involves around 20 data tags and over a dozen dimensions.",
+ "name": "360 Security",
+ "category": "Technology",
+ "logo": "360 Security",
+ "order": 117,
+ "to": "https://doris.apache.org/blog/AB-Testing-was-a-Handful-Until-we-Found-the-Replacement-for-Druid",
+ "image": "/images/user-logo/Technology/360 Security.jpg"
+ },
+ {
+ "story": "A tech-driven intelligent retail service provider uses Apache Doris for resource isolation and high-concurrency data queries and realizes faster query speed and lower storage costs.",
+ "name": "HuiCe",
+ "category": "Technology",
+ "logo": "HuiCe",
+ "order": 118,
+ "to": null,
+ "image": "/images/user-logo/Technology/HuiCe.jpg"
+ },
+ {
+ "story": "A generative AI solution provider that focuses on the development of SOTA, integrated generative AI product suites with independent intellectual property rights.",
+ "name": "JiaoLong Cloud",
+ "category": "Technology",
+ "logo": "JiaoLong Cloud",
+ "order": 119,
+ "to": null,
+ "image": "/images/user-logo/Technology/JiaoLong Cloud.jpg"
+ },
+ {
+ "story": "IGG is best known for formerly publishing various massively multiplayer online games in North America. \"Lords Mobile\" as IGG’s first cross-platform, real-time game has approximately 320 million registered users worldwide. ",
+ "name": "IGOTGAMES",
+ "category": "Media & Entertainment",
+ "logo": "IGOTGAMES",
+ "order": 120,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/IGOTGAMES.jpg"
+ },
+ {
+ "story": "Electronic Soul is one of the top leading game developers and publishers based in Asia, providing high-quality digital contents crossing Mobile, PC, and consoles.",
+ "name": "Electronic Soul",
+ "category": "Media & Entertainment",
+ "logo": "Electronic Soul",
+ "order": 121,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Electronic Soul.jpg"
+ },
+ {
+ "story": "Leveraging advanced technologies and analytics, Haohan Data empowers businesses with comprehensive data solutions, enabling users to make informed decisions.",
+ "name": "Haohan Data",
+ "category": "Telecom & Manufacturing",
+ "logo": "Haohan Data",
+ "order": 122,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Haohan Data.jpg"
+ },
+ {
+ "story": "Aima Tech, an electric vehicle manufacturer, is committed to revolutionizing the way we commute and reducing carbon emissions.\n",
+ "name": "Aima Tech",
+ "category": "Telecom & Manufacturing",
+ "logo": "Aima Tech",
+ "order": 123,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Aima Tech.jpg"
+ },
+ {
+ "story": "Known for contemporary and trendy clothing designs, Peacebird offers stylish and eco-friendly fashion choices for customers.",
+ "name": "Peacebird",
+ "category": "FMCG & Logistics",
+ "logo": "Peacebird",
+ "order": 124,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Peacebird.jpg"
+ },
+ {
+ "story": "Full Truck Alliance is a leading digital freight platform connecting shippers and truck drivers. It offers efficient and transparent trucking services, optimizing logistics operations and facilitating freight transportation across China.",
+ "name": "Full Truck Alliance",
+ "category": "FMCG & Logistics",
+ "logo": "Full Truck Alliance",
+ "order": 125,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Full Truck Alliance.jpg"
+ },
+ {
+ "story": "CaiNiao is a logistics platform owned by Alibaba Group, specializing in end-to-end supply chain management and delivery services. It connects merchants, warehouses, and couriers to streamline operations and ensure efficient and timely order fulfillment.",
+ "name": "CaiNiao",
+ "category": "FMCG & Logistics",
+ "logo": "CaiNiao",
+ "order": 126,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/CaiNiao.jpg"
+ },
+ {
+ "story": "Umetrip is a leading provider of information technology solutions for the aviation and travel industry in China, offering comprehensive services for airline reservation systems, passenger services, and aviation data management.",
+ "name": "Umetrip",
+ "category": "FMCG & Logistics",
+ "logo": "Umetrip",
+ "order": 127,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Umetrip.jpg"
+ },
+ {
+ "story": "Yurun Group is a renowned Chinese food processing and distribution company operating a vertically integrated business model, encompassing farming, processing, and retail, to deliver premium meats to consumers.",
+ "name": "Yurun Group",
+ "category": "FMCG & Logistics",
+ "logo": "Yurun Group",
+ "order": 128,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Yurun Group.jpg"
+ },
+ {
+ "story": "Bondex serves various import and export trade clients, offering tailored supply chain solutions and standardized logistics services specialized in cross-border operations, including planning, design, and implementation.",
+ "name": "Bondex",
+ "category": "FMCG & Logistics",
+ "logo": "Bondex",
+ "order": 129,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Bondex.jpg"
+ },
+ {
+ "story": "Zongteng Group, a large China-based provider of cross-border warehousing and logistics services for e-commerce sellers",
+ "name": "Zongteng Group",
+ "category": "FMCG & Logistics",
+ "logo": "Zongteng Group",
+ "order": 130,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Zongteng Group.jpg"
+ },
+ {
+ "story": "The fintech company includes Apache Doris in their credit assessment and risk control solution to speed up queries on large datasets with little engineering and maintenance efforts.",
+ "name": "Techsight",
+ "category": "Finance",
+ "logo": "Techsight",
+ "order": 131,
+ "to": "https://doris.apache.org/blog/Choosing-an-OLAP-Engine-for-Financial-Risk-Management-What-to-Consider",
+ "image": "/images/user-logo/Finance/Techsight.jpg"
+ },
+ {
+ "story": "Zuoyebang is a leading online education platform, providing a wide range of educational resources, live classes, tutoring services, and personalized learning experiences for students of all ages.\n",
+ "name": "Zuoyebang",
+ "category": "Media & Entertainment",
+ "logo": "Zuoyebang",
+ "order": 132,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Zuoyebang.jpg"
+ },
+ {
+ "story": "Atguigu as a learning platform, offers comprehensive training programs and resources to help individuals build technical skills and advance their careers in the technology industry.",
+ "name": "Atguigu",
+ "category": "Media & Entertainment",
+ "logo": "Atguigu",
+ "order": 133,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Atguigu.jpg"
+ },
+ {
+ "story": "ITCast is a comprehensive online learning platform that offers a diverse range of IT and programming courses.",
+ "name": "ITCast",
+ "category": "Media & Entertainment",
+ "logo": "ITCast",
+ "order": 134,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/ITCast.jpg"
+ },
+ {
+ "story": "An online education platform offers a wide array of courses and programs taught by industry experts to help individuals acquire new skills and excel in their chosen fields.",
+ "name": "Kaikeba",
+ "category": "Media & Entertainment",
+ "logo": "Kaikeba",
+ "order": 135,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Kaikeba.jpg"
+ },
+ {
+ "story": "Lizhiweike, a popular online platform for live audio broadcasting, allows users to create and share live audio content, including podcasts, radio shows, and interactive discussions, fostering a vibrant audio community.",
+ "name": "Lizhiweike",
+ "category": "Media & Entertainment",
+ "logo": "Lizhiweike",
+ "order": 136,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Lizhiweike.jpg"
+ },
+ {
+ "story": "TenClass is an innovative education company that focuses on empowering individuals through digital skills, video editing, data analysis, and more.",
+ "name": "Tenclass",
+ "category": "Media & Entertainment",
+ "logo": "Tenclass",
+ "order": 137,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Tenclass.jpg"
+ },
+ {
+ "story": "A state-owned bank that leverages Apache Doris to propel its digitalization and refined management of marketing, risk control, and customer services.",
+ "name": "Wuxi Xishang Bank",
+ "category": "Finance",
+ "logo": "Wuxi Xishang Bank",
+ "order": 138,
+ "to": null,
+ "image": "/images/user-logo/Finance/Wuxi Xishang Bank.jpg"
+ },
+ {
+ "story": "The consumer financing company uses Apache Doris as a unified query gateway for its risk management platform, leveraging the Multi Catalog feature of Doris to unify the heterogenous data sources.",
+ "name": "HYXJ",
+ "category": "Finance",
+ "logo": "HYXJ",
+ "order": 139,
+ "to": "https://doris.apache.org/blog/Step-by-step-Guide-to-Building-a-High-Performing-Risk-Data-Mart",
+ "image": "/images/user-logo/Finance/HYXJ.jpg"
+ },
+ {
+ "story": "A consumer financing tech services provider that extensively utilizes Apache Doris for its internal business and operations and thus realizes much faster data query performance and improved data quality.",
+ "name": "HCFC",
+ "category": "Finance",
+ "logo": "HCFC",
+ "order": 140,
+ "to": null,
+ "image": "/images/user-logo/Finance/HCFC.jpg"
+ },
+ {
+ "story": "Autohome is a leading automotive online platform, offering comprehensive information, reviews, and services related to cars. It serves as a one-stop destination for car enthusiasts, buyers, and owners.\n",
+ "name": "Autohome",
+ "category": "Media & Entertainment",
+ "logo": "Autohome",
+ "order": 141,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Autohome.jpg"
+ },
+ {
+ "story": "JJ World is a leading chess and card game developer, offering internet services such as the JJ-Dota battle platform, 3399 mini-game platform, and mobile applications.",
+ "name": "JJ World",
+ "category": "Media & Entertainment",
+ "logo": "JJ World",
+ "order": 142,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/JJ World.jpg"
+ },
+ {
+ "story": "Q1.com is dedicated to providing a superior user experience in the field of online gaming and entertainment.\n",
+ "name": "Q1.com",
+ "category": "Media & Entertainment",
+ "logo": "Q1.com",
+ "order": 143,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Q1.com.jpg"
+ },
+ {
+ "story": "This live streaming service provider with 800 million end users adopts Apache Doris for its analytic solution to simplify its data components. They ends up with faster tag queries, quick disaster recovery, and the convenience of data visualization.",
+ "name": "Xiaoe Tech",
+ "category": "Media & Entertainment",
+ "logo": "Xiaoe Tech",
+ "order": 144,
+ "to": "https://doris.apache.org/blog/data-analysis-for-live-streaming-what-happens-in-real-time-is-analyzed-in-real-time",
+ "image": "/images/user-logo/Media & Entertainment/Xiaoe Tech.jpg"
+ },
+ {
+ "story": "An e-commerce SaaS provider migrates from ClickHouse to Apache Doris and increases its SQL query performance by 250%. Apache Doris outperforms ClickHouse in the join query tests of all data sizes. ",
+ "name": "Youzan",
+ "category": "Media & Entertainment",
+ "logo": "Youzan",
+ "order": 145,
+ "to": "https://doris.apache.org/blog/migrating-from-clickhouse-to-apache-doris-what-happened",
+ "image": "/images/user-logo/Media & Entertainment/Youzan.jpg"
+ },
+ {
+ "story": "A real-estate giants builds its data warehouse solution easily and quickly with Apache Doris and thus benefits from low query latency, easy maintenance, and low storage resource consumption. ",
+ "name": "Midland Realty",
+ "category": "FMCG & Logistics",
+ "logo": "Midland Realty",
+ "order": 146,
+ "to": "https://doris.apache.org/blog/Building-a-Data-Warehouse-for-Traditional-Industry",
+ "image": "/images/user-logo/FMCG & Logistics/Midland Realty.jpg"
+ },
+ {
+ "story": "A blockchain data analytics solutions provider that allows users to customize their data dashboards within 10 seconds and extract valuable insights from data.",
+ "name": "Footprint Analytics",
+ "category": "Technology",
+ "logo": "Footprint Analytics",
+ "order": 147,
+ "to": null,
+ "image": "/images/user-logo/Technology/Footprint Analytics.jpg"
+ }
+]
diff --git a/src/constant/various-analytics.data.tsx b/src/constant/various-analytics.data.tsx
new file mode 100644
index 00000000000..324ddd86e3f
--- /dev/null
+++ b/src/constant/various-analytics.data.tsx
@@ -0,0 +1,143 @@
+import React from 'react';
+
+export const VariousAnalyticsData = [
+ {
+ title: 'Real-time analytics',
+ content:
+ 'From traditional batch reporting to real-time reporting and dashboards. From internal-facing analytics like traditional BI to customer-facing analytics. From decision support analytics to algorithm-driven real-time decision-making.',
+ links: [{ content: 'Read JD.com story ', to: '/blog/JD_OLAP' }],
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <path
+ d="M53 57C55.2091 57 57 55.2091 57 53L57 27C57 24.7909 55.2091 23 53 23L27 23C24.7909 23 23 24.7909 23 27L23 53C23 55.2091 24.7909 57 27 57L53 57Z"
+ fill="#C0C3F1"
+ />
+ <path d="M30.0001 30H50.0001" stroke="white" stroke-width="3" stroke-linecap="round" />
+ <path d="M30.0001 37H50.0001" stroke="white" stroke-width="3" stroke-linecap="round" />
+ <circle cx="47" cy="47" r="10" fill="#444FD9" />
+ <path
+ d="M51.279 45.0771L45.9586 50.7201L42.5728 47.5279"
+ stroke="white"
+ stroke-width="3"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
+ ),
+ backgroundClassName: 'cases-bg-real-time',
+ },
+ {
+ title: 'Ad-hoc analysis',
+ content: `According to Forbes, 78% of organizations consider ad-hoc analysis to be a critical or very important feature in business intelligence adoption. Interactive ad-hoc analysis is replacing predefined data reporting, allowing a wider range of people to perform self-service analysis. Doris' high performance can provide fast response to any query, making it an invaluable tool for organizations that need to quickly analyze data and make informed decisions.`,
+ links: [{ content: 'Read Xiaomi story', to: '/blog/xiaomi_vector' }],
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <path
+ d="M53 55C55.2091 55 57 53.2091 57 51L57 25C57 22.7909 55.2091 21 53 21L27 21C24.7909 21 23 22.7909 23 25L23 51C23 53.2091 24.7909 55 27 55L53 55Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M28.7998 38H33.3527C33.5052 38 33.6457 37.9174 33.7198 37.784L37.1361 31.6347C37.3136 31.3152 37.7862 31.3591 37.9017 31.7058L42.0979 44.2943C42.2134 44.641 42.686 44.6849 42.8635 44.3654L46.2798 38.2161C46.3539 38.0827 46.4944 38 46.6469 38H51.1998"
+ stroke="white"
+ stroke-width="3"
+ stroke-linecap="round"
+ />
+ </svg>
+ ),
+ backgroundClassName: 'cases-bg-ad-hoc',
+ },
+ {
+ title: 'Data lake analytics',
+ content: `Doris as a high-performance federated query engine provides a powerful way to directly map external data lakes and databases to Doris' databases and tables. This combination of the openness of data lakes and the high performance of data warehouses offers enterprises a unified and efficient way to access, analyze, and manage their data.`,
+ links: [
+ {
+ content: 'Deep dive',
+ to: '/blog/Building-the-Next-Generation-Data-Lakehouse-10X-Performance',
+ },
+ ],
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <rect x="23.9999" y="34" width="32" height="10" rx="2" fill="#444FD9" />
+ <path
+ d="M23.9999 42H25.3333C25.766 42 26.1871 42.1404 26.5333 42.4L27.5209 43.1407C28.9803 44.2352 30.9952 44.2038 32.4197 43.0642L32.5012 42.999C33.962 41.8303 36.0391 41.8313 37.4999 43C38.9608 44.1687 41.0391 44.1687 42.4999 43C43.9608 41.8313 46.0378 41.8303 47.4987 42.999L47.5802 43.0642C49.0046 44.2038 51.0196 44.2352 52.479 43.1407L53.4666 42.4C53.8128 42.1404 54.2339 42 54.6666 42H55.9999V54C55.9999 55.1046 55.1045 56 53.9999 56H25.9999C24.8954 56 23.9999 55.1046 2 [...]
+ fill="#C0C3F1"
+ />
+ <rect x="27.9999" y="37.5" width="6" height="3" rx="1.5" fill="white" />
+ <rect x="23.9999" y="22" width="32" height="10" rx="2" fill="#444FD9" />
+ <rect x="27.9999" y="25.5" width="6" height="3" rx="1.5" fill="white" />
+ </svg>
+ ),
+ backgroundClassName: 'cases-bg-datalake',
+ },
+ {
+ title: 'ELT data processing',
+ content: `As data warehouses become more powerful, there is indeed a shift from ETL (Extract, Transform, Load) processes that rely on external systems to ELT (Extract, Load, Transform) methods that are performed within the database itself. Doris, with its high-performance computing engine, supports complex large queries and incremental data reading, making it an excellent choice for ELT data processing.`,
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <path
+ fill-rule="evenodd"
+ clip-rule="evenodd"
+ d="M56.9999 53C56.9999 55.2091 55.2091 57 52.9999 57H27C24.7908 57 23 55.2091 23 53L22.9999 27C22.9999 24.7909 24.7908 23 26.9999 23L52.9999 23C55.209 23 56.9999 24.7909 56.9999 27L56.9999 53ZM44.5964 30.6236C45.3565 30.953 45.7057 31.8362 45.3763 32.5963L38.8763 47.5963C38.5469 48.3564 37.6637 48.7056 36.9035 48.3762C36.1434 48.0468 35.7942 47.1636 36.1236 46.4035L42.6236 31.4035C42.953 30.6434 43.8362 30.2942 44.5964 30.6236ZM34.0606 38.8607C34.6464 38.2749 34.6464 [...]
+ fill="#444FD9"
+ />
+ </svg>
+ ),
+ links: [
+ {
+ content: 'Read use case',
+ to: '/blog/For-Entry-Level-Data-Engineers-How-to-Build-a-Simple-but-Solid-Data-Architecture',
+ },
+ ],
+ backgroundClassName: 'cases-bg-ELT',
+ },
+ {
+ title: 'Log analytics',
+ content: `Store business, system, or IoT-related log data as structured, semi-structured, or raw text to establish a unified log storage and analytics platform. Doris offers efficient handling of high-volume log data and provides high-performance log retrieval and analytics capabilities at a highly cost-effective rate.`,
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <path
+ d="M56.9999 30L22.9999 30L22.9999 27C22.9999 24.7909 24.7908 23 26.9999 23L52.9999 23C55.2091 23 56.9999 24.7909 56.9999 27L56.9999 30Z"
+ fill="#C0C3F1"
+ />
+ <path
+ d="M57.0002 32H23.0002V51C23.0002 53.2091 24.791 55 27.0002 55H53.0002C55.2093 55 57.0002 53.2091 57.0002 51V32ZM49.1999 39.9001L43.3383 47.7156C42.7176 48.5432 41.5077 48.6292 40.7762 47.8977L37.1243 44.2458L34.1712 47.9371C33.6537 48.584 32.7098 48.6889 32.0629 48.1714C31.416 47.6539 31.3111 46.7099 31.8286 46.063L35.689 41.2375C36.322 40.4463 37.5021 40.381 38.2186 41.0974L41.8376 44.7165L46.7999 38.1001C47.297 37.4373 48.2372 37.303 48.8999 37.8001C49.5627 38.2971 [...]
+ fill="#444FD9"
+ />
+ </svg>
+ ),
+ links: [
+ { content: 'Deep dive', to: '/blog/log-analysis-elasticsearch-vs-apache-doris' },
+ {
+ content: 'Read China Unicom story',
+ to: '/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second',
+ },
+ ],
+ backgroundClassName: 'cases-bg-log',
+ },
+ {
+ title: 'Customer data platform',
+ content: `Gather user-specific attributes and behavioral data, construct a comprehensive user data platform, perform in-depth analysis of user behaviors including engagement, retention, and conversion rates, and conduct precise audience analysis covering insights and segmentation.`,
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <path
+ d="M54.6379 50.5263V55.9879C54.6379 56.4799 54.2801 56.8987 53.7942 56.9757L35.8443 59.817C35.2372 59.9131 34.688 59.4439 34.688 58.8293V57.9046C34.688 56.7561 33.7229 55.8435 32.5761 55.9077L28.6335 56.1285C27.5499 56.1891 26.6157 55.377 26.5233 54.2957C26.2995 51.6756 25.9077 47.3169 25.767 47.1782C24.8484 46.2722 20.2012 46.2722 21.1195 44.4603C22.0377 42.6485 24.8484 37.3684 24.8484 37.3684C25.4608 35.8585 24.8484 34.8574 24.8484 32.6831C24.8484 29.9653 30.3599 20 [...]
+ fill="#C0C3F1"
+ />
+ <circle cx="42" cy="36" r="13" fill="#444FD9" />
+ <path
+ d="M39 31V37H42V43C42 43 43.6926 40.6557 44.5 39C45.2312 37.5005 46 35 46 35H43L44 31H39Z"
+ fill="white"
+ stroke="white"
+ stroke-linejoin="round"
+ />
+ </svg>
+ ),
+ links: [
+ {
+ content: 'Read use case',
+ to: '/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris/',
+ },
+ ],
+ backgroundClassName: 'cases-bg-customer',
+ },
+];
diff --git a/src/hooks/use-animation-frame.ts b/src/hooks/use-animation-frame.ts
new file mode 100644
index 00000000000..17bb09b8f06
--- /dev/null
+++ b/src/hooks/use-animation-frame.ts
@@ -0,0 +1,26 @@
+import React from 'react';
+
+export const useAnimationFrame = (callback, stop) => {
+ // Use useRef for mutable variables that we want to persist
+ // without triggering a re-render on their change
+ const requestRef = React.useRef<any>();
+ const previousTimeRef = React.useRef<any>();
+ /**
+ * The callback function is automatically passed a timestamp indicating
+ * the precise time requestAnimationFrame() was called.
+ */
+
+ React.useEffect(() => {
+ console.log(stop);
+ const animate = time => {
+ if (previousTimeRef.current !== undefined) {
+ const deltaTime = time - previousTimeRef.current;
+ if (!stop) callback(deltaTime);
+ }
+ previousTimeRef.current = time;
+ requestRef.current = requestAnimationFrame(animate);
+ };
+ requestRef.current = requestAnimationFrame(animate);
+ return () => cancelAnimationFrame(requestRef.current);
+ }, [stop]); // Make sure the effect runs only once
+};
diff --git a/src/pages/download/index.scss b/src/pages/_download/index.scss
similarity index 99%
copy from src/pages/download/index.scss
copy to src/pages/_download/index.scss
index d74074d1932..85d3b8eb704 100644
--- a/src/pages/download/index.scss
+++ b/src/pages/_download/index.scss
@@ -113,7 +113,7 @@
}
&.all-in-one {
.theme-code-block {
- font-size: 1rem;
+ font-size: 0.875rem ;
padding-left: 2rem;
position: relative;
&:before {
diff --git a/src/pages/download/index.tsx b/src/pages/_download/index.tsx
similarity index 100%
copy from src/pages/download/index.tsx
copy to src/pages/_download/index.tsx
diff --git a/src/pages/download/index.scss b/src/pages/download/index.scss
index d74074d1932..4d62a462085 100644
--- a/src/pages/download/index.scss
+++ b/src/pages/download/index.scss
@@ -1,308 +1,3 @@
-.download {
- margin: 3rem 0;
-
- a {
- transition: all 0.3s;
-
- &:hover {
- text-decoration: underline;
- }
- }
-
- .page-column {
- padding: 1.875rem 0;
- }
-
- .maven {
- .page-column-title {
- font-size: 1.5rem;
- }
- }
- .downlaod-document {
- color: var(--ifm-color-primary);
- cursor: pointer;
- padding-left: 0.4rem;
- display: flex;
- align-items: center;
- }
-
- &-box {
- padding: 3.125rem;
- box-shadow: 10px 12px 38px rgba(33, 39, 116, 0.07);
- border-radius: 4px;
- background-color: var(--global-colors-white);
-
- .download-type {
- display: flex;
- align-items: center;
-
- & + .download-type {
- margin-top: 1rem;
- }
-
- &.way {
- align-items: start;
- }
-
- label {
- font-size: var(--global-font-size-default);
- font-weight: 600;
- color: var(--global-colors-text-primary);
- margin-right: 2.125rem;
- flex-shrink: 0;
- width: 9.0625rem;
- }
-
- .tabs-radio {
- flex: 1;
- display: flex;
- align-items: center;
- border-radius: 2px;
-
- .radio {
- border: var(--ifm-color-primary) solid 1px;
- flex: 1;
- text-align: center;
- font-size: var(--global-font-size-medium);
- color: var(--global-colors-text-primary);
- min-height: 3.125rem;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- cursor: pointer;
-
- &.disabled {
- background-color: var(--global-colors-background);
- cursor: not-allowed;
- border-color: var(--global-colors-split);
- color: var(--global-colors-text);
- }
-
- &.checked {
- background-color: var(--ifm-color-primary);
- color: var(--global-colors-white);
- }
-
- & + .radio {
- margin-left: -1px;
- }
- & + .disabled {
- border-left: none;
- margin-left: 0;
- }
-
- .inner {
- margin: 0.3125rem;
- background-color: #f7faff;
- width: calc(100% - 0.625rem);
- color: var(--ifm-color-primary);
-
- & + .inner {
- margin-top: 0;
- }
- }
- }
- }
- }
- .download-way {
- display: none;
- &.show {
- display: block;
- width: 100%;
- }
- &.all-in-one {
- .theme-code-block {
- font-size: 1rem;
- padding-left: 2rem;
- position: relative;
- &:before {
- content: '$';
- position: absolute;
- left: 1rem;
- top: 50%;
- transform: translateY(-50%);
- font-size: 1rem;
- }
- }
- }
- }
-
- .tips {
- margin-top: 1rem;
- .title {
- color: #556986;
- font-weight: 600;
- font-size: var(--global-font-size-smaller);
- }
- .notice-text {
- font-size: var(--global-font-size-smaller);
- font-weight: 600;
- color: #556986;
- a {
- margin: 0 0.3125rem;
- }
- }
- .notice-dir {
- display: flex;
- // margin-bottom: 0.5rem;
- .notice-dir-name {
- min-width: 10rem;
- padding-left: 3.5rem;
- &.md {
- position: relative;
- &:before {
- position: absolute;
- left: 0.8rem;
- content: '';
- width: 0;
- height: 100%;
- border-left: 1.5px solid #556986;
- }
- &:after {
- position: absolute;
- left: 0.8rem;
- top: 50%;
- content: '';
- width: 2rem;
- height: 0;
- border-top: 1.5px solid #556986;
- }
- }
- &.end {
- position: relative;
- &:before {
- position: absolute;
- left: 0.8rem;
- content: '';
- width: 0;
- height: 50%;
- border-left: 1.5px solid #556986;
- }
- &:after {
- position: absolute;
- left: 0.8rem;
- top: 50%;
- content: '';
- width: 2rem;
- height: 0;
- border-top: 1.5px solid #556986;
- }
- }
- }
- .notice-dir-val {
- margin-left: 1rem;
- }
- }
- ul {
- margin: 0;
- padding: 0;
- padding-left: 0.9375rem;
- li {
- color: #556986;
- font-size: var(--global-font-size-smaller);
- line-height: 1.5;
- font-weight: 600;
- margin-top: 0.3125rem;
-
- code {
- border-radius: 0.125rem;
- border-width: 1px;
- padding: 0.125rem 0.3125rem;
- margin: 0 0.3125rem;
- }
- a {
- margin: 0 0.3125rem;
- }
- }
- }
- }
- }
-
- @media screen and (max-width: 996px) {
- &-box {
- padding: 0;
- box-shadow: none;
-
- .download-type {
- flex-direction: column;
- align-items: flex-start;
-
- label {
- width: 100%;
- }
-
- .tabs-radio {
- width: 100%;
- }
- }
-
- .intr {
- margin-left: 0;
- }
-
- .tips {
- margin-left: 0;
- }
- }
- }
-
- .table-content {
- .content {
- overflow: auto;
- }
-
- table {
- width: 100%;
- display: table;
- margin-bottom: 0;
-
- thead {
- tr {
- background-color: #f7faff;
- border-bottom: none;
- border-top: none;
-
- th {
- font-size: var(--global-font-size-default);
- color: var(--global-colors-text-primary);
- font-weight: 700;
- border-color: #dbe4f3;
- line-height: 1.9;
- white-space: nowrap;
- }
- }
- }
-
- tbody {
- tr {
- td {
- border-color: #dbe4f3;
- font-size: var(--global-font-size-medium);
- white-space: nowrap;
-
- a + a {
- margin-left: 1.25rem;
- }
- }
- }
- }
- }
-
- .more {
- margin-top: 2.5rem;
-
- @media screen and (max-width: 996px) {
- margin-top: 1.5rem;
- }
- }
- }
-
- .verify {
- font-size: var(--global-font-size-smaller);
-
- .page-column {
- line-height: 1.8;
- }
- }
+.run-anywhere {
+ background: #F7F9FE;
}
diff --git a/src/pages/download/index.tsx b/src/pages/download/index.tsx
index 4a591ff1ff1..fabec89c9f3 100644
--- a/src/pages/download/index.tsx
+++ b/src/pages/download/index.tsx
@@ -1,145 +1,20 @@
-import clsx from 'clsx';
-import CodeBlock from '@theme/CodeBlock';
-import Layout from '../../theme/Layout';
+import { translate } from '@docusaurus/Translate';
+import React from 'react';
+import PageHeader from '@site/src/components/PageHeader';
+import Layout from '@site/src/theme/Layout';
+import CollapseBox from '@site/src/components/collapse-box/collapse-box';
+import ExternalLink from '@site/src/components/external-link/external-link';
+import { NewIcon } from '@site/src/components/Icons/new-icon';
+import DownloadForm from '@site/src/components/download-form/download-form';
+import { DORIS_VERSIONS, OLD_VERSIONS, RUN_ANYWHERE } from '@site/src/constant/download.data';
+import { ExternalLinkArrowIcon } from '@site/src/components/Icons/external-link-arrow-icon';
+import DownloadFormSimple from '@site/src/components/download-form/download-form-simple';
import Link from '@docusaurus/Link';
-import More from '@site/src/components/More';
-import PageColumn from '@site/src/components/PageColumn';
-import React, { useEffect, useState } from 'react';
-import Translate, { translate } from '@docusaurus/Translate';
-import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import './index.scss';
-import {
- CPUEnum,
- DownloadLinkProps,
- JDKEnum,
- VersionEnum,
- getAllDownloadLinks,
- getAllFlinkConnectorDownloadLinks,
- getAllSparkConnectorDownloadLinks,
- getAllRelease,
-} from '@site/src/constant/download.data';
-import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem';
-
-const BINARY_VERSION = [
- { label: `${VersionEnum.Latest} ( Latest )`, value: VersionEnum.Latest },
- { label: `${VersionEnum.Prev} ( Stable )`, value: VersionEnum.Prev },
- { label: `${VersionEnum.Earlier} ( Stable )`, value: VersionEnum.Earlier },
-];
-
-const JDK = [
- { label: 'JDK 8', value: JDKEnum.JDK8 },
- { label: 'JDK 11', value: JDKEnum.JDK11 },
-];
-
-export default function Download(): JSX.Element {
- const {
- siteConfig,
- i18n: { currentLocale, locales, localeConfigs },
- } = useDocusaurusContext();
-
- const [version, setVersion] = useState<string>(VersionEnum.Latest);
- const [cpus, setCpus] = useState<any[]>([]);
- const [cpu, setCPU] = useState<string>(CPUEnum.IntelAvx2);
- const [jdk, setJDK] = useState<string>(JDKEnum.JDK8);
- const [current, setCurrent] = useState<DownloadLinkProps>();
- const [downloadWay, setDownloadWay] = useState<string>('all-in-one');
-
- const FLINK_CONNECTOR = getAllFlinkConnectorDownloadLinks(currentLocale);
- const SPARK_CONNECTOR = getAllSparkConnectorDownloadLinks(currentLocale);
- const ALL_RELEASE = getAllRelease(currentLocale);
- let ALL_RELEASE_VERSION = {};
- ALL_RELEASE.forEach(item => {
- const info: any = Array.isArray(item.download) ? item.download.find(item => item.cpu === 'X64 ( avx2 )') : {};
- ALL_RELEASE_VERSION[item.version] = {
- cpu: CPUEnum.IntelAvx2,
- binary: info.binary,
- source: info.source,
- };
- });
- const [releaseUrls, setReleaseUrls] = useState(ALL_RELEASE_VERSION);
-
- const changeVersion = (val: string) => {
- setVersion(val);
- };
- const changeCPU = (val: string) => {
- setCPU(val);
- };
- const changeJDK = (val: string) => {
- // if (version === VersionEnum.Latest && val !== JDKEnum.JDK8) return;
- if (val !== JDKEnum.JDK8) return;
- setJDK(val);
- };
-
- const getDownloadLinks = () => {
- const text = `${version}-${cpu}-${jdk}`;
- const linkObj = getAllDownloadLinks(currentLocale).find(item => item.id === text);
- setCurrent(linkObj);
- if (linkObj && !linkObj.sh) {
- setDownloadWay('download');
- }
- };
-
- function downloadFile(url: string) {
- const a = document.createElement('a');
- a.download = url;
- a.href = url;
- a.target = '_blank';
- const clickEvt = new MouseEvent('click', {
- view: window,
- bubbles: true,
- cancelable: true,
- });
- a.dispatchEvent(clickEvt);
- a.remove();
- }
-
- const downloadDocument = () => {
- const url =
- currentLocale === 'en'
- ? 'https://cdnd.selectdb.com/assets/files/Apache Doris Docs (English).pdf'
- : 'https://cdnd.selectdb.com/assets/files/Apache Doris Docs (中文).pdf';
- downloadFile(url);
- };
-
- const CPU = [
- { label: 'X64 ( avx2 )', value: CPUEnum.IntelAvx2 },
- { label: 'X64 ( no avx2 )', value: CPUEnum.IntelNoAvx2 },
- { label: 'ARM64', value: CPUEnum.ARM },
- ];
-
- const getCpus = version => {
- const currentCpus = [];
- getAllDownloadLinks(currentLocale).forEach(item => {
- if (item.id.includes(version)) {
- const matchCpu = CPU.find(cpu => item.id.includes(cpu.value));
- currentCpus.push(matchCpu);
- }
- });
- return currentCpus;
- };
-
- useEffect(() => {
- getDownloadLinks();
- }, [version, cpu, jdk]);
-
- useEffect(() => {
- const currentCpus = getCpus(version);
- setCpus(currentCpus);
- setCPU(CPUEnum.IntelAvx2);
- setJDK(JDKEnum.JDK8);
- }, [version]);
-
- function handleCPUChange(cpu: any, currentVersionInfo: any) {
- const info = currentVersionInfo.download.find(item => item.cpu === cpu);
- setReleaseUrls({
- ...releaseUrls,
- [currentVersionInfo.version]: {
- binary: info.binary,
- source: info.source,
- },
- });
- }
+import ReadMore from '@site/src/components/ReadMore';
+import LinkWithArrow from '../../components/link-arrow';
+export default function Download() {
return (
<Layout
title={translate({ id: 'download.title', message: 'Download' })}
@@ -149,458 +24,149 @@ export default function Download(): JSX.Element {
})}
wrapperClassName="download"
>
- <section className="quick-download">
- <PageColumn
- align="left"
- title={
- <Translate id="download.quick.download" description="Quick Download">
- Quick Download
- </Translate>
- }
- >
- <div className="download-box">
- <div className="download-type">
- <label>
- <Translate id="download.version" description="Binary Version">
- Version
- </Translate>
- </label>
- <div className="tabs-radio">
- {BINARY_VERSION.map(item => (
- <div
- className={clsx('radio', {
- checked: version === item.value,
- })}
- key={item.value}
- onClick={() => changeVersion(item.value)}
- >
- {item.label}
- </div>
- ))}
- </div>
- </div>
- <div className="download-type">
- <label>
- <Translate id="download.cpu.model" description="CPU Model">
- CPU Model
- </Translate>
- </label>
- <div className="tabs-radio">
- {cpus.map(item => (
- <div
- className={clsx('radio', {
- checked: cpu === item.value,
- })}
- key={item.value}
- onClick={() => changeCPU(item.value)}
- >
- {item.label}
- </div>
- ))}
- </div>
+ <PageHeader
+ className="lg:pt-[7.5rem] g-white"
+ title="Quick Download & Easy Deployment"
+ subtitle="Download the latest version and enjoy effortless deployment for your big data analytics needs."
+ />
+ <div className="container mx-auto flex flex-col flex-wrap items-center justify-center mb-[5.5rem] lg:flex-row">
+ <CollapseBox
+ title="Apache Doris 2.0"
+ disabledExpand={true}
+ newLink={
+ <div className="flex items-center space-x-2 pb-8 text-[#0065FD]">
+ <NewIcon />
+ <ExternalLink
+ linkIcon={false}
+ to="/docs/releasenotes/release-2.0.3"
+ label="The latest version 2.0.3 is available now !"
+ className="bg-white p-0 text-[#444FD9]"
+ ></ExternalLink>
</div>
- {/* <div className="download-type">
- <label>
- <Translate id="download.jdk.version" description="JDK Version">
- JDK Version
- </Translate>
- </label>
- <div className="tabs-radio">
- {JDK.map(item => (
- <div
- className={clsx('radio', {
- checked: jdk === item.value,
- // disabled: version === VersionEnum.Latest && item.value !== JDKEnum.JDK8,
- disabled: item.value !== JDKEnum.JDK8,
- })}
- key={item.value}
- onClick={() => changeJDK(item.value)}
- >
- {item.label}
- </div>
- ))}
- </div>
- </div> */}
- {current && current?.sh && (
- <div className="download-type">
- <label>
- <Translate id="download.download.link" description="Download">
- Download
- </Translate>
- </label>
- <div className="tabs-radio">
- <div
- onClick={() => setDownloadWay('all-in-one')}
- className={clsx('radio', {
- checked: downloadWay === 'all-in-one',
- })}
- >
- <span>Binary</span>
- </div>
-
- <div
- onClick={() => setDownloadWay('download')}
- className={clsx('radio', {
- checked: downloadWay === 'download',
- })}
- >
- <span>Source</span>
- </div>
- </div>
- </div>
- )}
-
- <div className="download-type way">
- <label>
- {!current?.sh && (
- <Translate id="download.download.link" description="Download">
- Download
- </Translate>
- )}
- </label>
- <div
- className={clsx('download-way all-in-one', {
- show: downloadWay === 'all-in-one',
- })}
- >
- {current && current.sh && (
- <div className="tabs-radio">
- <div className="radio">
- <div className="inner" key={current.sh?.label}>
- <Link to={current.sh?.links.source}>{current.sh?.label}</Link>
- <span> ( </span>
- <Link to={current.sh?.links.signature}>asc</Link>,{' '}
- <Link to={current.sh?.links.sha512}>sha512</Link>
- <span> )</span>
- </div>
- </div>
- </div>
- )}
- {version === VersionEnum.Latest && (
- <div className="tips">
- <div className="title">
- <Translate id="Notice">Notice:</Translate>
- </div>
- <div className="notice-text">
- For detailed upgrade precautions, please refer to the
- <Link to="https://github.com/apache/doris/issues/27909">2.0.3</Link>
- and the
- <Link to="/docs/dev/install/standard-deployment">deployment</Link> and
- cluster
- <Link to="/docs/dev/admin-manual/cluster-management/upgrade">upgrade</Link>
- manual.
- </div>
- </div>
- )}
- </div>
- <div
- className={clsx('download-way', {
- show: downloadWay === 'download',
- })}
- >
- <div className="tabs-radio">
- <div className="radio">
- {current?.items.map(item => (
- <div className="inner" key={item.label}>
- <Link to={item?.links.source}>{item?.label}</Link>
- <span> ( </span>
- <Link to={item?.links.signature}>asc</Link>,{' '}
- <Link to={item?.links.sha512}>sha512</Link>
- <span> )</span>
- </div>
- ))}
- </div>
- </div>
- </div>
- </div>
- </div>
- </PageColumn>
- </section>
- <section className="table-content">
- <PageColumn
- align="left"
- title={<Translate id="download.release">All Releases</Translate>}
- footer={
- <More
- text={<Translate id="download.release.more">More</Translate>}
- link="https://archive.apache.org/dist/doris/"
- />
}
- >
- <div className="content">
- <table>
- <thead>
- <tr>
- <th>
- <Translate id="download.all.release.version">Version</Translate>
- </th>
- <th>
- <Translate id="download.all.release.date">Release Date</Translate>
- </th>
- <th>
- <Translate id="download.cpu.model">CPU Model</Translate>
- </th>
- <th>
- <Translate id="download.all.release.download">Download</Translate>
- </th>
- <th>
- <Translate id="download.all.release.note">Release Notes</Translate>
- </th>
- </tr>
- </thead>
- <tbody>
- {ALL_RELEASE.map((item, index) => (
- <tr key={index}>
- <td>{item.version}</td>
- <td>{item.date}</td>
- <td>
- {/* <DropdownNavbarItem items={item.download} />, */}
-
- {Array.isArray(item.download) ? (
- <select
- style={{ height: 30 }}
- onChange={e => handleCPUChange(e.target.value, item)}
- >
- {item.download.map(item => (
- <option key={item.cpu} value={item.cpu}>
- {item.cpu}
- </option>
- ))}
- </select>
- ) : (
- <></>
- )}
- </td>
- <td>
- {Array.isArray(item.download) ? (
- <div>
- <Link to={releaseUrls[item.version].source}>
- <Translate id="download.source">Source</Translate>
- </Link>
- <span style={{ padding: '0 0.28rem' }}>/</span>
- <Link to={releaseUrls[item.version].binary}>
- <Translate id="download.all.binary">Binary</Translate>
- </Link>
- </div>
- ) : (
- <Link to={item.download}>
- <Translate id="download.source.binary">Source / Binary</Translate>
- </Link>
- )}
- </td>
- <td>
- <Link to={item.note}>Release Notes</Link>
- </td>
- </tr>
- ))}
- </tbody>
- </table>
- </div>
- </PageColumn>
- </section>
- <section className="table-content">
- <PageColumn
- align="left"
- title={
- <Translate id="download.flink.connector" description="Flink Doris Connector">
- Flink Doris Connector
- </Translate>
+ description="Apache Doris 2.0 milestone has merged over 4100 pull requests, representing a 70% increase from version 1.2 last year."
+ characteristic={[
+ '10 times faster data query',
+ 'Enhanced log analytics and federated query capabilities',
+ 'More efficient data writing and updates',
+ 'Improved multi-tenant and resource isolation mechanisms',
+ ]}
+ rightContent={
+ <DownloadForm versions={DORIS_VERSIONS.filter(item => item.majorVersion === '2.0')} />
+ }
+ moreLink={
+ <LinkWithArrow to="/docs/releasenotes/release-2.0.0" text="Learn more from release note" />
}
- >
- <div className="content">
- <table>
- <thead>
- <tr>
- <th>
- <Translate id="download.flink.connector.version">Version</Translate>
- </th>
- <th>
- <Translate id="download.flink.release.date">Release Date</Translate>
- </th>
- <th>
- <Translate id="download.flink.version">Flink Version</Translate>
- </th>
- <th>
- <Translate id="download.flink.scala.version">Scala Version</Translate>
- </th>
- <th>
- <Translate id="download.flink.doris.version">Doris Version</Translate>
- </th>
- <th>
- <Translate id="download.source">Source</Translate>
- </th>
- </tr>
- </thead>
- <tbody>
- {FLINK_CONNECTOR.map((item, index) => (
- <tr key={index}>
- <td>{item.version}</td>
- <td>{item.date}</td>
- <td>{item.flink}</td>
- <td>{item.scala}</td>
- <td>{item.doris}</td>
- <td>
- <Link to={item.download}>
- <Translate id="download">Download</Translate>
- </Link>
- <Link to={item.github}>GitHub</Link>
- </td>
- </tr>
- ))}
- </tbody>
- </table>
- </div>
- </PageColumn>
- </section>
- <section className="maven">
- <PageColumn
- align="left"
- title={
- <Translate id="download.maven" description="Maven">
- Maven
- </Translate>
+ notes={
+ <>
+ Note: For detailed upgrade precautions, please refer to the{' '}
+ <Link className="text-primary underline" to="/docs/install/standard-deployment">
+ deployment
+ </Link>{' '}
+ manual and cluster{' '}
+ <Link className="text-primary underline" to="/docs/admin-manual/cluster-management/upgrade">
+ upgrade
+ </Link>{' '}
+ manual.
+ </>
}
- >
- <CodeBlock language="xml" title="" showLineNumbers>
- {`<dependency>
- <groupId>org.apache.doris</groupId>
- <artifactId>flink-doris-connector-1.14_2.12</artifactId>
- <!--artifactId>flink-doris-connector-1.13_2.12</artifactId-->
- <!--artifactId>flink-doris-connector-1.12_2.12</artifactId-->
- <!--artifactId>flink-doris-connector-1.11_2.12</artifactId-->
- <!--version>1.0.3</version-->
- <version>1.1.0</version>
-</dependency>`}
- </CodeBlock>
- </PageColumn>
- </section>
- <section className="table-content">
- <PageColumn
- align="left"
- title={
- <Translate id="download.spark.connector" description="Spark Doris Connector">
- Spark Doris Connector
- </Translate>
+ />
+ <CollapseBox
+ title="Apache Doris 1.2 ( Stable )"
+ disabledExpand={true}
+ newLink={
+ <div className="flex items-center space-x-2 pb-8 text-[#0065FD]">
+ <NewIcon />
+ <ExternalLink
+ linkIcon={false}
+ to="/docs/releasenotes/release-1.2.7"
+ label="The latest version 1.2.7 is available now !"
+ className="bg-white p-0 text-[#444FD9]"
+ ></ExternalLink>
+ </div>
}
- >
- <div className="content">
- <table>
- <thead>
- <tr>
- <th>
- <Translate id="download.spark.connector.version">Version</Translate>
- </th>
- <th>
- <Translate id="download.spark.release.date">Release Date</Translate>
- </th>
- <th>
- <Translate id="download.spark.version">Spark Version</Translate>
- </th>
- <th>
- <Translate id="download.spark.scala.version">Scala Version</Translate>
- </th>
- <th>
- <Translate id="download.spark.doris.version">Doris Version</Translate>
- </th>
- <th>
- <Translate id="download.source">Source</Translate>
- </th>
- </tr>
- </thead>
- <tbody>
- {SPARK_CONNECTOR.map((item, index) => (
- <tr key={index}>
- <td>{item.version}</td>
- <td>{item.date}</td>
- <td>{item.spark}</td>
- <td>{item.scala}</td>
- <td>{item.doris}</td>
- <td>
- <Link to={item.download}>
- <Translate id="download">Download</Translate>
- </Link>
- <Link to={item.github}>GitHub</Link>
- </td>
- </tr>
- ))}
- </tbody>
- </table>
- </div>
- </PageColumn>
- </section>
- <section className="maven">
- <PageColumn
- align="left"
- title={
- <Translate id="download.maven" description="Maven">
- Maven
- </Translate>
+ description="Apache Doris 1.2 enhance its functionality, performance, and reliability."
+ characteristic={[
+ 'Full vectorized execution engine, 3-11 times faster data query',
+ 'Merge-on-write on Unique Key Model',
+ 'Multi-Catalog to enhance data lake analytics',
+ 'Light schema change at millisecond-level and DDL auto-synchronization',
+ ]}
+ rightContent={
+ <DownloadForm versions={DORIS_VERSIONS.filter(item => item.majorVersion === '1.2')} />
}
- >
- <CodeBlock language="xml" title="" showLineNumbers>
- {`<dependency>
- <groupId>org.apache.doris</groupId>
- <artifactId>spark-doris-connector-3.2_2.12</artifactId>
- <!--artifactId>spark-doris-connector-3.1_2.12</artifactId-->
- <!--artifactId>spark-doris-connector-2.3_2.11</artifactId-->
- <!--version>1.0.1</version-->
- <version>1.1.0</version>
-</dependency>`}
- </CodeBlock>
- </PageColumn>
- </section>
- {/* <section className="table-content">
- <PageColumn
- align="left"
- title={
- <Translate id="download.document" description="文档">
- Document
- </Translate>
+ moreLink={
+ <ExternalLink
+ to="/docs/releasenotes/release-1.2.0"
+ className="bg-white p-0 text-[#444FD9]"
+ label="Learn more from release note"
+ linkIcon={<ExternalLinkArrowIcon />}
+ ></ExternalLink>
}
- >
- <div className="content">
- <p style={{ display: 'flex', alignItems: 'center' }}>
- Click to download the latest
- <span className="downlaod-document" onClick={downloadDocument}>
- offline documents{' '}
- <img
- style={{ width: '1.2rem', height: '1.2rem', paddingLeft: '0.2rem' }}
- src={require('@site/static/images/icon/download.png').default}
- alt=""
- />
- </span>
- </p>
- </div>
- </PageColumn>
- </section> */}
- <section className="verify">
- <PageColumn
- align="left"
- title={
- <Translate id="download.verify" description="Verify">
- Verify
- </Translate>
+ notes={
+ <>
+ Note: For detailed upgrade precautions, please refer to the{' '}
+ <Link className="text-primary underline" to="/docs/install/standard-deployment">
+ deployment
+ </Link>{' '}
+ manual and cluster{' '}
+ <Link className="text-primary underline" to="/docs/admin-manual/cluster-management/upgrade">
+ upgrade
+ </Link>{' '}
+ manual.
+ </>
+ }
+ />
+ <CollapseBox
+ expand={false}
+ title="Archived releases"
+ description={
+ <div>
+ <p>
+ We have collected all the code and binaries available from previous releases. For more
+ information on the latest release, please refer to the Docs.
+ </p>
+ <p className="mt-6">
+ Kindly note that older releases are provided for archival purposes only, and are no
+ longer supported.
+ </p>
+ </div>
}
- >
- <Translate id="download.verify.w1">To verify the downloaded files, please read</Translate>
- <Link to="/community/release-and-verify/release-verify">
- <Translate id="download.verify.w2"> Verify Apache Release </Translate>
- </Link>
- <Translate id="download.verify.w3"> and using these </Translate>
- <Link to="https://downloads.apache.org/doris/KEYS">
- <Translate id="download.verify.w4"> Keys</Translate>
- </Link>
- <Translate id="download.verify.w5">. After verification, please read</Translate>
- <Link to="/docs/install/source-install/compilation">
- <Translate id="download.verify.w6"> Compilation </Translate>
- </Link>
- <Translate id="download.verify.w7"> and </Translate>
- <Link to="/docs/install/install-deploy">
- <Translate id="download.verify.w8"> Installation and Deployment </Translate>
- </Link>
- <Translate id="download.verify.w9"> to compile and install Doris.</Translate>
- </PageColumn>
- </section>
+ rightContent={<DownloadFormSimple versions={OLD_VERSIONS} />}
+ // moreLink={<ReadMore to="/docs/releasenotes/release-2.0.3" />}
+ />
+ </div>
+ <a id="runAnywhere" className="scroll-mt-20"></a>
+ <div className="run-anywhere bg-[#F7F9FE] pt-[5.5rem] pb-[7.5rem]">
+ <div className="container mx-auto">
+ <h3 className="text-center text-[#1D1D1D] text-[2.5rem] font-medium">Run anywhere</h3>
+ <ul className="mt-10 grid gap-x-6 gap-y-3 lg:grid-cols-3 lg:gap-y-0">
+ {RUN_ANYWHERE.map(item =>
+ item.title !== 'Doris on AWS' ? (
+ <Link
+ href={item.link}
+ key={item.title}
+ className="relative bg-white flex cursor-pointer flex-col items-center justify-center overflow-hidden rounded-lg border-b-4 border-b-[#444FD9] py-[2rem] px-4 lg:px-[1.5rem] shadow-[inset_0_0_0_1px_#444FD9] hover:no-underline"
+ >
+ <div className="text-2xl text-[#1D1D1D]">{item.title}</div>
+ <div className="mt-4 text-base text-center text-[#4C576C]">{item.description}</div>
+ <div className="flex items-center mt-4 text-[#444FD9]">
+ <LinkWithArrow to={item.link} text="Learn more" />
+ </div>
+ </Link>
+ ) : (
+ <div className="relative bg-white flex cursor-pointer flex-col items-center justify-center overflow-hidden rounded-lg border-b-4 border-b-[#444FD9] py-[2rem] px-4 lg:px-[1.5rem] shadow-[inset_0_0_0_1px_#444FD9] hover:no-underline">
+ <div className="text-2xl text-[#1D1D1D]">{item.title}</div>
+ <div className="mt-4 text-base text-center text-[#4C576C]">{item.description}</div>
+ <div className="flex items-center mt-4">
+ <span>Coming soon</span>
+ </div>
+ </div>
+ ),
+ )}
+ </ul>
+ </div>
+ </div>
</Layout>
);
}
diff --git a/src/pages/ecosystem/cluster-management/index.tsx b/src/pages/ecosystem/cluster-management/index.tsx
new file mode 100644
index 00000000000..8fc739e26f3
--- /dev/null
+++ b/src/pages/ecosystem/cluster-management/index.tsx
@@ -0,0 +1,65 @@
+import React from 'react';
+import EcomsystemLayout from '@site/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout';
+import ExternalLink from '@site/src/components/external-link/external-link';
+import CollapseBox from '@site/src/components/collapse-box/collapse-box';
+import '../index.scss';
+
+export default function ClusterManagement() {
+ return (
+ <EcomsystemLayout>
+ <div className="container mx-auto flex flex-col flex-wrap items-center justify-center mb-[5.5rem] lg:flex-row">
+ <CollapseBox
+ title="Cluster Manager for Apache Doris"
+ description="One-stop database cluster management tool, developed by VeloDB."
+ characteristic={[
+ 'Create, start, stop, upgrade, and scale clusters',
+ 'Cluster inspection',
+ 'Monitoring and alerting',
+ 'Auditing',
+ ]}
+ rightContent={
+ <img src={require(`@site/static/images/ecomsystem/cluster-manage.png`).default} alt="" />
+ }
+ moreLink={
+ <>
+ <ExternalLink
+ href="https://www.velodb.io/download/enterprise#core"
+ label="Download"
+ ></ExternalLink>
+ <ExternalLink
+ href="https://docs.velodb.io/enterprise/velodb-enterprise-overview"
+ className="sub-btn"
+ label="Docs"
+ ></ExternalLink>
+ </>
+ }
+ />
+ <CollapseBox
+ title="Doris Operator"
+ description="Run Apache Doris on K8s, developed by VeloDB."
+ characteristic={[
+ 'Diverse PV management',
+ 'Pod deployment configuration ',
+ 'Separation of config files and services',
+ 'Smooth service upgrade',
+ 'Auto-scaling',
+ 'Support for Helm',
+ ]}
+ rightContent={
+ <img src={require(`@site/static/images/ecomsystem/doris-operator.png`).default} alt="" />
+ }
+ moreLink={
+ <>
+ <ExternalLink href="https://www.velodb.io/download/tools" label="Download"></ExternalLink>
+ <ExternalLink
+ href="https://github.com/apache/doris/blob/master/docs/en/docs/install/k8s-deploy.md"
+ className="sub-btn"
+ label="Docs"
+ ></ExternalLink>
+ </>
+ }
+ />
+ </div>
+ </EcomsystemLayout>
+ );
+}
diff --git a/src/pages/ecosystem/connectors/index.tsx b/src/pages/ecosystem/connectors/index.tsx
new file mode 100644
index 00000000000..3609904a0a4
--- /dev/null
+++ b/src/pages/ecosystem/connectors/index.tsx
@@ -0,0 +1,79 @@
+import React from 'react';
+import EcomsystemLayout from '@site/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout';
+import ExternalLink from '@site/src/components/external-link/external-link';
+import CollapseBox from '@site/src/components/collapse-box/collapse-box';
+import '../index.scss';
+
+export default function Connectors() {
+ return (
+ <EcomsystemLayout>
+ <div className="container mx-auto flex flex-col flex-wrap items-center justify-center mb-[5.5rem] lg:flex-row">
+ <CollapseBox
+ title="Flink Doris Connector"
+ description="Read, insert, modify and delete data stored in Doris through Flink."
+ characteristic={[
+ 'Support reading and writing via DataStream and SQL',
+ 'Ensure exactly-once semantics in data ingestion',
+ 'Support data updates and deletions for Doris Unique table',
+ 'Implements multi-table and entire database data synchronization for MySQL, PostgreSQL, Oracle and other databases through Flink CDC',
+ ]}
+ rightContent={<img src={require(`@site/static/images/ecomsystem/flink.png`).default} alt="" />}
+ moreLink={
+ <>
+ <ExternalLink
+ href="https://github.com/apache/doris-flink-connector"
+ label="Download"
+ ></ExternalLink>
+ <ExternalLink
+ href="https://doris.apache.org/docs/ecosystem/flink-doris-connector"
+ className="sub-btn"
+ label="Docs"
+ ></ExternalLink>
+ </>
+ }
+ />
+ <CollapseBox
+ title="Spark Doris Connector"
+ description="Read data stored in Doris and write data to Doris through Spark."
+ characteristic={[
+ 'Access Doris by SparkSQL, DataFrame, RDD, PySpark',
+ 'Support distributed reading data from Doris at scale',
+ ]}
+ rightContent={<img src={require(`@site/static/images/ecomsystem/spark.png`).default} alt="" />}
+ moreLink={
+ <>
+ <ExternalLink
+ href="https://github.com/apache/doris-spark-connector"
+ label="Download"
+ ></ExternalLink>
+ <ExternalLink
+ href="https://doris.apache.org/docs/ecosystem/spark-doris-connector"
+ className="sub-btn"
+ label="Docs"
+ ></ExternalLink>
+ </>
+ }
+ />
+ <CollapseBox
+ title="dbt Doris Adapter"
+ description="An Extract, Load, Transform (ELT) component."
+ characteristic={[
+ 'Dedicated to data transforming in ELT. ',
+ 'Support three materialization methods: View, Table and Incremental',
+ ]}
+ rightContent={<img src={require(`@site/static/images/ecomsystem/dbt.png`).default} alt="" />}
+ moreLink={
+ <>
+ <ExternalLink href="https://github.com/selectdb/dbt-doris" label="Download"></ExternalLink>
+ <ExternalLink
+ href="https://doris.apache.org/docs/ecosystem/dbt-doris-adapter"
+ className="sub-btn"
+ label="Docs"
+ ></ExternalLink>
+ </>
+ }
+ />
+ </div>
+ </EcomsystemLayout>
+ );
+}
diff --git a/src/pages/ecosystem/distributions-and-packaging/index.tsx b/src/pages/ecosystem/distributions-and-packaging/index.tsx
new file mode 100644
index 00000000000..110c199b22f
--- /dev/null
+++ b/src/pages/ecosystem/distributions-and-packaging/index.tsx
@@ -0,0 +1,62 @@
+import React from 'react';
+import EcomsystemLayout from '@site/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout';
+import ExternalLink from '@site/src/components/external-link/external-link';
+import CollapseBox from '@site/src/components/collapse-box/collapse-box';
+import '../index.scss';
+
+export default function DistributionsAndPackaging() {
+ return (
+ <EcomsystemLayout>
+ <div className="container mx-auto flex flex-col flex-wrap items-center justify-center mb-[5.5rem] lg:flex-row">
+ <CollapseBox
+ title="VeloDB"
+ description={
+ <>
+ <p>
+ VeloDB is a modern data warehouse built on Apache Doris. It is designed to provide
+ lightning-fast performance for large-scale real-time data processing.{' '}
+ </p>
+ <p className="mt-6">
+ With cloud-native services and self-managed software on-premises, VeloDB offers a
+ powerful solution developed by VeloDB Inc., a leading technology company headquartered
+ in Singapore.
+ </p>
+ <p className="mt-6">
+ Businesses can leverage VeloDB to unlock invaluable insights from data with unparalleled
+ efficiency.
+ </p>
+ </>
+ }
+ rightContent={<img src={require(`@site/static/images/ecomsystem/velodb.png`).default} alt="" />}
+ moreLink={
+ <ExternalLink
+ href="https://www.velodb.io"
+ className="sub-btn"
+ label="Learn more"
+ ></ExternalLink>
+ }
+ showListIcon={false}
+ />
+ <CollapseBox
+ showListIcon={false}
+ title="SelectDB"
+ description={
+ <p>
+ SelectDB is a modern data warehouse built on Apache Doris. It is designed to deliver
+ exceptional speed and performance for processing real-time data at scale, offering
+ cloud-native services and self-managed software on-premises.{' '}
+ </p>
+ }
+ rightContent={<img src={require(`@site/static/images/ecomsystem/selectdb.png`).default} alt="" />}
+ moreLink={
+ <ExternalLink
+ href="https://www.selectdb.com"
+ className="sub-btn"
+ label="Learn more"
+ ></ExternalLink>
+ }
+ />
+ </div>
+ </EcomsystemLayout>
+ );
+}
diff --git a/src/pages/ecosystem/index.scss b/src/pages/ecosystem/index.scss
new file mode 100644
index 00000000000..1a6bda72677
--- /dev/null
+++ b/src/pages/ecosystem/index.scss
@@ -0,0 +1,8 @@
+.ecosystem {
+ .sub-btn {
+ height: auto;
+ color: #444fd9;
+ min-width: auto;
+ padding: 0;
+ }
+}
diff --git a/src/pages/ecosystem/index.tsx b/src/pages/ecosystem/index.tsx
new file mode 100644
index 00000000000..94e937ebfaa
--- /dev/null
+++ b/src/pages/ecosystem/index.tsx
@@ -0,0 +1,4 @@
+import React from 'react';
+export default function Ecosystem() {
+ return <></>;
+}
diff --git a/src/pages/index.scss b/src/pages/index.scss
index 7094b724118..209931421fe 100644
--- a/src/pages/index.scss
+++ b/src/pages/index.scss
@@ -1,5 +1,5 @@
.news-section {
- background-color: #F6F8FF;
+ background-color: #f6f8ff;
.news-wrap {
height: 5rem;
@@ -45,7 +45,6 @@
justify-content: center;
.row {
-
.col:nth-child(5),
.col:nth-child(6) {
.core-feature-item {
@@ -69,7 +68,7 @@
.core-feature-title {
font-size: 1.25rem;
- font-weight: 500;
+ font-weight: 540;
color: var(--global-colors-text-black);
text-align: left;
}
@@ -116,10 +115,11 @@
}
.ready-start-wrap {
- background: url('@site/static/images/start-bg.png') no-repeat center;
+ background: url('@site/static/images/start-bg.jpg') no-repeat center;
background-size: cover;
- height: 15rem;
- padding-top: 2rem;
+
+ padding-top: 5.5rem;
+ padding-bottom: 5.5rem;
.start-title {
text-align: center;
@@ -130,7 +130,7 @@
.start-buttons {
display: flex;
justify-content: center;
-
+ margin-top: 3rem;
.start-btn {
color: var(--global-colors-white);
min-width: 8.75rem;
@@ -138,7 +138,6 @@
text-align: center;
font-size: var(--global-font-size-default);
border-radius: 4px;
- margin-top: 1.3rem;
cursor: pointer;
text-decoration: none;
@@ -152,14 +151,10 @@
margin-left: 1.2rem;
}
}
-
}
}
-
.ready-start {
- margin-bottom: 5rem;
- margin-top: -3rem;
}
@media (max-width: 996px) {
@@ -187,7 +182,7 @@
.page-column {
.communitys {
.col {
- &+.col {
+ & + .col {
margin-top: 0;
}
}
@@ -209,5 +204,182 @@
font-size: 2rem;
}
}
+}
+
+.core-capabilities-group {
+ gap: 5rem 1.5rem;
+}
+
+.various-analytics-group {
+ padding-top: 2rem;
+ padding-bottom: 2rem;
+
+ display: flex;
+ line-height: 1.6;
+ & + .various-analytics-group {
+ border-top: 1px solid #ccd4e2;
+ }
+ .items-title {
+ display: flex;
+ align-items: center;
+ margin-right: 5rem;
+ font-weight: 450;
+ font-size: 1.25rem;
+ }
+ .items-content {
+ flex: 1;
+ text-align: start;
+ font-size: 1rem;
+ line-height: 1.625;
+ font-weight: 400;
+ .links {
+ display: flex;
+ margin-top: 1.5rem;
+ gap: 2rem;
+ }
+ }
+}
+
+.swiper-button-next:active,
+.swiper-button-prev:active {
+ color: #00b1fd;
+}
+
+.swiper-pagination-bullet {
+ background: #d9d9d9;
+ margin: 0 0.5rem !important;
+}
+
+.swiper-pagination-bullet-active {
+ background: var(--ifm-color-primary);
+}
+
+.firstPageSwiper {
+ .swiper-pagination-bullets.swiper-pagination-horizontal {
+ left: 155px;
+ top: 150px;
+ width: auto;
+ .swiper-pagination-bullet {
+ background-color: white;
+ opacity: 80%;
+ height: 0.25rem;
+ width: 0.25rem;
+ }
+ .swiper-pagination-bullet-active {
+ width: 2.5rem;
+ border-radius: 0.375rem;
+ }
+ }
+}
+
+@media (max-width: 1280px) {
+ .firstPageSwiper {
+ .swiper-pagination-bullets.swiper-pagination-horizontal {
+ top: 35%;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+ }
+}
+
+@media (max-width: 1024px) {
+ .firstPageSwiper {
+ .swiper-pagination-bullets.swiper-pagination-horizontal {
+ top: 38%;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+ }
+}
+
+@media (max-width: 640px) {
+ .firstPageSwiper {
+ .swiper-pagination-bullets.swiper-pagination-horizontal {
+ top: 33%;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+ }
+}
+
+.cases-tabs {
+ .ant-tabs-ink-bar {
+ background-color: #444fd9;
+ }
+ .ant-tabs-nav {
+ .ant-tabs-tab {
+ width: 17.5rem;
+ font-size: 1.25rem;
+ line-height: 1.6;
+ position: relative;
+ margin-top: 0 !important;
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+ &:hover {
+ color: #444fd9;
+ }
+ &.ant-tabs-tab-active {
+ background: linear-gradient(270deg, rgba(223, 224, 247, 0.4) 0%, rgba(223, 224, 247, 0.02) 100%);
+ .ant-tabs-tab-btn {
+ color: #444fd9;
+ .progress {
+ display: block;
+ }
+ }
+ }
+ .ant-tabs-tab-btn {
+ flex: 1;
+ .progress {
+ display: none;
+ }
+ }
+ }
+ }
+ .ant-tabs-content-holder {
+ .ant-tabs-content {
+ height: 100%;
+ min-height: 300px;
+ .ant-tabs-tabpane {
+ transition-property: opacity;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 300ms;
+ padding-left: 3.5rem;
+ height: 100%;
+ position: absolute;
+ .cases-bg-datalake {
+ background: url('/static/images/cases-bg-datalake.png') no-repeat center;
+ background-size: cover;
+ }
+ .cases-bg-ad-hoc {
+ background: url('/static/images/cases-bg-ad-hoc.png') no-repeat center;
+ background-size: cover;
+ }
+ .cases-bg-customer {
+ background: url('/static/images/cases-bg-customer.png') no-repeat center;
+ background-size: cover;
+ }
+ .cases-bg-ELT {
+ background: url('/static/images/cases-bg-ELT.png') no-repeat center;
+ background-size: cover;
+ }
+ .cases-bg-log {
+ background: url('/static/images/cases-bg-log.png') no-repeat center;
+ background-size: cover;
+ }
-}
\ No newline at end of file
+ .cases-bg-real-time {
+ background: url('/static/images/cases-bg-real-time.png') no-repeat center;
+ background-size: cover;
+ }
+
+ &.ant-tabs-tabpane-active {
+ opacity: 1;
+ }
+ &.ant-tabs-tabpane-hidden {
+ display: block;
+ opacity: 0;
+ }
+ }
+ }
+ }
+}
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index 5589a2a3b9b..a6690fb4d33 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -3,42 +3,92 @@ import Layout from '../theme/Layout';
import Link from '@docusaurus/Link';
import More from '../components/More/index';
import PageBanner, { ButtonProps } from '../components/PageBanner';
+import { Progress } from '../components/progress/progress';
+
import PageColumn from '../components/PageColumn';
-import React from 'react';
+import React, { useCallback, useEffect, useState } from 'react';
import Translate, { translate } from '@docusaurus/Translate';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import usePhone from '../hooks/use-phone';
+import { useAnimationFrame } from '../hooks/use-animation-frame';
import './index.scss';
-import NewsLetter from '../components/Newsletter';
+import LinkWithArrow from '@site/src/components/link-arrow';
import { NEWSLETTER_DATA } from '../constant/newsletter.data';
+import { AchievementBanner } from '../components/achievement-banner/achievement-banner';
+import { CoreCapabilitiesData } from '../constant/core-capabilities.data';
+import { CoreCapabilitiesCard } from '../components/core-capabilities-card/core-capabilities-card';
+import { VariousAnalyticsData } from '../constant/various-analytics.data';
+import { Swiper, SwiperClass, SwiperSlide } from 'swiper/react';
+import { Pagination, Navigation } from 'swiper';
+import GetStarted from '@site/src/components/get-started/get-started';
+import { Tabs } from 'antd';
+import { Content } from 'antd/es/layout/layout';
+import ReadMore from '../components/ReadMore';
export default function Home(): JSX.Element {
const { siteConfig } = useDocusaurusContext();
const { isPhone } = usePhone();
+ const pagination = {
+ clickable: true,
+ renderBullet: function (index, className) {
+ return '<span class="' + className + '"></span>';
+ },
+ };
+ const modules = [Pagination];
+ const [swiperRef, setSwiperRef] = useState<SwiperClass>();
+
+ const [count, setCount] = useState<number>(0);
+ const [activeKey, setActiveKey] = useState<string>('0');
+ const [stop, setStop] = useState<boolean>(false);
+ const handlePrevious = useCallback(() => {
+ swiperRef?.slidePrev();
+ }, [swiperRef]);
+
+ const handleNext = useCallback(() => {
+ swiperRef?.slideNext();
+ }, [swiperRef]);
+
const buttons: ButtonProps[] = [
{
- label: 'GitHub',
- link: 'https://github.com/apache/doris',
+ label: 'Download',
+ link: '/download',
type: 'primary',
},
{
- label: <Translate id="homepage.banner.button1">Get Started</Translate>,
+ label: <Translate id="homepage.banner.button1">Get started</Translate>,
link: '/docs/get-starting/what-is-apache-doris',
type: 'ghost',
},
- {
- label: 'Slack',
- link: 'https://join.slack.com/t/apachedoriscommunity/shared_invite/zt-28il1o2wk-DD6LsLOz3v4aD92Mu0S0aQ',
- type: 'default',
- },
];
const banner = {
- title: <Translate id="homepage.banner.title">Real-Time Analytics Makes the Future</Translate>,
+ title: (
+ <div
+ className="lg:leading-[78px]"
+ style={{
+ fontWeight: 540,
+ }}
+ >
+ <p className="highlight">
+ <Translate id="homepage.banner.title">Open Source, Real-Time</Translate>
+ </p>
+ <p>
+ <Translate id="homepage.banner.highlightTitle">Data Warehouse</Translate>
+ </p>
+ </div>
+ ),
subTitle: (
- <Translate id="homepage.banner.subTitle">
- Apache Doris is a new-generation open-source real-time data warehouse based on MPP architecture, with
- easier use and higher performance for big data analytics.
- </Translate>
+ <div>
+ <p>
+ <Translate id="homepage.banner.subTitle-1">
+ Apache Doris is a modern data warehouse for real-time analytics.
+ </Translate>
+ </p>
+ <p>
+ <Translate id="homepage.banner.subTitle-2">
+ It delivers lightning-fast analytics on real-time data at scale.
+ </Translate>
+ </p>
+ </div>
),
bannerImg: require('@site/static/images/home-banner.png').default,
buttons,
@@ -110,36 +160,329 @@ export default function Home(): JSX.Element {
const communitys = [
{
- title: <Translate id="community.title.c1">Mailing List</Translate>,
- img: require('@site/static/images/icon/community-1.png').default,
+ title: <Translate id="community.title.c1">Developer mailing list</Translate>,
+ img: (
+ <svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#00C2DD" />
+ <g opacity="0.6" filter="url(#filter0_f_1665_497)">
+ <ellipse cx="30" cy="47" rx="11" ry="3" fill="#00C2DD" />
+ </g>
+ <path
+ d="M14.8004 12H45.1996C47.2733 12 48.9736 13.6645 49 15.7042L30.0066 26.181L11.0176 15.7174C11.0351 13.6689 12.7223 12 14.8004 12ZM11.0176 19.7263L11 38.2517C11 40.3135 12.7091 42 14.8004 42H45.1996C47.2909 42 49 40.3135 49 38.2517V19.7174L30.4547 29.7042C30.1692 29.8587 29.8265 29.8587 29.5453 29.7042L11.0176 19.7263Z"
+ fill="#00BED9"
+ />
+ <path
+ d="M45.1996 12H14.8004C12.7223 12 11.0352 13.6689 11.0176 15.7174L30 26.5L49 15.7042C48.9736 13.6645 47.2733 12 45.1996 12Z"
+ fill="#00BED9"
+ />
+ <defs>
+ <filter
+ id="filter0_f_1665_497"
+ x="9"
+ y="34"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1665_497" />
+ </filter>
+ </defs>
+ </svg>
+ ),
href: '/community/subscribe-mail-list',
},
{
- title: <Translate id="community.title.c2">Discussion</Translate>,
- img: require('@site/static/images/icon/community-2.png').default,
+ title: <Translate id="community.title.c2">GitHub discussions</Translate>,
+ img: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="61" viewBox="0 0 60 61" fill="none">
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#3078E5" />
+ <g opacity="0.6" filter="url(#filter0_f_1926_14560)">
+ <ellipse cx="30" cy="48" rx="11" ry="3" fill="#3078E5" />
+ </g>
+ <path
+ d="M30 10C19.7788 10 11.5 18.2589 11.5 28.4557C11.4979 32.3301 12.7188 36.1068 14.9895 39.2499C17.2602 42.393 20.4654 44.7431 24.1503 45.9665C25.0753 46.1271 25.4213 45.5734 25.4213 45.0881C25.4213 44.6507 25.3972 43.1982 25.3972 41.6516C20.75 42.5061 19.5475 40.5221 19.1775 39.483C18.9685 38.9515 18.0675 37.3145 17.2813 36.8752C16.6338 36.5301 15.7088 35.6756 17.2572 35.6535C18.715 35.6295 19.7547 36.9915 20.1025 37.5452C21.7675 40.3357 24.4278 39.5513 25.4897 39 [...]
+ fill="black"
+ />
+ <defs>
+ <filter
+ id="filter0_f_1926_14560"
+ x="9"
+ y="35"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1926_14560" />
+ </filter>
+ </defs>
+ </svg>
+ ),
href: 'https://github.com/apache/doris/discussions',
},
{
- title: <Translate id="community.title.c3">How to Contribute</Translate>,
- img: require('@site/static/images/icon/community-3.png').default,
- href: '/community/how-to-contribute/',
+ title: <Translate id="community.title.c3">Slack workspace</Translate>,
+ img: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" fill="none">
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#636CDF" />
+ <g opacity="0.6" filter="url(#filter0_f_1926_14564)">
+ <ellipse cx="29.667" cy="47" rx="11" ry="3" fill="#636CDF" />
+ </g>
+ <path
+ d="M21.6156 31.4787C21.6156 29.5059 23.2152 27.9062 25.1881 27.9062C27.1609 27.9062 28.7605 29.5059 28.7605 31.532V40.4365C28.7605 41.384 28.3842 42.2927 27.7142 42.9626C27.0442 43.6326 26.1356 44.009 25.1881 44.009C24.2406 44.009 23.3319 43.6326 22.662 42.9626C21.992 42.2927 21.6156 41.384 21.6156 40.4365V31.4787Z"
+ fill="#CE365C"
+ />
+ <path
+ d="M13.6508 34.0581C12.9809 33.3882 12.6045 32.4795 12.6045 31.532C12.6045 29.5059 14.2574 27.9062 16.2303 27.9596H19.7494V31.532C19.7494 32.4795 19.373 33.3882 18.7031 34.0581C18.0331 34.7281 17.1244 35.1045 16.177 35.1045C15.2295 35.1045 14.3208 34.7281 13.6508 34.0581Z"
+ fill="#CE365C"
+ />
+ <path
+ d="M34.1462 36.9174C36.119 36.9174 37.7187 38.517 37.7187 40.4898C37.7187 41.4373 37.3423 42.346 36.6723 43.016C36.0023 43.6859 35.0937 44.0623 34.1462 44.0623C33.1987 44.0623 32.29 43.6859 31.6201 43.016C30.9501 42.346 30.5737 41.4373 30.5737 40.4898V36.9174H34.1462Z"
+ fill="#E3B44C"
+ />
+ <path
+ d="M34.1462 27.9062H43.1573C45.1302 27.9062 46.7298 29.5059 46.6765 31.4787C46.6765 33.4516 45.0769 35.0512 43.104 35.0512H34.1462C33.1987 35.0512 32.29 34.6748 31.6201 34.0048C30.9501 33.3349 30.5737 32.4262 30.5737 31.4787C30.5737 30.5312 30.9501 29.6226 31.6201 28.9526C32.29 28.2826 33.1987 27.9062 34.1462 27.9062Z"
+ fill="#E3B44C"
+ />
+ <path
+ d="M39.5313 22.5211C39.5313 20.5482 41.1309 18.9486 43.1038 18.9486C44.0513 18.9486 44.9599 19.325 45.6299 19.995C46.2999 20.6649 46.6762 21.5736 46.6762 22.5211C46.6762 23.4686 46.2999 24.3772 45.6299 25.0472C44.9599 25.7172 44.0513 26.0936 43.1038 26.0936H39.5313V22.5211Z"
+ fill="#5BB381"
+ />
+ <path
+ d="M30.5735 22.5211V13.51C30.5735 12.5625 30.9499 11.6538 31.6199 10.9838C32.2898 10.3139 33.1985 9.9375 34.146 9.9375C35.0934 9.9375 36.0021 10.3139 36.6721 10.9838C37.342 11.6538 37.7184 12.5625 37.7184 13.51V22.5211C37.7184 23.4686 37.342 24.3772 36.6721 25.0472C36.0021 25.7172 35.0934 26.0936 34.146 26.0936C33.1985 26.0936 32.2898 25.7172 31.6199 25.0472C30.9499 24.3772 30.5735 23.4686 30.5735 22.5211Z"
+ fill="#5BB381"
+ />
+ <path
+ d="M22.662 10.9838C23.3319 10.3139 24.2406 9.9375 25.1881 9.9375C27.1609 9.9375 28.7605 11.5371 28.7605 13.51V17.0824H25.1881C24.2406 17.0824 23.3319 16.706 22.662 16.0361C21.992 15.3661 21.6156 14.4574 21.6156 13.51C21.6156 12.5625 21.992 11.6538 22.662 10.9838Z"
+ fill="#68BBDB"
+ />
+ <path
+ d="M25.1348 26.0936H16.177C15.2295 26.0936 14.3208 25.7172 13.6508 25.0472C12.9809 24.3772 12.6045 23.4686 12.6045 22.5211C12.6045 21.5736 12.9809 20.6649 13.6508 19.995C14.3208 19.325 15.2295 18.9486 16.177 18.9486H25.1348C26.0822 18.9486 26.9909 19.325 27.6609 19.995C28.3308 20.6649 28.7072 21.5736 28.7072 22.5211C28.7072 23.4686 28.3308 24.3772 27.6609 25.0472C26.9909 25.7172 26.0822 26.0936 25.1348 26.0936Z"
+ fill="#68BBDB"
+ />
+ <defs>
+ <filter
+ id="filter0_f_1926_14564"
+ x="8.66699"
+ y="34"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1926_14564" />
+ </filter>
+ </defs>
+ </svg>
+ ),
+ href: 'https://join.slack.com/t/apachedoriscommunity/shared_invite/zt-28il1o2wk-DD6LsLOz3v4aD92Mu0S0aQ',
},
{
- title: <Translate id="community.title.c4">Source Code</Translate>,
- img: require('@site/static/images/icon/community-4.png').default,
- href: 'https://github.com/apache/doris',
+ title: <Translate id="community.title.c4">Twitter</Translate>,
+ img: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" fill="none">
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#3078E5" />
+ <g opacity="0.6" filter="url(#filter0_f_1665_513)">
+ <ellipse cx="30" cy="47" rx="11" ry="3" fill="#3078E5" />
+ </g>
+ <path
+ d="M18.1681 41.2188L28.0334 30.1003L26.9476 28.5656L15.7812 41.2188H18.1681Z"
+ fill="#1D1D1D"
+ />
+ <path
+ d="M43.4004 12.7812L32.6624 24.8833L31.5656 23.3328L40.8771 12.7812H43.4004Z"
+ fill="#1D1D1D"
+ />
+ <path
+ d="M24.1918 13H16L35.8082 41H44L24.1918 13ZM36.7983 39.1768L19.5698 14.8233H23.2017L40.4302 39.1768H36.7983Z"
+ fill="#1D1D1D"
+ />
+ <defs>
+ <filter
+ id="filter0_f_1665_513"
+ x="9"
+ y="34"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1665_513" />
+ </filter>
+ </defs>
+ </svg>
+ ),
+ href: 'https://twitter.com/doris_apache',
},
{
- title: <Translate id="community.title.c5">Improvement Proposals</Translate>,
- img: require('@site/static/images/icon/community-5.png').default,
- href: 'https://cwiki.apache.org/confluence/display/DORIS/Doris+Improvement+Proposals',
+ title: <Translate id="community.title.c5">LinkedIn</Translate>,
+ img: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="61" height="60" viewBox="0 0 61 60" fill="none">
+ <g clip-path="url(#clip0_1665_520)">
+ <g opacity="0.6" filter="url(#filter0_f_1665_520)">
+ <ellipse cx="30.5" cy="47" rx="11" ry="3" fill="#1460D4" />
+ </g>
+ <path
+ d="M12.9424 43.9994H20.8779V21.3502H12.9424V43.9994ZM39.3494 20.6359C36.0648 20.6359 34.2536 21.7356 32.1689 24.3993V21.3496H24.2461V43.9994H32.1683V31.6917C32.1683 29.0944 33.41 26.5539 36.3791 26.5539C39.3482 26.5539 40.0783 29.0938 40.0783 31.6299V44H47.9783V31.1246C47.9783 22.1788 42.6349 20.6359 39.3494 20.6359ZM16.9248 10C14.4801 10 12.5 11.7894 12.5 13.9981C12.5 16.2051 14.4801 17.9917 16.9248 17.9917C19.3673 17.9917 21.3474 16.2046 21.3474 13.9981C21.3 [...]
+ fill="#1460D4"
+ />
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#3078E5" />
+ </g>
+ <defs>
+ <filter
+ id="filter0_f_1665_520"
+ x="9.5"
+ y="34"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1665_520" />
+ </filter>
+ <clipPath id="clip0_1665_520">
+ <rect width="60" height="60" fill="white" transform="translate(0.5)" />
+ </clipPath>
+ </defs>
+ </svg>
+ ),
+ href: 'https://www.linkedin.com/company/-apache',
},
{
- title: <Translate id="community.title.c6">Doris Team</Translate>,
- img: require('@site/static/images/icon/community-6.png').default,
- href: '/community/team.html',
+ title: <Translate id="community.title.c6">All video resources</Translate>,
+ img: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" fill="none">
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#3078E5" />
+ <g opacity="0.6" filter="url(#filter0_f_1665_524)">
+ <ellipse cx="30" cy="47" rx="11" ry="3" fill="#3078E5" />
+ </g>
+ <path
+ d="M35.5 27.866C36.1667 27.4811 36.1667 26.5189 35.5 26.134L28 21.8038C27.3333 21.4189 26.5 21.9001 26.5 22.6699L26.5 31.3301C26.5 32.0999 27.3333 32.5811 28 32.1962L35.5 27.866Z"
+ fill="black"
+ />
+ <path
+ d="M13 16C13 13.7909 14.7909 12 17 12H43C45.2091 12 47 13.7909 47 16V38C47 40.2091 45.2091 42 43 42H17C14.7909 42 13 40.2091 13 38V16ZM17 14C15.8954 14 15 14.8954 15 16V38C15 39.1046 15.8954 40 17 40H43C44.1046 40 45 39.1046 45 38V16C45 14.8954 44.1046 14 43 14H17Z"
+ fill="black"
+ />
+ <defs>
+ <filter
+ id="filter0_f_1665_524"
+ x="9"
+ y="34"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1665_524" />
+ </filter>
+ </defs>
+ </svg>
+ ),
+ href: 'https://www.youtube.com/@apachedoris/channels',
},
];
+
+ function renderSwiper() {
+ const modules = [Pagination];
+ // if (!isPhone) {
+ // modules.push(Navigation);
+ // }
+ return (
+ <div style={{ position: 'relative' }}>
+ {!isPhone && (
+ <div
+ onClick={handlePrevious}
+ className="swiper-button-prev invisible group-hover:visible"
+ style={{ position: 'absolute', top: 'calc(50% - 2rem)', left: '-3rem', zIndex: 99 }}
+ ></div>
+ )}
+
+ <Swiper
+ pagination={pagination}
+ spaceBetween={50}
+ slidesPerView={1}
+ navigation={false}
+ modules={modules}
+ loop={true}
+ className="firstPageSwiper"
+ // style={{ minHeight: 480 }}
+ onSlideChange={() => console.log('slide change')}
+ onSwiper={setSwiperRef}
+ >
+ {NEWSLETTER_DATA.map(newsletter => {
+ return (
+ <SwiperSlide key={newsletter.title}>
+ <div className=" row flex justify-center xl:justify-start flex-start pb-8 lg:pb-16">
+ <div className="w-full lg:w-auto flex justify-center ml-4">
+ <img
+ width={424}
+ src={`${require(`@site/static/images/${newsletter.image}`).default}`}
+ alt={newsletter.title}
+ />
+ </div>
+ <div className=" w-[48rem] ml-12 flex flex-col ">
+ <div className="flex gap-1 mb-1">
+ {newsletter.tags.map(value => (
+ <div className="color-[#4c576c] font-medium text-xs leading-5">
+ {value}
+ </div>
+ ))}
+ </div>
+ <h3 className="leading-[38px] text-2xl font-medium line-clamp-1 ">
+ {newsletter.title}
+ </h3>
+ <p className="pt-3 line-clamp-2 text-lg leading-8">{newsletter.content}</p>
+ <ReadMore to={newsletter.to} className="pt-6" />
+ </div>
+ </div>
+ </SwiperSlide>
+ );
+ })}
+ </Swiper>
+ {!isPhone && (
+ <div
+ onClick={handleNext}
+ className="swiper-button-next invisible group-hover:visible"
+ style={{ position: 'absolute', top: 'calc(50% - 2rem)', right: '-3rem', zIndex: 99 }}
+ ></div>
+ )}
+ </div>
+ );
+ }
+
+ useAnimationFrame(deltaTime => {
+ // Pass on a function to the setter of the state
+ // to make sure we always have the latest state
+
+ setCount(prevCount => {
+ if (prevCount >= 100) {
+ setActiveKey(activeKey => {
+ let nextKey = +activeKey + 1;
+ if (nextKey >= VariousAnalyticsData.length) {
+ nextKey = 0;
+ }
+ return nextKey.toString();
+ });
+ return 0;
+ }
+ return prevCount + 0.4;
+ });
+ }, stop);
+
return (
<Layout
title={translate({ id: 'homepage.title', message: 'Apache Doris: Open-Source Real-Time Data Warehouse' })}
@@ -151,44 +494,36 @@ export default function Home(): JSX.Element {
showAnnouncementBar={true}
>
<PageBanner {...banner}></PageBanner>
- <NewsLetter newsList={NEWSLETTER_DATA} style={{ marginTop: '0' }} />
- {/* <section className="news-section">
- <div className="container">
- <div className="news-wrap">
- <div className="news-item">
- <span className="news-icon"></span>
- <Link to="/docs/dev/releasenotes/release-1.2.6" className="news-content">
- <Translate id="1.2.6" description="Apache Doris 1.2.6 is released now.">
- Apache Doris 1.2.6 is released now.
- </Translate>
- </Link>
- </div>
- </div>
- </div>
- </section> */}
+ <AchievementBanner />
+ <section style={{ backgroundColor: '#F7F9FE' }} className="group">
+ <div className="container pt-14">{renderSwiper()}</div>
+ </section>
<section className="apache-doris">
<PageColumn
+ wrapperStyle={{ paddingBottom: '7.5rem' }}
title={
<Translate id="homepage.what" description="What is Apache Doris">
What is Apache Doris?
</Translate>
}
footer={
- <More
- link="docs/get-starting/what-is-apache-doris"
- text={
- <Translate id="homepage.more" description="more link">
- More
- </Translate>
- }
- />
+ <div className="justify-center flex mt-9">
+ <LinkWithArrow
+ to="/docs/get-starting/what-is-apache-doris"
+ text={
+ <Translate id="homepage.more" description="more link">
+ Learn more
+ </Translate>
+ }
+ />
+ </div>
}
>
{isPhone ? (
- <img src={require('@site/static/images/what-is-doris-phone.png').default} alt="" />
+ <img src={require('@site/static/images/what-is-doris.png').default} alt="" />
) : (
<img
- style={{ maxWidth: '85%' }}
+ style={{ maxWidth: '85%', margin: 'auto' }}
src={require('@site/static/images/what-is-doris.png').default}
alt=""
/>
@@ -196,33 +531,100 @@ export default function Home(): JSX.Element {
</PageColumn>
</section>
<PageColumn
+ wrapperStyle={{ paddingTop: '7.5rem', paddingBottom: '5.5rem', backgroundColor: '#F7F9FE' }}
title={
- <Translate id="homepage.features" description="Core Features">
- Core Features
+ <Translate id="homepage.capabilities" description="Core capabilities">
+ Core capabilities
</Translate>
}
footer={<></>}
>
- <div className="core-features">
- <div className="row">
- {coreFeatures.map((item, index) => (
- <div className="col col--6" key={index}>
- <div className="core-feature-item">
- <img src={item.img} className="core-feature-img" alt="" />
- <div className="core-feature-content">
- <div className="core-feature-title">{item.title}</div>
- <div className="core-feature-subtitle">{item.subTitle}</div>
+ <div className="block lg:grid core-capabilities-group grid-cols-1 lg:grid-cols-3 ">
+ {CoreCapabilitiesData.map(props => (
+ <CoreCapabilitiesCard key={props.title} {...props} />
+ ))}
+ </div>
+ </PageColumn>
+ <PageColumn
+ title={
+ <div>
+ <p>
+ <Translate
+ id="homepage.unified"
+ description="Unified data warehouse
+ for various analytics use cases"
+ >
+ Unified data warehouse
+ </Translate>
+ </p>
+ <p>
+ <Translate id="homepage.analytics" description="for various analytics use cases">
+ for various analytics use cases
+ </Translate>
+ </p>
+ </div>
+ }
+ >
+ <div className="cases-tabs" onMouseEnter={() => setStop(true)} onMouseLeave={() => setStop(false)}>
+ {/* <Tabs
+ activeKey={activeKey}
+ onChange={activeKey => {
+ setCount(0);
+ setActiveKey(activeKey);
+ }}
+ tabPosition={isPhone ? 'top' : 'left'}
+ items={VariousAnalyticsData.map(({ content, title, links, backgroundClassName }, index) => {
+ return {
+ label: (
+ <div className="font-misans text-start">
+ <span>{title}</span>
+ <div className="absolute -bottom-0 w-full">
+ <Progress percent={count} />
+ </div>
+ </div>
+ ),
+ key: index.toString(),
+ children: (
+ <div
+ className={`font-misans text-start h-full ${backgroundClassName} py-14 pr-14 text-base`}
+ >
+ <div>{content}</div>
+
+ <div className="flex mt-14 gap-2">
+ {links.map(({ content, to }) => (
+ <More style={{ textAlign: 'left' }} link={to} text={content} />
+ ))}
+ </div>
</div>
+ ),
+ };
+ })}
+ /> */}
+ {VariousAnalyticsData.map(({ title, content, links, icon }) => (
+ <div className="various-analytics-group flex-col lg:flex-row">
+ <div className="items-title w-auto lg:w-[27.25rem] ">
+ <div>{icon}</div>
+ <div>{title}</div>
+ </div>
+ <div className="items-content px-6 lg:px-0">
+ <div>{content}</div>
+
+ <div className="links">
+ {links.map(({ content, to }) => (
+ <LinkWithArrow to={to} text={content} />
+ // <More style={{ textAlign: 'left' }} link={to} text={content} />
+ ))}
</div>
</div>
- ))}
- </div>
+ </div>
+ ))}
</div>
</PageColumn>
<PageColumn
+ className="bg-[#F7F9FE]"
title={
<Translate id="homepage.join" description="Join The Community">
- Join the Community
+ Connect with community
</Translate>
}
>
@@ -231,7 +633,7 @@ export default function Home(): JSX.Element {
{communitys.map((item, index) => (
<div className={clsx('col', isPhone ? 'col--6' : 'col--4')} key={index}>
<Link to={item.href} className="community-item">
- <img src={item.img} alt="" className="community-img" />
+ {item.img}
<div className="community-title">{item.title}</div>
</Link>
</div>
@@ -239,25 +641,7 @@ export default function Home(): JSX.Element {
</div>
</div>
</PageColumn>
- <div className="ready-start">
- <div className="container">
- <div className="ready-start-wrap">
- <div className="start-title">
- <Translate id="homepage.start.title">
- Start Your Journey in Real-Time with Apache Doris
- </Translate>
- </div>
- <div className="start-buttons">
- <Link className="start-btn download-btn" to="/download">
- <Translate id="homepage.start.downloadButton">Download</Translate>
- </Link>
- <Link className="start-btn docs-btn" to="/docs/get-starting/what-is-apache-doris">
- <Translate id="homepage.start.docsButton">Go to Docs</Translate>
- </Link>
- </div>
- </div>
- </div>
- </div>
+ <GetStarted />
</Layout>
);
}
diff --git a/src/pages/users/index.scss b/src/pages/users/index.scss
index 64948953def..ca1891a7943 100644
--- a/src/pages/users/index.scss
+++ b/src/pages/users/index.scss
@@ -14,13 +14,14 @@
// bottom: -4rem !important;
// }
- .swiper-button-next, .swiper-button-prev {
+ .swiper-button-next,
+ .swiper-button-prev {
top: calc(50% - 2rem);
}
.users-wall-list {
- padding: 0 1rem;
- padding-bottom: 4rem;
+ // padding: 0 1rem;
+ // padding-bottom: 4rem;
.users-wall-item {
list-style: none;
@@ -32,6 +33,7 @@
img {
display: block;
+ width: 36.25rem;
}
}
@@ -48,7 +50,7 @@
}
.swiper-pagination-bullet-active {
- background: var(--ifm-color-primary);
+ background: #8592a6;
}
}
@@ -230,7 +232,7 @@ html[lang='zh-CN'] {
.users-wall-list {
flex-wrap: wrap;
- padding: 0;
+ // padding: 0;
.users-wall-item {
flex: 0 0 33.333% !important;
diff --git a/src/pages/users/index.tsx b/src/pages/users/index.tsx
index 66afb5db2c1..c452ddd6ebc 100644
--- a/src/pages/users/index.tsx
+++ b/src/pages/users/index.tsx
@@ -1,27 +1,43 @@
import Layout from '../../theme/Layout';
-import React, { useCallback, useMemo, useState } from 'react';
+import React, { useCallback, useEffect, useMemo, useState } from 'react';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
-import Translate, { translate } from '@docusaurus/Translate';
+import { translate } from '@docusaurus/Translate';
import './index.scss';
-import Link from '@docusaurus/Link';
-import PageColumn from '@site/src/components/PageColumn';
import userCasesEn from '@site/userCases/en_US.json';
import { Swiper, SwiperClass, SwiperSlide } from 'swiper/react';
import 'swiper/css';
import 'swiper/css/pagination';
import 'swiper/css/navigation';
-import { Pagination, Navigation } from 'swiper';
+import { Pagination } from 'swiper';
import usePhone from '@site/src/hooks/use-phone';
+import PageHeader from '@site/src/components/PageHeader';
+import { USER_STORIES, USER_STORIES_CATEGORIES } from '@site/src/constant/user.data';
+import useIsBrowser from '@docusaurus/useIsBrowser';
+import UserItem from './user-item';
+import USERS from '../../constant/users.data.json';
+import ReadMore from '@site/src/components/ReadMore';
+
+const ALL_TEXT = 'All';
export default function Users(): JSX.Element {
const { i18n } = useDocusaurusContext();
const userCases = userCasesEn;
const { isPhone } = usePhone();
+ const isBrowser = useIsBrowser();
+ const [active, setActive] = useState(() => {
+ const tag = isBrowser ? sessionStorage.getItem('tag') : ALL_TEXT;
+ return tag || ALL_TEXT;
+ });
+ const [users, setUsers] = useState([...USERS].sort((a, b) => a.order - b.order));
const getUserLogos = (page: number = 1, total: number = 30) => {
const arr = new Array(total).fill('');
return arr.map((item, index) => require(`@site/static/images/user-logo-${page}/u-${index + 1}.png`).default);
};
+ useEffect(() => {
+ setActive(ALL_TEXT);
+ }, []);
+
const [swiperRef, setSwiperRef] = useState<SwiperClass>();
const theSlides = useMemo(() => ['slide one', 'slide two'], []);
@@ -41,6 +57,21 @@ export default function Users(): JSX.Element {
},
};
+ function changeCategory(category: string) {
+ setActive(category);
+ let currentCategory = USER_STORIES_CATEGORIES.find(item => item === category);
+ const currentUsers = USERS.filter(user => user.category === category);
+ if (category === ALL_TEXT) {
+ setUsers([...USERS].sort((a, b) => a.order - b.order));
+ } else {
+ setUsers(currentUsers);
+ }
+ if (!currentCategory) {
+ setActive(ALL_TEXT);
+ currentCategory = USER_STORIES_CATEGORIES.find(item => item === ALL_TEXT);
+ }
+ }
+
function renderSwiper() {
const modules = [Pagination];
// if (!isPhone) {
@@ -68,33 +99,29 @@ export default function Users(): JSX.Element {
onSlideChange={() => console.log('slide change')}
onSwiper={setSwiperRef}
>
- <SwiperSlide>
- <div className="users-wall-list row">
- <img
- className="users-wall-img"
- src={require(`@site/static/images/user-logos-1.jpg`).default}
- alt=""
- />
- </div>
- </SwiperSlide>
- <SwiperSlide>
- <div className="users-wall-list row">
- <img
- className="users-wall-img"
- src={require(`@site/static/images/user-logos-2.jpg`).default}
- alt=""
- />
- </div>
- </SwiperSlide>
- <SwiperSlide>
- <div className="users-wall-list row">
- <img
- className="users-wall-img"
- src={require(`@site/static/images/user-logos-3.png`).default}
- alt=""
- />
- </div>
- </SwiperSlide>
+ {USER_STORIES.map(userStory => {
+ return (
+ <SwiperSlide key={userStory.title}>
+ <div className="users-wall-list row flex flex-start pb-8 lg:pb-16">
+ <div>
+ <img
+ className="users-wall-img lg:w-[580px] lg:h-[248px]"
+ src={`${require(`@site/static/images/${userStory.image}`).default}`}
+ alt="users-wall-img"
+ />
+ </div>
+ <div className="w-[35.75rem] ml-4 lg:ml-12 flex flex-col py-4">
+ <h3 className="leading-[38px] text-2xl">{userStory.title}</h3>
+ <p className="my-6 text-base">
+ <strong className="font-normal">{userStory.author.name}</strong>
+ <span className="ml-6 text-[#4C576C]">{userStory.author.title}</span>
+ </p>
+ <ReadMore to={userStory.to} className="text-primary" />
+ </div>
+ </div>
+ </SwiperSlide>
+ );
+ })}
</Swiper>
{!isPhone && (
<div
@@ -114,56 +141,43 @@ export default function Users(): JSX.Element {
message: 'An easy-to-use, high-performance and unified analytical database',
})}
>
- <section className="users-wall">
- <PageColumn
- align="left"
- title={
- <Translate id="user.logos" description="Companies That Trust Apache Doris">
- Companies That Trust Apache Doris
- </Translate>
- }
- >
- {renderSwiper()}
- </PageColumn>
- </section>
- <section className="story">
- <PageColumn
- align="left"
- title={
- <Translate id="user.user-case" description="Companies Powerd by Apache Doris">
- Companies Powerd by Apache Doris
- </Translate>
- }
- footer={
- <div className="share-story">
- <Link to="https://github.com/apache/doris/issues/10229" className="share-button">
- <Translate id="user.add..your.company" description="Add Your Company">
- Share Your Story
- </Translate>
- </Link>
- </div>
- }
- >
- <div style={{ fontSize: 16, marginTop: '-2rem', marginBottom: '-1rem' }}>
- <Translate
- id="user.case-description"
- description="There are more than 2,000 companies worldwide leveraging Apache Doris to build their unified
- data analytical database. Some of them are listed below:"
+ <PageHeader
+ className="lg:pt-[7.5rem] px-4"
+ title="Start Real-Time Journey with Innovators"
+ subtitle="Over 4000 global leaders and enterprises are powered by Apache Doris."
+ extra={
+ <div className="flex justify-center mt-5">
+ <button
+ className="button-primary"
+ onClick={() => window.open('https://github.com/apache/doris/discussions/27683', '_blank')}
>
- There are more than 2,000 companies worldwide leveraging Apache Doris to build their unified
- data analytical database. Some of them are listed below:
- </Translate>
- </div>
- <div className="user-cases">
- {userCases &&
- userCases.map(item => (
- <div className="user-case" key={item.name}>
- <h2 className="user-case-title">{item.name}</h2>
- <p className="user-case-intro">{item.introduction}</p>
- </div>
- ))}
+ Share your story
+ </button>
</div>
- </PageColumn>
+ }
+ />
+ <section className="users-wall container lg:pt-[88px]">{renderSwiper()}</section>
+ <section className="lg:pt-[5.5rem] container">
+ <div className="blog-list-wrap row mt-28 lg:mt-0">
+ <ul className="container scrollbar-none mt-0 m-auto flex flex-wrap gap-3 overflow-auto lg:w-[58rem] text-[#4C576C] lg:mt-8 lg:justify-center lg:gap-6 ">
+ {USER_STORIES_CATEGORIES.map((item: any) => (
+ <li className="py-px" key={item} onClick={() => changeCategory(item)}>
+ <span
+ className={`block cursor-pointer whitespace-nowrap rounded-[2.5rem] px-4 py-2 text-sm shadow-[0px_1px_4px_0px_rgba(49,77,136,0.10)] hover:bg-primary hover:text-white lg:px-6 lg:py-3 lg:text-base ${
+ active === item && 'bg-primary text-white'
+ }`}
+ >
+ {item}
+ </span>
+ </li>
+ ))}
+ </ul>
+ </div>
+ <ul className="mt-6 grid gap-1 grid-cols-3 lg:gap-6 lg:mt-12 lg:grid-cols-4 pb-[88px]">
+ {users.map(user => (
+ <UserItem key={user.name} {...user} />
+ ))}
+ </ul>
</section>
</Layout>
);
diff --git a/src/pages/users/user-item.css b/src/pages/users/user-item.css
new file mode 100644
index 00000000000..ac598af3321
--- /dev/null
+++ b/src/pages/users/user-item.css
@@ -0,0 +1,32 @@
+.swipe-top-button {
+ text-decoration: none;
+ /* letter-spacing: 2px; */
+ text-align: center;
+ position: relative;
+ transition: all .35s;
+ overflow: hidden;
+}
+
+.swipe-top-button span {
+ position: relative;
+ z-index: 2;
+}
+
+.swipe-top-button:after {
+ position: absolute;
+ content: "";
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 0;
+ background: #444FD9;
+ transition: all .35s;
+}
+
+.swipe-top-button:hover {
+ color: #fff;
+}
+
+.swipe-top-button:hover:after {
+ height: 100%;
+}
\ No newline at end of file
diff --git a/src/pages/users/user-item.tsx b/src/pages/users/user-item.tsx
new file mode 100644
index 00000000000..8859272e5a7
--- /dev/null
+++ b/src/pages/users/user-item.tsx
@@ -0,0 +1,33 @@
+import Link from '@docusaurus/Link';
+import ReadMore from '@site/src/components/ReadMore';
+import React from 'react';
+import './user-item.css';
+
+interface UserItemProps {
+ image: any;
+ name: string;
+ to?: string;
+ story?: string;
+ order: number;
+}
+
+export default function UserItem(props: UserItemProps) {
+ return (
+ <div className="group cursor-pointer flex flex-col items-center swipe-top-button lg:h-[17.5rem] lg:w-[17.5rem] h-[8rem] w-[8rem] shadow-[0px_2px_8px_0px_rgba(49,77,136,0.16)] rounded-lg">
+ <div className="group-hover:hidden flex justify-between py-2 px-2 lg:px-[2.375rem] lg:pt-[4.25rem] lg:pb-[2.375rem] flex-col items-center h-full w-full gap-[2.375rem]">
+ <img src={props?.image} alt={props?.name} />
+ <span className="text-xs lg:text-base">{props?.name}</span>
+ {/* {props?.to && <ReadMore className="text-primary" to={props?.to} />} */}
+ </div>
+
+ <div
+ className={`hidden group-hover:flex ${
+ props?.to && 'group-hover:flex-col'
+ } z-40 group-hover:text-white h-full justify-between px-4 py-6`}
+ >
+ <span className="text-xs lg:text-sm">{props?.story}</span>
+ {props?.to && <ReadMore className="hover:text-white justify-center text-white" to={props?.to} />}
+ </div>
+ </div>
+ );
+}
diff --git a/src/scss/_variables.scss b/src/scss/_variables.scss
index 535a12e0cfe..ec0cb5e53bc 100644
--- a/src/scss/_variables.scss
+++ b/src/scss/_variables.scss
@@ -1,19 +1,11 @@
-html[lang="zh-Hans-CN"] {
- --ifm-font-family-base: 'Noto Sans SC',
- 'Source Sans Pro',
- 'Helvetica Neue',
- Helvetica,
- Arial,
- sans-serif;
+html[lang='zh-Hans-CN'] {
+ --ifm-font-family-base: 'MiSans', 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-family: 'MiSans', 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
-html[lang="en-US"] {
- --ifm-font-family-base: 'Montserrat',
- 'Source Sans Pro',
- 'Helvetica Neue',
- Helvetica,
- Arial,
- sans-serif;
+html[lang='en-US'] {
+ --ifm-font-family-base: 'MiSans Latin', 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-family: 'MiSans Latin', 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
:root {
@@ -30,18 +22,19 @@ html[lang="en-US"] {
--ifm-navbar-search-input-icon: url('data:image/svg+xml;utf8,<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24"><path d="M11 2.5C15.6945 2.5 19.5 6.3055 19.5 11C19.5 13.0175 18.797 14.871 17.623 16.3285C17.7199 16.3471 17.8089 16.3945 17.8785 16.4645L21.0605 19.6465C21.1542 19.7403 21.2069 19.8674 21.2069 20C21.2069 20.1326 21.1542 20.2597 21.0605 20.3535L20.3535 21.0605C20.2597 21.1542 20.1326 21.2069 20 21.2069C19.8674 21.2069 [...]
--ifm-navbar-item-padding-vertical: 0.4rem;
--ifm-navbar-height: 5rem;
- --ifm-menu-color-background-active: #E4E8EE;
+ --ifm-menu-color-background-active: #e4e8ee;
- --ifm-blockquote-color: #63646D;
+ --ifm-blockquote-color: #63646d;
--global-gutter: 1.5625rem;
--global-colors-text-black: #162033;
- --global-colors-text-primary: #232D3E;
- --global-colors-text: #63646D;
+ --global-colors-text-primary: #232d3e;
+ --global-colors-text: #63646d;
+ --global-colors-text-secondary: #4c576c;
// --global-colors-background: #F5F7FA;
- --global-colors-split: #DADDE1;
- --global-colors-white: #FFFFFF;
+ --global-colors-split: #dadde1;
+ --global-colors-white: #ffffff;
--search-local-modal-background: var(--global-colors-white);
--search-local-modal-shadow: 0px 0px 30px rgba(201, 217, 233, 0.5);
@@ -67,5 +60,4 @@ html[lang="en-US"] {
--global-header-height: 5rem;
--global-sidebar-width: 20rem;
--doc-sidebar-width: 20rem !important;
-
-}
\ No newline at end of file
+}
diff --git a/src/scss/common.scss b/src/scss/common.scss
index b25bd3a56f5..1c02f03e8d1 100644
--- a/src/scss/common.scss
+++ b/src/scss/common.scss
@@ -1,24 +1,56 @@
.docs-wrapper {
- .versions {
- opacity: 1;
- }
-}
-
-.plugin-id-community {
- .versions {
- opacity: 0;
+ .navbar__inner {
+ .navbar__items--right {
+ .header-right-button-github,
+ .header-right-button-slack {
+ display: none;
+ }
+ }
}
-
- .doc-search {
+ .navbar__bottom {
display: none;
}
}
-.markdown code {
- background-color: #f6f7f8;
+
+@media screen and (max-width: 996px) {
+ .docs-wrapper {
+ .navbar__inner {
+ .navbar__items--right {
+ .docs-search,
+ .custom-navbar-item {
+ display: none;
+ }
+ }
+ }
+ .navbar__bottom {
+ display: block;
+ }
+ }
}
-.markdown pre code {
- background-color: #282A36;
+.custom-scrollbar {
+ &::-webkit-scrollbar {
+ width: 6px;
+ height: 10px;
+ }
+ &::-webkit-scrollbar-track {
+ background-color: #fff;
+ border-radius: 10px;
+ }
+ &::-webkit-scrollbar-thumb {
+ background-color: rgba(0, 0, 0, 0);
+ border-radius: 8px;
+ }
+ &:hover {
+ &::-webkit-scrollbar-thumb {
+ background-color: #dfe5f0;
+ }
+ }
+ &::-webkit-scrollbar-thumb {
+ &:hover {
+ background-color: #dfe5f0;
+ }
+ }
}
@media (max-width: 996px) {
@@ -35,6 +67,10 @@
@media (max-width: 576px) {
:root {
- --ifm-font-size-base: 12px;
+ --ifm-font-size-base: 16px;
}
-}
\ No newline at end of file
+}
+
+.theme-code-block {
+ font-size: 0.875rem !important;
+}
diff --git a/src/scss/components/blog.scss b/src/scss/components/blog.scss
index 6c747cd1631..cd8c8582e0f 100644
--- a/src/scss/components/blog.scss
+++ b/src/scss/components/blog.scss
@@ -2,8 +2,8 @@
.blog-info {
display: flex;
align-items: center;
- color: rgba(38, 40, 51, 0.4);
flex-wrap: wrap;
+ color: #1d1d1d;
.split-line {
margin: 0 0.5rem;
@@ -37,7 +37,7 @@
.s-tag {
font-size: 12px;
- background-color: #F5F7F9;
+ background-color: #f5f7f9;
padding: 2px 4px;
border-radius: 2px;
color: rgba(38, 40, 51, 0.6);
@@ -49,4 +49,4 @@
.pagination-nav {
display: none;
}
-}
\ No newline at end of file
+}
diff --git a/src/scss/components/breadcrumbs.scss b/src/scss/components/breadcrumbs.scss
index dbd44ac161a..ba43197f157 100644
--- a/src/scss/components/breadcrumbs.scss
+++ b/src/scss/components/breadcrumbs.scss
@@ -6,9 +6,12 @@
}
.breadcrumbs {
+ display: flex;
&__item {
+ display: flex;
+ align-items: center;
+ position: relative;
&:first-child {
-
&:before {
content: '';
display: block;
@@ -16,7 +19,9 @@
height: 2rem;
position: absolute;
z-index: 1;
-
+ }
+ svg {
+ color: #4c576c;
}
}
@@ -31,7 +36,7 @@
padding: 0;
vertical-align: middle;
- >svg {
+ > svg {
top: -1px;
}
}
@@ -46,4 +51,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/scss/components/markdown.scss b/src/scss/components/markdown.scss
index 7051f3b92ae..5d3b5b9df93 100644
--- a/src/scss/components/markdown.scss
+++ b/src/scss/components/markdown.scss
@@ -1,5 +1,5 @@
.markdown {
- color: #4c4e4d;
+ color: #4c576c;
padding-left: 1rem;
h1,
h2,
@@ -7,40 +7,61 @@
h4,
h5,
h6 {
- color: var(--global-colors-text-primary);
+ color: #1d1d1d;
margin-bottom: 0.3125rem;
font-weight: 500;
}
h1,
h1:first-child {
- --ifm-h1-font-size: 1.875rem;
+ font-size: 2rem;
+ margin-bottom: 1.5rem;
+ margin-top: 0;
}
h2 {
- --ifm-h2-font-size: 1.5rem;
+ font-size: 1.5rem;
+ margin-bottom: 1.25rem;
+ margin-top: 2rem;
+ padding-top: 2rem;
+ border-top: 1px solid #e6e7e9;
}
h3 {
- --ifm-h3-font-size: 1.25rem;
+ font-size: 1rem;
+ margin-bottom: 1.25rem;
+ margin-top: 1rem;
+ }
+ p {
+ line-height: 1.875;
}
-
-
code {
border-radius: 4px;
- background-color: var(--global-colors-background);
+ background-color: #edf2fa;
border: none;
- padding: 0.125rem 0.3125rem;
+ padding: 3px 4px;
+ margin: 0 8px;
+ font-size: 14px;
+ color: #4c576c;
}
pre {
code {
- padding: 0.625rem;
+ padding: 0.725rem 1.25rem;
+ background-color: #262a37;
+ line-height: 1.875;
}
}
table thead tr {
- background-color: var(--global-colors-background);
+ background-color: #f7f9fe;
+ }
+
+ table thead th {
+ background-color: #f7f9fe;
+ color: #1d1d1d;
+ font-size: 1rem;
+ font-weight: 500;
}
table tr {
@@ -49,9 +70,33 @@
font-size: var(--global-font-size-small);
}
- table th,
- table td {
- padding: 0.375rem 0.8125rem;
+ table tr th {
+ padding: 0.53rem 0.8125rem;
+ border-color: #dfe5f0;
+ }
+
+ table tr td {
+ padding: 0.65rem 0.8125rem;
+ border-color: #dfe5f0;
+ }
+ a {
+ color: var(--ifm-color-primary);
+ }
+ ul {
+ margin: 16px 0;
+ padding-left: 20px;
+ li {
+ margin-top: 4px;
+ position: relative;
+ list-style: initial;
+ }
+ }
+ ol {
+ margin: 16px 0;
+ padding-left: 20px;
+ li {
+ list-style: decimal;
+ }
}
}
@@ -59,8 +104,8 @@
header {
margin-top: 1rem;
- &+h1 {
+ & + h1 {
display: none;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/scss/components/navbar.scss b/src/scss/components/navbar.scss
index c055c2d5195..7bcf5949c60 100644
--- a/src/scss/components/navbar.scss
+++ b/src/scss/components/navbar.scss
@@ -5,7 +5,23 @@
display: flex;
border-bottom: 1px solid rgba(255, 255, 255, 0.4);
box-shadow: 0px 6px 16px rgba(160, 170, 208, 0.15);
-
+ .navbar-left {
+ display: flex;
+ }
+ .docs-search {
+ display: none;
+ }
+ .custom-navbar-item {
+ display: none;
+ }
+ &.docs {
+ .docs-search {
+ display: block;
+ }
+ .custom-navbar-item {
+ display: block;
+ }
+ }
&__inner {
padding: 0 5rem;
margin: 0 auto;
@@ -108,11 +124,11 @@
text-align: center;
background-color: var(--ifm-color-primary);
margin-left: 1rem;
- transition: all .3s;
+ transition: all 0.3s;
&:hover {
background-color: var(--ifm-color-primary-darkest);
- color: rgba(255, 255, 255, .8);
+ color: rgba(255, 255, 255, 0.8);
text-decoration: none;
}
}
@@ -126,10 +142,22 @@
position: relative;
&:hover {
- opacity: .8;
+ opacity: 0.8;
}
}
+ .header-right-button-slack {
+ min-width: 2.25rem;
+ padding-left: 2.25rem;
+ height: 2.25rem;
+ background: url('@site/static/images/icon/slack.svg') no-repeat left center;
+ background-size: contain;
+ position: relative;
+ margin-left: 1rem;
+ &:hover {
+ opacity: 0.8;
+ }
+ }
.navbar-search {
display: none;
@@ -140,7 +168,7 @@
&-input {
height: 2.625rem;
- border-radius: 4px;
+ border-radius: 0.5rem;
background-color: transparent;
color: var(--global-colors-text-primary);
padding-left: 3rem;
@@ -149,16 +177,16 @@
border: 1px solid rgba(35, 45, 62, 0.5);
&:hover {
- border-color: #3784FF;
+ border-color: #3784ff;
}
&:focus {
- border: 1px solid #3784FF;
+ border: 1px solid #3784ff;
outline: none;
}
}
- >div:last-child {
+ > div:last-child {
display: none;
}
}
@@ -167,11 +195,16 @@
.dropdown {
padding-left: 0;
padding-right: 0;
+ .navbar__link {
+ &:after {
+ top: 0;
+ }
+ }
}
.dropdown__menu {
box-shadow: 0px 6px 20px rgba(83, 132, 204, 0.2);
- border-radius: 4px;
+ border-radius: 0.5rem;
min-width: 6.5rem;
.dropdown__link {
@@ -206,7 +239,6 @@
}
.github-btn {
-
.gh-text {
display: none;
}
@@ -227,7 +259,7 @@
line-height: 1.2;
text-decoration: none;
pointer-events: none;
- background-color: #F0F1FC;
+ background-color: #f0f1fc;
margin-top: 0.4rem;
position: relative;
margin-left: 0.3rem;
@@ -239,7 +271,7 @@
.gh-count:before,
.gh-count:after {
- content: "";
+ content: '';
position: absolute;
display: inline-block;
width: 0;
@@ -253,18 +285,60 @@
left: -10px;
margin-top: -5px;
border: 5px solid transparent;
- border-right-color: #F0F1FC;
+ border-right-color: #f0f1fc;
}
-
}
-
-
+ .navbar__bottom {
+ display: none;
+ }
}
-
@media screen and (max-width: 996px) {
.navbar {
-
+ height: 3.75rem;
+ &.docs {
+ height: 6.5rem;
+ flex-direction: column;
+ .navbar__inner {
+ height: 3.75rem;
+ }
+ .navbar__bottom {
+ display: block;
+ border-top: 0.5px solid #edf2fa;
+ height: 2.75rem;
+ padding: 0 1.25rem;
+ .docs-nav-version-locale {
+ display: flex;
+ justify-content: flex-end;
+ .navbar__item {
+ display: block;
+ }
+ }
+ li {
+ list-style: none;
+ }
+ }
+ }
+ .navbar__inner {
+ padding: 0 1.25rem;
+ }
+ .navbar-left {
+ .navbar-logo-wrapper {
+ .navbar__logo {
+ height: 1.5625rem;
+ }
+ .docs {
+ svg {
+ width: 8.125rem;
+ height: 1.5625rem;
+ }
+ }
+ }
+ }
+ .navbar__toggle.clean-btn > svg {
+ width: 1.5rem;
+ height: 1.5rem;
+ }
&__brand {
height: 2rem;
}
@@ -274,8 +348,8 @@
}
.navbar__toggle {
-
- >svg {
+ margin-right: 0;
+ > svg {
width: 2rem;
height: 2rem;
}
@@ -287,7 +361,7 @@
}
&__close {
- >svg {
+ > svg {
width: 1.5rem;
height: 1.5rem;
}
@@ -304,7 +378,7 @@
.menu__list {
&-item {
- &+.menu__list-item {
+ & + .menu__list-item {
&::before {
content: '';
display: block;
@@ -313,7 +387,7 @@
left: 0;
right: 0;
height: 1px;
- transform: scaleY(.5);
+ transform: scaleY(0.5);
background-color: var(--global-colors-split);
}
}
@@ -352,9 +426,16 @@
}
.navbar__items--right {
+ .docs-search {
+ display: none;
+ }
+ .custom-navbar-item {
+ display: none;
+ }
.navbar__search-input {
background: transparent var(--ifm-navbar-search-input-icon) no-repeat 0.75rem center / 2rem 2rem;
border: none;
+ border-radius: 0.5rem;
}
.navbar-search {
@@ -368,11 +449,16 @@
.github-btn-desktop {
display: none;
}
+ .header-right-button-github {
+ display: none;
+ }
+ .header-right-button-slack {
+ display: none;
+ }
}
&__search {
-
- >button {
+ > button {
display: none;
}
}
@@ -406,7 +492,7 @@
margin-left: -0.2rem;
&:hover {
- opacity: .8;
+ opacity: 0.8;
}
.github-btn {
@@ -416,5 +502,4 @@
}
}
}
-
-}
\ No newline at end of file
+}
diff --git a/src/scss/components/pagination-nav.scss b/src/scss/components/pagination-nav.scss
index 7fa6c600c5c..3dad1924e3c 100644
--- a/src/scss/components/pagination-nav.scss
+++ b/src/scss/components/pagination-nav.scss
@@ -1,7 +1,7 @@
.pagination-nav {
- border-top: 1px solid var(--global-colors-split);
- margin-top: 3.75rem;
- padding-top: 1.875rem;
+ padding-top: 5rem;
+ padding-bottom: 4.5rem;
+ margin-top: 0 !important;
&__link {
border: none;
@@ -14,8 +14,6 @@
timing-function: ease-out;
duration: 0.3s;
}
-
-
}
&__sublabel {
@@ -26,4 +24,4 @@
font-weight: 400;
text-transform: initial;
}
-}
\ No newline at end of file
+}
diff --git a/src/scss/components/search.scss b/src/scss/components/search.scss
index 401fc36fe21..27360312775 100644
--- a/src/scss/components/search.scss
+++ b/src/scss/components/search.scss
@@ -28,7 +28,6 @@
.hitAction__La6 {
svg {
display: none;
-
}
&::after {
@@ -50,9 +49,30 @@
color: var(--ifm-color-primary);
}
}
-
}
p[class*='searchResultItemSummary'] {
font-style: normal;
-}
\ No newline at end of file
+}
+
+@media screen and (max-width: 996px) {
+ .docs-search {
+ display: none;
+ }
+ .docs-subnav-searchbar {
+ .navbar-search {
+ position: relative !important;
+ right: auto;
+ width: 100%;
+ .navbar__search {
+ margin-left: 0;
+ .searchBar_src-theme-SearchBar-SearchBar-module {
+ width: 100%;
+ }
+ .navbar__search-input {
+ width: 100% !important;
+ }
+ }
+ }
+ }
+}
diff --git a/src/scss/components/sidebar.scss b/src/scss/components/sidebar.scss
index 6f0e5ec651f..608249ea7b0 100644
--- a/src/scss/components/sidebar.scss
+++ b/src/scss/components/sidebar.scss
@@ -19,7 +19,6 @@
}
}
-
.theme-doc-sidebar-menu {
padding: 0.5rem;
diff --git a/src/scss/custom.scss b/src/scss/custom.scss
index 6bd3347b0f9..8361d14b812 100644
--- a/src/scss/custom.scss
+++ b/src/scss/custom.scss
@@ -5,7 +5,9 @@
*/
/* You can override the default Infima variables here. */
-
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
@import './variables';
@import './components/sidebar';
@import './components/breadcrumbs';
@@ -14,4 +16,24 @@
@import './components/navbar';
@import './components/blog';
@import './components/search';
-@import './common';
\ No newline at end of file
+@import './common';
+
+
+@layer utilities {
+ .transition-slide {
+ @apply inline-block transform transition-transform duration-300 hover:translate-x-1 group-hover:translate-x-1;
+ }
+}
+
+
+.button-primary {
+ display: flex;
+ height: 52px;
+ padding: 15px 40px;
+ justify-content: center;
+ align-items: center;
+ gap: 4px;
+ border-radius: 4px;
+ background: var(--b-1, #444FD9);
+ color: white;
+}
\ No newline at end of file
diff --git a/src/theme/AnnouncementBar/index.tsx b/src/theme/AnnouncementBar/index.tsx
index 40d6c4e1547..e5c1f0ee0bc 100644
--- a/src/theme/AnnouncementBar/index.tsx
+++ b/src/theme/AnnouncementBar/index.tsx
@@ -32,7 +32,7 @@ export default function AnnouncementBar() {
description: 'The ARIA label for close button of announcement bar',
})}
>
- <IconClose width={14} height={14} strokeWidth={3.1} />
+ <IconClose width={14} height={14} strokeWidth={3.1} style={{ color: 'white' }} />
</button>
) : null}
</div>
diff --git a/src/theme/AnnouncementBar/styles.module.css b/src/theme/AnnouncementBar/styles.module.css
index a9b1a2c5c51..976586ccdfe 100644
--- a/src/theme/AnnouncementBar/styles.module.css
+++ b/src/theme/AnnouncementBar/styles.module.css
@@ -1,88 +1,93 @@
:root {
- --docusaurus-announcement-bar-height: 30px;
+ --docusaurus-announcement-bar-height: 30px;
}
.announcementBar {
- display: flex;
- align-items: center;
- height: var(--docusaurus-announcement-bar-height);
- background-color: var(--ifm-color-white);
- background: linear-gradient(270.01deg, #3C2FD5 -12.32%, #7780F4 150.41%);;
- color: var(--ifm-color-black);
- border-bottom: 1px solid var(--ifm-color-emphasis-100);
- z-index: 1;
+ display: flex;
+ align-items: center;
+ height: var(--docusaurus-announcement-bar-height);
+ background-color: var(--ifm-color-white);
+ background: linear-gradient(270.01deg, #3c2fd5 -12.32%, #7780f4 150.41%);
+ color: var(--ifm-color-black);
+ border-bottom: 1px solid var(--ifm-color-emphasis-100);
+ z-index: 1;
}
html[data-announcement-bar-initially-dismissed='true'] .announcementBar {
- display: none;
+ display: none;
}
.announcementBarPlaceholder {
- flex: 0 0 10px;
+ flex: 0 0 10px;
}
.announcementBarClose {
- flex: 0 0 30px;
- align-self: stretch;
- padding: 0;
- line-height: 0;
+ flex: 0 0 30px;
+ align-self: stretch;
+ padding: 0;
+ line-height: 0;
}
.announcementBarContent {
- flex: 1 1 auto;
- font-size: 85%;
- text-align: center;
- padding: 5px 0;
- display: flex;
- justify-content: center;
- align-items: center;
- position: relative;
+ flex: 1 1 auto;
+ font-size: 85%;
+ text-align: center;
+ padding: 5px 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
}
.announcementBarContent:before {
- content: '';
- display: block;
- position: absolute;
- left: 1rem;
- top: 50%;
- transform: translateY(-50%);
- background: url('../../../static/images/announcementBar-left.png') center no-repeat;
- background-size: contain;
- width: 29rem;
- height: 2.375rem;
+ content: '';
+ display: block;
+ position: absolute;
+ left: 1rem;
+ top: 50%;
+ transform: translateY(-50%);
+ background: url('../../../static/images/announcementBar-left.png') center no-repeat;
+ background-size: contain;
+ width: 29rem;
+ height: 2.375rem;
}
.announcementBarContent:after {
- content: '';
- display: block;
- position: absolute;
- right: 1rem;
- top: 50%;
- transform: translateY(-50%);
- background: url('../../../static/images/announcementBar-right.png') center no-repeat;
- background-size: contain;
- width: 29rem;
- height: 2.375rem;
+ content: '';
+ display: block;
+ position: absolute;
+ right: 1rem;
+ top: 50%;
+ transform: translateY(-50%);
+ background: url('../../../static/images/announcementBar-right.png') center no-repeat;
+ background-size: contain;
+ width: 29rem;
+ height: 2.375rem;
}
@media print {
- .announcementBar {
- display: none;
- }
+ .announcementBar {
+ display: none;
+ }
}
.announcementBarContent a {
- color: inherit;
- text-decoration: underline;
+ color: inherit;
+ text-decoration: underline;
}
@media (min-width: 997px) {
- :root {
- --docusaurus-announcement-bar-height: 40px;
- }
+ :root {
+ --docusaurus-announcement-bar-height: 40px;
+ }
- .announcementBarPlaceholder,
- .announcementBarClose {
- flex-basis: 50px;
- }
+ .announcementBarPlaceholder,
+ .announcementBarClose {
+ flex-basis: 50px;
+ }
+}
+@media (max-width: 997px) {
+ .announcementBar {
+ display: none;
+ }
}
diff --git a/src/theme/BlogFooter/index.tsx b/src/theme/BlogFooter/index.tsx
new file mode 100644
index 00000000000..314fd37923d
--- /dev/null
+++ b/src/theme/BlogFooter/index.tsx
@@ -0,0 +1,39 @@
+import { useHistory, useLocation } from '@docusaurus/router';
+import { ConfigProvider, Pagination } from 'antd';
+import zhCN from 'antd/locale/zh_CN';
+import React from 'react';
+
+export default function BlogListFooter({
+ total,
+ currentPage,
+ currentCategory,
+}: {
+ total: number;
+ currentPage: number;
+ currentCategory?: string;
+}) {
+ const location = useLocation();
+ const history = useHistory();
+
+ return (
+ <div className="mt-6 flex justify-between container">
+ <div className="text-sm text-[#8592A6]">Total {total} items</div>
+ <Pagination
+ responsive
+ onChange={page => {
+ history.push(
+ `${location.pathname}?currentPage=${page ? page : ''}¤tCategory=${
+ currentCategory ? currentCategory : ''
+ }#blog`,
+ location.state,
+ );
+ }}
+ defaultPageSize={9}
+ current={currentPage}
+ total={total}
+ showSizeChanger={false}
+ showQuickJumper
+ />
+ </div>
+ );
+}
diff --git a/src/theme/BlogLayout/index.tsx b/src/theme/BlogLayout/index.tsx
index 4c1ad6da3f8..7fe0e4329bd 100644
--- a/src/theme/BlogLayout/index.tsx
+++ b/src/theme/BlogLayout/index.tsx
@@ -1,31 +1,33 @@
-import React from "react";
-import clsx from "clsx";
-import Layout from "@theme/Layout";
-import BlogSidebar from "@theme/BlogSidebar";
-import "./style.scss";
+import React from 'react';
+import clsx from 'clsx';
+import Layout from '@theme/Layout';
+import BlogSidebar from '@theme/BlogSidebar';
+import './style.scss';
export default function BlogLayout(props) {
- const { sidebar, toc, children, pageType, ...layoutProps } = props;
- const hasSidebar = sidebar && sidebar.items.length > 0;
- const isBlogListPage = pageType === "blogList";
- return (
- <Layout {...layoutProps}>
- <div className="container margin-vert--lg blog-container">
- <div className="row">
- <BlogSidebar sidebar={sidebar} />
- <main
- className={clsx("col", {
- "col--7": hasSidebar,
- "col--12": !hasSidebar && isBlogListPage,
- "col--9 col--offset-1": !hasSidebar && !isBlogListPage,
- })}
- itemScope
- itemType="http://schema.org/Blog"
- >
- {children}
- </main>
- {toc && <div className="col col--2">{toc}</div>}
- </div>
- </div>
- </Layout>
- );
+ const { sidebar, toc, children, pageType, ...layoutProps } = props;
+ const hasSidebar = sidebar && sidebar.items.length > 0;
+ const isBlogListPage = pageType === 'blogList';
+
+ return (
+ <Layout {...layoutProps}>
+ <div className="mb-[4.875rem] container">
+ <div className="lg:row lg:flex">
+ <BlogSidebar sidebar={sidebar} />
+ <main
+ className={clsx({
+ col: !isBlogListPage,
+ 'col--7': hasSidebar && !isBlogListPage,
+ 'col--12': !hasSidebar && isBlogListPage,
+ 'col--9 col--offset-1': !hasSidebar && !isBlogListPage,
+ })}
+ itemScope
+ itemType="http://schema.org/Blog"
+ >
+ {children}
+ </main>
+ {toc && <div className="col col--2">{toc}</div>}
+ </div>
+ </div>
+ </Layout>
+ );
}
diff --git a/src/theme/BlogLayout/style.scss b/src/theme/BlogLayout/style.scss
index ba78e8f16aa..c5b637577ab 100644
--- a/src/theme/BlogLayout/style.scss
+++ b/src/theme/BlogLayout/style.scss
@@ -1,6 +1,10 @@
.blog-container {
- // margin-top: 0 !important;
+ @media (min-width: 1280px) {
+ max-width: 1280px;
+ }
}
+
+
@media (max-width: 996px) {
}
\ No newline at end of file
diff --git a/src/theme/BlogListItem/HeadItem/index.tsx b/src/theme/BlogListItem/HeadItem/index.tsx
new file mode 100644
index 00000000000..d894ff5014b
--- /dev/null
+++ b/src/theme/BlogListItem/HeadItem/index.tsx
@@ -0,0 +1,94 @@
+import Link from '@docusaurus/Link';
+import React from 'react';
+
+export default function HeadItem(props: any) {
+ const {
+ permalink,
+ large,
+ image,
+ title,
+ summary,
+ formattedDate,
+ date,
+ authorsExists,
+ authors,
+ size = 'small',
+ } = props;
+ if (size === 'small') {
+ return (
+ <li>
+ <Link
+ to={permalink}
+ className="hover:no-underline hover:decoration-none transition-scale relative block rounded-lg border border-[#DFE5F0] px-6 py-5 hover:border-[#0065FD] "
+ >
+ <div className=" ">
+ <h1 className="line-clamp-2 text-xl font-medium leading-normal text-black-dark transition group-hover:text-primary">
+ {title}
+ </h1>
+ <div className="mt-4 line-clamp-2 h-11 text-sm leading-relaxed text-[#4C576C] transition group-hover:text-primary">
+ {summary}
+ </div>
+ <div className="mt-4 flex justify-start space-x-2 text-sm leading-[1.375rem] text-[#8592a6]">
+ <time dateTime={date} itemProp="datePublished" className="mr-4">
+ {formattedDate}
+ </time>
+ {authorsExists && (
+ <>
+ <span className="split-line"></span>
+ <span className="authors">
+ {authors.map((author, i) => (
+ <span className="s-author" key={i}>
+ {author.name}
+ </span>
+ ))}
+ </span>
+ </>
+ )}
+ </div>
+ </div>
+ </Link>
+ </li>
+ );
+ }
+ return (
+ <Link
+ to={permalink}
+ className={`hover:no-underline hover:decoration-none transition-scale group relative ${
+ large ? 'h-full' : 'h-auto'
+ } flex flex-col rounded-lg border border-[#DFE5F0] hover:border-[#0065FD]`}
+ >
+ <img src={image} alt="" />
+ <div className="flex flex-col-reverse justify-between lg:flex-row lg:py-0 py-6 lg:space-x-10 px-6">
+ <div className="flex-1">
+ <h1 className=" mt-4 line-clamp-2 text-2xl font-medium text-black-dark lg:text-[2rem] lg:leading-[3rem]">
+ {title}
+ </h1>
+ <div className="lg:h-[9.25rem]">
+ <p className="mt-4 line-clamp-2 text-sm leading-[1.6875rem] text-[#666666] lg:text-lg ">
+ {summary}
+ </p>
+ </div>
+ <div className="mt-4 flex space-x-6">
+ <span className="text-sm text-[#8592a6]">
+ <time dateTime={date} itemProp="datePublished" className="mr-4">
+ {formattedDate}
+ </time>
+ {authorsExists && (
+ <>
+ <span className="split-line"></span>
+ <span className="authors">
+ {authors.map((author, i) => (
+ <span className="s-author" key={i}>
+ {author.name}
+ </span>
+ ))}
+ </span>
+ </>
+ )}
+ </span>
+ </div>
+ </div>
+ </div>
+ </Link>
+ );
+}
diff --git a/src/theme/BlogListItem/index.tsx b/src/theme/BlogListItem/index.tsx
index e9a714ed287..b1946b0a5b4 100644
--- a/src/theme/BlogListItem/index.tsx
+++ b/src/theme/BlogListItem/index.tsx
@@ -10,6 +10,7 @@ import EditThisPage from '@theme/EditThisPage';
import TagsListInline from '@theme/TagsListInline';
import BlogPostAuthors from '@theme/BlogPostAuthors';
import './styles.scss';
+import HeadItem from './HeadItem';
// Very simple pluralization: probably good enough for now
function useReadingTimePlural() {
const { selectMessage } = usePluralForm();
@@ -32,66 +33,98 @@ function useReadingTimePlural() {
export default function BlogListItem(props) {
const readingTimePlural = useReadingTimePlural();
const { withBaseUrl } = useBaseUrlUtils();
- const { children, frontMatter, assets, metadata, truncated, isBlogPostPage = false } = props;
+ const { children, frontMatter, assets, metadata, large = false } = props;
const { date, formattedDate, permalink, tags, readingTime, title, editUrl, authors } = metadata;
const image = assets.image ?? frontMatter.image;
- const truncatedPost = !isBlogPostPage && truncated;
const tagsExists = tags.length > 0;
- const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
const summary = frontMatter.summary;
const authorsExists = authors && authors.length > 0;
+ if (props?.headBlog) {
+ return (
+ <HeadItem
+ {...metadata}
+ image={image}
+ large={large}
+ size={large ? 'large' : 'small'}
+ tagsExists={tagsExists}
+ authorsExists={authorsExists}
+ summary={summary}
+ />
+ );
+ }
return (
- <article
- className={!isBlogPostPage ? 'margin-bottom--xl blog-list-item' : undefined}
- itemProp="blogPost"
- itemScope
- itemType="http://schema.org/BlogPosting"
- >
- <Link itemProp="url" to={permalink}>
- {!!image && <div className="blog-preview-img" style={{ backgroundImage: `url(${image})` }}></div>}
- <div className="blog-content">
- <header>
- <TitleHeading className="blog-post-title" itemProp="headline">
- {title}
- </TitleHeading>
- <div className="blog-info">
- <time dateTime={date} itemProp="datePublished">
- {formattedDate}
- </time>
- {authorsExists && (
- <>
- <span className="split-line"></span>
- <span className="authors">
- {authors.map((author, i) => (
- <span className="s-author" key={i}>
- {author.name}
- </span>
- ))}
- </span>
- </>
- )}
-
- {tagsExists && (
- <>
- <span className="split-line"></span>
- <span className="s-tags">
- {tags.map((tag, i) => (
- <span className="s-tag" key={i}>
- {tag.label}
- </span>
- ))}
+ <article itemProp="blogPost" itemScope itemType="http://schema.org/BlogPosting">
+ <Link
+ itemProp="url"
+ to={permalink}
+ className="hover:no-underline hover:decoration-none transition-scale group relative flex h-full flex-col rounded-lg border border-[#DFE5F0] hover:border-[#0065FD] lg:border-0"
+ >
+ <div
+ className={`relative overflow-hidden rounded-t-lg border-[#DFE5F0] group-hover:border-[#0065FD] lg:border lg:border-b-0 lg:pb-0`}
+ style={{
+ width: '100%',
+ height: '165px',
+ }}
+ >
+ <img src={image} alt="" />
+ </div>
+ <div
+ className={`px-6 ${
+ large ? 'py-6 lg:pt-12' : ' py-6'
+ } flex-1 rounded-b-lg border-[#DFE5F0] group-hover:border-[#0065FD] lg:border lg:border-t-0`}
+ >
+ {!large && (
+ <div className="">
+ {tagsExists &&
+ tags.map((tag: any) => (
+ <span
+ key={tag.label}
+ className="mr-4 inline-block rounded-3xl border border-[#DADCE0] px-2 py-1 text-xs leading-normal"
+ >
+ {tag.label}
</span>
- </>
- )}
+ ))}
</div>
- </header>
+ )}
+ <div className={`${large ? 'lg:h-[5.25rem]' : ''} h-12`}>
+ <h1
+ className={`${
+ large ? ' lg:text-[1.75rem] lg:leading-normal' : 'mt-4'
+ } line-clamp-2 break-keep text-xl font-medium leading-tight text-black-dark transition`}
+ >
+ {title}
+ </h1>
+ </div>
+ <div className={`${large ? 'h-14' : 'h-12'} mt-6 `}>
+ <span
+ className={`${
+ large ? ' lg:text-lg' : ' leading-[1.375rem]'
+ } line-clamp-2 break-all text-sm text-[#4C576C] transition`}
+ >
+ {summary}
+ </span>
+ </div>
<div
- // This ID is used for the feed generation to locate the main content
- id={isBlogPostPage ? blogPostContainerID : undefined}
- className="markdown blog-item-summary"
- itemProp="articleBody"
+ className={`${
+ large ? ' mt-8 lg:text-base' : ' mt-4'
+ } justify-start space-x-2 text-sm leading-[1.375rem] text-[#8592a6]`}
>
- {summary}
+ <time dateTime={date} itemProp="datePublished">
+ {formattedDate}
+ </time>
+
+ {authorsExists && (
+ <>
+ <span className="split-line"></span>
+ <span className="authors">
+ {authors.map((author, i) => (
+ <span className="s-author" key={i}>
+ {author.name}
+ </span>
+ ))}
+ </span>
+ </>
+ )}
</div>
</div>
</Link>
diff --git a/src/theme/BlogListPage/index.tsx b/src/theme/BlogListPage/index.tsx
index 1997f1577aa..f8d3639b4b5 100644
--- a/src/theme/BlogListPage/index.tsx
... 4535 lines suppressed ...
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org