├── _routes.json ├── og_cn.jpg ├── og_en.jpg ├── og_ja.jpg ├── public ├── og.jpg ├── dify.png ├── google5a264f3acb0cfce4.html ├── importStep.webp ├── robots.txt ├── nodeIcon │ ├── tool.svg │ ├── iteration-start.svg │ ├── http-request.svg │ ├── if-else.svg │ ├── knowledge-retrieval.svg │ ├── default.svg │ ├── question-classifier.svg │ ├── answer.svg │ ├── code.svg │ ├── end.svg │ ├── assigner.svg │ ├── variable-aggregator.svg │ ├── iteration.svg │ └── llm.svg └── favicon.svg ├── .devcontainer └── devcontainer.json ├── src ├── components │ ├── ui │ │ ├── Card.astro │ │ ├── SectionTitle.astro │ │ ├── Banner.astro │ │ ├── AlertModal.astro │ │ ├── Alert.astro │ │ ├── Entrance.astro │ │ ├── TeamCard.astro │ │ ├── Breadcrumbs.astro │ │ ├── Skeleton.astro │ │ ├── DiscoverCard.astro │ │ └── PrivateHostedToogle.astro │ ├── sections │ │ ├── Section.astro │ │ ├── Process.astro │ │ ├── Testimonials.astro │ │ ├── Sponsors.astro │ │ ├── UploadEntranceBelow.astro │ │ └── UploadEntrance.astro │ ├── flow │ │ └── CustomNode_Landing.jsx │ └── seo │ │ └── Seo.astro ├── styles │ └── workflowLangding.css ├── assets │ ├── pics │ │ ├── background.jpg │ │ ├── profile-in.svg │ │ ├── company-logo2.svg │ │ └── feature2.svg │ ├── minus.svg │ ├── chevron.svg │ ├── bars.svg │ ├── icon1.svg │ ├── icon2.svg │ ├── icon3.svg │ ├── github.svg │ ├── icon4.svg │ ├── icon5.svg │ ├── icon7.svg │ ├── icon6.svg │ ├── icon8.svg │ ├── icon9.svg │ ├── instagram.svg │ └── logo-alt.svg ├── data │ ├── blog │ │ ├── 001 │ │ │ ├── HEROIMAGE.jpg │ │ │ ├── rebranding_diflowy_01.jpg │ │ │ ├── rebranding_diflowy_02.jpg │ │ │ ├── rebranding_diflowy_03.jpg │ │ │ ├── rebranding_diflowy_04.jpg │ │ │ ├── rebranding_diflowy_05.jpg │ │ │ └── rebranding_diflowy_06.jpg │ │ ├── 002 │ │ │ ├── HEROIMAGE.jpg │ │ │ ├── how_to_share_file_with_members-en.jpg │ │ │ ├── how_to_share_file_with_members-ja.jpg │ │ │ ├── how_to_share_file_with_members-zh.jpg │ │ │ ├── how_to_create_workspace_in_Diflowy-en.jpg │ │ │ ├── how_to_create_workspace_in_Diflowy-ja.jpg │ │ │ ├── how_to_create_workspace_in_Diflowy-zh.jpg │ │ │ ├── how_to_invite_members_to_workspace_in_Diflowy-en.jpg │ │ │ ├── how_to_invite_members_to_workspace_in_Diflowy-ja.jpg │ │ │ └── how_to_invite_members_to_workspace_in_Diflowy-zh.jpg │ │ └── 003 │ │ │ └── HEROIMAGE.jpg │ └── siteData.json ├── icons │ ├── lightning.svg │ ├── download.svg │ ├── login.svg │ ├── import.svg │ ├── logout.svg │ ├── user.svg │ ├── newMember.svg │ ├── twitter.svg │ ├── like.svg │ ├── google.svg │ ├── language.svg │ ├── update.svg │ ├── security.svg │ ├── share.svg │ ├── rocket.svg │ ├── facebook.svg │ ├── view.svg │ ├── version.svg │ ├── youtube.svg │ ├── bars.svg │ ├── github.svg │ ├── linkedin.svg │ └── discord.svg ├── types │ └── astro-i18next.d.ts ├── utils │ ├── slugify.js │ ├── lenis.js │ └── jsonLD.js ├── env.d.ts ├── pages │ ├── blog │ │ ├── [...slug].astro │ │ ├── index.astro │ │ └── tags │ │ │ └── [tag].astro │ ├── ar │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── de │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── es │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── fr │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── it │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── ja │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── ko │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── pt │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── ru │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── zh │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── zh-Hant │ │ ├── blog │ │ │ ├── [...slug].astro │ │ │ ├── index.astro │ │ │ └── tags │ │ │ │ └── [tag].astro │ │ ├── index.astro │ │ ├── 404.astro │ │ └── upload.astro │ ├── index.astro │ ├── 404.astro │ └── upload.astro ├── content │ ├── blog │ │ ├── diflowy-christmas-gift-free-team-membership-zh.md │ │ ├── diflowy-christmas-gift-free-team-membership-ja.md │ │ ├── diflowy-christmas-gift-free-team-membership-en.md │ │ ├── introducing-diflowy-community-and-features-zh.md │ │ └── introducing-diflowy-community-and-features-ja.md │ └── config.ts └── layouts │ └── MainHead.astro ├── astro-i18next.config.mjs ├── tsconfig.json ├── .gitignore ├── functions ├── api │ ├── logout.ts │ ├── login │ │ ├── github │ │ │ └── index.ts │ │ └── google │ │ │ └── index.ts │ └── auth.ts ├── jwtUtils.ts ├── env.d.ts ├── crypto.ts └── planUtils.ts ├── wrangler.toml ├── astro.config.mjs ├── LICENSE ├── package.json ├── tailwind.config.mjs ├── README_CN.md └── README_JP.md /_routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "include": ["/api/*"] 4 | } -------------------------------------------------------------------------------- /og_cn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/og_cn.jpg -------------------------------------------------------------------------------- /og_en.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/og_en.jpg -------------------------------------------------------------------------------- /og_ja.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/og_ja.jpg -------------------------------------------------------------------------------- /public/og.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/public/og.jpg -------------------------------------------------------------------------------- /public/dify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/public/dify.png -------------------------------------------------------------------------------- /public/google5a264f3acb0cfce4.html: -------------------------------------------------------------------------------- 1 | google-site-verification: google5a264f3acb0cfce4.html -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { "image": "mcr.microsoft.com/devcontainers/universal:2" } 2 | -------------------------------------------------------------------------------- /src/components/ui/Card.astro: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /src/styles/workflowLangding.css: -------------------------------------------------------------------------------- 1 | .react-flow__attribution { 2 | background: transparent; 3 | } -------------------------------------------------------------------------------- /public/importStep.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/public/importStep.webp -------------------------------------------------------------------------------- /src/assets/pics/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/assets/pics/background.jpg -------------------------------------------------------------------------------- /src/data/blog/001/HEROIMAGE.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/001/HEROIMAGE.jpg -------------------------------------------------------------------------------- /src/data/blog/002/HEROIMAGE.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/002/HEROIMAGE.jpg -------------------------------------------------------------------------------- /src/data/blog/003/HEROIMAGE.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/003/HEROIMAGE.jpg -------------------------------------------------------------------------------- /src/data/blog/001/rebranding_diflowy_01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/001/rebranding_diflowy_01.jpg -------------------------------------------------------------------------------- /src/data/blog/001/rebranding_diflowy_02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/001/rebranding_diflowy_02.jpg -------------------------------------------------------------------------------- /src/data/blog/001/rebranding_diflowy_03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/001/rebranding_diflowy_03.jpg -------------------------------------------------------------------------------- /src/data/blog/001/rebranding_diflowy_04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/001/rebranding_diflowy_04.jpg -------------------------------------------------------------------------------- /src/data/blog/001/rebranding_diflowy_05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/001/rebranding_diflowy_05.jpg -------------------------------------------------------------------------------- /src/data/blog/001/rebranding_diflowy_06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/001/rebranding_diflowy_06.jpg -------------------------------------------------------------------------------- /src/data/blog/002/how_to_share_file_with_members-en.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/002/how_to_share_file_with_members-en.jpg -------------------------------------------------------------------------------- /src/data/blog/002/how_to_share_file_with_members-ja.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/002/how_to_share_file_with_members-ja.jpg -------------------------------------------------------------------------------- /src/data/blog/002/how_to_share_file_with_members-zh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/002/how_to_share_file_with_members-zh.jpg -------------------------------------------------------------------------------- /src/data/blog/002/how_to_create_workspace_in_Diflowy-en.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/002/how_to_create_workspace_in_Diflowy-en.jpg -------------------------------------------------------------------------------- /src/data/blog/002/how_to_create_workspace_in_Diflowy-ja.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/002/how_to_create_workspace_in_Diflowy-ja.jpg -------------------------------------------------------------------------------- /src/data/blog/002/how_to_create_workspace_in_Diflowy-zh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/002/how_to_create_workspace_in_Diflowy-zh.jpg -------------------------------------------------------------------------------- /src/icons/lightning.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/download.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/data/blog/002/how_to_invite_members_to_workspace_in_Diflowy-en.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/002/how_to_invite_members_to_workspace_in_Diflowy-en.jpg -------------------------------------------------------------------------------- /src/data/blog/002/how_to_invite_members_to_workspace_in_Diflowy-ja.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/002/how_to_invite_members_to_workspace_in_Diflowy-ja.jpg -------------------------------------------------------------------------------- /src/data/blog/002/how_to_invite_members_to_workspace_in_Diflowy-zh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-dalii/diflowy/HEAD/src/data/blog/002/how_to_invite_members_to_workspace_in_Diflowy-zh.jpg -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | 4 | Disallow: /api/ 5 | Disallow: /temp/ 6 | Disallow: /*.tmp 7 | Disallow: /under-construction/ 8 | 9 | Sitemap: https://diflowy.greenerai.top/sitemap-0.xml -------------------------------------------------------------------------------- /src/types/astro-i18next.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'astro-i18next' { 2 | export function localizePath(path: string, language?: string): string; 3 | export function localizeUrl(url: string, language?: string): string; 4 | } -------------------------------------------------------------------------------- /astro-i18next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('astro-i18next').AstroI18nextConfig} */ 2 | export default { 3 | defaultLocale: "en", 4 | locales: ["en", "zh", "zh-Hant", "ja", "ko", "fr", "pt", "es", "de", "it", "ru", "ar"], 5 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/strict", 3 | "compilerOptions": { 4 | "jsx": "react-jsx", 5 | "jsxImportSource": "react", 6 | "types": ["@cloudflare/workers-types", "./src/types/astro-i18next"], 7 | }, 8 | } -------------------------------------------------------------------------------- /src/data/siteData.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Diflowy", 3 | "description": "Explore, Share, Host Dify Workflows in Diflowy.", 4 | "image": { 5 | "src": "/og.jpg", 6 | "alt": "Explore, Share, Host Dify Workflows in Diflowy." 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/icons/login.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/import.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/logout.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/minus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/components/sections/Section.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { id } = Astro.props; 3 | --- 4 | 5 |
6 |
7 | 8 |
9 |
10 | -------------------------------------------------------------------------------- /src/icons/newMember.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/slugify.js: -------------------------------------------------------------------------------- 1 | export function slugify(text) { 2 | return text 3 | .toString() 4 | .toLowerCase() 5 | .replace(/\s+/g, "-") 6 | .replace(/[^\w-]+/g, "") 7 | .replace(/--+/g, "-") 8 | .replace(/^-+/, "") 9 | .replace(/-+$/, ""); 10 | } 11 | -------------------------------------------------------------------------------- /src/icons/twitter.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/chevron.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/icons/like.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/nodeIcon/tool.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/google.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | .vscode/ 4 | 5 | # generated types 6 | .astro/ 7 | 8 | # dependencies 9 | node_modules/ 10 | 11 | # logs 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | pnpm-debug.log* 16 | 17 | # environment variables 18 | .env 19 | .env.production 20 | 21 | # macOS-specific files 22 | .DS_Store 23 | 24 | # jetbrains setting folder 25 | .idea/ -------------------------------------------------------------------------------- /src/components/ui/SectionTitle.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { sectionTitle, description } = Astro.props; 3 | --- 4 | 5 |
6 |

{sectionTitle}

7 |

8 | {description} 9 |

10 |
11 | -------------------------------------------------------------------------------- /src/icons/language.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/update.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/ui/Banner.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { message, linkText, url } = Astro.props; 3 | --- 4 |
5 | 10 |
-------------------------------------------------------------------------------- /public/nodeIcon/iteration-start.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/security.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/share.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/rocket.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /functions/api/logout.ts: -------------------------------------------------------------------------------- 1 | export const onRequest = async () => { 2 | try { 3 | // 设置一个过期的 Cookie 来清除 JWT 4 | const expiredCookie = `auth_token=; HttpOnly; Secure; Path=/; Max-Age=0`; 5 | 6 | return new Response(null, { 7 | status: 200, // 重定向到主页或登录页面 8 | headers: { 9 | "Set-Cookie": expiredCookie, 10 | }, 11 | }); 12 | } catch (error) { 13 | console.error('Error in logging out:', error); 14 | return new Response('Internal Server Error', { status: 500 }); 15 | } 16 | }; -------------------------------------------------------------------------------- /src/components/sections/Process.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Accordion from "../ui/Accordion.astro"; 3 | import SectionTitle from "../ui/SectionTitle.astro"; 4 | import Section from "./Section.astro"; 5 | 6 | const description = "Step-by-Step Guide to Achieving Your Business Goals"; 7 | --- 8 | 9 |
10 |
11 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /src/icons/facebook.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /functions/jwtUtils.ts: -------------------------------------------------------------------------------- 1 | import { SignJWT } from 'jose'; 2 | import type { JWTPayload } from 'jose'; 3 | 4 | 5 | // const secret = new TextEncoder().encode('YOUR_SECRET_KEY'); // 替换为你自己的安全密钥 6 | 7 | export async function createJWT(payload: JWTPayload, secret_key: string, expiresIn: string = '6h') { 8 | const secret = new TextEncoder().encode(secret_key); 9 | return new SignJWT(payload) 10 | .setProtectedHeader({ alg: 'HS256', typ: 'JWT' }) 11 | .setIssuedAt() 12 | .setExpirationTime(expiresIn) 13 | .sign(secret); 14 | } 15 | -------------------------------------------------------------------------------- /src/icons/view.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/version.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /functions/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import type { EventContext } from "@cloudflare/workers-types"; 4 | 5 | declare namespace App { 6 | interface Env { 7 | D1: D1Database; 8 | GITHUB_ID: string; 9 | GITHUB_SECRET: string; 10 | [key: string]: any; 11 | } 12 | 13 | // 扩展 Env 类型以包含 locals 属性 14 | interface Env extends Record { 15 | locals: { 16 | user: import("lucia").User | null; 17 | session: import("lucia").Session | null; 18 | }; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/icons/youtube.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/ui/AlertModal.astro: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | --- 4 | 5 | 6 | 17 | 18 | -------------------------------------------------------------------------------- /src/assets/bars.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/components/ui/Alert.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { id, type=null, message } = Astro.props; 3 | --- 4 | 5 | 20 | -------------------------------------------------------------------------------- /src/icons/bars.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /wrangler.toml: -------------------------------------------------------------------------------- 1 | # Generated by Wrangler on Sun Jul 28 2024 10:54:52 GMT+0800 (中国标准时间) 2 | name = "diflowy" 3 | pages_build_output_dir = "dist" 4 | compatibility_date = "2024-07-23" 5 | 6 | [vars] 7 | AUTH_TRUST_HOST = "true" 8 | NODE_VERSION = "22.5.1" 9 | 10 | [[d1_databases]] 11 | database_id = "d0eb0e20-7dfc-4d37-834a-f68058fb8e3f" 12 | binding = "D1" 13 | database_name = "D1" 14 | 15 | [env.production.vars] 16 | AUTH_TRUST_HOST = "true" 17 | NODE_VERSION = "22.5.1" 18 | 19 | [[env.production.d1_databases]] 20 | database_id = "d0eb0e20-7dfc-4d37-834a-f68058fb8e3f" 21 | binding = "D1" 22 | database_name = "D1" 23 | -------------------------------------------------------------------------------- /src/components/sections/Testimonials.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import SectionTitle from "../ui/SectionTitle.astro"; 3 | import SwiperSlider from "../ui/SwiperSlider.astro"; 4 | import Section from "./Section.astro"; 5 | import { t } from "i18next"; 6 | const descrption = t("reviews.description") 7 | --- 8 | 9 |
10 |
11 | 15 |
16 | 17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | import type { Node, Edge } from '@xyflow/react'; 4 | declare namespace App { 5 | interface Locals { 6 | session: import("lucia").Session | null; 7 | user: import("lucia").User | null; 8 | } 9 | } 10 | 11 | declare module globalThis { 12 | interface Window { 13 | updateReactFlow?: (nodes: any[], edges: any[]) => void; 14 | Color4Bg: { 15 | AmbientLightBg: new (options: { 16 | dom: string; 17 | colors: string[]; 18 | loop: boolean; 19 | }) => any; 20 | }; 21 | } 22 | } 23 | 24 | export {}; -------------------------------------------------------------------------------- /src/assets/icon1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icon2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icon3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/pics/profile-in.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/utils/lenis.js: -------------------------------------------------------------------------------- 1 | import Lenis from "lenis"; 2 | 3 | document.addEventListener("DOMContentLoaded", function () { 4 | const lenis = new Lenis(); 5 | 6 | function raf(time) { 7 | lenis.raf(time); 8 | requestAnimationFrame(raf); 9 | } 10 | 11 | requestAnimationFrame(raf); 12 | 13 | /* For Anchor Links Scrolling */ 14 | const anchorLinks = document.querySelectorAll('a[href^="#"]'); 15 | 16 | anchorLinks.forEach((link) => { 17 | link.addEventListener("click", (e) => { 18 | e.preventDefault(); 19 | 20 | const t = e.currentTarget; 21 | 22 | if (t) { 23 | lenis.scrollTo(t.getAttribute("href"), { offset: -132 } ?? ""); 24 | } 25 | }); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /src/assets/icon4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/assets/icon5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/components/ui/Entrance.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Card from "../ui/Card.astro"; 3 | import { localizePath } from "astro-i18next"; 4 | 5 | const { title, description, btnText, url, hasImg = false } = Astro.props; 6 | --- 7 | 8 |
9 | 10 |
13 |
14 |
15 |

{title}

16 |

{description}

17 | 18 | 19 | 20 |
21 |
22 |
23 |
24 |
25 | -------------------------------------------------------------------------------- /src/icons/linkedin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/assets/icon7.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /src/pages/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("en"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/ar/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("ar"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/de/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("de"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/es/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("es"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/fr/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("fr"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/it/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("it"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/ja/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("ja"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/ko/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("ko"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/pt/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("pt"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/ru/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("ru"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/zh/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("zh"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/assets/icon6.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /src/pages/zh-Hant/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import { getCollection, type CollectionEntry } from "astro:content"; 4 | import MarkdownPostLayout from "../../../layouts/MarkdownPostLayout.astro"; 5 | 6 | changeLanguage("zh-Hant"); 7 | 8 | export async function getStaticPaths() { 9 | const blogEntries = await getCollection("blog"); 10 | return blogEntries.map((entry: CollectionEntry<"blog">) => ({ 11 | params: { slug: entry.slug }, 12 | props: { entry }, 13 | })); 14 | } 15 | const { entry } = Astro.props as { 16 | entry: CollectionEntry<"blog">; 17 | }; 18 | const { Content } = await entry.render(); 19 | --- 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "astro/config"; 2 | import tailwind from "@astrojs/tailwind"; 3 | import react from "@astrojs/react"; 4 | import icon from "astro-icon"; 5 | import astroI18next from "astro-i18next"; 6 | import sitemap from "@astrojs/sitemap"; 7 | 8 | // https://astro.build/config 9 | export default defineConfig({ 10 | site: "https://diflowy.greenerai.top", 11 | integrations: [tailwind({ 12 | configFile: "./tailwind.config.mjs" 13 | }), react(), icon(), sitemap(), astroI18next()], 14 | security: { 15 | checkOrigin: true 16 | }, 17 | markdown: { 18 | shikiConfig: { 19 | theme: 'dracula', 20 | themes: { 21 | light: 'github-light', 22 | dark: 'github-dark', 23 | }, 24 | wrap: true 25 | } 26 | }, 27 | output: "static" 28 | }); -------------------------------------------------------------------------------- /src/components/ui/TeamCard.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Image } from "astro:assets"; 3 | import linkd from "../../assets/pics/profile-in.svg"; 4 | import Card from "./Card.astro"; 5 | 6 | const { pic, name, role, description, link } = Astro.props; 7 | --- 8 | 9 | 10 |
11 |
12 | {name} 13 |
14 |

{name}

15 |

{role}

16 |
17 | Linkedin Logo 20 |
21 |
22 |
{description}
23 |
24 |
25 | -------------------------------------------------------------------------------- /src/assets/icon8.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/icon9.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/ui/Breadcrumbs.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { urlList, isTitle = "NoTitle" } = Astro.props; 3 | --- 4 |
5 |
6 | 28 |
29 |
30 | -------------------------------------------------------------------------------- /src/content/blog/diflowy-christmas-gift-free-team-membership-zh.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Diflowy圣诞惊喜:免费赠送三个月TEAM会员!" 3 | pubDate: 2024-12-25 4 | description: 圣诞节来临之际,Diflowy为所有用户送上一份特别的礼物 5 | author: Greener-Dalii 6 | occupation: Founder of Diflowy Community 7 | heroImage: "/src/data/blog/003/HEROIMAGE.jpg" 8 | heroImageAlt: 'Blog Hero Image' 9 | tags: ["Official", "Announcement" ] 10 | lang: "zh" 11 | multiLanguage: 12 | - diflowy-christmas-gift-free-team-membership-en 13 | - diflowy-christmas-gift-free-team-membership-ja 14 | --- 15 | 16 | 亲爱的Diflowy用户们, 17 | 18 | 圣诞节到了,我们想借此机会,向所有一直支持Diflowy的你们表达感谢!你们的信任和反馈,是我们不断前进的动力。没有你们的陪伴,就没有今天的Diflowy。 19 | 20 | 为了感谢大家的支持,我们决定在这个特别的节日里,送上一份小小的圣诞礼物——**免费赠送三个月的TEAM会员**!从现在开始到2025年3月25日,所有用户将自动获得三个月的TEAM会员资格,享受更多高级功能和团队协作的便利。 21 | 22 | 希望这份礼物能为你们的节日增添一份喜悦,也期待在新的一年里,继续与你们一起,共同打造更好的Diflowy。 23 | 24 | 祝大家圣诞快乐,新年快乐!🎄🎁 25 | 26 | Diflowy团队 -------------------------------------------------------------------------------- /public/nodeIcon/http-request.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/content/config.ts: -------------------------------------------------------------------------------- 1 | // 从 `astro:content` 导入辅助工具 2 | // import { string } from "astro/zod"; 3 | import { z, defineCollection, reference } from "astro:content"; 4 | // import { getCollection } from "astro:content"; 5 | 6 | // 为每一个集合定义一个 `type` 和 `schema` 7 | const blogCollection = defineCollection({ 8 | type: 'content', 9 | schema: z.object({ 10 | title: z.string(), 11 | pubDate: z.date(), 12 | description: z.string(), 13 | author: z.string(), 14 | occupation: z.string(), 15 | heroImage: z.string(), 16 | heroImageAlt: z.string(), 17 | tags: z.array(z.string()), 18 | lang: z.string(), 19 | multiLanguage: z.array(reference('blog')) 20 | }) 21 | }); 22 | 23 | // 导出一个单独的 `collections` 对象来注册你的集合 24 | export const collections = { 25 | blog: blogCollection, 26 | }; 27 | 28 | // 获取Blog所有图片 29 | export const blogImages: Record = import.meta.glob("/src/data/blog/*/*.jpg", { eager: true }); -------------------------------------------------------------------------------- /public/nodeIcon/if-else.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/content/blog/diflowy-christmas-gift-free-team-membership-ja.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Diflowyクリスマスサプライズ:3ヶ月間のTEAM会員を無料プレゼント!" 3 | pubDate: 2024-12-25 4 | description: クリスマスの精神に則り、Diflowyはすべてのユーザーに特別なプレゼントを贈ります! 5 | author: Greener-Dalii 6 | occupation: Founder of Diflowy Community 7 | heroImage: "/src/data/blog/003/HEROIMAGE.jpg" 8 | heroImageAlt: 'Blog Hero Image' 9 | tags: ["Official", "Announcement" ] 10 | lang: "ja" 11 | multiLanguage: 12 | - diflowy-christmas-gift-free-team-membership-zh 13 | - diflowy-christmas-gift-free-team-membership-en 14 | --- 15 | 16 | Diflowyのユーザーの皆様へ、 17 | 18 | クリスマスが近づいてきましたね。この機会に、Diflowyを支えてくださった皆様に、心から「ありがとう」と言いたいと思います。皆様の信頼とフィードバックは、私たちが前進し続ける原動力です。皆様のおかげで、Diflowyは今日までここまで成長することができました。 19 | 20 | 感謝の気持ちを込めて、特別なクリスマスプレゼントをお届けします—**3ヶ月間のTEAMプランの無料サブスクリプション**!本日から12月31日まで、すべてのユーザーは自動的に3ヶ月間のTEAM会員資格を獲得し、高度な機能とチームコラボレーションの利便性を楽しむことができます。 21 | 22 | この小さなプレゼントが皆様のホリデーシーズンに少しでも笑顔をもたらせば幸いです。新年に向けて、より良いDiflowyを一緒に作り上げることを楽しみにしています。 23 | 24 | メリークリスマス、そしてあけましておめでとうございます! 🎄🎁 25 | 26 | Diflowyチーム -------------------------------------------------------------------------------- /public/nodeIcon/knowledge-retrieval.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/discord.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/layouts/MainHead.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Seo from "../components/seo/Seo.astro"; 3 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 4 | 5 | // Pass the contents to create SEO for the page 6 | const { title, description, image, frontmatter, robots } = Astro.props; 7 | --- 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {title} 18 | 19 | 20 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/components/flow/CustomNode_Landing.jsx: -------------------------------------------------------------------------------- 1 | import { memo } from 'react'; 2 | import { Handle, Position } from '@xyflow/react'; 3 | 4 | function CustomNode({ data }) { 5 | return ( 6 |
7 |
8 |
9 | {data.icon} 10 |
11 |
12 |
{data.label}
13 |
14 |
15 | 16 | 21 | 26 |
27 | ); 28 | } 29 | 30 | export default memo(CustomNode); 31 | -------------------------------------------------------------------------------- /src/components/sections/Sponsors.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Image } from "astro:assets"; 3 | import s1 from "../../assets/pics/company-logo1.svg"; 4 | import s2 from "../../assets/pics/company-logo2.svg"; 5 | import s3 from "../../assets/pics/company-logo3.svg"; 6 | import s4 from "../../assets/pics/company-logo4.svg"; 7 | import s5 from "../../assets/pics/company-logo5.svg"; 8 | import s6 from "../../assets/pics/company-logo6.svg"; 9 | import Section from "./Section.astro"; 10 | 11 | const sponsors = [ 12 | { logo: s1, alt: "Amazon logo" }, 13 | { logo: s2, alt: "Dribble logo" }, 14 | { logo: s3, alt: "HubSpot logo" }, 15 | { logo: s4, alt: "Notion logo" }, 16 | { logo: s5, alt: "Netflix logo" }, 17 | { logo: s6, alt: "Zoom logo" }, 18 | ]; 19 | --- 20 | 21 |
22 |
23 | { 24 | sponsors.map((sponsor) => { 25 | return ( 26 |
27 | {sponsor.alt} 28 |
29 | ); 30 | }) 31 | } 32 |
33 |
34 | -------------------------------------------------------------------------------- /src/components/ui/Skeleton.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | -------------------------------------------------------------------------------- /public/nodeIcon/default.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../components/sections/Hero.astro"; 3 | // import Process from "../components/sections/Process.astro"; 4 | import UploadEntrance from "../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../components/sections/DiscoverEntrance.astro"; 6 | import More from "../components/sections/More.astro"; 7 | import Features from "../components/sections/Features.astro"; 8 | // import Sponsors from "../components/sections/Sponsors.astro"; 9 | // import Team from "../components/sections/Team.astro"; 10 | import Testimonials from "../components/sections/Testimonials.astro"; 11 | import MainLayout from "../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../styles/globals.css"; 15 | 16 | changeLanguage("en"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/assets/instagram.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Esteban Vásquez Pérez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/utils/jsonLD.js: -------------------------------------------------------------------------------- 1 | import siteData from "../data/siteData.json"; 2 | import { slugify } from "./slugify"; 3 | 4 | export default function jsonLDGenerator({ type, post, url }) { 5 | // If the page has CMS data, use it. 6 | if (type === "post") { 7 | return ``; 26 | } 27 | return ``; 35 | } 36 | -------------------------------------------------------------------------------- /src/pages/ar/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("ar"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/de/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("de"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/es/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("es"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/fr/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("fr"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/it/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("it"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/ja/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("ja"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/ko/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("ko"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/pt/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("pt"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/ru/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("ru"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/zh/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("zh"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/zh-Hant/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Hero from "../../components/sections/Hero.astro"; 3 | // import Process from "../../components/sections/Process.astro"; 4 | import UploadEntrance from "../../components/sections/UploadEntrance.astro"; 5 | import DiscoverEntrance from "../../components/sections/DiscoverEntrance.astro"; 6 | import More from "../../components/sections/More.astro"; 7 | import Features from "../../components/sections/Features.astro"; 8 | // import Sponsors from "../../components/sections/Sponsors.astro"; 9 | // import Team from "../../components/sections/Team.astro"; 10 | import Testimonials from "../../components/sections/Testimonials.astro"; 11 | import MainLayout from "../../layouts/MainLayout.astro"; 12 | import i18next, { t, changeLanguage } from "i18next"; 13 | import { Trans, HeadHrefLangs } from "astro-i18next/components"; 14 | import "../../styles/globals.css"; 15 | 16 | changeLanguage("zh-Hant"); 17 | --- 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/pages/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../layouts/MainLayout.astro"; 4 | import SectionTitle from "../components/ui/SectionTitle.astro"; 5 | import Section from "../components/sections/Section.astro"; 6 | import Breadcrumbs from "../components/ui/Breadcrumbs.astro"; 7 | import "../styles/globals.css"; 8 | 9 | changeLanguage("en"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/ar/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("ar"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/de/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("de"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/es/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("es"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/fr/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("fr"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/it/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("it"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/ja/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("ja"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/ko/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("ko"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/pt/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("pt"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/ru/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("ru"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/zh/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("zh"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/pages/zh-Hant/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import "../../styles/globals.css"; 8 | 9 | changeLanguage("zh-Hant"); 10 | 11 | const description = t("notfound.description"); 12 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 13 | --- 14 | 15 | 19 | 20 |
21 |
22 | 26 | 35 |
36 |
37 |
-------------------------------------------------------------------------------- /public/nodeIcon/question-classifier.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/nodeIcon/answer.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/nodeIcon/code.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/sections/UploadEntranceBelow.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Image } from "astro:assets"; 3 | import Card from "../ui/Card.astro"; 4 | import { t } from "i18next"; 5 | import { localizePath } from "astro-i18next"; 6 | import propImg from "../../assets/pics/upload.svg"; 7 | --- 8 | 9 |
10 | 11 |
14 |
15 |
16 |

{t("explorepage.uploadtitle")}

17 |

18 | {t("explorepage.uploadtext1")} 19 |
{t("explorepage.uploadtext2")} 20 |

21 | 26 |
27 | 36 |
37 |
38 |
39 |
40 | -------------------------------------------------------------------------------- /src/pages/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("en"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "en"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "diflowy", 3 | "type": "module", 4 | "version": "0.2.1", 5 | "scripts": { 6 | "dev": "astro dev", 7 | "start": "astro dev", 8 | "build": "astro check && astro build", 9 | "preview": "astro preview", 10 | "astro": "astro" 11 | }, 12 | "dependencies": { 13 | "@astrojs/check": "^0.7.0", 14 | "@astrojs/react": "^3.6.0", 15 | "@astrojs/sitemap": "^3.2.0", 16 | "@astrojs/tailwind": "^5.1.0", 17 | "@lucia-auth/adapter-sqlite": "^3.0.2", 18 | "@types/bcryptjs": "^2.4.6", 19 | "@types/cloudflare": "^2.7.14", 20 | "@types/react": "^18.3.3", 21 | "@types/react-dom": "^18.3.0", 22 | "@xyflow/react": "^12.0.3", 23 | "arctic": "^1.9.2", 24 | "astro": "^4.9.1", 25 | "astro-i18next": "^1.0.0-beta.21", 26 | "astro-icon": "^1.1.1", 27 | "bcryptjs": "^2.4.3", 28 | "isomorphic-dompurify": "^2.16.0", 29 | "jose": "^5.6.3", 30 | "js-yaml": "^4.1.0", 31 | "jwt-decode": "^4.0.0", 32 | "lenis": "^1.0.45", 33 | "lucia": "^3.2.0", 34 | "marked": "^14.1.2", 35 | "react": "^18.3.1", 36 | "react-dom": "^18.3.1", 37 | "swiper": "^11.1.3", 38 | "tailwindcss": "^3.4.3", 39 | "typescript": "^5.4.5" 40 | }, 41 | "devDependencies": { 42 | "@cloudflare/workers-types": "^4.20240725.0", 43 | "@tailwindcss/typography": "^0.5.15", 44 | "@types/js-yaml": "^4.0.9", 45 | "daisyui": "^4.12.10" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/content/blog/diflowy-christmas-gift-free-team-membership-en.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Diflowy Christmas Surprise: Free Three-Month TEAM Membership!" 3 | pubDate: 2024-12-25 4 | description: As Christmas approaches, Diflowy is thrilled to offer all users a special gift 5 | author: Greener-Dalii 6 | occupation: Founder of Diflowy Community 7 | heroImage: "/src/data/blog/003/HEROIMAGE.jpg" 8 | heroImageAlt: 'Blog Hero Image' 9 | tags: ["Official", "Announcement" ] 10 | lang: "en" 11 | multiLanguage: 12 | - diflowy-christmas-gift-free-team-membership-zh 13 | - diflowy-christmas-gift-free-team-membership-ja 14 | --- 15 | 16 | Dear Diflowy Users, 17 | 18 | Christmas is just around the corner, and we wanted to take a moment to say a big "Thank you!" to all of you who have supported Diflowy. Your trust and feedback mean the world to us, and we couldn't have come this far without your help. 19 | 20 | To show our gratitude, we’re excited to offer a special Christmas gift to all of you—**a free three-month subscription to the TEAM plan**! From now until March 25, 2025, every user will automatically receive a three-month TEAM membership, unlocking advanced features and enhanced team collaboration. 21 | 22 | We hope this little gift brings a smile to your holiday season and we look forward to continuing our journey together in the new year, building an even better Diflowy. 23 | 24 | Wishing you a Merry Christmas and a Happy New Year! 🎄🎁 25 | 26 | The Diflowy Team -------------------------------------------------------------------------------- /src/pages/ar/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("ar"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "en"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/pages/de/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("de"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "en"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/pages/es/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("es"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "en"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/pages/fr/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("fr"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "en"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/pages/it/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("it"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "en"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/pages/ja/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("ja"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "ja"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/pages/ko/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("ko"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "en"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/pages/pt/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("pt"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "en"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/pages/ru/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("ru"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "en"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/pages/zh/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("zh"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "zh"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/pages/zh-Hant/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { t, changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("zh-Hant"); 12 | 13 | const allPosts = await getCollection("blog"); 14 | const filteredPosts = allPosts.filter((post: { 15 | data: { 16 | lang: string; 17 | }; 18 | }) => post.data.lang === "zh"); 19 | // 按日期倒序排序 20 | allPosts.sort((a: any, b: any) => { 21 | const dateA = new Date(a.data.pubDate).getTime(); 22 | const dateB = new Date(b.data.pubDate).getTime(); 23 | return dateB - dateA; 24 | }); 25 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 26 | const description = t("blogpage.description"); 27 | --- 28 | 29 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
-------------------------------------------------------------------------------- /src/assets/pics/company-logo2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"], 4 | theme: { 5 | extend: { 6 | fontFamily: { 7 | grotesk: ["sans-serif"], 8 | }, 9 | fontWeight: { 10 | regular: 400, 11 | medium: 500, 12 | }, 13 | colors: { 14 | primary: "var(--dark)", 15 | blue: "var(--blue)", 16 | black: "var(--black)", 17 | dark: "var(--dark)", 18 | white: "var(--white)", 19 | 'blues': { 20 | 50: '#eff6ff', 21 | 100: '#dbeafe', 22 | 200: '#bfdbfe', 23 | 300: '#93c5fd', 24 | 400: '#60a5fa', 25 | 500: '#3b82f6', 26 | 600: '#2563eb', 27 | 700: '#1d4ed8', 28 | 800: '#1e40af', 29 | 900: '#172554', 30 | } 31 | }, 32 | backgroundImage: { 33 | "gradient-radial-at-bottom-center": "radial-gradient(at center bottom, var(--tw-gradient-stops))", 34 | } 35 | }, 36 | }, 37 | plugins: [ 38 | require("daisyui"), 39 | require('@tailwindcss/typography'), 40 | ], 41 | daisyui: { 42 | themes: [ 43 | { 44 | light: { 45 | ...require("daisyui/src/theming/themes")["light"], 46 | primary: "#007fe6", 47 | }, 48 | dark: { 49 | ...require("daisyui/src/theming/themes")["dark"], 50 | primary: "#007fe6", 51 | }, 52 | }, 53 | ], 54 | }, 55 | }; 56 | -------------------------------------------------------------------------------- /src/components/sections/UploadEntrance.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Image } from "astro:assets"; 3 | import Card from "../ui/Card.astro"; 4 | import Section from "./Section.astro"; 5 | import SectionTitle from "../ui/SectionTitle.astro"; 6 | import propImg from "../../assets/pics/upload.svg"; 7 | import { t } from "i18next"; 8 | import { localizePath } from "astro-i18next"; 9 | 10 | const description = t("share.description"); 11 | --- 12 | 13 |
14 |
15 | 16 | 17 |
20 |
21 |

{t("share.sharetitle")}

22 |

{t("share.belowtitle")}

23 | 28 |
29 | 38 |
39 |
40 |
41 |
42 | -------------------------------------------------------------------------------- /functions/api/login/github/index.ts: -------------------------------------------------------------------------------- 1 | import { generateState } from "arctic"; 2 | import { initializeGitHub } from "../../auth"; 3 | import type { Env } from "../../auth"; 4 | import type { EventContext } from "@cloudflare/workers-types"; 5 | 6 | export const onRequestGet: (context: EventContext>) => Promise = async (context) => { 7 | try { 8 | const github = initializeGitHub(context.env); 9 | const state = generateState(); 10 | const githubAuthURL = await github.createAuthorizationURL(state); 11 | const requestUrl = new URL(context.request.url) 12 | const redirect = requestUrl.searchParams.get("redirect") || "/"; 13 | // console.log("AuthorizationURL>>>>", url) 14 | console.log("Login/Github redirect>>>", redirect) 15 | 16 | const stateCookie = `github_oauth_state=${state}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=600`; 17 | const redirectCookie = `auth_redirect=${encodeURIComponent(redirect)}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=600`; 18 | console.log("redirectCookie>>>", redirectCookie) 19 | // 创建用于设置 cookie 的 Response 对象 20 | const response = new Response(null, { 21 | status: 302, 22 | headers: { 23 | Location: githubAuthURL.toString(), 24 | // "Set-Cookie": stateCookie, 25 | }, 26 | }); 27 | // 添加 cookie 28 | response.headers.append("Set-Cookie", stateCookie); 29 | response.headers.append("Set-Cookie", redirectCookie); 30 | 31 | return response; 32 | } catch (error) { 33 | console.error("Error during GitHub OAuth:", error); 34 | return new Response("Internal Server Error", { status: 500 }); 35 | } 36 | }; -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../layouts/MainLayout.astro"; 4 | import SectionTitle from "../components/ui/SectionTitle.astro"; 5 | import Section from "../components/sections/Section.astro"; 6 | import Form from "../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../components/ui/Breadcrumbs.astro"; 9 | import "../styles/globals.css"; 10 | 11 | changeLanguage("en"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/ar/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("ar"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/de/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("de"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/es/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("es"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/fr/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("fr"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/it/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("it"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/ja/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("ja"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/ko/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("ko"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/pt/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("pt"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/ru/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("ru"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/zh/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("zh"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /src/pages/zh-Hant/upload.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage, t } from "i18next"; 3 | import MainLayout from "../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../components/ui/SectionTitle.astro"; 5 | import Section from "../../components/sections/Section.astro"; 6 | import Form from "../../components/ui/Form.astro"; 7 | import { localizePath } from "astro-i18next"; 8 | import Breadcrumbs from "../../components/ui/Breadcrumbs.astro"; 9 | import "../../styles/globals.css"; 10 | 11 | changeLanguage("zh-Hant"); 12 | 13 | const description = t("uploadpage.description"); 14 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 15 | --- 16 | 17 | 18 | 19 |
20 |
21 | 25 |
26 |
27 |

28 | {t("uploadpage.loginhint")} 29 |

30 | 34 | 35 |
36 |
37 | 43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /public/nodeIcon/end.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /functions/api/login/google/index.ts: -------------------------------------------------------------------------------- 1 | import { generateState, generateCodeVerifier } from "arctic"; 2 | import { initializeGoogle } from "../../auth"; 3 | import type { Env } from "../../auth"; 4 | import type { EventContext } from "@cloudflare/workers-types"; 5 | 6 | export const onRequestGet: (context: EventContext>) => Promise = async (context) => { 7 | try { 8 | const google = initializeGoogle(context.env); 9 | const state = generateState(); 10 | const codeVerifier = generateCodeVerifier(); 11 | const googleAuthURL = await google.createAuthorizationURL(state, codeVerifier, { 12 | scopes: ["profile", "email"] 13 | }); 14 | const requestUrl = new URL(context.request.url) 15 | const redirect = requestUrl.searchParams.get("redirect") || "/"; 16 | console.log("Login/Google redirect>>>", redirect) 17 | const stateCookie = `google_oauth_state=${state}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=600`; 18 | const codeVerifierCookie = `google_code_verifier=${codeVerifier}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=600`; 19 | const redirectCookie = `auth_redirect=${encodeURIComponent(redirect)}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=600`; 20 | 21 | const response = new Response(null, { 22 | status: 302, 23 | headers: { 24 | Location: googleAuthURL.toString(), 25 | }, 26 | }); 27 | response.headers.append("Set-Cookie", stateCookie); 28 | response.headers.append("Set-Cookie", codeVerifierCookie); 29 | response.headers.append("Set-Cookie", redirectCookie); 30 | console.log("Google OAuth Will Response URL>>>", googleAuthURL.toString()) 31 | return response; 32 | } catch (error) { 33 | console.error("Error during Google OAuth:", error); 34 | return new Response("Internal Server Error", { status: 500 }); 35 | } 36 | }; -------------------------------------------------------------------------------- /functions/api/auth.ts: -------------------------------------------------------------------------------- 1 | import { Lucia } from "lucia"; 2 | import { D1Adapter } from "@lucia-auth/adapter-sqlite"; 3 | import { D1Database } from "@cloudflare/workers-types"; 4 | import { GitHub, Google } from "arctic"; 5 | 6 | // 定义环境变量数据结构 7 | export interface Env { 8 | D1: D1Database; 9 | GITHUB_ID: string; 10 | GITHUB_SECRET: string; 11 | GOOGLE_CLIENT_ID: string; 12 | GOOGLE_CLIENT_SECRET: string; 13 | AUTH_SECRET: string; 14 | } 15 | 16 | export function initializeLucia(env: Env) { 17 | const adapter = new D1Adapter(env.D1, { 18 | user: "users", 19 | session: "session" 20 | }); 21 | 22 | const lucia = new Lucia(adapter, { 23 | sessionCookie: { 24 | attributes: { 25 | secure: true 26 | } 27 | }, 28 | getUserAttributes: (attributes) => { 29 | return { 30 | // attributes has the type of DatabaseUserAttributes 31 | githubId: attributes.github_id, 32 | googleId: attributes.google_id, 33 | username: attributes.username 34 | }; 35 | } 36 | }); 37 | 38 | return lucia; 39 | } 40 | 41 | // 定义Github认证初始化函数 42 | export function initializeGitHub(env: Env) { 43 | return new GitHub( 44 | env.GITHUB_ID, 45 | env.GITHUB_SECRET 46 | ); 47 | } 48 | 49 | export function initializeGoogle(env: Env) { 50 | return new Google(env.GOOGLE_CLIENT_ID, env.GOOGLE_CLIENT_SECRET, "https://diflowy.greenerai.top/api/auth/callback/google"); 51 | } 52 | 53 | // 定义用户属性接口 54 | interface DatabaseUserAttributes { 55 | github_id?: number; 56 | google_id?: number; 57 | username: string; 58 | } 59 | 60 | // 声明Lucia模块 61 | declare module "lucia" { 62 | interface Register { 63 | Lucia: ReturnType; 64 | DatabaseUserAttributes: DatabaseUserAttributes; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/content/blog/introducing-diflowy-community-and-features-zh.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Diflowy:用户驱动型 Dify Workflow 社区,让您更轻松地托管和分享工作流" 3 | pubDate: 2024-10-25 4 | description: 发布新的品牌形象和未来工作计划 5 | author: Greener-Dalii 6 | occupation: Founder of Diflowy Community 7 | heroImage: "/src/data/blog/001/HEROIMAGE.jpg" 8 | heroImageAlt: 'Blog Hero Image' 9 | tags: ["Official", "Announcement" ] 10 | lang: "zh" 11 | multiLanguage: 12 | - introducing-diflowy-community-and-features-en 13 | - introducing-diflowy-community-and-features-ja 14 | --- 15 | 16 | 很高兴与大家首次在Diflowy官方博客进行交流。在此,请允许我再次向大家介绍Diflowy社区: 17 | 18 | Diflowy是一个充满活力、开放且包容的用户驱动型社区,我们专注于推动Dify.AI工作流的探索、分享、托管与下载服务。目前,我们社区具备以下几大特性: 19 | 20 | - **私有托管**:我们采用数据库级AES-GCM加密存储技术,确保数据的安全性与完整性,适用于企业和个人的隐私托管需求。 21 | - **版本管理**:我们提供便捷的多版本Workflow文件管理功能,让您无需为版本管理而烦恼。 22 | - **实时预览**:通过节点图,您可以快速直观地了解Workflow的结构,一目了然。 23 | - **快捷导入**:支持通过URL一键导入至Dify.AI,操作简便,体验流畅。 24 | 25 | 为了确保社区的安全性,Diflowy的所有基础设施代码均已在[Github](https://github.com/green-dalii/diflowy)上开源,欢迎大家前来Star⭐️。 26 | 27 | 此外,我们非常高兴地推出了由[Greener-Dalii Studio](https://greenerdalii.top)精心设计的全新品牌形象,这不仅展现了Diflowy向更专业、更值得用户信赖的方向发展的愿景,也象征着我们对未来的坚定承诺。 28 | 29 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_01.jpg) 30 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_02.jpg) 31 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_03.jpg) 32 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_04.jpg) 33 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_05.jpg) 34 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_06.jpg) 35 | 36 | 在前期试运行阶段,Diflowy已吸引了超过200名来自全球的注册用户。其中,一些企业用户表达了希望增加类似Dify中的**工作区**(Workspace)功能,以实现成员间的协同工作。针对这一高级用户的需求,我们正全力以赴进行开发、测试,并计划在近期上线这一功能,敬请期待。 37 | 38 | ![Workspace_Support](../../data/blog/001/workspace.svg) 39 | 40 | 在开发过程中,我们热忱欢迎有工作区需求的客户申请内测使用。如需申请内测资格或提出其他功能建议,请发送邮件至diflowy@greenerai.top,或在[GitHub Discussions](https://github.com/green-dalii/diflowy/discussions)中与我们交流。 -------------------------------------------------------------------------------- /src/pages/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../styles/globals.css"; 10 | 11 | changeLanguage("en"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /public/nodeIcon/assigner.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages/ar/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("ar"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/pages/de/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("de"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/pages/es/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("es"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/pages/fr/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("fr"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/pages/it/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("it"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/pages/ja/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("ja"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/pages/ko/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("ko"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/pages/pt/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("pt"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/pages/ru/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("ru"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/pages/zh/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("zh"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /src/pages/zh-Hant/blog/tags/[tag].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { changeLanguage } from "i18next"; 3 | import MainLayout from "../../../../layouts/MainLayout.astro"; 4 | import SectionTitle from "../../../../components/ui/SectionTitle.astro"; 5 | import Section from "../../../../components/sections/Section.astro"; 6 | import Breadcrumbs from "../../../../components/ui/Breadcrumbs.astro"; 7 | import BlogCard from "../../../../components/ui/Blog-Card.astro"; 8 | import { getCollection } from "astro:content"; 9 | import "../../../../styles/globals.css"; 10 | 11 | changeLanguage("zh-Hant"); 12 | 13 | export async function getStaticPaths() { 14 | const allPosts = await getCollection("blog"); 15 | const uniqueTags = [ 16 | ...new Set(allPosts.map((post: any) => post.data.tags).flat()), 17 | ]; 18 | return uniqueTags.map((tag) => { 19 | const filteredPosts = allPosts.filter((post: any) => post.data.tags.includes(tag)); 20 | return { 21 | params: { tag }, 22 | props: { posts: filteredPosts }, 23 | }; 24 | }); 25 | } 26 | const urlList = Astro.url.pathname.split("/").filter(Boolean); 27 | const { tag } = Astro.params; 28 | const { posts } = Astro.props; 29 | const description = "We welcome your contributions on any Dify Workflow tips, tricks, case studies, and experiences to help the community."; 30 | --- 31 | 32 | 36 | 37 |
38 |
39 | 40 | 41 |

标签为: {tag} 的所有文章

42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 |
50 | -------------------------------------------------------------------------------- /public/nodeIcon/variable-aggregator.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /functions/crypto.ts: -------------------------------------------------------------------------------- 1 | export async function generateFileKey(userId: string, registrationTime: string, authSecret: string): Promise { 2 | // 组合用户特定信息创建密钥材料 3 | const keyMaterial = `${userId}-${registrationTime}-${authSecret}`; 4 | const encoder = new TextEncoder(); 5 | const data = encoder.encode(keyMaterial); 6 | 7 | // 使用 PBKDF2 派生密钥 8 | const baseKey = await crypto.subtle.importKey( 9 | "raw", 10 | data, 11 | "PBKDF2", 12 | false, 13 | ["deriveBits", "deriveKey"] 14 | ); 15 | 16 | // 生成用于加密的 AES-GCM 密钥 17 | return await crypto.subtle.deriveKey( 18 | { 19 | name: "PBKDF2", 20 | salt: encoder.encode(authSecret.slice(0, 16)), 21 | iterations: 100000, 22 | hash: "SHA-256" 23 | }, 24 | baseKey, 25 | { name: "AES-GCM", length: 256 }, 26 | true, 27 | ["encrypt", "decrypt"] 28 | ); 29 | } 30 | 31 | export async function encryptFile(content: Uint8Array, key: CryptoKey) { 32 | // 生成随机 IV 33 | const iv = crypto.getRandomValues(new Uint8Array(12)); 34 | 35 | // 加密数据 36 | const encryptedContent = await crypto.subtle.encrypt( 37 | { 38 | name: "AES-GCM", 39 | iv: iv 40 | }, 41 | key, 42 | content 43 | ); 44 | 45 | // 组合 IV 和加密数据 46 | const result = new Uint8Array(iv.length + encryptedContent.byteLength); 47 | result.set(iv, 0); 48 | result.set(new Uint8Array(encryptedContent), iv.length); 49 | 50 | return result; 51 | } 52 | 53 | export async function decryptFile(encryptedData: Uint8Array, key: CryptoKey) { 54 | // 提取 IV 55 | const iv = encryptedData.slice(0, 12); 56 | const content = encryptedData.slice(12); 57 | 58 | // 解密数据 59 | const decryptedContent = await crypto.subtle.decrypt( 60 | { 61 | name: "AES-GCM", 62 | iv: iv 63 | }, 64 | key, 65 | content 66 | ); 67 | 68 | return new Uint8Array(decryptedContent); 69 | } -------------------------------------------------------------------------------- /functions/planUtils.ts: -------------------------------------------------------------------------------- 1 | import type { Env } from './api/auth'; 2 | 3 | export interface CheckUserPlanResult { 4 | id: string; 5 | username: string; 6 | plan_type: string; 7 | expired: boolean; 8 | message: string; 9 | } 10 | 11 | interface queryResult { 12 | id: string; 13 | username: string; 14 | created_at: string; 15 | plan_type: string; 16 | plan_started_at: string; 17 | plan_expired_at: string; 18 | } 19 | 20 | export async function checkUserPlan(userId: string, env: Env) { 21 | // Get user plan information 22 | const userQuery = await env.D1.prepare( 23 | "SELECT id, username, plan_type, plan_expired_at FROM users WHERE id = ?" 24 | ).bind(userId).first() as queryResult; 25 | 26 | if (!userQuery) { 27 | throw new Error('User not found'); 28 | } 29 | 30 | const { id, username, plan_type, plan_expired_at } = userQuery; 31 | 32 | // Convert plan_expired_at to Date object 33 | const expiredAtDate = new Date(plan_expired_at); 34 | const currentTime = new Date(); 35 | 36 | // Check if plan is FREE 37 | if (plan_type === 'FREE') { 38 | return { 39 | id: id, 40 | username: username, 41 | plan_type: 'FREE', 42 | expired: false, 43 | message: 'Plan is FREE, cannot perform this action' 44 | } as CheckUserPlanResult; 45 | } 46 | 47 | // Check if plan is expired 48 | if (expiredAtDate < currentTime) { 49 | // If plan is expired, downgrade to FREE 50 | await env.D1.prepare( 51 | "UPDATE users SET plan_type =? WHERE id = ?" 52 | ).bind('FREE', userId).run(); 53 | 54 | return { 55 | id: id, 56 | username: username, 57 | plan_type: 'FREE', 58 | expired: true, 59 | message: 'Plan expired, downgraded to FREE' 60 | } as CheckUserPlanResult; 61 | } 62 | 63 | return { 64 | id: id, 65 | username: username, 66 | plan_type: plan_type, 67 | expired: false, 68 | message: 'Plan is valid' 69 | } as CheckUserPlanResult; 70 | } -------------------------------------------------------------------------------- /src/components/ui/DiscoverCard.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Image } from "astro:assets"; 3 | import { t } from "i18next"; 4 | import gob from "../../assets/icon8.svg"; 5 | import wob from "../../assets/icon7.svg"; 6 | import pob from "../../assets/icon6.svg"; 7 | 8 | const { index, titleTop, img, alt, link } = Astro.props; 9 | --- 10 | 11 | 44 | 45 | 50 | -------------------------------------------------------------------------------- /src/assets/logo-alt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/nodeIcon/iteration.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/seo/Seo.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import siteData from "../../data/siteData.json"; 3 | import jsonLDGenerator from "../../utils/jsonLD"; 4 | 5 | type Props = { 6 | // Pass title and description for internal pages 7 | // If not given, this defaults to site data 8 | // Url is automatic 9 | // Robots are optional 10 | // Frontmatter triggers a CMS post type 11 | title: string; 12 | description: string; 13 | url: string; 14 | image?: { src: string; alt: string }; 15 | robots?: boolean; 16 | frontmatter?: any; 17 | }; 18 | 19 | const { 20 | title, 21 | description, 22 | url = Astro.url, 23 | image, 24 | frontmatter, 25 | robots, 26 | } = Astro.props; 27 | 28 | // Again, frontmatter triggers CMS post type 29 | const jsonLD = jsonLDGenerator({ 30 | type: frontmatter ? "post" : "website", 31 | post: frontmatter, 32 | url, 33 | }); 34 | --- 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | {robots && } 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /src/content/blog/introducing-diflowy-community-and-features-ja.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Diflowy、Dify.AIワークフローを探索、共有、安全にホストするユーザー主導型コミュニティ 3 | pubDate: 2024-10-25 4 | description: Diflowyの新バンド編成と今後の仕事 5 | author: Greener-Dalii 6 | occupation: Founder of Diflowy Community 7 | heroImage: "/src/data/blog/001/HEROIMAGE.jpg" 8 | heroImageAlt: 'Blog Hero Image' 9 | tags: ["Official", "Announcement" ] 10 | lang: "ja" 11 | multiLanguage: 12 | - introducing-diflowy-community-and-features-en 13 | - introducing-diflowy-community-and-features-zh 14 | --- 15 | 16 | Diflowyの公式ブログで皆さんと初めて交流できることを大変うれしく思います。ここでは、Diflowyコミュニティについて再度ご紹介させていただきます: 17 | 18 | Diflowyは、活気があり、オープンで受け入れ態勢の整ったユーザー主導型コミュニティです。私たちは、Dify.AIのワークフローの探求、共有、ホスティング、ダウンロードサービスに焦点を当てています。現在、私たちのコミュニティには以下の特徴があります: 19 | 20 | - **プライベートホスティング**:データベースレベルのAES-GCM暗号化ストレージ技術を採用しており、データの安全性と完全性を確保しています。企業や個人のプライバシー保護に適しています。 21 | - **バージョン管理**:複数バージョンのWorkflowファイルを簡単に管理できる機能を提供しています。バージョン管理に頭を悩ませることなく、快適にご利用いただけます。 22 | - **リアルタイムプレビュー**:ノード図を活用することで、Workflowの構造を迅速かつ直感的に把握できます。一目で全体像がわかります。 23 | - **クイックインポート**:URLをワンクリックでDify.AIにインポートできる機能をサポートしており、操作が簡単で、スムーズな体験を提供しています。 24 | 25 | コミュニティの安全性を確保するために、Diflowyのすべてのインフラストラクチャコードは[Github](https://github.com/green-dalii/diflowy)でオープンソース化されています。ぜひStar⭐️をお願いします。 26 | 27 | また、私たちは[Greener-Dalii Studio](https://greenerdalii.top)が手がけた新しいブランドアイデンティティを誇りに思います。これにより、Diflowyがよりプロフェッショナルで、ユーザーに信頼される方向へと発展するビジョンが明確になりました。また、私たちの未来への強いコミットメントも象徴しています。 28 | 29 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_01.jpg) 30 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_02.jpg) 31 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_03.jpg) 32 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_04.jpg) 33 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_05.jpg) 34 | ![Rebranding_Diflowy](../../data/blog/001/rebranding_diflowy_06.jpg) 35 | 36 | 試験運用段階では、Diflowyには世界中から200人以上の登録ユーザーが集まりました。その中でも、一部の企業ユーザーから、メンバー間での共同作業を実現するDifyの**ようなワークスペース**(Workspace)機能の追加を希望する声がありました。この高級ユーザーのニーズに対応するため、私たちは開発とテストに全力を尽くしており、近日中にこの機能の提供を開始する予定です。ぜひお楽しみに。 37 | 38 | ![Workspace_Support](../../data/blog/001/workspace.svg) 39 | 40 | 開発プロセスにおいて、ワークスペース機能が必要なお客様のベータテスト参加を熱烈に歓迎しています。ベータテストの参加申請やその他の機能提案についてお気軽にお問い合わせください。メールはdiflowy@greenerai.topまで、または[GitHub Discussions](https://github.com/green-dalii/diflowy/discussions)を通じてご連絡ください。 -------------------------------------------------------------------------------- /src/assets/pics/feature2.svg: -------------------------------------------------------------------------------- 1 | V4.0V3.0V2.0V1.0 -------------------------------------------------------------------------------- /README_CN.md: -------------------------------------------------------------------------------- 1 | # Diflowy 2 | 3 | ![Diflowy](og_cn.jpg) 4 | 5 | > Dify Workflows的分享、发现、下载和托管平台 6 | 7 | ### [🌐 立刻访问 → Diflowy](https://diflowy.greenerai.top/) 8 | 9 | [English](README.md) | 简体中文 | [日本語](README_JP.md) 10 | 11 | ## 🚀 简介 12 | 13 | Diflowy是一个充满活力的社区平台,致力于Dify工作流的分享、发现、下载和托管。在这里,你可以: 14 | 15 | - 🔗 连接全球Dify爱好者 16 | - 🎨 分享你的创意作品 17 | - 🔍 发现适合你项目的工作流 18 | - 💾 托管你的工作流并与合作伙伴一起协同工作 19 | 20 | ## 🌟 特性 21 | 22 | - 🔒 **私有托管模式**: 采用数据库级AES-GCM加密存储,确保数据安全与完整性,可用于企业、个人的隐私托管应用场景 23 | - 📂 **版本管理**: 便捷管理多版本 Workflow 文件,不用在为多版本文件管理而烦恼 24 | - 👥 **协同工作**: 与合作伙伴在工作区内高效地协作,同步文件进度 25 | - 📊 **实时预览**: 通过节点图快速可视化 Workflow 结构,一目了然 26 | - 📦 **快捷导入**: 支持通过URL一键导入至 Dify.AI,体验丝滑 27 | - 👥 **用户驱动**: 由你我共同贡献和受益的 Workflow 知识库 28 | - 🔔 **动态更新**: 及时了解 Dify Workflow 的最新趋势 29 | 30 | 31 | ## 🌍 社区 32 | 33 | 加入我们充满创新的社区吧! 无论你是经验丰富的开发者还是新手,Diflowy都有你的一席之地。 34 | 35 | ## 🤝 贡献 36 | 37 | 你的贡献是Diflowy蓬勃发展的动力。请查阅`CONTRIBUTING.md`了解行为准则和提交Pull Request的流程。也可以在[Discussions](https://github.com/green-dalii/diflowy/discussions)中提出你的想法。 38 | 39 | ## 📄 许可证 40 | 41 | 本项目采用MIT许可证 - 详情请见`LICENSE.md`文件。 42 | 43 | ## 💖 致谢 44 | 45 | Diflowy的诞生离不开以下项目的支持: 46 | 47 | - [Dify](https://github.com/langgenius/dify): The Innovation Engine for GenAI Applications. 48 | - [Astro](https://astro.build/): The web framework for content-driven websites 49 | - [TailwindCSS](https://tailwindcss.com/): Rapidly build modern websites without ever leaving your HTML. 50 | - [ReactFlow](https://reactflow.dev/): Wire Your Ideas with React Flow 51 | - [Color4bg.JS](https://github.com/winterx/color4bg.js): Super easily generate dynamic, abstract, and visually stunning background images for your web pages based on WebGL and JavaScript. 52 | - [Cloudflare](https://www.cloudflare.com): Powered by Cloudflare Pages and Cloudflare D1 Database 53 | - This Website is inspired by project: [vasquez-esteban/Kreativ-Software](https://github.com/vasquez-esteban/kreativ-software) 54 | - [Awesome-Dify-Workflow](https://github.com/svcvit/Awesome-Dify-Workflow): Sharing some Dify workflows. 55 | - [Dify101](https://dify101.com/): Dify tutorial: Unlock the power of Dify.ai. 56 | 57 | 58 | ## 🎉 开始探索吧! 59 | 60 | 我们期待你能在Diflowy社区中找到乐趣。让我们一起创造精彩! 61 | 62 | ## 🗺️ 路线图 63 | 64 | - [x] Diflowy社区上线 65 | - [x] 版本管理支持 66 | - [x] 用于工作流的隐私托管模式 67 | - [x] 国际化多语言支持 68 | - [x] 使用谷歌账户和邮箱登录 69 | - [x] 应用 Dify 官方工作流样式 70 | - [x] 隐私托管文件实现数据库层面 AES-GCM 加密 71 | - [x] 针对高级用户增加工作区协作支持 72 | - [ ] 对上传工作流进行 AI 自动摘要描述 73 | - [ ] 搜索和筛选工作流 74 | -------------------------------------------------------------------------------- /public/nodeIcon/llm.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README_JP.md: -------------------------------------------------------------------------------- 1 | # Diflowy 2 | 3 | ![Diflowy](og_ja.jpg) 4 | 5 | > Difyワークフローの共有・発見・ダウンロードプラットフォーム 6 | 7 | ### [🌐 今すぐアクセス → Diflowy](https://diflowy.greenerai.top/) 8 | 9 | [English](README.md) | [简体中文](README_CN.md) | 日本語 10 | 11 | ## 🚀 概要 12 | 13 | Diflowyは、Difyワークフローのための活気あるコミュニティプラットフォームです。ここでは: 14 | 15 | - 🔗 世界中のDify愛好者とつながる 16 | - 🎨 あなたの創造的なワークフローを共有する 17 | - 🔍 プロジェクトに適したワークフローを見つける 18 | - 💾 ワークフローのホスティングとパートナーとのコラボレーション 19 | 20 | ## 🌟 特徴 21 | 22 | - 🔒 **プライベートホスティングモード**: データベースレベルのAES-GCM暗号化ストレージを採用し、データの安全性と完全性を確保します。そして、企業や個人のプライバシーホスティングアプリケーションシナリオに適用可能です。 23 | - 📂 **バージョン管理**: 複数バージョンのWorkflowファイルを簡単に管理できます。 24 | - 👥 **コラボレーティブ・ワーキング**: ワークスペース上でパートナーと効率的にコラボレーションし、Dify Workflowの進捗を同期します。 25 | - 📊 **リアルタイムプレビュー**: ノードグラフを通じてWorkflowの構造を迅速に可視化し、一目でわかります。 26 | - 📦 **クイックインポート**: URLを介してDify.AIに迅速にインポートできます。 27 | - 👥 **ユーザー主導**: あなたと私が共同で貢献し、利益を得るWorkflowの知識ベース。 28 | - 🔔 **ダイナミックアップデート**: Dify Workflowの最新動向をリアルタイムで追えます。 29 | 30 | ## 🌍 コミュニティ 31 | 32 | 革新的なコミュニティに参加しませんか?経験豊富な開発者も初心者も、Diflowyには皆様の居場所があります。 33 | 34 | ## 🤝 貢献 35 | 36 | 皆様の貢献がDiflowyを発展させます。行動規範とプルリクエストのプロセスについては`CONTRIBUTING.md`をご覧ください。 37 | 38 | ## 📄 ライセンス 39 | 40 | 本プロジェクトはMITライセンスの下で公開されています。詳細は`LICENSE.md`をご参照ください。 41 | 42 | ## 💖 謝辞 43 | 44 | Diflowyは以下のプロジェクトのサポートなしでは実現できませんでした: 45 | 46 | - [Dify](https://github.com/langgenius/dify): GenAIアプリケーションのイノベーションエンジン 47 | - [Astro](https://astro.build/): コンテンツ駆動型ウェブサイトのためのウェブフレームワーク 48 | - [TailwindCSS](https://tailwindcss.com/): HTMLを離れることなく、現代的なウェブサイトを高速に構築 49 | - [ReactFlow](https://reactflow.dev/): React Flowであなたのアイデアを形にする 50 | - [Color4bg.JS](https://github.com/winterx/color4bg.js): WebGL と JavaScript を使用して、動的で抽象的で、視覚的に印象的な背景画像を簡単に生成します 51 | - [Cloudflare](https://www.cloudflare.com): Cloudflare PagesとCloudflare D1データベースを活用 52 | - 本ウェブサイトは以下のプロジェクトにインスピレーションを受けています: [vasquez-esteban/Kreativ-Software](https://github.com/vasquez-esteban/kreativ-software) 53 | - [Awesome-Dify-Workflow](https://github.com/svcvit/Awesome-Dify-Workflow): いくつかのDifyのワークフローを共有します 54 | - [Dify101](https://dify101.com/): Difyチュートリアル: Dify.aiの力を最大限に引き出します 55 | 56 | ## 🎉 さあ、始めましょう! 57 | 58 | Diflowyコミュニティの一員となり、共に素晴らしいものを作り上げていきましょう! 59 | 60 | ## 🗺️ ロードマップ 61 | 62 | - [x] Diflowyコミュニティの立ち上げ 63 | - [x] バージョン管理のサポート (複数バージョンのワークフローを管理できます) 64 | - [x] ワークフロー用のプライバシーマネージドモード 65 | - [x] 国際化のサポート (複数言語に対応します) 66 | - [x] Google アカウントとメールアドレスでログイン 67 | - [x] Dify の公式ワークフロースタイルを適用し、一貫性を保ちます 68 | - [x] プライベートなホストファイルのデータベースレベルの暗号化 69 | - [x] 上級ユーザー向けにワークスペース・コラボレーションのサポートを追加 70 | - [ ] AI がアップロードされたワークフローを自動的に要約し、その内容を説明します 71 | - [ ] ワークフローを簡単に検索し、必要なものだけを絞り込むことができます 72 | -------------------------------------------------------------------------------- /src/components/ui/PrivateHostedToogle.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Alert from "./Alert.astro"; 3 | import { t } from "i18next"; 4 | 5 | const { 6 | disable = false, 7 | flexDirection = "col", 8 | isTitled = false, 9 | title = "Public or Private-Hosted", 10 | publicAlertMsg, 11 | privateAlertMsg 12 | } = Astro.props; 13 | --- 14 | 15 |
16 | 19 |
20 |
21 |

22 | 🌐 {t("uploadpage.publicmode")}(Default) 24 |

25 | 32 |

🔒 {t("uploadpage.privatemode")}

33 |
34 | 35 | 37 |
38 |
39 | 40 | 69 | --------------------------------------------------------------------------------