forked from Gitlink/forgeplus-react
合并谢思修改流程代码
This commit is contained in:
commit
4cf59d0f7d
|
@ -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);
|
||||
}
|
|
@ -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. 支持上传单个zip、rar格式文件,文件大小限制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>}
|
||||
|
|
|
@ -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%;
|
||||
}
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue