Merge branch 'opengoofy:develop' into develop

pull/1513/head
Pan_Yujie 2 years ago committed by GitHub
commit 60340f61b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

BIN
.DS_Store vendored

Binary file not shown.

3
.gitignore vendored

@ -51,3 +51,6 @@ docs/.docusaurus
### Docker ### ### Docker ###
docker/conf docker/conf
docker/target docker/target
### OS ###
.DS_Store

@ -1,35 +1,41 @@
{ {
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.eslint": true "source.fixAll.eslint": true
}, },
"[html]": { "[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true,
"editor.formatOnSave": true
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode" "editor.defaultFormatter": "esbenp.prettier-vscode"
}, },
"[typescript]": { "[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode", "editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true, "editor.formatOnPaste": true,
"editor.formatOnSave": true "editor.formatOnSave": true
}, },
"[typescriptreact]": { "[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode", "editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true, "editor.formatOnSave": true
"editor.formatOnSave": true },
}, "[json]": {
"typescript.tsdk":"./node_modules/typescript/lib" "editor.defaultFormatter": "esbenp.prettier-vscode",
} "editor.formatOnSave": true
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true,
"editor.formatOnSave": true
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true,
"editor.formatOnSave": true
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true,
"editor.formatOnSave": true
},
"typescript.tsdk": "./node_modules/typescript/lib"
}

