Commit 7a941171 authored by mxm-web-develop's avatar mxm-web-develop

update about

parent 84df138d
NODE_ENV=dev
VITE_FETCH_URL = http://localhost:3000
\ No newline at end of file
VITE_FETCH_URL = http://192.168.31.12:3000/
\ No newline at end of file
......@@ -18,6 +18,7 @@
"ahooks": "^3.4.1",
"axios": "^0.27.2",
"gsap": "^3.10.4",
"lodash": "^4.17.21",
"pixi-filters": "^4.1.6",
"pixi.js": "^6.4.2",
"react": "^18.0.0",
......@@ -28,6 +29,7 @@
},
"devDependencies": {
"@tailwindcss/line-clamp": "^0.4.0",
"@types/lodash": "^4.14.182",
"@types/node": "^17.0.31",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
......
import { useCallback } from "react";
import { CheckIcon,XIcon } from '@heroicons/react/solid'
import { useCallback, useMemo } from "react";
import { CheckIcon, XIcon } from "@heroicons/react/solid";
import { IProps } from "@/common/Iprops.interface";
interface ItemType {
module:string
service:string
function:string
dev:boolean
test:boolean
export interface ItemType {
module: string;
service: string;
function: string;
dev: boolean;
test: boolean;
}
const data = [
{
module:'BAAS平台-前台功能',
service:'联盟链管理',
function:'支持在用户自卑主机上(至少4台主机)部署联盟链,支持联盟链删除',
dev:true,
test:false,
},
{
module:'BAAS平台-前台功能',
service:'联盟链管理',
function:'支持已经存在的chain33联盟链导入BAAS系统',
dev:true,
test:true,
},
{
module:'BAAS平台-前台功能',
service:'联盟链管理',
function:'支持联盟的创建,联盟成员管理,支持多个不同联盟成员之间组成联盟链',
dev:true,
test:true,
},
{
module:'BAAS平台-前台功能',
service:'联盟链管理',
function:'支持快速建链(联盟只有一家企业的特殊情况可以一键建链,省略中间的联盟操作',
dev:true,
test:true,
},
{
module:'BAAS平台-前台功能',
service:'联盟链管理',
function:'支持查看联盟链所有节点,支持联盟链节点的增加和删除能力',
dev:true,
test:true,
},
{
module:'BAAS平台-前台功能',
service:'联盟链管理',
function:'支持修改节点权限(验证节点切换成共识节点或共识节点切换成验证节点)',
dev:true,
test:true,
},
{
module:'BAAS平台-前台功能',
service:'联盟链管理',
function:'支持联盟链节点的监控(运行状态、同步状态、TPS、区块高度、CPU占用、内存占用、节点负载等信)',
dev:true,
test:true,
},
{
module:'BAAS平台-前台功能',
service:'联盟链管理',
function:'支持联盟链各种指标的告警策略以及告警通知能力',
dev:true,
test:true,
},
{
module:'BAAS平台-前台功能',
service:'平行链管理',
function:'支持在用户自备主机上(至少1台主机)部署平行链,支持平行链删除',
dev:true,
test:true
},
];
export const DetailsExceTable = () => {
const getData = useCallback((d:ItemType,index:number)=>{
const parent = data[index-1] as ItemType
const res = <tr key={index + Math.random()}>
{
Object.entries(d).map((v,i)=>{
if(!parent){
if(i===3 || i===4){
return <td key={i + Math.random()} className='border-l border-r border-b px-2'>
{v[1]?<CheckIcon className="w-5 h-5 text-green-600"/>:<XIcon className="w-5 h-5 text-red-600" />}
</td>
}
return <td key={i + Math.random()} className='border-l border-r'>{v[1]}</td>
}else{
if(i===3 || i===4){
return <td key={i + Math.random()} className='border-l border-r border-b px-2'>
{v[1]?<CheckIcon className="w-5 h-5 text-green-600"/>:<XIcon className="w-5 h-5 text-red-600" />}
</td>
}else{
const type = v[0] as keyof ItemType
if(parent[type] === d[type]){
return <td key={i + Math.random()} className='border-l border-r px-2'></td>
}else{
return <td key={i + Math.random()} className='border-l border-r border-t border-b px-2'>{d[type]}</td>
interface DetailsExceTableType extends IProps {
data: ItemType[] | any;
}
export const DetailsExceTable = (props: DetailsExceTableType) => {
const getData = useCallback(
(d: ItemType, index: number) => {
const parent = (props.data as unknown as ItemType[])[index-1]
const res = (
<tr key={index + Math.random()}>
{Object.entries(d).map((v, i) => {
if (v[0] !== "id") {
if (!parent) {
if (i === 3 || i === 4) {
return (
<td
key={i + Math.random()}
className="border-l border-r border-b px-3 py-2"
>
{v[1] ? (
<CheckIcon className="w-5 h-5 text-green-600" />
) : (
<XIcon className="w-5 h-5 text-red-600" />
)}
</td>
);
}
return (
<td key={i + Math.random()} className="border-l border-r px-3 py-2">
{v[1]}
</td>
);
} else {
if (i === 3 || i === 4) {
return (
<td
key={i + Math.random()}
className="border-l border-r border-b px-3 py-2"
>
{v[1] ? (
<CheckIcon className="w-5 h-5 text-green-600" />
) : (
<XIcon className="w-5 h-5 text-red-600" />
)}
</td>
);
} else {
const type = v[0] as keyof ItemType;
if (parent[type] === d[type]) {
return (
<td
key={i + Math.random()}
className="border-l border-r px-3 py-2"
></td>
);
} else {
return (
<td
key={i + Math.random()}
className="border-l border-r border-t border-b px-3 py-2"
>
{d[type]}
</td>
);
}
}
}
}
})
}
</tr>
return res
},[])
}
})}
</tr>
);
return res;
},
[props.data]
);
return (
<table className="table-auto w-full">
<thead className=' bg-black text-white'>
<tr className="text-left ">
<th className='w-2/12 py-3 px-2 border-r border-white rounded-tl-lg'>模块</th>
<th className='w-3/12 py-3 px-2 border-r border-white'>服务</th>
<th className='w-5/12 py-3 px-2 border-r border-white'>功能项</th>
<th className='w-1/12 py-3 px-2 border-r border-white'>企业版</th>
<th className='w-1/12 py-3 px-2 border-r border-white rounded-tr-lg'>企业版</th>
</tr>
</thead>
<tbody>
{
data.map((i,index)=>getData(i,index))
}
</tbody>
</table>
<table className="table-auto w-full border bg-white/20 backdrop-blur-lg">
<thead className=" bg-black text-white">
<tr className="text-left ">
<th className="w-2/12 py-3 px-2 border-r border-white rounded-tl-lg">
模块
</th>
<th className="w-3/12 py-3 px-2 border-r border-white">服务</th>
<th className="w-5/12 py-3 px-2 border-r border-white">功能项</th>
<th className="w-1/12 py-3 px-2 border-r border-white">企业版本</th>
<th className="w-1/12 py-3 px-2 border-r border-white rounded-tr-lg">
开发版本
</th>
</tr>
</thead>
<tbody>
{props.data &&
props.data.length &&
(props.data as unknown as ItemType[]).map((i, index) =>
getData(i, index)
)}
</tbody>
</table>
);
};
......@@ -57,12 +57,10 @@ export const DetailScrollView = (props: ScrollViewType) => {
return (
<div
className="slide-vertical h-full w-full"
>
<div className="vertical-wrapper h-full overflow-hidden relative" ref={wrapRef}>
<div className="vertical-wrapper h-full pt-40 pb-40 overflow-hidden relative" ref={wrapRef}>
{children}
</div>
</div>
);
};
......@@ -37,7 +37,7 @@ export default function StyledButton (props: StyledButtonType) {
},[colorIs])
return (
<button
className={`text-sm py-2 rounded-full px-8`}
className={`text-sm py-2 tracking-widest cursor-pointer rounded-full px-8`}
style={{
color:colorStyle.text,
backgroundColor:colorStyle.bgColor
......
import { IProps } from "@/common/Iprops.interface";
interface VerticalTextType extends IProps{
text: string;
containerStyle?: string;
itemStyle?: string;
}
export const VerticalText = (props: VerticalTextType)=>{
const {text,containerStyle,itemStyle} = props;
const textArr = text.split('')
return(
<div className={`grid-cols-1 ${containerStyle}`}>
{
textArr&&textArr.map((i,index)=>(
<div className={itemStyle} key={index}>
{i}
</div>
))
}
</div>
)
}
\ No newline at end of file
......@@ -84,4 +84,24 @@ export const baasBalls = [
}
]
export const detailsBalls=[]
\ No newline at end of file
export const detailsBalls=[
{
page: 0,
setting: [
{
size: "10%",
position: ["-50px", "75%"],
rotation: "210",
zIndex: "9999",
color: "white",
},
{
size: "20%",
align: "right",
position: ["8%", "45%"],
zIndex: "-1",
color: "blue",
},
]
}
]
\ No newline at end of file
......@@ -75,5 +75,27 @@ export const baasBg = [
]
export const detailsBg = [
{
page:0,
config:[
{
size: ["60%","45%"],
position: ["10%", "35%"],
align:'left',
zIndex: "-99",
rotation:'180',
color: "cyan",
blur:'100px'
},
{
size:[ "80%",'45%'],
align: "left",
position: ["85px", "13%"],
rotation:'-0',
zIndex: "-180",
color: "blue",
blur:'150px'
}
]
}
]
\ No newline at end of file
......@@ -2,18 +2,10 @@
import axios,{ AxiosRequestConfig,AxiosInstance,AxiosPromise } from 'axios';
export const baseURL = import.meta.env.VITE_FETCH_URL
export const axiosRequestConfiguration: AxiosRequestConfig = {
baseURL,
responseType: 'json',
headers: {
'Content-Type': 'application/json',
},
};
export const initialization = (config: AxiosRequestConfig): AxiosInstance => {
const axiosInstance = axios.create(config);
return axiosInstance;
const axiosInstance = axios.create(config)
return axiosInstance
};
// export default initialization;
\ No newline at end of file
import { AxiosRequestConfig } from "axios";
import { initialization } from "./axios";
export const baseURL = import.meta.env.VITE_FETCH_URL
export const axiosRequestConfiguration: AxiosRequestConfig = {
baseURL,
responseType: 'json',
headers: {
'Content-Type': 'application/json',
},
};
const req = initialization(axiosRequestConfiguration)
export const fetchProduct =async (productId:string) =>{
const res=await req.get(`products/${productId}`)
if(res&&res.status==200){
return res.data
}else{
throw new Error('network went wrong')
}
}
export const getJobs = async(department?: string)=>{
let res
if(department){
res = await req.get(`jobs?department=${department}`)
}else{
res = await req.get(`jobs`)
}
if(res&&res.status==200){
return res.data
}else{
throw new Error('network went wrong')
}
}
\ No newline at end of file
......@@ -3,7 +3,6 @@ import {ajax} from "rxjs/ajax"
import { map , catchError } from 'rxjs/operators'
import axios,{ AxiosRequestConfig,AxiosInstance,AxiosPromise } from 'axios';
import { axiosRequestConfiguration, initialization } from './axios';
// export const baseURL = import.meta.env.VITE_FETCH_URL
......@@ -15,6 +14,7 @@ import { axiosRequestConfiguration, initialization } from './axios';
// },
// };
const axiosInstance = (options: AxiosRequestConfig)=> initialization(Object.assign(axiosRequestConfiguration,options))(options)
// export const axiosInstance:AxiosInstance = (options?: AxiosRequestConfig)=> initialization(Object.assign(axiosRequestConfiguration,options))(options?options:{})
......@@ -10,7 +10,7 @@ interface AppContianerType extends IProps{
export const AppContianer=(props:AppContianerType)=>{
const {children,bgColor,className} = props
return(
<div className={`px-28 relative w-full ${className}`}>
<div className={` px-28 labtop:px-[16rem] relative w-full ${className}`}>
{children}
</div>
)
......
......@@ -8,16 +8,19 @@
@layer components{
.hero-title{
@apply text-[78px] labtop:text-[68px] sreen:text-[90px] tracking-wider font-bold font-galano leading-[90px]
@apply text-theme-dark text-[78px] labtop:text-[68px] screen:text-[90px] tracking-wider font-bold font-galano leading-[90px]
}
.sub-title-cn{
@apply text-[16px] labtop:text-[26px] sreen:text-[30px] tracking-wide font-mono font-bold sreen:py-3 py-1
@apply text-theme-dark text-[16px] labtop:text-[26px] screen:text-[30px] tracking-wide font-mono font-bold screen:py-3 py-1
}
.content-title-cn{
@apply text-[22px] labtop:text-[22px] sreen:text-[24px] tracking-wide font-mono font-bold py-3
@apply text-theme-dark text-[22px] labtop:text-[22px] screen:text-[24px] tracking-wide font-mono font-bold py-3
}
.content-sub-title-cn{
@apply text-theme-dark text-[14px] labtop:text-[16px] tracking-wide font-mono font-bold py-3
}
.normal-text{
@apply text-[12px] labtop:text-[14px] sreen:text-[14px] tracking-wide font-mono font-normal py-3
@apply opacity-80 text-[12px] labtop:text-[14px] screen:text-[14px] tracking-wide font-mono font-normal
}
.des-cn{
@apply font-mono font-light
......@@ -27,7 +30,7 @@
}
.featuresGrid{
@apply grid grid-cols-2 w-10/12 gap-y-[1rem] gap-x-[1rem] sreen:gap-y-[5rem] sreen:gap-x-[10rem]
@apply grid grid-cols-2 w-full labtop:w-10/12 gap-y-[1rem] gap-x-[3.5rem] screen:gap-y-[5rem] screen:gap-x-[10rem]
}
}
......
import { IProps } from "@/common/Iprops.interface"
import { Job } from "@/service/types"
interface HireScrollBoardType extends IProps {
list: Job[],
onJobIdChange: (id: string) => void
}
export const HireBoard = (props: HireScrollBoardType) => {
const handleHireClick = (jobId: string) => {
props.onJobIdChange(jobId)
}
return (
<div className=" grid grid-cols-2 gap-y-6 gap-x-6">
{
props.list.map((item, index) => {
return (
<div key={index}
onClick={() => handleHireClick(item.id!)}
className=" pl-2 pr-5 hover:bg-white/30 hover:backdrop-blur-md cursor-pointer border-2 border-transparent hover:border-yellow-100">
<div>{item.title}</div>
<div>{item.diploma}</div>
<div>{item.location}</div>
</div>
)
})
}
</div>
)
}
\ No newline at end of file
import { useAsyncState } from "@/common/hooks"
import { IProps } from "@/common/Iprops.interface"
import { getJobsById } from "@/service/api"
import { Job } from "@/service/types"
import { useEffect, useState } from "react"
interface HireDetailType extends IProps {
jobId: string
}
export const HireDetail = (props: HireDetailType) => {
/* get detail */
const [jobDetail,setJobDetail] = useAsyncState({} as Job)
useEffect(()=>{
const getDetail = async ()=>{
const detail = await getJobsById(props.jobId)
setJobDetail(detail)
}
getDetail()
},[])
const goToHire = (id: string) => {
console.log(id);
}
return (
<div>
{jobDetail &&
<div>
<div >
{jobDetail.title}
<button type="button" className=" ml-10 px-5 py-2 bg-black text-white" onClick={() => goToHire(jobDetail.id!)}>我要应聘</button>
</div>
<div>{jobDetail.diploma}</div>
<div>{jobDetail.location}</div>
<div>
<div>岗位描述</div>
<div>{jobDetail.requirments}</div>
</div>
<div>
<div>岗位要求</div>
<div>
{jobDetail.demands}
</div>
</div>
</div>
}
</div>
)
}
\ No newline at end of file
import { IProps } from "@/common/Iprops.interface"
import { AppContianer } from "@/layouts/AppContianer"
import { useEffect, useMemo, useState } from "react"
import { hireNav } from './context'
import { HireDetail } from "./HireDetail"
import { HireBoard } from "./HireBoard"
import { getJobsByDept } from "@/service/api"
import { useAsyncState } from "@/common/hooks"
import { Job } from "@/service/types"
interface JoinUsType extends IProps {
import { IProps } from "@/common/Iprops.interface";
import { AppContianer } from "@/layouts/AppContianer";
import { useEffect, useMemo, useState } from "react";
import { hireNav } from "./context";
import { differenceBy as _differenceBy } from "lodash";
import { ChevronRightIcon,ChevronLeftIcon } from "@heroicons/react/solid";
import { getJobsByDept } from "@/service/api";
import { useAsyncState } from "@/common/hooks";
import { Job } from "@/service/types";
import { getJobs } from "@/fetch/dataFetch";
import StyledButton from "@/components/StyledButton";
interface DataGridType extends IProps {
data: any[];
doSetSelecteItem: (id: string) => any;
}
interface HireNavType extends IProps {
onCurrentItemChanges: (curr: string) => void,
hireList: typeof hireNav
interface DtailContainerType extends IProps {
data: any;
doCancelSelecteItem: (id: undefined) => any;
}
const HireNav = (props: HireNavType) => {
const [currentNav, setCurrentNav] = useState<string>('技术部门')
const handleItemClick = (text: string) => {
setCurrentNav(text)
props.onCurrentItemChanges(text)
}
const DataGrid = (props: DataGridType) => {
const { data, doSetSelecteItem,className } = props;
return (
<div>
{
props.hireList.map((item, index) => {
return (
<div key={index}
onClick={() => handleItemClick(item.text)}
className={`py-5 my-5 cursor-pointer ${currentNav === item.text ? ' text-gray-800 font-semibold' : ' text-gray-500'}`} >{item.text}</div>
)
})
}
<div className={`grid grid-cols-2 labtop:grid-cols-3 gap-11 ${className}`}>
{data?.map((i, index) => (
<div
key={index}
onClick={() => doSetSelecteItem(i.id)}
className="job-item min-w-[300px] cursor-pointer flex items-center justify-between gap-x-3 border px-5 py-2"
>
<div>
<div className="content-title-cn">{i.title}</div>
<div className='normal-text'>{i.diploma}</div>
<div className='normal-text'>{i.location}</div>
</div>
<div>
<ChevronRightIcon className="w-5 h-5"></ChevronRightIcon>
</div>
</div>
))}
</div>
)
}
);
};
const DtailContainer = (props: DtailContainerType) => {
const { doCancelSelecteItem, data,className } = props;
return (
<div className={className}>
<div className={`flex hover:text-theme-blue items-center`}>
<ChevronLeftIcon className='w-5 h-5'></ChevronLeftIcon>
<div
onClick={() => doCancelSelecteItem(undefined)}
className=" cursor-pointer "
>
返回
</div>
</div>
<div className='py-3'>
<div className='flex justify-between'>
<div className='sub-title-cn'> {data.title}</div>
<StyledButton text='我要应聘' color="black"></StyledButton>
</div>
<div>{data.diploma}</div>
<div>{data.location}</div>
</div>
<div className='py-3'>
<div className='content-sub-title-cn'>岗位描述</div>
<div className="flex-col normal-text">
{data.requirments.split(";").map((i: string, index: number) => (
<div key={index}> - {i}</div>
))}
</div>
</div>
<div className='py-3'>
<div className='content-sub-title-cn'>岗位要求</div>
<div className="flex-col normal-text">
{data.demands.split(";").map((i: string, index: number) => (
<div key={index}> - {i}</div>
))}
</div>
</div>
</div>
);
};
export const JoinUs = () => {
/* handle nav switch */
const [current, setCurrent] = useState(hireNav[0].text)
const handleNavChanges = async(curr: string) => {
setCurrent(curr)
await setJobList(getJobsByDept(curr))
setJobId(undefined)
}
/* handle click to see detail */
const [jobId, setJobId] = useState<string>()
const handleHireClick = (id: string) => {
setJobId(id)
}
/* handle go back */
const goBack = () => {
setJobId(undefined)
}
/* fetch jobs */
const [jobList, setJobList] = useAsyncState([])
const [data, setData] = useState<any[]>();
const [selecteData, setSelecteData] = useState<any[]>();
const [activedDepartment, setActivedDepartment] = useState("技术部门");
const [selecteItem, setSelecteItem] = useState<string | undefined>();
useEffect(() => {
const fetchData = async () => {
const res = await getJobsByDept('技术部门');
await setJobList(res);
};
fetchData();
(async () => {
const res = await getJobs();
setData(res);
})();
}, []);
useEffect(() => {
(async () => {
const res = await getJobs(activedDepartment);
setSelecteData(res);
})();
}, [activedDepartment]);
const departments = useMemo(() => {
if (data) {
return data.reduce((list, item) => {
if (list.includes(item["department"])) {
return list;
} else {
list.push(item["department"]);
return list;
}
}, []);
} else {
return [];
}
}, [data]);
const selectedItem = useMemo(() => {
return data?.filter((i) => i.id === selecteItem)[0];
}, [selecteItem]);
return (
<AppContianer>
<div className=" pt-16 flex justify-between">
<div className="left">
<HireNav hireList={hireNav} onCurrentItemChanges={(curr) => { handleNavChanges(curr) }} />
</div>
<div className="right w-9/12">
<div className="header">
<div className=" text-6xl font-bold">Join Us</div>
<div className=" text-4xl font-bold">加入我们</div>
</div>
<>
<div className="py-12">
<div className="hero-title">Join us</div>
<div className="sub-title-cn">加入我们</div>
</div>
<div className="h-full w-full flex gap-x-16">
<div className='min-w-[100px]'>
<div className="flex-col">
<div>
{
jobId ?
<div>
<button type="button" onClick={goBack} >返回</button>
<HireDetail jobId={jobId} />
</div>
: <HireBoard list={jobList} onJobIdChange={(jobId) => { handleHireClick(jobId) }} />
}
</div>
{departments.map((i: string) => (
<div
key={i}
onClick={() => {
selecteItem ? "" : setActivedDepartment(i);
}}
className={`item cursor-pointer my-5 ${
activedDepartment !== i ? "text-gray-500" : "text-black"
}`}
>
{i}
</div>
))}
</div>
</div>
<div className="flex-col w-full">
{selecteItem ? (
<DtailContainer
className="min-h-[520px] w-7/12 labtop:w-6/12 screen:w-5/12"
doCancelSelecteItem={setSelecteItem}
data={selectedItem}
></DtailContainer>
) : (
<DataGrid
className='w-10/12 labtop:w-11/12 screen:w-5/12'
data={selecteData ? selecteData : []}
doSetSelecteItem={setSelecteItem}
></DataGrid>
)}
</div>
</div>
</AppContianer>
)
}
\ No newline at end of file
</>
);
};
......@@ -11,89 +11,6 @@ interface MemorabiliaType extends IProps {
}
interface MemoCardType extends IProps {
year: string,
month: string,
event: string
}
const memorabilias = [
{
year: '2022',
month: '07',
event: 'any'
},
{
year: '2022',
month: '06',
event: 'any'
},
{
year: '2022',
month: '05',
event: 'any'
},
{
year: '2022',
month: '04',
event: 'any'
},
{
year: '2022',
month: '03',
event: 'any'
},
{
year: '2022',
month: '02',
event: 'any'
},
{
year: '2022',
month: '01',
event: 'any'
},
{
year: '2022',
month: '04',
event: 'any'
},
{
year: '2022',
month: '04',
event: 'any'
},
{
year: '2022',
month: '04',
event: 'any'
},
{
year: '2022',
month: '07',
event: 'any'
},
{
year: '2022',
month: '06',
event: 'any'
},
{
year: '2022',
month: '05',
event: 'any'
},
]
const MemoCard = (props: MemoCardType) => {
return (
<div className=" h-60 bg-black text-white">
<div>{props.year}</div>
<div>{props.month}</div>
<div>{props.event}</div>
</div>
)
}
const initBScroll = (el: HTMLElement) => {
const res = new BScroll(el, {
......@@ -111,139 +28,10 @@ const initBScroll = (el: HTMLElement) => {
};
export const Memorabilia = () => {
//init scroll
BScroll.use(Slide)
const wrapRef = useRef<HTMLDivElement>(null);
const [scrollObj, setScrollObj] = useState<BScrollConstructor<{}>>();
const [currentPageIndex, setCurrentPageIndex] = useState(0)
useEffect(() => {
const scrollEl = initBScroll(wrapRef.current as HTMLDivElement)
setScrollObj(scrollEl)
return () => {
scrollObj?.destroy();
};
}, [wrapRef])
//handle slide will change
useEffect(() => {
const page = scrollObj?.plugins['slide'].pages.currentPage
page &&
setCurrentPageIndex((prevState: number) => {
if (prevState !== page.pageY) {
return page.pageX
}
return prevState
})
scrollObj?.on('slideWillChange', (page: any) => {
setCurrentPageIndex((prevState: number) => {
if (prevState !== page.pageX) {
return page.pageX
}
return prevState
})
})
}, [scrollObj])
//handle button to change slide
const [isMobile, setIsMobile] = useState({ matches: window.innerWidth > 640 ? true : false })
const [isTable, setIsTable] = useState({ matches: window.innerWidth > 961 ? true : false })
const [isLaptop, setIsLaptop] = useState({ matches: window.innerWidth > 1921 ? true : false })
useEffect(() => {
const queryMobile = window.matchMedia('(min-width:640px)')
queryMobile.addListener((e)=>setIsMobile({matches:e.matches}))
const queryTable = window.matchMedia('(min-width:961px)')
queryTable.addListener((e)=>setIsTable({matches:e.matches}))
const queryLaptop = window.matchMedia('(min-width:1921px)')
queryLaptop.addListener((e)=>setIsLaptop({matches:e.matches}))
return () => {
queryMobile.removeListener(setIsMobile)
queryTable.removeListener(setIsTable)
queryLaptop.removeListener(setIsLaptop)
}
},[])
const ITEMS_PER_PAGE = useMemo(() => {
if (isLaptop && isLaptop.matches) return 10
else if (isTable && isTable.matches) return 6
else if (isMobile && isMobile.matches) return 4
else return 2
}, [isLaptop,isTable,isMobile])
const ITEMS_PER_ROW = 2
const COLS_TOTAL = Math.ceil(ITEMS_PER_PAGE / ITEMS_PER_ROW)
const PAGE_TOTAL = memorabilias.length % ITEMS_PER_PAGE ? Math.floor(memorabilias.length / ITEMS_PER_PAGE) + 1 : memorabilias.length / ITEMS_PER_PAGE
const currentList = useMemo(() => {
const start = currentPageIndex * ITEMS_PER_PAGE
return memorabilias.slice(start, start + ITEMS_PER_PAGE)
}, [currentPageIndex])
const handlePageMove = (type: string) => {
if (type == 'pre') {
scrollObj!.prev()
}
else if (type == 'next') {
scrollObj!.next()
}
}
//memorabilias list
const listStyle = ((index: number) => {
const distance = 500 - 347
return {
marginTop: `${(distance / (COLS_TOTAL - 1) * index) / 16}rem`
}
})
const gridStyle = {
gridTemplateColumns: `repeat(${COLS_TOTAL}, minmax(0, 1fr))`
}
const list = (memorabilias: MemoCardType[]) => {
let arr = [] as Array<any>
for (var i = 0; i < memorabilias.length; i = i + 2) {
if (i !== memorabilias.length - 1) {
arr.push(
<div key={i} style={listStyle(i)} className="">
<MemoCard month={memorabilias[i].month} year={memorabilias[i].year} event={memorabilias[i].event} />
<div className=" mt-5">
<MemoCard month={memorabilias[i + 1].month} year={memorabilias[i + 1].year} event={memorabilias[i + 1].event} />
</div>
</div>
)
} else {
arr.push(
<div key={i} style={listStyle(i)}>
<MemoCard month={memorabilias[i].month} year={memorabilias[i].year} event={memorabilias[i].event} />
</div>
)
}
}
return (
<div className={`grid gap-x-4 mx-4`} style={gridStyle}>{arr}</div>
)
}
return (
<AppContianer>
<div className=" mt-16">
<div className=" float-right">
<div>Memorabilias</div>
<div>——大事记</div>
</div>
<div className="flex">
<button type="button" className=" h-10 px-5 ml-20 bg-gray-50" onClick={() => handlePageMove('pre')}>pre</button>
<div className="slide-banner-wrapper w-9/12 table:w-11/12 overflow-hidden" ref={wrapRef}>
<div className="slide-banner-content whitespace-nowrap w-full">
{
Array(PAGE_TOTAL).fill('').map((page, index) => {
return (
<div key={index} className=" inline-block w-full h-full">{list(currentList)}</div>
)
})
}
</div>
</div>
<button type="button" className=" h-10 px-5 bg-gray-100 " onClick={() => handlePageMove('next')}>next</button>
</div>
</div>
<div>123</div>
</AppContianer >
)
}
\ No newline at end of file
import { VerticalText } from "@/components/VerticalText"
import { AppContianer } from "@/layouts/AppContianer"
const imgList = [
{ url: 'hhh' },
{ url: 'hhh' },
{ url: 'hhh' },
{ url: 'hhh' },
{ url: 'hhh' },
{ url: 'hhh' },
'aliyun',
'azure',
'beijingBlockchainApplicationAssociation',
'caict',
'cfca',
'chinaAsean',
'chinaAssociationOfSmallEnterprises',
'chinaMobile',
'chineseElectronics',
'hanzhouAssociationOfBlockchainTechnologyAndApplication',
'hljSciences',
'huaqiaoUniversity',
'huaweiyun',
'hubeiDesign',
'jinshanyun',
'midea',
'shanghaijiaotong',
'southwestUniversity',
'stateGrid',
'TrustedBlockchainInitiatives',
'xiamenUnibersity',
'zhejiangBlockChainTechnologyApplicationAssociation',
'zhejiangDigitalEconomySociaty',
'zheshangAsset'
]
export const Partners = () => {
return (
<AppContianer>
<div className="flex mt-16 ">
<div className=" grid grid-cols-4 w-3/4">
{imgList.map((img, index) => {
return (
<img src={img.url} key={index} />
)
})}
<AppContianer className='h-full'>
<div className="flex h-full">
<div className='center w-10/12 flex items-center justify-center h-full'>
<div className='grid grid-cols-4 gap-5 -translate-y-10'>
{
imgList.map(i=> <img key={i} src={`/imgs/${i}.png`}></img>)
}
</div>
</div>
<div className="flex w-1/4 justify-end relative z-[1002]">
<div className=" mx-0 mt-4 w-16 text-5xl">合作伙伴</div>
<div className=" mx-0 mt-0 break-words w-1 px-6 text-7xl items-start">Partners</div>
<div className="right w-2/12 z-[200000] pl-[3rem]">
<div className='flex pt-16'>
<VerticalText text='合作伙伴' containerStyle="sub-title-cn py-5 px-5"/>
<VerticalText text='Partners' containerStyle="hero-title mt-6" itemStyle=" rotate-90 -my-[2.7rem]"/>
</div>
</div>
</div>
</AppContianer>
</div>
</AppContianer>
)
}
\ No newline at end of file
......@@ -8,12 +8,14 @@ import { Contact } from "./Contact";
import { Partners } from "./Partners";
import { Memorabilia } from "./Memorabilia";
import { JoinUs } from "./JoinUs";
import { baasBalls } from "@/config/ballSetting";
import { baasBg } from "@/config/bgSetting";
const Description = () => {
return (
<div className="w-full">
<div className="text-3xl mb-16 ">链上复杂美 上链不复杂</div>
<div className="paragraph max-w-[860px] min-w-[650px] tracking-wide leading-7 flex-col gap-y-4">
<div className="paragraph tracking-wide leading-7 flex-col gap-y-4">
<div>
公司成立于2008年,2013年启动区块链、智能合约的研发与创新,2014年申请区块链发明专利:钱包找回功能。已累计申请了400多项区块链技术的发明专利,2019年据德温特专利家族统计,复杂美区块链发明专利排名位于全球第三,仅次于阿里巴巴和IBM。
</div>
......@@ -84,69 +86,47 @@ export default function About(props: any) {
zIndex: "1001",
color: "blue",
},
]
],
};
return (
<ScrollView>
<div className="vertival-content ">
<PageLayout>
<BallAnime config={demo.config}>
<AppContianer>
<div className="flex py-10 mt-16">
<div className="left w-[34%] min-w-[520px] max-w-[560px]">
<img src={AboutImg} />
</div>
<div className="right px-[10%] mt-8">
<Description></Description>
</div>
<PageLayout
ballConfig={baasBalls[1].setting}
gradientConfig={baasBg[1].config}
>
<AppContianer className="h-full -translate-y-[5rem]">
<div className="flex gap-x-[12rem] w-full h-full items-center">
<div className="left w-4/12 screen:w-3/12 ">
<img src={AboutImg} />
</div>
</AppContianer>
</BallAnime>
</PageLayout>
<PageLayout>
<BallAnime config={demo.config2}>
<Memorabilia />
</BallAnime>
</PageLayout>
<PageLayout>
<BallAnime config={demo.config2}>
<AppContianer>
<div>patent</div>
</AppContianer>
</BallAnime>
<div className="right w-8/12 screen:w-9/12 mt-8">
<Description></Description>
</div>
</div>
</AppContianer>
</PageLayout>
<PageLayout>
<BallAnime config={demo.config2}>
<AppContianer>
<div>Honor</div>
</AppContianer>
</BallAnime>
<PageLayout ballConfig={baasBalls[1].setting}
gradientConfig={baasBg[1].config}>
<Memorabilia />
</PageLayout>
<PageLayout>
<BallAnime config={demo.config2}>
<AppContianer>
<JoinUs/>
</AppContianer>
</BallAnime>
<PageLayout ballConfig={baasBalls[1].setting}
gradientConfig={baasBg[1].config}>
<AppContianer>
<JoinUs />
</AppContianer>
</PageLayout>
<PageLayout>
<BallAnime config={demo.config2}>
<Contact />
</BallAnime>
<PageLayout ballConfig={baasBalls[1].setting}
gradientConfig={baasBg[1].config}>
<Contact />
</PageLayout>
<PageLayout>
<BallAnime config={demo.config2}>
<Partners />
</BallAnime>
<PageLayout ballConfig={baasBalls[1].setting}
gradientConfig={baasBg[1].config}>
<Partners />
</PageLayout>
</div>
</ScrollView>
......
......@@ -42,8 +42,8 @@ export const Advantages = (props: AdvantagesType)=>{
return(
<AppContianer>
<div className="flex gap-x-[5rem]">
<AppContianer className='h-full'>
<div className="flex h-full items-center gap-x-[10vw] -translate-y-[15vh]">
<div className="left">
<div className="sub-title-cn">
功能特点
......
import { IProps } from "@/common/Iprops.interface"
import { DetailsExceTable } from "@/components/DetailsExceTable"
import { DetailsExceTable, ItemType } from "@/components/DetailsExceTable"
import { DetailScrollView } from "@/components/DtailScrollView"
import { detailsBalls } from "@/config/ballSetting"
import { detailsBg } from "@/config/bgSetting"
import { fetchProduct } from "@/fetch/dataFetch"
import { AppContianer } from "@/layouts/AppContianer"
import { PageLayout } from "@/layouts/PageLayout"
import { playGround } from "@/rxjs"
import { useEffect } from "react"
import { useEffect, useState } from "react"
import { useParams } from 'react-router-dom'
interface DetailsType extends IProps{
......@@ -13,21 +16,27 @@ interface DetailsType extends IProps{
export const Details = (props:DetailsType)=>{
const {id} = useParams()
playGround
const [products,setProducts] = useState()
useEffect(()=>{
if(id){
(async ()=>{
const res = await fetchProduct(String(Number(id)+1))
const products = res[0].products
setProducts(products)
})()
}
},[id])
return(
<PageLayout ballConfig={[]}>
<DetailScrollView>
<AppContianer >
<div className=" overflow-y-hidden ">
<DetailsExceTable />
</div>
</AppContianer>
</DetailScrollView>
// <DetailScrollView>
<PageLayout ballConfig={detailsBalls[0].setting} gradientConfig={detailsBg[0].config} className='overflow-y-scroll'>
<AppContianer>
<div>
<div className="h-[48px]"></div>
<DetailsExceTable data={products} />
<div className="h-[260px]"></div>
</div>
</AppContianer>
</PageLayout>
// </DetailScrollView>
)
}
......@@ -41,9 +41,9 @@ export const Features = (props: FeaturesType)=>{
return(
<AppContianer>
<div className="flex">
<div className="left w-8/12 py-16">
<AppContianer className='h-full'>
<div className="flex items-center h-full">
<div className="left w-8/12 h-full py-16">
<div className="hero-title">
Functional
<div className='clip-title'>
......@@ -54,11 +54,11 @@ export const Features = (props: FeaturesType)=>{
功能特点
</div>
<div className='des-cn'>一键部署多样化区块链网络</div>
<div className='flex relative justify-end pt-[10vh]'>
<div className='flex relative justify-end pt-[5rem]'>
<FeaturesGrid></FeaturesGrid>
</div>
</div>
<div className="right py-16 w-4/12 px-[10%]">
<div className="right py-16 h-full w-4/12 px-[10%]">
<div className="flex-col justify-center ">
<div className='max-w-[320px] min-w-[280px]'>
<div className='content-title-cn'>弹性扩展</div>
......
export const HeroBaas =()=>{
return(
<div className="w-screen h-full flex-col items-center justify-center translate-y-[15vh] table:translate-y-[1vh]">
<div className="hero-baas
export const HeroBaas = () => {
return (
<div className="w-screen h-full flex-col items-center justify-center translate-y-[20vh] table:-translate-y-[2vh]
labtop:-translate-y-[3vh]">
<div
className="hero-baas
w-full
table:w-[120%] table:text-[29vw] text-[22vw] text-center table:text-left font-galano table:-translate-x-[2%] p-0 font-[500] ">Baas33</div>
<div className="text-center table:-translate-y-[10vh] flex justify-center gap-x-20 sub-title-cn">
<div>高效</div>
<div>稳定</div>
<div>低成本</div>
<div>安装便捷</div>
</div>
table:w-[120%] table:text-[29vw] text-[22vw] text-center table:text-left font-galano table:-translate-x-[2%] p-0 font-[500] "
>
Baas33
</div>
<div className="text-center table:-translate-y-[10vh] flex justify-center gap-x-20 sub-title-cn">
<div>高效</div>
<div>稳定</div>
<div>低成本</div>
<div>安装便捷</div>
</div>
</div>
)
}
\ No newline at end of file
);
};
import { IProps } from "@/common/Iprops.interface";
import { VerticalText } from "@/components/VerticalText";
import { AppContianer } from "@/layouts/AppContianer";
import { CheckIcon } from '@heroicons/react/solid'
import { useNavigate} from 'react-router-dom'
interface ServiceType extends IProps{
}
interface VerticalTextType extends IProps{
text: string;
containerStyle?: string;
itemStyle?: string;
}
const VerticalText = (props: VerticalTextType)=>{
const {text,containerStyle,itemStyle} = props;
const textArr = text.split('')
return(
<div className={`grid-cols-1 ${containerStyle}`}>
{
textArr&&textArr.map((i,index)=>(
<div className={itemStyle} key={index}>
{i}
</div>
))
}
</div>
)
}
// const VerticalText = (props: VerticalTextType)=>{
// const {text,containerStyle,itemStyle} = props;
// const textArr = text.split('')
// return(
// <div className={`grid-cols-1 ${containerStyle}`}>
// {
// textArr&&textArr.map((i,index)=>(
// <div className={itemStyle} key={index}>
// {i}
// </div>
// ))
// }
// </div>
// )
// }
const ServiceList = ()=>{
const navigate = useNavigate()
const data =[
......@@ -54,7 +51,7 @@ const ServiceList = ()=>{
})
}
return(
<div className=' px-8 grid grid-cols-3 gap-x-[3rem]'>
<div className=' px-8 grid grid-cols-3 gap-x-[3rem] -translate-y-[5vh]'>
{
data.map((i,index)=>(
<div key={index} className='relative py-8 px-10
......@@ -95,19 +92,17 @@ const ServiceList = ()=>{
export const Service = (props: ServiceType)=>{
return(
<AppContianer className='h-full'>
<div className="flex py-16 h-full">
<div className='center w-10/12 flex items-center justify-center h-full'>
<ServiceList />
</div>
<div className="right w-2/12 z-[200000] pl-[3rem]">
<div className='flex'>
<VerticalText text='服务版本' containerStyle="sub-title-cn py-5 px-5"/>
<VerticalText text='service' containerStyle="hero-title mt-6" itemStyle=" rotate-90 -my-[1.6rem]"/>
<div className="flex h-full">
<div className='center w-10/12 flex items-center justify-center h-full'>
<ServiceList />
</div>
<div className="right w-2/12 z-[200000] pl-[3rem]">
<div className='flex pt-16'>
<VerticalText text='服务版本' containerStyle="sub-title-cn py-5 px-5"/>
<VerticalText text='service' containerStyle="hero-title mt-6" itemStyle=" rotate-90 -my-[2.7rem]"/>
</div>
</div>
</div>
</div>
</AppContianer>
)
......
......@@ -24,16 +24,16 @@ export default function Baas33 () {
<div className="vertival-content">
<PageLayout ballConfig={baasBalls[0].setting}>
<>
<AppContianer>
<AppContianer className='z-[999999]'>
<div className="translate-y-[8vh]">
<div className=" text-4xl font-mono tracking-widest font-medium">复杂美区块链开放服务平台</div>
<div className="flex gap-x-5 mt-5">
<div className="flex gap-x-5 mt-5 ">
<StyledButton text='开发者实验室' color="black"></StyledButton>
<StyledButton text='开发者文档' color="black"></StyledButton>
<StyledButton text='一键搭建' color="red"></StyledButton>
</div>
</div>
</AppContianer>
</AppContianer>
<div className="w-full">
<HeroBaas></HeroBaas>
</div>
......
......@@ -78,7 +78,7 @@ export default function Chain33() {
</div>
</div>
</PageLayout>
<PageLayout className=" bg-[#084DFF]">
{/* <PageLayout className=" bg-[#084DFF]">
<AppContianer>
<div className="flex justify-between gap-x-10">
<HeroItem heroTitle="高" order={1} subtitle="高效" content="Chain33区块链中,交易在主链上共识并存储。多条平行链同时处理交易效率大大提升。"></HeroItem>
......@@ -88,7 +88,7 @@ export default function Chain33() {
<HeroItem heroTitle="高" order={5} subtitle="高效" content="Chain33区块链中,交易在主链上共识并存储。多条平行链同时处理交易效率大大提升。"></HeroItem>
</div>
</AppContianer>
</PageLayout>
</PageLayout> */}
</div>
</ScrollView>
......
......@@ -9,13 +9,14 @@ module.exports = withAnimations({
galano:['Galano','system-ui']
},
colors:{
'theme-blue':'#084DFD'
'theme-blue':'#084DFD',
"theme-dark":'#24374E'
},
screens:{
'moblie':"640px",
'table':"961px",
"labtop":"1520px",
"sreen":"2881px",
"screen":"2881px",
}
},
},
......
......@@ -723,6 +723,11 @@
resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3"
integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==
"@types/lodash@^4.14.182":
version "4.14.182"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2"
integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==
"@types/node@^17.0.31":
version "17.0.31"
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d"
......@@ -840,11 +845,7 @@ arg@^5.0.1:
asynckit@^0.4.0:
version "0.4.0"
<<<<<<< HEAD
resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
=======
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
>>>>>>> caf60b8a0235283f9c77d25e1cf48aa52731c7d2
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
autoprefixer@^10.4.7:
......@@ -861,11 +862,7 @@ autoprefixer@^10.4.7:
axios@^0.27.2:
version "0.27.2"
<<<<<<< HEAD
resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
=======
resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
>>>>>>> caf60b8a0235283f9c77d25e1cf48aa52731c7d2
integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
dependencies:
follow-redirects "^1.14.9"
......@@ -947,11 +944,7 @@ color-name@^1.1.4:
combined-stream@^1.0.8:
version "1.0.8"
<<<<<<< HEAD
resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
=======
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
>>>>>>> caf60b8a0235283f9c77d25e1cf48aa52731c7d2
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
......@@ -997,11 +990,7 @@ defined@^1.0.0:
delayed-stream@~1.0.0:
version "1.0.0"
<<<<<<< HEAD
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
=======
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
>>>>>>> caf60b8a0235283f9c77d25e1cf48aa52731c7d2
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
detective@^5.2.0:
......@@ -1206,20 +1195,12 @@ fill-range@^7.0.1:
follow-redirects@^1.14.9:
version "1.15.1"
<<<<<<< HEAD
resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
=======
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
>>>>>>> caf60b8a0235283f9c77d25e1cf48aa52731c7d2
integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
form-data@^4.0.0:
version "4.0.0"
<<<<<<< HEAD
resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
=======
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
>>>>>>> caf60b8a0235283f9c77d25e1cf48aa52731c7d2
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
......@@ -1389,20 +1370,12 @@ micromatch@^4.0.4:
mime-db@1.52.0:
version "1.52.0"
<<<<<<< HEAD
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
=======
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
>>>>>>> caf60b8a0235283f9c77d25e1cf48aa52731c7d2
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12:
version "2.1.35"
<<<<<<< HEAD
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
=======
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
>>>>>>> caf60b8a0235283f9c77d25e1cf48aa52731c7d2
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment