@@ -85,9 +85,9 @@ function News(props) {
-
专区新闻
+
热门新闻
-

+
{news.name}
diff --git a/src/factory/components/Scene/index.jsx b/src/factory/components/Scene/index.jsx
index e2a9d388..fda8d7a7 100644
--- a/src/factory/components/Scene/index.jsx
+++ b/src/factory/components/Scene/index.jsx
@@ -47,7 +47,7 @@ const Scene = ({ zoneId }) => {
return
{scene.name}
{scene.value}
-
+
查看详情
diff --git a/src/factory/index.jsx b/src/factory/index.jsx
index 8d96bcf0..acfc32d2 100644
--- a/src/factory/index.jsx
+++ b/src/factory/index.jsx
@@ -93,7 +93,7 @@ function Index(props) {
立即体验
-
+ {/*
{
bannerData.map(e => {
return
@@ -104,12 +104,33 @@ function Index(props) {
})
}
-
+
*/}
软件工厂 宣传视频
+
+
+
+
+
+ {/*
免费使用
*/}
+
@@ -118,4 +139,4 @@ function Index(props) {
)
}
-export default TPMIndexHOC(Index)
\ No newline at end of file
+export default TPMIndexHOC(Index)
diff --git a/src/factory/index.scss b/src/factory/index.scss
index acbf0c82..37455692 100644
--- a/src/factory/index.scss
+++ b/src/factory/index.scss
@@ -187,4 +187,335 @@
opacity: 1;
transform: translateY(0);
}
+}
+
+// .custom-bulge {
+// width: 300px;
+// height: 150px;
+// background: #2ecc71;
+// clip-path: path('M0,150 Q150,0 300,150 L300,150 L0,150 Z');
+// /* 起点(0,150) → 控制点(150,0) → 终点(300,150) */
+// }
+.test {
+ position: relative;
+ .custom-bulge3 {
+ animation: custom-bulge-animation1 5s linear infinite;
+ animation-delay: 4s;
+}
+
+.custom-bulge4 {
+ animation: custom-bulge-animation3 6s linear infinite;
+ animation-delay: 1.4s;
+}
+
+.custom-bulge5 {
+ animation: custom-bulge-animation4 5.5s linear infinite;
+ animation-delay: 2.8s;
+}
+
+.custom-bulge6 {
+ animation: custom-bulge-animation4 7s linear infinite;
+ animation-delay: 0.6.4s;
+}
+}
+.custom-bulge {
+ height: 150px;
+ background: linear-gradient(360deg, rgba(67, 97, 238, 0.2) 0%, rgba(114, 9, 183, 0.3) 100%);
+ clip-path: path('M0,150 C100,140 200,50 300,50 C400,50 500,140 600,150 L600,150 L0,150 Z');
+ animation: custom-bulge-animation 6s linear infinite;
+}
+
+.custom-bulge1 {
+ height: 150px;
+ background: linear-gradient(360deg, rgba(67, 97, 238, 0.2) 0%, rgba(114, 9, 183, 0.3) 100%);
+
+ clip-path: path('M0,150 C100,150 200,100 300,100 C400,100 500,150 600,150 L600,150 L0,150 Z');
+ animation: custom-bulge-animation1 7s linear infinite;
+ animation-delay: 1s;
+}
+
+.custom-bulge2 {
+ height: 50px;
+ background: linear-gradient(360deg, rgba(67, 97, 238, 0.2) 0%, rgba(114, 9, 183, 0.3) 100%);
+ clip-path: path('M0,50 C100,45 270,10 300,10 C330,10 500,45 600,50 L600,50 L0,50 Z');
+ animation: custom-bulge-animation2 4s linear infinite;
+ animation-delay: 3s;
+}
+.test2 {
+ margin-bottom: 200px;
+ transform: rotate(180deg);
+ div {
+ right: 0;
+ }
+ .custom-bulge {
+ animation: custom-bulge-animation-b 6s linear infinite;
+ animation-delay: 2s ;
+}
+
+.custom-bulge1 {
+ animation: custom-bulge-animation1-b 7s linear infinite;
+}
+
+.custom-bulge2 {
+ animation: custom-bulge-animation2-b 4s linear infinite;
+ animation-delay: 1.2s;
+}
+ .custom-bulge3 {
+ animation: custom-bulge-animation1-b 5s linear infinite;
+ animation-delay: 3s;
+ }
+
+ .custom-bulge4 {
+ animation: custom-bulge-animation3-b 6s linear infinite;
+ animation-delay: 4s;
+ }
+
+ .custom-bulge5 {
+ animation: custom-bulge-animation4-b 5.5s linear infinite;
+ animation-delay: 4s;
+ }
+
+ .custom-bulge6 {
+ animation: custom-bulge-animation4-b 7s linear infinite;
+ animation-delay: 0.4s;
+ }
+}
+.custom-bulge, .custom-bulge1, .custom-bulge2, .custom-bulge3, .custom-bulge4, .custom-bulge5, .custom-bulge6 {
+ position: absolute;
+ bottom: 0;
+ width: 600px;
+ opacity: 0;
+}
+
+.custom-bulge3, .custom-bulge4, .custom-bulge5, .custom-bulge6 {
+ width: 600px;
+ height: 150px;
+ background: linear-gradient(360deg, rgba(67, 97, 238, 0.2) 0%, rgba(114, 9, 183, 0.3) 100%);
+ clip-path: path('M0,150 C100,150 200,140 300,140 C400,140 500,150 600,150 L600,150 L0,150 Z');
+}
+
+@keyframes custom-bulge-animation {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0.2;
+ clip-path: path('M0,150 C100,140 250,20 300,30 C350,20 500,140 600,150 L600,150 L0,150 Z');
+ transform: translate(50%, 0);
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(100%, 0);
+ clip-path: path('M0,150 C100,140 250,120 300,130 C350,120 500,140 600,150 L600,150 L0,150 Z');
+ }
+}
+
+@keyframes custom-bulge-animation1 {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0.25;
+ transform: translate(50%, 0);
+ clip-path: path('M0,150 C100,140 200,50 300,50 C400,50 500,140 600,150 L600,150 L0,150 Z');
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(100%, 0);
+ }
+}
+
+
+@keyframes custom-bulge-animation2 {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0.25;
+ transform: translate(50%, 0);
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(100%, 0);
+ clip-path: path('M0,50 C100,45 270,45 300,45 C330,45 500,45 600,50 L600,50 L0,50 Z');
+ }
+}
+
+@keyframes custom-bulge-animation3 {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0.2;
+ transform: translate(50%, 0);
+ clip-path: path('M0,150 C100,120 270,50 300,60 C330,50 500,120 600,150 L600,150 L0,150 Z');
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(100%, 0);
+ clip-path: path('M0,150 C100,145 270,145 300,145 C330,145 500,145 600,150 L600,150 L0,150 Z');
+ }
+}
+
+@keyframes custom-bulge-animation4 {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0.2;
+ transform: translate(50%, 0);
+ clip-path: path('M0,150 C100,120 270,130 300,130 C330,130 500,120 600,150 L600,150 L0,150 Z');
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(100%, 0);
+ clip-path: path('M0,150 C100,145 270,145 300,145 C330,145 500,145 600,150 L600,150 L0,150 Z');
+ }
+}
+
+@keyframes custom-bulge-animation-b {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0.2;
+ clip-path: path('M0,150 C100,140 250,20 300,30 C350,20 500,140 600,150 L600,150 L0,150 Z');
+ transform: translate(-50%, 0);
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(-100%, 0);
+ clip-path: path('M0,150 C100,140 250,120 300,130 C350,120 500,140 600,150 L600,150 L0,150 Z');
+ }
+}
+
+@keyframes custom-bulge-animation1-b {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0.25;
+ transform: translate(-50%, 0);
+ clip-path: path('M0,150 C100,140 200,50 300,50 C400,50 500,140 600,150 L600,150 L0,150 Z');
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(-100%, 0);
+ }
+}
+
+
+@keyframes custom-bulge-animation2-b {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0.25;
+ transform: translate(-50%, 0);
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(-100%, 0);
+ clip-path: path('M0,50 C100,45 270,45 300,45 C330,45 500,45 600,50 L600,50 L0,50 Z');
+ }
+}
+
+@keyframes custom-bulge-animation3-b {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0.2;
+ transform: translate(-50%, 0);
+ clip-path: path('M0,150 C100,120 270,50 300,60 C330,50 500,120 600,150 L600,150 L0,150 Z');
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(-100%, 0);
+ clip-path: path('M0,150 C100,145 270,145 300,145 C330,145 500,145 600,150 L600,150 L0,150 Z');
+ }
+}
+
+@keyframes custom-bulge-animation4-b {
+ 0% {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0.2;
+ transform: translate(-50%, 0);
+ clip-path: path('M0,150 C100,120 270,130 300,130 C330,130 500,120 600,150 L600,150 L0,150 Z');
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(-100%, 0);
+ clip-path: path('M0,150 C100,145 270,145 300,145 C330,145 500,145 600,150 L600,150 L0,150 Z');
+ }
+}
+
+.shiny-button--JZkaI7wUAAp4lJdY {
+ align-items: center;
+ animation: border-glint--K_SFVkOnnAzSsAUT 4s
+linear infinite backwards;
+ animation-delay: 1s;
+ background-clip: padding-box, border-box;
+ background-color: #212635;
+ background-image: linear-gradient(to bottom right, #0b0333, #212635), linear-gradient(125deg, hsla(0, 0%, 100%, 0) 45%, hsla(0, 0%, 100%, .6) 50%, hsla(0, 0%, 100%, 0) 53%);
+ background-origin: border-box;
+ background-position: 0, -250px;
+ background-size: 100%, 200%;
+ border: 3px solid transparent;
+ border-radius: 10px;
+ box-shadow: 0 4px 16px 0 rgba(0, 0, 0, .14);
+ color: #fff;
+ display: flex;
+ font-size: 22px;
+ font-weight: 600;
+ height: 60px;
+ justify-content: center;
+ line-height: 32px;
+ overflow: hidden;
+ position: relative;
+ width: 180px;
+ z-index: 1;
+ &::after {
+ animation: glint--T_al5iHMf8JL_lRa 4s
+linear infinite backwards;
+ animation-delay: -3s;
+ background-image: linear-gradient(125deg, hsla(0, 0%, 100%, 0) 30%, hsla(0, 0%, 100%, .4) 50%, hsla(0, 0%, 100%, 0) 52%);
+ content: " ";
+ height: 200%;
+ left: -120%;
+ position: absolute;
+ top: -50%;
+ width: 200%;
+ }
+}
+
+@keyframes border-glint--K_SFVkOnnAzSsAUT {
+
+0% {
+ background-position: 0, -250px;
+}
+25% {
+ background-position: 0, -200px;
+}
+
+75% {
+ background-position: 0, 50px;
+}
+100% {
+ background-position: 0, 50px;
+}
+}
+
+@keyframes glint--T_al5iHMf8JL_lRa {
+0% {
+ left: -120%;
+}
+8% {
+ left: 50%;
+}
+100% {
+ left: 50%;
+}
}
\ No newline at end of file
diff --git a/src/factory/resource/components/ActionItem/index.jsx b/src/factory/resource/components/ActionItem/index.jsx
new file mode 100644
index 00000000..9d377782
--- /dev/null
+++ b/src/factory/resource/components/ActionItem/index.jsx
@@ -0,0 +1,43 @@
+import React from 'react';
+import './index.scss';
+
+function ActionItem(props) {
+ const childrenArray = React.Children.toArray(props.children);
+ const contentChild = childrenArray[0];
+ const buttonsChild = childrenArray[1];
+
+ // 获取 padding 值,处理各种格式
+ const getPaddingValue = (padding) => {
+ if (!padding) return '1.5px';
+
+ // 如果是数字,添加 px
+ if (!isNaN(padding) && !padding.includes('px') && !padding.includes('%') && !padding.includes('rem') && !padding.includes('em')) {
+ return `${padding}px`;
+ }
+
+ return padding;
+ };
+
+ const paddingValue = getPaddingValue(props.padding);
+
+ return (
+
+
+ {contentChild || null}
+
+
+
+ {buttonsChild || null}
+
+
+ );
+}
+
+export default ActionItem;
\ No newline at end of file
diff --git a/src/factory/resource/components/ActionItem/index.scss b/src/factory/resource/components/ActionItem/index.scss
new file mode 100644
index 00000000..d78c42f1
--- /dev/null
+++ b/src/factory/resource/components/ActionItem/index.scss
@@ -0,0 +1,70 @@
+.action-item {
+ --item-padding: 1.5px; // 默认值
+
+ width: fit-content;
+ height: fit-content;
+ overflow: hidden;
+ position: relative;
+
+ // 应用 CSS 变量到 padding
+ padding: var(--item-padding);
+
+ &:before {
+ content: "";
+ display: block;
+ left: 50%;
+ padding-bottom: 200%;
+ position: absolute;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ width: 200%;
+ z-index: 0;
+ }
+
+ &_content {
+ z-index: 1;
+ width: fit-content;
+ position: relative;
+ }
+
+ &_buttons {
+ z-index: 2;
+ position: absolute;
+ bottom: calc(-100% - var(--item-padding)); // 隐藏时完全移出
+ transition: bottom 0.3s ease-in-out;
+ width: 100%;
+ left: 0;
+ display: flex;
+ justify-content: center;
+ }
+
+ &:hover {
+ .action-item_buttons {
+ bottom: var(--item-padding); // 上浮到 padding 位置
+ }
+
+ @keyframes rotate {
+ 0% {
+ transform: translate(-50%, -50%) rotate(0deg);
+ }
+ 100% {
+ transform: translate(-50%, -50%) rotate(-1turn);
+ }
+ }
+
+ &:before {
+ animation: rotate 8s linear infinite;
+ background: conic-gradient(
+ from 180deg at 50% 50%,
+ #9a8bff 0deg,
+ #ffac8b 45deg,
+ transparent 90deg,
+ transparent 180deg,
+ #9a8bff 180deg,
+ #ffac8b 225deg,
+ transparent 270deg
+ );
+ z-index: 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/factory/resource/components/ShinyButton/index.jsx b/src/factory/resource/components/ShinyButton/index.jsx
new file mode 100644
index 00000000..e69de29b
diff --git a/src/factory/resource/components/ShinyButton/index.scss b/src/factory/resource/components/ShinyButton/index.scss
new file mode 100644
index 00000000..e69de29b
diff --git a/src/factory/resource/developmentTools/index.jsx b/src/factory/resource/developmentTools/index.jsx
new file mode 100644
index 00000000..bf967e76
--- /dev/null
+++ b/src/factory/resource/developmentTools/index.jsx
@@ -0,0 +1,190 @@
+import React, { useEffect, useState, useRef } from 'react';
+import './index.scss';
+import { getSourceList, getSourceZoneList } from '../../api'
+// import { factoryZoneId } from '../../../constants/factory'
+import KFIcon from '../../../components/KFIcon';
+import bg1 from '../../../images/factory/resource/tools-top-1.webp';
+import bg2 from '../../../images/factory/resource/tools-top-2.webp';
+import bg3 from '../../../images/factory/resource/tools-top-3.webp';
+
+import bg4 from '../../../images/factory/resource/tools-bottom-1.webp';
+import bg5 from '../../../images/factory/resource/tools-bottom-2.webp';
+
+import ActionItem from '../components/ActionItem';
+import '../../common.scss'
+
+const bgList = [bg1, bg2, bg3]
+
+const bg2List = [bg4, bg5]
+
+const factoryZoneId = 199
+
+function Index(props) {
+
+ const [topList, setTopList] = useState([]);
+ const [contentList, setContentList] = useState([]);
+ const [fullList, setFullList] = useState([]);
+ const [zoneList, setZoneList] = useState([]);
+ const [newList, setNewList] = useState([]);
+ const [selectedType, setSelectedType] = useState(null);
+
+ useEffect(() => {
+ getFullList();
+ getTypeList();
+ }, []);
+
+ const getFullList = () => {
+
+ getSourceList({ id: factoryZoneId }).then(res => {
+ setTopList(res.data.rows.slice(0, 3));
+ setNewList(res.data.rows.slice(0, 2));
+ setContentList(res.data.rows.slice(3, 9));
+ setFullList(res.data.rows.slice(9));
+ });
+ };
+
+ const getTypeList = () => {
+ getSourceZoneList(factoryZoneId).then(response => {
+ if (response && response.data) {
+ setZoneList(response.data.rows);
+ }
+ }).catch(error => { })
+ }
+
+ const getBackgroundImage = (index) => {
+ const row = Math.floor(index / 4); // 行号
+ const col = index % 4; // 列号(行内位置)
+
+ // 偶数行:背景图索引为 0,1,0,1...
+ // 奇数行:背景图索引为 1,0,1,0...
+ return row % 2 === 0
+ ? bg2List[col % 2] // 偶数行:0,1,0,1
+ : bg2List[(col + 1) % 2]; // 奇数行:1,0,1,0
+};
+
+ return (
+
+
+ {
+ topList.map((item, index) => {
+ return (
+
+

+
+
+ {item.name}
+
+
{item.domainName}
+
{item.summary}
+
+
+
+ )
+ })
+ }
+
+
+
+
工具分类
+ {
+ zoneList.map((item, index) => {
+ return (
+
setSelectedType(item.id)}>{item.name}
+ )
+ })
+ }
+
+
+
+
+
+
+
+
热门工具
+ 更强工具、更易落地、更高效率
+
+
+ {
+ contentList.map((item, index) => {
+ const createUser = item.createUser
+ return
+
+

+
+
{item.name}
+
+ {item.summary}
+
+
+
+
+
+
+
+
+
+ })
+ }
+
+
+
+
+
最新工具
+ 更强工具、更易落地、更高效率
+
+
+ {
+ newList.map((item, index) => {
+ const createUser = item.createUser
+ return
+

+
+
{item.name}
+
+ {item.summary}
+
+
+
+
+ })
+ }
+
+
+
+
+
+ {
+ fullList.map((item, index) => {
+ const createUser = item.createUser
+ return
+
+
+
})
+
+

+
{item.name}
+
+
+ {item.summary}
+
+
+ {item.downloadCount}
+
+
+
+
+ })
+ }
+
+
+ )
+}
+export default Index
+
+
+
diff --git a/src/factory/resource/developmentTools/index.scss b/src/factory/resource/developmentTools/index.scss
new file mode 100644
index 00000000..503a46b0
--- /dev/null
+++ b/src/factory/resource/developmentTools/index.scss
@@ -0,0 +1,471 @@
+.tools {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin-top: -50px;
+
+ &-top {
+ display: flex;
+ justify-content: center;
+
+ &-item {
+ width: 516px;
+ height: 230px;
+ display: flex;
+ flex-direction: column;
+ padding: 32px 28px 38px 28px;
+ margin-right: 26px;
+ overflow: hidden;
+ position: relative;
+ z-index: 1;
+ border-radius: 16px;
+ color: #091221;
+
+ .item-bg {
+ width: 518px;
+ height: 232px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: -1;
+ transition: transform 0.3s ease-in-out;
+
+ }
+
+ &:hover {
+ .item-bg {
+ transform: scale(1.1);
+ }
+ }
+
+ .item-info {
+ font-size: 15px;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ position: relative;
+
+ h5 {
+ line-height: 30px;
+ font-family: alibabareg;
+ font-size: 22px;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ color: #091221;
+ align-items: center;
+ margin-right: 150px;
+ }
+
+ .item-tag {
+ position: absolute;
+ display: inline-block;
+ right: 0;
+ padding: 0 8px;
+ background: rgba(255, 255, 255, 0.57);
+ border-radius: 4px;
+ height: 26px;
+ line-height: 26px;
+ font-family: Alibabareg;
+ font-size: 13px;
+ background: rgba(22, 76, 228, 0.07);
+ color: #164ce4;
+ }
+
+ p {
+ line-height: 24px;
+ font-family: alibabareg;
+ margin-top: 13px;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ margin-right: 150px;
+ }
+ }
+
+ button {
+ cursor: pointer;
+ margin-top: auto;
+ width: 104px;
+ height: 36px;
+ background: rgba(255, 255, 255, 0.42);
+ border: 1px solid;
+ border-color: #091221;
+ border-radius: 9px;
+ line-height: 36px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #091221;
+ font-size: 14px;
+
+ &:hover {
+ border: 1px solid;
+ border-color: #164ce4;
+ color: #164ce4;
+ }
+
+ }
+
+ &:nth-child(2) {
+ color: #ffffff;
+
+ h5 {
+ color: #ffffff;
+ }
+
+ .item-tag {
+ color: #ffffff;
+ background: rgba(255, 255, 255, 0.13);
+ }
+
+ button {
+ border: none;
+ background: #ffffff;
+
+ }
+ }
+ }
+ }
+
+ &-types {
+ margin-top: 23px;
+ width: 1600px;
+ height: 88px;
+ background: #ffffffa6;
+ border-radius: 16px;
+ padding: 32px 30px;
+ display: flex;
+ align-items: center;
+
+ div {
+ line-height: 22px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #091221;
+ font-size: 16px;
+ position: relative;
+ margin-right: 41px;
+
+ &::after {
+ top: 50%;
+ right: -20.5px;
+ transform: translate(0, -50%);
+ position: absolute;
+ content: "";
+ width: 1px;
+ height: 14px;
+ border: 1px solid;
+ border-color: rgba(9, 18, 33, 0.14);
+ }
+ }
+
+ .type-item {
+ cursor: pointer;
+ margin-right: 18px;
+ line-height: 22px;
+ font-family: alibabareg;
+ color: #091221;
+ font-size: 16px;
+ display: inline-block;
+ padding: 5px 8px;
+ }
+
+ .active {
+ background: rgba(22, 76, 228, 0.04);
+ border-radius: 6px;
+ }
+ }
+
+ .item-title {
+ line-height: 30px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #091221;
+ font-size: 22px;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ margin: 0;
+ }
+
+ .item-desc {
+ margin-top: 18px;
+ line-height: 21px;
+ font-family: alibabareg;
+ color: #091221;
+ font-size: 15px;
+ display: -webkit-box;
+ -webkit-line-clamp: 1;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ }
+
+ .two-btn {
+ width: 438px;
+ height: 83px;
+ background: linear-gradient(180deg, rgba(248, 251, 255, 0.13) 0%, rgba(248, 251, 255, 0.93) 23.71%, #f8fbff 100%);
+ border-radius: 0px 0px 16px 16px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ button {
+ width: 125px;
+ height: 36px;
+ line-height: 36px;
+ cursor: pointer;
+ border-radius: 9px;
+ line-height: 20px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #ffffff;
+ font-size: 14px;
+ text-align: center;
+ background-color: #091221;
+ }
+
+ button:nth-child(2) {
+ margin-left: 21px;
+ color: #091221;
+ background-color: #ffffff;
+ background-image: none;
+ border: 1px solid #091221;
+ }
+ }
+
+ &-content {
+ margin-top: 33px;
+ width: 1600px;
+ display: flex;
+
+ &-hot,
+ &-new {
+ height: 564px;
+ background: #ffffff;
+ border-radius: 16px;
+ padding: 40px 30px;
+
+ &-title {
+ display: flex;
+ align-items: center;
+
+ h5 {
+ line-height: 33px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #091221;
+ font-size: 24px;
+ margin-bottom: 0;
+ margin-right: 14px;
+ }
+
+ span {
+ background: linear-gradient(88.34deg, #e3efff 0.19%, #e6e2ff 99.89%);
+ border-radius: 4px;
+ display: inline-block;
+ padding: 7px 8px;
+ color: linear-gradient(89.28deg, #164ce4 2.18%, #a13dd9 95.44%);
+ font-size: 12px;
+ line-height: 12px;
+ position: relative;
+ color: transparent;
+ z-index: 1;
+
+ &::before {
+ content: attr(data-text);
+ /* 显示相同的文本 */
+ position: absolute;
+ top: 7px;
+ left: 8px;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(89.28deg, #164ce4 2.18%, #a13dd9 95.44%);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ }
+ }
+ }
+
+ &-list {
+ margin-top: 25px;
+
+ .item-img {
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ margin-right: 23px;
+ }
+
+ .item-desc {
+ -webkit-line-clamp: 2;
+ }
+ }
+ }
+
+ &-hot {
+ width: 1058px;
+ flex-shrink: 0;
+ margin-right: 26px;
+
+ &-list {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+
+ .hot-item {
+ width: 441px;
+ height: 150px;
+ border-radius: 16px;
+ display: flex;
+ padding: 28px;
+ background: #ffffff;
+
+ .item-info {
+ width: 320px;
+ }
+ }
+ }
+ }
+
+ &-new {
+ flex-grow: 1;
+
+ &-list {
+ .new-item {
+ width: 456px;
+ height: 209px;
+ display: flex;
+ padding: 31px 32px;
+ transition: background-size 0.3s ease-in-out;
+ overflow: hidden;
+ border-radius: 16px;
+
+ &:nth-child(1) {
+ background-image: url('../../../images/factory/resource/tools-new-1.webp');
+ }
+
+ &:nth-child(2) {
+ margin-top: 20px;
+ background-image: url('../../../images/factory/resource/tools-new-2.webp');
+ }
+
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ background-position: center;
+
+ &:hover {
+ background-size: 110% 110%;
+ }
+
+ .item-info {
+ width: 320px;
+ display: flex;
+ flex-direction: column;
+
+ button {
+ cursor: pointer;
+ margin-top: auto;
+ width: 84px;
+ height: 36px;
+ background: #ffffff;
+ border: 1px solid;
+ border-color: #ffffff;
+ border-radius: 9px;
+ line-height: 36px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #091221;
+ font-size: 14px;
+
+ &:hover {
+ background: #164ce4;
+ color: #ffffff;
+ border-color: #164ce4;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ &-bottom {
+ margin-top: 25px;
+ width: 1600px;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ background: #ffffff;
+ border-radius: 16px;
+ padding: 40px 30px;
+
+ .content-bottom-wrapper {
+ margin-bottom: 26px;
+ }
+
+ .content-bottom-item {
+ width: 366.25px;
+ height: 220px;
+ border: 1px solid;
+ border-color: rgba(19, 53, 91, 0.11);
+ border-radius: 16px;
+ z-index: 1;
+ position: relative;
+ padding: 35px 30px;
+ display: flex;
+ flex-direction: column;
+ // 增加个有白底的透明色,防止透出底下的流光
+ background: linear-gradient(rgba(241, 247, 255, 0.48), rgba(241, 247, 255, 0.48)), #ffffff;
+
+ .item-bg {
+ position: absolute;
+ width: 366.25px;
+ height: 220px;
+ left: 0;
+ top: 0;
+ z-index: -1;
+ }
+
+ .item-top {
+ display: flex;
+ align-items: center;
+
+ img {
+ width: 38px;
+ height: 38px;
+ border-radius: 50%;
+ margin-right: 14px;
+ }
+ }
+
+ .item-desc {
+ -webkit-line-clamp: 2;
+ margin-top: 26px;
+ }
+
+ .item-data {
+ margin-top: auto;
+
+ span {
+ line-height: 18px;
+ font-family: alibabareg;
+ color: #5d6a80;
+ font-size: 13px;
+ position: relative;
+ }
+ }
+ }
+
+ .content-bottom-btn {
+ width: 366.25px;
+ height: 94px;
+ background: linear-gradient(180deg, rgba(248, 251, 255, 0) 0%, #f3f6ff 23.71%, #f8fbff 100%);
+ border-radius: 0px 0px 16px 16px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/factory/resource/factoryVersion/index.jsx b/src/factory/resource/factoryVersion/index.jsx
new file mode 100644
index 00000000..9764e61e
--- /dev/null
+++ b/src/factory/resource/factoryVersion/index.jsx
@@ -0,0 +1,59 @@
+import React, { useEffect, useState, useRef } from 'react';
+import './index.scss';
+import { getSourceList } from '../../api'
+// import { factoryZoneId } from '../../../constants/factory'
+import dot from '../../../images/factory/resource/version-dot.webp'
+import versionNew from '../../../images/factory/resource/version-new.webp'
+import '../../common.scss'
+
+const factoryZoneId = 199
+
+function Index(props) {
+
+ const [versionList, setVersionList] = useState([]);
+
+ useEffect(() => {
+ getFullList();
+ }, []);
+
+ const getFullList = () => {
+
+ getSourceList({ id: factoryZoneId }).then(res => {
+ setVersionList(res.data.rows.slice(0, 4));
+ });
+ };
+
+
+ return (
+
+
+
我是版本的标题文案占一行
+
复现困难、诊断成本高等问题。在2025 CCF中国开源大会上,滴滴正式将HUATUO本AI核心通识课课程是一门全面且深入的入门课程
+
+
+ {
+ versionList.map((item, index) => {
+ return
+
+

+
+
+
+
+
{item.name}
+ {index === 0 &&

}
+
+
+
+ {item.summary}
+
+
+
+
+ })
+ }
+
+
+ )
+}
+export default Index
diff --git a/src/factory/resource/factoryVersion/index.scss b/src/factory/resource/factoryVersion/index.scss
new file mode 100644
index 00000000..458c3763
--- /dev/null
+++ b/src/factory/resource/factoryVersion/index.scss
@@ -0,0 +1,137 @@
+.version {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin-top: -50px;
+
+ .version-top {
+ width: 1600px;
+ height: 120px;
+ padding: 21px 52px;
+ background-image: url('../../../images/factory/resource/version-top.webp');
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+
+ h5 {
+ line-height: 27px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #ffffff;
+ font-size: 20px;
+ margin-bottom: 18px;
+ }
+
+ p {
+ line-height: 20px;
+ font-family: alibabareg;
+ color: #ffffff;
+ font-size: 14px;
+ }
+ }
+
+ .version-content {
+ width: 1600px;
+ display: flex;
+ margin-top: 59px;
+ justify-content: space-between;
+ margin-bottom: 90px;
+
+ .version-item {
+ width: 348px;
+ display: flex;
+
+ &-left {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin-right: 29px;
+
+ img {
+ width: 42px;
+ height: 42px;
+ }
+
+ div {
+ margin-top: -21px;
+ height: 237px;
+ border-left: 1px dashed rgba(22, 76, 228, 0.31);
+ }
+ }
+
+ &-right {
+ flex-grow: 1;
+ display: flex;
+ flex-direction: column;
+
+ .version-item-title {
+ display: flex;
+ align-items: center;
+ width: 250px;
+ h4 {
+ line-height: 33px;
+ font-family: alibaba;
+ font-weight: 700;
+ color: #091221;
+ font-size: 24px;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ }
+ .new-tag {
+ width: 37.49px;
+ margin-left: 10px;
+ }
+ }
+
+ .version-item-content {
+ margin-top: 17px;
+ width: 100%;
+ height: 136px;
+ background: linear-gradient(92.56deg, #f8fbff 0.8%, rgba(255, 255, 255, 0) 99%);
+ border: 1px solid;
+ border-color: #ffffff;
+ border-radius: 17px;
+ line-height: 34px;
+ font-family: alibabareg;
+ color: #091221;
+ font-size: 15px;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-break: break-all;
+ padding: 22px;
+ }
+
+ button {
+ cursor: pointer;
+ margin-top: auto;
+ width: 104px;
+ height: 36px;
+ background-color: rgba(255, 255, 255, 0.42);
+ border: 1px solid;
+ border-color: #091221;
+ border-radius: 9px;
+ line-height: 20px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #091221;
+ font-size: 14px;
+ }
+ .shiny-button {
+ background-color:#091221;
+ color: #ffffff;
+ border: 2px solid transparent;
+ }
+ }
+
+ &:not(:first-child) {
+ button:hover {
+ border-color: #164ce4;
+ color: #164ce4;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/factory/resource/index.jsx b/src/factory/resource/index.jsx
new file mode 100644
index 00000000..855df5e0
--- /dev/null
+++ b/src/factory/resource/index.jsx
@@ -0,0 +1,98 @@
+import React, { useEffect, useState, useRef } from 'react';
+import './index.scss';
+import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC";
+import KFIcon from '../../components/KFIcon/index';
+import searchBg from '../../images/factory/resource/search-bg.webp'
+import { Route, Switch } from "react-router-dom";
+import Loadable from "react-loadable";
+import Loading from "../../Loading";
+
+
+
+const FactoryVersion = Loadable({
+ loader: () => import("./factoryVersion/index"),
+ loading: Loading,
+});
+
+const SoftwareProject = Loadable({
+ loader: () => import("./softwareProject/index"),
+ loading: Loading,
+});
+
+const DevelopmentTools = Loadable({
+ loader: () => import("./developmentTools/index"),
+ loading: Loading,
+});
+
+
+const zoneId = 199
+
+const typeMap = [
+ { name: '工厂版本', key: 'factoryVersion', icon: 'icon-gongchangbanben' },
+ { name: '软件项目', key:'softwareProject', icon: 'icon-ruanjianxiangmu' },
+ { name: '开发工具', key: 'developmentTools', icon: 'icon-kaifagongju' },
+]
+
+function Index(props) {
+
+ const [selectedType, setSelectedType] = useState(typeMap[0].key)
+
+
+ useEffect(() => {
+ props.history.push(`/softWareFactory/resource/${selectedType}`);
+ }, [selectedType]);
+
+ useEffect(() => {
+ }, [])
+
+ return (
+
+
+
+
资源中枢,释放共享复用的生态力量
+
+

+
+ {
+ typeMap.map(item => (
+
setSelectedType(item.key)}>
+
+ {item.name}
+
+ ))
+ }
+
+
+
+
+ (
+
+ )} />
+ (
+
+ )} />
+ (
+
+ )} />
+
+
+
+ )
+}
+export default TPMIndexHOC(Index)
\ No newline at end of file
diff --git a/src/factory/resource/index.scss b/src/factory/resource/index.scss
new file mode 100644
index 00000000..ce9789ed
--- /dev/null
+++ b/src/factory/resource/index.scss
@@ -0,0 +1,178 @@
+.resource {
+ background-color: #f1f6fd;
+
+ &-header {
+ height: 410px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ background-image: url("../../images/factory/resource/header-bg.png");
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ position: relative;
+
+ .circle-wrapper {
+ width: 1600px;
+ position: absolute;
+ height: 410px;
+ overflow: hidden;
+ left: 50%;
+ transform: translateX(-50%);
+ z-index: 1;
+ pointer-events: none;
+ }
+
+ $circle-count: 4;
+ $animation-duration: 8s;
+
+ .circle-item {
+ opacity: 0;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ border-radius: 50%;
+ border: 1px solid rgba(100, 150, 255, 0.3);
+
+ // 使用循环创建多个圆圈
+ @for $i from 1 through $circle-count {
+ &:nth-child(#{$i}) {
+ $size: 800px + ($i * 2px);
+ $delay: (
+ $i - 1) * ($animation-duration / $circle-count
+ );
+
+ width: $size;
+ height: $size;
+ animation: circleSpread $animation-duration infinite ease-in-out $delay;
+ }
+ }
+ }
+
+ @keyframes circleSpread {
+ 0% {
+ opacity: 0;
+ filter: blur(0px);
+ transform: translate(-50%, -50%) scale(1);
+ }
+
+ 20% {
+ opacity: 0.8;
+ filter: blur(0.5px);
+ }
+
+ 50% {
+ opacity: 0.5;
+ filter: blur(1.5px);
+ }
+
+ 80% {
+ opacity: 0.1;
+ filter: blur(3px);
+ }
+
+ 100% {
+ width: 1200px;
+ height: 1200px;
+ opacity: 0;
+ filter: blur(5px);
+ transform: translate(-50%, -50%) scale(1);
+ }
+ }
+
+ h2 {
+ line-height: 55px;
+ font-family: alibaba;
+ font-weight: 700;
+ color: #091221;
+ font-size: 40px;
+ text-align: center;
+ margin-top: 67px;
+
+ span {
+ color: #164ce4;
+ }
+ }
+
+ .search-bg {
+ width: 644.85px;
+ height: 120px;
+ margin-top: -75px;
+ }
+
+ .search-box {
+ margin-top: 25px;
+ width: 567px;
+ height: 55px;
+ background: #ffffff;
+ border: 1px solid;
+ border-color: rgba(22, 76, 228, 0.05);
+ border-radius: 14px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ z-index: 1;
+
+ .search-input {
+ margin-left: 30px;
+ width: 400px;
+ height: 40px;
+ border: none;
+ line-height: 40px;
+ font-family: alibabareg;
+ font-size: 15px;
+
+ &::placeholder {
+ color: #a2abbd;
+ }
+ }
+
+ .search-icon {
+ width: 39px;
+ height: 39px !important;
+ background: #091221;
+ border-radius: 8px;
+ flex-shrink: 0;
+ color: #ffffff;
+ text-align: center;
+ line-height: 46px;
+ margin-right: 8px;
+ cursor: pointer;
+ }
+
+ }
+
+ .switch-box {
+ display: flex;
+
+ .switch-item {
+ width: 178px;
+ height: 54px;
+ border-radius: 35px;
+ box-shadow: 0px 0px 15px rgba(0, 74, 168, 0.05);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ line-height: normal;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #091221;
+ font-size: 22px;
+ margin-right: 44px;
+ cursor: pointer;
+
+ i {
+ margin-right: 10px;
+ }
+
+ &:hover {
+ color: #164ce4;
+ }
+ }
+
+ .switch-item-active {
+ background: #ffffff;
+ }
+ }
+}
+}
\ No newline at end of file
diff --git a/src/factory/resource/softwareProject/index.jsx b/src/factory/resource/softwareProject/index.jsx
new file mode 100644
index 00000000..be7d672b
--- /dev/null
+++ b/src/factory/resource/softwareProject/index.jsx
@@ -0,0 +1,192 @@
+import React, { useEffect, useState, useRef } from 'react';
+import './index.scss';
+import { getProjectsLists } from '../../api'
+import { factoryZoneId } from '../../../constants/factory'
+import KFIcon from '../../../components/KFIcon';
+
+import bg1 from '../../../images/factory/resource/project-top-1.webp';
+import bg2 from '../../../images/factory/resource/project-top-2.webp';
+import bg3 from '../../../images/factory/resource/project-top-3.png';
+
+import bg4 from '../../../images/factory/resource/project-content-1.webp';
+import bg5 from '../../../images/factory/resource/project-content-2.webp';
+import bg6 from '../../../images/factory/resource/project-content-3.webp';
+import bg7 from '../../../images/factory/resource/project-content-4.webp';
+import contentRight from '../../../images/factory/resource/project-content-right.webp';
+import bg8 from '../../../images/factory/resource/project-bottom-1.webp'
+
+import ActionItem from '../components/ActionItem';
+import '../../common.scss'
+
+
+const bgList = [bg1, bg2, bg3]
+const contentBgList = [bg4, bg5, bg6, bg7]
+
+function Index(props) {
+
+ const [topList, setTopList] = useState([]);
+ const [contentList, setContentList] = useState([]);
+ const [fullList, setFullList] = useState([]);
+
+ useEffect(() => {
+ getFullList();
+ getTopList();
+ }, []);
+
+ const getTopList = () => {
+ getProjectsLists(factoryZoneId, { isHomepage: 1 }).then(res => {
+ console.log(res.data.rows);
+
+ setTopList(res.data.rows.slice(0, 3)); // 获取前三个项目作为 topList
+ });
+ };
+
+ const getFullList = () => {
+ getProjectsLists(factoryZoneId, { isHomepage: 0 }).then(res => {
+ // 前面四个项目作为 contentList
+ setContentList(res.data.rows.slice(0, 4));
+ // 后面项目作为 fullList
+ setFullList(res.data.rows.slice(4));
+ });
+ };
+
+ return (
+
+
+ {
+ topList.map((item, index) => {
+ const project = item.projectProperties
+ return (
+
+

+

+
+
{project.name}
+
{project.description}
+
+
+ {
+ project.topics && project.topics.split(',').splice(0, 3).map((topic, index) => {
+ return (
+ {topic}
+ )
+ })
+ }
+
+
+
+ {
+ project.praisesCount > 0 && {project.praisesCount}
+ }
+ {
+ project.forkedCount > 0 && {project.forkedCount}
+ }
+
+
+
+
+ )
+ })
+ }
+
+
+
+
全部软件项目
+
+
+
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+
+ {
+ contentList.map((item, index) => {
+ const project = item.projectProperties
+ project.praisesCount = 3
+ project.forkedCount = 3
+ return
+

+
+

+
{project.name}
+
+
+ {
+ project.topics && project.topics.split(',').splice(0, 3).map((topic, index) => {
+ return (
+ {topic}
+ )
+ })
+ }
+
+
+ {project.description}
+
+
+
+ {
+ project.praisesCount > 0 && {project.praisesCount}
+ }
+ {
+ project.forkedCount > 0 && {project.forkedCount}
+ }
+
+
+ })
+ }
+
+
+

+
+
+
+ {
+ fullList.map((item, index) => {
+ const project = item.projectProperties
+ project.praisesCount = 3
+ project.forkedCount = 3
+ return
+
+ {
+ index % 2 === 0 &&

+ }
+
+
+

+
{project.name}
+
+
+ {project.description}
+
+
+ {
+ project.topics && project.topics.split(',').splice(0, 3).map((topic, index) => {
+ return (
+ {topic}
+ )
+ })
+ }
+
+
+
+
+ {
+ project.praisesCount > 0 && {project.praisesCount}
+ }
+ {
+ project.forkedCount > 0 && {project.forkedCount}
+ }
+
+
+
+
+
+
+ })
+ }
+
+
+
+ )
+}
+export default Index
+
+
+
diff --git a/src/factory/resource/softwareProject/index.scss b/src/factory/resource/softwareProject/index.scss
new file mode 100644
index 00000000..a0a1dc64
--- /dev/null
+++ b/src/factory/resource/softwareProject/index.scss
@@ -0,0 +1,369 @@
+.project {
+ margin-top: -50px;
+ &-top {
+ display: flex;
+ justify-content: center;
+
+ &-item {
+ width: 516px;
+ height: 230px;
+ display: flex;
+ padding: 50px 38px 38px 38px;
+ color: #ffffff;
+ margin-right: 26px;
+ overflow: hidden;
+ position: relative;
+ z-index: 1;
+ border-radius: 16px;
+ cursor: pointer;
+
+ .item-bg {
+ width: 516px;
+ height: 230px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: -1;
+ transition: transform 0.3s ease-in-out;
+ }
+
+ &:hover {
+ .item-bg {
+ transform: scale(1.1);
+ }
+ }
+
+ .item-img {
+ width: 50px;
+ height: 50px;
+ border-radius: 50%;
+ margin-right: 16px;
+ }
+
+ .item-info {
+ font-size: 15px;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+
+ h5 {
+ line-height: 30px;
+ font-family: alibabareg;
+ font-size: 22px;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ color: #ffffff;
+ }
+
+ p {
+ line-height: 24px;
+ font-family: alibabareg;
+ margin-top: 13px;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ }
+ }
+
+ .item-bottom {
+ margin-top: auto;
+ display: flex;
+
+ .item-bottom-tags {
+ display: flex;
+ justify-content: space-between;
+
+ .item-tag {
+ display: inline-block;
+ margin-right: 10px;
+ padding: 0 8px;
+ height: 32px;
+ background: rgba(255, 255, 255, 0.57);
+ border-radius: 4px;
+ }
+ }
+
+ .item-bottom-data {
+ margin-left: auto;
+
+ span {
+ line-height: 18px;
+ font-family: alibabareg;
+ color: #ffffff;
+ font-size: 13px;
+ position: relative;
+ }
+
+ span:not(:last-child) {
+ margin-right: 15px;
+ padding-right: 15px;
+
+ &::after {
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translate(0, -50%);
+ content: "";
+ width: 1px;
+ height: 9px;
+ background: rgba(255, 255, 255, 0.22);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ &-content {
+ margin-top: 60px;
+ background: linear-gradient(180deg, #ffffff 0%, #ffffff 80.62%, rgba(255, 255, 255, 0.13) 100%);
+ border-radius: 80px 80px 0px 0px;
+ padding-top: 28px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ h2 {
+ line-height: 55px;
+ font-family: alibaba;
+ font-weight: 700;
+ color: #091221;
+ font-size: 40px;
+ text-align: center;
+ }
+
+ .item-top {
+ display: flex;
+ align-items: center;
+
+ img {
+ width: 38px;
+ height: 38px;
+ border-radius: 50%;
+ margin-right: 14px;
+ }
+
+ .item-title {
+ line-height: 30px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #091221;
+ font-size: 22px;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ margin: 0;
+ }
+ }
+
+ .item-desc {
+ margin-top: 18px;
+ line-height: 21px;
+ font-family: alibabareg;
+ color: #091221;
+ font-size: 15px;
+ display: -webkit-box;
+ -webkit-line-clamp: 1;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ }
+
+ .item-tags {
+ margin-top: 22px;
+ display: flex;
+ justify-content: flex-start;
+
+ .item-tag {
+ display: inline-block;
+ padding: 0 8px;
+ margin-right: 8px;
+ height: 32px;
+ background: rgba(22, 76, 228, 0.05);
+ border-radius: 4px;
+ line-height: 32px;
+ font-family: alibabareg;
+ color: #091221;
+ font-size: 14px;
+ }
+ }
+
+
+ .item-data {
+ margin-top: auto;
+
+ span {
+ line-height: 18px;
+ font-family: alibabareg;
+ color: #5d6a80;
+ font-size: 13px;
+ position: relative;
+ }
+
+ span:not(:last-child) {
+ margin-right: 15px;
+ padding-right: 15px;
+
+ &::after {
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translate(0, -50%);
+ content: "";
+ width: 1px;
+ height: 9px;
+ background: rgba(9, 18, 33, 0.22);
+ }
+ }
+ }
+
+ &-top {
+ width: 1600px;
+ background: linear-gradient(110.74deg, #f5f5fd 2.03%, #ddf0ff 98.5%);
+ border-radius: 16px;
+ display: flex;
+ align-items: center;
+ padding: 58px 0 32px 0;
+ margin-top: 25px;
+
+ &-left {
+ padding: 0 0 0 53px;
+
+ .content-top-list {
+ display: flex;
+ flex-wrap: wrap;
+ margin-top: 38px;
+
+ .content-top-item {
+ width: 420px;
+ height: 219px;
+ border-radius: 16px;
+ background: #ffffff;
+ margin-bottom: 28px;
+ position: relative;
+ z-index: 1;
+ padding: 23px 29px 29px 29px;
+ display: flex;
+ flex-direction: column;
+ cursor: pointer;
+
+ .item-bg {
+ position: absolute;
+ width: 420px;
+ height: 219px;
+ left: 0;
+ top: 0;
+ z-index: -1;
+ }
+
+ &:nth-child(2n+1) {
+ margin-right: 32px;
+ }
+
+ // 最后两个元素添加margin-bottom: 28px;
+ &:nth-last-child(-n+2) {
+ margin-bottom: 0;
+
+ .item-tag {
+ background: rgba(255, 255, 255, 0.84);
+ color: #091221;
+ }
+
+ .item-desc {
+ color: #ffffff;
+ }
+
+ .item-data {
+ span {
+ color: #ffffff
+ }
+ }
+ }
+
+ &:hover {
+ box-shadow: 0px 0px 12px rgba(22, 76, 228, 0.06);
+
+ .item-title {
+ color: #164ce4;
+ }
+ }
+ }
+ }
+ }
+
+ &-right {
+ width: 672px;
+ height: 516px;
+ }
+ }
+
+ &-bottom {
+ margin-top: 40px;
+ width: 1600px;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+
+ .content-bottom-wrapper {
+ margin-bottom: 26px;
+ }
+
+ .content-bottom-item {
+ width: 381.25px;
+ height: 256px;
+ background: linear-gradient(rgba(241, 247, 255, 0.48), rgba(241, 247, 255, 0.48)), #ffffff;
+ border: 1px solid;
+ border-color: rgba(19, 53, 91, 0.11);
+ border-radius: 16px;
+ z-index: 1;
+ position: relative;
+ padding: 35px 30px;
+ display: flex;
+ flex-direction: column;
+
+ .item-bg {
+ position: absolute;
+ width: 381.25px;
+ height: 256px;
+ left: 0;
+ top: 0;
+ z-index: -1;
+ }
+
+ .item-desc {
+ -webkit-line-clamp: 2;
+ margin-top: 26px;
+ }
+
+ .item-tags {
+ margin-top: auto;
+ }
+ }
+
+ .content-bottom-btn {
+ width: 378px;
+ height: 94px;
+ background: linear-gradient(180deg, rgba(248, 251, 255, 0) 0%, #f3f6ff 23.71%, #f8fbff 100%);
+ border-radius: 0px 0px 16px 16px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ button {
+ cursor: pointer;
+ width: 320px;
+ height: 36px;
+ background-color: #091221;
+ border-radius: 9px;
+ line-height: 20px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #ffffff;
+ font-size: 14px;
+ text-align: center;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/factory/scene/index.jsx b/src/factory/scene/index.jsx
new file mode 100644
index 00000000..8cdf220b
--- /dev/null
+++ b/src/factory/scene/index.jsx
@@ -0,0 +1,74 @@
+import React, { useEffect, useState, useRef } from 'react';
+import './index.scss';
+import { TPMIndexHOC } from '../../modules/tpm/TPMIndexHOC';
+import imageBack1 from '../../images/factory/back1.png'
+import sceneIcon from '../../images/factory/scene/scene-icon.webp'
+import { Link } from 'react-router-dom';
+import RenderHtml from '../../components/render-html';
+
+
+
+const Detail = {
+ name: '临近空间装备',
+ desc: '我是文案我是文案占2行我是文案我是文案占2行我是文案我是文案占2行我是文案我是文案占2行',
+ img: imageBack1,
+ content: '5aSn5qih5Z6L5oiQ5pys5pWI55uK5a+55q+U77yaRGVlcFNlZWsgMi41IFZTIENsYXVkZSAzLjUgU29ubmV0IFZTIEdQVC00bwoKCi0gWyAxMjQ0XQotIOWPkeWZtuWxseixhuaguQoKMS4gMTI0MzE0CjIuIDIuNTQyNTIKCgojIyMgMwoKfCBjb2wgfCBjb2wgfCBjb2wgfCBjb2wgfAp8IC0gfCAtIHwgLSB8IC0gfAp8IGNvbnRlbnQgfCBjb250ZW50IHwgY29udGVudCB8IGNvbnRlbnQgfAp8IGNvbnRlbnQgfCBjb250ZW50IHwgY29udGVudCB8IGNvbnRlbnQgfAp8IGNvbnRlbnQgfCBjb250ZW50IHwgY29udGVudCB8IGNvbnRlbnQgfAoKIVtdKGh0dHBzOi8vdGVzdGdldHdheS50cnVzdGllLm5ldC9hcGkvZmlsZS9vcGVuL2Rvd25sb2FkLzUzOTMpCg=='
+}
+
+const otherList = [
+ '"小智廉"应用',
+ 'KJZZ保障',
+ 'XXXXXXXX',
+ '我是应用场景的标题',
+ '我是应用场景的标题',
+ '我是应用场景的标题',
+]
+
+function Index(props) {
+
+ const [detail, setDetail] = useState(Detail)
+ const [ content , setContent]=useState();
+
+ useEffect(() => {
+ setContent(Base64.decode(detail.content));
+ }, []);
+
+ return (
+
+
+
+

+
{detail.name}
+
{detail.desc}
+
+
+

+
+
+
+
+
+
+ {
+ content &&
+ }
+
+
+
+
相关场景
+
+ {
+ otherList.map((item, index) => {
+ return (
+ - {item}
+ )
+ })
+ }
+
+
+
+
+
+ )
+}
+export default TPMIndexHOC(Index)
\ No newline at end of file
diff --git a/src/factory/scene/index.scss b/src/factory/scene/index.scss
new file mode 100644
index 00000000..f7f708f8
--- /dev/null
+++ b/src/factory/scene/index.scss
@@ -0,0 +1,122 @@
+.scene {
+ .scene-header {
+ height: 450px;
+ width: 100%;
+ background-image: url("../../images/factory/scene/bg1.webp");
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ .header-content {
+ width: 1600px;
+ height: 300px;
+ background: url("../../images/factory/scene/bg2.webp"), #fff;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ position: relative;
+ border-radius: 16px;
+ box-shadow: 0px 0px 10px rgba(0, 74, 168, 0.03);
+ padding: 60px;
+
+ .scene-icon {
+ width: 146.5px;
+ height: 29px;
+ }
+
+ h3 {
+ line-height: 47px;
+ font-family: alibaba;
+ font-weight: 700;
+ color: #091221;
+ font-size: 34px;
+ margin-top: 27px;
+ }
+
+ p {
+ margin-top: 19px;
+ max-width: 594px;
+ line-height: 32px;
+ font-family: alibabareg;
+ color: #091221;
+ font-size: 16px;
+ }
+
+ .header-img {
+ position: absolute;
+ top: -30px;
+ right: 0;
+ width: 600px;
+ height: 360px;
+ background: linear-gradient(180deg, #ffffff 0%, #f1f7ff 100%);
+ border-radius: 10px;
+ box-shadow: 0px 0px 18px rgba(0, 74, 168, 0.05);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &-wrapper {
+ width: 526px;
+ height: 300px;
+ border-radius: 10px;
+ overflow: hidden;
+
+ img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ border-radius: 10px;
+ }
+ }
+
+ }
+
+ &:hover {
+ .header-img .header-img-wrapper img {
+ transform: scale(1.1);
+ transition: transform .4s cubic-bezier(.25, .46, .45, .94);
+ }
+ }
+ }
+ }
+
+ .scene-content {
+ width: 1600px;
+ height: 100%;
+ margin: 52px auto;
+
+ .scene-content-wrapper {
+ width: 1245px;
+ float: left;
+ padding-bottom: 60px;
+ }
+
+ .scene-content-others {
+ width: 300px;
+ float: right;
+
+ div {
+ background: #f2f6fa;
+ border-radius: 12px;
+ padding: 35px 30px;
+
+ h4 {
+ line-height: 22px;
+ font-family: alibaba;
+ font-weight: 500;
+ color: #091221;
+ font-size: 16px;
+ }
+
+ li {
+ line-height: 20px;
+ font-family: alibabareg;
+ color: #091221;
+ font-size: 14px;
+ margin-top: 20px;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/images/factory/resource/header-bg.png b/src/images/factory/resource/header-bg.png
new file mode 100644
index 00000000..b06d44c7
Binary files /dev/null and b/src/images/factory/resource/header-bg.png differ
diff --git a/src/images/factory/resource/project-bottom-1.webp b/src/images/factory/resource/project-bottom-1.webp
new file mode 100644
index 00000000..4b31f9ca
Binary files /dev/null and b/src/images/factory/resource/project-bottom-1.webp differ
diff --git a/src/images/factory/resource/project-content-1.webp b/src/images/factory/resource/project-content-1.webp
new file mode 100644
index 00000000..16999bf5
Binary files /dev/null and b/src/images/factory/resource/project-content-1.webp differ
diff --git a/src/images/factory/resource/project-content-2.webp b/src/images/factory/resource/project-content-2.webp
new file mode 100644
index 00000000..908957c2
Binary files /dev/null and b/src/images/factory/resource/project-content-2.webp differ
diff --git a/src/images/factory/resource/project-content-3.webp b/src/images/factory/resource/project-content-3.webp
new file mode 100644
index 00000000..7a176987
Binary files /dev/null and b/src/images/factory/resource/project-content-3.webp differ
diff --git a/src/images/factory/resource/project-content-4.webp b/src/images/factory/resource/project-content-4.webp
new file mode 100644
index 00000000..443c6034
Binary files /dev/null and b/src/images/factory/resource/project-content-4.webp differ
diff --git a/src/images/factory/resource/project-content-right.webp b/src/images/factory/resource/project-content-right.webp
new file mode 100644
index 00000000..3087dd79
Binary files /dev/null and b/src/images/factory/resource/project-content-right.webp differ
diff --git a/src/images/factory/resource/project-top-1.webp b/src/images/factory/resource/project-top-1.webp
new file mode 100644
index 00000000..bb5e29ef
Binary files /dev/null and b/src/images/factory/resource/project-top-1.webp differ
diff --git a/src/images/factory/resource/project-top-2.webp b/src/images/factory/resource/project-top-2.webp
new file mode 100644
index 00000000..2c80236d
Binary files /dev/null and b/src/images/factory/resource/project-top-2.webp differ
diff --git a/src/images/factory/resource/project-top-3.png b/src/images/factory/resource/project-top-3.png
new file mode 100644
index 00000000..85c9a6fb
Binary files /dev/null and b/src/images/factory/resource/project-top-3.png differ
diff --git a/src/images/factory/resource/search-bg.webp b/src/images/factory/resource/search-bg.webp
new file mode 100644
index 00000000..d87c3e46
Binary files /dev/null and b/src/images/factory/resource/search-bg.webp differ
diff --git a/src/images/factory/resource/tools-bottom-1.webp b/src/images/factory/resource/tools-bottom-1.webp
new file mode 100644
index 00000000..f539cf57
Binary files /dev/null and b/src/images/factory/resource/tools-bottom-1.webp differ
diff --git a/src/images/factory/resource/tools-bottom-2.webp b/src/images/factory/resource/tools-bottom-2.webp
new file mode 100644
index 00000000..b252d976
Binary files /dev/null and b/src/images/factory/resource/tools-bottom-2.webp differ
diff --git a/src/images/factory/resource/tools-new-1.webp b/src/images/factory/resource/tools-new-1.webp
new file mode 100644
index 00000000..9246231a
Binary files /dev/null and b/src/images/factory/resource/tools-new-1.webp differ
diff --git a/src/images/factory/resource/tools-new-2.webp b/src/images/factory/resource/tools-new-2.webp
new file mode 100644
index 00000000..5838cb43
Binary files /dev/null and b/src/images/factory/resource/tools-new-2.webp differ
diff --git a/src/images/factory/resource/tools-top-1.webp b/src/images/factory/resource/tools-top-1.webp
new file mode 100644
index 00000000..59fac9c5
Binary files /dev/null and b/src/images/factory/resource/tools-top-1.webp differ
diff --git a/src/images/factory/resource/tools-top-2.webp b/src/images/factory/resource/tools-top-2.webp
new file mode 100644
index 00000000..2f03e01e
Binary files /dev/null and b/src/images/factory/resource/tools-top-2.webp differ
diff --git a/src/images/factory/resource/tools-top-3.webp b/src/images/factory/resource/tools-top-3.webp
new file mode 100644
index 00000000..1c9169e3
Binary files /dev/null and b/src/images/factory/resource/tools-top-3.webp differ
diff --git a/src/images/factory/resource/version-dot.webp b/src/images/factory/resource/version-dot.webp
new file mode 100644
index 00000000..67457a00
Binary files /dev/null and b/src/images/factory/resource/version-dot.webp differ
diff --git a/src/images/factory/resource/version-new.webp b/src/images/factory/resource/version-new.webp
new file mode 100644
index 00000000..9be7331f
Binary files /dev/null and b/src/images/factory/resource/version-new.webp differ
diff --git a/src/images/factory/resource/version-top.webp b/src/images/factory/resource/version-top.webp
new file mode 100644
index 00000000..50952960
Binary files /dev/null and b/src/images/factory/resource/version-top.webp differ
diff --git a/src/images/factory/scene/bg1.webp b/src/images/factory/scene/bg1.webp
new file mode 100644
index 00000000..1a77707c
Binary files /dev/null and b/src/images/factory/scene/bg1.webp differ
diff --git a/src/images/factory/scene/bg2.webp b/src/images/factory/scene/bg2.webp
new file mode 100644
index 00000000..7af87a0a
Binary files /dev/null and b/src/images/factory/scene/bg2.webp differ
diff --git a/src/images/factory/scene/scene-icon.webp b/src/images/factory/scene/scene-icon.webp
new file mode 100644
index 00000000..595636b6
Binary files /dev/null and b/src/images/factory/scene/scene-icon.webp differ
diff --git a/src/images/iconfont/iconfont.css b/src/images/iconfont/iconfont.css
index 6013168d..a92a828f 100644
--- a/src/images/iconfont/iconfont.css
+++ b/src/images/iconfont/iconfont.css
@@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 5081288 */
- src: url('iconfont.woff2?t=1764899187997') format('woff2'),
- url('iconfont.woff?t=1764899187997') format('woff'),
- url('iconfont.ttf?t=1764899187997') format('truetype');
+ src: url('iconfont.woff2?t=1765507764789') format('woff2'),
+ url('iconfont.woff?t=1765507764789') format('woff'),
+ url('iconfont.ttf?t=1765507764789') format('truetype');
}
.iconfont {
@@ -13,6 +13,26 @@
-moz-osx-font-smoothing: grayscale;
}
+.icon-xiazai:before {
+ content: "\e794";
+}
+
+.icon-sousuo:before {
+ content: "\e793";
+}
+
+.icon-kaifagongju:before {
+ content: "\e790";
+}
+
+.icon-ruanjianxiangmu:before {
+ content: "\e791";
+}
+
+.icon-gongchangbanben:before {
+ content: "\e792";
+}
+
.icon-icon_blackarrow_hover:before {
content: "\e78f";
}
diff --git a/src/images/iconfont/iconfont.js b/src/images/iconfont/iconfont.js
index ea966b6c..b2c7d3a7 100644
--- a/src/images/iconfont/iconfont.js
+++ b/src/images/iconfont/iconfont.js
@@ -1 +1 @@
-window._iconfont_svg_string_5081288='
',(e=>{var a=(t=(t=document.getElementsByTagName("script"))[t.length-1]).getAttribute("data-injectcss"),t=t.getAttribute("data-disable-injectsvg");if(!t){var l,i,n,o,c,d=function(a,t){t.parentNode.insertBefore(a,t)};if(a&&!e.__iconfont__svg__cssinject__){e.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}l=function(){var a,t=document.createElement("div");t.innerHTML=e._iconfont_svg_string_5081288,(t=t.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",t=t,(a=document.body).firstChild?d(t,a.firstChild):a.appendChild(t))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),l()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(n=l,o=e.document,c=!1,s(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,h())})}function h(){c||(c=!0,n())}function s(){try{o.documentElement.doScroll("left")}catch(a){return void setTimeout(s,50)}h()}})(window);
\ No newline at end of file
+window._iconfont_svg_string_5081288='
',(l=>{var a=(t=(t=document.getElementsByTagName("script"))[t.length-1]).getAttribute("data-injectcss"),t=t.getAttribute("data-disable-injectsvg");if(!t){var i,e,o,h,n,d=function(a,t){t.parentNode.insertBefore(a,t)};if(a&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}i=function(){var a,t=document.createElement("div");t.innerHTML=l._iconfont_svg_string_5081288,(t=t.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",t=t,(a=document.body).firstChild?d(t,a.firstChild):a.appendChild(t))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(i,0):(e=function(){document.removeEventListener("DOMContentLoaded",e,!1),i()},document.addEventListener("DOMContentLoaded",e,!1)):document.attachEvent&&(o=i,h=l.document,n=!1,s(),h.onreadystatechange=function(){"complete"==h.readyState&&(h.onreadystatechange=null,c())})}function c(){n||(n=!0,o())}function s(){try{h.documentElement.doScroll("left")}catch(a){return void setTimeout(s,50)}c()}})(window);
\ No newline at end of file
diff --git a/src/images/iconfont/iconfont.json b/src/images/iconfont/iconfont.json
index 8c5e9eb6..f5ee9338 100644
--- a/src/images/iconfont/iconfont.json
+++ b/src/images/iconfont/iconfont.json
@@ -5,6 +5,41 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
+ {
+ "icon_id": "46331570",
+ "name": "下载",
+ "font_class": "xiazai",
+ "unicode": "e794",
+ "unicode_decimal": 59284
+ },
+ {
+ "icon_id": "46274605",
+ "name": "搜索",
+ "font_class": "sousuo",
+ "unicode": "e793",
+ "unicode_decimal": 59283
+ },
+ {
+ "icon_id": "46274559",
+ "name": "开发工具",
+ "font_class": "kaifagongju",
+ "unicode": "e790",
+ "unicode_decimal": 59280
+ },
+ {
+ "icon_id": "46274558",
+ "name": "软件项目",
+ "font_class": "ruanjianxiangmu",
+ "unicode": "e791",
+ "unicode_decimal": 59281
+ },
+ {
+ "icon_id": "46274557",
+ "name": "工厂版本",
+ "font_class": "gongchangbanben",
+ "unicode": "e792",
+ "unicode_decimal": 59282
+ },
{
"icon_id": "46273104",
"name": "icon_blackarrow_hover",
diff --git a/src/images/iconfont/iconfont.ttf b/src/images/iconfont/iconfont.ttf
index 86b01961..66168440 100644
Binary files a/src/images/iconfont/iconfont.ttf and b/src/images/iconfont/iconfont.ttf differ
diff --git a/src/images/iconfont/iconfont.woff b/src/images/iconfont/iconfont.woff
index 37769177..e15e785b 100644
Binary files a/src/images/iconfont/iconfont.woff and b/src/images/iconfont/iconfont.woff differ
diff --git a/src/images/iconfont/iconfont.woff2 b/src/images/iconfont/iconfont.woff2
index 6a6f6ca6..493da390 100644
Binary files a/src/images/iconfont/iconfont.woff2 and b/src/images/iconfont/iconfont.woff2 differ