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 2fffb36fde9 some updates (#860)
2fffb36fde9 is described below

commit 2fffb36fde9007952da7d8c19b80a5afbcbd7932
Author: 0xFlackoLFG <k9745u...@gmail.com>
AuthorDate: Mon Jul 15 19:50:52 2024 +0800

    some updates (#860)
    
    Co-authored-by: 张骏驰 <zhangjunchi@zhangjunchideMacBook-Pro.local>
---
 TOC.md                                             |  32 ++
 .../version-2.1/get-starting/quick-start.md        |   1 -
 scripts/build.sh                                   |  60 ++++
 scripts/check_requirement.sh                       | 122 ++++++++
 scripts/generate_pdf.sh                            |  35 +++
 scripts/markdown-link-check.tpl                    |  30 ++
 scripts/markdownlint                               |  19 ++
 scripts/merge_by_toc.py                            | 153 ++++++++++
 scripts/verify-duplicated-file-name.sh             |  13 +
 scripts/verify-link-anchors.sh                     |  14 +
 scripts/verify-links.sh                            |  63 ++++
 src/components/Icons/info-filled.tsx               |  16 +
 .../collapse-box/collapse-box-header.tsx           |  44 ++-
 src/components/collapse-box/collapse-box.tsx       |   5 +-
 .../download-form/download-form-all-release.tsx    |   1 -
 .../download-form/download-form-tools.tsx          | 135 ++++++--
 .../components/icons/data-migration-icon.tsx       |  16 +
 .../ecomsystem-category/components/tab-item.tsx    |  14 +-
 .../ecomsystem-category/ecomsystem-category.tsx    |  13 +-
 src/components/ecomsystem/ecomsystem.data.ts       |   1 +
 src/constant/download.data.ts                      |  28 ++
 src/pages/download/index.tsx                       |  44 ++-
 src/pages/ecosystem/cluster-management/index.tsx   |  11 +-
 src/pages/ecosystem/connectors/index.tsx           |  43 ++-
 src/pages/ecosystem/data-loading/index.tsx         |   5 +-
 .../{data-loading => data-migration}/index.tsx     |  24 +-
 .../NavbarItem/DocsVersionDropdownNavbarItem.tsx   |   3 +-
 static/images/ecomsystem/kafka.png                 | Bin 0 -> 24634 bytes
 static/images/ecomsystem/sql-convertor.png         | Bin 0 -> 41212 bytes
 templates/copyright.tex                            |   3 +
 templates/template.tex                             | 340 +++++++++++++++++++++
 31 files changed, 1218 insertions(+), 70 deletions(-)

diff --git a/TOC.md b/TOC.md
new file mode 100644
index 00000000000..c994e99ccaa
--- /dev/null
+++ b/TOC.md
@@ -0,0 +1,32 @@
+<!-- markdownlint-disable MD007 -->
+<!-- markdownlint-disable MD041 -->
+
+- [doris 在线文档](https://doris.apache.org/zh-CN/docs/get-starting/quick-start/)
+- 快速开始
+  - [Apache Doris 
简介](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/get-starting/what-is-apache-doris.md)
+  - [快速体验 Apache 
Doris](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/get-starting/quick-start.md)
+- 安装部署
+  - 源码编译
+    - [使用 Docker 
开发镜像编译(推荐)](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/source-install/compilation-with-docker.md)
+    - [使用 LDB Toolchain 
编译(推荐)](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/source-install/compilation-with-ldb-toolchain.md)
+    - [Linux 
平台直接编译](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/source-install/compilation-linux.md)
+    - [Arm 
平台上编译](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/source-install/compilation-arm.md)
+    - [Windows 
平台上编译](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/source-install/compilation-win.md)
+    - [在 MacOS 
平台上编译](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/source-install/compilation-mac.md)
+  - 集群部署
+    - 
[手动部署](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/standard-deployment.md)
+    - [Docker 
部署](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/run-docker-cluster.md)
+    - K8s 部署
+      - 
[集群环境要求](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/k8s-deploy/install-env.md)
+      - [部署 Doris 
Operator](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/k8s-deploy/install-operator.md)
+      - [配置 Doris 
集群](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/k8s-deploy/install-config-cluster.md)
+      - [部署 Doris 
集群](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/k8s-deploy/install-doris-cluster.md)
+      - [访问 Doris 
集群](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/k8s-deploy/install-access-cluster.md)
+      - [升级基于 Doris Operator 部署的 Apache Doris 
集群](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/k8s-deploy/doris-cluster-upgrade.md)
+      - [Root 
用户使用](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/k8s-deploy/root-user-use.md)
+      - 
[服务扩缩容](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/k8s-deploy/expansion-and-contraction.md)
+      - [服务 Crash 
情况下如何进入容器](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/k8s-deploy/debug-crash.md)
+    - [Doris on 
AWS](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/install/cluster-deployment/doris-on-aws.md)
+- 数据库连接
+  - 
[数据库连接](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/db-connect/database-connect.md)
+  - [基于 Arrow Flight SQL 
的高速数据传输链路](/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/db-connect/arrow-flight-sql-connect.md)
\ No newline at end of file
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/get-starting/quick-start.md
 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/get-starting/quick-start.md
index 9a3190f4232..53f7f5b92d9 100644
--- 
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/get-starting/quick-start.md
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/get-starting/quick-start.md
@@ -3,7 +3,6 @@
     "title": "快速体验 Apache Doris",
     "language": "zh-CN"
 }
-
 ---
 
 <!-- 
diff --git a/scripts/build.sh b/scripts/build.sh
new file mode 100755
index 00000000000..4ede96547ad
--- /dev/null
+++ b/scripts/build.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+
+set -e 
+
+# Use current path for building and installing TiDB. 
+TIDB_PATH=`pwd`
+echo "building TiDB components in $TIDB_PATH"
+
+# All the binaries are installed in the `bin` directory. 
+mkdir -p $TIDB_PATH/bin
+
+# Assume we install go in /usr/local/go
+export PATH=$PATH:/usr/local/go/bin
+
+echo "checking if go is installed"
+# Go is required
+go version 
+# The output might be like: go version go1.6 darwin/amd64
+
+echo "checking if rust is installed"
+# Rust nightly is required
+rustc -V
+# The output might be like: rustc 1.12.0-nightly (7ad125c4e 2016-07-11)
+
+# Set the GOPATH correctly.
+export GOPATH=$TIDB_PATH/deps/go
+
+# Build TiDB
+echo "building TiDB..."
+rm -rf $GOPATH/src/github.com/pingcap/tidb
+git clone --depth=1 https://github.com/pingcap/tidb.git 
$GOPATH/src/github.com/pingcap/tidb
+cd $GOPATH/src/github.com/pingcap/tidb
+
+make
+cp -f ./bin/tidb-server $TIDB_PATH/bin
+cd $TIDB_PATH
+echo "TiDB is built"
+
+# Build PD
+echo "building PD..."
+rm -rf $GOPATH/src/github.com/pingcap/pd
+git clone --depth=1 https://github.com/pingcap/pd.git 
$GOPATH/src/github.com/pingcap/pd
+cd $GOPATH/src/github.com/pingcap/pd
+
+make
+cp -f ./bin/pd-server $TIDB_PATH/bin
+cd $TIDB_PATH
+echo "PD is built"
+
+# Build TiKV
+echo "building TiKV..."
+rm -rf $TIDB_PATH/deps/tikv
+git clone --depth=1 https://github.com/pingcap/tikv.git $TIDB_PATH/deps/tikv
+cd $TIDB_PATH/deps/tikv
+
+make release
+
+cp -f ./bin/tikv-server $TIDB_PATH/bin
+cd $TIDB_PATH
+echo "TiKV is built"
diff --git a/scripts/check_requirement.sh b/scripts/check_requirement.sh
new file mode 100755
index 00000000000..e72ca12bf63
--- /dev/null
+++ b/scripts/check_requirement.sh
@@ -0,0 +1,122 @@
+#!/bin/bash
+
+set -e
+
+echo "Checking requirements..."
+
+SUDO=
+if which sudo &>/dev/null; then 
+    SUDO=sudo
+fi
+
+function get_linux_platform {
+    if [ -f /etc/redhat-release ]; then 
+        # For CentOS or redhat, we treat all as CentOS.
+        echo "CentOS"
+    elif [ -f /etc/lsb-release ]; then
+        DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F=  '{ print $2 
}'`
+        echo "$DIST"
+    else
+        echo "Unknown"
+    fi 
+}
+
+function install_go {
+    echo "Intall go ..."
+    case "$OSTYPE" in 
+        linux*) 
+            curl -L 
https://storage.googleapis.com/golang/go1.12.7.linux-amd64.tar.gz -o 
golang.tar.gz
+        ;;
+
+        darwin*)
+            curl -L 
https://storage.googleapis.com/golang/go1.12.7.darwin-amd64.tar.gz -o 
golang.tar.gz
+        ;;
+
+        *)
+            echo "unsupported $OSTYPE"
+            exit 1
+        ;;
+    esac
+    ${SUDO} tar -C /usr/local -xzf golang.tar.gz
+    rm golang.tar.gz
+    echo 'export PATH=$PATH:/usr/local/go/bin' >> $HOME/.profile
+}
+
+function install_gpp {
+    echo "Install g++ ..."
+    case "$OSTYPE" in 
+        linux*) 
+            dist=$(get_linux_platform)
+            case $dist in
+                Ubuntu)
+                    ${SUDO} apt-get install -y g++
+                ;;
+                CentOS)
+                    ${SUDO} yum install -y gcc-c++ libstdc++-static
+                ;;
+                *)
+                    echo "unsupported platform $dist, you may install g++ 
manually"
+                    exit 1
+                ;;
+            esac
+        ;;
+
+        darwin*)
+            # refer to 
https://github.com/facebook/rocksdb/blob/master/INSTALL.md
+            xcode-select --install
+            brew update
+            brew tap homebrew/versions
+            brew install gcc48 --use-llvm
+        ;;
+
+        *)
+            echo "unsupported $OSTYPE"
+            exit 1
+        ;;
+    esac
+}
+
+# Check rust
+if which rustc &>/dev/null; then
+    if ! rustc --version | grep nightly &>/dev/null; then
+        printf "Please run following command to upgrade Rust to nightly: \n\
+\t rustup install nightly\n\
+\t rustup default nightly\n"
+        exit 1
+    fi
+else
+    echo "Install Rust ..."
+    ${SUDO} curl https://sh.rustup.rs -sSf | sh
+    ${SUDO} rustup install nightly
+    ${SUDO} rustup default nightly
+fi
+
+# Check go
+if which go &>/dev/null; then
+    # requires go >= 1.8
+    GO_VER_1=`go version | awk 'match($0, /([0-9])+(\.[0-9]+)+/) { ver = 
substr($0, RSTART, RLENGTH); split(ver, n, "."); print n[1];}'`
+    GO_VER_2=`go version | awk 'match($0, /([0-9])+(\.[0-9]+)+/) { ver = 
substr($0, RSTART, RLENGTH); split(ver, n, "."); print n[2];}'`
+    if [[ (($GO_VER_1 -eq 1 && $GO_VER_2 -lt 10)) || (($GO_VER_1 -lt 1)) ]]; 
then
+        echo "Please upgrade Go to 1.10 or later."
+        exit 1
+    fi
+else
+    install_go
+fi
+
+# Check g++
+if which g++ &>/dev/null; then
+    #  Check g++ version, RocksDB requires g++ 4.8 or later.
+    G_VER_1=`g++ -dumpversion | awk '{split($0, n, "."); print n[1];}'`
+    G_VER_2=`g++ -dumpversion | awk '{split($0, n, "."); print n[2];}'`
+    if [[ (($G_VER_1 -eq 4 && $G_VER_2 -lt 8)) || (($G_VER_1 -lt 4)) ]]; then
+        echo "Please upgrade g++ to 4.8 or later."
+        exit 1
+    fi
+else
+    install_gpp
+fi
+
+echo -e "Run this command:\n\n\tsource $HOME/.profile\n\nor just open a new 
terminal window to update environment variables"
+
+echo OK
diff --git a/scripts/generate_pdf.sh b/scripts/generate_pdf.sh
new file mode 100755
index 00000000000..a039e5b4319
--- /dev/null
+++ b/scripts/generate_pdf.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+set -e
+# test passed in pandoc 1.19.1
+
+MAINFONT="WenQuanYi Micro Hei"
+MONOFONT="WenQuanYi Micro Hei Mono"
+
+# MAINFONT="Tsentsiu Sans HG"
+# MONOFONT="Tsentsiu Sans Console HG"
+
+#_version_tag="$(date '+%Y%m%d').$(git rev-parse --short HEAD)"
+_version_tag="$(date '+%Y%m%d')"
+
+# default version: `pandoc --latex-engine=xelatex doc.md -s -o output2.pdf`
+# used to debug template setting error
+
+# add docs versions
+# generate PDF for dev version
+
+output_path="output.pdf"
+
+pandoc -N --toc --smart --latex-engine=xelatex \
+--template=templates/template.tex \
+--listings \
+--columns=80 \
+-V title="doris 中文手册" \
+-V date="${_version_tag}" \
+-V CJKmainfont="${MAINFONT}" \
+-V mainfont="${MAINFONT}" \
+-V sansfont="${MAINFONT}" \
+-V monofont="${MONOFONT}" \
+-V geometry:margin=1in \
+-V include-after="\\input{templates/copyright.tex}" \
+"doc.md" -s -o "doris.pdf"
\ No newline at end of file
diff --git a/scripts/markdown-link-check.tpl b/scripts/markdown-link-check.tpl
new file mode 100644
index 00000000000..ec176be8382
--- /dev/null
+++ b/scripts/markdown-link-check.tpl
@@ -0,0 +1,30 @@
+{
+    "ignorePatterns": [
+        {
+            "pattern": "^(http|https|ftp|mailto):"
+        },
+        {
+            "pattern": "\\.\\./media/"
+        },
+        {
+            "comment": "anchors to current file are ignored",
+            "pattern": "^#.+$"
+        }
+    ],
+    "replacementPatterns": [
+               {
+            "pattern": "^(?!(/|/media/))",
+            "replacement": "/ERROR:link-must-start-with-slash:"
+        },
+        {
+            "comment": "prefix with repo root",
+            "pattern": "^(?!(\\.|/ERROR:.*))",
+            "replacement": "<ROOT>/"
+        },
+        {
+            "comment": "remove anchor part",
+            "pattern": "#.+$",
+            "replacement": ""
+        }
+    ]
+}
diff --git a/scripts/markdownlint b/scripts/markdownlint
new file mode 100755
index 00000000000..ac82c80794d
--- /dev/null
+++ b/scripts/markdownlint
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+cd "$(dirname "$0")/.."
+
+if ! program=$(which markdownlint) &>/dev/null ; then
+  program=./node_modules/.bin/markdownlint
+  if ! test -f ./node_modules/.bin/markdownlint; then
+    had_lock=
+    if test -f package-json.lock ; then
+      had_lock=true
+    fi
+    npm install --save-dev 'markdownlint-cli@0.17.0'
+    if [[ -z "$had_lock"  ]] ; then
+      rm -f package-lock.json
+    fi
+  fi
+fi
+
+exec node "$program" "$@"
diff --git a/scripts/merge_by_toc.py b/scripts/merge_by_toc.py
new file mode 100755
index 00000000000..6f0e6a38bdf
--- /dev/null
+++ b/scripts/merge_by_toc.py
@@ -0,0 +1,153 @@
+#!/usr/bin/env python3
+# coding: utf8
+
+from __future__ import print_function, unicode_literals
+
+import re
+import os
+
+followups = []
+in_toc = False
+contents = []
+
+# 定义正则表达式模式
+hyper_link_pattern = re.compile(r'\[(.*?)\]\((.*?)(#.*?)?\)')  # 
匹配Markdown中的超链接
+toc_line_pattern = re.compile(r'([\-\+]+)\s\[(.*?)\]\((.*?)(#.*?)?\)')  # 
匹配TOC中的行
+image_link_pattern = re.compile(r'!\[(.*?)\]\((.*?)\)')  # 匹配Markdown中的图片链接
+level_pattern = re.compile(r'(\s*[\-\+]+)\s')  # 匹配TOC中的层级
+heading_patthern = re.compile(r'(^#+|\n#+)\s')  # 匹配Markdown中的标题
+copyable_snippet_pattern = re.compile(r'{{< copyable .* >}}')  # 匹配可复制的代码段
+
+entry_file = "TOC.md"  # 入口文件
+
+# 第1步,解析TOC文件
+with open(entry_file) as fp:  # 打开TOC文件
+    level = 0  # 初始化层级
+    current_level = ""  # 初始化当前层级
+    for line in fp:  # 逐行读取文件内容
+        if not in_toc and not line.startswith("<!-- "):  # 判断是否进入TOC部分
+            in_toc = True  # 设置标志,表示进入TOC部分
+        elif in_toc and not line.startswith('#') and line.strip():  # 
处理TOC中的有效行
+            level_space_str = level_pattern.findall(line)[0][:-1]  # 获取行的层级字符串
+            level = len(level_space_str) // 2 + 1  # 计算层级
+
+            matches = toc_line_pattern.findall(line)  # 查找匹配的TOC行
+            if matches:  # 如果有匹配的行
+                for match in matches:  # 处理每一个匹配
+                    fpath = match[2]  # 获取文件路径
+                    if fpath.endswith('.md'):  # 如果是Markdown文件
+                        fpath = fpath[1:]  # 移除路径开头的斜杠
+                        key = ('FILE', level, fpath)  # 创建键
+                        if key not in followups:  # 如果键不在followups中
+                            followups.append(key)  # 添加键到followups
+                    elif fpath.startswith('http'):  # 如果是HTTP链接
+                        followups.append(('TOC', level, line.strip()[2:]))  # 
添加HTTP链接到followups
+            else:  # 如果没有匹配的行
+                name = line.strip().split(None, 1)[-1]  # 获取目录项名称
+                key = ('TOC', level, name)  # 创建键
+                if key not in followups:  # 如果键不在followups中
+                    followups.append(key)  # 添加键到followups
+
+        else:
+            pass  # 忽略其他行
+
+# 第2步,获取文件标题
+file_link_name = {}  # 用于存储文件链接名称
+title_pattern = re.compile(r'(^#+)\s.*')  # 匹配标题
+title_json_pattern = re.compile(r'"title":\s*"(.*?)"')  # 匹配JSON中的title
+for tp, lv, f in followups:  # 遍历followups
+    if tp != 'FILE':  # 如果类型不是文件,跳过
+        continue
+    try:
+        with open(f) as file:  # 打开文件
+            lines = file.readlines()  # 读取文件所有行
+            json_str = lines[2].strip()  # 读取第三行的JSON字符串
+            print(f"json_str: {json_str}")
+            title_match = title_json_pattern.search(json_str)  # 匹配JSON中的title
+            if title_match:
+                title = title_match.group(1)  # 提取title
+                file_link_name[f] = title.lower().replace(' ', '-')  # 存储标题链接名称
+                print(f"File: {f}, Title: {title}")  # 打印文件名和标题
+    except Exception as e:  # 捕获异常
+        print(e)  # 打印异常
+
+# 替换链接
+def replace_link_wrap(chapter, name):
+    def replace_link(match):
+        full = match.group(0)  # 获取完整的匹配
+        link_name = match.group(1)  # 获取链接名称
+        link = match.group(2)  # 获取链接地址
+        frag = match.group(3)  # 获取链接片段
+        if link.startswith('http'):  # 如果是HTTP链接
+            return full  # 返回完整匹配
+        elif link.endswith('.md') or '.md#' in link:  # 如果是Markdown文件链接
+            if not frag:  # 如果没有片段
+                link = link[1:]  # 去掉开头的斜杠
+                for fpath in file_link_name:  # 遍历文件链接名称
+                    if link == fpath:  # 如果链接匹配
+                        frag = '#' + file_link_name[fpath]  # 添加片段
+            return '[%s](%s)' % (link_name, frag)  # 返回替换后的链接
+        elif link.endswith('.png') or link.endswith('.jpeg') or 
link.endswith('.svg') or link.endswith('.gif') or link.endswith('.jpg'):  # 
如果是图片链接
+            img_link = re.sub(r'[\.\/]*images\/', 'static/images/', link, 
count=0, flags=0)  # 替换图片路径
+            return '[%s](%s)' % (link_name, img_link)  # 返回替换后的图片链接
+        else:
+            return full  # 返回完整匹配
+
+    return hyper_link_pattern.sub(replace_link, chapter)  # 替换章节中的链接
+
+# 替换标题级别
+def replace_heading_func(diff_level=0):
+    def replace_heading(match):
+        if diff_level == 0:  # 如果没有级别差异
+            return match.group(0)  # 返回原始匹配
+        else:
+            return '\n' + '#' * (match.group(0).count('#') + diff_level) + ' ' 
 # 返回调整后的标题
