From 8e97305f81c7a833574e20cb6243196c0e7922d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E8=A7=82=E4=BC=9F?= Date: Thu, 29 Aug 2024 22:00:02 +0800 Subject: [PATCH 1/2] =?UTF-8?q?style:=20header=20=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Header/index.tsx | 96 ++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx index 8c7d74c..79b3345 100644 --- a/src/components/Header/index.tsx +++ b/src/components/Header/index.tsx @@ -9,11 +9,9 @@ import { Button, Menu, MenuItem, + Typography, } from '@mui/material'; -import logoSvg from '@/asset/img/logo.svg'; -import Image from 'next/image'; import PlayArrowRoundedIcon from '@mui/icons-material/PlayArrowRounded'; -import Search from './search'; const MENU = [ { @@ -49,8 +47,8 @@ const NAV_LINK = [ href: '/wiki', }, { - title: '技术博客', - href: '/blog', + title: '技术讨论', + href: '/discussion', }, { title: '在线工具', @@ -94,14 +92,28 @@ const Header = () => { justifyContent='space-between' > - { window.open('/', '_self'); }} style={{ marginLeft: 40, marginRight: 80, cursor: 'pointer' }} - > + > */} + window.open('/', '_self')} + > + 长亭百川云 + {NAV_LINK.map((item) => ( @@ -127,9 +139,9 @@ const Header = () => { sx={{ display: 'flex', alignItems: 'center', - fontSize: '16px', + fontSize: '14px', gap: 0.5, - color: '#041B0F', + color: 'rgba(0,0,0,0.5)', fontWeight: 700, '&:hover': { color: 'primary.main', @@ -141,9 +153,9 @@ const Header = () => { )} @@ -189,50 +201,48 @@ const Header = () => { - {user ? ( - - - + ) : ( <> )} From f07a290362c357437a82833915e6091281b0819f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E8=A7=82=E4=BC=9F?= Date: Fri, 6 Dec 2024 16:16:38 +0800 Subject: [PATCH 2/2] feat: change header --- src/asset/img/default_avatar.png | Bin 0 -> 40595 bytes src/components/Alert/index.tsx | 4 +- src/components/Header/components.tsx | 261 ++++++ src/components/Header/index.tsx | 433 +++++++--- src/components/Header/loggedInView.tsx | 56 ++ src/components/Header/profilePanel.tsx | 240 ++++++ src/components/Header/search.tsx | 323 -------- src/components/Header/toolkit.ts | 1036 ++++++++++++++++++++++++ src/pages/_document.tsx | 1 - src/styles/colors.ts | 2 +- 10 files changed, 1926 insertions(+), 430 deletions(-) create mode 100644 src/asset/img/default_avatar.png create mode 100644 src/components/Header/components.tsx create mode 100644 src/components/Header/loggedInView.tsx create mode 100644 src/components/Header/profilePanel.tsx delete mode 100644 src/components/Header/search.tsx create mode 100644 src/components/Header/toolkit.ts diff --git a/src/asset/img/default_avatar.png b/src/asset/img/default_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..681dd79ac3c78f26587da6ef1d9e233eb00dc38e GIT binary patch literal 40595 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 DE=4m0 literal 0 HcmV?d00001 diff --git a/src/components/Alert/index.tsx b/src/components/Alert/index.tsx index f177326..688a0dc 100644 --- a/src/components/Alert/index.tsx +++ b/src/components/Alert/index.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react'; -import { primary } from '@/styles/colors'; +import { success } from '@/styles/colors'; import Snackbar from '@mui/material/Snackbar'; import MuiAlert, { AlertProps, AlertColor } from '@mui/material/Alert'; import { createRoot } from 'react-dom/client'; @@ -36,7 +36,7 @@ function WarningBar(props: WarningProps) { ({ + display: 'flex', + flex: 1, + justifyContent: 'flex-end', + height: '100%', + alignItems: 'center', + [theme.breakpoints.down('sm')]: { + justifyContent: 'end', + }, +})); + +export const ProfileCardComponent = styled(Stack)(() => ({})); + +export const InfoCard = styled(Stack)(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + + [theme.breakpoints.down('sm')]: { + height: '100%', + }, +})); + +export const IdCard = styled(Stack)(() => ({ + backgroundPositionY: 'center', + backgroundPositionX: 'right', + backgroundSize: '60%', + backgroundRepeat: 'no-repeat', + minWidth: '320px', +})); + +export const IdInfo = styled('div')(() => ({ + display: 'flex', + alignItems: 'center', + gap: '16px', +})); + +export const Row = styled('div')(() => ({ + display: 'flex', + alignItems: 'center', +})); + +export const TagRow = styled('div')(() => ({ + display: 'flex', + alignItems: 'center', + fontSize: '14px', + gap: '8px', + marginLeft: '60px', + marginTop: '8px', + marginBottom: '24px', + '& > svg': { + fill: primary, + }, +})); + +export const FlexRow = styled('div')(() => ({ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', +})); + +export const Badge = styled('div', { + shouldForwardProp: (prop) => prop !== 'state', +})<{ state: 'warning' | 'success' }>(({ state }) => ({ + display: 'flex', + padding: '0 10px', + borderRadius: '2px', + alignItems: 'center', + fontSize: '12px', + ...(state === 'success' && { + backgroundColor: primaryLight, + color: primary, + }), + ...(state === 'warning' && { + backgroundColor: '#FFF8E5', + color: '#FFBF00', + }), +})); + +export const PanelMenu = styled('div')(() => ({ + // display: 'grid', + // gridTemplateColumns: '1fr 1fr', + // gap: '16px', +})); + +export const PanelMenuItem = styled('div')(() => ({ + display: 'flex', + width: '100%', + backgroundImage: primaryLightGradient, + alignItems: 'center', + padding: '0px 12px', + cursor: 'pointer', +})); + +export const PanelFooter = styled('div')(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + gap: '16px', + padding: '0px 14px 24px 14px', + [theme.breakpoints.down('sm')]: { + marginTop: 'auto', + }, +})); + +export const PanelHeader = styled('div')(() => ({ + display: 'flex', + alignItems: 'center', + padding: `${parseInt(Side_Margin) / 2}% ${Side_Margin}`, +})); + +export const WorkbenchButton = styled('div')({ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + gap: '8px', + width: '102px', + height: '30px', + cursor: 'pointer', + color: '#fff', + borderRadius: '4px', + backgroundColor: primary, + '&:hover': { + backgroundColor: primaryHover, + }, + '&:active': { + backgroundColor: primaryClick, + }, +}); + +export const OrgCard = styled(FlexRow)(() => ({ + backgroundColor: 'transparent', + justifyContent: 'space-between', + transition: 'all 0.2s ease-in-out', + cursor: 'pointer', + padding: '12px', + '&:hover': { + backgroundColor: '#52C41A10', + transition: 'all 0.2s ease-in-out', + '& > div > div': { + color: primary, + transition: 'all 0.2s ease-in-out', + }, + '& > div > div > div': { + color: primary, + transition: 'all 0.2s ease-in-out', + }, + }, +})); + +export const OrgIcon = styled(MuiAvatar)(() => ({ + width: '34px', + height: '34px', + fontSize: '16px', +})); + +const AvatarWrap = styled(Image)(({ theme }) => { + return { + borderRadius: '50%', + display: 'block', + }; +}); + +export const Avatar = ({ src, size = 20 }: { src?: string; size: number }) => { + return ( + + ); +}; + +export const CopyIcon = (props: SvgIconProps) => { + return ( + + + + ); +}; + +export const PersonIcon = (props: SvgIconProps) => { + return ( + + + + ); +}; + +export const OrderIcon = (props: SvgIconProps) => { + return ( + + + + ); +}; + +export const PromotionIcon = (props: SvgIconProps) => { + return ( + + + + + ); +}; + +export const LogoutIcon = (props: SvgIconProps) => { + return ( + + + + ); +}; + +export const SpaceIcon = (props: SvgIconProps) => { + return ( + + + + ); +}; diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx index 79b3345..c44e18b 100644 --- a/src/components/Header/index.tsx +++ b/src/components/Header/index.tsx @@ -1,105 +1,200 @@ 'use client'; -import React, { useEffect, useState } from 'react'; +import { ALL_TOOLKIT_LIST, SECURITY_HOLE, TOOLKIT_LIST } from './toolkit'; +import PlayArrowRoundedIcon from '@mui/icons-material/PlayArrowRounded'; +import SearchRoundedIcon from '@mui/icons-material/SearchRounded'; import { - Box, AppBar, - Stack, - Link, + Box, Button, + InputAdornment, + Link, Menu, MenuItem, + Popover, + Stack, + TextField, Typography, } from '@mui/material'; -import PlayArrowRoundedIcon from '@mui/icons-material/PlayArrowRounded'; +import { useDebounceFn } from 'ahooks'; +import NextLink from 'next/link'; -const MENU = [ - { - title: 'WebShell 检测', - href: '/webShell', - }, - { - title: '编码转化', - href: `/toolkit/cyberChef/Base64Encoder`, - }, - { - title: '加密解密', - href: `/toolkit/cyberChef/AESEncrypt`, - }, +import { usePathname, useRouter } from 'next/navigation'; +import React, { useEffect, useState } from 'react'; +import LoggedInView from './loggedInView'; + +const NAV_LINK = [ { - title: '代码格式化', - href: `/toolkit/format/html`, + title: '技术讨论', + href: '/discussion', }, { - title: '代码截图', - href: `/toolkit/codeshot`, + title: '长亭漏洞情报库', + href: '/vuldb', + target: '_blank', }, { - title: '其他工具', - href: '/tools', + title: 'IP 威胁情报', + href: '/ip-intelligence', target: '_blank', }, -]; -const NAV_LINK = [ - { - title: '行业百科', - href: '/wiki', - }, - { - title: '技术讨论', - href: '/discussion', - }, { title: '在线工具', href: '/tools', target: '_blank', type: 'menu', }, - { - title: '漏洞情报', - href: '/vuldb', - }, ]; + +const PATH_TO_TEXT = { + discussion: '技术讨论', + product: '产品详情', + vendors: '厂商详情', + blog: '文章详情', +}; + +const ToolItem = ({ data }: any) => { + return ( + + + {data.name} + + {data.tools.map((tool: any) => ( + + {tool.name} + + ))} + + ); +}; + const Header = () => { - const [user, setUser] = useState(null); + const pathname = usePathname(); + const [afterKeyword, setAfterKeyword] = useState(''); const [anchorEl, setAnchorEl] = useState(null); + const [selectEl, setSelectEl] = useState(null); + const [toolList, setToolList] = useState(TOOLKIT_LIST); + const [user, setUser] = useState(null); + const [keyword, setKeyword] = useState(''); const open = Boolean(anchorEl); + + const selectOpen = Boolean(selectEl); + const router = useRouter(); + + const { run: runSearch } = useDebounceFn( + (k: string) => { + handleSearch(k.trim()); + }, + { wait: 500 } + ); + useEffect(() => { fetch('/api/v1/user/profile', { credentials: 'include', }).then((res) => { res.json().then((data) => { - setUser(data); + if (data.code === 0) { + setUser(data.data); + } }); }); }, []); + const handleSearch = (k: string) => { + if (k === '') { + setToolList(TOOLKIT_LIST); + setAfterKeyword(k); + return; + } + const toolList = ALL_TOOLKIT_LIST.reduce((prev, cur) => { + const tools = cur.tools.filter((item) => + item.name.toUpperCase().includes(k.toUpperCase()) + ); + if (tools.length) { + prev.push({ + name: cur.name, + tools, + }); + } + return prev; + }, [] as any[]); + + setToolList(toolList); + setAfterKeyword(k); + }; + + useEffect(() => { + runSearch(keyword); + }, [keyword]); + + const pathText = + PATH_TO_TEXT[pathname.split('/')[1] as keyof typeof PATH_TO_TEXT]; + return ( + + { + router.push('/'); + }} + > + 长亭百川云 {pathText ? ` - ${pathText}` : ''} + + + - {/* { - window.open('/', '_self'); - }} - style={{ marginLeft: 40, marginRight: 80, cursor: 'pointer' }} - > */} { fontWeight: 700, color: '#000', }} - onClick={() => window.open('/', '_self')} + onClick={() => { + router.push('/'); + }} > 长亭百川云 {NAV_LINK.map((item) => ( - ) => { + href={item.href} + // onMouseEnter={(e: React.MouseEvent) => { + // if (item.type === 'menu') { + // setAnchorEl(e.currentTarget); + // } + // }} + onClick={(e: React.MouseEvent) => { if (item.type === 'menu') { + e.preventDefault(); + e.stopPropagation(); setAnchorEl(e.currentTarget); } - }} - onClick={(e) => { - e.preventDefault(); - e.stopPropagation(); - if (item.type === 'menu') { - return; - } else { - window.open(item.href, '_self'); + if (item.type === 'select') { + e.preventDefault(); + e.stopPropagation(); + setSelectEl(e.currentTarget); } }} sx={{ @@ -141,63 +242,183 @@ const Header = () => { alignItems: 'center', fontSize: '14px', gap: 0.5, - color: 'rgba(0,0,0,0.5)', - fontWeight: 700, + color: + (open && item.title === '在线工具') || + (selectOpen && item.title === '安全情报') || + pathname === item.href + ? 'primary.main' + : 'rgba(0,0,0,0.5)', '&:hover': { color: 'primary.main', }, }} > {item.title} - {item.type === 'menu' && ( + {(item.type === 'menu' || item.type === 'select') && ( )} - + ))} - { - setAnchorEl(null); + setSelectEl(null); }} - PaperProps={{ - sx: { mt: 1.5 }, + MenuListProps={{ + 'aria-labelledby': 'basic-button', }} + sx={{ mt: 2 }} > - {MENU.map((item) => ( + {SECURITY_HOLE.map((item) => ( { - setAnchorEl(null); - window.open(item.href); - }} > - {item.title} + {item.name} ))} + { + setAnchorEl(null); + }} + // sx={{ position: 'static' }} + anchorOrigin={{ + vertical: 'bottom', + horizontal: 'center', + }} + transformOrigin={{ + vertical: 'top', + horizontal: 'center', + }} + PaperProps={{ + sx: { + width: '100%', + maxWidth: '100%', + maxHeight: 700, + ml: -2, + mt: 2, + py: 3, + px: 9, + boxShadow: ' 0px 10px 20px 0px rgba(0,28,85,0.04)', + }, + onMouseLeave: () => { + // setAnchorEl(null); + }, + }} + > + + { + setKeyword(e.target.value); + }} + InputProps={{ + startAdornment: ( + + + + ), + }} + /> + + + + + {afterKeyword === '' && toolList.length === 10 && ( + <> + + + + + + + + + + )} + + {toolList + .slice(afterKeyword === '' && toolList.length === 10 ? 4 : 0) + .map((item) => ( + + + + ))} + + {toolList.length === 0 && ( + + + + 未找到你查询的内容 + + + )} + { sx={{ position: 'absolute', top: 0, bottom: 0, right: 40 }} > {user ? ( - + <> + + + ) : ( <> diff --git a/src/components/Header/loggedInView.tsx b/src/components/Header/loggedInView.tsx new file mode 100644 index 0000000..818c89a --- /dev/null +++ b/src/components/Header/loggedInView.tsx @@ -0,0 +1,56 @@ +import { Tooltip, Box } from '@mui/material'; +import { Avatar } from './components'; +import React from 'react'; +import ProfilePanel from './profilePanel'; + +export interface LoggedInProps { + user: any | null; + verified: boolean; +} + +const LoggedInView = ({ user }: any) => { + return ( + + } + > + + {user.head_img_url ? ( + 头像 + ) : ( + + )} + + + ); +}; + +export default LoggedInView; diff --git a/src/components/Header/profilePanel.tsx b/src/components/Header/profilePanel.tsx new file mode 100644 index 0000000..0d76b39 --- /dev/null +++ b/src/components/Header/profilePanel.tsx @@ -0,0 +1,240 @@ +'use client'; +import ErrorRoundedIcon from '@mui/icons-material/ErrorRounded'; +import CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded'; +import { + Avatar, + Link, + Stack, + Box, + List, + ListItem, + ListItemButton, + ListItemText, + ListItemIcon, +} from '@mui/material'; +import React, { useCallback } from 'react'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import { + Badge, + IdCard, + IdInfo, + InfoCard, + Row, + TagRow, + CopyIcon, + SpaceIcon, + OrderIcon, + PersonIcon, + PromotionIcon, + LogoutIcon, +} from './components'; +import alert from '@/components/Alert'; +export interface ProfilePanelProps { + userInfo: any | null; + verified: boolean; +} + +const ProfilePanel: React.FC = (props) => { + const { userInfo, verified } = props; + const handleLogout = () => { + fetch('/api/v1/user/signout', { + credentials: 'include', + }).then(() => { + window.location.reload(); + }); + }; + + const toLink = (link: string) => () => { + window.open(link, '_target'); + }; + + const onCopy = useCallback(() => { + alert.success('用户ID已复制到剪贴板'); + }, []); + + const OPT_LIST = [ + { + name: '个人中心', + icon: , + link: '/console/personal/base', + }, + { + name: '空间管理', + icon: , + link: '/console/space/base', + }, + { + name: '推广大使', + icon: , + link: '/console/personal/promotion', + }, + { + name: '订单管理', + icon: , + link: '/console/space/order', + }, + ]; + + return ( + + + + + + + {userInfo?.nickname} + + + + {userInfo?.id} + + + + + + + + + + + {verified ? ( + + ) : ( + + )} + {verified ? '已认证' : '未实名认证'} + + {!verified && ( + + 去认证 + + )} + + + + + + + {OPT_LIST.map((item) => { + return ( + + { + window.open(item.link, '_target'); + }} + dense + > + {item.icon} + + + + ); + })} + + + + + + + + + + + ); +}; + +export default ProfilePanel; diff --git a/src/components/Header/search.tsx b/src/components/Header/search.tsx deleted file mode 100644 index 83b70e1..0000000 --- a/src/components/Header/search.tsx +++ /dev/null @@ -1,323 +0,0 @@ -'use client'; - -import React, { useState } from 'react'; -import { - Box, - InputBase, - Button, - createTheme, - ThemeProvider, - Dialog, - styled, - InputBaseProps, - BoxProps, - ButtonProps, - SvgIconProps, - Stack, - List, - ListItem, - ListItemButton, - ListItemText, - Typography, - IconButton, - Popover, -} from '@mui/material'; -import SearchRoundedIcon from '@mui/icons-material/SearchRounded'; -import ClearRoundedIcon from '@mui/icons-material/ClearRounded'; -import { useLocalStorageState } from 'ahooks'; - -const innerTheme = createTheme({ - palette: { - primary: { - main: '#1A191C', - }, - }, -}); - -const SearchBaseInput = styled(InputBase)(({ theme }) => ({ - flex: 1, - padding: '0 30px', - height: '40px', - fontSize: 20, - border: '1px solid', - borderColor: 'transparent', - transition: 'all 0.3s', - borderTopLeftRadius: '4px', - borderBottomLeftRadius: '4px', - borderRight: 'none', - '&:hover': { - borderColor: theme.palette.primary.main, - }, - '&:focus-within': { - borderColor: theme.palette.primary.main, - }, -})); - -const SearchBaseWrapper = styled(Box)(({ theme }) => { - return { - display: 'flex', - alignItems: 'center', - width: 360, - height: 40, - borderRadius: '4px', - transition: 'all 0.3s', - boxShadow: '0px 0px 20px 0px rgba(0,28,85,0.1)', - backgroundColor: '#fff', - '&:hover': { - boxShadow: '0px 10px 40px 0px rgba(0,28,85,0.15)', - }, - }; -}); - -const SearchBaseButton = styled(Button)({ - width: 82, - height: 40, - borderRadius: '0px 4px 4px 0px', -}); - -export const SearchBase = React.forwardRef( - ( - props: { - type?: 'icon' | 'button' | 'icon-button'; - open?: boolean; - setOpen?(open: boolean): void; - SearchBaseWrapperProps?: BoxProps; - SearchBaseInputProps?: InputBaseProps; - SearchBaseButtonProps?: ButtonProps; - SearchRoundedIconProps?: SvgIconProps; - keywords?: string; - }, - ref - ) => { - const { - type = 'button', - setOpen, - SearchBaseWrapperProps, - SearchBaseInputProps, - SearchBaseButtonProps, - SearchRoundedIconProps, - keywords = '', - } = props; - return type === 'icon-button' ? ( - { - setOpen?.(true); - }} - /> - ) : ( - { - setOpen?.(true); - }} - {...SearchBaseWrapperProps} - > - } - {...SearchBaseInputProps} - /> - {type === 'button' && ( - - - 搜索 - - - )} - - ); - } -); -SearchBase.displayName = 'SearchBase'; - -export const DialogSearch = (props: { open: boolean; onClose(): void }) => { - const { open, onClose } = props; - const [keywords, setKeywords] = useState(''); - const [recentSearch, setRecentSearch] = useLocalStorageState( - 'recent-search', - { - defaultValue: [], - } - ); - - const onSearch = () => { - if (!keywords.trim()) { - return; - } - onClose(); - if (recentSearch) { - const index = recentSearch.indexOf(keywords); - if (index > -1) { - recentSearch.splice(index, 1); - recentSearch.unshift(keywords); - } else { - if (recentSearch.length >= 10) { - recentSearch.pop(); - } - recentSearch.unshift(keywords); - } - setRecentSearch([...recentSearch]); - } else { - setRecentSearch([keywords]); - } - window.open(`/s?keywords=${keywords}`, '_self'); - }; - - return ( - - { - setKeywords(e.target.value); - }, - onKeyDown: (e) => { - if (e.key === 'Enter') { - onSearch(); - } - }, - sx: { - height: 56, - borderTopLeftRadius: '4px', - borderBottomLeftRadius: '4px', - borderRight: 'none !important', - }, - }} - SearchBaseButtonProps={{ - sx: { - width: 102, - height: 56, - fontSize: 18, - }, - onClick: () => { - onSearch(); - }, - }} - /> - - {!!recentSearch?.length && ( - - - - 最近搜索 - - - - {recentSearch?.map((k, index) => ( - { - e.stopPropagation(); - recentSearch.splice(index, 1); - setRecentSearch([...recentSearch]); - }} - > - - - } - onClick={() => { - onClose(); - window.open(`/s?keywords=${k}`, '_self'); - }} - > - - - - - ))} - - - )} - - ); -}; - -export const PopoverContent = React.forwardRef(() => { - return ( - - The content of the Popover. - - ); -}); -PopoverContent.displayName = 'PopoverContent'; - -const Search = React.forwardRef( - ( - props: { - type?: 'icon' | 'button' | 'icon-button'; - SearchBaseWrapperProps?: BoxProps; - SearchBaseInputProps?: InputBaseProps; - SearchBaseButtonProps?: ButtonProps; - SearchRoundedIconProps?: SvgIconProps; - }, - ref - ) => { - const [open, setOpen] = useState(false); - const { - type = 'button', - SearchBaseWrapperProps, - SearchBaseInputProps, - SearchBaseButtonProps, - SearchRoundedIconProps, - } = props; - const onClose = () => { - setOpen(false); - }; - return ( - <> - - {/* */} - - - ); - } -); - -Search.displayName = 'Search'; -export default Search; diff --git a/src/components/Header/toolkit.ts b/src/components/Header/toolkit.ts new file mode 100644 index 0000000..730ec81 --- /dev/null +++ b/src/components/Header/toolkit.ts @@ -0,0 +1,1036 @@ +export const TOOLKIT_LIST = [ + { + name: '\u5b89\u5168\u5de5\u5177', + tools: [ + { + name: 'MD5 \u54c8\u5e0c\u78b0\u649e', + url: '/tools/md5fastcollision', + }, + { + name: 'ZIP \u5bc6\u7801\u7834\u89e3', + url: '/tools/zipcrack', + }, + { + name: 'XSS \u5411\u91cf\u751f\u6210', + url: '/tools/xssvector', + }, + { + name: 'WebShell \u68c0\u6d4b', + url: '/webShell', + }, + ], + }, + { + name: '\u683c\u5f0f\u8f6c\u6362', + tools: [ + { + name: 'LESS CSS \u4e92\u8f6c', + url: '/tools/less2css', + }, + { + name: 'markdown html \u4e92\u8f6c', + url: '/tools/md2html', + }, + { + name: 'JSON XML \u4e92\u8f6c', + url: '/tools/json2xml', + }, + { + name: 'JSON \u8f6c yaml', + url: '/tools/json2yaml', + }, + { + name: 'JSON \u8f6c GO', + url: '/tools/json2go', + }, + { + name: 'JSON \u8f6c CSV/EXCEL', + url: '/tools/jsontocsv', + }, + { + name: 'JSON JavaScript \u4e92\u8f6c', + url: '/tools/json2js', + }, + ], + }, + { + name: '\u6280\u672f\u901f\u67e5\u8868', + tools: [ + { + name: 'Git \u547d\u4ee4\u901f\u67e5', + url: '/tools/git', + }, + { + name: 'ASCII \u7801\u8868', + url: '/tools/ascii', + }, + ], + }, + { + name: '\u56fe\u7247\u5904\u7406', + tools: [ + { + name: '\u56fe\u7247\u8f6c Base64', + url: '/tools/img2base64', + }, + { + name: 'OCR \u56fe\u7247\u6587\u5b57\u8bc6\u522b', + url: '/tools/ocr', + }, + { + name: '\u56fe\u7247\u538b\u7f29', + url: '/tools/img_sharp', + }, + { + name: '\u56fe\u7247\u6dfb\u52a0\u6c34\u5370', + url: '/tools/watermark', + }, + { + name: '\u56fe\u7247\u683c\u5f0f\u8f6c\u6362', + url: '/tools/img_conversion', + }, + ], + }, + { + name: '\u54c8\u5e0c\u8ba1\u7b97', + tools: [ + { + name: 'SHA-512/256 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-512.256', + }, + { + name: 'SHA-512/224 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-512.224', + }, + { + name: 'SHA-512 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-512', + }, + { + name: 'SHA-384 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-384', + }, + { + name: 'SHA-256 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-256', + }, + { + name: 'SHA-224 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-224', + }, + { + name: 'MD6 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-MD6', + }, + { + name: 'MD4 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-MD4', + }, + { + name: 'MD2 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-MD2', + }, + { + name: 'MD5 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-MD5', + }, + ], + }, + { + name: '\u52a0\u5bc6\u89e3\u5bc6', + tools: [ + { + name: '\u57f9\u6839\u5bc6\u7801\u89e3\u5bc6', + url: '/toolkit/cyberChef/BaconDecode', + }, + { + name: '\u57f9\u6839\u5bc6\u7801\u52a0\u5bc6', + url: '/toolkit/cyberChef/BaconEncode', + }, + { + name: 'RSA \u89e3\u5bc6', + url: '/toolkit/cyberChef/RSADecrypt', + }, + { + name: 'RSA \u52a0\u5bc6', + url: '/toolkit/cyberChef/RSAEncrypt', + }, + { + name: 'SM4 \u89e3\u5bc6', + url: '/toolkit/cyberChef/SM4Decrypt', + }, + { + name: 'SM4 \u52a0\u5bc6', + url: '/toolkit/cyberChef/SM4Encrypt', + }, + { + name: '3DES \u89e3\u5bc6', + url: '/toolkit/cyberChef/3DESDecrypt', + }, + { + name: '3DES \u52a0\u5bc6', + url: '/toolkit/cyberChef/3DESEncrypt', + }, + { + name: 'DES \u89e3\u5bc6', + url: '/toolkit/cyberChef/DESDecrypt', + }, + { + name: 'DES \u52a0\u5bc6', + url: '/toolkit/cyberChef/DESEncrypt', + }, + { + name: 'AES \u89e3\u5bc6', + url: '/toolkit/cyberChef/AESDecrypt', + }, + { + name: 'AES \u52a0\u5bc6', + url: '/toolkit/cyberChef/AESEncrypt', + }, + ], + }, + { + name: '\u7f16\u7801\u8f6c\u6362', + tools: [ + { + name: 'Unicode \u89e3\u7801', + url: '/toolkit/cyberChef/UnicodeDecode', + }, + { + name: 'Unicode \u7f16\u7801', + url: '/toolkit/cyberChef/UnicodeEncode', + }, + { + name: 'HTML \u89e3\u7801', + url: '/toolkit/cyberChef/HTMLDecode', + }, + { + name: 'HTML \u7f16\u7801', + url: '/toolkit/cyberChef/HTMLEncode', + }, + { + name: '\u6469\u65af\u5bc6\u7801\u89e3\u7801', + url: '/toolkit/cyberChef/MorseDecode', + }, + { + name: '\u6469\u65af\u5bc6\u7801\u7f16\u7801', + url: '/toolkit/cyberChef/MorseEncode', + }, + { + name: 'URL \u89e3\u7801', + url: '/toolkit/cyberChef/URLDecoder', + }, + { + name: 'URL \u7f16\u7801', + url: '/toolkit/cyberChef/URLEncoder', + }, + { + name: 'Hex \u89e3\u7801', + url: '/toolkit/cyberChef/HexDecoder', + }, + { + name: 'Hex \u7f16\u7801', + url: '/toolkit/cyberChef/HexEncoder', + }, + { + name: 'Base64 \u89e3\u7801', + url: '/toolkit/cyberChef/Base64Decoder', + }, + { + name: 'Base64 \u7f16\u7801', + url: '/toolkit/cyberChef/Base64Encoder', + }, + ], + }, + { + name: '\u4ee3\u7801\u683c\u5f0f\u5316', + tools: [ + { + name: 'SQL \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/sql', + }, + { + name: 'Java \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/java', + }, + { + name: 'CSS \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/css', + }, + { + name: 'JavaScript \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/javascript', + }, + { + name: 'JSON \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/json', + }, + { + name: 'YAML \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/yaml', + }, + { + name: 'XML \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/xml', + }, + { + name: 'HTML \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/html', + }, + ], + }, + { + name: '\u6587\u5b57\u5904\u7406', + tools: [ + { + name: '\u79fb\u9664\u7a7a\u767d\u5b57\u7b26', + url: '/toolkit/cyberChef/RemoveWhitespace', + }, + { + name: '\u6587\u5b57\u8f6c\u9a7c\u5cf0/\u4e0b\u5212\u7ebf\u683c\u5f0f', + url: '/tools/camelcase', + }, + { + name: '\u4e2d\u82f1\u6587\u52a0\u7a7a\u683c', + url: '/tools/cn_space_en', + }, + { + name: '\u751f\u6210\u4e71\u5e8f\u6587\u5b57', + url: '/tools/shuffle_text_generator', + }, + { + name: '\u6587\u5b57\u6dfb\u52a0\u884c\u53f7', + url: '/tools/line_number', + }, + { + name: '\u751f\u6210 Figlet \u7ec8\u7aef\u827a\u672f\u5b57', + url: '/tools/figlet', + }, + { + name: '\u751f\u6210 Leet \u9ed1\u5ba2\u6587\u5b57', + url: '/tools/leet_convert', + }, + { + name: '\u6587\u672c\u5dee\u5f02\u5bf9\u6bd4', + url: '/tools/diff', + }, + { + name: '\u5927\u5c0f\u5199\u8f6c\u6362', + url: '/tools/case_convert', + }, + { + name: '\u5b57\u6570\u7edf\u8ba1', + url: '/tools/word_count', + }, + ], + }, + { + name: '\u5176\u4ed6', + tools: [ + { + name: '\u624b\u7ed8\u767d\u677f', + url: '/tools/excalidraw', + }, + { + name: '\u989c\u8272\u683c\u5f0f\u8f6c\u6362', + url: '/tools/color_convert', + }, + { + name: '\u968f\u673a IP \u751f\u6210\u5668', + url: '/tools/random_ip', + }, + { + name: '\u968f\u673a\u6570/\u5bc6\u7801\u751f\u6210\u5668', + url: '/tools/random', + }, + { + name: '\u8fdb\u5236\u8f6c\u6362', + url: '/tools/radix_convert', + }, + { + name: 'Unix \u65f6\u95f4\u6233\u8f6c\u6362', + url: '/tools/unix', + }, + { + name: '\u4ee3\u7801\u622a\u56fe', + url: '/toolkit/codeshot', + }, + // { + // "name": "更多工具", + // "url": "/toolkit" + // } + ], + }, +]; + +export const ALL_TOOLKIT_LIST = [ + { + name: '\u54c8\u5e0c\u8ba1\u7b97', + tools: [ + { + name: 'SHA-512/256 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-512.256', + }, + { + name: 'SHA-512/224 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-512.224', + }, + { + name: 'SHA-512 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-512', + }, + { + name: 'SHA-384 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-384', + }, + { + name: 'SHA-256 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-256', + }, + { + name: 'SHA-224 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-224', + }, + { + name: 'SHA-3 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-3', + }, + { + name: 'SHA-2 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-2', + }, + { + name: 'SHA-1 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-1', + }, + { + name: 'SHA-0 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-SHA-0', + }, + { + name: 'MD6 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-MD6', + }, + { + name: 'MD4 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-MD4', + }, + { + name: 'MD2 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-MD2', + }, + { + name: 'MD5 \u8ba1\u7b97', + url: '/toolkit/cyberChef/Hash-MD5', + }, + ], + }, + { + name: '\u7f16\u7801\u8f6c\u6362', + tools: [ + { + name: 'Unicode \u89e3\u7801', + url: '/toolkit/cyberChef/UnicodeDecode', + }, + { + name: 'Unicode \u7f16\u7801', + url: '/toolkit/cyberChef/UnicodeEncode', + }, + { + name: 'HTML \u89e3\u7801', + url: '/toolkit/cyberChef/HTMLDecode', + }, + { + name: 'HTML \u7f16\u7801', + url: '/toolkit/cyberChef/HTMLEncode', + }, + { + name: 'Charcode \u89e3\u7801', + url: '/toolkit/cyberChef/FromCharcode', + }, + { + name: 'Charcode \u7f16\u7801', + url: '/toolkit/cyberChef/ToCharcode', + }, + { + name: 'Hexdump \u89e3\u7801', + url: '/toolkit/cyberChef/FromHexdump', + }, + { + name: 'Hexdump \u7f16\u7801', + url: '/toolkit/cyberChef/ToHexdump', + }, + { + name: '\u6469\u65af\u5bc6\u7801\u89e3\u7801', + url: '/toolkit/cyberChef/MorseDecode', + }, + { + name: '\u6469\u65af\u5bc6\u7801\u7f16\u7801', + url: '/toolkit/cyberChef/MorseEncode', + }, + { + name: 'URL \u89e3\u7801', + url: '/toolkit/cyberChef/URLDecoder', + }, + { + name: 'URL \u7f16\u7801', + url: '/toolkit/cyberChef/URLEncoder', + }, + { + name: 'Hex \u89e3\u7801', + url: '/toolkit/cyberChef/HexDecoder', + }, + { + name: 'Hex \u7f16\u7801', + url: '/toolkit/cyberChef/HexEncoder', + }, + { + name: 'Base64 \u89e3\u7801', + url: '/toolkit/cyberChef/Base64Decoder', + }, + { + name: 'Base64 \u7f16\u7801', + url: '/toolkit/cyberChef/Base64Encoder', + }, + ], + }, + { + name: '\u4e8c\u8fdb\u5236\u5904\u7406', + tools: [ + { + name: '\u6587\u4ef6\u683c\u5f0f\u8bc6\u522b', + url: '/tools/file', + }, + { + name: 'Pyc \u8f6c Asm', + url: '/tools/pyc2asm', + }, + { + name: 'Pyc \u8f6c Py', + url: '/tools/pyc2py', + }, + { + name: 'Hex \u7f16\u8f91\u5668', + url: '/tools/hexeditor', + }, + ], + }, + + { + name: '\u683c\u5f0f\u8f6c\u6362', + tools: [ + { + name: 'LESS CSS \u4e92\u8f6c', + url: '/tools/less2css', + }, + { + name: 'markdown html \u4e92\u8f6c', + url: '/tools/md2html', + }, + { + name: 'JSON XML \u4e92\u8f6c', + url: '/tools/json2xml', + }, + { + name: 'JSON \u8f6c yaml', + url: '/tools/json2yaml', + }, + { + name: 'JSON \u8f6c GO', + url: '/tools/json2go', + }, + { + name: 'JSON \u8f6c CSV/EXCEL', + url: '/tools/jsontocsv', + }, + { + name: 'JSON JavaScript \u4e92\u8f6c', + url: '/tools/json2js', + }, + ], + }, + { + name: '\u6570\u636e\u53ef\u89c6\u5316', + tools: [ + { + name: '\u751f\u6210\u5357\u4e01\u683c\u5c14\u73ab\u7470\u56fe', + url: '/tools/chart_nightingale', + }, + { + name: '\u751f\u6210\u6298\u7ebf\u56fe', + url: '/tools/chart_line', + }, + { + name: '\u751f\u6210\u96f7\u8fbe\u56fe', + url: '/tools/chart_radar', + }, + ], + }, + { + name: '\u6587\u5b57\u5904\u7406', + tools: [ + { + name: '\u79fb\u9664\u7a7a\u767d\u5b57\u7b26', + url: '/toolkit/cyberChef/RemoveWhitespace', + }, + { + name: '\u6587\u5b57\u8f6c\u9a7c\u5cf0/\u4e0b\u5212\u7ebf\u683c\u5f0f', + url: '/tools/camelcase', + }, + { + name: '\u4e2d\u82f1\u6587\u52a0\u7a7a\u683c', + url: '/tools/cn_space_en', + }, + { + name: '\u751f\u6210\u4e71\u5e8f\u6587\u5b57', + url: '/tools/shuffle_text_generator', + }, + { + name: '\u6587\u5b57\u6dfb\u52a0\u884c\u53f7', + url: '/tools/line_number', + }, + { + name: '\u751f\u6210 Figlet \u7ec8\u7aef\u827a\u672f\u5b57', + url: '/tools/figlet', + }, + { + name: '\u751f\u6210 Leet \u9ed1\u5ba2\u6587\u5b57', + url: '/tools/leet_convert', + }, + { + name: '\u6587\u672c\u5dee\u5f02\u5bf9\u6bd4', + url: '/tools/diff', + }, + { + name: '\u5927\u5c0f\u5199\u8f6c\u6362', + url: '/tools/case_convert', + }, + { + name: '\u5b57\u6570\u7edf\u8ba1', + url: '/tools/word_count', + }, + ], + }, + { + name: '\u6280\u672f\u901f\u67e5\u8868', + tools: [ + { + name: 'Git \u547d\u4ee4\u901f\u67e5', + url: '/tools/git', + }, + { + name: 'ASCII \u7801\u8868', + url: '/tools/ascii', + }, + ], + }, + { + name: '\u97f3\u9891\u89c6\u9891\u5904\u7406', + tools: [ + { + name: '\u89c6\u9891\u62c6\u5206\u6210\u56fe\u7247\u5e27', + url: '/tools/videoframe', + }, + { + name: '\u89c6\u9891\u8f6c gif \u52a8\u56fe', + url: '/tools/video2gif', + }, + { + name: '\u89c6\u9891\u63d0\u53d6\u97f3\u9891', + url: '/tools/getvideoaudio', + }, + { + name: '\u89c6\u9891\u683c\u5f0f\u8f6c\u6362', + url: '/tools/videofmt', + }, + { + name: '\u97f3\u9891\u683c\u5f0f\u8f6c\u6362', + url: '/tools/audiofmt', + }, + ], + }, + { + name: '\u56fe\u7247\u5904\u7406', + tools: [ + { + name: '\u56fe\u7247\u8f6c Base64', + url: '/tools/img2base64', + }, + { + name: '\u751f\u6210\u4e5d\u5bab\u683c\u56fe\u7247', + url: '/tools/img_split', + }, + { + name: 'OCR \u56fe\u7247\u6587\u5b57\u8bc6\u522b', + url: '/tools/ocr', + }, + { + name: '\u56fe\u7247\u5706\u89d2', + url: '/tools/img_radius', + }, + { + name: '\u56fe\u7247\u50cf\u7d20\u5316', + url: '/tools/pixel_img', + }, + { + name: '\u56fe\u7247\u9ed1\u767d\u5316', + url: '/tools/uncolor', + }, + { + name: '\u56fe\u7247\u538b\u7f29', + url: '/tools/img_sharp', + }, + { + name: '\u56fe\u7247\u6dfb\u52a0\u6c34\u5370', + url: '/tools/watermark', + }, + { + name: '\u56fe\u7247\u683c\u5f0f\u8f6c\u6362', + url: '/tools/img_conversion', + }, + ], + }, + { + name: '\u5b89\u5168\u5de5\u5177', + tools: [ + { + name: 'MD5 \u54c8\u5e0c\u78b0\u649e', + url: '/tools/md5fastcollision', + }, + { + name: 'ZIP \u5bc6\u7801\u7834\u89e3', + url: '/tools/zipcrack', + }, + { + name: 'XSS \u5411\u91cf\u751f\u6210', + url: '/tools/xssvector', + }, + { + name: 'WebShell \u68c0\u6d4b', + url: '/webShell', + }, + ], + }, + { + name: '\u4ee3\u7801\u683c\u5f0f\u5316', + tools: [ + { + name: 'SQL \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/sql', + }, + { + name: 'Java \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/java', + }, + { + name: 'CSS \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/css', + }, + { + name: 'JavaScript \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/javascript', + }, + { + name: 'JSON \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/json', + }, + { + name: 'YAML \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/yaml', + }, + { + name: 'XML \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/xml', + }, + { + name: 'HTML \u4ee3\u7801\u683c\u5f0f\u5316', + url: '/toolkit/format/html', + }, + ], + }, + { + name: '\u52a0\u5bc6\u89e3\u5bc6', + tools: [ + { + name: 'LS47 \u89e3\u5bc6', + url: '/toolkit/cyberChef/LS47Decrypt', + }, + { + name: 'LS47 \u52a0\u5bc6', + url: '/toolkit/cyberChef/LS47Encrypt', + }, + { + name: 'GOST \u5bc6\u7801\u89e3\u5bc6', + url: '/toolkit/cyberChef/GOSTDecrypt', + }, + { + name: 'GOST \u5bc6\u7801\u52a0\u5bc6', + url: '/toolkit/cyberChef/GOSTEncrypt', + }, + { + name: '\u57c3\u7279\u5df4\u4ec0\u5bc6\u7801', + url: '/toolkit/cyberChef/AtbashCipher', + }, + { + name: '\u4eff\u5c04\u5bc6\u7801\u89e3\u5bc6', + url: '/toolkit/cyberChef/AffineDecode', + }, + { + name: '\u4eff\u5c04\u5bc6\u7801\u52a0\u5bc6', + url: '/toolkit/cyberChef/AffineEncode', + }, + { + name: 'Bifid \u5bc6\u7801\u89e3\u5bc6', + url: '/toolkit/cyberChef/BifidDecode', + }, + { + name: 'Bifid \u5bc6\u7801\u52a0\u5bc6', + url: '/toolkit/cyberChef/BifidEncode', + }, + { + name: '\u57f9\u6839\u5bc6\u7801\u89e3\u5bc6', + url: '/toolkit/cyberChef/BaconDecode', + }, + { + name: '\u57f9\u6839\u5bc6\u7801\u52a0\u5bc6', + url: '/toolkit/cyberChef/BaconEncode', + }, + { + name: '\u6805\u680f\u5bc6\u7801\u89e3\u5bc6', + url: '/toolkit/cyberChef/RailFenceDecode', + }, + { + name: '\u6805\u680f\u5bc6\u7801\u52a0\u5bc6', + url: '/toolkit/cyberChef/RailFenceEncode', + }, + { + name: '\u7ef4\u5409\u5c3c\u4e9a\u5bc6\u7801\u89e3\u5bc6', + url: '/toolkit/cyberChef/VigenereDecode', + }, + { + name: '\u7ef4\u5409\u5c3c\u4e9a\u5bc6\u7801\u52a0\u5bc6', + url: '/toolkit/cyberChef/VigenereEncode', + }, + { + name: 'Fernet \u89e3\u5bc6', + url: '/toolkit/cyberChef/FernetDecrypt', + }, + { + name: 'Fernet \u52a0\u5bc6', + url: '/toolkit/cyberChef/FernetEncrypt', + }, + { + name: 'Blowfish \u89e3\u5bc6', + url: '/toolkit/cyberChef/BlowfishDecrypt', + }, + { + name: 'Blowfish \u52a0\u5bc6', + url: '/toolkit/cyberChef/BlowfishEncrypt', + }, + { + name: 'RSA \u89e3\u5bc6', + url: '/toolkit/cyberChef/RSADecrypt', + }, + { + name: 'RSA \u52a0\u5bc6', + url: '/toolkit/cyberChef/RSAEncrypt', + }, + { + name: 'SM4 \u89e3\u5bc6', + url: '/toolkit/cyberChef/SM4Decrypt', + }, + { + name: 'SM4 \u52a0\u5bc6', + url: '/toolkit/cyberChef/SM4Encrypt', + }, + { + name: 'Rabbit \u52a0\u89e3\u5bc6', + url: '/toolkit/cyberChef/Rabbit', + }, + { + name: 'RC4 Drop \u52a0\u89e3\u5bc6', + url: '/toolkit/cyberChef/RC4Drop', + }, + { + name: 'RC4 \u52a0\u89e3\u5bc6', + url: '/toolkit/cyberChef/RC4', + }, + { + name: 'RC2 \u89e3\u5bc6', + url: '/toolkit/cyberChef/RC2Decrypt', + }, + { + name: 'RC2 \u52a0\u5bc6', + url: '/toolkit/cyberChef/RC2Encrypt', + }, + { + name: '3DES \u89e3\u5bc6', + url: '/toolkit/cyberChef/3DESDecrypt', + }, + { + name: '3DES \u52a0\u5bc6', + url: '/toolkit/cyberChef/3DESEncrypt', + }, + { + name: 'DES \u89e3\u5bc6', + url: '/toolkit/cyberChef/DESDecrypt', + }, + { + name: 'DES \u52a0\u5bc6', + url: '/toolkit/cyberChef/DESEncrypt', + }, + { + name: 'AES \u89e3\u5bc6', + url: '/toolkit/cyberChef/AESDecrypt', + }, + { + name: 'AES \u52a0\u5bc6', + url: '/toolkit/cyberChef/AESEncrypt', + }, + ], + }, + { + name: '\u5176\u4ed6', + tools: [ + { + name: '\u4eba\u751f\u683c\u5b50', + url: '/tools/lifecount', + }, + { + name: '\u5012\u8ba1\u65f6', + url: '/tools/countdown', + }, + { + name: '\u65e9\u4e2d\u665a\u5403\u5565\u5462', + url: '/tools/eatwhat', + }, + { + name: '\u624b\u7ed8\u767d\u677f', + url: '/tools/excalidraw', + }, + { + name: '\u989c\u8272\u683c\u5f0f\u8f6c\u6362', + url: '/tools/color_convert', + }, + { + name: '\u989c\u8272\u5438\u53d6\u5668', + url: '/tools/color_picker', + }, + { + name: '\u4e8c\u7ef4\u7801\u751f\u6210\u5668', + url: '/tools/generate_qrcode', + }, + { + name: '\u4e8c\u7ef4\u7801\u89e3\u6790\u5668', + url: '/tools/de_qrcode', + }, + { + name: '\u968f\u673a\u90ae\u7bb1\u751f\u6210', + url: '/tools/random_email', + }, + { + name: '\u968f\u673a USER-AGENT \u751f\u6210\u5668', + url: '/tools/random_ua', + }, + { + name: '\u968f\u673a UUID \u751f\u6210\u5668', + url: '/tools/uuid_gen', + }, + { + name: '\u968f\u673a IP \u751f\u6210\u5668', + url: '/tools/random_ip', + }, + { + name: '\u968f\u673a\u6570/\u5bc6\u7801\u751f\u6210\u5668', + url: '/tools/random', + }, + { + name: '\u516b\u8fdb\u5236\u8f6c\u5b57\u7b26\u4e32', + url: '/toolkit/cyberChef/FromOctal', + }, + { + name: '\u5b57\u7b26\u4e32\u8f6c\u516b\u8fdb\u5236', + url: '/toolkit/cyberChef/ToOctal', + }, + { + name: '\u4e8c\u8fdb\u5236\u8f6c\u5b57\u7b26\u4e32', + url: '/toolkit/cyberChef/FromBinary', + }, + { + name: '\u5b57\u7b26\u4e32\u8f6c\u4e8c\u8fdb\u5236', + url: '/toolkit/cyberChef/ToBinary', + }, + { + name: '\u6d6e\u70b9\u6570\u8f6c\u5b57\u7b26\u4e32', + url: '/toolkit/cyberChef/FromFloat', + }, + { + name: '\u5b57\u7b26\u4e32\u8f6c\u6d6e\u70b9\u6570', + url: '/toolkit/cyberChef/ToFloat', + }, + { + name: '\u5341\u8fdb\u5236\u8f6c\u5b57\u7b26\u4e32', + url: '/toolkit/cyberChef/FromDecimal', + }, + { + name: '\u5b57\u7b26\u4e32\u8f6c\u5341\u8fdb\u5236', + url: '/toolkit/cyberChef/ToDecimal', + }, + { + name: '\u5341\u516d\u8fdb\u5236\u8f6c PEM', + url: '/toolkit/cyberChef/HexToPEM', + }, + { + name: 'PEM \u8f6c\u5341\u516d\u8fdb\u5236', + url: '/toolkit/cyberChef/PEMToHex', + }, + { + name: 'GOST \u7b7e\u540d', + url: '/toolkit/cyberChef/GOSTSign', + }, + { + name: '\u751f\u6210 RSA \u5bc6\u94a5', + url: '/toolkit/cyberChef/RSAKeyPair', + }, + { + name: '\u6587\u4ef6\u5939\u76ee\u5f55\u6811\u751f\u6210', + url: '/tools/dir_tree', + }, + { + name: 'CSS \u538b\u7f29', + url: '/tools/css_minifier', + }, + { + name: 'Docker run \u547d\u4ee4\u8f6c Docker compose', + url: '/tools/docker_run_to_docker_compose', + }, + { + name: 'CIDR \u8ba1\u7b97', + url: '/tools/cidr', + }, + { + name: '\u8fdb\u5236\u8f6c\u6362', + url: '/tools/radix_convert', + }, + { + name: 'Unix \u65f6\u95f4\u6233\u8f6c\u6362', + url: '/tools/unix', + }, + { + name: '\u4ee3\u7801\u622a\u56fe', + url: '/toolkit/codeshot', + }, + ], + }, +]; + +export const SECURITY_HOLE = [ + { + name: '\u6f0f\u6d1e\u60c5\u62a5', + url: '/vuldb', + }, + { + name: 'IP \u60c5\u62a5', + url: '/ip-intelligence', + }, +]; diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx index a858fdd..9080b5f 100644 --- a/src/pages/_document.tsx +++ b/src/pages/_document.tsx @@ -23,7 +23,6 @@ export default function MyDocument({ emotionStyleTags }: MyDocumentProps) { {emotionStyleTags} -
diff --git a/src/styles/colors.ts b/src/styles/colors.ts index ade9178..23d4f47 100644 --- a/src/styles/colors.ts +++ b/src/styles/colors.ts @@ -32,7 +32,7 @@ export const leastTextClick = '#737373'; export const disabledText = '#BFBFBF'; export const specialText = '#737971'; -export const success = 'rgba(52, 90, 255, 1)'; +export const success = '#389E0E'; export const warning = '#FFBF00'; export const error = '#FF1F1F';