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/conf
docker/target
### OS ###
.DS_Store

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

@ -262,7 +262,7 @@
"description": "The homepage title description"
},
"homepage.titleDescription2": {
"message": "动态可观测线程池框架,为业务系统提高线上运行保障能力",
"message": "动态可观测Java线程池框架,为你的业务系统提高线上运行保障能力",
"description": "The homepage title description"
},
"homepage.startButton": {
@ -271,7 +271,7 @@
},
"homepage.secondTitle": {
"message": "Hippo4j能做什么",
"description": "a title for introduciton part"
"description": "The title for the introduction part"
},
"homepage.introduction.fristPartTitle": {
"message": "动态变更",
@ -312,5 +312,53 @@
"companyPage.linkText": {
"message": "点击进行登记",
"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"
},
"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"
},
"link.title.Links": {

@ -1,51 +1,70 @@
import React from "react";
import useGithubInfo from "./useGithubInfo";
import React from 'react';
import useGithubInfo from './useGithubInfo';
const GithubInfo = ({ owner, repo }) => {
const { favorites, language, forks, license } = useGithubInfo(owner, repo);
return (
<div className="github-info-container w-full md:justify-normal mb-4 justify-center gap-2 flex flex-wrap items-center">
<div className="flex items-center">
<div className="dark:bg-gray-600 bg-gray-100 px-2">
<span className="text-sm">star</span>
</div>
<div className="dark:bg-blue-600 bg-gray-200 font-medium px-2">
<span id="repo-stars-count">{favorites || 4621}</span>
</div>
<p className="">
<div className="widget">
<a
className="btn hover:no-underline hover:text-[#24292f] outline-none"
href="https://github.com/opengoofy/hippo4j"
rel="noopener"
target="_blank"
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 className="flex items-center">
<div className="px-2 bg-gray-100 dark:bg-gray-600">
<span className="text-sm">language</span>
</div>
<div className="px-2 dark:bg-blue-600 bg-gray-200 font-medium">
<span id="repo-languages-count font-medium">
{language || "java"}
</span>
</div>
</div>
<div className="flex items-center">
<div className="dark:bg-gray-600 bg-gray-100 px-2">
<span className="text-sm">forks</span>
</div>
<div className="dark:bg-blue-600 bg-gray-200 px-2 font-medium">
<span id="repo-forks-count">{forks || 1020}</span>
</div>
</div>
<div className="flex items-center">
<div className="px-2 bg-gray-100 dark:bg-gray-600">
<span className="text-sm">license</span>
</div>
<div className="px-2 dark:bg-blue-600 bg-gray-200">
<span className="text-sm font-medium" id="repo-license-name">
Apache 2
</span>
</div>
<div class="widget ml-4">
<a
class="btn hover:no-underline hover:text-[#24292f] outline-none"
href="https://github.com/opengoofy/hippo4j"
rel="noopener"
target="_blank"
aria-label="Fork opengoofy/hippo4j on GitHub"
>
<svg
viewBox="0 0 16 16"
width="14"
height="14"
class="octicon octicon-repo-forked"
aria-hidden="true"
>
<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>
</svg>
&nbsp;<span>Fork</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"
>
{forks || 0}
</a>
</div>
</div>
</p>
);
};

@ -1,84 +1,81 @@
import React from "react";
import { Icon } from "@iconify/react";
import useBaseUrl from "@docusaurus/useBaseUrl";
import GithubInfo from "./GithubInfo";
import Translate, { translate } from "@docusaurus/Translate";
import Link from "@docusaurus/Link";
import React from 'react';
import { useEffect } from 'react';
import { Icon } from '@iconify/react';
import useBaseUrl from '@docusaurus/useBaseUrl';
import GithubInfo from './GithubInfo';
import Translate, { translate } from '@docusaurus/Translate';
import Link from '@docusaurus/Link';
const Hero = () => {
return (
<div className="hero-container text-black dark:text-white">
<div className="py-10 mb-10">
<div className="container px-20 lg:px-20 md:px-10 mx-auto flex flex-wrap flex-col md:flex-row items-center">
{/* <!--Left Col--> */}
<div className="flex flex-col w-full md:w-3/5 justify-center items-start text-center md:text-left">
{/* title and desc */}
<div>
<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">
Hippo4j
</h1>
<p className="leading-normal dark:text-white font-bold text-gray-800 md:pr-20 text-3xl md:text-3xl">
<Translate
id="homepage.titleDescription1"
description="The homepage title description"
>
Thread Pool Framework For Java
</Translate>
</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>
<header className="hero hero--primary heroBanner_UJJx dark:bg-[#1B1B1D]">
<div className="my-container dark:text-white">
<div className="row">
<div className="col col--6">
<h1 className="hero__logo text-5xl font-medium dark:text-white">
Hippo4j Thread Pool
</h1>
<p className="hero__subtitle">
<Translate
id="homepage.titleDescription2"
description="The homepage title description"
>
Enhancing the Operational Assurance Capability for Business
Systems Online.
</Translate>
</p>
<div className="social_VnSH">
<GithubInfo owner="opengoofy" repo="hippo4j" />
</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 */}
<div className="flex my-4 lg:my-8 md:my-6 w-full justify-center md:justify-start">
<Link to="/docs/user_docs/intro" className="">
<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">
<Translate
className="cursor-pointer"
id="homepage.startButton"
description="The homepage start button text"
>
Quick Start
</Translate>
</button>
</Link>
<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">
<div className="flex cursor-pointer items-center justify-center">
<Icon
className="w-6 h-6 mr-2 rounded-full flex-shrink-0 dark:bg-white"
icon="devicon:github"
/>
<span className="text-base lg:text-lg">GitHub</span>
</div>
</button>
</a>
</div>
{/* github info */}
<div className="github-info w-full">
<GithubInfo owner="opengoofy" repo="hippo4j" />
<span className="relative w-full text-center transition-colors duration-200 ease-in-out group-hover:text-white">
Start Learning
</span>
</Link>
<a
href="https://github.com/opengoofy/hippo4j"
className="relative w-32 hover:no-underline lg:w-48 inline-block text-lg group"
>
<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">
<span className="absolute inset-0 w-full h-full px-5 py-4 rounded-lg bg-gray-100"></span>
<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>
<span className="relative flex items-center justify-center">
{' '}
<Icon
className="w-6 h-6 mr-2 rounded-full flex-shrink-0 bg-white text-white"
icon="devicon:github"
/>
Github
</span>
</span>
<span
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"
data-rounded="rounded-lg"
></span>
</a>
</div>
</div>
</div>
{/* <!--Right image--> */}
<div className="w-full md:w-2/5 text-center">
<img
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.svg")}
alt="Hippo4j System"
/>
<div className="col col--6">
<h1 className="hero__title">
<img
className="homeImg_cEyn max-w-[440px] mt-12 -ml-8"
src={useBaseUrl('/img/hero/hero-removebg.png')}
alt="homepage"
/>
</h1>
</div>
</div>
</div>
</div>
</header>
);
};