+
+    return replace_heading  # 返回替换函数
+
+# 移除可复制代码段
+def remove_copyable(match):
+    return ''  # 返回空字符串,移除代码段
+
+# 处理特殊字符的函数
+def handle_special_characters(chapter):
+    chapter = chapter.replace("\\", "\\textbackslash{}")  # 替换反斜杠
+    chapter = chapter.replace("~", "\\textasciitilde{}")  # 替换波浪号
+    chapter = chapter.replace("^", "\\textasciicircum{}")  # 替换脱字符
+    return chapter  # 返回处理后的章节
+
+# 第3步,合并文件
+for type_, level, name in followups:  # 遍历followups
+    if type_ == 'TOC':  # 如果类型是TOC
+        contents.append("\n{} {}\n".format('#' * level, name))  # 添加目录项到内容
+    elif type_ == 'RAW':  # 如果类型是RAW
+        contents.append(name)  # 添加原始内容
+    elif type_ == 'FILE':  # 如果类型是文件
+        try:
+            with open(name) as fp:  # 打开文件
+                chapter = fp.read()  # 读取文件内容
+                chapter = replace_link_wrap(chapter, name)  # 替换链接
+                chapter = copyable_snippet_pattern.sub(remove_copyable, 
chapter)  # 移除可复制代码段
+
+                # 处理特殊字符
+                chapter = handle_special_characters(chapter)
+
+                # 修正标题级别
+                diff_level = level - 
heading_patthern.findall(chapter)[0].count('#')
+                chapter = 
heading_patthern.sub(replace_heading_func(diff_level), chapter)  # 替换标题级别
+                
+                # 查找第二个---的位置
+                second_dash_pos = chapter.find('---', chapter.find('---') + 1)
+
+                if second_dash_pos != -1:
+                    # 在第二个---之后插入一级标题
+                    chapter = chapter[:second_dash_pos + 3] + f"\n\n# 
{file_link_name[name]}\n\n" + chapter[second_dash_pos + 3:]
+
+                contents.append(chapter)  # 添加章节到内容
+        except Exception as e:  # 捕获异常
+            print(e)  # 打印异常
+
+# 第4步,生成最终文档
+target_doc_file = 'doc.md'  # 目标文档文件名
+with open(target_doc_file, 'w') as fp:  # 打开目标文档文件
+    fp.write('\n'.join(contents))  # 写入内容到文件
\ No newline at end of file
diff --git a/scripts/verify-duplicated-file-name.sh 
b/scripts/verify-duplicated-file-name.sh
new file mode 100755
index 00000000000..d1393fe47af
--- /dev/null
+++ b/scripts/verify-duplicated-file-name.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+echo $PWD
+
+DuplicateFilename=$(find . -name '*.md' ! -name '_*.md'  | rev | cut -d'/' -f1 
| rev | sort | uniq -c -d)
+
+if [ -z "$DuplicateFilename" ]
+then
+  echo "No Duplicate Filenames"
+else
+  echo $DuplicateFilename
+  exit 1
+fi
\ No newline at end of file
diff --git a/scripts/verify-link-anchors.sh b/scripts/verify-link-anchors.sh
new file mode 100755
index 00000000000..4f7c3a62dfb
--- /dev/null
+++ b/scripts/verify-link-anchors.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+#
+# In addition to verify-links.sh, this script additionally check anchors.
+#
+# See 
https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally
 if you meet permission problems when executing npm install.
