Merge branch 'dev_cxt2' into dev_aliyun

dev_cs
cxt 5 years ago
commit d3886a366c

@ -0,0 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

@ -0,0 +1,3 @@
// Place all the styles related to the course_stages controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

@ -0,0 +1,105 @@
class CourseStagesController < ApplicationController
before_action :require_login
before_action :find_course, only: [:create]
before_action :find_course_stage, only: [:update, :destroy, :edit, :up_position, :down_position]
before_action :user_course_identity, :teacher_allowed
def create
ActiveRecord::Base.transaction do
begin
@stage = CourseStage.new(stage_params)
@stage.course_id = @course.id
@stage.position = @course.course_stages.count + 1
@stage.save!
unless params[:shixun_id].blank?
shixuns = Shixun.where(id: params[:shixun_id]).order("field(id, #{params[:shixun_id].join(",")})")
shixuns.each do |shixun|
CourseStageShixun.create!(course_stage_id: @stage.id, course_id: @course.id, shixun_id: shixun.id, position: @stage.course_stage_shixuns.count + 1)
end
end
normal_status("创建成功")
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
end
def edit
end
def update
ActiveRecord::Base.transaction do
begin
@stage.update_attributes!(stage_params)
@stage.course_stage_shixuns.destroy_all
unless params[:shixun_id].blank?
params[:shixun_id].each do |shixun_id|
shixun = Shixun.where(id: shixun_id).first
@stage.course_stage_shixuns.create!(course_id: @course.id, shixun_id: shixun.id, position: @stage.course_stage_shixuns.count + 1) if shixun.present?
end
end
normal_status("更新成功")
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
end
def destroy
ActiveRecord::Base.transaction do
@course.course_stages.where("position > ?", @stage.position).update_all("position = position - 1")
@stage.destroy!
normal_status("删除成功")
end
end
def up_position
ActiveRecord::Base.transaction do
begin
position = @stage.position
tip_exception("第一章不能向上移动") if @stage.position == 1
pre_stage = @course.course_stages.where(position: position - 1).first
pre_stage.update_attributes(position: position)
@stage.update_attributes(position: position - 1)
normal_status("更新成功")
rescue Exception => e
uid_logger("stage up failed: #{e.message}")
raise ActiveRecord::Rollback
end
end
end
def down_position
ActiveRecord::Base.transaction do
begin
position = @stage.position
rails "最后一章不能向下移动" if @stage.position == @course.course_stages.count
next_stage = @course.course_stages.where(position: position + 1).first
next_stage.update_attributes(position: position)
@stage.update_attributes(position: position + 1)
normal_status("更新成功")
rescue Exception => e
uid_logger("stage up failed: #{e.message}")
raise ActiveRecord::Rollback
end
end
end
private
def find_course_stage
@stage = CourseStage.find_by!(id: params[:id])
@course = @stage.course
end
def stage_params
tip_exception("章节名称不能为空") if params[:name].blank?
params.permit(:name, :description)
end
end

@ -167,6 +167,8 @@ class CoursesController < ApplicationController
end end
Inform.create(container: @course, description: @subject.learning_notes, name: "学习须知") Inform.create(container: @course, description: @subject.learning_notes, name: "学习须知")
@course.create_stages @course.subject
end end
course_module_types = params[:course_module_types] course_module_types = params[:course_module_types]
@ -266,9 +268,9 @@ class CoursesController < ApplicationController
def online_learning def online_learning
@subject = @course.subject @subject = @course.subject
@stages = @subject&.stages @stages = @course.course_stages
@user = current_user @user = current_user
@start_learning = @user_course_identity == Course::STUDENT && @subject&.learning?(current_user.id) @start_learning = @user_course_identity == Course::STUDENT && @course.learning?(current_user.id)
end end
def search_course_list def search_course_list