@ -1,103 +1,171 @@
import React from "react";
import useBaseUrl from "@docusaurus/useBaseUrl";
import Translate from "@docusaurus/Translate";
import React from 'react';
import useBaseUrl from '@docusaurus/useBaseUrl';
import Translate from '@docusaurus/Translate';
const Introduction = () => {
return (
<section className=" border-b mb-28">
<div className="container px-20 lg:px-20 md:px-10 ">
<h2 className="w-full my-2 text-5xl dark:text-white font-medium leading-tight text-gray-800">
{/* Hippo4j能做什么 */}
<Translate
id="homepage.secondTitle"
description="a title for introduciton part"
>
What can Hippo4j do?
</Translate>
</h2>
<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 className="third-part-desc grid md:grid-cols-2 grid-cols-1 gap-4">
<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.fristPartTitle"
description="the title for the first introduction part"
>
Dynamic Change
</Translate>
</h3>
<p className="text-gray-600 text-xl dark:text-white ">
{/* 应用运行时动态变更线程池参数,包括不限于核心、最大线程、阻塞队列大小和拒绝策略等,支持应用集群下不同节点线程池配置差异化 */}
<Translate
id="homepage.introduction.fristPartDesc"
description="the desc for the first introduction part"
>
Application runtime dynamically changes thread pool parameters,
including but not limited to core size, maximum threads,
blocking queue size, and rejection policy. It supports
differentiated thread pool configurations for different nodes in
the application cluster.
</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.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>
<section className="dark:text-white">
<div className="introduction-container ">
<div className="title-container w-full bg-[#EFEFEF] dark:text-white flex flex-wrap dark:bg-[#242526]">
<div className="my-container">
<div className="row">
<div className="col col--6 hfeatureImage_Eu74">
<img
width="560"
height="315"
style={{ width: '560px', height: '315px' }}
src={useBaseUrl('/img/introduction/t.jpg')}
/>
</div>
<div className="col col--6 hfeatureContent_iAnb">
<h3 className="hfeatureTitle_i6jH text-4xl font-medium mb-8">
<Translate
id="homepage.secondTitle"
description="The title for the introduction part"
>
What can Hippo4j do?
</Translate>
</h3>
<p>
<Translate
id="homepage.secondTitleDesc2"
description="The p1 for the secondTitle part"
>
Provided functions such as dynamic adjustment of thread
pool, custom alerts.
</Translate>
</p>
<p>
<Translate
id="homepage.secondTitleDesc3"
description="The p2 for the secondTitle part"
>
Help improve the operational support capabilities of your
business system.
</Translate>
</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>
</section>
);

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

@ -10,8 +10,8 @@
@tailwind components;
@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 {
/*
See css var + hsl color palette technique:
@ -25,17 +25,21 @@
--site-color-svg-icon-favorite: #e9669e;
--site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 25%);
--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-favorite-background: #1d1e1e;
--site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 10%);
}
[data-theme="light"] {
--ifm-color-primary: hsl(var(--site-primary-hue-saturation) 30%);
[data-theme='light'] {
--ifm-color-primary: #2160fd;
--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-darkest: hsl(var(--site-primary-hue-saturation) 17%);
@ -49,8 +53,8 @@ html[data-theme="dark"] {
);
}
[data-theme="dark"] {
--ifm-color-primary: hsl(var(--site-primary-hue-saturation) 45%);
[data-theme='dark'] {
--ifm-color-primary: #1a90ff;
--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-darkest: hsl(var(--site-primary-hue-saturation) 32%);
@ -62,6 +66,8 @@ html[data-theme="dark"] {
--ifm-color-primary-lightest: hsl(
var(--site-primary-hue-saturation-light) 73%
);
--ifm-breadcrumb-item-background-active: #222222;
--ifm-breadcrumb-color-active: #1a90ff;
}
.docusaurus-highlight-code-line {
@ -71,7 +77,7 @@ html[data-theme="dark"] {
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%);
}
@ -80,7 +86,7 @@ html[data-theme="dark"] {
}
.header-github-link::before {
content: "";
content: '';
width: 24px;
height: 24px;
display: flex;
@ -88,7 +94,7 @@ html[data-theme="dark"] {
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")
no-repeat;
}
@ -109,17 +115,15 @@ html[data-theme="dark"] {
background-color: var(--ifm-tabs-color-active);
}
[data-theme="light"] .themedDocusaurus [fill="#FFFF50"] {
[data-theme='light'] .themedDocusaurus [fill='#FFFF50'] {
fill: greenyellow;
}
[data-theme="dark"] .themedDocusaurus [fill="#FFFF50"] {
[data-theme='dark'] .themedDocusaurus [fill='#FFFF50'] {
fill: seagreen;
}
[data-theme="light"] .DocSearch {
/* --docsearch-primary-color: var(--ifm-color-primary); */
/* --docsearch-text-color: var(--ifm-font-color-base); */
[data-theme='light'] .DocSearch {
--docsearch-muted-color: var(--ifm-color-emphasis-700);
--docsearch-container-background: rgb(94 100 112 / 70%);
/* Modal */
@ -135,7 +139,7 @@ html[data-theme="dark"] {
--docsearch-footer-background: var(--ifm-color-white);
}
[data-theme="dark"] .DocSearch {
[data-theme='dark'] .DocSearch {
--docsearch-text-color: var(--ifm-font-color-base);
--docsearch-muted-color: var(--ifm-color-secondary-darkest);
--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(
var(--site-primary-hue-saturation) 85%
);
@ -191,14 +195,14 @@ div[class^="announcementBar_"] {
white-space: nowrap;
}
[data-theme="light"] img[src$="#gh-dark-mode-only"],
[data-theme="dark"] img[src$="#gh-light-mode-only"] {
[data-theme='light'] img[src$='#gh-dark-mode-only'],
[data-theme='dark'] img[src$='#gh-light-mode-only'] {
display: none;
}
/* Used to test CSS insertion order */
.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) {
@ -219,3 +223,415 @@ div[class^="announcementBar_"] {
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 clsx from "clsx";
import Link from "@docusaurus/Link";
import React from 'react';
import { useEffect } from 'react';
import clsx from 'clsx';
import Link from '@docusaurus/Link';
// import Translate from "@docusaurus/Translate";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import Layout from "@theme/Layout";
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from '@theme/Layout';
// 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 styles from "./index.module.css";
import LandingLayout from '@site/src/components/LandingPage';
import Head from '@docusaurus/Head';
import styles from './index.module.css';
if (ExecutionEnvironment.canUseDOM) {
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?473eaadc06f3d63771f303df1fc29b58";
var s = document.getElementsByTagName("script")[0];
var hm = document.createElement('script');
hm.src = 'https://hm.baidu.com/hm.js?473eaadc06f3d63771f303df1fc29b58';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s);
})();
}
@ -24,7 +25,7 @@ if (ExecutionEnvironment.canUseDOM) {
function HomepageHeader() {
const { siteConfig } = useDocusaurusContext();
return (
<header className={clsx("hero hero--primary", styles.heroBanner)}>
<header className={clsx('hero hero--primary', styles.heroBanner)}>
<div className="container">
<h1 className="hero__title">{siteConfig.title}</h1>
<p className="hero__subtitle">{siteConfig.tagline}</p>
@ -43,6 +44,7 @@ function HomepageHeader() {
export default function Home() {
const { siteConfig } = useDocusaurusContext();
return (
<Layout
title={`${siteConfig.title}`}

@ -5,51 +5,39 @@ import useBaseUrl from "@docusaurus/useBaseUrl";
import Translate from "@docusaurus/Translate";
function CompanyCards({ companies }) {
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">
{companies.map((company) => (
<div
onClick={() => window.open(company.url)}
key={company.url}
className="bg-white rounded-lg overflow-hidden shadow-sm transform cursor-pointer transition-all duration-500 hover:scale-110"
style={{ border: "1px solid #E5E7EB" }}
>
<div className="flex dark:text-black items-center justify-center h-28">
<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">
{/* Filter out those without a logo. */}
{companies
.filter((comapny) => comapny.logo.length > 0)
.map((company) => (
<div
onClick={() => window.open(company.url)}
className="rounded-lg overflow-hidden transform cursor-pointer transition-all duration-500 hover:scale-110"
// style={{ border: "1px solid #E5E7EB" }}
>
<div
className="h-24 w-24 object-contain"
className="h-20 logo-img-container p-1"
style={{ position: "relative" }}
>
<img
src={useBaseUrl(company.logo)}
alt={`${company.name}`}
className="h-24 w-24 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
}}
className="max-h-[90%] max-w-[90%] h-auto object-contain"
/>
<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>
);
}
export default function OurUsers() {
return (
<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*/}
<div className="max-w-screen-sm sm:mx-auto mx-10 text-center my-8 ">
<div className="text-center mt-8">
<h2 className="text-3xl font-bold mb-4">
<div className="max-w-screen-sm sm:mx-auto mx-10 text-center my-8 mt-14 mb-12 ">
<div className="text-center ">
<h2 className="text-3xl font-medium mb-7">
<Translate
id="companyPage.title"
description="the title for the company page"
@ -58,12 +46,12 @@ export default function OurUsers() {
</Translate>
</h2>
<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%" }}
></div>
</div>
<div className="flex flex-col items-center mx-auto">
<p className="text-lg mb-2 max-w-1/2" style={{ lineHeight: "1.5" }}>
<div className=" mb-7 mx-auto">
<p className="text-lg leading-loose mb-2 ">
<Translate
id="companyPage.descriptionText"
description="the description for the company page"
@ -72,7 +60,7 @@ export default function OurUsers() {
This is our greatest motivation to move forward.
</Translate>{" "}
</p>
<p className="text-lg mb-4 max-w-1/2" style={{ lineHeight: "1.5" }}>
<p className="text-lg mb-5 leading-loose">
<Translate
id="companyPage.questionText"
description="the text for the company question"
@ -81,7 +69,7 @@ export default function OurUsers() {
</Translate>{" "}
<a
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
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>
<g transform="matrix(1 0 0 1 46.5 19)" >
<g style="" >
<g transform="matrix(1 0 0 1 1.81 6.25)" 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" />
<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(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 transform="matrix(1 0 0 1 1.81 -7.31)" 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" />
<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(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 transform="matrix(1 0 0 1 1.57 -2.15)" 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" />
<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(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 transform="matrix(1 0 0 1 12.72 -0.08)" 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" />
<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(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 transform="matrix(1 0 0 1 27.17 6.25)" 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" />
<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(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 transform="matrix(1 0 0 1 27.18 -7.31)" 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" />
<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(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 transform="matrix(1 0 0 1 26.94 -2.15)" 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" />
<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(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 transform="matrix(1 0 0 1 38.09 -0.08)" 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" />
<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(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 transform="matrix(1 0 0 1 -27.57 -0.07)" 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" />
<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(-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 transform="matrix(1 0 0 1 -27.57 -0.07)" 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" />
<g transform="matrix(1 0 0 1 -27.5 0)" id="Stroke-19" >
<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 transform="matrix(1 0 0 1 -27.16 0.77)" 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" />
<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.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>

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

@ -24,6 +24,8 @@ import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.junit.Assert;
import org.junit.Test;
import org.json.JSONException;
import org.skyscreamer.jsonassert.JSONAssert;
import java.util.Arrays;
import java.util.Collections;
@ -42,7 +44,11 @@ public class JSONUtilTest {
@Test
public void assertToJSONString() {
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

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

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

@ -73,7 +73,8 @@ public class LogMessageTest {
public void testKvShouldPutAllKeyAndValuePairs() {
logMessage.kv("key1", "value1");
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
@ -81,7 +82,8 @@ public class LogMessageTest {
logMessage.setMsg(MESSAGE);
logMessage.kv("key1", "value1");
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

@ -90,7 +90,21 @@ public interface BootstrapPropertiesInterface {
/**
* 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;
}

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

@ -66,7 +66,7 @@ public class WeChatSendMessageHandler extends AbstractRobotSendMessageHandler {
weChatReq.setMarkdown(markdown);
String responseBody = HttpUtil.post(serverUrl, weChatReq);
WeChatRobotResponse response = JSONUtil.parseObject(responseBody, WeChatRobotResponse.class);
Assert.isTrue(response != null, "Response is null.");
Assert.notNull(response, "Response is null.");
if (response.getErrcode() != 0) {
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
*/
@Bean
public UndertowWebThreadPoolHandlerAdapt undertowWebThreadPoolHandler() {
return new DefaultUndertowWebThreadPoolHandler();
public UndertowWebThreadPoolHandlerAdapt undertowWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) {
return new DefaultUndertowWebThreadPoolHandler(webThreadPoolRunStateHandler);
}
}
}

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

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

@ -71,4 +71,5 @@ public class PolarisRefresherHandler extends AbstractConfigThreadPoolDynamicRefr
return Objects.equals(POLARIS_FILE_TYPE, "yaml") ? configFileService.getConfigYamlFile(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.WORD_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.LONG_PULLING_TIMEOUT;
import static cn.hippo4j.common.constant.Constants.LONG_PULLING_CLIENT_IDENTIFICATION;
@ -195,7 +195,7 @@ public class ClientWorker implements DisposableBean {
return Collections.emptyList();
}
Map<String, String> params = new HashMap<>(2);
params.put(PROBE_MODIFY_REQUEST, probeUpdateString);
params.put(LISTENING_CONFIGS, probeUpdateString);
params.put(WEIGHT_CONFIGS, IdUtil.simpleUUID());
Map<String, String> headers = new HashMap<>(2);
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 cn.hippo4j.adapter.web.DefaultAbstractWebThreadPoolService;
import cn.hippo4j.common.support.AbstractThreadPoolRuntime;
import io.undertow.Undertow;
import lombok.extern.slf4j.Slf4j;
@ -39,8 +40,8 @@ public class DefaultUndertowWebThreadPoolHandler extends DefaultAbstractWebThrea
private static final String UNDERTOW_NAME = "undertow";
public DefaultUndertowWebThreadPoolHandler() {
super(new UndertowWebThreadPoolHandlerSupport());
public DefaultUndertowWebThreadPoolHandler(AbstractThreadPoolRuntime runtime) {
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.ThreadPoolParameterInfo;
import cn.hippo4j.common.model.ThreadPoolRunStateInfo;
import cn.hippo4j.common.support.AbstractThreadPoolRuntime;
import cn.hippo4j.common.toolkit.CalculateUtil;
import cn.hippo4j.common.toolkit.ReflectUtil;
import cn.hippo4j.core.executor.DynamicThreadPoolExecutor;
import lombok.extern.slf4j.Slf4j;
import org.jboss.threads.EnhancedQueueExecutor;
import org.springframework.util.ReflectionUtils;
import org.xnio.Options;
import org.xnio.XnioWorker;
@ -44,8 +47,14 @@ import java.util.concurrent.Executor;
@Slf4j
public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSupport {
private final AbstractThreadPoolRuntime runtime;
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.
* @param executor Thread-pool executor in Undertow container.
@ -56,6 +65,7 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
}
private final long noRejectCount = -1L;
@Override
public ThreadPoolBaseInfo simpleInfo() {
ThreadPoolBaseInfo poolBaseInfo = new ThreadPoolBaseInfo();
@ -67,8 +77,17 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
poolBaseInfo.setCoreSize(coreSize);
poolBaseInfo.setMaximumSize(maximumPoolSize);
poolBaseInfo.setKeepAliveTime((long) keepAliveTime);
poolBaseInfo.setRejectedName("-");
poolBaseInfo.setQueueType("-");
poolBaseInfo.setRejectedName("RejectedExecutionException");
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) {
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");
ReflectionUtils.makeAccessible(getActiveCount);
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);
String currentLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + "";
String peakLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + "";
@ -127,7 +173,16 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
stateInfo.setRejectCount(rejectCount);
stateInfo.setClientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
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

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

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

@ -1,4 +1,3 @@
// craco.config.js
const CracoLessPlugin = require('craco-less');
const lessModuleRegex = /\.module\.less$/;
const path = require('path');
@ -20,7 +19,7 @@ module.exports = {
// A callback function that receives two arguments: the webpack rule,
// and the context. You must return an updated rule object.
modifyLessRule: (lessRule, context) => {
modifyLessRule: lessRule => {
lessRule.test = lessModuleRegex;
lessRule.exclude = /node_modules|antd\.css/;
return lessRule;
@ -39,9 +38,23 @@ module.exports = {
},
},
devServer: {
port: 3001,
port: 3000,
headers: {
'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",
"private": true,
"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/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"ahooks": "^3.7.8",
"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-dom": "^18.2.0",
"react-i18next": "^13.2.2",
"react-router-dom": "^6.11.1",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
@ -20,7 +33,8 @@
"build": "craco build",
"test": "react-scripts test",
"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": {
"extends": [
@ -44,6 +58,7 @@
"@craco/craco": "^7.1.0",
"@types/http-errors": "^2.0.1",
"@types/jest": "^27.5.2",
"@types/lodash": "^4.14.198",
"@types/node": "^16.18.26",
"@types/react": "^18.2.6",
"@types/react-dom": "^18.2.4",
@ -60,6 +75,7 @@
"eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-react": "^7.32.2",
"http-proxy-middleware": "^2.0.6",
"husky": "^8.0.0",
"less-loader": "^11.1.0",
"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.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
<title>Dashboard</title>
</head>
<body>
<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 { Routes, Route } from 'react-router-dom';
import { Routes, Route, Link } from 'react-router-dom';
import routeList from './route';
import Login from '@/page/login';
import { AppstoreOutlined, MailOutlined } from '@ant-design/icons';
import { MenuProps } from 'antd';
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 = [
{
label: <a href="/about">about</a>,
key: 'mail',
icon: <MailOutlined />,
},
{
label: <a href="/home"></a>,
key: 'app',
icon: <AppstoreOutlined />,
},
];
type MenuItem = Required<MenuProps>['items'][number];
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 (
<LayoutCom sideMenuList={sideMenuList} isSider={false}>
<Routes>
<Route path="/Login" Component={Login}></Route>
{routeList.map(item => (
<Route key={item.path} path={item.path} Component={item.component} />
))}
</Routes>
</LayoutCom>
<HappyProvider>
<LayoutCom sideMenuList={sideMenuList}>
<Routes>
{routeList.map(item => (
<Route key={item.path} path={item.path} Component={item.component} />
))}
</Routes>
</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 {
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);
padding: 0 20px;
display: flex;
align-items: center;
}
.sider {
height: calc(100vh - 48px);
padding-top: 24px;
}
.content {
margin: 10px 10px 0px;
border-radius: 12px 12px 0 0;
min-height: 100%;
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 { Layout, Button, Menu } from 'antd';
import useThemeMode from '@/hooks/useThemeMode';
import { IMenuList } from '@/typings';
import { Layout, Menu, MenuProps } from 'antd';
import HeaderChild from '../header';
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;
interface ILayoutCom {
children?: ReactNode;
sideMenuList: IMenuList[];
isSider?: boolean;
sideMenuList: MenuItem[];
}
const LayoutCom = (props: ILayoutCom) => {
const { sideMenuList, children, isSider = true } = props;
const { sideMenuList, children } = props;
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) => {
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 (
<main className={style.container} style={{ backgroundColor: myThemes.backgroundColor.bg1 }}>
<Header className={style.header} style={{ backgroundColor: myThemes.backgroundColor.bg2 }}>
<Button onClick={() => setIsDark(pre => !pre)}></Button>
</Header>
<Layout style={{ backgroundColor: myThemes.backgroundColor.bg1, height: 'calc(100vh - 64px)' }}>
{isHeader && (
<Header className={style.header}>
<HeaderChild />
</Header>
)}
<Layout
style={{
backgroundColor: myThemes.backgroundColor.bg1,
height: `calc(100vh - ${isHeader ? '64px' : '0px'})`,
margin: isHeader ? '10px 10px 0px 0px' : '0px',
}}
>
{isSider && (
<Sider className={style.sider} style={{ backgroundColor: myThemes.backgroundColor.bg1 }}>
<Menu onClick={onClick} selectedKeys={[current]} mode="inline" items={sideMenuList} />
<Sider className={style.sider} style={{ backgroundColor: myThemes.backgroundColor.bg1 }} collapsible>
<Menu onClick={onClick} selectedKeys={[currentKey]} mode="inline" items={sideMenuList} />
</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>
</main>
);

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

@ -1,7 +1,7 @@
import { DefaultTheme } from 'styled-components';
export const lightDefaultTheme: DefaultTheme = {
primary: '#0d68a8',
primary: '#1890ff',
baseColor: {
// 前两个是固定的,用于,有颜色按钮 字体颜色等固定不会变的颜色值
bc1: '#fff',
@ -24,6 +24,8 @@ export const lightDefaultTheme: DefaultTheme = {
bl3: '#B5BDCE',
},
backgroundColor: {
bgHeader: '#fff',
bgContent: '#fff',
// main bgc
bg1: '#ebebf2',
// app or head bgc
@ -65,6 +67,8 @@ export const darkDefaultTheme: DefaultTheme = {
bl3: '#424242',
},
backgroundColor: {
bgHeader: '#141414',
bgContent: '#141414',
// 大面积色
bg1: '#141414',
// 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 App from './App';
import { BrowserRouter } from 'react-router-dom';
import { ThemeStore } from './context/themeContext';
import ThemeComponent from './components/theme-com';
import { MyStore } from './context';
import './config/i18n';
import 'antd/dist/reset.css';
import { Spin } from 'antd';
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
@ -12,12 +13,12 @@ root.render(
<React.StrictMode>
<BrowserRouter>
{/* theme context */}
<ThemeStore>
<MyStore>
{/* theme config context */}
<ThemeComponent>
<Suspense fallback={<Spin />}>
<App />
</ThemeComponent>
</ThemeStore>
</Suspense>
</MyStore>
</BrowserRouter>
</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