@ -1,52 +1,53 @@
// @ts-check // @ts-check
// Note: type annotations allow type checking and IDEs autocompletion // Note: type annotations allow type checking and IDEs autocompletion
const lightCodeTheme = require("prism-react-renderer/themes/github"); const lightCodeTheme = require('prism-react-renderer/themes/github');
const darkCodeTheme = require("prism-react-renderer/themes/dracula"); const darkCodeTheme = require('prism-react-renderer/themes/dracula');
/** @type {import('@docusaurus/types').Config} */ /** @type {import('@docusaurus/types').Config} */
const config = { const config = {
title: "Hippo4j", title: 'Hippo4j',
tagline: "动态可观测线程池框架,为业务系统提高线上运行保障能力", tagline: '动态可观测线程池框架,为业务系统提高线上运行保障能力',
url: "https://hippo4j.cn", url: 'https://hippo4j.cn',
baseUrl: "/", baseUrl: '/',
onBrokenLinks: "throw", onBrokenLinks: 'throw',
onBrokenMarkdownLinks: "warn", onBrokenMarkdownLinks: 'warn',
favicon: "img/hippo4j_favicon.ico", favicon: 'img/hippo4j_favicon.ico',
// GitHub pages deployment config. // GitHub pages deployment config.
// If you aren't using GitHub pages, you don't need these. // If you aren't using GitHub pages, you don't need these.
organizationName: "hippo4j", // Usually your GitHub org/user name. organizationName: 'hippo4j', // Usually your GitHub org/user name.
projectName: "hippo4j.github.io", // Usually your repo name. projectName: 'hippo4j.github.io', // Usually your repo name.
deploymentBranch: "main", deploymentBranch: 'main',
// Even if you don't use internalization, you can use this field to set useful // Even if you don't use internalization, you can use this field to set useful
// metadata like html lang. For example, if your site is Chinese, you may want // metadata like html lang. For example, if your site is Chinese, you may want
// to replace "en" with "zh-Hans". // to replace "en" with "zh-Hans".
i18n: { i18n: {
defaultLocale: "zh", defaultLocale: 'zh',
locales: ["en", "zh"], locales: ['en', 'zh'],
localeConfigs: { localeConfigs: {
en: { en: {
label: "English", label: 'English',
direction: "ltr", direction: 'ltr',
}, },
zh: { zh: {
label: "简体中文", label: '简体中文',
direction: "ltr", direction: 'ltr',
}, },
}, },
}, },
presets: [ presets: [
[ [
"classic", 'classic',
/** @type {import('@docusaurus/preset-classic').Options} */ /** @type {import('@docusaurus/preset-classic').Options} */
({ ({
docs: { docs: {
sidebarPath: require.resolve("./sidebars.js"), sidebarPath: require.resolve('./sidebars.js'),
// Please change this to your repo. // Please change this to your repo.
// Remove this to remove the "edit this page" links. // Remove this to remove the "edit this page" links.
sidebarCollapsed: false, // Do not automatically expand the menu
sidebarCollapsed: true,
/*editUrl: 'https://github.com/longtai-cn',*/ /*editUrl: 'https://github.com/longtai-cn',*/
}, },
blog: { blog: {
@ -54,10 +55,10 @@ const config = {
// Please change this to your repo. // Please change this to your repo.
// Remove this to remove the "edit this page" links. // Remove this to remove the "edit this page" links.
editUrl: editUrl:
"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/", 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',
}, },
theme: { theme: {
customCss: require.resolve("./src/css/custom.css"), customCss: require.resolve('./src/css/custom.css'),
}, },
}), }),
], ],
@ -65,21 +66,21 @@ const config = {
plugins: [ plugins: [
[ [
"@docusaurus/plugin-content-docs", '@docusaurus/plugin-content-docs',
{ {
id: "community", id: 'community',
path: "community", path: 'community',
routeBasePath: "community", routeBasePath: 'community',
sidebarPath: require.resolve("./sidebarsCommunity.js"), sidebarPath: require.resolve('./sidebarsCommunity.js'),
}, },
], ],
async function myPlugin(context, options) { async function myPlugin(context, options) {
return { return {
name: "docusaurus-tailwindcss", name: 'docusaurus-tailwindcss',
configurePostCss(postcssOptions) { configurePostCss(postcssOptions) {
// Appends TailwindCSS and AutoPrefixer. // Appends TailwindCSS and AutoPrefixer.
postcssOptions.plugins.push(require("tailwindcss")); postcssOptions.plugins.push(require('tailwindcss'));
postcssOptions.plugins.push(require("autoprefixer")); postcssOptions.plugins.push(require('autoprefixer'));
return postcssOptions; return postcssOptions;
}, },
}; };
@ -91,63 +92,64 @@ const config = {
({ ({
autoCollapseCategories: true, autoCollapseCategories: true,
announcementBar: { announcementBar: {
id: "announcementBar-1", // Increment on change id: 'announcementBar-1', // Increment on change
// content: `⭐️ If you like hippo4j, give it a star on <a target="_blank" rel="noopener noreferrer" href="https://gitee.com/mabaiwancn/hippo4j">Gitee</a>, thanks.`, content:
// content: `⭐️ 如果您喜欢 hippo4j请在 <a target="_blank" rel="noopener noreferrer" href="https://gitee.com/mabaiwancn/hippo4j">Gitee</a> 和 <a target="_blank" rel="noopener noreferrer" href="https://github.com/opengoofy/hippo4j">GitHub</a> 上给它一个 star谢谢`, '⭐️ If you like hippo4j, give it a star on <a target="_blank" rel="noopener noreferrer" href="https://github.com/opengoofy/hippo4j">GitHub</a> ⭐️',
content: `⭐️ 开源不易,如果 Hippo4j 对您有帮助,请在 <a target="_blank" rel="noopener noreferrer" href="https://github.com/opengoofy/hippo4j">GitHub</a> 上给它一个 Star 🌟`, backgroundColor: '#fafbfc',
// content: `<a target="_blank" rel="noopener noreferrer" href="https://xiaomage.info/knowledge-planet/">👉 《小马哥的代码实战课》官方知识星球来啦!!!</a>`, textColor: '#091E42',
isCloseable: false,
}, },
navbar: { navbar: {
title: "", title: '',
logo: { logo: {
alt: "Hippo4j 动态可观测线程池框架", alt: 'Hippo4j 动态可观测线程池框架',
src: "img/hippo4j.png", src: 'img/hippo4j.png',
}, },
items: [ items: [
{ {
type: "docSidebar", type: 'docSidebar',
docId: "intro", docId: 'intro',
position: "left", position: 'left',
sidebarId: "user_docs", sidebarId: 'user_docs',
label: "文档", label: '文档',
}, },
{ {
to: "/community/contributor-guide", to: '/community/contributor-guide',
label: "社区", label: '社区',
position: "left", position: 'left',
activeBaseRegex: `/community/`, activeBaseRegex: `/community/`,
}, },
/*{ to: "/team", label: "团队", position: "left" },*/ /*{ to: "/team", label: "团队", position: "left" },*/
{ to: "/users", label: "采用公司", position: "left" }, { to: '/users', label: '采用公司', position: 'left' },
{ to: "/group", label: "加群沟通", position: "left" }, { to: '/group', label: '加群沟通', position: 'left' },
/*{to: '/blog', label: '博客', position: 'left'},*/ /*{to: '/blog', label: '博客', position: 'left'},*/
{ {
href: "http://console.hippo4j.cn/index.html", href: 'http://console.hippo4j.cn/index.html',
label: "控制台样例", label: '控制台样例',
position: "left", position: 'left',
}, },
{ {
href: "https://magestack.cn", href: 'https://magestack.cn',
label: "🚀 拿个offer", label: '🚀 拿个offer',
position: "left", position: 'left',
}, },
{ {
type: "docsVersionDropdown", type: 'docsVersionDropdown',
position: "right", position: 'right',
dropdownActiveClassDisabled: true, dropdownActiveClassDisabled: true,
}, },
{ type: "localeDropdown", position: "right" }, { type: 'localeDropdown', position: 'right' },
/*{ /*{
href: 'https://gitee.com/mabaiwancn/hippo4j', href: 'https://gitee.com/mabaiwancn/hippo4j',
label: 'Gitee', label: 'Gitee',
position: 'right', position: 'right',
},*/ },*/
{ {
href: "https://github.com/opengoofy/hippo4j", href: 'https://github.com/opengoofy/hippo4j',
className: "header-github-link", className: 'header-github-link',
"aria-label": "GitHub repository", 'aria-label': 'GitHub repository',
position: "right", position: 'right',
}, },
/*{ /*{
@ -158,57 +160,57 @@ const config = {
], ],
}, },
footer: { footer: {
style: "dark", style: 'dark',
links: [ links: [
{ {
title: "Docs", title: 'Docs',
items: [ items: [
{ {
label: "Intro", label: 'Intro',
to: "/docs/user_docs/intro", to: '/docs/user_docs/intro',
}, },
{ {
label: "Config Mode", label: 'Config Mode',
to: "/docs/user_docs/getting_started/config/hippo4j-config-start", to: '/docs/user_docs/getting_started/config/hippo4j-config-start',
}, },
{ {
label: "Server Mode", label: 'Server Mode',
to: "/docs/user_docs/getting_started/server/hippo4j-server-start", to: '/docs/user_docs/getting_started/server/hippo4j-server-start',
}, },
], ],
}, },
{ {
title: "Community", title: 'Community',
items: [ items: [
{ {
label: "Group", label: 'Group',
href: "https://hippo4j.cn/group", href: 'https://hippo4j.cn/group',
}, },
{ {
label: "WeChat", label: 'WeChat',
href: "https://mp.weixin.qq.com/s/diVHYvwiuYH9aWpZDPc27g", href: 'https://mp.weixin.qq.com/s/diVHYvwiuYH9aWpZDPc27g',
}, },
], ],
}, },
{ {
title: "More", title: 'More',
items: [ items: [
{ {
label: "Gitee", label: 'Gitee',
href: "https://gitee.com/opengoofy/hippo4j", href: 'https://gitee.com/opengoofy/hippo4j',
}, },
{ {
label: "GitHub", label: 'GitHub',
href: "https://github.com/opengoofy/hippo4j", href: 'https://github.com/opengoofy/hippo4j',
}, },
], ],
}, },
{ {
title: "Links", title: 'Links',
items: [ items: [
{ {
label: "推广合作", label: '推广合作',
href: "https://hippo4j.cn/docs/user_docs/other/operation", href: 'https://hippo4j.cn/docs/user_docs/other/operation',
}, },
], ],
}, },
@ -219,7 +221,7 @@ const config = {
prism: { prism: {
theme: lightCodeTheme, theme: lightCodeTheme,
darkTheme: darkCodeTheme, darkTheme: darkCodeTheme,
additionalLanguages: ["java"], additionalLanguages: ['java'],
}, },
}), }),
}; };

@ -262,7 +262,7 @@
"description": "The homepage title description" "description": "The homepage title description"
}, },
"homepage.titleDescription2": { "homepage.titleDescription2": {
"message": "动态可观测线程池框架,为业务系统提高线上运行保障能力", "message": "动态可观测Java线程池框架,为你的业务系统提高线上运行保障能力",
"description": "The homepage title description" "description": "The homepage title description"
}, },
"homepage.startButton": { "homepage.startButton": {
@ -271,7 +271,7 @@
}, },
"homepage.secondTitle": { "homepage.secondTitle": {
"message": "Hippo4j能做什么", "message": "Hippo4j能做什么",
"description": "a title for introduciton part" "description": "The title for the introduction part"
}, },
"homepage.introduction.fristPartTitle": { "homepage.introduction.fristPartTitle": {
"message": "动态变更", "message": "动态变更",
@ -312,5 +312,53 @@
"companyPage.linkText": { "companyPage.linkText": {
"message": "点击进行登记", "message": "点击进行登记",
"description": "the text for the company page link" "description": "the text for the company page link"
},
"homepage.introduction.fristPartDesc1": {
"message": "应用程序运行时动态更改线程池参数。",
"description": "The first desc for fristPart "
},
"homepage.introduction.fristPartDesc2": {
"message": "包括但不限于核心大小、最大线程数、阻塞队列大小和拒绝策略。",
"description": "The second desc for fristPart "
},
"homepage.introduction.fristPartDesc3": {
"message": "支持应用集群中不同节点的差异化线程池配置。",
"description": "The third desc for fristPart "
},
"homepage.introduction.secondPartDesc1": {
"message": "应用程序线程池运行时点,提供四个告警维度,并支持自定义时间内不重复报警。",
"description": "The first desc for secondPart "
},
"homepage.introduction.secondPartDesc2": {
"message": "线程池超载,阻塞队列容量,运行时间过长以及拒绝策略警报。",
"description": "The second desc for secondPart "
},
"homepage.introduction.secondPartDesc3": {
"message": "它还支持在自定义时间段内的非重复闹钟。",
"description": "The third desc for secondPart "
},
"homepage.introduction.thirdPartDesc1": {
"message": "支持为数据收集和存储设置自定义持续时间的线程池。",
"description": "The first desc for thirdPart "
},
"homepage.introduction.thirdPartDesc2": {
"message": "同时还支持Prometheus、InfluxDB和其他监控系统。",
"description": "The second desc for thirdPart "
},
"homepage.introduction.thirdPartDesc3": {
"message": "通过Grafana或内置的监控页面提供可视化仪表盘监控指标。",
"description": "The third desc for thirdPart "
},
"homepage.secondTitleDesc1": {
"message": "Hippo4j是一个Java线程池框架。",
"description": "The p1 for the secondTitle part"
},
"homepage.secondTitleDesc2": {
"message": "提供了线程池动态调整、自定义警报和操作监控等功能。",
"description": "The p1 for the secondTitle part"
},
"homepage.secondTitleDesc3": {
"message": "帮助提高你的业务系统的运营支持能力。",
"description": "The p2 for the secondTitle part"
} }
} }

@ -36,7 +36,7 @@
"description": "The label of footer link with label=公司登记 linking to https://github.com/opengoofy/hippo4j/issues/13" "description": "The label of footer link with label=公司登记 linking to https://github.com/opengoofy/hippo4j/issues/13"
}, },
"copyright": { "copyright": {
"message": "Copyright © 2021-2022 小马哥版权所有 <a href=\"https://beian.miit.gov.cn\">京ICP备2021038095号-2\n</a>", "message": "Copyright © 2021-2023 马丁@版权所有 <a href=\"https://beian.miit.gov.cn\">京ICP备2021038095号-2\n</a>",
"description": "The footer copyright" "description": "The footer copyright"
}, },
"link.title.Links": { "link.title.Links": {

@ -1,51 +1,70 @@
import React from "react"; import React from 'react';
import useGithubInfo from "./useGithubInfo"; import useGithubInfo from './useGithubInfo';
const GithubInfo = ({ owner, repo }) => { const GithubInfo = ({ owner, repo }) => {
const { favorites, language, forks, license } = useGithubInfo(owner, repo); const { favorites, language, forks, license } = useGithubInfo(owner, repo);
return ( return (
<div className="github-info-container w-full md:justify-normal mb-4 justify-center gap-2 flex flex-wrap items-center"> <p className="">
<div className="flex items-center"> <div className="widget">
<div className="dark:bg-gray-600 bg-gray-100 px-2"> <a
<span className="text-sm">star</span> className="btn hover:no-underline hover:text-[#24292f] outline-none"
</div> href="https://github.com/opengoofy/hippo4j"
<div className="dark:bg-blue-600 bg-gray-200 font-medium px-2"> rel="noopener"
<span id="repo-stars-count">{favorites || 4621}</span> target="_blank"
</div> aria-label="Star buttons/github-buttons on GitHub"
>
<svg
viewBox="0 0 16 16"
width="14"
height="14"
className="octicon octicon-mark-github"
aria-hidden="true"
>
<path d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"></path>
</svg>
&nbsp;<span>Star</span>
</a>
<a
className="social-count hover:no-underline outline-none w-10"
href="https://github.com/opengoofy/hippo4j"
rel="noopener"
target="_blank"
aria-label="1029 stargazers on GitHub"
>
{favorites || 0}
</a>
</div> </div>
<div class="widget ml-4">
<div className="flex items-center"> <a
<div className="px-2 bg-gray-100 dark:bg-gray-600"> class="btn hover:no-underline hover:text-[#24292f] outline-none"
<span className="text-sm">language</span> href="https://github.com/opengoofy/hippo4j"
</div> rel="noopener"
<div className="px-2 dark:bg-blue-600 bg-gray-200 font-medium"> target="_blank"
<span id="repo-languages-count font-medium"> aria-label="Fork opengoofy/hippo4j on GitHub"
{language || "java"} >
</span> <svg
</div> viewBox="0 0 16 16"
</div> width="14"
height="14"
<div className="flex items-center"> class="octicon octicon-repo-forked"
<div className="dark:bg-gray-600 bg-gray-100 px-2"> aria-hidden="true"
<span className="text-sm">forks</span> >
</div> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path>
<div className="dark:bg-blue-600 bg-gray-200 px-2 font-medium"> </svg>
<span id="repo-forks-count">{forks || 1020}</span> &nbsp;<span>Fork</span>
</div> </a>
</div> <a
className="social-count hover:no-underline outline-none w-10"
<div className="flex items-center"> href="https://github.com/opengoofy/hippo4j"
<div className="px-2 bg-gray-100 dark:bg-gray-600"> rel="noopener"
<span className="text-sm">license</span> target="_blank"
</div> aria-label="1029 stargazers on GitHub"
<div className="px-2 dark:bg-blue-600 bg-gray-200"> >
<span className="text-sm font-medium" id="repo-license-name"> {forks || 0}
Apache 2 </a>
</span>
</div>
</div> </div>
</div> </p>
); );
}; };

@ -1,84 +1,81 @@
import React from "react"; import React from 'react';
import { Icon } from "@iconify/react"; import { useEffect } from 'react';
import useBaseUrl from "@docusaurus/useBaseUrl"; import { Icon } from '@iconify/react';
import GithubInfo from "./GithubInfo"; import useBaseUrl from '@docusaurus/useBaseUrl';
import Translate, { translate } from "@docusaurus/Translate"; import GithubInfo from './GithubInfo';
import Link from "@docusaurus/Link"; import Translate, { translate } from '@docusaurus/Translate';
import Link from '@docusaurus/Link';
const Hero = () => { const Hero = () => {
return ( return (
<div className="hero-container text-black dark:text-white"> <header className="hero hero--primary heroBanner_UJJx dark:bg-[#1B1B1D]">
<div className="py-10 mb-10"> <div className="my-container dark:text-white">
<div className="container px-20 lg:px-20 md:px-10 mx-auto flex flex-wrap flex-col md:flex-row items-center"> <div className="row">
{/* <!--Left Col--> */} <div className="col col--6">
<div className="flex flex-col w-full md:w-3/5 justify-center items-start text-center md:text-left"> <h1 className="hero__logo text-5xl font-medium dark:text-white">
{/* title and desc */} Hippo4j Thread Pool
<div> </h1>
<h1 className="my-4 lg:my-8 md:my-6 text-5xl font-bold leading-tight text-transparent bg-gradient-to-r from-orange-400 via-orange-400 to-orange-500 bg-clip-text"> <p className="hero__subtitle">
Hippo4j <Translate
</h1> id="homepage.titleDescription2"
description="The homepage title description"
<p className="leading-normal dark:text-white font-bold text-gray-800 md:pr-20 text-3xl md:text-3xl"> >
<Translate Enhancing the Operational Assurance Capability for Business
id="homepage.titleDescription1" Systems Online.
description="The homepage title description" </Translate>
> </p>
Thread Pool Framework For Java <div className="social_VnSH">
</Translate> <GithubInfo owner="opengoofy" repo="hippo4j" />
</p>
<p className="leading-normal font-medium md:pr-20 text-gray-600 dark:text-gray-100 text-2xl mb-2">
<Translate
id="homepage.titleDescription2"
description="The homepage title description"
>
Enhancing the Operational Assurance Capability for Business
Systems Online.
</Translate>
</p>
</div> </div>
<div className="buttons_pzbO">
{/* button group */}
<div className="flex w-full justify-center">
<Link
to="/docs/user_docs/intro"
className="relative mr-4 w-32 text-center lg:w-48 hover:no-underline inline-flex items-center justify-start py-4 overflow-hidden font-semibold text-white transition-all duration-150 ease-in-out rounded bg-blue-500 group"
>
<span className="absolute bottom-0 left-0 w-full h-1 transition-all duration-150 ease-in-out bg-blue-600 group-hover:h-full"></span>
{/* button group */} <span className="relative w-full text-center transition-colors duration-200 ease-in-out group-hover:text-white">
<div className="flex my-4 lg:my-8 md:my-6 w-full justify-center md:justify-start"> Start Learning
<Link to="/docs/user_docs/intro" className=""> </span>
<button className="mr-2 lg:mr-4 text-base lg:text-lg w-32 lg:w-40 hover:bg-orange-500 bg-orange-400 font-medium py-2 px-4 rounded-md focus:outline-none shadow-none border-none cursor-pointer transition-all duration-300 ease-in-out"> </Link>
<Translate
className="cursor-pointer" <a
id="homepage.startButton" href="https://github.com/opengoofy/hippo4j"
description="The homepage start button text" className="relative w-32 hover:no-underline lg:w-48 inline-block text-lg group"
> >
Quick Start <span className="relative z-10 block px-5 py-4 overflow-hidden font-medium leading-tight text-gray-800 transition-colors duration-300 ease-out border-2 border-gray-900 rounded-lg group-hover:text-white">
</Translate> <span className="absolute inset-0 w-full h-full px-5 py-4 rounded-lg bg-gray-100"></span>
</button> <span className="absolute left-0 w-52 h-48 -ml-2 transition-all duration-300 origin-top-right -rotate-90 -translate-x-full translate-y-12 bg-gray-900 group-hover:-rotate-180 ease"></span>
</Link> <span className="relative flex items-center justify-center">
<a href="https://github.com/opengoofy/hippo4j"> {' '}
<button className="ml-2 lg:mx-0 w-32 lg:w-40 border border-solid dark:border-gray-100 border-gray-200 bg-transparent hover:bg-gray-300 hover:bg-opacity-50 font-medium py-2 px-4 rounded-md focus:outline-none shadow-none cursor-pointer transition-all duration-300 ease-in-out"> <Icon
<div className="flex cursor-pointer items-center justify-center"> className="w-6 h-6 mr-2 rounded-full flex-shrink-0 bg-white text-white"
<Icon icon="devicon:github"
className="w-6 h-6 mr-2 rounded-full flex-shrink-0 dark:bg-white" />
icon="devicon:github" Github
/> </span>
<span className="text-base lg:text-lg">GitHub</span> </span>
</div> <span
</button> className="absolute bottom-0 right-0 w-full h-12 -mb-1 -mr-1 transition-all duration-200 ease-linear bg-gray-900 rounded-lg group-hover:mb-0 group-hover:mr-0"
</a> data-rounded="rounded-lg"
</div> ></span>
{/* github info */} </a>
<div className="github-info w-full"> </div>
<GithubInfo owner="opengoofy" repo="hippo4j" />
</div> </div>
</div> </div>
<div className="col col--6">
{/* <!--Right image--> */} <h1 className="hero__title">
<div className="w-full md:w-2/5 text-center"> <img
<img className="homeImg_cEyn max-w-[440px] mt-12 -ml-8"
className="w-full h-auto object-cover md:shadow-sm lg:h-80 md:h-96 dark:rounded-lg dark:shadow-lg dark:filter-brightness-75" src={useBaseUrl('/img/hero/hero-removebg.png')}
src={useBaseUrl("/img/hero.svg")} alt="homepage"
alt="Hippo4j System" />
/> </h1>
</div> </div>
</div> </div>
</div> </div>
</div> </header>
); );
}; };

@ -1,103 +1,171 @@
import React from "react"; import React from 'react';
import useBaseUrl from "@docusaurus/useBaseUrl"; import useBaseUrl from '@docusaurus/useBaseUrl';
import Translate from "@docusaurus/Translate"; import Translate from '@docusaurus/Translate';
const Introduction = () => { const Introduction = () => {
return ( return (
<section className=" border-b mb-28"> <section className="dark:text-white">
<div className="container px-20 lg:px-20 md:px-10 "> <div className="introduction-container ">
<h2 className="w-full my-2 text-5xl dark:text-white font-medium leading-tight text-gray-800"> <div className="title-container w-full bg-[#EFEFEF] dark:text-white flex flex-wrap dark:bg-[#242526]">
{/* Hippo4j能做什么 */} <div className="my-container">
<Translate <div className="row">
id="homepage.secondTitle" <div className="col col--6 hfeatureImage_Eu74">
description="a title for introduciton part" <img
> width="560"
What can Hippo4j do? height="315"
</Translate> style={{ width: '560px', height: '315px' }}
</h2> src={useBaseUrl('/img/introduction/t.jpg')}
<div className="w-1/2 mb-6"> />
<div className=" h-1 w-64 my-0 py-0 rounded-t bg-gradient-to-r from-orange-400 to-blue-500 mb-4"></div> </div>
</div> <div className="col col--6 hfeatureContent_iAnb">
<h3 className="hfeatureTitle_i6jH text-4xl font-medium mb-8">
<div className="third-part-desc grid md:grid-cols-2 grid-cols-1 gap-4"> <Translate
<div className="p-4 md:p-6 bg-gray-100 dark:bg-[#252525] rounded-lg"> id="homepage.secondTitle"
<h3 className="text-3xl text-gray-800 dark:text-white font-medium leading-none mb-3"> description="The title for the introduction part"
{/* 动态变更 */} >
<Translate What can Hippo4j do?
id="homepage.introduction.fristPartTitle" </Translate>
description="the title for the first introduction part" </h3>
> <p>
Dynamic Change <Translate
</Translate> id="homepage.secondTitleDesc2"
</h3> description="The p1 for the secondTitle part"
<p className="text-gray-600 text-xl dark:text-white "> >
{/* 应用运行时动态变更线程池参数,包括不限于核心、最大线程、阻塞队列大小和拒绝策略等,支持应用集群下不同节点线程池配置差异化 */} Provided functions such as dynamic adjustment of thread
<Translate pool, custom alerts.
id="homepage.introduction.fristPartDesc" </Translate>
description="the desc for the first introduction part" </p>
> <p>
Application runtime dynamically changes thread pool parameters, <Translate
including but not limited to core size, maximum threads, id="homepage.secondTitleDesc3"
blocking queue size, and rejection policy. It supports description="The p2 for the secondTitle part"
differentiated thread pool configurations for different nodes in >
the application cluster. Help improve the operational support capabilities of your
</Translate> business system.
<br /> </Translate>
<br /> </p>
</p> </div>
</div> </div>
<div className="p-4 md:p-6 bg-gray-100 dark:bg-[#252525] rounded-lg">
<h3 className="text-3xl text-gray-800 dark:text-white font-medium leading-none mb-3">
{/* 自定义报警 */}
<Translate
id="homepage.introduction.secondPartTitle"
description="the title for the second introduction part"
>
Custom Alarm
</Translate>
</h3>
<p className="text-gray-600 text-xl dark:text-white">
{/* 应用线程池运行时埋点,提供四种报警维度,线程池过载、阻塞队列容量、运行超长以及拒绝策略报警,并支持自定义时间内不重复报警 */}
<Translate
id="homepage.introduction.secondPartDesc"
description="the desc for the second introduction part"
>
Application thread pool runtime point, providing four alarm
dimensions: thread pool overload, blocking queue capacity,
running for too long, and rejection strategy alarm. It also
supports non-repetitive alarms within a custom time period.
</Translate>
<br />
<br />
</p>
</div>
<div className="p-4 md:p-6 bg-gray-100 dark:bg-[#252525] rounded-lg">
<h3 className="text-3xl text-gray-800 dark:text-white font-medium leading-none mb-3">
{/* 运行监控 */}
<Translate
id="homepage.introduction.thirdPartTitle"
description="the title for the third introduction part"
>
Operation Monitoring
</Translate>
</h3>
<p className="text-gray-600 text-xl dark:text-white">
{/* 线
PrometheusInfluxDB 等采集监控通过 Grafana
或内置监控页面提供可视化大屏监控运行指标 */}
<Translate
id="homepage.introduction.thirdPartDesc"
description="the desc for the third introduction part"
>
Supports custom duration thread pool for data collection and
storage, while also supporting Prometheus, InfluxDB, and other
monitoring systems. Provides visualized dashboard monitoring
metrics through Grafana or built-in monitoring pages.
</Translate>
<br />
<br />
</p>
</div> </div>
</div> </div>
<section className="section_rXKr dark:text-white">
<div className="my-container">
<div className="row">
<div className="my-container">
<div className="row feature_gF_R">
<div className="col col--3">
<div className="text--center">
<img
className="featureImage_FjLv"
src={useBaseUrl('/img/introduction/p11.svg')}
alt="feture-[object Object]"
/>
</div>
</div>
<div className="col col--9 featureDesc_r01v">
<div>
<h2>
{' '}
<Translate
id="homepage.introduction.fristPartTitle"
description="the title for the first introduction part"
>
Dynamic Change
</Translate>
</h2>
<div>
<p>
<Translate
className=" "
id="homepage.introduction.fristPartDesc1"
description="The first desc for fristPart "
>
Application runtime dynamically changes thread pool
parameters.
</Translate>{' '}
</p>
</div>
</div>
</div>
</div>
</div>
<div className="my-container">
<div className="row feature_gF_R featureReverse_QJY9">
<div className="col col--3">
<div className="text--center">
<img
className="featureImage_FjLv"
src={useBaseUrl('/img/introduction/p22.svg')}
alt="feture-[object Object]"
/>
</div>
</div>
<div className="col col--9 featureDesc_r01v">
<div>
<h2>
{' '}
<Translate
id="homepage.introduction.secondPartTitle"
description="the title for the second introduction part"
>
Custom Alarm
</Translate>
</h2>
<div>
<p>
<Translate
className="cursor-pointer"
id="homepage.introduction.secondPartDesc1"
description="The first desc for secondPart "
>
Application thread pool runtime point, providing
four alarm dimensions.
</Translate>
</p>
</div>
</div>
</div>
</div>
</div>
<div className="my-container">
<div className="row feature_gF_R">
<div className="col col--3">
<div className="text--center">
<img
className="featureImage_FjLv"
src={useBaseUrl('/img/introduction/p33.svg')}
alt="feture-[object Object]"
/>
</div>
</div>
<div className="col col--9 featureDesc_r01v">
<div>
<h2>
<Translate
id="homepage.introduction.thirdPartTitle"
description="the title for the third introduction part"
>
Operation Monitoring
</Translate>
</h2>
<div>
<p>
<Translate
className="cursor-pointer"
id="homepage.introduction.thirdPartDesc1"
description="The first desc for thirdPart "
>
Supports custom duration thread pool for data
collection and storage.
</Translate>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div> </div>
</section> </section>
); );

@ -1,6 +1,6 @@
import React from "react"; import React from 'react';
import Hero from "./Hero"; import Hero from './Hero';
import Introduction from "./Introduction"; import Introduction from './Introduction';
function LandingLayout(props) { function LandingLayout(props) {
return ( return (
<div className="leading-normal tracking-normal text-white"> <div className="leading-normal tracking-normal text-white">

@ -10,8 +10,8 @@
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap"); @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@700&display=swap');
:root { :root {
/* /*
See css var + hsl color palette technique: See css var + hsl color palette technique:
@ -25,17 +25,21 @@
--site-color-svg-icon-favorite: #e9669e; --site-color-svg-icon-favorite: #e9669e;
--site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 25%); --site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 25%);
--site-color-feedback-background: #fff; --site-color-feedback-background: #fff;
--ifm-font-family-base: "Poppins"; --ifm-font-family-base: 'Poppins';
/* custom */
--docs-color-primary-tint: #2160fd29;
--ifm-breadcrumb-item-background-active: #0000000d;
--ifm-breadcrumb-color-active: #2160fd;
} }
html[data-theme="dark"] { html[data-theme='dark'] {
--site-color-feedback-background: #f0f8ff; --site-color-feedback-background: #f0f8ff;
--site-color-favorite-background: #1d1e1e; --site-color-favorite-background: #1d1e1e;
--site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 10%); --site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 10%);
} }
[data-theme="light"] { [data-theme='light'] {
--ifm-color-primary: hsl(var(--site-primary-hue-saturation) 30%); --ifm-color-primary: #2160fd;
--ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 26%); --ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 26%);
--ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 23%); --ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 23%);
--ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 17%); --ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 17%);
@ -49,8 +53,8 @@ html[data-theme="dark"] {
); );
} }
[data-theme="dark"] { [data-theme='dark'] {
--ifm-color-primary: hsl(var(--site-primary-hue-saturation) 45%); --ifm-color-primary: #1a90ff;
--ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 41%); --ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 41%);
--ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 38%); --ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 38%);
--ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 32%); --ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 32%);
@ -62,6 +66,8 @@ html[data-theme="dark"] {
--ifm-color-primary-lightest: hsl( --ifm-color-primary-lightest: hsl(
var(--site-primary-hue-saturation-light) 73% var(--site-primary-hue-saturation-light) 73%
); );
--ifm-breadcrumb-item-background-active: #222222;
--ifm-breadcrumb-color-active: #1a90ff;
} }
.docusaurus-highlight-code-line { .docusaurus-highlight-code-line {
@ -71,7 +77,7 @@ html[data-theme="dark"] {
padding: 0 var(--ifm-pre-padding); padding: 0 var(--ifm-pre-padding);
} }
[data-theme="dark"] .docusaurus-highlight-code-line { [data-theme='dark'] .docusaurus-highlight-code-line {
background-color: rgb(66 66 66 / 30%); background-color: rgb(66 66 66 / 30%);
} }
@ -80,7 +86,7 @@ html[data-theme="dark"] {
} }
.header-github-link::before { .header-github-link::before {
content: ""; content: '';
width: 24px; width: 24px;
height: 24px; height: 24px;
display: flex; display: flex;
@ -88,7 +94,7 @@ html[data-theme="dark"] {
no-repeat; no-repeat;
} }
[data-theme="dark"] .header-github-link::before { [data-theme='dark'] .header-github-link::before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat; no-repeat;
} }
@ -109,17 +115,15 @@ html[data-theme="dark"] {
background-color: var(--ifm-tabs-color-active); background-color: var(--ifm-tabs-color-active);
} }
[data-theme="light"] .themedDocusaurus [fill="#FFFF50"] { [data-theme='light'] .themedDocusaurus [fill='#FFFF50'] {
fill: greenyellow; fill: greenyellow;
} }
[data-theme="dark"] .themedDocusaurus [fill="#FFFF50"] { [data-theme='dark'] .themedDocusaurus [fill='#FFFF50'] {
fill: seagreen; fill: seagreen;
} }
[data-theme="light"] .DocSearch { [data-theme='light'] .DocSearch {
/* --docsearch-primary-color: var(--ifm-color-primary); */
/* --docsearch-text-color: var(--ifm-font-color-base); */
--docsearch-muted-color: var(--ifm-color-emphasis-700); --docsearch-muted-color: var(--ifm-color-emphasis-700);
--docsearch-container-background: rgb(94 100 112 / 70%); --docsearch-container-background: rgb(94 100 112 / 70%);
/* Modal */ /* Modal */
@ -135,7 +139,7 @@ html[data-theme="dark"] {
--docsearch-footer-background: var(--ifm-color-white); --docsearch-footer-background: var(--ifm-color-white);
} }
[data-theme="dark"] .DocSearch { [data-theme='dark'] .DocSearch {
--docsearch-text-color: var(--ifm-font-color-base); --docsearch-text-color: var(--ifm-font-color-base);
--docsearch-muted-color: var(--ifm-color-secondary-darkest); --docsearch-muted-color: var(--ifm-color-secondary-darkest);
--docsearch-container-background: rgb(47 55 69 / 70%); --docsearch-container-background: rgb(47 55 69 / 70%);
@ -157,7 +161,7 @@ html[data-theme="dark"] {
); );
} }
div[class^="announcementBar_"] { div[class^='announcementBar_'] {
--site-announcement-bar-stripe-color1: hsl( --site-announcement-bar-stripe-color1: hsl(
var(--site-primary-hue-saturation) 85% var(--site-primary-hue-saturation) 85%
); );
@ -191,14 +195,14 @@ div[class^="announcementBar_"] {
white-space: nowrap; white-space: nowrap;
} }
[data-theme="light"] img[src$="#gh-dark-mode-only"], [data-theme='light'] img[src$='#gh-dark-mode-only'],
[data-theme="dark"] img[src$="#gh-light-mode-only"] { [data-theme='dark'] img[src$='#gh-light-mode-only'] {
display: none; display: none;
} }
/* Used to test CSS insertion order */ /* Used to test CSS insertion order */
.test-marker-site-custom-css-unique-rule { .test-marker-site-custom-css-unique-rule {
content: "site-custom-css-unique-rule"; content: 'site-custom-css-unique-rule';
} }
@media only screen and (max-width: 996px) { @media only screen and (max-width: 996px) {
@ -219,3 +223,415 @@ div[class^="announcementBar_"] {
height: 100%; height: 100%;
} }
} }
@media (min-width: 1440px) {
.container {
max-width: var(--ifm-container-width-xl);
}
}
@media (max-width: 996px) {
.col {
--ifm-col-width: 100%;
flex-basis: var(--ifm-col-width);
margin-left: 0;
}
.footer {
--ifm-footer-padding-horizontal: 0;
}
.colorModeToggle_DEke,
.footer__link-separator,
.navbar__item,
.sidebar_re4s,
.tableOfContents_bqdL {
display: none;
}
.footer__col {
margin-bottom: calc(var(--ifm-spacing-vertical) * 3);
}
.footer__link-item {
display: block;
}
.navbar > .container,
.navbar > .container-fluid {
padding: 0;
}
.navbar__toggle {
display: inherit;
}
.navbar__search-input {
width: 9rem;
}
.pills--block,
.tabs--block {
flex-direction: column;
}
.searchBox_ZlJk {
position: absolute;
right: var(--ifm-navbar-padding-horizontal);
}
.docItemContainer_F8PC {
padding: 0 0.3rem;
}
}
/* Custom */
.bg-cousom {
background-position: 50% 65%;
}
:root[data-theme='light'] {
--hero-image-url: url('../../static/img/hero/hero-removebg.png');
--bg-background-color: #ffffff;
--bg-background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='199' viewBox='0 0 100 199'%3E%3Cg fill='%23dddddd' fill-opacity='0.4'%3E%3Cpath d='M0 199V0h1v1.99L100 199h-1.12L1 4.22V199H0zM100 2h-.12l-1-2H100v2z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");
}
:root[data-theme='dark'] {
--hero-image-url: url('../../static/img/hero/hero-removebg.png');
--bg-background-color: #1b1b1d;
--bg-background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 48 48'%3E%3Cg fill='%239C92AC' fill-opacity='0.4'%3E%3Cpath fill-rule='evenodd' d='M5 3.59L1.46.05.05 1.46 3.59 5 .05 8.54l1.41 1.41L5 6.41l3.54 3.54 1.41-1.41L6.41 5l3.54-3.54L8.54.05 5 3.59zM17 2h24v2H17V2zm0 4h24v2H17V6zM2 17h2v24H2V17zm4 0h2v24H6V17z'/%3E%3C/g%3E%3C/svg%3E");
}
.bg-svg {
background-color: var(--bg-background-color);
background-image: var(--bg-background-image);
}
.hero-img {
content: var(--hero-image-url);
}
.h-custom {
height: 65vh;
}
.font-jakarta {
font-family: 'Plus Jakarta Sans', sans-serif;
}
/* sidebar style */
ul.menu__list > li > a.menu__link--active {
border-right: 1px solid var(--ifm-color-primary);
}
nav.menu {
padding-right: 0px;
scrollbar-gutter: auto;
}
.menu__link {
border-radius: 4px 0 0 4px;
--ifm-menu-color-background-active: var(--docs-color-primary-tint);
}
/* other style */
::selection {
--tw-text-opacity: 1;
background-color: rgb(var(--docs-color-primary-200, 33 96 253) / 0.8);
color: rgb(255 255 255 / var(--tw-text-opacity));
}
div[class^='announcementBar_'] {
font-size: 16px;
background: none;
background-color: #fafbfc;
padding: 8px 0;
display: flex;
justify-content: center;
font-weight: inherit;
}
div[class^='announcementBar_'] a {
text-decoration: underline;
color: #091e42;
}
.introduction-container {
color: #1c1e21;
}
.three-part-container p {
margin: 0;
line-height: 2;
}
.logo-img-container {
align-items: center;
background: #fff;
border: 1px solid #eaecef;
border-radius: 4px;
box-shadow: 0 1px 2px 0 #f8f9fa;
display: flex;
height: 80px;
justify-content: center;
margin: 5px;
min-width: 0;
}
/* new add */
.hero {
align-items: center;
background-color: #fff;
color: #000;
display: flex;
padding: 4rem 2rem;
}
.heroBanner_UJJx {
overflow: hidden;
padding: 1rem 0 5rem;
position: relative;
text-align: center;
}
.my-container {
margin: 0 auto;
max-width: 1140px;
}
.row {
display: flex;
flex-wrap: wrap;
margin: 0 calc(1rem * -1);
}
.col[class*='col--'] {
flex: 0 0 var(--ifm-col-width);
}
.col {
--ifm-col-width: 100%;
flex: 1 0;
margin-left: 0;
max-width: var(--ifm-col-width);
}
.col--6 {
--ifm-col-width: 50%;
}
.col--3 {
--ifm-col-width: 25%;
}
.col--9 {
--ifm-col-width: 75%;
}
.col,
.my-container {
padding: 0 1rem;
width: 100%;
}
.hero__logo {
height: 150px;
max-width: 500px;
transform: translateY(40%);
}
.hero__logo,
.hero__subtitle,
.hero__title {
margin: 0 auto;
width: 100%;
}
h1,
h2,
h3 {
font-weight: 400;
line-height: 1.25;
}
.social_VnSH {
margin-top: 30px;
}
.buttons_pzbO {
align-items: center;
display: flex;
flex-wrap: wrap;
justify-content: center;
margin: 30px 0 0;
}
.hero__title {
background-size: 110%;
color: transparent;
height: 300px;
max-width: 400px;
font-size: 3rem;
}
.hero__subtitle {
font-size: 1.2em;
max-width: 600px;
}
.hfeatureImage_Eu74 {
height: 100%;
padding: 60px 1rem !important;
}
.hfeatureContent_iAnb {
padding: 60px 0 60px calc(1rem + 20px) !important;
}
.section_rXKr {
padding: 4rem 0;
width: 100%;
}
.section_rXKr h3 {
font-size: 1.7em;
font-weight: 500;
text-align: center;
}
.feature_gF_R {
margin-bottom: 0.5rem;
}
.featureImage_FjLv {
height: 256px;
}
.featureDesc_r01v {
align-items: center;
display: flex !important;
}
.featureReverse_QJY9 {
flex-direction: row-reverse;
float: right;
}
/* github button */
.widget {
display: inline-block;
overflow: hidden;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,
sans-serif;
font-size: 0;
line-height: 0;
white-space: nowrap;
}
.btn,
.social-count {
position: relative;
display: inline-block;
display: inline-flex;
justify-content: center;
/* height: 14px; */
padding: 2px 5px;
font-size: 11px;
font-weight: 600;
line-height: 14px;
vertical-align: bottom;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-repeat: repeat-x;
background-position: -1px -1px;
background-size: 110% 110%;
border: 1px solid;
}
.btn {
border-radius: 0.25em;
}
.btn:not(:last-child) {
border-radius: 0.25em 0 0 0.25em;
}
.social-count {
border-left: 0;
border-radius: 0 0.25em 0.25em 0;
}
.octicon {
display: inline-block;
vertical-align: text-top;
fill: currentColor;
overflow: visible;
}
.btn:focus-visible,
.social-count:focus-visible {
outline: 2px solid #0969da;
outline-offset: -2px;
}
.btn {
color: #24292f;
background-color: #ebf0f4;
border-color: #ccd1d5;
border-color: rgba(31, 35, 40, 0.15);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg'%3e%3clinearGradient id='o' x2='0' y2='1'%3e%3cstop stop-color='%23f6f8fa'/%3e%3cstop offset='90%25' stop-color='%23ebf0f4'/%3e%3c/linearGradient%3e%3crect width='100%25' height='100%25' fill='url(%23o)'/%3e%3c/svg%3e");
background-image: -moz-linear-gradient(top, #f6f8fa, #ebf0f4 90%);
background-image: linear-gradient(180deg, #f6f8fa, #ebf0f4 90%);
filter: progid:DXImageTransform.Microsoft.Gradient(startColorstr='#FFF6F8FA', endColorstr='#FFEAEFF3');
}
.btn:hover,
.btn:focus {
background-color: #e9ebef;
background-position: 0 -0.5em;
border-color: #cbcdd1;
border-color: rgba(31, 35, 40, 0.15);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg'%3e%3clinearGradient id='o' x2='0' y2='1'%3e%3cstop stop-color='%23f3f4f6'/%3e%3cstop offset='90%25' stop-color='%23e9ebef'/%3e%3c/linearGradient%3e%3crect width='100%25' height='100%25' fill='url(%23o)'/%3e%3c/svg%3e");
background-image: -moz-linear-gradient(top, #f3f4f6, #e9ebef 90%);
background-image: linear-gradient(180deg, #f3f4f6, #e9ebef 90%);
filter: progid:DXImageTransform.Microsoft.Gradient(startColorstr='#FFF3F4F6', endColorstr='#FFE8EAEE');
}
.btn:active {
background-color: #e5e9ed;
border-color: #c7cbcf;
border-color: rgba(31, 35, 40, 0.15);
background-image: none;
filter: none;
}
.social-count {
color: #24292f;
background-color: #fff;
border-color: #dddedf;
border-color: rgba(31, 35, 40, 0.15);
}
.social-count:hover,
.social-count:focus {
color: #0969da;
}
@media screen and (max-width: 966px) {
.heroBanner_UJJx {
padding: 2rem;
}
.col {
--ifm-col-width: 100%;
flex-basis: var(--ifm-col-width);
margin-left: 0;
}
.hero {
padding-left: 0;
padding-right: 0;
}
}
@media screen and (max-width: 768px) {
.feature_gF_R {
margin-bottom: 0.5rem;
}
.featureImage_FjLv {
height: 96px;
margin-bottom: 1.5rem;
}
}
@media (max-width: 650px) {
.buttons_pzbO > a {
margin: 10px 5px;
}
.frameworkLogos_QXHq img {
height: 45px;
}
}
@media (min-width: 1440px) {
.my-container {
max-width: 1320px;
}
}

@ -1,22 +1,23 @@
import React from "react"; import React from 'react';
import clsx from "clsx"; import { useEffect } from 'react';
import Link from "@docusaurus/Link"; import clsx from 'clsx';
import Link from '@docusaurus/Link';
// import Translate from "@docusaurus/Translate"; // import Translate from "@docusaurus/Translate";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from "@theme/Layout"; import Layout from '@theme/Layout';
// import HomepageFeatures from "@site/src/components/HomepageFeatures"; // import HomepageFeatures from "@site/src/components/HomepageFeatures";
import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment"; import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
import LandingLayout from "@site/src/components/LandingPage"; import LandingLayout from '@site/src/components/LandingPage';
import Head from '@docusaurus/Head';
import styles from "./index.module.css"; import styles from './index.module.css';
if (ExecutionEnvironment.canUseDOM) { if (ExecutionEnvironment.canUseDOM) {
var _hmt = _hmt || []; var _hmt = _hmt || [];
(function () { (function () {
var hm = document.createElement("script"); var hm = document.createElement('script');
hm.src = "https://hm.baidu.com/hm.js?473eaadc06f3d63771f303df1fc29b58"; hm.src = 'https://hm.baidu.com/hm.js?473eaadc06f3d63771f303df1fc29b58';
var s = document.getElementsByTagName("script")[0]; var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s); s.parentNode.insertBefore(hm, s);
})(); })();
} }
@ -24,7 +25,7 @@ if (ExecutionEnvironment.canUseDOM) {
function HomepageHeader() { function HomepageHeader() {
const { siteConfig } = useDocusaurusContext(); const { siteConfig } = useDocusaurusContext();
return ( return (
<header className={clsx("hero hero--primary", styles.heroBanner)}> <header className={clsx('hero hero--primary', styles.heroBanner)}>
<div className="container"> <div className="container">
<h1 className="hero__title">{siteConfig.title}</h1> <h1 className="hero__title">{siteConfig.title}</h1>
<p className="hero__subtitle">{siteConfig.tagline}</p> <p className="hero__subtitle">{siteConfig.tagline}</p>
@ -43,6 +44,7 @@ function HomepageHeader() {
export default function Home() { export default function Home() {
const { siteConfig } = useDocusaurusContext(); const { siteConfig } = useDocusaurusContext();
return ( return (
<Layout <Layout
title={`${siteConfig.title}`} title={`${siteConfig.title}`}

@ -5,51 +5,39 @@ import useBaseUrl from "@docusaurus/useBaseUrl";
import Translate from "@docusaurus/Translate"; import Translate from "@docusaurus/Translate";
function CompanyCards({ companies }) { function CompanyCards({ companies }) {
return ( return (
<div className="grid sm:grid-cols-2 grid-cols-1 md:px-16 md:grid-cols-3 lg:grid-cols-5 gap-4 mb-16 lg:px-2 px-10"> <div className="grid sm:grid-cols-2 grid-cols-1 md:px-16 md:grid-cols-3 lg:grid-cols-6 gap-4 mb-16 lg:px-2 px-10">
{companies.map((company) => ( {/* Filter out those without a logo. */}
<div {companies
onClick={() => window.open(company.url)} .filter((comapny) => comapny.logo.length > 0)
key={company.url} .map((company) => (
className="bg-white rounded-lg overflow-hidden shadow-sm transform cursor-pointer transition-all duration-500 hover:scale-110" <div
style={{ border: "1px solid #E5E7EB" }} onClick={() => window.open(company.url)}
> className="rounded-lg overflow-hidden transform cursor-pointer transition-all duration-500 hover:scale-110"
<div className="flex dark:text-black items-center justify-center h-28"> // style={{ border: "1px solid #E5E7EB" }}
>
<div <div
className="h-24 w-24 object-contain" className="h-20 logo-img-container p-1"
style={{ position: "relative" }} style={{ position: "relative" }}
> >
<img <img
src={useBaseUrl(company.logo)} src={useBaseUrl(company.logo)}
alt={`${company.name}`} alt={`${company.name}`}
className="h-24 w-24 object-contain" className="max-h-[90%] max-w-[90%] h-auto object-contain"
onError={(e) => {
e.target.style.display = "none"; // Hide the image if it fails to load
e.target.nextSibling.style.display = "flex"; // Show the alt text
}}
/> />
<div
className="flex items-center justify-center absolute inset-0 text-center"
style={{
display: "none", // Hide the alt text by default
}}
>
{company.name}
</div>
</div> </div>
</div> </div>
</div> ))}
))}
</div> </div>
); );
} }
export default function OurUsers() { export default function OurUsers() {
return ( return (
<Layout title="OurUsers" description="companies using our product"> <Layout title="OurUsers" description="companies using our product">
<div className="max-w-screen-lg mx-auto dark:text-white"> <div className="w-[1200px] px-5 mx-auto dark:text-white">
{/* text description*/} {/* text description*/}
<div className="max-w-screen-sm sm:mx-auto mx-10 text-center my-8 "> <div className="max-w-screen-sm sm:mx-auto mx-10 text-center my-8 mt-14 mb-12 ">
<div className="text-center mt-8"> <div className="text-center ">
<h2 className="text-3xl font-bold mb-4"> <h2 className="text-3xl font-medium mb-7">
<Translate <Translate
id="companyPage.title" id="companyPage.title"
description="the title for the company page" description="the title for the company page"
@ -58,12 +46,12 @@ export default function OurUsers() {
</Translate> </Translate>
</h2> </h2>
<div <div
className="mx-auto h-1 bg-gradient-to-r from-green-400 to-blue-500 mb-4" className="mx-auto h-[0.215rem] bg-gradient-to-r from-green-400 to-blue-500 mb-6"
style={{ width: "30%" }} style={{ width: "30%" }}
></div> ></div>
</div> </div>
<div className="flex flex-col items-center mx-auto"> <div className=" mb-7 mx-auto">
<p className="text-lg mb-2 max-w-1/2" style={{ lineHeight: "1.5" }}> <p className="text-lg leading-loose mb-2 ">
<Translate <Translate
id="companyPage.descriptionText" id="companyPage.descriptionText"
description="the description for the company page" description="the description for the company page"
@ -72,7 +60,7 @@ export default function OurUsers() {
This is our greatest motivation to move forward. This is our greatest motivation to move forward.
</Translate>{" "} </Translate>{" "}
</p> </p>
<p className="text-lg mb-4 max-w-1/2" style={{ lineHeight: "1.5" }}> <p className="text-lg mb-5 leading-loose">
<Translate <Translate
id="companyPage.questionText" id="companyPage.questionText"
description="the text for the company question" description="the text for the company question"
@ -81,7 +69,7 @@ export default function OurUsers() {
</Translate>{" "} </Translate>{" "}
<a <a
href="https://github.com/opengoofy/hippo4j/issues/13" href="https://github.com/opengoofy/hippo4j/issues/13"
className="text-blue-500 hover:text-blue-700 font-bold" className="text-blue-400 hover:text-blue-500 font-medium"
> >
<Translate <Translate
id="companyPage.linkText" id="companyPage.linkText"

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

@ -5,38 +5,38 @@
</defs> </defs>
<g transform="matrix(1 0 0 1 46.5 19)" > <g transform="matrix(1 0 0 1 46.5 19)" >
<g style="" > <g style="" >
<g transform="matrix(1 0 0 1 1.81 6.25)" id="Fill-1" > <g transform="matrix(1 0 0 1 2 6.5)" id="Fill-1" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-48.31, -25.25)" d="M 48.7217 20.9722 C 47.9585333 22.9672 46.5372278 26.6806444 45.64845 28.6851444 L 45.5497556 28.9083944 L 47.8160333 29.7296167 L 47.9020611 29.53645 C 49.0352 26.9994222 50.0443111 24.4639778 50.98745 21.78445 L 51.0629222 21.5707 L 48.8013944 20.7647833 L 48.7217 20.9722 Z" stroke-linecap="round" /> <path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(40,40,40); fill-rule: evenodd; opacity: 1;" transform=" translate(-48.5, -25.5)" d="M 48.8766992 21.2082303 C 48.1845683 23.2110562 46.8955581 26.9390675 46.0895079 28.9514306 L 46 29.1755563 L 48.0553322 30 L 48.1333525 29.8060756 C 49.1610186 27.2590957 50.0762014 24.7137054 50.9315527 22.0236665 L 51 21.8090781 L 48.9489757 21 L 48.8766992 21.2082303 Z" stroke-linecap="round" />
</g> </g>
<g transform="matrix(1 0 0 1 1.81 -7.31)" id="Fill-3" > <g transform="matrix(1 0 0 1 2 -7.5)" id="Fill-3" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-48.31, -11.69)" d="M 47.1649139 12.3122639 C 47.8679139 12.8548194 48.6648583 13.4702083 49.1651917 13.900875 L 49.3451639 14.0560417 L 50.8377194 12.1660694 L 50.6756917 12.0235694 C 49.988525 11.4197917 48.896025 10.556875 47.4272194 9.459625 L 47.2467194 9.32451389 L 45.7889972 11.2324306 L 45.9610528 11.3717639 C 46.2756083 11.625625 46.7068028 11.9586528 47.1649139 12.3122639" stroke-linecap="round" /> <path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(40,40,40); fill-rule: evenodd; opacity: 1;" transform=" translate(-48.5, -11.5)" d="M 47.3626385 12.1572783 C 48.0588543 12.7306191 48.8481079 13.3809258 49.3436128 13.836029 L 49.5218482 14 L 51 12.0027886 L 50.8395359 11.852203 C 50.1590006 11.2141662 49.0770437 10.3022867 47.6224127 9.14277747 L 47.4436546 9 L 46 11.016174 L 46.1703951 11.1634133 C 46.4819151 11.4316788 46.9089484 11.7836029 47.3626385 12.1572783" stroke-linecap="round" />
</g> </g>
<g transform="matrix(1 0 0 1 1.57 -2.15)" id="Fill-5" > <g transform="matrix(1 0 0 1 1.5 -2.5)" id="Fill-5" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-48.07, -16.85)" d="M 49.3460611 19.4095556 L 50.8391444 17.5185278 L 50.6734222 17.3765556 C 49.4901444 16.36375 48.1627833 15.3161111 46.9346444 14.4262778 L 46.7546722 14.2953889 L 45.29695 16.2122778 L 45.4848389 16.3495 C 46.6823667 17.2224444 47.9891444 18.2547778 49.1660889 19.2565 L 49.3460611 19.4095556 Z" stroke-linecap="round" /> <path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(40,40,40); fill-rule: evenodd; opacity: 1;" transform=" translate(-48, -16.5)" d="M 49.3835825 19 L 51 17.1511868 L 50.8205885 17.0123839 C 49.5395677 16.0221878 48.1025617 14.997936 46.772974 14.127967 L 46.5781354 14 L 45 15.874097 L 45.2034092 16.0082559 C 46.4998572 16.8617131 47.9145796 17.871001 49.1887439 18.8503612 L 49.3835825 19 Z" stroke-linecap="round" />
</g> </g>
<g transform="matrix(1 0 0 1 12.72 -0.08)" id="Fill-7" > <g transform="matrix(1 0 0 1 12 0)" id="Fill-7" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-59.22, -18.92)" d="M 61.7289417 12.4118028 L 61.1299139 14.4353028 L 57.313025 14.4353028 L 56.7139972 12.4118028 L 61.7289417 12.4118028 Z M 61.1631639 23.673525 L 61.1631639 24.8393861 C 61.1631639 25.0135528 61.0211917 25.1549972 60.8475528 25.1549972 L 57.279775 25.1549972 L 57.279775 23.673525 L 61.1631639 23.673525 Z M 60.5324694 7.83069167 L 57.9109972 7.83069167 L 57.9109972 10.2194139 L 50.8561917 10.2194139 L 50.8561917 12.4118028 L 54.1136361 12.4144417 L 54.8256083 14.4379417 L 51.456275 14.434775 L 51.456275 30.0158306 L 53.8661083 30.0158306 L 53.8661083 16.6276917 L 58.0165528 16.6276917 L 58.0165528 17.9587472 L 54.5020806 17.9587472 L 54.5020806 20.1511361 L 58.0165528 20.1511361 L 58.0165528 21.4811361 L 55.0879139 21.4811361 L 55.0879139 27.3473861 L 61.7706361 27.3473861 C 62.6441083 27.3473861 63.355025 26.6364694 63.355025 25.7619417 L 63.355025 21.4811361 L 60.4263861 21.4811361 L 60.4263861 20.1511361 L 63.7170806 20.1511361 L 63.7170806 17.9587472 L 60.4263861 17.9587472 L 60.4263861 16.6276917 L 64.5773583 16.6276917 L 64.5773583 26.965275 C 64.5773583 27.4381639 64.1920806 27.8229139 63.7186639 27.8229139 L 61.1003583 27.8229139 L 61.7431917 30.0158306 L 64.0448306 30.0158306 C 65.6666917 30.0158306 66.9866639 28.6958583 66.9866639 27.0734694 L 66.9866639 14.4353028 L 63.6168028 14.4353028 L 64.3282472 12.4118028 L 67.5862194 12.4118028 L 67.5862194 10.2194139 L 60.5324694 10.2194139 L 60.5324694 7.83069167 Z" stroke-linecap="round" /> <path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(40,40,40); fill-rule: evenodd; opacity: 1;" transform=" translate(-58.5, -19)" d="M 61.0482034 12.5428809 L 60.4395091 14.5494945 L 56.5610272 14.5494945 L 55.9523329 12.5428809 L 61.0482034 12.5428809 Z M 60.4732957 23.7106221 L 60.4732957 24.8667539 C 60.4732957 25.0394671 60.3290325 25.1797312 60.1525916 25.1797312 L 56.5272406 25.1797312 L 56.5272406 23.7106221 L 60.4732957 23.7106221 Z M 59.8324237 8 L 57.1686489 8 L 57.1686489 10.3687879 L 50 10.3687879 L 50 12.5428809 L 53.3100098 12.5454978 L 54.0334711 14.5521113 L 50.6097669 14.5489711 L 50.6097669 30 L 53.0584876 30 L 53.0584876 16.7235875 L 57.2759078 16.7235875 L 57.2759078 18.0435351 L 53.7047225 18.0435351 L 53.7047225 20.2176282 L 57.2759078 20.2176282 L 57.2759078 21.5365291 L 54.3000095 21.5365291 L 54.3000095 27.3538242 L 61.0905707 27.3538242 C 61.9781381 27.3538242 62.7005268 26.6488403 62.7005268 25.7816106 L 62.7005268 21.5365291 L 59.7246285 21.5365291 L 59.7246285 20.2176282 L 63.0684249 20.2176282 L 63.0684249 18.0435351 L 59.7246285 18.0435351 L 59.7246285 16.7235875 L 63.9425849 16.7235875 L 63.9425849 26.9749019 C 63.9425849 27.4438444 63.5510899 27.8253836 63.0700338 27.8253836 L 60.4094766 27.8253836 L 61.0626834 30 L 63.4014638 30 C 65.0494968 30 66.3907694 28.6910432 66.3907694 27.0821934 L 66.3907694 14.5494945 L 62.9665289 14.5494945 L 63.6894539 12.5428809 L 67 12.5428809 L 67 10.3687879 L 59.8324237 10.3687879 L 59.8324237 8 Z" stroke-linecap="round" />
</g> </g>
<g transform="matrix(1 0 0 1 27.17 6.25)" id="Fill-9" > <g transform="matrix(1 0 0 1 27 6.5)" id="Fill-9" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-73.67, -25.25)" d="M 74.0896028 20.9722 C 73.324325 22.9703667 71.9003806 26.6906722 71.0163528 28.6851444 L 70.9181861 28.9083944 L 73.1839361 29.7296167 L 73.2699639 29.53645 C 74.4009917 27.0025889 75.4101028 24.4666167 76.354825 21.78445 L 76.4302972 21.5707 L 74.1692972 20.7647833 L 74.0896028 20.9722 Z" stroke-linecap="round" /> <path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(40,40,40); fill-rule: evenodd; opacity: 1;" transform=" translate(-73.5, -25.5)" d="M 73.8767714 21.2082303 C 73.1825929 23.2142353 71.8909422 26.9491346 71.0890463 28.9514306 L 71 29.1755563 L 73.055247 30 L 73.1332823 29.8060756 C 74.1592302 27.2622748 75.0745883 24.7163546 75.9315396 22.0236665 L 76 21.8090781 L 73.9490617 21 L 73.8767714 21.2082303 Z" stroke-linecap="round" />
</g> </g>
<g transform="matrix(1 0 0 1 27.18 -7.31)" id="Fill-11" > <g transform="matrix(1 0 0 1 27 -7.5)" id="Fill-11" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-73.68, -11.69)" d="M 72.5371972 12.3159583 C 73.2386139 12.8574583 74.033975 13.4712639 74.5332528 13.900875 L 74.713225 14.0560417 L 76.2052528 12.1660694 L 76.043225 12.0235694 C 75.3581694 11.421375 74.2651417 10.5584583 72.7952806 9.459625 L 72.6147806 9.32451389 L 71.1570583 11.2324306 L 71.3291139 11.3717639 C 71.6441972 11.6266806 72.0775028 11.9607639 72.5371972 12.3159583" stroke-linecap="round" /> <path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(40,40,40); fill-rule: evenodd; opacity: 1;" transform=" translate(-73.5, -11.5)" d="M 72.3669629 12.1611824 C 73.0616832 12.7334077 73.8494511 13.3820413 74.3439624 13.836029 L 74.5222164 14 L 76 12.0027886 L 75.8395191 11.852203 C 75.1610037 11.2158394 74.0784109 10.3039598 72.6225823 9.14277747 L 72.4438055 9 L 71 11.016174 L 71.170413 11.1634133 C 71.4824882 11.4327942 71.9116571 11.7858338 72.3669629 12.1611824" stroke-linecap="round" />
</g> </g>
<g transform="matrix(1 0 0 1 26.94 -2.15)" id="Fill-13" > <g transform="matrix(1 0 0 1 26.5 -2.5)" id="Fill-13" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-73.44, -16.85)" d="M 74.7140167 19.4095556 L 76.2071 17.5185278 L 76.0413778 17.3765556 C 74.8581 16.36375 73.5307389 15.3161111 72.3026 14.4262778 L 72.1226278 14.2953889 L 70.6654333 16.2122778 L 70.8527944 16.3495 C 72.0524333 17.2240278 73.3597389 18.2568889 74.5340444 19.2565 L 74.7140167 19.4095556 Z" stroke-linecap="round" /> <path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(40,40,40); fill-rule: evenodd; opacity: 1;" transform=" translate(-73, -16.5)" d="M 74.3834286 19 L 76 17.1511868 L 75.8205714 17.0123839 C 74.5394286 16.0221878 73.1022857 14.997936 71.7725714 14.127967 L 71.5777143 14 L 70 15.874097 L 70.2028571 16.0082559 C 71.5017143 16.8632611 72.9171429 17.873065 74.1885714 18.8503612 L 74.3834286 19 Z" stroke-linecap="round" />
</g> </g>
<g transform="matrix(1 0 0 1 38.09 -0.08)" id="Fill-15" > <g transform="matrix(1 0 0 1 38 0)" id="Fill-15" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-84.59, -18.92)" d="M 87.0968972 12.4118028 L 86.4973417 14.4353028 L 82.6809806 14.4353028 L 82.0819528 12.4118028 L 87.0968972 12.4118028 Z M 86.5305917 23.673525 L 86.5305917 24.8393861 C 86.5305917 25.0135528 86.3886194 25.1549972 86.2155083 25.1549972 L 82.6477306 25.1549972 L 82.6477306 23.673525 L 86.5305917 23.673525 Z M 85.8998972 7.83069167 L 83.278425 7.83069167 L 83.278425 10.2194139 L 76.224675 10.2194139 L 76.224675 12.4118028 L 79.4815917 12.4144417 L 80.1930361 14.4379417 L 76.8242306 14.434775 L 76.8242306 30.0158306 L 79.2335361 30.0158306 L 79.2335361 16.6276917 L 83.3839806 16.6276917 L 83.3839806 17.9587472 L 79.8700361 17.9587472 L 79.8700361 20.1511361 L 83.3839806 20.1511361 L 83.3839806 21.4811361 L 80.4558694 21.4811361 L 80.4558694 27.3473861 L 87.1380639 27.3473861 C 88.0120639 27.3473861 88.7224528 26.6364694 88.7224528 25.7619417 L 88.7224528 21.4811361 L 85.7943417 21.4811361 L 85.7943417 20.1511361 L 89.0845083 20.1511361 L 89.0845083 17.9587472 L 85.7943417 17.9587472 L 85.7943417 16.6276917 L 89.9447861 16.6276917 L 89.9447861 26.965275 C 89.9447861 27.4381639 89.5595083 27.8229139 89.0866194 27.8229139 L 86.4677861 27.8229139 L 87.1106194 30.0158306 L 89.4122583 30.0158306 C 91.0346472 30.0158306 92.3546194 28.6958583 92.3546194 27.0734694 L 92.3546194 14.4353028 L 88.9852861 14.4353028 L 89.6967306 12.4118028 L 92.9536472 12.4118028 L 92.9536472 10.2194139 L 85.8998972 10.2194139 L 85.8998972 7.83069167 Z" stroke-linecap="round" /> <path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(40,40,40); fill-rule: evenodd; opacity: 1;" transform=" translate(-84.5, -19)" d="M 87.0483642 12.5428809 L 86.4390952 14.5494945 L 82.5609048 14.5494945 L 81.9521721 12.5428809 L 87.0483642 12.5428809 Z M 86.4728839 23.7106221 L 86.4728839 24.8667539 C 86.4728839 25.0394671 86.3286115 25.1797312 86.1526958 25.1797312 L 82.5271161 25.1797312 L 82.5271161 23.7106221 L 86.4728839 23.7106221 Z M 85.8319715 8 L 83.1680285 8 L 83.1680285 10.3687879 L 76 10.3687879 L 76 12.5428809 L 79.3096823 12.5454978 L 80.0326529 14.5521113 L 76.609269 14.5489711 L 76.609269 30 L 79.057608 30 L 79.057608 16.7235875 L 83.2752942 16.7235875 L 83.2752942 18.0435351 L 79.70442 18.0435351 L 79.70442 20.2176282 L 83.2752942 20.2176282 L 83.2752942 21.5365291 L 80.2997445 21.5365291 L 80.2997445 27.3538242 L 87.0901978 27.3538242 C 87.9783576 27.3538242 88.7002555 26.6488403 88.7002555 25.7816106 L 88.7002555 21.5365291 L 85.7247058 21.5365291 L 85.7247058 20.2176282 L 89.0681768 20.2176282 L 89.0681768 18.0435351 L 85.7247058 18.0435351 L 85.7247058 16.7235875 L 89.942392 16.7235875 L 89.942392 26.9749019 C 89.942392 27.4438444 89.5508723 27.8253836 89.0703221 27.8253836 L 86.4090608 27.8253836 L 87.0623087 30 L 89.4012367 30 C 91.0499101 30 92.3912673 28.6910432 92.3912673 27.0821934 L 92.3912673 14.5494945 L 88.9673471 14.5494945 L 89.6903177 12.5428809 L 93 12.5428809 L 93 10.3687879 L 85.8319715 10.3687879 L 85.8319715 8 Z" stroke-linecap="round" />
</g> </g>
<g transform="matrix(1 0 0 1 -27.57 -0.07)" id="Fill-17" > <g transform="matrix(1 0 0 1 -27.5 0)" id="Fill-17" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-18.93, -18.93)" d="M 30.0177306 37.7670389 L 7.83839722 37.7670389 C 3.55811944 37.7670389 0.0890361111 34.2974278 0.0890361111 30.0176778 L 0.0890361111 7.83834444 C 0.0890361111 3.55806667 3.55811944 0.0889833333 7.83839722 0.0889833333 L 30.0177306 0.0889833333 C 34.2974806 0.0889833333 37.7670917 3.55806667 37.7670917 7.83834444 L 37.7670917 30.0176778 C 37.7670917 34.2974278 34.2974806 37.7670389 30.0177306 37.7670389" stroke-linecap="round" /> <path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-19, -19)" d="M 7.81557641 38 C 3.49872531 38 0 34.5007424 0 30.1844236 L 0 7.81557641 C 0 3.49872531 3.49872531 0 7.81557641 0 L 30.1844236 0 C 34.5007424 0 38 3.49872531 38 7.81557641 L 38 30.1844236 C 38 34.5007424 34.5007424 38 30.1844236 38 L 7.81557641 38 Z" stroke-linecap="round" />
</g> </g>
<g transform="matrix(1 0 0 1 -27.57 -0.07)" id="Stroke-19" > <g transform="matrix(1 0 0 1 -27.5 0)" id="Stroke-19" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: none; fill-rule: evenodd; opacity: 1;" transform=" translate(-18.93, -18.93)" d="M 30.0177306 37.7670389 L 7.83839722 37.7670389 C 3.55811944 37.7670389 0.0890361111 34.2974278 0.0890361111 30.0176778 L 0.0890361111 7.83834444 C 0.0890361111 3.55806667 3.55811944 0.0889833333 7.83839722 0.0889833333 L 30.0177306 0.0889833333 C 34.2974806 0.0889833333 37.7670917 3.55806667 37.7670917 7.83834444 L 37.7670917 30.0176778 C 37.7670917 34.2974278 34.2974806 37.7670389 30.0177306 37.7670389 Z" stroke-linecap="round" /> <path style="stroke: rgb(40,40,40); stroke-width: 0.5; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: none; fill-rule: evenodd; opacity: 1;" transform=" translate(-19, -19)" d="M 30.1844236 0.25 C 32.273614 0.25 34.165062 1.09675306 35.5341855 2.46587654 C 36.903224 3.8349151 37.75 5.72625825 37.75 7.81557641 L 37.75 7.81557641 L 37.75 30.1844236 C 37.75 32.2735491 36.9031671 34.1649422 35.5340547 35.5340547 C 34.1649422 36.9031671 32.2735491 37.75 30.1844236 37.75 L 30.1844236 37.75 L 7.81557641 37.75 C 5.72625825 37.75 3.8349151 36.903224 2.46587654 35.5341855 C 1.09675306 34.165062 0.25 32.273614 0.25 30.1844236 L 0.25 30.1844236 L 0.25 7.81557641 C 0.25 5.72619329 1.0966961 3.83479537 2.46574574 2.46574574 C 3.83479537 1.0966961 5.72619329 0.25 7.81557641 0.25 L 7.81557641 0.25 Z" stroke-linecap="round" />
</g> </g>
<g transform="matrix(1 0 0 1 -27.16 0.77)" id="Fill-21" > <g transform="matrix(1 0 0 1 -27 1)" id="Fill-21" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,100,0); fill-rule: evenodd; opacity: 1;" transform=" translate(-19.34, -19.77)" d="M 19.419425 25.8178333 C 23.9799528 25.6753333 27.5957583 22.0463333 27.6490639 17.5401667 L 27.6490639 13.6662778 L 32.6666472 13.6662778 L 32.6666472 17.9497222 C 32.5690083 24.9169167 26.5122306 30.41425 19.419425 30.5720556 L 19.419425 30.571 C 12.2105083 30.5261389 6.10675833 24.9902778 6.00736001 17.9486667 L 6.00736001 10.2483889 C 5.99645278 9.46094444 6.50945278 8.95005556 7.28423056 8.96113889 L 27.6469528 8.96008333 L 27.6469528 13.6641667 L 11.6790361 13.6683889 C 11.2694806 13.6683889 11.0230083 13.9180278 11.0230083 14.3238889 L 11.0230083 17.4620556 C 11.0773694 22.0278611 14.7554528 25.7708611 19.4183694 25.8178333 L 19.419425 25.8178333 Z" stroke-linecap="round" /> <path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,100,0); fill-rule: evenodd; opacity: 1;" transform=" translate(-19.5, -20)" d="M 27.9182906 17.7341327 L 27.9182906 13.7906909 L 33 13.7906909 L 33 18.1510415 C 32.9011133 25.2433271 26.7669283 30.8393612 19.5834748 31 C 12.2824262 30.9532589 6.10066866 25.3180053 6 18.149967 L 6 10.3114362 C 5.98895337 9.50985372 6.50850965 8.98979218 7.29318929 9.00107451 L 27.9161525 9 L 27.9161525 13.7885418 L 11.7441616 13.7928399 C 11.3293718 13.7928399 11.0797496 14.0469609 11.0797496 14.4601089 L 11.0797496 17.6546192 C 11.1348055 22.3024005 14.8598957 26.1126035 19.5824057 26.1604191 C 24.2022873 26.0153606 27.8643038 22.3212044 27.9182906 17.7341327 Z" stroke-linecap="round" />
</g> </g>
</g> </g>
</g> </g>

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

@ -0,0 +1,146 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 90.6 26.7" style="enable-background:new 0 0 90.6 26.7;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#DA0E2C;}
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
.st2{fill-rule:evenodd;clip-rule:evenodd;fill:#EFC018;}
.st3{fill-rule:evenodd;clip-rule:evenodd;fill:#231815;}
.st4{fill:#231815;}
.st5{fill:#040000;}
</style>
<g>
<g>
<path class="st0" d="M6.5,0.8h15.8c2.6,0,4.7,2.1,4.7,4.7v15.8c0,2.6-2.1,4.7-4.7,4.7H6.5c-2.6,0-4.7-2.1-4.7-4.7V5.5
C1.8,2.9,3.9,0.8,6.5,0.8z"/>
<g>
<path class="st1" d="M5,14.9c-0.1-0.2-0.1-0.3-0.1-0.5v-2.7c0-0.3-0.1-0.6-0.3-0.8c-0.2-0.2-0.5-0.3-0.8-0.3H3.7v0.1v3.7
c0,0.4,0.1,0.7,0.2,1c0.1,0.3,0.3,0.6,0.6,0.8c0.3,0.3,0.5,0.4,0.8,0.6c0.3,0.1,0.6,0.2,1,0.2h1.2h0.1v-0.1c0-0.1,0-0.3-0.1-0.4
c-0.1-0.1-0.1-0.2-0.2-0.4l0,0c-0.1-0.1-0.2-0.2-0.4-0.2c-0.1-0.1-0.3-0.1-0.4-0.1H6.3c-0.2,0-0.4,0-0.5-0.1
c-0.2-0.1-0.3-0.2-0.4-0.3C5.2,15.2,5.1,15,5,14.9z"/>
<path class="st1" d="M23.7,14.9c0.1-0.2,0.1-0.3,0.1-0.5v-2.7c0-0.3,0.1-0.6,0.3-0.8c0.2-0.2,0.5-0.3,0.8-0.3H25v0.1v3.7
c0,0.4-0.1,0.7-0.2,1c-0.1,0.3-0.3,0.6-0.6,0.8c-0.3,0.3-0.5,0.4-0.8,0.6c-0.3,0.1-0.6,0.2-1,0.2h-1.2h-0.1v-0.1
c0-0.1,0-0.3,0.1-0.4c0.1-0.1,0.1-0.2,0.2-0.4l0,0c0.1-0.1,0.2-0.2,0.4-0.2c0.1-0.1,0.3-0.1,0.4-0.1h0.2c0.2,0,0.4,0,0.5-0.1
c0.2-0.1,0.3-0.2,0.4-0.3C23.5,15.2,23.6,15,23.7,14.9z"/>
<path class="st1" d="M10,12.9c0.8,0,1.4,0.6,1.4,1.4c0,0.8-0.6,1.4-1.4,1.4c-0.8,0-1.4-0.6-1.4-1.4C8.6,13.6,9.2,12.9,10,12.9
L10,12.9z M18.7,12.9c-0.8,0-1.4,0.6-1.4,1.4c0,0.8,0.6,1.4,1.4,1.4c0.8,0,1.4-0.6,1.4-1.4C20.1,13.6,19.5,12.9,18.7,12.9
L18.7,12.9z M18.7,11.7c0.5,0,1,0.1,1.3,0.4v-0.4v-0.1c0-0.3,0.1-0.6,0.3-0.8c0.2-0.2,0.5-0.3,0.8-0.3h0.1v0.1v3.7
c0,0,0,0.1,0,0.1c0,1.4-1.2,2.5-2.6,2.5c-1.4,0-2.6-1.2-2.6-2.6S17.3,11.7,18.7,11.7L18.7,11.7z M10,11.7c-0.5,0-1,0.1-1.3,0.4
v-0.4v-0.1c0-0.3-0.1-0.6-0.3-0.8c-0.2-0.2-0.5-0.3-0.8-0.3H7.4v0.1v3.7c0,0,0,0.1,0,0.1c0,1.4,1.2,2.5,2.6,2.5
c1.4,0,2.6-1.2,2.6-2.6S11.4,11.7,10,11.7L10,11.7z M15.4,14.1c0.2,0.2,0.3,0.5,0.3,0.8v0.1h-0.1h-1.6c-0.1,0-0.3,0-0.4-0.1
c-0.1-0.1-0.2-0.1-0.4-0.2c-0.1-0.1-0.2-0.2-0.2-0.4C13,14.1,13,14,13,13.8v-0.1h0.1h1.6C14.9,13.7,15.2,13.8,15.4,14.1z"/>
<path class="st1" d="M20.4,17.5c-1.1,2.3-3.4,3.9-6.1,3.9c-2.7,0-5-1.6-6.1-3.9c1.2,0,1.4,0.1,1.8,0.6c1,1.3,2.6,2.1,4.3,2.1
c1.7,0,3.3-0.8,4.3-2.1C19.1,17.6,19.2,17.5,20.4,17.5z"/>
<path class="st2" d="M13.2,5.6L9.5,7.8L5.7,10c0.6,0.3,1.1,0.4,1.7,0.4c0.6,0,1.1-0.2,1.8-0.5l0,0L10.6,9c1.1-0.7,2.3-1.3,3.4-2
c0.4-0.2,0.5-0.2,0.8,0l0,0c1.1,0.7,2.3,1.3,3.4,2l1.5,0.9l0,0l0,0l0,0l0,0c0.6,0.3,1.2,0.5,1.8,0.5c0.5,0,1.1-0.1,1.7-0.4
l-3.8-2.3l-3.7-2.2C14.6,5,14.1,5,13.2,5.6z"/>
</g>
</g>
<g>
<g>
<path class="st3" d="M43.4,4.9H32.8c-0.4,0-0.7,0.3-0.7,0.7v2.3c0,0.4,0.3,0.7,0.7,0.7h10.6c0.4,0,0.7-0.3,0.7-0.7V5.6
C44.1,5.2,43.8,4.9,43.4,4.9z M36.9,7.6h-2.6V7.1h2.6V7.6z M36.9,6.3L36.9,6.3l-2.6,0.1V6h2.6V6.3z M41.9,7.6h-2.7V7.1h2.7V7.6z
M41.9,6.3L41.9,6.3l-2.6,0.1h-0.1V6h0.1h1.9h0.7V6.3z"/>
<path class="st4" d="M44.2,10.2H32c-0.2,0-0.4-0.2-0.4-0.4V9.4C31.6,9.2,31.8,9,32,9h12.2c0.2,0,0.4,0.2,0.4,0.4v0.3
C44.7,10,44.5,10.2,44.2,10.2z"/>
<path class="st3" d="M43.3,3.3h-0.5h-2h-5.6l0.2-0.3h-2l-0.9,1.6h2l0.1-0.2h5.7l-0.9,0.5h-5.7c0,0,0,0,0,0h9.2c0,0,0,0,0,0h-0.1
h-0.1l0.8-0.5c0.2-0.1,0.4-0.3,0.4-0.5v0C43.8,3.6,43.6,3.3,43.3,3.3z"/>
<g>
<path class="st4" d="M74.1,9.1V3.8V3.3c0-0.1-0.1-0.1-0.1-0.1h-1.8c-0.1,0-0.1,0.1-0.1,0.1v9.1c0,0,0,0,0,0v0.3
c0,0.1,0,0.3-0.1,0.4c-0.1,0.1-0.2,0.1-0.3,0.1h-1.7l-0.7,1.6h1.6v0H73h0.5c0.3,0,0.6-0.3,0.6-0.6V9.1
C74.1,9.1,74.1,9.1,74.1,9.1z"/>
<path class="st4" d="M69.3,12.5h1.5c0.1,0,0.1-0.1,0.1-0.1V3.9c0-0.1-0.1-0.1-0.1-0.1h-1.5c-0.1,0-0.1,0.1-0.1,0.1v8.5
C69.2,12.5,69.3,12.5,69.3,12.5z"/>
<path class="st4" d="M61.4,11.5h2.5v1.2c0,0.1,0.1,0.1,0.1,0.1h1.6c0.1,0,0.1-0.1,0.1-0.1v-1.2h2.5c0.1,0,0.1-0.1,0.1-0.1v-1.3
c0-0.1-0.1-0.1-0.1-0.1h-2.5V8.8c0-0.1-0.1-0.1-0.1-0.1H64c-0.1,0-0.1,0.1-0.1,0.1v1.1h-2.5c-0.1,0-0.1,0.1-0.1,0.1v1.3
C61.2,11.5,61.3,11.5,61.4,11.5z"/>
<path class="st4" d="M68.4,13.3h-7.2c-0.1,0-0.1,0.1-0.1,0.1v1.3c0,0.1,0.1,0.1,0.1,0.1h7.2c0.1,0,0.1-0.1,0.1-0.1v-1.3
C68.5,13.3,68.5,13.3,68.4,13.3z"/>
</g>
<path class="st4" d="M68.4,3.1h-7.3c-0.1,0-0.1,0.1-0.1,0.1v1.3c0,0.1,0.1,0.1,0.1,0.1h1.4L61.1,7c-0.2,1,0.3,1.4,1.4,1.4h2.1v0
h2.1c0.6,0,1.1-0.2,1.3-0.6c0.2-0.3,0.4-0.7,0.4-1.2v0c0,0,0,0,0,0V5.7c0,0,0,0,0,0v0h0c0-0.1-0.1-0.1-0.1-0.1h-1.6
c-0.1,0-0.1,0.1-0.1,0.1V6c0,0.6-0.3,0.8-0.6,0.8h-1.4v0h-0.8l1.3-2h3.4c0.1,0,0.1-0.1,0.1-0.1V3.3C68.5,3.2,68.5,3.1,68.4,3.1z"
/>
<g>
<path class="st4" d="M51.1,12.1h1.1c0.1,0,0.2-0.1,0.2-0.2V3.6c0-0.1-0.1-0.2-0.2-0.2h-1.1c-0.1,0-0.2,0.1-0.2,0.2v8.3
C50.9,12,51,12.1,51.1,12.1z"/>
<path class="st4" d="M54.6,3.1H53c-0.1,0-0.2,0.1-0.2,0.2v0.4v8v1.1c0,0.1,0,0.2-0.1,0.3c-0.1,0.1-0.2,0.1-0.4,0.1h-0.9h-1.1
h-0.7V9.8v0h0.7c0.1,0,0.1-0.1,0.1-0.1V8.3c0-0.1-0.1-0.1-0.1-0.1h-0.7V4.9h0.5v0h0.1c0.1,0,0.1-0.1,0.1-0.1V3.4
c0-0.1-0.1-0.1-0.1-0.1h-0.1h-2.3h-0.8l-1.3,0.9v0.7h1.6v3.3h-0.7c-0.1,0-0.1,0.1-0.1,0.1v1.4c0,0.1,0.1,0.1,0.1,0.1h0.7v0v3.4
h-1.1v1.6h4.4h0.8h0.1h1.9h0.2h0.5c0.3,0,0.6-0.3,0.6-0.6v-0.6v-0.5v-1.5v-8V3.3C54.8,3.2,54.7,3.1,54.6,3.1z"/>
<path class="st4" d="M59.2,13.2h-0.7V9.8H59c0.1,0,0.1-0.1,0.1-0.1V8.3c0-0.1-0.1-0.1-0.1-0.1h-0.6V4.9h0.7
c0.1,0,0.2-0.1,0.2-0.2V3.4c0-0.1-0.1-0.2-0.2-0.2h-0.3h-3.2h-0.2c-0.1,0-0.2,0.1-0.2,0.2v1.3c0,0.1,0.1,0.2,0.2,0.2h0.8v3.3
h-0.7c-0.1,0-0.1,0.1-0.1,0.1v1.4c0,0.1,0.1,0.1,0.1,0.1h0.7v3.4h-0.8c-0.1,0-0.2,0.1-0.2,0.2v1.3c0,0.1,0.1,0.2,0.2,0.2h0.7
h1.1h1.1h0.5c0.3,0,0.6-0.3,0.6-0.6v-0.4v0v-0.5C59.3,13.3,59.3,13.2,59.2,13.2z"/>
</g>
<g>
<path class="st3" d="M84.7,9.5c-0.1,0.2,0,0.6,0,0.6s0.9,2.8,1.1,3.8c0.1,0.3,0.2,0.5,0.6,0.8c0.4,0.3,1,0.2,1,0.2h1.3l-1.5-4.7
c0,0,0-0.1,0-0.1c0,0,0.1,0,0.1,0l1.6-0.3v-1V8.7l-3.6,0.5C85.2,9.2,84.8,9.3,84.7,9.5z"/>
<path class="st3" d="M88.8,5.2C88.8,5.2,88.8,5.2,88.8,5.2l0-0.8c0,0,0,0,0,0c0,0,0-0.1,0-0.1v0c0-0.5-0.4-0.9-0.9-0.9h-0.6
c0,0,0,0,0,0c0,0-0.1,0-0.1,0h-4L83,2.8h-2.2L81,3.4h0h-0.8h-2.7c0,0-0.1,0-0.1,0c0,0,0,0,0,0h-0.6c-0.5,0-0.9,0.4-0.9,0.9v0
c0,0,0,0.1,0,0.1c0,0,0,0,0,0V6c0,0.1,0.1,0.1,0.1,0.1h1.6c0.1,0,0.1-0.1,0.1-0.1V5.4c0-0.1,0-0.3,0.1-0.4
c0.1-0.1,0.2-0.1,0.3-0.1h2h1.4H82h4.5c0.1,0,0.2,0,0.3,0.1c0.1,0.1,0.1,0.2,0.1,0.4v0.1V6v0c0,0.1,0,0.1,0.1,0.1h0h1.6h0
c0.1,0,0.1,0,0.1-0.1v0V6h0V5.2z"/>
<path class="st3" d="M88.7,6.5L88.7,6.5h-0.9h-5h-0.6h-5.4h-0.8c-0.1,0-0.1,0.1-0.1,0.1v0.8c0,0.1,0.1,0.1,0.1,0.1h0.8h5.4h0.6
h1.6l-8.4,1.2c-0.1,0-0.2,0.1-0.2,0.1v0.9c0,0.1,0.1,0.1,0.2,0.1l3.8-0.5L81,9.2c0,0,0,0,0,0c0.1,0,0.2,0,0.2,0.1
c0,0.1,0,0.3,0,0.4v0.3l-5.4,1.2c0,0-0.1,0.1-0.1,0.1v0.9c0,0.1,0,0.1,0.1,0.1l5.4-1.2v1l-5.4,1.2c0,0-0.1,0.1-0.1,0.1v0.9
c0,0.1,0,0.1,0.1,0.1l5.4-1.2V14c0,0.1,0,0.1-0.1,0.2c-0.1,0-0.1,0.1-0.2,0.1h-1l-0.5,0.6h2h1.2H83h0.5c0.3,0,0.6-0.3,0.6-0.6
v-0.2v-0.5v-0.2v-1.9V9.7c0,0,0-0.6-0.2-0.9c0,0,0,0,0,0l4.5-0.6v0c0.3-0.1,0.5-0.3,0.5-0.6V7.4V6.8V6.7
C88.8,6.6,88.8,6.5,88.7,6.5z"/>
</g>
<path class="st3" d="M43.3,10.5H32.9c-0.4,0-0.7,0.3-0.7,0.7v2.9c0,0.4,0.3,0.7,0.7,0.7h10.4c0.4,0,0.7-0.3,0.7-0.7v-2.9
C44,10.9,43.7,10.5,43.3,10.5z M41.8,11.8V12v0.1v1.2v0.2v0.1v0.1h-7.1h-0.2v-0.4h0.2h5.3h1.4v-1.2h-6.6h-0.2v-0.4h0.2h5.3h1.8
V11.8z"/>
</g>
<g>
<path class="st5" d="M36.7,23.3v0.4h-5.1v-0.4h0.6v-1.3h3.9v1.3H36.7z M32.9,19.4h-1.3v-0.4h1.3v-0.4h0.4v0.4h1.5v-0.4h0.4v0.4
h1.3v0.4h-1.3v0.3h-0.4v-0.3h-1.5v0.3h-0.4V19.4z M32,21.7v-1.6h0.4v1.6H32z M32.6,23.3h0.8v-0.9h-0.8V23.3z M33.1,19.9h0.4v1.9
h-0.4V19.9z M33.7,22.4v0.9h0.8v-0.9H33.7z M36.4,20.7h-1.7c-0.1,0.4-0.3,0.7-0.5,0.9c-0.1-0.1-0.2-0.2-0.3-0.2
c0.3-0.4,0.6-1,0.7-1.6l0.4,0.1c0,0.1-0.1,0.3-0.1,0.4h1.6V20.7z M34.9,22.4v0.9h0.8v-0.9H34.9z M35.6,21.9
c-0.1-0.3-0.4-0.7-0.6-1l0.3-0.2c0.3,0.3,0.5,0.7,0.7,1L35.6,21.9z"/>
<path class="st5" d="M39.7,20.6c-0.2-0.3-0.6-0.8-1-1.2c-0.3,0.5-0.6,1-1.1,1.4c-0.1-0.1-0.2-0.2-0.3-0.3
c0.6-0.5,1.1-1.2,1.3-1.9l0.4,0.1c0,0.1-0.1,0.2-0.1,0.3c0.4,0.4,0.9,0.9,1.1,1.2L39.7,20.6z M39.7,21.4
c-0.2,0.5-0.6,1.2-0.9,1.6c0.2,0.2,0.4,0.4,0.5,0.6L39,23.8c-0.2-0.3-0.8-0.9-1.2-1.2l0.3-0.2c0.1,0.1,0.3,0.2,0.4,0.4
c0.2-0.3,0.5-0.8,0.7-1.1h-1.5v-0.4h1.7l0.1,0L39.7,21.4z M38.6,20.1c0.2,0.2,0.4,0.5,0.6,0.6L38.8,21c-0.1-0.2-0.4-0.5-0.6-0.7
L38.6,20.1z M41.4,20.5c0,2.1-0.1,2.9-1.6,3.3c0-0.1-0.1-0.2-0.2-0.3c1.3-0.4,1.4-1.1,1.4-3H41.4z M40.8,19.9
c0.1-0.2,0.1-0.4,0.2-0.6H40V19h2.5v0.4h-1c-0.1,0.2-0.2,0.4-0.2,0.6h1.1v2.6h-0.4v-2.3h-1.4v2.3h-0.4v-2.6H40.8z M41.5,22.6
c0.4,0.3,0.9,0.7,1.1,0.9l-0.3,0.3c-0.2-0.3-0.7-0.7-1.1-1L41.5,22.6z"/>
<path class="st5" d="M45,21.5c-0.2,0.1-0.5,0.1-0.7,0.2v1.6c0,0.2-0.1,0.4-0.2,0.4c-0.1,0.1-0.4,0.1-0.8,0.1
c0-0.1-0.1-0.3-0.1-0.4c0.3,0,0.5,0,0.6,0c0.1,0,0.1,0,0.1-0.1v-1.5L43.3,22l-0.1-0.4c0.2-0.1,0.5-0.1,0.8-0.2v-1.2h-0.7v-0.4
h0.7v-1.1h0.4v1.1H45v0.4h-0.6v1.1c0.2-0.1,0.4-0.1,0.6-0.2L45,21.5z M48.1,20.9c-0.2,0.8-0.6,1.4-1.2,1.9
c0.4,0.3,0.9,0.6,1.5,0.7c-0.1,0.1-0.2,0.2-0.3,0.4c-0.6-0.2-1.1-0.5-1.5-0.8c-0.5,0.4-1,0.6-1.6,0.8c0-0.1-0.1-0.3-0.2-0.4
c0.6-0.1,1.1-0.4,1.5-0.7c-0.4-0.4-0.7-0.9-0.9-1.6l0,0h-0.2v-0.4h1.2v-0.8h-1.3v-0.4h1.3v-0.9h0.4v0.9h1.4v0.4h-1.4v0.8h0.9
l0.1,0L48.1,20.9z M45.8,21.2c0.2,0.5,0.5,0.9,0.8,1.3c0.4-0.4,0.7-0.8,0.9-1.3H45.8z"/>
<path class="st5" d="M54.1,23v0.4H49V23h2.3v-3.3h-2v-0.4h4.5v0.4h-2V23H54.1z"/>
<path class="st5" d="M56.8,23.3c0,0.2,0,0.4-0.2,0.4c-0.1,0.1-0.4,0.1-0.7,0.1c0-0.1-0.1-0.3-0.1-0.4c0.3,0,0.5,0,0.6,0
c0.1,0,0.1,0,0.1-0.1v-1.4h-0.9c-0.1,0.7-0.2,1.4-0.4,1.9c-0.1-0.1-0.2-0.2-0.3-0.2c0.4-0.8,0.4-1.9,0.4-2.8v-2h1.6V23.3z
M56.4,21.5v-1h-0.9v0.3c0,0.2,0,0.4,0,0.6H56.4z M55.6,19.3v0.9h0.9v-0.9H55.6z M59.9,20.9c-0.1,0.8-0.4,1.4-0.8,1.9
c0.3,0.3,0.6,0.6,0.9,0.7c-0.1,0.1-0.2,0.2-0.3,0.3c-0.3-0.2-0.6-0.4-0.9-0.8c-0.3,0.3-0.5,0.5-0.9,0.7c-0.1-0.1-0.2-0.2-0.2-0.3
c0.3-0.2,0.6-0.4,0.9-0.7c-0.3-0.5-0.6-1-0.8-1.6h-0.1v2.7h-0.4v-5h2.4V20c0,0.2-0.1,0.3-0.2,0.4c-0.2,0.1-0.5,0.1-0.9,0.1
c0-0.1-0.1-0.3-0.1-0.4c0.3,0,0.6,0,0.7,0c0.1,0,0.1,0,0.1-0.1v-0.7h-1.6v1.5h1.8l0.1,0L59.9,20.9z M58.2,21.2
c0.2,0.5,0.4,0.9,0.6,1.3c0.2-0.4,0.4-0.8,0.6-1.3H58.2z"/>
<path class="st5" d="M65.2,19.4c-0.3,0.5-0.9,0.9-1.5,1.2c0.6,0.2,1.3,0.3,2,0.3c-0.1,0.1-0.2,0.3-0.2,0.4
c-0.9-0.1-1.7-0.2-2.3-0.5c-0.8,0.3-1.6,0.5-2.4,0.6c0-0.1-0.1-0.3-0.2-0.4c0.7-0.1,1.5-0.2,2.1-0.4c-0.3-0.2-0.6-0.4-0.8-0.7
c-0.2,0.2-0.5,0.4-0.8,0.5c-0.1-0.1-0.2-0.2-0.3-0.3c0.8-0.4,1.4-1,1.6-1.5l0.4,0.1c-0.1,0.2-0.2,0.3-0.4,0.5h2.3l0.1,0
L65.2,19.4z M65.3,21.8c0,0,0,0.1,0,0.2c-0.1,1-0.2,1.5-0.4,1.6c-0.1,0.1-0.2,0.1-0.5,0.2c-0.2,0-0.5,0-0.8,0
c0-0.1-0.1-0.3-0.1-0.4c0.4,0,0.7,0,0.9,0c0.1,0,0.2,0,0.2-0.1c0.1-0.1,0.2-0.5,0.3-1.2h-1.7c-0.4,0.9-1.1,1.4-2.2,1.7
c0-0.1-0.2-0.3-0.2-0.4c1-0.2,1.6-0.6,2-1.3h-1.6v-0.4h1.7c0-0.2,0.1-0.4,0.1-0.6l0.4,0c0,0.2-0.1,0.4-0.1,0.5H65.3z M62.2,19.7
c0.2,0.3,0.6,0.6,1,0.7c0.5-0.2,1-0.5,1.3-0.8L62.2,19.7L62.2,19.7z"/>
<path class="st5" d="M71.6,21.6V22h-5.1v-0.4h1.3v-1.3h-1.1v-0.4h1.1v-1.1h0.4v1.1h1.6v-1.1h0.4v1.1h1.1v0.4h-1.1v1.3H71.6z
M68.5,22.5c-0.4,0.5-1,1-1.6,1.3c-0.1-0.1-0.2-0.2-0.3-0.3c0.6-0.3,1.2-0.8,1.5-1.2L68.5,22.5z M68.2,21.6h1.6v-1.3h-1.6V21.6z
M69.9,22.3c0.5,0.4,1.2,0.9,1.6,1.2l-0.4,0.3c-0.3-0.3-1-0.9-1.5-1.3L69.9,22.3z"/>
<path class="st5" d="M77.3,22.8H75v0.7c0,0.2-0.1,0.3-0.3,0.4c-0.2,0.1-0.5,0.1-1,0.1c0-0.1-0.1-0.2-0.1-0.4c0.4,0,0.8,0,0.9,0
c0.1,0,0.1,0,0.1-0.1v-0.6h-2.3v-0.4h2.3V22c0.4-0.1,0.8-0.2,1.2-0.3h-2.9v-0.3h3.6l0.1,0l0.3,0.2c-0.5,0.3-1.1,0.5-1.8,0.7v0.1
h2.3V22.8z M77.3,19.5h-4.9v-0.4h2.3c-0.1-0.1-0.1-0.3-0.2-0.4l0.4-0.1c0.1,0.2,0.2,0.4,0.2,0.5h2.2V19.5z M73.1,21v-1.1h3.5V21
H73.1z M73.5,20.7h2.7v-0.5h-2.7V20.7z"/>
<path class="st5" d="M83.2,21.8h-2.3v2h-0.4v-2h-2.3v-0.4h2.3v-2h-2V19h4.4v0.4h-2v2h2.3V21.8z M79.2,19.7
c0.2,0.4,0.5,0.9,0.5,1.3l-0.4,0.1c-0.1-0.3-0.3-0.9-0.5-1.3L79.2,19.7z M81.5,21c0.2-0.4,0.5-0.9,0.6-1.3l0.4,0.1
c-0.2,0.5-0.5,1-0.7,1.3L81.5,21z"/>
<path class="st5" d="M87.3,19.3c0.6,0.5,1.2,1.2,1.5,1.6l-0.4,0.3c-0.1-0.1-0.2-0.3-0.3-0.5c-3.2,0.2-3.6,0.2-3.8,0.3
c0-0.1-0.1-0.3-0.1-0.4c0.1,0,0.3-0.1,0.5-0.3c0.2-0.2,0.9-0.9,1.3-1.6l0.4,0.2c-0.4,0.6-1,1.2-1.5,1.7l2.9-0.1
c-0.3-0.3-0.6-0.6-0.8-0.8L87.3,19.3z M84.6,21.5h3.6v2.4h-0.4v-0.3h-2.7v0.3h-0.4V21.5z M85.1,21.9v1.3h2.7v-1.3H85.1z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 904 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 32 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 19 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 30 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 52 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 33 KiB

@ -26,7 +26,7 @@
}, },
{ {
"name": "轻松到家", "name": "轻松到家",
"logo": "", "logo": "/img/company_logos/uyess.jpg",
"url": "http://www.uyess.com/index.html" "url": "http://www.uyess.com/index.html"
}, },
{ {
@ -41,7 +41,7 @@
}, },
{ {
"name": "萨科(深圳)科技有限公司", "name": "萨科(深圳)科技有限公司",
"logo": "/img/company_logos/lbdj.png", "logo": "/img/company_logos/lbdj.svg",
"url": "https://www.lbdj.com/" "url": "https://www.lbdj.com/"
}, },
{ {
@ -66,8 +66,8 @@
}, },
{ {
"name": "众合云科51社保", "name": "众合云科51社保",
"logo": "", "logo": "/img/company_logos/51shebao.png",
"url": "https://home.101hr.com/" "url": "https://www.51shebao.com/?baidupz&guanfang/"
}, },
{ {
"name": "好货云店", "name": "好货云店",
@ -96,7 +96,7 @@
}, },
{ {
"name": "浙江吉利控股集团有限公司", "name": "浙江吉利控股集团有限公司",
"logo": "/img/company_logos/geely.png", "logo": "/img/company_logos/geely.jpg",
"url": "https://www.geely.com/" "url": "https://www.geely.com/"
}, },
{ {
@ -111,7 +111,7 @@
}, },
{ {
"name": "郑州力通水务", "name": "郑州力通水务",
"logo": "/img/company_logos/zzltsw.png", "logo": "/img/company_logos/zzltsw.jpg",
"url": "http://www.zzltsw.com/" "url": "http://www.zzltsw.com/"
}, },
{ {
@ -126,7 +126,7 @@
}, },
{ {
"name": "中新软件(上海)有限公司", "name": "中新软件(上海)有限公司",
"logo": "", "logo": "/img/company_logos/5000m.jpg",
"url": "http://www.5000m.com" "url": "http://www.5000m.com"
}, },
{ {
@ -136,12 +136,12 @@
}, },
{ {
"name": "兰亭集势(成都)科技有限公司", "name": "兰亭集势(成都)科技有限公司",
"logo": "/img/company_logos/lightinthebox.png", "logo": "/img/company_logos/lightinthebox.avif",
"url": "https://www.lightinthebox.com/" "url": "https://www.lightinthebox.com/"
}, },
{ {
"name": "杭州数理大数据有限公司", "name": "杭州数理大数据有限公司",
"logo": "", "logo": "/img/company_logos/data4truth.jpg",
"url": "https://www.data4truth.com/#/" "url": "https://www.data4truth.com/#/"
}, },
{ {
@ -151,7 +151,7 @@
}, },
{ {
"name": "新华智云科技有限公司", "name": "新华智云科技有限公司",
"logo": "/img/company_logos/xinhuazhiyun.png", "logo": "/img/company_logos/xinhuazhiyun.svg",
"url": "https://www.xinhuazhiyun.com" "url": "https://www.xinhuazhiyun.com"
}, },
{ {
@ -161,7 +161,7 @@
}, },
{ {
"name": "深圳市帮客帮科技有限公司", "name": "深圳市帮客帮科技有限公司",
"logo": "/img/company_logos/bangkebang.png", "logo": "/img/company_logos/bangkebang.jpg",
"url": "https://www.bangkebang.com" "url": "https://www.bangkebang.com"
}, },
{ {
@ -174,14 +174,10 @@
"logo": "/img/company_logos/youdao.png", "logo": "/img/company_logos/youdao.png",
"url": "https://www.youdao.com" "url": "https://www.youdao.com"
}, },
{
"name": "神州数码(西安)",
"logo": "/img/company_logos/digitalchina.png",
"url": "https://www.digitalchina.com"
},
{ {
"name": "广联达科技股份有限公司", "name": "广联达科技股份有限公司",
"logo": "/img/company_logos/glodon.png", "logo": "/img/company_logos/glodon.jpg",
"url": "https://www.glodon.com" "url": "https://www.glodon.com"
}, },
{ {
@ -201,12 +197,12 @@
}, },
{ {
"name": "成都全域智旅科技有限公司", "name": "成都全域智旅科技有限公司",
"logo": "/img/company_logos/qyzl.png", "logo": "/img/company_logos/qyzl.jpg",
"url": "http://qyzl.com" "url": "http://qyzl.com"
}, },
{ {
"name": "深圳市华云中盛科技股份有限公司", "name": "深圳市华云中盛科技股份有限公司",
"logo": "/img/company_logos/hua-cloud.png", "logo": "/img/company_logos/hua-cloud.jpg",
"url": "http://www.hua-cloud.cn" "url": "http://www.hua-cloud.cn"
}, },
{ {

@ -78,8 +78,6 @@ public class Constants {
public static final String HEALTH_CHECK_PATH = BASE_PATH + "/health/check"; public static final String HEALTH_CHECK_PATH = BASE_PATH + "/health/check";
public static final String PROBE_MODIFY_REQUEST = "Listening-Configs";
public static final String LONG_PULLING_TIMEOUT = "Long-Pulling-Timeout"; public static final String LONG_PULLING_TIMEOUT = "Long-Pulling-Timeout";
public static final String LONG_PULLING_TIMEOUT_NO_HANGUP = "Long-Pulling-Timeout-No-Hangup"; public static final String LONG_PULLING_TIMEOUT_NO_HANGUP = "Long-Pulling-Timeout-No-Hangup";
@ -122,8 +120,6 @@ public class Constants {
public static final String DEFAULT_GROUP = "default group"; public static final String DEFAULT_GROUP = "default group";
public static final String UNKNOWN = "unknown";
public static final String EXECUTE_TIMEOUT_TRACE = "executeTimeoutTrace"; public static final String EXECUTE_TIMEOUT_TRACE = "executeTimeoutTrace";
public static final long HTTP_EXECUTE_TIMEOUT = 5000L; public static final long HTTP_EXECUTE_TIMEOUT = 5000L;

@ -24,6 +24,8 @@ import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.json.JSONException;
import org.skyscreamer.jsonassert.JSONAssert;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@ -42,7 +44,11 @@ public class JSONUtilTest {
@Test @Test
public void assertToJSONString() { public void assertToJSONString() {
Assert.assertNull(JSONUtil.toJSONString(null)); Assert.assertNull(JSONUtil.toJSONString(null));
Assert.assertEquals(EXPECTED_FOO_JSON, JSONUtil.toJSONString(EXPECTED_FOO)); try {
JSONAssert.assertEquals(EXPECTED_FOO_JSON, JSONUtil.toJSONString(EXPECTED_FOO), false);
} catch (JSONException jse) {
throw new RuntimeException(jse);
}
} }
@Test @Test

@ -19,12 +19,16 @@ package cn.hippo4j.common.toolkit;
import cn.hippo4j.common.model.ThreadPoolParameterInfo; import cn.hippo4j.common.model.ThreadPoolParameterInfo;
import org.junit.Test; import org.junit.Test;
import org.mockito.MockedStatic;
import java.io.IOException; import java.io.IOException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.mockStatic;
public class Md5UtilTest { public class Md5UtilTest {
@Test @Test
@ -50,12 +54,15 @@ public class Md5UtilTest {
@Test @Test
public void assetGetTpContentMd5() { public void assetGetTpContentMd5() {
String md5Result = "ef5ea7cb47377fb9fb85a7125e76715d"; final ThreadPoolParameterInfo threadPoolParameterInfo = new ThreadPoolParameterInfo();
ThreadPoolParameterInfo threadPoolParameterInfo = ThreadPoolParameterInfo.builder().tenantId("prescription") final String mockContent = "mockContent";
.itemId("dynamic-threadpool-example").tpId("message-consume").content("描述信息").corePoolSize(1) final String mockContentMd5 = "34cf17bc632ece6e4c81a4ce8aa97d5e";
.maximumPoolSize(2).queueType(1).capacity(4).keepAliveTime(513L).executeTimeOut(null).rejectedType(4) try (final MockedStatic<ContentUtil> mockedContentUtil = mockStatic(ContentUtil.class)) {
.isAlarm(1).capacityAlarm(80).livenessAlarm(80).allowCoreThreadTimeOut(1).build(); mockedContentUtil.when(() -> ContentUtil.getPoolContent(threadPoolParameterInfo)).thenReturn(mockContent);
Assert.isTrue(md5Result.equals(Md5Util.getTpContentMd5(threadPoolParameterInfo))); final String result = Md5Util.getTpContentMd5(threadPoolParameterInfo);
Assert.isTrue(result.equals(mockContentMd5));
mockedContentUtil.verify(() -> ContentUtil.getPoolContent(threadPoolParameterInfo), times(1));
}
} }
@Test @Test

@ -37,7 +37,7 @@ import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor; import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
public class HttpUtilsTest { public class HttpUtilsTest {
@ -169,7 +169,7 @@ public class HttpUtilsTest {
@Test @Test
public void buildUrl() { public void buildUrl() {
Map<String, String> map = new HashMap<>(); Map<String, String> map = new LinkedHashMap<>();
map.put(password, passwordValue); map.put(password, passwordValue);
map.put(username, usernameValue); map.put(username, usernameValue);
String s = HttpUtil.buildUrl(url + PORT, map); String s = HttpUtil.buildUrl(url + PORT, map);

@ -73,7 +73,8 @@ public class LogMessageTest {
public void testKvShouldPutAllKeyAndValuePairs() { public void testKvShouldPutAllKeyAndValuePairs() {
logMessage.kv("key1", "value1"); logMessage.kv("key1", "value1");
logMessage.kv("key2", "value2"); logMessage.kv("key2", "value2");
assertEquals("key1=value1||key2=value2", logMessage.toString()); String output = logMessage.toString();
assertTrue(output.equals("key1=value1||key2=value2") || output.equals("key2=value2||key1=value1"));
} }
@Test @Test
@ -81,7 +82,8 @@ public class LogMessageTest {
logMessage.setMsg(MESSAGE); logMessage.setMsg(MESSAGE);
logMessage.kv("key1", "value1"); logMessage.kv("key1", "value1");
logMessage.kv("key2", "value2"); logMessage.kv("key2", "value2");
assertEquals("messagekey1=value1||key2=value2", logMessage.toString()); String output = logMessage.toString();
assertTrue(output.equals("messagekey1=value1||key2=value2") || output.equals("messagekey2=value2||key1=value1"));
} }
@Test @Test

@ -90,7 +90,21 @@ public interface BootstrapPropertiesInterface {
/** /**
* Get apollo. * Get apollo.
*/ */
default Map<String, String> getApollo(){ default Map<String, String> getApollo() {
return null;
}
/**
* Get Zookeeper.
*/
default Map<String, String> getZookeeper() {
return null;
}
/**
* Get Polaris.
*/
default Map<String, Object> getPolaris() {
return null; return null;
} }

@ -76,6 +76,11 @@ public class BootstrapConfigProperties implements BootstrapPropertiesInterface {
*/ */
private Map<String, String> etcd; private Map<String, String> etcd;
/**
* polaris config
*/
private Map<String, Object> polaris;
/** /**
* Web config * Web config
* *

@ -66,7 +66,7 @@ public class WeChatSendMessageHandler extends AbstractRobotSendMessageHandler {
weChatReq.setMarkdown(markdown); weChatReq.setMarkdown(markdown);
String responseBody = HttpUtil.post(serverUrl, weChatReq); String responseBody = HttpUtil.post(serverUrl, weChatReq);
WeChatRobotResponse response = JSONUtil.parseObject(responseBody, WeChatRobotResponse.class); WeChatRobotResponse response = JSONUtil.parseObject(responseBody, WeChatRobotResponse.class);
Assert.isTrue(response != null, "Response is null."); Assert.notNull(response, "Response is null.");
if (response.getErrcode() != 0) { if (response.getErrcode() != 0) {
log.error("WeChat failed to send message, reason : {}", response.errmsg); log.error("WeChat failed to send message, reason : {}", response.errmsg);
} }

12
node_modules/.yarn-integrity generated vendored

@ -0,0 +1,12 @@
{
"systemParams": "darwin-arm64-93",
"modulesFolders": [
"node_modules"
],
"flags": [],
"linkedModules": [],
"topLevelPatterns": [],
"lockfileEntries": {},
"files": [],
"artifacts": {}
}

@ -105,8 +105,8 @@ public class WebThreadPoolHandlerConfiguration {
* the Web embedded server loads the {@link ServletWebServerFactory} top-level interface type at the same time * the Web embedded server loads the {@link ServletWebServerFactory} top-level interface type at the same time
*/ */
@Bean @Bean
public UndertowWebThreadPoolHandlerAdapt undertowWebThreadPoolHandler() { public UndertowWebThreadPoolHandlerAdapt undertowWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) {
return new DefaultUndertowWebThreadPoolHandler(); return new DefaultUndertowWebThreadPoolHandler(webThreadPoolRunStateHandler);
} }
} }
} }

@ -89,8 +89,8 @@ public class WebThreadPoolHandlerConfiguration1x {
static class EmbeddedUndertow { static class EmbeddedUndertow {
@Bean @Bean
public WebThreadPoolService undertowWebThreadPoolHandler() { public WebThreadPoolService undertowWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) {
return new UndertowWebThreadPoolHandler1x(); return new UndertowWebThreadPoolHandler1x(webThreadPoolRunStateHandler);
} }
} }
} }

@ -18,6 +18,7 @@
package cn.hippo4j.config.springboot1x.starter.web.undertow; package cn.hippo4j.config.springboot1x.starter.web.undertow;
import cn.hippo4j.adapter.web.undertow.UndertowWebThreadPoolHandlerSupport; import cn.hippo4j.adapter.web.undertow.UndertowWebThreadPoolHandlerSupport;
import cn.hippo4j.common.support.AbstractThreadPoolRuntime;
import cn.hippo4j.config.springboot1x.starter.web.AbstractWebThreadPoolService1x; import cn.hippo4j.config.springboot1x.starter.web.AbstractWebThreadPoolService1x;
import io.undertow.Undertow; import io.undertow.Undertow;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -35,8 +36,8 @@ public class UndertowWebThreadPoolHandler1x extends AbstractWebThreadPoolService
private static final String UNDERTOW_NAME = "undertow"; private static final String UNDERTOW_NAME = "undertow";
public UndertowWebThreadPoolHandler1x() { public UndertowWebThreadPoolHandler1x(AbstractThreadPoolRuntime runtime) {
super(new UndertowWebThreadPoolHandlerSupport()); super(new UndertowWebThreadPoolHandlerSupport(runtime));
} }
@Override @Override

@ -71,4 +71,5 @@ public class PolarisRefresherHandler extends AbstractConfigThreadPoolDynamicRefr
return Objects.equals(POLARIS_FILE_TYPE, "yaml") ? configFileService.getConfigYamlFile(namespace, fileGroup, fileName) return Objects.equals(POLARIS_FILE_TYPE, "yaml") ? configFileService.getConfigYamlFile(namespace, fileGroup, fileName)
: configFileService.getConfigPropertiesFile(namespace, fileGroup, fileName); : configFileService.getConfigPropertiesFile(namespace, fileGroup, fileName);
} }
} }

@ -48,7 +48,7 @@ import static cn.hippo4j.common.constant.Constants.CONFIG_LONG_POLL_TIMEOUT;
import static cn.hippo4j.common.constant.Constants.GROUP_KEY_DELIMITER_TRANSLATION; import static cn.hippo4j.common.constant.Constants.GROUP_KEY_DELIMITER_TRANSLATION;
import static cn.hippo4j.common.constant.Constants.WORD_SEPARATOR; import static cn.hippo4j.common.constant.Constants.WORD_SEPARATOR;
import static cn.hippo4j.common.constant.Constants.LINE_SEPARATOR; import static cn.hippo4j.common.constant.Constants.LINE_SEPARATOR;
import static cn.hippo4j.common.constant.Constants.PROBE_MODIFY_REQUEST; import static cn.hippo4j.common.constant.Constants.LISTENING_CONFIGS;
import static cn.hippo4j.common.constant.Constants.WEIGHT_CONFIGS; import static cn.hippo4j.common.constant.Constants.WEIGHT_CONFIGS;
import static cn.hippo4j.common.constant.Constants.LONG_PULLING_TIMEOUT; import static cn.hippo4j.common.constant.Constants.LONG_PULLING_TIMEOUT;
import static cn.hippo4j.common.constant.Constants.LONG_PULLING_CLIENT_IDENTIFICATION; import static cn.hippo4j.common.constant.Constants.LONG_PULLING_CLIENT_IDENTIFICATION;
@ -195,7 +195,7 @@ public class ClientWorker implements DisposableBean {
return Collections.emptyList(); return Collections.emptyList();
} }
Map<String, String> params = new HashMap<>(2); Map<String, String> params = new HashMap<>(2);
params.put(PROBE_MODIFY_REQUEST, probeUpdateString); params.put(LISTENING_CONFIGS, probeUpdateString);
params.put(WEIGHT_CONFIGS, IdUtil.simpleUUID()); params.put(WEIGHT_CONFIGS, IdUtil.simpleUUID());
Map<String, String> headers = new HashMap<>(2); Map<String, String> headers = new HashMap<>(2);
headers.put(LONG_PULLING_TIMEOUT, "" + timeout); headers.put(LONG_PULLING_TIMEOUT, "" + timeout);

BIN
threadpool/.DS_Store vendored

Binary file not shown.

@ -22,6 +22,7 @@ import java.util.Objects;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import cn.hippo4j.adapter.web.DefaultAbstractWebThreadPoolService; import cn.hippo4j.adapter.web.DefaultAbstractWebThreadPoolService;
import cn.hippo4j.common.support.AbstractThreadPoolRuntime;
import io.undertow.Undertow; import io.undertow.Undertow;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -39,8 +40,8 @@ public class DefaultUndertowWebThreadPoolHandler extends DefaultAbstractWebThrea
private static final String UNDERTOW_NAME = "undertow"; private static final String UNDERTOW_NAME = "undertow";
public DefaultUndertowWebThreadPoolHandler() { public DefaultUndertowWebThreadPoolHandler(AbstractThreadPoolRuntime runtime) {
super(new UndertowWebThreadPoolHandlerSupport()); super(new UndertowWebThreadPoolHandlerSupport(runtime));
} }
/** /**

@ -24,9 +24,12 @@ import cn.hippo4j.common.model.ThreadPoolBaseInfo;
import cn.hippo4j.common.model.ThreadPoolParameter; import cn.hippo4j.common.model.ThreadPoolParameter;
import cn.hippo4j.common.model.ThreadPoolParameterInfo; import cn.hippo4j.common.model.ThreadPoolParameterInfo;
import cn.hippo4j.common.model.ThreadPoolRunStateInfo; import cn.hippo4j.common.model.ThreadPoolRunStateInfo;
import cn.hippo4j.common.support.AbstractThreadPoolRuntime;
import cn.hippo4j.common.toolkit.CalculateUtil; import cn.hippo4j.common.toolkit.CalculateUtil;
import cn.hippo4j.common.toolkit.ReflectUtil;
import cn.hippo4j.core.executor.DynamicThreadPoolExecutor; import cn.hippo4j.core.executor.DynamicThreadPoolExecutor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jboss.threads.EnhancedQueueExecutor;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
import org.xnio.Options; import org.xnio.Options;
import org.xnio.XnioWorker; import org.xnio.XnioWorker;
@ -44,8 +47,14 @@ import java.util.concurrent.Executor;
@Slf4j @Slf4j
public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSupport { public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSupport {
private final AbstractThreadPoolRuntime runtime;
private Executor executor; private Executor executor;
public UndertowWebThreadPoolHandlerSupport(AbstractThreadPoolRuntime runtime) {
this.runtime = runtime;
}
/** /**
* A callback will be invoked and the Executor will be set up when the web container has been started. * A callback will be invoked and the Executor will be set up when the web container has been started.
* @param executor Thread-pool executor in Undertow container. * @param executor Thread-pool executor in Undertow container.
@ -56,6 +65,7 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
} }
private final long noRejectCount = -1L; private final long noRejectCount = -1L;
@Override @Override
public ThreadPoolBaseInfo simpleInfo() { public ThreadPoolBaseInfo simpleInfo() {
ThreadPoolBaseInfo poolBaseInfo = new ThreadPoolBaseInfo(); ThreadPoolBaseInfo poolBaseInfo = new ThreadPoolBaseInfo();
@ -67,8 +77,17 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
poolBaseInfo.setCoreSize(coreSize); poolBaseInfo.setCoreSize(coreSize);
poolBaseInfo.setMaximumSize(maximumPoolSize); poolBaseInfo.setMaximumSize(maximumPoolSize);
poolBaseInfo.setKeepAliveTime((long) keepAliveTime); poolBaseInfo.setKeepAliveTime((long) keepAliveTime);
poolBaseInfo.setRejectedName("-"); poolBaseInfo.setRejectedName("RejectedExecutionException");
poolBaseInfo.setQueueType("-"); poolBaseInfo.setQueueType("org.jboss.threads.EnhancedQueueExecutor.TaskNode:FIFO");
EnhancedQueueExecutor enhancedQueueExecutor =
(EnhancedQueueExecutor) ReflectUtil.getFieldValue(
ReflectUtil.getFieldValue(xnioWorker, "taskPool"), "executor");
Method getMaximumQueueSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getMaximumQueueSize");
ReflectionUtils.makeAccessible(getMaximumQueueSize);
int queueCapacity = (int) ReflectionUtils.invokeMethod(getMaximumQueueSize, enhancedQueueExecutor);
poolBaseInfo.setQueueCapacity(queueCapacity);
} catch (Exception ex) { } catch (Exception ex) {
log.error("The undertow container failed to get thread pool parameters.", ex); log.error("The undertow container failed to get thread pool parameters.", ex);
} }
@ -112,6 +131,33 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
Method getActiveCount = ReflectionUtils.findMethod(fieldObject.getClass(), "getActiveCount"); Method getActiveCount = ReflectionUtils.findMethod(fieldObject.getClass(), "getActiveCount");
ReflectionUtils.makeAccessible(getActiveCount); ReflectionUtils.makeAccessible(getActiveCount);
int activeCount = (int) ReflectionUtils.invokeMethod(getActiveCount, fieldObject); int activeCount = (int) ReflectionUtils.invokeMethod(getActiveCount, fieldObject);
Field executorFiled = ReflectionUtils.findField(fieldObject.getClass(), "executor");
ReflectionUtils.makeAccessible(executorFiled);
EnhancedQueueExecutor enhancedQueueExecutor = (EnhancedQueueExecutor) ReflectionUtils.getField(executorFiled, fieldObject);
Method getLargestPoolSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getLargestPoolSize");
ReflectionUtils.makeAccessible(getLargestPoolSize);
int largestPoolSize = (int) ReflectionUtils.invokeMethod(getLargestPoolSize, enhancedQueueExecutor);
Method getQueueSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getQueueSize");
ReflectionUtils.makeAccessible(getQueueSize);
int queueSize = (int) ReflectionUtils.invokeMethod(getQueueSize, enhancedQueueExecutor);
Method getMaximumQueueSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getMaximumQueueSize");
ReflectionUtils.makeAccessible(getMaximumQueueSize);
int queueCapacity = (int) ReflectionUtils.invokeMethod(getMaximumQueueSize, enhancedQueueExecutor);
int remainingCapacity = queueCapacity - queueSize;
Method getCompletedTaskCount = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getCompletedTaskCount");
ReflectionUtils.makeAccessible(getCompletedTaskCount);
long completedTaskCount = (long) ReflectionUtils.invokeMethod(getCompletedTaskCount, enhancedQueueExecutor);
Method getHandoffExecutor = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getHandoffExecutor");
ReflectionUtils.makeAccessible(getHandoffExecutor);
Executor handoffExecutor = (Executor) ReflectionUtils.invokeMethod(getHandoffExecutor, enhancedQueueExecutor);
activeCount = Math.max(activeCount, 0); activeCount = Math.max(activeCount, 0);
String currentLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + ""; String currentLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + "";
String peakLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + ""; String peakLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + "";
@ -127,7 +173,16 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
stateInfo.setRejectCount(rejectCount); stateInfo.setRejectCount(rejectCount);
stateInfo.setClientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); stateInfo.setClientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
stateInfo.setTimestamp(System.currentTimeMillis()); stateInfo.setTimestamp(System.currentTimeMillis());
return stateInfo;
stateInfo.setQueueType("org.jboss.threads.EnhancedQueueExecutor.TaskNode:FIFO");
stateInfo.setQueueSize(queueSize);
stateInfo.setQueueCapacity(queueCapacity);
stateInfo.setQueueRemainingCapacity(remainingCapacity);
stateInfo.setLargestPoolSize(largestPoolSize);
stateInfo.setCompletedTaskCount(completedTaskCount);
stateInfo.setRejectedName(handoffExecutor.getClass().getName());
return runtime.supplement(stateInfo);
} }
@Override @Override

@ -1,5 +1,3 @@
const { off } = require("process");
module.exports = { module.exports = {
env: { env: {
browser: true, browser: true,
@ -28,5 +26,7 @@ module.exports = {
'@typescript-eslint/no-explicit-any': 0, '@typescript-eslint/no-explicit-any': 0,
'@typescript-eslint/no-non-null-assertion': 0, '@typescript-eslint/no-non-null-assertion': 0,
'@typescript-eslint/no-var-requires': 0, '@typescript-eslint/no-var-requires': 0,
'import/no-anonymous-default-export': 0,
'jsx-a11y/anchor-is-valid': 0,
}, },
}; };

@ -1,3 +1,4 @@
/.git /.git
node_modules node_modules
build build
src/lib/*

@ -1,4 +1,3 @@
// craco.config.js
const CracoLessPlugin = require('craco-less'); const CracoLessPlugin = require('craco-less');
const lessModuleRegex = /\.module\.less$/; const lessModuleRegex = /\.module\.less$/;
const path = require('path'); const path = require('path');
@ -20,7 +19,7 @@ module.exports = {
// A callback function that receives two arguments: the webpack rule, // A callback function that receives two arguments: the webpack rule,
// and the context. You must return an updated rule object. // and the context. You must return an updated rule object.
modifyLessRule: (lessRule, context) => { modifyLessRule: lessRule => {
lessRule.test = lessModuleRegex; lessRule.test = lessModuleRegex;
lessRule.exclude = /node_modules|antd\.css/; lessRule.exclude = /node_modules|antd\.css/;
return lessRule; return lessRule;
@ -39,9 +38,23 @@ module.exports = {
}, },
}, },
devServer: { devServer: {
port: 3001, port: 3000,
headers: { headers: {
'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Origin': '*',
}, },
proxy: {
'/hippo4j/v1/cs': {
target: 'http://console.hippo4j.cn:6691/hippo4j/v1/cs',
pathRewrite: { '^/hippo4j/v1/cs': '' },
changeOrigin: true,
secure: false,
onProxyReq: proxyReq => {
console.log(`Proxying request to: ${proxyReq.path}`);
},
onProxyRes: proxyRes => {
console.log(`Received response with status: ${proxyRes.statusCode}`);
},
},
},
}, },
}; };

File diff suppressed because it is too large Load Diff

@ -3,14 +3,27 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@ahooksjs/use-url-state": "^3.5.1",
"@ant-design/happy-work-theme": "^1.0.0",
"@ant-design/icons": "^5.2.6",
"@tanem/react-nprogress": "^5.0.51",
"@testing-library/jest-dom": "^5.16.5", "@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0", "@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0", "@testing-library/user-event": "^13.5.0",
"ahooks": "^3.7.8", "ahooks": "^3.7.8",
"antd": "^5.4.7", "antd": "^5.4.7",
"axios": "^1.5.0", "buffer": "^6.0.3",
"classnames": "^2.3.2",
"dayjs": "^1.11.9",
"echarts": "^5.4.3",
"echarts-for-react": "^3.0.2",
"i18next": "^23.5.1",
"i18next-browser-languagedetector": "^7.1.0",
"lodash": "^4.17.21",
"qs": "^6.11.2",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-i18next": "^13.2.2",
"react-router-dom": "^6.11.1", "react-router-dom": "^6.11.1",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"web-vitals": "^2.1.4" "web-vitals": "^2.1.4"
@ -20,7 +33,8 @@
"build": "craco build", "build": "craco build",
"test": "react-scripts test", "test": "react-scripts test",
"eject": "react-scripts eject", "eject": "react-scripts eject",
"lint": "eslint -c .eslintrc.js src --ext .ts,.tsx,.js,.jsx --fix" "lint": "eslint -c .eslintrc.js src --ext .ts,.tsx,.js,.jsx --fix",
"format": "prettier --write src/"
}, },
"eslintConfig": { "eslintConfig": {
"extends": [ "extends": [
@ -44,6 +58,7 @@
"@craco/craco": "^7.1.0", "@craco/craco": "^7.1.0",
"@types/http-errors": "^2.0.1", "@types/http-errors": "^2.0.1",
"@types/jest": "^27.5.2", "@types/jest": "^27.5.2",
"@types/lodash": "^4.14.198",
"@types/node": "^16.18.26", "@types/node": "^16.18.26",
"@types/react": "^18.2.6", "@types/react": "^18.2.6",
"@types/react-dom": "^18.2.4", "@types/react-dom": "^18.2.4",
@ -60,6 +75,7 @@
"eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-prettier": "^4.2.1", "eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-react": "^7.32.2", "eslint-plugin-react": "^7.32.2",
"http-proxy-middleware": "^2.0.6",
"husky": "^8.0.0", "husky": "^8.0.0",
"less-loader": "^11.1.0", "less-loader": "^11.1.0",
"lint-staged": "^13.2.2", "lint-staged": "^13.2.2",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

@ -24,7 +24,7 @@
work correctly both with client-side routing and a non-root public URL. work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`. Learn how to configure a non-root public URL by running `npm run build`.
--> -->
<title>React App</title> <title>Dashboard</title>
</head> </head>
<body> <body>
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>

@ -1,128 +0,0 @@
import request from "../axios/request"
export function userLogin(data) {
return request('post', '/hippo4j/v1/cs/auth/login', data)
}
export function getInfo() {
return request('get', '/hippo4j/v1/cs/user/info')
}
export function logout() {
return request('post', '/hippo4j/v1/cs/user/logout')
}
function islogin({commit}, userInfo) {
const {username, password} = userInfo
return new Promise((resolve, reject) => {
let key = genKey()
let encodePassword = encrypt(password, key)
key = key.split("").reverse().join("")
login({username: username.trim(), password: encodePassword, tag: key, rememberMe: 1})
.then((response) => {
const {data} = response
const {roles} = response
commit('SET_TOKEN', data)
localStorage.setItem('roles', JSON.stringify(roles))
localStorage.setItem('USER_ROLE', roles[0])
setToken(data)
resolve()
})
.catch((error) => {
// alert('登录失败')
reject(error)
})
})
}
// get user info
function getInfo({commit, state}) {
return new Promise((resolve, reject) => {
const data = {}
data.roles = JSON.parse(localStorage.getItem('roles'))
commit('SET_ROLES', data.roles)
resolve(data)
})
}
// user logout
function logout({commit, state}) {
// return new Promise((resolve, reject) => {
// logout(state.token).then(() => {
// commit('SET_TOKEN', '')
// commit('SET_ROLES', [])
// removeToken()
// resetRouter()
// resolve()
// }).catch(error => {
// reject(error)
// })
// })
return new Promise((resolve) => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
removeToken()
resetRouter()
resolve()
})
}
// remove token
function resetToken({commit}) {
return new Promise((resolve) => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
removeToken()
resolve()
})
}
// dynamically modify permissions
function changeRoles({commit, dispatch}, role) {
return new Promise(async (resolve) => {
const token = role + '-token'
commit('SET_TOKEN', token)
setToken(token)
const {roles} = await dispatch('getInfo')
resetRouter()
// generate accessible routes map based on roles
const accessRoutes = await dispatch('permission/generateRoutes', roles, {root: true})
// dynamically add accessible routes
router.addRoutes(accessRoutes)
// reset visited views and cached views
dispatch('tagsView/delAllViews', null, {root: true})
resolve()
})
}
const mutations = {
SET_TOKEN: (state, token) => {
state.token = token
},
SET_INTRODUCTION: (state, introduction) => {
state.introduction = introduction
},
SET_NAME: (state, name) => {
state.name = name
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
},
SET_ROLES: (state, roles) => {
state.roles = roles
},
}
export default {
userLogin,
getInfo,
logout,
}

@ -1,32 +1,60 @@
// import { Suspense } from 'react';
import LayoutCom from './components/layout-com'; import LayoutCom from './components/layout-com';
import { Routes, Route } from 'react-router-dom'; import { Routes, Route, Link } from 'react-router-dom';
import routeList from './route'; import routeList from './route';
import Login from '@/page/login'; import { MenuProps } from 'antd';
import { AppstoreOutlined, MailOutlined } from '@ant-design/icons'; import { useTran } from './hooks';
import { STR_MAP } from './config/i18n/locales/constants';
import IconFont from './components/icon';
import { HappyProvider } from '@ant-design/happy-work-theme';
const sideMenuList = [ type MenuItem = Required<MenuProps>['items'][number];
{
label: <a href="/about">about</a>,
key: 'mail',
icon: <MailOutlined />,
},
{
label: <a href="/home"></a>,
key: 'app',
icon: <AppstoreOutlined />,
},
];
const App = () => { const App = () => {
const sideMenuList: MenuItem[] = [
{
label: useTran(STR_MAP.DYNAMIC_THREAD_POOL),
key: STR_MAP.DYNAMIC_THREAD_POOL,
icon: <IconFont type="icon-hot-for-ux"></IconFont>,
children: [
{
label: <Link to={'/thread-poll/index'}>{useTran(STR_MAP.THREAD_POOL_MANAGE)}</Link>,
key: '/thread-poll/index',
},
],
},
{
label: <Link to={'/tenant'}>{useTran(STR_MAP.TENANT_MANAGE)}</Link>,
key: '/tenant',
icon: <IconFont type="icon-hot-for-ux"></IconFont>,
},
{
label: <Link to={'/item'}>{useTran(STR_MAP.PROJECT_MANAGE)}</Link>,
key: '/item',
icon: <IconFont type="icon-hot-for-ux"></IconFont>,
},
{
label: <Link to={'/user'}>{useTran(STR_MAP.USER_MANAGE)}</Link>,
key: '/user',
icon: <IconFont type="icon-hot-for-ux"></IconFont>,
},
{
label: <Link to={'/log'}>{useTran(STR_MAP.LOG_MANAGE)}</Link>,
key: '/log',
icon: <IconFont type="icon-hot-for-ux"></IconFont>,
},
];
return ( return (
<LayoutCom sideMenuList={sideMenuList} isSider={false}> <HappyProvider>
<Routes> <LayoutCom sideMenuList={sideMenuList}>
<Route path="/Login" Component={Login}></Route> <Routes>
{routeList.map(item => ( {routeList.map(item => (
<Route key={item.path} path={item.path} Component={item.component} /> <Route key={item.path} path={item.path} Component={item.component} />
))} ))}
</Routes> </Routes>
</LayoutCom> </LayoutCom>
</HappyProvider>
); );
}; };

@ -1,4 +0,0 @@
const devBaseUrl = 'http://console.hippo4j.cn:6691/hippo4j/v1/cs'
const proBaseUrl = 'http://console.hippo4j.cn:6691/hippo4j/v1/cs '
export const BASE_URL = process.env.NODE_ENV === 'development' ? devBaseUrl : proBaseUrl
export const TIMEOUT = 5000

@ -1,192 +0,0 @@
import axios from 'axios';
import { BASE_URL, TIMEOUT } from './config';
const instance = axios.create({
baseURL: BASE_URL,
timeout: TIMEOUT,
});
instance.interceptors.request.use(
config => {
config.data = JSON.stringify(config.data);
config.headers = {
'Content-Type': 'application/json',
}
return config
}, err => {
return Promise.reject(err)
}
);
instance.interceptors.response.use(
res => {
if (res.code === 'A000004') {
removeToken()
resetRouter()
alert(res.message)
document.location.href = 'index.html'
} else if (res.code !== '20000' && res.code !== '0' && res.code !== '200') {
Message({
message: res.message || 'Error',
type: 'error',
duration: 5 * 1000
})
// 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
if (res.code === '50008' || res.code === '50012' || res.code === '50014') {
// to re-login
MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
confirmButtonText: 'Re-Login',
cancelButtonText: 'Cancel',
type: 'warning'
}).then(() => {
store.dispatch('user/resetToken').then(() => {
location.reload()
})
})
}
console.log(res)
return Promise.reject(new Error(res.message || 'Error'))
} else {
const { data } = response
const { code } = data
// 状态码为0||200表示api成功
if (code === '0') {
const { data: res } = data
return res
} else if (code === '200') {
return data
} else {
// 返回数据
return res
}
}
return response
}, err => {
console.log('err' + err) // for debug
Message({
message: error.message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(err)
}
);
/**
* 封装get
* @param {String} url
* @param {String} param
* @returns
*/
export function get(url, param = {}) {
return new Promise(
(resolve, reject) => {
axios.get(url, {
params: param
}).then((response) => {
console.log("get error: url, params, state",url, params, response.data)
resolve(response.data)
}).catch(err => {
msg(err)
reject(err)
})
}
);
}
/**
*
* 封装post
* @param {String} url
* @param {Object} param
* @returns {Promise}
*/
export function post(url, param) {
return new Promise(
(resolve, reject) => {
axios.post(url, param).then(response => {
resolve(response.data)
}, err => {
reject(err)
})
}
);
}
export default function (fecth, url, param) {
return new Promise(
(resolve, reject) => {
switch(fecth) {
case "get":
console.log("a get request, url:", url)
get(url, param)
.then(response => {
resolve(response)
}).catch(err => {
console.log("GET request error, err:", err)
reject(err)
})
break
case "post":
post(url, param)
.then(response => {
resolve(response)
}).catch(err => {
console.log("POST request error, err:", err)
reject(err)
})
break
default:
break
}
}
);
}
function msg(err) {
if (err && err.response) {
switch (err.response.status) {
case 400:
alert(err.response.data.error.details);
break;
case 401:
alert("未授权,请登录");
break;
case 403:
alert("拒绝访问");
break;
case 404:
alert("请求地址出错");
break;
case 408:
alert("请求超时");
break;
case 500:
alert("服务器内部错误");
break;
case 501:
alert("服务未实现");
break;
case 502:
alert("网关错误");
break;
case 503:
alert("服务不可用");
break;
case 504:
alert("网关超时");
break;
case 505:
alert("HTTP版本不受支持");
break;
default:
}
}
}

@ -0,0 +1,14 @@
.header-wrapper {
display: flex;
width: 100%;
justify-content: space-between;
.logo {
display: flex;
flex-direction: column;
width: 50px;
img {
flex: 1;
object-fit: contain;
}
}
}

@ -0,0 +1,77 @@
import React, { useContext } from 'react';
import style from './index.module.less';
import { UserOutlined } from '@ant-design/icons';
import { Avatar, Button, Col, Dropdown, Row, Switch } from 'antd';
import { MyContext } from '@/context';
import IconFont from '@/components/icon';
import { LANG_NAME, MyStoreValues, THEME_NAME } from '@/typings';
import { useNavigate } from 'react-router-dom';
const HeaderChild = () => {
const { lang, themeName, setLang, setThemeName } = useContext<MyStoreValues>(MyContext);
const navigate = useNavigate();
// console.log('setLang:::', setLang);
// setLang && setLang(LANG_NAME.EN);
const items = [
{
key: '1',
label: (
<a target="_blank" rel="noopener noreferrer" href="https://www.antgroup.com">
1st menu
</a>
),
},
{
key: '2',
label: (
<a target="_blank" rel="noopener noreferrer" href="https://www.aliyun.com">
2nd menu
</a>
),
},
{
key: '3',
label: <a onClick={() => navigate('/login')}></a>,
},
];
return (
<div className={style['header-wrapper']}>
<div className={style['logo']} onClick={() => navigate('/home')}>
<img src="https://nageoffer.com/img/logo3.png" alt="" style={{ cursor: 'pointer' }} />
</div>
<div className={style['edit-container']}>
<Row gutter={[16, 16]}>
<Col></Col>
<Col>
<Dropdown menu={{ items }} placement="bottomRight" trigger={['click']}>
<Avatar size={30} icon={<UserOutlined />} style={{ cursor: 'pointer' }} />
</Dropdown>
</Col>
<Col>
<Button
type="link"
onClick={() => {
lang === LANG_NAME.EN ? setLang && setLang(LANG_NAME.ZH) : setLang && setLang(LANG_NAME.EN);
}}
>
<IconFont type="icon-qiehuanyuyan"></IconFont>
</Button>
</Col>
<Col>
<Switch
checkedChildren={'🌞'}
unCheckedChildren={'🌛'}
defaultChecked={themeName === THEME_NAME.DARK}
onChange={e => {
setThemeName && setThemeName(e ? THEME_NAME.DARK : THEME_NAME.DEFAULT);
}}
></Switch>
</Col>
</Row>
</div>
</div>
);
};
export default HeaderChild;

@ -0,0 +1,14 @@
import { createFromIconfontCN } from '@ant-design/icons';
import React from 'react';
const MyIcon = createFromIconfontCN({
scriptUrl: '//at.alicdn.com/t/c/font_4254722_vw34zn7su2.js', // 在 iconfont.cn 上生成
});
type MyComponentProps = React.HTMLProps<HTMLDivElement> & { type: string };
const IconFont: React.FC<MyComponentProps> = props => {
return <MyIcon {...props}></MyIcon>;
};
export default IconFont;

@ -1,25 +0,0 @@
"use strict";
exports.__esModule = true;
var react_1 = require("react");
var styled_components_1 = require("styled-components");
var antd_1 = require("antd");
var useThemeMode_1 = require("@/hooks/useThemeMode");
var index_module_less_1 = require("./index.module.less");
var Header = antd_1.Layout.Header, Sider = antd_1.Layout.Sider, Content = antd_1.Layout.Content;
var LayoutCom = function (props) {
var sideMenuList = props.sideMenuList, children = props.children, _a = props.isSider, isSider = _a === void 0 ? true : _a;
var myThemes = react_1.useContext(styled_components_1.ThemeContext);
var _b = react_1.useState('mail'), current = _b[0], setCurrent = _b[1];
var onClick = function (e) {
setCurrent(e.key);
};
var setIsDark = useThemeMode_1["default"]()[0];
return (React.createElement("main", { className: index_module_less_1["default"].container, style: { backgroundColor: myThemes.backgroundColor.bg1 } },
React.createElement(Header, { className: index_module_less_1["default"].header, style: { backgroundColor: myThemes.backgroundColor.bg2 } },
React.createElement(antd_1.Button, { onClick: function () { return setIsDark(function (pre) { return !pre; }); } }, "\u5207\u6362\u4E3B\u9898")),
React.createElement(antd_1.Layout, { style: { backgroundColor: myThemes.backgroundColor.bg1, height: 'calc(100vh - 64px)' } },
isSider && (React.createElement(Sider, { className: index_module_less_1["default"].sider, style: { backgroundColor: myThemes.backgroundColor.bg1 } },
React.createElement(antd_1.Menu, { onClick: onClick, selectedKeys: [current], mode: "inline", items: sideMenuList }))),
React.createElement(Content, { className: index_module_less_1["default"].content }, children))));
};
exports["default"] = LayoutCom;

@ -4,15 +4,21 @@
.header { .header {
height: 48px; height: 48px;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.01), 0 3px 6px 3px rgba(0, 0, 0, 0.01), 0 2px 6px 0 rgba(0, 0, 0, 0.03); box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.01), 0 3px 6px 3px rgba(0, 0, 0, 0.01), 0 2px 6px 0 rgba(0, 0, 0, 0.03);
padding: 0 20px;
display: flex;
align-items: center;
} }
.sider { .sider {
height: calc(100vh - 48px);
padding-top: 24px; padding-top: 24px;
} }
.content { .content {
margin: 10px 10px 0px;
border-radius: 12px 12px 0 0; border-radius: 12px 12px 0 0;
min-height: 100%;
flex: 1; flex: 1;
padding: 16px;
overflow-y: auto;
}
.pureContent {
border-radius: unset;
padding: 0;
} }
} }

@ -1,37 +1,76 @@
import { useState, useContext, ReactNode } from 'react'; import { useState, useContext, ReactNode, useEffect, useMemo } from 'react';
import { DefaultTheme, ThemeContext } from 'styled-components'; import { DefaultTheme, ThemeContext } from 'styled-components';
import { Layout, Button, Menu } from 'antd'; import { Layout, Menu, MenuProps } from 'antd';
import useThemeMode from '@/hooks/useThemeMode'; import HeaderChild from '../header';
import { IMenuList } from '@/typings';
import style from './index.module.less'; import style from './index.module.less';
import { useLocation } from 'react-router-dom';
import classNames from 'classnames';
type MenuItem = Required<MenuProps>['items'][number];
const { Header, Sider, Content } = Layout; const { Header, Sider, Content } = Layout;
interface ILayoutCom { interface ILayoutCom {
children?: ReactNode; children?: ReactNode;
sideMenuList: IMenuList[]; sideMenuList: MenuItem[];
isSider?: boolean;
} }
const LayoutCom = (props: ILayoutCom) => { const LayoutCom = (props: ILayoutCom) => {
const { sideMenuList, children, isSider = true } = props; const { sideMenuList, children } = props;
const myThemes: DefaultTheme = useContext<any>(ThemeContext); const myThemes: DefaultTheme = useContext<any>(ThemeContext);
const [current, setCurrent] = useState('mail'); const [currentKey, setCurrentKey] = useState<string>('');
const location = useLocation();
useEffect(() => {
setCurrentKey(location.pathname);
}, [location]);
const onClick = (e: any) => { const onClick = (e: any) => {
setCurrent(e.key); setCurrentKey(e.key);
}; };
const [setIsDark] = useThemeMode();
useEffect(() => {
document.body.style.backgroundColor = myThemes.backgroundColor.bg1;
}, [myThemes]);
const isHeader = useMemo(() => {
const isHeader = location.pathname !== '/login';
return isHeader;
}, [location]);
const isSider = useMemo(() => {
const isSider = location.pathname !== '/login';
return isSider;
}, [location]);
return ( return (
<main className={style.container} style={{ backgroundColor: myThemes.backgroundColor.bg1 }}> <main className={style.container} style={{ backgroundColor: myThemes.backgroundColor.bg1 }}>
<Header className={style.header} style={{ backgroundColor: myThemes.backgroundColor.bg2 }}> {isHeader && (
<Button onClick={() => setIsDark(pre => !pre)}></Button> <Header className={style.header}>
</Header> <HeaderChild />
<Layout style={{ backgroundColor: myThemes.backgroundColor.bg1, height: 'calc(100vh - 64px)' }}> </Header>
)}
<Layout
style={{
backgroundColor: myThemes.backgroundColor.bg1,
height: `calc(100vh - ${isHeader ? '64px' : '0px'})`,
margin: isHeader ? '10px 10px 0px 0px' : '0px',
}}
>
{isSider && ( {isSider && (
<Sider className={style.sider} style={{ backgroundColor: myThemes.backgroundColor.bg1 }}> <Sider className={style.sider} style={{ backgroundColor: myThemes.backgroundColor.bg1 }} collapsible>
<Menu onClick={onClick} selectedKeys={[current]} mode="inline" items={sideMenuList} /> <Menu onClick={onClick} selectedKeys={[currentKey]} mode="inline" items={sideMenuList} />
</Sider> </Sider>
)} )}
<Content className={style.content}>{children}</Content> <Content
className={classNames(style.content, {
[style.pureContent]: location.pathname === '/login',
})}
style={{
backgroundColor: myThemes.backgroundColor.bgContent,
height: `calc(100vh - ${isHeader ? '64px' : 0})`,
}}
>
{children}
</Content>
</Layout> </Layout>
</main> </main>
); );

@ -1,12 +1,12 @@
import React, { useContext, useEffect, useState } from 'react'; import React, { useContext, useEffect, useState } from 'react';
import { DefaultTheme, ThemeProvider } from 'styled-components'; import { DefaultTheme, ThemeProvider } from 'styled-components';
import { ConfigProvider, theme } from 'antd'; import { ConfigProvider, theme } from 'antd';
import { darkAlgorithm } from '../../config/theme/dark-algorithm';
import { darkAlgorithm } from '../../theme/dark-algorithm'; import { defaultAlgorithm } from '../../config/theme/default-algnorithm';
import { defaultAlgorithm } from '../../theme/default-algnorithm'; import { lightDefaultTheme, darkDefaultTheme } from '../../config/theme';
import { lightDefaultTheme, darkDefaultTheme } from '../../theme'; import { MyContext } from '../../context';
import { MyThemeContext, THEME_NAME } from '../../context/themeContext';
import zhCN from 'antd/es/locale/zh_CN'; import zhCN from 'antd/es/locale/zh_CN';
import { THEME_NAME } from '@/typings';
interface ThemeProps { interface ThemeProps {
children: React.ReactNode; children: React.ReactNode;
@ -15,7 +15,7 @@ interface ThemeProps {
const ThemeComponent = ({ children }: ThemeProps) => { const ThemeComponent = ({ children }: ThemeProps) => {
const [themes, setThemes] = useState(defaultAlgorithm); const [themes, setThemes] = useState(defaultAlgorithm);
const [myThemes, setMyThemes] = useState<DefaultTheme>(lightDefaultTheme); const [myThemes, setMyThemes] = useState<DefaultTheme>(lightDefaultTheme);
const { themeName } = useContext<any>(MyThemeContext); const { themeName } = useContext<any>(MyContext);
const changeMode = (themeName: THEME_NAME) => { const changeMode = (themeName: THEME_NAME) => {
if (themeName === THEME_NAME.DARK) { if (themeName === THEME_NAME.DARK) {

@ -0,0 +1,27 @@
import { Button, ButtonProps } from 'antd';
import React from 'react';
import { SearchOutlined, PlusOutlined, RedoOutlined } from '@ant-design/icons';
function withSearchIconButton<P extends ButtonProps>(WrappedComponent: React.ComponentType<P>) {
return function EnhancedComponent(props: P) {
return <WrappedComponent icon={<SearchOutlined></SearchOutlined>} {...props} />;
};
}
function withAddIconButton<P extends ButtonProps>(WrappedComponent: React.ComponentType<P>) {
return function EnhancedComponent(props: P) {
return <WrappedComponent icon={<PlusOutlined />} {...props}></WrappedComponent>;
};
}
function withResetIconButton<P extends ButtonProps>(WrappedComponent: React.ComponentType<P>) {
return function EnhancedComponent(props: P) {
return <WrappedComponent {...props} icon={<RedoOutlined />}></WrappedComponent>;
};
}
export const SearchButton = withSearchIconButton(Button);
export const AddButton = withAddIconButton(Button);
export const ResetButton = withResetIconButton(Button);

@ -0,0 +1,28 @@
// i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import zh from './locales/zh';
import en from './locales/en';
import LanguageDetector from 'i18next-browser-languagedetector';
i18n
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources: {
zh: {
translation: zh,
},
en: {
translation: en,
},
},
// debug: true,
fallbackLng: 'zh', // 默认语言
interpolation: {
escapeValue: false, // 不转义HTML标签
},
});
export default i18n;

@ -0,0 +1,36 @@
export enum STR_MAP {
GLOBAL_TITLE = 'globalTitle',
DYNAMIC_THREAD_POOL = 'dynamicThreadPool',
THREAD_POOL_MANAGE = 'threadPoolManage',
PROJECT = 'project',
SEARCH = 'search',
ADD = 'add',
SERIAL_NUMBER = 'serialNumber',
TENANTRY = 'tenantry',
THREAD_POOL = 'threadPool',
CORE_THREAD = 'coreThread',
MAXIMUM_THREAD = 'maximumThread',
QUEUE_TYPE = 'queueType',
QUEUE_CAPACITY = 'queueCapacity',
REJECTION_STRATEGY = 'rejectionStrategy',
EXECUTION_TIMEOUT = 'executionTimeout',
ALARM_OR_NOT = 'alarmOrNot',
CREATION_TIME = 'creationTime',
UPDATE_TIME = 'updateTime',
EDIT = 'edit',
TENANT_MANAGE = 'tenantManage',
LOG_MANAGE = 'logManage',
PROJECT_MANAGE = 'projectManage',
USER_MANAGE = 'userManage',
LOGIN_SUCCESSFUL = 'loginSuccessful',
USER_INPUT_MESSAGE = 'userInputMessage',
USRE_NAME = 'username',
PASSWORD_INPUT_MESSAGE = 'passwordInputMessage',
REMERBER_PASSWORD = 'rememberPassWord',
FORGOT_PASSWORD = 'forgotPassword',
ACCOUNT_PASSWORD_LOGIN = 'accountPasswordLogin',
PASSWOR = 'password',
LOGIN = 'login',
PHONE_LOGIN = 'phoneLogin',
ALARM_EDITING_SUCCESS = 'alarmEditingSuccess',
}

@ -0,0 +1,40 @@
import { STR_MAP } from './constants';
const enTranslationMap: { [key: string]: string } = {
[STR_MAP.DYNAMIC_THREAD_POOL]: 'Dynamic thread pool',
[STR_MAP.THREAD_POOL_MANAGE]: 'Thread pool management',
[STR_MAP.PROJECT]: 'project',
[STR_MAP.SEARCH]: 'search',
[STR_MAP.ADD]: 'add',
[STR_MAP.SERIAL_NUMBER]: 'number',
[STR_MAP.TENANTRY]: 'tenantry',
[STR_MAP.THREAD_POOL]: 'thread pool',
[STR_MAP.CORE_THREAD]: 'core thread',
[STR_MAP.MAXIMUM_THREAD]: 'maximum thread',
[STR_MAP.QUEUE_TYPE]: 'queue type',
[STR_MAP.QUEUE_CAPACITY]: 'queue capacity',
[STR_MAP.REJECTION_STRATEGY]: 'rejection strategy',
[STR_MAP.EXECUTION_TIMEOUT]: 'execution timeout',
[STR_MAP.ALARM_OR_NOT]: 'alarm or not',
[STR_MAP.CREATION_TIME]: 'creation time',
[STR_MAP.UPDATE_TIME]: 'update time',
[STR_MAP.EDIT]: 'edit',
[STR_MAP.TENANT_MANAGE]: 'tenant management',
[STR_MAP.PROJECT_MANAGE]: 'project management',
[STR_MAP.USER_MANAGE]: 'user management',
[STR_MAP.LOG_MANAGE]: 'log management',
[STR_MAP.LOGIN_SUCCESSFUL]: 'login successful',
[STR_MAP.USER_INPUT_MESSAGE]: 'please enter your username',
[STR_MAP.USRE_NAME]: 'username',
[STR_MAP.PASSWORD_INPUT_MESSAGE]: 'please enter password',
[STR_MAP.REMERBER_PASSWORD]: 'remember the password',
[STR_MAP.FORGOT_PASSWORD]: 'forgot password',
[STR_MAP.ACCOUNT_PASSWORD_LOGIN]: 'account password login',
[STR_MAP.GLOBAL_TITLE]: `The world's best thread pool management tool`,
[STR_MAP.PASSWOR]: 'password',
[STR_MAP.LOGIN]: 'login',
[STR_MAP.PHONE_LOGIN]: 'Mobile login',
[STR_MAP.ALARM_EDITING_SUCCESS]: 'alarm editing success',
};
export default enTranslationMap;

@ -0,0 +1,40 @@
import { STR_MAP } from './constants';
const zhTranslationMap: { [key: string]: string } = {
[STR_MAP.DYNAMIC_THREAD_POOL]: '动态线程池',
[STR_MAP.THREAD_POOL_MANAGE]: '线程池管理',
[STR_MAP.PROJECT]: '项目',
[STR_MAP.SEARCH]: '搜索',
[STR_MAP.ADD]: '添加',
[STR_MAP.SERIAL_NUMBER]: '序号',
[STR_MAP.TENANTRY]: '租户',
[STR_MAP.THREAD_POOL]: '线程池',
[STR_MAP.CORE_THREAD]: '核心线程',
[STR_MAP.MAXIMUM_THREAD]: '最大线程',
[STR_MAP.QUEUE_TYPE]: '队列类型',
[STR_MAP.QUEUE_CAPACITY]: '队列容量',
[STR_MAP.REJECTION_STRATEGY]: '拒绝策略',
[STR_MAP.EXECUTION_TIMEOUT]: '执行超时',
[STR_MAP.ALARM_OR_NOT]: '是否报警',
[STR_MAP.CREATION_TIME]: '创建时间',
[STR_MAP.UPDATE_TIME]: '更新时间',
[STR_MAP.EDIT]: '操作',
[STR_MAP.TENANT_MANAGE]: '租户管理',
[STR_MAP.PROJECT_MANAGE]: '项目管理',
[STR_MAP.USER_MANAGE]: '用户权限',
[STR_MAP.LOG_MANAGE]: '日志管理',
[STR_MAP.LOGIN_SUCCESSFUL]: '登录成功',
[STR_MAP.USER_INPUT_MESSAGE]: '请输入用户名',
[STR_MAP.USRE_NAME]: '用户名',
[STR_MAP.PASSWORD_INPUT_MESSAGE]: '请输入密码',
[STR_MAP.REMERBER_PASSWORD]: '记住密码',
[STR_MAP.FORGOT_PASSWORD]: '忘记密码',
[STR_MAP.ACCOUNT_PASSWORD_LOGIN]: '账号密码登录',
[STR_MAP.GLOBAL_TITLE]: `全球最好用的线程池管理工具`,
[STR_MAP.PASSWOR]: '密码',
[STR_MAP.LOGIN]: '登录',
[STR_MAP.PHONE_LOGIN]: '手机号登录',
[STR_MAP.ALARM_EDITING_SUCCESS]: '报警编辑成功',
};
export default zhTranslationMap;

@ -0,0 +1,50 @@
import { theme } from 'antd';
import { darkDefaultTheme } from '.';
export const darkAlgorithm = {
token: {
colorPrimary: darkDefaultTheme.primary,
fontSize: 14,
fontSizeHeading1: 18,
},
components: {
Layout: {
bodyBg: darkDefaultTheme.backgroundColor.bg1,
headerBg: darkDefaultTheme.backgroundColor.bgHeader,
triggerBg: darkDefaultTheme.backgroundColor.bg1,
triggerColor: darkDefaultTheme.fontColor.fc1,
},
Button: {
// fontSize: 14,
},
Table: {
// borderRadius: 0,
// borderRadiusLG: 0,
// padding: 10,
// paddingXS: 5,
// margin: 0,
// cellFontSize: 12,
// colorBorderSecondary: darkDefaultTheme.borderColor.bl1,
// paddingContentVerticalLG: 4,
},
Modal: {
borderRadiusLG: 2,
borderRadiusSM: 2,
colorText: darkDefaultTheme.fontColor.fc3,
borderRadius: 2,
paddingContentHorizontalLG: 0,
paddingMD: 0,
},
Menu: {
itemBg: darkDefaultTheme.backgroundColor.bg1,
// itemSelectedBg: darkDefaultTheme.primary,
// itemSelectedColor: darkDefaultTheme.fontColor.fc1,
activeBarWidth: 0,
activeBarHeight: 0,
activeBarBorderWidth: 0,
// subMenuItemBorderRadius: 8,
// horizontalItemBorderRadius: 8,
// itemBorderRadius: 8,
},
},
algorithm: theme.darkAlgorithm,
};

@ -0,0 +1,48 @@
import { theme } from 'antd';
import { lightDefaultTheme } from '.';
export const defaultAlgorithm = {
token: {
colorPrimary: lightDefaultTheme.primary,
fontSize: 14,
fontSizeHeading1: 18,
},
components: {
Layout: {
bodyBg: lightDefaultTheme.backgroundColor.bg1,
headerBg: lightDefaultTheme.backgroundColor.bgHeader,
triggerBg: lightDefaultTheme.backgroundColor.bg1,
triggerColor: lightDefaultTheme.fontColor.fc1,
},
Button: {
// fontSize: 14,
},
Table: {
// padding: 10,
// paddingXS: 5,
// margin: 0,
// cellFontSize: 12,
// colorBorderSecondary: lightDefaultTheme.borderColor.bl1,
// paddingContentVerticalLG: 4,
},
Modal: {
// borderRadiusLG: 2,
// borderRadiusSM: 2,
// colorText: lightDefaultTheme.fontColor.fc3,
// borderRadius: 2,
// paddingContentHorizontalLG: 0,
// paddingMD: 0,
},
Menu: {
itemBg: lightDefaultTheme.backgroundColor.bg1,
// itemSelectedBg: lightDefaultTheme.primary,
// itemSelectedColor: lightDefaultTheme.fontColor.fc1,
activeBarWidth: 0,
activeBarHeight: 0,
activeBarBorderWidth: 0,
// subMenuItemBorderRadius: 8,
// horizontalItemBorderRadius: 8,
// itemBorderRadius: 8,
},
},
algorithm: theme.defaultAlgorithm,
};

@ -29,6 +29,8 @@ declare module 'styled-components' {
}; };
// 背景色 // 背景色
backgroundColor: { backgroundColor: {
bgHeader: string;
bgContent: string;
bg1: string; bg1: string;
bg2: string; bg2: string;
bg3: string; bg3: string;

@ -1,7 +1,7 @@
import { DefaultTheme } from 'styled-components'; import { DefaultTheme } from 'styled-components';
export const lightDefaultTheme: DefaultTheme = { export const lightDefaultTheme: DefaultTheme = {
primary: '#0d68a8', primary: '#1890ff',
baseColor: { baseColor: {
// 前两个是固定的,用于,有颜色按钮 字体颜色等固定不会变的颜色值 // 前两个是固定的,用于,有颜色按钮 字体颜色等固定不会变的颜色值
bc1: '#fff', bc1: '#fff',
@ -24,6 +24,8 @@ export const lightDefaultTheme: DefaultTheme = {
bl3: '#B5BDCE', bl3: '#B5BDCE',
}, },
backgroundColor: { backgroundColor: {
bgHeader: '#fff',
bgContent: '#fff',
// main bgc // main bgc
bg1: '#ebebf2', bg1: '#ebebf2',
// app or head bgc // app or head bgc
@ -65,6 +67,8 @@ export const darkDefaultTheme: DefaultTheme = {
bl3: '#424242', bl3: '#424242',
}, },
backgroundColor: { backgroundColor: {
bgHeader: '#141414',
bgContent: '#141414',
// 大面积色 // 大面积色
bg1: '#141414', bg1: '#141414',
// tab顶部颜色 // tab顶部颜色

@ -0,0 +1,58 @@
import React, { createContext, useState, ReactNode, useEffect } from 'react';
import { ConfigProvider, theme } from 'antd';
import { DefaultTheme, ThemeProvider } from 'styled-components';
import enUS from 'antd/locale/en_US';
import zhCN from 'antd/locale/zh_CN';
import { darkDefaultTheme, lightDefaultTheme } from '@/config/theme';
import { defaultAlgorithm } from '@/config/theme/default-algnorithm';
import { darkAlgorithm } from '@/config/theme/dark-algorithm';
import { useTranslation } from 'react-i18next';
import { useLocalStorageState } from 'ahooks';
import { LANG_NAME, MyStoreValues, THEME_NAME } from '@/typings';
export const MyContext = createContext<MyStoreValues>({});
export const MyStore: React.FC<{
children: ReactNode;
}> = ({ children }) => {
const [themeName, setThemeName] = useLocalStorageState<THEME_NAME>('current-mode', {
defaultValue: THEME_NAME.DEFAULT,
});
const [lang, setLang] = useLocalStorageState<LANG_NAME>('current-lang', {
defaultValue: LANG_NAME.ZH,
});
const [themes, setThemes] = useState(defaultAlgorithm);
const [myThemes, setMyThemes] = useState<DefaultTheme>(lightDefaultTheme);
const { i18n } = useTranslation();
const changeMode = (themeName: THEME_NAME) => {
if (themeName === THEME_NAME.DARK) {
darkAlgorithm.algorithm = theme.darkAlgorithm;
// for ant change mode
setThemes(darkAlgorithm);
// for custome use mode
setMyThemes(darkDefaultTheme);
} else {
defaultAlgorithm.algorithm = theme.defaultAlgorithm;
setThemes(defaultAlgorithm);
setMyThemes(lightDefaultTheme);
}
};
useEffect(() => {
changeMode(themeName as THEME_NAME);
}, [themeName]);
useEffect(() => {
i18n.changeLanguage(lang);
}, [lang, i18n]);
return (
<MyContext.Provider value={{ themeName, lang, setThemeName, setLang }}>
<ConfigProvider locale={lang === LANG_NAME.ZH ? zhCN : enUS} theme={themes}>
<ThemeProvider theme={myThemes}>{children}</ThemeProvider>
</ConfigProvider>
</MyContext.Provider>
);
};

@ -1,17 +0,0 @@
import React, { createContext, useState, ReactNode } from 'react';
export enum THEME_NAME {
DEFAULT = 'default',
DARK = 'dark',
}
export const MyThemeContext = createContext<{ themeName: string; setThemeName: (name: THEME_NAME) => void } | null>(
null
);
export const ThemeStore: React.FC<{
children: ReactNode;
}> = ({ children }) => {
const [themeName, setThemeName] = useState<string>(THEME_NAME.DEFAULT);
return <MyThemeContext.Provider value={{ themeName, setThemeName }}>{children}</MyThemeContext.Provider>;
};

@ -1,26 +0,0 @@
"use strict";
exports.__esModule = true;
var layout_com_1 = require("./components/layout-com");
var react_router_dom_1 = require("react-router-dom");
var route_1 = require("./route");
var login_1 = require("@/page/login");
var icons_1 = require("@ant-design/icons");
var sideMenuList = [
{
label: React.createElement("a", { href: "/about" }, "about"),
key: 'mail',
icon: React.createElement(icons_1.MailOutlined, null)
},
{
label: React.createElement("a", { href: "/home" }, "\u4E3B\u9875"),
key: 'app',
icon: React.createElement(icons_1.AppstoreOutlined, null)
},
];
var App = function () {
return (React.createElement(layout_com_1["default"], { sideMenuList: sideMenuList, isSider: false },
React.createElement(react_router_dom_1.Routes, null,
React.createElement(react_router_dom_1.Route, { path: "/Login", Component: login_1["default"] }),
route_1["default"].map(function (item) { return (React.createElement(react_router_dom_1.Route, { key: item.path, path: item.path, Component: item.component })); }))));
};
exports["default"] = App;

@ -0,0 +1,2 @@
export * from './useTransLate';
export * from './useFormToUrl';

@ -0,0 +1,52 @@
import { useEffect, useMemo, useState } from 'react';
import { parse } from 'qs';
import useUrlState from '@ahooksjs/use-url-state';
import { FormInstance } from 'antd';
export function useFormStateToUrl<T extends Record<string, any>>(
form: FormInstance,
params?: T
): {
urlState: any;
isFirstMount: boolean;
handleSetUrlState: () => void;
} {
const [state, setState] = useState<any>();
const [urlState, setUrlState] = useUrlState<any>();
const [count, setCount] = useState<number>(0);
useEffect(() => {
const url = window.location.search.split('?')[1] ?? null;
const urlParams = parse(url) as T;
const result: Partial<T> = {};
setState(urlParams);
for (const key in params) {
if (Object.prototype.hasOwnProperty.call(params, key)) {
const paramValue = urlParams[key];
if (paramValue ?? false) {
if (typeof params[key] === 'number') {
const parsedValue = parseFloat(paramValue);
if (!isNaN(parsedValue)) {
result[key] = parsedValue as T[keyof T];
}
} else {
result[key] = paramValue as T[keyof T];
}
}
}
}
form.setFieldsValue(result);
setCount(count => count + 1);
}, [setState, setCount, form, params]);
const handleSetUrlState = () => {
const values = form.getFieldsValue();
setUrlState({ ...state, ...values });
};
const isFirstMount = useMemo(() => {
return count === 1;
}, [count]);
return { urlState, isFirstMount, handleSetUrlState };
}

@ -1,16 +0,0 @@
import { useContext, useEffect } from 'react';
import { useLocalStorageState } from 'ahooks';
import { MyThemeContext, THEME_NAME } from '@/context/themeContext';
const useThemeMode = () => {
const [isDark, setIsDark] = useLocalStorageState<boolean>('current-mode', { defaultValue: false });
const { setThemeName } = useContext<any>(MyThemeContext);
useEffect(() => {
isDark ? setThemeName(THEME_NAME.DARK) : setThemeName(THEME_NAME.DEFAULT);
}, [isDark, setThemeName]);
return [setIsDark];
};
export default useThemeMode;

@ -0,0 +1,6 @@
import { useTranslation } from 'react-i18next';
export const useTran = (str: string): string => {
const { t } = useTranslation();
return t(str);
};

@ -0,0 +1,18 @@
import useUrlState from '@ahooksjs/use-url-state';
export const useUrlSet = (options: { form: any }) => {
const { form } = options;
const [state, setState] = useUrlState({});
const setUrl = () => {
const params = form.getFieldsValue();
Object.keys(params).forEach(key => {
if (!params[key]) {
params[key] = undefined;
}
});
setState({ ...params });
};
return { setUrl };
};

@ -1,10 +1,11 @@
import React from 'react'; import React, { Suspense } from 'react';
import ReactDOM from 'react-dom/client'; import ReactDOM from 'react-dom/client';
import App from './App'; import App from './App';
import { BrowserRouter } from 'react-router-dom'; import { BrowserRouter } from 'react-router-dom';
import { ThemeStore } from './context/themeContext'; import { MyStore } from './context';
import ThemeComponent from './components/theme-com'; import './config/i18n';
import 'antd/dist/reset.css'; import 'antd/dist/reset.css';
import { Spin } from 'antd';
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
@ -12,12 +13,12 @@ root.render(
<React.StrictMode> <React.StrictMode>
<BrowserRouter> <BrowserRouter>
{/* theme context */} {/* theme context */}
<ThemeStore> <MyStore>
{/* theme config context */} {/* theme config context */}
<ThemeComponent> <Suspense fallback={<Spin />}>
<App /> <App />
</ThemeComponent> </Suspense>
</ThemeStore> </MyStore>
</BrowserRouter> </BrowserRouter>
</React.StrictMode> </React.StrictMode>
); );

@ -0,0 +1,6 @@
import React from 'react';
const HomeDetail = () => {
return <></>;
};
export default HomeDetail;

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save