diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 102469043..c4f32c438 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1627,8 +1627,9 @@ class ExercisesController < ApplicationController ex_and_user = user_groups_id & ex_group_settings #用户已设置的分班 unpublish_group = unpublish_group + ex_and_user - ex_ended_groups #已发布的全部班级减去截止的全部班级 else + ex_ended_groups = ex_all_group_settings.exercise_group_ended.pluck(:course_group_id).uniq ex_and_user = user_groups_id & ex_group_settings #用户已设置的分班 - unpublish_group = unpublish_group + ex_and_user + unpublish_group = unpublish_group + ex_and_user - ex_ended_groups end end end diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 0e67d9fa0..153598990 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -20,7 +20,12 @@ class MessagesController < ApplicationController sort = params[:sort].to_i == 1 ? 'asc' : 'desc' sort_type = params[:sort_type] || 'time' - messages = @board.messages.root_nodes.by_keywords(params[:search]) + if @board.parent_id == 0 + messages = Message.where(board_id: @board.course.boards.pluck(:id)) + else + messages = @board.messages + end + messages = messages.root_nodes.by_keywords(params[:search]) messages = messages.reorder('(sticky = 1) DESC') # 置顶 diff --git a/app/controllers/weapps/course_stickies_controller.rb b/app/controllers/weapps/course_stickies_controller.rb index d045cb40f..82048add9 100644 --- a/app/controllers/weapps/course_stickies_controller.rb +++ b/app/controllers/weapps/course_stickies_controller.rb @@ -1,17 +1,18 @@ class Weapps::CourseStickiesController < Weapps::BaseController - before_action :require_wechat_login! - before_action :teacher_allowed + # before_action :require_wechat_login! def create - manage_course = current_user.manage_courses.order("sticky=1 desc, sticky_time desc, created_at desc").first - return render_error("该课堂已置顶,请勿重复操作") if current_course.sticky && manage_course&.id.to_i == current_course.id - current_course.update!(sticky: 1, sticky_time: Time.now) + courses = params[:category] == "study" ? current_user.as_student_courses.started : current_user.manage_courses + courses = courses.order("course_members.sticky=1 desc, course_members.sticky_time desc, courses.created_at desc").first + + return render_error("该课堂已置顶,请勿重复操作") if course_member.sticky && courses&.id.to_i == current_course.id + course_member.update!(sticky: 1, sticky_time: Time.now) render_ok end def cancel_sticky - return render_error("该课堂未置顶,无法取消") unless current_course.sticky - current_course.update!(sticky: 1, sticky_time: Time.now) + return render_error("该课堂未置顶,无法取消") unless course_member.sticky + course_member.update!(sticky: 0, sticky_time: nil) render_ok end @@ -21,7 +22,8 @@ class Weapps::CourseStickiesController < Weapps::BaseController @_current_course = Course.find params[:course_id] end - def teacher_allowed - render_forbidden if current_user.course_identity(current_course) > Course::ASSISTANT_PROFESSOR + def course_member + @_course_member = params[:category] == "study" ? current_course.students.find_by!(user_id: current_user.id) : + current_course.teachers.find_by!(user_id: current_user.id) end end \ No newline at end of file diff --git a/app/controllers/weapps/courses_controller.rb b/app/controllers/weapps/courses_controller.rb index 41e00f63e..38f1b99f9 100644 --- a/app/controllers/weapps/courses_controller.rb +++ b/app/controllers/weapps/courses_controller.rb @@ -1,8 +1,37 @@ class Weapps::CoursesController < Weapps::BaseController - before_action :require_wechat_login! + # before_action :require_wechat_login! + before_action :teacher_allowed, except: [:create] def create return render_error("只有老师身份才能创建课堂") unless current_user.is_teacher? + course = Course.new(tea_id: current_user.id) + Weapps::CreateCourseService.call(course, course_params) + render_ok + rescue ApplicationService::Error => ex + render_error(ex.message) + end + + def edit + @course = current_course + end + + def update + Weapps::UpdateCourseService.call(current_course, course_params) + render_ok + end + + private + + def course_params + params.permit(:name, :course_list_name, :credit, course_module_types: []) + end + + def current_course + @_current_course = Course.find params[:id] + end + + def teacher_allowed + return render_forbidden unless current_user.course_identity(current_course) < Course::STUDENT end end \ No newline at end of file diff --git a/app/controllers/weapps/homes_controller.rb b/app/controllers/weapps/homes_controller.rb index 987518677..a99bb15c2 100644 --- a/app/controllers/weapps/homes_controller.rb +++ b/app/controllers/weapps/homes_controller.rb @@ -8,8 +8,8 @@ class Weapps::HomesController < Weapps::BaseController @advert = WeappSettings::Advert.only_online.first # 我的课堂 - category = params[:category] && ["manage", "study"].include?(params[:category]) ? params[:category] : (current_user.is_teacher? ? "manage" : "study") - @courses = case category + @category = params[:category] && ["manage", "study"].include?(params[:category]) ? params[:category] : (current_user.is_teacher? ? "manage" : "study") + @courses = case @category when 'study' then current_user.as_student_courses.started when 'manage' then @@ -17,7 +17,8 @@ class Weapps::HomesController < Weapps::BaseController end @courses = @courses.not_deleted.not_excellent @course_count = @courses.count - order_str = category == "study" ? "created_at desc" : "sticky=1 desc, sticky_time desc, created_at desc" + order_str = "course_members.sticky=1 desc, course_members.sticky_time desc, courses.created_at desc" @courses = paginate(@courses.order(order_str).includes(:teacher, :school)) + @user = current_user end end \ No newline at end of file diff --git a/app/forms/weapps/create_course_form.rb b/app/forms/weapps/create_course_form.rb new file mode 100644 index 000000000..9244096ab --- /dev/null +++ b/app/forms/weapps/create_course_form.rb @@ -0,0 +1,20 @@ +class Weapps::CreateCourseForm + include ActiveModel::Model + + attr_accessor :course + attr_accessor :name, :course_list_name, :credit, :course_module_types + + validates :name, presence: true + validates :course_list_name, presence: true + + validate :course_name_prefix + validate :check_course_modules + + def course_name_prefix + raise '课堂名称应以课程名称开头' unless name.index(course_list_name) && name.index(course_list_name) == 0 + end + + def check_course_modules + raise '请至少添加一个课堂模块' if course_module_types.blank? + end +end \ No newline at end of file diff --git a/app/forms/weapps/update_course_form.rb b/app/forms/weapps/update_course_form.rb new file mode 100644 index 000000000..6fb1d81d9 --- /dev/null +++ b/app/forms/weapps/update_course_form.rb @@ -0,0 +1,15 @@ +class Weapps::UpdateCourseForm + include ActiveModel::Model + + attr_accessor :course + attr_accessor :name, :course_list_name, :credit + + validates :name, presence: true + validates :course_list_name, presence: true + + validate :course_name_prefix + + def course_name_prefix + raise '课堂名称应以课程名称开头' unless name.index(course_list_name) && name.index(course_list_name) == 0 + end +end \ No newline at end of file diff --git a/app/services/weapps/create_course_service.rb b/app/services/weapps/create_course_service.rb new file mode 100644 index 000000000..196533bb6 --- /dev/null +++ b/app/services/weapps/create_course_service.rb @@ -0,0 +1,37 @@ +class Weapps::CreateCourseService < ApplicationService + attr_reader :course, :params + + def initialize(course, params) + @course = course + @params = params + end + + def call + Weapps::CreateCourseForm.new(form_params).validate! + + ActiveRecord::Base.transaction do + course.name = params[:name].to_s.strip + course.school_id = course.teacher&.school_id + course.is_public = 0 + course.credit = params[:credit].blank? ? nil : params[:credit] + course_list = CourseList.find_by(name: params[:course_list_name].to_s.strip) + if course_list + course.course_list_id = course_list.id + else + new_course_list = CourseList.create!(name: params[:course_list_name].to_s.strip, user_id: course.tea_id, is_admin: 0) + course.course_list_id = new_course_list.id + end + course.save! + + course.generate_invite_code + CourseMember.create!(course_id: course.id, user_id: course.tea_id, role: 1) + course.create_course_modules(params[:course_module_types]) + end + end + + private + + def form_params + params.merge(course: course) + end +end \ No newline at end of file diff --git a/app/services/weapps/update_course_service.rb b/app/services/weapps/update_course_service.rb new file mode 100644 index 000000000..4f2fa4676 --- /dev/null +++ b/app/services/weapps/update_course_service.rb @@ -0,0 +1,31 @@ +class Weapps::UpdateCourseService < ApplicationService + attr_reader :course, :params + + def initialize(course, params) + @course = course + @params = params + end + + def call + Weapps::UpdateCourseForm.new(form_params).validate! + + ActiveRecord::Base.transaction do + course.name = params[:name].to_s.strip + course.credit = params[:credit].blank? ? nil : params[:credit] + course_list = CourseList.find_by(name: params[:course_list_name].to_s.strip) + if course_list + course.course_list_id = course_list.id + else + new_course_list = CourseList.create!(name: params[:course_list_name].to_s.strip, user_id: course.tea_id, is_admin: 0) + course.course_list_id = new_course_list.id + end + course.save! + end + end + + private + + def form_params + params.merge(course: course) + end +end \ No newline at end of file diff --git a/app/views/messages/index.json.jbuilder b/app/views/messages/index.json.jbuilder index ae54a1172..4d191cc9d 100644 --- a/app/views/messages/index.json.jbuilder +++ b/app/views/messages/index.json.jbuilder @@ -8,7 +8,7 @@ json.data do json.array! @messages do |message| json.extract! message, :id, :parent_id, :subject, :created_on, :total_replies_count, :praises_count, :visits, :sticky, :is_hidden, :is_public, :board_id - json.category_name message.board&.name + json.category_name message.board&.name if @board.parent_id == 0 && message.board_id != @board.id json.total_praises_count @praises_count_map.fetch(message.id, 0) diff --git a/app/views/weapps/courses/edit.json.jbuilder b/app/views/weapps/courses/edit.json.jbuilder new file mode 100644 index 000000000..ef7a28a42 --- /dev/null +++ b/app/views/weapps/courses/edit.json.jbuilder @@ -0,0 +1,2 @@ +json.(@course, :id, :name, :credit) +json.course_list_name @course.course_list&.name \ No newline at end of file diff --git a/app/views/weapps/homes/show.json.jbuilder b/app/views/weapps/homes/show.json.jbuilder index c7f50212d..089c70dbb 100644 --- a/app/views/weapps/homes/show.json.jbuilder +++ b/app/views/weapps/homes/show.json.jbuilder @@ -18,8 +18,11 @@ end json.course_count @course_count json.courses @courses.each do |course| - json.(course, :id, :name, :visits, :course_members_count, :sticky, :sticky_time) + json.(course, :id, :name, :visits, :course_members_count) json.creator course.teacher.real_name + json.avatar_url url_to_avatar(course.teacher) json.school course.school&.name + course_member = @category == "study" ? course.students.where(user_id: @user.id).first : course.teachers.where(user_id: @user.id).first + json.sticky course_member.sticky end diff --git a/config/routes.rb b/config/routes.rb index 930349d9b..6b9c83bc8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -879,6 +879,8 @@ Rails.application.routes.draw do resources :course_stickies, only: [:create] do post :cancel_sticky, on: :collection end + + resources :courses, only: [:create, :update, :edit] end resources :users_for_partners, only: [:index] diff --git a/public/react/src/modules/courses/boards/BoardsListItem.js b/public/react/src/modules/courses/boards/BoardsListItem.js index 2b9c05126..0df7675a3 100644 --- a/public/react/src/modules/courses/boards/BoardsListItem.js +++ b/public/react/src/modules/courses/boards/BoardsListItem.js @@ -1,7 +1,8 @@ import React,{ Component } from "react"; import {Tooltip} from 'antd' import moment from 'moment' -import { getUrl, WordsBtn } from 'educoder' +import { getUrl, WordsBtn, ConditionToolTip } from 'educoder' +import './boardsListItem.css'; class BoardsListItem extends Component{ constructor(props){ super(props); @@ -75,6 +76,16 @@ class BoardsListItem extends Component{ ) : "" } + +
@@ -88,20 +99,20 @@ class BoardsListItem extends Component{ {moment(discussMessage.created_on).fromNow()}
-
- {item.title}
-
- {item.author_name} - {item.author_school_name} - - { - item.visited_count && item.visited_count != 0 ? - {item.visited_count} 浏览:"" - } - { - item.praise_count && item.praise_count != 0 ? - {item.praise_count} 赞:"" - } - { - item.download_count && item.download_count != 0 ? - {item.download_count} 下载:"" - } - -
-
+ {item.title}
+
+ {item.author_name} + {item.author_school_name} + + { + item.visited_count && item.visited_count != 0 ? + {item.visited_count} 浏览:"" + } + { + item.praise_count && item.praise_count != 0 ? + {item.praise_count} 赞:"" + } + { + item.download_count && item.download_count != 0 ? + {item.download_count} 下载:"" + } + +
++ {hackathonedit===true?"":
{data&&data.hackathon.description===null?"":
} } - {opentitletype===true?