@ -442,7 +442,6 @@ class SubjectsController < ApplicationController
# 用户进展和获取的标签 # 用户进展和获取的标签
def user_subject_progress challenge_ids def user_subject_progress challenge_ids
pass_games = Game.select(:id, :cost_time, :challenge_id).where(status: 2, user_id: current_user.id, challenge_id: challenge_ids) if current_user.logged? pass_games = Game.select(:id, :cost_time, :challenge_id).where(status: 2, user_id: current_user.id, challenge_id: challenge_ids) if current_user.logged?
@all_score = Challenge.where(id: challenge_ids).sum(:score)
# 如果没有通关的,没必要再继续统计了 # 如果没有通关的,没必要再继续统计了
if pass_games.blank? if pass_games.blank?
@ -451,6 +450,7 @@ class SubjectsController < ApplicationController
@time = 0 @time = 0
@user_tags = [] @user_tags = []
else else
@all_score = Challenge.where(id: challenge_ids).size
pass_challenge_ids = pass_games.map(&:challenge_id).uniq # 按道理是不用去重的,但是历史数据与重复 pass_challenge_ids = pass_games.map(&:challenge_id).uniq # 按道理是不用去重的,但是历史数据与重复
subject_challenge_count = @subject.shixuns.sum(:challenges_count) subject_challenge_count = @subject.shixuns.sum(:challenges_count)
# 用户通关获得的标签 # 用户通关获得的标签
@ -460,7 +460,7 @@ class SubjectsController < ApplicationController
subject_challenge_count == 0 ? 0 : subject_challenge_count == 0 ? 0 :
((pass_challenge_ids.size.to_f / subject_challenge_count).round(2) * 100).to_i ((pass_challenge_ids.size.to_f / subject_challenge_count).round(2) * 100).to_i
# 用户通关分数 # 用户通关分数
@my_score = Challenge.where(id: pass_challenge_ids).pluck(:score).sum @my_score = Challenge.where(id: pass_challenge_ids).size
@time = pass_games.map(&:cost_time).sum @time = pass_games.map(&:cost_time).sum
end end

@ -0,0 +1,2 @@
module CourseStagesHelper
end

@ -269,10 +269,10 @@ module CoursesHelper
group_info group_info
end end
def last_subject_shixun user_id, subject def last_subject_shixun user_id, course
myshixun = Myshixun.where(user_id: user_id, shixun_id: subject&.shixuns).order("updated_at desc").first myshixun = Myshixun.where(user_id: user_id, shixun_id: course.shixuns).order("updated_at desc").first
return "" unless myshixun return "" unless myshixun
stage_shixun = subject&.stage_shixuns.where(shixun_id: myshixun.shixun_id).take stage_shixun = course.course_stage_shixuns.where(shixun_id: myshixun.shixun_id).take
progress = stage_shixun&.stage&.position.to_s + "-" + stage_shixun&.position.to_s + " " + myshixun.shixun&.name progress = stage_shixun&.course_stage&.position.to_s + "-" + stage_shixun&.position.to_s + " " + myshixun.shixun&.name
end end
end end

@ -70,6 +70,11 @@ class Course < ApplicationRecord
has_many :course_acts, class_name: 'CourseActivity', as: :course_act, dependent: :destroy has_many :course_acts, class_name: 'CourseActivity', as: :course_act, dependent: :destroy
has_many :tidings, as: :container, dependent: :destroy has_many :tidings, as: :container, dependent: :destroy
# 开放课堂
has_many :course_stages, -> { order("course_stages.position ASC") }, dependent: :destroy
has_many :course_stage_shixuns, dependent: :destroy
has_many :shixuns, through: :course_stage_shixuns
# 老版的members弃用 现用course_members # 老版的members弃用 现用course_members
has_many :members has_many :members
@ -333,6 +338,28 @@ class Course < ApplicationRecord
teacher_power_courses teacher_power_courses
end end
def create_stages subject
if subject
subject.stages.each do |stage|
new_stage = CourseStage.create!(course_id: id, name: stage.name, description: stage.description, position: stage.position)
stage.stage_shixuns.each do |stage_shixun|
CourseStageShixun.create!(course_id: id, course_stage_id: new_stage.id, shixun_id: stage_shixun.shixun_id, position: stage_shixun.position)
end
end
end
end
def learning? user_id
Myshixun.where(user_id: user_id, shixun_id: shixuns).exists?
end
def my_subject_progress
my_challenge_count = Game.joins(:challenge).where(user_id: User.current.id, status: 2, challenges: {shixun_id: shixuns.published_closed}).
pluck(:challenge_id).uniq.size
course_challeng_count = course.shixuns.pluck(:challenges_count).sum
count = course_challeng_count == 0 ? 0 : ((my_challenge_count.to_f / course_challeng_count).round(2) * 100).to_i
end
private private
#创建课程后,给该用户发送消息 #创建课程后,给该用户发送消息

