diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 4bfc236a1..0c643d15c 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -12,10 +12,10 @@ class CoursesController < ApplicationController end before_action :require_login, except: [:index, :show, :students, :teachers, :board_list, :mine, :all_course_groups, - :left_banner, :top_banner, :informs, :online_learning] + :left_banner, :top_banner, :informs, :online_learning, :course_groups] before_action :check_account, only: [:new, :create, :apply_to_join_course, :join_excellent_course] before_action :check_auth, except: [:index, :show, :students, :teachers, :board_list, :mine, :all_course_groups, - :left_banner, :top_banner, :apply_to_join_course, :exit_course] + :left_banner, :top_banner, :apply_to_join_course, :exit_course, :course_groups] before_action :set_course, only: [:show, :update, :destroy, :settings, :set_invite_code_halt, :set_public_or_private, :search_teacher_candidate, :teachers, :apply_teachers, :top_banner, :left_banner, :add_teacher_popup, :add_teacher, @@ -27,7 +27,8 @@ class CoursesController < ApplicationController :attahcment_category_list,:export_member_scores_excel, :duplicate_course, :switch_to_teacher, :switch_to_assistant, :switch_to_student, :exit_course, :informs, :update_informs, :online_learning, :update_task_position, :tasks_list, - :join_excellent_course, :export_couser_info, :export_member_act_score, :new_informs, :delete_informs] + :join_excellent_course, :export_couser_info, :export_member_act_score, :new_informs, + :delete_informs, :change_member_role, :course_groups, :join_course_group] before_action :user_course_identity, except: [:join_excellent_course, :index, :create, :new, :apply_to_join_course, :search_course_list, :get_historical_course_students, :mine, :search_slim, :board_list] before_action :teacher_allowed, only: [:update, :destroy, :settings, :search_teacher_candidate, @@ -39,7 +40,7 @@ class CoursesController < ApplicationController :set_course_group, :create_group_by_importing_file, :update_task_position, :tasks_list] before_action :teacher_or_admin_allowed, only: [:graduation_group_list, :create_graduation_group, :join_graduation_group, - :change_course_teacher, :course_group_list, + :change_course_teacher, :course_group_list, :change_member_role, :teacher_application_review, :apply_teachers, :delete_course_teacher] before_action :validate_course_name, only: [:create, :update] before_action :find_board, only: :board_list @@ -340,8 +341,8 @@ class CoursesController < ApplicationController @has_graduation_design = @course.course_modules.graduation_module_not_hidden.any? - sort = params[:sort] || "desc" - @order = params[:order].to_i + sort = params[:sort] || "asc" + @order = params[:order] ? params[:order].to_i : 1 if @order.present? case @order when 1 @@ -547,6 +548,61 @@ class CoursesController < ApplicationController end end + # 修改角色 + def change_member_role + tip_exception("请至少选择一个角色") if params[:roles].blank? + tip_exception("不能具有老师、助教两种角色") if params[:roles].include?("PROFESSOR") && params[:roles].include?("ASSISTANT_PROFESSOR") + tip_exception("管理员不能切换为助教或老师") if params[:user_id].to_i == @course.tea_id && + (params[:roles].include?("PROFESSOR") || params[:roles].include?("ASSISTANT_PROFESSOR")) + + course_members = @course.course_members.where(user_id: params[:user_id]) + tip_exception("非课堂成员不能修改角色") if course_members.blank? + + ActiveRecord::Base.transaction do + # 第一次修改为教师或助教身份时直接创建数据 + if params[:roles].include?("CREATOR") + teacher_member = course_members.where(role: %i[CREATOR]).take + elsif (params[:roles].include?("PROFESSOR") || params[:roles].include?("ASSISTANT_PROFESSOR")) && !course_members.exists?(role: %i[PROFESSOR ASSISTANT_PROFESSOR]) + teacher_member = CourseMember.create!(course_id: @course.id, user_id: params[:user_id], role: params[:roles].include?("PROFESSOR") ? 2 : 3) + elsif course_members.exists?(role: %i[PROFESSOR ASSISTANT_PROFESSOR]) + teacher_member = course_members.where(role: %i[PROFESSOR ASSISTANT_PROFESSOR]).take + if params[:roles].include?("PROFESSOR") || params[:roles].include?("ASSISTANT_PROFESSOR") + # 如果之前有老师身份且老师身份要调整时,只需要修改role字段 + if !params[:roles].include?(teacher_member.role) && params[:roles].include?("PROFESSOR") + teacher_member.PROFESSOR! + elsif !params[:roles].include?(teacher_member.role) && params[:roles].include?("ASSISTANT_PROFESSOR") + teacher_member.ASSISTANT_PROFESSOR! + end + teacher_member.save! + else + # 不含教师的参数时删除记录 + teacher_member.destroy! + # CourseDeleteStudentNotifyJob.perform_later(@course.id, [teacher_member.user_id], current_user.id) + end + end + + # 学生身份的处理 + student_member = course_members.where(role: %i[STUDENT]).take + if params[:roles].include?("STUDENT") && student_member.blank? + correspond_teacher_exist = CourseMember.exists?(user_id: params[:user_id], is_active: 1, course_id: @course.id, role: %i[CREATOR PROFESSOR ASSISTANT_PROFESSOR]) + new_student = CourseMember.new(user_id: params[:user_id], course_id: @course.id, role: 4) + new_student.is_active = 0 if correspond_teacher_exist + new_student.save! + + CourseAddStudentCreateWorksJob.perform_later(@course.id, [params[:user_id]]) + # StudentJoinCourseNotifyJob.perform_later(current_user.id, course.id) + elsif !params[:roles].include?("STUDENT") && student_member.present? + # 删除学生身份时激活老师身份 + teacher_member.update_attributes!(is_active: 1) if student_member.is_active && teacher_member.present? + student_member.destroy! + CourseDeleteStudentDeleteWorksJob.perform_later(@course.id, [params[:user_id]]) + # CourseDeleteStudentNotifyJob.perform_later(@course.id, [params[:user_id]], current_user.id) + end + + normal_status(0, "修改成功") + end + end + # 教师和助教角色转换的接口 def change_course_teacher begin @@ -715,8 +771,8 @@ class CoursesController < ApplicationController # 学生列表(包括各个子分班的学生列表)及搜索 def students search = params[:search].present? ? params[:search].strip : nil - order = params[:order].present? ? params[:order].to_i : 0 - sort = params[:sort].present? ? params[:sort] : "desc" + order = params[:order].present? ? params[:order].to_i : 1 + sort = params[:sort].present? ? params[:sort] : "asc" course_group_id = params[:course_group_id].present? ? params[:course_group_id].to_i : nil @students = CourseMember.students(@course) @@ -766,6 +822,26 @@ class CoursesController < ApplicationController end end + # 分班列表 + def course_groups + @course_groups = @course.course_groups + @course_groups = @course_groups.where("name like ?", "%#{params[:search]}%") unless params[:search].blank? + @all_group_count = @course_groups.size + @teachers = @course.teachers.includes(:user, :teacher_course_groups) if @user_course_identity < Course::NORMAL + @current_group_id = @course.students.where(user_id: current_user.id).take&.course_group_id if @user_course_identity == Course::STUDENT + end + + # 学生自动加入分班 + def join_course_group + tip_exception("学生才能加入分班") if @user_course_identity != Course::STUDENT + course_group = CourseGroup.find_by!(id: params[:course_group_id], course_id: @course.id) + member = CourseMember.find_by!(user_id: current_user.id, course_id: @course.id, role: 4) + if course_group && member + member.update_attributes!(course_group_id: course_group.id) + normal_status(0, "加入成功") + end + end + # 将学生批量移动到某个分班 def transfer_to_course_group ActiveRecord::Base.transaction do diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index bc0da8ffc..f9d9531f1 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -978,7 +978,8 @@ class ExercisesController < ApplicationController :status => nil, :commit_status => 0, :objective_score => 0.0, - :subjective_score => -1.0 + :subjective_score => -1.0, + :commit_method => 0 } redo_exercise_users = @exercise_users.exercise_commit_users(user_ids) redo_exercise_users.update_all(redo_option) @@ -1102,10 +1103,10 @@ class ExercisesController < ApplicationController ActiveRecord::Base.transaction do begin can_commit_exercise = false - Rails.logger.info("######____________params[:commit_method]_________################{params[:commit_method]}") - if (@user_course_identity > Course::ASSISTANT_PROFESSOR) && params[:commit_method].present? #为学生时 + if @user_course_identity > Course::ASSISTANT_PROFESSOR #为学生时 if params[:commit_method].to_i == 2 #自动提交时 user_left_time = get_exercise_left_time(@exercise,current_user) + Rails.logger.info("######__________auto_commit_user_left_time_________################{user_left_time}") if user_left_time.to_i <= 0 can_commit_exercise = true end @@ -1130,10 +1131,10 @@ class ExercisesController < ApplicationController CommitExercsieNotifyJobJob.perform_later(@exercise.id, current_user.id) normal_status(0,"试卷提交成功!") else - normal_status(-1,"提交失败,请重试!") + normal_status(-1,"提交失败,未到截止时间!") end else - normal_status(-1,"提交失败,请重试!") + normal_status(-1,"提交失败,当前用户不为课堂学生!") end rescue Exception => e uid_logger_error(e.message) diff --git a/app/controllers/question_banks_controller.rb b/app/controllers/question_banks_controller.rb index 60b9a807c..7781b5792 100644 --- a/app/controllers/question_banks_controller.rb +++ b/app/controllers/question_banks_controller.rb @@ -90,23 +90,25 @@ class QuestionBanksController < ApplicationController def send_to_course banks = @object_type.classify.constantize.where(id: params[:object_id]) course = current_user.manage_courses.find_by!(id: params[:course_id]) + task_ids = [] banks.each do |bank| case @object_type when 'HomeworkBank' # 作业 - quote_homework_bank bank, course + task = quote_homework_bank bank, course when 'ExerciseBank' if bank.container_type == 'Exercise' # 试卷 - quote_exercise_bank bank, course + task = quote_exercise_bank bank, course else # 问卷 - quote_poll_bank bank, course + task = quote_poll_bank bank, course end when 'GtaskBank' - quote_gtask_bank bank, course + task = quote_gtask_bank bank, course when 'GtopicBank' - quote_gtopic_bank bank, course + task = quote_gtopic_bank bank, course end + task_ids << task.id if task end - normal_status("发送成功") + render :json => {task_ids: task_ids, status: 0, message: "发送成功"} end def destroy diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index d670614d5..fb7bd1a88 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -1,6 +1,18 @@ module CoursesHelper - # 是否有切换为学生的入口 + def member_manager group, teachers + str = "" + members = teachers.select{|teacher| teacher.teacher_course_groups.pluck(:course_group_id).include?(group.id) || teacher.teacher_course_groups.size == 0} + str = members.uniq.size == teachers.size ? "全部教师" : members.map{|member| member.user.real_name}.join("、") + str + # teachers.each do |member| + # if member.teacher_course_groups.exists?(course_group_id: group.id) || member.teacher_course_groups.size == 0 + # str << member.user.real_name + # end + # end + end + + # 是否有切换为学生的入口 def switch_student_role is_teacher, course, user is_teacher && course.course_members.where(user_id: user.id, role: %i(STUDENT)).exists? end diff --git a/app/libs/util.rb b/app/libs/util.rb index ae2e4b80b..72e728ab9 100644 --- a/app/libs/util.rb +++ b/app/libs/util.rb @@ -48,8 +48,8 @@ module Util return if str.blank? case type - when :phone then "#{str[0..2]}***#{str[-4..-1]}" - when :email then "#{str[0..2]}***#{str[str.rindex('@')..-1]}" + when :phone then "#{str[0..2]}***#{str[-3..-1]}" + when :email then "#{str[0]}***#{str[(str.rindex('@')-1)..-1]}" else "#{str[0..2]}***#{str[-3..-1]}" end end diff --git a/app/models/user.rb b/app/models/user.rb index 5fdb1a713..7bfe9c36f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -242,6 +242,11 @@ class User < ApplicationRecord user_extension&.department&.name || '' end + # 课堂的所有身份 + def course_role course + course.course_members.where(user_id: id).pluck(:role) + end + # 课堂的老师(创建者、老师、助教) def teacher_of_course?(course) course.course_members.exists?(user_id: id, role: [1,2,3], is_active: 1) || admin? || business? @@ -583,6 +588,16 @@ class User < ApplicationRecord mail.present? end + # 手机号:123***123 + def hidden_phone + Util.conceal(phone, :phone).to_s + end + + # 邮箱:w***l@qq.com + def hidden_mail + Util.conceal(mail, :email).to_s + end + # 学院的url标识 def college_identifier Department.find_by_id(department_members.pluck(:department_id).first)&.identifier diff --git a/app/views/courses/course_groups.json.jbuilder b/app/views/courses/course_groups.json.jbuilder new file mode 100644 index 000000000..48a5922a6 --- /dev/null +++ b/app/views/courses/course_groups.json.jbuilder @@ -0,0 +1,11 @@ +json.course_groups @course_groups.each do |group| + json.(group, :id, :course_members_count, :name) + json.invite_code group.invite_code if @user_course_identity < Course::STUDENT + json.member_manager member_manager(group, @teachers) if @user_course_identity < Course::NORMAL +end + +if @user_course_identity == Course::STUDENT + json.current_group_id @current_group_id +end +json.none_group_member_count @course.none_group_count +json.group_count @all_group_count \ No newline at end of file diff --git a/app/views/courses/students.json.jbuilder b/app/views/courses/students.json.jbuilder index a7585672f..0b5d7fe71 100644 --- a/app/views/courses/students.json.jbuilder +++ b/app/views/courses/students.json.jbuilder @@ -1,12 +1,17 @@ json.students do json.array! @students do |student| json.user_id student.user_id - json.login student.user.try(:login) + # json.login student.user.try(:login) json.name student.user.try(:real_name) json.name_link user_path(student.user) json.student_id student.user.try(:student_id) json.course_group_name student.course_group.try(:name) json.course_member_id student.id + if @user_course_identity < Course::ASSISTANT_PROFESSOR && !params[:course_group_id].present? + json.member_roles student.user.course_role(@course) + end + json.user_phone student.user.hidden_phone + json.user_mail student.user.hidden_mail end end json.students_count @students_count diff --git a/app/views/courses/teachers.json.jbuilder b/app/views/courses/teachers.json.jbuilder index 040ffb2aa..19a92790d 100644 --- a/app/views/courses/teachers.json.jbuilder +++ b/app/views/courses/teachers.json.jbuilder @@ -16,6 +16,9 @@ json.teacher_list do end json.graduation_group teacher.graduation_group.try(:name) json.graduation_group_id teacher.graduation_group.try(:id) + if @user_course_identity < Course::ASSISTANT_PROFESSOR + json.member_roles teacher.user.course_role(@course) + end end end json.teacher_list_size @teacher_list_size diff --git a/app/views/users/accounts/show.json.jbuilder b/app/views/users/accounts/show.json.jbuilder index 6b28bda55..ec81cc6bf 100644 --- a/app/views/users/accounts/show.json.jbuilder +++ b/app/views/users/accounts/show.json.jbuilder @@ -1,5 +1,7 @@ -json.extract! observed_user, :id, :nickname, :phone, :mail, :show_realname +json.extract! observed_user, :id, :nickname, :show_realname +json.phone observed_user.hidden_phone +json.mail observed_user.hidden_mail json.avatar_url url_to_avatar(observed_user) user = ActiveDecorator::Decorator.instance.decorate(observed_user) json.name user.name diff --git a/config/routes.rb b/config/routes.rb index b94d1ca9a..50b61c463 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -331,6 +331,7 @@ Rails.application.routes.draw do post 'join_graduation_group' post 'set_course_group' post 'change_course_admin' + post 'change_member_role' post 'change_course_teacher' post 'delete_course_teacher' post 'teacher_application_review' @@ -369,6 +370,8 @@ Rails.application.routes.draw do post 'join_excellent_course' get 'tasks_list' post 'update_task_position' + get 'course_groups' + post 'join_course_group' end collection do diff --git a/public/react/src/modules/courses/members/ChangeRolePop.js b/public/react/src/modules/courses/members/ChangeRolePop.js index 44dfc28fc..7f55910bf 100644 --- a/public/react/src/modules/courses/members/ChangeRolePop.js +++ b/public/react/src/modules/courses/members/ChangeRolePop.js @@ -6,7 +6,7 @@ import axios from 'axios' /** 角色数组, CREATOR: 创建者, PROFESSOR: 教师, ASSISTANT_PROFESSOR: 助教, STUDENT: 学生 */ -function ChangeRolePop({ member_roles = [], record, courseId, onChangeRoleSuccess, showNotification }) { +function ChangeRolePop({ member_roles = [], record, courseId, onChangeRoleSuccess, showNotification, getUserId, fetchUser }) { const [checkBoxRoles, setCheckBoxRoles] = useState(member_roles) useEffect(() => { setCheckBoxRoles(member_roles) @@ -41,7 +41,14 @@ function ChangeRolePop({ member_roles = [], record, courseId, onChangeRoleSucces user_id: record.user_id }) if (response.data.status == 0) { + showNotification('保存成功') onChangeRoleSuccess() + + if (fetchUser && record.user_id == getUserId) { + fetchUser() + trigger('updatabanner') + } + } console.log(response) } diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index e3859345a..626a76baf 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -155,6 +155,8 @@ const buildColumns = (that,isParent) => { member_roles={record.member_roles} onChangeRoleSuccess={that.onChangeRoleSuccess} showNotification={that.props.showNotification} + getUserId={that.props.isUserid} + fetchUser={that.props.fetchUser} > ) diff --git a/public/react/src/modules/courses/members/teacherList.js b/public/react/src/modules/courses/members/teacherList.js index 72b667300..74271ea5a 100644 --- a/public/react/src/modules/courses/members/teacherList.js +++ b/public/react/src/modules/courses/members/teacherList.js @@ -165,6 +165,9 @@ function buildColumns(that) { member_roles={record.member_roles} onChangeRoleSuccess={that.onChangeRoleSuccess} showNotification={that.props.showNotification} + getUserId={that.props.isUserid} + fetchUser={that.props.fetchUser} + > {/*