forked from Gitlink/forgeplus-react
本地版:顶部导航和质量分析
This commit is contained in:
parent
3b7766bd71
commit
83a5a5111f
|
|
@ -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}>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 &&
|
||||
|
|
|
|||
|
|
@ -14,6 +14,11 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
.headmenus{
|
||||
.ant-dropdown-menu-item:hover{
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
}
|
||||
.dropdownFlex{
|
||||
display:flex;
|
||||
background:#fff;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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. 目前支持 Java、JavaScript、C++、Go、Python、PHP、Ruby、Groovy、Lua、TypeScript、Web、XML;</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>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue