diff --git a/src/assets/images/myshare.png b/src/assets/images/myshare.png new file mode 100644 index 0000000..56e7c35 Binary files /dev/null and b/src/assets/images/myshare.png differ diff --git a/src/components/FileManager/FileDirectoryTree.tsx b/src/components/FileManager/FileDirectoryTree.tsx deleted file mode 100644 index 61d663d..0000000 --- a/src/components/FileManager/FileDirectoryTree.tsx +++ /dev/null @@ -1,24 +0,0 @@ -/** @format */ - -import { Tree, TreeDataNode } from "antd"; -import React from "react"; -const { DirectoryTree } = Tree; -interface FileDirectoryTreeProps { - treeData: TreeDataNode[]; -} - -const FileDirectoryTree: React.FC = (props: any) => { - return ( - - ); -}; - -export default FileDirectoryTree; diff --git a/src/components/Main/File/index.tsx b/src/components/Main/File/index.tsx index 21acd16..dc3456e 100644 --- a/src/components/Main/File/index.tsx +++ b/src/components/Main/File/index.tsx @@ -1,393 +1,393 @@ -/** @format */ -import { FunctionComponent, useEffect, useState } from "react"; -import { CheckCard, ProCard } from "@ant-design/pro-components"; -import styles from "./index.module.less"; -import { - Avatar, - Breadcrumb, - Button, - Card, - Divider, - Dropdown, - FloatButton, - message, - Select, - Tooltip, -} from "antd"; -import ali from "@/assets/icons/aliyun.svg"; -import bucket from "@/assets/icons/bucket.svg"; -import tencent from "@/assets/icons/tencent.svg"; -import { - CommentOutlined, - CustomerServiceOutlined, - EllipsisOutlined, - LeftOutlined, -} from "@ant-design/icons"; -import standard_dir from "@/assets/icons/standard_directory.svg"; -import useStore from "@/utils/store/useStore.tsx"; -import { observer } from "mobx-react"; -import FileIcon from "@/context/file-icon.ts"; -import file_icon from "@/assets/icons/files/file.svg"; -const dataList: any = [ - { - name: "demo01.java", - isDir: false, - path: "demo0.java", - length: "346", - createTime: "2024-06-26T08:22:13.244Z", - }, - { - name: "测试.pdf", - isDir: false, - path: "测试.pdf", - length: "346", - createTime: "2024-06-26T08:22:13.244Z", - }, - { - name: "test.jpg", - isDir: false, - path: "test.jpg", - length: "2057535", - createTime: "2024-06-27T02:27:05.472Z", - }, - { - name: "test1.png", - isDir: false, - path: "test1.png", - length: "1766511", - createTime: "2024-06-29T10:28:03.224Z", - }, - { - name: "schisandra", - isDir: true, - path: "schisandra/", - }, - { - name: "测试文件夹", - isDir: true, - path: "测试文件夹/", - }, -]; -const fileList: any = [ - { - name: "test1.png", - isDir: false, - path: "test1.png", - length: "1766511", - createTime: "2024-06-29T10:28:03.224Z", - }, - { - name: "schisandra", - isDir: true, - path: "schisandra/", - }, -]; - -const File: FunctionComponent = () => { - const store = useStore("file"); - const [files, setFiles] = useState([]); - async function getFile() { - setFiles(dataList); - } - function getFileExtension(filename: any): string { - const dotIndex = filename.lastIndexOf("."); - return dotIndex !== -1 ? filename.slice(dotIndex + 1) : ""; - } - - useEffect(() => { - getFile().then(); - }, []); - return ( - <> -
-
- - - -
- - { - domEvent.stopPropagation(); - message.info("menu click"); - }, - items: [ - { - label: "删除", - key: "1", - }, - { - label: "编辑", - key: "2", - }, - ], - }}> - e.stopPropagation()} - /> - - } - /> - { - domEvent.stopPropagation(); - message.info("menu click"); - }, - items: [ - { - label: "删除", - key: "1", - }, - { - label: "编辑", - key: "2", - }, - ], - }}> - e.stopPropagation()} - /> - - } - /> - -
-
-
-
- -
-
- -
- - {files.map((file: any, index: any) => { - if (file.isDir) { - return ( - -
{ - store.setFilePath({ - title: file.name, - }); - setFiles(fileList); - }}> - - - - - {file.name} - - -
- } - className={styles.file_card} - style={{ - width: 100, - height: 100, - display: "flex", - alignItems: "center", - justifyContent: "center", - }} - /> -
- - ); - } else { - return ( - -
- - - - - {file.name} - - -
- } - className={styles.file_card} - style={{ - width: 100, - height: 100, - display: "flex", - alignItems: "center", - justifyContent: "center", - }} - /> -
- - ); - } - })} - -
- - - - - }> - - } /> - - - ); -}; -export default observer(File); +/** @format */ +import { FunctionComponent, useEffect, useState } from "react"; +import { CheckCard, ProCard } from "@ant-design/pro-components"; +import styles from "./index.module.less"; +import { + Avatar, + Breadcrumb, + Button, + Card, + Divider, + Dropdown, + FloatButton, + message, + Select, + Tooltip, +} from "antd"; +import ali from "@/assets/icons/aliyun.svg"; +import bucket from "@/assets/icons/bucket.svg"; +import tencent from "@/assets/icons/tencent.svg"; +import { + CommentOutlined, + CustomerServiceOutlined, + EllipsisOutlined, + LeftOutlined, +} from "@ant-design/icons"; +import standard_dir from "@/assets/icons/standard_directory.svg"; +import useStore from "@/utils/store/useStore.tsx"; +import { observer } from "mobx-react"; +import FileIcon from "@/context/file-icon.ts"; +import file_icon from "@/assets/icons/files/file.svg"; +const dataList: any = [ + { + name: "demo01.java", + isDir: false, + path: "demo0.java", + length: "346", + createTime: "2024-06-26T08:22:13.244Z", + }, + { + name: "测试.pdf", + isDir: false, + path: "测试.pdf", + length: "346", + createTime: "2024-06-26T08:22:13.244Z", + }, + { + name: "test.jpg", + isDir: false, + path: "test.jpg", + length: "2057535", + createTime: "2024-06-27T02:27:05.472Z", + }, + { + name: "test1.png", + isDir: false, + path: "test1.png", + length: "1766511", + createTime: "2024-06-29T10:28:03.224Z", + }, + { + name: "schisandra", + isDir: true, + path: "schisandra/", + }, + { + name: "测试文件夹", + isDir: true, + path: "测试文件夹/", + }, +]; +const fileList: any = [ + { + name: "test1.png", + isDir: false, + path: "test1.png", + length: "1766511", + createTime: "2024-06-29T10:28:03.224Z", + }, + { + name: "schisandra", + isDir: true, + path: "schisandra/", + }, +]; + +const File: FunctionComponent = () => { + const store = useStore("file"); + const [files, setFiles] = useState([]); + async function getFile() { + setFiles(dataList); + } + function getFileExtension(filename: any): string { + const dotIndex = filename.lastIndexOf("."); + return dotIndex !== -1 ? filename.slice(dotIndex + 1) : ""; + } + + useEffect(() => { + getFile().then(); + }, []); + return ( + <> +
+
+ + + +
+ + { + domEvent.stopPropagation(); + message.info("menu click"); + }, + items: [ + { + label: "删除", + key: "1", + }, + { + label: "编辑", + key: "2", + }, + ], + }}> + e.stopPropagation()} + /> + + } + /> + { + domEvent.stopPropagation(); + message.info("menu click"); + }, + items: [ + { + label: "删除", + key: "1", + }, + { + label: "编辑", + key: "2", + }, + ], + }}> + e.stopPropagation()} + /> + + } + /> + +
+
+
+
+ +
+
+ +
+ + {files.map((file: any, index: any) => { + if (file.isDir) { + return ( + +
{ + store.setFilePath({ + title: file.name, + }); + setFiles(fileList); + }}> + + + + + {file.name} + + +
+ } + className={styles.file_card} + style={{ + width: 100, + height: 100, + display: "flex", + alignItems: "center", + justifyContent: "center", + }} + /> +
+ + ); + } else { + return ( + +
+ + + + + {file.name} + + +
+ } + className={styles.file_card} + style={{ + width: 100, + height: 100, + display: "flex", + alignItems: "center", + justifyContent: "center", + }} + /> +
+ + ); + } + })} + +
+ + + + + }> + + } /> + + + ); +}; +export default observer(File); diff --git a/src/components/Main/User/MyShare/index.module.less b/src/components/Main/User/MyShare/index.module.less new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Main/User/MyShare/index.tsx b/src/components/Main/User/MyShare/index.tsx new file mode 100644 index 0000000..49f0c2b --- /dev/null +++ b/src/components/Main/User/MyShare/index.tsx @@ -0,0 +1,132 @@ +/** @format */ + +import { ProCard } from "@ant-design/pro-components"; +import { Avatar, Divider, Flex, List, Skeleton, Tag } from "antd"; +import { useEffect, useState } from "react"; +import styles from "./index.module.less"; +import InfiniteScroll from "react-infinite-scroll-component"; +import { useNavigate } from "react-router-dom"; +import { CommentOutlined, EyeOutlined, HeartOutlined } from "@ant-design/icons"; +import logo from "@/assets/icons/aliyun.svg"; +interface DataType { + gender: string; + name: { + title: string; + first: string; + last: string; + }; + email: string; + picture: { + large: string; + medium: string; + thumbnail: string; + }; + nat: string; +} + +export default () => { + const navigate = useNavigate(); + const [loading, setLoading] = useState(false); + const [data, setData] = useState([]); + const loadMoreData = () => { + if (loading) { + return; + } + setLoading(true); + fetch("https://randomuser.me/api/?results=10&inc=name,gender,email,nat,picture&noinfo") + .then((res) => res.json()) + .then((body) => { + setData([...data, ...body.results]); + setLoading(false); + }) + .catch(() => { + setLoading(false); + }); + }; + + useEffect(() => { + loadMoreData(); + }, []); + return ( + <> +
+ + } + endMessage={It is all, nothing more 🤐} + scrollableTarget="scrollableDiv"> + ( + + } + title={ + <> + { + navigate("/main/share/detail/1"); + }}> + {item.name.last} + + + IDM + + + } + description={ + <> + + {item.email} + + + + landaiqing + + + + 1024 + + + + 1024 + + {" "} + + 1024 + + + + + } + /> + {/*
Content
*/} +
+ )} + /> +
+
+
+ + ); +}; diff --git a/src/router/modules/main/user/myShare/index.ts b/src/router/modules/main/user/myShare/index.ts new file mode 100644 index 0000000..0e27be2 --- /dev/null +++ b/src/router/modules/main/user/myShare/index.ts @@ -0,0 +1,11 @@ +/** @format */ + +import { lazy } from "react"; + +const MyShare = lazy( + () => + new Promise((resolve: any) => { + resolve(import("@/components/Main/User/MyShare/index.tsx")); + }), +); +export default MyShare; diff --git a/src/router/modules/main/userInfo/index.ts b/src/router/modules/main/user/userInfo/index.ts similarity index 94% rename from src/router/modules/main/userInfo/index.ts rename to src/router/modules/main/user/userInfo/index.ts index 9b2efdf..c91e5f8 100644 --- a/src/router/modules/main/userInfo/index.ts +++ b/src/router/modules/main/user/userInfo/index.ts @@ -1,11 +1,11 @@ -/** @format */ - -import { lazy } from "react"; - -const MainUserInfo = lazy( - () => - new Promise((resolve: any) => { - resolve(import("@/components/Main/User/UserInfo")); - }), -); -export default MainUserInfo; +/** @format */ + +import { lazy } from "react"; + +const MainUserInfo = lazy( + () => + new Promise((resolve: any) => { + resolve(import("@/components/Main/User/UserInfo")); + }), +); +export default MainUserInfo; diff --git a/src/router/modules/main/userSetting/index.ts b/src/router/modules/main/user/userSetting/index.ts similarity index 95% rename from src/router/modules/main/userSetting/index.ts rename to src/router/modules/main/user/userSetting/index.ts index cf376d3..ac6eb4d 100644 --- a/src/router/modules/main/userSetting/index.ts +++ b/src/router/modules/main/user/userSetting/index.ts @@ -1,11 +1,11 @@ -/** @format */ - -import { lazy } from "react"; - -const MainUserSetting = lazy( - () => - new Promise((resolve: any) => { - resolve(import("@/components/Main/User/UserSetting")); - }), -); -export default MainUserSetting; +/** @format */ + +import { lazy } from "react"; + +const MainUserSetting = lazy( + () => + new Promise((resolve: any) => { + resolve(import("@/components/Main/User/UserSetting")); + }), +); +export default MainUserSetting; diff --git a/src/router/routes.tsx b/src/router/routes.tsx index f7f9dad..eb8bb24 100644 --- a/src/router/routes.tsx +++ b/src/router/routes.tsx @@ -13,8 +13,8 @@ import Home from "@/router/modules/home"; import MainHome from "@/router/modules/main/home"; import MainBucket from "@/router/modules/main/bucket"; import MainFile from "@/router/modules/main/file"; -import MainUserInfo from "@/router/modules/main/userInfo"; -import MainUserSetting from "@/router/modules/main/userSetting"; +import MainUserInfo from "@/router/modules/main/user/userInfo"; +import MainUserSetting from "@/router/modules/main/user/userSetting"; import MainShare from "@/router/modules/main/share"; import MainSetting from "@/router/modules/main/settings"; import Ali from "@/router/modules/main/settings/ali/ali.ts"; @@ -47,6 +47,7 @@ import ucloudBucket from "@/router/modules/main/bucket/createBuckets/ucloud.ts"; import upBucket from "@/router/modules/main/bucket/createBuckets/up.ts"; import wangyiBucket from "@/router/modules/main/bucket/createBuckets/wangyi.ts"; import ShareAdd from "@/router/modules/main/share/modules/shareAdd.tsx"; +import MyShare from "@/router/modules/main/user/myShare"; const routes: RouteObject[] = [ { @@ -144,6 +145,10 @@ const routes: RouteObject[] = [ path: "/main/file", Component: MainFile, }, + { + path: "/main/file/:bucket", + Component: MainFile, + }, { path: "/main/user/info", Component: MainUserInfo, @@ -152,6 +157,10 @@ const routes: RouteObject[] = [ path: "/main/user/setting", Component: MainUserSetting, }, + { + path: "/main/user/myshare", + Component: MyShare, + }, { path: "/main/share", Component: MainShare, diff --git a/src/views/Main/settings.tsx b/src/views/Main/settings.tsx index 638b795..fb227eb 100644 --- a/src/views/Main/settings.tsx +++ b/src/views/Main/settings.tsx @@ -1,179 +1,184 @@ -/** @format */ - -// import dashboard from "@/assets/images/dashboard.png"; -// import bucket from "@/assets/images/bucket.png"; -// import file_icon from "@/assets/images/file.png"; -// import share_icon from "@/assets/images/share.png"; -// import user from "@/assets/images/user.png"; -// import user_info_icon from "@/assets/images/userInfo.png"; -// import setting from "@/assets/images/setting.png"; -// import storage_setting from "@/assets/images/storage_setting.png"; -import aliyun from "@/assets/icons/aliyun.svg"; -import tencent from "@/assets/icons/tencent.svg"; -import huawei from "@/assets/icons/huawei.svg"; -import baiduyun from "@/assets/icons/baiduyun.svg"; -import minio from "@/assets/icons/minio.svg"; -import jdyun from "@/assets/icons/jdyun.svg"; -import aws from "@/assets/icons/aws.svg"; -import wangyi from "@/assets/icons/wangyi.svg"; -import qiniu from "@/assets/icons/qiniu.svg"; -import upyun from "@/assets/icons/upyun.svg"; -import pinanyun from "@/assets/icons/pinanyun.svg"; -import qingyun from "@/assets/icons/qingyun.svg"; -import ucloud from "@/assets/icons/ucloud.svg"; -import jinshan from "@/assets/icons/jinshan.svg"; -export default { - route: { - path: "/", - routes: [ - { - index: true, - path: "main/home", - name: "仪表盘", - icon: "https://pic.imgdb.cn/item/668b9176d9c307b7e99e51b9.png", - }, - { - path: "main/setting", - name: "存储商", - icon: "https://pic.imgdb.cn/item/668b918cd9c307b7e99e7fbc.png", - }, - { - path: "main/bucket", - name: "存储桶", - icon: "https://pic.imgdb.cn/item/668b91a5d9c307b7e99ea40d.png", - }, - { - path: "main/file", - name: "文件", - icon: "https://pic.imgdb.cn/item/668b91b7d9c307b7e99eb9fb.png", - }, - { - path: "main/share", - name: "分享圈", - icon: "https://pic.imgdb.cn/item/668b91d1d9c307b7e99edb1c.png", - }, - { - path: "/", - name: "个人中心", - icon: "https://pic.imgdb.cn/item/668b91e1d9c307b7e99eed3a.png", - routes: [ - { - index: true, - path: "main/user/info", - name: "用户信息", - icon: "https://pic.imgdb.cn/item/668b91fbd9c307b7e99f0f90.png", - }, - { - path: "main/user/setting", - name: "用户设置", - icon: "https://pic.imgdb.cn/item/668b921ad9c307b7e99f35b2.png", - }, - ], - }, - ], - }, - location: { - pathname: "/main/home", - }, - appList: [ - { - icon: aliyun, - title: "阿里云OSS", - desc: "一款海量、安全、低成本、高可靠的云存储服务", - url: "https://www.aliyun.com/product/oss", - target: "_blank", - }, - { - icon: tencent, - title: "腾讯云COS", - desc: "由腾讯云推出的分布式存储服务。", - url: "https://cloud.tencent.com/product/cos", - target: "_blank", - }, - { - icon: huawei, - title: "华为云OBS", - desc: "安全稳定、性能领先、无限弹性扩展的存储能力", - url: "https://www.huaweicloud.com/intl/zh-cn/product/obs.html", - target: "_blank", - }, - { - icon: baiduyun, - title: "百度云BOS", - desc: "一款稳定、安全、高效、高可拓展的云存储服务", - url: "https://cloud.baidu.com/product/bos.html", - target: "_blank", - }, - - { - icon: minio, - title: "MinIO", - desc: "MinIO 是一款高性能、兼容 S3 的对象存储。", - url: "https://min.io/", - target: "_blank", - }, - { - icon: jdyun, - title: "京东云OSS", - desc: "京东云自研的存储海量数据的分布式存储服务", - url: "https://www.jdcloud.com/cn/products/object-storage-service", - target: "_blank", - }, - { - icon: aws, - title: "亚马逊S3 ", - desc: "专为任意位置检索任意数量数据的对象存储", - url: "https://aws.amazon.com/cn/s3/?nc2=h_ql_prod_st_s3", - target: "_blank", - }, - { - icon: wangyi, - title: "网易数帆NOS", - desc: "高可用、高可靠、高性能的云端存储服务", - url: "https://sf.163.com/product/nos", - target: "_blank", - }, - { - icon: qiniu, - title: "七牛云 Kodo", - desc: "非结构化数据存储管理平台,支持中心和边缘存储", - url: "https://www.qiniu.com/products/kodo", - target: "_blank", - }, - { - icon: upyun, - title: "又拍云 USS", - desc: "面向非结构化数据的对象存储服务", - url: "https://www.upyun.com/products/file-storage", - target: "_blank", - }, - { - icon: pinanyun, - title: "平安云OBS", - desc: "基于大规模分布式高并发存储框架的云存储服务", - url: "https://yun.pingan.com/ssr/products/OBS", - target: "_blank", - }, - { - icon: qingyun, - title: "青云", - desc: "安全可靠、低成本的云端存储服务", - url: "https://www.qingcloud.com/products/objectstorage/", - target: "_blank", - }, - { - icon: ucloud, - title: "优刻得US3", - desc: "为互联网应用提供非结构化文件云存储的服务", - url: "https://www.ucloud.cn/site/product/ufile.html", - target: "_blank", - }, - { - icon: jinshan, - title: "金山云OBS", - desc: "金山云分布式对象存储 KingStorage-OBS", - url: "https://www.ksyun.com/nv/product/ES10000.html", - target: "_blank", - }, - ], -}; +/** @format */ + +// import dashboard from "@/assets/images/dashboard.png"; +// import bucket from "@/assets/images/bucket.png"; +// import file_icon from "@/assets/images/file.png"; +// import share_icon from "@/assets/images/share.png"; +// import user from "@/assets/images/user.png"; +// import user_info_icon from "@/assets/images/userInfo.png"; +// import setting from "@/assets/images/setting.png"; +// import storage_setting from "@/assets/images/storage_setting.png"; +import aliyun from "@/assets/icons/aliyun.svg"; +import tencent from "@/assets/icons/tencent.svg"; +import huawei from "@/assets/icons/huawei.svg"; +import baiduyun from "@/assets/icons/baiduyun.svg"; +import minio from "@/assets/icons/minio.svg"; +import jdyun from "@/assets/icons/jdyun.svg"; +import aws from "@/assets/icons/aws.svg"; +import wangyi from "@/assets/icons/wangyi.svg"; +import qiniu from "@/assets/icons/qiniu.svg"; +import upyun from "@/assets/icons/upyun.svg"; +import pinanyun from "@/assets/icons/pinanyun.svg"; +import qingyun from "@/assets/icons/qingyun.svg"; +import ucloud from "@/assets/icons/ucloud.svg"; +import jinshan from "@/assets/icons/jinshan.svg"; +export default { + route: { + path: "/", + routes: [ + { + index: true, + path: "main/home", + name: "仪表盘", + icon: "https://pic.imgdb.cn/item/668b9176d9c307b7e99e51b9.png", + }, + { + path: "main/setting", + name: "存储商", + icon: "https://pic.imgdb.cn/item/668b918cd9c307b7e99e7fbc.png", + }, + { + path: "main/bucket", + name: "存储桶", + icon: "https://pic.imgdb.cn/item/668b91a5d9c307b7e99ea40d.png", + }, + { + path: "main/file", + name: "文件", + icon: "https://pic.imgdb.cn/item/668b91b7d9c307b7e99eb9fb.png", + }, + { + path: "main/share", + name: "分享圈", + icon: "https://pic.imgdb.cn/item/668b91d1d9c307b7e99edb1c.png", + }, + { + path: "/", + name: "个人中心", + icon: "https://pic.imgdb.cn/item/668b91e1d9c307b7e99eed3a.png", + routes: [ + { + index: true, + path: "main/user/info", + name: "用户信息", + icon: "https://pic.imgdb.cn/item/668b91fbd9c307b7e99f0f90.png", + }, + { + path: "main/user/setting", + name: "用户设置", + icon: "https://pic.imgdb.cn/item/668b921ad9c307b7e99f35b2.png", + }, + { + path: "main/user/myshare", + name: "我的分享", + icon: "https://pic.imgdb.cn/item/668f8e5fd9c307b7e9f079bf.png", + }, + ], + }, + ], + }, + location: { + pathname: "/main/home", + }, + appList: [ + { + icon: aliyun, + title: "阿里云OSS", + desc: "一款海量、安全、低成本、高可靠的云存储服务", + url: "https://www.aliyun.com/product/oss", + target: "_blank", + }, + { + icon: tencent, + title: "腾讯云COS", + desc: "由腾讯云推出的分布式存储服务。", + url: "https://cloud.tencent.com/product/cos", + target: "_blank", + }, + { + icon: huawei, + title: "华为云OBS", + desc: "安全稳定、性能领先、无限弹性扩展的存储能力", + url: "https://www.huaweicloud.com/intl/zh-cn/product/obs.html", + target: "_blank", + }, + { + icon: baiduyun, + title: "百度云BOS", + desc: "一款稳定、安全、高效、高可拓展的云存储服务", + url: "https://cloud.baidu.com/product/bos.html", + target: "_blank", + }, + + { + icon: minio, + title: "MinIO", + desc: "MinIO 是一款高性能、兼容 S3 的对象存储。", + url: "https://min.io/", + target: "_blank", + }, + { + icon: jdyun, + title: "京东云OSS", + desc: "京东云自研的存储海量数据的分布式存储服务", + url: "https://www.jdcloud.com/cn/products/object-storage-service", + target: "_blank", + }, + { + icon: aws, + title: "亚马逊S3 ", + desc: "专为任意位置检索任意数量数据的对象存储", + url: "https://aws.amazon.com/cn/s3/?nc2=h_ql_prod_st_s3", + target: "_blank", + }, + { + icon: wangyi, + title: "网易数帆NOS", + desc: "高可用、高可靠、高性能的云端存储服务", + url: "https://sf.163.com/product/nos", + target: "_blank", + }, + { + icon: qiniu, + title: "七牛云 Kodo", + desc: "非结构化数据存储管理平台,支持中心和边缘存储", + url: "https://www.qiniu.com/products/kodo", + target: "_blank", + }, + { + icon: upyun, + title: "又拍云 USS", + desc: "面向非结构化数据的对象存储服务", + url: "https://www.upyun.com/products/file-storage", + target: "_blank", + }, + { + icon: pinanyun, + title: "平安云OBS", + desc: "基于大规模分布式高并发存储框架的云存储服务", + url: "https://yun.pingan.com/ssr/products/OBS", + target: "_blank", + }, + { + icon: qingyun, + title: "青云", + desc: "安全可靠、低成本的云端存储服务", + url: "https://www.qingcloud.com/products/objectstorage/", + target: "_blank", + }, + { + icon: ucloud, + title: "优刻得US3", + desc: "为互联网应用提供非结构化文件云存储的服务", + url: "https://www.ucloud.cn/site/product/ufile.html", + target: "_blank", + }, + { + icon: jinshan, + title: "金山云OBS", + desc: "金山云分布式对象存储 KingStorage-OBS", + url: "https://www.ksyun.com/nv/product/ES10000.html", + target: "_blank", + }, + ], +};