feat:新增mockData,以及一些逻辑的修复

This commit is contained in:
liyuanhu 2025-04-16 14:31:14 +08:00
parent ae04f35bb1
commit da91340bcf
8 changed files with 3336 additions and 2849 deletions

View File

@ -0,0 +1,3 @@
<svg width="218" height="148" viewBox="0 0 218 148" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector 330" d="M0.855469 0.683594L95.828 147.041H217.718" stroke="white" stroke-width="0.458267" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 239 B

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,447 @@
export const TRAFFIC_OBFUSCATION = {
type: "NESTED_ENCRYPTION",
name: "流量混淆",
code: "BR",
data: [
{
country_code: "gl",
ingress_country_code: "za",
},
{
country_code: "za",
ingress_country_code: "dz",
},
{
country_code: "dz",
ingress_country_code: "ru",
},
{
country_code: "dz",
ingress_country_code: "cn",
},
],
isLine: true,
};
export const NESTED_ENCRYPTION = {
type: "NESTED_ENCRYPTION",
name: "嵌套加密",
code: "GL",
data: [
{
country_code: "gl",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "dz",
},
{
country_code: "dz",
ingress_country_code: "ru",
},
{
country_code: "dz",
ingress_country_code: "cn",
},
],
isLine: true,
};
export const DYNAMIC_ROUTE_GENERATOR = [
{
type: "DYNAMIC_ROUTE_GENERATOR",
name: "动态路由生成",
data: [
{
country_code: "us",
ingress_country_code: "ca",
},
{
country_code: "ca",
ingress_country_code: "gl",
},
{
country_code: "gl",
ingress_country_code: "by",
},
{
country_code: "dz",
ingress_country_code: "cn",
},
],
color: "#48D3D5",
isLine: true,
},
{
type: "DYNAMIC_ROUTE_GENERATOR",
name: "动态路由生成2",
data: [
{
country_code: "br",
ingress_country_code: "ml",
},
{
country_code: "ml",
ingress_country_code: "ly",
},
{
country_code: "ly",
ingress_country_code: "cn",
},
{
country_code: "cn",
ingress_country_code: "ru",
},
],
color: "#50FE35",
isLine: true,
},
];
export const APP_DIVERSION = [
{
name: "Netflix",
color: "#DC2626",
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
},
{
name: "Spotify",
color: "#22C55E",
data: [
{
country_code: "jp",
ingress_country_code: "au",
},
{
country_code: "au",
ingress_country_code: "za",
},
{
country_code: "za",
ingress_country_code: "de",
},
{
country_code: "de",
ingress_country_code: "ca",
},
],
isLine: true,
},
{
name: "Instagram",
color: "#8B5CF6",
data: [
{
country_code: "it",
ingress_country_code: "in",
},
{
country_code: "in",
ingress_country_code: "mx",
},
{
country_code: "mx",
ingress_country_code: "se",
},
{
country_code: "se",
ingress_country_code: "sg",
},
],
isLine: true,
},
{
name: "Telegram",
color: "#2563EB",
data: [
{
country_code: "ar",
ingress_country_code: "nl",
},
{
country_code: "nl",
ingress_country_code: "kr",
},
{
country_code: "kr",
ingress_country_code: "eg",
},
{
country_code: "eg",
ingress_country_code: "nz",
},
],
isLine: true,
},
{
name: "Google",
color: "#3B82F6",
data: [
{
country_code: "ch",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "hk",
},
{
country_code: "hk",
ingress_country_code: "no",
},
{
country_code: "no",
ingress_country_code: "ae",
},
],
isLine: true,
},
{
name: "Gmail",
color: "#22C55E",
data: [
{
country_code: "es",
ingress_country_code: "cn",
},
{
country_code: "cn",
ingress_country_code: "co",
},
{
country_code: "co",
ingress_country_code: "fi",
},
{
country_code: "fi",
ingress_country_code: "id",
},
],
isLine: true,
},
{
name: "Amazon",
color: "#EAB308",
data: [
{
country_code: "gb",
ingress_country_code: "th",
},
{
country_code: "th",
ingress_country_code: "cl",
},
{
country_code: "cl",
ingress_country_code: "be",
},
{
country_code: "be",
ingress_country_code: "ph",
},
],
isLine: true,
},
{
name: "Ebay",
color: "#3B82F6",
data: [
{
country_code: "pl",
ingress_country_code: "my",
},
{
country_code: "my",
ingress_country_code: "pe",
},
{
country_code: "pe",
ingress_country_code: "dk",
},
{
country_code: "dk",
ingress_country_code: "ng",
},
],
isLine: true,
},
{
name: "AppleNews",
color: "#EF4444",
data: [
{
country_code: "ie",
ingress_country_code: "vn",
},
{
country_code: "vn",
ingress_country_code: "ma",
},
{
country_code: "ma",
ingress_country_code: "at",
},
{
country_code: "at",
ingress_country_code: "tw",
},
],
isLine: true,
},
{
name: "CNN",
color: "#EF4444",
data: [
{
country_code: "ua",
ingress_country_code: "sa",
},
{
country_code: "sa",
ingress_country_code: "gr",
},
{
country_code: "gr",
ingress_country_code: "pk",
},
{
country_code: "pk",
ingress_country_code: "pt",
},
],
isLine: true,
},
{
name: "Browser",
color: "#8B5CF6",
data: [
{
country_code: "il",
ingress_country_code: "ro",
},
{
country_code: "ro",
ingress_country_code: "nz",
},
{
country_code: "nz",
ingress_country_code: "tr",
},
{
country_code: "tr",
ingress_country_code: "ca",
},
],
isLine: true,
},
{
name: "YouTube",
color: "#EF4444",
data: [
{
country_code: "cz",
ingress_country_code: "sg",
},
{
country_code: "sg",
ingress_country_code: "ar",
},
{
country_code: "ar",
ingress_country_code: "hu",
},
{
country_code: "hu",
ingress_country_code: "jp",
},
],
isLine: true,
},
{
name: "Facebook",
color: "#3B82F6",
data: [
{
country_code: "is",
ingress_country_code: "za",
},
{
country_code: "za",
ingress_country_code: "mx",
},
{
country_code: "mx",
ingress_country_code: "it",
},
{
country_code: "it",
ingress_country_code: "kr",
},
],
isLine: true,
},
];
export const PASS_AUTHENTICATION = {
type: "PASS_AUTHENTICATION",
name: "通行认证",
authenticationPoint: [
[-103.346771, 54.130366],
[-120.346771, 52.130366],
[-108.346771, 48.130366],
[-98.346771, 46.130366],
[-106.346771, 48.450366],
[-101.346771, 53.130366],
[-123.346771, 58.130366],
[-111.346771, 65.443366],
[-108.346771, 54.130366],
[-116.346771, 59.130366],
[-97.346771, 61.130366],
[-95.346771, 63.130366],
[-113.346771, 58.840366],
[-99.346771, 59.130366],
[-102.346771, 68.130366],
],
data: [
{
country_code: "gl",
ingress_country_code: "dz",
},
{
country_code: "br",
ingress_country_code: "dz",
},
{
country_code: "dz",
ingress_country_code: "ru",
},
{
country_code: "dz",
ingress_country_code: "cn",
},
{
country_code: "ru",
ingress_country_code: "za",
},
],
isLine: true,
};

