diff --git a/Routes.js b/Routes.js index 328c3145..c8bfa278 100644 --- a/Routes.js +++ b/Routes.js @@ -56,4 +56,4 @@ export const deepRoutes = [ ] // 不进行组织或个人判断 -export const specialRoute = ["explore", "settings", "setting", "mulan", "wiki", "issues", "setting", "trending", "code", "projects", "pulls", "mine", "login", "register", "email", "export", "nopage", "404", "403", "500", "501", "search", "organize", "login", "register", "resetPassword", "aboutus","educoder", "glcc","bindlogin", "softbot","zone", "undefined", "admins", "oauth", "competitions", "hiagent"] \ No newline at end of file +export const specialRoute = ["explore", "settings", "setting", "mulan", "wiki", "issues", "setting", "trending", "code", "projects", "pulls", "mine", "login", "register", "email", "export", "nopage", "404", "403", "500", "501", "search", "organize", "login", "register", "resetPassword", "aboutus","educoder", "glcc","bindlogin", "softbot","zone", "undefined", "admins", "oauth", "competitions", "hiagent","softwareFactory"] \ No newline at end of file diff --git a/src/App.js b/src/App.js index 74c1fcba..d27e9fef 100644 --- a/src/App.js +++ b/src/App.js @@ -51,6 +51,10 @@ const Information = Loadable({ loader: () => import('./forge/Information/index'), loading: Loading, }) +const SoftwareFactory = Loadable({ + loader: () => import('./forge/SoftwareFactory/index'), + loading: Loading, +}) //forge安全设置 const Security = Loadable({ loader: () => import('./forge/SecuritySetting/Index'), @@ -165,7 +169,7 @@ const Iframe = Loadable({ }); // 此处仅维护前端可能的一级路由,不用进行项目或者组织判断的字段。 -const keyWord = ["explore", "settings", "setting", "mulan", "wiki", "issues", "setting", "trending", "code", "projects", "pulls", "mine", "login", "register", "email", "export", "nopage", "404", "403", "500", "501", "search", "organize", "login", "register", "resetPassword", "aboutus","educoder", "glcc","bindlogin", "softbot","zone", "hiagent"]; +const keyWord = ["explore", "settings", "setting", "mulan", "wiki", "issues", "setting", "trending", "code", "projects", "pulls", "mine", "login", "register", "email", "export", "nopage", "404", "403", "500", "501", "search", "organize", "login", "register", "resetPassword", "aboutus","educoder", "glcc","bindlogin", "softbot","zone", "hiagent","softwareFactory"]; class App extends Component { constructor(props) { @@ -335,7 +339,16 @@ class App extends Component { render() { const { pathType, pathName, mygetHelmetapi } = this.state; + return ( + // { + // return () + // } + // }> + // this.Modifyloginvalue()}> @@ -404,6 +417,14 @@ class App extends Component { } }> + { + return () + } + }> + { let deptId = sessionStorage.getItem('deptId') - + // request.headers.Authorization = 'be06b98eb11dc58de93ab4d9de5b673ebae935bd' if (deptId) { // 用于权限区分 request.headers['Dept-Id'] = deptId diff --git a/src/forge/SoftwareFactory/api.js b/src/forge/SoftwareFactory/api.js new file mode 100644 index 00000000..cf115f21 --- /dev/null +++ b/src/forge/SoftwareFactory/api.js @@ -0,0 +1,25 @@ +import fetch from '../Information/fetch' + +//今日工作态势 +export function todayWorkSituation() { + return fetch({ + url: `/pms/open/specialArea/softwareFact/statis/todayWorkSituation`, + method: 'get', + }); +} + +//月、周工作态势 +export function weekMonthWorkSituation(type) { + return fetch({ + url: `/pms/open/specialArea/softwareFact/statis/weekMonthWorkSituation?type=${type}`, + method: 'get', + }); +} + +//项目研发状态 +export function projectSituation() { + return fetch({ + url: `/pms/open/specialArea/softwareFact/statis/projectSituation`, + method: 'get', + }); +} \ No newline at end of file diff --git a/src/forge/SoftwareFactory/components/FactoryHead.jsx b/src/forge/SoftwareFactory/components/FactoryHead.jsx new file mode 100644 index 00000000..907bbcbb --- /dev/null +++ b/src/forge/SoftwareFactory/components/FactoryHead.jsx @@ -0,0 +1,25 @@ +import React, { useEffect, useState } from "react"; +import centerBg from "../../img/center_title_bg.png"; + +function FactoryHead(props) { + const {} = props; + const [currentMonth, setCurrentMonth] = useState("2025年2月"); + + return ( +
+
+
+ +
可控开源创新中心
+
+ Controllable open source innovation center software factory work + situation +
+
+
软件工厂工作态势
+
+ +
+ ); +} +export default FactoryHead; diff --git a/src/forge/SoftwareFactory/components/Home/centerPanel.jsx b/src/forge/SoftwareFactory/components/Home/centerPanel.jsx new file mode 100644 index 00000000..6fcfd6c1 --- /dev/null +++ b/src/forge/SoftwareFactory/components/Home/centerPanel.jsx @@ -0,0 +1,90 @@ +import React, { useEffect, useState } from "react"; +import duoyun from "../../img/duoyun.png"; +import fengsu from "../../img/fengsu.png"; +import shidu from "../../img/shidu.png"; +import ziwaixian from "../../img/ziwaixian.png"; + +function CenterPanel(props) { + let { timeObj } = props; + const [weatherObj, setWetherObj] = useState({}); + useEffect(() => { + const timer = setInterval(() => { + //天气5分钟更新一次 + getWether(); + }, Number(localStorage.getItem('apiTime')) || 300000); + getWether(); + return () => { + clearInterval(timer); + }; + }, []); + + function getWether() { + // fxLink 当前数据的响应式页面,便于嵌入网站或应用 + // now.obsTime 数据观测时间 + // now.temp 温度,默认单位:摄氏度 + // now.feelsLike 体感温度,默认单位:摄氏度 + // now.icon 天气状况的图标代码,另请参考天气图标项目 + // now.text 天气状况的文字描述,包括阴晴雨雪等天气状态的描述 + // now.wind360 风向360角度 + // now.windDir 风向 + // now.windScale 风力等级 + // now.windSpeed 风速,公里/小时 + // now.humidity 相对湿度,百分比数值 + // now.precip 过去1小时降水量,默认单位:毫米 + // now.pressure 大气压强,默认单位:百帕 + // now.vis 能见度,默认单位:公里 + // now.cloud 云量,百分比数值。可能为空 + // now.dew 露点温度。可能为空 + fetch( + `https://devapi.qweather.com/v7/weather/now?location=112.87,28.22&key=18a193299e4944a7bf3ccf23b38474c2` + ) + .then((response) => response.json()) + .then((data) => { + setWetherObj({ + text: data.now.text, + temp: data.now.temp, + windDir: data.now.windDir, + humidity: data.now.humidity, + }); + }) + .catch((err) => {}); + } + return ( +
+
+
+ +
{weatherObj.text}
+
+
+
+
+ +
{weatherObj.temp}℃
+
+
+
+
+ +
{weatherObj.windDir}
+
+
+
+
+ +
{weatherObj.humidity}%
+
+
+
+
{timeObj.week}
+
+ {timeObj.month}/ + {timeObj.day} +
+
{timeObj.lunar}
+
+
+ ); +} + +export default CenterPanel; diff --git a/src/forge/SoftwareFactory/components/Home/firstPanel.jsx b/src/forge/SoftwareFactory/components/Home/firstPanel.jsx new file mode 100644 index 00000000..ca1919a4 --- /dev/null +++ b/src/forge/SoftwareFactory/components/Home/firstPanel.jsx @@ -0,0 +1,109 @@ +import React, { useEffect, useState } from "react"; +import right from "../../img/right.png"; +let firstPanelList1 = [ + { + title: "需求待评审数", + key: "needNotFinishCount", + num: 50, + isNUm: true, + unit: "个", + }, + { + title: "任务待完成数", + key: "taskNotFinishCount", + num: 10, + isNUm: true, + unit: "个", + }, + { + title: "缺陷待修复数", + key: "bugNotFinishCount", + num: 5, + isNUm: true, + unit: "个", + }, + { + title: "测试用例未执行数", + key: "notExecTestCaseCount", + num: 8, + isNUm: true, + unit: "个", + }, +]; +let firstPanelList2 = [ + { + title: "本周完结任务数", + key: "yesterdayFinishTask", + num: 50, + isNUm: true, + unit: "个", + }, + { + title: "本周关闭缺陷数", + key: "yesterdayFinishBug", + num: 10, + isNUm: true, + unit: "个", + }, + { + title: "本周需求评审数", + key: "yesterdayFinishNeed", + num: 5, + isNUm: true, + unit: "个", + }, + { title: "本周最活跃项目", key: "zonePmsProjectMax", num: 8, isNUm: false }, +]; + +function FirstPanel(props) { + const { cardPage, dayMap, weekMap } = props; + const [firstPanelList, setFirstPanelList] = useState([]); + useEffect(() => { + let list = cardPage === "1" ? firstPanelList1 : firstPanelList2; + setFirstPanelList(list); + }, []); + return ( +
+
+
+
+ {firstPanelList.map((item, idx) => { + return ( +
+
+
+ +
{item.title}
+
+ {item.isNUm ? ( +
+ + {cardPage === "2" + ? weekMap[item.key] + : dayMap[item.key]} + + {item.unit} +
+ ) : ( +
+ {cardPage === "2" + ? weekMap[item.key] + : dayMap[item.key]} +
+ )} +
+
+
+ ); + })} +
+
+
+
+ {cardPage === "2" ? "本周完结工作" : "今日项目状态"} +
+
+ ); +} + +export default FirstPanel; diff --git a/src/forge/SoftwareFactory/components/Home/forthPanel.jsx b/src/forge/SoftwareFactory/components/Home/forthPanel.jsx new file mode 100644 index 00000000..08ce8866 --- /dev/null +++ b/src/forge/SoftwareFactory/components/Home/forthPanel.jsx @@ -0,0 +1,68 @@ +import React, { useEffect, useState } from "react"; +import right from "../../img/right.png"; +let forthPanelList1 = [ + { title: "昨日新增任务数",key:'yesterdayAddTask', isNUm: true, unit: "个" }, + { title: "昨日新增缺陷数",key:'yesterdayAddBug', isNUm: true, unit: "个" }, + { title: "昨日新增需求数",key:'yesterdayAddNeed', isNUm: true, unit: "个" }, + { title: "昨日测试执行数",key:'yesterdayTestCase', isNUm: true, unit: "个" }, +]; + +let forthPanelList2 = [ + { title: "本月新增任务数",key:'yesterdayAddTask', isNUm: true, unit: "个" }, + { title: "本月新增缺陷数",key:'yesterdayAddBug', isNUm: true, unit: "个" }, + { title: "本月新增需求数",key:'yesterdayAddNeed', isNUm: true, unit: "个" }, + { title: "本月测试执行数",key:'yesterdayTestCase', isNUm: true, unit: "个" }, +]; +function ForthPanel(props) { + const { cardPage,dayMap,monthMap } = props; + const [forthPanelList, setForthPanelList] = useState([]); + useEffect(() => { + let list = cardPage === "1" ? forthPanelList1 : forthPanelList2; + setForthPanelList(list); + }, []); + + return ( +
+
+ {cardPage === "2" ? "本月新增工作" : "昨日新增工作"} +
+
+
+
+ {forthPanelList.map((item, idx) => { + return ( +
+
+
+ +
{item.title}
+
+ {item.isNUm ? ( +
+ + {cardPage === "2" + ? monthMap[item.key] + : dayMap[item.key]} + + {item.unit} +
+ ) : ( +
+ {cardPage === "2" + ? monthMap[item.key] + : dayMap[item.key]} +
+ )} +
+
+
+ ); + })} +
+
+
+
+ ); +} + +export default ForthPanel; diff --git a/src/forge/SoftwareFactory/components/Home/index.jsx b/src/forge/SoftwareFactory/components/Home/index.jsx new file mode 100644 index 00000000..ce919e55 --- /dev/null +++ b/src/forge/SoftwareFactory/components/Home/index.jsx @@ -0,0 +1,217 @@ +import React, { useEffect, useState } from "react"; +import { Route, Switch } from "react-router-dom"; +import { withRouter } from "react-router"; +import bj1 from "../../img/bj1.png"; +import newsLine from "../../img/news_line.png"; +import next from "../../img/next.png"; +import right from "../../img/right.png"; +import centerBg from "../../img/center_title_bg.png"; +import "slick-carousel/slick/slick.css"; +import "slick-carousel/slick/slick-theme.css"; +import Slider from "react-slick"; +import RightContent from "./rightContent"; +import { getLunar } from "../../utils"; +import { todayWorkSituation,weekMonthWorkSituation} from "../../api"; +// let focuseWorkList = [ +// { +// name: "page1", +// list: [ +// { num: 1, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 2, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 3, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 4, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 5, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// ], +// }, +// { +// name: "page2", +// list: [ +// { num: 6, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 7, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 8, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 9, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 10, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// ], +// }, +// { +// name: "page3", +// list: [ +// { num: 11, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 12, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 13, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 14, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// { num: 15, content: "IDRL团队/IDRLnet《基于内嵌物理知识..》" }, +// ], +// }, +// ]; + +const CalendarData = [ + 0x66aaa, 0x4aab5, 0x25d55, 0x52aad, 0x75557, 0x3aaa5, 0xad556, 0x55555, + 0x5ab6a, 0xb56d5, +]; + +const monString = "正二三四五六七八九十冬腊"; + +const setting = { + dots: false, + infinite: true, + speed: 2000, + slidesToShow: 1, + slidesToScroll: 1, + pauseOnDotsHover: true, + autoplaySpeed: Number(localStorage.getItem('homeLoopSpeed')) || 5000, + pauseOnFocus: true, + autoplay: true, + arrows: true, + prevArrow: , + nextArrow: , + // afterChange: (index) => setTag(index), +}; + +function Home(props) { + const { newsList } = props; + const [currentMonth, setCurrentMonth] = useState(""); + const [timeObj, setTimeObj] = useState({}); + const [firstNews, setFirstNews] = useState({}); + const [focuseWorkList, setFocuseWorkList] = useState([]); + const rightContentDom = React.useRef(null) + + // const [focuseWorkList, setFocuseWorkList] = useState([]); + useEffect(() => { + getDay() + const timer = setInterval(() => { + //默认5分钟更新一次 + getDay(); + }, Number(localStorage.getItem('apiTime')) || 300000); + return () => { + clearInterval(timer); + }; + }, []); + + + useEffect(() => { + if (newsList && newsList.length) { + // //重点工作 + let allList = []; + newsList.map((item) => { + if (item.name === "开源中心要闻") { + item.cmsDocList.map((item) => { + allList.push(item); + }); + } + if (item.name === "开源中心活动") { + //要闻 + setFirstNews(item.cmsDocList[0]); + } + }); + allList.map((item, idx) => (item.num = idx + 1)); + let splitList = []; //五个一组 + let finalList = []; + let allPageNum = (allList.length - (allList.length % 5)) / 5; + let num = 0; + allList.map((item, idx) => { + if (num !== allPageNum) { + if (splitList.length < 5) { + splitList.push(item); + if (splitList.length === 5) { + finalList.push(splitList); + splitList = []; + num += 1; + } + } + } else { + splitList.push(item); + if (idx === allList.length - 1) { + finalList.push(splitList); + } + } + }); + setFocuseWorkList(finalList); + } + }, newsList); + function getDay() { + //获取日期数据 + const days = [ + "星期日", + "星期一", + "星期二", + "星期三", + "星期四", + "星期五", + "星期六", + ]; + let time = new Date(); + let year = time.getFullYear(); + let month = time.getMonth() + 1; + let day = time.getDate(); + let obj = { + month: month < 10 ? "0" + month : month.toString(), + day: day < 10 ? "0" + day : day.toString(), + week: days[time.getDay()], + lunar: getLunar(time), + }; + setCurrentMonth(`${year}年${month}月`); + setTimeObj(obj); + } + + return ( +
+
+
+
要闻概览:
+
Overview of important news
+
{currentMonth}
+
{firstNews.name}
+ +
+ +
+
{firstNews.summary}
+
+
重点工作:
+
Focus on work
+
+ + {focuseWorkList && focuseWorkList.length > 0 + ? focuseWorkList.map((page, idx) => { + return ( +
+ {page.map((item, index) => { + return ( +
+
+ {item.num} +
+
+ {item.summary} +
+
+ ); + })} +
+ ); + }) + : ""} +
+
+
+
+
+
+
+
+ +
可控开源创新中心
+
+ Controllable open source innovation center software factory work + situation +
+
+
软件工厂工作态势
+
+ +
+
+ ); +} +export default Home; diff --git a/src/forge/SoftwareFactory/components/Home/rightContent.jsx b/src/forge/SoftwareFactory/components/Home/rightContent.jsx new file mode 100644 index 00000000..2d829d41 --- /dev/null +++ b/src/forge/SoftwareFactory/components/Home/rightContent.jsx @@ -0,0 +1,114 @@ +import React, { useEffect, useState } from "react"; +import "slick-carousel/slick/slick.css"; +import "slick-carousel/slick/slick-theme.css"; +import Slider from "react-slick"; +import FirstPanel from "./firstPanel"; +import SecondPanel from "./secondPanel"; +import ThirdPanel from "./thirdPanel"; +import ForthPanel from "./forthPanel"; +import CenterPanel from "./centerPanel"; +import { todayWorkSituation, weekMonthWorkSituation } from "../../api"; +const setting = { + dots: false, + infinite: true, + speed: 2000, + slidesToShow: 1, + slidesToScroll: 1, + pauseOnDotsHover: false, + autoplaySpeed: Number(localStorage.getItem("pageLoopSpeed")) || 8000, + pauseOnFocus: false, + autoplay: true, + arrows: false, + fade: false, + pauseOnHover: false, + // prevArrow: , + // nextArrow: , + // afterChange: (index) => setTag(index), +}; +function RightContent(props) { + const { timeObj } = props; + const [dayMap, setDayMap] = useState({}); + const [weekMap, setWeekMap] = useState({}); + const [monthMap, setMonthMap] = useState({}); + const firstDayDom = React.useRef(null); + const firstweekDom = React.useRef(null); + const secondDayDom = React.useRef(null); + const secondWeekDom = React.useRef(null); + const thirdDayDom = React.useRef(null); + const thirdmonthDom = React.useRef(null); + const forthDayDom = React.useRef(null); + const forthmonthDom = React.useRef(null); + const centerDom = React.useRef(null); + + useEffect(() => { + getTodayData(); + getWeekData(); + getMonthData(); + const timer = setInterval(() => { + //5分钟更新一次 + getTodayData(); + getWeekData(); + getMonthData(); + }, Number(localStorage.getItem("apiTime")) || 300000); + return () => { + clearInterval(timer); + }; + }, []); + + function getTodayData() { + todayWorkSituation().then((res) => { + if (res.data.code === 200) { + setDayMap(res.data.data); + } + }); + } + + function getWeekData() { + weekMonthWorkSituation("week").then((res) => { + if (res.data.code === 200) { + setWeekMap(res.data.data); + } + }); + } + + function getMonthData() { + weekMonthWorkSituation("month").then((res) => { + if (res.data.code === 200) { + setMonthMap(res.data.data); + } + }); + } + return ( +
+ + {/*
page1
+
page2
+
page3
*/} +
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+ +
+
+
+ ); +} + +export default RightContent; diff --git a/src/forge/SoftwareFactory/components/Home/secondPanel.jsx b/src/forge/SoftwareFactory/components/Home/secondPanel.jsx new file mode 100644 index 00000000..f4955368 --- /dev/null +++ b/src/forge/SoftwareFactory/components/Home/secondPanel.jsx @@ -0,0 +1,69 @@ +import React, { useEffect, useState } from "react"; +import right from "../../img/right.png"; + +let secondPanelList1 = [ + { title: "任务最多项目", key:'taskMaxProject', isNUm: false, unit: "个" }, + { title: "任务最多个人",key:'taskMaxAssigner', isNUm: false, unit: "个" }, + { title: "缺陷最多项目",key:'bugMaxProject', isNUm: false, unit: "个" }, + { title: "缺陷最多个人",key:'bugMaxAssigner', isNUm: false, unit: "个" }, +]; + +let secondPanelList2 = [ + { title: "本周新增任务数",key:'yesterdayAddTask', isNUm: true, unit: "个" }, + { title: "本周新增缺陷数", key:'yesterdayAddBug',isNUm: true, unit: "个" }, + { title: "本周新增需求数",key:'yesterdayAddNeed', isNUm: true, unit: "个" }, + { title: "本周测试执行数", key:'yesterdayTestCase', isNUm: true, unit: "个" }, +]; + +function SecondPanel(props) { + const { cardPage,dayMap,weekMap } = props; + const [secondPanelList, setSecondPanelList] = useState([]); + useEffect(() => { + let list = cardPage === "1" ? secondPanelList1 : secondPanelList2; + setSecondPanelList(list); + }, []); + return ( +
+
+ {cardPage === "2" ? "本周新增工作" : "今日项目状态"} +
+
+
+
+ {secondPanelList.map((item, idx) => { + return ( +
+
+
+ +
{item.title}
+
+ {item.isNUm ? ( +
+ + {cardPage === "2" + ? weekMap[item.key] + : dayMap[item.key]} + + {item.unit} +
+ ) : ( +
+ {cardPage === "2" + ? weekMap[item.key] + : dayMap[item.key]} +
+ )} +
+
+
+ ); + })} +
+
+
+
+ ); +} + +export default SecondPanel; diff --git a/src/forge/SoftwareFactory/components/Home/thirdPanel.jsx b/src/forge/SoftwareFactory/components/Home/thirdPanel.jsx new file mode 100644 index 00000000..895d0fea --- /dev/null +++ b/src/forge/SoftwareFactory/components/Home/thirdPanel.jsx @@ -0,0 +1,67 @@ +import React, { useEffect, useState } from "react"; +import right from "../../img/right.png"; +let thirdPanelList1 = [ + { title: "昨日完结任务数", key:'yesterdayFinishTask', isNUm: true, unit: "个" }, + { title: "昨日关闭缺陷数", key:'yesterdayFinishBug', isNUm: true, unit: "个" }, + { title: "昨日需求评审数", key:'yesterdayFinishNeed', isNUm: true, unit: "个" }, + { title: "昨日最活跃项目", key:'zonePmsProjectMax', isNUm: false, unit: "个" }, +]; + +let thirdPanelList2 = [ + { title: "本月完结任务数", key:'yesterdayFinishTask', isNUm: true, unit: "个" }, + { title: "本月关闭缺陷数", key:'yesterdayFinishBug', isNUm: true, unit: "个" }, + { title: "本月需求评审数", key:'yesterdayFinishNeed', isNUm: true, unit: "个" }, + { title: "本月最活跃项目", key:'zonePmsProjectMax', isNUm: false, unit: "个" }, +]; +function ThirdPanel(props) { + const { cardPage,dayMap,monthMap } = props; + const [thirdPanelList, setThirdPanelList] = useState([]); + useEffect(() => { + let list = cardPage === "1" ? thirdPanelList1 : thirdPanelList2; + setThirdPanelList(list); + }, []); + return ( +
+
+
+
+ {thirdPanelList.map((item, idx) => { + return ( +
+
+
+ +
{item.title}
+
+ {item.isNUm ? ( +
+ + {cardPage === "2" + ? monthMap[item.key] + : dayMap[item.key]} + + {item.unit} +
+ ) : ( +
+ {cardPage === "2" + ? monthMap[item.key] + : dayMap[item.key]} +
+ )} +
+
+
+ ); + })} +
+
+
+
+ {cardPage === "2" ? "本月完结工作" : "昨日完结工作"} +
+
+ ); +} + +export default ThirdPanel; diff --git a/src/forge/SoftwareFactory/components/ProjectStatus/ProjectCard.jsx b/src/forge/SoftwareFactory/components/ProjectStatus/ProjectCard.jsx new file mode 100644 index 00000000..50408c8b --- /dev/null +++ b/src/forge/SoftwareFactory/components/ProjectStatus/ProjectCard.jsx @@ -0,0 +1,54 @@ +import React, { useEffect, useState } from "react"; +import { Route, Switch } from "react-router-dom"; +import { withRouter } from "react-router"; + +function ProjectCard(props) { + const {mgRight,shadow,dataMap} = props; + const [currentMonth, setCurrentMonth] = useState("2025年2月"); + + return ( +
+
{dataMap.projectName}
+
+
{dataMap.pmsEnterpriseName}
+
项目经理:{dataMap.projectAssigneeName}
+
+
+
+
项目需求数
+
{dataMap.needCount}
+
项目完成数
+
{dataMap.needFinishedCount}
+
+
+
项目任务数
+
{dataMap.taskCount}
+
任务完成数
+
{dataMap.taskFinishedCount}
+
+
+
项目迭代数
+
{dataMap.sprintCount}
+
已完成迭代数
+
{dataMap.sprintFinishedCount}
+
+
+
+
+
测试用例数
+
{dataMap.testCaseCount}
+
+
+
测试缺陷数
+
{dataMap.testBugCount}
+
+
+
待测试数
+
{dataMap.notExecTestCaseCount}
+
+
+ {shadow &&
} +
+ ); +} +export default ProjectCard; diff --git a/src/forge/SoftwareFactory/components/ProjectStatus/index.jsx b/src/forge/SoftwareFactory/components/ProjectStatus/index.jsx new file mode 100644 index 00000000..aa46fae9 --- /dev/null +++ b/src/forge/SoftwareFactory/components/ProjectStatus/index.jsx @@ -0,0 +1,100 @@ +import React, { useEffect, useState } from "react"; +import { Route, Switch } from "react-router-dom"; +import { withRouter } from "react-router"; +import centerBg from "../../img/center_title_bg.png"; +import "./index.scss"; +import ProjectCard from "./ProjectCard"; +import { projectSituation } from "../../api"; +function ProjectStatus(props) { + const {} = props; + const [projectList, setProjectList] = useState([]); + + const ProjectCardDom = React.useRef(null) + + + useEffect(() => { + getProjectList(); + //项目信息五分钟更新一次 + let timer = setInterval(()=>{ + getProjectList(); + }, Number(localStorage.getItem('apiTime')) || 300000) + return ()=>{ + clearInterval(timer) + } + + }, []); + + function getProjectList() { + projectSituation().then((res) => { + if (res.data.code === 200) { + let list = + res.data.data.length > 10 + ? res.data.data.slice(0, 10) + : res.data.data; + setProjectList(list); + } + }); + } + + function getShadowCls(idx) { + switch (idx) { + case 5: + return "shadow-left"; + case 6: + case 7: + case 8: + return "shadow-center"; + case 9: + return "shadow-right"; + default: + return '' + } + } + + return ( +
+
+
+ +
可控开源创新中心
+
+ Controllable open source innovation center software factory work + situation +
+
+
软件工厂工作态势
+
+
+
+
项目研发状态
+
+
+
+
+ {projectList.map((item, idx) => { + return ( + + ); + })} + + {/* + + + + + + + + */} +
+
+
+ ); +} +export default ProjectStatus; diff --git a/src/forge/SoftwareFactory/components/ProjectStatus/index.scss b/src/forge/SoftwareFactory/components/ProjectStatus/index.scss new file mode 100644 index 00000000..186beeb8 --- /dev/null +++ b/src/forge/SoftwareFactory/components/ProjectStatus/index.scss @@ -0,0 +1,215 @@ +.project-wrap { + width: 1920px; + height: 1080px; + overflow-x: scroll; + background-image: url(../../img/bj2.png); + background-size: 100% 100%; + display: flex; + flex-direction: column; + .project-head { + display: flex; + padding-top: 50px; + padding-left: 36px; + .center-title-wrap { + position: relative; + img { + width: 308px; + } + .center-title { + position: absolute; + color: #fff; + font-family: "shuheiTi"; + font-size: 28px; + line-height: 46px; + top: 0; + left: 28px; + letter-spacing: 3px; + } + .center-sub-title { + position: absolute; + font-family: FangSong; + color: #2648df; + font-size: 20px; + bottom: 0; + left: 60px; + width: 740px; + line-height: 20px; + } + } + .soft-title { + color: rgba(38, 72, 223, 1); + font-family: "shuheiTi"; + font-size: 52px; + align-items: flex-start; + line-height: 52px; + padding-left: 24px; + } + } + .project-sub-t-wrap { + padding-top: 20px; + display: flex; + justify-content: center; + .project-sub-t { + width: 350px; + height: 54px; + background-color: rgba(39, 133, 214, 0.17); + border-radius: 2px 24px 2px 24px; + .project-sub-inner { + width: 350px; + height: 48px; + line-height: 48px; + background: #2648df; + border-radius: 2px 24px 2px 24px; + text-align: center; + font-size: 27px; + font-family: "alibaba"; + color: #fff; + } + } + } + .project-bottom-wrap { + flex: 1; + padding-top: 11px; + background-image: url("../../img/bootm_bg.png"); + background-size: 100% auto; + background-repeat: no-repeat; + background-position: bottom; + .project-list-wrap { + display: flex; + flex-wrap: wrap; + padding: 0 35px; + .project-card-wrap { + .card-shadow { + position: absolute; + left: 0; + bottom: -62px; + height: 62px; + width: 354px; + // border-radius: 4px 4px 25px 4px; + } + .shadow-left{ + // width:calc( 354px - 180px); + // left: 180px; + bottom: -30px; + height: 30px; + opacity: 46%; + border-bottom-right-radius: 6px; + background: linear-gradient( + -90deg, + rgba(38, 72, 223, 0.19) 0%, + rgba(255, 255, 255, 0) 52% + ); + } + .shadow-center{ + background: linear-gradient( + 180deg, + rgba(38, 72, 223, 0.19) 0%, + rgba(255, 255, 255, 0) 52% + ); + } + .shadow-right{ + bottom: -30px; + height: 30px; + border-bottom-left-radius: 6px; + opacity: 46%; + background: linear-gradient( + 90deg, + rgba(38, 72, 223, 0.19) 0%, + rgba(255, 255, 255, 0) 52% + ); + } + position: relative; + width: 354px; + height: 353px; + background: linear-gradient(90.26deg, #2785d6 0.21%, #2648df 98.9%); + border-radius: 4px 25px 4px 4px; + margin-top: 20px; + padding: 0 15px; + .pro-title { + font-family: "alibaba"; + color: #f6d8b0; + font-size: 27px; + line-height: 27px; + text-align: center; + padding-top: 20px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + } + .pro-group { + display: flex; + width: 324px; + height: 30px; + display: flex; + justify-content: center; + align-items: center; + font-family: "alibabaReg"; + border-radius: 6px; + background: linear-gradient( + 91.3deg, + rgba(184, 198, 255, 0.22) 0%, + rgba(255, 255, 255, 0.22) 54.4%, + rgba(126, 149, 255, 0) 100%, + rgba(108, 135, 255, 0.31) 100% + ); + border: 1px solid rgba(255, 255, 255, 0.2); + color: rgba(255, 255, 255, 0.8); + margin-top: 15px; + } + .pro-center { + padding-top: 12px; + display: flex; + .pro-center-item { + width: 104px; + height: 155px; + background: linear-gradient(90.98deg, #ffffff 2.78%, #d4ebff 98.6%); + border-radius: 8px; + display: flex; + flex-direction: column; + align-items: center; + padding: 15px 0; + .pro-center-name { + font-family: "alibabaReg"; + color: #27254c; + font-size: 15px; + line-height: 21px; + height: 21px; + } + .pro-center-num { + font-family: "yousheTi"; + color: #2648df; + font-size: 32px; + line-height: 42px; + height: 42px; + } + } + } + .pro-bottom { + display: flex; + justify-content: space-between; + padding: 14px 9px 0; + .pro-bottom-item { + color: rgba(255, 255, 255, 0.8); + font-family: "alibabaReg"; + display: flex; + flex-direction: column; + align-items: center; + font-size: 15px; + .pro-bt-name { + line-height: 21px; + height: 21px; + } + .pro-bt-num { + font-family: "pangmen"; + font-size: 26px; + color: #fff; + line-height: 26px; + padding-top: 5px; + } + } + } + } + } + } +} diff --git a/src/forge/SoftwareFactory/fonts/AlimamaShuHeiTi-Bold.ttf b/src/forge/SoftwareFactory/fonts/AlimamaShuHeiTi-Bold.ttf new file mode 100644 index 00000000..ead0cf6b Binary files /dev/null and b/src/forge/SoftwareFactory/fonts/AlimamaShuHeiTi-Bold.ttf differ diff --git a/src/forge/SoftwareFactory/fonts/YouSheBiaoTiHei-2.ttf b/src/forge/SoftwareFactory/fonts/YouSheBiaoTiHei-2.ttf new file mode 100644 index 00000000..3729151a Binary files /dev/null and b/src/forge/SoftwareFactory/fonts/YouSheBiaoTiHei-2.ttf differ diff --git a/src/forge/SoftwareFactory/img/bj1.png b/src/forge/SoftwareFactory/img/bj1.png new file mode 100644 index 00000000..6d6c50f3 Binary files /dev/null and b/src/forge/SoftwareFactory/img/bj1.png differ diff --git a/src/forge/SoftwareFactory/img/bj2.png b/src/forge/SoftwareFactory/img/bj2.png new file mode 100644 index 00000000..837cff45 Binary files /dev/null and b/src/forge/SoftwareFactory/img/bj2.png differ diff --git a/src/forge/SoftwareFactory/img/bootm_bg.png b/src/forge/SoftwareFactory/img/bootm_bg.png new file mode 100644 index 00000000..f73ad5ae Binary files /dev/null and b/src/forge/SoftwareFactory/img/bootm_bg.png differ diff --git a/src/forge/SoftwareFactory/img/center_panel.png b/src/forge/SoftwareFactory/img/center_panel.png new file mode 100644 index 00000000..88b7c2d6 Binary files /dev/null and b/src/forge/SoftwareFactory/img/center_panel.png differ diff --git a/src/forge/SoftwareFactory/img/center_title_bg.png b/src/forge/SoftwareFactory/img/center_title_bg.png new file mode 100644 index 00000000..b9f75112 Binary files /dev/null and b/src/forge/SoftwareFactory/img/center_title_bg.png differ diff --git a/src/forge/SoftwareFactory/img/duoyun.png b/src/forge/SoftwareFactory/img/duoyun.png new file mode 100644 index 00000000..f192242b Binary files /dev/null and b/src/forge/SoftwareFactory/img/duoyun.png differ diff --git a/src/forge/SoftwareFactory/img/fengsu.png b/src/forge/SoftwareFactory/img/fengsu.png new file mode 100644 index 00000000..b3bfbffb Binary files /dev/null and b/src/forge/SoftwareFactory/img/fengsu.png differ diff --git a/src/forge/SoftwareFactory/img/first_panel.png b/src/forge/SoftwareFactory/img/first_panel.png new file mode 100644 index 00000000..80a1d8ed Binary files /dev/null and b/src/forge/SoftwareFactory/img/first_panel.png differ diff --git a/src/forge/SoftwareFactory/img/forth_panel.png b/src/forge/SoftwareFactory/img/forth_panel.png new file mode 100644 index 00000000..c28c15aa Binary files /dev/null and b/src/forge/SoftwareFactory/img/forth_panel.png differ diff --git a/src/forge/SoftwareFactory/img/leftBg.png b/src/forge/SoftwareFactory/img/leftBg.png new file mode 100644 index 00000000..92accbfe Binary files /dev/null and b/src/forge/SoftwareFactory/img/leftBg.png differ diff --git a/src/forge/SoftwareFactory/img/news_line.png b/src/forge/SoftwareFactory/img/news_line.png new file mode 100644 index 00000000..e4e3bd72 Binary files /dev/null and b/src/forge/SoftwareFactory/img/news_line.png differ diff --git a/src/forge/SoftwareFactory/img/next.png b/src/forge/SoftwareFactory/img/next.png new file mode 100644 index 00000000..341d6c97 Binary files /dev/null and b/src/forge/SoftwareFactory/img/next.png differ diff --git a/src/forge/SoftwareFactory/img/right.png b/src/forge/SoftwareFactory/img/right.png new file mode 100644 index 00000000..61e46887 Binary files /dev/null and b/src/forge/SoftwareFactory/img/right.png differ diff --git a/src/forge/SoftwareFactory/img/second_panel.png b/src/forge/SoftwareFactory/img/second_panel.png new file mode 100644 index 00000000..05e3a9eb Binary files /dev/null and b/src/forge/SoftwareFactory/img/second_panel.png differ diff --git a/src/forge/SoftwareFactory/img/shidu.png b/src/forge/SoftwareFactory/img/shidu.png new file mode 100644 index 00000000..8231d588 Binary files /dev/null and b/src/forge/SoftwareFactory/img/shidu.png differ diff --git a/src/forge/SoftwareFactory/img/third_panel.png b/src/forge/SoftwareFactory/img/third_panel.png new file mode 100644 index 00000000..6b2c28d4 Binary files /dev/null and b/src/forge/SoftwareFactory/img/third_panel.png differ diff --git a/src/forge/SoftwareFactory/img/ziwaixian.png b/src/forge/SoftwareFactory/img/ziwaixian.png new file mode 100644 index 00000000..8a037608 Binary files /dev/null and b/src/forge/SoftwareFactory/img/ziwaixian.png differ diff --git a/src/forge/SoftwareFactory/index.jsx b/src/forge/SoftwareFactory/index.jsx new file mode 100644 index 00000000..b7e279db --- /dev/null +++ b/src/forge/SoftwareFactory/index.jsx @@ -0,0 +1,90 @@ +import React ,{ useEffect , useState } from "react"; +import { SnackbarHOC } from "educoder"; +import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC"; +import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC"; +import { withRouter } from "react-router"; +import { ImageLayerOfCommentHOC } from "../../modules/page/layers/ImageLayerOfCommentHOC"; +import Home from './components/Home/index' +import ProjectStatus from './components/ProjectStatus/index' +import { getNewsAllList, getMainInfos } from '../Information/api'; +import next from "./img/next.png"; +import Slider from "react-slick"; +import './index.scss'; +const setting = { + dots: false, + infinite: true, + speed: 2000, + slidesToShow: 1, + slidesToScroll: 1, + pauseOnDotsHover: true, + autoplaySpeed: Number(localStorage.getItem('pageLoopSpeed')) || 30000, + // pauseOnFocus: false, + autoplay: true, + arrows: false, + pauseOnHover:false, + dotsClass:'fac-dots' +// prevArrow: , +// nextArrow: , + // afterChange: (index) => setTag(index), +}; + + + + +function Index(props){ + + const [id,setId] = useState(undefined) + const [newsList,setNewsList] = useState([]) + const homeDom = React.useRef(null) + const proDom = React.useRef(null) + useEffect(()=>{ + getId() + },[]) + + useEffect(()=>{ + let timer = null + if(id){ + getNewsList() + timer = setInterval(()=>{ + getNewsList() + },Number(localStorage.getItem('apiTime')) || 300000) + return () =>{ + clearInterval(timer) + } + } + },[id]) + + function getNewsList() { + getNewsAllList(id).then(result => { + if (result) { + let rows = result.data.rows; + setNewsList(rows); + } + }).catch(error => { }) + } + + function getId(){ + getMainInfos('xjykyzx').then(result=>{ + console.log('result', result) + if(result){ + let data = result.data.data; + if(data && data.id){ + setId(data.id); + } + } + }).catch(console.error()) + } + + return (
+ + + + +
) +} + +export default withRouter((CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(ImageLayerOfCommentHOC({ + imgSelector: ".imageLayerParent img, .imageLayerParent .imageTarget", + parentSelector: ".newContainer", + })(Index))))) + ); \ No newline at end of file diff --git a/src/forge/SoftwareFactory/index.scss b/src/forge/SoftwareFactory/index.scss new file mode 100644 index 00000000..8240529a --- /dev/null +++ b/src/forge/SoftwareFactory/index.scss @@ -0,0 +1,502 @@ +$yellow-color: rgba(246, 216, 176, 1); +$blue-color-light: rgba(39, 118, 217, 1); +.softFc-wrap { + .fac-dots { + position: absolute; + bottom: 60px; + display: block; + width: 100%; + padding: 0; + margin: 0; + list-style: none; + text-align: center; + + li { + position: relative; + display: inline-block; + width: 50px; + height:6px; + margin: 0 5px; + padding: 0; + background-color: #f00; + cursor: pointer; + button { + font-size: 0; + line-height: 0; + display: block; + width: 50px; + height: 6px; + padding: 5px; + cursor: pointer; + color: transparent; + border: 0; + outline: none; + background: transparent; + } + } + .slick-active{ + background-color: #0f0; + } + } + @font-face { + font-family: "shuheiTi"; + src: url("./fonts/AlimamaShuHeiTi-Bold.ttf"); + } + @font-face { + font-family: "yousheTi"; + src: url("./fonts/YouSheBiaoTiHei-2.ttf"); + } + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 99; + height: 100vh; + width: 100vw; + .home-wrap { + height: 100vh; + width: 100vw; + background-image: url(./img/bj1.png); + background-size: 100% 100%; + display: flex; + flex-direction: row; + .home-left { + width: 578px; + height: 100%; + background-image: url(./img/leftBg.png); + background-size: 100% 100%; + padding-left: 48px; + padding-top: 54px; + .slick-prev { + width: 74px; + height: 54px; + left: 0; + bottom: -58px !important; + top: auto; + transform: rotate(180deg); + } + .slick-next { + width: 74px; + height: 54px; + right: 0; + top: auto; + bottom: -86px !important; + // transform: rotate(180deg); + } + .left-title, + .left-subTitle { + color: $yellow-color; + } + .left-title { + font-family: "shuheiTi"; + font-size: 32px; + line-height: 32px; + } + .left-subTitle { + font-family: "FangSong"; + font-size: 20px; + line-height: 20px; + padding-top: 4px; + } + .news-wrap { + .news-month { + width: 108px; + height: 32px; + line-height: 32px; + border-radius: 16px; + text-align: center; + color: $blue-color-light; + font-family: "alibaba"; + background-color: $yellow-color; + font-size: 16px; + margin-top: 30px; + } + .news-content-title { + width: 414px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-family: "alibaba"; + color: #fff; + font-size: 21px; + line-height: 21px; + margin-top: 14px; + } + .news-line { + width: 385px; + height: 16px; + margin-top: 12px; + } + .news-pic-wrap { + margin-top: 5px; + width: 379px; + height: 205px; + background: linear-gradient( + 90.36deg, + rgba(238, 219, 181, 0.35) 1.9%, + rgba(246, 216, 176, 0) 99.81% + ); + border-radius: 8px; + padding: 6px; + .news-pic { + height: 192px; + width: 367px; + border-radius: 3px; + } + } + .news-content { + margin-top: 11px; + color: rgba(255, 255, 255, 0.8); + font-family: "alibabaReg"; + font-size: 18px; + height: 75px; + width: 390px; + line-height: 25px; + text-align: left; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; /* 限制显示的行数为3行 */ + overflow: hidden; + text-overflow: ellipsis; + font-weight: 400; + } + } + .point-work { + padding-top: 47px; + .point-work-wrap { + width: 380px; + .point-work-page { + padding-top: 21px; + .point-work-item { + margin-top: 27px; + display: flex; + height: 40px; + width: 380px; + background: linear-gradient( + 90.07deg, + rgba(238, 219, 181, 0.35) 1.77%, + rgba(246, 216, 176, 0) 99.99% + ); + border-radius: 8px; + .point-work-item-num { + width: 38px; + height: 40px; + line-height: 41px; + background: linear-gradient( + 180deg, + #f6d8b0 0%, + rgba(255, 255, 255, 0.32) 133.32% + ); + border-radius: 8px 8px 0px 8px; + color: rgba(38, 90, 220, 1); + text-align: center; + } + .point-work-item-content { + font-family: "alibabaReg"; + color: #fff; + font-size: 18px; + padding-left: 5px; + height: 40px; + line-height: 40px; + flex: 1; + flex-wrap: nowrap; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + } + } + } + .home-right { + flex: 1; + padding-left: 10px; + padding-top: 54px; + .right-head { + display: flex; + .center-title-wrap { + position: relative; + img { + width: 308px; + } + .center-title { + position: absolute; + color: #fff; + font-family: "shuheiTi"; + font-size: 28px; + line-height: 46px; + top: 0; + left: 28px; + letter-spacing: 3px; + } + .center-sub-title { + position: absolute; + font-family: FangSong; + color: #2648df; + font-size: 20px; + bottom: 0; + left: 60px; + width: 740px; + line-height: 20px; + } + } + .soft-title { + color: rgba(38, 72, 223, 1); + font-family: "shuheiTi"; + font-size: 52px; + align-items: flex-start; + line-height: 52px; + padding-left: 24px; + } + } + .right-content { + width: 100%; + height: 100%; + padding-top: 86px; + position: relative; + .panel-title { + width: 27px; + // height: 187px; + font-family: "shuheiTi"; + font-weight: 700; + color: #f6d8b0; + font-size: 27px; + line-height: 33px; + } + .top-section, + .bottom-section { + display: flex; + } + .first-panel, + .second-panel, + .third-panel, + .forth-panel { + width: 567px; + height: 337px; + background-size: 100%; + padding: 20px; + } + .top-section { + .first-panel { + background-image: url(./img/first_panel.png); + display: flex; + justify-content: flex-start; + .panel-title { + margin-left: 41px; + } + } + .second-panel { + background-image: url(./img/second_panel.png); + margin-left: 55px; + display: flex; + justify-content: flex-end; + .panel-title { + margin-right: 41px; + } + .white-panel-out { + display: flex; + justify-content: flex-end; + .white-panel-center { + display: flex; + justify-content: flex-end; + } + } + } + } + .bottom-section { + padding-top: 53px; + .third-panel { + background-image: url(./img/third_panel.png); + display: flex; + justify-content: flex-start; + align-items: flex-end; + .panel-title { + margin-left: 41px; + } + } + .forth-panel { + background-image: url(./img/forth_panel.png); + margin-left: 55px; + display: flex; + justify-content: flex-end; + align-items: flex-end; + .panel-title { + margin-right: 41px; + } + .white-panel-out { + display: flex; + justify-content: flex-end; + .white-panel-center { + display: flex; + justify-content: flex-end; + } + } + } + } + .white-panel-out { + width: 347px; + background-color: rgba(255, 255, 255, 0.2); + border-radius: 6px; + .white-panel-center { + width: 335px; + background-color: rgba(255, 255, 255, 0.5); + border-radius: 6px; + .white-panel-inner { + width: 323px; + height: 297px; + background-color: #fff; + border-radius: 6px; + padding: 20px; + .panel-item { + width: 100%; + .panel-item-content { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + padding: 14px 0 6px; + .panel-item-content-left { + display: flex; + align-items: center; + font-family: "alibaba"; + font-weight: 500; + color: #27254c; + font-size: 18px; + line-height: 18px; + img { + width: 15px; + height: 13px; + margin-right: 16px; + } + } + .panel-item-content-right-text{ + color: #2648df; + width: 120px; + text-align: right; + font-family: "yousheTi"; + font-size: 24px; + line-height: 36px; + height: 36px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .panel-item-content-right { + color: #2648df; + display: flex; + align-items: flex-end; + line-height: 36px; + height: 36px; + .panel-num { + font-family: "yousheTi"; + font-size: 36px; + line-height: 36px; + } + .panel-unit { + font-family: "alibaba"; + font-size: 13px; + line-height: 28px; + margin-left: 4px; + } + } + } + .panel-item-line { + height: 1px; + width: 100%; + background: linear-gradient( + 90.21deg, + #2648df 2.02%, + #f6d8b0 98.88% + ); + } + } + } + } + } + .center-panel { + position: absolute; + left: 50%; + top: 50%; + background-image: url(./img/center_panel.png); + background-size: 100%; + width: 402px; + height: 404px; + transform: translate(-50%, -50%); + margin-top: 43px; + margin-left: -68px; + display: flex; + flex-wrap: wrap; + .first-section, + .second-section, + .third-section, + .forth-section { + width: 50%; + height: 50%; + display: flex; + justify-content: center; + align-items: center; + color: #ffffff; + font-size: 16px; + font-family: "alibabaReg"; + .content { + display: flex; + flex-direction: column; + align-items: center; + } + img { + width: 32px; + } + } + .first-section { + .content { + margin-left: 26px; + margin-top: 26px; + } + } + .second-section { + .content { + margin-right: 26px; + margin-top: 26px; + } + } + .third-section { + .content { + margin-left: 26px; + margin-bottom: 26px; + } + } + .forth-section { + .content { + margin-right: 26px; + margin-bottom: 26px; + } + } + .center-section { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + display: flex; + flex-direction: column; + align-items: center; + color: #fff; + font-size: 13px; + font-family: "alibabaReg"; + + .month { + font-family: "shuheiTi"; + font-size: 32px; + line-height: 32px; + } + .date { + font-size: 19px; + line-height: 32px; + } + } + } + } + } + } +} diff --git a/src/forge/SoftwareFactory/utils.js b/src/forge/SoftwareFactory/utils.js new file mode 100644 index 00000000..4ab09ba7 --- /dev/null +++ b/src/forge/SoftwareFactory/utils.js @@ -0,0 +1,149 @@ +/** + * 获取某个日期的农历 + * @parmas {newDate} 日期 年-月-日 + */ + export const getLunar = function (newDate){ + + var nyear; + var nmonth; + var nday = -1; + var nwday; + var nhrs; + var nmin; + var nsec; + var newDate = newDate; + + var lmonth, lday, lleap; //农历参数 + + function Draw() { + NewTick(); + + //显示时间 + var s = nyear + '年' + nmonth + '月' + nday + '日 ' + '星期' + cweekday(nwday) + ' ' + shapetime(nhrs, nmin, nsec); + s += " 农历" + lmonth + "月" + lday; //农历 + var lunar_month_day=lmonth + "月" + lday; + return lunar_month_day; + } + + + function NewTick() { + var noww = newDate ? new Date(newDate) : new Date(); + if (noww.getDate() != nday) { + nyear = noww.getFullYear(); + nmonth = noww.getMonth() + 1; + nwday = noww.getDay(); + nday = noww.getDate(); + + getlunar(); //获取农历 + } + nhrs = noww.getHours(); + nmin = noww.getMinutes(); + nsec = noww.getSeconds(); + } + + + //辅助函数 + var hzWeek = new Array("日", "一", "二", "三", "四", "五", "六", "日"); + function cweekday(wday) { + return hzWeek[wday]; + } + function shapetime(vhrs, vmin, vsec) { + if (vsec <= 9) vsec = "0" + vsec; + if (vmin <= 9) vmin = "0" + vmin; + if (vhrs <= 9) vhrs = "0" + vhrs; + return vhrs + ":" + vmin + ":" + vsec + } + + //农历函数开始 + var lunarInfo = new Array(0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, //1990 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, 0x14b63); + function lYearDays(y) { + var i, sum = 348; + for (i = 0x8000; i > 0x8; i >>= 1) sum += (lunarInfo[y - 1900] & i) ? 1 : 0; + return (sum + leapDays(y)); + } + function leapDays(y) { + if (leapMonth(y)) return ((lunarInfo[y - 1900] & 0x10000) ? 30 : 29); + else return (0); + } + function leapMonth(y) { + return (lunarInfo[y - 1900] & 0xf); + } + function monthDays(y, m) { + return ((lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29); + } + function Lunar(y, m, d) { + var i, leap = 0, + temp = 0; + var offset = (Date.UTC(y, m, d) - Date.UTC(1900, 0, 31)) / 86400000; + for (i = 1900; i < 2050 && offset > 0; i++) { + temp = lYearDays(i); + offset -= temp; + } + if (offset < 0) { + offset += temp; + i--; + } + this.year = i; + leap = leapMonth(i); + this.isLeap = false; + for (i = 1; i < 13 && offset > 0; i++) { + if (leap > 0 && i == (leap + 1) && this.isLeap == false) {--i; + this.isLeap = true; + temp = leapDays(this.year); + } else { + temp = monthDays(this.year, i); + } + if (this.isLeap == true && i == (leap + 1)) this.isLeap = false; + offset -= temp; + } + if (offset == 0 && leap > 0 && i == leap + 1) if (this.isLeap) { + this.isLeap = false; + } else { + this.isLeap = true; --i; + } + if (offset < 0) { + offset += temp; --i; + } + this.month = i; + this.day = offset + 1; + } + var nStr1 = new Array('', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'); + var nStr2 = new Array('初', '十', '廿', '卅', '□'); + function GetcDay(d) { + var s; + switch (d) { + case 10: + s = '初十'; + break; + case 20: + s = '二十'; + break; + case 30: + s = '三十'; + break; + default: + s = nStr2[Math.floor(d / 10)]; + s += nStr1[d % 10]; + break; + } + return (s); + } + function GetcMon(m) { + if (m == 1) return '正'; + else return nStr1[m]; + } + function getlunar() { + var lObj = new Lunar(nyear, nmonth - 1, nday); + lmonth = GetcMon(lObj.month); + lday = GetcDay(lObj.day); + lleap = lObj.isLeap; + if (lleap == 1) { + lmonth = "闰" + lmonth; + } + } + //农历函数结束 + return Draw(); +} + + diff --git a/src/modules/tpm/TPMIndexHOC.js b/src/modules/tpm/TPMIndexHOC.js index 27e179a0..b6329db5 100644 --- a/src/modules/tpm/TPMIndexHOC.js +++ b/src/modules/tpm/TPMIndexHOC.js @@ -296,6 +296,7 @@ export function TPMIndexHOC(WrappedComponent) { }; let path =this.props.location.pathname; let pathCheck = path.indexOf("/zone")>-1 && path.indexOf("/newdetail")>-1 && isPhone(); + let notFullPage = !path.includes('softwareFactory') return (
{(!path || (path && !path.includes('glcc') )) && } @@ -318,7 +319,7 @@ export function TPMIndexHOC(WrappedComponent) { {...this.state} /> : ""} {npsModalVisible && {this.closeNpsModal()}} npsActionType={npsActionType} npsActionId={npsActionId}/>} - { !pathCheck &&
} + { !pathCheck && notFullPage &&
} @@ -332,7 +333,7 @@ export function TPMIndexHOC(WrappedComponent) { }
- {!pathCheck && } + {!pathCheck && notFullPage && !path.includes('softwareFactory') && } ); }