Merge pull request '首页相关需求、issues修改' (#256) from caishi/forgeplus-react:gitlink_server into gitlink_server

This commit is contained in:
jasder 2021-11-11 13:44:38 +08:00
commit 711c2e57da
24 changed files with 211 additions and 132 deletions

View File

@ -137,7 +137,7 @@ class App extends Component {
this.unlisten = this.props.history.listen((location) => {
let newPathname = location.pathname.split('/')[1];
if (this.state.pathName !== newPathname) {
// this.setState({ pathType: '' });
this.setState({ pathType: '' });
newPathname && this.getPathnameType(newPathname);
}
});

View File

@ -25,7 +25,7 @@ if (isDev) {
}
debugType = window.location.search.indexOf('debug=t') !== -1 ? 'teacher' :
window.location.search.indexOf('debug=s') !== -1 ? 'student' :
window.location.search.indexOf('debug=a') !== -1 ? 'admin' : parsed.debug || 'admin'
window.location.search.indexOf('debug=a') !== -1 ? 'admin' : parsed.debug || ''
}
window._debugType = debugType;
export function initAxiosInterceptors(props) {

View File

@ -3,7 +3,7 @@ import AccountProfile from "../../modules/user/AccountProfile";
import { getImageUrl } from 'educoder'
import axios from 'axios';
import cookie from 'react-cookies';
import { Input , notification , Dropdown ,Popover, Menu,Badge, Button } from 'antd';
import { notification , Dropdown ,Popover, Menu,Badge } from 'antd';
import { Link } from 'react-router-dom';
import LoginDialog from '../../modules/login/LoginDialog';
@ -15,9 +15,8 @@ import CheckProfile from '../Component/ProfileModal/Profile';
import './header.scss';
import NoticeContent from './NoticeContent';
const $ = window.$
import MainLogo from './img/logo.png';
// TODO 这部分脚本从公共脚本中直接调用
const { Search } = Input;
let old_url;
window._header_componentHandler = null;
@ -57,26 +56,26 @@ class NewHeader extends Component {
window._header_componentHandler = this;
//下拉框的显示隐藏
var hoverTimeout;
var hoveredPanel;
$(".edu-menu-panel").hover(function () {
if (hoverTimeout) { // 一次只显示一个panel
if (hoveredPanel && hoveredPanel !== this) {
$(hoveredPanel).find(".edu-menu-list").hide()
}
clearTimeout(hoverTimeout);
hoverTimeout = null;
}
hoveredPanel = this;
$(this).find(".edu-menu-list").show();
}, function () {
var that = this;
// 延迟hide
hoverTimeout = setTimeout(function () {
$(that).find(".edu-menu-list").hide();
}, 800)
// var hoverTimeout;
// var hoveredPanel;
// $(".edu-menu-panel").hover(function () {
// if (hoverTimeout) { // 一次只显示一个panel
// if (hoveredPanel && hoveredPanel !== this) {
// $(hoveredPanel).find(".edu-menu-list").hide()
// }
// clearTimeout(hoverTimeout);
// hoverTimeout = null;
// }
// hoveredPanel = this;
// $(this).find(".edu-menu-list").show();
// }, function () {
// var that = this;
// // 延迟hide
// hoverTimeout = setTimeout(function () {
// $(that).find(".edu-menu-list").hide();
// }, 800)
});
// });
//获取游览器地址
try {
window.sessionStorage.setItem("yslgeturls", JSON.stringify(window.location.href))
@ -286,92 +285,90 @@ class NewHeader extends Component {
};
render() {
const { match ,resetUserInfo ,showNotification,publicNav} = this.props;
const { resetUserInfo ,showNotification,publicNav} = this.props;
let current_user = this.props.user;
let {
AccountProfiletype,
user,
isRender,
headtypesonClickbool,
headtypess,
settings,
visible,
} = this.state;
/*用户名称 用户头像url*/
let activeIndex = false;
let activeForums = false;
let activeShixuns = false;
let activePaths = false;
let coursestype = false;
let activePackages = false;
let activeMoopCases = false;
let activeCompetitions = false;
// let activeIndex = false;
// let activeForums = false;
// let activeShixuns = false;
// let activePaths = false;
// let coursestype = false;
// let activePackages = false;
// let activeMoopCases = false;
// let activeCompetitions = false;
if (match.path === '/forums') {
activeForums = true;
} else if (match.path.startsWith('/shixuns')) {
activeShixuns = true;
} else if (match.path.startsWith('/paths')) {
activePaths = true;
} else if (match.path.startsWith('/courses')) {
coursestype = true;
} else if (match.path.startsWith('/crowdsourcing')) {
activePackages = true;
} else if (match.path.startsWith('/moop_cases')) {
activeMoopCases = true;
} else if (match.path.startsWith('/competitions')) {
activeCompetitions = true;
} else {
activeIndex = true;
}
// if (match.path === '/forums') {
// activeForums = true;
// } else if (match.path.startsWith('/shixuns')) {
// activeShixuns = true;
// } else if (match.path.startsWith('/paths')) {
// activePaths = true;
// } else if (match.path.startsWith('/courses')) {
// coursestype = true;
// } else if (match.path.startsWith('/crowdsourcing')) {
// activePackages = true;
// } else if (match.path.startsWith('/moop_cases')) {
// activeMoopCases = true;
// } else if (match.path.startsWith('/competitions')) {
// activeCompetitions = true;
// } else {
// activeIndex = true;
// }
let headtypes = '/';
if (settings) {
if (settings.navbar) {
if (settings.navbar.length > 0) {
if (match.path === '/') {
if (headtypesonClickbool === false) {
headtypes = undefined;
} else {
headtypes = headtypess;
}
} else {
for (var i = 0; i < settings.navbar.length; i++) {
if (match.path === settings.navbar[i].link) {
headtypes = settings.navbar[i].link;
break;
}
}
}
}
}
}
let shixuntype = false;
let pathstype = false;
let coursestypes = false;
if (this.props && this.props.mygetHelmetapi != null) {
let shixun = "/shixuns";
let paths = "/paths";
let courses = "/courses";
this.props.mygetHelmetapi && this.props.mygetHelmetapi.navbar && this.props.mygetHelmetapi.navbar.map((item, key) => {
var reg = RegExp(item.link);
if (shixun.match(reg)) {
if (item.hidden === true) {
shixuntype = true
}
}
if (paths.match(reg)) {
if (item.hidden === true) {
pathstype = true
}
}
if (courses.match(reg)) {
if (item.hidden === true) {
coursestypes = true
}
}
})
}
// let headtypes = '/';
// if (settings) {
// if (settings.navbar) {
// if (settings.navbar.length > 0) {
// if (match.path === '/') {
// if (headtypesonClickbool === false) {
// headtypes = undefined;
// } else {
// headtypes = headtypess;
// }
// } else {
// for (var i = 0; i < settings.navbar.length; i++) {
// if (match.path === settings.navbar[i].link) {
// headtypes = settings.navbar[i].link;
// break;
// }
// }
// }
// }
// }
// }
// let shixuntype = false;
// let pathstype = false;
// let coursestypes = false;
// if (this.props && this.props.mygetHelmetapi != null) {
// let shixun = "/shixuns";
// let paths = "/paths";
// let courses = "/courses";
// this.props.mygetHelmetapi && this.props.mygetHelmetapi.navbar && this.props.mygetHelmetapi.navbar.map((item, key) => {
// var reg = RegExp(item.link);
// if (shixun.match(reg)) {
// if (item.hidden === true) {
// shixuntype = true
// }
// }
// if (paths.match(reg)) {
// if (item.hidden === true) {
// pathstype = true
// }
// }
// if (courses.match(reg)) {
// if (item.hidden === true) {
// coursestypes = true
// }
// }
// })
// }
let search_url = settings && settings.common && settings.common.search;
return (
@ -390,6 +387,12 @@ class NewHeader extends Component {
{...this.props}
{...this.state}
/> : ""}
{
publicNav &&
<a href={'https://www.ccf.org.cn/'} className={"fl pr15"}>
<img src={MainLogo} alt="" style={{ heigth: "40px" }}/>
</a>
}
{
settings && settings.nav_logo_url ?
<a href={settings && settings.new_course.default_url} className={"fl mr50"} style={{minWidth:"45px"}}>
@ -468,8 +471,12 @@ class NewHeader extends Component {
<span className="font-15 ml30">
<a onClick={() => this.educoderlogin()} className="mr5 color-white">登录</a>
{
settings && settings.common && settings.common.register &&
<span><em className="vertical-line"></em><Link className="ml5 color-grey-6" to={`/register`}></Link></span>
(settings && settings.common && settings.common.register) ?
publicNav ?
<Link to={`/register`} className="regBtn">立即注册</Link>
:
<span><em className="vertical-line"></em><Link className="ml5 color-white" to={`/register`}></Link></span>
:""
}
</span>
:

View File

@ -343,4 +343,20 @@
a{
color: #BDC2D1!important;
}
}
.regBtn{
height: 40px;
background: #466AFF;
border-radius: 2px;
display: inline-block;
padding:0px 18px;
margin-left: 20px;
font-size: 14px;
font-weight: 400;
color: #FFFFFF!important;
line-height: 40px;
&:hover{
color: #FFFFFF!important;
background-color: #355CFF;
}
}

BIN
src/forge/Head/img/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -41,7 +41,7 @@ function CoderDepotReadme({ operate , history , readme , ChangeFile }){
return(
<div className="commonBox readBox" id="readme">
<Anchor offsetTop={70}>
<Anchor offsetTop={58}>
<div className="commonBox-title boxTitle">
<AlignCenter>
<Dropdown overlay={menu()} trigger={['hover']} overlayClassName="menuslist">

View File

@ -215,7 +215,7 @@ class CoderRootFileDetail extends Component {
const Option = Select.Option;
return (
<React.Fragment>
<Anchor className="griditemAnchor" offsetTop={70}>
<Anchor className="griditemAnchor" offsetTop={58}>
<div className="griditemCate">
{
md && readOnly &&

View File

@ -112,8 +112,8 @@ class MergeItem extends Component {
to={`/${item.is_original ? item.fork_project_user : owner}/${ item.is_original ? item.fork_project_identifier : projectsId }/tree/${turnbar(item.pull_request_head)}`}
className="maxW200px task-hide ver-middle" style={{maxWidth:"200px"}}
>
{item.is_fork
? item.pull_request_base
{item.is_original
? item.fork_project_user_name
: item.author_name}
:{item.pull_request_head}
</Link>
@ -136,8 +136,7 @@ class MergeItem extends Component {
to={`/${owner}/${projectsId}/tree/${turnbar(item.pull_request_base)}`}
className="maxW200px task-hide ver-middle" style={{maxWidth:"200px"}}
>
{item.is_fork ? item.pull_request_base : `${item.author_name}:${item.pull_request_base}`}
{/* {project_author_name}:{item.pull_request_base} */}
{project_author_name}:{item.pull_request_base}
</Link>
</Tag>
}

View File

@ -365,10 +365,10 @@ class MessageCount extends Component {
<div className="mt15">
<Tag className="pr-branch-tag">
<Link
to={`/${data.pull_request.is_fork ? data.pull_request_base.fork_project_user : data.issue.author_name}/${data.pull_request.is_original?data.project_identifier:projectsId}/tree/${turnbar(data.pull_request && data.pull_request.head)}`}
className="ver-middle task-hide" style={{maxWidth:"200px"}} title={`${data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}: ${data.pull_request && data.pull_request.head}`}
to={`/${data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author}/${data.pull_request.is_original?data.project_identifier:projectsId}/tree/${turnbar(data.pull_request && data.pull_request.head)}`}
className="ver-middle task-hide" style={{maxWidth:"200px"}} title={`${data.pull_request.is_original ? data.pull_request.fork_project_user_name : data.issue.author_name}: ${data.pull_request && data.pull_request.head}`}
>
{data.pull_request.is_fork ? data.pull_request_base.fork_project_user : data.issue.author_name}: {data.pull_request && data.pull_request.head}
{data.pull_request.is_original ? data.pull_request.fork_project_user_name : data.issue.author_name}: {data.pull_request && data.pull_request.head}
</Link>
</Tag>
<span className="mr8 ver-middle">
@ -383,7 +383,7 @@ class MessageCount extends Component {
to={`/${owner}/${projectsId}/tree/${data.pull_request.base}`}
className="ver-middle task-hide" style={{maxWidth:"200px"}} title={`${data.issue.project_author_name}:${data.pull_request.base}`}
>
{data.issue.author_name}:{data.pull_request.base}
{data.issue.project_author_name}:{data.pull_request.base}
</Link>
</Tag>
</div>

View File

@ -211,7 +211,7 @@ class MilepostDetail extends Component {
const { issue_chosen, issues, limit, page, search_count, data, isSpin , status_type } = this.state;
const { projectsId, meilid ,owner} = this.props.match.params;
const { current_user , showLoginDialog , projectDetail } = this.props;
const menu = (
<Menu onClick={(e) => this.getOption(e)}>
<Menu.Item key={'created_on'} value="desc">最新创建</Menu.Item>
@ -239,8 +239,17 @@ class MilepostDetail extends Component {
<span className="font-weight-bold">{data && data.percent && data.percent.toFixed(2)}%完成 </span>
</span>
<div className="milepostdiv">
<Link to={`/${owner}/${projectsId}/milestones/${meilid}/edit`} className="topWrapper_btn" style={{ marginRight: 15 }} >编辑里程碑</Link>
<CheckProfile {...this.props} sureFunc={()=>{this.props.history.push(`/${owner}/${projectsId}/issues/${meilid}/new`)}} className="topWrapper_btn">创建易修</CheckProfile>
{
(current_user && current_user.login) && ( projectDetail && projectDetail.permission && projectDetail.permission !== "Reporter") ?
<Link to={`/${owner}/${projectsId}/milestones/${meilid}/edit`} className="topWrapper_btn" style={{ marginRight: 15 }} >编辑里程碑</Link>
:""
}
{
current_user && current_user.login ?
<CheckProfile {...this.props} sureFunc={()=>{this.props.history.push(`/${owner}/${projectsId}/issues/${meilid}/new`)}} className="topWrapper_btn">创建易修</CheckProfile>
:
<a className="topWrapper_btn" onClick={showLoginDialog}>创建易修</a>
}
</div>
</FlexAJ>
</div>

View File

@ -52,7 +52,7 @@ class OrderItem extends Component {
{current_user && current_user.login && checkbox}
<div className="flex-1">
<p className="mb10 df" style={{alignItems:"center"}}>
<Link to={`/${owner}/${projectsId}/issues/${item.id}`} target="_blank" title={item.name} className="hide-1 font-16 color-grey-3 lineh-30 mr10" style={{maxWidth:"370px"}}>{item.name}</Link>
<Link to={`/${owner}/${projectsId}/issues/${item.id}`} title={item.name} className="hide-1 font-16 color-grey-3 lineh-30 mr10" style={{maxWidth:"370px"}}>{item.name}</Link>
{TagInfo(item.priority,"mr10")}
</p>
<p className="color-grey-6 font-12">

View File

@ -13,6 +13,7 @@ import { getImageUrl } from 'educoder';
import { Link } from 'react-router-dom';
import './Index.scss';
import { useEffect } from "react";
const MyNoticeIndex = Loadable({
loader: () => import("./notice/myNotice/Index"),
@ -43,10 +44,15 @@ const PrivateLetter = Loadable({
});
function Index(props){
const { current_user,mygetHelmetapi } = props;
const { current_user,mygetHelmetapi , checkIfLogin } = props;
const { pathname } = props.location;
const notice_url = mygetHelmetapi && mygetHelmetapi.common && mygetHelmetapi.common.notice;
useEffect(()=>{
if(checkIfLogin() === false){
props.history.push('/login');
}
},[])
return(
<div className="newMain clearfix whiteBack">
<div className="boies">

View File

@ -191,6 +191,12 @@
.shortStyle{
.setStyleRule{
min-height: 35px;
#merge_whitelist_usernames{
li.ant-select-selection__choice{
margin-top: 0px!important;
margin-bottom: 3px!important;
}
}
}
.columsRadio{
display: block;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 345 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 MiB

After

Width:  |  Height:  |  Size: 632 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 342 KiB

BIN
src/home/Img/left.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1018 B

BIN
src/home/Img/right.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1018 B

View File

@ -68,7 +68,7 @@ function Index(props) {
{/* <HeadNav {...props}/> */}
<TopEdition register={register} current_user={current_user}/>
{
bannerTab && bannerTab.lenth > 0 ?
bannerTab && bannerTab.length > 0 ?
<ul className="topEditionUl">
{
bannerTab.map((i,k)=>{

View File

@ -63,9 +63,14 @@ body{
height: 100%;
.regform{
&>div{
background-size:cover;
background-position: center;
background-repeat: no-repeat;
overflow: hidden;
img{
height: 100%;
width: 1920px;
position: relative;
left: 50%;
margin-left: -960px;
}
}
}
.regPrg{
@ -74,7 +79,7 @@ body{
width: 1200px;
left: 50%;
margin-left: -600px;
top:50%;
top:54%;
margin-top: -23px;
a{
color: #fff!important;
@ -87,6 +92,10 @@ body{
text-align: center;
font-size: 18px;
letter-spacing: 2px;
&:hover{
color: #FFFFFF!important;
background-color: #355CFF;
}
}
}
}
@ -107,6 +116,8 @@ body{
&:hover{
.slick-arrow{
display: block!important;
cursor: pointer;
z-index: 2;
}
}
.slick-arrow{
@ -142,6 +153,7 @@ body{
bottom: 25%;
position: absolute;
display: flex!important;
z-index: 2;
li{
background-color: rgba(225,225,225,0.5);
position: relative;
@ -186,6 +198,7 @@ body{
display: flex;
align-items: center;
justify-content: center;
z-index: 3;
a{
background-image: url('./Img/top-2.png');
height: 139px;
@ -660,6 +673,7 @@ body{
font-weight: 500;
color: #FFFFFF;
line-height: 39px;
opacity: 0.6;
}
.thirdUl{
display: flex;
@ -667,13 +681,14 @@ body{
padding-top: 50px;
padding-bottom: 25px;
margin-bottom: 0px;
justify-content: space-between;
justify-content: center;
min-width: 1200px;
li{
padding:0px 67px;
color: #fff;
position: relative;
cursor: pointer;
width: 222px;
&:hover{
.hoverli1 img{
&:first-child{
@ -719,12 +734,18 @@ body{
margin-left: -5px;
bottom: -25px;
}
&.active,&:hover{
&>span{
font-size: 22px;
}
}
&>span{
font-weight: 500;
font-size: 22px;
font-weight: 400;
font-size: 18px;
margin-top:10px;
display: block;
height: 30px;
text-align: center;
line-height: 30px;
}
&>div{
@ -761,6 +782,7 @@ body{
line-height: 30px;
position: relative;
margin-bottom: 75px!important;
opacity: 0.8;
&::after{
position: absolute;
left: 0px;
@ -769,6 +791,7 @@ body{
content: "";
bottom: -20px;
background-color: #466AFF;
opacity: 1;
}
}
.ant-skeleton-title,.ant-skeleton-paragraph > li{
@ -829,6 +852,10 @@ body{
background-color: #466AFF;
border-radius: 6px;
font-size: 18px;
&:hover{
color: #FFFFFF!important;
background-color: #355CFF;
}
}
.forthUl{
display: flex;
@ -913,6 +940,7 @@ body{
line-height: 39px;
margin-top: 13px;
margin-bottom: 54px;
opacity: 0.6;
}
#scrollBox1{
max-height: 332px;
@ -935,7 +963,7 @@ body{
background: #FFFFFF;
box-shadow: 0px 1px 8px 1px rgba(0, 0, 0, 0.06);
border-radius: 4px;
border: 2px solid #FFFFFF;
border: 1px solid #FFFFFF;
margin-right: 20px;
padding:20px;
height: 120px;
@ -943,6 +971,9 @@ body{
display: flex;
align-items: center;
justify-content: center;
&:hover{
border: 1px solid #8FCEFF;
}
img{
max-width: 100%;
max-height: 100%;

View File

@ -142,7 +142,7 @@ function ThirdEdition() {
<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>
<span>{i.created_time && i.created_time.split(" ")[0]}</span>
</li>
)
}):""
@ -180,7 +180,7 @@ function ThirdEdition() {
<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>
<span>{i.created_time && i.created_time.split(" ")[0]}</span>
</li>
)
}):""
@ -199,7 +199,7 @@ function ThirdEdition() {
<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>
<span>{i.created_time && i.created_time.split(" ")[0]}</span>
</li>
)
}):""

View File

@ -2,6 +2,9 @@ import React , { useEffect , useState } from 'react';
import Slider from 'react-slick';
import axios from 'axios';
import { getImageUrl } from 'educoder';
import Left from './Img/left.png';
import Right from './Img/right.png';
let setting={
dots:true,
@ -14,8 +17,8 @@ let setting={
pauseOnFocus:true,
autoplay:true,
arrows:true,
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>
prevArrow:<button type='button' class='slick-prev slick-arrow'><img src={Left} width="70px" alt=""/></button>,
nextArrow:<button type='button' class='slick-prev slick-arrow'><img src={Right} width="70px" alt=""/></button>
}
function TopEdition({register,current_user}) {
@ -44,10 +47,12 @@ function TopEdition({register,current_user}) {
bannerList.map((i,k)=>{
return(
<div className={`regform`}>
<div style={{backgroundImage:`url(${getImageUrl(i.image)})`}}>
{/* style={{backgroundImage:`url(${getImageUrl(i.image)})`}} */}
<div>
<img src={getImageUrl(i.image)} alt="" height="100%"/>
{
k +1 === bannerList.length && (!(current_user && current_user.login)) ?
<p className="regPrg"><a href={register}>注册</a></p>
<p className="regPrg"><a href={register}>立即注册</a></p>
:""
}
</div>