From 2bcf334ecba194f17ebec641023ccddcf6c0d4da Mon Sep 17 00:00:00 2001 From: p31729568 Date: Wed, 12 Jun 2019 15:30:28 +0800 Subject: [PATCH 01/20] fix school management evaluate count incorrent error --- .../statistic_school_daily_report_task.rb | 7 +- lib/tasks/statistic_school_daily_report.rake | 135 ++++++++++++------ 2 files changed, 95 insertions(+), 47 deletions(-) diff --git a/app/tasks/statistic_school_daily_report_task.rb b/app/tasks/statistic_school_daily_report_task.rb index 5d0db197..c533c55c 100644 --- a/app/tasks/statistic_school_daily_report_task.rb +++ b/app/tasks/statistic_school_daily_report_task.rb @@ -25,13 +25,12 @@ class StatisticSchoolDailyReportTask .where(homework_type: 4, created_at: yesterday).count # 新增实训评测数量 - shixun_evaluate_count = Output.joins(game: :challenge) - .joins('LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = challenges.shixun_id') + shixun_evaluate_count = EvaluateRecord.joins('LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = evaluate_records.shixun_id') .joins('LEFT JOIN homework_commons hc ON hcs.homework_common_id = hc.id AND hc.homework_type = 4') - .joins('LEFT JOIN members ON members.user_id = games.user_id') + .joins('LEFT JOIN members ON members.user_id = evaluate_records.user_id') .joins('LEFT JOIN courses ON members.course_id = courses.id AND hc.course_id = courses.id') .where(courses: { school_id: school.id }) - .where(created_at: yesterday).count + .where(created_at: yesterday).reorder(nil).count # 无有效数据时不记录 data = [teacher_count, student_count, course_count, shixun_count, active_user_count, diff --git a/lib/tasks/statistic_school_daily_report.rake b/lib/tasks/statistic_school_daily_report.rake index 1dbb591e..2d487ff6 100644 --- a/lib/tasks/statistic_school_daily_report.rake +++ b/lib/tasks/statistic_school_daily_report.rake @@ -70,55 +70,106 @@ namespace :school_daily_report do end end - desc 'statistic old shixun homework count and shixun evaluate count' - task :statistic_shixun_info_count, [:date] => :environment do |_, args| + # 统计学校历史每天实训作业新增数 + desc 'statistic school shixun homework count everyday' + task :statistic_shixun_homework_count, [:date] => :environment do |_, args| date = Time.zone.parse(args[:date]).beginning_of_day current_date = (Time.zone.now - 5.hour).beginning_of_day custom_logger("statistic range: #{date}..#{current_date}") while current_date > date date_str = date.strftime('%Y-%m-%d') - # 检查当天数据是否已经统计 - school_count = School.count - query_times = school_count % query_size == 0 ? school_count / query_size : (school_count / query_size) + 1 + custom_logger("Start statistic => Date: #{date_str} ~") - custom_logger("Start statistic => Date: #{date_str}, school count: #{school_count}, insert times: #{query_times} ~") - query_times.times do |index| - sql = school_daily_report_sql(date, query_size, index * query_size) - reports = School.find_by_sql(sql) + begin_date = (date + 5.hour).strftime('%Y-%m-%d %H:%M:%S') + end_date = (date + 1.day + 5.hour).strftime('%Y-%m-%d %H:%M:%S') + + homework_count_map = HomeworkCommon.joins('LEFT JOIN courses cs ON homework_commons.course_id = cs.id') + .where('cs.school_id IS NOT NULL') + .where(homework_type: 4, created_at: begin_date...end_date).reorder(nil) + .group('cs.school_id').count + + ActiveRecord::Base.transaction do + exist_school_ids = SchoolDailyReport.where(date: date_str).pluck(:school_id) - if SchoolDailyReport.exists?(date: date) - data = [] - reports.each do |report| - next if %w(teacher_count student_count course_count shixun_count shixun_homework_count shixun_evaluate_count active_user_count).all? { |key| report[key].zero? } - - record = SchoolDailyReport.where(school_id: report['id'], date: date_str).first - - if record.present? - record.update_attributes(shixun_homework_count: report['shixun_homework_count'], shixun_evaluate_count: report['shixun_evaluate_count']) - else - data << [ - report['id'], report['name'], report['teacher_count'], report['student_count'], report['course_count'], - report['shixun_count'], report['shixun_homework_count'], report['shixun_evaluate_count'], - report['active_user_count'], date_str, current_datetime, current_datetime - ] - end + updated_school_ids = homework_count_map.keys & exist_school_ids # 需要更新的 + + updated_reports = [] + created_reports = [] + homework_count_map.each do |school_id, homework_count| + if updated_school_ids.include?(school_id) + updated_reports << "WHEN #{school_id} THEN #{homework_count}" + else + created_reports << "(#{school_id}, '#{date_str}', #{homework_count})" end - else - data = reports.map do |report| - # 无效数据不记录 - next if %w(teacher_count student_count course_count shixun_count shixun_homework_count shixun_evaluate_count active_user_count).all? { |key| report[key].zero? } - - [ - report['id'], report['name'], report['teacher_count'], report['student_count'], report['course_count'], - report['shixun_count'], report['shixun_homework_count'], report['shixun_evaluate_count'], - report['active_user_count'], date_str, current_datetime, current_datetime - ] - end.compact - batch_create_school_daily_reports!(data) if data.present? + end + + if updated_reports.present? + # 这样更新快些 + SchoolDailyReport.connection.execute("UPDATE school_daily_reports SET shixun_homework_count = CASE school_id #{updated_reports.join(' ')} END "\ + "WHERE school_id IN (#{updated_school_ids.join(',')}) AND date = '#{date_str}'") + end + + if created_reports.present? + SchoolDailyReport.connection.execute("INSERT INTO school_daily_reports(school_id, date, shixun_homework_count) VALUES#{created_reports.join(',')}") end end + + custom_logger("Statistic complete! date: #{date_str}") + + date += 1.day + end + end + + # 统计学校历史每天实训评测新增数 + desc 'statistic school shixun evaluate count everyday' + task :statistic_shixun_evaluate_count, [:date] => :environment do |_, args| + date = Time.zone.parse(args[:date]).beginning_of_day + current_date = (Time.zone.now - 5.hour).beginning_of_day + custom_logger("statistic range: #{date}..#{current_date}") + + while current_date > date + date_str = date.strftime('%Y-%m-%d') + + custom_logger("Start statistic => Date: #{date_str} ~") + + begin_date = (date + 5.hour).strftime('%Y-%m-%d %H:%M:%S') + end_date = (date + 1.day + 5.hour).strftime('%Y-%m-%d %H:%M:%S') + + evaluate_count_map = EvaluateRecord.joins('LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = evaluate_records.shixun_id') + .joins('LEFT JOIN homework_commons hc ON hcs.homework_common_id = hc.id AND hc.homework_type = 4') + .joins('LEFT JOIN members ON members.user_id = evaluate_records.user_id') + .joins('LEFT JOIN courses ON members.course_id = courses.id AND hc.course_id = courses.id') + .where(created_at: begin_date...end_date).where('courses.school_id IS NOT NULL') + .reorder(nil).group('courses.school_id').count + + ActiveRecord::Base.transaction do + exist_school_ids = SchoolDailyReport.where(date: date_str).pluck(:school_id) + + updated_school_ids = evaluate_count_map.keys & exist_school_ids # 需要更新的 + + updated_reports = [] + created_reports = [] + evaluate_count_map.each do |school_id, evaluate_count| + if updated_school_ids.include?(school_id) + updated_reports << "WHEN #{school_id} THEN #{evaluate_count}" + else + created_reports << "(#{school_id}, '#{date_str}', #{evaluate_count})" + end + end + + if updated_reports.present? + # 这样更新快些 + SchoolDailyReport.connection.execute("UPDATE school_daily_reports SET shixun_evaluate_count = CASE school_id #{updated_reports.join(' ')} END "\ + "WHERE school_id IN (#{updated_school_ids.join(',')}) AND date = '#{date_str}'") + end + + if created_reports.present? + SchoolDailyReport.connection.execute("INSERT INTO school_daily_reports(school_id, date, shixun_evaluate_count) VALUES#{created_reports.join(',')}") + end + end + custom_logger("Statistic complete! date: #{date_str}") date += 1.day @@ -181,14 +232,12 @@ namespace :school_daily_report do LEFT JOIN courses cs ON hc.course_id = cs.id WHERE cs.school_id = schools.id AND hc.homework_type = 4 AND hc.created_at BETWEEN "#{begin_date}" AND "#{end_date}" ) shixun_homework_count, ( - SELECT COUNT(*) FROM outputs os - LEFT JOIN games gs ON os.game_id = gs.id - LEFT JOIN members ON members.user_id = gs.user_id - LEFT JOIN challenges cls ON gs.challenge_id = cls.id - LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = cls.shixun_id + SELECT COUNT(*) FROM evaluate_records er + LEFT JOIN members ON members.user_id = er.user_id + LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = er.shixun_id LEFT JOIN homework_commons hc ON hcs.homework_common_id = hc.id LEFT JOIN courses ON hc.course_id = courses.id AND members.course_id = courses.id - WHERE courses.school_id = schools.id AND os.created_at BETWEEN "#{begin_date}" AND "#{end_date}" + WHERE courses.school_id = schools.id AND er.created_at BETWEEN "#{begin_date}" AND "#{end_date}" ) shixun_evaluate_count, ( SELECT COUNT(*) FROM users u LEFT JOIN user_extensions ue ON ue.user_id = u.id From 1fe13e8f4a7fbc95861fd640369ccf060b2e3c24 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Wed, 12 Jun 2019 16:38:11 +0800 Subject: [PATCH 02/20] =?UTF-8?q?trainings(=E8=81=94=E7=9B=9F=E5=B8=88?= =?UTF-8?q?=E8=B5=84=E5=9F=B9=E8=AE=AD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/trainings_controller.rb | 6 +- app/views/trainings/enroll.html.erb | 159 ++++++++++++++++++++++ public/assets/iconfont/iconfont.css | 28 +++- public/stylesheets/educoder/trainings.css | 2 +- 4 files changed, 185 insertions(+), 10 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 8d3b6355..cfab83cb 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -5,9 +5,9 @@ class TrainingsController < ApplicationController skip_before_filter :verify_signature, only: [:show, :create, :test] - ROOT_URL = ENV["wechat_url"] || "#{Setting.protocol}://#{Setting.host_name}" - - before_filter :authenticate, except: [:auth, :auth_callback, :pay_callback] + # ROOT_URL = ENV["wechat_url"] || "#{Setting.protocol}://#{Setting.host_name}" + # + # before_filter :authenticate, except: [:auth, :auth_callback, :pay_callback] before_filter :find_training, only: [:show, :test] before_filter :valid_training, only: [:pay, :result, :pay_js] diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index c84a314c..fc9e7234 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -1,3 +1,4 @@ +<% if false %>

