From d33eca5486fb518e2ddd06336dde6934862d6224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Sun, 28 Jul 2019 10:12:04 +0800 Subject: [PATCH 001/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/ListPageIndex.js | 2 +- public/react/src/modules/user/LoginRegisterComponent.js | 3 +++ public/react/src/modules/user/Notcompletedysl.js | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/ListPageIndex.js b/public/react/src/modules/courses/ListPageIndex.js index 95342bb13..9f12f6434 100644 --- a/public/react/src/modules/courses/ListPageIndex.js +++ b/public/react/src/modules/courses/ListPageIndex.js @@ -103,7 +103,7 @@ class ListPageIndex extends Component{
{/*头部banner*/} - + {/*{yslGuideone===null||yslGuideone===undefined||yslGuideone===false?*/} {/* (*/} {/* this.props.isAdmin()===true?*/} diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index eb0a3a5c2..ebb099b2e 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -359,6 +359,9 @@ class LoginRegisterComponent extends Component { if(weekArray===undefined){ weekArray="/"; } + if(weekArray===null){ + weekArray="/"; + } window.location.href = weekArray; } } diff --git a/public/react/src/modules/user/Notcompletedysl.js b/public/react/src/modules/user/Notcompletedysl.js index 8f147957a..5f180af48 100644 --- a/public/react/src/modules/user/Notcompletedysl.js +++ b/public/react/src/modules/user/Notcompletedysl.js @@ -37,6 +37,9 @@ class Notcompletedysl extends Component { if(weekArray===undefined){ weekArray="/"; } + if(weekArray===null){ + weekArray="/"; + } window.location.href = weekArray; } From 4db7e1e058b4da33234d51405b7dd0f745c02c6c Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 09:08:29 +0800 Subject: [PATCH 002/117] =?UTF-8?q?=E8=AF=95=E5=8D=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/common/TextUtil.js | 7 ++++++- .../common/components/markdown/MarkdownToHtml.css | 6 ++++++ .../common/components/markdown/MarkdownToHtml.js | 13 ++++++++----- 3 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 public/react/src/common/components/markdown/MarkdownToHtml.css diff --git a/public/react/src/common/TextUtil.js b/public/react/src/common/TextUtil.js index 82a848cac..8aef0adbd 100644 --- a/public/react/src/common/TextUtil.js +++ b/public/react/src/common/TextUtil.js @@ -10,7 +10,8 @@ export function markdownToHTML(oldContent, selector) { window.$(selector).html(oldContent) } else { try { - var markdwonParser = window.editormd.markdownToHTML("md_div", { + // selector || + var markdwonParser = window.editormd.markdownToHTML(selector || "md_div", { markdown: oldContent, // .replace(/▁/g,"▁▁▁"), emoji: true, htmlDecode: "style,script,iframe", // you can filter tags decode @@ -23,6 +24,10 @@ export function markdownToHTML(oldContent, selector) { } catch(e) { console.error(e) } + // selector = '.' + selector + if (selector) { + return; + } const content = window.$('#md_div').html() if (selector) { diff --git a/public/react/src/common/components/markdown/MarkdownToHtml.css b/public/react/src/common/components/markdown/MarkdownToHtml.css new file mode 100644 index 000000000..affba12cd --- /dev/null +++ b/public/react/src/common/components/markdown/MarkdownToHtml.css @@ -0,0 +1,6 @@ +.markdownToHtml.editormd-html-preview, .markdownToHtml.editormd-preview-container { + overflow: hidden; +} +.markdownToHtml.editormd-html-preview p.editormd-tex, .markdownToHtml.editormd-preview-container p.editormd-tex { + text-align: left; +} \ No newline at end of file diff --git a/public/react/src/common/components/markdown/MarkdownToHtml.js b/public/react/src/common/components/markdown/MarkdownToHtml.js index 0780fc789..c7d15cf64 100644 --- a/public/react/src/common/components/markdown/MarkdownToHtml.js +++ b/public/react/src/common/components/markdown/MarkdownToHtml.js @@ -1,5 +1,6 @@ import React,{ Component } from "react"; import { markdownToHTML } from 'educoder' +import './MarkdownToHtml.css' /** selector 需要传入唯一的selector作为id,不然会引起冲突 delay 如果有公式,需要传入delay={true} @@ -14,9 +15,9 @@ class MarkdownToHtml extends Component{ if (this.props.delay == true) { (function(content, selector) { // console.log('selector: ', selector) - setTimeout(() => { + // setTimeout(() => { markdownToHTML(content, selector) - }, 600) + // }, 600) })(content, selector) } else { markdownToHTML(content, selector) @@ -25,18 +26,20 @@ class MarkdownToHtml extends Component{ componentDidUpdate = (prevProps) => { if (this.props.content) { if ( prevProps.content != this.props.content ) { - this._markdownToHTML(this.props.content, `.markdown_to_html_${this.props.selector || ''}`) + this._markdownToHTML(this.props.content, `markdown_to_html_${this.props.selector || ''}`) } } } componentDidMount () { - this.props.content && this._markdownToHTML(this.props.content, `.markdown_to_html_${this.props.selector || ''}`) + this.props.content && this._markdownToHTML(this.props.content, `markdown_to_html_${this.props.selector || ''}`) } render(){ const { style, className } = this.props + let _selector = `markdown_to_html_${this.props.selector || ''}` + return( -
From 7b610c9c95c5e0d7e3e3d2e1b53fa5b1761a9fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Mon, 29 Jul 2019 09:15:16 +0800 Subject: [PATCH 003/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/login/LoginDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/login/LoginDialog.js b/public/react/src/modules/login/LoginDialog.js index 50038366d..2db1929b9 100644 --- a/public/react/src/modules/login/LoginDialog.js +++ b/public/react/src/modules/login/LoginDialog.js @@ -360,7 +360,7 @@ class LoginDialog extends Component { if(response.status===200){ if (response.data.status === 402) { - window.location.href = response.data.url; + // window.location.href = response.data.url; }else if (response.data.status === -2) { notification.open({ message: '提示', From bfe5e24935a20fe42a37410f509ee5289ef5037f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Mon, 29 Jul 2019 09:18:05 +0800 Subject: [PATCH 004/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/user/LoginRegisterComponent.js | 3 +++ public/react/src/modules/user/Notcompletedysl.js | 3 +++ 2 files changed, 6 insertions(+) diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index ebb099b2e..ff03b11ea 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -362,6 +362,9 @@ class LoginRegisterComponent extends Component { if(weekArray===null){ weekArray="/"; } + if(weekArray==="null"){ + weekArray="/"; + } window.location.href = weekArray; } } diff --git a/public/react/src/modules/user/Notcompletedysl.js b/public/react/src/modules/user/Notcompletedysl.js index 5f180af48..e50d162a6 100644 --- a/public/react/src/modules/user/Notcompletedysl.js +++ b/public/react/src/modules/user/Notcompletedysl.js @@ -40,6 +40,9 @@ class Notcompletedysl extends Component { if(weekArray===null){ weekArray="/"; } + if(weekArray==="null"){ + weekArray="/"; + } window.location.href = weekArray; } From 0f491426c503bdd6908271dca86bc834ccd80076 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Jul 2019 09:26:31 +0800 Subject: [PATCH 005/117] =?UTF-8?q?=E5=B7=A5=E7=A8=8B=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E5=AF=BC=E8=88=AA=E6=A0=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 3 +-- app/models/user.rb | 7 +++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 23f6870c8..a1f6a5495 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -73,8 +73,7 @@ class UsersController < ApplicationController @user_url = "/users/#{@user.login}" @career = Career.where(status: true).order("created_at asc").pluck(:id, :name) - ec_user = EcSchoolUser.where(:user_id => current_user.id).first - @auth = ec_user ? "#{@old_domain}/ecs/department?school_id=#{ec_user.school_id}" : nil + @auth = User.current.ec_school.present? ? "#{@old_domain}/ecs/department?school_id=#{User.current.ec_school}" : nil end # 用户回复功能 diff --git a/app/models/user.rb b/app/models/user.rb index f2d9c7fb1..a95776be9 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -497,6 +497,13 @@ class User < ApplicationRecord ) end + # 工程认证的学校 + def ec_school + school_id = self.ec_school_users.pluck(:school_id).first || + self.ec_major_schools.pluck(:school_id).first || + (self.ec_course_users.first && self.ec_course_users.first.try(:ec_course).try(:ec_year).try(:ec_major_school).try(:school_id)) + end + # 登录,返回用户名与密码匹配的用户 def self.try_to_login(login, password) login = login.to_s.strip From 199c603ac93553454da7269b77a2c3d5f901905b Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 09:38:49 +0800 Subject: [PATCH 006/117] md --- .../components/markdown/MarkdownToHtml.js | 14 ++------------ .../courses/exercise/ExerciseReviewAndAnswer.js | 16 +++++++++++++--- .../exercise/Exercisestatisticalresult.js | 8 +++++--- .../courses/exercise/new/JudgeDisplay.js | 7 +++++-- .../modules/courses/exercise/new/MainDisplay.js | 4 ++-- .../modules/courses/exercise/new/NullDisplay.js | 2 +- .../exercise/new/QestionDisplayHeader.js | 4 ++-- .../courses/exercise/new/SingleDisplay.js | 8 ++++---- .../courses/exercise/question/fillEmpty.js | 7 +++++-- .../courses/exercise/question/multiple.js | 7 +++++-- .../courses/exercise/question/simpleAnswer.js | 17 +++++++++++++---- .../modules/courses/exercise/question/single.js | 7 +++++-- 12 files changed, 62 insertions(+), 39 deletions(-) diff --git a/public/react/src/common/components/markdown/MarkdownToHtml.js b/public/react/src/common/components/markdown/MarkdownToHtml.js index c7d15cf64..63733165e 100644 --- a/public/react/src/common/components/markdown/MarkdownToHtml.js +++ b/public/react/src/common/components/markdown/MarkdownToHtml.js @@ -3,7 +3,6 @@ import { markdownToHTML } from 'educoder' import './MarkdownToHtml.css' /** selector 需要传入唯一的selector作为id,不然会引起冲突 - delay 如果有公式,需要传入delay={true} */ class MarkdownToHtml extends Component{ constructor(props){ @@ -11,17 +10,8 @@ class MarkdownToHtml extends Component{ this.state={ } } - _markdownToHTML = (content, selector) => { - if (this.props.delay == true) { - (function(content, selector) { - // console.log('selector: ', selector) - // setTimeout(() => { - markdownToHTML(content, selector) - // }, 600) - })(content, selector) - } else { - markdownToHTML(content, selector) - } + _markdownToHTML = (content, selector) => { + markdownToHTML(content, selector) } componentDidUpdate = (prevProps) => { if (this.props.content) { diff --git a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js index cd3355082..778829d72 100644 --- a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js +++ b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js @@ -7,7 +7,7 @@ import '../poll/pollStyle.css' import '../css/Courses.css' import moment from 'moment' -import { WordsBtn,markdownToHTML,ActionBtn,getImageUrl } from 'educoder' +import { WordsBtn,markdownToHTML,ActionBtn,getImageUrl, MarkdownToHtml } from 'educoder' import Modals from '../../modals/Modals' import CoursesListType from '../coursesPublic/CoursesListType'; @@ -537,7 +537,7 @@ class ExerciseReviewAndAnswer extends Component{ />

- {courseName} + {courseName} > {data && data.left_banner_name} > @@ -712,7 +712,10 @@ class ExerciseReviewAndAnswer extends Component{

  • -

    + {/*

    */} +
  • { // 选择题和判断题共用 @@ -724,6 +727,7 @@ class ExerciseReviewAndAnswer extends Component{ questionType={item} user_exercise_status={user_exercise_status} changeQuestionStatus={(No,flag)=>this.changeQuestionStatus(No,flag)} + index={key} > } { @@ -736,6 +740,8 @@ class ExerciseReviewAndAnswer extends Component{ questionType={item} user_exercise_status={user_exercise_status} changeQuestionStatus={(No,flag)=>this.changeQuestionStatus(No,flag)} + index={key} + > } { @@ -748,6 +754,8 @@ class ExerciseReviewAndAnswer extends Component{ questionType={item} user_exercise_status={user_exercise_status} changeQuestionStatus={(No,flag)=>this.changeQuestionStatus(No,flag)} + index={key} + > } { @@ -774,6 +782,8 @@ class ExerciseReviewAndAnswer extends Component{ questionType={item} user_exercise_status={user_exercise_status} id={this.state.Id} + index={key} + > } diff --git a/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js b/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js index 6e7b52715..1771d87b3 100644 --- a/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js +++ b/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js @@ -1,5 +1,5 @@ import React, {Component} from "react"; -import {WordsBtn,markdownToHTML} from 'educoder'; +import {WordsBtn,markdownToHTML, MarkdownToHtml} from 'educoder'; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider,InputNumber, Tag,DatePicker,Radio,Tooltip,Pagination} from "antd"; import {Link,Switch,Route,Redirect} from 'react-router-dom'; import axios from 'axios'; @@ -194,8 +194,10 @@ class Exercisestatisticalresult extends Component { {item.ques_position+"."}{item.ques_type===0?"单选":item.ques_type===1?"多选":item.ques_type===2?"判断":item.ques_type===3?"填空":item.ques_type===4?"主观":item.ques_type===5?"实训":""}题
    {/*Q{item.ques_position}:*/} -
    - + {/*
    */} + {/**/}
    diff --git a/public/react/src/modules/courses/exercise/new/JudgeDisplay.js b/public/react/src/modules/courses/exercise/new/JudgeDisplay.js index 7beaa50e5..0f8930a8a 100644 --- a/public/react/src/modules/courses/exercise/new/JudgeDisplay.js +++ b/public/react/src/modules/courses/exercise/new/JudgeDisplay.js @@ -87,9 +87,12 @@ class JudgeDisplay extends Component{ return (
    - {item.choice_text} + {/* {item.choice_text} */} + {/* */} + dangerouslySetInnerHTML={{__html: markdownToHTML1(item.choice_text)}}> */}
    ) })} diff --git a/public/react/src/modules/courses/exercise/new/MainDisplay.js b/public/react/src/modules/courses/exercise/new/MainDisplay.js index 0581865d7..44a795374 100644 --- a/public/react/src/modules/courses/exercise/new/MainDisplay.js +++ b/public/react/src/modules/courses/exercise/new/MainDisplay.js @@ -70,10 +70,10 @@ class MainDisplay extends Component{
    参考答案:
    {/*
    */} diff --git a/public/react/src/modules/courses/exercise/new/NullDisplay.js b/public/react/src/modules/courses/exercise/new/NullDisplay.js index eade97474..079b1194f 100644 --- a/public/react/src/modules/courses/exercise/new/NullDisplay.js +++ b/public/react/src/modules/courses/exercise/new/NullDisplay.js @@ -109,7 +109,7 @@ class NullDisplay extends Component{
    { answers.answer_text.map((item, itemIndex) => { return })} diff --git a/public/react/src/modules/courses/exercise/new/QestionDisplayHeader.js b/public/react/src/modules/courses/exercise/new/QestionDisplayHeader.js index 7b82b14b6..c90d87dac 100644 --- a/public/react/src/modules/courses/exercise/new/QestionDisplayHeader.js +++ b/public/react/src/modules/courses/exercise/new/QestionDisplayHeader.js @@ -82,9 +82,9 @@ class QestionDisplayHeader extends Component{
    { question_title && - //
    } diff --git a/public/react/src/modules/courses/exercise/new/SingleDisplay.js b/public/react/src/modules/courses/exercise/new/SingleDisplay.js index cbb6da827..bce4dc4c1 100644 --- a/public/react/src/modules/courses/exercise/new/SingleDisplay.js +++ b/public/react/src/modules/courses/exercise/new/SingleDisplay.js @@ -101,10 +101,10 @@ class SingleDisplay extends Component{
    {prefix} {/* */} + dangerouslySetInnerHTML={{__html: markdownToHTML1(item.choice_text)}}> */}
    ) } else { @@ -112,10 +112,10 @@ class SingleDisplay extends Component{
    {prefix} {/* */} + dangerouslySetInnerHTML={{__html: markdownToHTML1(item.choice_text)}}> */}
    ) } })} diff --git a/public/react/src/modules/courses/exercise/question/fillEmpty.js b/public/react/src/modules/courses/exercise/question/fillEmpty.js index 79bc164d8..5179432a2 100644 --- a/public/react/src/modules/courses/exercise/question/fillEmpty.js +++ b/public/react/src/modules/courses/exercise/question/fillEmpty.js @@ -1,6 +1,6 @@ import React,{ Component } from "react"; import {Checkbox,Radio, Input} from "antd"; -import {DMDEditor,markdownToHTML } from 'educoder' +import {DMDEditor,markdownToHTML, MarkdownToHtml } from 'educoder' import axios from 'axios' @@ -140,7 +140,10 @@ class fillEmpty extends Component{ { item.answer_text && item.answer_text.map((i,index)=>{ return( -
    + + //
    ) }) } diff --git a/public/react/src/modules/courses/exercise/question/multiple.js b/public/react/src/modules/courses/exercise/question/multiple.js index 3ef3d960f..7e96f8550 100644 --- a/public/react/src/modules/courses/exercise/question/multiple.js +++ b/public/react/src/modules/courses/exercise/question/multiple.js @@ -1,6 +1,6 @@ import React,{ Component } from "react"; import {Checkbox,Radio, Input} from "antd"; -import {markdownToHTML} from 'educoder' +import {markdownToHTML, MarkdownToHtml} from 'educoder' import axios from 'axios' const tagArray = [ @@ -51,7 +51,10 @@ class Multiple extends Component{

    {prefix} {/* */} - + {/* */} +

    ) }) diff --git a/public/react/src/modules/courses/exercise/question/simpleAnswer.js b/public/react/src/modules/courses/exercise/question/simpleAnswer.js index 240f775c2..527044968 100644 --- a/public/react/src/modules/courses/exercise/question/simpleAnswer.js +++ b/public/react/src/modules/courses/exercise/question/simpleAnswer.js @@ -1,6 +1,6 @@ import React,{ Component } from "react"; import {Checkbox,Radio, Input} from "antd"; -import {markdownToHTML} from 'educoder' +import {markdownToHTML, MarkdownToHtml} from 'educoder' import TPMMDEditor from '../../../../modules/tpm/challengesnew/TPMMDEditor' import axios from 'axios' @@ -54,7 +54,10 @@ class simpleAnswer extends Component{
  • { user_exercise_status == 1 ? -
    0 ? questionType.user_answer[0]:"")}}>
    + //
    0 ? questionType.user_answer[0]:"")}}>
    + 0 ? questionType.user_answer[0]:""} selector={'simgle_' + (this.props.index + 1)} + className="answerStyle" + > :
    0 ? questionType.user_answer[0]:''} mdID={'simpleEditor'+questionType.question_id} placeholder="请输入你的答案" @@ -70,7 +73,10 @@ class simpleAnswer extends Component{ exercise.answer_status == 1 || questionType.a_flag ?

    参考答案:

    -
  • + {/*
  • */} +

    this.showAndHide(false)}>隐藏参考答案

    : @@ -82,7 +88,10 @@ class simpleAnswer extends Component{ isStudent && exercise.answer_open==true && exercise.exercise_status == 3 ?

    参考答案:

    -
  • + {/*
  • */} +
    :"" }
    diff --git a/public/react/src/modules/courses/exercise/question/single.js b/public/react/src/modules/courses/exercise/question/single.js index 4ff4bf12b..510c28b48 100644 --- a/public/react/src/modules/courses/exercise/question/single.js +++ b/public/react/src/modules/courses/exercise/question/single.js @@ -1,7 +1,7 @@ import React,{ Component } from "react"; import {Checkbox,Radio, Input} from "antd"; -import {markdownToHTML} from 'educoder' +import {markdownToHTML, MarkdownToHtml} from 'educoder' import axios from 'axios' const tagArray = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', @@ -46,7 +46,10 @@ class single extends Component{

    {prefix} {/* */} - + {/* */} +

    ) }) From 70d2790f8dc9de57dd229be5466983c495235d6c Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 13:55:32 +0800 Subject: [PATCH 007/117] liink --- .../src/modules/courses/exercise/Testpapersettinghomepage.js | 2 +- public/react/src/modules/courses/exercise/new/JudgeDisplay.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js index ddb448cfc..36b319f5a 100644 --- a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js +++ b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js @@ -267,7 +267,7 @@ class Testpapersettinghomepage extends Component{

    {this.props.coursedata.name} > - 试卷 + 试卷 > 试卷详情

    diff --git a/public/react/src/modules/courses/exercise/new/JudgeDisplay.js b/public/react/src/modules/courses/exercise/new/JudgeDisplay.js index 0f8930a8a..a0d5baf2a 100644 --- a/public/react/src/modules/courses/exercise/new/JudgeDisplay.js +++ b/public/react/src/modules/courses/exercise/new/JudgeDisplay.js @@ -7,7 +7,7 @@ import { } from 'antd'; import axios from 'axios' import { qNameArray } from './common' -import {getUrl, ActionBtn, markdownToHTML} from 'educoder'; +import {getUrl, ActionBtn, markdownToHTML, MarkdownToHtml} from 'educoder'; import QestionDisplayHeader from './QestionDisplayHeader' const { TextArea } = Input; const confirm = Modal.confirm; From 71091bfe5384c8b92bad30df4177b1bedc4ec3da Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 14:51:26 +0800 Subject: [PATCH 008/117] / --- public/react/src/modules/user/usersInfo/InfosProject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/user/usersInfo/InfosProject.js b/public/react/src/modules/user/usersInfo/InfosProject.js index 6c1f4a666..c3f023171 100644 --- a/public/react/src/modules/user/usersInfo/InfosProject.js +++ b/public/react/src/modules/user/usersInfo/InfosProject.js @@ -142,7 +142,7 @@ class InfosProject extends Component{ { item.can_visited ==false?
    - +

    非成员不能访问

    :"" } From fa5f65787a152b0517b5df9a56876203e26717be Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 14:57:48 +0800 Subject: [PATCH 009/117] / --- public/react/src/modules/user/usersInfo/InfosCourse.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/user/usersInfo/InfosCourse.js b/public/react/src/modules/user/usersInfo/InfosCourse.js index ff5321a9f..c4cefd2b6 100644 --- a/public/react/src/modules/user/usersInfo/InfosCourse.js +++ b/public/react/src/modules/user/usersInfo/InfosCourse.js @@ -147,7 +147,7 @@ class InfosCourse extends Component{ { item.can_visited ==false?
    - +

    非成员不能访问

    :"" } From 802de5004677d9e5d4e9199c6c9196cbe11f24f5 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 14:58:43 +0800 Subject: [PATCH 010/117] w --- .../react/src/modules/courses/members/studentsList.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index 363d06c54..6780948ef 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -36,8 +36,10 @@ const buildColumns = (that) => { key: 'login', align:'center', className:"color-grey-6", - render: (name, record) => { - return {name} + render: (login, record) => { + return 10 ? login : ''} + >{login} } }, { title: '姓名', @@ -57,8 +59,8 @@ const buildColumns = (that) => { align:'center', className:"color-grey-6", render: (student_id, record) => { - return {student_id} + return 10 ? student_id : ''} + style={{maxWidth: '160px'}} >{student_id} } }]; if (course_groups && course_groups.length) { From 308c3cc50dd9ab1a8e64eed4df4de5ae52635ea5 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 15:13:23 +0800 Subject: [PATCH 011/117] none data --- public/react/src/modules/user/usersInfo/InfosCourse.js | 2 +- public/react/src/modules/user/usersInfo/InfosPath.js | 2 +- public/react/src/modules/user/usersInfo/InfosProject.js | 2 +- public/react/src/modules/user/usersInfo/InfosShixun.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/user/usersInfo/InfosCourse.js b/public/react/src/modules/user/usersInfo/InfosCourse.js index c4cefd2b6..2f7d206b8 100644 --- a/public/react/src/modules/user/usersInfo/InfosCourse.js +++ b/public/react/src/modules/user/usersInfo/InfosCourse.js @@ -130,7 +130,7 @@ class InfosCourse extends Component{ this.props.current_user && this.props.current_user.user_identity != "学生" ? : "" } { - (!data || data.courses.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" ) && + (!data || data.courses.length==0) && (!is_current || (this.props.current_user && this.props.current_user.user_identity === "学生" )) && } { data && data.courses && data.courses.map((item,key)=>{ diff --git a/public/react/src/modules/user/usersInfo/InfosPath.js b/public/react/src/modules/user/usersInfo/InfosPath.js index 759527a6e..d23739280 100644 --- a/public/react/src/modules/user/usersInfo/InfosPath.js +++ b/public/react/src/modules/user/usersInfo/InfosPath.js @@ -152,7 +152,7 @@ class InfosPath extends Component{ this.props.current_user && this.props.current_user.user_identity != "学生" ? :"" } { - (!data || data.subjects.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" ) && + (!data || data.subjects.length==0) && (!is_current || (this.props.current_user && this.props.current_user.user_identity === "学生" )) && } { data && data.subjects && data.subjects.map((item,key)=>{ diff --git a/public/react/src/modules/user/usersInfo/InfosProject.js b/public/react/src/modules/user/usersInfo/InfosProject.js index c3f023171..195e98b73 100644 --- a/public/react/src/modules/user/usersInfo/InfosProject.js +++ b/public/react/src/modules/user/usersInfo/InfosProject.js @@ -125,7 +125,7 @@ class InfosProject extends Component{ :"" } { - (!data || data.projects.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" ) && + (!data || data.projects.length==0) && (!is_current || (this.props.current_user && this.props.current_user.user_identity === "学生" )) && } { data && data.projects && data.projects.map((item,key)=>{ diff --git a/public/react/src/modules/user/usersInfo/InfosShixun.js b/public/react/src/modules/user/usersInfo/InfosShixun.js index bac60fe6f..1550230ab 100644 --- a/public/react/src/modules/user/usersInfo/InfosShixun.js +++ b/public/react/src/modules/user/usersInfo/InfosShixun.js @@ -161,7 +161,7 @@ class InfosShixun extends Component{ :"" } { - (!data || data.shixuns.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" ) && + (!data || data.shixuns.length==0) && (!is_current || (this.props.current_user && this.props.current_user.user_identity === "学生" )) && } { data && data.shixuns && data.shixuns.map((item,key)=>{ From c3b2e8eefdfb9e2c7074689e5bff3d219f651d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Mon, 29 Jul 2019 15:19:43 +0800 Subject: [PATCH 012/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/busyWork/CommonWorkDetailIndex.js | 8 +++++--- .../react/src/modules/courses/busyWork/CommonWorkList.js | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index ff8e3e3a2..a300e73dc 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -136,7 +136,7 @@ class CommonWorkDetailIndex extends Component{ DownloadMessageval:undefined }) } - + bindRef = ref => { this.child = ref }; render() { @@ -171,8 +171,10 @@ class CommonWorkDetailIndex extends Component{ let params = {} if (isListModule) { // TODO - // params = this.refs.commonWorkList._getRequestParams() + params =this.child._getRequestParams()!==undefined?this.child._getRequestParams():{}; } + // console.log("普通作业176176176"); + // console.log(params); let exportUrl = `/homework_commons/${workId}/works_list.zip?${queryString.stringify(params)}` let exportResultUrl = `/homework_commons/${workId}/works_list.xlsx?${queryString.stringify(params)}` return ( @@ -356,7 +358,7 @@ class CommonWorkDetailIndex extends Component{ {/* 作品列表 */} () + (props) => () } > diff --git a/public/react/src/modules/courses/busyWork/CommonWorkList.js b/public/react/src/modules/courses/busyWork/CommonWorkList.js index 5938d037a..e72758316 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkList.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkList.js @@ -401,7 +401,7 @@ class CommonWorkList extends Component{ this.fetchList() on('commonwork_fetch_all', this.fetchAllListener) $("html").animate({ scrollTop: $('html').scrollTop() - 100 }) - + this.props.triggerRef(this); } componentWillUnmount() { off('commonwork_fetch_all', this.fetchAllListener) From 21f7995adde8aa236a4792afc8965a65625d630d Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 15:20:03 +0800 Subject: [PATCH 013/117] */ --- public/react/src/modules/user/account/ChangeHeaderPicModal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/user/account/ChangeHeaderPicModal.js b/public/react/src/modules/user/account/ChangeHeaderPicModal.js index cef643094..76a1a2ebe 100644 --- a/public/react/src/modules/user/account/ChangeHeaderPicModal.js +++ b/public/react/src/modules/user/account/ChangeHeaderPicModal.js @@ -151,7 +151,7 @@ class ChangeHeaderPicModal extends Component{ text-align: center; width: 120px; height: 120px; - border: 1px solid #eee; + /* border: 1px solid #eee; */ } .previewWrap { flex-direction: column; From 042d096746c12b13d0696c293878b519a39523fe Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 15:23:12 +0800 Subject: [PATCH 014/117] txt --- .../courses/exercise/Studentshavecompletedthelist.js | 6 +++--- .../graduation/tasks/GraduationTasksappraiseReply.js | 2 +- .../courses/graduation/tasks/GraduationTaskssettinglist.js | 4 ++-- .../modules/courses/shixunHomework/Listofworksstudentone.js | 6 +++--- .../shixunHomework/Shixunworkdetails/ShixunWorkModal.js | 2 +- public/react/src/modules/forums/MemoList.js | 2 +- public/react/src/search/SearchPage.js | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js index 6f4cec877..fffadccf6 100644 --- a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js +++ b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js @@ -2565,7 +2565,7 @@ class Studentshavecompletedthelist extends Component {
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    @@ -2630,7 +2630,7 @@ class Studentshavecompletedthelist extends Component {
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    @@ -2692,7 +2692,7 @@ class Studentshavecompletedthelist extends Component {
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTasksappraiseReply.js b/public/react/src/modules/courses/graduation/tasks/GraduationTasksappraiseReply.js index 1e0fb3071..6c7085ca2 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTasksappraiseReply.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTasksappraiseReply.js @@ -190,7 +190,7 @@ export default ImageLayerOfCommentHOC() (GraduationTasksappraiseReply); {/*className="edu-tab-con-box clearfix edu-txt-center">*/} {/**/} - {/*

    没有数据可以显示!

    */} + {/*

    暂时还没有相关数据哦!

    */} {/**/} {/**/} {/**/} \ No newline at end of file diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js index d773d8411..7d421da4b 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js @@ -1307,7 +1307,7 @@ class GraduationTaskssettinglist extends Component{
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    @@ -1573,7 +1573,7 @@ class GraduationTaskssettinglist extends Component{ className="edu-tab-con-box clearfix edu-txt-center"> -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    diff --git a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js index 8ec2ffcbc..4dc41fcf7 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js @@ -2528,7 +2528,7 @@ class Listofworksstudentone extends Component {
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    @@ -2747,7 +2747,7 @@ class Listofworksstudentone extends Component {
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    @@ -2945,7 +2945,7 @@ class Listofworksstudentone extends Component {
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    diff --git a/public/react/src/modules/courses/shixunHomework/Shixunworkdetails/ShixunWorkModal.js b/public/react/src/modules/courses/shixunHomework/Shixunworkdetails/ShixunWorkModal.js index f1d1c43f3..cc9586577 100644 --- a/public/react/src/modules/courses/shixunHomework/Shixunworkdetails/ShixunWorkModal.js +++ b/public/react/src/modules/courses/shixunHomework/Shixunworkdetails/ShixunWorkModal.js @@ -258,7 +258,7 @@ class ShixunWorkModal extends Component{
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    diff --git a/public/react/src/modules/forums/MemoList.js b/public/react/src/modules/forums/MemoList.js index fae728542..26cad1448 100644 --- a/public/react/src/modules/forums/MemoList.js +++ b/public/react/src/modules/forums/MemoList.js @@ -31,7 +31,7 @@ class MemoList extends Component { {!memo_list || memo_list.length === 0 ?
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    : renderMemoList() } diff --git a/public/react/src/search/SearchPage.js b/public/react/src/search/SearchPage.js index 32d88b392..ccdb9e12a 100644 --- a/public/react/src/search/SearchPage.js +++ b/public/react/src/search/SearchPage.js @@ -164,7 +164,7 @@ class SearchPage extends Component{
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    From 32dfe561709d95b4c2f3c20ffa3ce705fc384745 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 15:23:21 +0800 Subject: [PATCH 015/117] txt --- public/react/src/modules/courses/busyWork/CommonWorkList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkList.js b/public/react/src/modules/courses/busyWork/CommonWorkList.js index 5938d037a..9fcf07c01 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkList.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkList.js @@ -767,7 +767,7 @@ class CommonWorkList extends Component{
    -

    没有数据可以显示!

    +

    暂时还没有相关数据哦!

    From aecd13c5798888e1a56215490e8b641d44322573 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 15:25:49 +0800 Subject: [PATCH 016/117] MarkdownToHtml --- public/react/src/modules/courses/exercise/new/JudgeDisplay.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/exercise/new/JudgeDisplay.js b/public/react/src/modules/courses/exercise/new/JudgeDisplay.js index 0f8930a8a..60fbd5ac2 100644 --- a/public/react/src/modules/courses/exercise/new/JudgeDisplay.js +++ b/public/react/src/modules/courses/exercise/new/JudgeDisplay.js @@ -7,7 +7,7 @@ import { } from 'antd'; import axios from 'axios' import { qNameArray } from './common' -import {getUrl, ActionBtn, markdownToHTML} from 'educoder'; +import {getUrl, ActionBtn, markdownToHTML, MarkdownToHtml } from 'educoder'; import QestionDisplayHeader from './QestionDisplayHeader' const { TextArea } = Input; const confirm = Modal.confirm; From fc40112da87a0cab9e9a86b0c4a51de37362d42d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 15:57:33 +0800 Subject: [PATCH 017/117] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/edu-all.css | 17 +++++++++++++++-- public/react/public/index.html | 2 +- public/react/src/modules/home/shixunsHome.js | 2 +- public/react/src/modules/tpm/NewFooter.js | 3 ++- public/react/src/modules/tpm/NewHeader.js | 12 ++++++++---- public/react/src/modules/tpm/TPMIndex.css | 4 ++++ .../react/src/modules/user/Notcompletedysl.js | 2 +- public/stylesheets/educoder/edu-all.css | 17 +++++++++++++++-- 8 files changed, 47 insertions(+), 12 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index a9e24da3d..4eeb5497c 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -1,11 +1,24 @@ /*--------------------------首页*/ /*头部导航条样式---2018-03-19--by-cs*/ -.newHeader{background: #24292D !important; width:100%; height: 60px !important; min-width: 1200px;position: fixed;top: 0px;left: 0px;z-index:1000;-moz-box-shadow: 0px 0px 12px rgba(0,0,0,0.1); /* 老的 Firefox */box-shadow: 0px 0px 12px rgba(0,0,0,0.1);} +.newHeader{ + overflow:hidden; + text-overflow:ellipsis; + white-space:nowrap; + background: #24292D !important; width:100%; height: 60px !important; min-width: 1200px;position: fixed;top: 0px;left: 0px;z-index:1000;-moz-box-shadow: 0px 0px 12px rgba(0,0,0,0.1); /* 老的 Firefox */box-shadow: 0px 0px 12px rgba(0,0,0,0.1); +} .newHeader .logoimg{ margin-top: 16px; float: left; width: 97px;} -.head-nav{float: left;width: 830px;text-align: center;height: 60px;box-sizing: border-box; min-width: 400px;} +.head-nav{ + text-align: center; + height: 60px; + box-sizing: border-box; + min-width: 1000px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} .head-nav ul#header-nav{position: absolute;top: 0px;z-index: 3;height: 60px;box-sizing: border-box;} .head-nav ul#header-nav li{float: left;height: 60px;line-height: 60px;margin-right: 30px;cursor: pointer;position: relative;font-size: 16px} .head-nav ul#header-nav li a{display: block;height: 100%;width: 100%;color: #fff} diff --git a/public/react/public/index.html b/public/react/public/index.html index a4a795941..318268610 100755 --- a/public/react/public/index.html +++ b/public/react/public/index.html @@ -87,7 +87,7 @@ -
    +
    diff --git a/public/react/src/modules/home/shixunsHome.js b/public/react/src/modules/home/shixunsHome.js index 003724ede..65284d0f8 100644 --- a/public/react/src/modules/home/shixunsHome.js +++ b/public/react/src/modules/home/shixunsHome.js @@ -123,7 +123,7 @@ class ShixunsHome extends Component { {/*懒加载*/} - + {/**/}
    diff --git a/public/react/src/modules/tpm/NewFooter.js b/public/react/src/modules/tpm/NewFooter.js index 7f8cd502c..a85b35ccf 100644 --- a/public/react/src/modules/tpm/NewFooter.js +++ b/public/react/src/modules/tpm/NewFooter.js @@ -16,7 +16,8 @@ class NewFooter extends Component { render() { return ( -
    +
    + {/*newContainers*/}
    {/*
    diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index d197bc9c4..6b435b619 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -649,9 +649,11 @@ submittojoinclass=(value)=>{ {...this.state} {...this.props} />:""} - + 高校智能化教学与实训平台 + +
    {/*<%= link_to image_tag("/images/educoder/logo.png", alt:"高校智能化教学与实训平台", className:"logoimg"), home_path %>*/} @@ -770,6 +772,8 @@ submittojoinclass=(value)=>{
    +
    + {/* <%= link_to '登录', signin_path, :className => "mr5" %> @@ -786,7 +790,7 @@ submittojoinclass=(value)=>{ 注册 : - ); diff --git a/public/react/src/modules/tpm/TPMIndex.css b/public/react/src/modules/tpm/TPMIndex.css index 1eb60bee8..0e2720b01 100644 --- a/public/react/src/modules/tpm/TPMIndex.css +++ b/public/react/src/modules/tpm/TPMIndex.css @@ -200,4 +200,8 @@ body>.-task-title { .HeaderSearch{ width: 325px; +} +.mainheighs{ + height: 100%; + display: block; } \ No newline at end of file diff --git a/public/react/src/modules/user/Notcompletedysl.js b/public/react/src/modules/user/Notcompletedysl.js index e50d162a6..53d9b3509 100644 --- a/public/react/src/modules/user/Notcompletedysl.js +++ b/public/react/src/modules/user/Notcompletedysl.js @@ -52,7 +52,7 @@ class Notcompletedysl extends Component { render() { - console.log(this.props) + // console.log(this.props) return( Date: Mon, 29 Jul 2019 16:16:17 +0800 Subject: [PATCH 018/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/user/LoginRegisterComponent.js | 111 +++++++++--------- 1 file changed, 57 insertions(+), 54 deletions(-) diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index ff03b11ea..5b5250004 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -678,60 +678,63 @@ class LoginRegisterComponent extends Component { } //失去焦点判断 inputOnBlur = (e, id) => { - // this.isCorrectname(e.target.value, id); - // this.Emailphonenumberverification(e.target.value, id); - if (e.target.value.length === 0) { - this.setState({ - Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, - }) - return; - } - // var telephone = $("#telephoneAdd.tianjia_phone").val(); - var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; - // var email = $("#add_email.tianjia_email").val(); - var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; - - // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 - var stringdata = undefined; - if (!regph.test(e.target.value)) { - stringdata = "手机号格式不正确"; - this.setState({ - Phonenumberisnotco: stringdata, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - } else { - this.setState({ - Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, - }) - return - } - - if (!regemail.test(e.target.value)) { - if ((e.target.value.indexOf("@") != -1) === true) { - stringdata = "邮箱格式不正确"; - } else { - stringdata = "手机号格式不正确"; - - } - this.setState({ - Phonenumberisnotco: stringdata, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - return - } else { - this.setState({ - Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, - }) - this.Emailphonenumberverification(e.target.value, 1); - return - } + // debugger + // // this.isCorrectname(e.target.value, id); + // // this.Emailphonenumberverification(e.target.value, id); + // if (e.target.value.length === 0) { + // this.setState({ + // Phonenumberisnotco: undefined, + // Phonenumberisnotcobool: false, + // }) + // return; + // } + // // var telephone = $("#telephoneAdd.tianjia_phone").val(); + // var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // // var email = $("#add_email.tianjia_email").val(); + // var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; + // + // // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + // var stringdata = undefined; + // if (!regph.test(e.target.value)) { + // stringdata = "手机号格式不正确"; + // this.setState({ + // Phonenumberisnotco: stringdata, + // Phonenumberisnotcobool: true, + // dragOk:false, + // Whethertoverify:this.state.Whethertoverify===true?false:true, + // }) + // } else { + // console.log("706"); + // this.setState({ + // Phonenumberisnotco: undefined, + // Phonenumberisnotcobool: false, + // }) + // return + // } + // + // if (!regemail.test(e.target.value)) { + // if ((e.target.value.indexOf("@") != -1) === true) { + // stringdata = "邮箱格式不正确"; + // } else { + // stringdata = "手机号格式不正确"; + // + // } + // this.setState({ + // Phonenumberisnotco: stringdata, + // Phonenumberisnotcobool: true, + // dragOk:false, + // Whethertoverify:this.state.Whethertoverify===true?false:true, + // }) + // return + // } else { + // console.log("729"); + // this.setState({ + // Phonenumberisnotco: undefined, + // Phonenumberisnotcobool: false, + // }) + // this.Emailphonenumberverification(e.target.value, 1); + // return + // } this.Emailphonenumberverification(e.target.value, 1); } inputOnBlurzhuche = (e, id) => { From 527be293c375804baf32ce0c27f6ec44e1f257fc Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Jul 2019 16:19:50 +0800 Subject: [PATCH 019/117] =?UTF-8?q?=E5=BC=80=E5=90=AF=E5=AE=9E=E8=AE=AD?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/concerns/git_helper.rb | 2 +- app/controllers/shixuns_controller.rb | 2 +- db/migrate/20190729080934_modify_login_for_users.rb | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20190729080934_modify_login_for_users.rb diff --git a/app/controllers/concerns/git_helper.rb b/app/controllers/concerns/git_helper.rb index 65ebd4074..d77e1c3f6 100644 --- a/app/controllers/concerns/git_helper.rb +++ b/app/controllers/concerns/git_helper.rb @@ -48,7 +48,7 @@ module GitHelper def project_fork(container, original_rep_path, username) raise Educoder::TipException.new("fork源路径为空,fork失败!") if original_rep_path.blank? # 将要生成的仓库名字 - new_repo_name = "#{username}/#{container.try(:identifier)}#{ Time.now.strftime("%Y%m%d%H%M%S")}" + new_repo_name = "#{username.try(:strip)}/#{container.try(:identifier)}#{ Time.now.strftime("%Y%m%d%H%M%S")}" uid_logger("start fork container: repo_name is #{new_repo_name}") GitService.fork_repository(repo_path: original_rep_path, fork_repository_path: (new_repo_name + ".git")) container.update_attributes!(:repo_name => new_repo_name) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 1c272e02d..6c3f34a60 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -716,7 +716,7 @@ class ShixunsController < ApplicationController rescue Exception => e if e.message != "ActiveRecord::RecordInvalid" logger.error("##########project_fork error #{e.message}") - @current_task.destroy! + @myshixun.destroy! end raise "实训云平台繁忙(繁忙等级:81)" end diff --git a/db/migrate/20190729080934_modify_login_for_users.rb b/db/migrate/20190729080934_modify_login_for_users.rb new file mode 100644 index 000000000..96fb9f1d1 --- /dev/null +++ b/db/migrate/20190729080934_modify_login_for_users.rb @@ -0,0 +1,8 @@ +class ModifyLoginForUsers < ActiveRecord::Migration[5.2] + def change + users = User.where("created_on > '2019-07-26 19:00:00'") + users.find_each do |use| + use.update_column(:login, use.login.strip) + end + end +end From 6fae1b8f5832e684e29ec6e798293b5ae57a3990 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Mon, 29 Jul 2019 16:29:30 +0800 Subject: [PATCH 020/117] fix elasticsearch title not highlight bug --- app/services/concerns/elasticsearch_able.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/services/concerns/elasticsearch_able.rb b/app/services/concerns/elasticsearch_able.rb index c1640470c..e93f9c537 100644 --- a/app/services/concerns/elasticsearch_able.rb +++ b/app/services/concerns/elasticsearch_able.rb @@ -22,6 +22,7 @@ module ElasticsearchAble fragment_size: EduSetting.get('es_highlight_fragment_size') || 30, tag: '', fields: { + name: { type: 'plain' }, challenge_names: { type: 'plain' }, challenge_tag_names: { type: 'plain' }, description: { type: 'plain' }, From 6934b3e00625020cc9cdc4290ac55c49a3e1c8b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 16:37:16 +0800 Subject: [PATCH 021/117] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 22 +++++++++++----------- public/react/src/modules/tpm/TPMIndex.css | 4 ++++ public/stylesheets/educoder/edu-all.css | 1 + 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 363ff495d..4928b525f 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -20,16 +20,16 @@ function locationurl(list){ // TODO 开发期多个身份切换 let debugType ="" -if (isDev) { - const _search = window.location.search; - let parsed = {}; - if (_search) { - parsed = queryString.parse(_search); - } - debugType = window.location.search.indexOf('debug=t') != -1 ? 'teacher' : - window.location.search.indexOf('debug=s') != -1 ? 'student' : - window.location.search.indexOf('debug=a') != -1 ? 'admin' : parsed.debug || 'admin' -} +// if (isDev) { +// const _search = window.location.search; +// let parsed = {}; +// if (_search) { +// parsed = queryString.parse(_search); +// } +// debugType = window.location.search.indexOf('debug=t') != -1 ? 'teacher' : +// window.location.search.indexOf('debug=s') != -1 ? 'student' : +// window.location.search.indexOf('debug=a') != -1 ? 'admin' : parsed.debug || 'admin' +// } window._debugType = debugType; export function initAxiosInterceptors(props) { @@ -41,7 +41,7 @@ export function initAxiosInterceptors(props) { // proxy = "http://testbdweb.trustie.net" // proxy = "http://testbdweb.educoder.net" // proxy = "https://testeduplus2.educoder.net" - proxy="http://47.96.87.25:48080" + proxy="http://47.96.87.25:48080/" // 在这里使用requestMap控制,避免用户通过双击等操作发出重复的请求; diff --git a/public/react/src/modules/tpm/TPMIndex.css b/public/react/src/modules/tpm/TPMIndex.css index 0e2720b01..2f6eccfd6 100644 --- a/public/react/src/modules/tpm/TPMIndex.css +++ b/public/react/src/modules/tpm/TPMIndex.css @@ -204,4 +204,8 @@ body>.-task-title { .mainheighs{ height: 100%; display: block; +} + +.ml18a{ + margin-left:18%; } \ No newline at end of file diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 5ab2dc0ad..29fa6f5dc 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -11,6 +11,7 @@ float: left; width: 97px;} .head-nav{ + float: left; text-align: center; height: 60px; box-sizing: border-box; From f8c2316569b4a2be642f5a666cbe4de56377ea44 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Jul 2019 16:41:09 +0800 Subject: [PATCH 022/117] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...n_for_users.rb => 20190729080935_modify_login_for_users.rb} | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename db/migrate/{20190729080934_modify_login_for_users.rb => 20190729080935_modify_login_for_users.rb} (50%) diff --git a/db/migrate/20190729080934_modify_login_for_users.rb b/db/migrate/20190729080935_modify_login_for_users.rb similarity index 50% rename from db/migrate/20190729080934_modify_login_for_users.rb rename to db/migrate/20190729080935_modify_login_for_users.rb index 96fb9f1d1..a4a7d3f51 100644 --- a/db/migrate/20190729080934_modify_login_for_users.rb +++ b/db/migrate/20190729080935_modify_login_for_users.rb @@ -2,7 +2,8 @@ class ModifyLoginForUsers < ActiveRecord::Migration[5.2] def change users = User.where("created_on > '2019-07-26 19:00:00'") users.find_each do |use| - use.update_column(:login, use.login.strip) + use.update_attributes(:login, use.login.strip, phone: user.phone.try(:strip)) + use.user_extension.update_column(:student_id,use.user_extension.student_id.try(:strip)) end end end From 5ac943821bc5b7a4cb8424e22b9587510d2b232b Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Jul 2019 16:43:54 +0800 Subject: [PATCH 023/117] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20190729080935_modify_login_for_users.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrate/20190729080935_modify_login_for_users.rb b/db/migrate/20190729080935_modify_login_for_users.rb index a4a7d3f51..e8beb49fe 100644 --- a/db/migrate/20190729080935_modify_login_for_users.rb +++ b/db/migrate/20190729080935_modify_login_for_users.rb @@ -2,7 +2,7 @@ class ModifyLoginForUsers < ActiveRecord::Migration[5.2] def change users = User.where("created_on > '2019-07-26 19:00:00'") users.find_each do |use| - use.update_attributes(:login, use.login.strip, phone: user.phone.try(:strip)) + use.update_attributes(:login, use.login.strip, phone: use.phone.try(:strip)) use.user_extension.update_column(:student_id,use.user_extension.student_id.try(:strip)) end end From db84d635b5c2183f2d0ddbc4dd8dc2cf7e14f4b3 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Jul 2019 16:46:13 +0800 Subject: [PATCH 024/117] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20190729080935_modify_login_for_users.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/migrate/20190729080935_modify_login_for_users.rb b/db/migrate/20190729080935_modify_login_for_users.rb index e8beb49fe..274e163de 100644 --- a/db/migrate/20190729080935_modify_login_for_users.rb +++ b/db/migrate/20190729080935_modify_login_for_users.rb @@ -2,8 +2,8 @@ class ModifyLoginForUsers < ActiveRecord::Migration[5.2] def change users = User.where("created_on > '2019-07-26 19:00:00'") users.find_each do |use| - use.update_attributes(:login, use.login.strip, phone: use.phone.try(:strip)) - use.user_extension.update_column(:student_id,use.user_extension.student_id.try(:strip)) + use.update_attributes(login: use.login.strip, phone: use.phone.try(:strip)) + use.user_extension.update_column(:student_id, use.user_extension.student_id.try(:strip)) end end end From d62aff64528ea821c4c8932cd619a37a3f17f055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 16:49:19 +0800 Subject: [PATCH 025/117] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/edu-all.css | 3 +- public/react/src/AppConfig.js | 20 ++-- public/react/src/modules/tpm/NewHeader.js | 104 ++++++++++---------- public/react/src/modules/tpm/TPMIndexHOC.js | 2 +- public/stylesheets/educoder/edu-all.css | 2 +- 5 files changed, 66 insertions(+), 65 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index 4eeb5497c..f58d44978 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -11,10 +11,11 @@ float: left; width: 97px;} .head-nav{ + float: left; text-align: center; height: 60px; box-sizing: border-box; - min-width: 1000px; + min-width: 1200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 4928b525f..2ad7df0d5 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -20,16 +20,16 @@ function locationurl(list){ // TODO 开发期多个身份切换 let debugType ="" -// if (isDev) { -// const _search = window.location.search; -// let parsed = {}; -// if (_search) { -// parsed = queryString.parse(_search); -// } -// debugType = window.location.search.indexOf('debug=t') != -1 ? 'teacher' : -// window.location.search.indexOf('debug=s') != -1 ? 'student' : -// window.location.search.indexOf('debug=a') != -1 ? 'admin' : parsed.debug || 'admin' -// } +if (isDev) { + const _search = window.location.search; + let parsed = {}; + if (_search) { + parsed = queryString.parse(_search); + } + debugType = window.location.search.indexOf('debug=t') != -1 ? 'teacher' : + window.location.search.indexOf('debug=s') != -1 ? 'student' : + window.location.search.indexOf('debug=a') != -1 ? 'admin' : parsed.debug || 'admin' +} window._debugType = debugType; export function initAxiosInterceptors(props) { diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 6b435b619..f4a90fd81 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -713,68 +713,68 @@ submittojoinclass=(value)=>{ >工程认证 - -
    -
    - {/**/} -
    - - 实训 - - -
    - {/**/} - {/*搜索框*/} - {showSearchOpentype===true?
    this.hideshowSearchOpen(e)} onMouseLeave={()=>this.setevaluatinghides()}> - this.onKeywordSearchKeyDowns()} - onSearch={(value) => this.onKeywordSearchKeyDown(value)} - // onPressEnter={this.onKeywordSearchKeyDown} - style={{ width: 300,height:32}} - autoFocus={true} - /> -
    :""} - - {/**/} - {/*/!**!/*/} - {/**/} - - {/**/} - {/* TODO 需要服务端接口提供最近搜索 + } + +
    +
    + {/**/} +
    + + 实训 + + +
    + {/**/} + {/*搜索框*/} + {showSearchOpentype===true?
    this.hideshowSearchOpen(e)} onMouseLeave={()=>this.setevaluatinghides()}> + this.onKeywordSearchKeyDowns()} + onSearch={(value) => this.onKeywordSearchKeyDown(value)} + // onPressEnter={this.onKeywordSearchKeyDown} + style={{ width: 300,height:32}} + autoFocus={true} + /> +
    :""} + + {/**/} + {/*/!**!/*/} + {/**/} + + {/**/} + {/* TODO 需要服务端接口提供最近搜索
    最近搜索
    */} -
    -
    - -
    +
    - {/* <%= link_to '登录', signin_path, :className => "mr5" %> diff --git a/public/react/src/modules/tpm/TPMIndexHOC.js b/public/react/src/modules/tpm/TPMIndexHOC.js index e092c17d4..0cf22376f 100644 --- a/public/react/src/modules/tpm/TPMIndexHOC.js +++ b/public/react/src/modules/tpm/TPMIndexHOC.js @@ -20,7 +20,7 @@ const versionNum = '0001'; // let _url_origin = getUrl() let _url_origin=''; if(window.location.port === "3007"){ - _url_origin="https://newweb.educoder.net"; + _url_origin="http://47.96.87.25:48080/"; } // let _url_origin=`https://www.educoder.net`; diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 29fa6f5dc..6c77ee1c5 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 1000px; + min-width: 1200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; From 3674e0509cb75265a80b11ca65a7e0b67261a498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Mon, 29 Jul 2019 16:50:01 +0800 Subject: [PATCH 026/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/login/LoginDialog.js | 121 +++++++++++++++--- .../modules/user/LoginRegisterComponent.js | 2 +- 2 files changed, 102 insertions(+), 21 deletions(-) diff --git a/public/react/src/modules/login/LoginDialog.js b/public/react/src/modules/login/LoginDialog.js index 2db1929b9..58cd9b7fb 100644 --- a/public/react/src/modules/login/LoginDialog.js +++ b/public/react/src/modules/login/LoginDialog.js @@ -102,6 +102,8 @@ class LoginDialog extends Component { authCodeclass:'log-botton mt5', isRender: false, MyEduCoderModals:false, + Phonenumberisnotco:undefined, + Phonenumberisnotcobool:false, }; } @@ -112,26 +114,103 @@ class LoginDialog extends Component { register=(num) =>{ this.setState({login:1,speedy:num,dialogBox:'dialogBox2'}); } - - loginChange = () =>{ - let reg = /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/; - let reg1 = /^1\d{10}$/; - let reg2=/^[a-zA-z]\w{3,14}$/; - // let reg3=/^[a-zA-Z0-9]+([.\-_\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/; - let value=this.refs.loginPassText.value; - let valuenum= value.length; - if(valuenum>0){ - if(!reg.test(value)&&!reg1.test(value)&&!reg2.test(value)){ - this.setState({regular:1}) - return - }else{ - this.setState({loginValue:value}) - this.setState({regular:0}) + inputOnBlur = (e, id) => { + this.Emailphonenumberverification(e.target.value, 1); + }; + // 输入页面 + loginChange = (e) =>{ + var stirngt=""; + if(e.target.value.length>0){ + var str= e.target.value.replace(/\s*/g,"") + stirngt=str; + }else{ + stirngt= e.target.value; + } + + if (e.target.value.length === 0) { + this.setState({ + loginValue: stirngt, + Phonenumberisnotco:undefined, + }) + }else{ + this.setState({ + loginValue: stirngt, + Phonenumberisnotco:undefined, + }) + } + // let reg = /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/; + // let reg1 = /^1\d{10}$/; + // let reg2=/^[a-zA-z]\w{3,14}$/; + // // let reg3=/^[a-zA-Z0-9]+([.\-_\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/; + // let value=this.refs.loginPassText.value; + // let valuenum= value.length; + // if(valuenum>0){ + // if(!reg.test(value)&&!reg1.test(value)&&!reg2.test(value)){ + // this.setState({regular:1}) + // return + // }else{ + // // this.setState({loginValue:value}); + // this.setState({regular:0}); + // var stirngt; + // if(value.length>0){ + // var str= value.replace(/\s*/g,"") + // stirngt=str; + // }else{ + // stirngt= value; + // } + // this.setState({ + // loginValue:stirngt, + // }); + // } + // }else{ + // this.setState({loginValue:value}); + // var stirngt; + // if(value.length>0){ + // var str= value.replace(/\s*/g,"") + // stirngt=str; + // }else{ + // stirngt= value; + // } + // this.setState({ + // loginValue:stirngt, + // }); + // } + }; + //邮箱手机号验证 + Emailphonenumberverification = (value, id) => { + var url = `/accounts/valid_email_and_phone.json`; + axios.get((url), { + params: { + login: value, + type: 1, + } + }).then((result) => { + if(result){ + if(result.data.status===-2){ + if(result.data.message==="该手机号码或邮箱已被注册"){ + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + }) + }else { + this.setState({ + Phonenumberisnotco: result.data.message, + Phonenumberisnotcobool: true, + }) + } + return; + }else { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + }) + return; } - }else{ - this.setState({loginValue:value}) } - } + }).catch((error) => { + + }) + }; passwordChange = () =>{ let value =this.refs.passwordText.value; @@ -411,7 +490,7 @@ class LoginDialog extends Component { window.location.href = url; }; render() { - let{open,login,speedy,loginValue,regular,isGoing,isGoingValue,disabled,bottonclass, + let{open,login,speedy,loginValue,regular,isGoing,isGoingValue,disabled,bottonclass,Phonenumberisnotco, dialogBox,shortcutnum,disabledType,gaincode,authCodeType,authCodeclass, isRender}=this.state; if (isRender === undefined) { @@ -457,11 +536,13 @@ class LoginDialog extends Component { id="name_loggin_input" ref="loginPassText" onInput={this.loginChange} + onBlur={(e) => this.inputOnBlur(e, 1)} + value={this.state.loginValue} name="username" placeholder="请输入有效的手机号/邮箱号" >

    请输入有效的手机号/邮箱号

    + style={{display: Phonenumberisnotco===undefined?'none':'block'}}>{Phonenumberisnotco}

    { }) - } + }; //短信验证 SMSverification = () => { var url = `/accounts/get_verification_code.json`; From e83ba51d931dfcf6a46939ce5ee52edacaf56082 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Jul 2019 16:54:19 +0800 Subject: [PATCH 027/117] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/searchable/dependents/user.rb | 2 +- db/migrate/20190729080935_modify_login_for_users.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/searchable/dependents/user.rb b/app/models/searchable/dependents/user.rb index f6dcaa430..bb55d0530 100644 --- a/app/models/searchable/dependents/user.rb +++ b/app/models/searchable/dependents/user.rb @@ -8,7 +8,7 @@ module Searchable::Dependents::User private def check_searchable_dependents - if firstname_previously_changed? || lastname_previously_changed? || user_extension.school_id_previously_changed? + if firstname_previously_changed? || lastname_previously_changed? || user_extension&.school_id_previously_changed? # reindex shixun created_shixuns.each(&:reindex) diff --git a/db/migrate/20190729080935_modify_login_for_users.rb b/db/migrate/20190729080935_modify_login_for_users.rb index 274e163de..335079a06 100644 --- a/db/migrate/20190729080935_modify_login_for_users.rb +++ b/db/migrate/20190729080935_modify_login_for_users.rb @@ -2,8 +2,8 @@ class ModifyLoginForUsers < ActiveRecord::Migration[5.2] def change users = User.where("created_on > '2019-07-26 19:00:00'") users.find_each do |use| - use.update_attributes(login: use.login.strip, phone: use.phone.try(:strip)) - use.user_extension.update_column(:student_id, use.user_extension.student_id.try(:strip)) + use.update_attributes(login: use.login&.strip, phone: use.phone&.strip) + use.user_extension.update_column(:student_id, use.user_extension&.student_id&.strip) end end end From b8f010217604c42148d589eae56804e0a59816f2 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Jul 2019 16:56:04 +0800 Subject: [PATCH 028/117] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20190729080935_modify_login_for_users.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrate/20190729080935_modify_login_for_users.rb b/db/migrate/20190729080935_modify_login_for_users.rb index 335079a06..60e5e0964 100644 --- a/db/migrate/20190729080935_modify_login_for_users.rb +++ b/db/migrate/20190729080935_modify_login_for_users.rb @@ -3,7 +3,7 @@ class ModifyLoginForUsers < ActiveRecord::Migration[5.2] users = User.where("created_on > '2019-07-26 19:00:00'") users.find_each do |use| use.update_attributes(login: use.login&.strip, phone: use.phone&.strip) - use.user_extension.update_column(:student_id, use.user_extension&.student_id&.strip) + use.user_extension.update_column(:student_id, use.user_extension&.student_id&.strip) if use.user_extension end end end From 35a25aaf8b0df84eca7d7e7abc0d384b23550ff0 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Mon, 29 Jul 2019 16:10:54 +0800 Subject: [PATCH 029/117] apply join project api --- app/controllers/projects/base_controller.rb | 5 ++ .../projects/project_applies_controller.rb | 14 ++++ app/jobs/apply_join_project_notify_job.rb | 31 +++++++ app/models/applied_project.rb | 9 ++ app/models/forge_activity.rb | 5 ++ app/models/member.rb | 6 +- app/models/member_role.rb | 1 + app/models/project.rb | 3 + app/models/role.rb | 3 + app/models/user.rb | 3 + app/models/user_grade.rb | 4 + app/services/projects/apply_join_service.rb | 82 +++++++++++++++++++ app/services/projects/join_service.rb | 35 ++++++++ config/routes.rb | 4 + 14 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 app/controllers/projects/base_controller.rb create mode 100644 app/controllers/projects/project_applies_controller.rb create mode 100644 app/jobs/apply_join_project_notify_job.rb create mode 100644 app/models/applied_project.rb create mode 100644 app/models/forge_activity.rb create mode 100644 app/models/role.rb create mode 100644 app/models/user_grade.rb create mode 100644 app/services/projects/apply_join_service.rb create mode 100644 app/services/projects/join_service.rb diff --git a/app/controllers/projects/base_controller.rb b/app/controllers/projects/base_controller.rb new file mode 100644 index 000000000..d874b4759 --- /dev/null +++ b/app/controllers/projects/base_controller.rb @@ -0,0 +1,5 @@ +class Projects::BaseController < ApplicationController + include PaginateHelper + + before_action :require_login, :check_auth +end diff --git a/app/controllers/projects/project_applies_controller.rb b/app/controllers/projects/project_applies_controller.rb new file mode 100644 index 000000000..37d9d615e --- /dev/null +++ b/app/controllers/projects/project_applies_controller.rb @@ -0,0 +1,14 @@ +class Projects::ProjectAppliesController < Projects::BaseController + def create + project = Projects::ApplyJoinService.call(current_user, create_params) + render_ok(project_id: project.id) + rescue Projects::ApplyJoinService::Error => ex + render_error(ex.message) + end + + private + + def create_params + params.permit(:code, :role) + end +end \ No newline at end of file diff --git a/app/jobs/apply_join_project_notify_job.rb b/app/jobs/apply_join_project_notify_job.rb new file mode 100644 index 000000000..fe46bf0e0 --- /dev/null +++ b/app/jobs/apply_join_project_notify_job.rb @@ -0,0 +1,31 @@ +# 申请成为 管理员、开发者 加入项目 消息通知 +class ApplyJoinProjectNotifyJob < ApplicationJob + queue_as :notify + + def perform(user_id, project_id, role) + user = User.find_by(id: user_id) + project = Project.find_by(id: project_id) + return if user.blank? || project.blank? + + attrs = %i[user_id trigger_user_id container_id container_type status + belong_container_id belong_container_type tiding_type extra created_at updated_at] + + same_attrs = { + trigger_user_id: user.id, status: 0, tiding_type: 'Apply', extra: role, + container_id: project.id, container_type: 'JoinProject', + belong_container_id: project.id, belong_container_type: 'Project' + } + + # 报告人员加入时消息为系统通知消息 + if role == 5 + same_attrs[:container_type] = 'ReporterJoinProject' + same_attrs[:tiding_type] = 'System' + end + + Tiding.bulk_insert(*attrs) do |worker| + project.manager_members.each do |manager| + worker.add(same_attrs.merge(user_id: manager.user_id)) + end + end + end +end diff --git a/app/models/applied_project.rb b/app/models/applied_project.rb new file mode 100644 index 000000000..901443e81 --- /dev/null +++ b/app/models/applied_project.rb @@ -0,0 +1,9 @@ +class AppliedProject < ApplicationRecord + belongs_to :user + belongs_to :project + + has_many :applied_messages, as: :applied, dependent: :destroy + has_many :forge_activities, as: :forge_act, dependent: :destroy + + scope :pending, -> { where(status: 0) } +end diff --git a/app/models/forge_activity.rb b/app/models/forge_activity.rb new file mode 100644 index 000000000..77103d0ff --- /dev/null +++ b/app/models/forge_activity.rb @@ -0,0 +1,5 @@ +class ForgeActivity < ApplicationRecord + belongs_to :user + belongs_to :project + belongs_to :forge_act, polymorphic: true +end \ No newline at end of file diff --git a/app/models/member.rb b/app/models/member.rb index d1feb8a37..70b7fe305 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -1,6 +1,8 @@ class Member < ApplicationRecord - has_many :member_roles, dependent: :destroy + belongs_to :user belongs_to :course, optional: true belongs_to :project, optional: true - belongs_to :user + + has_many :member_roles, dependent: :destroy + has_many :roles, through: :member_roles end diff --git a/app/models/member_role.rb b/app/models/member_role.rb index 900efc732..2461c52f1 100644 --- a/app/models/member_role.rb +++ b/app/models/member_role.rb @@ -1,3 +1,4 @@ class MemberRole < ApplicationRecord + belongs_to :role belongs_to :member end diff --git a/app/models/project.rb b/app/models/project.rb index ddc6f6e5f..c3c626cb0 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,9 +1,12 @@ class Project < ApplicationRecord belongs_to :owner, class_name: 'User', foreign_key: :user_id + has_many :members + has_many :manager_members, -> { joins(:roles).where(roles: { name: 'Manager' }) }, class_name: 'Member' has_one :project_score, dependent: :destroy has_many :issues + has_many :user_grades, dependent: :destroy # 创建者 def creator diff --git a/app/models/role.rb b/app/models/role.rb new file mode 100644 index 000000000..e60606ffa --- /dev/null +++ b/app/models/role.rb @@ -0,0 +1,3 @@ +class Role < ApplicationRecord + has_many :member_roles, dependent: :destroy +end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index a95776be9..14d7b2697 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -128,6 +128,9 @@ class User < ApplicationRecord has_many :bidding_users, dependent: :destroy has_many :bidden_project_packages, through: :bidding_users, source: :project_package + # 项目 + has_many :applied_projects, dependent: :destroy + # Groups and active users scope :active, lambda { where(status: STATUS_ACTIVE) } diff --git a/app/models/user_grade.rb b/app/models/user_grade.rb new file mode 100644 index 000000000..dffbb4743 --- /dev/null +++ b/app/models/user_grade.rb @@ -0,0 +1,4 @@ +class UserGrade < ApplicationRecord + belongs_to :project + belongs_to :user +end diff --git a/app/services/projects/apply_join_service.rb b/app/services/projects/apply_join_service.rb new file mode 100644 index 000000000..a177de930 --- /dev/null +++ b/app/services/projects/apply_join_service.rb @@ -0,0 +1,82 @@ +class Projects::ApplyJoinService < ApplicationService + Error = Class.new(StandardError) + + attr_reader :user, :params + + def initialize(user, params) + @user = user + @params = params + end + + def call + validate! + + # 项目报告人员直接加入项目 + if params[:role] == 'reporter' + Projects::JoinService.call(project, user, role: 'reporter') + return project + end + + ActiveRecord::Base.transaction do + apply = user.applied_projects.create!(project: project, role: role_value) + + apply.forge_activities.find_or_create_by!(user: user, project: project) + + notify_project_manager! + end + + # notify_project_owner + ApplyJoinProjectNotifyJob.perform_later(user.id, project.id, role_value) + + project + end + + private + + def project + @_project ||= Project.find_by(invite_code: params[:code].to_s.strip) + end + + def role_value + @_role ||= + case params[:role] + when 'manager' then 3 + when 'developer' then 4 + when 'reporter' then 5 + else raise Error, '角色无效' + end + end + + def notify_project_manager! + columns = %i[user_id applied_id applied_type status viewed applied_user_id role project_id created_at updated_at] + AppliedMessage.bulk_insert(*columns) do |worker| + base_attr = { status: false, viewed: false, applied_user_id: user.id, role: role_value, project_id: project.id } + + project.manager_members.each do |manager| + worker.add(base_attr.merge(user_id: manager.user_id)) + end + end + end + + def notify_project_owner + owner = project.user + return if owner.phone.blank? + + Educoder::Sms.send(mobile: owner.phone, send_type:'applied_project_info', + user_name: owner.show_name, name: project.name) + rescue Exception => ex + Rails.logger.error("发送短信失败 => #{ex.message}") + end + + def validate! + # params check + raise Error, '邀请码不能为空' if params[:code].blank? + raise Error, '角色不能为空' if params[:role].blank? + raise Error, '角色无效' unless %w(manager developer reporter).include?(params[:role]) + + # logical check + raise Error, '邀请码无效' if project.blank? + raise Error, '您已在该项目中' if project.member?(user) + raise Error, '您已经提交过申请' if user.applied_projects.pending.exists?(project: project) + end +end \ No newline at end of file diff --git a/app/services/projects/join_service.rb b/app/services/projects/join_service.rb new file mode 100644 index 000000000..b434e48cd --- /dev/null +++ b/app/services/projects/join_service.rb @@ -0,0 +1,35 @@ +class Projects::JoinService < ApplicationService + attr_reader :project, :user, :opts + + def initialize(project, user, **opts) + @project = project + @user = user + @opts = opts + end + + def call + ActiveRecord::Base.transaction do + member = project.members.create!(user: user) + + member.member_roles.create!(role_id: role_value) + + project.user_grades.find_or_create_by!(user: user) + end + + ApplyJoinProjectNotifyJob.perform_later(user, project, role_value) + + project + end + + private + + def role_value + @_role ||= + case opts[:role] + when 'manager' then 3 + when 'developer' then 4 + when 'reporter' then 5 + else raise ArgumentError + end + end +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 6024201a4..6623edd99 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -695,6 +695,10 @@ Rails.application.routes.draw do end resources :libraries, only: [:index, :show, :create, :update, :destroy] + + scope module: :projects do + resources :applied_projects, only: [:create] + end end #git 认证回调 From 42f43753ff4b4b3f27ee6ef9ae891d5234a1c7f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 17:12:29 +0800 Subject: [PATCH 030/117] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/edu-all.css | 2 +- public/stylesheets/educoder/edu-all.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index f58d44978..d220ba3a0 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 1200px; + min-width: 950px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 6c77ee1c5..61cfb4175 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 1200px; + min-width: 950px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; From 70ccb3bc349c32afff550e2fac64426348e20eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Mon, 29 Jul 2019 17:34:50 +0800 Subject: [PATCH 031/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/busyWork/CommonWorkDetailIndex.js | 2 +- .../courses/busyWork/CommonWorkList.js | 9 ++- .../modules/user/LoginRegisterComponent.js | 57 ------------------- 3 files changed, 8 insertions(+), 60 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index a300e73dc..f1b9faab7 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -384,7 +384,7 @@ class CommonWorkDetailIndex extends Component{ {/* 作品列表 */} () + (props) => () } > diff --git a/public/react/src/modules/courses/busyWork/CommonWorkList.js b/public/react/src/modules/courses/busyWork/CommonWorkList.js index f9deeebb4..8bc029cec 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkList.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkList.js @@ -400,8 +400,13 @@ class CommonWorkList extends Component{ componentDidMount() { this.fetchList() on('commonwork_fetch_all', this.fetchAllListener) - $("html").animate({ scrollTop: $('html').scrollTop() - 100 }) - this.props.triggerRef(this); + $("html").animate({ scrollTop: $('html').scrollTop() - 100 }); + try { + this.props.triggerRef(this); + }catch (e) { + + } + } componentWillUnmount() { off('commonwork_fetch_all', this.fetchAllListener) diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index 72614e566..99884e28e 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -678,63 +678,6 @@ class LoginRegisterComponent extends Component { } //失去焦点判断 inputOnBlur = (e, id) => { - // debugger - // // this.isCorrectname(e.target.value, id); - // // this.Emailphonenumberverification(e.target.value, id); - // if (e.target.value.length === 0) { - // this.setState({ - // Phonenumberisnotco: undefined, - // Phonenumberisnotcobool: false, - // }) - // return; - // } - // // var telephone = $("#telephoneAdd.tianjia_phone").val(); - // var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; - // // var email = $("#add_email.tianjia_email").val(); - // var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; - // - // // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 - // var stringdata = undefined; - // if (!regph.test(e.target.value)) { - // stringdata = "手机号格式不正确"; - // this.setState({ - // Phonenumberisnotco: stringdata, - // Phonenumberisnotcobool: true, - // dragOk:false, - // Whethertoverify:this.state.Whethertoverify===true?false:true, - // }) - // } else { - // console.log("706"); - // this.setState({ - // Phonenumberisnotco: undefined, - // Phonenumberisnotcobool: false, - // }) - // return - // } - // - // if (!regemail.test(e.target.value)) { - // if ((e.target.value.indexOf("@") != -1) === true) { - // stringdata = "邮箱格式不正确"; - // } else { - // stringdata = "手机号格式不正确"; - // - // } - // this.setState({ - // Phonenumberisnotco: stringdata, - // Phonenumberisnotcobool: true, - // dragOk:false, - // Whethertoverify:this.state.Whethertoverify===true?false:true, - // }) - // return - // } else { - // console.log("729"); - // this.setState({ - // Phonenumberisnotco: undefined, - // Phonenumberisnotcobool: false, - // }) - // this.Emailphonenumberverification(e.target.value, 1); - // return - // } this.Emailphonenumberverification(e.target.value, 1); } inputOnBlurzhuche = (e, id) => { From 38be938c5ecf12eefa31b6d79275a990ec58b62d Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 29 Jul 2019 17:38:24 +0800 Subject: [PATCH 032/117] 100 --- public/react/src/modules/courses/exercise/Exercisetablesmubu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/exercise/Exercisetablesmubu.js b/public/react/src/modules/courses/exercise/Exercisetablesmubu.js index 60c29ffbc..92cfa30b7 100644 --- a/public/react/src/modules/courses/exercise/Exercisetablesmubu.js +++ b/public/react/src/modules/courses/exercise/Exercisetablesmubu.js @@ -52,7 +52,7 @@ class Exercisetablesmubus extends Component { dataIndex: 'commit_percent', key: 'commit_percent', render: (text, record, index) => { - const _content = + const _content = {text.value!="有效填写量"&&text.value!="wrong" && } From 383f7963180235378b9562c167dc92928a3855f3 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Jul 2019 18:07:42 +0800 Subject: [PATCH 033/117] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0729095722_delete_error_myshixun_from_myshxiuns.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 db/migrate/20190729095722_delete_error_myshixun_from_myshxiuns.rb diff --git a/db/migrate/20190729095722_delete_error_myshixun_from_myshxiuns.rb b/db/migrate/20190729095722_delete_error_myshixun_from_myshxiuns.rb new file mode 100644 index 000000000..ef5b86975 --- /dev/null +++ b/db/migrate/20190729095722_delete_error_myshixun_from_myshxiuns.rb @@ -0,0 +1,11 @@ +class DeleteErrorMyshixunFromMyshxiuns < ActiveRecord::Migration[5.2] + def change + myshixuns = Myshixun.where("created_at > '2019-07-26 00:00:00' and repo_name is null") + myshixuns.find_each do |myshixun| + if myshixun.games.blank? + puts("###########user_login: #{User.find(myshixun.user_id).login}") + myshixun.destroy! + end + end + end +end From 7a6327739004c2fd8cd18e87408a816120e0767a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 18:21:10 +0800 Subject: [PATCH 034/117] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/edu-all.css | 6 +++--- public/react/src/modules/tpm/NewHeader.js | 2 +- public/stylesheets/educoder/edu-all.css | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index d220ba3a0..dc54176b9 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -1,9 +1,9 @@ /*--------------------------首页*/ /*头部导航条样式---2018-03-19--by-cs*/ .newHeader{ - overflow:hidden; - text-overflow:ellipsis; - white-space:nowrap; + /*overflow:hidden;*/ + /*text-overflow:ellipsis;*/ + /*white-space:nowrap;*/ background: #24292D !important; width:100%; height: 60px !important; min-width: 1200px;position: fixed;top: 0px;left: 0px;z-index:1000;-moz-box-shadow: 0px 0px 12px rgba(0,0,0,0.1); /* 老的 Firefox */box-shadow: 0px 0px 12px rgba(0,0,0,0.1); } .newHeader .logoimg{ diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index f4a90fd81..705ba5324 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -856,7 +856,7 @@ submittojoinclass=(value)=>{ {/* /courses/join_course_multi_role */} {/*
  • */} - {/* 加入项目*/} + 加入项目 {/*
  • */} Date: Mon, 29 Jul 2019 18:27:28 +0800 Subject: [PATCH 035/117] b --- public/react/public/css/edu-all.css | 2 +- public/react/src/modules/tpm/NewHeader.js | 6 +++--- public/stylesheets/educoder/edu-all.css | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index dc54176b9..ee2af14c8 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 950px; + min-width: 850px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 705ba5324..890aa4990 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -649,7 +649,7 @@ submittojoinclass=(value)=>{ {...this.state} {...this.props} />:""} - + 高校智能化教学与实训平台 @@ -781,7 +781,7 @@ submittojoinclass=(value)=>{ <%= link_to '注册', user_join_path, :className => "ml5" %>
    */} { user===undefined? - + this.educoderlogin()} className="mr5 color-white">登录 注册 @@ -790,7 +790,7 @@ submittojoinclass=(value)=>{ 注册 : -
    +
    diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 2a6e45d68..15fc0bd32 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 950px; + min-width: 850px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; From eaae076ab026350da3f05818ebce4061bb87cbba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 18:47:53 +0800 Subject: [PATCH 036/117] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/edu-all.css | 2 +- public/react/src/modules/tpm/NewHeader.js | 12 +++++++++++- public/stylesheets/educoder/edu-all.css | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index ee2af14c8..718ef291c 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 850px; + min-width: 800px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 890aa4990..b2a5ff2e1 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -653,8 +653,18 @@ submittojoinclass=(value)=>{ 高校智能化教学与实训平台 + +
    {/*<%= link_to image_tag("/images/educoder/logo.png", alt:"高校智能化教学与实训平台", className:"logoimg"), home_path %>*/}
    diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 15fc0bd32..ff4665d22 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 850px; + min-width: 800px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; From 17b615a665873b20ea8f91bedcdce4b38fabc91f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 18:59:28 +0800 Subject: [PATCH 037/117] b --- public/react/src/modules/tpm/NewHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index b2a5ff2e1..66e765135 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -735,7 +735,7 @@ submittojoinclass=(value)=>{ position: absolute; top: -2px; background: #fff; - z-index: 2; + z-index:10000; right: 185px; } ` From 45eb74b149cbb094f1394288b4167bdd50e195eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 19:01:16 +0800 Subject: [PATCH 038/117] b --- public/react/src/modules/tpm/NewHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 66e765135..209e4648a 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -795,7 +795,7 @@ submittojoinclass=(value)=>{ this.educoderlogin()} className="mr5 color-white">登录 注册 - :user.login===""? + :user.login===""? this.educoderlogin()} className="mr5 color-white">登录 注册 From 587dd3da9e15184a73c35e2b04f68a4c7a54a600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 19:34:08 +0800 Subject: [PATCH 039/117] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/NewHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index b2a5ff2e1..7e82ec5d1 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -649,7 +649,7 @@ submittojoinclass=(value)=>{ {...this.state} {...this.props} />:""} - + 高校智能化教学与实训平台 From 622b4160d98e4848602ee3be6ecd78655447bc48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 19:46:09 +0800 Subject: [PATCH 040/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/edu-all.css | 2 +- public/react/src/modules/tpm/NewHeader.js | 2 +- public/stylesheets/educoder/edu-all.css | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index 718ef291c..7de3c8152 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 800px; + min-width: 793px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 13313b5d4..3d1136371 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -791,7 +791,7 @@ submittojoinclass=(value)=>{ <%= link_to '注册', user_join_path, :className => "ml5" %> */} { user===undefined? - + this.educoderlogin()} className="mr5 color-white">登录 注册 diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index ff4665d22..730e9bab0 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 800px; + min-width: 793px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; From ef8f7bfc4ebc60c3f92a02852191ed6e76feca8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 29 Jul 2019 19:54:19 +0800 Subject: [PATCH 041/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/edu-all.css | 2 +- public/stylesheets/educoder/edu-all.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index 7de3c8152..8b7c727a9 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 793px; + min-width: 785px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 730e9bab0..4fdd8c400 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -15,7 +15,7 @@ text-align: center; height: 60px; box-sizing: border-box; - min-width: 793px; + min-width: 785px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; From 640adcedef3cbda9329454c415ca4ad98bd0a9ee Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Jul 2019 20:26:24 +0800 Subject: [PATCH 042/117] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20190729122213_delete_myshixun_games_for_users.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 db/migrate/20190729122213_delete_myshixun_games_for_users.rb diff --git a/db/migrate/20190729122213_delete_myshixun_games_for_users.rb b/db/migrate/20190729122213_delete_myshixun_games_for_users.rb new file mode 100644 index 000000000..9c93372e9 --- /dev/null +++ b/db/migrate/20190729122213_delete_myshixun_games_for_users.rb @@ -0,0 +1,11 @@ +class DeleteMyshixunGamesForUsers < ActiveRecord::Migration[5.2] + def change + myshixuns = Myshixun.where("created_at > '2019-07-26 19:00:00' and repo_name is null") + myshixuns.find_each do |m| + if m.games.count == m.games.select{|g| g.status == 3}.count + puts("#######login: #{User.find(m.user_id).login}") + myshixuns.destroy! + end + end + end +end From a38b598fa3c556641263c8ed52e92295bbc578da Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 29 Jul 2019 20:27:48 +0800 Subject: [PATCH 043/117] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20190729122213_delete_myshixun_games_for_users.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrate/20190729122213_delete_myshixun_games_for_users.rb b/db/migrate/20190729122213_delete_myshixun_games_for_users.rb index 9c93372e9..d52369828 100644 --- a/db/migrate/20190729122213_delete_myshixun_games_for_users.rb +++ b/db/migrate/20190729122213_delete_myshixun_games_for_users.rb @@ -4,7 +4,7 @@ class DeleteMyshixunGamesForUsers < ActiveRecord::Migration[5.2] myshixuns.find_each do |m| if m.games.count == m.games.select{|g| g.status == 3}.count puts("#######login: #{User.find(m.user_id).login}") - myshixuns.destroy! + m.destroy! end end end From e734ecf78962f9cc214f025366fa5a11988fa23f Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Jul 2019 09:14:39 +0800 Subject: [PATCH 044/117] fix tiding api --- app/controllers/tidings_controller.rb | 2 +- app/decorators/tiding_decorator.rb | 18 +++++++++++------- app/models/journal.rb | 3 +++ app/models/tiding.rb | 12 ++++++++++++ app/views/tidings/_tiding.json.jbuilder | 2 +- 5 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 app/models/journal.rb diff --git a/app/controllers/tidings_controller.rb b/app/controllers/tidings_controller.rb index 795010b3f..036de8868 100644 --- a/app/controllers/tidings_controller.rb +++ b/app/controllers/tidings_controller.rb @@ -20,7 +20,7 @@ class TidingsController < ApplicationController tidings = tidings.where(container_type: 'ProjectPackage') if params[:type] == 'project_package' @count = tidings.count - @tidings = paginate(tidings.order(created_at: :desc), per_page: 10) + @tidings = paginate(tidings.order(created_at: :desc), per_page: 100) @onclick_time = current_user.click_time end diff --git a/app/decorators/tiding_decorator.rb b/app/decorators/tiding_decorator.rb index 8d383dadf..c9ad806ee 100644 --- a/app/decorators/tiding_decorator.rb +++ b/app/decorators/tiding_decorator.rb @@ -98,7 +98,7 @@ module TidingDecorator end def apply_add_schools_content - name = container.name + name = ApplyAddSchool.find_by(id: container_id)&.name if tiding_type == 'Apply' I18n.t(locale_format(tiding_type)) % name elsif status == 2 @@ -201,7 +201,7 @@ module TidingDecorator when 'Issue' then I18n.t(locale_format(parent_container_type)) % parent_container.subject when 'Journal' then - message = object.notes.present? ? ':' + message_content_helper(parent_container.notes) : '' + message = parent_container&.notes.present? ? ':' + message_content_helper(parent_container.notes) : '' I18n.t(locale_format(parent_container_type)) % message end end @@ -331,13 +331,17 @@ module TidingDecorator end def challenge_work_score_content + I18n.t(locale_format) % container&.comment + end + + def student_works_scores_appeal_content work = StudentWork.find_by(id: parent_container_id) - return if work.blank? + name = work&.homework_common&.name if parent_container_type == 'StudentWork' - I18n.t(locale_format(parent_container_type, tiding_type)) % work.homework_common.try(:name) - elsif parent_container_type == 'UserAppealResult' || parent_container_type == 'AppealResult' - I18n.t(locale_format(parent_container_type, status)) % work.homework_common.try(:name) + I18n.t(locale_format(parent_container_type, tiding_type)) % name + else + I18n.t(locale_format(parent_container_type, status)) % name end end @@ -349,7 +353,7 @@ module TidingDecorator if tiding_type == 'System' I18n.t(locale_format(tiding_type, status), reason: extra) % container.try(:title) else - I18n.t(locale_format) % container.try(:title) + I18n.t(locale_format(tiding_type)) % container.try(:title) end end diff --git a/app/models/journal.rb b/app/models/journal.rb new file mode 100644 index 000000000..d1a80af5f --- /dev/null +++ b/app/models/journal.rb @@ -0,0 +1,3 @@ +class Journal < ApplicationRecord + belongs_to :user +end \ No newline at end of file diff --git a/app/models/tiding.rb b/app/models/tiding.rb index 66b1f85be..3ef625c57 100644 --- a/app/models/tiding.rb +++ b/app/models/tiding.rb @@ -6,4 +6,16 @@ class Tiding < ApplicationRecord belongs_to :belong_container, polymorphic: true, optional: true has_many :attachments, as: :container + + def identifier + value = nil + if Object.const_defined?(container_type) + value = container.try(:identifier) + end + + if value.blank? && belong_container_type && Object.const_defined?(belong_container_type) + value = belong_container.try(:identifier) + end + value + end end \ No newline at end of file diff --git a/app/views/tidings/_tiding.json.jbuilder b/app/views/tidings/_tiding.json.jbuilder index d26d37b7b..34b06320d 100644 --- a/app/views/tidings/_tiding.json.jbuilder +++ b/app/views/tidings/_tiding.json.jbuilder @@ -1,6 +1,6 @@ json.extract! tiding, :id, :status, :viewed, :user_id, :tiding_type, :container_id, :container_type, :parent_container_id, :parent_container_type json.content tiding.content -json.identifier tiding.try(:container).try(:identifier) rescue nil +json.identifier tiding.identifier json.time tiding.how_long_time json.new_tiding tiding.unread?(@onclick_time) From aed8cc0e3e55c26b5f52624103927ef0c80b0581 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Jul 2019 09:18:08 +0800 Subject: [PATCH 045/117] modify tiding api per page --- app/controllers/tidings_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/tidings_controller.rb b/app/controllers/tidings_controller.rb index 036de8868..795010b3f 100644 --- a/app/controllers/tidings_controller.rb +++ b/app/controllers/tidings_controller.rb @@ -20,7 +20,7 @@ class TidingsController < ApplicationController tidings = tidings.where(container_type: 'ProjectPackage') if params[:type] == 'project_package' @count = tidings.count - @tidings = paginate(tidings.order(created_at: :desc), per_page: 100) + @tidings = paginate(tidings.order(created_at: :desc), per_page: 10) @onclick_time = current_user.click_time end From 3f34af4ed03aac60dfa126a18b5aee385e014877 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Jul 2019 09:24:20 +0800 Subject: [PATCH 046/117] fix tiding bug --- app/models/journal.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/journal.rb b/app/models/journal.rb index d1a80af5f..25c1e2498 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -1,3 +1,4 @@ class Journal < ApplicationRecord belongs_to :user + belongs_to :issue, foreign_key: :journalized_id end \ No newline at end of file From 12734728a86760126b650b23181e6c9d60d8d41e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 09:34:00 +0800 Subject: [PATCH 047/117] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/public/index.html b/public/react/public/index.html index 318268610..801189edb 100755 --- a/public/react/public/index.html +++ b/public/react/public/index.html @@ -87,7 +87,7 @@ -
    +
    From 29e9f37a38f9692482c6543791132fd0afc19a7f Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Jul 2019 09:52:47 +0800 Subject: [PATCH 048/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/homework_commons_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index 29f270a34..5cccb3ee7 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -212,7 +212,7 @@ class HomeworkCommonsController < ApplicationController format.xlsx{ student_work_to_xlsx(@work_excel,@homework) exercise_export_name = "#{current_user.real_name}_#{@course.name}_#{@homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{exercise_export_name.strip.first(30)}",template: "homework_commons/works_list.xlsx.axlsx",locals: + render xlsx: "#{exercise_export_name.strip}",template: "homework_commons/works_list.xlsx.axlsx",locals: {table_columns: @work_head_cells,task_users: @work_cells_column} } end From 5afe063a85ef966b3cc84b940afabfffc4938aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 10:15:33 +0800 Subject: [PATCH 049/117] =?UTF-8?q?=E4=BC=97=E5=8C=85=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/educoder/project_packagesHead.jpg | Bin 0 -> 58861 bytes public/react/src/App.js | 9 + .../src/modules/projectPackages/MDEditors.js | 337 +++++++ .../PackageIndex/PackageBanner.js | 25 + .../PackageIndex/PackageConcent.js | 298 ++++++ .../PackageIndex/PackageIndex.js | 30 + .../NEITaskDetailsModel.js | 41 + .../PackageIndexNEITaskDetails.js | 485 +++++++++ .../img/gouxuan.png | Bin 0 -> 305 bytes .../img/weigouxuan.png | Bin 0 -> 281 bytes .../PackageIndexNEITaskDetails/newsone.png | Bin 0 -> 341 bytes .../PackageIndexNEITaskDetails/newstwo.png | Bin 0 -> 288 bytes .../PackageIndexNEITaskDetails/pds.css | 60 ++ .../PackageIndexNEIBanner.js | 41 + .../PackageIndexNEIBannerConcent.js | 932 ++++++++++++++++++ .../PackageIndexNEISubmit.js | 49 + .../PackageIndexNewandEditIndex.js | 61 ++ .../PackageIndexNewandEdit/PhoneModel.js | 140 +++ .../projectPackages/ProjectPackageIndex.js | 76 ++ .../projectPackages/packageconcnet.css | 338 +++++++ public/react/src/modules/tpm/NewHeader.js | 5 +- public/stylesheets/educoder/edu-all.css | 4 +- 22 files changed, 2929 insertions(+), 2 deletions(-) create mode 100644 public/images/educoder/project_packagesHead.jpg create mode 100644 public/react/src/modules/projectPackages/MDEditors.js create mode 100644 public/react/src/modules/projectPackages/PackageIndex/PackageBanner.js create mode 100644 public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js create mode 100644 public/react/src/modules/projectPackages/PackageIndex/PackageIndex.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/NEITaskDetailsModel.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/img/gouxuan.png create mode 100644 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/img/weigouxuan.png create mode 100755 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newsone.png create mode 100755 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newstwo.png create mode 100644 public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/pds.css create mode 100644 public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBanner.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js create mode 100644 public/react/src/modules/projectPackages/PackageIndexNewandEdit/PhoneModel.js create mode 100644 public/react/src/modules/projectPackages/ProjectPackageIndex.js create mode 100644 public/react/src/modules/projectPackages/packageconcnet.css diff --git a/public/images/educoder/project_packagesHead.jpg b/public/images/educoder/project_packagesHead.jpg new file mode 100644 index 0000000000000000000000000000000000000000..181045e03a3e1ca9a2e24e3034669186cbdff87d GIT binary patch literal 58861 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 import('./modules/projectPackages/ProjectPackageIndex'), + loading: Loading, +}) + class App extends Component { constructor(props) { super(props) @@ -296,6 +302,9 @@ class App extends Component { {/**/} + + {/*众包创新*/} + {/*认证*/} diff --git a/public/react/src/modules/projectPackages/MDEditors.js b/public/react/src/modules/projectPackages/MDEditors.js new file mode 100644 index 000000000..b6fee5582 --- /dev/null +++ b/public/react/src/modules/projectPackages/MDEditors.js @@ -0,0 +1,337 @@ +import React, {Component} from 'react'; + +import {Input, Select, Radio, Checkbox, Popconfirm, message, Modal} from 'antd'; + +import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom"; + +import { getImageUrl, toPath, getUrl } from 'educoder'; + +require('codemirror/lib/codemirror.css'); + +let origin = getUrl(); +let path = getUrl("/editormd/lib/") + + +const $ = window.$; + +let timeout; + +let currentValue; + +const Option = Select.Option; + +const RadioGroup = Radio.Group; + + + +// 保存数据 +function md_add_data(k,mdu,d){ + window.sessionStorage.setItem(k+mdu,d); +} + +// 清空保存的数据 +function md_clear_data(k,mdu,id){ + window.sessionStorage.removeItem(k+mdu); + var id1 = "#e_tip_"+id; + var id2 = "#e_tips_"+id; + if(k == 'content'){ + $(id2).html(" "); + }else{ + $(id1).html(" "); + } +} +window.md_clear_data = md_clear_data +// editor 存在了jquery对象上,应用不需要自己写md_rec_data方法了 +function md_rec_data(k, mdu, id) { + if (window.sessionStorage.getItem(k + mdu) !== null) { + var editor = $("#e_tips_" + id).data('editor'); + editor.setValue(window.sessionStorage.getItem(k + mdu)); + // debugger; + // /shixuns/b5hjq9zm/challenges/3977/tab=3 setValue可能导致editor样式问题 + md_clear_data(k, mdu, id); + } +} +window.md_rec_data = md_rec_data; + +function md_elocalStorage(editor,mdu,id){ + if (window.sessionStorage){ + var oc = window.sessionStorage.getItem('content'+mdu); + if(oc !== null ){ + console.log("#e_tips_"+id) + $("#e_tips_"+id).data('editor', editor); + var h = '您上次有已保存的数据,是否恢复 ? / 不恢复'; + $("#e_tips_"+id).html(h); + } + setInterval(function() { + var d = new Date(); + var h = d.getHours(); + var m = d.getMinutes(); + var s = d.getSeconds(); + h = h < 10 ? '0' + h : h; + m = m < 10 ? '0' + m : m; + s = s < 10 ? '0' + s : s; + if(editor.getValue().trim() != ""){ + md_add_data("content",mdu,editor.getValue()); + var id1 = "#e_tip_"+id; + var id2 = "#e_tips_"+id; + + var textStart = " 数据已于 " + var text = textStart + h + ':' + m + ':' + s +" 保存 "; + // 占位符 + var oldHtml = $(id2).html(); + if (oldHtml && oldHtml != ' ' && oldHtml.startsWith(textStart) == false) { + $(id2).html( oldHtml.split(' (')[0] + ` (${text})`); + } else { + $(id2).html(text); + } + // $(id2).html(""); + } + },10000); + + }else{ + $("#e_tip_"+id).after('您的浏览器不支持localStorage.无法开启自动保存草稿服务,请升级浏览器!'); + } +} + + +function create_editorMD(id, width, high, placeholder, imageUrl, callback, initValue, + onchange, watch, { noStorage, showNullButton }, that) { + // 还是出现了setting只有一份,被共用的问题 + + var editorName = window.editormd(id, { + width: width, + height: high===undefined?400:high, + path: path, // "/editormd/lib/" + markdown : initValue, + + dialogLockScreen: false, + watch:watch===undefined?true:watch, + syncScrolling: "single", + tex: true, + tocm: true, + emoji: true, + taskList: true, + codeFold: true, + searchReplace: true, + htmlDecode: "style,script,iframe", + sequenceDiagram: true, + autoFocus: false, + + // mine + + toolbarIcons: function (mdEditor) { + // + // let react_id = `react_${id}`; + // const __that = window[react_id] + + // Or return editormd.toolbarModes[name]; // full, simple, mini + // Using "||" set icons align right. + const icons = ["bold", "italic", "|", "list-ul", "list-ol", "|", "code", "code-block", "|", "testIcon", "testIcon1", '|', "image", "table", '|', "watch", "clear"]; + // if (__that.props.showNullButton) { + // icons.push('nullBtton') + // } + return icons + + + }, + toolbarCustomIcons: { + testIcon: "
    ", + testIcon1: "
    ", + nullBtton: "
    点击插入填空项
    ", + }, + //这个配置在simple.html中并没有,但是为了能够提交表单,使用这个配置可以让构造出来的HTML代码直接在第二个隐藏的textarea域中,方便post提交表单。 + saveHTMLToTextarea: true, + // 用于增加自定义工具栏的功能,可以直接插入HTML标签,不使用默认的元素创建图标 + dialogMaskOpacity: 0.6, + placeholder: placeholder, + imageUpload: true, + imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"], + imageUploadURL: imageUrl,//url + onchange: onchange, + onload: function() { + let _id = this.id // 如果要使用this,这里不能使用箭头函数 + let _editorName = this; + let react_id = `react_${_editorName.id}`; + const __that = window[react_id] + + // this.previewing(); + // let _id = id; + $("#" + _id + " [type=\"latex\"]").bind("click", function () { + _editorName.cm.replaceSelection("```latex"); + _editorName.cm.replaceSelection("\n"); + _editorName.cm.replaceSelection("\n"); + _editorName.cm.replaceSelection("```"); + var __Cursor = _editorName.cm.getDoc().getCursor(); + _editorName.cm.setCursor(__Cursor.line - 1, 0); + }); + + $("#" + _id + " [type=\"inline\"]").bind("click", function () { + _editorName.cm.replaceSelection("$$$$"); + var __Cursor = _editorName.cm.getDoc().getCursor(); + _editorName.cm.setCursor(__Cursor.line, __Cursor.ch - 2); + _editorName.cm.focus(); + }); + $("[type=\"inline\"]").attr("title", "行内公式"); + $("[type=\"latex\"]").attr("title", "多行公式"); + + if (__that.props.showNullButton) { + const NULL_CH = '▁' + // const NULL_CH = '〇' + // const NULL_CH = '🈳' + + $("#" + _id + " [type=\"nullBtton\"]").bind("click", function () { + _editorName.cm.replaceSelection(NULL_CH); + // var __Cursor = _editorName.cm.getDoc().getCursor(); + // _editorName.cm.setCursor(__Cursor.line - 1, 0); + }); + } + + if (noStorage == true) { + + } else { + md_elocalStorage(_editorName, `MDEditor__${_id}`, _id); + } + + callback && callback(_editorName) + } + }); + return editorName; +} + + +export default class MDEditors extends Component { + constructor(props) { + super(props) + this.state = { + initValue: '' + } + } + componentDidUpdate(prevProps, prevState) { + // 不能加,影响了试卷填空题 + // if (this.props.initValue != prevProps.initValue) { + // this.answers_editormd.setValue(this.props.initValue) + // } + } + + // react_mdEditor_ + componentDidMount = () => { + const { mdID, initValue, placeholder, showNullButton} = this.props; + + let _id = `mdEditor_${mdID}` + this.contentChanged = false; + const _placeholder = placeholder || ""; + // amp; + // 编辑时要传memoId + const imageUrl = `/upload_with_markdown?container_id=&container_type=Memo`; + // 创建editorMd + let react_id = `react_${_id}`; + + window[react_id] = this + const answers_editormd = create_editorMD(_id, '100%', this.props.height, _placeholder, imageUrl, (__editorName) => { + react_id = `react_${__editorName.id}`; + const that = window[react_id] + + setTimeout(() => { + console.log('timeout', __editorName.id) + __editorName.resize() + __editorName.cm && __editorName.cm.refresh() + }, that.props.refreshTimeout || 500) + if (that.props.initValue != undefined && that.props.initValue != '') { + __editorName.setValue(that.props.initValue) + } + if (that.state.initValue) { + __editorName.setValue(that.state.initValue) + } + __editorName.cm.on("change", (_cm, changeObj) => { + that.contentChanged = true; + if (that.state.showError) { + that.setState({showError: false}) + } + that.onEditorChange() + }) + that.props.onCMBlur && __editorName.cm.on('blur', () => { + that.props.onCMBlur() + }) + that.props.onCMBeforeChange && __editorName.cm.on('beforeChange', (cm,change) => { + that.props.onCMBeforeChange(cm,change) + }) + that.answers_editormd = __editorName; + window[_id] = __editorName; + }, initValue, this.onEditorChange,this.props.watch, { + noStorage: this.props.noStorage, + showNullButton: this.props.showNullButton + }, this); + + } + showError = () => { + this.setState({showError: true}) + } + onEditorChange = () => { + this.props.setcheckoutcontent() + if (!this.answers_editormd) return; + const val = this.answers_editormd.getValue(); + try { + this.props.onChange && this.props.onChange(val) + } catch(e) { + // http://localhost:3007/courses/1309/common_homeworks/6566/setting + // 从这个页面,跳转到编辑页面,再在编辑页面点击返回的时候,这里会报错 + console.error('出错') + console.error(e) + } + } + resize = () => { + if (!this.answers_editormd) { // 还未初始化 + return; + } + this.answers_editormd.resize() + this.answers_editormd.cm && this.answers_editormd.cm.refresh() + this.answers_editormd.cm.focus() + } + + getValue = () => { + try { + return this.answers_editormd.getValue() + } catch (e) { + return '' + } + } + setValue = (val) => { + try { + this.answers_editormd.setValue(val) + } catch (e) { + // TODO 这里多实例的时候,前一个实例的state会被后面这个覆盖 参考NewWork.js http://localhost:3007/courses/1309/homework/9300/edit/1 + // 未初始化 + this.setState({ initValue: val }) + } + } + + render() { + + let { + showError + } = this.state; + let { mdID, className, noStorage } = this.props; + let _style = {} + if (showError) { + _style.border = '1px solid red' + } + return ( + +
    + {/* padding10-20 */} +
    + +
    +
    +
    +
    +
    + {noStorage == true ? ' ' :

     

    } + {/* {noStorage == true ? ' ' :

     

    } */} +
    +
    + ) + } +} + + diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageBanner.js b/public/react/src/modules/projectPackages/PackageIndex/PackageBanner.js new file mode 100644 index 000000000..bc5aee524 --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageBanner.js @@ -0,0 +1,25 @@ +import React, {Component} from 'react'; +import {Link} from "react-router-dom"; + +class PackageBanner extends Component { + constructor(props) { + super(props) + this.state = { + + } + } + componentDidMount() { + + + } + + + render() { + return ( +
    + ) + } +} + +export default PackageBanner; + diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js new file mode 100644 index 000000000..46e36f90f --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js @@ -0,0 +1,298 @@ +import React, {Component} from 'react'; +import {Link} from "react-router-dom"; +import axios from 'axios'; +import { Input ,Icon,Button,Pagination} from 'antd'; +import moment from 'moment'; +import '../packageconcnet.css'; + +const { Search } = Input; +// let categorylist=[ +// {name:"全部",value:undefined}, +// {name:"前端开发",value:"front"}, +// {name:"后端开发",value:"backend"}, +// {name:"移动开发",value:"mobile"}, +// {name:"数据库",value:"database"}, +// {name:"云计算和大数据",value:"cloud_compute_and_big_data"}, +// {name:"人工智能",value:"ai"}, +// {name:"其他",value:"other"}, +// ] +// +// function setcategorylist(val){ +// let vals="" +// categorylist.some((item,key)=> { +// if (item.value === val) { +// vals=item.name +// return true +// } +// } +// ) +// +// return vals +// } + + + +class PackageConcent extends Component { + constructor(props) { + super(props) + this.state = { + data:undefined, + project_packages:undefined, + category:undefined, + keyword:undefined, + sort_by:"recently", + sort_direction:"desc", + page:1, + per_page:20, + categories:[] + } + } + //desc’, ‘desc’, ‘asc’ + //否 string 排序,默认最新, ‘recently’, ‘price’ + // 否 string 类型, front,backend,mobile,database, cloud_compute_and_big_data,devops_and_test,ai,other + componentDidMount() { + window.document.title = '众包创新' + let {category,keyword,sort_by,sort_direction,page}=this.state + this.setdatas(category,keyword,sort_by,sort_direction,page) + + let Url = `/project_package_categories.json`; + axios.get(Url).then((response) => { + // console.log(response) + this.setState({ + categories:response.data.categories + }) + }).catch((error) => { + console.log(error) + }) + + } + + setdatas=(category,keyword,sort_by,sort_direction,page)=>{ + + let Url = `/project_packages.json`; + axios.get(Url,{params:{ + category_id:category, + keyword:keyword, + sort_by:sort_by, + sort_direction:sort_direction, + page:page, + per_page:20, + }} + ).then((response) => { + this.setState({ + data:response.data, + project_packages:response.data.project_packages + }) + }).catch((error) => { + console.log(error) + }) + } + + setdatafuns=(value)=>{ + let {category,keyword,sort_by,sort_direction,page}=this.state + this.setState({ + keyword:value + }) + this.setdatas(category,value,sort_by,sort_direction,page) + } + + + setcategory=(value)=>{ + let {category,keyword,sort_by,sort_direction,page}=this.state + this.setState({ + category:value + }) + this.setdatas(value,keyword,sort_by,sort_direction,page) + } + + setsort_byfun=(value)=>{ + let {category,keyword,sort_by,sort_direction,page}=this.state + + this.setState({ + sort_by:value + }) + let sort_directionvalue; + if(value===sort_by){ + if(sort_direction==="desc"){ + this.setState({ + sort_direction:"asc" + }) + sort_directionvalue="asc"; + }else{ + this.setState({ + sort_direction:"desc" + }) + sort_directionvalue="desc"; + } + }else{ + this.setState({ + sort_direction:"desc" + }) + sort_directionvalue="desc"; + } + + this.setdatas(category,keyword,value,sort_directionvalue,page) + } + render() { + let {data,page,category,sort_by,sort_direction,project_packages}=this.state; + + return ( +
    + +
    +
    +
    +
    +
    + + + {/*concent*/} +
    +
    +

    +

    + 搜索} + onSearch={ (value)=>this.setdatafuns(value)} /> + +

    +

    +
    +
    + +
    +

    +

    + 类型: +

    +
  • this.setcategory(undefined)}>全部
  • + {this.state.categories.map((item,key)=>{ + return( +
  • this.setcategory(item.id)}>{item.name}
  • + ) + })} + +
    +

    + +

    + 排序: +

    +
  • this.setsort_byfun("recently")}> + 最新 + + + + +
  • + +
  • this.setsort_byfun("price")}> + 价格 + + + + +
  • +
    +

    +

    +
    + + + {project_packages&&project_packages.map((item,key)=>{ + return( +
    + +
    + +
    + +
    + +
    + +
    + + + +
    + +
    + {item.min_price===null?"":¥{item.min_price}} + {item.max_price===null||item.min_price===null?"":~} + {item.max_price===null?"":¥{item.max_price}} + {item.min_price===null&&item.max_price===null?可议价:""} +
    + +
    + +
    +
    {item.category_name}
    +
    + +
    +
    + + {item.visit_count}人浏览 +
    +
    + + + {moment(item.deadline_at).endOf('day').fromNow()}竞标截止 + +
    +
    + + + {item.bidding_users_count}人竞标 + +
    +
    +
    + {item.published_at===null?更新于:{moment(item.updated_at).format("YYYY-MM-DD HH:mm")} : + 发布于:{moment(item.published_at).format("YYYY-MM-DD HH:mm")} } +
    +
    + +
    + +
    +
    + ) + })} + {project_packages&&project_packages.length===0?
    +
    + +

    暂无数据哦~

    +
    :""} + +
    + +
    + + +
    +
    +
    +
    +
    +
    + ) + } +} + +export default PackageConcent; + diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageIndex.js b/public/react/src/modules/projectPackages/PackageIndex/PackageIndex.js new file mode 100644 index 000000000..e6c7cdc98 --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageIndex.js @@ -0,0 +1,30 @@ +import React, { Component } from 'react'; +import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; + +//业务组件 +import PackageBanner from "./PackageBanner"; +import PackageConcent from "./PackageConcent"; + +class PackageIndex extends Component{ + constructor(props) { + super(props) + } + + componentDidMount(){ + window.document.title = '众包创新' + } + + render() { + return ( +
    +
    + {/*头部banner*/} + + {/*内容banner*/} + +
    +
    + ) + } +} +export default PackageIndex; \ No newline at end of file diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/NEITaskDetailsModel.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/NEITaskDetailsModel.js new file mode 100644 index 000000000..16e22dae0 --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/NEITaskDetailsModel.js @@ -0,0 +1,41 @@ +import React, { Component } from 'react'; +import { Spin, Icon , Modal,Input,Button} from 'antd'; +class NEITaskDetailsModel extends Component { + + constructor(props) { + super(props); + this.state = { + + } + } + + render() { + + return( + +
    +

    +

    {this.props.applyvalue}
    +
    {this.props.applybottom}
    +

    +
    + 取消 + 确定 +
    + +
    +
    + ) + } +} + +export default NEITaskDetailsModel; \ No newline at end of file diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js new file mode 100644 index 000000000..4f06a0cba --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -0,0 +1,485 @@ +import React, {Component} from 'react'; +import {Link} from "react-router-dom"; +import axios from 'axios'; +import { Input ,Icon,Button,Pagination,DatePicker,Breadcrumb} from 'antd'; +import { handleDateString,markdownToHTML,bytesToSize} from 'educoder'; +import NEITaskDetailsModel from './NEITaskDetailsModel'; +import moment from 'moment'; +import '../packageconcnet.css'; +import './pds.css' +import gouxuan from './img/gouxuan.png' +import weigouxuan from './img/weigouxuan.png' +const { Search } = Input; +// let categorylist=[ +// {name:"全部",value:undefined}, +// {name:"前端开发",value:"front"}, +// {name:"后端开发",value:"backend"}, +// {name:"移动开发",value:"mobile"}, +// {name:"数据库",value:"database"}, +// {name:"云计算和大数据",value:"cloud_compute_and_big_data"}, +// {name:"人工智能",value:"ai"}, +// {name:"其他",value:"other"}, +// ] +// +// function setcategorylist(val){ +// let vals="" +// categorylist.some((item,key)=> { +// if (item.value === val) { +// vals=item.name +// return true +// } +// } +// ) +// +// return vals +// } + +class PackageIndexNEITaskDetails extends Component { + constructor(props) { + super(props) + this.contentMdRef = React.createRef(); + this.state = { + data:undefined, + modalCancel: false, + overtype:false, + setbiddingmantype:false, + datalist:[] + } + } + + componentDidMount() { + this.getdatas() + window.document.title = '众包创新' + } + + getdatas=()=>{ + let url =`/project_packages/${this.props.match.params.id}.json`; + axios.get(url).then((response) => { + this.setState({ + data:response.data + }) + }).catch((error) => { + console.log(error); + + }) + } + + setbiddingman=()=>{ + this.setState({ + setbiddingmantype:true + }) + } + + notsetbiddingman=()=>{ + let {data} =this.state; + let gouxuans2=data.bidding_users + for (var i=0;i{ + this.setState({ + modalCancel:false + }) + } + + setbiddingusers=()=>{ + let{datalist}=this.state; + if(datalist.length>0){ + this.setState({ + applytype:true, + applyvalue:`选择的${datalist.length}个竞标者将被设定为“中标”`, + applybottom:"是否确认执行?", + applycancel:this.setApplycancel, + applyconfirm:this.setApplysumbit + }) + } + + } + + setApplysumbit=()=>{ + this.setState({ + applytype:false, + }) + let{datalist}=this.state; + let newlist=[]; + datalist.map((item,key)=>{ + newlist.push(item.id) + }) + + + let url=`/project_packages/${this.props.match.params.id}/bidding_users/win.json`; + axios.post(url,{ + user_ids:newlist + }).then((response) => { + if(response.data.status===0){ + this.props.showSnackbar("提交成功"); + this.setState({ + setbiddingmantype:false + }) + this.getdatas() + }else if(response.data.status===-1){ + this.props.showSnackbar(response.data.message); + } + }).catch((error) => { + console.log(error) + }) + + } + + + + Clickteacher2=(e)=>{ + let {data} =this.state; + let newlist=[] + let gouxuans2=data.bidding_users + for (var i=0;i{ + this.setState({ + overtype:true + }) + } + + setout=()=>{ + this.setState({ + overtype:false + }) + } + + deletePackages=()=>{ + this.setState({ + applytype:true, + applyvalue:"是否确认删除?", + applycancel:this.setApplycancel, + applyconfirm:this.setApplydelect + }) + } + + setApplydelect=()=>{ + this.setState({ + applytype:false, + }) + let url=`/project_packages/${this.props.match.params.id}.json`; + axios.delete(url ).then((response) => { + // const status = response.data.status + // console.log(response) + this.props.showSnackbar('删除成功'); + }).catch((error) => { + console.log(error) + }) + } + + setBiddingApply=()=>{ + this.setState({ + applytype:true, + applyvalue:"是否确认报名?", + applycancel:this.setApplycancel, + applyconfirm:this.setApplyconfirm + }) + } + + setApplycancel=()=>{ + this.setState({ + applytype:false, + }) + } + + setApplyconfirm=()=>{ + this.setState({ + applytype:false, + }) + let url=`/project_packages/${this.props.match.params.id}/bidding_users.json`; + axios.post(url).then((response) => { + if(response.data.status===0){ + this.props.showSnackbar("报名成功"); + this.getdatas() + }else if(response.data.status===-1){ + this.props.showSnackbar(response.data.message); + } + }).catch((error) => { + console.log(error) + }) + + } + goback = () => { + window.history.go(-1) + } + + render() { + let {overtype,data}=this.state; + // console.log(data&&data.creator.login) + // console.log(this.props.current_user.login) + return ( +
    +
    + +
    + + '} className={"fl"}> + {/*{this.props.current_user.username}*/} + + 众包创新 + + {data&&data.title} + + + 返回 +
    + +

    + +

    +
    + +
    + {data&&data.status==="pending"?
    +
    + + 未申请 +
    :data&&data.status==="applying"?
    +
    + + 待发布 +
    :""} + +
    +
    +
    + + + +
    + {data&&data.creator.name} +
    + + {data&&data.creator.login===this.props.current_user.login?"":
    + {overtype===false? 头像联系TA: + 头像联系TA} +
    } +
    + + +
    + +
    + +
    + +
    + {data&&data.title} + +
    + +
    + {data&&data.min_price===null?"":{data&&data.min_price}} + {data&&data.max_price===null||data&&data.min_price===null?"":~} + {data&&data.max_price===null?"":{data&&data.max_price}} + {data&&data.min_price===null&&data&&data.max_price===null?可议价:""} +
    + +
    + +
    +
    {data&&data.category_name}
    +
    + +
    +
    + {data&&data.published_at===null? + 更新时间:{moment(data&&data.updated_at).format("YYYY-MM-DD HH:mm")} + : + 发布时间:{moment(data&&data.published_at).format("YYYY-MM-DD HH:mm")} + } +
    +
    + 竞标截止时间:{moment(data&&data.deadline_at).format("YYYY-MM-DD HH:mm")} +
    +
    + +
    + +
    +
    + +
    +
    + + {/*详情*/} +
    +
    +
    + 需求详情: + + {data&&data.status==="pending"&&data&&data.operation.can_select_bidding_user===true?
    + 编辑 + 删除 +
    :""} + +
    +
    +
    +
    + +
    + + {data&&data.attachments.length>0?
    +
    + 需求文件: +
    + {data&&data.attachments.map((item,key)=>{ + return( + + )})} +
    :""} +
    + + + + {/*发布者和竞选者状态show*/} + {this.state.setbiddingmantype===false&&data&&data.published_at!=null?
    + {/*下面是头像*/} +
    +
    +
    + 报名列表({data&&data.bidding_users.length}) +
    +
    + {data&&data.operation.can_bidding===true?:""} + {data&&data.operation.can_select_bidding_user===true?:""} +
    +
    +
    + +
    +
    +
    +
    + + {data&&data.bidding_users.map((item,key)=>{ + return( +
    + {item.status==="bidding_won"?:""} + +

    {item.name}

    + {this.props.current_user.login!=item.login? + 头像联系TA + :""} +
    + ) + })} + + {data&&data.bidding_users.length===0?
    +
    + +

    暂无人员竞标~

    +
    :""} + + +
    +
    +
    +
    :""} + + + {this.state.setbiddingmantype===true?
    + {/*发布人选择状态*/} + {/*下面是头像*/} +
    +
    +
    + 报名列表({data&&data.bidding_users.length}) +
    + +
    +
    + 已选 ({this.state.datalist.length}) +
    + 取消 + +
    +
    +
    +
    +
    +
    +
    + {data&&data.bidding_users.map((item,key)=>{ + return( +
    + ) + })} + + {data&&data.bidding_users.length===0?
    +
    + +

    暂无人员竞标~

    +
    :""} + +
    +
    +
    +
    :""} + +

    + +
    + + +
    +
    +
    + ) + } +} + +export default PackageIndexNEITaskDetails; + + + diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/img/gouxuan.png b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/img/gouxuan.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc53f0071f75c4dd701659b26d2ba98ecd1e35d GIT binary patch literal 305 zcmV-10nYx3P)sgC}i_l(fkVMb~e> z{PX(e5fc6=VGrL0b6&M!lF`;lE%-9oS<9I`^OUe~a$F*mbUtM2W zZOtFSo)Z2IWT1aEk0V=T_kPNc5?;Z*t+g2Cy;?T~8Y+Q)0s?mds)u_Tg(-mo=cX`) zYm3ZOqH&lK2;d-aZb|eC3|_ApPOjR+0F^@v!y_x$nPB>(I<`}sYK zG@dDKk_u)%pxCv@d%iKl+~S!XXBc19N;CE{%5-L|wv-K+YU(@L@N*8!3U1xgMr&5R z5@I!6X6A1uRg0kxZ-?X_SfO9l|QTQ z&vK5vzI1Du@r=WV6}~Zu9hA dzQO;D?9!xlqSLQ05Ci&^!PC{xWt~$(69CLvZsY&} literal 0 HcmV?d00001 diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newsone.png b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newsone.png new file mode 100755 index 0000000000000000000000000000000000000000..9aadd57c233cc86548948dd242ea0551816d7bc1 GIT binary patch literal 341 zcmV-b0jmCqP)Z2Ve_W5Uj_@vtYQdn>&XphN}b#OZG1SY-)(he?ztnO~JlI)e#NEj>Wm( zs01R92;=14lSJgAA)0|HV#+2#3WBrOh;k}m6Ikqx46vLyiNuLv?N5uXEhz*mMqYr_ z03ni5!(lC>`M8gfJI3Br;$3`Lp7^(}L!tGerz nv>Q^lY2Bw;KAu+Vr>DLH5AT6C@^UT000000NkvXXu0mjf1bLIw literal 0 HcmV?d00001 diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newstwo.png b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/newstwo.png new file mode 100755 index 0000000000000000000000000000000000000000..8ac58b2c47ae8debb584b81251fe488a748c6fac GIT binary patch literal 288 zcmV+*0pI?KP)Y~4b<^`+W^>M* z&iv=$94uHI12a8xQ$U7#7?A-o# zipL*Fjsd8W3q1TAWEZzM#5u08hdY$~O>`RNJ(bjC3UY*#22#e~H2F4`20=!#r<7b{ zt)?@!u@TY9%qYkQYRN{8vxr!zqJkV?wF_akfj^;^s~xXpaztEyL%Oxk%&o@Un$CPg mJol5?3sN24upAL}_Kh#k3SewPv+2_S0000{ + debugger + console.log('onChange:', current); + this.setState({ current }); + }; + + render() { + const { current } = this.state; + return ( +
    +

    + + + + + +

    +
    + ) + } +} + +export default PackageIndexNEIBanner; + diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js new file mode 100644 index 000000000..e7e4b20a2 --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -0,0 +1,932 @@ +import React, {Component} from 'react'; +import {Link} from "react-router-dom"; +import axios from 'axios'; +import { Input , Spin, Icon ,Button,Pagination,DatePicker} from 'antd'; +import { handleDateString,getUrl,bytesToSize} from 'educoder'; +import locale from 'antd/lib/date-picker/locale/zh_CN'; +import MDEditors from '../MDEditors'; +import PhoneModel from './PhoneModel'; +import moment from 'moment'; +import '../packageconcnet.css'; +const { Search } = Input; +const $ = window.$; +let origin = getUrl(); + +// load +if (!window.postUpMsg) { + $.getScript( + `${origin}/javascripts/attachments.js`, + (data, textStatus, jqxhr) => { + + }); +} + + +function checkPhone(phone){ + + if(!(/^1[3456789]\d{9}$/.test(phone))){ + // alert("手机号码有误,请重填"); + return false; + } +} + +function range(start, end) { + const result = []; + for (let i = start; i < end; i++) { + result.push(i); + } + return result; +} + +function disabledDateTime() { + return { + disabledMinutes: () => range(1, 30).concat(range(31, 60)), + }; +} +class PackageIndexNEIBannerConcent extends Component { + constructor(props) { + super(props) + this.contentMdRef = React.createRef(); + this.state = { + modalCancel:false, + getverificationcodes:true, + seconds:35, + springtype:false, + category:undefined, + title:undefined, + content:undefined, + attachment_ids:undefined, + deadline_at:undefined, + min_price:undefined, + max_price:undefined, + contact_name:undefined, + contact_phone:undefined, + code:undefined, + publish:false, + categories:[] + } + } + componentDidUpdate = (prevProps) => { + if(prevProps.current_user.username!=this.props.current_user.username){ + this.setState({ + contact_name:this.props.current_user.username + }) + } + } + + componentDidMount() { + window.document.title = '众包创新' + if(this.props.match.params.id!=undefined){ + + let url=`/project_packages/${this.props.match.params.id}.json` + axios.get((url)).then((response) => { + console.log(response) + let data=response.data + this.setState({ + category:data.category_id, + title:data.title, + content:data.content, + deadline_at:moment(data.deadline_at), + min_price:data.min_price, + max_price:data.max_price, + contact_name:data.contact_name==null||data.contact_name==undefined?this.props.current_user.username:data.contact_name, + phones:data.contact_phone, + attachments:data.attachments, + + }) + }).catch((error) => { + console.log(error); + + }) + }else{ + this.setState({ + contact_name:this.props.current_user.username + }) + } + + let Url = `/project_package_categories.json`; + axios.get(Url).then((response) => { + // console.log(response) + if(response.data.status===-1){ + + }else{ + this.setState({ + categories:response.data.categories + }) + } + + }).catch((error) => { + console.log(error) + }) + + // this.contentMdRef.current.setValue("测试赋值") + } + //获取验证码; + getverificationcode =()=>{ + // if (this.state.logins&&this.state.logins.length === 0) { + // // 判断没有输入手机号 + // return + // } + if(this.state.getverificationcodes === undefined){ + console.log("undefined"); + return; + } + if (this.state.getverificationcodes === true) { + this.setState({ + getverificationcodes: undefined, + }) + let timer = setInterval(() => { + this.setState((preState) => ({ + seconds: preState.seconds - 1, + }), () => { + if (this.state.seconds == 0) { + clearInterval(timer); + this.setState({ + getverificationcodes: false, + seconds: 35, + }) + } + }); + }, 1000) + //其他的网络请求也可以 + this.SMSverification(); + } else { + this.setState({ + getverificationcodes: undefined, + }) + let timer = setInterval(() => { + this.setState((preState) => ({ + seconds: preState.seconds - 1, + }), () => { + if (this.state.seconds == 0) { + clearInterval(timer); + this.setState({ + getverificationcodes: false, + seconds: 35, + + }) + } + }); + }, 1000) + //其他的网络请求也可以 + this.SMSverification(); + } + } + //短信验证 + SMSverification = () => { + let {contact_phone,code}=this.state; + var url = `/account/get_verification_code.json`; + axios.get((url), { + params: { + value: contact_phone, + type: 9, + } + }).then((result) => { + //验证有问题{"status":1,"message":"success"} + // console.log(result); + this.openNotification("验证码已发送,请注意查收!",2); + + + }).catch((error) => { + console.log(error); + + }) + } + + + onChangeTimePicker = (value, dateString) => { + if(value===null){ + this.setState({ + deadline_at:"" + }) + }else{ + if(moment(handleDateString(dateString))===undefined||moment(handleDateString(dateString))===null||moment(handleDateString(dateString))===""){ + this.setState({ + deadline_attypes:true + }) + }else{ + this.setState({ + deadline_attypes:false + }) + } + if(moment(handleDateString(dateString)){ + const content = this.contentMdRef.current.getValue().trim(); + if(content===undefined||content===null||content===""){ + this.setState({ + contenttypes:true + }) + }else{ + this.setState({ + contenttypes:false + }) + } + } + + + setcheckout=(min_price,max_price)=>{ + // if(min_price===undefined){ + // this.setState({ + // min_pricetype:true + // }) + // }else{ + // this.setState({ + // min_pricetype:false + // }) + // } + + + // if(parseInt(min_price)===undefined||parseInt(min_price)===null||parseInt(min_price)===""){ + // + // this.setState({ + // min_pricetype:true + // }) + // }else{ + // this.setState({ + // min_pricetype:false + // }) + // } + + // if(parseInt(max_price)===undefined||parseInt(max_price)===null||parseInt(max_price)===""){ + // + // this.setState({ + // min_pricetype:true + // }) + // + // }else{ + // this.setState({ + // min_pricetype:false + // }) + // } + + if(parseInt(min_price)<=0){ + this.setState({ + smallstype:true + }) + }else{ + this.setState({ + smallstype:false + }) + } + + if(parseInt(max_price){ + const content = this.contentMdRef.current.getValue().trim(); + // console.log(content) + // console.log(this.state.deadline_at._i) + this.setState({ + publish:type + }) + let types=type; + let {category,title,attachment_ids,deadline_at,min_price,max_price,contact_name,contact_phone,code,modalCancel}=this.state; + + if(category===undefined||category===null||category===""){ + this.setState({ + categorytypes:true + }) + this.scrollToAnchor("publishtimestart"); + return + } + + if(title===undefined||title===null||title===""){ + this.setState({ + titletypes:true + }) + this.scrollToAnchor("publishtimestart"); + return + } + + if(content===undefined||content===null||content===""){ + this.setState({ + contenttypes:true + }) + this.scrollToAnchor("publishtimestart"); + return + } + + if(deadline_at===undefined||deadline_at===null||deadline_at===""){ + this.setState({ + deadline_attypes:true + }) + this.scrollToAnchor("publishtime"); + return + } + + + if(moment(deadline_at) { + if(response.data.status===0){ + if(type===true){ + this.props.setPublicationfun(response.data.id) + }else{ + window.location.href="/crowdsourcing/"+response.data.id + } + this.setState({ + springtype:false + }) + }else if(response.data.status===-1){ + if(response.data.message==="无效的验证码"){ + this.setState({ + codeypesno:true, + springtype:false + }) + } + } + this.setState({ + springtype:false + }) + }).catch((error) => { + console.log(error) + this.setState({ + springtype:false + }) + }) + + + }else{ + + // edit + + const url = `/project_packages/${this.props.match.params.id}.json`; + + axios.put(url, { + category_id: category, + title: title, + content: content, + attachment_ids: attachment_ids, + deadline_at:deadline_at._i, + min_price:parseInt(min_price), + max_price:parseInt(max_price), + contact_name: contact_name===null||contact_name===undefined?this.props.current_user.username:contact_name, + contact_phone: contact_phone===undefined?this.props.current_user.phone:contact_phone, + code:code, + publish:types + } + ).then((response) => { + if(response.data.status===0){ + if(type===true){ + this.props.setPublicationfun(response.data.id) + }else{ + window.location.href="/crowdsourcing/"+response.data.id + } + this.setState({ + springtype:false + }) + }else if(response.data.status===-1){ + if(response.data.message==="无效的验证码"){ + this.setState({ + codeypesno:true, + springtype:false + }) + } + } + this.setState({ + springtype:false + }) + }).catch((error) => { + console.log(error) + this.setState({ + springtype:false + }) + }) + + + } + + + + } + + modalCancel=()=>{ + this.setState({ + modalCancel:false, + contact_phone:undefined, + code:undefined, + }) + } + + editmodels=()=>{ + this.setState({ + modalCancel:true + }) + } + + + setcategory=(value)=>{ + if(value===undefined||value===null||value===""){ + this.setState({ + categorytypes:true + }) + }else{ + this.setState({ + categorytypes:false + }) + } + this.setState({ + category:value + }) + } + + settitlefun=(e)=>{ + + if(e.target.value===undefined||e.target.value===null||e.target.value===""){ + this.setState({ + titletypes:true + }) + }else{ + this.setState({ + titletypes:false + }) + } + + this.setState({ + title:e.target.value + }) + } + + + onChangemin_prices=(e)=>{ + let{max_price}=this.state; + this.setState({ + min_price:e.target.value + }) + this.setcheckout(e.target.value,max_price) + + + } + onChangemax_prices=(e)=>{ + let{min_price}=this.state; + this.setState({ + max_price:e.target.value + }) + this.setcheckout(min_price,e.target.value) + + } + + onChangeContact_name=(e)=>{ + + if(e.target.value===undefined||e.target.value===""||e.target.value===null){ + this.setState({ + contact_nametype:true + }) + }else{ + this.setState({ + contact_nametype:false + }) + } + + + this.setState({ + contact_name:e.target.value + }) + } + + onChangeContact_phone=(e)=>{ + let {modalCancel}=this.state; + // if(modalCancel===false){ + // if(this.props.current_user.phone===undefined||this.props.current_user.phone===null||this.props.current_user.phone===""){ + // this.setState({ + // current_userphonetype:true + // }) + // }else{ + // this.setState({ + // current_userphonetype:false + // }) + // } + // } + if(modalCancel===true||this.props.current_user.phone===null){ + if(e.target.value===undefined||e.target.value===null||e.target.value===""){ + this.setState({ + contact_phonetype:true + }) + }else{ + this.setState({ + contact_phonetype:false + }) + } + + if(checkPhone(e.target.value)===false){ + this.setState({ + contact_phonetypes:true + }) + }else{ + this.setState({ + contact_phonetypes:false + }) + } + } + + + this.setState({ + contact_phone:e.target.value + }) + } + + onChangeCode=(e)=>{ + if(e.target.value===undefined||e.target.value===""||e.target.value===null){ + this.setState({ + codeypes:true + }) + }else{ + this.setState({ + codeypes:false + }) + } + this.setState({ + code:e.target.value + }) + } + + //跳转道描点的地方 + scrollToAnchor = (anchorName) => { + if (anchorName) { + // 找到锚点 + let anchorElement = document.getElementById(anchorName); + // 如果对应id的锚点存在,就跳转到锚点 + if(anchorElement) { anchorElement.scrollIntoView(); } + } + } + + render() { + let {modalCancel,seconds,getverificationcodes,attachments, + category,title}=this.state; + let categorylist=[ + {name:"前端开发",value:"front"}, + {name:"后端开发",value:"backend"}, + {name:"移动开发",value:"mobile"}, + {name:"数据库",value:"database"}, + {name:"云计算和大数据",value:"cloud_compute_and_big_data"}, + {name:"人工智能",value:"ai"}, + {name:"其他",value:"other"}, + ] + + + return ( + +
    + {/**/} + +

    + +

    +
    +
    + +
    + +

    +

    + {this.state.categories.map((item,key)=>{ + return( +
  • this.setcategory(item.id)}>{item.name}
  • + ) + })} +
    +

    + {this.state.categorytypes===true?
    请选择类型
    :""} + +
    + +
    + + + {this.state.titletypes===true?
    不能为空
    :""} + this.setcheckoutcontent()}> + {/* 请求status 422 */} + {this.state.contenttypes===true?
    不能为空
    :""} + {/*
    */} + {/* window.$('#_file').click()}*/} + {/*data-tip-down="请选择文件上传">*/} + {/*/!**!/*/} + {/*上传附件*/} + {/**/} + {/*(最多可添加 5 个图片/文件,每个大小不超过 10MB)*/} + {/*
    */} + {/*{attachments&&attachments.map((item,key)=>{*/} + {/*return(*/} + {/**/} + {/*)})}*/} + {/*
    */} + {/**/} + {/**/} + {/**/} + {/* {*/} + {/*debugger;*/} + {/*console.log(window.$('.file_selector')[0])*/} + {/*window.addInputFiles(window.$('.file_selector')[0])*/} + {/*}}*/} + {/*style={{'display': 'none'}}*/} + {/*type="file">*/} + {/**/} + {/**/} + {/*
    */} + + +
    +
    + +
    +
    +
    + +
    +

    + 竞标截止: + + + {this.state.deadline_attypes===true?

    不能为空
    :""} + + {this.state.deadline_attypexy===true?
    不能早于当前时间
    :""} +

    +

    + 支付费用: + this.onChangemin_prices(e)} + suffix={ + ¥ + } + /> + + this.onChangemax_prices(e)} + suffix={ + ¥ + } + />不填,则表示可议价 + {this.state.min_pricetype===true?

    不能为空
    :""} + {this.state.smallstype===true?
    不能小于零
    :""} + {this.state.minmaxtype===true?
    最高费用不能小于最低费用
    :""} +

    +
    + +
    +

    + 姓名: + this.onChangeContact_name(e)} + /> + {this.state.contact_nametype===true?

    不能为空
    :""} +

    + + {modalCancel===false&&this.props.current_user.phone!=null?

    + 手机号: + + + this.editmodels()}> + +

    :""} + {/*{this.state.current_userphonetype===true?
    不能为空
    :""}*/} + {modalCancel===true||this.props.current_user.phone===null?

    + + + {/*未注册才显示!*/} + + 手机号: + this.onChangeContact_phone(e)} + /> + {this.state.contact_phonetype===true?

    不能为空
    :""} + {this.state.contact_phonetypes===true?
    请输入正确的手机号
    :""} + + + + + 重新发送 ({seconds}s): getverificationcodes === true ?获取验证码 :重新发送} + onSearch={()=>this.getverificationcode()} + onInput={(e)=>this.onChangeCode(e)} + /> + {this.state.codeypes===true?
    验证码不能为空
    :""} + {this.state.codeypesno===true?
    验证码不正确
    :""} +
    + + {/**/} + + + + this.modalCancel()}>X + +

    :""} + + +
    +
    +

    + +
    + + this.setPublication(false)}>保存 +
    +
    +
    + + ) + } +} + +export default PackageIndexNEIBannerConcent; + +// attachments:[ +// { +// id: 206525, +// title: "412420b57ed8c141963d4c548bde551f", +// filesize: 18523, +// description: null, +// url: "/api/attachments/206525" +// } +// ] + diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js new file mode 100644 index 000000000..9f287e90e --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js @@ -0,0 +1,49 @@ +import React, {Component} from 'react'; +import {Link} from "react-router-dom"; +import { Icon ,Button} from 'antd'; + +class PackageIndexNEISubmit extends Component { + constructor(props) { + super(props) + this.state = { + current:0 + } + } + componentDidMount() { + window.document.title = '众包创新' + } + setageload=(sum)=>{ + if(sum===undefined){ + window.location.href="/crowdsourcing/new" + }else{ + // this.props.history.push("/project_packages/"+sum) + window.location.href="/crowdsourcing/"+sum + } + + } + render() { + + return ( + + ) + } +} + +export default PackageIndexNEISubmit; + diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js new file mode 100644 index 000000000..1571fd77a --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js @@ -0,0 +1,61 @@ +import React, { Component } from 'react'; +import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; + +//业务组件 +import PackageIndexNEIBanner from "./PackageIndexNEIBanner"; + +import PackageIndexNEIBannerConcent from "./PackageIndexNEIBannerConcent" + +import PackageIndexNEISubmit from './PackageIndexNEISubmit' +import '../packageconcnet.css'; +class PackageIndexNewandEditIndex extends Component{ + constructor(props) { + super(props) + this.state = { + setPublication:false, + id:undefined + } + } + + componentDidMount(){ + window.document.title = '众包创新' + } + + setPublicationfun=(ids)=>{ + this.setState({ + setPublication:true, + id:ids + }) + } + render() { + let {setPublication}=this.state; + return ( +
    +
    + {setPublication===false?
    + +

    + + {this.props.match.params.id!=undefined?"编辑":"新建"} +

    + + + + + +
    : +
    + +
    } +
    +
    + ) + } +} +export default PackageIndexNewandEditIndex; \ No newline at end of file diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PhoneModel.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PhoneModel.js new file mode 100644 index 000000000..99d63e7c2 --- /dev/null +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PhoneModel.js @@ -0,0 +1,140 @@ +import React, { Component } from 'react'; +import { Spin, Icon , Modal,Input,Button} from 'antd'; +class PhoneModel extends Component { + //getverificationcodes 是否是重新发送或者是获取验证码 + //多少秒 + constructor(props) { + super(props); + this.state = { + funmodalsType:false, + istype:false, + getverificationcodes:true, + seconds:35, + } + } + //获取验证码 + getverificationcode =()=>{ + // if (this.state.logins&&this.state.logins.length === 0) { + // 判断没有输入手机号 + // return + // } + + if (this.state.getverificationcodes === true) { + this.setState({ + getverificationcodes: undefined, + }) + let timer = setInterval(() => { + this.setState((preState) => ({ + seconds: preState.seconds - 1, + }), () => { + if (this.state.seconds == 0) { + clearInterval(timer); + this.setState({ + getverificationcodes: false, + seconds: 35, + }) + } + }); + }, 1000) + //其他的网络请求也可以 + this.SMSverification(); + } else { + this.setState({ + getverificationcodes: undefined, + }) + let timer = setInterval(() => { + this.setState((preState) => ({ + seconds: preState.seconds - 1, + }), () => { + if (this.state.seconds == 0) { + clearInterval(timer); + this.setState({ + getverificationcodes: false, + seconds: 35, + + }) + } + }); + }, 1000) + //其他的网络请求也可以 + this.SMSverification(); + } + } + //短信验证 + SMSverification = () => { + // var url = `/accounts/get_verification_code.json`; + // axios.get((url), { + // params: { + // login: this.state.logins, + // type: 1, + // } + // }).then((result) => { + // //验证有问题{"status":1,"message":"success"} + // // console.log(result); + // this.openNotification("验证码已发送,请注意查收!",2); + // + // + // }).catch((error) => { + // console.log(error); + // + // }) + } + render() { + let{getverificationcodes,seconds} =this.state; + const antIcons = + return( + +
    + + ) + } +} + +export default PhoneModel; \ No newline at end of file diff --git a/public/react/src/modules/projectPackages/ProjectPackageIndex.js b/public/react/src/modules/projectPackages/ProjectPackageIndex.js new file mode 100644 index 000000000..097e012e0 --- /dev/null +++ b/public/react/src/modules/projectPackages/ProjectPackageIndex.js @@ -0,0 +1,76 @@ +import React, { Component } from 'react'; + +import { Redirect } from 'react-router'; + +import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; + +import Loading from '../../Loading' + +import Loadable from 'react-loadable'; +import { TPMIndexHOC } from '../tpm/TPMIndexHOC' +import { SnackbarHOC } from 'educoder' + + +const PackageIndex = Loadable({ + loader: () => import('./PackageIndex/PackageIndex'), + loading: Loading, +}) + +const PackageIndexNewandEdit = Loadable({ + loader: () => import('./PackageIndexNewandEdit/PackageIndexNewandEditIndex'), + loading: Loading, +}) + +const PackageIndexNEITaskDetails = Loadable({ + loader: () => import('./PackageIndexNEITaskDetails/PackageIndexNEITaskDetails'), + loading: Loading, +}) + +class ProjectPackageIndex extends Component { + constructor(props) { + super(props) + } + + componentDidMount(){ + window.document.title = '众包创新' + } + + render() { + + return ( +
    + + + {/*众包首页*/} + + () + } + > + + () + } + > + + () + } + > + + () + } + > + + +
    + ); + } +} + +export default SnackbarHOC() (TPMIndexHOC (ProjectPackageIndex)) ; \ No newline at end of file diff --git a/public/react/src/modules/projectPackages/packageconcnet.css b/public/react/src/modules/projectPackages/packageconcnet.css new file mode 100644 index 000000000..c17d95c9b --- /dev/null +++ b/public/react/src/modules/projectPackages/packageconcnet.css @@ -0,0 +1,338 @@ +.width1240{ + width:1240px; +} +.packinput .ant-input{ + height: 50px; + width:749px; + border-color: #E1EDF8 !important; +} + +.packinput .ant-input-group-addon .ant-btn{ + width:140px !important; + font-size: 18px; + height: 50px; + background:rgba(76,172,255,1); + margin-right:18px; +} + +.setissues{ + width:280px; + height:50px; + background:rgba(76,172,255,1); + border-radius:4px; + margin-left: 15px; +} + +.pagetype li{ + color:#8F8F8F !important; +} + +.maxwidth700{ + max-width: 700px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.mbf10{ + margin-bottom:-10px; +} + +.PackageIndexNEIBanner{ + width:1200px; + height:110px; + background:rgba(255,255,255,1); + box-shadow:0px 2px 6px 0px rgba(125,125,125,0.26); + border-radius:8px; +} + +.padding110{ + padding: 39px 110px 0px; + box-sizing: border-box; +} + +.borderccc{ + border: 1px solid #ccc; +} + +.input-100-40s{ + width: 100%; + padding: 5px; + box-sizing: border-box; +} + +.fafafas{ + background-color: #fafafa!important; + height: 40px; +} + +.fafafas:focus{ + background-color: #fff!important; +} + +.fafas .ant-input{ + background-color: #fafafa!important; + height: 40px; +} + +.fafas .ant-input:focus{ + background-color: #fff!important; +} +.fafas .ant-input-group-addon .ant-btn{ + width:140px !important; + font-size: 14px; + height: 40px; + background:rgba(76,172,255,1); +} + +.newFormbox .upload_filename{ + line-height: 32px; +} + +.newFormbox .attachment span{ + line-height: 23px; +} + +.newFormbox .attachment .remove-upload{ + line-height: 28px; +} + +.pd26a0{ + padding: 26px 26px 16px 26px; +} + +.newFormbox .attachment .icon-fujian{ + font-size: 14px !important; + line-height: 14px; + margin-top: 9px; +} + +.newFormbox{ + height:20px +} + +.ml24{ + margin-left:24px; +} + +.defalutCancelbtns{ + display: block; + border: 1px solid #4CACFF !important; + background-color: #fff; + color: #4CACFF !important; + width:130px; + height:40px; + text-align: center; + line-height: 40px; + border-radius: 4px; +} + +.defalutSubmitbtns{ + background-color: #4CACFF; + height:40px; +} + +.defalutSubmitbtnmodels{ + width:127px; + height:30px; + background-color: #4CACFF; +} + +.ant-steps-item-process .ant-steps-item-icon{ + background-color: #4CACFF !important; +} + +.ant-steps-item-process .ant-steps-item-icon{ + background-color: #4CACFF !important; +} + +.padding200{ + padding: 115px 200px 215px 200px; +} + +.fontcircle{ + font-size: 80px; + display: inherit; +} + +.sumbtongs{ + font-size: 24px; + display: inherit; + text-align: center; +} + +.terraces{ + font-size: 16px; + display: inherit; + text-align: center; + color:#999; +} +.padding251{ + padding: 0px 251px; +} + +.ant-modal-title{ + text-align: center; +} +.ml17{ + margin-left: 17px; +} + +.project-package-items{ + display: -webkit-flex; + display: flex; + flex-direction: row; + margin:0px !important; + padding: 20px; + background: white; + margin-bottom:0px !important; + box-shadow: none !important; +} + +.mtf7{ + margin-top:-7px; +} + +.publicpart.orangeGreen { + border-left: 80px solid #29BD8B; +} + +.publicwords{ + left: 3px; + top: 18px; +} + +.project-packages-list .project-package-items .item-image{ + width:100px !important; +} + +.height185{ + height: 185px; +} + +.ContacttheTA{ + width: 80px; + height: 26px; + font-size: 14px; + line-height: 26px; + display: block; + border: 1px solid #4CACFF !important; + background-color: #fff; + color: #4CACFF !important; + text-align: center; + border-radius: 4px; +} +.ContacttheTAs{ + width: 80px; + height: 26px; + font-size: 14px; + line-height: 24px; + /*display: block;*/ + border: 1px solid #fff !important; + background-color: #4CACFF; + color: #fff !important; + text-align: center; + border-radius: 4px; +} +.ml28{ + margin-left: 28px; +} + +.longboxs{ + font-size: 16px; + font-family: MicrosoftYaHei-Bold; + font-weight: bold; + color: rgba(5,16,26,1); + border-left: 4px solid rgba(76,172,255,1); + padding-left: 10px; + margin-bottom: 20px; +} + +.padding020{ + padding: 0px 20px 20px; +} + +.mtf3{ + margin-top:-3px; +} + +.task-btn-nebules{ + background: #fff!important; + color: #4CACFF!important; + border: 1px solid #4CACFF!important; + margin-left: 20px; + cursor: pointer; + display: inline-block; + padding: 0 12px; + letter-spacing: 1px; + text-align: center; + font-size: 14px; + height: 30px; + line-height: 30px; + border-radius: 2px; +} + +.packageabsolute{ + position: absolute; + right: -16px; + top: -7px; +} +.relativef{ + position: relative; +} + +.homehove:hover .ptext{ + color: #4CACFF!important; +} + +.homehove:hover .ContacttheTAs{ + display: block; +} + +.topsj{ + position: absolute; + top: -6px; +} +.bottomsj{ + position: absolute; + bottom: -6px; +} +.touchSelect .ant-spin-dot-spin{ + margin-top: 30% !important; +} + +.pagenoedits{ + margin-left: 20px; + color: #ccc; +} + +.pagemancenter{ + text-align: center; +} + +.ml0{ + margin-left: 0px; +} +.tabelcli{ + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 850px; + display: table-cell; +} + +.mtf10{ + margin-top:-10px; +} + +.padding26{ + padding: 26px; + box-sizing: border-box; +} + +.pd26{ + padding: 26px; +} +.pd30a0{ + padding: 30px 30px 16px 30px; +} \ No newline at end of file diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 3d1136371..379c70e27 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -716,7 +716,10 @@ submittojoinclass=(value)=>{ />
  • 教学案例
  • -
  • 众包创新
  • +
  • 众包创新
  • 交流问答
  • Date: Tue, 30 Jul 2019 10:21:56 +0800 Subject: [PATCH 050/117] b --- public/react/src/App.js | 2 +- .../src/modules/projectPackages/ProjectPackageIndex.js | 8 ++++---- .../react/src/modules/projectPackages/packageconcnet.css | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/public/react/src/App.js b/public/react/src/App.js index 6d1e2a521..e713cd0fd 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -304,7 +304,7 @@ class App extends Component { {/**/} {/*众包创新*/} - + {/*认证*/} diff --git a/public/react/src/modules/projectPackages/ProjectPackageIndex.js b/public/react/src/modules/projectPackages/ProjectPackageIndex.js index 097e012e0..6f2e32b8b 100644 --- a/public/react/src/modules/projectPackages/ProjectPackageIndex.js +++ b/public/react/src/modules/projectPackages/ProjectPackageIndex.js @@ -43,25 +43,25 @@ class ProjectPackageIndex extends Component { {/*众包首页*/} - () } > - () } > - () } > - () } diff --git a/public/react/src/modules/projectPackages/packageconcnet.css b/public/react/src/modules/projectPackages/packageconcnet.css index c17d95c9b..811771d4f 100644 --- a/public/react/src/modules/projectPackages/packageconcnet.css +++ b/public/react/src/modules/projectPackages/packageconcnet.css @@ -12,7 +12,6 @@ font-size: 18px; height: 50px; background:rgba(76,172,255,1); - margin-right:18px; } .setissues{ From a1ce03694e6e672ae6e727f84b1db531ba6fa2fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 10:29:08 +0800 Subject: [PATCH 051/117] =?UTF-8?q?=E4=BC=97=E5=8C=85=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projectPackages/packageconcnet.css | 11 +- public/stylesheets/educoder/edu-all.css | 287 +++++++++++++++++- 2 files changed, 296 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/projectPackages/packageconcnet.css b/public/react/src/modules/projectPackages/packageconcnet.css index 811771d4f..498da9214 100644 --- a/public/react/src/modules/projectPackages/packageconcnet.css +++ b/public/react/src/modules/projectPackages/packageconcnet.css @@ -334,4 +334,13 @@ } .pd30a0{ padding: 30px 30px 16px 30px; -} \ No newline at end of file +} + +.shaiContent li.shaiItem:hover span{ + color: #fff !important; +} + +.shaiContent li.shaiItem:hover i.iconfont{ + color: #4CACFF!important +} + diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 65db45900..65ff14a59 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -3055,4 +3055,289 @@ a.singlepublishtwo{ padding: 0px; } .project_packagesHead{width: 100%;margin-bottom:40px;background-size: 100% 100%;background-image: url("/images/educoder/project_packagesHead.jpg");height: 240px; - justify-content: center;align-items: center;display: -webkit-flex;} \ No newline at end of file + justify-content: center;align-items: center;display: -webkit-flex;} + + +/* 个人中心-众包 */ +.project-packages-list { +} +.project-packages-list .project-package-item { + display: -webkit-flex; + display: flex; + flex-direction: row; + margin-bottom: 20px; + padding: 20px; + background: white; + /*box-shadow:1px 3px 3px 1px rgba(156,156,156,0.16);*/ +} + +.project-packages-list .project-package-item:hover{ + box-shadow: 1px 6px 16px rgba(156,156,156,0.16); + opacity: 1; + border-radius: 2px; +} + +.project-packages-list .project-package-item .item-image { + width: 150px; + height: 110px; +} +.project-packages-list .project-package-item .item-body { + margin-left: 20px; + flex: 1; +} + +.project-package-item .item-body { + display: -webkit-flex; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.project-package-item .item-body .item-head { + display: -webkit-flex; + display: flex; + justify-content: space-between; + font-size: 20px; + height: 40px; +} +.project-package-item .item-head-title { + max-width: 700px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + transition: max-width .2s; + -moz-transition: max-width .2s; /* Firefox 4 */ + -webkit-transition: max-width .2s; /* Safari 和 Chrome */ + -o-transition: max-width .2s; /* Opera */ +} +.project-package-item .item-head-tags { + display: -webkit-flex; + display: flex; + align-items: center; +} +.project-package-item .item-head-tags span { + margin-left: 20px; + padding: 0 10px; + height: 28px; + font-size: 14px; + color: white; + border-radius: 5px; +} +.project-package-item .item-head-tags span.pending { background: lightcoral; } +.project-package-item .item-head-tags span.bidding_won { background: lightgreen; } +.project-package-item .item-head-tags span.bidding_lost { background: grey; } + +.project-package-item .item-head-blank { + flex: 1; +} +.project-package-item .item-head-price { + margin-left: 20px; + color: #F83B2D; + font-size: 28px; + font-weight: bold; +} +.project-package-item .item-head-price span { + font-size: 18px; +} +.project-package-item .item-category { + display: -webkit-flex; + display: flex; +} +.project-package-item .item-category-item { + padding: 0 10px; + color: #FF6800; + font-size: 14px; + background:rgba(255,235,213,1); + border-radius:13px; +} + +.project-package-item .item-other { + display: -webkit-flex; + display: flex; + justify-content: space-between; + color: #999999; +} +.project-package-item .item-group { + flex: 2; +} +.project-package-item .item-group.item-other-publish-at { + text-align: right; +} +.project-package-item .item-other-blank { + flex: 3 +} + +.project-package-item.with-operator .item-operator { + width: 0; + transition: width .2s; + -moz-transition: width .2s; /* Firefox 4 */ + -webkit-transition: width .2s; /* Safari 和 Chrome */ + -o-transition: width .2s; /* Opera */ +} +.project-package-item.with-operator:hover .item-operator { + margin: -20px -20px -20px 20px; + padding: 20px 0; + width: 100px; + display: flex; + justify-content: space-around; + flex-direction: column; + align-items: center; + background: #f0f0f0; +} +.project-package-item.with-operator .item-operator a { + display: none; +} +.project-package-item.with-operator:hover .item-operator a { + display: block; + font-size: 20px; +} +.project-package-item.with-operator:hover .item-head-title { + max-width: 600px; +} + +.list-count { + background: #fafafa; +} +.list-count span { + color: coral; + padding: 0 3px; +} + + +.applycompetitions{ + line-height: 30px; + border-radius: 14px; + color: #666; + background: rgba(41,189,139,1); + opacity: 0.8; + font-size: 14px; + font-family: MicrosoftYaHei; + font-weight: 400; + color: rgba(255,255,255,1); + position: absolute; + bottom: 139px; + left: 18px; + width: 73px; + height: 30px; + text-align: center; +} + +.noteDetailPoints{ + width: 70px; + height: 70px; + background-color: #4cacff; + border-radius: 50%; + color: #fff; + text-align: center; + margin: 0 auto; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 2px 0; + cursor: pointer; + line-height: 22px; + padding-top: 12px; +} + +.noteDetailPointsBCD1E3{ + width: 70px; + height: 70px; + background-color: #BCD1E3; + border-radius: 50%; + color: #fff; + text-align: center; + margin: 0 auto; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 2px 0; + cursor: pointer; + line-height: 22px; + padding-top: 12px; +} + +.-task-sidebars{ + position: fixed; + width: 40px; + height: 180px; + right: 0; + bottom: 30px; + z-index: 10; +} + +.winput150{ + width:150px; +} + + +.upload_Titles{ + position: relative; + float: left; + line-height: 35px; + font-size: 16px; + width: 50px; +} + +.lineheight35{ + line-height: 35px; +} + +.w120{ + width:120px; +} +.h90{ + width:90px; +} + +.decoration4CACFF{ + color: #4CACFF !important; + border-bottom: 1px solid #4CACFF; +} + +.surfacePlot{ + cursor: pointer; + width:122px; + height:92px; + background:rgba(250,250,250,1); + border:1px solid rgba(221,221,221,1); +} + +.marginuploading{ + padding: 28px 43px; + position: absolute; + z-index: 10; +} +.surfacePlot:hover .marginuploading.hidden{ + background: rgba(0,0,0, 0.1); +} + +.roundedRectangles { + position: absolute; + top: 10px; + right: -22px; +} + + +.edu-menu-lists .currentName{ + text-align: left; +} + +.edu-menu-lists li{ + text-align: left; +} + +.login_regs{ + width: 580px !important; +} + +.login_regs a{ + cursor: pointer; +} + +#member_block{ + height: 260px; + overflow-y: auto; +} + +#trophyreturn i{ + font-size: 16px!important; + color: #AAAAAA; +} \ No newline at end of file From 354d3a3b374e3d69c3dfbba4a95ec9f79c140a0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Tue, 30 Jul 2019 10:39:52 +0800 Subject: [PATCH 052/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/user/LoginRegisterComponent.js | 702 +++++++++--------- 1 file changed, 361 insertions(+), 341 deletions(-) diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index 99884e28e..48e1af926 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -14,12 +14,12 @@ import './common.css' import './commontwo.css' const { TabPane } = Tabs; const loginInputsyl = { -"width":"434px", -"height": "462px", -"-webkit-box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", -"box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", -"border-radius": "6px", -"background": "#fff" + "width":"434px", + "height": "462px", + "-webkit-box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", + "box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", + "border-radius": "6px", + "background": "#fff" } //父组件EducoderLogin.js @@ -66,6 +66,7 @@ class LoginRegisterComponent extends Component { pciphone:true, MyEduCoderModals:false, registered:undefined, + Phonenumberisnotcodmms:undefined, } } @@ -103,13 +104,14 @@ class LoginRegisterComponent extends Component { pciphone:true, MyEduCoderModals:false, registered:undefined, + Phonenumberisnotcodmms:undefined, } } } //判断是否是手机端 - IsPC=()=> { + IsPC=()=> { var userAgentInfo = navigator.userAgent; var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", @@ -162,7 +164,7 @@ class LoginRegisterComponent extends Component { StudyMakeMoney = () => { // 调用父组件方法 - this.props.Setshowbool(3); + // this.props.Setlogins(3); this.setState({ login: "", @@ -170,7 +172,12 @@ class LoginRegisterComponent extends Component { logins: "", passwords: "", codes: "", - }) + }); + try { + this.props.Setshowbool(3); + }catch (e) { + + } } onTabChange = (activeKey) => { console.log("onTabChange"); @@ -294,6 +301,7 @@ class LoginRegisterComponent extends Component { //登入接口 postLogin = () => { + if (this.state.login === undefined || this.state.login == "") { this.setState({ Phonenumberisnotco:"账号不能为空", @@ -310,34 +318,35 @@ class LoginRegisterComponent extends Component { login: this.state.login, password: this.state.password, }).then((response) => { + debugger if (response === undefined) { return } if(response.data.status === -2){ - if("该手机号尚未注册" || "该邮箱尚未注册"){ - this.setState({ - Phonenumberisnotco:response.data.message, - }) - return; - } - else if("错误的账号或密码"){ - this.setState({ - Phonenumberisnotco:response.data.message, - }) - return; - } - else if("违反平台使用规范,账号已被锁定"){ - this.setState({ - Phonenumberisnotco:response.data.message, - }) - - return; - } - else { - this.openNotification(response.data.message); - return; - } + if(response.data.message==="该手机号尚未注册" || response.data.message==="该邮箱尚未注册"){ + this.setState({ + Phonenumberisnotco:response.data.message, + }) + return; + } + else if(response.data.message==="错误的账号或密码"){ + this.setState({ + Phonenumberisnotcodmms:response.data.message, + }) + return; + } + else if(response.data.message==="违反平台使用规范,账号已被锁定"){ + this.setState({ + Phonenumberisnotco:response.data.message, + }) + + return; + } + else { + this.openNotification(response.data.message); + return; + } } @@ -474,7 +483,7 @@ class LoginRegisterComponent extends Component { // }) this.setMyEduCoderModals(); } - } + } }).catch((error) => { }) @@ -495,54 +504,54 @@ class LoginRegisterComponent extends Component { // this.setState({dragOk: true}) if(result){ - if(result.data.status===-2){ - if (id === 1) { - if(result.data.message==="该手机号码或邮箱已被注册"){ - this.setState({ - Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, - dragOk:true, - }) - }else { - this.setState({ - Phonenumberisnotco: result.data.message, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - console.log("s5"); - - } - return; - } else if (id === 2) { - this.setState({ - Phonenumberisnotcos: result.data.message, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - console.log("s6"); - - return; - } - }else { - if (id === 1) { - this.setState({ - Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, - dragOk:true, - }) - return; - } else if (id === 2) { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, - dragOk:true, - }) - return; - } - } - } + if(result.data.status===-2){ + if (id === 1) { + if(result.data.message==="该手机号码或邮箱已被注册"){ + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + }else { + this.setState({ + Phonenumberisnotco: result.data.message, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + console.log("s5"); + + } + return; + } else if (id === 2) { + this.setState({ + Phonenumberisnotcos: result.data.message, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + console.log("s6"); + + return; + } + }else { + if (id === 1) { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + return; + } else if (id === 2) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + return; + } + } + } }).catch((error) => { @@ -603,12 +612,12 @@ class LoginRegisterComponent extends Component { }) return; } - if(this.state.pciphone===true) { - if (this.state.dragOk === false) { - this.openNotification("拖动滑块验证"); - return; - } - } + if(this.state.pciphone===true) { + if (this.state.dragOk === false) { + this.openNotification("拖动滑块验证"); + return; + } + } if (this.state.getverificationcodes === true) { this.setState({ @@ -666,12 +675,14 @@ class LoginRegisterComponent extends Component { this.setState({ Phonenumberisnotco: undefined, Phonenumberisnotcobool: false, + Phonenumberisnotcodmms:undefined, login: stirngt, }) }else{ this.setState({ login: stirngt, Phonenumberisnotco:undefined, + Phonenumberisnotcodmms:undefined, }) } @@ -681,61 +692,61 @@ class LoginRegisterComponent extends Component { this.Emailphonenumberverification(e.target.value, 1); } inputOnBlurzhuche = (e, id) => { - if (e.target.value.length === 0) { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, - }) - return; - } - // var telephone = $("#telephoneAdd.tianjia_phone").val(); - var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; - // var email = $("#add_email.tianjia_email").val(); - var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; - - // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 - var stringdata = undefined; - if (!regph.test(e.target.value)) { - stringdata = "手机号格式不正确"; - this.setState({ - Phonenumberisnotcos: stringdata, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - } else { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, + if (e.target.value.length === 0) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + }) + return; + } + // var telephone = $("#telephoneAdd.tianjia_phone").val(); + var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // var email = $("#add_email.tianjia_email").val(); + var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; - }) - return - } + // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + var stringdata = undefined; + if (!regph.test(e.target.value)) { + stringdata = "手机号格式不正确"; + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, - if (!regemail.test(e.target.value)) { - if ((e.target.value.indexOf("@") != -1) === true) { - stringdata = "邮箱格式不正确"; - } else { - stringdata = "手机号格式不正确"; + }) + return + } - } - this.setState({ - Phonenumberisnotcos: stringdata, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - return + if (!regemail.test(e.target.value)) { + if ((e.target.value.indexOf("@") != -1) === true) { + stringdata = "邮箱格式不正确"; } else { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, + stringdata = "手机号格式不正确"; - }) - this.Emailphonenumberverification(e.target.value, id); - return } + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + return + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + + }) this.Emailphonenumberverification(e.target.value, id); + return + } + this.Emailphonenumberverification(e.target.value, id); } //获取登入密码 passwordonChange = (e) => { @@ -750,6 +761,7 @@ class LoginRegisterComponent extends Component { this.setState({ password: stirngt, Phonenumberisnotcodmm:undefined, + Phonenumberisnotcodmms:undefined, }) // this.setState({ // password: e.target.value @@ -759,28 +771,28 @@ class LoginRegisterComponent extends Component { loginInputonChanges = (e) => { console.log(e.target.value); var stirngt; - if(e.target.value.length>0){ - var str= e.target.value.replace(/\s*/g,"") - stirngt=str; - }else{ - stirngt= e.target.value; - } - if (e.target.value.length === 0) { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, - logins: stirngt, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - }else{ - this.setState({ - logins: stirngt, - Phonenumberisnotcos: undefined, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - } + if(e.target.value.length>0){ + var str= e.target.value.replace(/\s*/g,"") + stirngt=str; + }else{ + stirngt= e.target.value; + } + if (e.target.value.length === 0) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + logins: stirngt, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + }else{ + this.setState({ + logins: stirngt, + Phonenumberisnotcos: undefined, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + } } //获取注册密码 @@ -810,7 +822,7 @@ class LoginRegisterComponent extends Component { this.setState({ tab:e.key }) - console.log(e.key); + console.log(e.key); if(e.key === 0){ this.setState({ Phonenumberisnotcos:undefined @@ -868,6 +880,7 @@ class LoginRegisterComponent extends Component { // 注册 readAgreement, pciphone, + Phonenumberisnotcodmms, } = this.state // height: 346px; if (this.state.seconds === 0) { @@ -877,30 +890,30 @@ class LoginRegisterComponent extends Component { console.log(classpass); return ( -
    - - -
    - - 登录 - 注册 - - - { - parseInt(tab[0])==0 && -
    - + +
    + + 登录 + 注册 + + + { + parseInt(tab[0])==0 && +
    + - - this.inputOnBlur(e, 1)} - style={{marginTop: '30px', height: '38px'}}> - - { - Phonenumberisnotco && Phonenumberisnotco != "" ? -

    - {Phonenumberisnotco} -

    - :
    - } - - - { - Phonenumberisnotcodmm && Phonenumberisnotcodmm != "" ? -

    - {Phonenumberisnotcodmm} -

    - :
    - } - - - - -
    - } - - - { - parseInt(tab[0])==1 && -
    - this.inputOnBlurzhuche(e, 2)} - style={{marginTop: '30px' , height: '38px',color:'#999999',fontSize:"14px"}}> - { - Phonenumberisnotcos && Phonenumberisnotcos !== "" ? -

    - {Phonenumberisnotcos} -

    - :
    + } + + + this.inputOnBlur(e, 1)} + style={{marginTop: '30px', height: '38px'}}> + + { + Phonenumberisnotco && Phonenumberisnotco != "" ? +

    + {Phonenumberisnotco} +

    + :
    + } + + + { + Phonenumberisnotcodmm && Phonenumberisnotcodmm != "" ? +

    + {Phonenumberisnotcodmm} +

    + : (Phonenumberisnotcodmms=== undefined?
    :"") + } + { + Phonenumberisnotcodmms && Phonenumberisnotcodmms != "" ? +

    + {Phonenumberisnotcodmms} +

    + : "" + } + + + + +
    + } + + + { + parseInt(tab[0])==1 && +
    + this.inputOnBlurzhuche(e, 2)} + style={{marginTop: '30px' , height: '38px',color:'#999999',fontSize:"14px"}}> + { + Phonenumberisnotcos && Phonenumberisnotcos !== "" ? +

    + {Phonenumberisnotcos} +

    + :
    + + } + {this.state.MyEduCoderModals===true? {this.setNotcompleteds()}} + />:""} + + { + Whethertoverify===false&&pciphone===true? + + + : + "" - } - {this.state.MyEduCoderModals===true? {this.setNotcompleteds()}} - />:""} - - { - Whethertoverify===false&&pciphone===true? - - - : - "" - - } - { - Whethertoverify===true&&pciphone===true? - - + } + { + Whethertoverify===true&&pciphone===true? + + : "" - } + } -
    - { - pciphone===true? - ( - Phonenumberisnotcosytdhk && Phonenumberisnotcosytdhk !== "" ? +
    + { + pciphone===true? + ( + Phonenumberisnotcosytdhk && Phonenumberisnotcosytdhk !== "" ?

    {Phonenumberisnotcosytdhk}

    :
    - ) - :"" - } -
    - - - -
    - - - - { - getverificationcodes === undefined ? - - : getverificationcodes === true ? - - : - - } - -
    -
    - { - Phonenumberisnotcosyzm && Phonenumberisnotcosyzm !== "" ? -

    - {Phonenumberisnotcosyzm} -

    - :
    + ) + :"" + } +
    + + + +
    + + + + { + getverificationcodes === undefined ? + + : getverificationcodes === true ? + + : + + } + +
    +
    + { + Phonenumberisnotcosyzm && Phonenumberisnotcosyzm !== "" ? +

    + {Phonenumberisnotcosyzm} +

    + :
    - } -
    + } +
    - - this.Showandhide(key)}> - - }> - { - Phonenumberisnotcosymmm && Phonenumberisnotcosymmm !== "" ? -

    - {Phonenumberisnotcosymmm} -

    - :
    - - } - 我已阅读并同意 + } + + this.Showandhide(key)}> + + }> + { + Phonenumberisnotcosymmm && Phonenumberisnotcosymmm !== "" ? +

    + {Phonenumberisnotcosymmm} +

    + :
    + + } + 我已阅读并同意 《服务协议条款》 - + -
    - } -
    -
    +
    + } +
    +
  • ); } } From aa1d4ebb7d67f506c3e1c80b09964d80b84aac70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 10:51:16 +0800 Subject: [PATCH 053/117] =?UTF-8?q?=E4=BC=97=E5=8C=85=E7=A7=BB=E6=A4=8D?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackageIndexNEITaskDetails.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 4f06a0cba..23d7a095c 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -286,12 +286,12 @@ class PackageIndexNEITaskDetails extends Component { {data&&data.creator.name}
    - {data&&data.creator.login===this.props.current_user.login?"":
    - {overtype===false? 头像联系TA: - 头像 头像联系TA: + 头像联系TA}
    }
    @@ -404,7 +404,7 @@ class PackageIndexNEITaskDetails extends Component { {item.status==="bidding_won"?:""}

    {item.name}

    - {this.props.current_user.login!=item.login? + {this.props.current_user&&this.props.current_user.login!=item.login? 头像联系TA :""}
    From 6fa50089aa4526d14056bceb7737596bba6b06ce Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Jul 2019 10:53:01 +0800 Subject: [PATCH 054/117] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 4 ++-- app/controllers/exercises_controller.rb | 2 +- app/controllers/graduation_tasks_controller.rb | 2 +- app/controllers/graduation_topics_controller.rb | 2 +- app/controllers/polls_controller.rb | 2 +- app/controllers/student_works_controller.rb | 4 ++-- app/helpers/export_helper.rb | 6 +++--- app/services/batch_export_shixun_report_service.rb | 2 +- app/services/exercise_user_pdf_service.rb | 4 ++-- app/services/export_exercises_service.rb | 2 +- app/services/export_shixun_report_service.rb | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index bdb367111..9ae909dbc 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1029,8 +1029,8 @@ class CoursesController < ApplicationController normal_status(-1,"课堂暂时没有学生") else member_to_xlsx(@course, @all_members, @c_homeworks, @c_exercises, @c_tasks) - filename_ = "#{current_user.real_name}_#{@course.name}_全部成绩" - render xlsx: "#{format_sheet_name filename_.strip.first(30)}",template: "courses/export_member_scores_excel.xlsx.axlsx", + filename_ = "#{current_user.real_name}_#{@course.name}_全部成绩_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + render xlsx: "#{format_sheet_name filename_.strip}",template: "courses/export_member_scores_excel.xlsx.axlsx", locals: {course_info:@course_info, activity_level:@user_activity_level, course_scores:@course_user_scores,shixun_works:@shixun_work_arrays, common_works:@common_work_arrays,group_works:@group_work_arrays,task_works:@task_work_arrays, diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 03c943f8d..7c8c07d01 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1262,7 +1262,7 @@ class ExercisesController < ApplicationController get_export_users(@exercise,@course,@export_ex_users) exercise_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{exercise_export_name_.strip.first(30)}",template: "exercises/exercise_lists.xlsx.axlsx",locals: {table_columns:@table_columns,exercise_users:@user_columns} + render xlsx: "#{exercise_export_name_.strip}",template: "exercises/exercise_lists.xlsx.axlsx",locals: {table_columns:@table_columns,exercise_users:@user_columns} } end end diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index ab99e8d86..aeb5c409d 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -137,7 +137,7 @@ class GraduationTasksController < ApplicationController format.xlsx{ graduation_work_to_xlsx(@work_excel,@task,current_user) task_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@task.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{task_export_name_.strip.first(30)}",template: "graduation_tasks/tasks_list.xlsx.axlsx",locals: {table_columns:@head_cells_column, task_users:@task_cells_column} + render xlsx: "#{task_export_name_.strip}",template: "graduation_tasks/tasks_list.xlsx.axlsx",locals: {table_columns:@head_cells_column, task_users:@task_cells_column} } end end diff --git a/app/controllers/graduation_topics_controller.rb b/app/controllers/graduation_topics_controller.rb index 754b472c5..96816c2a6 100644 --- a/app/controllers/graduation_topics_controller.rb +++ b/app/controllers/graduation_topics_controller.rb @@ -271,7 +271,7 @@ class GraduationTopicsController < ApplicationController students = course.students.joins(user: :user_extension).order("user_extensions.student_id") graduation_topic_to_xlsx(students,course) topic_export_name_ = "#{current_user.real_name}_#{course.name}_毕设选题_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{topic_export_name_.strip.first(30)}",template: "graduation_topics/export.xlsx.axlsx",locals: {table_columns:@topic_head_cells,topic_users:@topic_body_cells} + render xlsx: "#{topic_export_name_.strip}",template: "graduation_topics/export.xlsx.axlsx",locals: {table_columns:@topic_head_cells,topic_users:@topic_body_cells} rescue Exception => e uid_logger(e.message) missing_template diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 4348b3bfc..87435f743 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -950,7 +950,7 @@ class PollsController < ApplicationController format.xlsx{ polls_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@poll.polls_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" polls_user_commit = poll_commit_result(@poll,@poll_export_questions,@poll_users,@poll_commit_ids) - render xlsx: "#{polls_export_name_.strip.first(30)}",template: "polls/commit_result.xlsx.axlsx",locals: {polls_user_commit:polls_user_commit} + render xlsx: "#{polls_export_name_.strip}",template: "polls/commit_result.xlsx.axlsx",locals: {polls_user_commit:polls_user_commit} } end end diff --git a/app/controllers/student_works_controller.rb b/app/controllers/student_works_controller.rb index f9f4717a6..a5d46e46a 100644 --- a/app/controllers/student_works_controller.rb +++ b/app/controllers/student_works_controller.rb @@ -457,8 +457,8 @@ class StudentWorksController < ApplicationController @myself_eff = @echart_data[:efficiency_list].find { |item| item.last == @user.id } @myself_consume = @echart_data[:consume_list].find { |item| item.last == @user.id } - filename_ = "实训报告_#{@shixun&.name}_#{@use&.real_name}" - filename = Base64.urlsafe_encode64(filename_.strip.first(30)) + filename_ = "#{@use&.student_id}_#{@use&.real_name}_#{@shixun&.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + filename = Base64.urlsafe_encode64(filename_.strip) stylesheets = %w(shixun_work/shixun_work.css shared/codemirror.css) render pdf: 'shixun_work/shixun_work', filename: filename, stylesheets: stylesheets end diff --git a/app/helpers/export_helper.rb b/app/helpers/export_helper.rb index 742deb85b..6af88de33 100644 --- a/app/helpers/export_helper.rb +++ b/app/helpers/export_helper.rb @@ -418,7 +418,7 @@ module ExportHelper end end - out_file_name = "#{Time.now.to_i}_#{homework_common.name}.zip" + out_file_name = "作品附件_#{homework_common&.course&.name}_#{homework_common.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}.zip" out_file_name.gsub!(" ", "-") out_file_name.gsub!("/", "_") out_file = find_or_pack(homework_common, homework_common.user_id, digests.sort){ @@ -496,8 +496,8 @@ module ExportHelper def make_zip_name(work, file_name="") Rails.logger.info("######################file_name: #{file_name}") - name = file_name === "" ? "" : (file_name[0, file_name.rindex('.')]+"_") - "#{name}#{work.user.real_name}_#{((work.user.student_id.nil?) ? "" : work.user.student_id)}" + # name = file_name === "" ? "" : (file_name[0, file_name.rindex('.')]+"_") + "#{work&.user&.student_id}_#{work.&user.&real_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" end def zipping(zip_name_refer, files_paths, output_path, is_attachment=false, not_exist_file=[]) diff --git a/app/services/batch_export_shixun_report_service.rb b/app/services/batch_export_shixun_report_service.rb index d71235790..253eb4480 100644 --- a/app/services/batch_export_shixun_report_service.rb +++ b/app/services/batch_export_shixun_report_service.rb @@ -14,7 +14,7 @@ class BatchExportShixunReportService end def filename - @_filename ||= "#{homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + @_filename ||= "实训报告_#{homework&.course&.name}_#{homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" end def zip diff --git a/app/services/exercise_user_pdf_service.rb b/app/services/exercise_user_pdf_service.rb index 73711192f..6891e53ea 100644 --- a/app/services/exercise_user_pdf_service.rb +++ b/app/services/exercise_user_pdf_service.rb @@ -15,8 +15,8 @@ class ExerciseUserPdfService end def filename - user_course = @course.course_members.find_by(user_id:@ex_user_user.id)&.course_group_name - exercise_user_name = "#{@ex_user_user.real_name}_#{user_course.present? ? user_course : "未分班"}_#{exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M')}" + # user_course = @course.course_members.find_by(user_id:@ex_user_user.id)&.course_group_name + exercise_user_name = "#{@ex_user_user&.student_id}_#{@ex_user_user.real_name}_#{exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M')}" "#{exercise_user_name.strip}.pdf" end diff --git a/app/services/export_exercises_service.rb b/app/services/export_exercises_service.rb index ca2d347a6..1f1e15326 100644 --- a/app/services/export_exercises_service.rb +++ b/app/services/export_exercises_service.rb @@ -10,7 +10,7 @@ class ExportExercisesService end def filename - exercise_export_name = "#{exercise.user.real_name}_#{exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + exercise_export_name = "学生答题_#{exercise&.course&.name}_#{exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" "#{exercise_export_name.strip}.zip" end diff --git a/app/services/export_shixun_report_service.rb b/app/services/export_shixun_report_service.rb index f9da3d6f2..57b955762 100644 --- a/app/services/export_shixun_report_service.rb +++ b/app/services/export_shixun_report_service.rb @@ -10,7 +10,7 @@ class ExportShixunReportService end def filename - @_filename ||= "#{homework.name}-#{work.user&.student_id}-#{work.user.real_name}.pdf".gsub(' ', '-').gsub('/', '_') + @_filename ||= "#{work.user&.student_id}_#{work.user.real_name}_#{homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}.pdf".gsub(' ', '-').gsub('/', '_') end def prepare_binding From d7c0ef56f079a1e0f70b55c76c1763a938cd06fe Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Jul 2019 11:21:11 +0800 Subject: [PATCH 055/117] =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=BC=B9=E6=A1=86?= =?UTF-8?q?=E5=BA=94=E8=AF=A5=E4=BC=98=E5=85=88=E4=BA=8E=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E8=AF=BE=E5=A0=82=E5=BC=B9=E6=A1=86=EF=BC=8C=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=BA=94=E8=AF=A5=E4=BC=98=E5=85=88=E5=88=A4=E6=96=AD=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f01ad4b6b..e825d53da 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -38,6 +38,7 @@ class ApplicationController < ActionController::Base def user_course_identity @user_course_identity = current_user.course_identity(@course) if @user_course_identity > Course::STUDENT && @course.is_public == 0 + tip_exception(401, "..") unless User.current.logged? tip_exception(409, "您没有权限进入") end uid_logger("###############user_course_identity:#{@user_course_identity}") From 2ac2bbf5d87ead4360956f3967088192b949256a Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Jul 2019 11:56:45 +0800 Subject: [PATCH 056/117] add phone to get user info apig --- app/views/users/get_user_info.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/users/get_user_info.json.jbuilder b/app/views/users/get_user_info.json.jbuilder index d9eb736ad..d12b950f9 100644 --- a/app/views/users/get_user_info.json.jbuilder +++ b/app/views/users/get_user_info.json.jbuilder @@ -7,6 +7,7 @@ json.is_teacher @user.user_extension&.teacher? json.user_identity @user.identity json.tidding_count 0 json.user_phone_binded @user.phone.present? +json.phone @user.phone json.profile_completed @user.profile_completed? if @course json.course_identity @course_identity From 275fb7e21c1c02bdcba3e9d4593a22400913e11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 13:40:29 +0800 Subject: [PATCH 057/117] b --- public/react/src/AppConfig.js | 2 +- .../PackageIndex/PackageConcent.js | 4 +-- .../PackageIndexNEITaskDetails.js | 27 ++++++++++--------- .../PackageIndexNEITaskDetails/pds.css | 21 +++++++-------- .../PackageIndexNEIBannerConcent.js | 6 ++--- .../PackageIndexNEISubmit.js | 4 +-- public/react/src/modules/tpm/NewHeader.js | 2 +- 7 files changed, 32 insertions(+), 34 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 2ad7df0d5..363ff495d 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -41,7 +41,7 @@ export function initAxiosInterceptors(props) { // proxy = "http://testbdweb.trustie.net" // proxy = "http://testbdweb.educoder.net" // proxy = "https://testeduplus2.educoder.net" - proxy="http://47.96.87.25:48080/" + proxy="http://47.96.87.25:48080" // 在这里使用requestMap控制,避免用户通过双击等操作发出重复的请求; diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js index 46e36f90f..3f31b442e 100644 --- a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js @@ -157,7 +157,7 @@ class PackageConcent extends Component { enterButton={ 搜索} onSearch={ (value)=>this.setdatafuns(value)} />

    @@ -223,7 +223,7 @@ class PackageConcent extends Component { diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 23d7a095c..bec37a59a 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -229,7 +229,8 @@ class PackageIndexNEITaskDetails extends Component { } goback = () => { - window.history.go(-1) + // window.history.go(-1) + window.location.href="/crowdsourcings"; } render() { @@ -251,7 +252,7 @@ class PackageIndexNEITaskDetails extends Component { '} className={"fl"}> {/*{this.props.current_user.username}*/} - 众包创新 + 众包创新 {data&&data.title} @@ -351,7 +352,7 @@ class PackageIndexNEITaskDetails extends Component { 需求详情: {data&&data.status==="pending"&&data&&data.operation.can_select_bidding_user===true?:""} @@ -393,16 +394,16 @@ class PackageIndexNEITaskDetails extends Component {
    -
    -
    -
    +
    +
    +
    {data&&data.bidding_users.map((item,key)=>{ return( -
    +
    {item.status==="bidding_won"?:""} - +

    {item.name}

    {this.props.current_user&&this.props.current_user.login!=item.login? 头像联系TA @@ -442,15 +443,15 @@ class PackageIndexNEITaskDetails extends Component {
    -
    -
    -
    +
    +
    +
    {data&&data.bidding_users.map((item,key)=>{ return( -
    this.Clickteacher2(item.id)} key={key}> + ) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/pds.css b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/pds.css index a6f9e10dc..504a78bed 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/pds.css +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/pds.css @@ -1,4 +1,4 @@ -.ysldivhome2{ +.ysldivhome2s{ display: flex; flex-flow: row wrap; align-content:stretch; @@ -6,20 +6,17 @@ margin-bottom: 20px; } -.ysllogin_register_contents{ - display: flex; - margin-top: 20px; - /*justify-content: center;*/ - background: #fff; -} - .ysllogin_register_contentss{ margin-top:0px !important; padding-top: 10px; padding-bottom: 10px; + display: flex; + margin-top: 20px; + /*justify-content: center;*/ + background: #fff; } -.ysldivhomediv1{ +.ysldivhomediv1s{ width: 80px; height: 130px; display: flex; @@ -33,10 +30,10 @@ margin-left: 64px; } -.yslgouxuanimg2{ +.yslgouxuanimg2s{ height: 20px; } -.div1img{ +.div1imgs{ display: flex; justify-content:center; width: 80px; @@ -53,7 +50,7 @@ .ptext{ width: 80px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } -.ysllogin_section { +.ysllogin_sections { display: flex; align-items: center; flex-direction: column; diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index e7e4b20a2..adde77b64 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -454,7 +454,7 @@ class PackageIndexNEIBannerConcent extends Component { if(type===true){ this.props.setPublicationfun(response.data.id) }else{ - window.location.href="/crowdsourcing/"+response.data.id + window.location.href="/crowdsourcings/"+response.data.id } this.setState({ springtype:false @@ -502,7 +502,7 @@ class PackageIndexNEIBannerConcent extends Component { if(type===true){ this.props.setPublicationfun(response.data.id) }else{ - window.location.href="/crowdsourcing/"+response.data.id + window.location.href="/crowdsourcings/"+response.data.id } this.setState({ springtype:false @@ -836,7 +836,7 @@ class PackageIndexNEIBannerConcent extends Component {

    - 姓名: + 姓名: { if(sum===undefined){ - window.location.href="/crowdsourcing/new" + window.location.href="/crowdsourcings/new" }else{ // this.props.history.push("/project_packages/"+sum) - window.location.href="/crowdsourcing/"+sum + window.location.href="/crowdsourcings/"+sum } } diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 379c70e27..23330e779 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -718,7 +718,7 @@ submittojoinclass=(value)=>{

  • 教学案例
  • 众包创新
  • 交流问答
  • Date: Tue, 30 Jul 2019 13:48:21 +0800 Subject: [PATCH 058/117] download --- .../courses/busyWork/CommonWorkDetailIndex.js | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index ff8e3e3a2..4f2283499 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -8,7 +8,7 @@ import { CNotificationHOC } from '../common/CNotificationHOC' import { RouteHOC } from './common' import locale from 'antd/lib/date-picker/locale/zh_CN'; -import { WordsBtn, MarkdownToHtml, trigger, queryString } from 'educoder'; +import { WordsBtn, MarkdownToHtml, trigger, queryString, downloadFile } from 'educoder'; import axios from 'axios'; import Modals from '../../modals/Modals'; import CoursesListType from '../coursesPublic/CoursesListType'; @@ -18,6 +18,8 @@ import '../css/Courses.css' import CBreadcrumb from '../common/CBreadcrumb' import DownloadMessageysl from "../../modals/DownloadMessageysl"; +import { Spin } from 'antd' + //引入对应跳转的组件 //新建分组/普通作业 @@ -64,6 +66,7 @@ class CommonWorkDetailIndex extends Component{ this.state = { DownloadType:false, DownloadMessageval:undefined, + donwloading: false, } } initWorkDetailCommonState = (data) => { @@ -123,7 +126,20 @@ class CommonWorkDetailIndex extends Component{ } }else { this.props.showNotification(`正在下载中`); - window.open("/api"+url, '_blank'); + + this.setState({ donwloading: true }) + downloadFile({ + url: url, + successCallback: (url) => { + this.setState({ donwloading: false }) + console.log('successCallback') + }, + failCallback: (responseHtml, url) => { + this.setState({ donwloading: false }) + console.log('failCallback') + } + }) + // window.open("/api"+url, '_blank'); } }).catch((error) => { console.log(error) @@ -244,7 +260,7 @@ class CommonWorkDetailIndex extends Component{ }
  • - { noTab !== true &&
    + { noTab !== true &&
    this.setState({moduleName: '作品列表'})} @@ -283,18 +299,30 @@ class CommonWorkDetailIndex extends Component{ padding-top: 10px; padding-bottom: 8px; } + + .floatSpinParent .ant-spin-nested-loading { + float: right; + } `} - {this.props.isAdmin()?
  • + {this.props.isAdmin()? +
  • 导出 -
  • :""} + + :""} {/* {isAdmin && 导出作品附件} {isAdmin && 导出成绩} */} From 9400d4a57daef5ec8abf5a6db7e0e7d56c8b3e2e Mon Sep 17 00:00:00 2001 From: jingquan huang Date: Tue, 30 Jul 2019 13:50:06 +0800 Subject: [PATCH 059/117] =?UTF-8?q?users=E8=A1=A8=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20190730024112_add_index_to_user.rb | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 db/migrate/20190730024112_add_index_to_user.rb diff --git a/db/migrate/20190730024112_add_index_to_user.rb b/db/migrate/20190730024112_add_index_to_user.rb new file mode 100644 index 000000000..fa198cffa --- /dev/null +++ b/db/migrate/20190730024112_add_index_to_user.rb @@ -0,0 +1,7 @@ +class AddIndexToUser < ActiveRecord::Migration[5.2] + def change + # add_index :users, :login, unique: true + # add_index :users, :mail, unique: true + # add_index :users, :phone, unique: true + end +end From 814aa13c21518c8c463761e09e8c993364ed1c98 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 30 Jul 2019 14:05:26 +0800 Subject: [PATCH 060/117] =?UTF-8?q?Mp3=E3=80=81mp4=E7=B1=BB=E5=AE=9E?= =?UTF-8?q?=E8=AE=AD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/games_controller.rb | 2 +- app/controllers/myshixuns_controller.rb | 2 +- app/helpers/games_helper.rb | 8 +++++++- app/models/challenge.rb | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index b2de6dcad..667d45f2b 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -116,7 +116,7 @@ class GamesController < ApplicationController @qrcode_str = Base64.encode64( qr.to_img.resize(400,400).to_s ) else - @type = "image" + @type = "" #conv = Iconv.new("GBK", "utf-8") @game_challenge = @game.challenge type = @game_challenge.show_type diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index fa47fd7f6..1d6b15969 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -24,7 +24,7 @@ class MyshixunsController < ApplicationController ActiveRecord::Base.transaction do begin @shixun = Shixun.select(:id, :identifier).find(@myshixun.shixun_id) - @myshixun.destroy + @myshixun.destroy! StudentWork.where(:myshixun_id => @myshixun.id).update_all(:myshixun_id => 0, :work_status => 0) diff --git a/app/helpers/games_helper.rb b/app/helpers/games_helper.rb index aff05904f..dfc3fb321 100644 --- a/app/helpers/games_helper.rb +++ b/app/helpers/games_helper.rb @@ -6,7 +6,7 @@ module GamesHelper end # 获取目录下所有文件,返回一个文件名的数组 type是查看文件的类型image表示图片 - # type [[1, "图片"], [2, "apk/exe"], [3, "txt"], [4, "html"]] + # type [[1, "图片"], [2, "apk/exe"], [3, "txt"], [4, "html"], [5, "mp3"], [6, "mp4"]] def get_dir_filename(path, type, game_id) answer_picture = [] return answer_picture unless File.directory?(path) @@ -39,6 +39,12 @@ module GamesHelper end f.close @type = 'txt' + elsif extension == 'mp3' && type == 5 + answer_picture << file + @type = 'mp3' + elsif extension == 'mp4' && type == 6 + answer_picture << file + @type = 'mp4' end end diff --git a/app/models/challenge.rb b/app/models/challenge.rb index 0bea54eb4..8e4d2ae42 100644 --- a/app/models/challenge.rb +++ b/app/models/challenge.rb @@ -1,5 +1,6 @@ class Challenge < ApplicationRecord # difficulty: 关卡难度: 1.简单 2.中等 3.困难 + # show_type: 效果展示:-1.无效果 1.图片 2.apk/exe 3.txt 4.html 5.mp3 6.mp4 default_scope { order("challenges.position asc") } belongs_to :shixun, :touch => true, counter_cache: true From 98ba053ebec9fd049c9d9fa09a5d042b14c5bf9d Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 30 Jul 2019 14:08:14 +0800 Subject: [PATCH 061/117] donwloading --- .../src/modules/courses/busyWork/CommonWorkDetailIndex.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index 2d3361492..a690fedc0 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -305,6 +305,9 @@ class CommonWorkDetailIndex extends Component{ .floatSpinParent .ant-spin-nested-loading { float: right; } + .floatSpinParent .ant-spin-nested-loading .ant-spin-spinning{ + top: 10px; + } `} {this.props.isAdmin()?
  • From e1925f40c1a4a74564c89fab7e2d02ece6dabda4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 14:23:25 +0800 Subject: [PATCH 062/117] =?UTF-8?q?=E4=BC=97=E5=8C=85=E7=A7=BB=E6=A4=8D?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/educoder/project_packages/ai.png | Bin 0 -> 1459 bytes .../educoder/project_packages/backend.png | Bin 0 -> 1404 bytes .../cloud_compute_and_big_data.png | Bin 0 -> 1506 bytes .../educoder/project_packages/database.png | Bin 0 -> 1627 bytes .../project_packages/devops_and_test.png | Bin 0 -> 1312 bytes .../educoder/project_packages/front.png | Bin 0 -> 1322 bytes .../educoder/project_packages/mobile.png | Bin 0 -> 1367 bytes .../educoder/project_packages/other.png | Bin 0 -> 1107 bytes .../PackageIndex/PackageConcent.js | 46 +++++++++--------- .../PackageIndexNEITaskDetails.js | 14 +++--- .../PackageIndexNEIBannerConcent.js | 10 ++-- .../projectPackages/packageconcnet.css | 14 ++++++ 12 files changed, 49 insertions(+), 35 deletions(-) create mode 100755 public/images/educoder/project_packages/ai.png create mode 100755 public/images/educoder/project_packages/backend.png create mode 100755 public/images/educoder/project_packages/cloud_compute_and_big_data.png create mode 100755 public/images/educoder/project_packages/database.png create mode 100755 public/images/educoder/project_packages/devops_and_test.png create mode 100755 public/images/educoder/project_packages/front.png create mode 100755 public/images/educoder/project_packages/mobile.png create mode 100755 public/images/educoder/project_packages/other.png diff --git a/public/images/educoder/project_packages/ai.png b/public/images/educoder/project_packages/ai.png new file mode 100755 index 0000000000000000000000000000000000000000..825e75165dc6b016037d6cef82573728f69ffa65 GIT binary patch literal 1459 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 IM6N<$f*J$d*#H0l literal 0 HcmV?d00001 diff --git a/public/images/educoder/project_packages/database.png b/public/images/educoder/project_packages/database.png new file mode 100755 index 0000000000000000000000000000000000000000..2b668e774b5d16b7725469f70309ee0ea285f08e GIT binary patch literal 1627 zcmV-h2Bi6kP)h(#_4@JU@!Y`PtJUbob3tJ$00004bW%=J_Wno)eg_c) z000HzNklAdR#U zNZM@_nN}qrCTyvVW!ZYUJ!dW? zr}wG%);kpIP47^$0CqsuyI0mL>y`D&dS(6pEav$>I|K_L13dcIUtpFV&8 z6&Ca6Pic}w>ZEDrrZwogPovt2^Ml8XKFm0Zl|;(CLYP787$jUYsIL<`?v9n;}cYFlfP=FcHHO`;LC zN3`($RYB-*@sz{p$ny1E5{f;|#2CsKFn2x187LuCN+G3$UxupFj#Rb~CS}l~hSKRX z2MW4Vo~(8D#)PVL$rrHZ{*`9a^uk$pq^@v^to|GWj--E>}t0pib(^@@3x|Ar? zRf9Qn@g0rzYGy2wN2xp?YFPq}$LyJ_@{wH9RlFppGjfM4B$c;_D1(9rlnWeZTEAx5aj`WT88>m&M% zhqCg#3DM2+v*Ug(%FMDZO+!UlTt}!v^j*4=8`57HWz+RDc;Xwxh^>$s7&n=3)a7A4 z_RWWd2PykT7pz|HRi?#6~CZ64Gu*&KY))G!#-n=gC3skycLB52lpsEyoQ0B@PY~?lBXQ;=D zCCk30HNg*K?$6tcbR$U3T0LN{bh{~e5TY|igk6`kFGq=CEmeSl%Dk}yqJoC!0KT_? z1v6Ibjf4eSv1VmMtyzLGuR)i`0(r7nPjhHG;YZC{W2=$s4y{WWrps@BZUO~~ZsIZ= zVvHC3wwl&9`G{)PrD5twT7;+BjSf&H%LK{H+2c7A<3w+|(6!+2Uvvlv5A6kKA6*^` ziQd6++12CPbO_@IhF10V$d`qM<+97oR5X@gTGn3qf)n8K7S<;phRc%v@&u!u4jW7WB|xtO}dPVWMknu;}_;uU&6>-1iMaocN{DMj<5pvyao z%BRNk<}E>|_Z^rnwI*3V*nD+(SI(;4hLxH3yf>ZR;o~6lZRawM@ZNpub^G6ff42Q^ Z!GGbk(Twpgt_lDE002ovPDHLkV1jIHA!q;q literal 0 HcmV?d00001 diff --git a/public/images/educoder/project_packages/devops_and_test.png b/public/images/educoder/project_packages/devops_and_test.png new file mode 100755 index 0000000000000000000000000000000000000000..77b8e6f3b1b9b4b7ea21c6384e1c9638504151fe GIT binary patch literal 1312 zcmV+*1>gFKP)14!N=>7)NnWp|d?Jdp6DJZHSPV`?l!Cpds^xcSv=a{=cOETu+li%zo#k#@@pEUXHCCrZ)=vx8g0)~RSPRzw zkF~O~b@ywd5$oy4*HdB*H(^}{)1vq5Y6I3}I%~LdUYoVjpTT;&-XbeJubtyeRxoJK zD+vE?j};6y+GB-Bt%?PTln2)9wM-* zl)S{9^8427-x4bV7Hj4ee*fU+$fM|vSS2e|-_wJB5Ej223h*kIzmoOkChM#8EC`N& z*j`-lQkGTq8jQ~5kLSrr5N?le9IuGGSyp(3x5=S=`6huuznz@+T`yOxf_0oGJE|o> z=_nch$i1NWWwH6Jo>94#Ez!G5K72G@(n^MJy&ywXBHa>$G&$=RUKx&gdab9)pXzT% z2iebmlJR9;FCEy66@E|lRk!!jGn4av-{h!i#EZ3-j`h)Lke;X)>*@H~EWya7(7mj_Fh z-71!6?Pqz(aZ`BV=3XqD5X90#O}&_!Tt($EzDJHct2`~VW_hhvva;4HDvxJ-p~+lU zZq8wR}pWJ?|b^tAeD(=!GOsJ4&O8AQM!;MVR zYA%c`@8!5wibN!YeNN)mLzF#_s_*y^hXP5I$fP2*k#Ri&t>(fW_k{q9g?h&#ifupB zvYU%|-8~{2D;hV|f)NPwlsFI3^Bxn^7^)RnUQ~~HRy3EN7X*cR$+sEYoCGtPQ+n_F zRYX-&2&2WEWevTBYuwdReLBsLBlccKFs^m)O9eMtj8kV-qncg{mbW~020g0j)$J0~ z_0o$LJ)wKP-rY9QS{h~Lh-0F2pQ2w~im1u%Oh607o(Rr9lQMBJrVq}Y8>`!jsxOfEachn*Jxx8OfK WhLDY%N|dYs0000hZCPO;4`gPsUjnmy^HWHRG(whspb9taUMYHyZ1|5m{f( ztTXG(I6N*4G}^{g^BmjkUOU zdNf^+4yst6m)*L4J6FY;^|R(9vY>|bFR_+y7P7A0QDOb8)#3Ge5*AdjG_t-K*Ix6; zIueWSK5>)<$ofVssL=J)%?dx&<$k4Va#p4m%4IFU73pnOQfR zd|~K*3b~Hu6aN33+((wKW!-eMpwus9-FepA=JUfH7dF6pJfbi=%BrAOwHlK{tJRVq-b4Hcv`pT^NOSYc*heB)Rb%2HCK)OhnX^Z7dOIQIbU!T}S5g`XR+=s9|Q;9wiCc=hTkF7Rw!+Q{7N}_=LQUf(k zQxBE(S+e2Sc!&+WUl(Ozz0a;-vrQO7;6U=lACy#Nk1lHXe*c8#ci@gkN6>{e%06l} z%)$%suED8#Sn)0WK1K^nl%;GD%NM$9B8e$m+obyuZ6{Gxy-(-OvtHG;+OB_ z*7mVFzC0GcTjv@GrBT=^EIB@Dpj+=)a}o$13!C$O$VP-PQ?F28KwyUFS( z3fne^i)j{B^?Tn)IPyf3RPw|XC4_6EOB02 zTfnlJEFKwo8}#RzPEgs~qj@bWG%nyq?>mHUiuN&w8AC9XW~4d$!>ABcsH;(;DMnrj z)a+NeF18Ff5y>r-MQ5>G7gh;$flDOA6GKypws0RM7zRL!l*~&gJgU*fZ^%}zf+}7| zRLqt|yDHwJJ;sI9n=B9<`Jk-)ZJV#)CfP2#=xs-36)elACxu>zaG@;Z)x5bYm)`^x zHyd)D?5cXdH!ibY^I44Ps$*Fd&teFd#k1HnVIwPlub`v}#@o%wx;!k|MHuc}q^g!> z`L;{9Bo$FwpTP3L$VVA%qo_hw-S5hiS4#RRYNLOi{F&|FaQ7m07*qoM6N<$g5QXY-2eap literal 0 HcmV?d00001 diff --git a/public/images/educoder/project_packages/mobile.png b/public/images/educoder/project_packages/mobile.png new file mode 100755 index 0000000000000000000000000000000000000000..cd73520c732c931fcae55531ac837ddd09081c21 GIT binary patch literal 1367 zcmV-d1*rOoP)c=;B$G<{r>vw`T6_$;)2HI_~h;OtKIth>!xbF z5@G-V019+cPE+>(|NsC0|M@b!_SY>F000EWNklJ9>xcEj`eFUB{DC_kg|J@xMj@=e-Z%OZSoo^{_Ko_51#B^_x|x2d>&Acj-vLi%VZUwg}LB!m8sV(sHf&Q?9< zsQIirJw5(7mQq)&#Kt}5r^MPJEPW+zC=eEFJ6D3OW?{^K$+0$1mz`*jVsC4A*@Yc3AWa;bQo&`*A=!la9v_+9qh2JCdJk&*EP1PHLfeNRjmuV zDqABK7PZyB+jhZLRjuzuC)jHL4Wo_Qsx~A)-%8XHD`<;SMY!_W>e{yLHrT3ss2EtT zZ0YVjz`Q%XW~-v9H^ImAZ0XLx{G(WU84DfQ3AVJ3Vo6&SPuBEFfMu}Nd02P7z7l;` z6O^3D#FePK_Wd?VU$g~5S?E6)SE?<`uxJayd1q{xF9{X! zp(|REij{23FQ>sVlrSB)^$EQ4pkN9;q?}#BAEy7Dt%9kzm_QL7RJwD9@BVJ zPKFL*?gag(?6;=M;Ge)~uzXh;R^pz1E57SkP5G+)#_rT>XL!v5CM)q&eLrAJ>H@h8 zA<@?I>*oPm(Fp_^trS~ZhGz?dn>2``H9m{nzXeKGQ57hnZVt=bH3Fn$sc5ohSyttJ`zy)iA+zQh+pTotM7E+-L3uJ2v zjUB>#Tcxo)I(Esy0pWF65PDOU0KDuyWTEQr+q(4a-mYLFX^IA@uXuAjtMSjr?K}S~ Zf&U}?8+Dktk3j$c002ovPDHLkV1haGwgdnG literal 0 HcmV?d00001 diff --git a/public/images/educoder/project_packages/other.png b/public/images/educoder/project_packages/other.png new file mode 100755 index 0000000000000000000000000000000000000000..a700cd5dec4561d0adc46073916d20b6cb58840c GIT binary patch literal 1107 zcmV-Z1g!gsP) zh{FGg!T*WD{)N8#f4cww|Nrp!{h!SK;_&U2hM)id00VSVPE+gk+Qc+V@q(ZEzuVMaYkaxc|j~^XbW#!|MxiAWNmM5 z-9a4oke|L8e;!Y~+nk*@%f!i9^X0T%CQdJ!^LDBD)|@WJY8GUDJ+h9hBkRaIvW~3( zfdxzjx(_Tw4GY?B-}kM37B(SjSpDmIy?*@Yq>jtKYZs53a@OVR!;OmD55xL-6XFev zS^a~3^!8b^t|IGR6tiCZv%iKciG{4oKmOS}p5}NjMHvgW5B^z`P)X}_-PIl}5vFwA3J zd0|g-$2wYFf@QHlIAI@r*rSy$U3!h8Sx&P$iJ$tY_ut%1%8DmO%X*~mMGMl9=kAKcSbGsV|ebEXYm!>Jumw|ksp(SbsZ&E%MMLy7aMl{K#`nF6@Rm{Z@kW?|Fw zx?sY!dx`RwG+PO@2s4I{ASU`s^?#8ZAEOZ@5i^BbP zFr6Ecqy;&P3Wo~YI!9M18TYc1G{Nr0HcyvkiK z@*H7jF5`Po%Dpd)j!(;lt~-~on5|ZvwgTNm(@j31^2!kd1diwx@J?%0+L~HS8F^`ejg3d6F|qC zs=IBvcUtD`fLO%>VlH=-#SK(?=MKZp6 { -// if (item.value === val) { -// vals=item.name -// return true -// } -// } -// ) -// -// return vals -// } +function setcategorylist(val){ + let vals="" + categorylist.some((item,key)=> { + if (item.name === val) { + vals=item.value + return true + } + } + ) + + return vals +} @@ -214,7 +214,7 @@ class PackageConcent extends Component {
    - +
    diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index bec37a59a..c9fdebc05 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -252,7 +252,7 @@ class PackageIndexNEITaskDetails extends Component { '} className={"fl"}> {/*{this.props.current_user.username}*/} - 众包创新 + 众包创新 {data&&data.title} @@ -281,7 +281,7 @@ class PackageIndexNEITaskDetails extends Component {
    + src={data&&data.creator.image_url} width="70"/>
    {data&&data.creator.name} @@ -291,8 +291,8 @@ class PackageIndexNEITaskDetails extends Component { onMouseOver={this.setover} onMouseOut={this.setout} > - {overtype===false? 头像联系TA: - 头像 头像联系TA: + 头像联系TA}
    }
    @@ -403,9 +403,9 @@ class PackageIndexNEITaskDetails extends Component { return(
    {item.status==="bidding_won"?:""} - +

    {item.name}

    - {this.props.current_user&&this.props.current_user.login!=item.login? + {this.props.current_user&&this.props.current_user.login!=item.login? 头像联系TA :""}
    @@ -451,7 +451,7 @@ class PackageIndexNEITaskDetails extends Component { return(
    this.Clickteacher2(item.id)} key={key}> {item.bool===true?:} - +

    {item.name}

    ) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index adde77b64..335f9d27e 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -709,7 +709,7 @@ class PackageIndexNEIBannerConcent extends Component {
    - +

    @@ -724,7 +724,7 @@ class PackageIndexNEIBannerConcent extends Component { {this.state.categorytypes===true?

    请选择类型
    :""}
    - +
    - +

    竞标截止: @@ -833,14 +833,14 @@ class PackageIndexNEIBannerConcent extends Component { {this.state.minmaxtype===true?

    最高费用不能小于最低费用
    :""}

    - +

    姓名: this.onChangeContact_name(e)} /> diff --git a/public/react/src/modules/projectPackages/packageconcnet.css b/public/react/src/modules/projectPackages/packageconcnet.css index 498da9214..74119e2b4 100644 --- a/public/react/src/modules/projectPackages/packageconcnet.css +++ b/public/react/src/modules/projectPackages/packageconcnet.css @@ -344,3 +344,17 @@ color: #4CACFF!important } +.ant-form-item-requireds::before { + display: inline-block; + margin-right: 4px; + color: #f5222d; + font-size: 14px; + font-family: SimSun,sans-serif; + line-height: 1; + content: '*'; +} + +*, *::before, *::after { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} \ No newline at end of file From 1b41c1c00b20debd7d98bfb0004257a6fe6e0909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 14:46:17 +0800 Subject: [PATCH 063/117] b --- .../projectPackages/PackageIndex/PackageConcent.js | 1 + .../PackageIndexNEITaskDetails.js | 2 +- .../PackageIndexNEIBannerConcent.js | 14 +++++++------- public/react/src/modules/tpm/NewHeader.js | 3 ++- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js index 7875c5c46..cfc54bb98 100644 --- a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js @@ -14,6 +14,7 @@ let categorylist=[ {name:"数据库",value:"database"}, {name:"云计算和大数据",value:"cloud_compute_and_big_data"}, {name:"人工智能",value:"ai"}, + {name:"运维与测试",value:"devops_and_test"}, {name:"其他",value:"other"}, ] // diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index c9fdebc05..4788a7dc1 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -252,7 +252,7 @@ class PackageIndexNEITaskDetails extends Component { '} className={"fl"}> {/*{this.props.current_user.username}*/} - 众包创新 + 众包创新 {data&&data.title} diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index 335f9d27e..c9d49e542 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -407,7 +407,7 @@ class PackageIndexNEIBannerConcent extends Component { // } - if(modalCancel===true||this.props.current_user.phone===null){ + if(this.props.current_user&&this.props.current_user.phone===null||modalCancel===true){ if(contact_phone===undefined||contact_phone===null||contact_phone===""){ this.setState({ contact_phonetype:true @@ -445,7 +445,7 @@ class PackageIndexNEIBannerConcent extends Component { min_price:parseInt(min_price), max_price:parseInt(max_price), contact_name: contact_name===null||contact_name===undefined?this.props.current_user.username:contact_name, - contact_phone: contact_phone===undefined?this.props.current_user.phone:contact_phone, + contact_phone: contact_phone===undefined?this.props.current_user&&this.props.current_user.phone:contact_phone, code:code, publish:types } @@ -493,7 +493,7 @@ class PackageIndexNEIBannerConcent extends Component { min_price:parseInt(min_price), max_price:parseInt(max_price), contact_name: contact_name===null||contact_name===undefined?this.props.current_user.username:contact_name, - contact_phone: contact_phone===undefined?this.props.current_user.phone:contact_phone, + contact_phone: contact_phone===undefined?this.props.current_user&&this.props.current_user.phone:contact_phone, code:code, publish:types } @@ -629,7 +629,7 @@ class PackageIndexNEIBannerConcent extends Component { // }) // } // } - if(modalCancel===true||this.props.current_user.phone===null){ + if(this.props.current_user&&this.props.current_user.phone===null||modalCancel===true){ if(e.target.value===undefined||e.target.value===null||e.target.value===""){ this.setState({ contact_phonetype:true @@ -847,12 +847,12 @@ class PackageIndexNEIBannerConcent extends Component { {this.state.contact_nametype===true?

    不能为空
    :""}

    - {modalCancel===false&&this.props.current_user.phone!=null?

    + {this.props.current_user&&this.props.current_user.phone!=null&&modalCancel===false?

    手机号: @@ -861,7 +861,7 @@ class PackageIndexNEIBannerConcent extends Component {

    :""} {/*{this.state.current_userphonetype===true?
    不能为空
    :""}*/} - {modalCancel===true||this.props.current_user.phone===null?

    + {this.props.current_user&&this.props.current_user.phone===null||modalCancel===true?

    {/*未注册才显示!*/} diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 23330e779..1798bfca8 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -718,7 +718,7 @@ submittojoinclass=(value)=>{

  • 教学案例
  • 众包创新
  • 交流问答
  • {
  • 我的实训
  • 我的实践课程
  • 我的项目
  • +
  • 我的众包
  • 账号管理
  • {/*
  • this.educoderlogin()} >登入测试接口
  • */} {/*
  • this.trialapplications()} >试用申请
  • */} From 263a809e78f941bbb091b314d432ea42621ff108 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Jul 2019 14:52:59 +0800 Subject: [PATCH 064/117] fix create project package api bug --- app/services/project_packages/save_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/project_packages/save_service.rb b/app/services/project_packages/save_service.rb index bcfc19a10..caf4cf6c7 100644 --- a/app/services/project_packages/save_service.rb +++ b/app/services/project_packages/save_service.rb @@ -15,7 +15,7 @@ class ProjectPackages::SaveService < ApplicationService is_create = package.new_record? raise Error, '类型不存在' unless ProjectPackageCategory.where(id: params[:category_id]).exists? - params[:project_package_category_id] = params[:category_id].to_i + params[:project_package_category_id] = params.delete(:category_id).to_i raise Error, '竞标截止时间不能小于当前时间' if params[:deadline_at].present? && params[:deadline_at].to_time < Time.now From c90358cdfaa96f47674c751823430288e2a17124 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Jul 2019 14:57:25 +0800 Subject: [PATCH 065/117] private message feature apis --- app/controllers/concerns/paginate_helper.rb | 2 +- app/controllers/users/base_controller.rb | 17 +++++++- .../private_message_details_controller.rb | 23 +++++++++++ .../users/private_messages_controller.rb | 39 +++++++++++++++++++ .../users/recent_contacts_controller.rb | 8 ++++ .../users/unread_message_infos_controller.rb | 12 ++++++ .../users_for_private_messages_controller.rb | 17 ++++++++ app/decorators/private_message_decorator.rb | 9 +++++ app/models/private_message.rb | 6 +++ app/models/user.rb | 3 +- .../private_messages/create_service.rb | 35 +++++++++++++++++ .../show.json.jbuilder | 11 ++++++ .../private_messages/create.json.jbuilder | 10 +++++ .../private_messages/index.json.jbuilder | 13 +++++++ .../users/recent_contacts/index.json.jbuilder | 2 + .../index.json.jbuilder | 2 + config/routes.rb | 6 +++ 17 files changed, 211 insertions(+), 4 deletions(-) create mode 100644 app/controllers/users/private_message_details_controller.rb create mode 100644 app/controllers/users/private_messages_controller.rb create mode 100644 app/controllers/users/recent_contacts_controller.rb create mode 100644 app/controllers/users/unread_message_infos_controller.rb create mode 100644 app/controllers/users_for_private_messages_controller.rb create mode 100644 app/decorators/private_message_decorator.rb create mode 100644 app/services/private_messages/create_service.rb create mode 100644 app/views/users/private_message_details/show.json.jbuilder create mode 100644 app/views/users/private_messages/create.json.jbuilder create mode 100644 app/views/users/private_messages/index.json.jbuilder create mode 100644 app/views/users/recent_contacts/index.json.jbuilder create mode 100644 app/views/users_for_private_messages/index.json.jbuilder diff --git a/app/controllers/concerns/paginate_helper.rb b/app/controllers/concerns/paginate_helper.rb index 34740eb5d..bbe84a348 100644 --- a/app/controllers/concerns/paginate_helper.rb +++ b/app/controllers/concerns/paginate_helper.rb @@ -1,7 +1,7 @@ module PaginateHelper def paginate(objs, **opts) page = params[:page].to_i <= 0 ? 1 : params[:page].to_i - per_page = params[:per_page].to_i > 0 ? params[:per_page].to_i : opts[:per_page] || 20 + per_page = params[:per_page].to_i > 0 && params[:per_page].to_i < 50 ? params[:per_page].to_i : opts[:per_page] || 20 Kaminari.paginate_array(objs).page(page).per(per_page) end diff --git a/app/controllers/users/base_controller.rb b/app/controllers/users/base_controller.rb index afc03ee13..fd138a182 100644 --- a/app/controllers/users/base_controller.rb +++ b/app/controllers/users/base_controller.rb @@ -26,9 +26,22 @@ class Users::BaseController < ApplicationController render_forbidden end + def page_value + params[:page].to_i <= 0 ? 1 : params[:page].to_i + end + + def per_page_value + params[:per_page].to_i > 0 && params[:per_page].to_i < 50 ? params[:per_page].to_i : 20 + end + alias_method :limit_value, :per_page_value + + def offset_value + (page_value - 1) * limit_value + end + def paginate(objs, **opts) - page = params[:page].to_i <= 0 ? 1 : params[:page].to_i - per_page = params[:per_page].to_i > 0 ? params[:per_page].to_i : 20 + page = page_value + per_page = per_page_value return Kaminari.paginate_array(objs).page(page).per(per_page) unless observed_logged_user? && opts[:special] diff --git a/app/controllers/users/private_message_details_controller.rb b/app/controllers/users/private_message_details_controller.rb new file mode 100644 index 000000000..486d23d7f --- /dev/null +++ b/app/controllers/users/private_message_details_controller.rb @@ -0,0 +1,23 @@ +class Users::PrivateMessageDetailsController < Users::BaseController + before_action :private_user_resources! + + after_action :update_message_status, only: [:show] + + def show + messages = observed_user.private_messages.without_deleted.where(target: target_user) + + @count = messages.count + @messages = messages.order(send_time: :asc).includes(sender: :user_extension) + end + + private + + def target_user + @_target_user ||= User.find(params[:target_id]) + end + + # 置为已读 + def update_message_status + observed_user.private_messages.only_unread.where(target: target_user).update_all(status: 1) + end +end \ No newline at end of file diff --git a/app/controllers/users/private_messages_controller.rb b/app/controllers/users/private_messages_controller.rb new file mode 100644 index 000000000..b80b6152b --- /dev/null +++ b/app/controllers/users/private_messages_controller.rb @@ -0,0 +1,39 @@ +class Users::PrivateMessagesController < Users::BaseController + before_action :private_user_resources! + after_action :update_onclick_time!, only: [:index] + + def index + @count = observed_user.private_messages.without_deleted.group(:target_id).count.count + + subquery = observed_user.private_messages.without_deleted.order(send_time: :desc).to_sql + query = "SELECT subquery.*, COUNT(*) message_count FROM (#{subquery}) subquery "\ + "GROUP BY subquery.target_id ORDER BY subquery.send_time desc LIMIT #{limit_value} OFFSET #{offset_value}" + @messages = PrivateMessage.select('*').from("(#{query}) AS query").includes(target: :user_extension) + end + + def create + receiver = User.find_by(id: params[:target_id]) + return render_error('用户未找到') if receiver.blank? + + @message = PrivateMessages::CreateService.call(observed_user, receiver, create_params) + rescue PrivateMessages::CreateService::Error => ex + render_error(ex.message) + end + + def destroy + message = observed_user.private_messages.without_deleted.find(params[:id]) + message.destroy! + + render_ok + end + + private + + def update_onclick_time! + current_user.onclick_time.touch(:onclick_time) + end + + def create_params + params.permit(:content) + end +end \ No newline at end of file diff --git a/app/controllers/users/recent_contacts_controller.rb b/app/controllers/users/recent_contacts_controller.rb new file mode 100644 index 000000000..bc4b8ea8f --- /dev/null +++ b/app/controllers/users/recent_contacts_controller.rb @@ -0,0 +1,8 @@ +class Users::RecentContactsController < Users::BaseController + before_action :private_user_resources! + + def index + contacts = observed_user.recent_contacts.distinct + @contacts = contacts.order('private_messages.created_at DESC').limit(10).includes(:user_extension) + end +end \ No newline at end of file diff --git a/app/controllers/users/unread_message_infos_controller.rb b/app/controllers/users/unread_message_infos_controller.rb new file mode 100644 index 000000000..7abd36304 --- /dev/null +++ b/app/controllers/users/unread_message_infos_controller.rb @@ -0,0 +1,12 @@ +class Users::UnreadMessageInfosController < Users::BaseController + before_action :private_user_resources! + + def show + click_time = observed_user.click_time + + unread_tiding_count = observed_user.tidings.where('created_at > ?', click_time).count + unread_message_count = observed_user.private_messages.only_unread.group(:target_id).count.count + + render_ok(unread_tiding_count: unread_tiding_count, unread_message_count: unread_message_count) + end +end \ No newline at end of file diff --git a/app/controllers/users_for_private_messages_controller.rb b/app/controllers/users_for_private_messages_controller.rb new file mode 100644 index 000000000..bbd5682a1 --- /dev/null +++ b/app/controllers/users_for_private_messages_controller.rb @@ -0,0 +1,17 @@ +class UsersForPrivateMessagesController < ApplicationController + before_action :require_login, :check_auth + + def index + users = User.active.where.not(id: current_user.id) + + keyword = params[:keyword].to_s.strip + if keyword.blank? + @users = [] + return + end + + users = users.where('LOWER(concat(lastname, firstname, nickname)) LIKE ?', "%#{keyword}%") + + @users = users.limit(10).includes(:user_extension) + end +end \ No newline at end of file diff --git a/app/decorators/private_message_decorator.rb b/app/decorators/private_message_decorator.rb new file mode 100644 index 000000000..6db17acf3 --- /dev/null +++ b/app/decorators/private_message_decorator.rb @@ -0,0 +1,9 @@ +module PrivateMessageDecorator + extend ApplicationDecorator + + display_time_method :send_time + + def unread? + status.zero? + end +end \ No newline at end of file diff --git a/app/models/private_message.rb b/app/models/private_message.rb index 1db4c9f66..640e48db7 100644 --- a/app/models/private_message.rb +++ b/app/models/private_message.rb @@ -1,3 +1,9 @@ class PrivateMessage < ApplicationRecord belongs_to :user + belongs_to :target, class_name: "User" + belongs_to :sender, class_name: "User" + belongs_to :receiver, class_name: "User" + + scope :without_deleted, -> { where.not(status: 2) } + scope :only_unread, -> { where(status: 0) } end diff --git a/app/models/user.rb b/app/models/user.rb index 14d7b2697..ed9d70c00 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -54,7 +54,8 @@ class User < ApplicationRecord has_one :onclick_time, :dependent => :destroy # 新版私信 - has_many :private_messages, :dependent => :destroy + has_many :private_messages, dependent: :destroy + has_many :recent_contacts, through: :private_messages, source: :target has_many :tidings, :dependent => :destroy has_many :games, :dependent => :destroy diff --git a/app/services/private_messages/create_service.rb b/app/services/private_messages/create_service.rb new file mode 100644 index 000000000..560f1a540 --- /dev/null +++ b/app/services/private_messages/create_service.rb @@ -0,0 +1,35 @@ +class PrivateMessages::CreateService < ApplicationService + Error = Class.new(StandardError) + + attr_reader :sender, :receiver, :params + + def initialize(sender, receiver, **params) + @sender = sender + @receiver = receiver + @params = params + end + + def call + validate! + + same_attr = { sender: sender, receiver: receiver, content: content, send_time: Time.now } + + message = nil + ActiveRecord::Base.transaction do + message = sender.private_messages.create!(same_attr.merge(target: receiver, status: 1)) + receiver.private_messages.create!(same_attr.merge(target: sender, status: 0)) + end + message + end + + private + + def content + @_content ||= params[:content].to_s.strip + end + + def validate! + raise Error, '内容不能为空' if content.blank? + raise Error, '内容太长' if content.size > 255 + end +end \ No newline at end of file diff --git a/app/views/users/private_message_details/show.json.jbuilder b/app/views/users/private_message_details/show.json.jbuilder new file mode 100644 index 000000000..065767fb4 --- /dev/null +++ b/app/views/users/private_message_details/show.json.jbuilder @@ -0,0 +1,11 @@ +json.count @count +json.messages do + json.array! @messages.each do |message| + json.extract! message, :id, :user_id, :receiver_id, :sender_id, :content + + json.send_time message.display_send_time + json.sender do + json.partial! 'users/user_simple', user: message.sender + end + end +end \ No newline at end of file diff --git a/app/views/users/private_messages/create.json.jbuilder b/app/views/users/private_messages/create.json.jbuilder new file mode 100644 index 000000000..888cfeff6 --- /dev/null +++ b/app/views/users/private_messages/create.json.jbuilder @@ -0,0 +1,10 @@ +json.status 0 +json.message 'success' +json.private_message do + json.extract! @message, :id, :user_id, :receiver_id, :sender_id, :content + + json.send_time @message.display_send_time + json.sender do + json.partial! 'users/user_simple', user: @message.sender + end +end \ No newline at end of file diff --git a/app/views/users/private_messages/index.json.jbuilder b/app/views/users/private_messages/index.json.jbuilder new file mode 100644 index 000000000..c18a7d209 --- /dev/null +++ b/app/views/users/private_messages/index.json.jbuilder @@ -0,0 +1,13 @@ +json.count @count +json.private_messages do + json.array! @messages.each do |message| + json.extract! message, :id, :content, :message_count + + json.unread message.unread? + json.send_time message.display_send_time + + json.target do + json.partial! 'users/user_simple', user: message.target + end + end +end \ No newline at end of file diff --git a/app/views/users/recent_contacts/index.json.jbuilder b/app/views/users/recent_contacts/index.json.jbuilder new file mode 100644 index 000000000..f2f7f025a --- /dev/null +++ b/app/views/users/recent_contacts/index.json.jbuilder @@ -0,0 +1,2 @@ +json.users @contacts, partial: 'users/user_simple', as: :user +json.count @contacts.size \ No newline at end of file diff --git a/app/views/users_for_private_messages/index.json.jbuilder b/app/views/users_for_private_messages/index.json.jbuilder new file mode 100644 index 000000000..be040e368 --- /dev/null +++ b/app/views/users_for_private_messages/index.json.jbuilder @@ -0,0 +1,2 @@ +json.users @users, partial: 'users/user_simple', as: :user +json.count @users.size \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 6623edd99..2f9eed61b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -53,6 +53,11 @@ Rails.application.routes.draw do resource :grade_records, only: [:show] resource :watch, only: [:create, :destroy] resources :project_packages, only: [:index] + # 私信 + resources :private_messages, only: [:index, :create, :destroy] + resources :recent_contacts, only: [:index] + resource :private_message_details, only: [:show] + resource :unread_message_info, only: [:show] end @@ -91,6 +96,7 @@ Rails.application.routes.draw do end end end + resources :users_for_private_messages, only: [:index] resources :myshixuns, param: :identifier, shallow: true do member do From 1cb74baff7c2cc16a17e9055aa14f22f2de81205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 15:01:05 +0800 Subject: [PATCH 066/117] b --- .../PackageIndexNEIBannerConcent.js | 4 +- public/react/src/modules/tpm/NewHeader.js | 2 +- .../react/src/modules/user/usersInfo/Infos.js | 27 ++- .../modules/user/usersInfo/InfosPackage.js | 197 ++++++++++++++++++ 4 files changed, 225 insertions(+), 5 deletions(-) create mode 100644 public/react/src/modules/user/usersInfo/InfosPackage.js diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index c9d49e542..e4926e02c 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -69,7 +69,7 @@ class PackageIndexNEIBannerConcent extends Component { componentDidUpdate = (prevProps) => { if(prevProps.current_user.username!=this.props.current_user.username){ this.setState({ - contact_name:this.props.current_user.username + contact_name:this.props.current_user&&this.props.current_user.username }) } } @@ -100,7 +100,7 @@ class PackageIndexNEIBannerConcent extends Component { }) }else{ this.setState({ - contact_name:this.props.current_user.username + contact_name:this.props.current_user&&this.props.current_user.username }) } diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 1798bfca8..79b0aa443 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -816,7 +816,7 @@ submittojoinclass=(value)=>{
  • 我的实训
  • 我的实践课程
  • 我的项目
  • -
  • 我的众包
  • +
  • 我的众包
  • 账号管理
  • {/*
  • this.educoderlogin()} >登入测试接口
  • */} {/*
  • this.trialapplications()} >试用申请
  • */} diff --git a/public/react/src/modules/user/usersInfo/Infos.js b/public/react/src/modules/user/usersInfo/Infos.js index 3b58681da..5286c5797 100644 --- a/public/react/src/modules/user/usersInfo/Infos.js +++ b/public/react/src/modules/user/usersInfo/Infos.js @@ -17,6 +17,12 @@ import "../../courses/css/Courses.css" import Trialapplication from '../../login/Trialapplication' + +const InfosPackage = Loadable({ + loader: () => import('./InfosPackage'), + loading:Loading, +}) + const InfosCourse = Loadable({ loader: () => import('./InfosCourse'), loading:Loading, @@ -373,11 +379,17 @@ class Infos extends Component{ to={`/users/${username}/paths`}>实践课程
  • - this.setState({moduleName: 'projects'})} to={`/users/${username}/projects`}>项目
  • - + +
  • + this.setState({moduleName: 'package'})} + to={`/users/${username}/package`}>众包 +
  • + {/*{ data && data.identity!="学生" &&
  • 题库
  • }*/}
    @@ -389,6 +401,15 @@ class Infos extends Component{ {/* --------------------------------------------------------------------- */} + + {/* 众包 */} + {/* http://localhost:3007/courses/1309/homework/9300/setting */} + () + } + > + {/* 课堂 */} {/* http://localhost:3007/courses/1309/homework/9300/setting */} () } > + + () diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js new file mode 100644 index 000000000..8222c951b --- /dev/null +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -0,0 +1,197 @@ +import React, { Component } from 'react'; +import { SnackbarHOC } from 'educoder'; +import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; +import {Tooltip,Menu,Pagination,Spin} from 'antd'; +import Loadable from 'react-loadable'; +import Loading from '../../../Loading'; +import axios from 'axios'; +import NoneData from '../../courses/coursesPublic/NoneData' +import {getImageUrl} from 'educoder'; +import { TPMIndexHOC } from '../../tpm/TPMIndexHOC'; +import { CNotificationHOC } from '../../courses/common/CNotificationHOC' +import "./usersInfo.css" +import Create from './publicCreatNew' + +class InfosCourse extends Component{ + constructor(props){ + super(props); + this.state={ + category:undefined, + status:undefined, + page:1, + per_page:16, + + totalCount:undefined, + data:undefined, + isSpin:false + } + } + + componentDidMount=()=>{ + this.setState({ + isSpin:true + }) + let{category,status,page}=this.state; + this.getCourses(category,status,page); + } + + getCourses=(category,status,page)=>{ + let url=`/users/${this.props.match.params.username}/courses.json`; + axios.get((url),{params:{ + category, + status, + page, + per_page: this.props.is_current && category && page ==1?17:16 + }}).then((result)=>{ + if(result){ + this.setState({ + totalCount:result.data.count, + data:result.data, + isSpin:false + }) + } + }).catch((error)=>{ + console.log(error); + }) + } + + //切换种类 + changeCategory=(cate)=>{ + this.setState({ + category:cate, + page:1, + isSpin:true + }) + let{status}=this.state; + this.getCourses(cate,status,1); + } + //切换状态 + changeStatus=(status)=>{ + this.setState({ + status:status, + page:1, + isSpin:true + }) + let{category}=this.state; + this.getCourses(category,status,1); + } + //切换页数 + changePage=(page)=>{ + this.setState({ + page, + isSpin:true + }) + let{category,status}=this.state; + this.getCourses(category,status,page); + } + + // 进入课堂 + turnToCourses=(url,flag)=>{ + if(flag){ + this.props.history.push(url); + } + } + + render(){ + let{ + category, + status, + page, + data, + totalCount, + isSpin + } = this.state; + let is_current=this.props.is_current; + + console.log(this.props.current_user&&this.props.current_user.user_identity==="学生") + return( +
    + + + +

    + 共{totalCount}个 + 发布时间 +

    +
    + { + page == 1 && is_current && + this.props.current_user && this.props.current_user.user_identity != "学生" ? : "" + } + { + (!data || data.courses.length==0) && (!is_current || (this.props.current_user && this.props.current_user.user_identity === "学生" )) && + } + { + data && data.courses && data.courses.map((item,key)=>{ + return( +
    this.turnToCourses(`${item.first_category_url}`,item.can_visited)} style={{"cursor": "pointer"}}> + { + item.is_public == 1 && + +
    + + 公开 +
    + } + { + item.can_visited ==false? +
    + +

    非成员不能访问

    +
    :"" + } + +
    +

    + {item.name} +

    + 用户 +

    {item.teacher && item.teacher.real_name}

    +

    {item.teacher && item.teacher.school_name}

    +
    +
    +
    + { + item.members_count > 0 && + + + {item.members_count} + + } + { + item.homework_commons_count > 0 && + + + {item.homework_commons_count} + + } + { + item.attachments_count > 0 && + + + {item.attachments_count} + + } +
    +
    +
    + ) + }) + } +
    + { + totalCount > 15 && +
    + +
    + } +
    +
    + ) + } +} +export default InfosCourse; \ No newline at end of file From d959a2ea9c7cd6a439584b296df21d2f7661747a Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Jul 2019 15:07:30 +0800 Subject: [PATCH 067/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/javascripts/forums.js | 2 ++ app/assets/javascripts/memos.js | 2 ++ app/assets/stylesheets/forums.scss | 3 +++ app/controllers/forums_controller.rb | 2 ++ app/helpers/export_helper.rb | 2 +- app/helpers/forums_helper.rb | 2 ++ app/models/forum.rb | 2 ++ db/migrate/20190730070155_create_forums.rb | 8 ++++++++ spec/controllers/forums_controller_spec.rb | 5 +++++ spec/helpers/forums_helper_spec.rb | 15 +++++++++++++++ spec/models/forum_spec.rb | 5 +++++ 11 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/forums.js create mode 100644 app/assets/javascripts/memos.js create mode 100644 app/assets/stylesheets/forums.scss create mode 100644 app/controllers/forums_controller.rb create mode 100644 app/helpers/forums_helper.rb create mode 100644 app/models/forum.rb create mode 100644 db/migrate/20190730070155_create_forums.rb create mode 100644 spec/controllers/forums_controller_spec.rb create mode 100644 spec/helpers/forums_helper_spec.rb create mode 100644 spec/models/forum_spec.rb diff --git a/app/assets/javascripts/forums.js b/app/assets/javascripts/forums.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/forums.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/memos.js b/app/assets/javascripts/memos.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/memos.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/forums.scss b/app/assets/stylesheets/forums.scss new file mode 100644 index 000000000..fafd631e1 --- /dev/null +++ b/app/assets/stylesheets/forums.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the forums controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/forums_controller.rb b/app/controllers/forums_controller.rb new file mode 100644 index 000000000..82573fdd0 --- /dev/null +++ b/app/controllers/forums_controller.rb @@ -0,0 +1,2 @@ +class ForumsController < ApplicationController +end diff --git a/app/helpers/export_helper.rb b/app/helpers/export_helper.rb index 6af88de33..5d36c465f 100644 --- a/app/helpers/export_helper.rb +++ b/app/helpers/export_helper.rb @@ -497,7 +497,7 @@ module ExportHelper def make_zip_name(work, file_name="") Rails.logger.info("######################file_name: #{file_name}") # name = file_name === "" ? "" : (file_name[0, file_name.rindex('.')]+"_") - "#{work&.user&.student_id}_#{work.&user.&real_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + "#{work&.user&.student_id}_#{work&.user&.real_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" end def zipping(zip_name_refer, files_paths, output_path, is_attachment=false, not_exist_file=[]) diff --git a/app/helpers/forums_helper.rb b/app/helpers/forums_helper.rb new file mode 100644 index 000000000..2e531fd46 --- /dev/null +++ b/app/helpers/forums_helper.rb @@ -0,0 +1,2 @@ +module ForumsHelper +end diff --git a/app/models/forum.rb b/app/models/forum.rb new file mode 100644 index 000000000..88aafa676 --- /dev/null +++ b/app/models/forum.rb @@ -0,0 +1,2 @@ +class Forum < ApplicationRecord +end diff --git a/db/migrate/20190730070155_create_forums.rb b/db/migrate/20190730070155_create_forums.rb new file mode 100644 index 000000000..f1f6eb96a --- /dev/null +++ b/db/migrate/20190730070155_create_forums.rb @@ -0,0 +1,8 @@ +class CreateForums < ActiveRecord::Migration[5.2] + def change + create_table :forums do |t| + + t.timestamps + end + end +end diff --git a/spec/controllers/forums_controller_spec.rb b/spec/controllers/forums_controller_spec.rb new file mode 100644 index 000000000..a4143d232 --- /dev/null +++ b/spec/controllers/forums_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe ForumsController, type: :controller do + +end diff --git a/spec/helpers/forums_helper_spec.rb b/spec/helpers/forums_helper_spec.rb new file mode 100644 index 000000000..46766dbff --- /dev/null +++ b/spec/helpers/forums_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the ForumsHelper. For example: +# +# describe ForumsHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe ForumsHelper, type: :helper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/forum_spec.rb b/spec/models/forum_spec.rb new file mode 100644 index 000000000..56c246346 --- /dev/null +++ b/spec/models/forum_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Forum, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From 60137fc05aeb5b30008f19890dd000fd5b779e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 15:08:07 +0800 Subject: [PATCH 068/117] b --- public/react/src/App.js | 2 +- .../projectPackages/PackageIndex/PackageConcent.js | 4 ++-- .../PackageIndexNEITaskDetails.js | 6 +++--- .../PackageIndexNEIBannerConcent.js | 4 ++-- .../PackageIndexNewandEdit/PackageIndexNEISubmit.js | 4 ++-- .../src/modules/projectPackages/ProjectPackageIndex.js | 8 ++++---- public/react/src/modules/user/usersInfo/InfosPackage.js | 6 ------ 7 files changed, 14 insertions(+), 20 deletions(-) diff --git a/public/react/src/App.js b/public/react/src/App.js index e713cd0fd..6d1e2a521 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -304,7 +304,7 @@ class App extends Component { {/**/} {/*众包创新*/} - + {/*认证*/} diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js index cfc54bb98..921c3e555 100644 --- a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js @@ -158,7 +158,7 @@ class PackageConcent extends Component { enterButton={ 搜索} onSearch={ (value)=>this.setdatafuns(value)} />

    @@ -224,7 +224,7 @@ class PackageConcent extends Component { diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 4788a7dc1..bcd46dbb0 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -230,7 +230,7 @@ class PackageIndexNEITaskDetails extends Component { } goback = () => { // window.history.go(-1) - window.location.href="/crowdsourcings"; + window.location.href="/crowdsourcing"; } render() { @@ -252,7 +252,7 @@ class PackageIndexNEITaskDetails extends Component { '} className={"fl"}> {/*{this.props.current_user.username}*/} - 众包创新 + 众包创新 {data&&data.title} @@ -352,7 +352,7 @@ class PackageIndexNEITaskDetails extends Component { 需求详情: {data&&data.status==="pending"&&data&&data.operation.can_select_bidding_user===true?:""} diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index e4926e02c..3caedebde 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -454,7 +454,7 @@ class PackageIndexNEIBannerConcent extends Component { if(type===true){ this.props.setPublicationfun(response.data.id) }else{ - window.location.href="/crowdsourcings/"+response.data.id + window.location.href="/crowdsourcing/"+response.data.id } this.setState({ springtype:false @@ -502,7 +502,7 @@ class PackageIndexNEIBannerConcent extends Component { if(type===true){ this.props.setPublicationfun(response.data.id) }else{ - window.location.href="/crowdsourcings/"+response.data.id + window.location.href="/crowdsourcing/"+response.data.id } this.setState({ springtype:false diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js index a64e222e4..9f287e90e 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js @@ -14,10 +14,10 @@ class PackageIndexNEISubmit extends Component { } setageload=(sum)=>{ if(sum===undefined){ - window.location.href="/crowdsourcings/new" + window.location.href="/crowdsourcing/new" }else{ // this.props.history.push("/project_packages/"+sum) - window.location.href="/crowdsourcings/"+sum + window.location.href="/crowdsourcing/"+sum } } diff --git a/public/react/src/modules/projectPackages/ProjectPackageIndex.js b/public/react/src/modules/projectPackages/ProjectPackageIndex.js index 6f2e32b8b..097e012e0 100644 --- a/public/react/src/modules/projectPackages/ProjectPackageIndex.js +++ b/public/react/src/modules/projectPackages/ProjectPackageIndex.js @@ -43,25 +43,25 @@ class ProjectPackageIndex extends Component { {/*众包首页*/} - () } > - () } > - () } > - () } diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js index 8222c951b..135f9f52e 100644 --- a/public/react/src/modules/user/usersInfo/InfosPackage.js +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -183,12 +183,6 @@ class InfosCourse extends Component{ }) }
    - { - totalCount > 15 && -
    - -
    - }
    ) From 6440bfabe266acca359c4a7143393e70d3054e49 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Jul 2019 15:15:17 +0800 Subject: [PATCH 069/117] fix create project package api --- app/services/project_packages/save_service.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/services/project_packages/save_service.rb b/app/services/project_packages/save_service.rb index caf4cf6c7..a876f56b3 100644 --- a/app/services/project_packages/save_service.rb +++ b/app/services/project_packages/save_service.rb @@ -25,7 +25,9 @@ class ProjectPackages::SaveService < ApplicationService end ActiveRecord::Base.transaction do - package.assign_attributes(params) + columns = %i[project_package_category_id title content deadline_at + min_price max_price contact_name contact_phone] + package.assign_attributes(params.slice(*columns)) package.save! # 处理附件 From 0cce3471436edac605a17663bca16e972d541fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 15:20:52 +0800 Subject: [PATCH 070/117] b --- .../PackageIndexNEITaskDetails.js | 8 ++++---- .../PackageIndexNEIBannerConcent.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index bcd46dbb0..dd1e176e4 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -2,7 +2,7 @@ import React, {Component} from 'react'; import {Link} from "react-router-dom"; import axios from 'axios'; import { Input ,Icon,Button,Pagination,DatePicker,Breadcrumb} from 'antd'; -import { handleDateString,markdownToHTML,bytesToSize} from 'educoder'; +import { handleDateString,markdownToHTML,bytesToSize,getImageUrl} from 'educoder'; import NEITaskDetailsModel from './NEITaskDetailsModel'; import moment from 'moment'; import '../packageconcnet.css'; @@ -281,7 +281,7 @@ class PackageIndexNEITaskDetails extends Component {
    + src={getImageUrl("images/"+data&&data.creator.image_url)} width="70"/>
    {data&&data.creator.name} @@ -403,7 +403,7 @@ class PackageIndexNEITaskDetails extends Component { return(
    {item.status==="bidding_won"?:""} - +

    {item.name}

    {this.props.current_user&&this.props.current_user.login!=item.login? 头像联系TA @@ -451,7 +451,7 @@ class PackageIndexNEITaskDetails extends Component { return( ) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index 3caedebde..04a8c9c4a 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -67,7 +67,7 @@ class PackageIndexNEIBannerConcent extends Component { } } componentDidUpdate = (prevProps) => { - if(prevProps.current_user.username!=this.props.current_user.username){ + if(prevProps.current_user.username!=this.props.current_user&&this.props.current_user.username){ this.setState({ contact_name:this.props.current_user&&this.props.current_user.username }) From f6fe2f0ed20f47ea2176d30f5386ca4d1cab8b47 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 30 Jul 2019 15:24:48 +0800 Subject: [PATCH 071/117] top --- .../src/modules/courses/busyWork/CommonWorkDetailIndex.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index a690fedc0..2d3361492 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -305,9 +305,6 @@ class CommonWorkDetailIndex extends Component{ .floatSpinParent .ant-spin-nested-loading { float: right; } - .floatSpinParent .ant-spin-nested-loading .ant-spin-spinning{ - top: 10px; - } `} {this.props.isAdmin()?
  • From 578f2ab200a4cd135c85ffb17e073cb15b288eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 15:28:18 +0800 Subject: [PATCH 072/117] b --- .../PackageIndexNEIBannerConcent.js | 14 ++--- .../modules/user/usersInfo/InfosPackage.js | 58 +------------------ 2 files changed, 8 insertions(+), 64 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index 04a8c9c4a..8db157a65 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -66,13 +66,13 @@ class PackageIndexNEIBannerConcent extends Component { categories:[] } } - componentDidUpdate = (prevProps) => { - if(prevProps.current_user.username!=this.props.current_user&&this.props.current_user.username){ - this.setState({ - contact_name:this.props.current_user&&this.props.current_user.username - }) - } - } + // componentDidUpdate = (prevProps) => { + // if(this.props.current_user&&this.props.current_user.username!=prevProps.current_user&&prevProps.current_user.username){ + // this.setState({ + // contact_name:this.props.current_user&&this.props.current_user.username + // }) + // } + // } componentDidMount() { window.document.title = '众包创新' diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js index 135f9f52e..ad1a38964 100644 --- a/public/react/src/modules/user/usersInfo/InfosPackage.js +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -125,63 +125,7 @@ class InfosCourse extends Component{ { (!data || data.courses.length==0) && (!is_current || (this.props.current_user && this.props.current_user.user_identity === "学生" )) && } - { - data && data.courses && data.courses.map((item,key)=>{ - return( -
    this.turnToCourses(`${item.first_category_url}`,item.can_visited)} style={{"cursor": "pointer"}}> - { - item.is_public == 1 && - -
    - - 公开 -
    - } - { - item.can_visited ==false? -
    - -

    非成员不能访问

    -
    :"" - } - -
    -

    - {item.name} -

    - 用户 -

    {item.teacher && item.teacher.real_name}

    -

    {item.teacher && item.teacher.school_name}

    -
    -
    -
    - { - item.members_count > 0 && - - - {item.members_count} - - } - { - item.homework_commons_count > 0 && - - - {item.homework_commons_count} - - } - { - item.attachments_count > 0 && - - - {item.attachments_count} - - } -
    -
    -
    - ) - }) - } +
  • From fb55382dd131b90117eec2cc835e64f7c41089b4 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 30 Jul 2019 15:34:21 +0800 Subject: [PATCH 073/117] =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/concerns/git_helper.rb | 2 +- app/controllers/shixuns_controller.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/concerns/git_helper.rb b/app/controllers/concerns/git_helper.rb index d77e1c3f6..c0c68ee81 100644 --- a/app/controllers/concerns/git_helper.rb +++ b/app/controllers/concerns/git_helper.rb @@ -48,7 +48,7 @@ module GitHelper def project_fork(container, original_rep_path, username) raise Educoder::TipException.new("fork源路径为空,fork失败!") if original_rep_path.blank? # 将要生成的仓库名字 - new_repo_name = "#{username.try(:strip)}/#{container.try(:identifier)}#{ Time.now.strftime("%Y%m%d%H%M%S")}" + new_repo_name = "#{username.try(:strip)} /#{container.try(:identifier)}#{ Time.now.strftime("%Y%m%d%H%M%S")}" uid_logger("start fork container: repo_name is #{new_repo_name}") GitService.fork_repository(repo_path: original_rep_path, fork_repository_path: (new_repo_name + ".git")) container.update_attributes!(:repo_name => new_repo_name) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 6c3f34a60..26effd12e 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -714,6 +714,7 @@ class ShixunsController < ApplicationController end end rescue Exception => e + logger.info("shixun_exec error: #{e.message}") if e.message != "ActiveRecord::RecordInvalid" logger.error("##########project_fork error #{e.message}") @myshixun.destroy! From 8b5636734478aba6904c193136f771a338c516bf Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Jul 2019 15:36:14 +0800 Subject: [PATCH 074/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/memo.rb | 4 +++- db/migrate/20190730070155_create_forums.rb | 8 -------- 2 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 db/migrate/20190730070155_create_forums.rb diff --git a/app/models/memo.rb b/app/models/memo.rb index 610a7684d..4dc153c81 100644 --- a/app/models/memo.rb +++ b/app/models/memo.rb @@ -1,7 +1,9 @@ class Memo < ApplicationRecord include Searchable::Memo - has_many :memo_tag_repertoires, :dependent => :destroy + belongs_to :forum, touch: true + + has_many :memo_tag_repertoires, dependent: :destroy has_many :tag_repertoires, :through => :memo_tag_repertoires has_many :praise_tread, as: :praise_tread_object, dependent: :destroy diff --git a/db/migrate/20190730070155_create_forums.rb b/db/migrate/20190730070155_create_forums.rb deleted file mode 100644 index f1f6eb96a..000000000 --- a/db/migrate/20190730070155_create_forums.rb +++ /dev/null @@ -1,8 +0,0 @@ -class CreateForums < ActiveRecord::Migration[5.2] - def change - create_table :forums do |t| - - t.timestamps - end - end -end From a70fc2c8c9753b287fef9240f5a585984c113849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 15:36:17 +0800 Subject: [PATCH 075/117] b --- .../PackageIndexNEIBannerConcent.js | 17 ++++++++++------- .../src/modules/user/usersInfo/InfosPackage.js | 15 +++------------ 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index 8db157a65..eaacc9367 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -66,13 +66,7 @@ class PackageIndexNEIBannerConcent extends Component { categories:[] } } - // componentDidUpdate = (prevProps) => { - // if(this.props.current_user&&this.props.current_user.username!=prevProps.current_user&&prevProps.current_user.username){ - // this.setState({ - // contact_name:this.props.current_user&&this.props.current_user.username - // }) - // } - // } + componentDidMount() { window.document.title = '众包创新' @@ -99,6 +93,7 @@ class PackageIndexNEIBannerConcent extends Component { }) }else{ + console.log(this.props.current_user&&this.props.current_user.username) this.setState({ contact_name:this.props.current_user&&this.props.current_user.username }) @@ -121,6 +116,14 @@ class PackageIndexNEIBannerConcent extends Component { // this.contentMdRef.current.setValue("测试赋值") } + + // componentDidUpdate = (prevProps) => { + // if(this.props.current_user&&this.props.current_user.username!=prevProps.current_user&&prevProps.current_user.username){ + // this.setState({ + // contact_name:this.props.current_user&&this.props.current_user.username + // }) + // } + // } //获取验证码; getverificationcode =()=>{ // if (this.state.logins&&this.state.logins.length === 0) { diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js index ad1a38964..638b2ecd2 100644 --- a/public/react/src/modules/user/usersInfo/InfosPackage.js +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -110,23 +110,14 @@ class InfosCourse extends Component{

    - 共{totalCount}个 + 共{0}个 发布时间

    -
    - { - page == 1 && is_current && - this.props.current_user && this.props.current_user.user_identity != "学生" ? : "" - } - { - (!data || data.courses.length==0) && (!is_current || (this.props.current_user && this.props.current_user.user_identity === "学生" )) && - } - -
    +
    ) From 6e96556e1a662795f636ce989ebbd68d9f5a9a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 15:39:54 +0800 Subject: [PATCH 076/117] b --- .../PackageIndexNEIBannerConcent.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index eaacc9367..96980160b 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -117,13 +117,13 @@ class PackageIndexNEIBannerConcent extends Component { // this.contentMdRef.current.setValue("测试赋值") } - // componentDidUpdate = (prevProps) => { - // if(this.props.current_user&&this.props.current_user.username!=prevProps.current_user&&prevProps.current_user.username){ - // this.setState({ - // contact_name:this.props.current_user&&this.props.current_user.username - // }) - // } - // } + componentDidUpdate = (prevProps) => { + if(this.props.current_user&&this.props.current_user.username!=prevProps.current_user.username){ + this.setState({ + contact_name:this.props.current_user&&this.props.current_user.username + }) + } + } //获取验证码; getverificationcode =()=>{ // if (this.state.logins&&this.state.logins.length === 0) { From 6febcf56e3c4c5322983f81f11cba4037b268004 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 15:42:16 +0800 Subject: [PATCH 077/117] b --- .../PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index 96980160b..42a107444 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -859,7 +859,7 @@ class PackageIndexNEIBannerConcent extends Component { placeholder="请输入手机号" disabled={true} /> - + this.editmodels()}>

    :""} @@ -900,7 +900,7 @@ class PackageIndexNEIBannerConcent extends Component { {/**/} - + this.modalCancel()}>X

    :""} From 2a373cffe02e59fc3293b8905ba120db4946dbd0 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 30 Jul 2019 15:43:48 +0800 Subject: [PATCH 078/117] =?UTF-8?q?=E4=BB=93=E5=BA=93=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/concerns/git_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/concerns/git_helper.rb b/app/controllers/concerns/git_helper.rb index c0c68ee81..d77e1c3f6 100644 --- a/app/controllers/concerns/git_helper.rb +++ b/app/controllers/concerns/git_helper.rb @@ -48,7 +48,7 @@ module GitHelper def project_fork(container, original_rep_path, username) raise Educoder::TipException.new("fork源路径为空,fork失败!") if original_rep_path.blank? # 将要生成的仓库名字 - new_repo_name = "#{username.try(:strip)} /#{container.try(:identifier)}#{ Time.now.strftime("%Y%m%d%H%M%S")}" + new_repo_name = "#{username.try(:strip)}/#{container.try(:identifier)}#{ Time.now.strftime("%Y%m%d%H%M%S")}" uid_logger("start fork container: repo_name is #{new_repo_name}") GitService.fork_repository(repo_path: original_rep_path, fork_repository_path: (new_repo_name + ".git")) container.update_attributes!(:repo_name => new_repo_name) From 00390cffbd5216b5d541218a12b9c4d4625dea75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 15:48:54 +0800 Subject: [PATCH 079/117] b --- .../PackageIndexNEIBannerConcent.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index 42a107444..a279f7f13 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -118,11 +118,14 @@ class PackageIndexNEIBannerConcent extends Component { } componentDidUpdate = (prevProps) => { - if(this.props.current_user&&this.props.current_user.username!=prevProps.current_user.username){ - this.setState({ - contact_name:this.props.current_user&&this.props.current_user.username - }) - } + console.log(this.props.current_user) + console.log("____________") + console.log(prevProps.current_user) + // if(this.props.current_user&&this.props.current_user.username!=prevProps.current_user.username){ + // this.setState({ + // contact_name:this.props.current_user&&this.props.current_user.username + // }) + // } } //获取验证码; getverificationcode =()=>{ From 4ab00b3a663eed8460ee5750e1661e2416db3116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 15:54:05 +0800 Subject: [PATCH 080/117] b --- .../PackageIndexNEIBannerConcent.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index a279f7f13..e8ae230a7 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -118,14 +118,11 @@ class PackageIndexNEIBannerConcent extends Component { } componentDidUpdate = (prevProps) => { - console.log(this.props.current_user) - console.log("____________") - console.log(prevProps.current_user) - // if(this.props.current_user&&this.props.current_user.username!=prevProps.current_user.username){ - // this.setState({ - // contact_name:this.props.current_user&&this.props.current_user.username - // }) - // } + if(prevProps.current_user.username!=this.props.current_user){ + this.setState({ + contact_name:this.props.current_user&&this.props.current_user.username + }) + } } //获取验证码; getverificationcode =()=>{ From 336bc6edc30b3ec7429ce896ada7afe6e1c1ad52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 15:57:10 +0800 Subject: [PATCH 081/117] b --- .../PackageIndexNEIBannerConcent.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index e8ae230a7..a9de27f27 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -119,9 +119,12 @@ class PackageIndexNEIBannerConcent extends Component { componentDidUpdate = (prevProps) => { if(prevProps.current_user.username!=this.props.current_user){ - this.setState({ - contact_name:this.props.current_user&&this.props.current_user.username - }) + if(this.props.current_user!=undefined){ + this.setState({ + contact_name:this.props.current_user.username + }) + } + } } //获取验证码; From 728784e20c6ee3c6840f90620e8c01e92690de17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 16:00:43 +0800 Subject: [PATCH 082/117] b --- .../PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index a9de27f27..0dda4f029 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -120,6 +120,7 @@ class PackageIndexNEIBannerConcent extends Component { componentDidUpdate = (prevProps) => { if(prevProps.current_user.username!=this.props.current_user){ if(this.props.current_user!=undefined){ + console.log(this.props.current_user) this.setState({ contact_name:this.props.current_user.username }) From c1e0871861888ecbc2b78b8cdd88b3519d8b0b0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 16:03:16 +0800 Subject: [PATCH 083/117] b --- .../PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index dd1e176e4..1dd130a87 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -236,7 +236,7 @@ class PackageIndexNEITaskDetails extends Component { render() { let {overtype,data}=this.state; // console.log(data&&data.creator.login) - // console.log(this.props.current_user.login) + console.log(data) return (
    From 29d13c0c11d8a9fa9cf86393c7f9f0285004640d Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 30 Jul 2019 16:08:02 +0800 Subject: [PATCH 084/117] modify tiding identifier func --- app/models/tiding.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/models/tiding.rb b/app/models/tiding.rb index 3ef625c57..90abdf809 100644 --- a/app/models/tiding.rb +++ b/app/models/tiding.rb @@ -13,9 +13,14 @@ class Tiding < ApplicationRecord value = container.try(:identifier) end + if value.blank? && parent_container_type && Object.const_defined?(parent_container_type) + value = parent_container_type.try(:identifier) + end + if value.blank? && belong_container_type && Object.const_defined?(belong_container_type) value = belong_container.try(:identifier) end + value end end \ No newline at end of file From 25b313e501fe7b2bdc6fdbd8f24e370e09bd399b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 16:13:15 +0800 Subject: [PATCH 085/117] b --- .../PackageIndexNEITaskDetails.js | 2 +- .../PackageIndexNEIBannerConcent.js | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 1dd130a87..8c090ba1e 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -238,7 +238,7 @@ class PackageIndexNEITaskDetails extends Component { // console.log(data&&data.creator.login) console.log(data) return ( -
    + data===undefined?"":
    { - if(prevProps.current_user.username!=this.props.current_user){ - if(this.props.current_user!=undefined){ - console.log(this.props.current_user) - this.setState({ - contact_name:this.props.current_user.username - }) - } - - } - } + // componentDidUpdate = (prevProps) => { + // if(prevProps.current_user.username!=this.props.current_user){ + // if(this.props.current_user!=undefined){ + // console.log(this.props.current_user) + // this.setState({ + // contact_name:this.props.current_user.username + // }) + // } + // + // } + // } //获取验证码; getverificationcode =()=>{ // if (this.state.logins&&this.state.logins.length === 0) { From b955c69a7f1b25fb1c0c39e67def21c8cf566fae Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Jul 2019 16:13:40 +0800 Subject: [PATCH 086/117] =?UTF-8?q?=E4=BA=A4=E6=B5=81=E9=97=AE=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/memos_controller.rb | 2 -- app/helpers/memos_helper.rb | 4 ++++ app/views/memos/new.json.jbuilder | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/controllers/memos_controller.rb b/app/controllers/memos_controller.rb index 723f2e9a4..869d787db 100644 --- a/app/controllers/memos_controller.rb +++ b/app/controllers/memos_controller.rb @@ -66,9 +66,7 @@ class MemosController < ApplicationController # GET /memos/new def new - @csrf_token = session[:_csrf_toke] ||= SecureRandom.base64(32) @tag_list = TagRepertoire.field_for_list.order("name asc") - end # GET /memos/1/edit diff --git a/app/helpers/memos_helper.rb b/app/helpers/memos_helper.rb index 7df887a4b..434d9b66a 100644 --- a/app/helpers/memos_helper.rb +++ b/app/helpers/memos_helper.rb @@ -1,2 +1,6 @@ module MemosHelper + + def forum_list + [{id: 5, name: "技术分享"}, {id: 3, name: "操作指南"}] + end end diff --git a/app/views/memos/new.json.jbuilder b/app/views/memos/new.json.jbuilder index 14313b2ac..47c023ea0 100644 --- a/app/views/memos/new.json.jbuilder +++ b/app/views/memos/new.json.jbuilder @@ -1,3 +1,3 @@ json.tag_list @tag_list -json.csrf_token @csrf_token +json.forums @csrf_token From 0e8ce52fa5b20f01ebfac1134adaaf3dcb31be95 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 30 Jul 2019 16:16:24 +0800 Subject: [PATCH 087/117] =?UTF-8?q?=E6=90=9C=E7=B4=A2=E5=AD=A6=E7=94=9F?= =?UTF-8?q?=E7=9A=84api=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/courses/search_users.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/courses/search_users.json.jbuilder b/app/views/courses/search_users.json.jbuilder index ac826fdf2..61362de66 100644 --- a/app/views/courses/search_users.json.jbuilder +++ b/app/views/courses/search_users.json.jbuilder @@ -1,6 +1,7 @@ json.users do json.array! @users do |user| json.id user.id + json.login user.login json.name user.real_name json.student_id user&.student_id json.school_name user&.school_name From e0444d03bfea8df6a2d600e021467e235afd79cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 16:19:03 +0800 Subject: [PATCH 088/117] b --- .../PackageIndexNEITaskDetails.js | 2 +- .../PackageIndexNEIBannerConcent.js | 19 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 8c090ba1e..b71c36eec 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -281,7 +281,7 @@ class PackageIndexNEITaskDetails extends Component {
    + src={"/images/"+data&&data.creator.image_url} width="70"/>
    {data&&data.creator.name} diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index 34eaa00f7..db9e299dd 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -117,17 +117,14 @@ class PackageIndexNEIBannerConcent extends Component { // this.contentMdRef.current.setValue("测试赋值") } - // componentDidUpdate = (prevProps) => { - // if(prevProps.current_user.username!=this.props.current_user){ - // if(this.props.current_user!=undefined){ - // console.log(this.props.current_user) - // this.setState({ - // contact_name:this.props.current_user.username - // }) - // } - // - // } - // } + componentDidUpdate = (prevProps) => { + if(prevProps.current_user.username != this.props.current_user.username){ + console.log(this.props.current_user) + this.setState({ + contact_name:this.props.current_user.username + }) + } + } //获取验证码; getverificationcode =()=>{ // if (this.state.logins&&this.state.logins.length === 0) { From 7b6324f775d19b7cd0e97f17983d6532b750ee91 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Tue, 30 Jul 2019 16:22:34 +0800 Subject: [PATCH 089/117] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=95=E5=8D=B7?= =?UTF-8?q?=E7=9A=84=E6=88=90=E7=BB=A9excel=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 7c8c07d01..126362fe8 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1256,13 +1256,15 @@ class ExercisesController < ApplicationController normal_status(-1,"试卷未发布") elsif (@exercise_users_size == 0) || ( @export_ex_users&.exercise_user_committed.size == 0) normal_status(-1,"暂无用户提交") + elsif params[:export].present? && params[:export] + normal_status(0,"正在下载中") else respond_to do |format| format.xlsx{ get_export_users(@exercise,@course,@export_ex_users) exercise_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{exercise_export_name_.strip}",template: "exercises/exercise_lists.xlsx.axlsx",locals: {table_columns:@table_columns,exercise_users:@user_columns} + render xlsx: "#{exercise_export_name_.strip}",template: "exercises/exercise_lists.xlsx.axlsx",locals: {table_columns:@table_columns,exercise_users:@user_columns},cookies:{fileDownload:true,HttpOnly:false} } end end From d49209b3e18c9550f7c457ae3f5dd846b1787ae6 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Tue, 30 Jul 2019 16:26:33 +0800 Subject: [PATCH 090/117] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=AF=95=E5=8D=B7?= =?UTF-8?q?=E7=9A=84excel,pdf,zip=E7=9A=84=E5=AF=BC=E5=87=BA=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 6 +++++- app/controllers/zips_controller.rb | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 126362fe8..c22bd3217 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1283,7 +1283,11 @@ class ExercisesController < ApplicationController @exercise_questions = @exercise.exercise_questions.includes(:exercise_choices).order("question_number ASC") filename_ = "#{@exercise.user.real_name}_#{@course.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}.pdf" stylesheets = "#{Rails.root}/app/templates/exercise_export/exercise_export.css" - render pdf: 'exercise_export/blank_exercise', filename: filename_, stylesheets: stylesheets + if params[:export].present? && params[:export] + normal_status(0,"正在下载中") + else + render pdf: 'exercise_export/blank_exercise', filename: filename_, stylesheets: stylesheets,cookies:{fileDownload:true,HttpOnly:false} + end end #空白试卷预览页面,仅供测试使用,无其他任何用途 diff --git a/app/controllers/zips_controller.rb b/app/controllers/zips_controller.rb index f4822b96b..f3ae9df5a 100644 --- a/app/controllers/zips_controller.rb +++ b/app/controllers/zips_controller.rb @@ -18,7 +18,11 @@ class ZipsController < ApplicationController exercises = ExportExercisesService.new(@exercise,@ex_users,@request_url) file_name_ = filename_for_content_disposition(exercises.filename) - send_file exercises.ex_zip, filename: file_name_, type: 'application/zip' + if params[:export].present? && params[:export] + normal_status(0,"正在下载中") + else + send_file exercises.ex_zip, filename: file_name_, type: 'application/zip', cookies:{fileDownload:true,HttpOnly:false} + end rescue Exception => e normal_status(-1, e.message) end From 07119404389c454797b7b2070e0cb03c1878d88b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 16:36:01 +0800 Subject: [PATCH 091/117] b --- .../PackageIndexNEITaskDetails.js | 5 +++-- .../PackageIndexNewandEdit/PackageIndexNEISubmit.js | 4 ++-- .../PackageIndexNewandEdit/PackageIndexNewandEditIndex.js | 7 +++++++ .../react/src/modules/projectPackages/packageconcnet.css | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index b71c36eec..35ca952a7 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -265,7 +265,7 @@ class PackageIndexNEITaskDetails extends Component {
    -
    +
    {data&&data.status==="pending"?
    @@ -281,7 +281,8 @@ class PackageIndexNEITaskDetails extends Component {
    + src={`/images/${data&&data.creator.image_url}`} + width="70"/>
    {data&&data.creator.name} diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js index 9f287e90e..e44e654b9 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js @@ -29,8 +29,8 @@ class PackageIndexNEISubmit extends Component {

    -
    恭喜!
    -
    提交成功
    +
    恭喜!
    +
    提交成功
    平台正在审核您的申请,审核结果将以平台消息的形式通知您
    this.setageload(this.props.id)}>查看发布需求 diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js index 1571fd77a..0481577bf 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js @@ -27,6 +27,12 @@ class PackageIndexNewandEditIndex extends Component{ id:ids }) } + + goback = () => { + // window.history.go(-1) + window.location.href="/crowdsourcing"; + } + render() { let {setPublication}=this.state; return ( @@ -37,6 +43,7 @@ class PackageIndexNewandEditIndex extends Component{

    {this.props.match.params.id!=undefined?"编辑":"新建"} + 返回

    diff --git a/public/react/src/modules/projectPackages/packageconcnet.css b/public/react/src/modules/projectPackages/packageconcnet.css index 74119e2b4..7a8c11897 100644 --- a/public/react/src/modules/projectPackages/packageconcnet.css +++ b/public/react/src/modules/projectPackages/packageconcnet.css @@ -167,7 +167,7 @@ color:#999; } .padding251{ - padding: 0px 251px; + padding: 0px 245px; } .ant-modal-title{ From de4dfc5c06a149378a9067107afb66d4d569d758 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Tue, 30 Jul 2019 16:36:57 +0800 Subject: [PATCH 092/117] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E7=9A=84excel?= =?UTF-8?q?=E5=92=8Czip=E5=AF=BC=E5=87=BA=E4=BF=AE=E6=94=B9=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/homework_commons_controller.rb | 8 ++++++-- app/controllers/zips_controller.rb | 7 ++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index 5cccb3ee7..628da5bda 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -207,19 +207,23 @@ class HomeworkCommonsController < ApplicationController tip_exception(403, "无权限操作") elsif @work_excel.blank? || @work_excel.size == 0 normal_status(-1,"暂无用户提交!") + elsif params[:export].present? && params[:export] + normal_status(0,"正在下载中") else respond_to do |format| format.xlsx{ student_work_to_xlsx(@work_excel,@homework) exercise_export_name = "#{current_user.real_name}_#{@course.name}_#{@homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" render xlsx: "#{exercise_export_name.strip}",template: "homework_commons/works_list.xlsx.axlsx",locals: - {table_columns: @work_head_cells,task_users: @work_cells_column} + {table_columns: @work_head_cells,task_users: @work_cells_column},cookies:{fileDownload:true,HttpOnly:false} } end end elsif params[:format] == "zip" if @user_course_identity >= Course::STUDENT tip_exception(403, "无权限操作") + elsif params[:export].present? && params[:export] + normal_status(0,"正在下载中") else if @work_excel.present? zip_works = @work_excel&.where("work_status > 0") @@ -233,7 +237,7 @@ class HomeworkCommonsController < ApplicationController format.zip{ zipfile = zip_homework_common @homework, zip_works file = decode64(zipfile[0][:base64file]) - send_file "#{OUTPUT_FOLDER}/#{file}", filename: filename_for_content_disposition(file), type: 'application/zip' + send_file "#{OUTPUT_FOLDER}/#{file}", filename: filename_for_content_disposition(file), type: 'application/zip',cookies:{fileDownload:true,HttpOnly:false} } end else diff --git a/app/controllers/zips_controller.rb b/app/controllers/zips_controller.rb index f3ae9df5a..e531776a9 100644 --- a/app/controllers/zips_controller.rb +++ b/app/controllers/zips_controller.rb @@ -8,7 +8,12 @@ class ZipsController < ApplicationController def shixun_report service = BatchExportShixunReportService.new(@homework, @all_student_works) filename_ = filename_for_content_disposition(service.filename) - send_file service.zip, filename: filename_, type: 'application/zip' + if params[:export].present? && params[:export] + normal_status(0,"正在下载中") + else + send_file service.zip, filename: filename_, type: 'application/zip',cookies:{fileDownload:true,HttpOnly:false} + end + rescue BatchExportShixunReportService::Error => ex normal_status(-1, ex.message) end From 22da157241579b9d0a3fd542a364e5f92a0f7cd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 16:45:18 +0800 Subject: [PATCH 093/117] b --- public/react/src/App.js | 2 +- .../projectPackages/PackageIndex/PackageConcent.js | 4 ++-- .../PackageIndexNEITaskDetails.js | 6 +++--- .../PackageIndexNEIBannerConcent.js | 4 ++-- .../PackageIndexNewandEdit/PackageIndexNEISubmit.js | 4 ++-- .../PackageIndexNewandEdit/PackageIndexNewandEditIndex.js | 2 +- .../src/modules/projectPackages/ProjectPackageIndex.js | 8 ++++---- public/react/src/modules/tpm/NewHeader.js | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/public/react/src/App.js b/public/react/src/App.js index 6d1e2a521..e713cd0fd 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -304,7 +304,7 @@ class App extends Component { {/**/} {/*众包创新*/} - + {/*认证*/} diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js index 921c3e555..cfc54bb98 100644 --- a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js @@ -158,7 +158,7 @@ class PackageConcent extends Component { enterButton={ 搜索} onSearch={ (value)=>this.setdatafuns(value)} />

    @@ -224,7 +224,7 @@ class PackageConcent extends Component { diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 35ca952a7..ac7c8a1a5 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -230,7 +230,7 @@ class PackageIndexNEITaskDetails extends Component { } goback = () => { // window.history.go(-1) - window.location.href="/crowdsourcing"; + window.location.href="/crowdsourcings"; } render() { @@ -252,7 +252,7 @@ class PackageIndexNEITaskDetails extends Component { '} className={"fl"}> {/*{this.props.current_user.username}*/} - 众包创新 + 众包创新 {data&&data.title} @@ -353,7 +353,7 @@ class PackageIndexNEITaskDetails extends Component { 需求详情: {data&&data.status==="pending"&&data&&data.operation.can_select_bidding_user===true?:""} diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index db9e299dd..ab362b812 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -458,7 +458,7 @@ class PackageIndexNEIBannerConcent extends Component { if(type===true){ this.props.setPublicationfun(response.data.id) }else{ - window.location.href="/crowdsourcing/"+response.data.id + window.location.href="/crowdsourcings/"+response.data.id } this.setState({ springtype:false @@ -506,7 +506,7 @@ class PackageIndexNEIBannerConcent extends Component { if(type===true){ this.props.setPublicationfun(response.data.id) }else{ - window.location.href="/crowdsourcing/"+response.data.id + window.location.href="/crowdsourcings/"+response.data.id } this.setState({ springtype:false diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js index e44e654b9..932b9295f 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js @@ -14,10 +14,10 @@ class PackageIndexNEISubmit extends Component { } setageload=(sum)=>{ if(sum===undefined){ - window.location.href="/crowdsourcing/new" + window.location.href="/crowdsourcings/new" }else{ // this.props.history.push("/project_packages/"+sum) - window.location.href="/crowdsourcing/"+sum + window.location.href="/crowdsourcings/"+sum } } diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js index 0481577bf..8d73a6e55 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js @@ -30,7 +30,7 @@ class PackageIndexNewandEditIndex extends Component{ goback = () => { // window.history.go(-1) - window.location.href="/crowdsourcing"; + window.location.href="/crowdsourcings"; } render() { diff --git a/public/react/src/modules/projectPackages/ProjectPackageIndex.js b/public/react/src/modules/projectPackages/ProjectPackageIndex.js index 097e012e0..6f2e32b8b 100644 --- a/public/react/src/modules/projectPackages/ProjectPackageIndex.js +++ b/public/react/src/modules/projectPackages/ProjectPackageIndex.js @@ -43,25 +43,25 @@ class ProjectPackageIndex extends Component { {/*众包首页*/} - () } > - () } > - () } > - () } diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 79b0aa443..34ee824aa 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -718,7 +718,7 @@ submittojoinclass=(value)=>{
  • 教学案例
  • 众包创新
  • 交流问答
  • Date: Tue, 30 Jul 2019 16:47:01 +0800 Subject: [PATCH 094/117] =?UTF-8?q?=E4=BC=97=E5=8C=85=E7=A7=BB=E6=A4=8D?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/NewHeader.js | 2 +- public/react/src/modules/user/usersInfo/Infos.js | 10 +++++----- .../react/src/modules/user/usersInfo/InfosPackage.js | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 34ee824aa..b84982d86 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -816,7 +816,7 @@ submittojoinclass=(value)=>{
  • 我的实训
  • 我的实践课程
  • 我的项目
  • -
  • 我的众包
  • + {/*
  • 我的众包
  • */}
  • 账号管理
  • {/*
  • this.educoderlogin()} >登入测试接口
  • */} {/*
  • this.trialapplications()} >试用申请
  • */} diff --git a/public/react/src/modules/user/usersInfo/Infos.js b/public/react/src/modules/user/usersInfo/Infos.js index 5286c5797..f20cd5be5 100644 --- a/public/react/src/modules/user/usersInfo/Infos.js +++ b/public/react/src/modules/user/usersInfo/Infos.js @@ -384,11 +384,11 @@ class Infos extends Component{ to={`/users/${username}/projects`}>项目 -
  • - this.setState({moduleName: 'package'})} - to={`/users/${username}/package`}>众包 -
  • + {/*
  • */} + {/* this.setState({moduleName: 'package'})}*/} + {/*to={`/users/${username}/package`}>众包*/} + {/*
  • */} {/*{ data && data.identity!="学生" &&
  • 题库
  • }*/} diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js index 638b2ecd2..f1077cd62 100644 --- a/public/react/src/modules/user/usersInfo/InfosPackage.js +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -12,7 +12,7 @@ import { CNotificationHOC } from '../../courses/common/CNotificationHOC' import "./usersInfo.css" import Create from './publicCreatNew' -class InfosCourse extends Component{ +class InfosPackage extends Component{ constructor(props){ super(props); this.state={ @@ -123,4 +123,4 @@ class InfosCourse extends Component{ ) } } -export default InfosCourse; \ No newline at end of file +export default InfosPackage; \ No newline at end of file From 7f8e1acd9d5de0d2cb274f95b0f73cdae0270e73 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Tue, 30 Jul 2019 16:50:23 +0800 Subject: [PATCH 095/117] fixbug --- app/controllers/homework_commons_controller.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index 628da5bda..adabc330f 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -212,10 +212,11 @@ class HomeworkCommonsController < ApplicationController else respond_to do |format| format.xlsx{ + cookies.signed[:fileDownload] = { value: true, httponly: false } student_work_to_xlsx(@work_excel,@homework) exercise_export_name = "#{current_user.real_name}_#{@course.name}_#{@homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" render xlsx: "#{exercise_export_name.strip}",template: "homework_commons/works_list.xlsx.axlsx",locals: - {table_columns: @work_head_cells,task_users: @work_cells_column},cookies:{fileDownload:true,HttpOnly:false} + {table_columns: @work_head_cells,task_users: @work_cells_column} } end end @@ -235,9 +236,10 @@ class HomeworkCommonsController < ApplicationController if status == 0 respond_to do |format| format.zip{ + cookies.signed[:fileDownload] = { value: true, httponly: false } zipfile = zip_homework_common @homework, zip_works file = decode64(zipfile[0][:base64file]) - send_file "#{OUTPUT_FOLDER}/#{file}", filename: filename_for_content_disposition(file), type: 'application/zip',cookies:{fileDownload:true,HttpOnly:false} + send_file "#{OUTPUT_FOLDER}/#{file}", filename: filename_for_content_disposition(file), type: 'application/zip' } end else From 7ccc549ccd336422fff3a5e75b86d08211da7834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 16:57:27 +0800 Subject: [PATCH 096/117] b --- .../PackageIndexNEIBannerConcent.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index ab362b812..a7e998fea 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -94,9 +94,6 @@ class PackageIndexNEIBannerConcent extends Component { }) }else{ console.log(this.props.current_user&&this.props.current_user.username) - this.setState({ - contact_name:this.props.current_user&&this.props.current_user.username - }) } let Url = `/project_package_categories.json`; @@ -114,16 +111,23 @@ class PackageIndexNEIBannerConcent extends Component { console.log(error) }) + this.setState({ + contact_name:this.props.current_user&&this.props.current_user.username + }) + // this.contentMdRef.current.setValue("测试赋值") } componentDidUpdate = (prevProps) => { + if(prevProps.current_user.username != this.props.current_user.username){ - console.log(this.props.current_user) + if(this.props.current_user!=undefined){ this.setState({ contact_name:this.props.current_user.username }) + } } + } //获取验证码; getverificationcode =()=>{ From 8f7c8505294f917989bcc08c787bc804bbe82eaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 17:02:25 +0800 Subject: [PATCH 097/117] b --- .../PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index a7e998fea..ccc335115 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -120,14 +120,14 @@ class PackageIndexNEIBannerConcent extends Component { componentDidUpdate = (prevProps) => { - if(prevProps.current_user.username != this.props.current_user.username){ + if(prevProps.current_user!=this.props.current_user){ if(this.props.current_user!=undefined){ this.setState({ contact_name:this.props.current_user.username }) } } - + } //获取验证码; getverificationcode =()=>{ From 49d4f3f9d79de3dfbf8a46d541bf157fcd9ac0ca Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Tue, 30 Jul 2019 17:04:39 +0800 Subject: [PATCH 098/117] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E7=9A=84excel?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 4 ++-- app/controllers/homework_commons_controller.rb | 3 ++- app/controllers/zips_controller.rb | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index c22bd3217..915a4e22c 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1264,7 +1264,7 @@ class ExercisesController < ApplicationController get_export_users(@exercise,@course,@export_ex_users) exercise_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{exercise_export_name_.strip}",template: "exercises/exercise_lists.xlsx.axlsx",locals: {table_columns:@table_columns,exercise_users:@user_columns},cookies:{fileDownload:true,HttpOnly:false} + render xlsx: "#{exercise_export_name_.strip}",template: "exercises/exercise_lists.xlsx.axlsx",locals: {table_columns:@table_columns,exercise_users:@user_columns} } end end @@ -1286,7 +1286,7 @@ class ExercisesController < ApplicationController if params[:export].present? && params[:export] normal_status(0,"正在下载中") else - render pdf: 'exercise_export/blank_exercise', filename: filename_, stylesheets: stylesheets,cookies:{fileDownload:true,HttpOnly:false} + render pdf: 'exercise_export/blank_exercise', filename: filename_, stylesheets: stylesheets end end diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index adabc330f..f9e0e6436 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -212,7 +212,8 @@ class HomeworkCommonsController < ApplicationController else respond_to do |format| format.xlsx{ - cookies.signed[:fileDownload] = { value: true, httponly: false } + cookies[:fileDownload] = true + cookies[:httponly] = false student_work_to_xlsx(@work_excel,@homework) exercise_export_name = "#{current_user.real_name}_#{@course.name}_#{@homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" render xlsx: "#{exercise_export_name.strip}",template: "homework_commons/works_list.xlsx.axlsx",locals: diff --git a/app/controllers/zips_controller.rb b/app/controllers/zips_controller.rb index e531776a9..209871ad2 100644 --- a/app/controllers/zips_controller.rb +++ b/app/controllers/zips_controller.rb @@ -11,7 +11,7 @@ class ZipsController < ApplicationController if params[:export].present? && params[:export] normal_status(0,"正在下载中") else - send_file service.zip, filename: filename_, type: 'application/zip',cookies:{fileDownload:true,HttpOnly:false} + send_file service.zip, filename: filename_, type: 'application/zip' end rescue BatchExportShixunReportService::Error => ex @@ -26,7 +26,7 @@ class ZipsController < ApplicationController if params[:export].present? && params[:export] normal_status(0,"正在下载中") else - send_file exercises.ex_zip, filename: file_name_, type: 'application/zip', cookies:{fileDownload:true,HttpOnly:false} + send_file exercises.ex_zip, filename: file_name_, type: 'application/zip' end rescue Exception => e normal_status(-1, e.message) From 85ddec348daf05f7e8d1c15a465c7ac520dcf60d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 17:07:33 +0800 Subject: [PATCH 099/117] =?UTF-8?q?=E4=BC=97=E5=8C=85=E7=A7=BB=E6=A4=8D?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index ccc335115..eae5589f2 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -715,7 +715,7 @@ class PackageIndexNEIBannerConcent extends Component {

    -
    +
    From 63c4bf069ab1f7caa8685c47c25f46b9ac879445 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Tue, 30 Jul 2019 17:11:13 +0800 Subject: [PATCH 100/117] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E7=9A=84excel=E5=AF=BC=E5=87=BA1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/homework_commons_controller.rb | 3 +-- app/controllers/zips_controller.rb | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index f9e0e6436..dfa6795fb 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -213,7 +213,6 @@ class HomeworkCommonsController < ApplicationController respond_to do |format| format.xlsx{ cookies[:fileDownload] = true - cookies[:httponly] = false student_work_to_xlsx(@work_excel,@homework) exercise_export_name = "#{current_user.real_name}_#{@course.name}_#{@homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" render xlsx: "#{exercise_export_name.strip}",template: "homework_commons/works_list.xlsx.axlsx",locals: @@ -237,7 +236,7 @@ class HomeworkCommonsController < ApplicationController if status == 0 respond_to do |format| format.zip{ - cookies.signed[:fileDownload] = { value: true, httponly: false } + cookies[:fileDownload] = true zipfile = zip_homework_common @homework, zip_works file = decode64(zipfile[0][:base64file]) send_file "#{OUTPUT_FOLDER}/#{file}", filename: filename_for_content_disposition(file), type: 'application/zip' diff --git a/app/controllers/zips_controller.rb b/app/controllers/zips_controller.rb index 209871ad2..bea5784c7 100644 --- a/app/controllers/zips_controller.rb +++ b/app/controllers/zips_controller.rb @@ -11,6 +11,7 @@ class ZipsController < ApplicationController if params[:export].present? && params[:export] normal_status(0,"正在下载中") else + cookies[:fileDownload] = true send_file service.zip, filename: filename_, type: 'application/zip' end From 9f1e0c43fe764dcab42a34ce61e64d3b0aec3ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 17:11:24 +0800 Subject: [PATCH 101/117] =?UTF-8?q?=E4=BC=97=E5=8C=85=E7=A7=BB=E6=A4=8D?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/educoder/path.png | Bin 0 -> 59814 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/educoder/path.png diff --git a/public/images/educoder/path.png b/public/images/educoder/path.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b6f1715d7484cd22de10d27f241ac8522f0430 GIT binary patch literal 59814 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ʅpGwUM9nIkJ9*K|gbD)C>J{ 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 Date: Tue, 30 Jul 2019 17:17:07 +0800 Subject: [PATCH 102/117] banner --- public/react/public/css/edu-all.css | 2 +- public/stylesheets/educoder/edu-all.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index 8b7c727a9..fad3568b4 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -420,7 +420,7 @@ table.text-file{} /*-------------------------------实训路径-------------------------------*/ -.path-head{width: 100%;height: 300px;background-image: url("/images/educoder/path.jpg");background-color: #081C4B;background-size: 100% 100%;} +.path-head{width: 100%;height: 300px;background-image: url("/images/educoder/path.png");background-color: #081C4B;background-size: 100% 100%;} .pathNavLine{position: absolute;bottom: -8px;width: 100%;} .path-nav li{float: left;padding: 0px 30px;height: 42px;} .path-nav li a{color:#fff;font-size: 16px;display: block; height: 40px;} diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 65ff14a59..ec245b196 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -422,7 +422,7 @@ table.text-file{} /*-------------------------------实训路径-------------------------------*/ -.path-head{width: 100%;height: 300px;background-image: url("/images/educoder/path.jpg");background-color: #081C4B;background-size: 100% 100%;} +.path-head{width: 100%;height: 300px;background-image: url("/images/educoder/path.png");background-color: #081C4B;background-size: 100% 100%;} .pathNavLine{position: absolute;bottom: -8px;width: 100%;} .path-nav li{float: left;padding: 0px 30px;height: 42px;} .path-nav li a{color:#fff;font-size: 16px;display: block; height: 40px;} From af40f08f047b5dbab80e1ea7ba1ca4de19fbb573 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 30 Jul 2019 17:23:27 +0800 Subject: [PATCH 103/117] init --- public/react/src/modules/user/account/AccountBasicEdit.js | 2 +- public/react/src/modules/user/modal/ApplyForAddChildOrgModal.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/user/account/AccountBasicEdit.js b/public/react/src/modules/user/account/AccountBasicEdit.js index a4637c00e..612e47d9f 100644 --- a/public/react/src/modules/user/account/AccountBasicEdit.js +++ b/public/react/src/modules/user/account/AccountBasicEdit.js @@ -719,7 +719,7 @@ class AccountBasic extends Component { { - (!filterDepartments || (filterDepartments && filterDepartments.length==0 ) + filterDepartments != undefined && ( (filterDepartments && filterDepartments.length==0 ) || (departmentsName == '' && !this.state.department_id && (!departments || departments.length == 0) )) &&
    diff --git a/public/react/src/modules/user/modal/ApplyForAddChildOrgModal.js b/public/react/src/modules/user/modal/ApplyForAddChildOrgModal.js index be53dbdec..db32beed3 100644 --- a/public/react/src/modules/user/modal/ApplyForAddChildOrgModal.js +++ b/public/react/src/modules/user/modal/ApplyForAddChildOrgModal.js @@ -16,7 +16,7 @@ class ApplyForAddChildOrgModal extends Component{ } componentDidUpdate=(prevState)=>{ - if(this.props.departmentName && prevState.departmentName != this.props.departmentName){ + if(prevState.departmentName != this.props.departmentName){ this.setValue(this.props.departmentName) } } From 3db448643d257539a1d06e05841e85ba7b57935c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 17:25:30 +0800 Subject: [PATCH 104/117] b --- public/react/src/modules/tpm/TPMIndexHOC.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/TPMIndexHOC.js b/public/react/src/modules/tpm/TPMIndexHOC.js index 0cf22376f..788044b23 100644 --- a/public/react/src/modules/tpm/TPMIndexHOC.js +++ b/public/react/src/modules/tpm/TPMIndexHOC.js @@ -20,7 +20,7 @@ const versionNum = '0001'; // let _url_origin = getUrl() let _url_origin=''; if(window.location.port === "3007"){ - _url_origin="http://47.96.87.25:48080/"; + _url_origin="http://47.96.87.25:48080"; } // let _url_origin=`https://www.educoder.net`; From 3041f2a4e0a7adc908670e151a8c470cf656d5ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 17:30:46 +0800 Subject: [PATCH 105/117] b --- public/compatibility.html | 6 +++--- public/react/src/modules/tpm/TPMIndexHOC.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/compatibility.html b/public/compatibility.html index f13c673f5..f28bad2c8 100644 --- a/public/compatibility.html +++ b/public/compatibility.html @@ -5,9 +5,9 @@ EduCoder - - - + + + diff --git a/public/react/src/modules/tpm/TPMIndexHOC.js b/public/react/src/modules/tpm/TPMIndexHOC.js index 788044b23..b0bcf6f2a 100644 --- a/public/react/src/modules/tpm/TPMIndexHOC.js +++ b/public/react/src/modules/tpm/TPMIndexHOC.js @@ -32,14 +32,14 @@ if (!window['indexHOCLoaded']) { // $('head').append($('') // .attr('href', `${_url_origin}/stylesheets/educoder/antd.min.css?1525440977`)); $('head').append($('') - .attr('href', `${_url_origin}/stylesheets/css/edu-common.css?1525440977`)); + .attr('href', `${_url_origin}/stylesheets/css/edu-common.css?15254409771`)); $('head').append($('') - .attr('href', `${_url_origin}/stylesheets/educoder/edu-main.css?1525440978`)); + .attr('href', `${_url_origin}/stylesheets/educoder/edu-main.css?15254409781`)); // index.html有加载 $('head').append($('') - .attr('href', `${_url_origin}/stylesheets/educoder/edu-all.css?1525440978`)); + .attr('href', `${_url_origin}/stylesheets/educoder/edu-all.css?15254409781`)); // $('head').append($('') From 752a88d5f036d9559ddbb4999dcef8f35a5d3991 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 30 Jul 2019 17:32:47 +0800 Subject: [PATCH 106/117] message_detail --- public/react/src/modules/modals/DownloadMessage.js | 2 +- public/react/src/modules/modals/DownloadMessageysl.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/modals/DownloadMessage.js b/public/react/src/modules/modals/DownloadMessage.js index 2822614de..b7796316c 100644 --- a/public/react/src/modules/modals/DownloadMessage.js +++ b/public/react/src/modules/modals/DownloadMessage.js @@ -18,7 +18,7 @@ class DownloadMessage extends Component { setDownload=()=>{ this.modalCancel(); - window.open(`/users/${this.props.user.login}/private_messages`) + window.open(`/users/${this.props.user.login}/message_detail?user_id=1`) } modalCancel = () => { this.setState({ diff --git a/public/react/src/modules/modals/DownloadMessageysl.js b/public/react/src/modules/modals/DownloadMessageysl.js index 3f81a93a6..b5c23960a 100644 --- a/public/react/src/modules/modals/DownloadMessageysl.js +++ b/public/react/src/modules/modals/DownloadMessageysl.js @@ -11,7 +11,7 @@ class DownloadMessageysl extends Component { setDownload=()=>{ this.props.modalCancel(); - window.open(`/users/${this.props.user.login}/private_messages`) + window.open(`/users/${this.props.user.login}/message_detail?user_id=1`) } render() { From 78c164c08fdce96387cd0b23ac7cdb20abaaa1cc Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 30 Jul 2019 17:56:26 +0800 Subject: [PATCH 107/117] export=true --- .../react/src/modules/courses/busyWork/CommonWorkDetailIndex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index 2d3361492..dd5d7bf01 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -106,7 +106,7 @@ class CommonWorkDetailIndex extends Component{ /// 确认是否下载 confirmysl(url){ - axios.get(url).then((response) => { + axios.get(url + '&export=true' ).then((response) => { if(response.data.status&&response.data.status===-1){ }else if(response.data.status&&response.data.status===-2){ From 43fb9b180b04087bc6773287581d1705b35a51a6 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Tue, 30 Jul 2019 17:59:17 +0800 Subject: [PATCH 108/117] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 4 ++++ .../homework_commons_controller.rb | 22 ++++++++++--------- app/controllers/zips_controller.rb | 2 +- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e825d53da..c76ca51a7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -583,4 +583,8 @@ class ApplicationController < ActionController::Base def render_parameter_missing render json: { status: -1, message: '参数缺失' } end + + def set_export_cookies + cookies[:fileDownload] = true + end end diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index dfa6795fb..f7906ecda 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -212,7 +212,7 @@ class HomeworkCommonsController < ApplicationController else respond_to do |format| format.xlsx{ - cookies[:fileDownload] = true + set_export_cookies student_work_to_xlsx(@work_excel,@homework) exercise_export_name = "#{current_user.real_name}_#{@course.name}_#{@homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" render xlsx: "#{exercise_export_name.strip}",template: "homework_commons/works_list.xlsx.axlsx",locals: @@ -223,8 +223,6 @@ class HomeworkCommonsController < ApplicationController elsif params[:format] == "zip" if @user_course_identity >= Course::STUDENT tip_exception(403, "无权限操作") - elsif params[:export].present? && params[:export] - normal_status(0,"正在下载中") else if @work_excel.present? zip_works = @work_excel&.where("work_status > 0") @@ -234,13 +232,17 @@ class HomeworkCommonsController < ApplicationController end if status == 0 - respond_to do |format| - format.zip{ - cookies[:fileDownload] = true - zipfile = zip_homework_common @homework, zip_works - file = decode64(zipfile[0][:base64file]) - send_file "#{OUTPUT_FOLDER}/#{file}", filename: filename_for_content_disposition(file), type: 'application/zip' - } + if params[:export].present? && params[:export] + normal_status(0,"正在下载中") + else + respond_to do |format| + format.zip{ + set_export_cookies + zipfile = zip_homework_common @homework, zip_works + file = decode64(zipfile[0][:base64file]) + send_file "#{OUTPUT_FOLDER}/#{file}", filename: filename_for_content_disposition(file), type: 'application/zip' + } + end end else normal_status(status, status == -2 ? "500M" : "无附件可下载") diff --git a/app/controllers/zips_controller.rb b/app/controllers/zips_controller.rb index bea5784c7..b1f7804a9 100644 --- a/app/controllers/zips_controller.rb +++ b/app/controllers/zips_controller.rb @@ -11,7 +11,7 @@ class ZipsController < ApplicationController if params[:export].present? && params[:export] normal_status(0,"正在下载中") else - cookies[:fileDownload] = true + set_export_cookies send_file service.zip, filename: filename_, type: 'application/zip' end From 4e4d011d4339d819254482d838f6773844b4f62c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Tue, 30 Jul 2019 22:01:12 +0800 Subject: [PATCH 109/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/busyWork/CommonWorkDetailIndex.js | 10 ++-- .../courses/busyWork/CommonWorkList.js | 3 +- .../courses/exercise/ExerciseDisplay.js | 30 ++++++++++++ .../courses/exercise/Exercisesetting.js | 33 ++++++++++++- .../exercise/Exercisestatisticalresult.js | 21 +++++++- .../exercise/Studentshavecompletedthelist.js | 49 +++++++++++++------ .../exercise/Testpapersettinghomepage.js | 25 +++++++--- 7 files changed, 139 insertions(+), 32 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index f1b9faab7..e34783933 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -102,8 +102,10 @@ class CommonWorkDetailIndex extends Component{ } /// 确认是否下载 - confirmysl(url){ - axios.get(url).then((response) => { + confirmysl(url,params){ + axios.get(url,{ + params + }).then((response) => { if(response.data.status&&response.data.status===-1){ }else if(response.data.status&&response.data.status===-2){ @@ -171,7 +173,9 @@ class CommonWorkDetailIndex extends Component{ let params = {} if (isListModule) { // TODO - params =this.child._getRequestParams()!==undefined?this.child._getRequestParams():{}; + if(this.child!=undefined) { + params = this.child._getRequestParams() !== undefined ? this.child._getRequestParams() : {}; + } } // console.log("普通作业176176176"); // console.log(params); diff --git a/public/react/src/modules/courses/busyWork/CommonWorkList.js b/public/react/src/modules/courses/busyWork/CommonWorkList.js index 8bc029cec..9224e7eb2 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkList.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkList.js @@ -425,7 +425,8 @@ class CommonWorkList extends Component{ teacher_comment: arg_teacher_comment.length == 0 ? '' : arg_teacher_comment[0], order, limit: PAGE_SIZE, - b_order: orderMap[order] + b_order: orderMap[order], + group_id:arg_course_group, } } fetchList = () => { diff --git a/public/react/src/modules/courses/exercise/ExerciseDisplay.js b/public/react/src/modules/courses/exercise/ExerciseDisplay.js index bd70bece6..a0296476f 100644 --- a/public/react/src/modules/courses/exercise/ExerciseDisplay.js +++ b/public/react/src/modules/courses/exercise/ExerciseDisplay.js @@ -33,6 +33,21 @@ class ExerciseDisplay extends Component{ this.state = { exercise_questions: [], + exercise_group_id:[], + page:1, + limit:10, + searchtext:"", + order: "end_at", + } + } + _getRequestParams() { + const { order, exercise_group_id,searchtext, page ,limit} = this.state + return { + page, + search:searchtext, + order, + limit: limit, + group_id:exercise_group_id, } } componentDidMount = () => { @@ -49,6 +64,21 @@ class ExerciseDisplay extends Component{ console.log(error); }); } + try { + this.props.triggerRef(this); + }catch (e) { + + } + } + _getRequestParams() { + const { order, exercise_group_id,searchtext, page ,limit} = this.state + return { + page, + search:searchtext, + order, + limit: limit, + group_id:exercise_group_id, + } } render() { // let { question_title, question_score, question_type, question_choices, standard_answer, diff --git a/public/react/src/modules/courses/exercise/Exercisesetting.js b/public/react/src/modules/courses/exercise/Exercisesetting.js index 06269244d..9b6103fdb 100644 --- a/public/react/src/modules/courses/exercise/Exercisesetting.js +++ b/public/react/src/modules/courses/exercise/Exercisesetting.js @@ -63,17 +63,46 @@ class Exercisesetting extends Component{ choice_random:true, time:0, publish_timetype:false, - end_timetype:false + end_timetype:false, + exercise_group_id:[], + page:1, + limit:10, + searchtext:"", + order: "end_at", } console.log("Exercisesetting"); console.log("69"); console.log(props); } - + _getRequestParams() { + const { order, exercise_group_id,searchtext, page ,limit} = this.state + return { + page, + search:searchtext, + order, + limit: limit, + group_id:exercise_group_id, + } + } //加载 componentDidMount=()=>{ this.getSettingInfo(); // window.addEventListener('click', this.handleClick); + try { + this.props.triggerRef(this); + }catch (e) { + + } + } + _getRequestParams() { + const { order, exercise_group_id,searchtext, page ,limit} = this.state + return { + page, + search:searchtext, + order, + limit: limit, + group_id:exercise_group_id, + } } // handleClick=(e)=>{ diff --git a/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js b/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js index 1771d87b3..34f32b234 100644 --- a/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js +++ b/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js @@ -23,15 +23,32 @@ class Exercisestatisticalresult extends Component { exercise_group_id:[], page:1, limit:10, + searchtext:"", + order: "end_at", + } } componentDidMount() { let{sort,exercise_group_id,page,limit}=this.state; - this.updatefun(sort,exercise_group_id,page,limit) - } + this.updatefun(sort,exercise_group_id,page,limit); + try { + this.props.triggerRef(this); + }catch (e) { + } + } + _getRequestParams() { + const { order, exercise_group_id,searchtext, page ,limit} = this.state + return { + page, + search:searchtext, + order, + limit: limit, + group_id:exercise_group_id, + } + } updatefun=(sort,exercise_group_id,page,limit)=>{ let ExerciseId=this.props.match.params.Id; let url = `/exercises/`+ExerciseId+`/exercise_result.json`; diff --git a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js index fffadccf6..fcfea19c3 100644 --- a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js +++ b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js @@ -1213,6 +1213,11 @@ class Studentshavecompletedthelist extends Component { // console.log("2222222222222"); // console.log(this.props.isAdmin()); // } + try { + this.props.triggerRef(this); + }catch (e) { + + } } componentWillReceiveProps = (nextProps) => { @@ -2279,22 +2284,8 @@ class Studentshavecompletedthelist extends Component { this.Searchdatasys(this.state.order, this.state.commit_status, this.state.review, this.state.checkedValuesineinfo, this.state.searchtext, 1, this.state.limit); } - } - //搜索学生 文字输入 - inputSearchValues = (e) => { - // console.log(e.target.value) - if (e.target.value === "") { - this.setState({ - searchtext: undefined, - }) - } else { - this.setState({ - searchtext: e.target.value, - }) - } - - } - //搜索学生按钮输入 + }; + //搜索学生按钮输入 老师 searchValues = (value) => { //点击直接搜索 // if(value === ""){ @@ -2313,8 +2304,34 @@ class Studentshavecompletedthelist extends Component { // console.log(value) + }; + _getRequestParams() { + const { order, course_groups,searchtext, page ,limit} = this.state + return { + page, + search:searchtext, + order, + limit: limit, + group_id:course_groups, + } } + //搜索学生 文字输入 + inputSearchValues = (e) => { + // console.log(e.target.value) + if (e.target.value === "") { + this.setState({ + searchtext: undefined, + }) + } else { + this.setState({ + searchtext: e.target.value, + }) + } + + }; + + //排序 funordersy = (e) => { if (e === "end_at") { diff --git a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js index ddb448cfc..333824538 100644 --- a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js +++ b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js @@ -163,8 +163,10 @@ class Testpapersettinghomepage extends Component{ } /// 确认是否下载 - confirmysl(url){ - axios.get(url).then((response) => { + confirmysl(url,params){ + axios.get(url,{ + params + }).then((response) => { if(response.data.status&&response.data.status===-1){ }else if(response.data.status&&response.data.status===-2){ @@ -218,6 +220,7 @@ class Testpapersettinghomepage extends Component{ // DownloadMessageval:undefined // }) // } + bindRef = ref => { this.child = ref }; goback=()=>{ // let {datalist}=this.state; // let courseId=this.props.match.params.coursesId; @@ -236,7 +239,13 @@ class Testpapersettinghomepage extends Component{ let {tab,visible,Commonheadofthetestpaper}=this.state; const isAdmin =this.props.isAdmin(); const isStudent = this.props.isStudent(); - + // TODO + let params ={} + if(this.child!=undefined){ + params =this.child._getRequestParams()!==undefined?this.child._getRequestParams():{}; + } + // console.log("246"); + // console.log(this.child); return(
    {/* 导出 @@ -400,22 +409,22 @@ class Testpapersettinghomepage extends Component{ /> { // 教师列表 - parseInt(tab[0])==0 && this.setcourse_groupysls(value)} current_status = {this.state.current_status}> + parseInt(tab[0])==0 && this.setcourse_groupysls(value)} current_status = {this.state.current_status}> } {/*统计结果*/} { - parseInt(tab[0])==1 && + parseInt(tab[0])==1 && } { - parseInt(tab[0])==2 && + parseInt(tab[0])==2 && } { - parseInt(tab[0])==3 && + parseInt(tab[0])==3 && }
    From 64cab73cf74843a10f77ba477ca1d482b4ae4461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Tue, 30 Jul 2019 22:44:39 +0800 Subject: [PATCH 110/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/busyWork/CommonWorkDetailIndex.js | 15 +++++++++++---- .../exercise/Studentshavecompletedthelist.js | 11 +++++++---- .../exercise/Testpapersettinghomepage.js | 19 ++++++++++--------- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index 2a211007b..9989de401 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -104,7 +104,14 @@ class CommonWorkDetailIndex extends Component{ } /// 确认是否下载 - confirmysl(url,params){ + confirmysl(url,child){ + let params = {} + if (isListModule) { + // TODO + if(child!=undefined) { + params = child._getRequestParams() !== undefined ? child._getRequestParams() : {}; + } + } axios.get(url+ '&export=true',{ params }).then((response) => { @@ -131,7 +138,7 @@ class CommonWorkDetailIndex extends Component{ this.setState({ donwloading: true }) downloadFile({ url: url, - params:params, + params, successCallback: (url) => { this.setState({ donwloading: false }) console.log('successCallback') @@ -317,13 +324,13 @@ class CommonWorkDetailIndex extends Component{
  • this.confirmysl(exportResultUrl, exportParams)} + onClick={() => this.confirmysl(exportResultUrl,this.child)} >导出成绩
  • this.confirmysl(exportUrl, exportParams)} + onClick={() => this.confirmysl(exportUrl,this.child)} >导出作品附件
  • diff --git a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js index fcfea19c3..3f60710c1 100644 --- a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js +++ b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js @@ -1389,7 +1389,8 @@ class Studentshavecompletedthelist extends Component { loadingstate: true, }) } - + console.log(response); + console.log(1393); thiss.Generatenewdatasy(response.data.exercise_users, response); } }).catch((error) => { @@ -1992,6 +1993,8 @@ class Studentshavecompletedthelist extends Component { this.setState({ loadingstate: false, }) + console.log(response); + console.log(1997); this.Generatenewdatasy(response.data.exercise_users, response); }).catch((error) => { console.log(error) @@ -2306,13 +2309,13 @@ class Studentshavecompletedthelist extends Component { }; _getRequestParams() { - const { order, course_groups,searchtext, page ,limit} = this.state + const { order, checkedValuesineinfo,searchtext, page ,limit} = this.state return { page, search:searchtext, - order, + group_id:checkedValuesineinfo, limit: limit, - group_id:course_groups, + order, } } diff --git a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js index ec7fc189c..243ab98f5 100644 --- a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js +++ b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js @@ -163,9 +163,15 @@ class Testpapersettinghomepage extends Component{ } /// 确认是否下载 - confirmysl(url,params){ + confirmysl(url,child){ + let params ={} + if(child!=undefined){ + params =child._getRequestParams()!==undefined?child._getRequestParams():{}; + } + console.log("170"); + console.log(params); axios.get(url,{ - params + params }).then((response) => { if(response.data.status&&response.data.status===-1){ @@ -240,12 +246,7 @@ class Testpapersettinghomepage extends Component{ const isAdmin =this.props.isAdmin(); const isStudent = this.props.isStudent(); // TODO - let params ={} - if(this.child!=undefined){ - params =this.child._getRequestParams()!==undefined?this.child._getRequestParams():{}; - } - // console.log("246"); - // console.log(this.child); + return(
    {/* 导出 From d0153307f8435bbb3e35a5613ce1edc748519e24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Tue, 30 Jul 2019 23:38:23 +0800 Subject: [PATCH 111/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/busyWork/CommonWorkDetailIndex.js | 22 +++++++------------ .../exercise/Studentshavecompletedthelist.js | 3 +++ .../exercise/Testpapersettinghomepage.js | 10 +++++++-- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index 9989de401..b8a5d450c 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -66,6 +66,7 @@ class CommonWorkDetailIndex extends Component{ this.state = { DownloadType:false, DownloadMessageval:undefined, + donwloading:false, } } initWorkDetailCommonState = (data) => { @@ -104,17 +105,11 @@ class CommonWorkDetailIndex extends Component{ } /// 确认是否下载 - confirmysl(url,child){ - let params = {} - if (isListModule) { - // TODO - if(child!=undefined) { - params = child._getRequestParams() !== undefined ? child._getRequestParams() : {}; - } - } - axios.get(url+ '&export=true',{ - params - }).then((response) => { + confirmysl(url){ + axios.get(url+ '&export=true').then((response) => { + if(response===undefined){ + return + } if(response.data.status&&response.data.status===-1){ }else if(response.data.status&&response.data.status===-2){ @@ -138,7 +133,6 @@ class CommonWorkDetailIndex extends Component{ this.setState({ donwloading: true }) downloadFile({ url: url, - params, successCallback: (url) => { this.setState({ donwloading: false }) console.log('successCallback') @@ -324,13 +318,13 @@ class CommonWorkDetailIndex extends Component{
  • this.confirmysl(exportResultUrl,this.child)} + onClick={() => this.confirmysl(exportResultUrl)} >导出成绩
  • this.confirmysl(exportUrl,this.child)} + onClick={() => this.confirmysl(exportUrl)} >导出作品附件
  • diff --git a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js index 3f60710c1..f7a989f79 100644 --- a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js +++ b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js @@ -1990,6 +1990,9 @@ class Studentshavecompletedthelist extends Component { }).then((response) => { // console.log("528"); // console.log(JSON.stringify(response)); + if(response===undefined){ + return + } this.setState({ loadingstate: false, }) diff --git a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js index 243ab98f5..076f6a759 100644 --- a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js +++ b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js @@ -19,7 +19,7 @@ import Ecerciseallbackagain from './Ecerciseallbackagain'; const polls_status={1:"未发布",2:"提交中",3:"已截止",4:"已结束"} const start_Value={0:"继续答题",1:"查看答题",2:"开始答题"} - +const qs = require('qs'); //试卷主要设置页面 class Testpapersettinghomepage extends Component{ constructor(props) { @@ -171,8 +171,14 @@ class Testpapersettinghomepage extends Component{ console.log("170"); console.log(params); axios.get(url,{ - params + params, + paramsSerializer: function(params) { + return qs.stringify(params, {arrayFormat: 'brackets'}) + } }).then((response) => { + if(response===undefined){ + return + } if(response.data.status&&response.data.status===-1){ }else if(response.data.status&&response.data.status===-2){ From 2c590a4bea7852d0f4d1685161d77b9dd9317992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Tue, 30 Jul 2019 23:44:53 +0800 Subject: [PATCH 112/117] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/exercise/Testpapersettinghomepage.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js index 076f6a759..24e960a9d 100644 --- a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js +++ b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js @@ -1,7 +1,7 @@ import React,{ Component } from "react"; import {Checkbox,Input,Table, Pagination,Menu} from "antd"; import {Link,NavLink} from 'react-router-dom'; -import { WordsBtn ,ActionBtn} from 'educoder'; +import { WordsBtn ,ActionBtn,queryString} from 'educoder'; import CoursesListType from '../coursesPublic/CoursesListType'; import '../css/members.css'; import '../css/busyWork.css'; @@ -170,12 +170,7 @@ class Testpapersettinghomepage extends Component{ } console.log("170"); console.log(params); - axios.get(url,{ - params, - paramsSerializer: function(params) { - return qs.stringify(params, {arrayFormat: 'brackets'}) - } - }).then((response) => { + axios.get(url+`?${queryString.stringify(params)}`).then((response) => { if(response===undefined){ return } @@ -198,7 +193,7 @@ class Testpapersettinghomepage extends Component{ } }else { this.props.showNotification(`正在下载中`); - window.open("/api"+url, '_blank'); + window.open("/api"+url+`?${queryString.stringify(params)}`, '_blank'); } }).catch((error) => { console.log(error) From 7768b8482f1c04d5de52bfb654edb64ea3b35c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 31 Jul 2019 08:52:42 +0800 Subject: [PATCH 113/117] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/paths/PathDetail/DetailCardsEditAndAdd.js | 4 +++- .../src/modules/paths/PathDetail/DetailCardsEditAndEdit.js | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js index 2d7bcc0e0..6f771ece8 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js +++ b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js @@ -500,7 +500,9 @@ class DetailCardsEditAndAdd extends Component{
  • Date: Wed, 31 Jul 2019 09:53:38 +0800 Subject: [PATCH 114/117] + '?export=true' --- .../src/modules/courses/busyWork/common/TabRightComponents.js | 2 +- .../src/modules/courses/exercise/Testpapersettinghomepage.js | 2 +- .../courses/graduation/tasks/GraduationTaskssetting.js | 2 +- .../courses/graduation/tasks/GraduationTaskssettinglist.js | 2 +- .../graduation/tasks/GraduationTaskssettingquestions.js | 2 +- public/react/src/modules/courses/graduation/topics/index.js | 2 +- public/react/src/modules/courses/members/studentsList.js | 2 +- public/react/src/modules/courses/poll/PollDetailIndex.js | 2 +- .../modules/courses/shixunHomework/Listofworksstudentone.js | 2 +- .../src/modules/courses/shixunHomework/ShixunStudentWork.js | 2 +- .../src/modules/courses/shixunHomework/Trainingjobsetting.js | 4 ++-- .../modules/courses/shixunHomework/Workquestionandanswer.js | 4 ++-- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/common/TabRightComponents.js b/public/react/src/modules/courses/busyWork/common/TabRightComponents.js index a070ba69a..5320dd0ca 100644 --- a/public/react/src/modules/courses/busyWork/common/TabRightComponents.js +++ b/public/react/src/modules/courses/busyWork/common/TabRightComponents.js @@ -44,7 +44,7 @@ class TabRightComponents extends Component{ } /// 确认是否下载 confirmysl(url){ - axios.get(url).then((response) => { + axios.get(url + '?export=true' ).then((response) => { if(response.data.status&&response.data.status===-1){ }else if(response.data.status&&response.data.status===-2){ diff --git a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js index 36b319f5a..5a410ab4a 100644 --- a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js +++ b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js @@ -164,7 +164,7 @@ class Testpapersettinghomepage extends Component{ } /// 确认是否下载 confirmysl(url){ - axios.get(url).then((response) => { + axios.get(url + '?export=true' ).then((response) => { if(response.data.status&&response.data.status===-1){ }else if(response.data.status&&response.data.status===-2){ diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js index 5bbbe1a14..d6382165b 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js @@ -896,7 +896,7 @@ class GraduationTaskssettingapp extends Component{ } /// 确认是否下载 confirmysl(url){ - axios.get(url).then((response) => { + axios.get(url + '?export=true' ).then((response) => { if(response === undefined){ return } diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js index 7d421da4b..1b98f00f3 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js @@ -645,7 +645,7 @@ class GraduationTaskssettinglist extends Component{ b_order:b_order, search:search, } - axios.get(url,{ + axios.get(url + '?export=true',{ params }).then((response) => { if(response === undefined){ diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettingquestions.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettingquestions.js index 1bf6eb962..a812bd803 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettingquestions.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettingquestions.js @@ -199,7 +199,7 @@ class GraduationTasksquestions extends Component{ /// 确认是否下载 confirmysl(url){ - axios.get(url).then((response) => { + axios.get(url + '?export=true').then((response) => { if(response === undefined){ return } diff --git a/public/react/src/modules/courses/graduation/topics/index.js b/public/react/src/modules/courses/graduation/topics/index.js index f4303ff87..84b500716 100644 --- a/public/react/src/modules/courses/graduation/topics/index.js +++ b/public/react/src/modules/courses/graduation/topics/index.js @@ -322,7 +322,7 @@ onBoardsNew=()=>{ } /// 确认是否下载 confirmysl(url){ - axios.get(url).then((response) => { + axios.get(url + '?export=true').then((response) => { if(response.data.status&&response.data.status===-1){ }else if(response.data.status&&response.data.status===-2){ diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index 6780948ef..d7c4cb85b 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -127,7 +127,7 @@ class studentsList extends Component{ } /// 确认是否下载 confirmysl(url){ - axios.get(url).then((response) => { + axios.get(url + '&export=true').then((response) => { if(response === undefined){ return } diff --git a/public/react/src/modules/courses/poll/PollDetailIndex.js b/public/react/src/modules/courses/poll/PollDetailIndex.js index b1e8c3443..cdc6a5ae2 100644 --- a/public/react/src/modules/courses/poll/PollDetailIndex.js +++ b/public/react/src/modules/courses/poll/PollDetailIndex.js @@ -75,7 +75,7 @@ class PollDetailIndex extends Component{ /// 确认是否下载 confirmysl(url){ - axios.get(url).then((response) => { + axios.get(url + '?export=true' ).then((response) => { if(response.data.status&&response.data.status===-1){ }else if(response.data.status&&response.data.status===-2){ diff --git a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js index 4dc41fcf7..17778dea9 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js @@ -2214,7 +2214,7 @@ class Listofworksstudentone extends Component { confirmysl(url){ - axios.get(url).then((response) => { + axios.get(url + '&export=true').then((response) => { if(response === undefined){ return } diff --git a/public/react/src/modules/courses/shixunHomework/ShixunStudentWork.js b/public/react/src/modules/courses/shixunHomework/ShixunStudentWork.js index 4bb44b697..97bc651ea 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunStudentWork.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunStudentWork.js @@ -539,7 +539,7 @@ class ShixunStudentWork extends Component { } confirmysl(url){ - axios.get(url).then((response) => { + axios.get(url + '?export=true').then((response) => { if(response === undefined){ return } diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index b07392153..8cbf0402f 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -1766,12 +1766,12 @@ class Trainingjobsetting extends Component { daochushixunbaogao=()=>{ let url =`/zip/shixun_report?homework_common_id=${this.props.match.params.homeworkid}`; - this.confirmysl(url); + this.confirmysl(url + '&export=true'); } daochuzuoye =() =>{ let url = `/homework_commons/${this.props.match.params.homeworkid}/works_list.xlsx`; - this.confirmysl(url); + this.confirmysl(url + '?export=true'); } confirmysl(url){ diff --git a/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js b/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js index a46d783ea..2da08e2ad 100644 --- a/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js +++ b/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js @@ -339,12 +339,12 @@ class Workquestionandanswer extends Component { daochushixunbaogao=()=>{ let url =`/zip/shixun_report?homework_common_id=${this.props.match.params.homeworkid}`; - this.confirmysl(url); + this.confirmysl(url + '&export=true'); } daochuzuoye =() =>{ let url = `/homework_commons/${this.props.match.params.homeworkid}/works_list.xlsx`; - this.confirmysl(url); + this.confirmysl(url + '?export=true'); } confirmysl(url){ From 72cba9fc2888db71b60e9771cc1020d89e482784 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Wed, 31 Jul 2019 09:57:57 +0800 Subject: [PATCH 115/117] =?UTF-8?q?=E8=AF=BE=E5=A0=82=E7=9A=84=E5=85=A8?= =?UTF-8?q?=E9=83=A8excel=E5=AF=BC=E5=87=BA=E5=92=8Cpdf=E5=92=8Czip?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 3 +++ app/controllers/exercises_controller.rb | 2 ++ .../graduation_tasks_controller.rb | 19 +++++++++++++------ .../graduation_topics_controller.rb | 7 ++++++- app/controllers/polls_controller.rb | 3 +++ app/controllers/zips_controller.rb | 1 + 6 files changed, 28 insertions(+), 7 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 9ae909dbc..abc3e4856 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1027,7 +1027,10 @@ class CoursesController < ApplicationController tip_exception(403,"无权限操作") elsif @all_members.size == 0 normal_status(-1,"课堂暂时没有学生") + elsif params[:export].present? && params[:export] + normal_status(0,"正在下载中") else + set_export_cookies member_to_xlsx(@course, @all_members, @c_homeworks, @c_exercises, @c_tasks) filename_ = "#{current_user.real_name}_#{@course.name}_全部成绩_#{Time.now.strftime('%Y%m%d_%H%M%S')}" render xlsx: "#{format_sheet_name filename_.strip}",template: "courses/export_member_scores_excel.xlsx.axlsx", diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 915a4e22c..6f121db5f 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1261,6 +1261,7 @@ class ExercisesController < ApplicationController else respond_to do |format| format.xlsx{ + set_export_cookies get_export_users(@exercise,@course,@export_ex_users) exercise_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@exercise.exercise_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" @@ -1286,6 +1287,7 @@ class ExercisesController < ApplicationController if params[:export].present? && params[:export] normal_status(0,"正在下载中") else + set_export_cookies render pdf: 'exercise_export/blank_exercise', filename: filename_, stylesheets: stylesheets end end diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index aeb5c409d..0885eeae2 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -132,6 +132,8 @@ class GraduationTasksController < ApplicationController tip_exception(403, "无权限操作") elsif complete_works == 0 normal_status(-1,"暂无用户提交") + elsif params[:export].present? && params[:export] + normal_status(0,"正在下载中") else respond_to do |format| format.xlsx{ @@ -148,12 +150,17 @@ class GraduationTasksController < ApplicationController zip_works = @work_excel.where("work_status > 0") status = checkfileSize(zip_works) if status == 0 - respond_to do |format| - format.zip{ - zipfile = zip_homework_common @task, zip_works - file = decode64(zipfile[0][:base64file]) - send_file "#{OUTPUT_FOLDER}/#{file}", filename: filename_for_content_disposition(file), type: 'application/zip' - } + if params[:export].present? && params[:export] + normal_status(0,"正在下载中") + else + respond_to do |format| + format.zip{ + set_export_cookies + zipfile = zip_homework_common @task, zip_works + file = decode64(zipfile[0][:base64file]) + send_file "#{OUTPUT_FOLDER}/#{file}", filename: filename_for_content_disposition(file), type: 'application/zip' + } + end end else normal_status(status,status == -2 ? "500M" : "无附件可下载") diff --git a/app/controllers/graduation_topics_controller.rb b/app/controllers/graduation_topics_controller.rb index 96816c2a6..bd93401f3 100644 --- a/app/controllers/graduation_topics_controller.rb +++ b/app/controllers/graduation_topics_controller.rb @@ -271,7 +271,12 @@ class GraduationTopicsController < ApplicationController students = course.students.joins(user: :user_extension).order("user_extensions.student_id") graduation_topic_to_xlsx(students,course) topic_export_name_ = "#{current_user.real_name}_#{course.name}_毕设选题_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{topic_export_name_.strip}",template: "graduation_topics/export.xlsx.axlsx",locals: {table_columns:@topic_head_cells,topic_users:@topic_body_cells} + if params[:export].present? && params[:export] + normal_status(0,"正在下载中") + else + set_export_cookies + render xlsx: "#{topic_export_name_.strip}",template: "graduation_topics/export.xlsx.axlsx",locals: {table_columns:@topic_head_cells,topic_users:@topic_body_cells} + end rescue Exception => e uid_logger(e.message) missing_template diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 87435f743..7d978d722 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -945,9 +945,12 @@ class PollsController < ApplicationController tip_exception(403,"无权限操作") elsif (@poll.polls_status == 1) || (@poll_export_questions.size == 0) || (@poll_commit_ids.size == 0) normal_status(-1,"暂无用户提交") + elsif params[:export].present? && params[:export] + normal_status(0,"正在下载中") else respond_to do |format| format.xlsx{ + set_export_cookies polls_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@poll.polls_name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" polls_user_commit = poll_commit_result(@poll,@poll_export_questions,@poll_users,@poll_commit_ids) render xlsx: "#{polls_export_name_.strip}",template: "polls/commit_result.xlsx.axlsx",locals: {polls_user_commit:polls_user_commit} diff --git a/app/controllers/zips_controller.rb b/app/controllers/zips_controller.rb index b1f7804a9..3ed1eb8b3 100644 --- a/app/controllers/zips_controller.rb +++ b/app/controllers/zips_controller.rb @@ -27,6 +27,7 @@ class ZipsController < ApplicationController if params[:export].present? && params[:export] normal_status(0,"正在下载中") else + set_export_cookies send_file exercises.ex_zip, filename: file_name_, type: 'application/zip' end rescue Exception => e From 8c584ba15d2080559518b2bdcc151452e1f3c1b5 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Wed, 31 Jul 2019 09:58:08 +0800 Subject: [PATCH 116/117] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=A4=9A=E5=AA=92?= =?UTF-8?q?=E4=BD=93=E7=B1=BB=E7=9A=84=E5=AE=9E=E8=AE=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/games_controller.rb | 2 +- app/views/games/picture_display.json.jbuilder | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index b2de6dcad..510044aa4 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -116,7 +116,7 @@ class GamesController < ApplicationController @qrcode_str = Base64.encode64( qr.to_img.resize(400,400).to_s ) else - @type = "image" + @type = shixun_show_type @game_challenge.show_type #conv = Iconv.new("GBK", "utf-8") @game_challenge = @game.challenge type = @game_challenge.show_type diff --git a/app/views/games/picture_display.json.jbuilder b/app/views/games/picture_display.json.jbuilder index 541c478a9..b43efa57e 100644 --- a/app/views/games/picture_display.json.jbuilder +++ b/app/views/games/picture_display.json.jbuilder @@ -24,5 +24,30 @@ elsif @type == "txt" json.contents @contents.html_safe elsif @type =="qrcode" json.qrcode_str @qrcode_str +elsif @type == "mp3" || @type == "mp4" + if @type == "mp4" + json.orignal_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378171/123.mp4"}] + json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378172/456.mp4"}] + json.answer_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378173/789.mp4"}] + else + json.orignal_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378174/58099.mp3"}] + json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] + json.answer_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] + end + # json.orignal_file do + # json.array! @orignal_picture do |file| + # json.file_url attachment_show_users_path(:file_name => file, :path => @original_path) + # end + # end + # json.user_file do + # json.array! @user_picture do |file| + # json.file_url attachment_show_users_path(:file_name => file, :path => @user_path, :time => Time.now.to_i) + # end + # end + # json.answer_file do + # json.array! @answer_picture do |file| + # json.file_url attachment_show_users_path(:file_name => file, :path => @answer_path) + # end + # end end \ No newline at end of file From 400e5c104011c1f593daf97092d230fa4acffc37 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Wed, 31 Jul 2019 10:08:01 +0800 Subject: [PATCH 117/117] export true --- .../modules/courses/shixunHomework/Trainingjobsetting.js | 8 ++++---- .../courses/shixunHomework/Workquestionandanswer.js | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index 8cbf0402f..99c295c40 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -1766,16 +1766,16 @@ class Trainingjobsetting extends Component { daochushixunbaogao=()=>{ let url =`/zip/shixun_report?homework_common_id=${this.props.match.params.homeworkid}`; - this.confirmysl(url + '&export=true'); + this.confirmysl(url, url + '&export=true'); } daochuzuoye =() =>{ let url = `/homework_commons/${this.props.match.params.homeworkid}/works_list.xlsx`; - this.confirmysl(url + '?export=true'); + this.confirmysl(url, url + '?export=true'); } - confirmysl(url){ - axios.get(url).then((response) => { + confirmysl(url, urlWithExport){ + axios.get(urlWithExport).then((response) => { if(response === undefined){ return } diff --git a/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js b/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js index 2da08e2ad..4ed45790d 100644 --- a/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js +++ b/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js @@ -339,16 +339,16 @@ class Workquestionandanswer extends Component { daochushixunbaogao=()=>{ let url =`/zip/shixun_report?homework_common_id=${this.props.match.params.homeworkid}`; - this.confirmysl(url + '&export=true'); + this.confirmysl(url, url + '&export=true'); } daochuzuoye =() =>{ let url = `/homework_commons/${this.props.match.params.homeworkid}/works_list.xlsx`; - this.confirmysl(url + '?export=true'); + this.confirmysl(url, url + '?export=true'); } - confirmysl(url){ - axios.get(url).then((response) => { + confirmysl(url, urlWithExport){ + axios.get(urlWithExport).then((response) => { if(response === undefined){ return }