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 01/56] 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 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 02/56] =?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 03/56] =?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 04/56] =?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 05/56] 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 06/56] 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 {
{item.title}
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 07/56] 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 08/56] =?UTF-8?q?users=E8=A1=A8=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=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 98ba053ebec9fd049c9d9fa09a5d042b14c5bf9d Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 30 Jul 2019 14:08:14 +0800 Subject: [PATCH 09/56] 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 10/56] =?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 11/56] 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 12/56] 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 13/56] 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 14/56] 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 15/56] =?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 16/56] 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 17/56] 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 18/56] 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 19/56] 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 20/56] 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 21/56] =?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 22/56] =?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 23/56] 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 24/56] 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 25/56] 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 26/56] =?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 27/56] 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 28/56] 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 29/56] 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 30/56] 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 31/56] 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 32/56] 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 33/56] 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 34/56] =?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 35/56] =?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 36/56] 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 37/56] =?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 38/56] =?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 39/56] 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 40/56] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E7=9A=84excel=E5=92=8C?= =?UTF-8?q?zip=E5=AF=BC=E5=87=BA=E4=BF=AE=E6=94=B9=E6=B5=8B=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 41/56] 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 42/56] =?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 43/56] 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 44/56] 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 45/56] 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 46/56] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E7=9A=84excel=E5=AF=BC?= =?UTF-8?q?=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 47/56] =?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 48/56] =?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 49/56] =?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 50/56] 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 51/56] 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 52/56] 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 53/56] 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 54/56] 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 55/56] 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 56/56] =?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