Compare commits

...

7 Commits

Author SHA1 Message Date
caishi 12779419fe banner图+首页文字内容 2021-04-10 11:42:39 +08:00
caishi ab78ffe84f 项目列表banner 2021-04-10 10:11:55 +08:00
caishi 1617626774 细节修改 2021-04-09 22:45:05 +08:00
caishi eb6ba8edb7 首页 2021-04-09 16:07:08 +08:00
caishi 3802182b5c 去掉悬浮的手册按钮 2021-04-09 13:58:13 +08:00
caishi 7237e42c94 forge项目暂时不显示命令行功能 2021-04-09 11:46:02 +08:00
caishi 48a6b9ac4f 新增一个首页,不要默认跳转到个人中心 2021-04-09 11:07:55 +08:00
25 changed files with 285 additions and 22 deletions

View File

@ -75,6 +75,10 @@ const EducoderLogin = Loadable({
loading: Loading, loading: Loading,
}) })
const Index = Loadable({
loader: () => import('./forge/Jupyter/Index'),
loading: Loading,
})
class App extends Component { class App extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
@ -263,7 +267,7 @@ class App extends Component {
<Route exact path="/" <Route exact path="/"
render={ render={
(props) => ( (props) => (
<Projects {...this.props} {...props} {...this.state}></Projects> <Index {...this.props} {...props} {...this.state}></Index>
) )
} }
/> />

View File

@ -38,6 +38,7 @@ export default ({
: p[0]; : p[0];
setStep(sub); setStep(sub);
setNav("0");
if (sub && sub.status !== "skipped") { if (sub && sub.status !== "skipped") {
getStep(pre.number, sub.number); getStep(pre.number, sub.number);
} }
@ -70,7 +71,7 @@ export default ({
return ( return (
<React.Fragment> <React.Fragment>
<Menu className="devopsNav" onClick={(e)=>{setNav(e.key)}} selectedKeys={[nav]} mode="horizontal"> <Menu className="devopsNav" onClick={(e)=>{setNav(e.key)}} selectedKeys={[nav]} mode="horizontal">
<Menu.Item key={'0'} value="0">文件</Menu.Item> <Menu.Item key={'0'} value="0">开发流水线</Menu.Item>
<Menu.Item key={'1'} value="1">命令行</Menu.Item> <Menu.Item key={'1'} value="1">命令行</Menu.Item>
</Menu> </Menu>
{ {

View File

@ -1,7 +1,17 @@
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
import XmlPanel from "./XmlPanel"; import XmlPanel from "./XmlPanel";
import mediator from "./mediator"; import mediator from "./mediator";
import axios from "axios";
//
// const defaulturl = `http://47.111.130.18:48088`;
const defaultValue = {
host: "106.75.231.63",
port: "2021",
ws_url: "wss://pre-webssh.educoder.net/ws",
username: "root",
secret: "Dron_123123",
};
function Index() { function Index() {
const [sshConfigData, setSshConfigData] = useState(undefined); const [sshConfigData, setSshConfigData] = useState(undefined);
@ -15,16 +25,17 @@ function Index() {
}, [sshConfigData]); }, [sshConfigData]);
// //
function init() {} function init() {
const url = `/ci/pipelines/ssh_server.json`;
axios.get(url).then(result=>{
if(result && result.data){
setSshConfigData({...result.data})
}
}).catch(error=>{})
}
return ( return (
<XmlPanel <XmlPanel
sshConfigData={{ sshConfigData={sshConfigData||{}}
host: "106.75.231.63",
port: "2021",
ws_url: "wss://pre-webssh.educoder.net/ws",
username: "root",
secret: "Dron_123123",
}}
sid={1} sid={1}
/> />
); );

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@ -6,7 +6,6 @@ import { withRouter } from "react-router";
import { SnackbarHOC } from "educoder"; import { SnackbarHOC } from "educoder";
import { CNotificationHOC } from "../modules/courses/common/CNotificationHOC"; import { CNotificationHOC } from "../modules/courses/common/CNotificationHOC";
import { TPMIndexHOC } from "../modules/tpm/TPMIndexHOC"; import { TPMIndexHOC } from "../modules/tpm/TPMIndexHOC";
import Handbook from './Component/Handbook';
import "./css/index.scss"; import "./css/index.scss";
import Loadable from "react-loadable"; import Loadable from "react-loadable";
@ -35,7 +34,6 @@ class Index extends Component {
render() { render() {
return ( return (
<div className="newMain clearfix"> <div className="newMain clearfix">
<Handbook />
<Switch {...this.props}> <Switch {...this.props}>
<Route <Route
path="/projects/:projectsType/new/:OIdentifier" path="/projects/:projectsType/new/:OIdentifier"
@ -67,7 +65,7 @@ class Index extends Component {
<ProjectIndex {...this.props} {...props} /> <ProjectIndex {...this.props} {...props} />
)} )}
></Route> ></Route>
<Route {/* <Route
exact exact
path="/" path="/"
render={(props) => ( render={(props) => (
@ -76,7 +74,7 @@ class Index extends Component {
: :
<ProjectIndex {...this.props} {...props} /> <ProjectIndex {...this.props} {...props} />
)} )}
></Route> ></Route> */}
</Switch> </Switch>
</div> </div>
); );

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

116
src/forge/Jupyter/Index.jsx Normal file
View File

@ -0,0 +1,116 @@
import React from "react";
import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC";
import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC";
import { SnackbarHOC } from "educoder";
import "./Index.scss";
import two from "./Images/2.png";
import three from "./Images/3-1.png";
import threesub from "./Images/3-2.png";
import arrow from "./Images/a.png";
import four1 from "./Images/4-1.png";
import four2 from "./Images/4-2.png";
import four3 from "./Images/4-3.png";
import four4 from "./Images/4-4.png";
import four5 from "./Images/4-5.png";
import four6 from "./Images/4-6.png";
import four7 from "./Images/4-7.png";
import four8 from "./Images/4-8.png";
function Index(props) {
return (
<div>
<div className="firstPanel">
<div className="firstPaneltxt">
<div>
<p>集协同开发资源共享运行评估于一体的在线科研服务平台</p>
<p>
Research Service Platform Integrating Collaborative Development, Resource Sharing and Runtime Evaluation Tools
</p>
</div>
</div>
</div>
<div className="doubleBox">
<img src={two} alt="" />
<div className="m-left infobox">
<div className="titleLeft">
<p>JupyterLab功能强大的新一代可视化科研环境</p>
</div>
<div className="desc">
JupyterLab是Jupyter Notebook的全面升级是一个集JupyterNotebook文本编辑器终端以及各种个性化组件于一体的全能科研IDE作为一种基于web的集成开发环境你可以使用它完成notebook编写终端操作markdown文本编辑交互模式启用csv文件及图片查看等科研活动
</div>
<a href="http://39.105.62.120:60088/lab?" target="_blank" className="btnBox" style={{width:'160px'}}>
<img src={arrow} alt="" style={{ marginRight: "5px" }} />
<span>试用</span>
</a>
</div>
</div>
<div className="doubleBox" style={{padding:'160px 0px 120px 0px'}}>
<div className="infobox">
<div className="titleLeft">
<p>基于网络的软件开发群体化方法</p>
<span>持续构建协同共享可信的软件创新生态</span>
</div>
<div className="desc">
将大众化协同开发开放式资源共享持续性可信评估为核心的互联网大规模协同机理与软件开发工程化方法相结合形成面向群体化方法的软件智能开发服务环境
</div>
<img src={threesub} alt="" style={{marginTop:"100px"}}/>
</div>
<div style={{marginLeft:"50px",marginBottom:"100px"}}>
<img src={three} alt="" />
<a href="http://47.111.130.18:48088/projects" target="_blank" className="btnBox" style={{marginLeft:"43px"}}>
<img src={arrow} alt="" />
<span>查看更多</span>
</a>
</div>
</div>
<div className="thirdPanel">
<p className="mainTitle">协作开发平台</p>
<p className="subTitle">为您提供了软件开发的一切</p>
<ul className="thirdbox">
<li>
<img src={four1} alt="" />
<p className="bt">项目管理</p>
<p className="bdesc">敏捷模式缩短交付周期提升产品质量和协作效率</p>
</li>
<li>
<img src={four2} alt="" />
<p className="bt">配置管理</p>
<p className="bdesc">代码在线托管服务跨地域协同开发便于代码合入审查</p>
</li>
<li>
<img src={four3} alt="" />
<p className="bt">流水线</p>
<p className="bdesc">业务流程按需制定全周期业务集成实时监控流水线状态</p>
</li>
<li>
<img src={four4} alt="" />
<p className="bt">镜像制作</p>
<p className="bdesc">为IT开发者营造活跃和开放的社区环境提供即时通讯</p>
</li>
<li>
<img src={four5} alt="" />
<p className="bt">编译构建</p>
<p className="bdesc">混合语言并行构建支持Maven/web/移动终端/loT应用</p>
</li>
<li>
<img src={four6} alt="" />
<p className="bt">实时交互</p>
<p className="bdesc">项目进程管理应用于研发管理任务分配目标跟踪等让项目</p>
</li>
<li>
<img src={four7} alt="" />
<p className="bt">JupyterLab</p>
<p className="bdesc">基于Sonar的代码静态分析工具及时发现代码中的潜在隐患</p>
</li>
<li>
<img src={four8} alt="" />
<p className="bt">部署</p>
<p className="bdesc">一键式快捷并行部署基础组件和应用到开发测试生产环境</p>
</li>
</ul>
</div>
</div>
);
}
export default CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(Index)));

View File

@ -0,0 +1,135 @@
.firstPanel{
position: relative;
background:url('./Images/1.png') center no-repeat;
height: 556px;
width: 100%;
.firstPaneltxt{
width: 1200px;
height: 100%;
align-items: center;
text-align: left;
display: flex;
margin:0px auto;
&>div{
margin-bottom: 100px;
p{
max-width: 600px;
color:#fff;
font-size: 22px;
line-height: 28px;
&:first-child{
font-size: 30px;
line-height: 50px;
margin-bottom: 30px!important;
max-width: 500px;
}
}
}
}
}
.doubleBox{
display: flex;
padding-top:130px;
align-items: center;
justify-content: center;
.infobox{
max-width: 550px;
}
.m-left{
margin-left: 100px;
}
.desc{
font-size: 18px;
color: #888;
line-height: 25px;
margin-top: 30px;
word-break: break-all;
}
.btnBox{
display: block;
justify-content: center;
display: flex;
align-items: center;
width: 220px;
height: 80px;
color: #1890FF;
font-size: 18px;
background: #FFFFFF;
box-shadow: -10px 0px 26px 0px rgba(45, 21, 130, 0.1);
border-radius: 40px;
margin-top: 60px;
}
}
.titleLeft{
position: relative;
padding-left: 30px;
p{
font-size: 24px;
color:#199aff;
line-height: 38px;
}
span{
color: #3a3a3a;
font-size: 18px;
line-height: 20px;
margin-top: 5px;
display: block;
}
&::before{
position: absolute;
left: 0px;
height: 100%;
width: 19px;
top:0px;
content: "";
background-color: #199aff;
}
}
.thirdPanel{
width: 1200px;
margin:100px auto 300px;
.mainTitle{
height: 48px;
font-size: 36px;
color: #333333;
line-height: 48px;
text-align: center;
}
.subTitle{
height: 20px;
font-size: 18px;
color: #666666;
line-height: 20px;
margin-top: 20px;
text-align: center;
}
.thirdbox{
display: flex;
flex-wrap: wrap;
margin-top: 50px;
li{
width: 22%;
margin:42px 1.5% ;
background: #FFFFFF;
box-shadow: 0px 0px 22px 0px rgba(45, 21, 130, 0.06);
border-radius: 20px;
padding:50px 30px;
&:hover{
box-shadow: 0px 0px 40px 0px rgba(24, 144, 255, 0.3);
}
.bt{
font-size: 24px;
color: #333333;
line-height: 26px;
margin-top:36px;
}
.bdesc{
font-size: 16px;
color: #666666;
line-height: 20px;
margin-top:20px;
}
}
}
}

View File

@ -75,7 +75,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
</li> </li>
:"" :""
} }
{ {/* {
item.menu_name === "resources" && item.menu_name === "resources" &&
<li className={pathname==="source" ? "active" : ""}> <li className={pathname==="source" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/source`, state }}> <Link to={{ pathname: `/projects/${owner}/${projectsId}/source`, state }}>
@ -84,7 +84,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
{projectDetail && projectDetail.source_count ? <span className="num">{projectDetail.source_count}</span> :""} {projectDetail && projectDetail.source_count ? <span className="num">{projectDetail.source_count}</span> :""}
</Link> </Link>
</li> </li>
} } */}
{ {
item.menu_name === "versions" && item.menu_name === "versions" &&
<li className={pathname==="milestones" ? "active" : ""}> <li className={pathname==="milestones" ? "active" : ""}>

View File

@ -6,7 +6,6 @@ import { withRouter } from "react-router";
import { SnackbarHOC } from "educoder"; import { SnackbarHOC } from "educoder";
import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC"; import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC";
import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC"; import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC";
import Handbook from '../Component/Handbook';
const Infos = Loadable({ const Infos = Loadable({
loader: () => import("./Infos"), loader: () => import("./Infos"),
loading: Loading, loading: Loading,
@ -15,7 +14,6 @@ export default withRouter(
(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC((props)=>{ (CNotificationHOC()(SnackbarHOC()(TPMIndexHOC((props)=>{
return( return(
<div> <div>
<Handbook />
<Switch> <Switch>
<Route <Route
path="/users/:username" path="/users/:username"

View File

@ -96,7 +96,7 @@ body>.-task-title {
} }
.newContainer { .newContainer {
background: #f5f5f5; background: #fff;
} }
.ant-modal-title { .ant-modal-title {

View File

@ -165,9 +165,9 @@ export function TPMIndexHOC(WrappedComponent) {
this.setState({ this.setState({
tpmLoading: false tpmLoading: false
}) })
if (this.props.match.path === "/" && response.data.login) { // if (this.props.match.path === "/" && response.data.login) {
this.props.history.push(`/users/${response.data.login}`); // this.props.history.push(`/users/${response.data.login}`);
} // }
if(response.data && response.data.login){ if(response.data && response.data.login){
if(response.data.need_edit_info){ if(response.data.need_edit_info){
this.setState({ this.setState({