From 2bcf334ecba194f17ebec641023ccddcf6c0d4da Mon Sep 17 00:00:00 2001 From: p31729568 Date: Wed, 12 Jun 2019 15:30:28 +0800 Subject: [PATCH 01/55] 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/55] =?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/55] =?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/55] =?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/55] =?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/55] =?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/55] =?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/55] =?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/55] =?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/55] 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/55] =?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/55] =?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/55] =?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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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/55] 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) %>

    基本信息

    From 7cebe3524f7c2a8a505815e5e1c72c4057f5a925 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 13 Jun 2019 18:32:27 +0800 Subject: [PATCH 21/55] trainings: fix 404 --- app/controllers/trainings_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index a74c55f1..24638161 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -9,7 +9,7 @@ class TrainingsController < ApplicationController before_filter :authenticate, except: [:auth, :auth_callback, :pay_callback] - before_filter :find_tag_id + before_filter :find_tag_id, only: [:show, :create, :update, :enroll, :test] before_filter :find_training, only: [:show, :test] @@ -270,7 +270,7 @@ class TrainingsController < ApplicationController def authenticate if Rails.env.development? - # session[:wechat_open_id] = "o5fSc0607iR3rp4-h_VnuBTp8CiM" + session[:wechat_open_id] = "o5fSc0607iR3rp4-h_VnuBTp8CiM" end unless session[:wechat_open_id].present? From 8b716bf8afeadd079797f981c2871d0f90f28f03 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 13 Jun 2019 19:35:06 +0800 Subject: [PATCH 22/55] trainings: fix require login --- app/controllers/trainings_controller.rb | 26 +++++-------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 24638161..2542dbb5 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -3,6 +3,7 @@ require 'base64' class TrainingsController < ApplicationController wechat_responder + skip_before_filter :check_if_login_required skip_before_filter :verify_signature, only: [:show, :create, :update, :test, :enroll] ROOT_URL = ENV["wechat_url"] || "#{Setting.protocol}://#{Setting.host_name}" @@ -225,7 +226,7 @@ class TrainingsController < ApplicationController # 用于权限跳转 def auth state = params[:state] - url = "#{ROOT_URL}/trainings/auth_callback" + url = CGI.escape("#{ROOT_URL}/trainings/auth_callback?return_url=#{params[:return_url]}") authorize_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{url}&response_type=code&scope=snsapi_base&state=#{state}&connect_redirect=1#wechat_redirect" redirect_to authorize_url end @@ -237,26 +238,9 @@ class TrainingsController < ApplicationController render 'wechats/open_wechat', layout: nil and return end - session[:wechat_open_id] = open_id - # 考虑状态 - # 1. 无记录或未支付 - # 2. 已填写未付款 - # - @training = current_training - - url = '' - if !@training - url = training_path(id: @tag_id) - elsif !@training.pay? - url = enroll_training_path(id: @tag_id) - else - url = result_training_path(id: @tag_id) - end - - redirect_to url - + redirect_to params[:return_url].present? ? params[:return_url] : '/' end def test @@ -270,11 +254,11 @@ class TrainingsController < ApplicationController def authenticate if Rails.env.development? - session[:wechat_open_id] = "o5fSc0607iR3rp4-h_VnuBTp8CiM" + # session[:wechat_open_id] = "o5fSc0607iR3rp4-h_VnuBTp8CiM" end unless session[:wechat_open_id].present? - redirect_to auth_trainings_path + redirect_to auth_trainings_path(return_url: CGI.escape(request.path)) end end From 46450f2068effceebb7c240f957b23a0703db0e0 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 13 Jun 2019 21:42:34 +0800 Subject: [PATCH 23/55] training: remove training category column --- app/controllers/managements_controller.rb | 25 ++++++++--------- app/controllers/trainings_controller.rb | 2 -- app/views/managements/training_2018.html.erb | 2 ++ app/views/trainings/enroll.html.erb | 28 ------------------- ...4_remove_training_category_in_trainings.rb | 9 ++++++ 5 files changed, 23 insertions(+), 43 deletions(-) create mode 100644 db/migrate/20190613133734_remove_training_category_in_trainings.rb diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index db74d39a..b2781417 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,18 +4161,17 @@ 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_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 + sheet1[count_row, 7] = t.research_field + sheet1[count_row, 8] = t.training_payinfo.try(:pay_type_str) + sheet1[count_row, 9] = t.training_payinfo.try(:pay_status_str) + sheet1[count_row, 10] = format_time t.training_payinfo.try(:pay_time) + sheet1[count_row, 11] = t.training_payinfo.try(:invoice_title).present? ? '需要' : '不需要' + sheet1[count_row, 12] = t.training_payinfo.try(:invoice_title) + sheet1[count_row, 13] = t.training_payinfo.try(:invoice_no) + sheet1[count_row, 14] = t.training_payinfo.try(:invoice_content) + sheet1[count_row, 15] = t.training_payinfo.try(:info) + sheet1[count_row, 16] = t.training_payinfo.try(:out_trade_no) + sheet1[count_row, 17] = 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 2542dbb5..0668edde 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -108,7 +108,6 @@ class TrainingsController < ApplicationController @training.training_type = @training_type if @training_type == 3 @training.research_field = params[:research_field].select(&:present?).uniq.join(",") - @training.training_category = params[:training_category] end @training.openid = session[:wechat_open_id] @training.save! @@ -128,7 +127,6 @@ class TrainingsController < ApplicationController @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! diff --git a/app/views/managements/training_2018.html.erb b/app/views/managements/training_2018.html.erb index ddce89ac..8ddea516 100644 --- a/app/views/managements/training_2018.html.erb +++ b/app/views/managements/training_2018.html.erb @@ -5,6 +5,8 @@ + + - + <% end %>
    diff --git a/app/views/exercise/_show_MCQ.html.erb b/app/views/exercise/_show_MCQ.html.erb index e1767b3b..57c36496 100644 --- a/app/views/exercise/_show_MCQ.html.erb +++ b/app/views/exercise/_show_MCQ.html.erb @@ -20,7 +20,11 @@ <% exercise_question.exercise_choices.reorder("choice_position").each_with_index do |exercise_choice,index| %>
  • - +
  • <% end %>
    From 335988a0b16e5b1b0351c605e6e5038c5803223a Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Fri, 14 Jun 2019 10:15:16 +0800 Subject: [PATCH 25/55] =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=8A=98=E6=89=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/trainings/pay.html.erb | 101 ++++++++++++++-------- public/stylesheets/educoder/trainings.css | 6 +- 2 files changed, 67 insertions(+), 40 deletions(-) diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 17808d34..02290cd0 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -49,19 +49,23 @@ <%= render :partial => 'upload_img', :locals => {:training => @training} %>
    -

    费用明细

    -

    大数据培训缴费

    -
    -

    - - <%= @training.training_payinfo.num %> - - - <%= @pay_fee * @training.training_payinfo.num %> - +

    费用明细(3人及以上8折优惠)

    +

    含会议注册费、场地费、培训费、教材资料费、餐费、专家差率费等

    +

    + + + 3000 + + + + + + 1 + + + -

    -
    +

    " id="offlinePaySubmitBtn"> @@ -227,35 +231,56 @@ //上传头像 InitPhoto(); - //加减报名人数 - $(".minusNum").click(function(){ - var num=parseInt($("#enlistNum").html()); - var money=parseFloat($("#enlistMoney").html()).toFixed(2); - if(num>1){ - money=parseFloat(parseFloat(money)-parseFloat(money)/parseFloat(num)).toFixed(2); - num=num-1; - $("#enlistNum").html(num); - $("#enlistMoney").html(money); - if(num==1){ - $(".icon-default").removeClass("blue").addClass("sky_blue"); - } - $("input[name='enlistN']").val(num); + }) + + //加减报名人数 + function minusNum(item){ + var num=parseInt($("#enlistN").html()); + var money=parseFloat(3000).toFixed(2); + var percent=$("#percentPay"); + if(num>1){ + num=num-1; + if(num == 1){ + $(".icon-default").removeClass("blue").addClass("sky_blue"); } - }) - $(".plusNum").click(function(){ - var num=parseInt($("#enlistNum").html()); - if(num==1){ - $(".icon-default").removeClass("sky_blue").addClass("blue"); + money=parseFloat(parseFloat(money) *num).toFixed(2); + if($(percent).length>0 && num>2){ + $(".lastPrice").html("¥"+ money); + money = parseFloat(parseFloat(money) *0.8); + }else{ + $(".lastPrice").html(""); } - var money=parseFloat($("#enlistMoney").html()).toFixed(2); - money=parseFloat(parseFloat(money)+parseFloat(money)/parseFloat(num)).toFixed(2); - num=num+1; + $("#enlistN").html(num); + $("#enlistM").html(money); + $("#enlistNum").val(num); + $("#enlistMoney").val(money); - $("#enlistNum").html(num); - $("#enlistMoney").html(money); - $("input[name='enlistN']").val(num); - }) - }) + } + } + function plusNum(item){ + var num=parseInt($("#enlistN").html()); + var money=parseFloat(3000).toFixed(2); + var percent=$("#percentPay"); + + num=num+1; + if(num > 1){ + $(".icon-default").removeClass("sky_blue").addClass("blue"); + } + money=parseFloat(parseFloat(money) *num).toFixed(2); + + if($(percent).length>0 && num>2){ + $(".lastPrice").html("¥"+ money); + money = parseFloat(parseFloat(money) * 0.8).toFixed(2); + }else{ + $(".lastPrice").html(""); + } + + $("#enlistN").html(num); + $("#enlistM").html(money); + $("#enlistNum").val(num); + $("#enlistMoney").val(money); + $("input[name='enlistNum']").val(num); + } //页面加载时,初始化发票类型 function InitBill(userInfo){ var index=2; diff --git a/public/stylesheets/educoder/trainings.css b/public/stylesheets/educoder/trainings.css index 18038b11..c6a2b1bf 100644 --- a/public/stylesheets/educoder/trainings.css +++ b/public/stylesheets/educoder/trainings.css @@ -20,12 +20,13 @@ a{text-decoration: none} .flex1{flex: 1} li{list-style-type: none;} - +.color-orange{color: #FC682D!important;} .mb5{margin-bottom: 5px}.mb10{margin-bottom: 10px!important;} + .mt5{margin-top: 5px} .mr5{margin-right: 5px} -.ml10{margin-left: 10px;} +.ml5{margin-left: 5px;}.ml10{margin-left: 10px;} .mr10{margin-right: 10px;} .line20{line-height: 20px;} @@ -240,6 +241,7 @@ input[type='text'].right_input{ .billInput.nullVal{border:1px solid #DD1717;} .meetInfo{color: #4CACFF;} .enrollNum{margin:10px 15px;font-size: 1.4rem;} +.lastPrice{color: #bfbfbf;font-size: 1.2px;text-decoration: line-through;margin-left: 5px;} /*上传图片*/ .weui-uploader__bd {position: relative;width: 100px;height: 100px;} .weui-uploader__files {list-style: none;} From 8b27e66fc35ea5bcb9b467aab471ff1213066792 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Fri, 14 Jun 2019 11:00:18 +0800 Subject: [PATCH 26/55] =?UTF-8?q?=E5=8F=91=E7=A5=A8=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/trainings/pay.html.erb | 8 ++++---- public/stylesheets/educoder/trainings.css | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 02290cd0..3293be93 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -80,7 +80,7 @@
    - +
    @@ -147,13 +147,13 @@ aboutPayType(); //初始化发票类型 - InitBill(userInfo); + //InitBill(userInfo); //切换发票类型 $(".billType li").on("click", function () { $(".billType li").removeClass("active"); $(this).addClass("active"); - billTypeShowFun(parseInt($(this).index()),userInfo); + //billTypeShowFun(parseInt($(this).index()),userInfo); }) //关闭弹窗 $(".billClose").on("click", function () { diff --git a/public/stylesheets/educoder/trainings.css b/public/stylesheets/educoder/trainings.css index c6a2b1bf..44df1617 100644 --- a/public/stylesheets/educoder/trainings.css +++ b/public/stylesheets/educoder/trainings.css @@ -241,7 +241,7 @@ input[type='text'].right_input{ .billInput.nullVal{border:1px solid #DD1717;} .meetInfo{color: #4CACFF;} .enrollNum{margin:10px 15px;font-size: 1.4rem;} -.lastPrice{color: #bfbfbf;font-size: 1.2px;text-decoration: line-through;margin-left: 5px;} +.lastPrice{color: #bfbfbf;font-size: 0.8em;text-decoration: line-through;margin-left: 5px;margin-top: 2px;} /*上传图片*/ .weui-uploader__bd {position: relative;width: 100px;height: 100px;} .weui-uploader__files {list-style: none;} From c15546369cd60c383fece8cc2ad5ab4c71c59cff Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Fri, 14 Jun 2019 11:02:05 +0800 Subject: [PATCH 27/55] =?UTF-8?q?=E6=94=AF=E4=BB=98-=E5=8F=91=E7=A5=A8?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/trainings/pay.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 3293be93..ccc4f3eb 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -153,7 +153,7 @@ $(".billType li").on("click", function () { $(".billType li").removeClass("active"); $(this).addClass("active"); - //billTypeShowFun(parseInt($(this).index()),userInfo); + billTypeShowFun(parseInt($(this).index())); }) //关闭弹窗 $(".billClose").on("click", function () { @@ -297,7 +297,7 @@ $(".billType li").eq(index).addClass("active"); billTypeShowFun(index,userInfo); } - function billTypeShowFun(index,userInfo){ + function billTypeShowFun(index){ if (parseInt(index) == 0) { $(".needWrite").removeClass("none"); $(".billUnit").attr("placeholder", "请填写公司单位名称").val(userInfo.school); From 48cf73dbbf8f15d8e212121a30d3522c18796b22 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 14 Jun 2019 11:25:20 +0800 Subject: [PATCH 28/55] modify training --- app/controllers/trainings_controller.rb | 4 ++- app/views/trainings/enroll.html.erb | 35 ++++++++++++++----------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 0668edde..e3e96f11 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -112,6 +112,7 @@ class TrainingsController < ApplicationController @training.openid = session[:wechat_open_id] @training.save! + flash[:message] = '提交成功' redirect_to enroll_training_path(id: @tag_id) # redirect_to pay_training_path(id: @tag_id) end @@ -130,6 +131,7 @@ class TrainingsController < ApplicationController end @training.save! + flash[:message] = '提交成功' redirect_to enroll_training_path(id: @tag_id) # redirect_to pay_training_path(id: @tag_id) end @@ -252,7 +254,7 @@ class TrainingsController < ApplicationController def authenticate if Rails.env.development? - # session[:wechat_open_id] = "o5fSc0607iR3rp4-h_VnuBTp8CiM" + session[:wechat_open_id] = "o5fSc0607iR3rp4-h_VnuBTp8CiM" end unless session[:wechat_open_id].present? diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index 1362e78f..6b898691 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -205,27 +205,27 @@ <% end %> -

    通讯地址

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

    - 完成 + 提交 <% end %>
    @@ -248,7 +248,12 @@ } else { $('#sex').val("2"); } - }) + }); + + var message = "<%= flash[:message] %>"; + if (message && message.length > 0) { + alert(message); + } }) //下一步 From 6c3054f8a422ccfcd9a6e873bb0b364f164f0b1b Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 14 Jun 2019 14:19:56 +0800 Subject: [PATCH 29/55] trainings: add pay and result page --- app/controllers/managements_controller.rb | 2 +- app/controllers/trainings_controller.rb | 50 ++++++-------- app/models/training.rb | 18 +++++ app/models/training_payinfo.rb | 9 ++- app/views/trainings/pay.html.erb | 81 ++++++++++++----------- app/views/trainings/result.html.erb | 30 ++++----- 6 files changed, 103 insertions(+), 87 deletions(-) diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index b2781417..39e89bd8 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 diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index e3e96f11..cd555249 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -10,7 +10,7 @@ class TrainingsController < ApplicationController before_filter :authenticate, except: [:auth, :auth_callback, :pay_callback] - before_filter :find_tag_id, only: [:show, :create, :update, :enroll, :test] + before_filter :find_tag_id, except: [:auth, :auth_callback, :pay_callback] before_filter :find_training, only: [:show, :test] @@ -44,10 +44,13 @@ class TrainingsController < ApplicationController end def pay - _pay_params - @training = current_training + if @training.blank? + redirect_to enroll_training_path(id: @tag_id) + return + end + # 防止重复支付,对于已支付过的,不应该再到这个页来 if @training.payed? redirect_to result_training_path(id: @tag_id) @@ -55,7 +58,6 @@ class TrainingsController < ApplicationController end @training.training_payinfo ||= TrainingPayinfo.new - end def pay_callback @@ -98,11 +100,9 @@ class TrainingsController < ApplicationController end def result - _pay_params @training = current_training end - def create @training = current_training || Training.new(params) @training.training_type = @training_type @@ -113,6 +113,7 @@ class TrainingsController < ApplicationController @training.save! flash[:message] = '提交成功' + redirect_to enroll_training_path(id: @tag_id) # redirect_to pay_training_path(id: @tag_id) end @@ -120,8 +121,8 @@ class TrainingsController < ApplicationController def update @training = current_training - unless @training - render_404 + if @training.blank? + redirect_to enroll_training_path(id: @tag_id) return end @@ -132,6 +133,7 @@ class TrainingsController < ApplicationController @training.save! flash[:message] = '提交成功' + redirect_to enroll_training_path(id: @tag_id) # redirect_to pay_training_path(id: @tag_id) end @@ -143,13 +145,11 @@ class TrainingsController < ApplicationController # 采用ajax调用方式,返回支付参数 def update_payinfo @training = current_training - unless @training - render_404 + if @training.blank? + redirect_to enroll_training_path(id: @tag_id) return end - _pay_params - attachment = nil if params[:image] attachment = Attachment.create!(file: params[:image], author: User.first) @@ -163,12 +163,9 @@ class TrainingsController < ApplicationController training_info = TrainingPayinfo.new(params) end - training_info.num = params[:enlistN].to_i - if training_info.num < 1 - training_info.num = 1 - end + training_info.num = params[:enlistN].to_i < 1 ? 1 : params[:enlistN].to_i - training_info.fee = (training_info.num * @pay_fee).to_i + training_info.fee = @training.registration_fee(training_info.num) training_info.attachment = attachment if attachment.present? @@ -183,7 +180,8 @@ class TrainingsController < ApplicationController training_info.save! if params[:js] == 'true' - _pay_js(training_info.fee) + Rails.logger.info("### start wechat pay => fee: #{training_info.fee}") + _pay_js(0.01 || training_info.fee) else redirect_to url = result_training_path(id: @tag_id) end @@ -218,7 +216,7 @@ class TrainingsController < ApplicationController # # 写入wechat_pay付费表 WechatPay.create!(training_id: @training.id, out_trade_no: out_trade_no) - render json: {status: 0, data: unifiedorder(out_trade_no, fee)} + render json: {status: 0, data: unifiedorder(out_trade_no, fee, @training.pay_order_title)} end end @@ -248,9 +246,6 @@ class TrainingsController < ApplicationController end private - def _pay_params - @pay_fee = Redmine::Configuration['training_fee'].to_f || 5000 - end def authenticate if Rails.env.development? @@ -279,7 +274,7 @@ class TrainingsController < ApplicationController 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 + @_current_training ||= Training.where(openid: session[:wechat_open_id], training_type: @training_type).first end def valid_training @@ -326,14 +321,10 @@ class TrainingsController < ApplicationController end - def unifiedorder(out_trade_no, fee) + def unifiedorder(out_trade_no, fee, title) @config = {} - output = Wechat.pay.unifiedorder('湖南警察学院大数据培训会-报名费', - (fee * 100).to_i, - session[:wechat_open_id], - client_ip, - out_trade_no) + output = Wechat.pay.unifiedorder(title, (fee * 100).to_i, session[:wechat_open_id], client_ip, out_trade_no) data = output.fetch("xml") if data.nil? raise "获取微信统一单错误" @@ -361,5 +352,4 @@ class TrainingsController < ApplicationController @config end - end diff --git a/app/models/training.rb b/app/models/training.rb index 7c1333be..cb7f2db7 100644 --- a/app/models/training.rb +++ b/app/models/training.rb @@ -25,4 +25,22 @@ class Training < ActiveRecord::Base research_field.present? && research_field.split(',').include?(str) end + def pay_order_title + case training_type + when 3 then '全国高校大数据和人工智能暑期师资培训会-报名费' + when 4 then '工程教育认证培训会-报名费' + end + end + + def registration_fee(num = 1) + case training_type + when 3 then + # 三人以上 8折 + num >= 3 ? 3000.0 * 0.8 * num : 3000.0 * num + when 4 then + 1200.0 * num + else + raise ArgumentError + end + end end diff --git a/app/models/training_payinfo.rb b/app/models/training_payinfo.rb index 3520c4c0..71f1c793 100644 --- a/app/models/training_payinfo.rb +++ b/app/models/training_payinfo.rb @@ -15,7 +15,12 @@ class TrainingPayinfo < ActiveRecord::Base PayType_bank = 3 #银行卡支付 def pay_type_str - pay_type==PayType_Wechat ? '微信支付' : (pay_type==PayType_alipay ? '支付宝支付' : (pay_type==PayType_bank ? '银行卡支付' : '')) + case pay_type + when PayType_Wechat then '微信支付' + when PayType_alipay then '支付宝支付' + when PayType_bank then '银行卡支付' + else '' + end end def pay_status_str @@ -30,7 +35,7 @@ class TrainingPayinfo < ActiveRecord::Base end def pay_time - WechatPay.where(:out_trade_no => self.out_trade_no).first.try(:created_at) + WechatPay.where(out_trade_no: out_trade_no).first.try(:created_at) end def wechat_wait_pay? diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index ccc4f3eb..875845f7 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -1,5 +1,6 @@
    + <%= hidden_field_tag(:tag_id, params[:id]) %>

    @@ -39,7 +40,7 @@

    发票内容 + value="<%= @training.training_payinfo.try(:invoice_content).presence || '研讨会' %>"/>

    @@ -49,32 +50,36 @@ <%= render :partial => 'upload_img', :locals => {:training => @training} %>
    -

    费用明细(3人及以上8折优惠)

    +

    费用明细 + <% if @training.training_type == 3 %> + (3人及以上8折优惠) + <% end %> +

    含会议注册费、场地费、培训费、教材资料费、餐费、专家差率费等

    - - 3000 + + <%= @training.registration_fee %> - - - - - 1 - - - - + + + + + 1 + + + +

    " id="offlinePaySubmitBtn"> - 返回 + 返回 提交
    " id="paySubmitBtn"> - 返回 + 返回 立即支付
    @@ -124,22 +129,20 @@ // // eruda.init(); - // var userInfo = { - // name: '<%= @training.name %>', - // school: '<%= @training.school %>', - // //支付方式,默认为0 - // // 1 微信支付 - // // 2 支付宝支付 - // // 3 银行卡支付 - // payType: <%#= @training.training_payinfo.pay_type.to_i %>, - // - // //发票抬头 - // //为空则代表不需要发票 - // invoiceTitle: '<%#= @training.training_payinfo.invoice_title %>', - // - // //税号 - // invoiceNo: '<%#= @training.training_payinfo.invoice_no %>' - // }; + var userInfo = { + name: '<%= @training.name %>', + school: '<%= @training.school %>', + //支付方式,默认为0 + // 1 微信支付 + // 2 支付宝支付 + // 3 银行卡支付 + payType: <%= @training.training_payinfo.pay_type.to_i %>, + //发票抬头 + //为空则代表不需要发票 + invoiceTitle: '<%= @training.training_payinfo.invoice_title %>', + //税号 + invoiceNo: '<%= @training.training_payinfo.invoice_no %>' + }; //点击弹出发票弹框 aboutBillType(userInfo); @@ -147,13 +150,13 @@ aboutPayType(); //初始化发票类型 - //InitBill(userInfo); + InitBill(userInfo); //切换发票类型 $(".billType li").on("click", function () { $(".billType li").removeClass("active"); $(this).addClass("active"); - billTypeShowFun(parseInt($(this).index())); + billTypeShowFun(parseInt($(this).index()), userInfo); }) //关闭弹窗 $(".billClose").on("click", function () { @@ -205,7 +208,7 @@ // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 setTimeout(function () { - window.location.href = "/trainings/bigdata_hnjcxy_2019/result"; + window.location.href = "/trainings/<%= @tag_id %>/result"; }, 500); } else if (res.err_msg == 'get_brand_wcpay_request:cancel') { @@ -236,7 +239,7 @@ //加减报名人数 function minusNum(item){ var num=parseInt($("#enlistN").html()); - var money=parseFloat(3000).toFixed(2); + var money=parseFloat(<%= @training.registration_fee %>).toFixed(2); var percent=$("#percentPay"); if(num>1){ num=num-1; @@ -259,7 +262,7 @@ } function plusNum(item){ var num=parseInt($("#enlistN").html()); - var money=parseFloat(3000).toFixed(2); + var money=parseFloat(<%= @training.registration_fee %>).toFixed(2); var percent=$("#percentPay"); num=num+1; @@ -297,7 +300,7 @@ $(".billType li").eq(index).addClass("active"); billTypeShowFun(index,userInfo); } - function billTypeShowFun(index){ + function billTypeShowFun(index, userInfo){ if (parseInt(index) == 0) { $(".needWrite").removeClass("none"); $(".billUnit").attr("placeholder", "请填写公司单位名称").val(userInfo.school); @@ -353,7 +356,7 @@ //提交发票信息 - /*function submitBillInfo() { + function submitBillInfo() { var type = $(".billType li.active").html(); var unit = $(".billUnit").val(); var tax = $(".taxNumber").val(); @@ -386,7 +389,7 @@ //记录选中的发票类型 $("#billDemand").attr("status",$(".billType li.active").index()); hideNav($(".billDownNav")); - }*/ + } function InitPhoto() { var tmpl = '
  • ', diff --git a/app/views/trainings/result.html.erb b/app/views/trainings/result.html.erb index 31e845f8..c8a2ad39 100644 --- a/app/views/trainings/result.html.erb +++ b/app/views/trainings/result.html.erb @@ -10,12 +10,12 @@ <%= @training.sex == 1 ? '男' : '女' %>

    - - <%= @training.major %> + + <%= @training.school %>

    - - <%= @training.student_id %> + + <%= @training.position %>

    @@ -55,27 +55,27 @@ <% end %> <% end %> - + <% end %> +

    @@ -98,11 +98,11 @@ <% else %> <% if @training.training_payinfo.wechat_wait_pay? %>
    - <%= link_to "返回", pay_training_path(id: 'bigdata_hnjcxy_2019'), class: 'leftbtn' %> + <%= link_to "返回", pay_training_path(id: @tag_id), class: 'leftbtn' %> 立即支付
    <% elsif !@training.payed? %> - <%= link_to "返回", pay_training_path(id: 'bigdata_hnjcxy_2019'), class: 'returnBtn' %> + <%= link_to "返回", pay_training_path(id: @tag_id), class: 'returnBtn' %> <% end %> <% end %>
    @@ -144,7 +144,7 @@ // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 setTimeout(function () { - window.location.href = "/trainings/bigdata_hnjcxy_2019/result"; + window.location.href = "/trainings/<% @tag_id %>/result"; }, 500); } else if (res.err_msg == 'get_brand_wcpay_request:cancel') { From 3ac89e3f6540be268d7ad3ac0d22701408e3d9c9 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 14 Jun 2019 16:03:52 +0800 Subject: [PATCH 30/55] training: add offline pay --- app/controllers/trainings_controller.rb | 14 +-- app/views/trainings/enroll.html.erb | 124 ++++++++---------------- app/views/trainings/pay.html.erb | 30 +++--- app/views/trainings/result.html.erb | 12 ++- 4 files changed, 79 insertions(+), 101 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index cd555249..0f291f4e 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -57,7 +57,11 @@ class TrainingsController < ApplicationController return end - @training.training_payinfo ||= TrainingPayinfo.new + @training.training_payinfo ||= begin + payinfo = TrainingPayinfo.new + payinfo.fee = @training.registration_fee # 默认值价格不对 + payinfo + end end def pay_callback @@ -114,8 +118,7 @@ class TrainingsController < ApplicationController flash[:message] = '提交成功' - redirect_to enroll_training_path(id: @tag_id) - # redirect_to pay_training_path(id: @tag_id) + redirect_to pay_training_path(id: @tag_id) end @@ -134,8 +137,7 @@ class TrainingsController < ApplicationController flash[:message] = '提交成功' - redirect_to enroll_training_path(id: @tag_id) - # redirect_to pay_training_path(id: @tag_id) + redirect_to pay_training_path(id: @tag_id) end @@ -163,7 +165,7 @@ class TrainingsController < ApplicationController training_info = TrainingPayinfo.new(params) end - training_info.num = params[:enlistN].to_i < 1 ? 1 : params[:enlistN].to_i + training_info.num = params[:enlistNum].to_i < 1 ? 1 : params[:enlistNum].to_i training_info.fee = @training.registration_fee(training_info.num) diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index 6b898691..84a88510 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -152,57 +152,25 @@ name="position" value="<%= @training.position %>"/> +
  • + 手机号码 + +
  • + <% if @training_type == 3 %> -

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

    -
  • - 机器学习/深度学习 - - 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"> - - -
  • +

    您关注的课程类型(最少选1项)

    + + <% %w(程序设计 操作系统 数据库 软件工程 云计算 大数据 人工智能 计算机网络 物联网 信息安全 其他).each_with_index do |name, index| %> +
  • + <%= name %> + + id="check_<%= index %>" class="magic-checkbox"> + + +
  • + <% end %> <% end %> @@ -214,12 +182,6 @@ -
  • - 手机号码 - -
  • @@ -258,40 +220,40 @@ //下一步 function NextStep() { - var username = $("#username").val(); - var userMajor = $("#userMajor").val(); - var userphone = $("#userphone").val(); - var userID = $("#userID").val(); + var username = $("#username").val(); + var userUnit = $("#userUnit").val(); + var userPositional = $("#userPositional").val(); + var userphone = $("#userphone").val(); - if (username == '') { - alert("请输入真实姓名"); - return; - } - if (userMajor == '') { - alert("请输入专业"); - return; - } + if (username == '') { + alert("请输入姓名"); + return; + } + if (userUnit == '') { + alert("请输入单位名称或者学校"); + return; + } - if (userID == '') { - alert("请输入学号"); - return; - } + if (userPositional == '') { + alert("请输入职称"); + return; + } + + if (userphone == '') { + alert("请输入手机号码"); + return; + } else if (!/^1\d{10}$/.test(userphone) && !/^[a-zA-Z0-9]+([.\-_\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(userphone)) { + alert("请输入正确的手机号码"); + return; + } <% if @training_type == 3 %> if ($("input[type='checkbox'][name='research_field[]']:checked").length == 0) { - alert('请选择授课类型/研究领域'); + alert('请选择您关注的课程类型'); return; } <% end %> - if (userphone == '') { - alert("请输入手机号码"); - return; - } else if (!/^1\d{10}$/.test(userphone) && !/^[a-zA-Z0-9]+([.\-_\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(userphone)) { - alert("请输入正确的手机号码"); - return; - } - $('form').submit(); } diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 875845f7..8474233f 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -1,13 +1,16 @@
    <%= hidden_field_tag(:tag_id, params[:id]) %> -
    + +

    - <%= @training.training_payinfo.pay_type.to_i == 3 ? "线下支付" : "微信支付" %> + + 线下支付

    -
    mt5" id="payInfos"> + +
    @@ -57,15 +60,15 @@

    含会议注册费、场地费、培训费、教材资料费、餐费、专家差率费等

    - - - <%= @training.registration_fee %> + + + <%= @training.training_payinfo.fee || @training.registration_fee %> - 1 + <%= @training.training_payinfo.num || 1 %> @@ -73,12 +76,12 @@

    -
    " id="offlinePaySubmitBtn"> - 返回 - 提交 +
    " id="offlinePaySubmitBtn"> + 稍后支付 + 立即支付
    -
    " id="paySubmitBtn"> +
    " id="paySubmitBtn"> 返回 立即支付
    @@ -120,7 +123,7 @@
    - + @@ -136,7 +139,8 @@ // 1 微信支付 // 2 支付宝支付 // 3 银行卡支付 - payType: <%= @training.training_payinfo.pay_type.to_i %>, + // payType: <%#= @training.training_payinfo.pay_type.to_i %>, + payType: 3, //发票抬头 //为空则代表不需要发票 invoiceTitle: '<%= @training.training_payinfo.invoice_title %>', diff --git a/app/views/trainings/result.html.erb b/app/views/trainings/result.html.erb index c8a2ad39..c63a24c5 100644 --- a/app/views/trainings/result.html.erb +++ b/app/views/trainings/result.html.erb @@ -29,6 +29,14 @@
    -->
    +

    + + <%= @training.training_payinfo.num %>人 +

    +

    + + ¥<%= @training.training_payinfo.fee %> +

    <%= @training.training_payinfo.pay_status_str %> @@ -85,8 +93,10 @@ <%= render :partial => 'upload_img', :locals => {:training => @training} %> <% end %> -

    ¥<%= @training.training_payinfo.fee %><%= @training.training_payinfo.num %>人

    +
    +
    +

    @@ -77,7 +79,7 @@

    " id="offlinePaySubmitBtn"> - 稍后支付 + 稍后支付 立即支付
    @@ -235,6 +237,14 @@ } $('form').submit(); }); + $('#laterSubmitFormBtn').on('click', function () { + if($("#billDemand").attr("status")==2){ + $(".billInput").val(''); + } + $('#offline_later_pay').val('true'); + $('form').submit(); + }); + //上传头像 InitPhoto(); From 0e24d92643c088f2bed004062c41c269f340d276 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 14 Jun 2019 16:36:18 +0800 Subject: [PATCH 32/55] tranings: fix bug --- app/views/trainings/pay.html.erb | 8 ++++---- app/views/trainings/result.html.erb | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 4ef654fb..9c4d2b59 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -271,7 +271,7 @@ $("#enlistM").html(money); $("#enlistNum").val(num); $("#enlistMoney").val(money); - + $("input[name='enlistNum']").val(num); } } function plusNum(item){ @@ -317,12 +317,12 @@ function billTypeShowFun(index, userInfo){ if (parseInt(index) == 0) { $(".needWrite").removeClass("none"); - $(".billUnit").attr("placeholder", "请填写公司单位名称").val(userInfo.school); - $(".taxNumber").removeClass("none"); + $(".billUnit").attr("placeholder", "请填写公司单位名称").val(userInfo.invoiceTitle || userInfo.school); + $(".taxNumber").removeClass("none").val(userInfo.invoiceNo); } else if (parseInt(index) == 1) { $(".needWrite").removeClass("none"); $(".billUnit").attr("placeholder", "请填写姓名").val(userInfo.name); - $(".taxNumber").addClass("none"); + $(".taxNumber").val('').addClass("none"); } else { $(".needWrite").addClass("none"); $(".billInput").val(''); diff --git a/app/views/trainings/result.html.erb b/app/views/trainings/result.html.erb index c63a24c5..ca1228b3 100644 --- a/app/views/trainings/result.html.erb +++ b/app/views/trainings/result.html.erb @@ -196,6 +196,7 @@ var data = new FormData(); data.append('image', files[0]); + data.append('tag_id', '<%= @tag_id %>'); $.ajax({ url: '<%= update_picture_trainings_path %>', From 1ad0ee60aadd3905d3b0e958f7dd8a7ca32e9d7c Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 14 Jun 2019 17:03:18 +0800 Subject: [PATCH 33/55] trainings: fix --- app/controllers/trainings_controller.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 029b4a31..02a3255d 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -38,6 +38,12 @@ class TrainingsController < ApplicationController def enroll @training = current_training || Training.new + + if @training && @training.pay? + redirect_to result_training_path(id: @tag_id) + return + end + Rails.logger.info("##########training_type:#{@training_type}") @training_title = @training_type == 3 ? "信息技术新工科产学研联盟师资培训班" : "工程教育认证" Rails.logger.info("##########training_title:#{@training_title}") From 8ebc32383a7c0eda8859933d219e2616fd2fce7e Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Fri, 14 Jun 2019 17:43:15 +0800 Subject: [PATCH 34/55] =?UTF-8?q?=E6=94=AF=E4=BB=98--=E9=80=82=E9=85=8Diph?= =?UTF-8?q?one?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/trainings/pay.html.erb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 9c4d2b59..df22b65c 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -178,6 +178,9 @@ $('form').submit(); }); + $(".billInput").on("blur",function(){ + document.body && (document.body.scrollTop = document.body.scrollTop); + }) //立即支付 $('#payBtn').on('click', function () { From 5816bc25cbc83316b5f137fb55f449676134cd2c Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 14 Jun 2019 19:08:12 +0800 Subject: [PATCH 35/55] trainings: fix --- app/views/trainings/pay.html.erb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index df22b65c..0fe3bd89 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -45,7 +45,7 @@

    发票内容 + value="<%= @training.training_payinfo.try(:invoice_content).presence || '师资培训费' %>"/>

    @@ -60,7 +60,7 @@ (3人及以上8折优惠) <% end %>

    -

    含会议注册费、场地费、培训费、教材资料费、餐费、专家差率费等

    +

    含会议注册费、场地费、培训费、教材资料费、餐费、专家差旅费等

    @@ -303,11 +303,11 @@ } //页面加载时,初始化发票类型 function InitBill(userInfo){ - var index=2; - $("#billDemand").html("不需要").attr("status",2); - if(userInfo.invoiceTitle != "" && userInfo.invoiceNo != ""){ - index=0; - $("#billDemand").html("单位").attr("status",0); + var index=0; + $("#billDemand").html("单位").attr("status",0); + if(userInfo.invoiceTitle == "" && userInfo.invoiceNo == ""){ + index=2; + $("#billDemand").html("不需要").attr("status",2); } if(userInfo.invoiceTitle != "" && userInfo.invoiceNo == ""){ index=1; From a893358e29764d7739cba2d9fddfb524ad4e56bc Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 14 Jun 2019 19:35:30 +0800 Subject: [PATCH 36/55] trainings: modify --- app/controllers/trainings_controller.rb | 7 +++---- app/views/trainings/pay.html.erb | 11 +++++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 02a3255d..948d97be 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -63,10 +63,9 @@ class TrainingsController < ApplicationController return end - @training.training_payinfo ||= begin - payinfo = TrainingPayinfo.new - payinfo.fee = @training.registration_fee # 默认值价格不对 - payinfo + if @training.training_payinfo.blank? + @training.build_training_payinfo + @training.training_payinfo.fee = @training.registration_fee end end diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 0fe3bd89..5b683b30 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -142,10 +142,11 @@ // 2 支付宝支付 // 3 银行卡支付 // payType: <%#= @training.training_payinfo.pay_type.to_i %>, + newPayinfo: <%= @training.training_payinfo.new_record? %>, payType: 3, //发票抬头 //为空则代表不需要发票 - invoiceTitle: '<%= @training.training_payinfo.invoice_title %>', + invoiceTitle: '<%= @training.training_payinfo.invoice_title || @training.school %>', //税号 invoiceNo: '<%= @training.training_payinfo.invoice_no %>' }; @@ -305,13 +306,15 @@ function InitBill(userInfo){ var index=0; $("#billDemand").html("单位").attr("status",0); - if(userInfo.invoiceTitle == "" && userInfo.invoiceNo == ""){ + if (!userInfo.newPayinfo) { + if(userInfo.invoiceTitle == "" && userInfo.invoiceNo == ""){ index=2; $("#billDemand").html("不需要").attr("status",2); - } - if(userInfo.invoiceTitle != "" && userInfo.invoiceNo == ""){ + } + if(userInfo.invoiceTitle != "" && userInfo.invoiceNo == ""){ index=1; $("#billDemand").html("个人").attr("status",1); + } } $(".billType li").removeClass("active"); $(".billType li").eq(index).addClass("active"); From 098c9e31864e7b46fd64d3bbc6988bf7faa62912 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 14 Jun 2019 21:06:41 +0800 Subject: [PATCH 37/55] modify --- app/views/trainings/pay.html.erb | 86 ++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 33 deletions(-) diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 5b683b30..690e73a6 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -172,9 +172,8 @@ //延迟支付,直接提交 $('#delayPayBtn').on('click', function () { - if($("#billDemand").attr("status")==2){ - $(".billInput").val(''); - } + if(!checkBillInfo()){ return } + alert("报名成功,请尽快支付"); $('form').submit(); }); @@ -184,10 +183,8 @@ }) //立即支付 $('#payBtn').on('click', function () { + if(!checkBillInfo()){ return } - if($("#billDemand").attr("status")==2){ - $(".billInput").val(''); - } var postData = $('form').serialize(); postData += '&js=true' console.log(postData); @@ -236,15 +233,12 @@ //线下支付提交 $('#submitFormBtn').on('click', function () { - if($("#billDemand").attr("status")==2){ - $(".billInput").val(''); - } + if(!checkBillInfo()){ return } $('form').submit(); }); $('#laterSubmitFormBtn').on('click', function () { - if($("#billDemand").attr("status")==2){ - $(".billInput").val(''); - } + if(!checkBillInfo()){ return } + $('#offline_later_pay').val('true'); $('form').submit(); }); @@ -381,36 +375,62 @@ var unit = $(".billUnit").val(); var tax = $(".taxNumber").val(); //只有选择了单位时才需要判断三个是否都已经填写 + if (type == "单位" || type == "个人") { + if (unit == "") { + $(".billUnit").addClass("nullVal"); + return; + } else { + $(".billUnit").removeClass("nullVal"); + } + } if (type == "单位") { - if (unit == "") { - $(".billUnit").addClass("nullVal"); - return; - } else { - $(".billUnit").removeClass("nullVal"); - } - if (tax == "") { - $(".taxNumber").addClass("nullVal"); - return; - } else { - $(".taxNumber").removeClass("nullVal"); - } + if (tax == "") { + $(".taxNumber").addClass("nullVal"); + return; + } else { + $(".taxNumber").removeClass("nullVal"); + } } //选择单位或者个人都要判断是否填写了发票内容 - if (type == "单位" || type == "个人") { - var remark = $("input[name='invoice_content']").val(); - if (remark == "") { - $("input[name='invoice_content']").addClass("nullVal"); - return; - } else { - $("input[name='invoice_content']").removeClass("nullVal"); - } - } + // if (type == "单位" || type == "个人") { + // var remark = $("input[name='invoice_content']").val(); + // if (remark == "") { + // $("input[name='invoice_content']").addClass("nullVal"); + // return; + // } else { + // $("input[name='invoice_content']").removeClass("nullVal"); + // } + // } $("#billDemand").html(type); //记录选中的发票类型 $("#billDemand").attr("status",$(".billType li.active").index()); hideNav($(".billDownNav")); } + function checkBillInfo() { + var bill = $("#billLine"); + var billNav = $(".billDownNav"); + var status = $("#billDemand").attr("status"); + if(status == 2){ + $(".billInput").val(''); + } + + var billUnit = $('.billUnit').val(); + var taxNumber = $('.taxNumber').val(); + if(status == 1 && billUnit == ''){ + alert('请将发票信息填写完整'); + showNav(bill, billNav, "down"); + return false; + } + if(status == 0 && (billUnit == '' || taxNumber == '')){ + alert('请将发票信息填写完整'); + showNav(bill, billNav, "down"); + return false; + } + + return true; + } + function InitPhoto() { var tmpl = '

  • ', $gallery = $("#gallery"), $galleryImg = $("#galleryImg"), From 567bcfdf659b180fe6aa9c6deb17b2119f775992 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Sat, 15 Jun 2019 08:17:52 +0800 Subject: [PATCH 38/55] business add permission --- app/controllers/application_controller.rb | 6 +++++ ...c_course_achievement_methods_controller.rb | 2 +- .../ec_course_evaluations_controller.rb | 4 ++-- .../ec_course_supports_controller.rb | 2 +- app/controllers/ec_courses_controller.rb | 6 ++--- .../ec_graduation_requirements_controller.rb | 4 ++-- .../ec_major_schools_controller.rb | 12 +++++----- app/controllers/ec_years_controller.rb | 4 ++-- app/controllers/ecs_controller.rb | 4 ++-- app/controllers/managements_controller.rb | 7 +++--- .../ec_major_schools/_year_list.html.erb | 2 +- app/views/ec_major_schools/show.html.erb | 2 +- app/views/ec_years/_course_lists.html.erb | 2 +- .../managements/graduation_standard.html.erb | 24 ++++++++++--------- 14 files changed, 44 insertions(+), 37 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e44005a4..ceeb8b9b 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -66,6 +66,8 @@ class ApplicationController < ActionController::Base include Redmine::MenuManager::MenuController helper Redmine::MenuManager::MenuHelper + helper_method :admin_or_business? + # 云启训练场(EduCoder)个人版 产品编码(appId) 9200108 # 产品名称 计费类型 套餐编码 # 云启训练场(EduCoder)个人版 固定包月 9200108001 @@ -390,6 +392,10 @@ class ApplicationController < ActionController::Base end end + def admin_or_business? + User.current.business? || User.current.admin? + end + def deny_access User.current.logged? ? render_403 : require_login end diff --git a/app/controllers/ec_course_achievement_methods_controller.rb b/app/controllers/ec_course_achievement_methods_controller.rb index ecc74a67..5dcdfea8 100644 --- a/app/controllers/ec_course_achievement_methods_controller.rb +++ b/app/controllers/ec_course_achievement_methods_controller.rb @@ -309,7 +309,7 @@ class EcCourseAchievementMethodsController < ApplicationController @ec_course = EcCourse.find(params[:ec_course_id]) @year = @ec_course.ec_year @ec_major_school = @year.ec_major_school - @template_major = User.current.admin? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || + @template_major = admin_or_business? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) @is_manager = @template_major || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id) end diff --git a/app/controllers/ec_course_evaluations_controller.rb b/app/controllers/ec_course_evaluations_controller.rb index bf47d16e..f2a54e6f 100644 --- a/app/controllers/ec_course_evaluations_controller.rb +++ b/app/controllers/ec_course_evaluations_controller.rb @@ -298,7 +298,7 @@ class EcCourseEvaluationsController < ApplicationController def find_course @ec_course = EcCourse.find params[:ec_course_id] ec_major_school = @ec_course.ec_year.ec_major_school - @is_manager = User.current.admin? || ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || + @is_manager = admin_or_business? || ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id) end @@ -306,7 +306,7 @@ class EcCourseEvaluationsController < ApplicationController @ce = EcCourseEvaluation.find params[:id] @ec_course = @ce.ec_course ec_major_school = @ec_course.ec_year.ec_major_school - @is_manager = User.current.admin? || ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || + @is_manager = admin_or_business? || ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id) end end diff --git a/app/controllers/ec_course_supports_controller.rb b/app/controllers/ec_course_supports_controller.rb index 6bb0288b..39b7d06b 100644 --- a/app/controllers/ec_course_supports_controller.rb +++ b/app/controllers/ec_course_supports_controller.rb @@ -50,7 +50,7 @@ class EcCourseSupportsController < ApplicationController max_support_count = 0 subitems_count = 0 major_school = @year.ec_major_school - is_manager = User.current.admin? || major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) + is_manager = admin_or_business? || major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) ec_graduation_requirements.each_with_index do |gr, i| logger.info("#############index:#{i}#####_ec_gradiation_reqiorements: #{gr.id}") subitems_count += gr.ec_graduation_subitems.count diff --git a/app/controllers/ec_courses_controller.rb b/app/controllers/ec_courses_controller.rb index e7e000bb..8ad9f4e4 100644 --- a/app/controllers/ec_courses_controller.rb +++ b/app/controllers/ec_courses_controller.rb @@ -346,7 +346,7 @@ class EcCoursesController < ApplicationController # 关联课堂弹框-搜索 def search_courses user = User.where(:id => params[:user_id]).first - if user.try(:admin?) + if user.try(:admin?) || user.try(:business?) courses = Course.where(:is_delete => 0) else course_ids = Member.where("user_id = #{user.try(:id)} and course_id != -1").pluck(:course_id) @@ -588,7 +588,7 @@ class EcCoursesController < ApplicationController @ec_course = EcCourse.find(params[:id]) @year = @ec_course.ec_year @ec_major_school = @year.ec_major_school - @template_major = User.current.admin? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || + @template_major = admin_or_business? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) @is_manager = @template_major || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id) end @@ -596,7 +596,7 @@ class EcCoursesController < ApplicationController def find_year @year = EcYear.find(params[:ec_year_id]) @ec_major_school = @year.ec_major_school - @template_major = User.current.admin? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || + @template_major = admin_or_business? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) #@is_manager = @template_major || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id) end diff --git a/app/controllers/ec_graduation_requirements_controller.rb b/app/controllers/ec_graduation_requirements_controller.rb index ea0f5464..091588cd 100644 --- a/app/controllers/ec_graduation_requirements_controller.rb +++ b/app/controllers/ec_graduation_requirements_controller.rb @@ -34,7 +34,7 @@ class EcGraduationRequirementsController < ApplicationController ActiveRecord::Base.transaction do @year = EcYear.find params[:year_id] position = @year.ec_graduation_requirements ? @year.ec_graduation_requirements.count + 1 : 1 - @template_major = User.current.admin? || @year.ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) + @template_major = admin_or_business? || @year.ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) ec_requirement_id = EcGraduationRequirement.create(content: params[:requirement], :ec_year_id => @year.id, :position => position) params[:subitems].try(:each_with_index) do |sub, index| EcGraduationSubitem.create(content: sub, ec_graduation_requirement_id: ec_requirement_id.id, position: index+1) @@ -48,7 +48,7 @@ class EcGraduationRequirementsController < ApplicationController def update requirement = EcGraduationRequirement.find params[:id] @year = requirement.ec_year - @template_major = User.current.admin? || @year.ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) + @template_major = admin_or_business? || @year.ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) requirement.update_attribute(:content, params[:requirement]) requirement.ec_graduation_subitems.destroy_all params[:subitems].try(:each_with_index) do |sub, index| diff --git a/app/controllers/ec_major_schools_controller.rb b/app/controllers/ec_major_schools_controller.rb index 445ce70f..dfeb9ce4 100644 --- a/app/controllers/ec_major_schools_controller.rb +++ b/app/controllers/ec_major_schools_controller.rb @@ -13,7 +13,7 @@ class EcMajorSchoolsController < ApplicationController # 这个status 用于创建界别时,局部刷新的状态 @status = params[:status] - @btn_text = @major_school.template_major && User.current.admin? ? "立即配置" : + @btn_text = @major_school.template_major && admin_or_business? ? "立即配置" : (!@major_school.template_major && @major_manager ? "立即配置" : "查看") if params[:search] @@ -84,7 +84,7 @@ class EcMajorSchoolsController < ApplicationController user_url = user_path(User.current) year = @year.year # 学校操作权限 - template_major = User.current.admin? || major.school.ec_school_users.pluck(:user_id).include?(User.current.id) + template_major = admin_or_business? || major.school.ec_school_users.pluck(:user_id).include?(User.current.id) # 示例专业 example_major = major.template_major ec_course_support_setting_url = ec_course_support_setting_ec_course_path(ec_course) if ec_course.present? @@ -130,7 +130,7 @@ class EcMajorSchoolsController < ApplicationController competition_calculation_info_url: competition_calculation_info_url, score_level_setting_url: score_level_setting_url, example_major: example_major, - allow_visit: User.current.admin? || (User.current.ec_school.present? && User.current.ec_school == major.school.id) + allow_visit: admin_or_business? || (User.current.ec_school.present? && User.current.ec_school == major.school.id) } end @@ -159,7 +159,7 @@ class EcMajorSchoolsController < ApplicationController end def add_manager - @is_school_manager = User.current.admin? || @major_school.school.users.where(:id => User.current.id).count > 0 # 学校管理员 + @is_school_manager = admin_or_business? || @major_school.school.users.where(:id => User.current.id).count > 0 # 学校管理员 if @is_school_manager || @major_school.ec_major_school_users.where(:user_id => User.current.id).count > 0 params[:user_id].each do |user_id| if @major_school.ec_major_school_users.count < 5 && @major_school.ec_major_school_users.where(:user_id => user_id).count == 0 @@ -172,7 +172,7 @@ class EcMajorSchoolsController < ApplicationController end def delete_manager - @is_school_manager = User.current.admin? || @major_school.school.users.where(:id => User.current.id).count > 0 # 学校管理员 + @is_school_manager = admin_or_business? || @major_school.school.users.where(:id => User.current.id).count > 0 # 学校管理员 if @is_school_manager || @major_school.ec_major_school_users.where(:user_id => User.current.id).count > 0 @major_school.ec_major_school_users.where(:user_id => params[:user_id]).destroy_all else @@ -184,7 +184,7 @@ class EcMajorSchoolsController < ApplicationController def find_major_school @major_school = EcMajorSchool.find(params[:id]) # 管理员权限 - @major_manager = User.current.admin? || @major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) + @major_manager = admin_or_business? || @major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) end # 职业认证的权限判断 diff --git a/app/controllers/ec_years_controller.rb b/app/controllers/ec_years_controller.rb index 548e3b6e..6baf5d58 100644 --- a/app/controllers/ec_years_controller.rb +++ b/app/controllers/ec_years_controller.rb @@ -25,7 +25,7 @@ class EcYearsController < ApplicationController @status = 1 end @major_manager = true - @btn_text = @major_school.template_major && User.current.admin? ? "立即配置" : + @btn_text = @major_school.template_major && admin_or_business? ? "立即配置" : (!@major_school.template_major && @major_manager ? "立即配置" : "查看") @years = EcYear.where(:ec_major_school_id => @major_school.id) @years = paginateHelper @years, 10 @@ -338,7 +338,7 @@ class EcYearsController < ApplicationController @ec_major_school = EcMajorSchool.find(params[:ec_major_school_id]) @year = EcYear.find(params[:id]) # 专业管理员身份 - @template_major = User.current.admin? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) + @template_major = admin_or_business? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) end # 职业认证的权限判断 diff --git a/app/controllers/ecs_controller.rb b/app/controllers/ecs_controller.rb index 172d13fc..5d391a5d 100644 --- a/app/controllers/ecs_controller.rb +++ b/app/controllers/ecs_controller.rb @@ -7,7 +7,7 @@ class EcsController < ApplicationController def department @template_major = EcMajorSchool.where(:template_major => true).first @school_managers = @school.users - @is_school_manager = User.current.admin? || @school.users.where(:id => User.current.id).count > 0 # 学校管理员 + @is_school_manager = User.current.admin? || User.current.business? || @school.users.where(:id => User.current.id).count > 0 # 学校管理员 @major_schools = @school.ec_major_schools.where(:template_major => false) unless @is_school_manager @@ -70,7 +70,7 @@ class EcsController < ApplicationController end def school_manager - unless User.current.admin? || @school.users.where(:id => User.current.id).count > 0 + unless User.current.admin? || User.current.business? || @school.users.where(:id => User.current.id).count > 0 render_403 end end diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index d05261b8..483a4ff3 100644 --- a/app/controllers/managements_controller.rb +++ b/app/controllers/managements_controller.rb @@ -2,11 +2,10 @@ class ManagementsController < ApplicationController before_filter :require_business before_filter :require_admin, :only => [:shixun_setting_list, :mirror_repository, :mirror_picture_shixuns, :editmd_template, - :editmd_template, :subject_level_system, :subject_setting_list, :auto_users_trial, - :evaluate_records, :identity_authentication, :identity_authentication, :professional_authentication, - :shixun_authorization, :graduation_standard, :ec_template, :codemirror_template, + :editmd_template, :subject_level_system, :subject_setting_list, + :shixun_authorization, :ec_template, :codemirror_template, :course_guide_template, :shixun_quality_score, :tech_system, :update_notice, :setting_banner, - :training_2018] + :training_2018, :create_standard] layout 'base_management' include ManagementsHelper include SortHelper diff --git a/app/views/ec_major_schools/_year_list.html.erb b/app/views/ec_major_schools/_year_list.html.erb index 1e561782..5755d3f6 100644 --- a/app/views/ec_major_schools/_year_list.html.erb +++ b/app/views/ec_major_schools/_year_list.html.erb @@ -49,7 +49,7 @@ - <% if @major_manager && !@major_school.template_major || User.current.admin? %> + <% if @major_manager && !@major_school.template_major || User.current.admin? || User.current.business? %> 删除 <% end %> <%#= link_to '删除', ec_major_school_ec_year_path(year, :ec_major_school_id => @major_school), method: :delete, :class => "mr15 color-grey-c", data: { confirm: '您确定要删除吗' } %> diff --git a/app/views/ec_major_schools/show.html.erb b/app/views/ec_major_schools/show.html.erb index c3e4c924..92e100c2 100644 --- a/app/views/ec_major_schools/show.html.erb +++ b/app/views/ec_major_schools/show.html.erb @@ -8,7 +8,7 @@
  • <%= @major.name %> - <% if @major.schools && User.current.admin? %> + <% if @major.schools && (User.current.admin? || User.current.business?) %>

      <% @major.schools.each do |school| %> diff --git a/app/views/ec_years/_course_lists.html.erb b/app/views/ec_years/_course_lists.html.erb index b39d9bfe..721d1722 100644 --- a/app/views/ec_years/_course_lists.html.erb +++ b/app/views/ec_years/_course_lists.html.erb @@ -17,7 +17,7 @@
        <% @ec_courses.each_with_index do |course, index| %> <% course_manager = course.ec_course_users.pluck(:user_id).include?(User.current.id) %> - <% btn_text = ((@ec_major_school.template_major && User.current.admin?) || (!@ec_major_school.template_major && @template_major) || course_manager) ? "立即配置" : "查看" %> + <% btn_text = ((@ec_major_school.template_major && (User.current.admin? || User.current.business?)) || (!@ec_major_school.template_major && @template_major) || course_manager) ? "立即配置" : "查看" %>
      • <%= index + 1 %> <%= course.name %> diff --git a/app/views/managements/graduation_standard.html.erb b/app/views/managements/graduation_standard.html.erb index c61e6bff..a667c7c2 100644 --- a/app/views/managements/graduation_standard.html.erb +++ b/app/views/managements/graduation_standard.html.erb @@ -1,16 +1,18 @@

        毕业要求通用标准<%= @standards.count %>

        -

        + 新增

        -
        -

        - *1 - -

        -

        - 取消 - 保存 -

        -
        + <% if User.current.admin? %> +

        + 新增

        +
        +

        + *1 + +

        +

        + 取消 + 保存 +

        +
        + <% end %>
  • 等级
    From 0814e7b41229d8a4ff9871390a5008ca48db3cae Mon Sep 17 00:00:00 2001 From: p31729568 Date: Sat, 15 Jun 2019 08:33:14 +0800 Subject: [PATCH 39/55] fix business not permission at ec major school show --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ceeb8b9b..601ebb8a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -135,7 +135,7 @@ class ApplicationController < ActionController::Base end def ec_public_auth major_school - unless User.current.admin? || major_school.template_major || major_school.school.users.where(:id => User.current.id).count > 0 || + unless admin_or_business? || major_school.template_major || major_school.school.users.where(:id => User.current.id).count > 0 || major_school.ec_major_school_users.where(:user_id => User.current.id).count > 0 || EcCourseUser.where(:user_id => User.current.id, :ec_course_id => EcCourse.where(:ec_year_id => major_school.ec_years.pluck(:id)).pluck(:id)).count > 0 render_403 From d02d10e95c4ba55697e1d508408c4704cbf3f773 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Sat, 15 Jun 2019 10:35:37 +0800 Subject: [PATCH 40/55] =?UTF-8?q?=E6=94=AF=E4=BB=98-=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=BC=80=E9=80=9A=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/trainings/pay.html.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index df22b65c..573de6fe 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -11,6 +11,7 @@ 线下支付

    +

    微信支付将于6月18日开通

    From c0a3620bb4070fa0cbb88a0396c84de0bfc0baf4 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Sun, 16 Jun 2019 15:53:05 +0800 Subject: [PATCH 41/55] training: modify flow --- app/controllers/trainings_controller.rb | 190 ++++++++++------------ app/models/training_payinfo.rb | 3 + app/views/layouts/base_trainings.html.erb | 17 +- app/views/trainings/_upload_img.html.erb | 9 +- app/views/trainings/enroll.html.erb | 11 +- app/views/trainings/pay.html.erb | 41 +++-- app/views/trainings/result.html.erb | 37 ++--- public/stylesheets/educoder/trainings.css | 4 +- 8 files changed, 144 insertions(+), 168 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 948d97be..2a9ed1c2 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -4,68 +4,38 @@ class TrainingsController < ApplicationController wechat_responder skip_before_filter :check_if_login_required - skip_before_filter :verify_signature, only: [:show, :create, :update, :test, :enroll] + skip_before_filter :verify_signature, 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, except: [:auth, :auth_callback, :pay_callback] - - before_filter :find_training, only: [:show, :test] - - before_filter :valid_training, only: [:pay, :result, :pay_js] + before_filter :check_training_type, only: [:enroll] + before_filter :check_current_training, only: [:show, :update, :pay, :pay_js, :update_payinfo, :result] layout 'base_trainings' - - # TAG_ID = 'bigdata_hnjcxy_2019' - def show @training = current_training - - url = nil - if @training && !@training.pay? - url = enroll_training_path(id: @tag_id) - elsif @training && @training.pay? - url = result_training_path(id: @tag_id) - else - url = enroll_training_path(id: @tag_id) - end - - redirect_to url end def enroll @training = current_training || Training.new - - if @training && @training.pay? - redirect_to result_training_path(id: @tag_id) - return - end - - Rails.logger.info("##########training_type:#{@training_type}") - @training_title = @training_type == 3 ? "信息技术新工科产学研联盟师资培训班" : "工程教育认证" - Rails.logger.info("##########training_title:#{@training_title}") end def pay @training = current_training - if @training.blank? - redirect_to enroll_training_path(id: @tag_id) - return - end - # 防止重复支付,对于已支付过的,不应该再到这个页来 if @training.payed? - redirect_to result_training_path(id: @tag_id) + redirect_to result_training_path(id: friendly_id) return end if @training.training_payinfo.blank? @training.build_training_payinfo @training.training_payinfo.fee = @training.registration_fee + @training.training_payinfo.pay_type = params[:pay_type].presence || 3 end end @@ -113,36 +83,24 @@ class TrainingsController < ApplicationController end def create - @training = current_training || Training.new(params) + @training = Training.new @training.training_type = @training_type - if @training_type == 3 - @training.research_field = params[:research_field].select(&:present?).uniq.join(",") - end @training.openid = session[:wechat_open_id] - @training.save! - flash[:message] = '提交成功' + save_training - redirect_to pay_training_path(id: @tag_id) - end + flash[:message] = '报名成功' + redirect_to training_path(id: friendly_id) + end def update @training = current_training - if @training.blank? - redirect_to enroll_training_path(id: @tag_id) - return - end + save_training - @training.assign_attributes(params) - if @training.training_type == 3 - @training.research_field = params[:research_field].select(&:present?).uniq.join(",") - end - @training.save! - - flash[:message] = '提交成功' + flash[:message] = '保存成功' - redirect_to pay_training_path(id: @tag_id) + redirect_to training_path(id: friendly_id) end @@ -152,48 +110,45 @@ class TrainingsController < ApplicationController # 采用ajax调用方式,返回支付参数 def update_payinfo @training = current_training - if @training.blank? - redirect_to enroll_training_path(id: @tag_id) - return - end + training_info = @training.training_payinfo || @training.build_training_payinfo + training_info.assign_attributes(params) - attachment = nil - if params[:image] - attachment = Attachment.create!(file: params[:image], author: User.first) + # 已支付不能修改人数 + if training_info.not_payed? + training_info.num = params[:enlistNum].to_i < 1 ? 1 : params[:enlistNum].to_i + training_info.fee = @training.registration_fee(training_info.num) end - #修改以前的订单信息 - training_info = @training.training_payinfo - if training_info.present? - training_info.update_attributes(params) - else - training_info = TrainingPayinfo.new(params) - end - - training_info.num = params[:enlistNum].to_i < 1 ? 1 : params[:enlistNum].to_i + ActiveRecord::Base.transaction do + if training_info.pay_type.to_i == TrainingPayinfo::PayType_bank + attachment = nil + attachment = Attachment.create!(file: params[:image], author: User.first) if params[:image] - training_info.fee = @training.registration_fee(training_info.num) - - training_info.attachment = attachment if attachment.present? + if attachment.blank? + flash[:message] = '请先上传支付凭证' + render 'pay' + return + end - if training_info.pay_type.to_i == TrainingPayinfo::PayType_Wechat - training_info.status = TrainingPayinfo::Status_None - elsif params[:offline_later_pay].to_s == 'true' - # 线下支付-稍后支付 - training_info.status = TrainingPayinfo::Status_None - else - training_info.status = TrainingPayinfo::Status_Wait - end + training_info.attachment = attachment + end - training_info.training_id = @training.id + if training_info.not_payed? + if training_info.pay_type.to_i == TrainingPayinfo::PayType_Wechat + training_info.status = TrainingPayinfo::Status_None + else + training_info.status = TrainingPayinfo::Status_Wait + end + end - training_info.save! + training_info.save! - if params[:js] == 'true' - Rails.logger.info("### start wechat pay => fee: #{training_info.fee}") - _pay_js(0.01 || training_info.fee) - else - redirect_to url = result_training_path(id: @tag_id) + if params[:js] == 'true' + Rails.logger.info("### start wechat pay => fee: #{training_info.fee}") + _pay_js(training_info.fee) + else + redirect_to result_training_path(id: friendly_id) + end end end @@ -268,29 +223,54 @@ class TrainingsController < ApplicationController end end - def find_tag_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 - end + def save_training + @training.assign_attributes(params) + @training.training_type = training_type - def find_training - if params[:id] == @tag_id - @training = current_training - else - render_404 + if @training.training_type == 3 + @training.research_field = params[:research_field].select(&:present?).uniq.join(",") end + + @training.save! + end + + def friendly_id + @friendly_id ||= params[:friendly_id].presence || params[:id] + end + + def training_type + @training_type ||= + case friendly_id + when 'aeee0601_2019' then 3 + when 'ceeaa06_2019' then 4 + end end def current_training - Rails.logger.info("##########openid:#{session[:wechat_open_id]}, training_type: #{@training_type}") - @_current_training ||= Training.where(openid: session[:wechat_open_id], training_type: @training_type).first + @_current_training ||= begin + Rails.logger.info("##########openid:#{session[:wechat_open_id]}, friendly_id: #{friendly_id}") + + return if training_type.blank? + + Training.where(openid: session[:wechat_open_id], training_type: training_type).first + end + end + + def check_training_type + return if training_type.present? + + render_404 end - def valid_training - unless current_training - redirect_to training_path(id: @tag_id) + def check_current_training + if current_training.blank? + if training_type.blank? + render_404 + return + end + + redirect_to enroll_training_path(id: friendly_id) + return end end diff --git a/app/models/training_payinfo.rb b/app/models/training_payinfo.rb index 71f1c793..fbb7e9dc 100644 --- a/app/models/training_payinfo.rb +++ b/app/models/training_payinfo.rb @@ -42,6 +42,9 @@ class TrainingPayinfo < ActiveRecord::Base pay_type.to_i == PayType_Wechat && status != Status_Payed end + def not_payed? + status.nil? || status == Status_None + end def payed? status == Status_Payed diff --git a/app/views/layouts/base_trainings.html.erb b/app/views/layouts/base_trainings.html.erb index 4f7f4774..51115cb1 100644 --- a/app/views/layouts/base_trainings.html.erb +++ b/app/views/layouts/base_trainings.html.erb @@ -2,13 +2,16 @@ - <%= if params[:controller] == "trainings" && params[:action] == "enroll" - "报名" - elsif params[:controller] == "trainings" && params[:action] == "pay" - "费用支付" - elsif params[:controller] == "trainings" && params[:action] == "result" - "支付状态" - end %> + + <%= + case "#{params[:controller]}-#{params[:action]}" + when 'trainings-show' then '报名信息' + when 'trainings-enroll' then '报名' + when 'trainings-pay' then '费用支付和发票信息' + when 'trainings-result' then '支付信息' + end + %> + diff --git a/app/views/trainings/_upload_img.html.erb b/app/views/trainings/_upload_img.html.erb index 3b7ae82d..7eebaffe 100644 --- a/app/views/trainings/_upload_img.html.erb +++ b/app/views/trainings/_upload_img.html.erb @@ -1,3 +1,4 @@ +<% disabled ||= false %>
    " style="padding-bottom: 10px;">
    <% if training.training_payinfo.attachment_url.present? %> @@ -6,8 +7,10 @@ <% else %>
  • <% end %> -
    - -
    + <% unless disabled %> +
    + +
    + <% end %>
    \ No newline at end of file diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index 84a88510..f5ee6867 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -124,9 +124,9 @@ <% end %>
    -

    <%= @training_title %>

    +

    <%= @training_type == 3 ? '信息技术新工科产学研联盟师资培训班' : '工程教育认证' %>

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

    基本信息

  • @@ -187,7 +187,7 @@

    - 提交 + <%= @training.new_record? ? '我要报名' : '保存' %> <% end %>
  • @@ -211,11 +211,6 @@ $('#sex').val("2"); } }); - - var message = "<%= flash[:message] %>"; - if (message && message.length > 0) { - alert(message); - } }) //下一步 diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 2c384e27..4cebcc83 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -1,17 +1,15 @@
    - <%= hidden_field_tag(:tag_id, params[:id]) %> - <%= hidden_field_tag(:offline_later_pay, 'false') %> + <%= hidden_field_tag(:friendly_id, @friendly_id) %>
    -

    - + + - 线下支付 - -

    -

    微信支付将于6月18日开通

    + + +
    @@ -34,7 +32,7 @@
    -

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

    +

    完成银行转账后,请上传转账凭证,由会务组审核

    @@ -46,12 +44,13 @@

    发票内容 + value="<%= @training.training_payinfo.try(:invoice_content).presence || '会议注册费' %>"/>

    备注

    - + +

    上传转账凭证

    <%= render :partial => 'upload_img', :locals => {:training => @training} %>
    @@ -61,7 +60,7 @@ (3人及以上8折优惠) <% end %>

    -

    含会议注册费、场地费、培训费、教材资料费、餐费、专家差旅费等

    +

    含会务费、培训费、教材资料费、餐费、专家差旅费等

    @@ -80,12 +79,12 @@

    " id="offlinePaySubmitBtn"> - 稍后支付 - 立即支付 + 返回 + 完成转账
    " id="paySubmitBtn"> - 返回 + 返回 立即支付
    @@ -234,13 +233,13 @@ //线下支付提交 $('#submitFormBtn').on('click', function () { - if(!checkBillInfo()){ return } - $('form').submit(); - }); - $('#laterSubmitFormBtn').on('click', function () { - if(!checkBillInfo()){ return } + if(!checkBillInfo()){ return; } - $('#offline_later_pay').val('true'); + var image = $("input[name='image']").val() + if (!image || image.length < 0) { + alert('请先上传支付凭证'); + return; + } $('form').submit(); }); diff --git a/app/views/trainings/result.html.erb b/app/views/trainings/result.html.erb index ca1228b3..c397ce31 100644 --- a/app/views/trainings/result.html.erb +++ b/app/views/trainings/result.html.erb @@ -86,35 +86,28 @@
    -

    -

    <%= @training.training_payinfo.info %>

    + <% if @training.training_payinfo.info.present? %> +

    +

    <%= @training.training_payinfo.info %>

    + <% end %> <% if @training.training_payinfo.attachment_id.to_i > 0 || @training.training_payinfo.pay_type != TrainingPayinfo::PayType_Wechat %> +

    - <%= render :partial => 'upload_img', :locals => {:training => @training} %> + <%= render partial: 'upload_img', locals: { training: @training, disabled: true } %> <% end %> -


    - - - <% if @training.payed? %> - 完成 - <% else %> - <% if @training.training_payinfo.wechat_wait_pay? %> -
    - <%= link_to "返回", pay_training_path(id: @tag_id), class: 'leftbtn' %> - 立即支付 -
    - <% elsif !@training.payed? %> - <%= link_to "返回", pay_training_path(id: @tag_id), class: 'returnBtn' %> - <% end %> - <% end %> + +
    + <% if @training.training_payinfo.wechat_wait_pay? %> + <%= link_to "返回", training_path(id: @friendly_id), class: 'leftbtn' %> + 立即支付 + <% else%> + <%= link_to "返回", pay_training_path(id: @friendly_id), class: 'rightbtn', style: 'width: 100%' %> + <% end %> +
    diff --git a/public/stylesheets/educoder/trainings.css b/public/stylesheets/educoder/trainings.css index 44df1617..91e3e4a9 100644 --- a/public/stylesheets/educoder/trainings.css +++ b/public/stylesheets/educoder/trainings.css @@ -175,7 +175,7 @@ input[type='text'].right_input{ float: right;color: #333; } .bottomBtn{ - position: fixed;bottom: 0px;left: 0px;width: 100%;height: 44px;line-height: 44px;font-size: 1.6rem;text-align: center; + position: fixed;bottom: 0px;left: 0px;width: 100%;height: 44px;line-height: 44px;font-size: 1.6rem;text-align: center;z-index: 20; } .bottomBtn .leftbtn{ width: 50%;float: left;background-color: #fff;color: #676767; @@ -203,7 +203,7 @@ input[type='text'].right_input{ line-height: 20px;margin-top: 3px; } .remarkAccount{ - width: 100%;resize: none;height: 80px;margin-bottom:14px;border: 1px solid #eee;padding: 5px;box-sizing: border-box; + width: 100%;resize: none;height: 80px;border: 1px solid #eee;padding: 5px;box-sizing: border-box; } .moneyDetail{ line-height: 20px;color: #4B4B4B; From dba3a658001a6ed1a01733354d85bad57767f9d4 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Sun, 16 Jun 2019 16:19:05 +0800 Subject: [PATCH 42/55] =?UTF-8?q?=E6=94=AF=E4=BB=98=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/trainings/trainingsInfo.html.erb | 40 ++++++++++++++++++++++ public/stylesheets/educoder/trainings.css | 35 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 app/views/trainings/trainingsInfo.html.erb diff --git a/app/views/trainings/trainingsInfo.html.erb b/app/views/trainings/trainingsInfo.html.erb new file mode 100644 index 00000000..7fd2840c --- /dev/null +++ b/app/views/trainings/trainingsInfo.html.erb @@ -0,0 +1,40 @@ +
    +
    +

    报名成功

    +
    +
    +
    +

    基本信息

    +
  • + 姓名 + 胡莎莎 +
  • +
  • + 性别 + +
  • +
  • + 单位 + 国防科技大学 +
  • +
  • + 职称 + 助教 +
  • +
  • + 手机号 + 181****2757 +
  • +
    +
    +

    您关注的课程类型

    + 程序设计 + 操作系统 + 软件工程 + 程序设计 +
    + 修改资料 + \ No newline at end of file diff --git a/public/stylesheets/educoder/trainings.css b/public/stylesheets/educoder/trainings.css index 44df1617..278cb2c9 100644 --- a/public/stylesheets/educoder/trainings.css +++ b/public/stylesheets/educoder/trainings.css @@ -265,3 +265,38 @@ input[type='text'].right_input{ content: " ";position: absolute;top: 50%;left: 50%;-webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%);background-color: #D9D9D9; } + + +/* 支付信息 */ +.InfoTop{width: 100%;height: 6.5rem;background: linear-gradient(to right, #4CC6FF , #6588F8);justify-content: center; + align-items: center;display: -webkit-flex;} + .info_updateBtn{ + display: block; + width: 60%; + height: 35px; + line-height: 35px; + text-align: center; + border: 1px solid #4CC6FF; + border-radius: 24px; + font-size: 2.2rem; + color: #4CC6FF!important; + margin-top: 1rem;margin:2rem auto; + } + .Infos{ + padding:15px;box-sizing: border-box;background: #fff; + } + .Infos {margin-bottom: 1rem;} + .Infos .Infos_title{font-size: 1.5rem;color: #000;margin-bottom: 1rem;} + .Infos li{margin-bottom: 8px;} + .Infos li span:first-child{color: #666666;font-size: 1.4rem;float: left;} + .Infos li span:last-child{color: #333;font-size: 1.4rem;float: right;} + .Infos .Infos_tag{float: left;height:2.8rem;padding: 0px 0.5rem;box-sizing: border-box;line-height: 2.8rem; + background: #E6F3FF;color: #4CACFF;cursor: default;margin-right: 1.5rem; + } + .Infos_btn {background: #fff;height: 5rem;line-height: 5rem;position: absolute;bottom: 0px;left:0px;width: 100%;} + .Infos_btn a{ + float: left;width: 50%;text-align: center;color: #4CACFF!important;font-size: 1.8rem; + } + .Infos_btn a:last-child{ + background: #4CACFF!important;color: #fff!important; + } From 3a301499ca6ddccb2a40c82cfe3e5bd54d90deed Mon Sep 17 00:00:00 2001 From: p31729568 Date: Sun, 16 Jun 2019 17:10:23 +0800 Subject: [PATCH 43/55] modify trainings --- app/controllers/trainings_controller.rb | 25 +++- app/models/training_payinfo.rb | 4 + app/views/trainings/pay.html.erb | 127 ++++++++++----------- app/views/trainings/result.html.erb | 4 +- app/views/trainings/trainingsInfo.html.erb | 77 +++++++------ public/stylesheets/educoder/trainings.css | 8 +- 6 files changed, 132 insertions(+), 113 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 2a9ed1c2..834509d3 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -17,10 +17,22 @@ class TrainingsController < ApplicationController def show @training = current_training + + if @training.training_payinfo.present? && params[:disable_redirect].blank? + redirect_to result_training_path(id: friendly_id) + return + end + + render 'trainingsInfo' end def enroll @training = current_training || Training.new + + if @training.training_payinfo.present? && params[:disable_redirect].blank? + redirect_to result_training_path(id: friendly_id) + return + end end def pay @@ -80,6 +92,11 @@ class TrainingsController < ApplicationController def result @training = current_training + + if @training.training_payinfo.blank? + redirect_to training_path(id: friendly_id) + return + end end def create @@ -89,18 +106,14 @@ class TrainingsController < ApplicationController save_training - flash[:message] = '报名成功' - - redirect_to training_path(id: friendly_id) + redirect_to training_path(id: friendly_id, disable_redirect: true) end def update @training = current_training save_training - flash[:message] = '保存成功' - - redirect_to training_path(id: friendly_id) + redirect_to training_path(id: friendly_id, disable_redirect: true) end diff --git a/app/models/training_payinfo.rb b/app/models/training_payinfo.rb index fbb7e9dc..9882c095 100644 --- a/app/models/training_payinfo.rb +++ b/app/models/training_payinfo.rb @@ -46,6 +46,10 @@ class TrainingPayinfo < ActiveRecord::Base status.nil? || status == Status_None end + def offline_pay? + pay_type.to_i == PayType_bank + end + def payed? status == Status_Payed end diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 4cebcc83..9ec09189 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -36,10 +36,20 @@
    -

    - 发票 - - + + + + + +

    + 发票抬头 + +

    +

    + 税务登记号 +

    发票内容 @@ -79,39 +89,38 @@

    " id="offlinePaySubmitBtn"> - 返回 + 返回 完成转账
    " id="paySubmitBtn"> - 返回 + 返回 立即支付
    -
    -
    -

    - 发票抬头 - -

    -
      -
    • 单位
    • -
    • 个人
    • -
    • 不需要
    • -
    -

    - 发票抬头 -

    -
      - - -
    -

    - 确定 -
    -
    + + + + + + + + + + + + + + + + + + + + +
    @@ -151,24 +160,24 @@ invoiceNo: '<%= @training.training_payinfo.invoice_no %>' }; //点击弹出发票弹框 - aboutBillType(userInfo); + // aboutBillType(userInfo); //点击弹出支付方式弹框 aboutPayType(); //初始化发票类型 - InitBill(userInfo); + // InitBill(userInfo); //切换发票类型 - $(".billType li").on("click", function () { - $(".billType li").removeClass("active"); - $(this).addClass("active"); - billTypeShowFun(parseInt($(this).index()), userInfo); - }) - //关闭弹窗 - $(".billClose").on("click", function () { - hideNav($(".downNav")); - }); + // $(".billType li").on("click", function () { + // $(".billType li").removeClass("active"); + // $(this).addClass("active"); + // billTypeShowFun(parseInt($(this).index()), userInfo); + // }) + // //关闭弹窗 + // $(".billClose").on("click", function () { + // hideNav($(".downNav")); + // }); //延迟支付,直接提交 $('#delayPayBtn').on('click', function () { @@ -298,16 +307,12 @@ } //页面加载时,初始化发票类型 function InitBill(userInfo){ - var index=0; - $("#billDemand").html("单位").attr("status",0); + var index=1; + $("#billDemand").html("单位").attr("status",1); if (!userInfo.newPayinfo) { - if(userInfo.invoiceTitle == "" && userInfo.invoiceNo == ""){ - index=2; - $("#billDemand").html("不需要").attr("status",2); - } if(userInfo.invoiceTitle != "" && userInfo.invoiceNo == ""){ - index=1; - $("#billDemand").html("个人").attr("status",1); + index=0; + $("#billDemand").html("个人").attr("status",0); } } $(".billType li").removeClass("active"); @@ -315,17 +320,14 @@ billTypeShowFun(index,userInfo); } function billTypeShowFun(index, userInfo){ - if (parseInt(index) == 0) { + if (parseInt(index) == 1) { $(".needWrite").removeClass("none"); $(".billUnit").attr("placeholder", "请填写公司单位名称").val(userInfo.invoiceTitle || userInfo.school); $(".taxNumber").removeClass("none").val(userInfo.invoiceNo); - } else if (parseInt(index) == 1) { + } else if (parseInt(index) == 0) { $(".needWrite").removeClass("none"); $(".billUnit").attr("placeholder", "请填写姓名").val(userInfo.name); $(".taxNumber").val('').addClass("none"); - } else { - $(".needWrite").addClass("none"); - $(".billInput").val(''); } } @@ -408,23 +410,16 @@ } function checkBillInfo() { - var bill = $("#billLine"); - var billNav = $(".billDownNav"); - var status = $("#billDemand").attr("status"); - if(status == 2){ - $(".billInput").val(''); + if ($("input[name='invoice_title']").val() == '') { + alert("请填写发票抬头"); + return false; } - - var billUnit = $('.billUnit').val(); - var taxNumber = $('.taxNumber').val(); - if(status == 1 && billUnit == ''){ - alert('请将发票信息填写完整'); - showNav(bill, billNav, "down"); + if ($("input[name='invoice_no']").val() == '') { + alert("请填写税务登记号"); return false; } - if(status == 0 && (billUnit == '' || taxNumber == '')){ - alert('请将发票信息填写完整'); - showNav(bill, billNav, "down"); + if ($("input[name='invoice_content']").val() == '') { + alert("请填写发票内容"); return false; } diff --git a/app/views/trainings/result.html.erb b/app/views/trainings/result.html.erb index c397ce31..6a660ca1 100644 --- a/app/views/trainings/result.html.erb +++ b/app/views/trainings/result.html.erb @@ -102,10 +102,10 @@
    <% if @training.training_payinfo.wechat_wait_pay? %> - <%= link_to "返回", training_path(id: @friendly_id), class: 'leftbtn' %> + <%= link_to "返回", training_path(id: @friendly_id, disable_redirect: true), class: 'leftbtn' %> 立即支付 <% else%> - <%= link_to "返回", pay_training_path(id: @friendly_id), class: 'rightbtn', style: 'width: 100%' %> + <%= link_to "返回", training_path(id: @friendly_id, disable_redirect: true), class: 'rightbtn', style: 'width: 100%' %> <% end %>
    diff --git a/app/views/trainings/trainingsInfo.html.erb b/app/views/trainings/trainingsInfo.html.erb index 7fd2840c..f6292b6f 100644 --- a/app/views/trainings/trainingsInfo.html.erb +++ b/app/views/trainings/trainingsInfo.html.erb @@ -1,40 +1,47 @@
    -
    -

    报名成功

    -
    -
    -
    -

    基本信息

    -
  • - 姓名 - 胡莎莎 -
  • -
  • - 性别 - -
  • -
  • - 单位 - 国防科技大学 -
  • -
  • - 职称 - 助教 -
  • -
  • - 手机号 - 181****2757 -
  • +
    +

    报名成功

    +
    +
    +

    基本信息

    +
  • + 姓名 + <%= @training.name %> +
  • +
  • + 性别 + <%= @training.sex == 1 ? '男' : '女' %> +
  • +
  • + 单位 + <%= @training.school %> +
  • +
  • + 职称 + <%= @training.position %> +
  • +
  • + 手机号 + <%= @training.phone %> +
  • +
    + +<% if @training.training_type == 3 %>

    您关注的课程类型

    - 程序设计 - 操作系统 - 软件工程 - 程序设计 + <% @training.research_field.to_s.split(',').each do |name| %> + <%= name %> + <% end %> +
    +<% end %> + +<%= link_to('修改资料', enroll_training_path(id: @friendly_id, disable_redirect: true), class: 'info_updateBtn') %> + +<% if @training.training_payinfo.blank? %> +
    + <%= link_to '转账支付', pay_training_path(id: @friendly_id, pay_type: 3), class: 'leftbtn' %> + <%#= link_to '微信支付', pay_training_path(id: @friendly_id, pay_type: 1), class: 'rightbtn' %> + 微信支付
    - 修改资料 - \ No newline at end of file +<% end %> \ No newline at end of file diff --git a/public/stylesheets/educoder/trainings.css b/public/stylesheets/educoder/trainings.css index 1823c264..e9a73727 100644 --- a/public/stylesheets/educoder/trainings.css +++ b/public/stylesheets/educoder/trainings.css @@ -269,7 +269,7 @@ input[type='text'].right_input{ /* 支付信息 */ .InfoTop{width: 100%;height: 6.5rem;background: linear-gradient(to right, #4CC6FF , #6588F8);justify-content: center; - align-items: center;display: -webkit-flex;} + align-items: center;display: -webkit-flex;font-size: 1.6rem;color: white;} .info_updateBtn{ display: block; width: 60%; @@ -278,7 +278,7 @@ input[type='text'].right_input{ text-align: center; border: 1px solid #4CC6FF; border-radius: 24px; - font-size: 2.2rem; + font-size: 1.6rem; color: #4CC6FF!important; margin-top: 1rem;margin:2rem auto; } @@ -290,8 +290,8 @@ input[type='text'].right_input{ .Infos li{margin-bottom: 8px;} .Infos li span:first-child{color: #666666;font-size: 1.4rem;float: left;} .Infos li span:last-child{color: #333;font-size: 1.4rem;float: right;} - .Infos .Infos_tag{float: left;height:2.8rem;padding: 0px 0.5rem;box-sizing: border-box;line-height: 2.8rem; - background: #E6F3FF;color: #4CACFF;cursor: default;margin-right: 1.5rem; + .Infos .Infos_tag{float: left;height:2.0rem;padding: 0px 0.5rem;box-sizing: border-box;line-height: 2.0rem; + background: #E6F3FF;color: #4CACFF;cursor: default;margin-right: 1.5rem;margin-bottom: 1.0rem; } .Infos_btn {background: #fff;height: 5rem;line-height: 5rem;position: absolute;bottom: 0px;left:0px;width: 100%;} .Infos_btn a{ From 56bea6da3ad110f4fc5b5431b1bd162deb632f1a Mon Sep 17 00:00:00 2001 From: p31729568 Date: Sun, 16 Jun 2019 19:51:01 +0800 Subject: [PATCH 44/55] modify trainings --- app/controllers/trainings_controller.rb | 22 ++++++----------- app/views/trainings/pay.html.erb | 32 +++++++++++++++---------- app/views/trainings/result.html.erb | 2 +- 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 834509d3..7c95c150 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -38,12 +38,6 @@ class TrainingsController < ApplicationController def pay @training = current_training - # 防止重复支付,对于已支付过的,不应该再到这个页来 - if @training.payed? - redirect_to result_training_path(id: friendly_id) - return - end - if @training.training_payinfo.blank? @training.build_training_payinfo @training.training_payinfo.fee = @training.registration_fee @@ -126,27 +120,25 @@ class TrainingsController < ApplicationController training_info = @training.training_payinfo || @training.build_training_payinfo training_info.assign_attributes(params) - # 已支付不能修改人数 - if training_info.not_payed? - training_info.num = params[:enlistNum].to_i < 1 ? 1 : params[:enlistNum].to_i - training_info.fee = @training.registration_fee(training_info.num) - end - ActiveRecord::Base.transaction do if training_info.pay_type.to_i == TrainingPayinfo::PayType_bank attachment = nil attachment = Attachment.create!(file: params[:image], author: User.first) if params[:image] - if attachment.blank? + if attachment.blank? && training_info.not_payed? flash[:message] = '请先上传支付凭证' render 'pay' return end - training_info.attachment = attachment + training_info.attachment = attachment if attachment.present? end if training_info.not_payed? + # 已支付不能修改人数 + training_info.num = params[:enlistNum].to_i < 1 ? 1 : params[:enlistNum].to_i + training_info.fee = @training.registration_fee(training_info.num) + if training_info.pay_type.to_i == TrainingPayinfo::PayType_Wechat training_info.status = TrainingPayinfo::Status_None else @@ -156,7 +148,7 @@ class TrainingsController < ApplicationController training_info.save! - if params[:js] == 'true' + if params[:js] == 'true' && training_info.not_payed? Rails.logger.info("### start wechat pay => fee: #{training_info.fee}") _pay_js(training_info.fee) else diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 9ec09189..4e565525 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -77,20 +77,24 @@ <%= @training.training_payinfo.fee || @training.registration_fee %> - - - - <%= @training.training_payinfo.num || 1 %> - - - + <% if @training.training_payinfo.not_payed? %> + + + + <%= @training.training_payinfo.num || 1 %> + + + + <% else %> + <%= @training.training_payinfo.num || 1 %> + <% end %>

    " id="paySubmitBtn"> @@ -244,11 +248,13 @@ $('#submitFormBtn').on('click', function () { if(!checkBillInfo()){ return; } - var image = $("input[name='image']").val() - if (!image || image.length < 0) { - alert('请先上传支付凭证'); - return; - } + <% if @training.training_payinfo.not_payed? %> + var image = $("input[name='image']").val() + if (!image || image.length < 0) { + alert('请先上传支付凭证'); + return; + } + <% end %> $('form').submit(); }); diff --git a/app/views/trainings/result.html.erb b/app/views/trainings/result.html.erb index 6a660ca1..d43da5f0 100644 --- a/app/views/trainings/result.html.erb +++ b/app/views/trainings/result.html.erb @@ -105,7 +105,7 @@ <%= link_to "返回", training_path(id: @friendly_id, disable_redirect: true), class: 'leftbtn' %> 立即支付 <% else%> - <%= link_to "返回", training_path(id: @friendly_id, disable_redirect: true), class: 'rightbtn', style: 'width: 100%' %> + <%= link_to "返回", pay_training_path(id: @friendly_id, disable_redirect: true), class: 'rightbtn', style: 'width: 100%' %> <% end %>
    From 92c7dd4ead8481977fabd2fab0c161058f117698 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Sun, 16 Jun 2019 23:26:15 +0800 Subject: [PATCH 45/55] modify trainings --- app/views/trainings/trainingsInfo.html.erb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/views/trainings/trainingsInfo.html.erb b/app/views/trainings/trainingsInfo.html.erb index f6292b6f..e6287aaa 100644 --- a/app/views/trainings/trainingsInfo.html.erb +++ b/app/views/trainings/trainingsInfo.html.erb @@ -44,4 +44,9 @@ <%#= link_to '微信支付', pay_training_path(id: @friendly_id, pay_type: 1), class: 'rightbtn' %> 微信支付 +<% else %> +
    + <%= link_to '支付详情', pay_training_path(id: @friendly_id, pay_type: @training.training_payinfo.pay_type), + class: 'rightbtn', style: 'width: 100%;' %> +
    <% end %> \ No newline at end of file From d8e3214a16e0a765bf068fbbdffcb2b96cd11456 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Mon, 17 Jun 2019 00:01:58 +0800 Subject: [PATCH 46/55] modify trainings --- app/controllers/trainings_controller.rb | 4 ++-- app/views/trainings/pay.html.erb | 2 +- app/views/trainings/trainingsInfo.html.erb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 7c95c150..2e11eaab 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -18,7 +18,7 @@ class TrainingsController < ApplicationController def show @training = current_training - if @training.training_payinfo.present? && params[:disable_redirect].blank? + if @training.training_payinfo.present? && !@training.training_payinfo.not_payed? && params[:disable_redirect].blank? redirect_to result_training_path(id: friendly_id) return end @@ -125,7 +125,7 @@ class TrainingsController < ApplicationController attachment = nil attachment = Attachment.create!(file: params[:image], author: User.first) if params[:image] - if attachment.blank? && training_info.not_payed? + if training_info.attachment.blank? && attachment.blank? && training_info.not_payed? flash[:message] = '请先上传支付凭证' render 'pay' return diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 4e565525..920fd14b 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -248,7 +248,7 @@ $('#submitFormBtn').on('click', function () { if(!checkBillInfo()){ return; } - <% if @training.training_payinfo.not_payed? %> + <% if @training.training_payinfo.blank? || (@training.training_payinfo.not_payed? && @training.training_payinfo.attachment.blank?) %> var image = $("input[name='image']").val() if (!image || image.length < 0) { alert('请先上传支付凭证'); diff --git a/app/views/trainings/trainingsInfo.html.erb b/app/views/trainings/trainingsInfo.html.erb index e6287aaa..1ab35176 100644 --- a/app/views/trainings/trainingsInfo.html.erb +++ b/app/views/trainings/trainingsInfo.html.erb @@ -38,7 +38,7 @@ <%= link_to('修改资料', enroll_training_path(id: @friendly_id, disable_redirect: true), class: 'info_updateBtn') %> -<% if @training.training_payinfo.blank? %> +<% if @training.training_payinfo.blank? || @training.training_payinfo.not_payed? %>
    <%= link_to '转账支付', pay_training_path(id: @friendly_id, pay_type: 3), class: 'leftbtn' %> <%#= link_to '微信支付', pay_training_path(id: @friendly_id, pay_type: 1), class: 'rightbtn' %> From cd7db688d2d9d58e74c950017dd734b146f02b8c Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 17 Jun 2019 10:19:25 +0800 Subject: [PATCH 47/55] =?UTF-8?q?vnc=E7=9A=84url=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/myshixuns_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index 96f45d3a..68e4b4b0 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -358,7 +358,7 @@ class MyshixunsController < ApplicationController def vnc vnc_password = Redmine::Configuration['vnc'] shixun_tomcat = Redmine::Configuration['shixun_tomcat'] - host = Redmine::Configuration['tomcat_php'] + host = Redmine::Configuration['vnc_url'] begin uri = "#{shixun_tomcat}/bridge/vnc/getvnc" shixun = @myshixun.shixun @@ -368,7 +368,7 @@ class MyshixunsController < ApplicationController raise("实训云平台繁忙(繁忙等级:99)") end # url = host + ":" + res['port'] + "?password=" + vnc_password - url = host +":#{res['port']}/vnc.html" + url = "https://#{res['port']}.#{host}/vnc.html" render :json => {:url => url} rescue Exception => e logger.error(e) From cb0010913f7260b7fa9b97238611bf381277098f Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 17 Jun 2019 10:35:44 +0800 Subject: [PATCH 48/55] =?UTF-8?q?vnc=E5=9F=9F=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/services/games_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/games_service.rb b/app/services/games_service.rb index f513316e..d732bb48 100644 --- a/app/services/games_service.rb +++ b/app/services/games_service.rb @@ -80,14 +80,14 @@ class GamesService if shixun.vnc begin shixun_tomcat = Redmine::Configuration['shixun_tomcat'] - service_host = Redmine::Configuration['tomcat_php'] + service_host = Redmine::Configuration['vnc_url'] uri = "#{shixun_tomcat}/bridge/vnc/getvnc" params = {tpiID: myshixun.id, :containers => "#{Base64.urlsafe_encode64(container_limit(shixun.mirror_repositories))}"} res = uri_exec uri, params if res && res['code'].to_i != 0 raise("实训云平台繁忙(繁忙等级:99)") end - url = "#{service_host}" +":#{res['port']}/vnc_lite.html?password=headless" + url = "https://#{res['port']}.#{service_host}/vnc_lite.html?password=headless" Rails.logger.info("66666666sssssss#{url}") container = container.merge(:vnc_url => url) Rails.logger.info("777777666sssssss#{container}") From 5584fec83113a4cafec05265db7d2665d4c09b24 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 17 Jun 2019 10:49:25 +0800 Subject: [PATCH 49/55] vnc --- public/react/src/modules/page/VNCDisplay.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/page/VNCDisplay.js b/public/react/src/modules/page/VNCDisplay.js index e6dff2f4..1e443ed1 100644 --- a/public/react/src/modules/page/VNCDisplay.js +++ b/public/react/src/modules/page/VNCDisplay.js @@ -88,11 +88,11 @@ class VNCDisplay extends Component { status("Connecting"); // Build the websocket URL used to connect let url; - // if (window.location.protocol === "https:") { - // url = 'wss'; - // } else { + if (vnc_url.indexOf("https:") != -1) { + url = 'wss'; + } else { url = 'ws'; - // } + } url += '://' + host; if(port) { url += ':' + port; From e8f40b9430005a98657a2cca9df2cedaea728697 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 18 Jun 2019 16:52:55 +0800 Subject: [PATCH 50/55] add wechat pay support --- app/controllers/trainings_controller.rb | 26 ++++++++++++++++- app/views/trainings/_upload_img.html.erb | 2 +- app/views/trainings/pay.html.erb | 34 +++++++++++++--------- app/views/trainings/trainingsInfo.html.erb | 8 +++-- public/stylesheets/educoder/trainings.css | 2 +- 5 files changed, 54 insertions(+), 18 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 2e11eaab..c88cee80 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -13,6 +13,20 @@ class TrainingsController < ApplicationController before_filter :check_training_type, only: [:enroll] before_filter :check_current_training, only: [:show, :update, :pay, :pay_js, :update_payinfo, :result] + # TODO: 测试完成后删除 + ALLOW_OPENID_LIST = [ + 'o5fSc08-NDxC2564k9USCuiuC9cY', + 'o5fSc097mQbwhYVLK9DAIa3uz_ug', + 'o5fSc0607iR3rp4-h_VnuBTp8CiM', + 'o5fSc0-nX6bUGQNQt3FrRhUKVNIw', + 'o5fSc0607iR3rp4-h_VnuBTp8CiM' + ] + before_filter :check_openid, only: [:update_payinfo] + def check_openid + return if ALLOW_OPENID_LIST.include?(session[:wechat_open_id]) + render plain: '暂未开放' + end + layout 'base_trainings' def show @@ -23,6 +37,9 @@ class TrainingsController < ApplicationController return end + # TODO: 测试完成后删除 + @test_wxpay = ALLOW_OPENID_LIST.include?(session[:wechat_open_id]) + render 'trainingsInfo' end @@ -43,6 +60,9 @@ class TrainingsController < ApplicationController @training.training_payinfo.fee = @training.registration_fee @training.training_payinfo.pay_type = params[:pay_type].presence || 3 end + + # TODO: 测试完成后删除 + @test_wxpay = ALLOW_OPENID_LIST.include?(session[:wechat_open_id]) end def pay_callback @@ -148,9 +168,13 @@ class TrainingsController < ApplicationController training_info.save! + # TODO: 测试完成后删除 + @test_wxpay = ALLOW_OPENID_LIST.include?(session[:wechat_open_id]) + if params[:js] == 'true' && training_info.not_payed? Rails.logger.info("### start wechat pay => fee: #{training_info.fee}") - _pay_js(training_info.fee) + # TODO: 测试完成后删除 + _pay_js(@test_wxpay ? 0.01 : training_info.fee) else redirect_to result_training_path(id: friendly_id) end diff --git a/app/views/trainings/_upload_img.html.erb b/app/views/trainings/_upload_img.html.erb index 7eebaffe..7cd7056a 100644 --- a/app/views/trainings/_upload_img.html.erb +++ b/app/views/trainings/_upload_img.html.erb @@ -1,5 +1,5 @@ <% disabled ||= false %> -
    " style="padding-bottom: 10px;"> +
    <% if training.training_payinfo.attachment_url.present? %>
  • <%= hidden_field_tag(:friendly_id, @friendly_id) %> - + <% if @test_wxpay %> +
    + <% else %>
    - - - - - - - -
    + <% end %> +

    + + <% if @test_wxpay %> + <%= @training.training_payinfo.pay_type.to_i == 3 ? "线下支付" : "微信支付" %> + <% else %> + 线下支付 + <% end %> + +

    +
    mt5" id="payInfos">
    @@ -60,10 +65,13 @@

    备注

    +
    +
    ">

    上传转账凭证

    <%= render :partial => 'upload_img', :locals => {:training => @training} %>
    +

    费用明细 <% if @training.training_type == 3 %> @@ -196,7 +204,7 @@ }) //立即支付 $('#payBtn').on('click', function () { - if(!checkBillInfo()){ return } + if(!checkBillInfo()){ return } var postData = $('form').serialize(); postData += '&js=true' @@ -228,7 +236,7 @@ // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 setTimeout(function () { - window.location.href = "/trainings/<%= @tag_id %>/result"; + window.location.href = "/trainings/<%= @friendly_id %>/result"; }, 500); } else if (res.err_msg == 'get_brand_wcpay_request:cancel') { @@ -358,14 +366,14 @@ $("#payTypeName").html($(this).html().trim()); console.log($(this).index()); if ($(this).index() == 0) { //微信支付 - $("#payInfos,#sendPhoto").addClass("none"); + $("#payInfos,.pay-image").addClass("none"); //切换显示按钮 $("#offlinePaySubmitBtn").addClass("none"); $("#paySubmitBtn").removeClass("none"); $('#pay_type').val("1"); } else { //线下支付 - $("#payInfos,#sendPhoto").removeClass("none"); + $("#payInfos,.pay-image").removeClass("none"); //切换显示按钮 $("#offlinePaySubmitBtn").removeClass("none"); $("#paySubmitBtn").addClass("none"); diff --git a/app/views/trainings/trainingsInfo.html.erb b/app/views/trainings/trainingsInfo.html.erb index 1ab35176..e71b9c07 100644 --- a/app/views/trainings/trainingsInfo.html.erb +++ b/app/views/trainings/trainingsInfo.html.erb @@ -41,8 +41,12 @@ <% if @training.training_payinfo.blank? || @training.training_payinfo.not_payed? %>

    <%= link_to '转账支付', pay_training_path(id: @friendly_id, pay_type: 3), class: 'leftbtn' %> - <%#= link_to '微信支付', pay_training_path(id: @friendly_id, pay_type: 1), class: 'rightbtn' %> - 微信支付 + + <% if @test_wxpay %> + <%= link_to '微信支付', pay_training_path(id: @friendly_id, pay_type: 1), class: 'rightbtn' %> + <% else %> + 微信支付 + <% end %>
    <% else %>
    diff --git a/public/stylesheets/educoder/trainings.css b/public/stylesheets/educoder/trainings.css index e9a73727..ad5cdcb6 100644 --- a/public/stylesheets/educoder/trainings.css +++ b/public/stylesheets/educoder/trainings.css @@ -203,7 +203,7 @@ input[type='text'].right_input{ line-height: 20px;margin-top: 3px; } .remarkAccount{ - width: 100%;resize: none;height: 80px;border: 1px solid #eee;padding: 5px;box-sizing: border-box; + width: 100%;resize: none;height: 80px;border: 1px solid #eee;padding: 5px;box-sizing: border-box;margin-bottom: 1rem; } .moneyDetail{ line-height: 20px;color: #4B4B4B; From 8c57e3363e06df7342aacc0876589ab4c8ab5b9d Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 18 Jun 2019 19:26:25 +0800 Subject: [PATCH 51/55] =?UTF-8?q?=E5=90=88=E4=BD=9C=E4=BC=99=E4=BC=B4?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=A7=E5=AD=A6=E8=81=94=E7=9B=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/account_controller.rb | 4 +- .../account/_cooperative_partner_show.erb | 59 ++++++++++++++++++- app/views/account/update_help.js.erb | 5 +- 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 128475e6..649cf19d 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -145,6 +145,7 @@ class AccountController < ApplicationController @com_coop_img = CooImg.where(:img_type => 'com_coop').order("position asc") @edu_coop_img = CooImg.where(:img_type => 'edu_coop').order("position asc") + @alliance_img = CooImg.where(:img_type => 'alliance_coop').order("position asc") render :layout => 'base_edu' end @@ -152,6 +153,7 @@ class AccountController < ApplicationController def update_help @edu_coop = "edu_coop" @com_coop = "com_coop" + @alliance_coop = "alliance_coop" end def update_agreement @@ -232,7 +234,7 @@ class AccountController < ApplicationController end if File.exist?(diskfile1) pos = CooImg.order("position asc").last.position - CooImg.create(:src_states =>params[:img_url] ,:url_states => diskfile2,:img_type =>params[:sourse_type], :position => pos) + CooImg.create(:src_states =>params[:img_url] ,:url_states => diskfile2,:img_type => params[:sourse_type], :position => pos) end redirect_to help_path(:index => 3) end diff --git a/app/views/account/_cooperative_partner_show.erb b/app/views/account/_cooperative_partner_show.erb index 67452b18..1d3bff9b 100644 --- a/app/views/account/_cooperative_partner_show.erb +++ b/app/views/account/_cooperative_partner_show.erb @@ -1,8 +1,28 @@ <%= stylesheet_link_tag 'css/public','css/common'%>

    合作伙伴

    +
    +

    产学联盟

    +
      + <% @alliance_img.each do |alliance_img| %> +
    • + <% if User.current.admin? %> + + <% end %> + + + +
    • + <% end %> + <% if User.current.admin? %> +
    • +  新建
    • + <% end %> +
    + +
    +
    -

    企业合作

    +

    知名企业

      <% @com_coop_img.each do |coop_img| %>
    • @@ -21,7 +41,7 @@
    -

    高校合作

    +

    各类院校

      <% @edu_coop_img.each do |coop_img| %>
    • @@ -51,6 +71,8 @@ var id = 0; var pos_1 = 0; var id_1 = 0; + var pos_2 = 0; + var id_2 = 0; $( "#sortable" ).sortable({ containment:".cooperation-item", sort:function(e, ui){ @@ -121,7 +143,40 @@ }); $( "#sortable1" ).disableSelection(); + $( "#sortable2" ).sortable({ + containment:".cooperation-school", + sort:function(e, ui){ + select_item = ui.item; //当前拖动的元素 + pos_2 = $(select_item[0]).prev().attr("data-position"); + id_2 = $(select_item[0]).attr("data-id"); + if(pos == undefined || id == undefined){ + pos_2 = 0; + } + }, + stop:function(e, ui){ + select_item = ui.item; //当前拖动的元素 + console.log(ui.item); + pos_2 = $(select_item[0]).prev().attr("data-position"); + id_2 = $(select_item[0]).attr("data-id"); + if(pos_2 == undefined || id_2 == undefined){ + pos_2 = 0; + } + console.log("pos: " + pos_2); + $.ajax({ + url: "<%= change_coop_position_path %>", + data: {id: id_2, position: pos_2, type: "alliance_coop"}, + success: function(data) { + if(data.status == 1){ + console.log("更新成功!"); + $(select_item[0]).attr("data-position", pos_2+1) + } + } + + }); + } + }); + $( "#sortable2" ).disableSelection(); }) diff --git a/app/views/account/update_help.js.erb b/app/views/account/update_help.js.erb index 39aa679a..d076eeed 100644 --- a/app/views/account/update_help.js.erb +++ b/app/views/account/update_help.js.erb @@ -1,7 +1,10 @@ <% if params[:tab] == '1' %> var htmlvalue = "<%= escape_javascript(render :partial => 'account/new_coop',:locals => {:resubmit =>params[:resubmit],:sourse_type => @com_coop}) %>"; pop_box_new(htmlvalue, 400, 260); -<% else %> +<% elsif params[:tab] == '2' %> var htmlvalue = "<%= escape_javascript(render :partial => 'account/new_coop',:locals => {:resubmit => params[:resubmit],:sourse_type => @edu_coop}) %>"; pop_box_new(htmlvalue, 400, 260); +<% else %> +var htmlvalue = "<%= escape_javascript(render :partial => 'account/new_coop',:locals => {:resubmit => params[:resubmit],:sourse_type => @alliance_coop}) %>"; +pop_box_new(htmlvalue, 400, 260); <% end %> \ No newline at end of file From b1306711da97df28e05f3b61e48bd6d5893e3e29 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 18 Jun 2019 19:41:30 +0800 Subject: [PATCH 52/55] add wechat oauth file --- public/MP_verify_FL7DKThNNDDEnU4k.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 public/MP_verify_FL7DKThNNDDEnU4k.txt diff --git a/public/MP_verify_FL7DKThNNDDEnU4k.txt b/public/MP_verify_FL7DKThNNDDEnU4k.txt new file mode 100644 index 00000000..5f5ee70d --- /dev/null +++ b/public/MP_verify_FL7DKThNNDDEnU4k.txt @@ -0,0 +1 @@ +FL7DKThNNDDEnU4k \ No newline at end of file From ab054713bf5655e65dfaa6fca37ac0c90fb9fae8 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Tue, 18 Jun 2019 19:49:12 +0800 Subject: [PATCH 53/55] =?UTF-8?q?=E5=90=88=E4=BD=9C=E4=BC=99=E4=BC=B4-?= =?UTF-8?q?=E4=BA=A7=E5=AD=A6=E8=81=94=E7=9B=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/account/_cooperative_partner_show.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/account/_cooperative_partner_show.erb b/app/views/account/_cooperative_partner_show.erb index 1d3bff9b..a358909c 100644 --- a/app/views/account/_cooperative_partner_show.erb +++ b/app/views/account/_cooperative_partner_show.erb @@ -3,7 +3,7 @@

      合作伙伴

      产学联盟

      -
        +
          <% @alliance_img.each do |alliance_img| %>
        • <% if User.current.admin? %> @@ -144,7 +144,7 @@ $( "#sortable1" ).disableSelection(); $( "#sortable2" ).sortable({ - containment:".cooperation-school", + containment:".cooperation-team", sort:function(e, ui){ select_item = ui.item; //当前拖动的元素 pos_2 = $(select_item[0]).prev().attr("data-position"); From ef8ee3c7e5df7814cfe9c97d3f33d3ef2fcea769 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Tue, 18 Jun 2019 20:23:42 +0800 Subject: [PATCH 54/55] test wexpau --- app/controllers/trainings_controller.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index c88cee80..d97cd53b 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -15,11 +15,7 @@ class TrainingsController < ApplicationController # TODO: 测试完成后删除 ALLOW_OPENID_LIST = [ - 'o5fSc08-NDxC2564k9USCuiuC9cY', - 'o5fSc097mQbwhYVLK9DAIa3uz_ug', - 'o5fSc0607iR3rp4-h_VnuBTp8CiM', - 'o5fSc0-nX6bUGQNQt3FrRhUKVNIw', - 'o5fSc0607iR3rp4-h_VnuBTp8CiM' + 'oSrqE52fgGMooW3B1K4mZ0Le5G9I' ] before_filter :check_openid, only: [:update_payinfo] def check_openid From 65c91f890a1df521e4494fe968d87e4c69699e9b Mon Sep 17 00:00:00 2001 From: p31729568 Date: Wed, 19 Jun 2019 09:18:19 +0800 Subject: [PATCH 55/55] open wechat pay method --- app/controllers/trainings_controller.rb | 37 +++++++--------------- app/models/training.rb | 2 +- app/views/trainings/pay.html.erb | 24 +++++++------- app/views/trainings/result.html.erb | 6 ++-- app/views/trainings/trainingsInfo.html.erb | 7 +--- 5 files changed, 30 insertions(+), 46 deletions(-) diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index d97cd53b..8650a5a7 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -13,16 +13,6 @@ class TrainingsController < ApplicationController before_filter :check_training_type, only: [:enroll] before_filter :check_current_training, only: [:show, :update, :pay, :pay_js, :update_payinfo, :result] - # TODO: 测试完成后删除 - ALLOW_OPENID_LIST = [ - 'oSrqE52fgGMooW3B1K4mZ0Le5G9I' - ] - before_filter :check_openid, only: [:update_payinfo] - def check_openid - return if ALLOW_OPENID_LIST.include?(session[:wechat_open_id]) - render plain: '暂未开放' - end - layout 'base_trainings' def show @@ -33,18 +23,22 @@ class TrainingsController < ApplicationController return end - # TODO: 测试完成后删除 - @test_wxpay = ALLOW_OPENID_LIST.include?(session[:wechat_open_id]) - render 'trainingsInfo' end def enroll @training = current_training || Training.new - if @training.training_payinfo.present? && params[:disable_redirect].blank? - redirect_to result_training_path(id: friendly_id) - return + if params[:disable_redirect].blank? + if @training.training_payinfo.present? + redirect_to result_training_path(id: friendly_id) + return + end + + unless @training.new_record? + redirect_to training_path(id: friendly_id) + return + end end end @@ -56,9 +50,6 @@ class TrainingsController < ApplicationController @training.training_payinfo.fee = @training.registration_fee @training.training_payinfo.pay_type = params[:pay_type].presence || 3 end - - # TODO: 测试完成后删除 - @test_wxpay = ALLOW_OPENID_LIST.include?(session[:wechat_open_id]) end def pay_callback @@ -164,13 +155,8 @@ class TrainingsController < ApplicationController training_info.save! - # TODO: 测试完成后删除 - @test_wxpay = ALLOW_OPENID_LIST.include?(session[:wechat_open_id]) - if params[:js] == 'true' && training_info.not_payed? - Rails.logger.info("### start wechat pay => fee: #{training_info.fee}") - # TODO: 测试完成后删除 - _pay_js(@test_wxpay ? 0.01 : training_info.fee) + _pay_js(training_info.fee) else redirect_to result_training_path(id: friendly_id) end @@ -199,6 +185,7 @@ class TrainingsController < ApplicationController #js获取支付参数 def _pay_js(fee) + Rails.logger.info("### start wechat pay => fee: #{fee}") @training = current_training js_function_call do out_trade_no = Wechat.pay.gen_trade_no diff --git a/app/models/training.rb b/app/models/training.rb index cb7f2db7..58de07ab 100644 --- a/app/models/training.rb +++ b/app/models/training.rb @@ -38,7 +38,7 @@ class Training < ActiveRecord::Base # 三人以上 8折 num >= 3 ? 3000.0 * 0.8 * num : 3000.0 * num when 4 then - 1200.0 * num + 700.0 * num else raise ArgumentError end diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 903876cf..9aebe19f 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -2,18 +2,10 @@
          <%= hidden_field_tag(:friendly_id, @friendly_id) %> - <% if @test_wxpay %> -
          - <% else %> -
          - <% end %> +
          >

          - <% if @test_wxpay %> - <%= @training.training_payinfo.pay_type.to_i == 3 ? "线下支付" : "微信支付" %> - <% else %> - 线下支付 - <% end %> + <%= @training.training_payinfo.pay_type.to_i == 3 ? "线下支付" : "微信支付" %>

          mt5" id="payInfos"> @@ -107,7 +99,11 @@
          " id="paySubmitBtn"> 返回 - 立即支付 + <% if @training.training_payinfo.not_payed? %> + 立即支付 + <% else %> + 提交 + <% end %>
          @@ -266,6 +262,12 @@ $('form').submit(); }); + // 微信支付后修改内容提交 + $("#submitWxpayFormBtn").on('click', function () { + if(!checkBillInfo()){ return; } + $('form').submit(); + }); + //上传头像 InitPhoto(); diff --git a/app/views/trainings/result.html.erb b/app/views/trainings/result.html.erb index d43da5f0..c71758ab 100644 --- a/app/views/trainings/result.html.erb +++ b/app/views/trainings/result.html.erb @@ -121,7 +121,7 @@ // eruda.init(); function wechatPay() { $.ajax({ - url: '<%= pay_js_trainings_path %>', + url: '<%= pay_js_trainings_path(friendly_id: @friendly_id) %>', type: "POST", data: '{}' } @@ -147,7 +147,7 @@ // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 setTimeout(function () { - window.location.href = "/trainings/<% @tag_id %>/result"; + window.location.href = "/trainings/<% @friendly_id %>/result"; }, 500); } else if (res.err_msg == 'get_brand_wcpay_request:cancel') { @@ -189,7 +189,7 @@ var data = new FormData(); data.append('image', files[0]); - data.append('tag_id', '<%= @tag_id %>'); + data.append('friendly_id', '<%= @friendly_id %>'); $.ajax({ url: '<%= update_picture_trainings_path %>', diff --git a/app/views/trainings/trainingsInfo.html.erb b/app/views/trainings/trainingsInfo.html.erb index e71b9c07..964455bc 100644 --- a/app/views/trainings/trainingsInfo.html.erb +++ b/app/views/trainings/trainingsInfo.html.erb @@ -41,12 +41,7 @@ <% if @training.training_payinfo.blank? || @training.training_payinfo.not_payed? %>
          <%= link_to '转账支付', pay_training_path(id: @friendly_id, pay_type: 3), class: 'leftbtn' %> - - <% if @test_wxpay %> - <%= link_to '微信支付', pay_training_path(id: @friendly_id, pay_type: 1), class: 'rightbtn' %> - <% else %> - 微信支付 - <% end %> + <%= link_to '微信支付', pay_training_path(id: @friendly_id, pay_type: 1), class: 'rightbtn' %>
          <% else %>