定制化竞赛路由动态化1.0

This commit is contained in:
何童崇 2022-05-19 14:42:31 +08:00
parent 4a56895be2
commit d8c06883b4
13 changed files with 85 additions and 76 deletions

View File

@ -1,8 +1,8 @@
import axios from 'axios';
// 用户参与启智2022状态?debug=teacher
export async function userCompetitionStatus(id) {
return axios.get(`/competition_infos/${id}/enroll_status.json`);
export async function userCompetitionStatus(competitionId) {
return axios.get(`/competition_infos/${competitionId}/enroll_status.json`);
}
// 启智2022详情接口
@ -11,13 +11,13 @@ export function getQz2022(competitionId) {
}
// 报名启智2022 竞赛?debug=teacher
export async function enrollCompetition(data){
return axios.post(`/competition_infos/qz2022/enroll.json`,data);
export async function enrollCompetition(data,competitionId){
return axios.post(`/competition_infos/${competitionId}/enroll.json`,data);
}
// 修改报名信息
export async function enrollUpdate(data){
return axios.post(`/competition_infos/qz2022/enroll_update.json`,data);
export async function enrollUpdate(data,competitionId){
return axios.post(`/competition_infos/${competitionId}/enroll_update.json`,data);
}
// 统计启智2022 竞赛
@ -26,48 +26,48 @@ export async function stattistics(competitionId){
}
// 竞赛提交作品
export async function uploadCompetition(data){
return axios.post(`/competition_infos/qz2022/upload.json`,data);
export async function uploadCompetition(data,competitionId){
return axios.post(`/competition_infos/${competitionId}/upload.json`,data);
}
// 管理-竞赛报名列表?debug=admin
export function getQzEnrollList(params) {
return axios.get(`/competition_infos/qz2022/enroll_list.json`,params={params});
export function getQzEnrollList(params,competitionId) {
return axios.get(`/competition_infos/${competitionId}/enroll_list.json`,params={params});
}
// 管理-竞赛提交作品列表&debug=admin
export function getQzProList(params) {
return axios.get(`/competition_infos/qz2022/enroll_list.json?upload=true`,params={params});
export function getQzProList(params,competitionId) {
return axios.get(`/competition_infos/${competitionId}/enroll_list.json?upload=true`,params={params});
}
// 通知公告列表
export function getNoticeList() {
return axios.get(`/competition_infos/qz2022/competition_notices.json`);
export function getNoticeList(competitionId) {
return axios.get(`/competition_infos/${competitionId}/competition_notices.json`);
}
// 通知公告详情
export function getNoticeDetail(id) {
return axios.get(`/competition_infos/qz2022/competition_notices/${id}.json`);
export function getNoticeDetail(id,competitionId) {
return axios.get(`/competition_infos/${competitionId}/competition_notices/${id}.json`);
}
// 新增通知
export async function addQz2022Notice(data){
return axios.post(`/competition_infos/qz2022/competition_notices.json`,data);
export async function addQz2022Notice(data,competitionId){
return axios.post(`/competition_infos/${competitionId}/competition_notices.json`,data);
}
// 编辑通知
export async function updateQz2022Notice(id,data){
return axios.put(`/competition_infos/qz2022/competition_notices/${id}.json`,data);
export async function updateQz2022Notice(id,data,competitionId){
return axios.put(`/competition_infos/${competitionId}/competition_notices/${id}.json`,data);
}
// 删除通知
export async function deleteQz2022Notice(id){
return axios.delete(`/competition_infos/qz2022/competition_notices/${id}.json`);
export async function deleteQz2022Notice(id,competitionId){
return axios.delete(`/competition_infos/${competitionId}/competition_notices/${id}.json`);
}
// 编辑大赛介绍、大赛指南、关于我
export async function updateQz2022(data){
return axios.put(`/competition_infos/qz2022.json`,data);
export async function updateQz2022(data,competitionId){
return axios.put(`/competition_infos/${competitionId}.json`,data);
}
// 修改竞赛报名状态

View File

@ -18,7 +18,9 @@ import { useEffect } from "react";
const Option = Select.Option;
export default Form.create()((props) => {
const {form, qzDetail, enrollStatus, setReload, current_user, history} = props;
const {form, qzDetail, enrollStatus, setReload, current_user, history,match} = props;
const { competitionId } = match.params;
const {getFieldDecorator, validateFields, setFieldsValue} = form;
const [members, setMembers] = useState([]);
const [errorMessage, setErrorMessage] = useState(undefined);
@ -30,7 +32,7 @@ export default Form.create()((props) => {
useEffect(()=>{
const applyStatus = qzDetail ? Date.parse(new Date()) < Date.parse(new Date(qzDetail.enroll_date)) : true;
if((current_user && !current_user.login) || !applyStatus){
history.push("/competition/qz2022");
history.push(`/competition/${competitionId}`);
}
if(enrollStatus && enrollStatus.enroll_status && enrollStatus.status === 0){
setMembers(enrollStatus.enroll_info.members);
@ -114,7 +116,7 @@ export default Form.create()((props) => {
}
// enrollStatus.enroll_status
if(enrollStatus && !enrollStatus.enroll_status){
enrollCompetition(params).then(response=>{
enrollCompetition(params,competitionId).then(response=>{
if(response && response.data.message === "success"){
setReload(Math.random());
message.success('报名成功')
@ -124,7 +126,7 @@ export default Form.create()((props) => {
setVisible(false);
})
}else{
enrollUpdate(params).then(response=>{
enrollUpdate(params,competitionId).then(response=>{
if(response && response.data.message === "success"){
setReload(Math.random());
message.success('资料修改成功');
@ -183,7 +185,7 @@ export default Form.create()((props) => {
if(files.length === 0){
message.error("请先上传报名表扫描件");
}else{
updateTemplate({enroll_template_id: files[0].response.id}).then(response=>{
updateTemplate({enroll_template_id: files[0].response.id},competitionId).then(response=>{
if(response && response.data.message === "success"){
setReload(Math.random());
message.success('报名表扫描件上传成功');

View File

@ -40,7 +40,6 @@ function QzModal() {
>
<img src={bg} />
{/* <Link to="/competition/qz2022/notice" className="qz-btn">查看详情</Link> */}
</Modal>
)
}

View File

@ -9,7 +9,7 @@ import '../notice/index.scss';
import '../notice/detail.scss';
export default Form.create()((props) => {
const {form, history, match:{params:{type}}, qzDetail, setReloadDetail, current_user} = props;
const {form, history, match:{params:{type,competitionId}}, qzDetail, setReloadDetail, current_user} = props;
const {getFieldDecorator, validateFields, setFieldsValue } = form;
const [description, setDescription] = useState(qzDetail && type === "introduce" ? (qzDetail && qzDetail.content) : type === "fingerpost" ? (qzDetail && qzDetail.guide) : (qzDetail && qzDetail.about_us));
const [errorMessage, setErrorMessage] = useState(undefined);
@ -43,11 +43,11 @@ export default Form.create()((props) => {
const params = {
'competition_info': info,
}
updateQz2022(params).then(response=>{
updateQz2022(params,competitionId).then(response=>{
if(response && response.data.message === "success"){
setReloadDetail(Math.random());
message.success('更新成功');
history.push(`/competition/qz2022/${type}`);
history.push(`/competition/${competitionId}/${type}`);
}else{
message.error(response.message);
}
@ -60,7 +60,7 @@ export default Form.create()((props) => {
<div className="qz_main notice_detal qz2022_notice_edit">
<div className="breadCrumb mb20">
<img src={icon} className="mr12 icon_d" alt=""/>
<Link to={`/competition/qz2022/${type}`}><span className="font-16 _999">{type === "introduce" ? "首页" : type === "fingerpost" ? "大赛指南" : "联系我们"}</span></Link>
<Link to={`/competition/${competitionId}/${type}`}><span className="font-16 _999">{type === "introduce" ? "首页" : type === "fingerpost" ? "大赛指南" : "联系我们"}</span></Link>
<span className="mr10 ml10 _999">/</span>
<span className="font-16 _18">编辑</span>
</div>
@ -89,7 +89,7 @@ export default Form.create()((props) => {
</Form>
<div className="qz2022_notice_but">
<Button className="mr30" type="primary" onClick={submit}>提交</Button>
<Button onClick={()=>{history.push(`/competition/qz2022/${type}`);}}>取消</Button>
<Button onClick={()=>{history.push(`/competition/${competitionId}/${type}`);}}>取消</Button>
</div>
</div>
</div>

View File

@ -6,14 +6,15 @@ import { Button } from "antd";
import './index.scss';
import '../../index.scss';
function Contact({ aboutUs, qzDetail, current_user }) {
function Contact({ aboutUs, qzDetail, current_user,match }) {
const manageEdit = (qzDetail && qzDetail.is_manager) || (current_user && current_user.admin);
const is_local= qzDetail &&qzDetail.is_local;
console.log(is_local);
const { competitionId } = match.params;
return (
<div className="contact-bg">
{manageEdit && <div className="qz_main manageEdit mb20">
<Link to={"/competition/qz2022/contact/edit"}><Button><i className="iconfont icon-a-bianji11 font-13 mr5"></i>编辑</Button></Link>
<Link to={`/competition/${competitionId}/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} alt=""></img>}

View File

@ -6,12 +6,14 @@ import { Button } from "antd";
import './index.scss';
import '../index.scss';
function Introduce({ qzDetail, current_user}) {
function Introduce({ qzDetail, current_user,match}) {
const manageEdit = (qzDetail && qzDetail.is_manager) || (current_user && current_user.admin);
const { competitionId } = match.params;
return (
<div className="fingerpost">
{manageEdit && <div className="qz_main manageEdit mb15">
<Link to={"/competition/qz2022/fingerpost/edit"}><Button><i className="iconfont icon-a-bianji11 font-13 mr5"></i>编辑</Button></Link>
<Link to={`/competition/${competitionId}/fingerpost/edit`}><Button><i className="iconfont icon-a-bianji11 font-13 mr5"></i>编辑</Button></Link>
</div>}
<RenderHtml value={qzDetail && qzDetail.guide} className="fingerpost_cont qz_main"/>
</div>

View File

@ -6,7 +6,9 @@ import './index.scss';
import '../index.scss';
import RenderHtml from "src/components/render-html";
function Introduce({ qzDetail, current_user }) {
function Introduce({ qzDetail, current_user,match }) {
const { competitionId } = match.params;
const manageEdit = (qzDetail && qzDetail.is_manager) || (current_user && current_user.admin);
let content= qzDetail&&qzDetail.content;
let video_url= qzDetail&&qzDetail.video_url;
@ -14,7 +16,7 @@ function Introduce({ qzDetail, current_user }) {
return (
<div className="introduce_bg">
{manageEdit && <div className="qz_main manageEdit">
<Link to={"/competition/qz2022/introduce/edit"}><Button><i className="iconfont icon-a-bianji11 font-13 mr5"></i>编辑</Button></Link>
<Link to={`/competition/${competitionId}/introduce/edit`}><Button><i className="iconfont icon-a-bianji11 font-13 mr5"></i>编辑</Button></Link>
</div>}
<div className="introduce">
<div className="introduce-content clearfix">

View File

@ -10,7 +10,8 @@ import { getQzEnrollList, getQzProList, updateEnroll } from "../api.js";
const Option = Select.Option;
const {Search} = Input;
function Introduce({history:{location:{pathname}},qzDetail }) {
function Introduce({history:{location:{pathname}},qzDetail,match }) {
const { competitionId } = match.params;
// type01
const [type, setType] = useState(pathname.substring(pathname.lastIndexOf('/')+1, pathname.lenght));
const [loading, setLoading] = useState(false);
@ -44,7 +45,7 @@ function Introduce({history:{location:{pathname}},qzDetail }) {
}
if(type === "applys"){
//
getQzEnrollList(params).then(response=>{
getQzEnrollList(params,competitionId).then(response=>{
if(response && response.status === 200){
setTotal(response.data.count);
setDataList(response.data.data);
@ -54,7 +55,7 @@ function Introduce({history:{location:{pathname}},qzDetail }) {
})
}else{
//
getQzProList(params).then(response=>{
getQzProList(params,competitionId).then(response=>{
if(response && response.status === 200){
setTotal(response.data.count);
setDataList(response.data.data);
@ -71,7 +72,7 @@ function Introduce({history:{location:{pathname}},qzDetail }) {
user_id: userId,
status: index
}
updateEnroll(params).then(response=>{
updateEnroll(params,competitionId).then(response=>{
if(response && response.status === 200){
setReload(Math.random());
message.success("操作成功");
@ -277,9 +278,9 @@ function Introduce({history:{location:{pathname}},qzDetail }) {
</Select>
</div>
<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>
{type === "applys" && <a href={current_main_site_url+`/api/competition_infos/${competitionId}/enroll_template.zip`}><Button className="but_2e5 ml10">导出报名表扫描件</Button></a>}
{type === "production" && <a href={current_main_site_url+`/api/competition_infos/${competitionId}/enroll_list.zip?upload=true`}><Button className="but_2e5 ml10">导出作品文件</Button></a>}
<a href={current_main_site_url+`/api/competition_infos/${competitionId}/enroll_list.xlsx${type === "applys"? '':"?upload=true"}`}><Button className="but_2e5 ml10">导出{type === "applys" ? '报名信息' : '作品信息'}</Button></a>
</div>
</div>

View File

@ -8,7 +8,7 @@ import './detail.scss';
import { getNoticeDetail, addQz2022Notice, updateQz2022Notice } from "../api";
export default Form.create()((props) => {
const {form, history, match:{params:{noticeId,type}}, current_user, qzDetail} = props;
const {form, history, match:{params:{noticeId,type,competitionId}}, current_user, qzDetail} = props;
const {getFieldDecorator, validateFields, setFieldsValue } = form;
const [description, setDescription] = useState(undefined);
const [errorMessage, setErrorMessage] = useState(undefined);
@ -22,7 +22,7 @@ export default Form.create()((props) => {
useEffect(() => {
if(noticeId && type === "edit"){
getNoticeDetail(noticeId).then(response=>{
getNoticeDetail(noticeId,competitionId).then(response=>{
if(response && response.data.message === "success"){
setDescription(response.data.data.content);
setFieldsValue({title: response.data.data.title});
@ -47,18 +47,18 @@ export default Form.create()((props) => {
...values,
content: description
}
type === "add" && addQz2022Notice(params).then(response=>{
type === "add" && addQz2022Notice(params,competitionId).then(response=>{
if(response && response.data.message === "success"){
message.success('新增成功');
history.push('/competition/qz2022/notice');
history.push(`/competition/${competitionId}/notice`);
}else{
message.error(response.data.message);
}
})
type === "edit" && updateQz2022Notice(noticeId,params).then(response=>{
type === "edit" && updateQz2022Notice(noticeId,params,competitionId).then(response=>{
if(response && response.data.message === "success"){
message.success('修改成功');
history.push('/competition/qz2022/notice');
history.push('/competition/${competitionId}/notice');
}else{
message.error(response.data.message);
}
@ -71,7 +71,7 @@ export default Form.create()((props) => {
<div className="qz_main notice_detal pt30">
<div className="breadCrumb">
<img src={icon} className="mr12 icon_d" alt=""/>
<Link to={"/competition/qz2022/notice"}><span className="font-16 _999">通知公告</span></Link>
<Link to={`/competition/${competitionId}/notice`}><span className="font-16 _999">通知公告</span></Link>
<span className="mr10 ml10 _999">/</span>
<span className="font-16 _18">{type === 'add' ? '新增' : '编辑'}</span>
</div>
@ -100,7 +100,7 @@ export default Form.create()((props) => {
</Form>
<div className="qz2022_notice_but">
<Button className="mr30" type="primary" onClick={submit}>提交</Button>
<Button onClick={()=>{history.push('/competition/qz2022/notice');}}>取消</Button>
<Button onClick={()=>{history.push(`/competition/${competitionId}/notice`);}}>取消</Button>
</div>
</div>
</div>

View File

@ -7,31 +7,31 @@ import './detail.scss';
import { getNoticeDetail } from "../api";
import RenderHtml from "src/components/render-html";
function NoticeDetail({match:{params:{noticeId}}, history}) {
function NoticeDetail({ match: { params: { noticeId, competitionId } }, history }) {
const [detail, setDetail] = useState(undefined);
useEffect(()=>{
noticeId && getNoticeDetail(noticeId).then(response=>{
if(response && response.data.message === "success"){
useEffect(() => {
noticeId && getNoticeDetail(noticeId, competitionId).then(response => {
if (response && response.data.message === "success") {
setDetail(response.data.data);
}else{
} else {
history.push("/404");
}
})
},[])
}, [])
return (
<div className="qz_notice">
<div className="qz_main notice_detal pt30">
<div className="breadCrumb">
<img src={icon} className="mr12 icon_d" alt=""/>
<Link to={"/competition/qz2022/notice"}><span className="font-16 _999">通知公告</span></Link>
<img src={icon} className="mr12 icon_d" alt="" />
<Link to={`/competition/${competitionId}/notice`}><span className="font-16 _999">通知公告</span></Link>
<span className="mr10 ml10 _999">/</span>
<span className="font-16 _18">公告详情</span>
</div>
<div className="notice_title _1818 font-18">{detail && detail.title}</div>
<div className="notice_time">发布时间: {detail && detail.created_at.substring(0,10)}</div>
<RenderHtml className="_1818" value={detail && detail.content}/>
<div className="notice_time">发布时间: {detail && detail.created_at.substring(0, 10)}</div>
<RenderHtml className="_1818" value={detail && detail.content} />
</div>
</div>
)

View File

@ -7,13 +7,14 @@ import '../../index.scss';
import { getNoticeList, deleteQz2022Notice } from "../api";
import RenderHtml from "src/components/render-html";
function Notice({ current_user, qzDetail }) {
function Notice({ current_user, qzDetail,match }) {
const { competitionId } = match.params;
const manageEdit = (qzDetail && qzDetail.is_manager) || (current_user && current_user.admin);
const [noticeList, setNoticeList] = useState([]);
const [reload, setReload] = useState(undefined);
useEffect(() => {
getNoticeList().then(response => {
getNoticeList(competitionId).then(response => {
if (response.status === 200 && response.data.message === "success") {
setNoticeList(response.data.data);
}
@ -25,7 +26,7 @@ function Notice({ current_user, qzDetail }) {
title: "是否删除",
content: "确定删除此通知公告?",
onOk() {
deleteQz2022Notice(id).then(response => {
deleteQz2022Notice(id,competitionId).then(response => {
if (response.status === 200 && response.data.message === "success") {
setReload(Math.random());
message.success("删除成功");
@ -38,16 +39,16 @@ function Notice({ current_user, qzDetail }) {
return (
<div className="qz_notice bg">
{manageEdit && <div className="qz_main manageEdit mt30">
<Link to={"/competition/qz2022/notice/add"}><Button>新增公告</Button></Link>
<Link to={`/competition/${competitionId}/notice/add`}><Button>新增公告</Button></Link>
</div>}
<div className="qz_main not">
{noticeList && noticeList.map(item => {
return <div className="qz_notice_cont" key={item.id}>
<div className="head">
<Link to={`/competition/qz2022/notice/detail/${item.id}`} className="notCont_head"><img className="notice-new" src={notice} alt=""/>{item.title}</Link>
<Link to={`/competition/${competitionId}/notice/detail/${item.id}`} className="notCont_head"><img className="notice-new" src={notice} alt=""/>{item.title}</Link>
{manageEdit && <Popover content={<Menu>
<Menu.Item>
<Link to={`/competition/qz2022/notice/edit/${item.id}`}>编辑</Link>
<Link to={`/competition/${competitionId}/notice/edit/${item.id}`}>编辑</Link>
</Menu.Item>
<Menu.Item>
<a onClick={() => { deleteNotice(item.id) }}>删除</a>

View File

@ -11,6 +11,7 @@ import '../../index.scss';
import '../apply/index.scss';
function Introduce({ form, showNotification, match, history, enrollStatus, current_user, qzDetail, setReload}) {
const { competitionId } = match.params;
// loading
const [loading, setLoading] = useState(false);
const [files, setFiles] = useState();
@ -29,7 +30,7 @@ function Introduce({ form, showNotification, match, history, enrollStatus, curre
const referStatus = qzDetail && !(Date.parse(new Date()) > Date.parse(new Date(qzDetail.enroll_date)) && Date.parse(new Date()) < Date.parse(new Date(qzDetail.upload_date)));
// URL访 enrollStatus.status = 0
if(referStatus || (current_user && !current_user.login) || (enrollStatus && (!enrollStatus.enroll_status || enrollStatus.status === 0))){
history.push("/competition/qz2022");
history.push(`/competition/${competitionId}`);
}
},[qzDetail, current_user, enrollStatus])
@ -80,7 +81,7 @@ function Introduce({ form, showNotification, match, history, enrollStatus, curre
const params = {
"attachment_ids": [files[0].response.id]
}
uploadCompetition(params).then(response=>{
uploadCompetition(params,competitionId).then(response=>{
if(response && response.status === 200){
setChangeFiles(false);
setReload(Math.random());

View File

@ -1,3 +1,3 @@
// 启智2022所有的路由后缀
export const paths = ["qz2022","introduce", "fingerpost", "notice", "apply", "refer", "statistics", "chat", "contact", "applys", "production",""]
export const paths = ["qz2022","CCKS","ccks","introduce", "fingerpost", "notice", "apply", "refer", "statistics", "chat", "contact", "applys", "production",""]