@ -0,0 +1,9 @@
class CourseStage < ApplicationRecord
belongs_to :course
has_many :course_stage_shixuns, -> { order("course_stage_shixuns.position ASC") }, dependent: :destroy
has_many :shixuns, :through => :course_stage_shixuns
validates :name, length: { maximum: 60 }
validates :description, length: { maximum: 300 }
end

@ -0,0 +1,5 @@
class CourseStageShixun < ApplicationRecord
belongs_to :course
belongs_to :course_stage, counter_cache: :shixuns_count
belongs_to :shixun
end

@ -38,7 +38,11 @@ class Users::ApplyProfessionalAuthService < ApplicationService
move_image_file! unless params[:upload_image].to_s == 'false' move_image_file! unless params[:upload_image].to_s == 'false'
sms_notify_admin # sms_cache = Rails.cache.read("apply_pro_certification")
# if sms_cache.nil?
# sms_notify_admin
Rails.cache.write("apply_pro_certification", 1)
# end
end end
end end

@ -0,0 +1,11 @@
json.stage_id @stage.id
json.stage_name @stage.name
json.stage_description @stage.description
json.delete_path "/course_stages/#{@stage.id}"
json.shixuns_list do
json.array! @stage.shixuns.each do |shixun|
json.shixun_identifier shixun.identifier
json.shixun_name shixun.name
json.shixun_id shixun.id
end
end

@ -2,10 +2,10 @@ json.stages @stages do |stage|
json.partial! 'stages/stage', locals: {stage: stage, user:@user, subject:@subject} json.partial! 'stages/stage', locals: {stage: stage, user:@user, subject:@subject}
end end
json.description @subject&.description # json.description @subject&.description
json.start_learning @start_learning json.start_learning @start_learning
json.learned @start_learning ? @subject&.my_subject_progress : 0 json.learned @start_learning ? @course.my_subject_progress : 0
json.last_shixun @start_learning ? last_subject_shixun(@user.id, @subject) : "" json.last_shixun @start_learning ? last_subject_shixun(@user.id, @subject) : ""

@ -373,6 +373,13 @@ Rails.application.routes.draw do
get 'search_slim' get 'search_slim'
end end
resources :course_stages, shallow: true do
member do
post :up_position
post :down_position
end
end
resources :polls, only:[:index,:new,:create] do resources :polls, only:[:index,:new,:create] do
collection do collection do
post :publish # 立即发布 post :publish # 立即发布

@ -0,0 +1,13 @@
class CreateCourseStages < ActiveRecord::Migration[5.2]
def change
create_table :course_stages do |t|
t.references :course, index: true
t.string :name
t.text :description
t.integer :position
t.integer :shixuns_count
t.timestamps
end
end
end

@ -0,0 +1,12 @@
class CreateCourseStageShixuns < ActiveRecord::Migration[5.2]
def change
create_table :course_stage_shixuns do |t|
t.references :course, index: true
t.references :course_stage, index: true
t.references :shixun, index: true
t.integer :position
t.timestamps
end
end
end

@ -0,0 +1,14 @@
class MigrateCourseStages < ActiveRecord::Migration[5.2]
def change
Course.where(excellent: 1).each do |course|
if course.subject
course.subject.stages.each do |stage|
new_stage = CourseStage.create!(course_id: course.id, name: stage.name, description: stage.description, position: stage.position)
stage.stage_shixuns.each do |stage_shixun|
CourseStageShixun.create!(course_id: course.id, course_stage_id: new_stage.id, shixun_id: stage_shixun.shixun_id, position: stage_shixun.position)
end
end
end
end
end
end

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe CourseStagesController, type: :controller do
end

@ -0,0 +1,15 @@
require 'rails_helper'
# Specs in this file have access to a helper object that includes
# the CourseStagesHelper. For example:
#
# describe CourseStagesHelper do
# describe "string concat" do
# it "concats two strings with spaces" do
# expect(helper.concat_strings("this","that")).to eq("this that")
# end
# end
# end
RSpec.describe CourseStagesHelper, type: :helper do
pending "add some examples to (or delete) #{__FILE__}"
end

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe CourseStageShixun, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe CourseStage, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end
Loading…
Cancel
Save