+
+ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
+cd $ROOT
+
+yarn add remark-cli@9.0.0 remark-lint@8.0.0 
@breeswish-org/remark-lint-pingcap-docs-anchor@1.1.2
+
+echo "info: checking links anchors under $ROOT directory..."
+
+yarn remark --ignore-path .gitignore -u lint -u 
@breeswish-org/remark-lint-pingcap-docs-anchor . --frail --quiet
diff --git a/scripts/verify-links.sh b/scripts/verify-links.sh
new file mode 100755
index 00000000000..72662197bd2
--- /dev/null
+++ b/scripts/verify-links.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+#
+# This script is used to verify links in markdown docs.
+#
+# - External links are ignored in CI because these links may go down out of 
our control.
+# - Anchors are ignored
+# - Internal links conventions
+#   - Must be absolute and start from repo root
+#   - Only files in current directory and /media are allowed
+# - When a file was moved, all other references are required to be updated for 
now, even if alias are given
+#   - This is recommended because of less redirects and better anchors support.
+
+ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
+cd $ROOT
+
+yarn add markdown-link-check@3.8.1
+
+VERBOSE=${VERBOSE:-}
+CONFIG_TMP=$(mktemp)
+ERROR_REPORT=$(mktemp)
+
+trap 'rm -f $CONFIG_TMP $ERROR_REPORT' EXIT
+
+# Check all directories starting with 'v\d.*' and dev.
+echo "info: checking links under $ROOT directory..."
+sed \
+    -e "s#<ROOT>#$ROOT#g" \
+    scripts/markdown-link-check.tpl > $CONFIG_TMP
+if [ -n "$VERBOSE" ]; then
+    cat $CONFIG_TMP
+fi
+# TODO simplify this if markdown-link-check can process multiple files together
+while read -r tasks; do
+    for task in $tasks; do
+        (
+            output=$(yarn markdown-link-check --config "$CONFIG_TMP" "$task" 
-q)
+            if [ $? -ne 0 ]; then
+                printf "$output" >> $ERROR_REPORT
+            fi
+            if [ -n "$VERBOSE" ]; then
+                echo "$output"
+            fi
+        ) &
+    done
+    wait
+done <<<"$(find "." -type f -not -path './node_modules/*' -name '*.md' | xargs 
-n 10)"
+
+error_files=$(cat $ERROR_REPORT | grep 'FILE: ' | wc -l)
+error_output=$(cat $ERROR_REPORT)
+echo ""
+if [ "$error_files" -gt 0 ]; then
+    echo "Link error: $error_files files have invalid links. The faulty files 
are listed below, please fix the wrong links!"
+    echo ""
+    echo "=== Hint on how to fix links === "
+    echo "Links in TiDB documentation follow a style like 
'/tidb-binlog/deploy-tidb-binlog.md#服务器要求'. That is, you need to make sure 
that:"
+    echo "1) Links start with a slash; 2) Anchor links are written in a 
'/dir/xxx.md#anchor-point' style; 3) Links don't start with a version, e.g. 
'/v3.0/...' is wrong and '/v3.0' should be removed."
+    echo ""
+    echo "=== ERROR REPORT == ":
+    echo "$error_output"
+    exit 1
+else
+    echo "Link check report: All files are ok. No deadlink found!"
+fi
diff --git a/src/components/Icons/info-filled.tsx 
b/src/components/Icons/info-filled.tsx
new file mode 100644
index 00000000000..f7cfac1353a
--- /dev/null
+++ b/src/components/Icons/info-filled.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+interface InfoFilledIconProps {
+    className?: string;
+}
+export function InfoFilledIcon(props: InfoFilledIconProps) {
+    return (
+        <svg width="24" height="24" viewBox="0 0 24 24" fill="none" 
xmlns="http://www.w3.org/2000/svg";>
+            <g opacity="0.8">
+                <path d="M21.75 12C21.75 17.3848 17.3848 21.75 12 
21.75C6.61522 21.75 2.25 17.3848 2.25 12C2.25 6.61522 6.61522 2.25 12 
2.25C17.3848 2.25 21.75 6.61522 21.75 12Z" stroke="#4C576C" stroke-width="1.5" 
/>
+                <path d="M13.0492 6.89953C13.0492 7.47938 12.5791 7.94945 
11.9992 7.94945C11.4193 7.94945 10.9492 7.47938 10.9492 6.89953C10.9492 6.31967 
11.4193 5.84961 11.9992 5.84961C12.5791 5.84961 13.0492 6.31967 13.0492 
6.89953Z" fill="#4C576C" />
+                <path d="M12 10.5V17.25" stroke="#4C576C" stroke-width="1.5" 
stroke-linecap="round" />
+            </g>
+        </svg>
+    );
+}
diff --git a/src/components/collapse-box/collapse-box-header.tsx 
b/src/components/collapse-box/collapse-box-header.tsx
index 705d833b4e7..33656cbc64f 100644
--- a/src/components/collapse-box/collapse-box-header.tsx
+++ b/src/components/collapse-box/collapse-box-header.tsx
@@ -1,28 +1,62 @@
-import React from 'react';
+import React, { ReactNode } from 'react';
 import { useState } from 'react';
+import Link from '@docusaurus/Link';
 import { ArrowDownIcon } from '../Icons/arrow-down-icon';
