This commit is contained in:
谢思 2022-04-27 17:37:21 +08:00
parent 80bd13a47f
commit c4962c4efa
9 changed files with 162 additions and 49 deletions

View File

@ -73,4 +73,9 @@ export async function updateQz2022(data){
// 修改竞赛报名状态
export async function updateEnroll(data){
return axios.post(`/competition_infos/qz2022/enroll_status_update.json`,data);
}
// 报名表扫描件上传
export async function updateTemplate(data){
return axios.post(`/competition_infos/qz2022/upload_enroll_template.json`,data);
}

View File

@ -1,7 +1,8 @@
import React, {useState, useCallback} from "react";
import { Input, Select, Button, Form, message, Radio, Modal } from 'antd';
import { Input, Select, Button, Form, message, Radio, Modal, Upload, Icon } from 'antd';
import { appendFileSizeToUploadFileAll } from 'educoder';
import { Base64 } from 'js-base64';
import {enrollCompetition, enrollUpdate} from '../api';
import {enrollCompetition, enrollUpdate, updateTemplate} from '../api';
import {current_main_site_url} from '../fetch';
import EditTable from "../editTable";
import apply_top from "../image/apply_top.png";
@ -23,6 +24,9 @@ export default Form.create()((props) => {
const [errorMessage, setErrorMessage] = useState(undefined);
const [sourceBy, setSourceBy] = useState(1);
const [visible, setVisible] = useState(false);
// loading
const [loading, setLoading] = useState(false);
const [files, setFiles] = useState([]);
useEffect(()=>{
const applyStatus = qzDetail ? Date.parse(new Date()) < Date.parse(new Date(qzDetail.enroll_date)) : true;
@ -38,8 +42,8 @@ export default Form.create()((props) => {
// form
const helper = useCallback(
(label, name, rules, widget) => (
<Form.Item label={label}>
(label, name, rules, widget, extra) => (
<Form.Item label={label} extra={extra}>
{getFieldDecorator(name, { rules, validateFirst: true })(widget)}
</Form.Item>
),
@ -110,7 +114,7 @@ export default Form.create()((props) => {
setReload(Math.random());
message.success('报名成功')
}else{
message.error(response.message);
message.error(response.data.message);
}
setVisible(false);
})
@ -120,7 +124,7 @@ export default Form.create()((props) => {
setReload(Math.random());
message.success('资料修改成功');
}else{
message.error(response.message);
message.error(response.data.message);
}
setVisible(false);
})
@ -139,6 +143,51 @@ export default Form.create()((props) => {
}
}
function handleChange(info) {
if (info.file.status === 'uploading' || info.file.status === "done" || info.file.status === 'removed') {
setLoading(true);
setFiles(appendFileSizeToUploadFileAll(info.fileList).slice(-1));
}
if(info.file.status === "done" || info.file.status === 'removed'){
setLoading(false);
}
}
//
function download(file){
const fileId = file.id || file.response.id;
window.open(`${current_main_site_url}/api/attachments/${fileId}`);
}
//
function beforeUpload(file){
const isZip = file.name.endsWith(".zip") || file.name.endsWith(".tar") || file.name.endsWith(".rar");
if(!isZip){
message.error("只能上传压缩包文件");
}
const isLt100M = file.size / 1024 / 1024 < 10;
if (!isLt100M) {
message.error("文件大小必须小于10MB");
}
return isLt100M && isZip;
}
//
function submitTemplate(){
if(files.length === 0){
message.error("请先上传报名表扫描件");
}else{
updateTemplate({enroll_template_id: files[0].response.id}).then(response=>{
if(response && response.data.message === "success"){
setReload(Math.random());
message.success('报名表扫描件上传成功');
}else{
message.error(response.data.message);
}
})
}
}
return (
<div className="qz_main">
<div className="step">
@ -170,7 +219,7 @@ export default Form.create()((props) => {
{helper('参赛单位',
'org_name',
[{ required: true, message: "请正确输入参赛单位" },
{ max: 32, message: '超出限制长度32位字符请重新编辑' }],
{ max: 200, message: '超出限制长度200位字符,请重新编辑' }],
<Input placeholder="请输入参赛单位" onBlur={()=>{verify("org_name")}}/>
)}
{helper('参赛团队负责人姓名',
@ -234,23 +283,53 @@ export default Form.create()((props) => {
</Form>}
{/* 已报名,报名信息 */}
{enrollStatus && enrollStatus.enroll_status && enrollStatus.status !== 0 &&
<div className="info">
<div><span>参赛单位 : </span>{enrollStatus && enrollStatus.enroll_info.org_name}</div>
<div className="info-right"><span>参赛团队负责人姓名 : </span>{enrollStatus && enrollStatus.enroll_info.leader}</div>
{qzDetail && qzDetail.is_local && <div><span>职务 : </span>{enrollStatus && enrollStatus.enroll_info.org_job}</div>}
{qzDetail && qzDetail.is_local && <div className="info-right"><span>{Base64.decode('5Yab6KGU')} : </span>{enrollStatus && enrollStatus.enroll_info.org_rank}</div>}
<div><span>赛区 : </span>{enrollStatus && enrollStatus.enroll_info.zone}</div>
<div className="info-right"><span>赛项 : </span>{enrollStatus && enrollStatus.enroll_info.sub_competition}</div>
{qzDetail && qzDetail.is_local && <div><span>课题来源 : </span>{enrollStatus && enrollStatus.enroll_info.subject_source_type === 0 ? "自主提报" : enrollStatus.enroll_info.subject_source_name}</div>}
<div className={`${qzDetail && qzDetail.is_local ? '':'info_bottom'}`}><span>电话 : </span>{enrollStatus && enrollStatus.enroll_info.phone}</div>
<div className={`info-right ${qzDetail && qzDetail.is_local ? 'ellipsis_div':''}`}><span>成员 : </span>{enrollStatus && enrollStatus.enroll_info.members && enrollStatus.enroll_info.members.map(item=>{return item.real_name + ','})}</div>
<div>
<div className="info">
<div><span>参赛单位 : </span>{enrollStatus && enrollStatus.enroll_info.org_name}</div>
<div className="info-right"><span>参赛团队负责人姓名 : </span>{enrollStatus && enrollStatus.enroll_info.leader}</div>
{qzDetail && qzDetail.is_local && <div><span>职务 : </span>{enrollStatus && enrollStatus.enroll_info.org_job}</div>}
{qzDetail && qzDetail.is_local && <div className="info-right"><span>{Base64.decode('5Yab6KGU')} : </span>{enrollStatus && enrollStatus.enroll_info.org_rank}</div>}
<div><span>赛区 : </span>{enrollStatus && enrollStatus.enroll_info.zone}</div>
<div className="info-right"><span>赛项 : </span>{enrollStatus && enrollStatus.enroll_info.sub_competition}</div>
{qzDetail && qzDetail.is_local && <div><span>课题来源 : </span>{enrollStatus && enrollStatus.enroll_info.subject_source_type === 0 ? "自主提报" : enrollStatus.enroll_info.subject_source_name}</div>}
<div className={`${qzDetail && qzDetail.is_local ? '':'info_bottom'}`}><span>电话 : </span>{enrollStatus && enrollStatus.enroll_info.phone}</div>
<div className={`info-right ${qzDetail && qzDetail.is_local ? 'ellipsis_div':''}`}><span>成员 : </span>{enrollStatus && enrollStatus.enroll_info.members && enrollStatus.enroll_info.members.map(item=>{return item.real_name + ','})}</div>
</div>
<div className="action_box">
<span>报名表扫描件:</span>
{enrollStatus && enrollStatus.enroll_info.enroll_template ? <a href={current_main_site_url+enrollStatus.enroll_info.enroll_template.url} className="ml10 mb30">
{enrollStatus.enroll_info.enroll_template.title}
</a>:<Upload
accept=".zip,.rar"
// action?debug=admin
action={`${current_main_site_url}/api/attachments.json?debug=admin`}
fileList={files}
onChange={handleChange}
onDownload={download}
beforeUpload={beforeUpload}
showUploadList={{
showDownloadIcon: true,
downloadIcon: <i className="iconfont icon-xiazai-icon"></i>,
showRemoveIcon: false
}}
className="uploadBox"
>
<Button className="upload"><Icon type="upload"/>上传</Button>
<div className="tips mt10">
1. 您可选择是否上传单位盖章后的报名表扫描件<br/>
2. 上传附件名称需更改为单位名称+参赛团队负责人<br/>
3. 支持上传单个ziprar格式文件文件大小限制10m<br/>
4. 密级必须为{qzDetail && qzDetail.is_local ? '秘密及以下' : '公开级'}</div>
</Upload>}
</div>
{enrollStatus && !enrollStatus.enroll_info.enroll_template && <Button className="submit" type="primary" onClick={submitTemplate} loading={loading}>提交</Button>}
</div>}
</div>
{enrollStatus && (!enrollStatus.enroll_status || enrollStatus.status === 0) && <div className="apply_but">
<Button type="primary" className="submit_info" onClick={checkInfo}>
提交资料
</Button>
<a href={qzDetail && qzDetail.is_local ? 'http://osredm.jk:81/api/attachments/1963' : `${current_main_site_url}/api/attachments/${window.location.host.indexOf("osredm")!== -1 ? "4163" : current_main_site_url.indexOf("49999") === -1 ? "3715" : "1896"}`}>
<a href={qzDetail.enroll_template}>
<Button className="add_member download ml20">下载报名表</Button>
</a>
</div>}

View File

@ -50,8 +50,8 @@
justify-content: space-between;
.ant-form-item{
display: inline-block;
width: 33%;
margin-right: 160px;
width: 38%;
margin-right: 100px;
margin-bottom: 0px;
.ant-input:hover{border-color:#2e5bfe;}
}
@ -101,6 +101,25 @@
border-bottom: none;
}
}
.action_box{
padding-left: 2rem;
display: flex;
.tips{
font-size: 14px;
color: gray;
}
.uploadBox{
border: 1px solid rgba(153, 153, 153, 0.3);
margin-left: 15px;
padding: 12px;
width: 51vw;
border-radius: 4px;
}
}
.submit{
margin: 1rem 0 2rem 9rem !important;
padding: 0 25px;
}
.edit_table{
width: 100%;
}

View File

@ -1,19 +1,17 @@
import React from "react";
// import chatSvg from "../image/chat.svg";
import chatBanner from '../image/chat_banner.png';
import btn from "../image/btn-right.png";
import chat1 from '../image/chat1.png';
import chat2 from '../image/chat2.png';
import chat3 from '../image/chat3.png';
import './index.scss';
import '../../index.scss';
function Chat({ isLoacl }) {
function Chat({ isLocal }) {
return (
<div className="chat-bg">
<div className="chat qz_main clearfix">
<img className="chat-left" src={chatBanner} ></img>
<img className="chat-left" src={chatBanner} alt=""></img>
<div className="chat-words">
<div className="chat-tit">交流互动</div>
<div className="chat-content">
@ -25,16 +23,16 @@ function Chat({ isLoacl }) {
</div>
</div>
<div className="links qz_main">
<div onClick={() => { window.open(isLoacl ? 'http://www.osredm.jk/forums/theme/76' : 'https://fc.osredm.com/forums/theme/107') }}>
<img src={chat1}></img>
<div onClick={() => { window.open(isLocal ? 'http://www.osredm.jk/forums/theme/76' : 'https://fc.osredm.com/forums/theme/107') }}>
<img src={chat1} alt=""></img>
<div>参赛咨询</div>
</div>
<div onClick={() => { window.open(isLoacl ? 'http://www.osredm.jk/forums/theme/77' : 'https://fc.osredm.com/forums/theme/108') }}>
<img src={chat2}></img>
<div onClick={() => { window.open(isLocal ? 'http://www.osredm.jk/forums/theme/77' : 'https://fc.osredm.com/forums/theme/108') }}>
<img src={chat2} alt=""></img>
<div>选手交流</div>
</div>
<div onClick={() => { window.open(isLoacl ? 'http://www.osredm.jk/forums/theme/78' : 'https://fc.osredm.com/forums/theme/109') }}>
<img src={chat3}></img>
<div onClick={() => { window.open(isLocal ? 'http://www.osredm.jk/forums/theme/78' : 'https://fc.osredm.com/forums/theme/109') }}>
<img src={chat3} alt=""></img>
<div>专家答疑</div>
</div>
</div>

View File

@ -16,7 +16,7 @@ function Contact({ aboutUs, qzDetail, current_user }) {
<Link to={"/competition/qz2022/contact/edit"}><Button><i className="iconfont icon-a-bianji11 font-13 mr5"></i>编辑</Button></Link>
</div>}
<div className="contact qz_main">
{ !is_local&&<img className="contact-png" src={contactPng} ></img>}
{ !is_local&&<img className="contact-png" src={contactPng} alt=""></img>}
<div className="contact-words">
<RenderHtml value={aboutUs} className="contact-content" />
</div>

View File

@ -84,7 +84,10 @@ function Introduce({history:{location:{pathname}},qzDetail }) {
{
title: '参赛单位',
dataIndex: 'org_name',
align: 'center'
align: 'center',
render:(text, record)=>{
return <Tooltip title={text}>{text}</Tooltip>;
}
},
{
title: '参赛负责人',
@ -111,6 +114,13 @@ function Introduce({history:{location:{pathname}},qzDetail }) {
return '';
}
},
{
title: '报名文件',
dataIndex: 'enroll_template',
render:(text, record)=>{
return text ? <Tooltip title={text.title}><a href={current_main_site_url+text.url} className="attachments_a">{text.title}</a></Tooltip> : '--';
}
},
{
title: '操作',
dataIndex: "status",
@ -131,7 +141,10 @@ function Introduce({history:{location:{pathname}},qzDetail }) {
return [
{
title: '参赛单位',
dataIndex: 'org_name'
dataIndex: 'org_name',
render:(text, record)=>{
return <Tooltip title={text} placement="topLeft">{text}</Tooltip>;
}
},
{
title: '参赛负责人',
@ -263,7 +276,12 @@ function Introduce({history:{location:{pathname}},qzDetail }) {
{qzDetail && qzDetail.sub_competitions.map((item,i)=> {return <Option value={item} key={i}>{item}</Option>})}
</Select>
</div>
<a href={current_main_site_url+`/api/competition_infos/qz2022/enroll_list.xlsx${type === "applys"? '':"?upload=true"}`}><Button className="but_2e5">导出</Button></a>
<div>
导出
{type === "applys" && <a href={current_main_site_url+`/api/competition_infos/qz2022/enroll_template.zip`}><Button className="but_2e5 ml10">报名表扫描件</Button></a>}
{type === "production" && <a href={current_main_site_url+`/api/competition_infos/qz2022/enroll_list.zip?upload=true`}><Button className="but_2e5 ml10">作品文件</Button></a>}
<a href={current_main_site_url+`/api/competition_infos/qz2022/enroll_list.xlsx${type === "applys"? '':"?upload=true"}`}><Button className="but_2e5 ml10">{type === "applys" ? '报名信息' : '作品信息'}</Button></a>
</div>
</div>
<PaginationTable

View File

@ -1,14 +1,11 @@
import React, { useState, useCallback, useMemo, useEffect } from "react";
import { Input, Select, Button, Form, message } from 'antd';
import React, { useState, useEffect } from "react";
import { Input, Button, Form, message } from 'antd';
import { Link } from "react-router-dom";
import { formatDuring } from 'educoder';
import icon from '../image/notice_breadcrumb.svg';
import MDEditor from '../../../modules/tpm/challengesnew/tpm-md-editor';
import './index.scss';
import './detail.scss';
import { getNoticeDetail, addQz2022Notice, updateQz2022Notice } from "../api";
import RenderHtml from "src/components/render-html";
const Option = Select.Option;
export default Form.create()((props) => {
const {form, history, match:{params:{noticeId,type}}, current_user, qzDetail} = props;
@ -55,7 +52,7 @@ export default Form.create()((props) => {
message.success('新增成功');
history.push('/competition/qz2022/notice');
}else{
message.error(response.message);
message.error(response.data.message);
}
})
type === "edit" && updateQz2022Notice(noticeId,params).then(response=>{
@ -63,7 +60,7 @@ export default Form.create()((props) => {
message.success('修改成功');
history.push('/competition/qz2022/notice');
}else{
message.error(response.message);
message.error(response.data.message);
}
})
}
@ -73,7 +70,7 @@ export default Form.create()((props) => {
<div className="qz_notice">
<div className="qz_main notice_detal pt30">
<div className="breadCrumb">
<img src={icon} className="mr12 icon_d"/>
<img src={icon} className="mr12 icon_d" alt=""/>
<Link to={"/competition/qz2022/notice"}><span className="font-16 _999">通知公告</span></Link>
<span className="mr10 ml10 _999">/</span>
<span className="font-16 _18">{type === 'add' ? '新增' : '编辑'}</span>

View File

@ -1,14 +1,11 @@
import React, { useState, useCallback, useMemo, useEffect } from "react";
import { Input, Select, Button, Form, DatePicker, Table, Pagination, Upload, Modal, Breadcrumb } from 'antd';
import React, { useState, useEffect } from "react";
import { Link } from "react-router-dom";
import { formatDuring } from 'educoder';
import icon from '../image/notice_breadcrumb.svg';
import './index.scss';
import './detail.scss';
import { getNoticeDetail } from "../api";
import RenderHtml from "src/components/render-html";
const Option = Select.Option;
function NoticeDetail({match:{params:{noticeId}}, history}) {
const [detail, setDetail] = useState(undefined);
@ -27,7 +24,7 @@ function NoticeDetail({match:{params:{noticeId}}, history}) {
<div className="qz_notice">
<div className="qz_main notice_detal pt30">
<div className="breadCrumb">
<img src={icon} className="mr12 icon_d"/>
<img src={icon} className="mr12 icon_d" alt=""/>
<Link to={"/competition/qz2022/notice"}><span className="font-16 _999">通知公告</span></Link>
<span className="mr10 ml10 _999">/</span>
<span className="font-16 _18">公告详情</span>

View File

@ -67,9 +67,9 @@ function Introduce({ form, showNotification, match, history, enrollStatus, curre
if(!isZip){
showNotification(`只能上传压缩包文件`);
}
const isLt100M = file.size / 1024 / 1024 < 1024;
const isLt100M = file.size / 1024 / 1024 < 50;
if (!isLt100M) {
showNotification(`文件大小必须小于${1024}MB!`);
showNotification(`文件大小必须小于${50}MB!`);
}
return isLt100M && isZip;
}