本地版:顶部导航和质量分析

This commit is contained in:
caishi 2021-07-14 10:00:03 +08:00
parent 3b7766bd71
commit 83a5a5111f
8 changed files with 180 additions and 45 deletions

View File

@ -183,7 +183,6 @@ class App extends Component {
render() {
const { mygetHelmetapi } = this.state;
let personal = mygetHelmetapi && mygetHelmetapi.personal;
return (
<Provider store={store}>
<ConfigProvider locale={zhCN}>

View File

@ -32,7 +32,7 @@ export function initAxiosInterceptors(props) {
// 判断网络是否连接
initOnlineOfflineListener();
var proxy = "https://testforgeplus.educoder.net";
var proxy = "http://106.75.178.228:81";
//响应前的设置
axios.interceptors.request.use(
config => {
@ -45,11 +45,11 @@ export function initAxiosInterceptors(props) {
if (`${config[0]}` !== `true`) {
if (window.location.port === "3007") {
config.url = `${proxy}${url}`;
if (config.url.indexOf('?') === -1) {
config.url = `${config.url}?debug=${debugType}`;
} else {
config.url = `${config.url}&debug=${debugType}`;
}
// if (config.url.indexOf('?') === -1) {
// config.url = `${config.url}?debug=${debugType}`;
// } else {
// config.url = `${config.url}&debug=${debugType}`;
// }
} else {
config.url = url;
}

View File

@ -233,7 +233,7 @@ function About(props, ref) {
step === 1 ?
<div>
<AlignCenter style={{justifyContent:"center",marginTop:"20px"}}>
<span style={{marginBottom:"42px"}}>密码</span>
<span className="mb40">密码</span>
<div>
<Input.Password value={authorityVal} className={authorityValFlag===true && "flags"} onChange={(e)=>setAuthorityVal(e.target.value)} style={{width:"220px"}}></Input.Password>
<p className="color-grey-9" style={{textAlign:"left",lineHeight:'21px'}}>您已保存相关服务器信息请输入密码<br/>确认授权DevOps应用</p>

View File

@ -291,6 +291,26 @@ class NewHeader extends Component {
)
}
classMenu=(http)=>{
return(
<Menu className="headmenus">
<Menu.Item><a href={`${http}/classrooms`}>课堂实践管理</a></Menu.Item>
<Menu.Item><a href={`${http}/classrooms/9468/shixun_homework`}>作业管理</a></Menu.Item>
<Menu.Item><a href={`${http}/paperlibrary`}>考试与题库管理</a></Menu.Item>
<Menu.Item><a href={`${http}/paths`}>教学资源库</a></Menu.Item>
</Menu>
)
}
moopMenu=(http,forgeHttp)=>{
return(
<Menu className="headmenus">
<Menu.Item><a href={`${http}/moop_cases`}>案列管理</a></Menu.Item>
<Menu.Item><a href={`${http}/competitions`}>竞赛管理</a></Menu.Item>
<Menu.Item><a href={forgeHttp}>协同开发</a></Menu.Item>
</Menu>
)
}
render() {
const { match} = this.props;
let current_user = this.props.user;
@ -409,41 +429,48 @@ class NewHeader extends Component {
""
}
<div className="head-nav pr" id={"head-navpre1"}>
{
settings && settings.navbar && settings.navbar.length > 0 ?
<ul id="header-nav">
{
settings.navbar && settings.navbar.map((item, key) => {
var new_link = item.link;
var user_login = this.props.user && this.props.user.login;
var is_hidden = item.hidden
if (new_link && (new_link.indexOf("courses") > -1 || new_link.indexOf("contests") > -1)) {
if (user_login) {
if (new_link.indexOf("courses") > -1) {
new_link = new_link.replace(/courses/g, "users/" + user_login + "/courses")
} else if (new_link.indexOf("contests") > -1) {
new_link = new_link.replace(/contests/g, "users/" + user_login + "/contests")
}
} else {
is_hidden = true
<ul id="header-nav">
<li>
<Dropdown overlay={this.classMenu(settings && settings.new_course.default_url)} placement={"bottomCenter"}>
<a href={`${settings && settings.new_course.default_url}/classrooms`}>大数据实验教学资源</a>
</Dropdown>
</li>
<li><a href={`${settings && settings.new_course.default_url}/shixuns`}>数据科学支撑工具集和实训</a></li>
<li>
<Dropdown overlay={this.moopMenu(settings && settings.new_course.default_url,settings && settings.new_course.forge_url)} placement={"bottomCenter"}>
<a href={`${settings && settings.new_course.default_url}/moop_cases`}>大数据工程教研</a>
</Dropdown>
</li>
{/* {
settings.navbar && settings.navbar.map((item, key) => {
var new_link = item.link;
var user_login = this.props.user && this.props.user.login;
var is_hidden = item.hidden
if (new_link && (new_link.indexOf("courses") > -1 || new_link.indexOf("contests") > -1)) {
if (user_login) {
if (new_link.indexOf("courses") > -1) {
new_link = new_link.replace(/courses/g, "users/" + user_login + "/courses")
} else if (new_link.indexOf("contests") > -1) {
new_link = new_link.replace(/contests/g, "users/" + user_login + "/contests")
}
} else {
is_hidden = true
}
if (user_login && (new_link && new_link.indexOf("homes") > -1)) {
new_link = new_link.replace(/homes/g, "users/" + user_login + "/user_activities")
}
var waiLian = (new_link && str.filter(item=>new_link.indexOf(item)>-1) );
var wl = waiLian && waiLian.length>0;
return (
<li key={key} onClick={() => this.headtypesonClick(item.link, true)} className={`${this.matchpaths(item.link) === true ? 'pr active' : 'pr'}`} style={!is_hidden ? { display: 'flex' } : { display: 'none' }}>
<a href={new_link} target={wl ? "_self":"_blank"}><div dangerouslySetInnerHTML={{ __html: item.name }}></div></a>
</li>
)
})
}
</ul>
: ""
}
}
if (user_login && (new_link && new_link.indexOf("homes") > -1)) {
new_link = new_link.replace(/homes/g, "users/" + user_login + "/user_activities")
}
var waiLian = (new_link && str.filter(item=>new_link.indexOf(item)>-1) );
var wl = waiLian && waiLian.length>0;
return (
<li key={key} onClick={() => this.headtypesonClick(item.link, true)} className={`${this.matchpaths(item.link) === true ? 'pr active' : 'pr'}`} style={!is_hidden ? { display: 'flex' } : { display: 'none' }}>
<a href={new_link} target={wl ? "_self":"_blank"}><div dangerouslySetInnerHTML={{ __html: item.name }}></div></a>
</li>
)
})
} */}
</ul>
</div>
<div className="head-right">
{search_url ? this.SearchInput(openSearch,search_url):""}
@ -453,7 +480,6 @@ class NewHeader extends Component {
<i className="iconfont icon-tianjiafangda color-white ml30"></i>
</Dropdown>:""
}
{this.props.user && this.props.user.login && notice_url ?
<div className="ml30 edu-menu-panel">
{user && user.login &&

View File

@ -14,6 +14,11 @@
}
}
}
.headmenus{
.ant-dropdown-menu-item:hover{
background-color: #f5f5f5;
}
}
.dropdownFlex{
display:flex;
background:#fff;

View File

@ -127,7 +127,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
<li className={pathname === "sonar" ? "active" : ""}>
<Link to={`/projects/${owner}/${projectsId}/sonar`}>
<i className={url && url.indexOf("/sonar") > 0 ? "iconfont icon-tijiao color-grey-3 mr5 font-18":"iconfont icon-tijiao color-grey-6 font-18 mr5"}></i>
<span>质量分析</span>
<span>质量分析/检测</span>
</Link>
</li>
}

View File

@ -1,17 +1,81 @@
import React from 'react';
import React, { useEffect, useState } from 'react';
import sonar from '../Images/sonar.png';
import { FlexAJ } from '../Component/layout';
import { Button } from 'antd';
import './index.scss';
import axios from 'axios';
function Index(props) {
const [ spining , setSpining ] = useState(false);
const [ data , setData ] = useState(null);
const permission = props.projectDetail && props.projectDetail.permission;
const { owner , projectsId } = props.match.params;
useEffect(()=>{
if(permission && permission!=="Reporter"){
run();
}
},[permission])
function startCheck() {
setSpining(true);
run();
}
function run() {
const url = `/${owner}/${projectsId}/sonarqube.json`;
axios.get(url).then(result=>{
if(result){
setSpining(false);
setData(result.data);
}
}).catch(error=>{setSpining(false);})
}
return(
<div className="sonarBox">
<img src={sonar} alt=""/>
<FlexAJ>
<img src={sonar} alt=""/>
<Button type={"primary"} loading={spining} onClick={startCheck} disabled={permission !== "Admin" && permission !== "Owner" && permission !== "Manager"}>{spining ? "分析中":"质量分析"}</Button>
</FlexAJ>
<div className="sonarDesc">
<p>1. 基于 Sonar 的代码质量分析支持对项目进行代码行数重复率统计代码逻辑缺陷扫描等功能并给出对应解决报告;</p>
<p>2. 目前支持 JavaJavaScriptC++GoPythonPHPRubyGroovyLuaTypeScriptWebXML</p>
<p>3. 默认支持代码文本格式全为 UTF-8其他编码可能会产生乱码</p>
<p>4. 仅保存最近一次分析结果;</p>
</div>
{
data && data.length>0 && data.map((i,k)=>{
return(
<div className="sonarData">
<p className="color-grey-9 font-16">分支<span className="color-grey-6">{i.branch_name}</span></p>
<div>
<span className="color-grey-9 mr30">开始时间<span className="color-grey-6">{i.created_at}</span></span>
<span className="color-grey-9">结束时间<span className="color-grey-6">{i.updated_at}</span></span>
</div>
<ul className="sonarList">
<li>
<span>{i.bug_num || "0"}</span>
<span>bugs</span>
</li>
<li>
<span>{i.loopholes || "0"}</span>
<span>漏洞</span>
</li>
<li>
<span>{i.repetition_rate || "--"}</span>
<span>重复</span>
</li>
<li>
<span>{i.file_num || "0"}</span>
<span>代码行数</span>
</li>
</ul>
</div>
)
})
}
</div>
)
}

View File

@ -11,4 +11,45 @@
margin-bottom: 10px!important;
}
}
.sonarData{
border:1px solid #eee;
border-radius: 4px;
padding:10px 20px;
margin-top: 20px;
}
.sonarList{
display: flex;
margin-top: 10px;
li{
min-width: 150px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
position: relative;
margin-right: 10px;
border-radius: 4px;
&:last-child{
margin-right: 0px;
flex:1;
align-items: flex-end;
}
&:last-child::after{
height: 0px;
}
&::after{
position: absolute;
right: 0px;
height: 30px;
width: 1px;
content: "";
background-color: #eee;
top:50%;
margin-top: -15px;
}
span{
color: #666;
}
}
}
}