+import { InfoFilledIcon } from '../Icons/info-filled';
+import { Popover } from 'antd';
 
 export function CollapseBoxHeader({
     title,
+    popTrue,
     defaultExpand = true,
     disabled = false,
 }: {
     title: string;
+    popTrue?: boolean;
     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'}`}
+            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}
+            <div className="flex items-center">
+                {title}
+                {popTrue &&
+                    (
+                        <span className="ml-2">
+                            <Popover
+                                content={
+                                    <div>
+                                        <div className="text-xs 
leading-relaxed text-[#4C576c]">
+                                            Resources and services are not 
maintained or endorsed by the Apache Doris, which is
+                                            overseen by the Committers and the 
Doris PMC. Their use is entirely at your discretion, and
+                                            the community is not responsible 
for verifying the licenses or validity of these tools. It is your
+                                            obligation to ensure their 
authenticity.
+                                        </div>
+                                        <div className="text-xs mt-4 
leading-relaxed text-[#4C576c]">
+                                            If you wish to be featured on this 
page, please contact the <Link
+                                                className="text-primary 
cursor-pointer hover:no-underline"
+                                                
to="mailto:d...@doris.apache.org";>Apache Doris dev mailing list
+                                            </Link> submit a Pull Request 
directly to this page.
+                                        </div>
+                                    </div>}
+                                placement="right"
+                                overlayStyle={{ width: 650, height: 180 }}
+                                overlayInnerStyle={{ padding: 16 }}
+                                trigger="hover">
+                                <span><InfoFilledIcon /></span>
+                            </Popover>
+                        </span>
+                    )}
+            </div>
             {!disabled && (
                 <ArrowDownIcon className={`text-[#0065FD] text-3xl lg:text-2xl 
${expand ? 'rotate-180' : ''}`} />
             )}
diff --git a/src/components/collapse-box/collapse-box.tsx 
b/src/components/collapse-box/collapse-box.tsx
index 92a8eec9160..fd001e734da 100644
--- a/src/components/collapse-box/collapse-box.tsx
+++ b/src/components/collapse-box/collapse-box.tsx
@@ -4,6 +4,7 @@ import { CollapseBoxHeader } from './collapse-box-header';
 
 interface CollapseBoxProps {
     title: string;
+    popTrue?: boolean;
     description: string | React.ReactNode;
     characteristic?: string[];
     rightContent?: ReactNode;
@@ -18,6 +19,7 @@ interface CollapseBoxProps {
 
 export default function CollapseBox({
     title,
+    popTrue,
     description,
     characteristic = [],
     rightContent,
@@ -29,9 +31,10 @@ export default function CollapseBox({
     className,
     disabledExpand = false,
 }: CollapseBoxProps) {
+    console.log(popTrue,'poptrue')
     return (
         <div className={`mt-[5.5rem] w-full rounded-lg border border-[#DFE5F0] 
 ${className}`}>
-            <CollapseBoxHeader title={title} defaultExpand={expand} 
disabled={disabledExpand} />
+            <CollapseBoxHeader title={title} defaultExpand={expand} 
disabled={disabledExpand} popTrue={popTrue}/>
             <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">
diff --git a/src/components/download-form/download-form-all-release.tsx 
b/src/components/download-form/download-form-all-release.tsx
index a3da4a999f9..5e3da3a24e0 100644
--- a/src/components/download-form/download-form-all-release.tsx
+++ b/src/components/download-form/download-form-all-release.tsx
@@ -26,7 +26,6 @@ export default function DownloadFormAllRelease(props: 
DownloadFormProps) {
             return false;
         }
     }
-
     const getOptions = (version: string[]) => {
         const currentParentVersion = versions.find(item => 
form.getFieldValue('version')[0] === item.value).children;
         const currentVersion = currentParentVersion.find(item => 
form.getFieldValue('version')[1] === item.value);
diff --git a/src/components/download-form/download-form-tools.tsx 
b/src/components/download-form/download-form-tools.tsx
index df1d2226d5a..852f6850f99 100644
--- a/src/components/download-form/download-form-tools.tsx
+++ b/src/components/download-form/download-form-tools.tsx
@@ -1,8 +1,8 @@
 import React, { useEffect, useMemo } from 'react';
 import { Form, message } from 'antd';
-import { Option } from '@site/src/constant/download.data';
 import FormSelect from '../form-select/form-select';
 import copy from 'copy-to-clipboard';
+import { DownloadTypeEnum, Option } from '@site/src/constant/download.data';
 import { ToolsEnum } from '@site/src/constant/download.data';
 import { useForm, useWatch } from 'antd/es/form/Form';
 import { DownloadIcon } from '../Icons/download-icon';
@@ -16,6 +16,7 @@ export default function DownloadFormTools(props: 
DownloadFormToolsProps) {
     const tool = useWatch('tool', form);
     const architecture = useWatch('architecture', form);
     const version = useWatch('version', form);
+    const tarBall = useWatch('tarBall', form);
 
     const getOptions = useMemo(() => {
         if (!tool) return [];
@@ -28,18 +29,35 @@ export default function DownloadFormTools(props: 
DownloadFormToolsProps) {
         return current.find(item => version === item.value).children;
     }, [version]);
 
-    const getDownloadLinkByCard = (source?: boolean) => {
+    // const getDownloadLinkByCard = (source?: boolean) => {
+    //     const currentTool = data.find(item => tool === item.value).children;
+    //     console.log(currentTool,'currentTool')
+    //     console.log(source,'source')
+    //     if (!architecture) {
+    //         return currentTool.find(item => version === item.value).gz;
+    //     } else {
+    //         if (source) {
+    //             return currentTool.find(item => version === 
item.value).source;
+    //         } else {
+    //             const currentVersion = currentTool.find(item => version === 
item.value).children;
+    //             return currentVersion.find(item => architecture === 
item.value).gz;
+    //         }
+    //     }
+    // };
+    const getDownloadLinkByCard = (params: { version: string[]; cpu: string; 
tarBall: string; type: string }) => {
         const currentTool = data.find(item => tool === item.value).children;
-        if (!architecture) {
-            return currentTool.find(item => version === item.value).gz;
-        } else {
-            if (source) {
-                return currentTool.find(item => version === item.value).source;
+        if (tool === 'Doris Streamloader') {
+            if (params.tarBall === 'Source') {
+                return !params.type ? `${currentTool[0].source}` : 
`${currentTool[0].source}.${params.type}`
             } else {
-                const currentVersion = currentTool.find(item => version === 
item.value).children;
-                return currentVersion.find(item => architecture === 
item.value).gz;
+                return architecture === 'ARM64' ? 
`${currentTool[0].children[1]}.${params.type}` : 
`${currentTool[0].children[0]}.${params.type}`
             }
+        } else {
+            const currentVersion = currentTool.find(item => version === 
item.value)
+            const tempType = (params.type === 'sha512' ? 'sha1' : params.type)
+            return !params.type ? `${currentVersion[params.tarBall]}` : 
`${currentVersion[params.tarBall]}.${tempType}`
         }
+
     };
 
     useEffect(() => {
@@ -60,13 +78,19 @@ export default function DownloadFormTools(props: 
DownloadFormToolsProps) {
             <Form
                 form={form}
                 onFinish={val => {
-                    const url = getDownloadLinkByCard();
+                    const url = getDownloadLinkByCard({
+                        version: version,
+                        cpu: architecture,
+                        tarBall: tarBall,
+                        type: '',
+                    });
                     window.open(url, '_blank');
                 }}
                 initialValues={{
                     tool: data[0]?.value,
                     version: '',
                     architecture: '',
+                    tarBall: DownloadTypeEnum.Binary,
                 }}
             >
                 <Form.Item name="tool" rules={[{ required: true }]}>
@@ -105,6 +129,27 @@ export default function DownloadFormTools(props: 
DownloadFormToolsProps) {
                         )
                     }
                 </Form.Item>
+                <Form.Item noStyle shouldUpdate>
+                    {({ getFieldValue }) => (
+                        <Form.Item name="tarBall" rules={[{ required: true }]}>
+                            <FormSelect
+                                placeholder="Tarball"
+                                label="Tarball"
+                                isCascader={false}
+                                options={[
+                                    {
+                                        label: DownloadTypeEnum.Binary,
+                                        value: DownloadTypeEnum.Binary,
+                                    },
+                                    {
+                                        label: DownloadTypeEnum.Source,
+                                        value: DownloadTypeEnum.Source,
+                                    },
+                                ]}
+                            />
+                        </Form.Item>
+                    )}
+                </Form.Item>
                 <Form.Item style={{ marginBottom: 0 }} colon={false}>
                     <button type="submit" className="button-primary w-full 
text-lg">
                         Download
@@ -113,7 +158,12 @@ export default function DownloadFormTools(props: 
DownloadFormToolsProps) {
                 <div
                     className="flex cursor-pointer text-[#444FD9] items-center 
mt-4 justify-center"
                     onClick={() => {
-                        const url = getDownloadLinkByCard();
+                        const url = getDownloadLinkByCard({
+                            version: version,
+                            cpu: architecture,
+                            tarBall: tarBall,
+                            type: '',
+                        });
                         copy(url);
                         message.success('Copy Successfully!');
                     }}
@@ -129,22 +179,57 @@ export default function DownloadFormTools(props: 
DownloadFormToolsProps) {
                         />
                     </svg>
                 </div>
-                {tool === ToolsEnum.StreamLoader && (
-                    <div className="flex justify-center mt-4 
hover:text-[#444FD9]">
-                        <div
-                            className="inline-flex items-center text-[#8592A6] 
cursor-pointer hover:underline hover:text-[#444FD9]"
-                            onClick={() => {
-                                const url = getDownloadLinkByCard(true);
-                                window.open(url, '_blank');
-                            }}
-                        >
-                            Source code
-                            <div className="ml-1">
-                                <DownloadIcon style={{ fontSize: 14 }} />
-                            </div>
+                <div className="flex justify-center mt-4">
+                    <div
+                        className="inline-flex items-center text-[#8592A6] 
cursor-pointer hover:underline hover:text-[#444FD9]"
+                        onClick={() => {
+                            const url = getDownloadLinkByCard({
+                                version: version,
+                                cpu: architecture,
+                                tarBall: tarBall,
+                                type: 'asc',
+                            });
+                            window.open(url, '_blank');
+                        }}
+                    >
+                        ASC
+                    </div>
+                    <div
+                        className="inline-flex items-center ml-4 
text-[#8592A6] hover:text-[#444FD9] cursor-pointer hover:underline"
+                        onClick={() => {
+                            const url = getDownloadLinkByCard({
+                                version: version,
+                                cpu: architecture,
+                                tarBall: tarBall,
+                                type: 'sha512',
+                            });
+                            window.open(url, '_blank');
+                        }}
+                    >
+                        SHA-512
+                    </div>
+                </div>
+                {/* {tool === ToolsEnum.StreamLoader && ( */}
+                {/* <div className="flex justify-center mt-4 
hover:text-[#444FD9]">
+                    <div
+                        className="inline-flex items-center text-[#8592A6] 
cursor-pointer hover:underline hover:text-[#444FD9]"
+                        onClick={() => {
+                            const url = getDownloadLinkByCard({
+                                version: version,
+                                cpu: architecture,
+                                tarBall: tarBall,
+                                type: 'gz',
+                            });
+                            window.open(url, '_blank');
+                        }}
+                    >
+                        Source code
+                        <div className="ml-1">
+                            <DownloadIcon style={{ fontSize: 14 }} />
                         </div>
                     </div>
-                )}
+                </div> */}
+                {/* )} */}
             </Form>
         </div>
     );
diff --git 
a/src/components/ecomsystem/ecomsystem-category/components/icons/data-migration-icon.tsx
 
b/src/components/ecomsystem/ecomsystem-category/components/icons/data-migration-icon.tsx
new file mode 100644
index 00000000000..8dd6ce14225
--- /dev/null
+++ 
b/src/components/ecomsystem/ecomsystem-category/components/icons/data-migration-icon.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+export function DataMigrationIcon() {
+    return (
+        <svg width="54" height="54" viewBox="0 0 54 54" fill="none" 
xmlns="http://www.w3.org/2000/svg";>
+            <g clip-path="url(#clip0_6410_4111)">
+                <path d="M24.5 23.225C35.5 23.225 43.2 20.45 43.2 
17V13.275C43.225 9.825 35.525 7 24.5 7C13.475 7 7 9.825 7 13.275V17C7 20.475 
13.5 23.225 24.5 23.225ZM22.225 38.175C14.725 37.9 10.25 36.175 7.925 
33.875C7.6569 34.1042 7.44033 34.3875 7.28953 34.7064C7.13872 35.0252 7.05709 
35.3724 7.05 35.725V40.725C7 44.175 13.475 47 24.5 47H27.725C24.8305 44.87 
22.8622 41.7118 22.225 38.175ZM22 35.675C22.0253 32.5079 23.1373 29.4455 25.15 
27H24.5C15.5 27 10.5 25.175 7.925 22.65C7.65357 [...]
+            </g>
+            <defs>
+                <clipPath id="clip0_6410_4111">
+                    <rect width="40" height="40" fill="white" 
transform="translate(7 7)" />
+                </clipPath>
+            </defs>
+        </svg>
+    );
+}
diff --git 
a/src/components/ecomsystem/ecomsystem-category/components/tab-item.tsx 
b/src/components/ecomsystem/ecomsystem-category/components/tab-item.tsx
index a9005f99c09..7bbfcb4c5d1 100644
--- a/src/components/ecomsystem/ecomsystem-category/components/tab-item.tsx
+++ b/src/components/ecomsystem/ecomsystem-category/components/tab-item.tsx
@@ -18,16 +18,16 @@ export function TabItem({ title, content, icon, active, 
setActive, url }: PriceT
             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 ${
+            className={`lg:h-[190px] w-full cursor-pointer rounded-lg 
bg-[#fff] px-4 lg:px-6 py-6 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 className="flex flex-col items-center">
+                <div className={`text-[3.375rem] `}>{icon}</div>
+                {/* <div> */}
+                    <div className="text-xl font-medium text-[#202124] 
py-[4px] font-misans sm:text-xl">{title}</div>
+                    <div className="w-[160px] pt-[0.3125rem] text-center 
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
index 86e394665e5..0dc247f1fd9 100644
--- a/src/components/ecomsystem/ecomsystem-category/ecomsystem-category.tsx
+++ b/src/components/ecomsystem/ecomsystem-category/ecomsystem-category.tsx
@@ -2,6 +2,7 @@ import { useLocation } from '@docusaurus/router';
 import React, { useState } from 'react';
 import { EcomsystemCategoryEnum } from '../ecomsystem.data';
 import { ClusterManagementIcon } from 
'./components/icons/cluster-management-icon';
+import { DataMigrationIcon } from './components/icons/data-migration-icon';
 import { ConnectorsIcon } from './components/icons/connectors-icon';
 import { DistributionsAndPackagingIcon } from 
'./components/icons/distributions-packaging-icon';
 import { DataLoadingIcon } from './components/icons/data-loading';
@@ -17,9 +18,11 @@ export default function EcomsystemCategory() {
         currentActive = EcomsystemCategoryEnum.ClusterManagement;
     } else if (pathnames.some(current => current === 
EcomsystemCategoryEnum.Connectors)) {
         currentActive = EcomsystemCategoryEnum.Connectors;
-    } else {
+    } else if (pathnames.some(current => current === 
EcomsystemCategoryEnum.DataLoading)){
         currentActive = EcomsystemCategoryEnum.DataLoading;
         // currentActive = EcomsystemCategoryEnum.DistributionsAndPackaging;
+    } else {
+        currentActive = EcomsystemCategoryEnum.DataMigration;
     }
 
     const [active, setActive] = useState<EcomsystemCategoryEnum | 
string>(currentActive);
@@ -50,6 +53,14 @@ export default function EcomsystemCategory() {
                 title={'Data loading'}
                 content="Accelerate large-scale data loading"
             />
+            <TabItem
+                url={EcomsystemCategoryEnum.DataMigration}
+                setActive={() => 
setActive(EcomsystemCategoryEnum.DataMigration)}
+                active={active === EcomsystemCategoryEnum.DataMigration}
+                icon={<DataMigrationIcon />}
+                title={'Data migration'}
+                content="The easiest way to migrate your data"
+            />
             {/* <TabItem
                 url={EcomsystemCategoryEnum.DistributionsAndPackaging}
                 setActive={() => 
setActive(EcomsystemCategoryEnum.DistributionsAndPackaging)}
diff --git a/src/components/ecomsystem/ecomsystem.data.ts 
b/src/components/ecomsystem/ecomsystem.data.ts
index 677c1d9e353..fcc324deee1 100644
--- a/src/components/ecomsystem/ecomsystem.data.ts
+++ b/src/components/ecomsystem/ecomsystem.data.ts
@@ -3,4 +3,5 @@ export enum EcomsystemCategoryEnum {
     Connectors = 'connectors',
     DistributionsAndPackaging = 'distributions-and-packaging',
     DataLoading = 'data-loading',
+    DataMigration = 'data-migration'
 }
diff --git a/src/constant/download.data.ts b/src/constant/download.data.ts
index 5733b624d5d..72bf2ae149f 100644
--- a/src/constant/download.data.ts
+++ b/src/constant/download.data.ts
@@ -1085,6 +1085,8 @@ export const TOOL_VERSIONS = [
                 label: '1.0.0',
                 value: '1.0.0',
                 gz: 
'https://downloads.apache.org/doris/kafka-connector/1.0.0-rc01/apache-doris-kafka-connector-1.0.0-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/kafka-connector/1.0.0-rc01/apache-doris-kafka-connector-1.0.0-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/doris-kafka-connector/1.0.0/doris-kafka-connector-1.0.0.jar'
             },
         ],
     },
@@ -1096,36 +1098,50 @@ export const TOOL_VERSIONS = [
                 label: '1.6.1',
                 value: '1.6.1',
                 gz: 
'https://downloads.apache.org/doris/flink-connector/1.6.1/apache-doris-flink-connector-1.6.1-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/flink-connector/1.6.1/apache-doris-flink-connector-1.6.1-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/flink-doris-connector-1.19/1.6.1/flink-doris-connector-1.19-1.6.1.jar'
             },
             {
                 label: '1.5.2',
                 value: '1.5.2',
                 gz: 
'https://downloads.apache.org/doris/flink-connector/1.5.2/apache-doris-flink-connector-1.5.2-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/flink-connector/1.5.2/apache-doris-flink-connector-1.5.2-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/flink-doris-connector-1.18/1.5.2/flink-doris-connector-1.18-1.5.2.jar'
             },
             {
                 label: '1.4.0',
                 value: '1.4.0',
                 gz: 
'https://downloads.apache.org/doris/flink-connector/1.4.0/apache-doris-flink-connector-1.4.0-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/flink-connector/1.4.0/apache-doris-flink-connector-1.4.0-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/flink-doris-connector-1.17/1.4.0/flink-doris-connector-1.17-1.4.0.jar'
             },
             {
                 label: '1.3.0',
                 value: '1.3.0',
                 gz: 
'https://downloads.apache.org/doris/flink-connector/1.3.0/apache-doris-flink-connector-1.16-1.3.0-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/flink-connector/1.3.0/apache-doris-flink-connector-1.16-1.3.0-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/flink-doris-connector-1.16/1.3.0/flink-doris-connector-1.16-1.3.0.jar'
             },
             {
                 label: '1.2.1',
                 value: '1.2.1',
                 gz: 
'https://downloads.apache.org/doris/flink-connector/1.2.1/apache-doris-flink-connector-1.15-1.2.1-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/flink-connector/1.2.1/apache-doris-flink-connector-1.15-1.2.1-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/flink-doris-connector-1.15/1.2.1/flink-doris-connector-1.15-1.2.1.jar'
             },
             {
                 label: '1.1.1',
                 value: '1.1.1',
                 gz: 
'https://downloads.apache.org/doris/flink-connector/1.1.1/apache-doris-flink-connector-1.14_2.11-1.1.1-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/flink-connector/1.1.1/apache-doris-flink-connector-1.14_2.11-1.1.1-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/flink-doris-connector-1.14_2.12/1.1.1/flink-doris-connector-1.14_2.12-1.1.1.jar'
             },
             {
                 label: '1.0.3',
                 value: '1.0.3',
                 gz: 
'https://downloads.apache.org/doris/flink-connector/1.0.3/apache-doris-flink-connector-1.12_2.11-1.0.3-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/flink-connector/1.0.3/apache-doris-flink-connector-1.12_2.11-1.0.3-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/flink-doris-connector-1.14_2.12/1.0.3/flink-doris-connector-1.14_2.12-1.0.3.jar'
             },
         ],
     },
@@ -1137,26 +1153,36 @@ export const TOOL_VERSIONS = [
                 label: '1.3.2',
                 value: '1.3.2',
                 gz: 
'https://downloads.apache.org/doris/spark-connector/1.3.2/apache-doris-spark-connector-1.3.2-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/spark-connector/1.3.2/apache-doris-spark-connector-1.3.2-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/spark-doris-connector-3.4_2.12/1.3.2/spark-doris-connector-3.4_2.12-1.3.2.jar'
             },
             {
                 label: '1.2.0',
                 value: '1.2.0',
                 gz: 
'https://downloads.apache.org/doris/spark-connector/1.2.0/apache-doris-spark-connector-1.2.0-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/spark-connector/1.2.0/apache-doris-spark-connector-1.2.0-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/spark-doris-connector-3.2_2.12/1.2.0/spark-doris-connector-3.2_2.12-1.2.0.jar'
             },
             {
                 label: '1.1.0',
                 value: '3.2_2.12-1.1.0',
                 gz: 
'https://downloads.apache.org/doris/spark-connector/1.1.0/apache-doris-spark-connector-3.2_2.12-1.1.0-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/spark-connector/1.1.0/apache-doris-spark-connector-3.2_2.12-1.1.0-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/spark-doris-connector-3.2_2.12/1.1.0/spark-doris-connector-3.2_2.12-1.1.0.jar'
             },
             {
                 label: '1.0.1 (For Spark 3.1)',
                 value: '3.1_2.12-1.0.1',
                 gz: 
'https://downloads.apache.org/doris/spark-connector/1.0.1/apache-doris-spark-connector-3.1_2.12-1.0.1-incubating-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/spark-connector/1.0.1/apache-doris-spark-connector-3.1_2.12-1.0.1-incubating-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases/org/apache/doris/spark-doris-connector-3.1_2.12/1.0.1/spark-doris-connector-3.1_2.12-1.0.1.jar'
             },
             {
                 label: '1.0.1 (For Spark 2.x)',
                 value: '2.3_2.11-1.0.1',
                 gz: 
'https://downloads.apache.org/doris/spark-connector/1.0.1/apache-doris-spark-connector-2.3_2.11-1.0.1-incubating-src.tar.gz',
+                Source: 
'https://downloads.apache.org/doris/spark-connector/1.0.1/apache-doris-spark-connector-2.3_2.11-1.0.1-incubating-src.tar.gz',
+                Binary: 
'https://repository.apache.org/content/repositories/releases//org/apache/doris/spark-doris-connector-2.3_2.11/1.0.1/spark-doris-connector-2.3_2.11-1.0.1.jar'
             },
         ],
     },
@@ -1172,11 +1198,13 @@ export const TOOL_VERSIONS = [
                         label: CPUEnum.X64,
                         value: CPUEnum.X64,
                         gz: 
'https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-streamloader-1.0.1-bin-x64.tar.xz',
+                        Binary: 
'https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-streamloader-1.0.1-bin-x64.tar.xz'
                     },
                     {
                         label: CPUEnum.ARM64,
                         value: CPUEnum.ARM64,
                         gz: 
'https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-streamloader-1.0.1-bin-arm64.tar.xz',
+                        Binary: 
'https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-streamloader-1.0.1-bin-arm64.tar.xz'
                     },
                 ],
                 source: 
'https://downloads.apache.org/doris/doris-streamloader/1.0.1/apache-doris-streamloader-1.0.1-src.tar.gz',
diff --git a/src/pages/download/index.tsx b/src/pages/download/index.tsx
index 5219ae02892..2d018986e47 100644
--- a/src/pages/download/index.tsx
+++ b/src/pages/download/index.tsx
@@ -53,6 +53,7 @@ export default function Download() {
     const [cpus, setCpus] = useState<any[]>([]);
     const [cpu, setCPU] = useState<string>(CPUEnum.X64);
     const [downloadInfo, setDownloadInfo] = useState<any>({});
+    const [releaseFlag, setReleaseFlag] = useState<boolean>(true)
     const [downloadType, setDownloadType] = useState(DownloadTypeEnum.Binary);
     const [releaseNote, setReleaseNote] = 
useState('/docs/releasenotes/release-2.1.4');
 
@@ -67,6 +68,28 @@ export default function Download() {
         setDownloadInfo(downloadInfo);
     };
 
+    const getIssueCode = (code: string) => {
+        switch (code) {
+            case '1.2.1':
+                return 15508;
+            case '1.2.2':
+                return 16446;
+            case '1.2.3':
+                return 17748;
+            case '1.2.4':
+                return 18762;
+            case '1.2.5':
+                return 20827;
+            case '1.2.6':
+                return 21805;
+            case '1.2.7':
+                return 23711;
+            case '1.2.8':
+                return 31673;
+            default:
+                return null
+        }
+    }
     function toDocsRelease(version: string) {
         const SUPPORTED_VERSION = '>=1.1.0';
         const versionNumber = version.match(/[0-9].[0-9].[0-9]*/)?.[0] || 
'0.0.0';
@@ -78,8 +101,11 @@ export default function Download() {
     }
 
     function onValuesChange(values: any) {
+        setReleaseFlag(values.version[0] === '1.1' ? false : true)
         if (!toDocsRelease(values.version[1])) {
             setReleaseNote('https://github.com/apache/doris/releases');
+        } else if (values.version[0] === '1.2') {
+            
setReleaseNote(`https://github.com/apache/doris/issues/${getIssueCode(values.version[1])}`);
         } else {
             setReleaseNote(`/docs/releasenotes/release-${values.version[1]}`);
         }
@@ -228,6 +254,17 @@ export default function Download() {
                                 )}
                             </div>
                         </div>
+                        <div className="all-download-note" 
style={{textAlign:'center',marginTop:'24px'}}>
+                            Note: For Apache Doris version specifics, please 
refer to the <Link
+                                
to="https://doris.apache.org/community/release-versioning";
+                                style={{
+                                    color: '#444FD9',
+                                    cursor: 'pointer',
+                                    textDecoration: 'underline',
+                                }}
+                            >release versioning.
+                            </Link>
+                        </div>
                     </div>
                 </PageColumn>
             </section>
@@ -252,13 +289,13 @@ export default function Download() {
                                 For more information on the latest release, 
please refer to the Docs.
                             </div>
                             <div className="mt-[32px]">
-                                Kindly note that older releases (v1.1, v0.x) 
are provided for archival purposes only,
+                                Kindly note that older releases (v1.2, v1.1, 
v0.x) are provided for archival purposes only,
                                 and are no longer supported.
                             </div>
                         </div>
-                        <div>
+                        {releaseFlag && <div>
                             <LinkWithArrow to={releaseNote} text="Release 
note" />
-                        </div>
+                        </div>}
                         <div className="all-download-note">
                             Note: For detailed upgrade precautions, please 
refer to the{' '}
                             <Link
@@ -291,6 +328,7 @@ export default function Download() {
                     </div>
                 </div>
             </PageColumn>
+            <a id="doris-ecosystem" className="scroll-mt-20"></a>
             <PageColumn
                 title={
                     <span
diff --git a/src/pages/ecosystem/cluster-management/index.tsx 
b/src/pages/ecosystem/cluster-management/index.tsx
index 2e3f3332066..6320ec3d871 100644
--- a/src/pages/ecosystem/cluster-management/index.tsx
+++ b/src/pages/ecosystem/cluster-management/index.tsx
@@ -1,4 +1,5 @@
-import React from 'react';
+import React,{useState} from 'react';
+import Link from '@docusaurus/Link';
 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';
@@ -6,11 +7,13 @@ import '../index.scss';
 import { ExternalLinkArrowIcon } from 
'@site/src/components/Icons/external-link-arrow-icon';
 
 export default function ClusterManagement() {
+    const [flag,setFlag] = useState(true)
     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"
+                    popTrue={flag}
                     description="One-stop database cluster management tool, 
developed by VeloDB."
                     characteristic={[
                         'Create, start, stop, upgrade, and scale clusters',
@@ -36,8 +39,9 @@ export default function ClusterManagement() {
                     }
                 />
                 <CollapseBox
-                    title="Doris Operator"
-                    description="Run Apache Doris on K8s, developed by VeloDB."
+                    title="K8s Operator for Apache Doris"
+                    popTrue={flag}
+                    description="One-stop Doris cluster management tool on 
kubernetes, developed by VeloDB."
                     characteristic={[
                         'Diverse PV management',
                         'Pod deployment configuration ',
@@ -56,7 +60,6 @@ export default function ClusterManagement() {
                                 
href="https://doris.apache.org/docs/install/cluster-deployment/k8s-deploy/install-env";
                                 className="sub-btn"
                                 label="Docs"
-                                linkIcon={<ExternalLinkArrowIcon />}
                             ></ExternalLink>
                         </>
                     }
diff --git a/src/pages/ecosystem/connectors/index.tsx 
b/src/pages/ecosystem/connectors/index.tsx
index c8575cdae13..62856435b5d 100644
--- a/src/pages/ecosystem/connectors/index.tsx
+++ b/src/pages/ecosystem/connectors/index.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React,{useState} 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';
@@ -6,6 +6,7 @@ import '../index.scss';
 import { ExternalLinkArrowIcon } from 
'@site/src/components/Icons/external-link-arrow-icon';
 
 export default function Connectors() {
+    const [flag,setFlag] = useState(true)
     return (
         <EcomsystemLayout>
             <div className="container mx-auto flex flex-col flex-wrap 
items-center justify-center mb-[5.5rem] lg:flex-row">
@@ -22,8 +23,9 @@ export default function Connectors() {
                     moreLink={
                         <>
                             <ExternalLink
-                                
href="https://github.com/apache/doris-flink-connector/releases";
-                                label="GitHub"
+                                
href="https://doris.apache.org/docs/download#doris-ecosystem";
+                                label="Download"
+                                linkIcon={<ExternalLinkArrowIcon />}
                             ></ExternalLink>
                             <ExternalLink
                                 
href="https://doris.apache.org/docs/ecosystem/flink-doris-connector";
@@ -45,8 +47,9 @@ export default function Connectors() {
                     moreLink={
                         <>
                             <ExternalLink
-                                
href="https://github.com/apache/doris-spark-connector/releases";
-                                label="GitHub"
+                                
href="https://doris.apache.org/docs/download#doris-ecosystem";
+                                label="Download"
+                                linkIcon={<ExternalLinkArrowIcon />}
                             ></ExternalLink>
 
                             <ExternalLink
@@ -58,8 +61,36 @@ export default function Connectors() {
                         </>
                     }
                 />
+                <CollapseBox
+                    title="Kafka Doris Connector"
+                    description="A scalable and reliable tool for data 
transmission between Kafka and other systems."
+                    characteristic={[
+                        'Support both standalone and distributed deployment',
+                        'Support connecting to SSL-authenticated Kafka 
clusters',
+                        'Support writing failed or erroneous messages to 
dead-letter queues',
+                        'Support connector monitoring via JMX',
+                    ]}
+                    rightContent={<img 
src={require(`@site/static/images/ecomsystem/kafka.png`).default} alt="" />}
+                    moreLink={
+                        <>
+                            <ExternalLink
+                                
href="https://doris.apache.org/docs/download#doris-ecosystem";
+                                label="Download"
+                                linkIcon={<ExternalLinkArrowIcon />}
+                            ></ExternalLink>
+
+                            <ExternalLink
+                                
href="https://doris.apache.org/docs/ecosystem/doris-kafka-connector";
+                                className="sub-btn"
+                                label="Docs"
+                                linkIcon={<ExternalLinkArrowIcon />}
+                            ></ExternalLink>
+                        </>
+                    }
+                />
                 <CollapseBox
                     title="dbt Doris Adapter"
+                    popTrue={flag}
                     description="An Extract, Load, Transform (ELT) component."
                     characteristic={[
                         'Dedicated to data transforming in ELT. ',
@@ -68,7 +99,7 @@ export default function Connectors() {
                     rightContent={<img 
src={require(`@site/static/images/ecomsystem/dbt.png`).default} alt="" />}
                     moreLink={
                         <>
-                            <ExternalLink 
href="https://github.com/selectdb/dbt-doris"; label="GitHub"></ExternalLink>
+                            <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"
diff --git a/src/pages/ecosystem/data-loading/index.tsx 
b/src/pages/ecosystem/data-loading/index.tsx
index 3e6bb24ca06..9e78e71db0a 100644
--- a/src/pages/ecosystem/data-loading/index.tsx
+++ b/src/pages/ecosystem/data-loading/index.tsx
@@ -25,8 +25,9 @@ export default function DistributionsAndPackaging() {
                     moreLink={
                         <>
                             <ExternalLink
-                                
href="https://github.com/apache/doris-streamloader";
-                                label="GitHub"
+                                
href="https://doris.apache.org/docs/download#doris-ecosystem";
+                                label="Download"
+                                linkIcon={<ExternalLinkArrowIcon />}
                             ></ExternalLink>
 
                             <ExternalLink
diff --git a/src/pages/ecosystem/data-loading/index.tsx 
b/src/pages/ecosystem/data-migration/index.tsx
similarity index 62%
copy from src/pages/ecosystem/data-loading/index.tsx
copy to src/pages/ecosystem/data-migration/index.tsx
index 3e6bb24ca06..96dbcd64a3e 100644
--- a/src/pages/ecosystem/data-loading/index.tsx
+++ b/src/pages/ecosystem/data-migration/index.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React,{useState} 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';
@@ -6,31 +6,31 @@ import '../index.scss';
 import { ExternalLinkArrowIcon } from 
'@site/src/components/Icons/external-link-arrow-icon';
 
 export default function DistributionsAndPackaging() {
+    const [flag,setFlag] = useState(true)
     return (
         <EcomsystemLayout>
             <div className="container mx-auto flex flex-col flex-wrap 
items-center justify-center mb-[5.5rem] lg:flex-row">
                 <CollapseBox
-                    title="Doris Streamloader"
-                    description="A robust, high-performance and user-friendly 
alternative to the traditional curl-based stream load."
+                    title="SQL Convertor for Apache Doris"
+                    popTrue={flag}
+                    description="A SQL convertor that seamless switches 
multiple SQL dialects to Doris."
                     characteristic={[
-                        'Split data files automatically and perform parallel 
loading',
-                        'Support multiple files and directories load with one 
shot',
-                        'Support path traversal when the target is a 
directory',
-                        'Resume loading from previous failures and 
cancellations',
-                        'Retry automatically when failure',
+                        'Support multi-data sources, including Presto, Trino, 
Hive, PostgreSQL, Spark, Oracle, ClickHouse and more.',
+                        'Visualization and ease-to-use',
+                        'Text or File convert',
                     ]}
                     rightContent={
-                        <img 
src={require(`@site/static/images/ecomsystem/doris-stream-loader.png`).default} 
alt="" />
+                        <img 
src={require(`@site/static/images/ecomsystem/sql-convertor.png`).default} 
alt="" />
                     }
                     moreLink={
                         <>
                             <ExternalLink
-                                
href="https://github.com/apache/doris-streamloader";
-                                label="GitHub"
+                                
href="https://www.selectdb.com/download/tools#sql-convertor";
+                                label="Download"
                             ></ExternalLink>
 
                             <ExternalLink
-                                
href="https://doris.apache.org/docs/ecosystem/doris-streamloader";
+                                
href="https://doris.apache.org/docs/lakehouse/sql-dialect";
                                 className="sub-btn"
                                 label="Docs"
                                 linkIcon={<ExternalLinkArrowIcon />}
diff --git a/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx 
b/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx
index 43794fa8216..09ea89c4e2e 100644
--- a/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx
+++ b/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx
@@ -19,7 +19,7 @@ export default function DocsVersionDropdownNavbarItem({
     const activeDocContext = useActiveDocContext(docsPluginId);
     const versions = useVersions(docsPluginId);
     const { savePreferredVersionName } = useDocsPreferredVersion(docsPluginId);
-    const versionLinks = versions.map(version => {
+    const versionLinks = (versions.filter(item => item.name !== 
'1.2')).map(version => {
         // We try to link to the same doc, in another version
         // When not possible, fallback to the "main doc" of the version
         const versionDoc = activeDocContext.alternateDocVersions[version.name] 
?? getVersionMainDoc(version);
@@ -31,7 +31,6 @@ export default function DocsVersionDropdownNavbarItem({
             onClick: () => savePreferredVersionName(version.name),
         };
     });
-
     const items = [...dropdownItemsBefore, ...versionLinks, 
...dropdownItemsAfter];
     const dropdownVersion = useDocsVersionCandidates(docsPluginId)[0];
     // Mobile dropdown is handled a bit differently
diff --git a/static/images/ecomsystem/kafka.png 
b/static/images/ecomsystem/kafka.png
new file mode 100644
index 00000000000..139f7c32311
Binary files /dev/null and b/static/images/ecomsystem/kafka.png differ
diff --git a/static/images/ecomsystem/sql-convertor.png 
b/static/images/ecomsystem/sql-convertor.png
new file mode 100644
index 00000000000..d4e2ef15a67
Binary files /dev/null and b/static/images/ecomsystem/sql-convertor.png differ
diff --git a/templates/copyright.tex b/templates/copyright.tex
new file mode 100644
index 00000000000..70335976c85
--- /dev/null
+++ b/templates/copyright.tex
@@ -0,0 +1,3 @@
+\noindent \rule{\textwidth}{1pt}
+
+Copyright © 2024 The Apache Software Foundation,Licensed under the Apache 
License, Version 2.0. Apache, Doris, Apache Doris, the Apache feather logo and 
the Apache Doris logo are trademarks of The Apache Software Foundation.
diff --git a/templates/template.tex b/templates/template.tex
new file mode 100644
index 00000000000..0bee00d7326
--- /dev/null
+++ b/templates/template.tex
@@ -0,0 +1,340 @@
+\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$lang$,$endif$$if(papersize)$$papersize$,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$}
+$if(fontfamily)$
+\usepackage{$fontfamily$}
+$else$
+\usepackage{lmodern}
+$endif$
+$if(linestretch)$
+\usepackage{setspace}
+\setstretch{$linestretch$}
+$endif$
+\usepackage{etoolbox}
+\usepackage{xstring}
+\usepackage{amssymb,amsmath}
+\usepackage{ifxetex,ifluatex}
+\usepackage{fixltx2e} % provides \textsubscript
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+  \usepackage[T1]{fontenc}
+  \usepackage[utf8x]{inputenc}
+$if(euro)$
+  \usepackage{eurosym}
+$endif$
+\else % if luatex or xelatex
+  \ifxetex
+    \usepackage{mathspec}
+    \usepackage{xltxtra,xunicode}
+    $if(CJKmainfont)$
+      \usepackage{xeCJK}
+      \setCJKmainfont{$CJKmainfont$}
+    $endif$
+  \else
+    \usepackage{fontspec}
+  \fi
+  \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
+  \newcommand{\euro}{€}
+$if(mainfont)$
+    \setmainfont{$mainfont$}
+$endif$
+$if(sansfont)$
+    \setsansfont{$sansfont$}
+$endif$
+$if(monofont)$
+    \setmonofont[Mapping=tex-ansi]{$monofont$}
+$endif$
+$if(mathfont)$
+    \setmathfont(Digits,Latin,Greek){$mathfont$}
+$endif$
+\fi
+% use upquote if available, for straight quotes in verbatim environments
+\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
+% use microtype if available
+\IfFileExists{microtype.sty}{%
+\usepackage{microtype}
+\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
+}{}
+$if(geometry)$
+\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
+$endif$
+$if(natbib)$
+\usepackage{natbib}
+\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
+$endif$
+$if(biblatex)$
+\usepackage{biblatex}
+$if(biblio-files)$
+\bibliography{$biblio-files$}
+$endif$
+$endif$
+$if(listings)$
+
+\usepackage{xcolor}
+\usepackage{listings}
+\lstset{
+    literate={_}{\_}1,
+    basicstyle=\ttfamily,
+    keywordstyle=\color[rgb]{0.13,0.29,0.53}\bfseries,
+    stringstyle=\color[rgb]{0.31,0.60,0.02},
+    commentstyle=\color[rgb]{0.56,0.35,0.01}\itshape,
+    numberstyle=\footnotesize,
+    frame=single,
+    showspaces=false,                % show spaces everywhere adding 
particular underscores; it overrides 'showstringspaces'
+    showstringspaces=false,          % underline spaces within strings only
+    breaklines=true,
+    
postbreak=\raisebox{0ex}[0ex][0ex]{\ensuremath{\color{gray}\hookrightarrow\space}}
+}
+
+$endif$
+$if(lhs)$
+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
+$endif$
+$if(highlighting-macros)$
+$highlighting-macros$
+$endif$
+$if(verbatim-in-note)$
+\usepackage{fancyvrb}
+$endif$
+$if(tables)$
+\usepackage{longtable,booktabs}
+% set table to left-aligned
+\setlength\LTleft{0pt}
+\setlength\LTright{0pt}
+% fill the columns to page width
+\makeatletter
+\patchcmd\LT@array{\tabskip\z@}{\extracolsep{\fill}}
+\makeatletter
+
+$endif$
+$if(graphics)$
+\usepackage{graphicx,grffile}
+\makeatletter
+\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
+\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
+\makeatother
+% Scale images if necessary, so that they will not overflow the page
+% margins by default, and it is still possible to overwrite the defaults
+% using explicit options in \includegraphics[width, height, ...]{}
+\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
+$endif$
+\ifxetex
+  \usepackage[setpagesize=false, % page size defined by xetex
+              unicode=true, % unicode breaks when used with xetex
+              xetex]{hyperref}
+\else
+  \usepackage[unicode=true]{hyperref}
+\fi
+\hypersetup{breaklinks=true,
+            bookmarks=true,
+            pdfauthor={$author$},
+            pdftitle={$title$},
+            colorlinks=true,
+            citecolor=$if(citecolor)$$citecolor$$else$blue$endif$,
+            urlcolor=$if(urlcolor)$$urlcolor$$else$blue$endif$,
+            linkcolor=$if(linkcolor)$$linkcolor$$else$magenta$endif$,
+            pdfborder={0 0 0}}
+\urlstyle{same}  % don't use monospace font for urls
+$if(links-as-notes)$
+% Make links footnotes instead of hotlinks:
+\renewcommand{\href}[2]{#2\footnote{\url{#1}}}
+$endif$
+$if(strikeout)$
+\usepackage[normalem]{ulem}
+% avoid problems with \sout in headers with hyperref:
+\pdfstringdefDisableCommands{\renewcommand{\sout}{}}
+$endif$
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{6pt plus 2pt minus 1pt}
+\setlength{\emergencystretch}{3em}  % prevent overfull lines
+\providecommand{\tightlist}{%
+  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
+$if(numbersections)$
+\setcounter{secnumdepth}{5}
+$else$
+\setcounter{secnumdepth}{0}
+$endif$
+$if(verbatim-in-note)$
+\VerbatimFootnotes % allows verbatim text in footnotes
+$endif$
+$if(lang)$
+\ifxetex
+  \usepackage{polyglossia}
+  \setmainlanguage{$mainlang$}
+\else
+  \usepackage[$lang$]{babel}
+\fi
+$endif$
+
+$if(title)$
+\title{$title$$if(subtitle)$\\\vspace{0.5em}{\large $subtitle$}$endif$}
+$endif$
+$if(author)$
+\author{$for(author)$$author$$sep$ \and $endfor$}
+$endif$
+\date{$date$}
+$for(header-includes)$
+$header-includes$
+$endfor$
+
+% quote style
+% 
http://tex.stackexchange.com/questions/179982/add-a-black-border-to-block-quotations
+\usepackage{framed}
+% \usepackage{xcolor}
+\let\oldquote=\quote
+\let\endoldquote=\endquote
+\colorlet{shadecolor}{orange!15}
+\renewenvironment{quote}{\begin{shaded*}\begin{oldquote}}{\end{oldquote}\end{shaded*}}
+
+% https://www.zhihu.com/question/25082703/answer/30038248
+% no cross chapter
+\usepackage[section]{placeins}
+% no float everywhere
+\usepackage{float}
+\floatplacement{figure}{H}
+
+% we chinese write article this way
+\usepackage{indentfirst}
+\setlength{\parindent}{2em}
+
+\renewcommand{\contentsname}{目录}
+\renewcommand\figurename{图}
+
+% fix overlap toc number and title
+% https://blog.csdn.net/golden1314521/article/details/39926135
+\usepackage{titlesec}
+\usepackage{titletoc}
+% \titlecontents{标题名}[左间距]{标题格式}{标题标志}{无序号标题}{指引线与页码}[下间距]
+% fix overlap
+\titlecontents{subsection}
+              [4em]
+              {}%
+              {\contentslabel{3em}}%
+              {}%
+              {\titlerule*[0.5pc]{$$\cdot$$}\contentspage\hspace*{0em}}%
+
+\titlecontents{subsubsection}
+              [7em]
+              {}%
+              {\contentslabel{3.5em}}%
+              {}%
+              {\titlerule*[0.5pc]{$$\cdot$$}\contentspage\hspace*{0em}}%
+
+% \usepackage[all]{background}
+% \backgroundsetup{contents=PingCAP Inc.,color=blue,opacity=0.2}
+% \backgroundsetup{contents=\includegraphics{media/pingcap-logo},
+%   placement=top,scale=0.2,hshift=1000pt,vshift=-150pt,
+%   opacity=0.9,angle=0}
+
+
+
+  %
+  % line spacing
+  %
+  $if(linestretch)$
+  $else$
+  \usepackage{setspace}
+  \setstretch{1.2}
+  $endif$
+
+  %
+% colors
+%
+% $if(colorlinks)$
+% $else$
+% \usepackage[dvipsnames,svgnames*,x11names*,table]{xcolor}
+% $endif$
+
+%
+% listing colors
+%
+
+%\definecolor{listing-background}{rgb}{0.97,0.97,0.97}
+%\definecolor{listing-rule}{HTML}{B3B2B3}
+%\definecolor{listing-numbers}{HTML}{B3B2B3}
+%\definecolor{listing-text-color}{HTML}{000000}
+%\definecolor{listing-keyword}{HTML}{D8006B}
+%\definecolor{listing-identifier}{HTML}{000000}
+%\definecolor{listing-string}{HTML}{006CA9}
+%\definecolor{listing-comment}{rgb}{0.25,0.5,0.35}
+%\definecolor{listing-javadoc-comment}{HTML}{006CA9}
+
+
+$if(mainfont)$
+$else$
+\usepackage[default]{sourcesanspro}
+\usepackage{sourcecodepro}
+$endif$
+
+
+
+
+%
+% remove paragraph indention
+%
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{6pt plus 2pt minus 1pt}
+\setlength{\emergencystretch}{3em}  % prevent overfull lines
+
+
+% avoid level-4, 5 heading to be connected with following content
+% https://github.com/jgm/pandoc/issues/1658
+\let\oldparagraph\paragraph
+\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
+\let\oldsubparagraph\subparagraph
+\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
+
+\begin{document}
+
+% no bg at title page
+% \NoBgThispage
+$if(title)$
+\maketitle
+$endif$
+$if(abstract)$
+\begin{abstract}
+$abstract$
+\end{abstract}
+$endif$
+
+$for(include-before)$
+$include-before$
+
+$endfor$
+$if(toc)$
+{
+\hypersetup{linkcolor=black}
+\setcounter{tocdepth}{$toc-depth$}
+\tableofcontents
+}
+$endif$
+$if(lot)$
+\listoftables
+$endif$
+$if(lof)$
+\listoffigures
+$endif$
+
+\newpage
+
+$body$
+
+$if(natbib)$
+$if(biblio-files)$
+$if(biblio-title)$
+$if(book-class)$
+\renewcommand\bibname{$biblio-title$}
+$else$
+\renewcommand\refname{$biblio-title$}
+$endif$
+$endif$
+\bibliography{$biblio-files$}
+
+$endif$
+$endif$
+$if(biblatex)$
+\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
+
+$endif$
+$for(include-after)$
+$include-after$
+
+$endfor$
+\end{document}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to