Merge pull request '更新glcc' (#542) from durian/forgeplus-react:gitlink_server into gitlink_server

This commit is contained in:
durian 2023-06-14 16:46:39 +08:00
commit 8923fe0194
12 changed files with 105 additions and 47 deletions

View File

@ -159,7 +159,7 @@ export default (props) => {
<div></div>
</div>
<div className="intro">OpenMMLab是深度学习时代最完整的计算机视觉开源算法体系自开源以来累计发布了超过20个算法库有超过300个算法2300多个预训练模型所有算法均具备风格统一模型丰富质量高易复现等特点在社区生态上OpenMMLab一直秉持开放认真持续成长的原则积极推动社区建设发展</div>
<div className="goToButBox"><button className="goToBut" onClick={()=>{window.location.href='/glcc/openmmlab'}}>查看详情</button></div>
<div className="goToButBox"><button className="goToBut" onClick={()=>{window.location.href='/glcc/openmmlab/2022'}}>查看详情</button></div>
</div>}
</div>
</div>

View File

@ -124,7 +124,8 @@ const Glcc = (propsF) => {
//
function judge(nowTime, timeRnge, type){
const timeArr = timeRnge.split(",").map(item=>{
const data = item && item.replaceAll('-', '/');
// replaceAll
const data = item && item.replace(/-/g,'/');
return new Date(data).getTime()
});
return type === "range" ? nowTime > timeArr[0] && nowTime < timeArr[1] : nowTime > timeArr[0]
@ -235,14 +236,14 @@ const Glcc = (propsF) => {
{!(round === 2 && !repoPublic) && <Route
path="/glcc/:id/subjects/detail/:taskId"
render={(props) => (
<TaskDetail {...propsF} {...props} applyTaskId={applyTaskId} applyTask={applyTask} period={period}/>
<TaskDetail {...propsF} {...props} applyTaskId={applyTaskId} applyTask={applyTask} period={period} round={round} currentRound={currentRound}/>
)}
></Route>}
{/* 项目/课题列表 */}
{!(round === 2 && !repoPublic) && <Route
path="/glcc/:id/projects"
render={(props) => (
<Project period={period} round={round} {...propsF} {...props} applyTaskId={applyTaskId} setStudentInfoReset={setStudentInfoReset} applyTask={applyTask}/>
<Project period={period} round={round} {...propsF} {...props} applyTaskId={applyTaskId} setStudentInfoReset={setStudentInfoReset} applyTask={applyTask} currentRound={currentRound}/>
)}
></Route>}
@ -250,7 +251,7 @@ const Glcc = (propsF) => {
{!(round === 2 && !repoPublic) && <Route
path="/glcc/:id/subjects"
render={(props) => (
<Project period={period} round={round} {...propsF} {...props} applyTaskId={applyTaskId} setStudentInfoReset={setStudentInfoReset} cancelCount={cancelCount} applyTask={applyTask}/>
<Project period={period} round={round} {...propsF} {...props} applyTaskId={applyTaskId} setStudentInfoReset={setStudentInfoReset} cancelCount={cancelCount} applyTask={applyTask} currentRound={currentRound}/>
)}
></Route>}
@ -258,7 +259,7 @@ const Glcc = (propsF) => {
<Route
path="/glcc/openmmlab"
render={(props) => (
<Openmmlab {...propsF} {...props} applyTaskId={applyTaskId} setStudentInfoReset={setStudentInfoReset} applyTask={applyTask}/>
<Openmmlab period={period} {...propsF} {...props} applyTaskId={applyTaskId} setStudentInfoReset={setStudentInfoReset} applyTask={applyTask}/>
)}
></Route>

View File

@ -9,6 +9,7 @@ import { projectList } from '../api';
import './index.scss';
function Openmmlab(props) {
const {location:{pathname}} = props;
const [list, setList] = useState([]);
@ -19,8 +20,9 @@ function Openmmlab(props) {
useEffect(() => {
const params = {
curPage: 1,
keyword: 'openmmlab',
pageSize: 10000
keyword: 'openmmlab-',
pageSize: 10000,
round: pathname && pathname.endsWith("/2022") ? 1 : 2
}
projectList(params).then(response => {
if (response && response.message === "success") {
@ -40,23 +42,23 @@ function Openmmlab(props) {
<div className="openmmlab_slider openmmlab_main">
<div className="slider_left">
<SliderLeft />
<SliderLeft pathname={pathname}/>
</div>
<div className="slider_right">
<SliderRight list={list} {...props}/>
<SliderRight list={list} {...props} year={pathname.endsWith("/2022") ? "2022" : "2023"}/>
</div>
</div>
</div>
<div className="openmmlab_title">项目精选</div>
<ProjectTabs {...props} list={list} />
<ProjectTabs {...props} list={list} year={pathname.endsWith("/2022") ? "2022" : "2023"}/>
<div className="teachers">
{pathname.endsWith("/2022") && <div className="teachers">
<div className="teachers_tit">
导师一览
</div>
<Teachers />
</div>
</div>}
</div>
)
}

View File

@ -7,7 +7,7 @@ const $ = window.$;
const { TabPane } = Tabs;
function ProjectTabs({ list, applyTaskId, history, current_user, showLoginDialog, applyTask }) {
function ProjectTabs({ list, applyTaskId, history, current_user, showLoginDialog, applyTask, year, period }) {
useEffect(()=>{
setTimeout(()=>{
@ -16,7 +16,6 @@ function ProjectTabs({ list, applyTaskId, history, current_user, showLoginDialog
},(e)=>{
});
},1000)
},[])
return (
@ -34,7 +33,7 @@ function ProjectTabs({ list, applyTaskId, history, current_user, showLoginDialog
key={i + ''} >
<div className="tab_content">
<div className="openmmlab_tab_content">
<ProjectDetail detail={item} applyTaskId={applyTaskId} current_user={current_user} showLoginDialog={showLoginDialog} applyTask={applyTask}/>
<ProjectDetail detail={item} applyTaskId={applyTaskId} current_user={current_user} showLoginDialog={showLoginDialog} applyTask={applyTask} year={year} period={period}/>
</div>
</div>

View File

@ -1,6 +1,9 @@
.ant-tabs.openmmlab_tab {
background-color: #2c374e;
color: #fff;
.ant-tabs-left-content{
border-left: none;
}
.ant-tabs-bar {
width: calc((100vw - 1200px) / 2 + 216px);
@ -59,7 +62,7 @@
.tab_type {
opacity: .8;
display: block;
width: 72px;
width: 105px;
height: 30px;
border: 1px solid#ffffff;
border-radius: 4px;
@ -85,7 +88,7 @@
}
.openmmlab_tab_content {
width:954px;
height:813px;
// height:813px;
padding: 21px 30px 50px;
// color: rgba(0,0,0,.65);
background-image: url('../../img/openmmlab/tabBackground.png') ;

View File

@ -3,7 +3,7 @@ import { Button, message, Tooltip } from 'antd';
import Nodata from '../../../forge/Nodata';
import { getProjectById } from '../../api';
export default ({ detail, projectId, applyTaskId, applyTask }) => {
export default ({ detail, projectId, applyTaskId, applyTask, year, period }) => {
const [info, setInfo] = useState(detail);
useEffect(()=>{
@ -26,7 +26,7 @@ export default ({ detail, projectId, applyTaskId, applyTask }) => {
{info.registrationTaskList && info.registrationTaskList.length > 0 ? info.registrationTaskList.map((item, index)=>{
return <div className='taskItem mt15' key={index}>
<div className="left">
<div className="taskTitle" onClick={()=>{window.location.href=`/glcc/2022/subjects/detail/${item.id}`}}><Tooltip title={item.taskName}>{item.taskName}</Tooltip></div>
<div className="taskTitle" onClick={()=>{window.location.href=`/glcc/${year}/subjects/detail/${item.id}`}}><Tooltip title={item.taskName}>{item.taskName}</Tooltip></div>
<div className='mt15 oneLine leftWidth'>导师姓名: &nbsp;&nbsp;{item.tutorName}</div>
{item.tutorMail && <div className='mb15 email oneLine leftWidth'>邮箱地址: &nbsp;&nbsp;<span><Tooltip title={item.tutorMail}>{item.tutorMail}</Tooltip></span></div>}
</div>
@ -35,16 +35,16 @@ export default ({ detail, projectId, applyTaskId, applyTask }) => {
{item.taskUrl && <div className="taskUrl oneLine">课题链接: &nbsp;&nbsp;<a href={item.taskUrl} target={"_blank"}>{item.taskUrl}</a></div>}
<div>
{/* 报名详情按钮 */}
{applyTaskId && Object.keys(applyTaskId).includes(item.id.toString()) && <Button onClick={()=>{window.location.href=`/glcc/student/apply/${item.id}`}} className='lookDetail mr10'>报名详情</Button>}
{year === "2023" && applyTaskId && Object.keys(applyTaskId).includes(item.id.toString()) && <Button onClick={()=>{window.location.href=`/glcc/student/apply/${item.id}`}} className='lookDetail mr10'>报名详情</Button>}
{/* 课题申请时间范围内: 申请课题 */}
{/* 第一次报名 */}
{false && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && <Button type='primary' className='applyBut mr10' onClick={()=>{applyTask(item.id)}}>申请课题</Button>}
{year === "2023" && period === "stuApply" && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && <Button type='primary' className='applyBut mr10' onClick={()=>{applyTask(item.id)}}>申请课题</Button>}
{/* 第二次报名 锁定状态 */}
{false && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && (item.locked ? <Tooltip title={"该课题已有学生入选"}><Button type='primary' className='mr10' disabled>申请课题</Button></Tooltip> : <Button type='primary' className='applyBut mr10' onClick={()=>{applyTask(item.id)}}>申请课题</Button>)}
{year === "2023" && period === "stuApply1" && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && (item.locked ? <Tooltip title={"该课题已有学生入选"}><Button type='primary' className='mr10' disabled>申请课题</Button></Tooltip> : <Button type='primary' className='applyBut mr10' onClick={()=>{applyTask(item.id)}}>申请课题</Button>)}
{/* 查看课题详情按钮 */}
<Button onClick={()=>{window.open(`/glcc/subjects/detail/${item.id}`)}} className='lookDetail'>课题详情</Button>
<Button onClick={()=>{window.open(`/glcc/${year}/subjects/detail/${item.id}`)}} className='lookDetail'>课题详情</Button>
</div>
</div>
<div className="right oneLine taskUrl"><span className='taskReward'>{item.taskReward}</span></div>

View File

@ -62,6 +62,59 @@ const arithmeticArr = [
},
];
const arithmeticArr2023 = [
{
name: "MMEngine算法演示",
describe: "MMEngine 是一个基于 PyTorch 实现的,用于训练深度学习模型的基础库。它为开发人员提供了坚实的工程基础,以此避免在工作流上编写冗余代码。作为 OpenMMLab 所有代码库的训练引擎其在不同研究领域支持了上百个算法。此外MMEngine 也可以用于非 OpenMMLab 项目中。",
source: 'https://www.gitlink.org.cn/api/attachments/422473',
type: 'img',
},
{
name: "MMPreTrain算法演示",
describe: "MMPretrain 是一个全新升级的预训练开源算法框架旨在提供各种强大的预训练主干网络并支持不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和 MMSelfSup并开放一系列新功能。 目前,预训练阶段对于视觉识别至关重要,凭借丰富而强大的预训练模型,我们能够改进各种下游视觉任务。",
type: 'img',
source: 'https://www.gitlink.org.cn/api/attachments/422508'
},
{
name: "MMDetection算法演示",
describe: "MMDetection 是 OpenMMLab 中的通用目标检测算法平台,目前已经支持了 70+ 算法和 500+ 个预训练模型,支持目标检测、实例分割和全景分割。是 OpenMMLab 算法库中的MMDetection3D 和 MMRotate 的核心依赖,为 MMOCR、MMPose 和 MMTracking 提供了检测组件",
source: 'https://www.gitlink.org.cn/api/attachments/388003',
type: 'img',
},
{
name: "MMDetection3D算法演示",
describe: "MMDetection3D 是 OpenMMLab 中的通用 3D 感知算法平台,目前已经支持了室内外多个主流数据集的单模态/多模态 3D 检测和点云分割算法。同时 MMDetection3D 可以无缝使用 MMDetection 中的所有组件,为多模态感知提供了丰富的基础模块",
source: 'https://www.gitlink.org.cn/api/attachments/387953',
type: 'img',
},
{
name: "MMSegmentation算法演示",
describe: "MMSegmentation 是 OpenMMLab 中的语义分割算法工具箱,目前已经支持了 49 个算法600+ 个预训练模型。为语义分割任务的统一实现和模型评估提供了一个框架,并且高质量实现了常用的语义分割方法和数据集。",
source: 'https://www.gitlink.org.cn/api/attachments/422474',
type: 'img',
},
{
name: "MMAction2算法演示",
describe: "MMAction2 是一个基于 PyTorch 的开源工具箱,支持众多视频理解模型,包括动作识别、基于骨架的动作识别、时空动作检测和时间动作定位。 此外,它支持广泛使用的学术数据集,并提供许多有用的工具,帮助用户探索模型和数据集,以及实现高质量的算法。",
source: 'https://www.gitlink.org.cn/api/attachments/422475',
type: 'img',
},
{
name: "MMPose算法演示",
describe: "MMPose 是 OpenMMLab 中的姿态估计算法库,目前已经支持了近 30 个算法和 300+ 预训练模型,涵盖了人体、人脸、人手、动物等多类目标的姿态估计。秉承 OpenMMLab 系列的结构化框架设计MMPose 很适合作为算法复现和创新的平台",
source: 'https://www.gitlink.org.cn/api/attachments/388257.mp4',
type: 'mp4',
img: 'https://www.gitlink.org.cn/api/attachments/388256'
},
{
name: "MMagic算法演示",
describe: "MMagic 是 OpenMMLab 中的图像&视频生成和编辑的开源算法平台,涵盖 GANdiffusion model 多种生成模型,支持 Stable Diffusion 的微调和多种 diffusion 应用。同时支持图像修复、图文生成、3D生成、图像修补、抠图、超分辨率和生成等多种任务。利用 MMagic通过组合不同模块轻松构建自定义的生成模型。",
source: 'https://www.gitlink.org.cn/api/attachments/422478.mp4',
img: 'https://www.gitlink.org.cn/api/attachments/388256',
type: 'mp4',
},
];
let setting = {
infinite: true,
dots: true,
@ -76,11 +129,12 @@ let setting = {
autoplay: true,
arrows: false,
}
function SliderLeft() {
function SliderLeft(props) {
const {pathname} = props;
const arr = pathname.endsWith("/2022") ? arithmeticArr : arithmeticArr2023
return (
<Slider {...setting}>
{arithmeticArr.map(item => {
{arr.map(item => {
return <div className="slider_content" key={item.name}>
<div className={`slider_img ${item.name.split('算法演示')[0]}`} >
{item.type == 'img' && <img src={item.source} />}
@ -97,8 +151,8 @@ function SliderLeft() {
{
item.name === 'MMDetection3D算法演示' && <div className="point">
<div className="point_item">7 个数据集</div>
<div className="point_item">17 种不同算法</div>
<div className="point_item">80+ 个预训练模型</div>
<div className="point_item">{pathname.endsWith("/2022") ? "17" : "30+"} 种不同算法</div>
<div className="point_item">{pathname.endsWith("/2022") ? "80" : "90"}+ 个预训练模型</div>
</div>
}
</div>

View File

@ -90,6 +90,9 @@
// max-height: 100%;
}
}
.MMagic .introduce-video{
max-height: 112%;
}
.MMDetection3D,.MMClassification {
padding:30px 0;

View File

@ -17,15 +17,11 @@ let setting = {
vertical: true,
}
function SliderLeft({list,history}) {
function SliderLeft({list,year}) {
function goDetail(projectName){
// history.push({
// pathname:'/glcc/projects',
// state:{projectName:projectName.replace(/ /g,'-')}
// })
window.open(`/glcc/2022/projects?projectName=${projectName.replace(/ /g,'')}`);
window.open(`/glcc/${year}/projects?projectName=${projectName.replace(/ /g,'')}`);
}
return (

View File

@ -39,13 +39,13 @@ export default ({ detail, projectId, applyTaskId, period, showTask=true, applyTa
{item.taskUrl && <div className="taskUrl oneLine">课题链接: &nbsp;&nbsp;<a href={item.taskUrl} target={"_blank"}>{item.taskUrl}</a></div>}
<div>
{/* 报名详情按钮 */}
{applyTaskId && Object.keys(applyTaskId).includes(item.id.toString()) && <Button onClick={()=>{window.location.href=`/glcc/student/apply/${item.id}`}} className='lookDetail mr10'>报名详情</Button>}
{round === 2 && applyTaskId && Object.keys(applyTaskId).includes(item.id.toString()) && <Button onClick={()=>{window.location.href=`/glcc/student/apply/${item.id}`}} className='lookDetail mr10'>报名详情</Button>}
{/* 课题申请时间范围内: 申请课题 */}
{/* 第一次报名 */}
{period === "stuApply" && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && <Button type='primary' className='applyBut mr10' onClick={()=>{applyTask(item.id)}}>申请课题</Button>}
{round === 2 && period === "stuApply" && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && <Button type='primary' className='applyBut mr10' onClick={()=>{applyTask(item.id)}}>申请课题</Button>}
{/* 第二次报名 锁定状态 */}
{period === "stuApply1" && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && (item.locked ? <Tooltip title={"该课题已有学生入选"}><Button type='primary' className='mr10' disabled>申请课题</Button></Tooltip> : <Button type='primary' className='applyBut mr10' onClick={()=>{applyTask(item.id)}}>申请课题</Button>)}
{round === 2 && period === "stuApply1" && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && (item.locked ? <Tooltip title={"该课题已有学生入选"}><Button type='primary' className='mr10' disabled>申请课题</Button></Tooltip> : <Button type='primary' className='applyBut mr10' onClick={()=>{applyTask(item.id)}}>申请课题</Button>)}
{/* 查看课题详情按钮 */}
<Button onClick={()=>{window.open(`/glcc/${id}/subjects/detail/${item.id}`)}} className='lookDetail'>课题详情</Button>

View File

@ -7,7 +7,7 @@ import './index.scss';
//
function TaskDetail(props) {
const {match, location, period, applyTaskId, applyTask, match:{params:{id}}} = props
const {match, location, period, applyTaskId, applyTask, match:{params:{id}}, currentRound, round} = props
const taskId = Number(match.params.taskId);
const [detail, setDetail] = useState(undefined);
@ -48,13 +48,13 @@ function TaskDetail(props) {
<div className='desc'>{detail.taskDesc}</div>
</div>
{/* 报名详情按钮 */}
{applyTaskId && Object.keys(applyTaskId).includes(taskId.toString()) && <Button onClick={()=>{window.location.href=`/glcc/student/apply/${taskId}`}} className='lookDetail detailBut'>报名详情</Button>}
{round === currentRound && applyTaskId && Object.keys(applyTaskId).includes(taskId.toString()) && <Button onClick={()=>{window.location.href=`/glcc/student/apply/${taskId}`}} className='lookDetail detailBut'>报名详情</Button>}
{/* 课题申请时间范围内: 申请课题 */}
{/* 第一次报名 */}
{period==="stuApply" && !(applyTaskId && Object.keys(applyTaskId).includes(taskId.toString())) && <Button type='primary' className='applyBut detailBut' onClick={()=>{applyTask(taskId)}}>申请课题</Button>}
{round === currentRound && period==="stuApply" && !(applyTaskId && Object.keys(applyTaskId).includes(taskId.toString())) && <Button type='primary' className='applyBut detailBut' onClick={()=>{applyTask(taskId)}}>申请课题</Button>}
{/* 第二次报名 锁定状态 */}
{period === "stuApply1" && !(applyTaskId && Object.keys(applyTaskId).includes(taskId.toString())) && (detail.locked ? <Tooltip title={"该课题已有学生入选"}><Button type='primary' className='mr10 detailBut' disabled>申请课题</Button></Tooltip> : <Button type='primary' className='applyBut mr10 detailBut' onClick={()=>{applyTask(taskId)}}>申请课题</Button>)}
{round === currentRound && period === "stuApply1" && !(applyTaskId && Object.keys(applyTaskId).includes(taskId.toString())) && (detail.locked ? <Tooltip title={"该课题已有学生入选"}><Button type='primary' className='mr10 detailBut' disabled>申请课题</Button></Tooltip> : <Button type='primary' className='applyBut mr10 detailBut' onClick={()=>{applyTask(taskId)}}>申请课题</Button>)}
</div>
<img src={bgPng} alt='' className='bgPng1'/>
<img src={bgPng} alt='' className='bgPng2'/>

View File

@ -7,7 +7,7 @@ import bgPng from "../../img/bgPng.png";
const { Search } = Input;
//
function TaskList({applyTaskId, setStudentInfoReset, current_user, showLoginDialog,cancelCount,showNotification, applyTask, round, match:{params:{id}}, period }) {
function TaskList({applyTaskId, setStudentInfoReset, current_user, showLoginDialog,cancelCount,showNotification, applyTask, round, match:{params:{id}}, period, currentRound }) {
const [visible, setVisible] = useState(false);
const [deleteTaskId, setDeleteTaskId] = useState(undefined);
//
@ -33,16 +33,16 @@ function TaskList({applyTaskId, setStudentInfoReset, current_user, showLoginDial
return (
<div className='actionBox'>
{/* 报名详情按钮 */}
{applyTaskId && Object.keys(applyTaskId).includes(item.id.toString()) && <span onClick={()=>{window.location.href=`/glcc/student/apply/${item.id}`}}><i className='iconfont icon-baomingxiangqingicon mr5'></i>报名详情</span>}
{round === currentRound && applyTaskId && Object.keys(applyTaskId).includes(item.id.toString()) && <span onClick={()=>{window.location.href=`/glcc/student/apply/${item.id}`}}><i className='iconfont icon-baomingxiangqingicon mr5'></i>报名详情</span>}
{/* 取消按钮5.26-6.25 */}
{(period === "stuApply" || period === "stuApply1") && applyTaskId && Object.keys(applyTaskId).includes(item.id.toString()) && <Tooltip title={"取消申请"}><i className='iconfont icon-shanchuicon3 ml20 cancelApply' onClick={()=>{deleteItem(item.id)}}></i></Tooltip>}
{round === currentRound && (period === "stuApply" || period === "stuApply1") && applyTaskId && Object.keys(applyTaskId).includes(item.id.toString()) && <Tooltip title={"取消申请"}><i className='iconfont icon-shanchuicon3 ml20 cancelApply' onClick={()=>{deleteItem(item.id)}}></i></Tooltip>}
{/* 课题申请时间范围内: 申请课题 */}
{/* 第一次报名 */}
{period === "stuApply" && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && <span onClick={()=>{applyTask(item.id)}}><i className='iconfont icon-shenqingketiicon applyTask mr5'></i><span className='applyTask'>申请课题</span></span>}
{round === currentRound && period === "stuApply" && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && <span onClick={()=>{applyTask(item.id)}}><i className='iconfont icon-shenqingketiicon applyTask mr5'></i><span className='applyTask'>申请课题</span></span>}
{/* 第二次报名 锁定状态 */}
{period === "stuApply1" && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && (item.locked ? <Tooltip title={"该课题已有学生入选"}><span className='disabled'><i className='iconfont icon-shenqingketiicon mr5 disabled'></i><span className='disabled'>申请课题</span></span></Tooltip> : <span onClick={()=>{applyTask(item.id, item.locked)}}><i className='iconfont icon-shenqingketiicon applyTask mr5'></i><span className='applyTask'>申请课题</span></span>)}
{round === currentRound && period === "stuApply1" && !(applyTaskId && Object.keys(applyTaskId).includes(item.id.toString())) && (item.locked ? <Tooltip title={"该课题已有学生入选"}><span className='disabled'><i className='iconfont icon-shenqingketiicon mr5 disabled'></i><span className='disabled'>申请课题</span></span></Tooltip> : <span onClick={()=>{applyTask(item.id, item.locked)}}><i className='iconfont icon-shenqingketiicon applyTask mr5'></i><span className='applyTask'>申请课题</span></span>)}
</div>
)
})