View File

@ -131,6 +131,11 @@
width: 312.221px; width: 312.221px;
} }
.line-img-left{
width: 216.86px;
margin-top: 30px;
}
.fill { .fill {
width: 9.165px; width: 9.165px;
height: 9.165px; height: 9.165px;
@ -141,6 +146,17 @@
top: 77.5px; top: 77.5px;
z-index: 99; z-index: 99;
} }
.fill-left {
width: 9.165px;
height: 9.165px;
border-radius: 50%;
background-color: #18E4FF;
position: absolute;
right:210.5px;
top: 82.5px;
z-index: 99;
}
} }

View File

@ -30,501 +30,270 @@ import FacebookSvg from "@/assets/svg/anti-forensics-forwarding/Facebook.svg?rea
import FacebookActiveSvg from "@/assets/svg/anti-forensics-forwarding/FacebookActive.svg?react"; import FacebookActiveSvg from "@/assets/svg/anti-forensics-forwarding/FacebookActive.svg?react";
import { RootState } from "@/store"; import { RootState } from "@/store";
import {
TRAFFIC_OBFUSCATION,
NESTED_ENCRYPTION,
DYNAMIC_ROUTE_GENERATOR,
APP_DIVERSION,
PASS_AUTHENTICATION,
} from "./data/mockData";
import "./index.scss"; import "./index.scss";
import { color } from "echarts"; import { App } from "antd";
export const DIALOGTYPE = { export const DIALOGTYPE = {
ADDNode: { ADDNode: {
title: "添加节点", title: "添加节点",
desc: "", desc: "",
successText: "添加", successText: "添加",
}, },
AddNetwork: { AddNetwork: {
title: "构建网络", title: "构建网络",
desc: "", desc: "",
successText: "构建", successText: "构建",
}, },
}; };
export const NODEDIALOGTYPE = { export const NODEDIALOGTYPE = {
ClearFailNode: { ClearFailNode: {
title: "清除掉线节点", title: "清除掉线节点",
desc: "", desc: "",
successText: "清除", successText: "清除",
}, },
ClearWargingNode: { ClearWargingNode: {
title: "恶意节点", title: "恶意节点",
desc: "", desc: "",
successText: "清除", successText: "清除",
}, },
}; };
export const Apps = [ export const Apps = [
{ {
name: "Netflix", name: "Netflix",
icon: NetflixSvg, icon: NetflixSvg,
activeIcon: NetflixActiveSvg, activeIcon: NetflixActiveSvg,
color: "#DC2626", },
jumpList: { {
data: [ name: "Spotify",
{ icon: SpotifySvg,
country_code: "mg", activeIcon: SpotifyActiveSvg,
ingress_country_code: "ru", },
}, {
{ name: "Instagram",
country_code: "ru", icon: InstagramSvg,
ingress_country_code: "fr", activeIcon: InstagramActiveSvg,
}, },
{ {
country_code: "fr", name: "Telegram",
ingress_country_code: "br", icon: TelegramSvg,
}, activeIcon: TelegramActiveSvg,
{ },
country_code: "br", {
ingress_country_code: "us", name: "Google",
}, icon: GoogleSvg,
], activeIcon: GoogleActiveSvg,
isLine: true, },
name: "Netflix", {
}, name: "Gmail",
}, icon: GmailSvg,
{ activeIcon: GmailActiveSvg,
name: "Spotify", },
icon: SpotifySvg, {
activeIcon: SpotifyActiveSvg, name: "Amazon",
color: "#22C55E", icon: AmazonSvg,
jumpList: { activeIcon: AmazonActiveSvg,
data: [ },
{ {
country_code: "mg", name: "Ebay",
ingress_country_code: "ru", icon: EbaySvg,
}, activeIcon: EbayActiveSvg,
{ },
country_code: "ru", {
ingress_country_code: "fr", name: "AppleNews",
}, icon: AppleNewsSvg,
{ activeIcon: AppleNewsActiveSvg,
country_code: "fr", },
ingress_country_code: "br", {
}, name: "CNN",
{ icon: CNNSvg,
country_code: "br", activeIcon: CNNActiveSvg,
ingress_country_code: "us", },
}, {
], name: "Browser",
isLine: true, icon: BrowserSvg,
name: "Spotify", activeIcon: BrowserActiveSvg,
}, },
}, {
{ name: "YouTube",
name: "Instagram", icon: YouTubeSvg,
icon: InstagramSvg, activeIcon: YouTubeActiveSvg,
activeIcon: InstagramActiveSvg, },
color: "#8B5CF6", {
jumpList: { name: "Facebook",
data: [ icon: FacebookSvg,
{ activeIcon: FacebookActiveSvg,
country_code: "mg", },
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "Instagram",
},
},
{
name: "Telegram",
icon: TelegramSvg,
activeIcon: TelegramActiveSvg,
color: "#2563EB",
jumpList: {
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "Telegram",
},
},
{
name: "Google",
icon: GoogleSvg,
activeIcon: GoogleActiveSvg,
color: "#3B82F6",
jumpList: {
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "Google",
},
},
{
name: "Gmail",
icon: GmailSvg,
activeIcon: GmailActiveSvg,
color: "#22C55E",
jumpList: {
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "Gmail",
},
},
{
name: "Amazon",
icon: AmazonSvg,
activeIcon: AmazonActiveSvg,
color: "#EAB308",
jumpList: {
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "Amazon",
},
},
{
name: "Ebay",
icon: EbaySvg,
activeIcon: EbayActiveSvg,
color: "#3B82F6",
jumpList: {
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "Ebay",
},
},
{
name: "AppleNews",
icon: AppleNewsSvg,
activeIcon: AppleNewsActiveSvg,
color: "#EF4444",
jumpList: {
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "AppleNews",
},
},
{
name: "CNN",
icon: CNNSvg,
activeIcon: CNNActiveSvg,
color: "#EF4444",
jumpList: {
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "CNN",
},
},
{
name: "Browser",
icon: BrowserSvg,
activeIcon: BrowserActiveSvg,
color: "#8B5CF6",
jumpList: {
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "Browser",
},
},
{
name: "YouTube",
icon: YouTubeSvg,
activeIcon: YouTubeActiveSvg,
color: "#EF4444",
jumpList: {
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "YouTube",
},
},
{
name: "Facebook",
icon: FacebookSvg,
activeIcon: FacebookActiveSvg,
color: "#3B82F6",
jumpList: {
data: [
{
country_code: "mg",
ingress_country_code: "ru",
},
{
country_code: "ru",
ingress_country_code: "fr",
},
{
country_code: "fr",
ingress_country_code: "br",
},
{
country_code: "br",
ingress_country_code: "us",
},
],
isLine: true,
name: "Facebook",
},
},
]; ];
export const CONST_TOOLTIP_TYPE = { export const CONST_TOOLTIP_TYPE = {
NESTED_ENCRYPTION: { NESTED_ENCRYPTION: {
type: "NESTED_ENCRYPTION", type: "NESTED_ENCRYPTION",
title: "嵌套加密", title: "嵌套加密",
}, },
TRAFFIC_OBFUSCATION: { TRAFFIC_OBFUSCATION: {
type: "TRAFFIC_OBFUSCATION", type: "TRAFFIC_OBFUSCATION",
title: "流量混淆", title: "流量混淆",
}, },
DYNAMIC_ROUTE_GENERATOR: {
type: "DYNAMIC_ROUTE_GENERATOR",
title: "动态路由生成",
},
// 应用分流
APP_DIVERSION: {
type: "APP_DIVERSION",
title: "应用分流",
},
// 通行认证
PASS_AUTHENTICATION: {
type: "PASS_AUTHENTICATION",
title: "通行认证",
},
}; };
const DecentralizedElasticNetwork = () => { const DecentralizedElasticNetwork = () => {
const { proxy_info, path_list } = useSelector( const { proxy_info, path_list, newHomeProxies } = useSelector(
(state: RootState) => state.web3Reducer (state: RootState) => state.web3Reducer
); );
const [tooltipType, setTooltipType] = useState( const [tooltipType, setTooltipType] = useState(
CONST_TOOLTIP_TYPE.NESTED_ENCRYPTION.type CONST_TOOLTIP_TYPE.PASS_AUTHENTICATION.type
); );
const [tooltipClosed, setTooltipClosed] = useState(false); const [tooltipClosed, setTooltipClosed] = useState(false);
const [selectedApp, setSelectedApp] = useState<any>(null); const [selectedApp, setSelectedApp] = useState<any>(null);
const appDiversion = useMemo(() => {
return Apps.map((item) => {
const findApp = APP_DIVERSION.find(
(appItem) => item.name === appItem.name
);
return {
...item,
...findApp,
};
});
}, []);
const currentValue = useMemo(() => {
let value = null;
switch (tooltipType) {
case CONST_TOOLTIP_TYPE.NESTED_ENCRYPTION.type:
value = [NESTED_ENCRYPTION];
break;
case CONST_TOOLTIP_TYPE.TRAFFIC_OBFUSCATION.type:
value = [TRAFFIC_OBFUSCATION];
break;
case CONST_TOOLTIP_TYPE.DYNAMIC_ROUTE_GENERATOR.type:
value = DYNAMIC_ROUTE_GENERATOR
break;
case CONST_TOOLTIP_TYPE.APP_DIVERSION.type:
value = selectedApp ? [selectedApp] : []
break;
case CONST_TOOLTIP_TYPE.PASS_AUTHENTICATION.type:
value = [PASS_AUTHENTICATION]
break;
default:
break;
}
return value;
}, [tooltipType,selectedApp]);
const handleClickApp = (item: any) => { const handleClickApp = (item: any) => {
console.log("item", item); console.log("item", item);
setSelectedApp(item); setSelectedApp(item);
}; };
const screenData = useMemo(() => {
return {
path_list,
proxy_info,
};
}, [path_list, proxy_info]);
return ( useEffect(()=>{
<div className="decentralized w-full h-full flex flex-col relative"> ()=>{
<div className="flex items-center gap-[60px] absolute top-12 left-12 z-10"> setTooltipClosed(false);
{Apps.map((item) => { }
return ( },[])
<div
key={item.name} return (
className="flex items-center justify-center w-16 h-16 relative rounded-[4.95px] shadow-[0px_0px_3.299999952316284px_0px_rgba(84,87,255,1.00)] outline outline-[0.50px] outline-offset-[-0.50px] outline-indigo-50/60 overflow-hidden" <div className="decentralized w-full h-full flex flex-col relative">
onClick={() => handleClickApp(item)} <div className="flex items-center gap-[60px] absolute top-12 left-12 z-10">
> {tooltipType === CONST_TOOLTIP_TYPE.APP_DIVERSION.type && appDiversion.map((item) => {
{selectedApp?.name === item?.name ? ( return (
<item.activeIcon /> <div
) : ( key={item.name}
<item.icon /> className="flex items-center justify-center w-16 h-16 relative rounded-[4.95px] shadow-[0px_0px_3.299999952316284px_0px_rgba(84,87,255,1.00)] outline outline-[0.50px] outline-offset-[-0.50px] outline-indigo-50/60 overflow-hidden"
)} onClick={() => handleClickApp(item)}
</div> >
); {selectedApp?.name === item?.name ? (
})} <item.activeIcon />
</div> ) : (
<div className="mt-2 w-full h-full flex-1"> <item.icon />
<WorldGeo )}
screenData={screenData}
selectedApp={selectedApp}
tooltipType={tooltipType}
tooltipClosed={tooltipClosed}
setTooltipClosed={setTooltipClosed}
/>
</div>
<div className="absolute bottom-6 left-[50%] translate-x-[-50%] w-[calc(100%-51px)] p-6 bg-indigo-950 bg-opacity-10 rounded-md outline outline-1 outline-zinc-200 outline-opacity-40 backdrop-blur-lg inline-flex justify-start items-center gap-4">
<div className="bt1 cursor-pointer" onClick={() => {}}>
</div>
<div
className="bt1 cursor-pointer"
onClick={() => {
setTooltipType(
CONST_TOOLTIP_TYPE.NESTED_ENCRYPTION.type
);
setTooltipClosed(true);
}}
>
</div>
<div className="bt1 cursor-pointer" onClick={() => {}}>
</div>
<div
className="bt1 cursor-pointer"
onClick={() => {
setTooltipType(
CONST_TOOLTIP_TYPE.TRAFFIC_OBFUSCATION.type
);
setTooltipClosed(true);
}}
>
</div>
<div className="bt1 cursor-pointer" onClick={() => {}}>
</div>
</div> </div>
);
})}
</div>
<div className="mt-2 w-full h-full flex-1">
<WorldGeo
currentValue={currentValue}
newHomeProxies={newHomeProxies}
selectedApp={selectedApp}
tooltipType={tooltipType}
tooltipClosed={tooltipClosed}
setTooltipClosed={setTooltipClosed}
/>
</div>
<div className="absolute bottom-6 left-[50%] translate-x-[-50%] w-[calc(100%-51px)] p-6 bg-indigo-950 bg-opacity-10 rounded-md outline outline-1 outline-zinc-200 outline-opacity-40 backdrop-blur-lg inline-flex justify-start items-center gap-4">
<div
className="bt1 cursor-pointer"
onClick={() => {
setTooltipType(CONST_TOOLTIP_TYPE.PASS_AUTHENTICATION.type);
}}
>
</div> </div>
);
<div
className="bt1 cursor-pointer"
onClick={() => {
setTooltipType(CONST_TOOLTIP_TYPE.NESTED_ENCRYPTION.type);
setTooltipClosed(true);
}}
>
</div>
<div
className="bt1 cursor-pointer"
onClick={() => {
setTooltipType(CONST_TOOLTIP_TYPE.DYNAMIC_ROUTE_GENERATOR.type);
}}
>
</div>
<div
className="bt1 cursor-pointer"
onClick={() => {
setTooltipType(CONST_TOOLTIP_TYPE.TRAFFIC_OBFUSCATION.type);
setTooltipClosed(true);
}}
>
</div>
<div
className="bt1 cursor-pointer"
onClick={() => {
setTooltipType(CONST_TOOLTIP_TYPE.APP_DIVERSION.type);
}}
>
</div>
</div>
</div>
);
}; };
export default DecentralizedElasticNetwork; export default DecentralizedElasticNetwork;

File diff suppressed because it is too large Load Diff

View File

@ -9,9 +9,7 @@ import Web3Box2Png from "@/assets/image/home/web3-box2.png";
import OpenProxyPng from "@/assets/image/home/open-proxy.png"; import OpenProxyPng from "@/assets/image/home/open-proxy.png";
import web3BoxGif from "@/assets/gif/web3-box-bg.gif"; import web3BoxGif from "@/assets/gif/web3-box-bg.gif";
import VectorSlideSvg from "@/assets/svg/home/vector-solide.svg?react"; import VectorSlideSvg from "@/assets/svg/home/vector-solide.svg?react";
import AddSvg from "@/assets/svg/home/add.svg?react";
import InterSvg from "@/assets/svg/home/inter.svg?react";
import TrashSvg from "@/assets/svg/home/trash.svg?react";
import { Apps, CONST_TOOLTIP_TYPE } from "@/pages/anti-forensics-forwarding"; import { Apps, CONST_TOOLTIP_TYPE } from "@/pages/anti-forensics-forwarding";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
@ -20,13 +18,13 @@ import {
setProxyInfoProxies, setProxyInfoProxies,
setProxiesList1, setProxiesList1,
setProxiesList2, setProxiesList2,
setProxiesLine,
} from "@/store/web3Slice"; } from "@/store/web3Slice";
import type { AppDispatch, RootState } from "@/store"; import type { AppDispatch, RootState } from "@/store";
import "./index.scss"; import "./index.scss";
import { DialogConfig, FormAlertDialog } from "./components/FormAlertDialog"; import { DialogConfig, FormAlertDialog } from "./components/FormAlertDialog";
import { ClearNodeDialog } from "./components/ClearNodeDialog"; import { ClearNodeDialog } from "./components/ClearNodeDialog";
import { blockChainApi } from "@/api/block"; import { blockChainApi } from "@/api/block";
import { APP_DIVERSION } from "../anti-forensics-forwarding/data/mockData";
export const DIALOGTYPE = { export const DIALOGTYPE = {
ADDNode: { ADDNode: {
@ -71,12 +69,24 @@ const NewHome = () => {
const [blockChain, setBlockChain] = useState<any>(null); const [blockChain, setBlockChain] = useState<any>(null);
const [tooltipClosed, setTooltipClosed] = useState(false); const [tooltipClosed, setTooltipClosed] = useState(true);
const [tooltipType, setTooltipType] = useState( const [tooltipType, setTooltipType] = useState(
CONST_TOOLTIP_TYPE.NESTED_ENCRYPTION.type CONST_TOOLTIP_TYPE.NESTED_ENCRYPTION.type
); );
const appDiversion = useMemo(() => {
return Apps.map((item) => {
const findApp = APP_DIVERSION.find(
(appItem) => item.name === appItem.name
);
return {
...item,
...findApp,
};
});
}, []);
const newWeb3List = useMemo(() => { const newWeb3List = useMemo(() => {
// 展示最新的6个节点 // 展示最新的6个节点
return web3List.slice(-6); return web3List.slice(-6);
@ -102,7 +112,6 @@ const NewHome = () => {
}; };
const handleClickApp = (item: any) => { const handleClickApp = (item: any) => {
console.log("item", item);
setSelectedApp(item); setSelectedApp(item);
}; };
@ -178,12 +187,14 @@ const NewHome = () => {
console.log("res",res) console.log("res",res)
setBlockChain(res) setBlockChain(res)
}) })
},[]) },[])
return ( return (
<div className="decentralized w-full h-full flex flex-col relative"> <div className="decentralized w-full h-full flex flex-col relative">
<div className="box"></div> <div className="box"></div>
<div className="text-red-300">{blockChain?.block_id?.hash || "111"}</div>
<div className="w-full flex items-center justify-center relative"> <div className="w-full flex items-center justify-center relative">
{/* <img {/* <img
className="w-[1693px] h-[271px] absolute top-[160px] left-[50%] translate-x-[-50%] z-10" className="w-[1693px] h-[271px] absolute top-[160px] left-[50%] translate-x-[-50%] z-10"
@ -307,7 +318,7 @@ const NewHome = () => {
</div> </div>
<div className="absolute bottom-[10px] left-[50%] translate-x-[-50%] w-[calc(100%-51px)] p-6 inline-flex justify-start items-center gap-10"> <div className="absolute bottom-[10px] left-[50%] translate-x-[-50%] w-[calc(100%-51px)] p-6 inline-flex justify-start items-center gap-10">
<img src={OpenProxyPng} className="w-[193px] h-[90px] cursor-pointer" alt="" /> <img src={OpenProxyPng} className="w-[193px] h-[90px] cursor-pointer" alt="" />
<div {/* <div
className="bt1 cursor-pointer" className="bt1 cursor-pointer"
onClick={() => { onClick={() => {
setTooltipType( setTooltipType(
@ -328,8 +339,8 @@ const NewHome = () => {
}} }}
> >
</div> </div> */}
{Apps.map((item) => { {appDiversion.map((item) => {
return ( return (
<div <div
key={item.name} key={item.name}

View File

@ -2,280 +2,291 @@ import { createSlice } from "@reduxjs/toolkit";
import { v4 as uuid } from "uuid"; import { v4 as uuid } from "uuid";
import { data1, data2 } from "./datas"; import { data1, data2 } from "./datas";
export interface Iweb3 { export interface Iweb3 {
id?: string; id?: string;
name?: string; name?: string;
payType?: string; payType?: string;
status?: string; status?: string;
createdAt?: number; createdAt?: number;
upDatedAt?: number; upDatedAt?: number;
balance?: number | string; balance?: number | string;
address?: string; address?: string;
privateKey?: string; privateKey?: string;
publicKey?: string; publicKey?: string;
numberTransactions?: string; numberTransactions?: string;
// 交易次数 // 交易次数
transactions?: number | string; transactions?: number | string;
} }
interface Iweb3Slice { interface Iweb3Slice {
web3List: Iweb3[]; // 代表状态一 web3List: Iweb3[]; // 代表状态一
web3List2: Iweb3[]; // 代表状态二 web3List2: Iweb3[]; // 代表状态二
newHomeProxies:any[]; newHomeProxies: any[];
path_list: any; path_list: any;
proxy_info: any; proxy_info: any;
clearWarningTimer: number | null; clearWarningTimer: number | null;
clearFailTimer: number | null; clearFailTimer: number | null;
isLine: boolean; isLine: boolean;
} }
// 随机生成 0-100 之间的数字,保留一位小数或整数 // 随机生成 0-100 之间的数字,保留一位小数或整数
const randomBalance = (): string => { const randomBalance = (): string => {
const value = Math.random() * 100; const value = Math.random() * 100;
// 50% 的概率返回整数50% 的概率返回一位小数 // 50% 的概率返回整数50% 的概率返回一位小数
return Math.random() > 0.5 return Math.random() > 0.5 ? Math.floor(value).toString() : value.toFixed(1);
? Math.floor(value).toString()
: value.toFixed(1);
}; };
// 随机生成 1-60 的整数 // 随机生成 1-60 的整数
const randomUpdatedAt = (): number => { const randomUpdatedAt = (): number => {
return Math.floor(Math.random() * 60) + 1; return Math.floor(Math.random() * 60) + 1;
}; };
// 随机生成 20-100 的整数 // 随机生成 20-100 的整数
const randomTransactionCount = (): string => { const randomTransactionCount = (): string => {
return (Math.floor(Math.random() * 100) + 20).toString(); return (Math.floor(Math.random() * 100) + 20).toString();
}; };
// 随机生成20-100的整数 // 随机生成20-100的整数
const randomTransactionCount2 = (): string => { const randomTransactionCount2 = (): string => {
return (Math.floor(Math.random() * 80) + 20).toString(); return (Math.floor(Math.random() * 80) + 20).toString();
}; };
// 更新钱包数据的函数 // 更新钱包数据的函数
const updateWalletData = (wallet: Iweb3): Iweb3 => { const updateWalletData = (wallet: Iweb3): Iweb3 => {
return { return {
...wallet, ...wallet,
balance: randomBalance(), balance: randomBalance(),
upDatedAt: randomUpdatedAt(), upDatedAt: randomUpdatedAt(),
transactions: randomTransactionCount2(), transactions: randomTransactionCount2(),
numberTransactions: randomTransactionCount(), numberTransactions: randomTransactionCount(),
}; };
}; };
const initialState: Iweb3Slice = { const initialState: Iweb3Slice = {
isLine: false, isLine: false,
web3List: [], web3List: [],
web3List2: [ web3List2: [
{
id: "6",
name: "Cardano Wallet",
payType: "ADA",
status: "active",
createdAt: 1737436420,
upDatedAt: 5,
balance: "65",
address:
"addr1qxck6ztj8lrxd0j2jz8f7tznzfu9wqv9qrplrh3r9eq8g9n0n3anjy2a4x54kd2sort3qvnc7mct82krlnpnxvl7v3sxmrv3f",
privateKey:
"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi",
publicKey:
"addr1qxck6ztj8lrxd0j2jz8f7tznzfu9wqv9qrplrh3r9eq8g9n0n3anjy2a4x54kd2sort3qvnc7mct82krlnpnxvl7v3sxmrv3f",
numberTransactions: "35",
transactions: 1,
},
],
path_list: [
{
account: "admin",
account_is_admin: true,
exclusive: "none",
name: "default(10.66.66.234)-c250",
proxies: [],
proxies_code: [],
use: true,
current_ip_use: false,
},
],
proxy_info: {
exclusive: "",
name: "default(10.66.66.234)-c250",
wg: false,
change_time: 0,
change_at: 0,
proxies: [],
},
clearWarningTimer: null,
clearFailTimer: null,
newHomeProxies: [
{
authenticationPoint: [
[-103.346771, 54.130366],
[-120.346771, 52.130366],
[-108.346771, 48.130366],
[-98.346771, 46.130366],
[-106.346771, 48.450366],
[-101.346771, 53.130366],
[-123.346771, 58.130366],
[-111.346771, 65.443366],
[-108.346771, 54.130366],
[-116.346771, 59.130366],
[-97.346771, 61.130366],
[-95.346771, 63.130366],
[-113.346771, 58.840366],
[-99.346771, 59.130366],
[-102.346771, 68.130366],
],
data: [
{ {
id: "6", country_code: "gl",
ingress_country_code: "dz",
},
{
country_code: "br",
ingress_country_code: "dz",
},
{
country_code: "dz",
ingress_country_code: "ru",
},
{
country_code: "dz",
ingress_country_code: "cn",
},
{
country_code: "ru",
ingress_country_code: "za",
},
],
isLine: true,
name: "newHomeProxies",
},
],
};
export const appSlice = createSlice({
name: "web3",
initialState,
reducers: {
setProxiesList1: (state) => {
// state.proxy_info.prox
// 判断是否已经存在
const proxies = state.proxy_info.proxies.find(
(item: any) => item.name === "data1"
);
if (!proxies) {
state.proxy_info.proxies.push(data1);
}
},
setProxiesList2: (state) => {
// state.proxy_info.prox
// 判断是否已经存在
const proxies = state.proxy_info.proxies.find(
(item: any) => item.name === "data2"
);
if (!proxies) {
state.proxy_info.proxies.push(data2);
}
},
setProxiesLine: (state) => {
if (state.proxy_info.proxies.length === 0) return;
// 判断一下如果state.proxy_info.proxies.lengt === 2并且 web3List.length ===1 那么 添加一个web3
// 如果state.proxy_info.proxies.lengt === 2并且 web3List.length ===2 那么不添加web3
// 如果state.proxy_info.proxies.lengt === 1并且 web3List.length ===1 那么添加一个web3
// 如果state.proxy_info.proxies.lengt === 2并且 web3List.length ===0 那么添加两个web3
// 如果state.proxy_info.proxies.lengt === 1并且 web3List.length ===0 那么添加一个web3
// 进一步优化的代码
if (state.proxy_info.proxies.length === 0) return;
// 标记所有代理为在线 - 这个操作仍然需要
state.proxy_info.proxies = state.proxy_info.proxies.map((item: any) => {
item.isLine = true;
return item;
});
// 计算需要添加的钱包数量
const proxiesCount = state.proxy_info.proxies.length;
const currentWeb3Count = state.web3List.length;
// 检查是否需要添加钱包
if (
(proxiesCount === 2 && currentWeb3Count >= 2) ||
(proxiesCount === 1 && currentWeb3Count >= 1)
) {
// 已满足条件,不需要任何操作
return;
}
// 计算需要添加的钱包数量
let walletsToAdd = 0;
if (proxiesCount === 2) {
walletsToAdd = 2 - currentWeb3Count; // 最多添加到2个
} else if (proxiesCount === 1) {
walletsToAdd = 1 - currentWeb3Count; // 最多添加到1个
}
// 确保不会添加负数的钱包
walletsToAdd = Math.max(0, walletsToAdd);
// 只有在需要添加钱包时才创建新钱包
if (walletsToAdd > 0) {
const newWallets: Iweb3[] = [];
for (let i = 0; i < walletsToAdd; i++) {
const id = uuid();
newWallets.push({
id,
name: "Cardano Wallet", name: "Cardano Wallet",
payType: "ADA", payType: "ADA",
status: "active", status: "active",
createdAt: 1737436420, createdAt: 1737436420,
upDatedAt: 5, balance: randomBalance(),
balance: "65", upDatedAt: randomUpdatedAt(),
address: transactions: randomTransactionCount2(),
"addr1qxck6ztj8lrxd0j2jz8f7tznzfu9wqv9qrplrh3r9eq8g9n0n3anjy2a4x54kd2sort3qvnc7mct82krlnpnxvl7v3sxmrv3f", numberTransactions: randomTransactionCount(),
privateKey: });
"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", }
publicKey:
"addr1qxck6ztj8lrxd0j2jz8f7tznzfu9wqv9qrplrh3r9eq8g9n0n3anjy2a4x54kd2sort3qvnc7mct82krlnpnxvl7v3sxmrv3f",
numberTransactions: "35",
transactions: 1,
},
],
path_list: [
{
account: "admin",
account_is_admin: true,
exclusive: "none",
name: "default(10.66.66.234)-c250",
proxies: [],
proxies_code: [],
use: true,
current_ip_use: false,
},
],
proxy_info: { // 更新状态
exclusive: "", state.web3List = [...state.web3List, ...newWallets];
name: "default(10.66.66.234)-c250", console.log(state.web3List, "state.web3List");
wg: false, }
change_time: 0,
change_at: 0,
proxies: [],
}, },
clearWarningTimer: null, setIsLine: (state, action) => {
clearFailTimer: null, state.isLine = action.payload;
newHomeProxies:[
{
data: [
{
country_code: "gl",
ingress_country_code: "dz",
},
{
country_code: "br",
ingress_country_code: "dz",
},
{
country_code: "dz",
ingress_country_code: "ru",
},
{
country_code: "dz",
ingress_country_code: "cn",
},
{
country_code: "ru",
ingress_country_code: "za",
},
],
isLine: true,
name: "newHomeProxies",
}
],
};
export const appSlice = createSlice({
name: "web3",
initialState,
reducers: {
setProxiesList1: (state) => {
// state.proxy_info.prox
// 判断是否已经存在
const proxies = state.proxy_info.proxies.find(
(item: any) => item.name === "data1"
);
if (!proxies) {
state.proxy_info.proxies.push(data1);
}
},
setProxiesList2: (state) => {
// state.proxy_info.prox
// 判断是否已经存在
const proxies = state.proxy_info.proxies.find(
(item: any) => item.name === "data2"
);
if (!proxies) {
state.proxy_info.proxies.push(data2);
}
},
setProxiesLine: (state) => {
if (state.proxy_info.proxies.length === 0) return;
// 判断一下如果state.proxy_info.proxies.lengt === 2并且 web3List.length ===1 那么 添加一个web3
// 如果state.proxy_info.proxies.lengt === 2并且 web3List.length ===2 那么不添加web3
// 如果state.proxy_info.proxies.lengt === 1并且 web3List.length ===1 那么添加一个web3
// 如果state.proxy_info.proxies.lengt === 2并且 web3List.length ===0 那么添加两个web3
// 如果state.proxy_info.proxies.lengt === 1并且 web3List.length ===0 那么添加一个web3
// 进一步优化的代码
if (state.proxy_info.proxies.length === 0) return;
// 标记所有代理为在线 - 这个操作仍然需要
state.proxy_info.proxies = state.proxy_info.proxies.map(
(item: any) => {
item.isLine = true;
return item;
}
);
// 计算需要添加的钱包数量
const proxiesCount = state.proxy_info.proxies.length;
const currentWeb3Count = state.web3List.length;
// 检查是否需要添加钱包
if (
(proxiesCount === 2 && currentWeb3Count >= 2) ||
(proxiesCount === 1 && currentWeb3Count >= 1)
) {
// 已满足条件,不需要任何操作
return;
}
// 计算需要添加的钱包数量
let walletsToAdd = 0;
if (proxiesCount === 2) {
walletsToAdd = 2 - currentWeb3Count; // 最多添加到2个
} else if (proxiesCount === 1) {
walletsToAdd = 1 - currentWeb3Count; // 最多添加到1个
}
// 确保不会添加负数的钱包
walletsToAdd = Math.max(0, walletsToAdd);
// 只有在需要添加钱包时才创建新钱包
if (walletsToAdd > 0) {
const newWallets: Iweb3[] = [];
for (let i = 0; i < walletsToAdd; i++) {
const id = uuid();
newWallets.push({
id,
name: "Cardano Wallet",
payType: "ADA",
status: "active",
createdAt: 1737436420,
balance: randomBalance(),
upDatedAt: randomUpdatedAt(),
transactions: randomTransactionCount2(),
numberTransactions: randomTransactionCount(),
});
}
// 更新状态
state.web3List = [...state.web3List, ...newWallets];
console.log(state.web3List, "state.web3List");
}
},
setIsLine: (state, action) => {
state.isLine = action.payload;
},
setClearWarningTimer: (state, action) => {
state.clearWarningTimer = action.payload;
},
setClearFailTimer: (state, action) => {
state.clearFailTimer = action.payload;
},
setWeb3List: (state, action) => {
state.web3List = action.payload;
},
setWeb3List2: (state, action) => {
state.web3List2 = action.payload;
},
setProxyInfoProxies: (state, action) => {
state.proxy_info.proxies[0].data.push(action.payload);
console.log(action.payload, "action");
// state.proxy_info.proxies = action.payload;
},
randomUpdateWeb3List: (state) => {
state.web3List = state.web3List.map((wallet) =>
updateWalletData(wallet)
);
},
randomUpdateWeb3List2: (state) => {
state.web3List2 = state.web3List2.map((wallet) =>
updateWalletData(wallet)
);
},
reset: () => {
return initialState;
},
}, },
setClearWarningTimer: (state, action) => {
state.clearWarningTimer = action.payload;
},
setClearFailTimer: (state, action) => {
state.clearFailTimer = action.payload;
},
setWeb3List: (state, action) => {
state.web3List = action.payload;
},
setWeb3List2: (state, action) => {
state.web3List2 = action.payload;
},
setProxyInfoProxies: (state, action) => {
state.proxy_info.proxies[0].data.push(action.payload);
console.log(action.payload, "action");
// state.proxy_info.proxies = action.payload;
},
randomUpdateWeb3List: (state) => {
state.web3List = state.web3List.map((wallet) => updateWalletData(wallet));
},
randomUpdateWeb3List2: (state) => {
state.web3List2 = state.web3List2.map((wallet) =>
updateWalletData(wallet)
);
},
reset: () => {
return initialState;
},
},
}); });
export const { export const {
setWeb3List, setWeb3List,
setWeb3List2, setWeb3List2,
setProxyInfoProxies, setProxyInfoProxies,
randomUpdateWeb3List, randomUpdateWeb3List,
randomUpdateWeb3List2, randomUpdateWeb3List2,
setClearWarningTimer, setClearWarningTimer,
setClearFailTimer, setClearFailTimer,
reset, reset,
setIsLine, setIsLine,
setProxiesList1, setProxiesList1,
setProxiesList2, setProxiesList2,
setProxiesLine, setProxiesLine,
} = appSlice.actions; } = appSlice.actions;
export default appSlice.reducer; export default appSlice.reducer;