merge develop

This commit is contained in:
caishi 2021-04-21 16:54:47 +08:00
parent 8a5a7a0647
commit 40918bf1d7
14 changed files with 175 additions and 311 deletions

View File

@ -2346,7 +2346,6 @@ input::-ms-clear {
/*中间部分宽度固定为1200*/
.newMain {
margin: 0 auto;
padding-bottom: 110px;
min-width: 1200px;
}
@ -3978,28 +3977,62 @@ html>body #ajax-indicator {
display: block;
height: 100%;
width: 100%;
color: #fff;
color: #333;
font-size: 16px;
position: relative;
}
.head-nav ul#header-nav li a:hover,.head-nav ul#header-nav li.active a {
color: #5091FF;
}
.head-nav ul#header-nav li.active a::after{
content: "";
width: 18px;
height: 2px;
background-color: #4cacff;
position: absolute;
bottom: 14px;
left: 0;
}
.head-nav ul#header-nav li:last-child {
margin-right: 0px
}
.head-nav ul#header-nav li.active{
/* background-color: #3B3B3B; */
}
.head-nav ul#header-nav li p:hover {
color: #cccccc;
}
.head-nav ul#header-nav li p {
display: block;
height: 100%;
width: 100%;
color: #fff
}
/* .head-nav ul#header-nav li.active div ul li a {
color: #000 !important;
} */
/* .head-nav ul#header-nav li.active div ul li a:hover {
color: #FFF !important;
}
.head-nav ul#header-nav li.active ul li a {
color: #000 !important;
} */
/* .head-nav ul#header-nav li.active ul li a:hover {
color: #FFF !important;
} */
/* .head-nav ul#header-nav li.active:after {
content: '';
position: absolute;
left: 0px;
top: auto;
bottom: 10px;
right: auto;
height: 2px;
width: 32px;
background-color: #459be5;
} */
.head-right {
box-sizing: border-box;
height: 60px;
@ -4075,17 +4108,6 @@ em.vertical-line {
/* 右侧内容宽度变化的话需要调整posi-search right的值*/
.newFooter {
position: absolute;
bottom: 0;
width: 100%;
background: #323232;
clear: both;
min-width: 1200px;
z-index: 8;
left: 0px;
}
.footercon {
border-bottom: 1px solid #47494d;
}

63
src/forge/Head/Footer.jsx Normal file
View File

@ -0,0 +1,63 @@
import React, { useEffect , useState } from 'react';
import './header.scss';
function Footer(){
const [ value , setValue ] = useState(undefined);
useEffect(()=>{
try {
var chromesettingArray = JSON.parse(localStorage.getItem('chromesetting'));
setValue(chromesettingArray.footer);
} catch (e) {
}
},[])
function showhtml(htmlString){
var html = {__html:htmlString};
return <div dangerouslySetInnerHTML={html}></div> ;
}
return(
<div className="newFooter edu-txt-center">
{value && showhtml(value)}
{/* <div className="footerInfos">
<ul>
<li>社区</li>
<li><a href={`/`} target="_blank">网站首页</a></li>
<li><a href={`https://www.trustie.net/agreement`} target="_blank">服务协议</a></li>
<li><a href={`https://forum.trustie.net/forums/1168/detail`} target="_blank">帮助中心</a></li>
<li><a href={`https://forum.trustie.net/`} target="_blank">问吧交流</a></li>
<li><a href={`https://www.trustie.net/cooperation`} target="_blank">合作伙伴</a></li>
</ul>
<ul>
<li>支持与服务</li>
<li><a href={`https://forgeplus.trustie.net/docs/api`} target="_blank">API文档</a></li>
<li><a href={`https://forum.trustie.net/forums/1168/detail`} target="_blank">帮助中心</a></li>
<li><a href={`https://git-scm.com`} target="_blank">Git常用命令</a></li>
<li><a href={`https://forum.trustie.net/forums/3080/detail`} target="_blank">DevOps使用文档</a></li>
<li><a href={`https://forgeplus.trustie.net/projects/jasder/forgeplus/tree/master/CHANGELOG.md`} target="_blank">日志更新</a></li>
</ul>
<ul>
<li>合作伙伴</li>
<li><a href={`http://www.sei.pku.edu.cn`} target="_blank">北京大学</a></li>
<li><a href={`http://scse.buaa.edu.cn`} target="_blank">北京航空航天大学</a></li>
<li><a href={`https://www.nju.edu.cn`} target="_blank">南京大学</a></li>
<li><a href={`https://www.xtu.edu.cn`} target="_blank">湘潭大学</a></li>
<li><a href={`http://www.iscas.ac.cn`} target="_blank">ISCAS</a></li>
<li><a href={`https://www.ucloud.cn`} target="_blank">UCloud优刻得</a></li>
<li><a href={`http://www.inforbus.com`} target="_blank">中创软件</a></li>
<li><a href={`https://www.inspur.com`} target="_blank">浪潮集团</a></li>
<li><a href={`http://www.copu.org.cn`} target="_blank">中国开源软件推进联盟</a></li>
<li><a href={`https://www.sjtu.edu.cn`} target="_blank">上海交通大学</a></li>
</ul>
<ul>
<li>合作伙伴</li>
<li><span>热线</span></li>
<li><span>QQ群1071514693</span></li>
</ul>
</div>
<p className="footerCopy">© Copyright 2007~2021 国防科技大学Trustie团队 & IntelliDE <a href="https://beian.miit.gov.cn">湘ICP备 17009477</a></p> */}
</div>
)
}
export default Footer;

View File

@ -7,4 +7,56 @@
.ant-menu-vertical > .ant-menu-item{
border:none
}
}
.newFooter {
position: absolute;
bottom: 0;
width: 100%;
background: #323232;
clear: both;
min-width: 1200px;
z-index: 8;
left: 0px;
p {
margin-top: 0;
margin-bottom:0px !important;
}
.footerInfos{
display: flex;
max-width: 1200px;
margin:0px auto;
justify-content: space-around;
padding:60px 0px;
& >ul{
padding:0px 40px;
box-sizing: border-box;
max-width: 25%;
text-align: left;
li{
color: #fff;
font-weight: 300;
&:first-child{
font-size: 17px;
}
&>a,&>span{
color: #bbb;
}
&>a:hover{
color: #4cacff;
}
}
}
}
.footerCopy{
color: #bbb;
border-top: 1px solid #4e4e4e;
padding:10px 0px;
a{
color: #bbb;
&:hover{
color: #4cacff;
}
}
}
}

View File

@ -257,11 +257,7 @@ class CoderRootFileDetail extends Component {
<div>
{detail.image_type ? (
<div className="edu-txt-center pt20 pb20">
<img
alt=""
src={detail.download_url}
style={{ maxWidth: "80%" }}
/>
<img alt="" src={detail.download_url} style={{ maxWidth: "80%" }} />
</div>
) : detail.direct_download ? (
<div className="mt20 text-center">

View File

@ -283,6 +283,9 @@
.downMenu{
box-shadow: 0px 0px 9px rgba(134, 134, 134,0.4);
background-color: #fff;
.ant-menu-vertical .ant-menu-item:hover{
background-color: #e6f7ff;
}
}
.menuslist{

View File

@ -67,16 +67,6 @@ li {
font-size: 25px !important;
}
.newFooter {
position: absolute;
bottom: 0;
width: 100%;
background: #323232;
clear: both;
min-width: 1200px;
z-index: 8;
left: 0px;
}
.markdown-body {
text-align: justify;

View File

@ -32,9 +32,6 @@ class Bottomsubmit extends Component {
<style>
{
`
.newFooter{
display:none;
}
.newshixunbottombtn {
position: fixed;
z-index: 1000;

View File

@ -379,16 +379,6 @@ class Paperreview extends Component {
""
}
<style>
{
`
.newFooter{
display: none;
}
`
}
</style>
<div className="w1200ms">
<div className="w100s mt30">
{

View File

@ -534,9 +534,6 @@ class Questionitem_banks extends Component {
width: 100%!important;
}
.newFooter{
display: none;
}
`
}
</style>

View File

@ -379,16 +379,6 @@ class Intecomponents extends Component {
<div>
<div id={"Itembankstopid"} className="newMain clearfix intermediatecenter "
>
<style>
{
`
.newFooter{
display: none;
}
`
}
</style>
<div className="w1200ms">
<div className="w100s mt30">
<Breadcrumb separator=">">

View File

@ -241,17 +241,6 @@ class Paperlibraryeditid extends Component {
:
""
}
<style>
{
`
.newFooter{
display: none;
}
`
}
</style>
<div className="w1200ms">
<div className="w100s mt30">
<Breadcrumb separator=">">

View File

@ -131,16 +131,6 @@ class Paperlibraryseeid extends Component {
<div id={"Itembankstopid"} className="newMain clearfix intermediatecenter "
>
<style>
{
`
.newFooter{
display: none;
}
`
}
</style>
<div className="w1200ms">
<div className="w100s mt30">
<Breadcrumb separator=">">

View File

@ -7,7 +7,6 @@ class NewFooter extends Component {
}
}
componentDidMount() {
//获取游览器地址
try {
var chromesettingArray = JSON.parse(localStorage.getItem('chromesetting'));

View File

@ -1,38 +1,30 @@
import React from 'react';
import Header from '../../forge/Head/Header'
import NewFooter from './NewFooter'
import { downloadFile } from 'educoder'
import NewFooter from '../../forge/Head/Footer';
import axios from 'axios';
import { Spin } from 'antd';
import './TPMIndex.css';
import LoginDialog from '../login/LoginDialog';
import AccountProfile from '../user/AccountProfile';
import AccountPhoneemail from '../user/AccountPhoneemail';
import EducoderAccount from '../../forge/Component/EducoderAccount';
export function TPMIndexHOC(WrappedComponent) {
return class II extends React.Component {
constructor(props) {
super(props);
window.$('#root').css('position', 'relative')
window.$('#root').css('position', 'relative');
this.state = {
tpmLoading: true,
resLoading: true,
Headertop: undefined,
Footerdown: undefined,
isRender: false,
AccountProfiletype: false,
AccountPhoneemailtype: false,
globalLoading: false,
dataquerys: {},
isloginCancel: undefined,
mygetHelmetapi: null,
giteaVisible:false,
email:undefined,
is_sync_pwd:undefined
email:undefined
}
}
@ -68,12 +60,6 @@ export function TPMIndexHOC(WrappedComponent) {
document.title = "你没有权限访问";
} else if (this.props.match.path === "/nopage") {
document.title = "没有找到该页面";
} else if (this.props.match.path === "/shixuns") {
document.title = "实训项目";
} else if (this.props.match.path === "/paths") {
document.title = "实践课程";
} else if (this.props.match.path === "/classrooms") {
document.title = "教学课堂";
}
///请求定制化的信息
@ -171,11 +157,10 @@ export function TPMIndexHOC(WrappedComponent) {
this.props.history.push(`/users/${response.data.login}`);
}
if(response.data && response.data.login){
if(!response.data.has_gitea_user || (response.data.has_gitea_user && !response.data.is_sync_pwd)){
if(response.data.need_edit_info){
this.setState({
giteaVisible:true,
email:response.data.email,
is_sync_pwd:response.data.is_sync_pwd
email:response.data.email
})
}
}
@ -184,25 +169,6 @@ export function TPMIndexHOC(WrappedComponent) {
console.log(error)
})
};
//截取url 数据的
foo = (url) => {
var json = {};
var regExp = /[\?\&](\w+)(=?)(\w*)/g;
var arr;
do {
arr = regExp.exec(url);
if (arr) {
var key = arr[1];
var value = arr[3];
if (!arr[2])
value = undefined;
json[key] = value;
}
} while (arr);
return json;
};
hideLoginDialog = () => {
this.setState({
isRender: false,
@ -221,137 +187,9 @@ export function TPMIndexHOC(WrappedComponent) {
return this.state.current_user && this.state.current_user.login != ''
}
hideAccountProfile = () => {
this.setState({
AccountProfiletype: false
})
}
showProfileCompleteDialog = () => {
this.dialogObj = {}
this.setState({
AccountProfiletype: true
})
}
showhideAccountPhoneemailDialog = () => {
this.dialogObj = {}
this.setState({
AccountPhoneemailtype: true
})
}
hideAccountPhoneemailtype = () => {
this.setState({
AccountPhoneemailtype: false
})
}
//验证是否完善资料
checkIfProfileCompleted = () => {
return this.state.current_user && this.state.current_user.profile_completed
}
showaccountprofileDialog = () => {
this.dialogObj = {
content: '您需要去完成您的个人资料,才能使用此功能',
okText: '立即完成',
okHref: '/account/profile'
}
this.setState({
AccountProfiletype: true,
})
}
showProfessionalCertificationDialog = () => {
this.dialogObj = {
content: '您需要去完成您的职业认证,才能使用此功能',
okText: '立即完成',
okHref: '/account/certification'
}
this.setState({
AccountProfiletype: true,
})
}
checkIfProfessionalCertification = () => {
return this.state.current_user && this.state.current_user.professional_certification
}
ShowOnlinePdf = (url) => {
return axios({
method: 'get',
url: url,
responseType: 'arraybuffer',
}).then((result) => {
var binaryData = [];
binaryData.push(result.data);
this.url = window.URL.createObjectURL(new Blob(binaryData, { type: "application/pdf" }));
window.open(this.url);
})
}
DownloadFileA = (title, url) => {
let link = document.createElement('a');
document.body.appendChild(link);
link.href = url;
link.download = title;
//兼容火狐浏览器
let evt = document.createEvent("MouseEvents");
evt.initEvent("click", false, false);
link.dispatchEvent(evt);
document.body.removeChild(link);
}
DownloadOpenPdf = (type, url) => {
type === true ? window.open(url) : window.location.href = url;
}
slowDownload = (url, tip) => {
this._gLoadingTip = tip || '正在生成文件,请稍后...';
this.setState({ globalLoading: true })
const fileUrl = url;
downloadFile({
url: fileUrl,
successCallback: (url) => {
this.setState({ globalLoading: false })
console.log('successCallback')
},
failCallback: (responseHtml, url) => {
this.setState({ globalLoading: false })
console.log('failCallback')
}
})
}
yslslowCheckresults = (tip) => {
this._gLoadingTip = tip || '成绩计算中,请稍候...';
this.setState({ globalLoading: true })
}
yslslowCheckresultsNo = () => {
this.setState({ globalLoading: false })
}
showGlobalLoading = (tip) => {
this._gLoadingTip = tip || '加载中,请稍后...';
this.setState({ globalLoading: true })
}
hideGlobalLoading = () => {
this.setState({ globalLoading: false })
}
MdifHasAnchorJustScorll = () => {
//mdhash滚动
let anchor = decodeURI(this.props.location.hash).replace('#', '');
// 对应id的话, 滚动到相应位置
if (!!anchor) {
let anchorElement = document.getElementsByName(anchor);
if (anchorElement) {
if (anchorElement.length > 0) {
anchorElement[anchorElement.length - 1].scrollIntoView();
}
}
}
}
onOk =(values)=>{
let url = `/accounts/gitea_register.json`;
const { email , current_user , is_sync_pwd } = this.state;
if(email && !is_sync_pwd){
url = `/users/change_password.json`;
}
let url = `/users/sync_user_info.json`;
const { current_user } = this.state;
axios.post(url,{
login:current_user && current_user.login,
...values
@ -367,42 +205,11 @@ export function TPMIndexHOC(WrappedComponent) {
}
//跳转道描点的地方
scrollToAnchor = (anchorName) => {
if (anchorName) {
// 找到锚点
let anchorElement = document.getElementById(anchorName);
// 如果对应id的锚点存在就跳转到锚点
if (anchorElement) {
anchorElement.scrollIntoView();
}
}
}
render() {
let { email , giteaVisible , Footerdown, isRender, AccountProfiletype, AccountPhoneemailtype, current_user } = this.state;
let { isRender , current_user , giteaVisible , email } = this.state;
const common = {
showLoginDialog: this.showLoginDialog,
checkIfLogin: this.checkIfLogin,
showProfileCompleteDialog: this.showProfileCompleteDialog,
showhideAccountPhoneemailDialog: this.showhideAccountPhoneemailDialog,
checkIfProfileCompleted: this.checkIfProfileCompleted,
showaccountprofileDialog: this.showaccountprofileDialog,
checkIfProfessionalCertification: this.checkIfProfessionalCertification,
showProfessionalCertificationDialog: this.showProfessionalCertificationDialog,
ShowOnlinePdf: (url) => this.ShowOnlinePdf(url),
DownloadFileA: (title, url) => this.DownloadFileA(title, url),
DownloadOpenPdf: (type, url) => this.DownloadOpenPdf(type, url),
slowDownload: this.slowDownload,
showGlobalLoading: this.showGlobalLoading,
hideGlobalLoading: this.hideGlobalLoading,
yslslowCheckresults: this.yslslowCheckresults,
yslslowCheckresultsNo: this.yslslowCheckresultsNo,
MdifHasAnchorJustScorll: this.MdifHasAnchorJustScorll,
scrollToAnchor: this.scrollToAnchor
};
return (
<div className="indexHOC">
@ -412,42 +219,21 @@ export function TPMIndexHOC(WrappedComponent) {
{...this.props}
{...this.state}
/> : ""}
{/* AccountProfile 也用作职业认证 */}
{AccountProfiletype === true ? <AccountProfile
hideAccountProfile={() => this.hideAccountProfile()}
{...this.props}
{...this.state}
{...this.dialogObj}
/> : ""}
{/*验证是否注册手机邮箱*/}
{AccountPhoneemailtype === true ? <AccountPhoneemail
hideAccountProfile={() => this.hideAccountPhoneemailtype()}
{...this.props}
{...this.state}
{...this.dialogObj}
/> : ""}
<Header {...this.state} {...this.props}></Header>
<Spin spinning={this.state.globalLoading} delay={0} className="globalSpin"
size="large"
tip={this._gLoadingTip || "加载中..."}
size="large" tip={this._gLoadingTip || "加载中..."}
>
<div className="newContainer newContainers">
<div style={{height:"70px"}}></div>
{
current_user &&
<WrappedComponent initCommonState={(user) => this.initCommonState(user)}
{...this.props} {...this.state}
{...common}
>
{...this.props} {...this.state} {...common} >
</WrappedComponent>
}
</div>
</Spin>
<NewFooter
{...this.state} {...this.props}
Footerdown={Footerdown}
/>
<NewFooter {...this.state} {...this.props} />
</div>
);
}