湖南警察学院大数据培训缴费

<%= form_for @training do |f| %> @@ -65,6 +66,164 @@ <% end %>
+
+
  • +
  • +
    + +<% end %> +
    +

    信息技术新工科产学研联盟师资培训班

    + <%= form_for @training do |f| %> +

    基本信息

    +
  • + 姓名 + +
  • +
  • + 性别 + + + +
  • +
  • + 单位 + +
  • +
  • + 职称 + +
  • +

    您的授课/研究领域(最少选1项)

    +
  • + 机器学习/深度学习 + + + + +
  • +
  • + 计算机结构与组成 + + + + +
  • +
  • + 计算机系统 + + + + +
  • +
  • + 计算机软件技术和应用 + + + + +
  • +
  • + 计算机理论 + + + + +
  • +
  • + 计算机应用与学科交叉 + + + + +
  • +
  • + 其他 + + + + +
  • +

    通讯地址

    +
  • + + + + + + +
  • +
  • + 手机号码 + +
  • +
  • + Email + +
  • +

    + 完成 + <% end %> +
    +
  • diff --git a/public/assets/iconfont/iconfont.css b/public/assets/iconfont/iconfont.css index 6d4400d5..058c2e74 100644 --- a/public/assets/iconfont/iconfont.css +++ b/public/assets/iconfont/iconfont.css @@ -1,10 +1,10 @@ @font-face {font-family: "iconfont"; - src: url('iconfont.eot?t=1555121827981'); /* IE9 */ - src: url('iconfont.eot?t=1555121827981#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), - url('iconfont.woff?t=1555121827981') format('woff'), - url('iconfont.ttf?t=1555121827981') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ - url('iconfont.svg?t=1555121827981#iconfont') format('svg'); /* iOS 4.1- */ + src: url('iconfont.eot?t=1560325865877'); /* IE9 */ + src: url('iconfont.eot?t=1560325865877#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), + url('iconfont.woff?t=1560325865877') format('woff'), + url('iconfont.ttf?t=1560325865877') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('iconfont.svg?t=1560325865877#iconfont') format('svg'); /* iOS 4.1- */ } .iconfont { @@ -147,10 +147,18 @@ content: "\e727"; } +.icon-tishi1:before { + content: "\e690"; +} + .icon-net:before { content: "\e607"; } +.icon-edit:before { + content: "\e691"; +} + .icon-suo:before { content: "\e6c9"; } @@ -159,6 +167,10 @@ content: "\e67f"; } +.icon-xiazai1:before { + content: "\e6ac"; +} + .icon-chexiao:before { content: "\e657"; } @@ -179,6 +191,10 @@ content: "\e686"; } +.icon-tianjiachengyuan:before { + content: "\e69a"; +} + .icon-triangle:before { content: "\e600"; } diff --git a/public/stylesheets/educoder/trainings.css b/public/stylesheets/educoder/trainings.css index 0ac9ae6d..12d6f00e 100644 --- a/public/stylesheets/educoder/trainings.css +++ b/public/stylesheets/educoder/trainings.css @@ -120,7 +120,7 @@ input::-ms-input-placeholder,textarea::-ms-input-placeholder {color:#cccccc;} span.left_tag{font-weight:bold; } input[type='text'].right_input{ float: right;border: none;text-align: right;height: 44px;line-height: 44px;outline: none; - font-size: 1.4rem;width: 70%;margin-right: 24px; + font-size: 1.4rem;width: 70%;/*margin-right: 24px;*/ } .infoBar label.right_tag{ float: right;color: #cccccc;font-size: 1.4rem;margin-right: 24px; From 7126019a38218963e8f31a6da15f14ea92789e44 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 13 Jun 2019 09:09:05 +0800 Subject: [PATCH 03/20] =?UTF-8?q?=E8=BF=90=E8=90=A5=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E6=9C=89=E6=9D=83=E9=99=90=E6=9F=A5=E7=9C=8B=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E7=9B=B8=E5=BA=94=E5=88=97=E8=A1=A8=E7=9A=84=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/student_work_controller.rb | 2 +- app/models/user.rb | 4 ++-- app/views/users/_l_course.html.erb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index 89fddb36..289c122b 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -496,7 +496,7 @@ class StudentWorkController < ApplicationController def _index # REDO:分班信息提前查出来,然后循环中根据匹配去取 - @is_teacher = User.current.logged? ? (User.current.allowed_to?(:as_teacher,@course) || User.current.admin?) : false + @is_teacher = User.current.logged? ? (User.current.allowed_to?(:as_teacher,@course) || User.current.admin? || User.current.business?) : false @member = @course.members.where(:user_id => User.current.id).first # 判断学生是否有权限查看(作业未发布、作业已发布但不是统一设置的未分班学生、分班设置的作业未发布) if User.current.member_of_course?(@course) && !@is_teacher diff --git a/app/models/user.rb b/app/models/user.rb index 52c4be8b..db1ff58a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1119,7 +1119,7 @@ class User < Principal end def member_of_course?(course) - courses.to_a.include?(course) + courses.to_a.include?(course) || User.current.business? end def member_of_contest?(contest) @@ -1323,7 +1323,7 @@ class User < Principal if Project === context return false unless context.allows_to?(action) # Admin users are authorized for anything else - return true if admin? + return true if admin? || business? # 课程:作品关联项目的老师也可以访问私有项目 course_ids = context.student_work_projects.blank? ? "(-1)" : "(" + context.student_work_projects.map{|swp| swp.course_id}.join(",") + ")" diff --git a/app/views/users/_l_course.html.erb b/app/views/users/_l_course.html.erb index 1a16703f..b7dcf029 100644 --- a/app/views/users/_l_course.html.erb +++ b/app/views/users/_l_course.html.erb @@ -46,7 +46,7 @@ <%#= render :partial => "users/course_item", :locals => {:objects => @objects} %> <% @objects.each do |object| %> - <% allow_visit = @show_all || object.is_public == 1 || User.current.member_of_course?(object) %> + <% allow_visit = @show_all || object.is_public == 1 || User.current.member_of_course?(object) || User.current.business? %>
    <% if object.is_public == 1 %>
    From 15e50f3ee3f472afdcfd3a856f734d3ae76975d7 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 13 Jun 2019 09:53:18 +0800 Subject: [PATCH 04/20] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/trainings_controller.rb | 43 ++- app/models/training.rb | 2 +- app/views/trainings/enroll.html.erb | 264 +++++++++--------- ...13013623_add_reseach_field_to_trainings.rb | 5 + 4 files changed, 168 insertions(+), 146 deletions(-) create mode 100644 db/migrate/20190613013623_add_reseach_field_to_trainings.rb diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index cfab83cb..e3a429b7 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -8,6 +8,9 @@ class TrainingsController < ApplicationController # ROOT_URL = ENV["wechat_url"] || "#{Setting.protocol}://#{Setting.host_name}" # # before_filter :authenticate, except: [:auth, :auth_callback, :pay_callback] + # + before_filter :find_tag_id + before_filter :find_training, only: [:show, :test] before_filter :valid_training, only: [:pay, :result, :pay_js] @@ -15,18 +18,18 @@ class TrainingsController < ApplicationController layout 'base_trainings' - TAG_ID = 'bigdata_hnjcxy_2019' + # TAG_ID = 'bigdata_hnjcxy_2019' def show @training = current_training url = nil if @training && !@training.pay? - url = enroll_training_path(id: TAG_ID) + url = enroll_training_path(id: @tag_id) elsif @training && @training.pay? - url = result_training_path(id: TAG_ID) + url = result_training_path(id: @tag_id) else - url = enroll_training_path(id: TAG_ID) + url = enroll_training_path(id: @tag_id) end redirect_to url @@ -45,7 +48,7 @@ class TrainingsController < ApplicationController # 防止重复支付,对于已支付过的,不应该再到这个页来 if @training.payed? - redirect_to result_training_path(id: TAG_ID) + redirect_to result_training_path(id: @tag_id) return end @@ -100,11 +103,15 @@ class TrainingsController < ApplicationController def create @training = current_training || Training.new(params) - @training.training_type = Training::Training_Type + @training.training_type = @training_type + if @training_type == 3 + @training.research_field = params[:research_field].reject(&:blank?).uniq.join(",") + end @training.openid = session[:wechat_open_id] @training.save! - redirect_to pay_training_path(id: TAG_ID) + redirect_to enroll_training_path(id: @tag_id) + # redirect_to pay_training_path(id: @tag_id) end @@ -116,7 +123,7 @@ class TrainingsController < ApplicationController end @training.update_attributes(params) - redirect_to pay_training_path(id: TAG_ID) + redirect_to pay_training_path(id: @tag_id) end @@ -168,7 +175,7 @@ class TrainingsController < ApplicationController if params[:js] == 'true' _pay_js(training_info.fee) else - redirect_to url = result_training_path(id: TAG_ID) + redirect_to url = result_training_path(id: @tag_id) end end @@ -232,11 +239,11 @@ class TrainingsController < ApplicationController url = '' if !@training - url = training_path(id: TAG_ID) + url = training_path(id: @tag_id) elsif !@training.pay? - url = enroll_training_path(id: TAG_ID) + url = enroll_training_path(id: @tag_id) else - url = result_training_path(id: TAG_ID) + url = result_training_path(id: @tag_id) end redirect_to url @@ -262,8 +269,14 @@ class TrainingsController < ApplicationController end end + def find_tag_id + @tag_id = params[:id] + @training_type = @tag_id == "aeee0601_2019" ? 3 : @tag_id == "ceeaa06_2019" ? 4 : 0 + render_404 if @training_type == 0 + end + def find_training - if params[:id] == TAG_ID + if params[:id] == @tag_id @training = current_training else render_404 @@ -271,12 +284,12 @@ class TrainingsController < ApplicationController end def current_training - Training.where(openid: session[:wechat_open_id], training_type: Training::Training_Type).first + Training.where(openid: session[:wechat_open_id], training_type: @training_type).first end def valid_training unless current_training - redirect_to training_path(id: TAG_ID) + redirect_to training_path(id: @tag_id) end end diff --git a/app/models/training.rb b/app/models/training.rb index 4c1f182e..a5794de2 100644 --- a/app/models/training.rb +++ b/app/models/training.rb @@ -3,7 +3,7 @@ class Training < ActiveRecord::Base attr_accessible :address, :email, :name, :phone, :position, :school, :sex, :openid, :training_type, :major, :student_id - # training_type 1 2018-培训会 2 警察学院大数据培训会 + # training_type 1 2018-培训会 2 警察学院大数据培训会 3 大数据和人工智能 4 工程教育认证 has_one :training_payinfo diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index fc9e7234..149de110 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -1,19 +1,19 @@ <% if false %> -
    -

    湖南警察学院大数据培训缴费

    - <%= form_for @training do |f| %> -

    基本信息

    -
  • - 姓名 - -
  • -
  • - 性别 - - - -
  • +
    +

    湖南警察学院大数据培训缴费

    + <%= form_for @training do |f| %> +

    基本信息

    +
  • + 姓名 + +
  • +
  • + 性别 + + + +
  • 专业
  • - - - -
  • - 手机号码 - -
  • - -

    - 下一步 - <% end %> -
    +

    + 下一步 + <% end %> +
    -
    -
  • -
  • -
    - + <% end %>

    信息技术新工科产学研联盟师资培训班

    <%= form_for @training do |f| %> -

    基本信息

    -
  • - 姓名 - -
  • -
  • - 性别 - - - -
  • -
  • - 单位 - -
  • -
  • - 职称 - -
  • +

    基本信息

    +
  • + 姓名 + +
  • +
  • + 性别 + + + +
  • +
  • + 单位 + +
  • +
  • + 职称 + +
  • + + <% if @training_type == 3 %>

    您的授课/研究领域(最少选1项)

  • 机器学习/深度学习 - +
  • 计算机结构与组成 - +
  • 计算机系统 - +
  • 计算机软件技术和应用 - +
  • 计算机理论 - +
  • 计算机应用与学科交叉 - +
  • 其他 - +
  • -

    通讯地址

    -
  • - - - - - - -
  • -
  • - 手机号码 - -
  • -
  • - Email - -
  • -

    - 完成 + <% end %> + +

    通讯地址

    +
  • + + + + + + +
  • +
  • + 手机号码 + +
  • +
  • + Email + +
  • +

    + 完成 <% end %>
    @@ -238,9 +242,9 @@ $(down).find("#sexl").html($(this).html()); hideNav(downNav); - if ($(this).html()=='男'){ + if ($(this).html() == '男') { $('#sex').val("1"); - } else { + } else { $('#sex').val("2"); } }) diff --git a/db/migrate/20190613013623_add_reseach_field_to_trainings.rb b/db/migrate/20190613013623_add_reseach_field_to_trainings.rb new file mode 100644 index 00000000..5354d13a --- /dev/null +++ b/db/migrate/20190613013623_add_reseach_field_to_trainings.rb @@ -0,0 +1,5 @@ +class AddReseachFieldToTrainings < ActiveRecord::Migration + def change + add_column :trainings, :research_field, :string + end +end From 3e7cf794b6e9e882b46281a53c307553204f794a Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 13 Jun 2019 09:56:08 +0800 Subject: [PATCH 05/20] =?UTF-8?q?=E5=A4=A7=E6=95=B0=E6=8D=AE=E5=92=8C?= =?UTF-8?q?=E4=BA=BA=E5=B7=A5=E6=99=BA=E8=83=BD=E7=9A=84=E6=8A=A5=E5=90=8D?= =?UTF-8?q?=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/trainings/enroll.html.erb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index 149de110..ff00277d 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -156,49 +156,49 @@
  • 机器学习/深度学习 - + id="check_1" class="magic-checkbox">
  • 计算机结构与组成 - + id="check_2" class="magic-checkbox">
  • 计算机系统 - + id="check_3" class="magic-checkbox">
  • 计算机软件技术和应用 - + id="check_4" class="magic-checkbox">
  • 计算机理论 - + id="check_5" class="magic-checkbox">
  • 计算机应用与学科交叉 - + id="check_6" class="magic-checkbox">
  • 其他 - + id="check_7" class="magic-checkbox">
  • From f939186ca394111e959152da44cfdf2bef77102f Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 13 Jun 2019 10:48:10 +0800 Subject: [PATCH 06/20] =?UTF-8?q?=E6=8A=A5=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/trainings_controller.rb | 3 +++ app/views/trainings/enroll.html.erb | 10 +++++----- .../20190613021248_add_technical_title_to_trainings.rb | 5 +++++ 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20190613021248_add_technical_title_to_trainings.rb diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index e3a429b7..f99de3e9 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -37,6 +37,7 @@ class TrainingsController < ApplicationController def enroll @training = current_training || Training.new + @training_title = @training_type == 3 ? "信息技术新工科产学研联盟师资培训班" : "工程教育认证" end @@ -271,6 +272,7 @@ class TrainingsController < ApplicationController def find_tag_id @tag_id = params[:id] + Rails.logger.info("##########TAG_ID:#{@tag_id}") @training_type = @tag_id == "aeee0601_2019" ? 3 : @tag_id == "ceeaa06_2019" ? 4 : 0 render_404 if @training_type == 0 end @@ -284,6 +286,7 @@ class TrainingsController < ApplicationController end def current_training + Rails.logger.info("##########openid:#{session[:wechat_open_id]}, training_type: #{@training_type}") Training.where(openid: session[:wechat_open_id], training_type: @training_type).first end diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index ff00277d..4c62f1d2 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -124,7 +124,7 @@ <% end %>
    -

    信息技术新工科产学研联盟师资培训班

    +

    <%= @training_title %>

    <%= form_for @training do |f| %>

    基本信息

  • @@ -141,14 +141,14 @@
  • 单位 + name="school" + value="<%= @training.school %>"/>
  • 职称 + name="technical_title" + value="<%= @training.technical_title %>"/>
  • <% if @training_type == 3 %> diff --git a/db/migrate/20190613021248_add_technical_title_to_trainings.rb b/db/migrate/20190613021248_add_technical_title_to_trainings.rb new file mode 100644 index 00000000..ea6b1002 --- /dev/null +++ b/db/migrate/20190613021248_add_technical_title_to_trainings.rb @@ -0,0 +1,5 @@ +class AddTechnicalTitleToTrainings < ActiveRecord::Migration + def change + add_column :trainings, :technical_title, :string + end +end From 94f1899930e0bc6b02902577aa76cf2248242954 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 13 Jun 2019 11:03:56 +0800 Subject: [PATCH 07/20] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E7=AD=89=E7=BA=A7?= =?UTF-8?q?=E4=BD=93=E7=B3=BB=E5=AF=BC=E5=87=BAexcel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 2 +- app/controllers/managements_controller.rb | 35 +++++++++++++++++++ app/controllers/shixuns_controller.rb | 3 +- .../managements/_subject_level_list.html.erb | 3 ++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c3865f3f..e44005a4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -376,7 +376,7 @@ class ApplicationController < ActionController::Base def require_admin return unless require_login - if !User.current.admin? && @shixun.status > 1 + if !User.current.admin? render_403 return false end diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index 13c24a3e..d5852fce 100644 --- a/app/controllers/managements_controller.rb +++ b/app/controllers/managements_controller.rb @@ -32,6 +32,14 @@ class ManagementsController < ApplicationController # 实训课程等级体系 def subject_level_system @levels = SubjectLevelSystem.all + respond_to do |format| + format.html + format.xls{ + time = Time.now.strftime("%Y%m%d") + filename = "实训课程体系#{time}.xls" + send_data(export_subject_level_system(), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) + } + end end # 创建课程等级体系 @@ -4286,6 +4294,33 @@ end return sheet.rows end + def export_subject_level_system + xls_report = StringIO.new + book = Spreadsheet::Workbook.new + sheet1 = book.create_worksheet :name => "实训课程等级体系" + blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 + sheet1.row(0).default_format = blue + count_row = 1 + sheet1.row(0).concat(["序号", "等级", "实训课程名称", "实训课程url", "实训名称"]) + levels = SubjectLevelSystem.includes(subjects: [stage_shixuns: :shixun]).where(nil) + levels.each_with_index do |level, i| + sheet1[count_row, 0] = i + 1 + sheet1[count_row, 1] = level.level + level.subjects.each do |subject| + sheet1[count_row, 2] = subject.name + sheet1[count_row, 3] = "#{subject_path(subject)}" + count_row += 1 + subject.shixuns.each do |shixun| + sheet1[count_row, 4] = shixun.name + count_row += 1 + end + end + count_row += 1 + end + book.write xls_report + xls_report.string + end + def shixun_feedback_xls shixun_ids, beginTime, endTime xls_report = StringIO.new book = Spreadsheet::Workbook.new diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 56766264..e47938ac 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -10,7 +10,7 @@ class ShixunsController < ApplicationController before_filter :view_allow, :only => [:collaborators, :propaedeutics, :shixun_discuss, :ranking_list] before_filter :require_manager, :only => [ :settings, :add_script, :publish, :collaborators_delete, :shixun_members_added, :add_collaborators, :update, :destroy] before_filter :validation_email, :only => [:new] - before_filter :require_admin, :only => [:destroy] + #before_filter :require_manager, :only => [:destroy] # 移动云ToC模式权限控制 # before_filter :ecloud_auth, :except => [:show, :index] @@ -1117,6 +1117,7 @@ class ShixunsController < ApplicationController end def destroy + render_403 if @shixun.status > 1 && !User.current.admin? ActiveRecord::Base.transaction do g = Gitlab.client g.delete_project(@shixun.gpid) if @shixun.try(:gpid).present? diff --git a/app/views/managements/_subject_level_list.html.erb b/app/views/managements/_subject_level_list.html.erb index 1a4bf6d7..0988bd6e 100644 --- a/app/views/managements/_subject_level_list.html.erb +++ b/app/views/managements/_subject_level_list.html.erb @@ -1,3 +1,6 @@ + From b5730f6dcd87281791fff9d9a361665ffc2b3ec7 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Thu, 13 Jun 2019 11:06:03 +0800 Subject: [PATCH 08/20] =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=8A=80=E6=9C=AF?= =?UTF-8?q?=E6=96=B0=E5=B7=A5=E7=A7=91=E4=BA=A7=E5=AD=A6=E7=A0=94=E8=81=94?= =?UTF-8?q?=E7=9B=9F=E5=B8=88=E8=B5=84=E7=A0=94=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/trainings/enroll.html.erb | 40 ++++++++++++++++++++--- public/stylesheets/educoder/trainings.css | 7 ++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index fc9e7234..9aa5a7f5 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -124,7 +124,7 @@ <% end %>
    -

    信息技术新工科产学研联盟师资培训班

    +

    信息技术新工科产学研联盟师资研修

    <%= form_for @training do |f| %>

    基本信息

  • @@ -146,9 +146,41 @@
  • 职称 - + + + + + + + + + + + + + +
  • +

    培训类型

    +
  • + 大数据方向 + + + + +
  • +
  • + 人工智能方向 + + + + +
  • +
  • + 大数据+人工智能方向 + + + +
  • 您的授课/研究领域(最少选1项)

  • diff --git a/public/stylesheets/educoder/trainings.css b/public/stylesheets/educoder/trainings.css index 12d6f00e..18038b11 100644 --- a/public/stylesheets/educoder/trainings.css +++ b/public/stylesheets/educoder/trainings.css @@ -122,6 +122,13 @@ input[type='text'].right_input{ float: right;border: none;text-align: right;height: 44px;line-height: 44px;outline: none; font-size: 1.4rem;width: 70%;/*margin-right: 24px;*/ } +.PositionalRight .magic-radio + label:before,.PositionalRight .magic-checkbox + label:before{ + top:13px!important; +} +.PositionalRight .magic-radio + label:after{ + top: 18px!important; +} +.mr15{margin-right: 15px;} .infoBar label.right_tag{ float: right;color: #cccccc;font-size: 1.4rem;margin-right: 24px; } From 1519881efd8aea1f92af11d2b29d499183e6066e Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 13 Jun 2019 11:08:24 +0800 Subject: [PATCH 09/20] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=AE=9E=E8=AE=AD?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E7=B3=BB=E7=BB=9F=E5=A2=9E=E5=8A=A0url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/managements_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index d5852fce..6ab4ed43 100644 --- a/app/controllers/managements_controller.rb +++ b/app/controllers/managements_controller.rb @@ -4305,10 +4305,10 @@ end levels = SubjectLevelSystem.includes(subjects: [stage_shixuns: :shixun]).where(nil) levels.each_with_index do |level, i| sheet1[count_row, 0] = i + 1 - sheet1[count_row, 1] = level.level + sheet1[count_row, 1] = level.name level.subjects.each do |subject| sheet1[count_row, 2] = subject.name - sheet1[count_row, 3] = "#{subject_path(subject)}" + sheet1[count_row, 3] = "#{Setting.protocol}://#{Setting.host_name}#{subject_path(subject)}" count_row += 1 subject.shixuns.each do |shixun| sheet1[count_row, 4] = shixun.name From d9e2f2d52eecd84b1801e0128cc3f67c34c068b9 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 13 Jun 2019 11:20:56 +0800 Subject: [PATCH 10/20] tiaozn --- app/controllers/trainings_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index f99de3e9..647be129 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -37,7 +37,9 @@ class TrainingsController < ApplicationController def enroll @training = current_training || Training.new + Rails.logger.info("##########training_type:#{@training_type}") @training_title = @training_type == 3 ? "信息技术新工科产学研联盟师资培训班" : "工程教育认证" + Rails.logger.info("##########training_title:#{@training_title}") end From 5b6b957853724526a05443c924aa88895362f840 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 13 Jun 2019 12:34:49 +0800 Subject: [PATCH 11/20] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=9B=86=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E5=A2=9E=E9=95=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20190613043232_modify_input_for_test_sets.rb | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 db/migrate/20190613043232_modify_input_for_test_sets.rb diff --git a/db/migrate/20190613043232_modify_input_for_test_sets.rb b/db/migrate/20190613043232_modify_input_for_test_sets.rb new file mode 100644 index 00000000..14d71acc --- /dev/null +++ b/db/migrate/20190613043232_modify_input_for_test_sets.rb @@ -0,0 +1,8 @@ +class ModifyInputForTestSets < ActiveRecord::Migration + def up + change_column :test_sets, :input, :text + end + + def down + end +end From b407cd1057c37f1b711532625d7ea236a4448c3d Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 13 Jun 2019 13:57:18 +0800 Subject: [PATCH 12/20] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E4=BD=93=E7=B3=BB=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/managements_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index 6ab4ed43..d3da4c46 100644 --- a/app/controllers/managements_controller.rb +++ b/app/controllers/managements_controller.rb @@ -33,6 +33,7 @@ class ManagementsController < ApplicationController def subject_level_system @levels = SubjectLevelSystem.all respond_to do |format| + format.js format.html format.xls{ time = Time.now.strftime("%Y%m%d") From 37c529b3565e8bca471f912899a77c5274418c14 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Thu, 13 Jun 2019 14:04:54 +0800 Subject: [PATCH 13/20] =?UTF-8?q?=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/trainings/pay.html.erb | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 87b720ca..17808d34 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -15,22 +15,22 @@
  • -

    800190320609016

    +

    1901008009200085901

  • -

    湖南酷得网络科技有限公司

    +

    长沙智擎信息技术有限公司

  • -

    长沙银行股份有限公司四方支行

    +

    工商银行长沙市岳麓山支行

  • 完成线下支付后,请将支付截图粘贴到备注中,以便财务审核

    - +

    备注

    @@ -137,20 +137,20 @@ // invoiceNo: '<%#= @training.training_payinfo.invoice_no %>' // }; //点击弹出发票弹框 - //aboutBillType(userInfo); + aboutBillType(userInfo); //点击弹出支付方式弹框 aboutPayType(); //初始化发票类型 - /*InitBill(userInfo);*/ + InitBill(userInfo); //切换发票类型 - /*$(".billType li").on("click", function () { + $(".billType li").on("click", function () { $(".billType li").removeClass("active"); $(this).addClass("active"); billTypeShowFun(parseInt($(this).index()),userInfo); - })*/ + }) //关闭弹窗 $(".billClose").on("click", function () { hideNav($(".downNav")); @@ -257,7 +257,7 @@ }) }) //页面加载时,初始化发票类型 - /*function InitBill(userInfo){ + function InitBill(userInfo){ var index=2; $("#billDemand").html("不需要").attr("status",2); if(userInfo.invoiceTitle != "" && userInfo.invoiceNo != ""){ @@ -271,7 +271,7 @@ $(".billType li").removeClass("active"); $(".billType li").eq(index).addClass("active"); billTypeShowFun(index,userInfo); - }*/ + } function billTypeShowFun(index,userInfo){ if (parseInt(index) == 0) { $(".needWrite").removeClass("none"); @@ -288,11 +288,11 @@ } //点击弹出发票类型弹框 - /*function aboutBillType(userInfo){ + function aboutBillType(userInfo){ var bill = $("#billLine"); var billNav = $(".billDownNav"); showNav(bill, billNav, "down"); - }*/ + } //点击弹出支付方式弹框 function aboutPayType() { From 7d6c272f347520a29f97bd8979eac00a1bca260d Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 13 Jun 2019 15:06:06 +0800 Subject: [PATCH 14/20] fix --- app/controllers/trainings_controller.rb | 4 +--- app/models/training.rb | 4 ++++ app/views/trainings/enroll.html.erb | 20 +++++++++---------- ...13013623_add_reseach_field_to_trainings.rb | 5 +++++ ...3745_add_training_category_to_trainings.rb | 5 +++++ 5 files changed, 25 insertions(+), 13 deletions(-) create mode 100644 db/migrate/20190613013623_add_reseach_field_to_trainings.rb create mode 100644 db/migrate/20190613063745_add_training_category_to_trainings.rb diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 647be129..2f88d634 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -109,6 +109,7 @@ class TrainingsController < ApplicationController @training.training_type = @training_type if @training_type == 3 @training.research_field = params[:research_field].reject(&:blank?).uniq.join(",") + @training.training_category = params[:training_category] end @training.openid = session[:wechat_open_id] @training.save! @@ -298,9 +299,6 @@ class TrainingsController < ApplicationController end end - - private - def js_function_call begin yield if block_given? diff --git a/app/models/training.rb b/app/models/training.rb index a5794de2..7c1333be 100644 --- a/app/models/training.rb +++ b/app/models/training.rb @@ -21,4 +21,8 @@ class Training < ActiveRecord::Base pay? && training_payinfo.payed? end + def research_field_include?(str) + research_field.present? && research_field.split(',').include?(str) + end + end diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index e926ed75..3acb9c3f 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -164,21 +164,21 @@
  • 大数据方向 - +
  • 人工智能方向 - +
  • 大数据+人工智能方向 - +
  • @@ -187,49 +187,49 @@
  • 机器学习/深度学习 - id="check_1" class="magic-checkbox"> + id="check_1" class="magic-checkbox">
  • 计算机结构与组成 - id="check_2" class="magic-checkbox"> + id="check_2" class="magic-checkbox">
  • 计算机系统 - id="check_3" class="magic-checkbox"> + id="check_3" class="magic-checkbox">
  • 计算机软件技术和应用 - id="check_4" class="magic-checkbox"> + id="check_4" class="magic-checkbox">
  • 计算机理论 - id="check_5" class="magic-checkbox"> + id="check_5" class="magic-checkbox">
  • 计算机应用与学科交叉 - id="check_6" class="magic-checkbox"> + id="check_6" class="magic-checkbox">
  • 其他 - id="check_7" class="magic-checkbox"> + id="check_7" class="magic-checkbox">
  • diff --git a/db/migrate/20190613013623_add_reseach_field_to_trainings.rb b/db/migrate/20190613013623_add_reseach_field_to_trainings.rb new file mode 100644 index 00000000..5354d13a --- /dev/null +++ b/db/migrate/20190613013623_add_reseach_field_to_trainings.rb @@ -0,0 +1,5 @@ +class AddReseachFieldToTrainings < ActiveRecord::Migration + def change + add_column :trainings, :research_field, :string + end +end diff --git a/db/migrate/20190613063745_add_training_category_to_trainings.rb b/db/migrate/20190613063745_add_training_category_to_trainings.rb new file mode 100644 index 00000000..f304a27d --- /dev/null +++ b/db/migrate/20190613063745_add_training_category_to_trainings.rb @@ -0,0 +1,5 @@ +class AddTrainingCategoryToTrainings < ActiveRecord::Migration + def change + add_column :trainings, :training_category, :string + end +end From 1c52835c1a69e4ba86517c7dadef3c5f21d00c60 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 13 Jun 2019 15:33:30 +0800 Subject: [PATCH 15/20] training: enroll update --- app/controllers/trainings_controller.rb | 9 +++++++-- app/views/trainings/enroll.html.erb | 12 +++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 2f88d634..7b9164b5 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -108,7 +108,7 @@ class TrainingsController < ApplicationController @training = current_training || Training.new(params) @training.training_type = @training_type if @training_type == 3 - @training.research_field = params[:research_field].reject(&:blank?).uniq.join(",") + @training.research_field = params[:research_field].select(&:present?).uniq.join(",") @training.training_category = params[:training_category] end @training.openid = session[:wechat_open_id] @@ -126,7 +126,12 @@ class TrainingsController < ApplicationController return end - @training.update_attributes(params) + @training.assign_attributes(params) + if @training.training_type == 3 + @training.research_field = params[:research_field].select(&:present?).uniq.join(",") + @training.training_category = params[:training_category] + end + @training.save! redirect_to pay_training_path(id: @tag_id) end diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index 3acb9c3f..4def0abe 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -126,6 +126,8 @@

    <%= @training_title %>

    <%= form_for @training do |f| %> + <%= hidden_field_tag(:id, @tag_id) %> +

    基本信息

  • 姓名 @@ -160,29 +162,29 @@ name="technical_title" value="<%#= @training.technical_title %>"/>-->
  • -

    培训类型

    + <% if @training_type == 3 %> +

    培训类型

  • 大数据方向 - + <%= radio_button_tag(:training_category, 'large_data', @training.training_category == 'large_data', id: 'type_1', class: 'magic-radio') %>
  • 人工智能方向 - + <%= radio_button_tag(:training_category, 'ai', @training.training_category == 'ai', id: 'type_2', class: 'magic-radio') %>
  • 大数据+人工智能方向 - + <%= radio_button_tag(:training_category, 'large_data_and_ai', @training.training_category == 'large_data_and_ai', id: 'type_3', class: 'magic-radio') %>
  • - <% if @training_type == 3 %>

    您的授课/研究领域(最少选1项)

  • 机器学习/深度学习 From 8ddfbcc7c780e12ce60fbfd1ce3390b4bc35f9aa Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 13 Jun 2019 15:59:31 +0800 Subject: [PATCH 16/20] training: add form check --- app/controllers/trainings_controller.rb | 2 +- app/views/trainings/enroll.html.erb | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 7b9164b5..40757ade 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -279,7 +279,7 @@ class TrainingsController < ApplicationController end def find_tag_id - @tag_id = params[:id] + @tag_id = params[:tag_id] || params[:id] Rails.logger.info("##########TAG_ID:#{@tag_id}") @training_type = @tag_id == "aeee0601_2019" ? 3 : @tag_id == "ceeaa06_2019" ? 4 : 0 render_404 if @training_type == 0 diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index 4def0abe..d6543a23 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -126,7 +126,7 @@

    <%= @training_title %>

    <%= form_for @training do |f| %> - <%= hidden_field_tag(:id, @tag_id) %> + <%= hidden_field_tag(:tag_id, @tag_id) %>

    基本信息

  • @@ -304,6 +304,19 @@ return; } + <% if @training_type == 3 %> + var trainingCategory = $('input[type="radio"][name="training_category"]:checked').val(); + if (trainingCategory == undefined || trainingCategory == '') { + alert('请选择培训类型'); + return; + } + + if ($("input[type='checkbox'][name='research_field[]']:checked").length == 0) { + alert('请选择授课类型/研究领域'); + return; + } + <% end %> + if (userphone == '') { alert("请输入手机号码"); return; From 525b47e36c74f621997ebdc88bd1aafe13c7efc2 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 13 Jun 2019 16:21:02 +0800 Subject: [PATCH 17/20] modify --- app/controllers/managements_controller.rb | 24 ++++++++++++----------- app/controllers/trainings_controller.rb | 4 +++- app/views/trainings/enroll.html.erb | 22 ++++++--------------- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index 769481b0..db74d39a 100644 --- a/app/controllers/managements_controller.rb +++ b/app/controllers/managements_controller.rb @@ -4151,7 +4151,7 @@ end sheet1 = book.create_worksheet :name => "sheet" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 sheet1.row(0).default_format = blue - sheet1.row(0).concat(["姓名", "手机号","邮箱","单位名称", "职位","专业", "学号", "支付方式","支付状态","支付时间", "发票类型", "发票抬头","税务登记号", "发票内容", "备注", "微信支付单号", "报名时间"]) + sheet1.row(0).concat(["姓名", "手机号","邮箱","单位名称", "职位","专业", "学号", '培训类型', '授课/研究领域' "支付方式","支付状态","支付时间", "发票类型", "发票抬头","税务登记号", "发票内容", "备注", "微信支付单号", "报名时间"]) count_row = 1 trainings.find_each do |t| sheet1[count_row, 0] = t.name @@ -4161,16 +4161,18 @@ end sheet1[count_row, 4] = t.position sheet1[count_row, 5] = t.major sheet1[count_row, 6] = t.student_id - sheet1[count_row, 7] = t.training_payinfo.try(:pay_type_str) - sheet1[count_row, 8] = t.training_payinfo.try(:pay_status_str) - sheet1[count_row, 9] = format_time t.training_payinfo.try(:pay_time) - sheet1[count_row, 10] = t.training_payinfo.try(:invoice_title).present? ? '需要' : '不需要' - sheet1[count_row, 11] = t.training_payinfo.try(:invoice_title) - sheet1[count_row, 12] = t.training_payinfo.try(:invoice_no) - sheet1[count_row, 13] = t.training_payinfo.try(:invoice_content) - sheet1[count_row, 14] = t.training_payinfo.try(:info) - sheet1[count_row, 15] = t.training_payinfo.try(:out_trade_no) - sheet1[count_row, 16] = format_time t.created_at + sheet1[count_row, 7] = t.training_category + sheet1[count_row, 8] = t.research_field + sheet1[count_row, 9] = t.training_payinfo.try(:pay_type_str) + sheet1[count_row, 10] = t.training_payinfo.try(:pay_status_str) + sheet1[count_row, 11] = format_time t.training_payinfo.try(:pay_time) + sheet1[count_row, 12] = t.training_payinfo.try(:invoice_title).present? ? '需要' : '不需要' + sheet1[count_row, 13] = t.training_payinfo.try(:invoice_title) + sheet1[count_row, 14] = t.training_payinfo.try(:invoice_no) + sheet1[count_row, 15] = t.training_payinfo.try(:invoice_content) + sheet1[count_row, 16] = t.training_payinfo.try(:info) + sheet1[count_row, 17] = t.training_payinfo.try(:out_trade_no) + sheet1[count_row, 18] = format_time t.created_at count_row += 1 end book.write xls_report diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 40757ade..930efbb7 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -132,7 +132,9 @@ class TrainingsController < ApplicationController @training.training_category = params[:training_category] end @training.save! - redirect_to pay_training_path(id: @tag_id) + + redirect_to enroll_training_path(id: @tag_id) + # redirect_to pay_training_path(id: @tag_id) end diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index d6543a23..7cc642d2 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -148,40 +148,30 @@
  • 职称 - - - - - - - - - - - +
  • <% if @training_type == 3 %>

    培训类型

  • 大数据方向 - <%= radio_button_tag(:training_category, 'large_data', @training.training_category == 'large_data', id: 'type_1', class: 'magic-radio') %> + <%= radio_button_tag(:training_category, '大数据方向', @training.training_category == '大数据方向', id: 'type_1', class: 'magic-radio') %>
  • 人工智能方向 - <%= radio_button_tag(:training_category, 'ai', @training.training_category == 'ai', id: 'type_2', class: 'magic-radio') %> + <%= radio_button_tag(:training_category, '人工智能方向', @training.training_category == '人工智能方向', id: 'type_2', class: 'magic-radio') %>
  • 大数据+人工智能方向 - <%= radio_button_tag(:training_category, 'large_data_and_ai', @training.training_category == 'large_data_and_ai', id: 'type_3', class: 'magic-radio') %> + <%= radio_button_tag(:training_category, '大数据+人工智能方向', @training.training_category == '大数据+人工智能方向', id: 'type_3', class: 'magic-radio') %>
  • From e762fb336d5a16a0cbb19300a4745bac19481f92 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 13 Jun 2019 16:32:47 +0800 Subject: [PATCH 18/20] remove explan --- app/controllers/trainings_controller.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 930efbb7..dfb7c716 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -5,10 +5,10 @@ class TrainingsController < ApplicationController skip_before_filter :verify_signature, only: [:show, :create, :test] - # ROOT_URL = ENV["wechat_url"] || "#{Setting.protocol}://#{Setting.host_name}" - # - # before_filter :authenticate, except: [:auth, :auth_callback, :pay_callback] - # + ROOT_URL = ENV["wechat_url"] || "#{Setting.protocol}://#{Setting.host_name}" + + before_filter :authenticate, except: [:auth, :auth_callback, :pay_callback] + before_filter :find_tag_id before_filter :find_training, only: [:show, :test] From b56921ca685f0b06000732520653470063a8c7de Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 13 Jun 2019 16:52:08 +0800 Subject: [PATCH 19/20] fix --- app/controllers/trainings_controller.rb | 2 +- app/views/trainings/enroll.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index dfb7c716..9612c67f 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -3,7 +3,7 @@ require 'base64' class TrainingsController < ApplicationController wechat_responder - skip_before_filter :verify_signature, only: [:show, :create, :test] + skip_before_filter :verify_signature, only: [:show, :create, :update, :test, :enroll] ROOT_URL = ENV["wechat_url"] || "#{Setting.protocol}://#{Setting.host_name}" diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index 7cc642d2..02b5a4d9 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -125,7 +125,7 @@ <% end %>

    <%= @training_title %>

    - <%= form_for @training do |f| %> + <%= form_for (@training || Training.new) do |f| %> <%= hidden_field_tag(:tag_id, @tag_id) %>

    基本信息

    From 50f9946b6bbb74d21a1720f4dfb826fb972bfc32 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 13 Jun 2019 17:02:18 +0800 Subject: [PATCH 20/20] fix --- app/controllers/trainings_controller.rb | 2 -- app/views/trainings/enroll.html.erb | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 9612c67f..a74c55f1 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -42,8 +42,6 @@ class TrainingsController < ApplicationController Rails.logger.info("##########training_title:#{@training_title}") end - - def pay _pay_params diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index 02b5a4d9..7cc642d2 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -125,7 +125,7 @@ <% end %>

    <%= @training_title %>

    - <%= form_for (@training || Training.new) do |f| %> + <%= form_for @training do |f| %> <%= hidden_field_tag(:tag_id, @tag_id) %>

    基本信息

    等级