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 79502ab9d4b (feat) add doris ecosystem download (#412) 79502ab9d4b is described below commit 79502ab9d4ba0af028ebcfd87360c2234896a66a Author: song7788q <songp...@gmail.com> AuthorDate: Thu Mar 7 14:36:32 2024 +0800 (feat) add doris ecosystem download (#412) --- .../download-form/download-form-all-release.tsx | 12 +- .../download-form/download-form-tools.tsx | 151 +++++++++++++++++++++ src/constant/download.data.ts | 99 ++++++++++++++ src/pages/download/index.scss | 17 +-- src/pages/download/index.tsx | 96 ++++++++++--- static/js/custom-script.js | 19 ++- 6 files changed, 355 insertions(+), 39 deletions(-) diff --git a/src/components/download-form/download-form-all-release.tsx b/src/components/download-form/download-form-all-release.tsx index 37f7148afcf..a3da4a999f9 100644 --- a/src/components/download-form/download-form-all-release.tsx +++ b/src/components/download-form/download-form-all-release.tsx @@ -69,7 +69,7 @@ export default function DownloadFormAllRelease(props: DownloadFormProps) { 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> + <div className="mb-8 text-xl font-medium text-left">Downloads</div> <Form form={form} onFinish={val => { @@ -91,7 +91,7 @@ export default function DownloadFormAllRelease(props: DownloadFormProps) { <Form.Item name="version" rules={[{ required: true }]}> <FormSelect placeholder="Version" - label="version" + label="Version" isCascader={true} displayRender={label => { return label.length > 0 ? label[label.length - 1] : ''; @@ -145,7 +145,7 @@ export default function DownloadFormAllRelease(props: DownloadFormProps) { {Array.isArray(version) && showArch(version[1]) && ( <> <div - className="flex cursor-pointer text-[#444FD9] items-center mt-7 justify-center" + className="flex cursor-pointer text-[#444FD9] items-center mt-4 justify-center" onClick={() => { const url = getDownloadLinkByCard({ version: version, @@ -182,9 +182,9 @@ export default function DownloadFormAllRelease(props: DownloadFormProps) { /> </svg> </div> - <div className="flex justify-center mt-[1.5rem]"> + <div className="flex justify-center mt-4"> <div - className="inline-flex items-center text-[#444FD9] cursor-pointer hover:underline" + className="inline-flex items-center text-[#8592A6] cursor-pointer hover:underline hover:text-[#444FD9]" onClick={() => { const url = getDownloadLinkByCard({ version: version, @@ -198,7 +198,7 @@ export default function DownloadFormAllRelease(props: DownloadFormProps) { ASC </div> <div - className="inline-flex items-center ml-4 text-[#444FD9] cursor-pointer hover:underline" + className="inline-flex items-center ml-4 text-[#8592A6] hover:text-[#444FD9] cursor-pointer hover:underline" onClick={() => { const url = getDownloadLinkByCard({ version: version, diff --git a/src/components/download-form/download-form-tools.tsx b/src/components/download-form/download-form-tools.tsx new file mode 100644 index 00000000000..86bd7d545ee --- /dev/null +++ b/src/components/download-form/download-form-tools.tsx @@ -0,0 +1,151 @@ +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 { ToolsEnum } from '@site/src/constant/download.data'; +import { useForm, useWatch } from 'antd/es/form/Form'; +import { ExternalLinkIcon } from '../Icons/external-link-icon'; + +interface DownloadFormToolsProps { + data: Option[]; +} +export default function DownloadFormTools(props: DownloadFormToolsProps) { + const { data } = props; + const [form] = useForm(); + const tool = useWatch('tool', form); + const architecture = useWatch('architecture', form); + const version = useWatch('version', form); + + const getOptions = useMemo(() => { + if (!tool) return []; + return data.find(item => tool === item.value).children; + }, [tool]); + + const getArchitectureOptions = useMemo(() => { + if (!tool || !version) return []; + const current = data.find(item => item.value === tool).children; + return current.find(item => version === item.value).children; + }, [version]); + + const getDownloadLinkByCard = (source?: boolean) => { + 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; + } else { + const currentVersion = currentTool.find(item => version === item.value).children; + return currentVersion.find(item => architecture === item.value).gz; + } + } + }; + + useEffect(() => { + if (tool) { + form.setFieldValue('version', getOptions[0].value); + } + }, [tool]); + + useEffect(() => { + if (version && getArchitectureOptions?.length > 0) { + form.setFieldValue('architecture', getArchitectureOptions[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 text-left">Downloads</div> + <Form + form={form} + onFinish={val => { + const url = getDownloadLinkByCard(); + window.open(url, '_blank'); + }} + initialValues={{ + tool: data[0]?.value, + version: '', + architecture: '', + }} + > + <Form.Item name="tool" rules={[{ required: true }]}> + <FormSelect placeholder="Tools" label="Tools" isCascader={false} options={data} /> + </Form.Item> + <Form.Item noStyle shouldUpdate> + {({ getFieldValue }) => + getFieldValue('tool') === ToolsEnum.StreamLoader ? ( + <> + <Form.Item name="version" rules={[{ required: true }]}> + <FormSelect + placeholder="Version" + label="Version" + isCascader={false} + options={getOptions} + /> + </Form.Item> + <Form.Item name="architecture" rules={[{ required: true }]}> + <FormSelect + placeholder="Architecture" + label="Architecture" + isCascader={false} + options={getArchitectureOptions} + /> + </Form.Item> + </> + ) : ( + <Form.Item name="version" rules={[{ required: true }]}> + <FormSelect + placeholder="Version" + label="Version" + isCascader={false} + options={getOptions} + /> + </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 cursor-pointer text-[#444FD9] items-center mt-4 justify-center" + onClick={() => { + const url = getDownloadLinkByCard(); + copy(url); + message.success('Copy Successfully!'); + }} + > + <span className="mr-2">Copy link</span> + <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none"> + <rect x="2.5" y="5.5" width="8" height="8" rx="0.564706" stroke="#444FD9" strokeWidth="1.2" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M6.0999 1.89996C5.43716 1.89996 4.8999 2.43722 4.8999 3.09996V5.49995H6.0999V3.09996L12.8999 3.09996V9.89996H10.5V11.1H12.8999C13.5626 11.1 14.0999 10.5627 14.0999 9.89996V3.09996C14.0999 2.43722 13.5626 1.89996 12.8999 1.89996H6.0999Z" + fill="#444FD9" + /> + </svg> + </div> + {tool === ToolsEnum.StreamLoader && ( + <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(true); + window.open(url, '_blank'); + }} + > + Source code + <div className="ml-1"> + <ExternalLinkIcon /> + </div> + </div> + </div> + )} + </Form> + </div> + ); +} diff --git a/src/constant/download.data.ts b/src/constant/download.data.ts index 08971f9d462..ab8fe9b69e3 100644 --- a/src/constant/download.data.ts +++ b/src/constant/download.data.ts @@ -21,6 +21,12 @@ export enum SuffixEnum { SHA512 = '.tar.gz.sha512', } +export enum ToolsEnum { + Flink = 'Flink Doris Connector', + Spark = 'Spark Doris Connector', + StreamLoader = 'Doris Streamloader', +} + export const ORIGIN = 'https://apache-doris-releases.oss-accelerate.aliyuncs.com/'; export enum VersionEnum { Latest = '2.0.5', @@ -893,6 +899,99 @@ export const OLD_VERSIONS: Option[] = [ }, ]; +export const TOOL_VERSIONS = [ + { + label: ToolsEnum.Flink, + value: ToolsEnum.Flink, + children: [ + { + label: '1.5.2', + value: '1.5.2', + gz: 'https://github.com/apache/doris-flink-connector/archive/refs/tags/1.5.2.tar.gz', + }, + { + label: '1.4.0', + value: '1.4.0', + gz: 'https://github.com/apache/doris-flink-connector/archive/refs/tags/1.4.0.tar.gz', + }, + { + label: '1.3.0', + value: '1.3.0', + gz: 'https://github.com/apache/doris-flink-connector/archive/refs/tags/1.16-1.3.0.tar.gz', + }, + { + label: '1.2.1', + value: '1.2.1', + gz: 'https://github.com/apache/doris-flink-connector/archive/refs/tags/1.15-1.2.1.tar.gz', + }, + { + label: '1.1.1', + value: '1.1.1', + gz: 'https://github.com/apache/doris-flink-connector/archive/refs/tags/1.14_2.12-1.1.1.tar.gz', + }, + { + label: '1.0.3', + value: '1.0.3', + gz: 'https://github.com/apache/doris-flink-connector/archive/refs/tags/1.13_2.11-1.0.3.tar.gz', + }, + ], + }, + { + label: ToolsEnum.Spark, + value: ToolsEnum.Spark, + children: [ + { + label: '1.3.1', + value: '1.3.1', + gz: 'https://github.com/apache/doris-spark-connector/archive/refs/tags/1.3.1.tar.gz', + }, + { + label: '1.2.0', + value: '1.2.0', + gz: 'https://github.com/apache/doris-spark-connector/archive/refs/tags/1.2.0.tar.gz', + }, + { + label: '1.1.0', + value: '3.2_2.12-1.1.0', + gz: 'https://github.com/apache/doris-spark-connector/archive/refs/tags/3.2_2.12-1.1.0.tar.gz', + }, + { + label: '1.0.1 (For Spark 3.1)', + value: '3.1_2.12-1.0.1', + gz: 'https://github.com/apache/doris-spark-connector/archive/refs/tags/3.1_2.12-1.0.1.tar.gz', + }, + { + label: '1.0.1 (For Spark 2.x)', + value: '2.3_2.11-1.0.1', + gz: 'https://github.com/apache/doris-spark-connector/archive/refs/tags/2.3_2.11-1.0.1.tar.gz', + }, + ], + }, + { + label: ToolsEnum.StreamLoader, + value: ToolsEnum.StreamLoader, + children: [ + { + label: '1.0.1', + value: '1.0.1', + children: [ + { + 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', + }, + { + 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', + }, + ], + source: 'https://github.com/apache/doris-streamloader/archive/refs/tags/1.0.1.tar.gz', + }, + ], + }, +]; + export const RUN_ANYWHERE = [ { title: 'Doris on bare metal', diff --git a/src/pages/download/index.scss b/src/pages/download/index.scss index d0f41c0b8de..ff191d11145 100644 --- a/src/pages/download/index.scss +++ b/src/pages/download/index.scss @@ -1,8 +1,7 @@ .run-anywhere { - background: #F7F9FE; + background: #f7f9fe; } .download { - a { transition: all 0.3s; @@ -30,9 +29,9 @@ &-box { padding: 3.125rem; - box-shadow: 10px 12px 38px rgba(33, 39, 116, 0.07); - border-radius: 4px; + border-radius: 8px; background-color: var(--global-colors-white); + border: #dfe5f0 solid 1px; .download-type { display: flex; @@ -95,7 +94,6 @@ .inner { margin: 0.3125rem; - background-color: #f7faff; width: calc(100% - 0.625rem); color: var(--ifm-color-primary); @@ -114,7 +112,7 @@ } &.all-in-one { .theme-code-block { - font-size: 0.875rem ; + font-size: 0.875rem; padding-left: 2rem; position: relative; &:before { @@ -314,7 +312,7 @@ align-items: flex-start; gap: 48px; border-radius: 8px; - border: 1px solid var(---N5, #DFE5F0); + border: 1px solid var(---N5, #dfe5f0); .all-download-intro { display: flex; @@ -323,7 +321,7 @@ align-items: flex-start; gap: 32px; .all-download-intro-text { - color: var(---N1, #1D1D1D); + color: var(---N1, #1d1d1d); font-size: 16px; font-style: normal; line-height: 26px; /* 162.5% */ @@ -345,11 +343,10 @@ } } .all-download-note { - color: var(---N3, #8592A6); + color: var(---N3, #8592a6); font-size: 12px; font-style: normal; line-height: 20px; text-align: left; } } - diff --git a/src/pages/download/index.tsx b/src/pages/download/index.tsx index 2f6bd9c78f4..82923ffedbd 100644 --- a/src/pages/download/index.tsx +++ b/src/pages/download/index.tsx @@ -3,7 +3,7 @@ import React, { useEffect, useState, version } from 'react'; import PageHeader from '@site/src/components/PageHeader'; import Layout from '@site/src/theme/Layout'; import DownloadFormAllRelease from '@site/src/components/download-form/download-form-all-release'; -import DownloadFormSimple from '@site/src/components/download-form/download-form-simple'; +import DownloadFormTools from '@site/src/components/download-form/download-form-tools'; import { CPUEnum, DORIS_VERSIONS, @@ -17,8 +17,9 @@ import './index.scss'; import LinkWithArrow from '../../components/link-arrow'; import PageColumn from '@site/src/components/PageColumn'; import clsx from 'clsx'; -import { ALL_VERSIONS, OLD_VERSIONS } from '../../constant/download.data'; +import { ALL_VERSIONS, TOOL_VERSIONS } from '../../constant/download.data'; import * as semver from 'semver'; +import { CheckedIcon } from '@site/src/components/Icons/checked-icon'; const BINARY_VERSION = [ { label: `${VersionEnum.Latest} ( Stable )`, value: VersionEnum.Latest }, @@ -117,9 +118,6 @@ export default function Download() { <PageHeader className="lg:pt-[5rem] g-white" title="Quick Download & Easy Deployment" /> <section className="quick-download"> <PageColumn align="center"> - <span className="font-medium" style={{ fontSize: 40 }}> - Quick Download - </span> <div className="download-box"> <div className="download-type"> <label> @@ -234,13 +232,16 @@ export default function Download() { </div> </PageColumn> </section> - <PageColumn> - <span - className="font-medium" - style={{ display: 'block', marginTop: 40, fontSize: 40, marginBottom: 32 }} - > - All Releases - </span> + <PageColumn + title={ + <span + className="font-normal" + style={{ display: 'block', lineHeight: '64px', marginTop: 40, fontSize: 40 }} + > + Doris All Releases + </span> + } + > <div className="all-download"> <div className="all-download-intro"> <div className="all-download-intro-text"> @@ -291,6 +292,69 @@ export default function Download() { </div> </div> </PageColumn> + <PageColumn + title={ + <span + className="font-normal" + style={{ display: 'block', lineHeight: '64px', marginTop: 40, fontSize: 40 }} + > + Doris Ecosystem + </span> + } + > + <div className="all-download"> + <div className="all-download-intro"> + <div className="all-download-intro-text"> + <div>Streamline integration and data loading with Doris tools</div> + </div> + <div className="flex"> + <ul> + <li className="mt-2 flex items-center space-x-2"> + <CheckedIcon /> + <div className="text-[#4C576C] text-base">Flink Doris Connector</div> + </li> + <li className="mt-2 flex items-center space-x-2"> + <CheckedIcon /> + <div className="text-[#4C576C] text-base">Spark Doris Connector</div> + </li> + <li className="mt-2 flex items-center space-x-2"> + <CheckedIcon /> + <div className="text-[#4C576C] text-base">Doris Streamloader</div> + </li> + </ul> + </div> + <div> + <LinkWithArrow to="/docs/ecosystem/datax" text="More Tools" /> + </div> + <div className="all-download-note"> + Note: For detailed upgrade precautions, please refer to the{' '} + <Link + to="/docs/install/standard-deployment" + style={{ + color: '#444FD9', + cursor: 'pointer', + }} + > + deployment + </Link>{' '} + manual and cluster{' '} + <Link + style={{ + color: '#444FD9', + cursor: 'pointer', + }} + to="/docs/admin-manual/cluster-management/upgrade" + > + upgrade + </Link>{' '} + manual. + </div> + </div> + <div className="all-download-card"> + <DownloadFormTools data={TOOL_VERSIONS} /> + </div> + </div> + </PageColumn> <a id="runAnywhere" className="scroll-mt-20"></a> <div className="run-anywhere bg-[#F7F9FE] pt-[5.5rem] pb-[7.5rem] mt-[80px]"> <div className="container mx-auto"> @@ -298,8 +362,8 @@ export default function Download() { <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} + <div + onClick={() => window.open(item.link)} key={item.title} className="run-anywhere-card 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" > @@ -308,9 +372,9 @@ export default function Download() { <div className="flex items-center mt-4 text-[#444FD9]"> <LinkWithArrow to={item.link} text="Learn more" /> </div> - </Link> + </div> ) : ( - <section> + <section key={item.title}> <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]"> diff --git a/static/js/custom-script.js b/static/js/custom-script.js index 4527b14de19..e746900d0bf 100644 --- a/static/js/custom-script.js +++ b/static/js/custom-script.js @@ -1,7 +1,12 @@ -<script type="text/javascript"> - (function(c,l,a,r,i,t,y){ - c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; - t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; - y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); - })(window, document, "clarity", "script", "kfyqejiz0g"); -</script> \ No newline at end of file +(function (c, l, a, r, i, t, y) { + c[a] = + c[a] || + function () { + (c[a].q = c[a].q || []).push(arguments); + }; + t = l.createElement(r); + t.async = 1; + t.src = 'https://www.clarity.ms/tag/' + i; + y = l.getElementsByTagName(r)[0]; + y.parentNode.insertBefore(t, y); +})(window, document, 'clarity', 'script', 'kfyqejiz0g'); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org