feat: new en offical web
|
@ -1,3 +0,0 @@
|
|||
node_modules
|
||||
build
|
||||
.next
|
3
website/en/.eslintrc
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"extends": "next/core-web-vitals"
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"extends": "next/core-web-vitals"
|
||||
}
|
11
website/en/.gitignore
vendored
|
@ -4,7 +4,6 @@
|
|||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
.yarn/install-state.gz
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
@ -26,11 +25,13 @@ yarn-debug.log*
|
|||
yarn-error.log*
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
.vscode
|
|
@ -1,36 +1,49 @@
|
|||
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
||||
# Next.js + ButterCMS Starter Project
|
||||
Live Demo: https://nextjs-starter-buttercms.vercel.app/
|
||||
|
||||
## Getting Started
|
||||
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FButterCMS%2Fnextjs-starter-buttercms&env=NEXT_PUBLIC_BUTTER_CMS_API_KEY&envDescription=Your%20ButterCMS%20API%20Token&envLink=https%3A%2F%2Fbuttercms.com%2Fsettings%2F&project-name=nextjs-starter-buttercms&repo-name=nextjs-starter-buttercms&redirect-url=https%3A%2F%2Fbuttercms.com%2Fonboarding%2Fvercel-starter-deploy-callback%2F&production-deploy-hook=Deploy%20Triggered%20from%20ButterCMS&demo-title=ButterCMS%20Next.js%20Starter&demo-description=Fully%20integrated%20with%20your%20ButterCMS%20account&demo-url=https%3A%2F%2Fnextjs-starter-buttercms.vercel.app%2F&demo-image=https://cdn.buttercms.com/r0tGK8xFRti2iRKBJ0eY&repository-name=nextjs-starter-buttercms)
|
||||
|
||||
First, run the development server:
|
||||
[](https://heroku.com/deploy?template=https://github.com/ButterCMS/nextjs-starter-buttercms&env%5BNEXT_PUBLIC_BUTTER_CMS_API_KEY%5D=check%20https://buttercms.com/settings)
|
||||
|
||||
This Next.js starter project fully integrates with dynamic sample content from your ButterCMS account, including main menu, pages, blog posts, categories, and tags, all with a beautiful, custom theme with already-implemented search functionality. All of the included sample content is automatically created in your account dashboard when you sign up for a free trial of ButterCMS.
|
||||
|
||||
A copy of this starter project can be easily and quickly deployed to Vercel or Heroku with the click of a button.
|
||||
## 1) Installation
|
||||
|
||||
First, install the dependencies by cloning the repo and running one of the following commands, depending on your current setup:
|
||||
```bash
|
||||
npm run dev
|
||||
# or
|
||||
yarn dev
|
||||
# or
|
||||
pnpm dev
|
||||
# or
|
||||
bun dev
|
||||
git clone https://github.com/ButterCMS/nextjs-starter-buttercms.git
|
||||
cd nextjs-starter-buttercms
|
||||
npm install # or yarn install
|
||||
```
|
||||
|
||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
||||
## 2) Set API Token
|
||||
|
||||
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
||||
To fetch your ButterCMS content, add your API token as an environment variable.
|
||||
|
||||
This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
|
||||
```bash
|
||||
$ echo 'NEXT_PUBLIC_BUTTER_CMS_API_KEY=<Your API Token>' >> .env
|
||||
```
|
||||
|
||||
## Learn More
|
||||
## 3) Run the local server
|
||||
|
||||
To learn more about Next.js, take a look at the following resources:
|
||||
To view the app in a browser, you'll need to run the local development server:
|
||||
|
||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
||||
```bash
|
||||
npm run dev # or yarn dev
|
||||
```
|
||||
|
||||
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
|
||||
Congratulations! Your starter project is now live: [http://localhost:3000](http://localhost:3000).
|
||||
|
||||
## Deploy on Vercel
|
||||
## 4) Deploy
|
||||
|
||||
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
||||
Deploy your Butterized proof of concept app and spread your love of Butter, to either
|
||||
Vercel, the creators of Next.js, or to Heroku. With the click of a button, you'll create a copy of our starter project in your Git provider account, instantly deploy it, and institute a full content workflow connected to your ButterCMS account. Smooth.
|
||||
|
||||
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
|
||||
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FButterCMS%2Fnextjs-starter-buttercms&env=NEXT_PUBLIC_BUTTER_CMS_API_KEY&envDescription=Your%20ButterCMS%20API%20Token&envLink=https%3A%2F%2Fbuttercms.com%2Fsettings%2F&project-name=nextjs-starter-buttercms&repo-name=nextjs-starter-buttercms&redirect-url=https%3A%2F%2Fbuttercms.com%2Fonboarding%2Fvercel-starter-deploy-callback%2F&production-deploy-hook=Deploy%20Triggered%20from%20ButterCMS&demo-title=ButterCMS%20Next.js%20Starter&demo-description=Fully%20integrated%20with%20your%20ButterCMS%20account&demo-url=https%3A%2F%2Fnextjs-starter-buttercms.vercel.app%2F&demo-image=https://cdn.buttercms.com/r0tGK8xFRti2iRKBJ0eY&repository-name=nextjs-starter-buttercms)
|
||||
|
||||
[](https://heroku.com/deploy?template=https://github.com/ButterCMS/nextjs-starter-buttercms&env%5BNEXT_PUBLIC_BUTTER_CMS_API_KEY%5D=check%20https://buttercms.com/settings)
|
||||
|
||||
## 5) Previewing
|
||||
|
||||
Your starter project is automatically configured to show draft changes saved in your Butter account when run locally or deployed to a hosting provider. To disable this behavior, set the following value in your .env file: PREVIEW=false.
|
||||
|
|
18
website/en/app.json
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "ButterCMS NextJS Starter Project ",
|
||||
"description": "Drop-in proof-of-concept NextJs app, fully integrated with your ButterCMS account.",
|
||||
"repository": "https://github.com/ButterCMS/nextjs-starter-buttercms",
|
||||
"logo": "https://cdn.buttercms.com/R3fbtvoRT2CqEQSmk8hb",
|
||||
"keywords": ["Next.js", "buttercms", "cms", "blog"],
|
||||
"buildpacks": [
|
||||
{
|
||||
"url": "heroku/nodejs"
|
||||
}
|
||||
],
|
||||
"env": {
|
||||
"NEXT_PUBLIC_BUTTER_CMS_API_KEY": {
|
||||
"description": "The API token of your ButterCMS account",
|
||||
"value": ""
|
||||
}
|
||||
}
|
||||
}
|
12
website/en/components/author-card.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
export default function AuthorCard({ author }) {
|
||||
const authorAvatar = author.profile_image ? author.profile_image : '/images/team/team-1.png'
|
||||
return (
|
||||
<a>
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
<img
|
||||
src={authorAvatar}
|
||||
alt={`Profile image ${author.first_name} ${author.last_name}`} />
|
||||
{author.first_name} {author.last_name}
|
||||
</a>
|
||||
)
|
||||
}
|
80
website/en/components/footer-section.js
Normal file
|
@ -0,0 +1,80 @@
|
|||
import Image from "next/image";
|
||||
|
||||
export default function FooterSection({}) {
|
||||
const links = [].map((link) => ({
|
||||
...link,
|
||||
url: link.url[0] === "#" ? `/${link.url}` : link.url,
|
||||
}));
|
||||
|
||||
return (
|
||||
<footer className="footer pt-120">
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
<div className="col-xl-3 col-lg-4 col-md-6 col-sm-10">
|
||||
<div className="footer-widget">
|
||||
<div className="logo">
|
||||
<img
|
||||
src="/images/logo.png"
|
||||
alt="Logo"
|
||||
width={190}
|
||||
height={46}
|
||||
style={{
|
||||
maxWidth: "100%",
|
||||
height: "auto",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<p className="desc">The Best WAF for Webmaster</p>
|
||||
<ul className="social-links">
|
||||
<li>
|
||||
<a href="https://discord.gg/wyshSVuvxC" target="_blank">
|
||||
<svg className="icon_svg" width="24px">
|
||||
<use xlinkHref="#icon-discord" />
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://github.com/chaitin/SafeLine" target="_blank">
|
||||
<svg className="icon_svg" width="24px">
|
||||
<use xlinkHref="#icon-github-fill" />
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div className="col-xl-5 col-lg-4 col-md-12 col-sm-12 offset-xl-1">
|
||||
<div className="footer-widget">
|
||||
<h3>About Us</h3>
|
||||
<ul className="links">
|
||||
<li>
|
||||
<a
|
||||
href="https://docs.waf.chaitin.com/"
|
||||
target="_blank"
|
||||
style={{ textDecoration: "none", color: "unset" }}
|
||||
>
|
||||
Docs
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="col-xl-3 col-lg-4 col-md-6">
|
||||
<div className="footer-widget">
|
||||
<p>
|
||||
SafeLine is a simple, lightweight, locally deployable WAF that
|
||||
protects your website from network attacks that including OWASP
|
||||
attacks ...
|
||||
</p>
|
||||
{/* <form action="#">
|
||||
<input type="email" placeholder="Email" />
|
||||
<button className="main-btn btn-hover">Subscribe</button>
|
||||
</form> */}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
);
|
||||
}
|
53
website/en/components/header-section.js
Normal file
|
@ -0,0 +1,53 @@
|
|||
import { useEffect, useState, useRef } from "react";
|
||||
|
||||
import Image from "next/image";
|
||||
|
||||
import MainMenu from "./main-menu/main-menu";
|
||||
|
||||
export default function HeaderSection() {
|
||||
const [isNavbarSticky, setIsNavbarSticky] = useState(false);
|
||||
const navbarAreaEl = useRef(null);
|
||||
|
||||
function fixNavBar() {
|
||||
if (navbarAreaEl.current) {
|
||||
setIsNavbarSticky(window.pageYOffset > navbarAreaEl.current.offsetTop);
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
window.addEventListener("scroll", fixNavBar);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener("scroll", fixNavBar);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<header className="header">
|
||||
<div
|
||||
ref={navbarAreaEl}
|
||||
className={`navbar-area ${isNavbarSticky ? "sticky" : ""}`}
|
||||
>
|
||||
<div className="container">
|
||||
<div className="row align-items-center">
|
||||
<div className="col-lg-12">
|
||||
<nav className="navbar navbar-expand-lg">
|
||||
<img
|
||||
src="/images/logo.png"
|
||||
alt="Logo"
|
||||
width={190}
|
||||
height={46}
|
||||
style={{
|
||||
maxWidth: "100%",
|
||||
height: "auto",
|
||||
}}
|
||||
/>
|
||||
<MainMenu />
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
);
|
||||
}
|
6
website/en/components/human-date.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
import { parseISO, format } from "date-fns";
|
||||
|
||||
export default function HumanDate({ dateString }) {
|
||||
const date = parseISO(dateString);
|
||||
return <time dateTime={dateString}>{format(date, "MMM d, yyyy")}</time>;
|
||||
}
|
22
website/en/components/landing-page-sections/feature.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
import Image from "next/image";
|
||||
|
||||
export default function Feature({ headline, description, icon }) {
|
||||
return (
|
||||
<div className="col-lg-4 col-md-4">
|
||||
<div className="single-feature">
|
||||
<div className="feature-icon">
|
||||
<svg
|
||||
className="icon_svg"
|
||||
style={{ width: "20px", height: "20px", marginLeft: "8px" }}
|
||||
>
|
||||
<use xlinkHref={`#${icon}`} />
|
||||
</svg>
|
||||
</div>
|
||||
<div className="feature-content">
|
||||
<h4>{headline}</h4>
|
||||
<p>{description}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
66
website/en/components/landing-page-sections/features.js
Normal file
|
@ -0,0 +1,66 @@
|
|||
import Feature from "./feature";
|
||||
|
||||
export default function Features({
|
||||
headline,
|
||||
subheadline,
|
||||
features,
|
||||
scrollAnchorId,
|
||||
}) {
|
||||
return (
|
||||
<section id={scrollAnchorId} className="feature-section">
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
<div className="col-lg-12" style={{ paddingLeft: "12px" }}>
|
||||
<div className="row">
|
||||
{[
|
||||
{
|
||||
headline: "Defenses For OWASP Attacks",
|
||||
description:
|
||||
"SafeLine use as an important tool to defense against OWASP Top 10 Attack, such as SQL injection, XSS, Insecure deserialization etc.",
|
||||
icon: "icon-OWASP",
|
||||
},
|
||||
{
|
||||
headline: "Defenses For 0-Day Attacks",
|
||||
description:
|
||||
"SafeLine use intelligent rule-free detection algorithm to against 0-Day attacks with unknown attack signatures.",
|
||||
icon: "icon-a-0day",
|
||||
},
|
||||
{
|
||||
headline: "Proactive Bot defense",
|
||||
description:
|
||||
"SafeLine uses advanced algorithms to send capthcha challenge for suspicious users to against automated robot attacks.",
|
||||
icon: "icon-zhudongfangyu",
|
||||
},
|
||||
{
|
||||
headline: "In-Browser Code Encryption",
|
||||
description:
|
||||
"SafeLine can dynamically encrypt and obfuscate static code in the browser (such as HTML, JavaScript) to against reverse engineering.",
|
||||
icon: "icon-liulanqidaimajiami",
|
||||
},
|
||||
{
|
||||
headline: "Web Authentication",
|
||||
description:
|
||||
"SafeLine prompting the user for authentication to web apps that lacks valid authentication credentials, Illegal users will be blocked.",
|
||||
icon: "icon-shenfenyanzheng",
|
||||
},
|
||||
{
|
||||
headline: "Web Access Control List",
|
||||
description:
|
||||
"SafeLine offering fine-grained control over traffic allows you to define a set of rules that determine which requests are allowed or denied.",
|
||||
icon: "icon-a-Webkongzhifangwen",
|
||||
},
|
||||
].map(({ headline, description, icon }) => (
|
||||
<Feature
|
||||
key={headline}
|
||||
headline={headline}
|
||||
description={description}
|
||||
icon={icon}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
92
website/en/components/landing-page-sections/hero.js
Normal file
|
@ -0,0 +1,92 @@
|
|||
import { useEffect } from "react";
|
||||
|
||||
export default function Hero({ scrollAnchorId }) {
|
||||
useEffect(() => {
|
||||
import("tiny-slider").then(({ tns }) => {
|
||||
tns({
|
||||
container: ".testimonial-active",
|
||||
autoplay: true,
|
||||
autoplayTimeout: 3000,
|
||||
autoplayButtonOutput: false,
|
||||
mouseDrag: true,
|
||||
gutter: 0,
|
||||
nav: false,
|
||||
navPosition: "bottom",
|
||||
controls: false,
|
||||
autoplayHoverPause: true,
|
||||
items: 1,
|
||||
});
|
||||
const testimonialDom = document.getElementsByClassName(
|
||||
"testimonial-active-wrapper"
|
||||
)?.[0];
|
||||
testimonialDom.style.display = "block";
|
||||
});
|
||||
}, []);
|
||||
return (
|
||||
<section id={scrollAnchorId} className="hero-section">
|
||||
<div className="container">
|
||||
<div className="row align-items-center">
|
||||
<div className="col-xl-6 col-lg-6 col-md-10">
|
||||
<div className="hero-content" style={{ color: "#000" }}>
|
||||
<h1
|
||||
style={{
|
||||
fontFamily: "GilroyBold",
|
||||
fontSize: 70,
|
||||
marginBottom: "3px",
|
||||
}}
|
||||
>
|
||||
SafeLine
|
||||
</h1>
|
||||
<h2
|
||||
style={{
|
||||
fontFamily: "GilroyBold",
|
||||
fontSize: 36,
|
||||
margin: "4px auto 14px auto",
|
||||
}}
|
||||
>
|
||||
The Best WAF For Webmaster
|
||||
</h2>
|
||||
<p style={{ letterSpacing: "1px", color: "rgba(0, 0, 0, 0.7)" }}>
|
||||
SafeLine is a simple, lightweight, locally deployable WAF that
|
||||
protects your website from network attacks that including OWASP
|
||||
attacks, zero-day attacks, web crawlers, vulnerability scanning,
|
||||
vulnerability exploit, http flood and so on.
|
||||
</p>
|
||||
<a
|
||||
href="https://docs.waf.chaitin.com/en/toturials/install"
|
||||
className="main-btn btn-hover"
|
||||
target="_blank"
|
||||
>
|
||||
Get Started
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="col-xxl-6 col-xl-6 col-lg-6 testimonial-section">
|
||||
<div className="hero-image text-center text-lg-end">
|
||||
<div
|
||||
className="testimonial-active-wrapper"
|
||||
style={{
|
||||
display: "none",
|
||||
borderRadius: "12px",
|
||||
overflow: "hidden",
|
||||
boxShadow: "0 30px 50px rgba(145,158,171,0.3);",
|
||||
}}
|
||||
>
|
||||
<div className="testimonial-active">
|
||||
{Array.from({ length: 4 }).map((_, index) => (
|
||||
<img
|
||||
key={index}
|
||||
src={`/images/screenshot-${index}.png`}
|
||||
className="single-testimonial"
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
import camelcaseKeys from "camelcase-keys";
|
||||
;
|
||||
import MissingSection from "./missing-section";
|
||||
import hero from "@/components/landing-page-sections/hero";
|
||||
import two_column_with_image from "@/components/landing-page-sections/two-column-with-image";
|
||||
import features from "@/components/landing-page-sections/features";
|
||||
import testimonials from "@/components/landing-page-sections/testimonials";
|
||||
|
||||
export default function LandingPageSection({ sectionData }) {
|
||||
const sectionsComponentPaths = () => ({
|
||||
hero,
|
||||
two_column_with_image,
|
||||
features,
|
||||
testimonials,
|
||||
});
|
||||
const SectionComponent = sectionsComponentPaths();
|
||||
|
||||
return <SectionComponent type={type} {...camelcaseKeys(sectionData)} />;
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
export default function MissingSection({ type, ...sectionData }) {
|
||||
console.log(`Missing section ${type} data ${sectionData}`)
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h3>Missing a template for {type}</h3>
|
||||
<p>Check console for component details</p>
|
||||
</div>
|
||||
)
|
||||
}
|
16
website/en/components/landing-page-sections/testimonial.js
Normal file
|
@ -0,0 +1,16 @@
|
|||
export default function Testimonial({ quote, name, title }) {
|
||||
return (
|
||||
<div className="single-testimonial">
|
||||
<div className="quote">
|
||||
<i className="lni lni-quotation"></i>
|
||||
</div>
|
||||
<div className="content">
|
||||
<p>{quote}</p>
|
||||
</div>
|
||||
<div className="info">
|
||||
<h6>{name}</h6>
|
||||
<p>{title}</p>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
46
website/en/components/landing-page-sections/testimonials.js
Normal file
|
@ -0,0 +1,46 @@
|
|||
import { useEffect } from "react";
|
||||
|
||||
import Testimonial from "./testimonial";
|
||||
|
||||
export default function Testimonials({
|
||||
headline,
|
||||
testimonial: testimonials,
|
||||
scrollAnchorId,
|
||||
}) {
|
||||
useEffect(() => {
|
||||
import("tiny-slider").then(({ tns }) => {
|
||||
tns({
|
||||
container: ".testimonial-active",
|
||||
autoplay: true,
|
||||
autoplayTimeout: 3000,
|
||||
autoplayButtonOutput: false,
|
||||
mouseDrag: true,
|
||||
gutter: 0,
|
||||
nav: false,
|
||||
navPosition: "bottom",
|
||||
controls: false,
|
||||
// controlsText: [
|
||||
// '<i class="lni lni-chevron-left"></i>',
|
||||
// '<i class="lni lni-chevron-right"></i>',
|
||||
// ],
|
||||
items: 1,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
return (
|
||||
<section id={scrollAnchorId} className="testimonial-section mt-100">
|
||||
<div className="container">
|
||||
<div className="row justify-content-center">
|
||||
<div className="col-xl-7 col-lg-9"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="testimonial-active-wrapper">
|
||||
<div className="testimonial-active">
|
||||
<Testimonial quote="1" name="2" title="3" />
|
||||
<Testimonial quote="4" name="5" title="6" />
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
import Image from "next/image";
|
||||
|
||||
export default function TwoColumnWithImage({
|
||||
headline,
|
||||
subheadline,
|
||||
image,
|
||||
imagePosition,
|
||||
scrollAnchorId,
|
||||
}) {
|
||||
return (
|
||||
<section id={scrollAnchorId} className="cta-section">
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
{image && imagePosition === "left" && (
|
||||
<div className="col-lg-6 order-last order-lg-first">
|
||||
<div className="left-image cta-image ">
|
||||
<Image
|
||||
src={`/images/${image}`}
|
||||
height={400}
|
||||
width={600}
|
||||
alt=""
|
||||
sizes="100vw"
|
||||
style={{
|
||||
width: "100%",
|
||||
height: "auto",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<div className="col-lg-6">
|
||||
<div className="cta-content-wrapper">
|
||||
<div className="section-title">
|
||||
<h2 className="mb-20">{headline}</h2>
|
||||
<div
|
||||
style={{ color: "rgba(0,0,0,0.7)" }}
|
||||
dangerouslySetInnerHTML={{ __html: subheadline }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{image && imagePosition === "right" && (
|
||||
<div className="col-lg-6">
|
||||
<div className="right-image cta-image text-lg-end">
|
||||
<Image
|
||||
src={`/images/${image}`}
|
||||
height={400}
|
||||
width={600}
|
||||
alt=""
|
||||
sizes="100vw"
|
||||
style={{
|
||||
width: "100%",
|
||||
height: "auto",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
9
website/en/components/main-menu/main-menu-link.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
export default function MainMenuLink({ url, label, active, callbackOnClick }) {
|
||||
return (
|
||||
<li className="nav-item" onClick={callbackOnClick}>
|
||||
<a className={`page-scroll ${active ? "active" : ""}`} href={`/${url}`}>
|
||||
{label}
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
}
|
144
website/en/components/main-menu/main-menu.js
Normal file
|
@ -0,0 +1,144 @@
|
|||
import { useEffect, useState, useRef } from "react";
|
||||
|
||||
export default function ManiMenu() {
|
||||
const mainMenuLinks = [
|
||||
{ meta: { id: 740351 }, label: "Docs", url: "#home" },
|
||||
{ meta: { id: 740352 }, label: "Pricing", url: "#about" },
|
||||
{ meta: { id: 740353 }, label: "Discord", url: "#features" },
|
||||
{ meta: { id: 740354 }, label: "GitHub", url: "#tryit" },
|
||||
{ meta: { id: 740355 }, label: "Demo", url: "#testimonials" },
|
||||
];
|
||||
|
||||
function highlightLinks() {
|
||||
const sections = document.querySelectorAll(".page-scroll");
|
||||
const scrollPos =
|
||||
window.pageYOffset ||
|
||||
document.documentElement.scrollTop ||
|
||||
document.body.scrollTop;
|
||||
|
||||
sections.forEach((currLink) => {
|
||||
const val = currLink.getAttribute("href").slice(1);
|
||||
if (val[0] !== "#") {
|
||||
return;
|
||||
}
|
||||
const refElement = document.querySelector(val);
|
||||
|
||||
if (!refElement) {
|
||||
return;
|
||||
}
|
||||
|
||||
const scrollTopMinus = scrollPos + 73;
|
||||
|
||||
if (
|
||||
refElement.offsetTop <= scrollTopMinus &&
|
||||
refElement.offsetTop + refElement.offsetHeight > scrollTopMinus
|
||||
) {
|
||||
setActiveMenuLink(val);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
window.addEventListener("scroll", highlightLinks);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener("scroll", highlightLinks);
|
||||
};
|
||||
}, []);
|
||||
|
||||
const [isMenuActive, setMenuActive] = useState(false);
|
||||
const menuLinksEl = useRef(null);
|
||||
|
||||
function inactivateMenu() {
|
||||
setMenuActive(false);
|
||||
if (menuLinksEl.current) {
|
||||
menuLinksEl.current.classList.remove("show");
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<button
|
||||
className={`navbar-toggler ${isMenuActive ? "active" : ""}`}
|
||||
type="button"
|
||||
data-bs-toggle="collapse"
|
||||
data-bs-target="#navbarSupportedContent"
|
||||
aria-controls="navbarSupportedContent"
|
||||
aria-expanded="false"
|
||||
aria-label="Toggle navigation"
|
||||
onClick={() => setMenuActive(!isMenuActive)}
|
||||
>
|
||||
<span className="toggler-icon"></span>
|
||||
<span className="toggler-icon"></span>
|
||||
<span className="toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div
|
||||
className="collapse navbar-collapse sub-menu-bar"
|
||||
ref={menuLinksEl}
|
||||
id="navbarSupportedContent"
|
||||
>
|
||||
<div className="ms-auto">
|
||||
<ul id="nav" className="navbar-nav ms-auto">
|
||||
<li className="nav-item">
|
||||
<a href="https://docs.waf.chaitin.com/" target="_blank">
|
||||
Docs
|
||||
</a>
|
||||
</li>
|
||||
<li
|
||||
className="nav-item nav-item_tooltip"
|
||||
style={{ position: "relative" }}
|
||||
>
|
||||
<a style={{ color: "rgba(0,0,0,0.2)" }}>Pricing</a>
|
||||
<div className="nav-btn_tooltip">Comming soon...</div>
|
||||
</li>
|
||||
|
||||
<li className="nav-item">
|
||||
<a
|
||||
target="_blank"
|
||||
className="nav-item_icon"
|
||||
href="https://discord.gg/wyshSVuvxC"
|
||||
>
|
||||
<svg className="icon_svg">
|
||||
<use xlinkHref="#icon-discord" />
|
||||
</svg>
|
||||
Discord
|
||||
</a>
|
||||
</li>
|
||||
<li className="nav-item">
|
||||
<a
|
||||
className="nav-item_icon"
|
||||
href="https://github.com/chaitin/SafeLine"
|
||||
target="_blank"
|
||||
>
|
||||
<svg
|
||||
className="icon_svg"
|
||||
style={{ width: "20px", height: "20px" }}
|
||||
>
|
||||
<use xlinkHref="#icon-github-fill" />
|
||||
</svg>
|
||||
Gitlub 10k+
|
||||
<svg
|
||||
className="icon_svg"
|
||||
style={{ width: "16px", height: "16px", marginLeft: "8px" }}
|
||||
>
|
||||
<use xlinkHref="#icon-xingxing1" />
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
<li className="nav-item nav-item__demo">
|
||||
<a
|
||||
href={"https://demo.waf.chaitin.com:9443/"}
|
||||
className="main-btn btn-hover"
|
||||
style={{ color: "#fff" }}
|
||||
target="_blank"
|
||||
>
|
||||
Demo
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
20
website/en/components/preloader.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
|
||||
export default function Preloader() {
|
||||
return (
|
||||
<div className="preloader">
|
||||
<div className="loader">
|
||||
<div className="spinner">
|
||||
<div className="spinner-container">
|
||||
<div className="spinner-rotator">
|
||||
<div className="spinner-left">
|
||||
<div className="spinner-circle"></div>
|
||||
</div>
|
||||
<div className="spinner-right">
|
||||
<div className="spinner-circle"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
31
website/en/components/scroll-to-top-button.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
import { useEffect, useState } from "react";
|
||||
|
||||
export default function ScrollToButtonButton() {
|
||||
|
||||
const [hasScrollToTopButton, setHasScrollToTopButton] = useState(false);
|
||||
|
||||
function toggleScrollTopButton() {
|
||||
setHasScrollToTopButton(
|
||||
document.body.scrollTop > 50 || document.documentElement.scrollTop > 50
|
||||
)
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
window.addEventListener('scroll', toggleScrollTopButton);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('scroll', toggleScrollTopButton);
|
||||
|
||||
}
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<>
|
||||
{hasScrollToTopButton && (
|
||||
<a href="#" className="scroll-top btn-hover">
|
||||
<i className="lni lni-chevron-up"></i>
|
||||
</a>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
BIN
website/en/css/fonts/LineIcons.eot
Normal file
1616
website/en/css/fonts/LineIcons.svg
Normal file
After Width: | Height: | Size: 580 KiB |
BIN
website/en/css/fonts/LineIcons.ttf
Normal file
BIN
website/en/css/fonts/LineIcons.woff
Normal file
BIN
website/en/css/fonts/LineIcons.woff2
Normal file
2211
website/en/css/lineicons.css
Normal file
2827
website/en/css/main.css
Normal file
1
website/en/css/tiny-slider.min.css
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
.tns-outer{padding:0!important}.tns-outer [hidden]{display:none!important}.tns-outer [aria-controls],.tns-outer [data-action]{cursor:pointer}.tns-slider{-webkit-transition:all 0s;-moz-transition:all 0s;transition:all 0s}.tns-slider>.tns-item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.tns-horizontal.tns-subpixel{white-space:nowrap}.tns-horizontal.tns-subpixel>.tns-item{display:inline-block;vertical-align:top;white-space:normal}.tns-horizontal.tns-no-subpixel:after{content:'';display:table;clear:both}.tns-horizontal.tns-no-subpixel>.tns-item{float:left}.tns-horizontal.tns-carousel.tns-no-subpixel>.tns-item{margin-right:-100%}.tns-no-calc{position:relative;left:0}.tns-gallery{position:relative;left:0;min-height:1px}.tns-gallery>.tns-item{position:absolute;left:-100%;-webkit-transition:transform 0s,opacity 0s;-moz-transition:transform 0s,opacity 0s;transition:transform 0s,opacity 0s}.tns-gallery>.tns-slide-active{position:relative;left:auto!important}.tns-gallery>.tns-moving{-webkit-transition:all .25s;-moz-transition:all .25s;transition:all .25s}.tns-autowidth{display:inline-block}.tns-lazy-img{-webkit-transition:opacity .6s;-moz-transition:opacity .6s;transition:opacity .6s;opacity:.6}.tns-lazy-img.tns-complete{opacity:1}.tns-ah{-webkit-transition:height 0s;-moz-transition:height 0s;transition:height 0s}.tns-ovh{overflow:hidden}.tns-visually-hidden{position:absolute;left:-10000em}.tns-transparent{opacity:0;visibility:hidden}.tns-fadeIn{opacity:1;z-index:0}.tns-fadeOut,.tns-normal{opacity:0;z-index:-1}.tns-vpfix{white-space:nowrap}.tns-vpfix>div,.tns-vpfix>li{display:inline-block}.tns-t-subp2{margin:0 auto;width:310px;position:relative;height:10px;overflow:hidden}.tns-t-ct{width:2333.3333333%;width:-webkit-calc(100% * 70 / 3);width:-moz-calc(100% * 70 / 3);width:calc(100% * 70 / 3);position:absolute;right:0}.tns-t-ct:after{content:'';display:table;clear:both}.tns-t-ct>div{width:1.4285714%;width:-webkit-calc(100% / 70);width:-moz-calc(100% / 70);width:calc(100% / 70);height:10px;float:left}
|
16
website/en/jsconfig.json
Normal file
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@/components/*": [
|
||||
"components/*"
|
||||
],
|
||||
"@/lib/*": [
|
||||
"lib/*"
|
||||
],
|
||||
"@/css/*": [
|
||||
"css/*"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
184
website/en/lib/api.js
Normal file
|
@ -0,0 +1,184 @@
|
|||
import Butter from "buttercms";
|
||||
|
||||
let butter;
|
||||
|
||||
const previewSetting = process.env.PREVIEW;
|
||||
// make preview mode by default
|
||||
const preview =
|
||||
previewSetting === "true" || previewSetting === undefined ? 1 : 0;
|
||||
|
||||
try {
|
||||
butter = Butter(process.env.NEXT_PUBLIC_BUTTER_CMS_API_KEY, preview);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
||||
const defaultPageSize = 100;
|
||||
const defaultPostCount = 10;
|
||||
|
||||
export async function getLandingPage(slug) {
|
||||
try {
|
||||
const page = await butter.page.retrieve("landing-page", slug);
|
||||
|
||||
return page?.data?.data;
|
||||
} catch (e) {
|
||||
throw e.response.data.detail;
|
||||
}
|
||||
}
|
||||
|
||||
export async function getLandingPages() {
|
||||
let paginatedLandingPages = [];
|
||||
let currentPage = 1;
|
||||
while (!!currentPage) {
|
||||
const landingPagesData = await getLandingPagesData(currentPage);
|
||||
paginatedLandingPages.push(...landingPagesData.pages);
|
||||
currentPage = landingPagesData.nextPage;
|
||||
}
|
||||
|
||||
return paginatedLandingPages;
|
||||
}
|
||||
|
||||
async function getLandingPagesData(page, pageSize = defaultPageSize) {
|
||||
try {
|
||||
const params = {
|
||||
page,
|
||||
page_size: pageSize,
|
||||
};
|
||||
const response = await butter.page.list("landing-page", params);
|
||||
|
||||
return {
|
||||
pages: response?.data?.data,
|
||||
prevPage: response?.data?.meta.previous_page,
|
||||
nextPage: response?.data?.meta.next_page,
|
||||
};
|
||||
} catch (e) {
|
||||
throw e.response.data.detail;
|
||||
}
|
||||
}
|
||||
|
||||
export async function getPostsData(
|
||||
{ page, pageSize, tag, category } = { page: 1, pageSize: defaultPostCount }
|
||||
) {
|
||||
try {
|
||||
// https://buttercms.com/docs/api/node?javascript#get-your-blog-posts
|
||||
const params = {
|
||||
page_size: pageSize || defaultPostCount,
|
||||
page: page || 1,
|
||||
};
|
||||
|
||||
if (tag) {
|
||||
params.tag_slug = tag;
|
||||
}
|
||||
|
||||
if (category) {
|
||||
params.category_slug = category;
|
||||
}
|
||||
const response = await butter.post.list(params);
|
||||
|
||||
return {
|
||||
posts: response?.data?.data,
|
||||
prevPage: response?.data?.meta.previous_page,
|
||||
nextPage: response?.data?.meta.next_page,
|
||||
};
|
||||
} catch (e) {
|
||||
throw e.response.data.detail;
|
||||
}
|
||||
}
|
||||
|
||||
export async function getPost(slug) {
|
||||
try {
|
||||
const response = await butter.post.retrieve(slug);
|
||||
|
||||
return response?.data?.data;
|
||||
} catch (e) {
|
||||
throw e.response.data.detail;
|
||||
}
|
||||
}
|
||||
|
||||
export async function getMainMenu() {
|
||||
try {
|
||||
const mainMenu = {
|
||||
meta: {
|
||||
id: 740357,
|
||||
},
|
||||
name: "Main menu",
|
||||
menu_items: [
|
||||
{
|
||||
meta: {
|
||||
id: 740351,
|
||||
},
|
||||
label: "222",
|
||||
url: "#home",
|
||||
},
|
||||
{
|
||||
meta: {
|
||||
id: 740352,
|
||||
},
|
||||
label: "About",
|
||||
url: "#about",
|
||||
},
|
||||
{
|
||||
meta: {
|
||||
id: 740353,
|
||||
},
|
||||
label: "Features",
|
||||
url: "#features",
|
||||
},
|
||||
{
|
||||
meta: {
|
||||
id: 740354,
|
||||
},
|
||||
label: "Try It",
|
||||
url: "#tryit",
|
||||
},
|
||||
{
|
||||
meta: {
|
||||
id: 740355,
|
||||
},
|
||||
label: "Testimonials",
|
||||
url: "#testimonials",
|
||||
},
|
||||
{
|
||||
meta: {
|
||||
id: 740356,
|
||||
},
|
||||
label: "Blog",
|
||||
url: "#blog",
|
||||
},
|
||||
],
|
||||
};
|
||||
return mainMenu ? mainMenu.menu_items : [];
|
||||
} catch (e) {
|
||||
throw e.response.data.detail;
|
||||
}
|
||||
}
|
||||
|
||||
export async function getCategories() {
|
||||
try {
|
||||
const response = await butter.category.list();
|
||||
|
||||
return response?.data?.data;
|
||||
} catch (e) {
|
||||
throw e.response.data.detail;
|
||||
}
|
||||
}
|
||||
|
||||
export async function getTags() {
|
||||
try {
|
||||
const response = await butter.tag.list();
|
||||
|
||||
return response?.data?.data;
|
||||
} catch (e) {
|
||||
throw e.response.data.detail;
|
||||
}
|
||||
}
|
||||
|
||||
export async function searchPosts({ query }) {
|
||||
try {
|
||||
const response = await butter.post.search(query);
|
||||
|
||||
return response?.data?.data;
|
||||
} catch (e) {
|
||||
throw e.response.data.detail;
|
||||
}
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
/** @type {import('next-sitemap').IConfig} */
|
||||
const nextSiteMapConfig = {
|
||||
siteUrl: 'https://waf-ce.chaitin.cn',
|
||||
generateRobotsTxt: true,
|
||||
robotsTxtOptions: {
|
||||
policies: [{ userAgent: '*', allow: '/', disallow: '' }],
|
||||
},
|
||||
sitemap: {
|
||||
// path: '/sitemap.xml',
|
||||
routes: {
|
||||
'/community': {
|
||||
changefreq: 'always',
|
||||
},
|
||||
},
|
||||
},
|
||||
autoLastmod: true,
|
||||
priority: 1,
|
||||
changefreq: 'daily',
|
||||
sitemapSize: 5000,
|
||||
transform: async (config, path) => {
|
||||
if (!path) {
|
||||
return null
|
||||
}
|
||||
const customFields = config.sitemap.routes[path] || {}
|
||||
|
||||
return {
|
||||
loc: path,
|
||||
changefreq: customFields.changefreq || config.changefreq,
|
||||
priority: config.priority,
|
||||
lastmod: config.autoLastmod ? new Date().toISOString() : undefined,
|
||||
alternateRefs: config.alternateRefs ?? [],
|
||||
}
|
||||
},
|
||||
additionalPaths: (config) => {
|
||||
const paths = ['/docs']
|
||||
const result = []
|
||||
paths.forEach(async (item) => {
|
||||
result.push(await config.transform(config, item))
|
||||
})
|
||||
return result
|
||||
},
|
||||
}
|
||||
|
||||
module.exports = nextSiteMapConfig
|
|
@ -1,21 +1,11 @@
|
|||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
async rewrites() {
|
||||
return {
|
||||
fallback: [
|
||||
// These rewrites are checked after both pages/public files
|
||||
// and dynamic routes are checked
|
||||
{
|
||||
source: '/api/safeline/count',
|
||||
destination: 'http://121.199.46.182/api/safeline/count',
|
||||
},
|
||||
{
|
||||
source: '/api/:path*',
|
||||
destination: 'http://121.199.46.182/api/:path*',
|
||||
},
|
||||
],
|
||||
}
|
||||
module.exports = {
|
||||
reactStrictMode: false,
|
||||
output: 'export',
|
||||
images: {
|
||||
unoptimized: true,
|
||||
},
|
||||
webpack: (config) => {
|
||||
config.resolve.fallback = { fs: false };
|
||||
return config;
|
||||
},
|
||||
}
|
||||
|
||||
module.exports = nextConfig
|
||||
|
|
7556
website/en/package-lock.json
generated
|
@ -1,35 +1,31 @@
|
|||
{
|
||||
"name": "website2",
|
||||
"version": "0.1.0",
|
||||
"name": "nextjs-starter-buttercms",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start -p 3001",
|
||||
"lint": "next lint",
|
||||
"sitemap_build": "next-sitemap"
|
||||
"start": "next start",
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@emotion/react": "11.11.1",
|
||||
"@emotion/styled": "11.11.0",
|
||||
"@mui/icons-material": "5.14.3",
|
||||
"@mui/lab": "5.0.0-alpha.138",
|
||||
"@mui/material": "5.14.3",
|
||||
"countup.js": "2.7.0",
|
||||
"next": "14.0.1",
|
||||
"next-sitemap": "^4.2.3",
|
||||
"react": "^18",
|
||||
"react-dom": "^18"
|
||||
"@popperjs/core": "^2.11.6",
|
||||
"acorn": "^8.8.2",
|
||||
"bootstrap": "^5.2.3",
|
||||
"buttercms": "^1.2.15",
|
||||
"camelcase-keys": "^8.0.2",
|
||||
"date-fns": "^2.29.3",
|
||||
"next": "^14.2.3",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"sharp": "^0.31.3",
|
||||
"tiny-slider": "^2.9.4",
|
||||
"typescript": "^4.9.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^18",
|
||||
"@types/react-dom": "^18",
|
||||
"autoprefixer": "^10.0.1",
|
||||
"eslint": "^8",
|
||||
"eslint-config-next": "14.0.1",
|
||||
"postcss": "^8",
|
||||
"tailwindcss": "^3.3.0",
|
||||
"typescript": "5.4.2"
|
||||
"eslint": "^8.32.0",
|
||||
"eslint-config-next": "^13.1.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.17.1"
|
||||
}
|
||||
}
|
||||
|
|
53
website/en/pages/_app.js
Normal file
|
@ -0,0 +1,53 @@
|
|||
import Head from "next/head";
|
||||
import { useEffect } from "react";
|
||||
import Script from "next/script";
|
||||
|
||||
import "@/css/lineicons.css";
|
||||
import "bootstrap/dist/css/bootstrap.css";
|
||||
|
||||
import "@/css/main.css";
|
||||
import "@/css/tiny-slider.min.css";
|
||||
|
||||
function MyApp({ Component }) {
|
||||
useEffect(() => {
|
||||
import("bootstrap/dist/js/bootstrap.js");
|
||||
}, []);
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
<meta charSet="utf-8" />
|
||||
<meta httpEquiv="x-ua-compatible" content="ie=edge" />
|
||||
<title>SafeLine | the Best WAF for Webmaster</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="SafeLine is a simple, lightweight, locally deployable WAF that protects your website from network attacks that including OWASP attacks, zero-day attacks, web crawlers, vulnerability scanning, vulnerability exploit, http flood and so on."
|
||||
/>
|
||||
<meta
|
||||
name="keywords"
|
||||
content="waf,safeline,free,open source,sql injection,xss"
|
||||
></meta>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<script
|
||||
src="https://at.alicdn.com/t/c/font_4031246_dv8ag8nlrz.js?spm=a313x.manage_type_myprojects.i1.13.51b53a81rteUu4&file=font_4031246_dv8ag8nlrz.js"
|
||||
defer
|
||||
/>
|
||||
<script
|
||||
async
|
||||
src="https://www.googletagmanager.com/gtag/js?id=G-Z48W47MR7B"
|
||||
></script>
|
||||
<script async src="/ga.js"></script>
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="/favicon.png" />
|
||||
</Head>
|
||||
<Component />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
MyApp.getInitialProps = async (appContext) => {
|
||||
let mainMenu = [];
|
||||
|
||||
return { ...{}, mainMenu };
|
||||
};
|
||||
|
||||
export default MyApp;
|
18
website/en/pages/_document.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
import { Html, Head, Main, NextScript } from 'next/document'
|
||||
|
||||
export default function Document() {
|
||||
return (
|
||||
<Html>
|
||||
<Head>
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Sen:wght@400;700;800&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
</Head>
|
||||
<body>
|
||||
<Main />
|
||||
<NextScript />
|
||||
</body>
|
||||
</Html>
|
||||
)
|
||||
}
|
59
website/en/pages/index.js
Normal file
|
@ -0,0 +1,59 @@
|
|||
import Features from "@/components/landing-page-sections/features";
|
||||
import Hero from "@/components/landing-page-sections/hero";
|
||||
import Footer from "@/components/footer-section";
|
||||
import TwoColumnWithImage from "@/components/landing-page-sections/two-column-with-image";
|
||||
|
||||
import HeaderSection from "@/components/header-section";
|
||||
|
||||
function MyApp() {
|
||||
return (
|
||||
<>
|
||||
<HeaderSection />
|
||||
<Hero />
|
||||
<Features />
|
||||
{[
|
||||
{
|
||||
headline: "Easy To Use",
|
||||
subheadline:
|
||||
"Deployed by Docker, one command can complete the installation, and you can get started at 0 cost. The security configuration is ready to use, no manual maintenance is required, and safe lying management can be achieved.",
|
||||
buttonUrl: "11111",
|
||||
image: "EasyToUse.png",
|
||||
imagePosition: "right",
|
||||
scrollAnchorId: "11111",
|
||||
},
|
||||
{
|
||||
headline: "High Security Efficacy",
|
||||
subheadline:
|
||||
"The first intelligent semantic analysis algorithm in the industry, accurate detection, low false alarm, and difficult to bypass. The semantic analysis algorithm has no rules, and you are no longer at a loss when facing 0-day attacks with unknown features.",
|
||||
buttonUrl: "11111",
|
||||
image: "HighSecurityEfficacy.png",
|
||||
imagePosition: "left",
|
||||
scrollAnchorId: "11111",
|
||||
},
|
||||
{
|
||||
headline: "High Performance",
|
||||
subheadline:
|
||||
"Ruleless engine, linear security detection algorithm, average request detection delay at 1 millisecond level. Strong concurrency, single core easily detects 2000+ TPS, as long as the hardware is strong enough, there is no upper limit to the traffic scale that can be supported.",
|
||||
buttonUrl: "11111",
|
||||
image: "HighPerformance.png",
|
||||
imagePosition: "right",
|
||||
scrollAnchorId: "11111",
|
||||
},
|
||||
{
|
||||
headline: "High Availability",
|
||||
subheadline:
|
||||
"The traffic processing engine is developed based on Nginx, and both performance and stability can be guaranteed. Built-in complete health check mechanism, service availability is as high as 99.99%.",
|
||||
buttonUrl: "11111",
|
||||
image: "HighAvailability.png",
|
||||
imagePosition: "left",
|
||||
scrollAnchorId: "11111",
|
||||
},
|
||||
].map((item) => (
|
||||
<TwoColumnWithImage key={item.headline} {...item} />
|
||||
))}
|
||||
<Footer/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default MyApp;
|
|
@ -1,6 +0,0 @@
|
|||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
<users>
|
||||
<user>3EF7E30C5A378E54709FA57D67499571</user>
|
||||
</users>
|
Before Width: | Height: | Size: 2.7 KiB |
BIN
website/en/public/favicon.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
7
website/en/public/ga.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() {
|
||||
dataLayer.push(arguments);
|
||||
}
|
||||
gtag("js", new Date());
|
||||
|
||||
gtag("config", "G-Z48W47MR7B");
|
|
@ -1 +0,0 @@
|
|||
google-site-verification: googlef97f8402f9139518.html
|
1
website/en/public/icon_font.js
Normal file
BIN
website/en/public/images/EasyToUse.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
website/en/public/images/HighAvailability.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
website/en/public/images/HighPerformance.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
website/en/public/images/HighSecurityEfficacy.png
Normal file
After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 178 KiB |
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 236 KiB |
Before Width: | Height: | Size: 73 KiB |
Before Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 138 KiB |
Before Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 238 KiB |
Before Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 745 KiB |
Before Width: | Height: | Size: 7.4 KiB |
1
website/en/public/images/common-bg.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg fill="none" height="701" viewBox="0 0 1440 701" width="1440" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="720.435" x2="720.435" y1="791.976" y2="42.5723"><stop offset="0" stop-color="#c2fbff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><path d="m.435883 649.737c486.403117-274.293 312.179117 121.413 1440.004117 0 1127.82-121.413 0-649.595215 0-649.595215h-1440.004117s-486.402883 923.887215 0 649.595215z" fill="url(#a)"/></svg>
|
After Width: | Height: | Size: 552 B |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 64 KiB |
|
@ -1,22 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="380px" height="64px" viewBox="0 0 380 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>版本对比社区版</title>
|
||||
<defs>
|
||||
<linearGradient x1="50%" y1="54.5572869%" x2="-4.44583883%" y2="45.1887544%" id="linearGradient-1">
|
||||
<stop stop-color="#0FC6C2" offset="0%"></stop>
|
||||
<stop stop-color="#F6FEE9" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
<path d="M12,0 L368,0 C374.627417,-1.21743675e-15 380,5.372583 380,12 L380,64 L380,64 L0,64 L0,12 C-8.11624501e-16,5.372583 5.372583,1.21743675e-15 12,0 Z" id="path-2"></path>
|
||||
</defs>
|
||||
<g id="官网设计" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="版本" transform="translate(-360.000000, -529.000000)">
|
||||
<g id="版本对比社区版" transform="translate(360.000000, 529.000000)">
|
||||
<mask id="mask-3" fill="white">
|
||||
<use xlink:href="#path-2"></use>
|
||||
</mask>
|
||||
<use id="蒙版" fill="url(#linearGradient-1)" xlink:href="#path-2"></use>
|
||||
<image id="位图" mask="url(#mask-3)" x="284.45" y="12.7625" width="83.9125" height="65.5375" xlink:href="data:image/png;base64,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"></image>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 5.4 KiB |
|
@ -1,23 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="76px" height="20px" viewBox="0 0 76 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>编组 4</title>
|
||||
<defs>
|
||||
<linearGradient x1="-4.93008412e-13%" y1="46.5373961%" x2="90.5986697%" y2="53.4626039%" id="linearGradient-1">
|
||||
<stop stop-color="#FFC193" offset="0%"></stop>
|
||||
<stop stop-color="#FF5A5E" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g id="官网设计" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="版本(专业版特惠)" transform="translate(-1012.000000, -737.000000)">
|
||||
<g id="编组-4" transform="translate(1012.000000, 737.000000)">
|
||||
<path d="M8,0 L66,0 C71.5228475,-1.01453063e-15 76,4.4771525 76,10 C76,15.5228475 71.5228475,20 66,20 L0,20 L0,20 L0,8 C-5.41083001e-16,3.581722 3.581722,8.11624501e-16 8,0 Z" id="矩形" fill="url(#linearGradient-1)"></path>
|
||||
<g id="人气、热度" transform="translate(8.000000, 5.000000)" fill="#FFDF00" fill-rule="nonzero">
|
||||
<path d="M6.40193705,3.27637496 C6.08232446,3.79522657 5.66447596,4.06226219 5.66447596,4.06226219 C6.43652715,0.986509858 3.28052577,0 3.28052577,0 C4.21445866,3.40781736 0,3.66793497 0,6.41438948 C0,9.160844 3.22241439,9.63818748 3.22241439,9.63818748 C0.437218955,6.56658596 4,4.82324455 4,4.82324455 C4,4.82324455 3.37737807,5.72120374 4.83708059,7.12002767 C5.86786579,8.10653753 4.73607748,9.63403667 4.73607748,9.63403667 C5.78623314,9.64787271 8,8.26565202 8,6.388101 C8,4.51193359 6.40193705,3.27637496 6.40193705,3.27637496 Z" id="路径"></path>
|
||||
</g>
|
||||
<text id="限时特惠" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" line-spacing="20" fill="#FFFFFF">
|
||||
<tspan x="20" y="14">限时特惠</tspan>
|
||||
</text>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2 KiB |
|
@ -1,24 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="1920px" height="343px" viewBox="0 0 1920 343" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>企业版底图</title>
|
||||
<defs>
|
||||
<linearGradient x1="100%" y1="48.4042833%" x2="50%" y2="51.5957167%" id="linearGradient-1">
|
||||
<stop stop-color="#D5F6E4" offset="0%"></stop>
|
||||
<stop stop-color="#0FC6C2" offset="99.9180507%"></stop>
|
||||
</linearGradient>
|
||||
<rect id="path-2" x="0" y="0" width="1920" height="343"></rect>
|
||||
<linearGradient x1="50%" y1="0%" x2="50%" y2="70.5207199%" id="linearGradient-4">
|
||||
<stop stop-color="#FFFFFF" offset="0%"></stop>
|
||||
<stop stop-color="#FFFFFF" stop-opacity="0" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g id="官网设计" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="企业版底图">
|
||||
<mask id="mask-3" fill="white">
|
||||
<use xlink:href="#path-2"></use>
|
||||
</mask>
|
||||
<use id="蒙版" fill="url(#linearGradient-1)" xlink:href="#path-2"></use>
|
||||
<path d="M775.722398,244.134104 L984.709001,367.11642 L750.711155,499.925604 L512.147585,367.11642 L512.147585,250.149971 L584.561532,293.722483 L584.561532,324.723672 L750.711155,418.984941 L842.888792,367.11642 L700.59358,283.891362 L775.722398,244.134104 Z M746.145431,-24.0743962 L984.709001,108.734788 L984.709001,225.062047 L912.295054,182.128725 L912.295054,151.127536 L746.145431,56.8662666 L653.967794,108.734788 L796.263006,191.959846 L721.134188,231.717103 L512.147585,108.734788 L746.145431,-24.0743962 Z" id="形状结合" fill="url(#linearGradient-4)" opacity="0.245047433" mask="url(#mask-3)"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.8 KiB |
|
@ -1,22 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="380px" height="64px" viewBox="0 0 380 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>版本对比企业版</title>
|
||||
<defs>
|
||||
<linearGradient x1="50%" y1="54.5572869%" x2="-4.44583883%" y2="45.1887544%" id="linearGradient-1">
|
||||
<stop stop-color="#428FF9" offset="0%"></stop>
|
||||
<stop stop-color="#3CBBE8" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
<path d="M12,0 L368,0 C374.627417,-1.21743675e-15 380,5.372583 380,12 L380,64 L380,64 L0,64 L0,12 C-8.11624501e-16,5.372583 5.372583,1.21743675e-15 12,0 Z" id="path-2"></path>
|
||||
</defs>
|
||||
<g id="官网设计" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="版本" transform="translate(-1180.000000, -545.000000)">
|
||||
<g id="版本对比企业版" transform="translate(1180.000000, 545.000000)">
|
||||
<mask id="mask-3" fill="white">
|
||||
<use xlink:href="#path-2"></use>
|
||||
</mask>
|
||||
<use id="蒙版" fill="url(#linearGradient-1)" xlink:href="#path-2"></use>
|
||||
<image id="位图" mask="url(#mask-3)" x="282" y="13.375" width="88.2" height="64.925" xlink:href="data:image/png;base64,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"></image>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 193 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 158 KiB |
|
@ -1,98 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="606px" height="429px" viewBox="0 0 606 429" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>语义分析</title>
|
||||
<defs>
|
||||
<rect id="path-1" x="74" y="53" width="432" height="293" rx="12"></rect>
|
||||
<filter x="-16.2%" y="-17.1%" width="132.4%" height="147.8%" filterUnits="objectBoundingBox" id="filter-2">
|
||||
<feOffset dx="0" dy="20" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="20" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 0.568627451 0 0 0 0 0.619607843 0 0 0 0 0.670588235 0 0 0 0.2 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<rect id="path-3" x="17" y="174" width="195" height="51" rx="25.5"></rect>
|
||||
<filter x="-35.9%" y="-98.0%" width="171.8%" height="374.5%" filterUnits="objectBoundingBox" id="filter-4">
|
||||
<feOffset dx="0" dy="20" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="20" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.352941176 0 0 0 0 0.368627451 0 0 0 0.2 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<rect id="path-5" x="175" y="56" width="40" height="40" rx="12"></rect>
|
||||
<filter x="-175.0%" y="-125.0%" width="450.0%" height="450.0%" filterUnits="objectBoundingBox" id="filter-6">
|
||||
<feOffset dx="0" dy="20" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="20" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.568627451 0 0 0 0 0.619607843 0 0 0 0 0.670588235 0 0 0 0.2 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<rect id="path-7" x="329" y="234" width="214" height="135" rx="12"></rect>
|
||||
<filter x="-32.7%" y="-37.0%" width="165.4%" height="203.7%" filterUnits="objectBoundingBox" id="filter-8">
|
||||
<feOffset dx="0" dy="20" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="20" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 0.568627451 0 0 0 0 0.619607843 0 0 0 0 0.670588235 0 0 0 0.2 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
</defs>
|
||||
<g id="官网设计" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="官网英文版" transform="translate(-977.000000, -1114.000000)">
|
||||
<g id="语义分析" transform="translate(1000.000000, 1114.000000)">
|
||||
<rect id="矩形" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="560" height="400"></rect>
|
||||
<g id="矩形">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
|
||||
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
|
||||
</g>
|
||||
<rect id="矩形备份-39" fill="#F7F8FA" x="98" y="174" width="176" height="148" rx="3.5"></rect>
|
||||
<rect id="矩形备份-40" fill="#F7F8FA" x="306" y="174" width="176" height="148" rx="3.5"></rect>
|
||||
<path d="M86,53 L494,53 C500.627417,53 506,58.372583 506,65 L506,81 L506,81 L74,81 L74,65 C74,58.372583 79.372583,53 86,53 Z" id="矩形" fill="#111227"></path>
|
||||
<g id="矩形">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
|
||||
<use fill="#FF5A5E" fill-rule="evenodd" xlink:href="#path-3"></use>
|
||||
</g>
|
||||
<g id="矩形备份">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
|
||||
<use fill-opacity="0.89767264" fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-5"></use>
|
||||
</g>
|
||||
<text id="0day-attacks" font-family="Gilroy-Medium, Gilroy" font-size="24" font-weight="400" line-spacing="36" fill="#FFFFFF">
|
||||
<tspan x="41" y="204">0day attacks</tspan>
|
||||
</text>
|
||||
<circle id="椭圆形" fill-opacity="0.8" fill="#FF7777" cx="93" cy="67" r="3"></circle>
|
||||
<circle id="椭圆形备份" fill="#FFC641" cx="103" cy="67" r="3"></circle>
|
||||
<g id="矩形">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
|
||||
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-7"></use>
|
||||
</g>
|
||||
<circle id="椭圆形备份-2" fill-opacity="0.8" fill="#52C41A" cx="113" cy="67" r="3"></circle>
|
||||
<rect id="矩形备份-27" fill="#0FC6C2" x="98" y="105" width="26" height="7" rx="3.5"></rect>
|
||||
<rect id="矩形备份-28" fill-opacity="0.6" fill="#0FC6C2" x="136" y="105" width="26" height="7" rx="3.5"></rect>
|
||||
<rect id="矩形备份-29" fill-opacity="0.2" fill="#0FC6C2" x="174" y="105" width="26" height="7" rx="3.5"></rect>
|
||||
<rect id="矩形备份-30" fill="#F7F8FA" x="98" y="128" width="176" height="7" rx="3.5"></rect>
|
||||
<rect id="矩形备份-33" fill="#F7F8FA" x="306" y="128" width="176" height="7" rx="3.5"></rect>
|
||||
<rect id="矩形备份-32" fill="#F7F8FA" x="98" y="151" width="176" height="7" rx="3.5"></rect>
|
||||
<rect id="矩形备份-38" fill="#F7F8FA" x="306" y="151" width="176" height="7" rx="3.5"></rect>
|
||||
<text id="Multidimensional-Web" font-family="Gilroy-Regular, Gilroy" font-size="12" font-weight="normal" line-spacing="20" fill="#000000" fill-opacity="0.5">
|
||||
<tspan x="345" y="261">Multidimensional Web </tspan>
|
||||
<tspan x="345" y="281">Application Protection</tspan>
|
||||
</text>
|
||||
<text id="SQL-injection" font-family="Gilroy-Regular, Gilroy" font-size="10" font-weight="normal" line-spacing="10" fill="#52C41A">
|
||||
<tspan x="361" y="308">SQL injection</tspan>
|
||||
</text>
|
||||
<text id="XSS" font-family="Gilroy-Regular, Gilroy" font-size="10" font-weight="normal" line-spacing="10" fill="#FFC641">
|
||||
<tspan x="361" y="330">XSS</tspan>
|
||||
</text>
|
||||
<text id="SSRF" font-family="Gilroy-Regular, Gilroy" font-size="10" font-weight="normal" line-spacing="10" fill="#FFC641">
|
||||
<tspan x="454" y="330">SSRF</tspan>
|
||||
</text>
|
||||
<text id="CSRF" font-family="Gilroy-Regular, Gilroy" font-size="10" font-weight="normal" line-spacing="10" fill="#52C41A">
|
||||
<tspan x="454" y="308">CSRF</tspan>
|
||||
</text>
|
||||
<text id="……" font-family="Gilroy-Regular, Gilroy" font-size="10" font-weight="normal" line-spacing="20" fill="#FFC641">
|
||||
<tspan x="361" y="343">……</tspan>
|
||||
</text>
|
||||
<circle id="椭圆形" stroke="#52C41A" stroke-width="2" cx="349" cy="303" r="3"></circle>
|
||||
<circle id="椭圆形备份-2885" stroke="#FFC641" stroke-width="2" cx="349" cy="325" r="3"></circle>
|
||||
<circle id="椭圆形备份-2887" stroke="#FFC641" stroke-width="2" cx="349" cy="346" r="3"></circle>
|
||||
<circle id="椭圆形备份-2886" stroke="#FFC641" stroke-width="2" cx="442" cy="325" r="3"></circle>
|
||||
<circle id="椭圆形备份-2884" stroke="#52C41A" stroke-width="2" cx="442" cy="303" r="3"></circle>
|
||||
<g id="算法" transform="translate(183.000000, 65.000000)" fill="#0FC6C2" fill-rule="nonzero">
|
||||
<path d="M20.1156247,7.15710835 C17.9350256,6.41506174 15.0525629,6.00787371 12.0013315,6.00787371 L11.8057741,6.00787371 C12.6121136,4.96311493 13.4425629,4.0603362 14.2515812,3.35043601 C14.9614814,2.72893848 15.6285197,2.28692516 16.1803666,2.07261567 C16.5661237,1.92259902 16.8822302,1.89313147 17.0483201,1.98689187 C17.2278043,2.09136775 17.3644266,2.41551085 17.4206828,2.87895513 C17.5010489,3.53259908 17.4206828,4.4193046 17.1876212,5.44263242 L19.068187,5.86857254 C19.3521471,4.61218314 19.4432286,3.52724134 19.333395,2.64321469 C19.2396346,1.87437939 18.9342436,0.848372695 18.0100339,0.315277835 C17.1233284,-0.196386076 15.5320804,-0.338366115 12.9791186,1.8984892 C11.7575545,2.96735779 10.5065228,4.42198347 9.34121497,6.11234958 C8.55630645,6.17664243 7.79818663,6.26772396 7.07221322,6.38559419 C6.94094866,5.93822312 6.83379391,5.5042464 6.75074899,5.08902176 C6.56590705,4.16213321 6.51768741,3.36383035 6.60876895,2.77983699 C6.6730618,2.37264895 6.80164749,2.08333114 6.96773735,1.98689187 C7.24098195,1.82883862 8.21341127,1.9413511 9.9278872,3.49777379 L11.2244596,2.0699368 C10.3002499,1.23145091 9.42693876,0.639420941 8.62595704,0.309920098 C7.92945119,0.0232811526 6.90880224,-0.207101551 6.00334463,0.315277835 C5.11663911,0.826941746 4.19778717,2.13690851 4.85946772,5.46406337 C4.94251265,5.88732462 5.0496674,6.32398021 5.17825309,6.77670901 C4.72552429,6.89190036 4.29422644,7.01780719 3.8870384,7.15710835 C0.675074899,8.25008676 0,9.6993547 0,10.7226825 C0,11.7754779 0.717936797,12.5469921 1.32336111,13.0077575 C2.01718809,13.5381735 2.97890193,14.0016177 4.18171396,14.3820171 L4.76570732,12.5443132 C2.52349426,11.834413 1.93146429,11.0414679 1.93146429,10.7226825 C1.93146429,10.5324828 2.11630623,10.2726326 2.43777047,10.0154612 C2.89853587,9.64577733 3.61647267,9.2894878 4.50853593,8.98409677 C4.91036623,8.84747447 5.33898521,8.72424651 5.78903514,8.6144129 C6.0488854,9.30288214 6.35159756,10.0074246 6.68913501,10.7200037 C6.21765413,11.7165428 5.81582383,12.7050453 5.49435959,13.650686 C4.93179718,15.3169422 4.63712162,16.8358608 4.64247936,18.0386728 C4.6478371,19.0807527 4.88893528,20.4576912 6.01138124,21.1059774 C6.40517493,21.3336812 6.8177207,21.4167262 7.219551,21.4167262 C7.74728812,21.4167262 8.24823656,21.2693884 8.64738799,21.1059774 C9.45372745,20.7737977 10.3323964,20.1737311 11.2592849,19.3272086 L9.96003362,17.9020505 C8.22948448,19.4799041 7.25169742,19.5950955 6.97577395,19.4343634 C6.78289541,19.3218509 6.57662252,18.8959108 6.57126479,18.0279573 C6.56590705,17.034097 6.82575731,15.7321669 7.32134801,14.2641469 C7.47136465,13.8194547 7.64013338,13.3667259 7.83033305,12.9059605 C7.86247947,12.9595378 7.89194703,13.0131152 7.92409345,13.0693715 C8.94474241,14.8347459 10.1073714,16.4795712 11.2887525,17.8216844 C12.4513815,19.1423667 13.6193682,20.1576579 14.664127,20.7550456 C15.2561569,21.0952619 16.0276711,21.4167262 16.8018641,21.4167262 C17.2090522,21.4167262 17.6189191,21.3283235 18.007355,21.1032985 C19.129801,20.4550123 19.3708992,19.075395 19.3762569,18.0333151 C19.3816146,16.830503 19.0869391,15.3115845 18.5243767,13.6426493 C18.2377377,12.7907691 17.8814482,11.9013847 17.4689024,11.0039637 L15.7142435,11.8156609 C16.1000006,12.6514679 16.4295014,13.4738806 16.6947094,14.2641469 C17.1903001,15.7321669 17.4501504,17.034097 17.4447926,18.0306362 C17.4421137,18.8985896 17.233162,19.3272086 17.0402835,19.4370422 C16.8474049,19.5495547 16.3732452,19.5147294 15.6204831,19.0834316 C14.7578874,18.5905197 13.7586694,17.7145297 12.7353415,16.5492218 C11.6370054,15.300869 10.5493847,13.7658773 9.59302862,12.1076576 C9.32514175,11.6442133 9.0733281,11.1834479 8.83758766,10.7200037 C9.07600697,10.2512016 9.33049949,9.7850785 9.59838636,9.32163422 C9.86359435,8.86086881 10.136839,8.41349775 10.4181202,7.97952103 C10.9378207,7.95273234 11.4655578,7.939338 12.0013315,7.939338 C14.84629,7.939338 17.5090855,8.31170074 19.4941271,8.98677564 C20.3888693,9.2894878 21.1041272,9.64577733 21.5648926,10.0181401 C21.8863568,10.2779903 22.0711988,10.5351617 22.0711988,10.7253614 C22.0711988,10.9316343 21.8595681,11.2102366 21.4898843,11.4915178 C20.9701838,11.8853115 20.169202,12.2576743 19.1753418,12.568423 L19.7512985,14.4088058 C20.9728626,14.0284064 21.9506497,13.5622833 22.6551921,13.0291884 C23.2686531,12.5657441 24,11.7888722 24,10.7253614 C24.0026631,9.6993547 23.3275882,8.25008676 20.1156247,7.15710835 L20.1156247,7.15710835 Z M7.92677232,8.35456264 C7.89194703,8.41349775 7.85980061,8.47243286 7.82497531,8.53136797 C7.78479228,8.4349287 7.74728812,8.33848943 7.70710509,8.24205016 C7.8089021,8.22597694 7.91337798,8.2125826 8.01785386,8.19918826 C7.9883863,8.24740789 7.95891874,8.30098527 7.92677232,8.35456264 L7.92677232,8.35456264 Z" id="形状"></path>
|
||||
<path d="M10.3002499,11.0736143 C10.3002499,12.4051628 11.3796833,13.4845961 12.7112317,13.4845961 C14.0427802,13.4845961 15.1222135,12.4051628 15.1222135,11.0736143 C15.1222135,9.74206584 14.0427802,8.66263253 12.7112317,8.66263253 C11.3796833,8.66263253 10.3002499,9.74206584 10.3002499,11.0736143 Z" id="路径"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 145 KiB |
Before Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 142 KiB |
|
@ -1,68 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="600px" height="443px" viewBox="0 0 600 443" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>化繁为简</title>
|
||||
<defs>
|
||||
<rect id="path-1" x="84" y="60" width="432" height="293" rx="12"></rect>
|
||||
<filter x="-16.2%" y="-17.1%" width="132.4%" height="147.8%" filterUnits="objectBoundingBox" id="filter-2">
|
||||
<feOffset dx="0" dy="20" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="20" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 0.568627451 0 0 0 0 0.619607843 0 0 0 0 0.670588235 0 0 0 0.2 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<circle id="path-3" cx="473" cy="88" r="70"></circle>
|
||||
<filter x="-50.0%" y="-35.7%" width="200.0%" height="200.0%" filterUnits="objectBoundingBox" id="filter-4">
|
||||
<feOffset dx="0" dy="20" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="20" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 0.266666667 0 0 0 0 0.843137255 0 0 0 0 0.71372549 0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<circle id="path-5" cx="106" cy="331" r="50"></circle>
|
||||
<filter x="-70.0%" y="-50.0%" width="240.0%" height="240.0%" filterUnits="objectBoundingBox" id="filter-6">
|
||||
<feOffset dx="0" dy="20" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="20" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.776470588 0 0 0 0 0.254901961 0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<circle id="path-7" cx="300.5" cy="213.5" r="67.5"></circle>
|
||||
<mask id="mask-8" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="135" height="135" fill="white">
|
||||
<use xlink:href="#path-7"></use>
|
||||
</mask>
|
||||
<linearGradient x1="15.9475528%" y1="15.5184638%" x2="60.8557404%" y2="61.8849334%" id="linearGradient-9">
|
||||
<stop stop-color="#FFFFFF" offset="0%"></stop>
|
||||
<stop stop-color="#FFFFFF" stop-opacity="0" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g id="官网设计" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="白色版本3" transform="translate(-276.000000, -1920.000000)">
|
||||
<g id="化繁为简" transform="translate(276.000000, 1922.000000)">
|
||||
<rect id="矩形" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="600" height="400"></rect>
|
||||
<g id="矩形">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
|
||||
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
|
||||
</g>
|
||||
<path d="M96,60 L504,60 C510.627417,60 516,65.372583 516,72 L516,88 L516,88 L84,88 L84,72 C84,65.372583 89.372583,60 96,60 Z" id="矩形" fill="#111227"></path>
|
||||
<circle id="椭圆形" fill-opacity="0.8" fill="#FF7777" cx="103" cy="74" r="3"></circle>
|
||||
<circle id="椭圆形备份" fill="#FFC641" cx="113" cy="74" r="3"></circle>
|
||||
<circle id="椭圆形备份-2" fill-opacity="0.8" fill="#52C41A" cx="123" cy="74" r="3"></circle>
|
||||
<g id="椭圆形">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
|
||||
<use fill="#44D7B6" fill-rule="evenodd" xlink:href="#path-3"></use>
|
||||
</g>
|
||||
<g id="椭圆形备份-21">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
|
||||
<use fill="#FFC641" fill-rule="evenodd" xlink:href="#path-5"></use>
|
||||
</g>
|
||||
<use id="椭圆形" stroke="#0FC6C2" mask="url(#mask-8)" stroke-width="4" stroke-dasharray="5" xlink:href="#path-7"></use>
|
||||
<g id="安装-(1)" transform="translate(443.000000, 59.000000)" fill="#FFFFFF" fill-rule="nonzero">
|
||||
<path d="M51.057781,56.1094784 L15.1950051,56.1094784 C12.0502943,56.1094784 9.50111769,53.4949382 9.50111769,50.2703387 L9.50111769,20.9076002 C9.50111769,19.8399963 9.78799085,18.7941802 10.3254241,17.8790911 L13.8260029,11.9600627 C14.8572937,10.217036 16.6983657,9.15306336 18.6883213,9.14943206 L47.4773135,9.10947836 C49.4600065,9.10585639 51.3047098,10.1625664 52.3396319,11.8946992 L55.9128368,17.8681972 C56.461164,18.7869176 56.7516685,19.8436276 56.7516685,20.9184941 L56.7516685,50.2667074 C56.7516685,53.4949382 54.2024918,56.1094784 51.057781,56.1094784 L51.057781,56.1094784 Z" id="路径" fill-opacity="0.300808566"></path>
|
||||
<path d="M58.6857056,11.1076456 L54.4890691,4.26384245 C52.8761269,1.63534413 49.9601366,0 46.8761314,0 L46.8649305,0 L13.0379492,0.0448039487 C9.9427431,0.048537611 7.01928545,1.69508272 5.41381063,4.34598302 L1.29558101,11.1263139 C0.447823588,12.5231354 0,14.1258358 0,15.7597889 L0,49.4150217 C0,54.3397224 4.00621991,58.3459421 8.9309206,58.3459421 L51.0690343,58.3459421 C55.993735,58.3459421 59.9999775,54.3397224 59.9999775,49.4150217 L59.9999775,15.7747236 C60.0036884,14.1281785 59.5481816,12.5115027 58.6857056,11.1076456 Z M9.24081457,6.66832102 C10.0398183,5.34660454 11.4959467,4.52893248 13.0416829,4.52519881 L46.8686641,4.48039487 L46.8761314,4.48039487 C48.4144003,4.48039487 49.866795,5.29433327 50.6695324,6.60484876 L53.9663563,11.9775889 L6.01866393,11.9775889 L9.24081457,6.66832102 Z M51.072768,53.8692809 L8.93465426,53.8692809 C6.47790441,53.8692809 4.48412869,51.8717716 4.48412869,49.4187554 L4.48412869,16.4579838 L55.5232935,16.4579838 L55.5232935,49.4150217 C55.5232935,51.8717716 53.5257842,53.8692809 51.072768,53.8692809 Z" id="形状"></path>
|
||||
<path d="M39.7074997,35.6602095 L32.1916373,42.0858424 L32.2289739,22.8126772 C32.2307595,22.2182979 31.9959451,21.64764 31.5763546,21.2266485 C31.1567641,20.8056571 30.5868921,20.5687461 29.9925101,20.5687461 L29.9887765,20.5687461 C28.7529342,20.5687461 27.7523127,21.5693676 27.748579,22.8052099 L27.7112424,41.7012752 L21.069057,35.9962391 C20.1319078,35.189768 18.7168497,35.2980442 17.9103786,36.2351935 C17.1039076,37.1723427 17.2121838,38.5874008 18.149333,39.3938719 L28.7043966,48.4629378 C29.1225668,48.825103 29.6452795,49.0043188 30.1642586,49.0043188 C30.6832377,49.0043188 31.2022167,48.825103 31.6203869,48.4666715 L42.6160227,39.0653096 C43.5569056,38.2625722 43.6651818,36.8475141 42.8624444,35.9066312 C42.4774336,35.4545076 41.9281951,35.1743566 41.3361557,35.1281145 C40.7441162,35.0818723 40.1580406,35.2733479 39.7074997,35.6602095 L39.7074997,35.6602095 Z" id="路径"></path>
|
||||
</g>
|
||||
<g id="KHCFDC_点击" transform="translate(84.000000, 308.000000)">
|
||||
<path d="M15.8283717,12.0295625 L45.9022779,24.059125 C47.485115,24.6922598 48.4348173,26.5916644 47.8016825,28.1745016 C47.485115,29.1242039 46.8519802,29.7573388 45.9022779,30.0739062 L33.8727154,34.1892828 L29.7573388,45.9022779 C29.1242039,47.485115 27.5413667,48.4348173 25.6419621,47.8016825 C24.6922598,47.485115 24.059125,46.8519802 23.7425575,45.9022779 L11.712995,16.1449391 C11.0798602,14.5621019 12.0295625,12.6626973 13.6123996,12.0295625 C14.2455345,11.712995 15.1952368,11.712995 15.8283717,12.0295625 Z" id="形状" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<circle id="椭圆形" stroke="url(#linearGradient-9)" stroke-width="4" cx="15.5" cy="15.5" r="13.5"></circle>
|
||||
</g>
|
||||
<g id="安全盾牌" transform="translate(265.000000, 175.000000)" fill="#0FC6C2" fill-rule="nonzero">
|
||||
<path d="M33.0299631,0.492832555 C34.1251466,-0.164277518 35.6584034,-0.164277518 36.7535869,0.492832555 L36.7535869,0.492832555 L36.8290477,0.530049519 C37.7120774,0.962433222 44.0420345,3.99948035 51.1282254,7.53727687 L51.9184537,7.93231918 C52.1827416,8.06461559 52.4478286,8.19749201 52.7134763,8.33084155 L53.5118632,8.73220263 C54.5779867,9.26895817 55.6492688,9.81157339 56.7104578,10.3532073 L57.5042187,10.7591419 C61.1973806,12.6516469 64.7201915,14.5111808 67.4187235,16.0444376 C68.7329438,16.7015477 69.3900539,18.0157679 69.6090905,19.329988 C72.0184941,42.5478772 62.818953,57.4423721 54.9336322,65.7657664 C47.2277631,73.856929 39.1830214,77.5427484 37.0583424,78.4624694 L36.897171,78.5318678 C36.7003936,78.6161839 36.5767741,78.6678192 36.5345501,78.6889312 C36.0964768,78.9079679 35.4393667,78.9079679 35.0012933,78.9079679 L34.8276041,78.9075401 C34.4023649,78.9045454 33.8513508,78.8805883 33.4680365,78.6889312 C33.0299631,78.4698946 -4.20627438,63.7944363 0.393496125,19.329988 C0.612532884,18.0157679 1.26964296,16.7015477 2.5838631,16.0444376 C5.28239512,14.5111808 8.78803354,12.6516469 12.456467,10.7591418 L13.2448169,10.3532073 C13.5082742,10.2177988 13.7723273,10.082329 14.0367414,9.94690472 L14.8308318,9.54087553 C15.2281836,9.33803617 15.6258193,9.13553981 16.0229464,8.93374722 L16.8162877,8.53120729 C16.9483199,8.46430932 17.080237,8.39751627 17.2120094,8.33084151 L18.0006747,7.93231914 C18.6560588,7.60157812 19.3063612,7.27446215 19.9479131,6.9526414 L20.7133403,6.56910509 C20.8401332,6.50564162 20.9665174,6.44241668 21.0924635,6.37944363 L21.8426484,6.00473493 C27.7983156,3.03295726 32.6094127,0.703107794 33.0299631,0.492832555 Z M47.0483113,27.872419 L32.372853,43.2049873 L24.7065688,36.1958131 C22.9542753,34.6625563 20.1067983,34.6625563 18.5735415,36.4148499 C17.0402847,38.1671435 17.0402847,41.0146204 18.7925782,42.5478772 L29.7444127,52.4045283 C30.6205595,53.0616384 31.715743,53.4997118 32.5918897,53.4997118 C33.6870732,53.4997118 35.0012933,53.0616384 35.6584034,52.1854916 L53.1813387,33.5673729 C54.9336323,31.8150793 54.7145955,28.9676023 52.9623019,27.4343455 C51.4290451,25.9010887 48.5815681,26.1201254 47.0483113,27.872419 Z" id="形状结合"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 278 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 172 KiB |
Before Width: | Height: | Size: 22 KiB |