Merge remote-tracking branch 'gitlink/gitlink_server' into gitlink_server
|
@ -3947,7 +3947,7 @@ html>body #ajax-indicator {
|
|||
}
|
||||
.head-nav {
|
||||
text-align: center;
|
||||
height: 70px;
|
||||
height: 58px;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
|
@ -3959,14 +3959,14 @@ html>body #ajax-indicator {
|
|||
position: absolute;
|
||||
top: 0px;
|
||||
z-index: 3;
|
||||
height: 70px;
|
||||
height: 58px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.head-nav ul#header-nav li {
|
||||
float: left;
|
||||
height: 70px;
|
||||
line-height: 70px;
|
||||
height: 58px;
|
||||
line-height: 58px;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
font-size: 16px;
|
||||
|
@ -3980,9 +3980,6 @@ html>body #ajax-indicator {
|
|||
color: #fff;
|
||||
font-size: 16px;
|
||||
}
|
||||
.head-right i{
|
||||
color: #fff!important;
|
||||
}
|
||||
|
||||
.head-nav ul#header-nav li a:hover,.head-nav ul#header-nav li.active a {
|
||||
color: #5091FF;
|
||||
|
@ -3992,10 +3989,6 @@ html>body #ajax-indicator {
|
|||
margin-right: 0px
|
||||
}
|
||||
|
||||
.head-nav ul#header-nav li.active{
|
||||
/* background-color: #3B3B3B; */
|
||||
}
|
||||
|
||||
|
||||
.head-nav ul#header-nav li p:hover {
|
||||
color: #cccccc;
|
||||
|
@ -6714,13 +6707,10 @@ p{
|
|||
right: 0px;
|
||||
top:4px;
|
||||
color: #999;
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
}
|
||||
.ant-input, .ant-input .ant-input-suffix{
|
||||
background-color: #fff!important;
|
||||
}
|
||||
.has-error .ant-input{
|
||||
background-color: #FEF1F0!important;
|
||||
>>>>>>> pre_develop
|
||||
}
|
826
src/App.js
|
@ -3,9 +3,9 @@ import './App.css';
|
|||
import { ConfigProvider } from 'antd'
|
||||
import zhCN from 'antd/lib/locale-provider/zh_CN';
|
||||
import {
|
||||
// BrowserRouter as Router,
|
||||
Route,
|
||||
Switch
|
||||
// BrowserRouter as Router,
|
||||
Route,
|
||||
Switch
|
||||
} from 'react-router-dom';
|
||||
import axios from 'axios';
|
||||
import LoginDialog from './modules/login/LoginDialog';
|
||||
|
@ -26,18 +26,18 @@ import configureStore from './redux/stores/configureStore';
|
|||
const store = configureStore();
|
||||
window.marked = marked;
|
||||
const theme = createMuiTheme({
|
||||
palette: {
|
||||
primary: {
|
||||
main: '#4CACFF',
|
||||
contrastText: 'rgba(255, 255, 255, 0.87)'
|
||||
},
|
||||
secondary: { main: '#4CACFF' }, // #11cb5f This is just green.A700 as hex.
|
||||
},
|
||||
palette: {
|
||||
primary: {
|
||||
main: '#4CACFF',
|
||||
contrastText: 'rgba(255, 255, 255, 0.87)'
|
||||
},
|
||||
secondary: { main: '#4CACFF' }, // #11cb5f This is just green.A700 as hex.
|
||||
},
|
||||
});
|
||||
//forge项目
|
||||
const Projects = Loadable({
|
||||
loader: () => import('./forge/Index'),
|
||||
loading: Loading,
|
||||
loader: () => import('./forge/Index'),
|
||||
loading: Loading,
|
||||
})
|
||||
// forge项目详情
|
||||
const ProjectDetail = Loadable({
|
||||
|
@ -46,55 +46,55 @@ const ProjectDetail = Loadable({
|
|||
});
|
||||
//forge安全设置
|
||||
const Security = Loadable({
|
||||
loader: () => import('./forge/SecuritySetting/Index'),
|
||||
loading: Loading,
|
||||
loader: () => import('./forge/SecuritySetting/Index'),
|
||||
loading: Loading,
|
||||
})
|
||||
//forge项目-devOps详情
|
||||
const OpsDetail = Loadable({
|
||||
loader: () => import('./forge/DevOps/opsDetail'),
|
||||
loading: Loading,
|
||||
loader: () => import('./forge/DevOps/opsDetail'),
|
||||
loading: Loading,
|
||||
})
|
||||
//403页面
|
||||
const Shixunauthority = Loadable({
|
||||
loader: () => import('./modules/403/Shixunauthority'),
|
||||
loading: Loading,
|
||||
loader: () => import('./modules/403/Shixunauthority'),
|
||||
loading: Loading,
|
||||
})
|
||||
//404页面
|
||||
const Shixunnopage = Loadable({
|
||||
loader: () => import('./modules/404/Shixunnopage'),
|
||||
loading: Loading,
|
||||
loader: () => import('./modules/404/Shixunnopage'),
|
||||
loading: Loading,
|
||||
})
|
||||
|
||||
//500页面
|
||||
const http500 = Loadable({
|
||||
loader: () => import('./modules/500/http500'),
|
||||
loading: Loading,
|
||||
loader: () => import('./modules/500/http500'),
|
||||
loading: Loading,
|
||||
})
|
||||
const InfosIndex = Loadable({
|
||||
loader: () => import('./forge/users/Index'),
|
||||
loading: Loading,
|
||||
loader: () => import('./forge/users/Index'),
|
||||
loading: Loading,
|
||||
})
|
||||
// 组织
|
||||
const OrganizeIndex = Loadable({
|
||||
loader: () => import('./forge/Team/Index'),
|
||||
loading: Loading,
|
||||
loader: () => import('./forge/Team/Index'),
|
||||
loading: Loading,
|
||||
})
|
||||
const EducoderLogin = Loadable({
|
||||
loader: () => import('./modules/login/EducoderLogin'),
|
||||
loading: Loading,
|
||||
loader: () => import('./modules/login/EducoderLogin'),
|
||||
loading: Loading,
|
||||
})
|
||||
const Search = Loadable({
|
||||
loader: () => import('./modules/search/'),
|
||||
loading: Loading,
|
||||
loader: () => import('./modules/search/'),
|
||||
loading: Loading,
|
||||
})
|
||||
const WikiPreview = Loadable({
|
||||
loader: () => import('./forge/Wiki/Preview'),
|
||||
loading: Loading,
|
||||
loader: () => import('./forge/Wiki/Preview'),
|
||||
loading: Loading,
|
||||
})
|
||||
|
||||
const ProjectIndex = Loadable({
|
||||
loader: () => import("./forge/Index"),
|
||||
loading: Loading,
|
||||
loader: () => import("./forge/Index"),
|
||||
loading: Loading,
|
||||
});
|
||||
|
||||
const Home = Loadable({
|
||||
|
@ -110,411 +110,411 @@ const Home = 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"];
|
||||
|
||||
class App extends Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
Addcoursestype: false,
|
||||
Addcoursestypes: false,
|
||||
mydisplay: false,
|
||||
occupation: 0,
|
||||
mygetHelmetapi: null,
|
||||
pathType: null,
|
||||
pathName: null,
|
||||
}
|
||||
}
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
Addcoursestype: false,
|
||||
Addcoursestypes: false,
|
||||
mydisplay: false,
|
||||
occupation: 0,
|
||||
mygetHelmetapi: null,
|
||||
pathType: null,
|
||||
pathName: null,
|
||||
}
|
||||
}
|
||||
|
||||
UNSAFE_componentWillMount() {
|
||||
initAxiosInterceptors(this.props);
|
||||
let pathname = window.location.pathname ? window.location.pathname.split('/')[1] : '';
|
||||
pathname && this.getPathnameType(pathname);
|
||||
UNSAFE_componentWillMount() {
|
||||
initAxiosInterceptors(this.props);
|
||||
let pathname = window.location.pathname ? window.location.pathname.split('/')[1] : '';
|
||||
pathname && this.getPathnameType(pathname);
|
||||
|
||||
// 添加路由监听,决定组织还是个人
|
||||
this.unlisten = this.props.history.listen((location) => {
|
||||
let newPathname = location.pathname.split('/')[1];
|
||||
if (this.state.pathName !== newPathname) {
|
||||
// this.setState({ pathType: '' });
|
||||
newPathname && this.getPathnameType(newPathname);
|
||||
}
|
||||
});
|
||||
}
|
||||
// 添加路由监听,决定组织还是个人
|
||||
this.unlisten = this.props.history.listen((location) => {
|
||||
let newPathname = location.pathname.split('/')[1];
|
||||
if (this.state.pathName !== newPathname) {
|
||||
// this.setState({ pathType: '' });
|
||||
newPathname && this.getPathnameType(newPathname);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
shouldComponentUpdate(nextProps, nextState) {
|
||||
// (!keyWord.includes(this.props.location.pathname.split('/')[1])) &&
|
||||
if (nextProps.location.pathname.split('/')[1] !== this.props.location.pathname.split('/')[1] && nextState.pathType === this.state.pathType) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
shouldComponentUpdate(nextProps, nextState) {
|
||||
// (!keyWord.includes(this.props.location.pathname.split('/')[1])) &&
|
||||
if (nextProps.location.pathname.split('/')[1] !== this.props.location.pathname.split('/')[1] && nextState.pathType === this.state.pathType) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
getPathnameType = (pathname) => {
|
||||
if (!keyWord.includes(pathname)) {
|
||||
let url = `/owners/${pathname}.json`;
|
||||
axios.get(url).then((response) => {
|
||||
if (response && response.status === 200) {
|
||||
this.setState({
|
||||
pathType: response.data.type || '404',
|
||||
pathName: pathname,
|
||||
})
|
||||
}
|
||||
});
|
||||
}else{
|
||||
this.setState({
|
||||
pathType: pathname,
|
||||
pathName: pathname,
|
||||
});
|
||||
}
|
||||
}
|
||||
getPathnameType = (pathname) => {
|
||||
if (!keyWord.includes(pathname)) {
|
||||
let url = `/owners/${pathname}.json`;
|
||||
axios.get(url).then((response) => {
|
||||
if (response && response.status === 200) {
|
||||
this.setState({
|
||||
pathType: response.data.type || '404',
|
||||
pathName: pathname,
|
||||
})
|
||||
}
|
||||
});
|
||||
}else{
|
||||
this.setState({
|
||||
pathType: pathname,
|
||||
pathName: pathname,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
HideAddcoursestypess = (i) => {
|
||||
this.setState({
|
||||
Addcoursestype: false,
|
||||
Addcoursestypes: false,
|
||||
mydisplay: true,
|
||||
occupation: i,
|
||||
})
|
||||
};
|
||||
hideAddcoursestypes = () => {
|
||||
this.setState({
|
||||
Addcoursestypes: false
|
||||
})
|
||||
};
|
||||
HideAddcoursestypess = (i) => {
|
||||
this.setState({
|
||||
Addcoursestype: false,
|
||||
Addcoursestypes: false,
|
||||
mydisplay: true,
|
||||
occupation: i,
|
||||
})
|
||||
};
|
||||
hideAddcoursestypes = () => {
|
||||
this.setState({
|
||||
Addcoursestypes: false
|
||||
})
|
||||
};
|
||||
|
||||
componentDidMount() {
|
||||
document.title = "loading...";
|
||||
componentDidMount() {
|
||||
document.title = "loading...";
|
||||
|
||||
this.getAppdata();
|
||||
this.getAppdata();
|
||||
|
||||
window.addEventListener('error', (event) => {
|
||||
const msg = `${event.type}: ${event.message}`;
|
||||
});
|
||||
window.addEventListener('error', (event) => {
|
||||
const msg = `${event.type}: ${event.message}`;
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
this.unlisten && this.unlisten(); // 执行解绑
|
||||
}
|
||||
componentWillUnmount() {
|
||||
this.unlisten && this.unlisten(); // 执行解绑
|
||||
}
|
||||
|
||||
//修改登录方法
|
||||
Modifyloginvalue = () => {
|
||||
this.setState({
|
||||
isRender: false,
|
||||
})
|
||||
};
|
||||
//修改登录方法
|
||||
Modifyloginvalue = () => {
|
||||
this.setState({
|
||||
isRender: false,
|
||||
})
|
||||
};
|
||||
|
||||
//获取数据为空的时候
|
||||
gettablogourlnull = () => {
|
||||
this.setState({
|
||||
mygetHelmetapi: undefined
|
||||
});
|
||||
document.title = "Forge";
|
||||
var link = document.createElement('link'),
|
||||
oldLink = document.getElementById('dynamic-favicon');
|
||||
link.id = 'dynamic-favicon';
|
||||
link.rel = 'shortcut icon';
|
||||
link.href = "/react/build/./favicon.ico";
|
||||
if (oldLink) {
|
||||
document.head.removeChild(oldLink);
|
||||
}
|
||||
document.head.appendChild(link);
|
||||
};
|
||||
//获取数据为空的时候
|
||||
gettablogourlnull = () => {
|
||||
this.setState({
|
||||
mygetHelmetapi: undefined
|
||||
});
|
||||
document.title = "Forge";
|
||||
var link = document.createElement('link'),
|
||||
oldLink = document.getElementById('dynamic-favicon');
|
||||
link.id = 'dynamic-favicon';
|
||||
link.rel = 'shortcut icon';
|
||||
link.href = "/react/build/./favicon.ico";
|
||||
if (oldLink) {
|
||||
document.head.removeChild(oldLink);
|
||||
}
|
||||
document.head.appendChild(link);
|
||||
};
|
||||
|
||||
//获取数据的时候
|
||||
gettablogourldata = (response) => {
|
||||
document.title = response.data.setting.name;
|
||||
var link = document.createElement('link'),
|
||||
oldLink = document.getElementById('dynamic-favicon');
|
||||
link.id = 'dynamic-favicon';
|
||||
link.rel = 'shortcut icon';
|
||||
link.href = '/' + response.data.setting.tab_logo_url;
|
||||
if (oldLink) {
|
||||
document.head.removeChild(oldLink);
|
||||
}
|
||||
document.head.appendChild(link);
|
||||
}
|
||||
//获取当前定制信息
|
||||
getAppdata = () => {
|
||||
let url = "/setting.json";
|
||||
axios.get(url).then((response) => {
|
||||
if (response) {
|
||||
if (response.data) {
|
||||
this.setState({
|
||||
mygetHelmetapi: response.data.setting
|
||||
});
|
||||
//存储配置到游览器
|
||||
localStorage.setItem('chromesetting', JSON.stringify(response.data.setting));
|
||||
localStorage.setItem('chromesettingresponse', JSON.stringify(response));
|
||||
try {
|
||||
if (response.data.setting.tab_logo_url) {
|
||||
this.gettablogourldata(response);
|
||||
} else {
|
||||
this.gettablogourlnull();
|
||||
}
|
||||
} catch (e) {
|
||||
this.gettablogourlnull();
|
||||
}
|
||||
} else {
|
||||
this.gettablogourlnull();
|
||||
}
|
||||
} else {
|
||||
this.gettablogourlnull();
|
||||
}
|
||||
}).catch((error) => {
|
||||
this.gettablogourlnull();
|
||||
});
|
||||
};
|
||||
//获取数据的时候
|
||||
gettablogourldata = (response) => {
|
||||
document.title = response.data.setting.name;
|
||||
var link = document.createElement('link'),
|
||||
oldLink = document.getElementById('dynamic-favicon');
|
||||
link.id = 'dynamic-favicon';
|
||||
link.rel = 'shortcut icon';
|
||||
link.href = '/' + response.data.setting.tab_logo_url;
|
||||
if (oldLink) {
|
||||
document.head.removeChild(oldLink);
|
||||
}
|
||||
document.head.appendChild(link);
|
||||
}
|
||||
//获取当前定制信息
|
||||
getAppdata = () => {
|
||||
let url = "/setting.json";
|
||||
axios.get(url).then((response) => {
|
||||
if (response) {
|
||||
if (response.data) {
|
||||
this.setState({
|
||||
mygetHelmetapi: response.data.setting
|
||||
});
|
||||
//存储配置到游览器
|
||||
localStorage.setItem('chromesetting', JSON.stringify(response.data.setting));
|
||||
localStorage.setItem('chromesettingresponse', JSON.stringify(response));
|
||||
try {
|
||||
if (response.data.setting.tab_logo_url) {
|
||||
this.gettablogourldata(response);
|
||||
} else {
|
||||
this.gettablogourlnull();
|
||||
}
|
||||
} catch (e) {
|
||||
this.gettablogourlnull();
|
||||
}
|
||||
} else {
|
||||
this.gettablogourlnull();
|
||||
}
|
||||
} else {
|
||||
this.gettablogourlnull();
|
||||
}
|
||||
}).catch((error) => {
|
||||
this.gettablogourlnull();
|
||||
});
|
||||
};
|
||||
|
||||
render() {
|
||||
const { mygetHelmetapi, pathType} = this.state;
|
||||
let personal = mygetHelmetapi && mygetHelmetapi.personal;
|
||||
return (
|
||||
<Provider store={store}>
|
||||
<ConfigProvider locale={zhCN}>
|
||||
<MuiThemeProvider theme={theme}>
|
||||
<LoginDialog {...this.props} {...this.state} Modifyloginvalue={() => this.Modifyloginvalue()}></LoginDialog>
|
||||
<SiderBar />
|
||||
{/* <Router> */}
|
||||
<Switch>
|
||||
{/* wiki预览 */}
|
||||
<Route path="/:owner/:projectsId/wiki/preview/:projectName/:projectId" render={
|
||||
(props) => {
|
||||
return (<WikiPreview {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
} />
|
||||
render() {
|
||||
const { mygetHelmetapi, pathType} = this.state;
|
||||
let personal = mygetHelmetapi && mygetHelmetapi.personal;
|
||||
return (
|
||||
<Provider store={store}>
|
||||
<ConfigProvider locale={zhCN}>
|
||||
<MuiThemeProvider theme={theme}>
|
||||
<LoginDialog {...this.props} {...this.state} Modifyloginvalue={() => this.Modifyloginvalue()}></LoginDialog>
|
||||
<SiderBar />
|
||||
{/* <Router> */}
|
||||
<Switch>
|
||||
{/* wiki预览 */}
|
||||
<Route path="/:owner/:projectsId/wiki/preview/:projectName/:projectId" render={
|
||||
(props) => {
|
||||
return (<WikiPreview {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
} />
|
||||
|
||||
{/* 项目PR */}
|
||||
<Route path="/:owner/:projectsId/compare"
|
||||
render={
|
||||
(props) => (<ProjectDetail {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
></Route>
|
||||
{/* 项目PR */}
|
||||
<Route path="/:owner/:projectsId/compare"
|
||||
render={
|
||||
(props) => (<ProjectDetail {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
></Route>
|
||||
|
||||
{/*项目*/}
|
||||
<Route
|
||||
path={"/:owner/:projectId/devops/:opsId/detail"}
|
||||
render={
|
||||
(props) => {
|
||||
return (<OpsDetail {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
}>
|
||||
</Route>
|
||||
<Route
|
||||
path={"/settings"}
|
||||
render={
|
||||
(props) => {
|
||||
return (<Security {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
}>
|
||||
</Route>
|
||||
{/*项目*/}
|
||||
<Route
|
||||
path={"/:owner/:projectId/devops/:opsId/detail"}
|
||||
render={
|
||||
(props) => {
|
||||
return (<OpsDetail {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
}>
|
||||
</Route>
|
||||
<Route
|
||||
path={"/settings"}
|
||||
render={
|
||||
(props) => {
|
||||
return (<Security {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
}>
|
||||
</Route>
|
||||
|
||||
<Route
|
||||
path="/register"
|
||||
render={
|
||||
(props) => {
|
||||
return (<EducoderLogin {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
}
|
||||
/>
|
||||
{/*403*/}
|
||||
<Route path="/403" component={Shixunauthority} />
|
||||
<Route
|
||||
path="/register"
|
||||
render={
|
||||
(props) => {
|
||||
return (<EducoderLogin {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
}
|
||||
/>
|
||||
{/*403*/}
|
||||
<Route path="/403" component={Shixunauthority} />
|
||||
|
||||
<Route path="/500" component={http500} />
|
||||
<Route path="/500" component={http500} />
|
||||
|
||||
{/*404*/}
|
||||
<Route path="/nopage" component={Shixunnopage} />
|
||||
{/*404*/}
|
||||
<Route path="/nopage" component={Shixunnopage} />
|
||||
|
||||
{/* 查询 */}
|
||||
<Route path="/search" component={Search} />
|
||||
{/* 查询 */}
|
||||
<Route path="/search" component={Search} />
|
||||
|
||||
<Route exact path="/explore/all"
|
||||
render={
|
||||
(props) => (
|
||||
<ProjectIndex {...this.props} {...props} />
|
||||
)
|
||||
}
|
||||
/>
|
||||
<Route exact path="/explore"
|
||||
render={
|
||||
(props) => (
|
||||
<ProjectIndex {...this.props} {...props} />
|
||||
)
|
||||
}
|
||||
/>
|
||||
<Route exact path="/explore/all"
|
||||
render={
|
||||
(props) => (
|
||||
<ProjectIndex {...this.props} {...props} />
|
||||
)
|
||||
}
|
||||
/>
|
||||
<Route exact path="/explore"
|
||||
render={
|
||||
(props) => (
|
||||
<ProjectIndex {...this.props} {...props} />
|
||||
)
|
||||
}
|
||||
/>
|
||||
|
||||
{/* 组织 */}
|
||||
<Route path={"/organize"}
|
||||
render={
|
||||
(props) => {
|
||||
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
|
||||
}
|
||||
}>
|
||||
</Route>
|
||||
|
||||
{/*新建项目等*/}
|
||||
<Route
|
||||
path={"/projects"}
|
||||
render={
|
||||
(props) => {
|
||||
return (<Projects {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
}>
|
||||
</Route>
|
||||
|
||||
{/* 判断为用户/组织,并进入对应页面 */}
|
||||
{
|
||||
pathType === 'User' ?
|
||||
<Route exact path="/:username"
|
||||
render={
|
||||
(props) => {
|
||||
return (<InfosIndex {...this.props} {...this.state} />)
|
||||
}
|
||||
}
|
||||
/> : pathType === 'Organization' ? <Route path={"/:OIdentifier"}
|
||||
render={
|
||||
(props) => {
|
||||
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
|
||||
}
|
||||
}>
|
||||
</Route> : pathType === '404' ? <Route component={Shixunnopage} />:
|
||||
""
|
||||
}
|
||||
<Route exact path="/"
|
||||
render={
|
||||
(props) => (
|
||||
<Home {...props} {...this.props} {...this.state}/>
|
||||
)
|
||||
}
|
||||
/>
|
||||
|
||||
{/* 个人主页 */}
|
||||
<Route path="/:username"
|
||||
render={
|
||||
(props) => {
|
||||
return (<InfosIndex {...this.props} {...this.state} />)
|
||||
}
|
||||
}></Route>
|
||||
|
||||
|
||||
{/* 组织 */}
|
||||
<Route path={"/organize"}
|
||||
render={
|
||||
(props) => {
|
||||
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
|
||||
}
|
||||
}>
|
||||
</Route>
|
||||
|
||||
{/*新建项目等*/}
|
||||
<Route
|
||||
path={"/projects"}
|
||||
render={
|
||||
(props) => {
|
||||
return (<Projects {...this.props} {...props} {...this.state} />)
|
||||
}
|
||||
}>
|
||||
</Route>
|
||||
|
||||
{/* 判断为用户/组织,并进入对应页面 */}
|
||||
{
|
||||
pathType === 'User' ?
|
||||
<Route exact path="/:username"
|
||||
render={
|
||||
(props) => {
|
||||
return (<InfosIndex {...this.props} {...this.state} />)
|
||||
}
|
||||
}
|
||||
/> : pathType === 'Organization' ? <Route path={"/:OIdentifier"}
|
||||
render={
|
||||
(props) => {
|
||||
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
|
||||
}
|
||||
}>
|
||||
</Route> : pathType === '404' ? <Route component={Shixunnopage} />:
|
||||
""
|
||||
}
|
||||
<Route exact path="/"
|
||||
render={
|
||||
(props) => (
|
||||
<Home {...props} {...this.props} {...this.state}/>
|
||||
)
|
||||
}
|
||||
/>
|
||||
|
||||
{/* 个人主页 */}
|
||||
<Route path="/:username"
|
||||
render={
|
||||
(props) => {
|
||||
return (<InfosIndex {...this.props} {...this.state} />)
|
||||
}
|
||||
}></Route>
|
||||
|
||||
|
||||
<Route component={Shixunnopage} />
|
||||
</Switch>
|
||||
{/* </Router> */}
|
||||
</MuiThemeProvider>
|
||||
</ConfigProvider>
|
||||
</Provider>
|
||||
);
|
||||
}
|
||||
<Route component={Shixunnopage} />
|
||||
</Switch>
|
||||
{/* </Router> */}
|
||||
</MuiThemeProvider>
|
||||
</ConfigProvider>
|
||||
</Provider>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// moment国际化,设置为中文
|
||||
moment.defineLocale('zh-cn', {
|
||||
months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
|
||||
monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
|
||||
weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
|
||||
weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
|
||||
weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
|
||||
longDateFormat: {
|
||||
LT: 'Ah点mm分',
|
||||
LTS: 'Ah点m分s秒',
|
||||
L: 'YYYY-MM-DD',
|
||||
LL: 'YYYY年MMMD日',
|
||||
LLL: 'YYYY年MMMD日Ah点mm分',
|
||||
LLLL: 'YYYY年MMMD日ddddAh点mm分',
|
||||
l: 'YYYY-MM-DD',
|
||||
ll: 'YYYY年MMMD日',
|
||||
lll: 'YYYY年MMMD日Ah点mm分',
|
||||
llll: 'YYYY年MMMD日ddddAh点mm分'
|
||||
},
|
||||
meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
|
||||
meridiemHour: function (hour, meridiem) {
|
||||
if (hour === 12) {
|
||||
hour = 0;
|
||||
}
|
||||
if (meridiem === '凌晨' || meridiem === '早上' ||
|
||||
meridiem === '上午') {
|
||||
return hour;
|
||||
} else if (meridiem === '下午' || meridiem === '晚上') {
|
||||
return hour + 12;
|
||||
} else {
|
||||
// '中午'
|
||||
return hour >= 11 ? hour : hour + 12;
|
||||
}
|
||||
},
|
||||
meridiem: function (hour, minute, isLower) {
|
||||
var hm = hour * 100 + minute;
|
||||
if (hm < 600) {
|
||||
return '凌晨';
|
||||
} else if (hm < 900) {
|
||||
return '早上';
|
||||
} else if (hm < 1130) {
|
||||
return '上午';
|
||||
} else if (hm < 1230) {
|
||||
return '中午';
|
||||
} else if (hm < 1800) {
|
||||
return '下午';
|
||||
} else {
|
||||
return '晚上';
|
||||
}
|
||||
},
|
||||
calendar: {
|
||||
sameDay: function () {
|
||||
return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
|
||||
},
|
||||
nextDay: function () {
|
||||
return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
|
||||
},
|
||||
lastDay: function () {
|
||||
return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
|
||||
},
|
||||
nextWeek: function () {
|
||||
var startOfWeek, prefix;
|
||||
startOfWeek = moment().startOf('week');
|
||||
prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
|
||||
return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
|
||||
},
|
||||
lastWeek: function () {
|
||||
var startOfWeek, prefix;
|
||||
startOfWeek = moment().startOf('week');
|
||||
prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
|
||||
return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
|
||||
},
|
||||
sameElse: 'LL'
|
||||
},
|
||||
ordinalParse: /\d{1,2}(日|月|周)/,
|
||||
ordinal: function (number, period) {
|
||||
switch (period) {
|
||||
case 'd':
|
||||
case 'D':
|
||||
case 'DDD':
|
||||
return number + '日';
|
||||
case 'M':
|
||||
return number + '月';
|
||||
case 'w':
|
||||
case 'W':
|
||||
return number + '周';
|
||||
default:
|
||||
return number;
|
||||
}
|
||||
},
|
||||
relativeTime: {
|
||||
future: '%s内',
|
||||
past: '%s前',
|
||||
s: '几秒',
|
||||
m: '1分钟',
|
||||
mm: '%d分钟',
|
||||
h: '1小时',
|
||||
hh: '%d小时',
|
||||
d: '1天',
|
||||
dd: '%d天',
|
||||
M: '1个月',
|
||||
MM: '%d个月',
|
||||
y: '1年',
|
||||
yy: '%d年'
|
||||
},
|
||||
week: {
|
||||
// GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
|
||||
dow: 1, // Monday is the first day of the week.
|
||||
doy: 4 // The week that contains Jan 4th is the first week of the year.
|
||||
}
|
||||
months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
|
||||
monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
|
||||
weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
|
||||
weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
|
||||
weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
|
||||
longDateFormat: {
|
||||
LT: 'Ah点mm分',
|
||||
LTS: 'Ah点m分s秒',
|
||||
L: 'YYYY-MM-DD',
|
||||
LL: 'YYYY年MMMD日',
|
||||
LLL: 'YYYY年MMMD日Ah点mm分',
|
||||
LLLL: 'YYYY年MMMD日ddddAh点mm分',
|
||||
l: 'YYYY-MM-DD',
|
||||
ll: 'YYYY年MMMD日',
|
||||
lll: 'YYYY年MMMD日Ah点mm分',
|
||||
llll: 'YYYY年MMMD日ddddAh点mm分'
|
||||
},
|
||||
meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
|
||||
meridiemHour: function (hour, meridiem) {
|
||||
if (hour === 12) {
|
||||
hour = 0;
|
||||
}
|
||||
if (meridiem === '凌晨' || meridiem === '早上' ||
|
||||
meridiem === '上午') {
|
||||
return hour;
|
||||
} else if (meridiem === '下午' || meridiem === '晚上') {
|
||||
return hour + 12;
|
||||
} else {
|
||||
// '中午'
|
||||
return hour >= 11 ? hour : hour + 12;
|
||||
}
|
||||
},
|
||||
meridiem: function (hour, minute, isLower) {
|
||||
var hm = hour * 100 + minute;
|
||||
if (hm < 600) {
|
||||
return '凌晨';
|
||||
} else if (hm < 900) {
|
||||
return '早上';
|
||||
} else if (hm < 1130) {
|
||||
return '上午';
|
||||
} else if (hm < 1230) {
|
||||
return '中午';
|
||||
} else if (hm < 1800) {
|
||||
return '下午';
|
||||
} else {
|
||||
return '晚上';
|
||||
}
|
||||
},
|
||||
calendar: {
|
||||
sameDay: function () {
|
||||
return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
|
||||
},
|
||||
nextDay: function () {
|
||||
return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
|
||||
},
|
||||
lastDay: function () {
|
||||
return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
|
||||
},
|
||||
nextWeek: function () {
|
||||
var startOfWeek, prefix;
|
||||
startOfWeek = moment().startOf('week');
|
||||
prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
|
||||
return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
|
||||
},
|
||||
lastWeek: function () {
|
||||
var startOfWeek, prefix;
|
||||
startOfWeek = moment().startOf('week');
|
||||
prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
|
||||
return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
|
||||
},
|
||||
sameElse: 'LL'
|
||||
},
|
||||
ordinalParse: /\d{1,2}(日|月|周)/,
|
||||
ordinal: function (number, period) {
|
||||
switch (period) {
|
||||
case 'd':
|
||||
case 'D':
|
||||
case 'DDD':
|
||||
return number + '日';
|
||||
case 'M':
|
||||
return number + '月';
|
||||
case 'w':
|
||||
case 'W':
|
||||
return number + '周';
|
||||
default:
|
||||
return number;
|
||||
}
|
||||
},
|
||||
relativeTime: {
|
||||
future: '%s内',
|
||||
past: '%s前',
|
||||
s: '几秒',
|
||||
m: '1分钟',
|
||||
mm: '%d分钟',
|
||||
h: '1小时',
|
||||
hh: '%d小时',
|
||||
d: '1天',
|
||||
dd: '%d天',
|
||||
M: '1个月',
|
||||
MM: '%d个月',
|
||||
y: '1年',
|
||||
yy: '%d年'
|
||||
},
|
||||
week: {
|
||||
// GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
|
||||
dow: 1, // Monday is the first day of the week.
|
||||
doy: 4 // The week that contains Jan 4th is the first week of the year.
|
||||
}
|
||||
});
|
||||
export default SnackbarHOC()(App);
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ export default ({history}) => {
|
|||
/>
|
||||
</div>
|
||||
:
|
||||
<i className="iconfont icon-sousuo font-18 ml30" onClick={() => {
|
||||
<i className="iconfont icon-sousuo font-18 ml30" style={{color:"#a5a5a5"}} onClick={() => {
|
||||
setOpenSearch(true)
|
||||
}} />
|
||||
}
|
||||
|
|
|
@ -3,25 +3,40 @@ import { Modal , Button } from 'antd';
|
|||
import './Index.scss';
|
||||
import '../../css/index.scss';
|
||||
import RenderHtml from '../../../components/render-html';
|
||||
import cookie from 'react-cookies';
|
||||
// import cookie from 'react-cookies';
|
||||
import axios from 'axios';
|
||||
|
||||
function SystemNotice({system_notification,history}){
|
||||
function SystemNotice({showNotice,system_notification,history,login,hideSystemNotice}){
|
||||
const [ visible , setVisible ] = useState(false);
|
||||
|
||||
useEffect(()=>{
|
||||
if(system_notification && !cookie.load('notice_stage')){
|
||||
if(system_notification && !system_notification.is_read && showNotice && login){
|
||||
setVisible(true);
|
||||
}
|
||||
},[system_notification,history.location])
|
||||
},[system_notification])
|
||||
|
||||
function sureContinue() {
|
||||
cookie.remove('notice_stage');
|
||||
if(login && ( system_notification && system_notification.id )){
|
||||
const url = `/users/${login}/system_notification_histories.json`;
|
||||
axios.post(url,{
|
||||
system_notification_id:system_notification.id
|
||||
}).then(result=>{
|
||||
if(result){
|
||||
setVisible(false);
|
||||
hideSystemNotice();
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}else{
|
||||
setVisible(false);
|
||||
hideSystemNotice();
|
||||
}
|
||||
// cookie.remove('notice_stage');
|
||||
|
||||
let inFifteenMinutes = new Date(new Date().getTime() + 24 * 3600 * 1000);//一天
|
||||
// let inFifteenMinutes = new Date(new Date().getTime() + 60 * 1000);//一分钟
|
||||
cookie.save('notice_stage', true,{ expires: inFifteenMinutes,path:"/" });
|
||||
// let inFifteenMinutes = new Date(new Date().getTime() + 24 * 3600 * 1000);//一天
|
||||
// // let inFifteenMinutes = new Date(new Date().getTime() + 60 * 1000);//一分钟
|
||||
// cookie.save('notice_stage', true,{ expires: inFifteenMinutes,path:"/" });
|
||||
|
||||
setVisible(false);
|
||||
// setVisible(false);
|
||||
}
|
||||
|
||||
return (
|
||||
|
|
|
@ -18,7 +18,9 @@ function Footer(){
|
|||
}
|
||||
|
||||
return(
|
||||
value && showhtml(value)
|
||||
<div>
|
||||
{value && showhtml(value)}
|
||||
</div>
|
||||
// {/* <div className="footEdition">
|
||||
// <div className="footContent">
|
||||
// <ul className="center">
|
||||
|
|
|
@ -279,7 +279,7 @@ class NewHeader extends Component {
|
|||
};
|
||||
|
||||
render() {
|
||||
const { match ,resetUserInfo ,showNotification} = this.props;
|
||||
const { match ,resetUserInfo ,showNotification,publicNav} = this.props;
|
||||
let current_user = this.props.user;
|
||||
let {
|
||||
AccountProfiletype,
|
||||
|
@ -368,7 +368,7 @@ class NewHeader extends Component {
|
|||
|
||||
let search_url = settings && settings.common && settings.common.search;
|
||||
return (
|
||||
<div className="newHeaders" id="nHeader">
|
||||
<div className={publicNav ? `newHeaders publicNav`:`newHeaders`} id="nHeader">
|
||||
<div className="headerContent">
|
||||
{isRender === true ?
|
||||
<LoginDialog
|
||||
|
@ -433,7 +433,8 @@ class NewHeader extends Component {
|
|||
{
|
||||
current_user && (current_user.main_site || current_user.login) && (settings && settings.add && settings.add.length>0)?
|
||||
<Dropdown overlay={this.addMenu(settings && settings.add)} placement="bottomRight">
|
||||
<i className="iconfont icon-tianjiafangda ml30 mr15"></i>
|
||||
{/* <i className="iconfont icon-tianjiafangda ml30 mr15"></i> */}
|
||||
<img src={require(`./img/add.png`)} alt="" width="16px" className="mr15 ml30"/>
|
||||
</Dropdown>:""
|
||||
}
|
||||
|
||||
|
@ -448,7 +449,8 @@ class NewHeader extends Component {
|
|||
>
|
||||
<Link to={"/settings/notice"} className="message-icon">
|
||||
{current_user && <Badge count={current_user.message_unread_total}>
|
||||
<i className="iconfont icon-xiaoxilingdang ml15 mr15"></i>
|
||||
{/* <i className="iconfont icon-xiaoxilingdang ml15 mr15"></i> */}
|
||||
<img src={require(`./img/ring.png`)} alt="" width="16px" className="ml15 mr15"/>
|
||||
</Badge>}
|
||||
</Link>
|
||||
</Popover>
|
||||
|
|
|
@ -315,24 +315,32 @@
|
|||
line-height: 25px;
|
||||
margin-bottom: 20px!important;
|
||||
}
|
||||
&.theline{
|
||||
display: flex;
|
||||
}
|
||||
.theline{
|
||||
.imgCon{
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
padding:5px;
|
||||
border-radius: 4px;
|
||||
background-color: #fff;
|
||||
img{
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
width: 100%;
|
||||
border-radius: 3px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.copyrightDesc{
|
||||
font-size: 12px;
|
||||
font-weight: 400;
|
||||
color: #BDC2D1;
|
||||
line-height: 28px;
|
||||
padding:15px 0px;
|
||||
text-align: center;
|
||||
background-color: #1B212C;
|
||||
}
|
||||
.copyrightDesc{
|
||||
font-size: 12px;
|
||||
font-weight: 400;
|
||||
color: #BDC2D1;
|
||||
line-height: 28px;
|
||||
padding:15px 0px;
|
||||
text-align: center;
|
||||
background-color: #1B212C;
|
||||
a{
|
||||
color: #BDC2D1!important;
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 749 B |
After Width: | Height: | Size: 615 B |
|
@ -27,12 +27,6 @@ const ProjectHome = Loadable({
|
|||
loading: Loading,
|
||||
});
|
||||
|
||||
// 项目详情放在用户和组织下作为二级菜单存在
|
||||
// const ProjectDetail = Loadable({
|
||||
// loader: () => import("./Main/Detail"),
|
||||
// loading: Loading,
|
||||
// });
|
||||
|
||||
class Index extends Component {
|
||||
|
||||
componentDidUpdate = () => {
|
||||
|
|
|
@ -328,7 +328,7 @@ function CoderDepot(props){
|
|||
function okUpdate(d,w,l){
|
||||
const url = `/${owner}/${projectsId}.json`;
|
||||
axios.put(url,{
|
||||
description:d,website:w,lesson_url:l
|
||||
description:d,website:w || "",lesson_url:l||""
|
||||
}).then(result=>{
|
||||
if(result && result.data && result.data.id){
|
||||
setDesc(result.data.description);
|
||||
|
|
Before Width: | Height: | Size: 240 KiB After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 1.2 KiB |
|
@ -74,7 +74,7 @@ function Index() {
|
|||
<div className="leftLists">
|
||||
<div className="leftTitles">
|
||||
<span>开源项目</span>
|
||||
<Link to={`/explore/all`}>更多<i className="iconfont icon-triangle font-12"></i></Link>
|
||||
<Link to={`/explore/all`} target="_blank">更多<i className="iconfont icon-triangle font-12"></i></Link>
|
||||
</div>
|
||||
<Spin spinning={isSpin}>
|
||||
<div style={{minHeight:"400px"}}>
|
||||
|
@ -85,10 +85,10 @@ function Index() {
|
|||
projectsList.map((i,k)=>{
|
||||
return(
|
||||
<li>
|
||||
<Link to={`/${i.author && i.author.login}`}><img src={getImageUrl(`/${i.author && i.author.image_url}`)} alt="" /></Link>
|
||||
<Link to={`/${i.author && i.author.login}`} target="_blank"><img src={getImageUrl(`/${i.author && i.author.image_url}`)} alt="" /></Link>
|
||||
<div className="itemTitle">
|
||||
<div className="item-title-infos">
|
||||
<Link to={`/${i.author && i.author.login}/${i.identifier}`} className="infotitle">{i.author && i.author.name}/{i.name}</Link>
|
||||
<Link to={`/${i.author && i.author.login}/${i.identifier}`} target="_blank" className="infotitle task-hide">{i.author && i.author.name}/{i.name}</Link>
|
||||
{i.praises_count > 0 ? <span><i className="iconfont icon-dianzan11 mr3 font-16"></i>{i.praises_count}</span> :"" }
|
||||
{i.forked_count > 0 ? <span><i className="iconfont icon-fork2 mr3 font-13"></i>{i.forked_count}</span>:""}
|
||||
</div>
|
||||
|
@ -113,9 +113,12 @@ function Index() {
|
|||
}
|
||||
</div>
|
||||
</Spin>
|
||||
<div className="left-bottom-btn">
|
||||
<Link to={`/explore/all`}>查看更多开源项目<img src={more} alt="" /></Link>
|
||||
</div>
|
||||
{
|
||||
projectsList && projectsList.length > 0 &&
|
||||
<div className="left-bottom-btn">
|
||||
<Link to={`/explore/all`} target="_blank">查看更多开源项目<img src={more} alt="" /></Link>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<SubList />
|
||||
|
|
|
@ -318,7 +318,6 @@
|
|||
background: url('../img/index/typebg.png');
|
||||
background-size: 100% 100%;
|
||||
box-shadow: 0px 0px 4px 5px rgba(0, 0, 0, 0.02);
|
||||
padding:12px 0px;
|
||||
a{
|
||||
padding:0px 20px;
|
||||
height: 44px;
|
||||
|
@ -386,6 +385,7 @@
|
|||
font-weight: 600;
|
||||
line-height: 21px;
|
||||
color: #333!important;
|
||||
max-width: 458px;
|
||||
&:hover{
|
||||
color: #466AFF!important;
|
||||
}
|
||||
|
@ -413,7 +413,7 @@
|
|||
height: 20px;
|
||||
line-height: 20px;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
align-items: center;
|
||||
.category{
|
||||
position: relative;
|
||||
padding-left: 11px;
|
||||
|
@ -439,7 +439,7 @@
|
|||
height: 10px;
|
||||
border-radius: 50%;
|
||||
border-left: 1px solid #9e9e9e;
|
||||
bottom: 4px;
|
||||
bottom: 5px;
|
||||
left: 0px;
|
||||
}
|
||||
}
|
||||
|
@ -539,11 +539,11 @@
|
|||
}
|
||||
.sInfos{
|
||||
background: #F7F8F9;
|
||||
padding:5px;
|
||||
padding:0px 5px;
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
color: #666666;
|
||||
line-height: 22px;
|
||||
line-height: 24px;
|
||||
word-break: break-all;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import { getImageUrl } from 'educoder';
|
|||
import Eye from '../img/index/eye.png';
|
||||
import Data from '../img/index/data.png';
|
||||
import Earth from '../img/index/earth.png';
|
||||
import Imgs from '../img/tree.png';
|
||||
import axios from 'axios';
|
||||
|
||||
// const list =[
|
||||
|
@ -51,8 +50,8 @@ function SubBanner() {
|
|||
return(
|
||||
<div className="banners">
|
||||
<div className="bannersCenter">
|
||||
<p className="bTitle"><span>新一代开源创新服务平台</span></p>
|
||||
<p className="bSubTitle">Gitlink(确实开源)-CCF官网指定的产学研融合面向软件开源创新的开源社区</p>
|
||||
<p className="bTitle"><span>GitLink 确实开源</span></p>
|
||||
<p className="bSubTitle">新一代开发创新服务平台 让你的创意在这里释放</p>
|
||||
<div className="bannerBox">
|
||||
{
|
||||
list && list.length > 0 ?
|
||||
|
|
|
@ -56,11 +56,11 @@ function SubList() {
|
|||
return(
|
||||
<li>
|
||||
<div>
|
||||
<Link to={`/${i.login}`}><img src={getImageUrl(`/${i.avatar_url}`)} alt=""/></Link>
|
||||
<Link target="_blank" to={`/${i.login}`}><img src={getImageUrl(`/${i.avatar_url}`)} alt=""/></Link>
|
||||
<div>
|
||||
<Link to={`/${i.login}`} className="font-15">{i.name}</Link>
|
||||
<Link target="_blank" to={`/${i.login}`} className="font-15">{i.name}</Link>
|
||||
<p className="task-hide" style={{maxWidth:"260px"}}>
|
||||
<Link to={`/${i.login}/${i.project && i.project.identifier}`}><i className="iconfont icon-daimakuicon1 font-14 mr8"></i>{i.project && i.project.name}</Link>
|
||||
<Link target="_blank" to={`/${i.login}/${i.project && i.project.identifier}`}><i className="iconfont icon-daimakuicon1 font-14 mr8"></i>{i.project && i.project.name}</Link>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -84,7 +84,7 @@ function SubList() {
|
|||
<li>
|
||||
<div className="mInfos">
|
||||
<span className="num">{k+1}</span>
|
||||
<Link to={`/${i.owner && i.owner.login}/${i.identifier}`} className="name task-hide">{i.owner && i.owner.name}/{i.name}</Link>
|
||||
<Link target="_blank" to={`/${i.owner && i.owner.login}/${i.identifier}`} className="name task-hide">{i.owner && i.owner.name}/{i.name}</Link>
|
||||
<span>
|
||||
<i className="iconfont icon-dianzan11 font-16 mr4"></i>{i.praises}
|
||||
</span>
|
||||
|
@ -113,7 +113,7 @@ function SubList() {
|
|||
<li>
|
||||
<div className="mInfos">
|
||||
<span className="num">{k+1}</span>
|
||||
<Link to={`/${i.owner && i.owner.login}/${i.identifier}`} className="name task-hide">{i.owner && i.owner.name}/{i.name}</Link>
|
||||
<Link target="_blank" to={`/${i.owner && i.owner.login}/${i.identifier}`} className="name task-hide">{i.owner && i.owner.name}/{i.name}</Link>
|
||||
<span>
|
||||
<i className="iconfont icon-dianzan11 font-16 mr4"></i>{i.praises}
|
||||
</span>
|
||||
|
|
|
@ -289,7 +289,8 @@ class Index extends Component {
|
|||
let second = first.split('.')[0];
|
||||
if(!second)return;
|
||||
this.props.form.setFieldsValue({
|
||||
repository_name:second
|
||||
repository_name:second,
|
||||
name:second
|
||||
})
|
||||
}else{
|
||||
this.props.form.setFieldsValue({
|
||||
|
|
|
@ -181,7 +181,7 @@ export default Form.create()(
|
|||
)}
|
||||
<p>选择头像:</p>
|
||||
<UploadImage url={getImageUrl(`/${image}`)} getImage={getImage}/>
|
||||
<Button type={"primary"} onClick={updateDetail}>更新仓库设置</Button>
|
||||
<Button type={"primary"} onClick={updateDetail}>更新组织设置</Button>
|
||||
</Form>
|
||||
</Div>
|
||||
</WhiteBack>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import React , { useEffect } from 'react';
|
||||
import Slider from 'react-slick';
|
||||
import Beijing from './Img/unit/beijing.png';
|
||||
import SHJT from './Img/unit/SHJT.png';
|
||||
import DD from './Img/unit/DD.png';
|
||||
|
@ -22,6 +23,9 @@ import LSLM from './Img/unit/LSLM.png';
|
|||
import TG from './Img/unit/TG.png';
|
||||
import LC from './Img/unit/LC.png';
|
||||
import YKD from './Img/unit/YKD.png';
|
||||
import Axios from 'axios';
|
||||
import { useState } from 'react';
|
||||
import { getImageUrl } from 'educoder';
|
||||
|
||||
const list = [
|
||||
{image_url:GFKJ, name:"国防科技大学",src:"https://www.nudt.edu.cn/"},
|
||||
|
@ -45,26 +49,40 @@ const list = [
|
|||
{image_url:LC, name:"浪潮",src:"https://cloud.inspur.com/"},
|
||||
{image_url:YKD, name:"ucloud",src:"https://www.ucloud.cn/"}
|
||||
]
|
||||
// const settings = {
|
||||
// dots: false,
|
||||
// infinite: true,
|
||||
// slidesToShow: 6,
|
||||
// slidesToScroll: 1,
|
||||
// autoplay: true,
|
||||
// speed: 2000,
|
||||
// autoplaySpeed: 2000,
|
||||
// cssEase: "linear",
|
||||
// rows:2,
|
||||
// arrows:false
|
||||
// };
|
||||
|
||||
const settings = {
|
||||
dots: false,
|
||||
infinite: true,
|
||||
slidesToShow: 1,
|
||||
slidesToScroll: 1,
|
||||
vertical: true,
|
||||
verticalSwiping: true,
|
||||
autoplay:true,
|
||||
arrows:false
|
||||
};
|
||||
function FifthEdition() {
|
||||
const [ topics ,setTopics ] = useState(undefined);
|
||||
|
||||
useEffect(()=>{
|
||||
if(list.length>10){
|
||||
Init();
|
||||
}
|
||||
// if(list.length>10){
|
||||
// Init();
|
||||
// }
|
||||
getUnit();
|
||||
},[])
|
||||
|
||||
function getUnit(){
|
||||
const url =`/topics.json`;
|
||||
Axios.get(url,{params:{
|
||||
topic_type:"cooperator",
|
||||
limit:20,
|
||||
group_size:5
|
||||
}}).then(result=>{
|
||||
if(result){
|
||||
setTopics(result.data.topics);
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
|
||||
function Init() {
|
||||
let box = document.getElementById('scrollBox1');
|
||||
scrollUp();
|
||||
|
@ -94,12 +112,12 @@ function FifthEdition() {
|
|||
|
||||
return(
|
||||
<div id={"scrollBox1"}>
|
||||
<div style={{width:370*list.length+"px"}}>
|
||||
{/* <div style={{width:370*list.length+"px"}}>
|
||||
<ul className="fifthList" id="box1" style={{width:(370*list.length)/2+"px"}}>
|
||||
{
|
||||
list && list.map((i,k)=>{
|
||||
return(
|
||||
<li><a href={i.src}><img src={i.image_url} alt={i.name}/></a></li>
|
||||
<li><a href={i.src} target="_blank"><img src={i.image_url} alt={i.name}/></a></li>
|
||||
)
|
||||
})
|
||||
}
|
||||
|
@ -109,28 +127,34 @@ function FifthEdition() {
|
|||
{
|
||||
list && list.map((i,k)=>{
|
||||
return(
|
||||
<li><a href={i.src}><img src={i.image_url} alt={i.name}/></a></li>
|
||||
<li><a href={i.src} target="_blank"><img src={i.image_url} alt={i.name}/></a></li>
|
||||
)
|
||||
})
|
||||
}
|
||||
</ul>
|
||||
}
|
||||
</div>
|
||||
{/* <Slider {...settings} className="footSlider">
|
||||
{
|
||||
list && list.map((i,k)=>{
|
||||
return(
|
||||
<li><Link to={i.src}><img src={i.image_url} alt={i.name}/></Link></li>
|
||||
)
|
||||
})
|
||||
}
|
||||
{list.length > 10 && list && list.map((i,k)=>{
|
||||
return(
|
||||
<li><Link to={i.src}><img src={i.image_url} alt={i.name}/></Link></li>
|
||||
)
|
||||
})
|
||||
}
|
||||
</Slider> */}
|
||||
</div> */}
|
||||
{
|
||||
topics && topics.length>0 ?
|
||||
<Slider {...settings} className="unitMainSlider">
|
||||
{
|
||||
topics.map((i,k)=>{
|
||||
return(
|
||||
<div className="slickMainline">
|
||||
{
|
||||
i.map((j,k1)=>{
|
||||
return(
|
||||
<a href={j.url} target="_blank"><img src={getImageUrl(j.image)} alt=""/></a>
|
||||
)
|
||||
})
|
||||
}
|
||||
</div>
|
||||
)
|
||||
})
|
||||
}
|
||||
</Slider>
|
||||
:""
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 769 KiB After Width: | Height: | Size: 730 KiB |
Before Width: | Height: | Size: 428 KiB After Width: | Height: | Size: 414 KiB |
Before Width: | Height: | Size: 458 KiB After Width: | Height: | Size: 461 KiB |
Before Width: | Height: | Size: 914 KiB After Width: | Height: | Size: 877 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 114 KiB |
|
@ -1,6 +1,5 @@
|
|||
import React , { useEffect , useState } from 'react';
|
||||
import "./Index.scss";
|
||||
import HeadNav from './Headnav';
|
||||
import TopEdition from './TopEdition';
|
||||
import ThirdEdition from './ThirdEdition';
|
||||
import { Anchor } from 'antd';
|
||||
|
@ -10,21 +9,37 @@ import F43 from './Img/4-3.png';
|
|||
import F44 from './Img/4-4.png';
|
||||
import SecondEdition from './SecondEdition';
|
||||
import FifthEdition from './FifthEdition';
|
||||
import Footnav from './Footnav';
|
||||
import { TPMIndexHOC } from '../modules/tpm/TPMIndexHOC';
|
||||
import Axios from 'axios';
|
||||
|
||||
function Index(props) {
|
||||
const [ value , setValue ] = useState("");
|
||||
const [ flag , setFlag ] = useState(true);
|
||||
const [ isRender , setIsRender ] = useState(false);
|
||||
const [ isloginCancel , setIsloginCancel ] = useState(false);
|
||||
|
||||
const [ bannerTab , setBannerTab ] = useState(undefined);
|
||||
const register = props && props.mygetHelmetapi && props.mygetHelmetapi.common && props.mygetHelmetapi.common.register;
|
||||
|
||||
const { current_user } = props;
|
||||
useEffect(()=>{
|
||||
window.addEventListener("scroll",scrollListener);
|
||||
getTab();
|
||||
},[])
|
||||
|
||||
function getTab() {
|
||||
const url = `/topics.json?topic_type=card`;
|
||||
Axios.get(url,{
|
||||
params:{
|
||||
limit:3
|
||||
}
|
||||
}).then(result=>{
|
||||
if(result){
|
||||
setBannerTab(result.data.topics);
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
|
||||
function scrollListener(event) {
|
||||
|
||||
let third = document.getElementById("thirdContent").offsetTop;
|
||||
let top = document.documentElement.scrollTop + 60;
|
||||
if(top>= third)
|
||||
|
@ -50,29 +65,47 @@ function Index(props) {
|
|||
return(
|
||||
<div className="homePage">
|
||||
<div className="topEdition">
|
||||
<HeadNav {...props}/>
|
||||
<TopEdition register={register}/>
|
||||
<ul className="topEditionUl">
|
||||
<a href="https://forum.trustie.net/forums/4666/detail" target="_blank" className="font-18">
|
||||
<li>
|
||||
CCF开源发展委员会首批执行委员名单发布
|
||||
</li>
|
||||
</a>
|
||||
<a href="https://forgeplus.trustie.net/Gitlink/forgeplus" target="_blank" className="font-18">
|
||||
<li>
|
||||
平台精选仓库:Gitlink/Gitlink
|
||||
</li>
|
||||
</a>
|
||||
<a href="https://forum.trustie.net/forums/4663/detail" target="_blank" className="font-18">
|
||||
<li>
|
||||
OpenHarmony系统介绍及赛题说明
|
||||
</li>
|
||||
</a>
|
||||
</ul>
|
||||
{/* <HeadNav {...props}/> */}
|
||||
<TopEdition register={register} current_user={current_user}/>
|
||||
{
|
||||
bannerTab && bannerTab.lenth > 0 ?
|
||||
<ul className="topEditionUl">
|
||||
{
|
||||
bannerTab.map((i,k)=>{
|
||||
return(
|
||||
<a href={i.url} target="_blank" className="font-18">
|
||||
<li>
|
||||
{i.title}
|
||||
</li>
|
||||
</a>
|
||||
)
|
||||
})
|
||||
}
|
||||
</ul>
|
||||
:
|
||||
<ul className="topEditionUl">
|
||||
<a href="https://forum.trustie.net/forums/4666/detail" target="_blank" className="font-18">
|
||||
<li>
|
||||
CCF开源发展委员会首批执行委员名单发布
|
||||
</li>
|
||||
</a>
|
||||
<a href="https://forgeplus.trustie.net/Gitlink/forgeplus" target="_blank" className="font-18">
|
||||
<li>
|
||||
平台精选仓库:Gitlink/Gitlink
|
||||
</li>
|
||||
</a>
|
||||
<a href="https://forum.trustie.net/forums/4663/detail" target="_blank" className="font-18">
|
||||
<li>
|
||||
OpenHarmony系统介绍及赛题说明
|
||||
</li>
|
||||
</a>
|
||||
</ul>
|
||||
}
|
||||
|
||||
</div>
|
||||
|
||||
<div className="secondEdition">
|
||||
<p className="theTitle">Gitlink,新一代开源创新服务平台</p>
|
||||
<p className="theTitle">GitLink,新一代开源创新服务平台</p>
|
||||
{
|
||||
flag &&
|
||||
<Anchor>
|
||||
|
@ -90,8 +123,10 @@ function Index(props) {
|
|||
</div>
|
||||
|
||||
<div className="forthEdition">
|
||||
<p className="theTitle">加入Gitlink,和社区伙伴们一起踏上开源创新的辉煌旅程!</p>
|
||||
<a className="qulikyreg" href={register}>快速注册</a>
|
||||
<p className="theTitle">加入GitLink,和社区伙伴们一起踏上开源创新的辉煌旅程!</p>
|
||||
<div style={{marginBottom:"80px"}}>
|
||||
{ !(current_user && current_user.login) && <a className="qulikyreg" href={register}>立即注册</a> }
|
||||
</div>
|
||||
<ul className="forthUl">
|
||||
<li>
|
||||
<img src={F41} alt="" width={"100px"}/>
|
||||
|
@ -118,10 +153,9 @@ function Index(props) {
|
|||
|
||||
<div className="fifthEdition">
|
||||
<p className="title">开源生态</p>
|
||||
<p className="subtitle">Gitlink与各大企业、高校、科研机构开展广泛的技术合作,推动我国开源软件生态的快速构建与发展</p>
|
||||
<p className="subtitle">GitLink与各大企业、高校、科研机构开展广泛的技术合作,推动我国开源软件生态的快速构建与发展</p>
|
||||
<FifthEdition />
|
||||
</div>
|
||||
<Footnav />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -61,21 +61,12 @@ body{
|
|||
height:100%;
|
||||
div{
|
||||
height: 100%;
|
||||
.regform1{
|
||||
background:url('./Img/banner1.png') no-repeat center top;
|
||||
background-size:cover;
|
||||
}
|
||||
.regform2{
|
||||
background:url('./Img/banner2.png') no-repeat center top;
|
||||
background-size:cover;
|
||||
}
|
||||
.regform3{
|
||||
background:url('./Img/banner3.png') no-repeat center top;
|
||||
background-size:cover;
|
||||
}
|
||||
.regform4{
|
||||
background:url('./Img/banner4.png') no-repeat center center;
|
||||
background-size:cover;
|
||||
.regform{
|
||||
&>div{
|
||||
background-size:cover;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
}
|
||||
.regPrg{
|
||||
position: absolute;
|
||||
|
@ -590,6 +581,7 @@ body{
|
|||
font-weight: 500;
|
||||
line-height: 36px;
|
||||
color: #000;
|
||||
max-width: 350px;
|
||||
span{
|
||||
color: #637497;
|
||||
font-weight: normal;
|
||||
|
@ -675,6 +667,8 @@ body{
|
|||
padding-top: 50px;
|
||||
padding-bottom: 25px;
|
||||
margin-bottom: 0px;
|
||||
justify-content: space-between;
|
||||
min-width: 1200px;
|
||||
li{
|
||||
padding:0px 67px;
|
||||
color: #fff;
|
||||
|
@ -755,8 +749,10 @@ body{
|
|||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 48px;
|
||||
min-height: 365px;
|
||||
.listbox{
|
||||
margin-left: 54px;
|
||||
flex: 1;
|
||||
.listTitle{
|
||||
height: 30px;
|
||||
font-size: 18px;
|
||||
|
@ -775,6 +771,9 @@ body{
|
|||
background-color: #466AFF;
|
||||
}
|
||||
}
|
||||
.ant-skeleton-title,.ant-skeleton-paragraph > li{
|
||||
background-color: rgba(242,242,242 ,0.2);
|
||||
}
|
||||
}
|
||||
li{
|
||||
display: flex;
|
||||
|
@ -793,6 +792,12 @@ body{
|
|||
span{
|
||||
margin-left: 40px;
|
||||
}
|
||||
.listboxcount{
|
||||
min-width: 60px;
|
||||
text-align: left;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -824,11 +829,12 @@ body{
|
|||
background-color: #466AFF;
|
||||
border-radius: 6px;
|
||||
font-size: 18px;
|
||||
margin-bottom: 80px;
|
||||
}
|
||||
.forthUl{
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
min-width: 1200px;
|
||||
justify-content: space-between;
|
||||
li{
|
||||
margin:0px 40px;
|
||||
display: flex;
|
||||
|
@ -913,6 +919,41 @@ body{
|
|||
overflow: hidden;
|
||||
margin: 35px 0px 0px;
|
||||
width: 100%;
|
||||
.unitMainSlider{
|
||||
width: 1200px;
|
||||
margin:0px auto;
|
||||
.slick-list{
|
||||
height: 140px;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
.slickMainline{
|
||||
display: flex!important;
|
||||
padding:10px 2px;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
a{
|
||||
background: #FFFFFF;
|
||||
box-shadow: 0px 1px 8px 1px rgba(0, 0, 0, 0.06);
|
||||
border-radius: 4px;
|
||||
border: 2px solid #FFFFFF;
|
||||
margin-right: 20px;
|
||||
padding:20px;
|
||||
height: 120px;
|
||||
width: 220px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
img{
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
&:last-child{
|
||||
margin-right: 0px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ul.fifthList{
|
||||
display: flex;
|
||||
|
@ -1011,28 +1052,31 @@ body{
|
|||
line-height: 25px;
|
||||
margin-bottom: 20px!important;
|
||||
}
|
||||
&.theline{
|
||||
display: flex;
|
||||
.imgCon{
|
||||
padding:5px;
|
||||
background-color: #fff;
|
||||
border-radius: 3px;
|
||||
}
|
||||
}
|
||||
.theline{
|
||||
.imgCon{
|
||||
padding:5px;
|
||||
border-radius: 4px;
|
||||
background-color: #fff;
|
||||
img{
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.copyrightDesc{
|
||||
font-size: 12px;
|
||||
font-weight: 400;
|
||||
color: #BDC2D1;
|
||||
line-height: 28px;
|
||||
padding:15px 0px;
|
||||
text-align: center;
|
||||
background-color: #1B212C;
|
||||
}
|
||||
.copyrightDesc{
|
||||
font-size: 12px;
|
||||
font-weight: 400;
|
||||
color: #BDC2D1;
|
||||
line-height: 28px;
|
||||
padding:15px 0px;
|
||||
text-align: center;
|
||||
background-color: #1B212C;
|
||||
a{
|
||||
color: #BDC2D1!important;
|
||||
}
|
||||
}
|
|
@ -99,12 +99,14 @@ function SecondEdition({setValue}) {
|
|||
}
|
||||
|
||||
function checkPosi(ele,clientHeight,scrollTop) {
|
||||
var a = document.getElementById(ele).offsetTop - scrollTop -(clientHeight/3);
|
||||
var b = document.getElementById(ele).clientHeight + (clientHeight/4);
|
||||
if(a>0 || a<-b){
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
if(document.getElementById(ele)){
|
||||
var a = document.getElementById(ele).offsetTop - scrollTop -(clientHeight/3);
|
||||
var b = document.getElementById(ele).clientHeight + (clientHeight/4);
|
||||
if(a>0 || a<-b){
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return(
|
||||
|
@ -187,7 +189,7 @@ function SecondEdition({setValue}) {
|
|||
<div className={"multidimensinalhalf"}>
|
||||
<div>
|
||||
<p className="halfTitle">多维度用户画像</p>
|
||||
<p className="halfsubTitle"><span>实时采集和分析平台中的各类开源资源数<br/>据,</span>搭建多维度用户画像评估系统;</p>
|
||||
<p className="halfsubTitle"><span>实时采集和分析平台中的各类开源资源数据,</span>搭建多维度用户画像评估系统;</p>
|
||||
</div>
|
||||
<div style={{width:"820px",marginLeft:"34px"}}>
|
||||
<img src={ImgM4} alt="" width="820px" />
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import React,{ useState , useEffect , useMemo } from 'react';
|
||||
import { Spin , Skeleton } from 'antd';
|
||||
import T311 from './Img/3-1-1.png';
|
||||
import T312 from './Img/3-1-2.png';
|
||||
import T321 from './Img/3-2-1.png';
|
||||
|
@ -13,39 +14,16 @@ import bg33 from './Img/3-3.png';
|
|||
import bg34 from './Img/3-4.png';
|
||||
|
||||
import './Index.scss';
|
||||
|
||||
const list1 = [
|
||||
{name:"CCF开源发展委员会首批执行委员名单发布",src:"https://forum.trustie.net/forums/4666/detail",count:32,time:"2021-09-22"},
|
||||
{name:"Gitlink项目协同开发模块使用说明及问题反馈",src:"https://forum.trustie.net/forums/4665/detail",count:4,time:"2021-09-22"},
|
||||
{name:"MindSpore框架介绍及赛题说明",src:"https://forum.trustie.net/forums/4664/detail",count:3,time:"2021-09-22"},
|
||||
{name:"OpenHarmony系统介绍及赛题说明",src:"https://forum.trustie.net/forums/4663/detail",count:4,time:"2021-09-22"},
|
||||
{name:"openGauss系统介绍及赛题说明",src:"https://forum.trustie.net/forums/4662/detail",count:5,time:"2021-09-22"},
|
||||
]
|
||||
const list2 = [
|
||||
{name:"Gitlink/Gitlink",src:"https://forgeplus.trustie.net/Gitlink/forgeplus",count:304},
|
||||
{name:"泛在操作系统实验室/矽璓工业物联操作系统XiUOS",src:"https://forgeplus.trustie.net/xuos/xiuos",count:50},
|
||||
{name:"华为技术有限公司/openGauss-operator",src:"https://forgeplus.trustie.net/Huawei_Technology/openGauss-operator",count:100},
|
||||
{name:"开放原子开源基金会/BitXHub",src:"https://forgeplus.trustie.net/openatom_foundation/bitxhub",count:40},
|
||||
{name:"华为技术有限公司/openEuler-datenlord",src:"https://forgeplus.trustie.net/Huawei_Technology/openEuler-datenlord",count:98},
|
||||
]
|
||||
const list3 = [
|
||||
{name:"Gitlink平台DevOps模块使用说明",src:"https://forum.trustie.net/forums/4682/detail",count:10,time:"2021-09-23"},
|
||||
{name:"Gitlink如何将临时分支push到远端对应的新分支?",src:"https://forum.trustie.net/forums/4705/detail",count:8,time:"2021-09-23"},
|
||||
{name:"了解什么是 DevOps?",src:"https://forum.trustie.net/forums/4704/detail",count:4,time:"2021-09-23"},
|
||||
{name:"EduCoder平台简介",src:"https://forum.trustie.net/forums/4701/detail",count:26,time:"2021-09-23"},
|
||||
{name:"Webhooks指南",src:"https://forum.trustie.net/forums/4683/detail",count:3,time:"2021-09-23"},
|
||||
]
|
||||
const list4 = [
|
||||
{name:"小学生都能读懂的网络协议之:WebSocket",src:"https://forum.trustie.net/forums/4708/detail",count:4,time:"2021-09-23"},
|
||||
{name:"容器神话 Docker 是如何一分为二的",src:"https://forum.trustie.net/forums/4707/detail",count:5,time:"2021-09-23"},
|
||||
{name:"一文揭示,DevOps与企业数字化究竟有何联系?",src:"https://forum.trustie.net/forums/4706/detail",count:3,time:"2021-09-23"},
|
||||
{name:"GitHub上最流行的10000个Java都使用了哪些库?",src:"https://forum.trustie.net/forums/4703/detail",count:8,time:"2021-09-23"},
|
||||
{name:"如何正确下载CentOS各个版本镜像",src:"https://forum.trustie.net/forums/4684/detail",count:2,time:"2021-09-23"},
|
||||
]
|
||||
import Axios from 'axios';
|
||||
|
||||
function ThirdEdition() {
|
||||
const [ active , setActive ] = useState(1);
|
||||
const [ isSpin , setIsSpin ] = useState(true);
|
||||
const [ flag , setFlag ] = useState(true);
|
||||
const [ list1, setList1 ] = useState([]);
|
||||
const [ list2, setList2 ] = useState([]);
|
||||
const [ list3, setList3 ] = useState([]);
|
||||
const [ list4, setList4 ] = useState([]);
|
||||
|
||||
const doubleFlag = useMemo(()=>{
|
||||
return flag;
|
||||
|
@ -75,6 +53,41 @@ function ThirdEdition() {
|
|||
}
|
||||
}
|
||||
|
||||
useEffect(()=>{
|
||||
if(active){
|
||||
getList(active);
|
||||
}
|
||||
},[active])
|
||||
|
||||
function getList(a) {
|
||||
let params = a === 1 ? "activity_forum" : a===2 ? "excellent_project" : a=== 3 ? "pinned_forum" : "experience_forum";
|
||||
if(a===1 && (list1 && list1.length>0)){return}
|
||||
if(a===2 && (list2 && list2.length>0)){return}
|
||||
if(a===3 && (list3 && list3.length>0)){return}
|
||||
if(a===4 && (list4 && list4.length>0)){return}
|
||||
setIsSpin(true);
|
||||
const url = `/topics.json?topic_type=${params}`;
|
||||
Axios.get(url,{
|
||||
params:{
|
||||
limit:5
|
||||
}
|
||||
}).then(result=>{
|
||||
if(result){
|
||||
let l = result.data.topics;
|
||||
if(a===1){
|
||||
setList1(l);
|
||||
}else if(a===2){
|
||||
setList2(l);
|
||||
}else if(a===3){
|
||||
setList3(l);
|
||||
}else{
|
||||
setList4(l);
|
||||
}
|
||||
setIsSpin(false);
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
|
||||
return(
|
||||
<div className="thirdEdition">
|
||||
<p className="title">开发者的家园</p>
|
||||
|
@ -111,65 +124,95 @@ function ThirdEdition() {
|
|||
</li>
|
||||
</ul>
|
||||
<div className="thirdLists">
|
||||
<img src={active === 1 ? bg3 : active===2 ? bg32 :active===3 ? bg33 :bg34 } alt="" width="336px"/>
|
||||
<div className="listbox">
|
||||
<p className="listTitle">
|
||||
{active === 1 ? "Gitlink分享最新平台资讯、社区活动通知、开源竞赛信息,把握开源生态发展脉搏"
|
||||
: active===2 ? "Gitlink汇聚精英企业仓库、前沿技术仓库、人气热门仓库,孵化优质开源创新成果"
|
||||
:active===3 ? "Gitlink集萃社区精选项目介绍、平台使用技巧等优秀文章,助力开源开放协同创新"
|
||||
:"Gitlink甄选技术研究、心得体会、经验交流等高质量内容,推动社区健康稳定发展"}
|
||||
</p>
|
||||
{
|
||||
active === 1&&
|
||||
list1.map((i,k)=>{
|
||||
return(
|
||||
<li>
|
||||
<a href={i.src} target="_blank">{i.name}</a>
|
||||
<span><i className="iconfont icon-a-liulanicon2x mr5"></i>{i.count}</span>
|
||||
<span>{i.time}</span>
|
||||
</li>
|
||||
)
|
||||
})
|
||||
}
|
||||
{
|
||||
active === 2&&
|
||||
list2.map((i,k)=>{
|
||||
return(
|
||||
<li>
|
||||
<a href={i.src} target="_blank">{i.name}</a>
|
||||
<span><i className="iconfont icon-a-liulanicon2x mr5"></i>{i.count}</span>
|
||||
{/* {i.time} */}
|
||||
</li>
|
||||
)
|
||||
})
|
||||
}
|
||||
{
|
||||
active === 3&&
|
||||
list3.map((i,k)=>{
|
||||
return(
|
||||
<li>
|
||||
<a href={i.src} target="_blank">{i.name}</a>
|
||||
<span><i className="iconfont icon-a-liulanicon2x mr5"></i>{i.count}</span>
|
||||
<span>{i.time}</span>
|
||||
</li>
|
||||
)
|
||||
})
|
||||
}
|
||||
{
|
||||
active === 4&&
|
||||
list4.map((i,k)=>{
|
||||
return(
|
||||
<li>
|
||||
<a href={i.src} target="_blank">{i.name}</a>
|
||||
<span><i className="iconfont icon-a-liulanicon2x mr5"></i>{i.count}</span>
|
||||
<span>{i.time}</span>
|
||||
</li>
|
||||
)
|
||||
})
|
||||
}
|
||||
<img src={active === 1 ? bg3 : active===2 ? bg32 :active===3 ? bg33 :bg34 } alt="" width="336px"/>
|
||||
<div className="listbox">
|
||||
<p className="listTitle">
|
||||
{active === 1 ? "GitLink分享最新平台资讯、社区活动通知、开源竞赛信息,把握开源生态发展脉搏"
|
||||
: active===2 ? "GitLink汇聚精英企业仓库、前沿技术仓库、人气热门仓库,孵化优质开源创新成果"
|
||||
:active===3 ? "GitLink集萃社区精选项目介绍、平台使用技巧等优秀文章,助力开源开放协同创新"
|
||||
:"GitLink甄选技术研究、心得体会、经验交流等高质量内容,推动社区健康稳定发展"}
|
||||
</p>
|
||||
<div style={{minHeight:"260px"}}>
|
||||
{
|
||||
active === 1 &&
|
||||
<React.Fragment>
|
||||
{
|
||||
list1 && list1.length > 0 ? list1.map((i,k)=>{
|
||||
return(
|
||||
<li>
|
||||
<a href={i.url} target="_blank">{i.title}</a>
|
||||
<span className="listboxcount"><i className="iconfont icon-a-liulanicon2x mr5"></i>{i.visits}</span>
|
||||
<span>{i.time}</span>
|
||||
</li>
|
||||
)
|
||||
}):""
|
||||
}
|
||||
{
|
||||
list1 && list1.length === 0 && <Skeleton />
|
||||
}
|
||||
</React.Fragment>
|
||||
}
|
||||
{
|
||||
active === 2 &&
|
||||
<React.Fragment>
|
||||
{
|
||||
list2 && list2.length > 0? list2.map((i,k)=>{
|
||||
return(
|
||||
<li>
|
||||
<a href={i.url} target="_blank">{i.title}</a>
|
||||
<span className="listboxcount" style={{marginRight:"40px"}}><i className="iconfont icon-a-liulanicon2x mr5"></i>{i.visits}</span>
|
||||
{/* {i.time} */}
|
||||
</li>
|
||||
)
|
||||
}):""
|
||||
}
|
||||
{
|
||||
list2 && list2.length === 0 && <Skeleton />
|
||||
}
|
||||
</React.Fragment>
|
||||
}
|
||||
{
|
||||
active === 3 &&
|
||||
<React.Fragment>
|
||||
{
|
||||
list3 && list3.length > 0 ? list3.map((i,k)=>{
|
||||
return(
|
||||
<li>
|
||||
<a href={i.url} target="_blank">{i.title}</a>
|
||||
<span className="listboxcount"><i className="iconfont icon-a-liulanicon2x mr5"></i>{i.visits}</span>
|
||||
<span>{i.time}</span>
|
||||
</li>
|
||||
)
|
||||
}):""
|
||||
}
|
||||
{
|
||||
list3 && list3.length === 0 && <Skeleton />
|
||||
}
|
||||
</React.Fragment>
|
||||
}
|
||||
{
|
||||
active === 4 &&
|
||||
<React.Fragment>
|
||||
{
|
||||
list4 && list4.length > 0 ? list4.map((i,k)=>{
|
||||
return(
|
||||
<li>
|
||||
<a href={i.url} target="_blank">{i.title}</a>
|
||||
<span className="listboxcount"><i className="iconfont icon-a-liulanicon2x mr5"></i>{i.visits}</span>
|
||||
<span>{i.time}</span>
|
||||
</li>
|
||||
)
|
||||
}):""
|
||||
}
|
||||
{
|
||||
list4 && list4.length === 0 && <Skeleton />
|
||||
}
|
||||
</React.Fragment>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
import React from 'react';
|
||||
import React , { useEffect , useState } from 'react';
|
||||
import Slider from 'react-slick';
|
||||
import axios from 'axios';
|
||||
import { getImageUrl } from 'educoder';
|
||||
|
||||
let setting={
|
||||
dots:true,
|
||||
infinite: true,
|
||||
|
@ -14,16 +17,46 @@ let setting={
|
|||
prevArrow:<button type='button' class='slick-prev slick-arrow'><i className="iconfont icon-xiangzuojiantou"></i></button>,
|
||||
nextArrow:<button type='button' class='slick-prev slick-arrow'><i className="iconfont icon-xiangyoujiantou"></i></button>
|
||||
}
|
||||
function TopEdition({register}) {
|
||||
function TopEdition({register,current_user}) {
|
||||
|
||||
const [ bannerList , setBannerList ] = useState(undefined);
|
||||
|
||||
useEffect(()=>{
|
||||
getBanner();
|
||||
},[])
|
||||
|
||||
function getBanner() {
|
||||
const url = `/topics.json?topic_type=banner`;
|
||||
axios.get(url,{
|
||||
params:{
|
||||
limit:4
|
||||
}
|
||||
}).then(result=>{
|
||||
if(result){
|
||||
setBannerList(result.data.topics);
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
return(
|
||||
<Slider {...setting}>
|
||||
<div className="regform1"></div>
|
||||
<div className="regform2"></div>
|
||||
<div className="regform3">
|
||||
</div>
|
||||
<div className="regform4">
|
||||
<p className="regPrg"><a href={register}>注册</a></p>
|
||||
</div>
|
||||
{
|
||||
bannerList && bannerList.length > 0 ?
|
||||
bannerList.map((i,k)=>{
|
||||
return(
|
||||
<div className={`regform`}>
|
||||
<div style={{backgroundImage:`url(${getImageUrl(i.image)})`}}>
|
||||
{
|
||||
k +1 === bannerList.length && (!(current_user && current_user.login)) ?
|
||||
<p className="regPrg"><a href={register}>注册</a></p>
|
||||
:""
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})
|
||||
:
|
||||
""
|
||||
}
|
||||
</Slider>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -97,9 +97,9 @@ class EducoderLogin extends Component {
|
|||
<div style={{cursor:"pointer"}}>
|
||||
{
|
||||
mygetHelmetapi && mygetHelmetapi.login_logo_url ?
|
||||
<img style={{cursor:"pointer"}} alt="" onClick={()=>this.gohome()} width="80px" src={getImageUrl(mygetHelmetapi.login_logo_url)}/>
|
||||
<img style={{cursor:"pointer"}} alt="" onClick={()=>this.gohome()} src={getImageUrl(mygetHelmetapi.login_logo_url)}/>
|
||||
:
|
||||
<img style={{cursor:"pointer"}} alt="" onClick={()=>this.gohome()} src={educodernet} width="80px"/>
|
||||
<img style={{cursor:"pointer"}} alt="" onClick={()=>this.gohome()} src={educodernet}/>
|
||||
}
|
||||
</div>
|
||||
{
|
||||
|
|
|
@ -25,14 +25,17 @@ body>.-task-title {
|
|||
.newHeaders{
|
||||
max-width: unset;
|
||||
width: 100%;
|
||||
height:70px;
|
||||
height:58px;
|
||||
min-width: 1200px;
|
||||
z-index: 1000;
|
||||
box-shadow: 0px 2px 4px 0px rgb(0 0 0 / 50%);
|
||||
position: fixed;
|
||||
background-image: linear-gradient(to right, #0F141F, #0C2A5B,#101417);
|
||||
background: #1B2440;
|
||||
color: #fff;
|
||||
}
|
||||
.newHeaders.publicNav{
|
||||
position: absolute;
|
||||
background: rgba(27, 36, 64,0.2);
|
||||
}
|
||||
.headerContent{
|
||||
margin:0px auto;
|
||||
padding:0px 30px;
|
||||
|
|
|
@ -29,6 +29,7 @@ export function TPMIndexHOC(WrappedComponent) {
|
|||
email:undefined,
|
||||
completeProfile:false,
|
||||
showCP:false,
|
||||
showNotice:true
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -153,11 +154,11 @@ export function TPMIndexHOC(WrappedComponent) {
|
|||
console.log(this.props.match)
|
||||
if (this.props.match.path === "/") {
|
||||
this.setState({
|
||||
publicNav:false
|
||||
publicNav:true
|
||||
})
|
||||
}else{
|
||||
this.setState({
|
||||
publicNav:true
|
||||
publicNav:false
|
||||
})
|
||||
}
|
||||
let url = `/users/get_user_info.json`;
|
||||
|
@ -223,6 +224,11 @@ export function TPMIndexHOC(WrappedComponent) {
|
|||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
hideSystemNotice=()=>{
|
||||
this.setState({
|
||||
showNotice:false
|
||||
})
|
||||
}
|
||||
|
||||
showCompeleteDialog=()=>{
|
||||
this.setState({
|
||||
|
@ -231,7 +237,7 @@ export function TPMIndexHOC(WrappedComponent) {
|
|||
}
|
||||
|
||||
render() {
|
||||
let { isRender , current_user , giteaVisible , email , completeProfile , showCP , publicNav , mygetHelmetapi } = this.state;
|
||||
let { isRender , current_user , giteaVisible , email , completeProfile , showCP , showNotice , publicNav , mygetHelmetapi } = this.state;
|
||||
const common = {
|
||||
showLoginDialog: this.showLoginDialog,
|
||||
checkIfLogin: this.checkIfLogin,
|
||||
|
@ -241,9 +247,11 @@ export function TPMIndexHOC(WrappedComponent) {
|
|||
return (
|
||||
<div className="indexHOC">
|
||||
<SystemNotice
|
||||
showNotice={showNotice}
|
||||
system_notification={mygetHelmetapi && mygetHelmetapi.system_notification}
|
||||
history={this.props.history}
|
||||
login={current_user && current_user.login}
|
||||
hideSystemNotice={this.hideSystemNotice}
|
||||
/>
|
||||
<EducoderAccount visible={giteaVisible} email={email} onOk={this.onOk}/>
|
||||
<ProfileModal
|
||||
|
@ -256,12 +264,12 @@ export function TPMIndexHOC(WrappedComponent) {
|
|||
{...this.props}
|
||||
{...this.state}
|
||||
/> : ""}
|
||||
{ publicNav && <Header {...this.state} {...this.props} {...common}></Header>}
|
||||
<Header {...this.state} {...this.props} {...common} publicNav={publicNav}></Header>
|
||||
<Spin spinning={this.state.globalLoading} delay={0} className="globalSpin"
|
||||
size="large" tip={this._gLoadingTip || "加载中..."}
|
||||
>
|
||||
<div className="newContainer newContainers">
|
||||
{ publicNav && <div style={{height:"70px"}}></div> }
|
||||
{!publicNav && <div style={{height:"58px"}}></div> }
|
||||
{
|
||||
current_user &&
|
||||
<WrappedComponent initCommonState={(user) => this.initCommonState(user)}
|
||||
|
@ -270,7 +278,7 @@ export function TPMIndexHOC(WrappedComponent) {
|
|||
}
|
||||
</div>
|
||||
</Spin>
|
||||
{ publicNav && <NewFooter {...this.state} {...this.props} />}
|
||||
<NewFooter {...this.state} {...this.props} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|