diff --git a/package-lock.json b/package-lock.json index cc4c0cbdb..f86c5bdd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -160,7 +160,7 @@ }, "source-map": { "version": "0.5.7", - "resolved": "https://registry.nlark.com/source-map/download/source-map-0.5.7.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } @@ -1296,13 +1296,13 @@ "dependencies": { "inherits": { "version": "2.0.1", - "resolved": "https://registry.nlark.com/inherits/download/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "dev": true }, "util": { "version": "0.10.3", - "resolved": "https://registry.nlark.com/util/download/util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -2561,7 +2561,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.nlark.com/define-property/download/define-property-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" @@ -2869,7 +2869,7 @@ "dependencies": { "resolve": { "version": "1.1.7", - "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" } } @@ -3661,7 +3661,7 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.nlark.com/define-property/download/define-property-0.2.5.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" @@ -6386,7 +6386,7 @@ }, "path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.nlark.com/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&sync_timestamp=1618847046445&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, @@ -6859,7 +6859,7 @@ "dependencies": { "core-js": { "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/core-js/download/core-js-1.2.7.tgz", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" }, "promise": { @@ -8069,7 +8069,7 @@ "dependencies": { "pify": { "version": "3.0.0", - "resolved": "https://registry.nlark.com/pify/download/pify-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } @@ -11630,7 +11630,7 @@ }, "punycode": { "version": "1.4.1", - "resolved": "https://registry.nlark.com/punycode/download/punycode-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true } @@ -16594,7 +16594,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "https://registry.nlark.com/jsesc/download/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -17517,7 +17517,7 @@ "dependencies": { "ms": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } @@ -17629,7 +17629,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" @@ -18110,7 +18110,7 @@ }, "define-property": { "version": "0.2.5", - "resolved": "https://registry.nlark.com/define-property/download/define-property-0.2.5.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" @@ -18118,7 +18118,7 @@ }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" @@ -18126,7 +18126,7 @@ }, "source-map": { "version": "0.5.7", - "resolved": "https://registry.nlark.com/source-map/download/source-map-0.5.7.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } @@ -18143,7 +18143,7 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.nlark.com/define-property/download/define-property-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" @@ -20018,7 +20018,7 @@ "dependencies": { "inherits": { "version": "2.0.3", - "resolved": "https://registry.nlark.com/inherits/download/inherits-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true } @@ -20394,7 +20394,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -20575,7 +20575,7 @@ }, "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { @@ -20587,7 +20587,7 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.nlark.com/extend-shallow/download/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { @@ -20653,7 +20653,7 @@ }, "is-number": { "version": "3.0.0", - "resolved": "https://registry.nlark.com/is-number/download/is-number-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { @@ -20662,7 +20662,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { diff --git a/src/glcc/api.js b/src/glcc/api.js index d52ae65e2..3a6085ebb 100644 --- a/src/glcc/api.js +++ b/src/glcc/api.js @@ -212,4 +212,13 @@ export function getGlccSettings(params) { method: 'get', params, }); +} + +// 删除项目报名信息 +export function deleteApplyInfo(data) { + return fetch({ + url: `/api/applyInformation/delete`, + method: 'post', + data + }); } \ No newline at end of file diff --git a/src/glcc/apply/editInfo.jsx b/src/glcc/apply/editInfo.jsx new file mode 100644 index 000000000..b9198b41e --- /dev/null +++ b/src/glcc/apply/editInfo.jsx @@ -0,0 +1,291 @@ +import React , { useCallback, useEffect , useState } from 'react'; +import { Button, Form, Input, Select, Upload, message, Popconfirm } from 'antd'; +import {getUploadActionUrl} from 'educoder'; +import {applyGlcc, updateApplyGlcc} from '../api'; +import TextArea from 'antd/lib/input/TextArea'; +import { main_site_url } from '../fetch'; +import TaskApply from './taskApply'; +import './index.scss'; +import { FlexAJ } from '../../forge/Component/layout'; +const Option = Select.Option; +// 编辑项目、课题报名信息 +function EditRepoApplyInfo(props) { + const {form, applyInfo, current_user, round, cateList, setReload, isAddRepo, setIsAddRepo, setIsEdit, setEditRepoCount} = props; + const phonereg = /(^|\s*\+?0?0?86|\D)(1\d{2})[-\s]{0,3}(\d{4})[-\s]{0,3}(\d{4})(?=\D|$)/ + const emailreg = /^[a-zA-Z0-9]+([.\-_\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/ + const {getFieldDecorator, validateFields, setFieldsValue, validateFieldsAndScroll } = form; + const [imageUrl, setImageUrl] = useState(undefined); + // 提交按钮loading效果 + const [loading, setLoading] = useState(false); + // 课题报名个数 + const [taskCount, setTaskCount] = useState(undefined); + + useEffect(()=>{ + if(applyInfo){ + const {projectName, projectType, gitlinkUrl, contactName, contactPhone, projectIntro, registrationTaskList, projectLogoId, contactMail} = applyInfo; + const taskInfo = {}; + const taskCountArr = [] + registrationTaskList.map((item, index)=>{ + taskCountArr.push(index+1); + const{taskName, taskUrl, taskDifficulty, taskReward, tutorName, tutorMail, taskDesc, tutorPhone} = item; + taskInfo[`taskName${index+1}`] = taskName; + taskInfo[`taskUrl${index+1}`] = taskUrl; + taskInfo[`taskDifficulty${index+1}`] = taskDifficulty; + taskInfo[`taskReward${index+1}`] = taskReward; + taskInfo[`tutorName${index+1}`] = tutorName; + taskInfo[`tutorMail${index+1}`] = tutorMail; + taskInfo[`taskDesc${index+1}`] = taskDesc; + taskInfo[`tutorPhone${index+1}`] = tutorPhone; + }) + setTaskCount(taskCountArr); + setTimeout(() => { + setFieldsValue({ + projectName, projectType, gitlinkUrl, contactName, contactPhone, projectIntro, contactMail, + ...taskInfo, + logo: {file:{response:{id: projectLogoId}}} + }) + }, 100); + }else{ + setTaskCount([1]) + } + }, []) + + const helper = useCallback( + (label, extra, name, rules, widget) => ( + + {getFieldDecorator(name, { rules, validateFirst: true })(widget)} + + ), + [] + ); + + // 当用户输入结束时 检验用户输入是否符合规范 + function verify(dataIndex){ + validateFields([dataIndex],(error, values)=>{ + if(error && error[dataIndex]){ + return; + } + }) + } + + // 报名夏令营 + function handleSubmit(e){ + e.preventDefault(); + validateFieldsAndScroll((err, values) => { + if (!err) { + const registrationTaskList = [] + taskCount && taskCount.map(item=>{ + registrationTaskList.push({ + taskName: values[`taskName${item}`], + taskUrl: values[`taskUrl${item}`], + taskDifficulty: values[`taskDifficulty${item}`], + taskReward: values[`taskReward${item}`], + tutorName: values[`tutorName${item}`], + tutorMail: values[`tutorMail${item}`], + taskDesc: values[`taskDesc${item}`], + tutorPhone: values[`tutorPhone${item}`], + round + }) + }) + const {projectName, projectType, gitlinkUrl, contactName, contactPhone, projectIntro, contactMail} = values; + const params ={ + projectName, projectType, gitlinkUrl, contactName, contactPhone, projectIntro, registrationTaskList, round, contactMail, + projectLogoId: values.logo.file.response.id+"", + userId: current_user.user_id, + userName: current_user.username + } + setLoading(true); + if(applyInfo){ + // 用户已经报名项目 + params[`id`] = applyInfo.id; + updateApplyGlcc(params).then(response=>{ + if(response && response.message === "success"){ + message.success("修改成功"); + setReload(); + } + setLoading(false); + setIsEdit(false); + setEditRepoCount(0); + setTimeout(() => { + scrollToRepoInfo() + }, 100); + }) + return + } + applyGlcc(params).then(response=>{ + if(response && response.message === "success"){ + message.success("报名成功"); + isAddRepo && setIsAddRepo(false); + setReload(); + } + setLoading(false); + window.scrollTo(0,950); + }) + } + }); + }; + + // 检查文件上传是否符合规定 + function beforeUpload(file){ + const isLt100M = file.size / 1024 / 1024 < 20; + if (!isLt100M) { + message.error(`文件大小必须小于${20}M!`); + } + const isType = file.type === "image/png" || file.type === "image/jpg" || file.type === "image/jpeg"; + if (!isType) { + message.error("只能上传png、jpg、jpeg格式文件"); + } + return isLt100M && 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 addTaskApplyForm(){ + setTaskCount(taskCount.concat([taskCount.length+1])); + } + + // 删除课题报名 + function deleteTaskApply(index){ + const arr = [...taskCount]; + arr.splice(index-1, 1) + setTaskCount(arr); + } + + // 取消编辑点击函数 + function cancelEdit(){ + if(isAddRepo){ + // 新增项目信息 + setIsAddRepo(false); + return + } + // 编辑项目信息 + setIsEdit(false); + setEditRepoCount(0); + setTimeout(() => { + scrollToRepoInfo() + }, 100); + } + + // 屏幕滚动到当前项目区域 + function scrollToRepoInfo(){ + const element = document.getElementById(`repoShowId${applyInfo.id}`); + window.scrollTo(0, element.offsetTop-100); + } + + return( +
+
项目信息
+ {taskCount &&
+ {helper('项目名称', + '', + 'projectName', + [{ required: true, message: "请输入项目名称,长度限制32个字符" }, + { max: 32, message: '超出限制长度32位字符,请重新编辑' }], + {verify("name")}}/> + )} + {helper('项目分类', + '', + 'projectType', + [{ required: true, message: "请选择项目分类" }], + + )} + {helper('GitLink地址', + '', + 'gitlinkUrl', + [{ required: true, message: "请输入GitLink项目地址" }, + { max: 252, message: '超出限制长度252位字符,请重新编辑' }], + {verify("gitlink")}}/> + )} + {helper('联系人姓名', + '', + 'contactName', + [{ required: true, message: "请输入项目联系人姓名" }, + { max: 32, message: '超出限制长度32位字符,请重新编辑' }], + {verify("name")}}/> + )} + {helper('联系人电话', + '', + 'contactPhone', + [{ required: true, message: "输入项目联系人手机号码" }, + { pattern: phonereg, message: "请输入正确的手机号码"},], + {verify("name")}}/> + )} + {helper('联系人邮箱', + '', + 'contactMail', + [{ required: true, message: "输入项目联系人邮箱" }, + { pattern: emailreg, message: "请输入正确的邮箱地址"},], + {verify("name")}}/> + )} +
{helper('社区简介', + '', + 'projectIntro', + [{ required: true, message: "请输入社区简介" }, + { max: 200, message: '超出限制长度200位字符,请重新编辑' }], +