diff --git a/src/glcc/api.js b/src/glcc/api.js index f0f99d61a..2ca79b72a 100644 --- a/src/glcc/api.js +++ b/src/glcc/api.js @@ -16,4 +16,13 @@ export function applyGlcc(data) { method: 'post', data: data }); -} \ No newline at end of file +} + +// 获取当前学生用户报名信息 +export function getStudentApplyInfo(params) { + return fetch({ + url: `/api/studentApply/getUserApplyInfo`, + method: 'get', + params + }); +} diff --git a/src/glcc/img/student.png b/src/glcc/img/student.png new file mode 100644 index 000000000..ede714eab Binary files /dev/null and b/src/glcc/img/student.png differ diff --git a/src/glcc/index.jsx b/src/glcc/index.jsx index cc621ddec..a21774fd4 100644 --- a/src/glcc/index.jsx +++ b/src/glcc/index.jsx @@ -28,6 +28,11 @@ const Help = Loadable({ loader: () => import("./help"), loading: Loading, }); +// 任务管理审核 +const Student = Loadable({ + loader: () => import("./student"), + loading: Loading, +}); const Glcc = (propsF) => { @@ -37,6 +42,13 @@ const Glcc = (propsF) => { return (
+ {/* 学生报名 */} + ( + + )} + > {/* 开源夏令营报名页面 */} { + // 进入此页面置顶 + window.scrollTo(0, 0); + if (!isGlccApplyDate) { + // 不在开源夏令营报名时间之内 + window.location.href = "/glcc"; + } else if (current_user && current_user.login) { + + } else { + window.location.href = "/login?go_page=/glcc"; + } + }, []) + + useEffect(() => { + // 获取当前用户报名信息 + current_user && getStudentApplyInfo({ userId: current_user.user_id }).then(response => { + if (response && response.message === "success" && response.data) { + let data = response.data; + let applyInfo = { + grade: data.grade, + location: data.location && data.location.split(), + mail: data.mail, + phone: data.phone, + proveAttachmentId: data.proveAttachmentId, + school: data.school, + studentName: data.studentName, + userId: current_user.user_id, + profession:data.profession, + }; + if (Array.isArray(data.registrationStudentTaskList) && data.registrationStudentTaskList.length) { + setTaskList(data.registrationStudentTaskList); + for (const [i, item] of data.registrationStudentTaskList.entries()) { + applyInfo['memo' + i] = item.memo; + applyInfo['taskId' + i] = item.taskId; + applyInfo['taskName' + i] = item.taskName; + applyInfo['memoAttachmentId'+i] =item.memoAttachmentId; + } + } + + setFieldsValue(applyInfo); + setUserApplyInfo(response.data); + } else { + setTaskList([initTask]); + } + }) + }, [current_user]) + + // 当用户输入结束时 检验用户输入是否符合规范 + function verify(dataIndex) { + validateFields([dataIndex], (error, values) => { + if (error && error[dataIndex]) { + return; + } + }) + } + + // 学生报名夏令营 + function handleSubmit(e) { + e.preventDefault(); + validateFieldsAndScroll((err, values) => { + if (!err) { + // Modal.confirm({ + // title: "报名", + // content: "确定提交报名信息,提交后您仍可修改", + // onOk: () => { + const params = { + grade: values.grade, + location: values.location.join(), + mail: values.mail, + phone: values.phone, + proveAttachmentId: values.proveAttachmentId.file ? values.proveAttachmentId.file.response.id : userApplyInfo.proveAttachmentId, + school: values.school, + profession:data.profession, + studentName: values.studentName, + userId: current_user.user_id, + registrationStudentTaskList: taskList + } + + // applyGlcc(params).then(response => { + // if (response && response.message === "success") { + // showNotification("报名成功"); + // setReload(Math.random()); + // } + // }) + // } + // }) + + console.log(params); + + } + }); + }; + + const helper = useCallback( + (label, extra, name, rules, widget) => ( + + {getFieldDecorator(name, { rules, validateFirst: true })(widget)} + + ), + [] + ); + + + // 检查文件上传是否符合规定 + function beforeUpload(file) { + // const isSmall = file.size / 1024 / 1024 < 2; + // if (!isSmall) { + // showNotification(`文件大小必须小于${2}MB!`); + // } + const isType = file.type === "image/png" || file.type === "image/jpg" || file.type === "image/jpeg"; + if (!isType) { + showNotification("只能上传png、jpg、jpeg格式文件"); + } + return isType; + } + + function getBase64(img, callback) { + const reader = new FileReader(); + reader.addEventListener('load', () => callback(reader.result)); + reader.readAsDataURL(img); + reader.onload = function (e) { + setImageUrl(e.target.result); // 上传的图片的编码 + } + } + + // 上传完成后 + function handleChange(info) { + if (info && info.file && info.file.status === "done") { + getBase64(info.file.originFileObj, imageUrl => + setImageUrl(imageUrl) + ); + } + } + + // 自荐书上传 + function bookChange(info) { + if (info.file.status === 'uploading' || info.file.status === "done" || info.file.status === 'removed') { + setLoading(true); + console.log(info.fileList); + 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 addTask() { + let taskListNew = [...taskList]; + taskListNew.push(initTask); + setTaskList(taskListNew); + } + + function deleteTask(i) { + let taskListNew = [...taskList]; + taskListNew.splice(i, 1); + setTaskList(taskListNew); + } + + function changeTaskItem(field, val, i) { + let taskListNew = [...taskList]; + taskListNew[i][field] = val; + setTaskList(taskListNew); + } + + return ( +
+ +
+ + 开源夏令营 + 查看项目 + 学生报名 + + +
+

申请说明:

+
1、学生报名时间为2022年5月21日-6月19日,请在报名截止时间(北京时间2022年6月19日18点)前提交报名信息。
+
2、本次GLCC夏令营基于GitLink代码托管平台完成编程任务,若您没有平台账户,请先注册后完成课题申请
+
3、每位学员最多可申请2个课题,至多有且仅有1个课题可以入选
+
4、建议在提交课题申请,与课题导师邮件沟通,详细了解课题描述、编码任务、技能要求&编程语言、预期产出结果等信息,以便您能够选择最适合的课题
+
5、提交申请后,请耐心等待,我们会在2022年7月1日公布入围结果。如有任何问题,请添加开源夏令营微信群进行咨询
+
+
+ 学生报名 +
+
申请课题
+
+

基本信息

+ {helper('学生姓名', + '', + 'studentName', + [{ required: true, message: "请正确输入学生姓名" }, + { max: 32, message: '超出限制长度32位字符,请重新编辑' }], + { verify("studentName") }} className={editable ? "" : "disabledInput"} disabled={editable ? false : true} /> + )} + {helper('所在高校', + '', + 'school', + [{ required: true, message: "请正确输入所在高校" }, + { max: 32, message: '超出限制长度32位字符,请重新编辑' }], + { verify("school") }} className={editable ? "" : "disabledInput"} disabled={editable ? false : true} /> + )} + {helper('所学专业', + '', + 'profession', + [{ max: 32, message: '超出限制长度32位字符,请重新编辑' }], + { verify("profession") }} className={editable ? "" : "disabledInput"} disabled={editable ? false : true} /> + )} + + {getFieldDecorator("location", { + rules: [] + })( + + )} + + {helper('所在年级', + '', + 'grade', + [], + + )} + {helper('联系电话', + '', + 'phone', + [{ required: true, message: "请正确输入联系电话" }], + { verify("phone") }} className={editable ? "" : "disabledInput"} disabled={editable ? false : true} /> + )} + {helper('邮箱地址', + '', + 'mail', + [{ required: true, message: "请正确输入邮箱地址" }], + { verify("mail") }} className={editable ? "" : "disabledInput"} disabled={editable ? false : true} /> + )} + +
{helper('学生证明', + '请以图片的形式上传学生证明,格式为png、jpg、jpeg', + 'proveAttachmentId', + [{ required: true, message: "请正确上传学生证明" }], + userApplyInfo && userApplyInfo.proveAttachmentId ?
+ : + {imageUrl ? avatar :
+ +
请上传学生证明
+
} +
+ )}
+ + { + taskList.map((item, i) => { + return ( + +

课题信息({i + 1}/2) {taskList.length > 1 && { deleteTask(i) }}>}

+ {helper('课题名称', + '', + 'taskName' + i, + [{ required: true, message: "请正确输入课题名称" }], + { verify("taskName" + i); changeTaskItem("taskName", e.currentTarget.value, i) }} className={editable ? "" : "disabledInput"} disabled={editable ? false : true} /> + )} +
{helper('自荐书', + '', + 'memo' + i, + [{ required: true, message: "请正确输入自荐书" }, + { max: 500, message: '超出限制长度500位字符,请重新编辑' }], +