Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun

dev_home
杨树林 5 years ago
commit ba3a0918a4

@ -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

@ -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') # 置顶

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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)

@ -0,0 +1,2 @@
json.(@course, :id, :name, :credit)
json.course_list_name @course.course_list&.name

@ -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

@ -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]

@ -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);
@ -76,6 +77,16 @@ class BoardsListItem extends Component{
}
</h6>
<div className="fr">
{(isAdmin || discussMessage.author.login == current_user.login) &&
<WordsBtn style="blue" className="fl font-16 ml28"
onClick={(e) => { this.props.toEditPage(this.props.match.params.coursesId, this.props.match.params.boardId, discussMessage.id )} }>编辑</WordsBtn> }
{ isAdmin && <WordsBtn style="blue" className="fl font-16 ml28"
onClick={(e) => { debugger; onSticky(discussMessage); e.cancelBubble = true; e.stopPropagation();}}>
{ discussMessage.sticky ? '取消置顶' : '置顶' }</WordsBtn> }
</div>
<div className="cl"></div>
<p className="color-grey panel-lightgrey mt18 fl">
<span className="mr50">
@ -88,19 +99,19 @@ class BoardsListItem extends Component{
<span className="mr15 color-light-grey-C font-14">{moment(discussMessage.created_on).fromNow()} </span>
</span>
</p>
<div className="fr mt15">
{(isAdmin || discussMessage.author.login == current_user.login) &&
<WordsBtn style="blue" className="fl font-16 ml28"
onClick={(e) => { this.props.toEditPage(this.props.match.params.coursesId, this.props.match.params.boardId, discussMessage.id )} }>编辑</WordsBtn> }
{ isAdmin && <WordsBtn style="blue" className="fl font-16 ml28"
onClick={(e) => { debugger; onSticky(discussMessage); e.cancelBubble = true; e.stopPropagation();}}>
{ discussMessage.sticky ? '取消置顶' : '置顶' }</WordsBtn> }
{
discussMessage.category_name &&
<div className={'directory_style'}>
<ConditionToolTip title={discussMessage.category_name} condition={discussMessage.category_name}>
{ <div className=" color-grey9 task-hide fr"
style={{"maxWidth":"216px"}}
title={discussMessage.category_name}>
所属目录{discussMessage.category_name}
</div>
}
</ConditionToolTip>
</div>
}
{/* { (isAdmin || discussMessage.author.login == current_user.login) &&
<div className="homepagePostSetting" style={{"right":"4px","top":"5px","display":"block"}}>

@ -0,0 +1,9 @@
.directory_style {
position: absolute;
right: 0;
bottom: 0;
maxSize: 20px;
overflow: hidden;
whiteSpace: nowrap;
textOverflow: ellipsis
}

@ -386,8 +386,8 @@ class Boards extends Component{
{
boards && boards.filter((item)=> {
return item.id != bid && (!this.state.dirSearchValue || item.name.indexOf(this.state.dirSearchValue) != -1)
}).map( (item) => {
return <li onClick={() => this.moveTo(item)} title={item.name}>{item.name}</li>
}).map( (item, index) => {
return <li key={`i_${index}`} onClick={() => this.moveTo(item)} title={item.name}>{item.name}</li>
})
}
{ isAdmin && !isCourseEnd &&
@ -427,7 +427,7 @@ class Boards extends Component{
<Checkbox.Group style={{ width: '100%' }} onChange={this.onCheckBoxChange} value={checkBoxValues}>
{ messages.map((item, index) => {
return (
<div className="mt20 edu-back-white padding02010">
<div className="mt20 edu-back-white padding02010" key={`d_${index}`}>
<BoardsListItem
{...this.props}
discussMessage={item}

@ -19,11 +19,12 @@ class CaseItem extends Component{
{
libraries && libraries.map((item,key)=>{
return(
<li className="library_list_item">
<a href={`/moop_cases/${item.id}`} target="_blank">
<li className="library_list_item pointer">
<img alt={item.id} className="mr15 mt3 radius4" height="90" src={getUrl(`${item.cover_url || "/images/educoder/library-default-cover.png"}`)} width="120" />
<div className="flex1">
<p className="clearfix mb25 lineh-40">
<a href={`/moop_cases/${item.id}`} className="task-hide font-22 library_l_name">{item.title}</a>
<a className="task-hide font-22 library_l_name">{item.title}</a>
<span className="fl mt10"><Tags tags={item.tags}></Tags></span>
</p>
<p className="clearfix lineh-20">
@ -46,6 +47,7 @@ class CaseItem extends Component{
</p>
</div>
</li>
</a>
)
})
}

@ -20,7 +20,8 @@ class Osshackathon extends Component {
hackathonedit:false,
Osshackathonmodeltype:false,
spinning:false,
opentitletype:true
opentitletype:true,
boxoffsetHeigh:0
}
}
@ -54,6 +55,7 @@ class Osshackathon extends Component {
spinning:true
})
})
}
@ -67,9 +69,16 @@ class Osshackathon extends Component {
}
componentDidUpdate = (prevProps) => {
componentDidUpdate = (prevProps,prevState) => {
if(prevState.data!=this.state.data){
//防止陷入无限循环
let box=document.getElementById("Osshackathonfontlists");
if(box){
this.setState({
boxoffsetHeigh:box.offsetHeight
})
}
}
}
PaginationTask=(pageNumber)=>{
@ -228,7 +237,6 @@ class Osshackathon extends Component {
render() {
let {page,data,hackathonedit,opentitletype}=this.state;
return (
<div className="newMain clearfix newMainybot">
<style>
@ -299,18 +307,18 @@ class Osshackathon extends Component {
{
`
.Osshackathonfontlist{
height: 180px;
max-height: 180px;
overflow: hidden;
}
`
}
</style>:""}
{hackathonedit===true?"":<p className={"Osshackathonfontlist mb30"}>
{hackathonedit===true?"":<p className={"Osshackathonfontlist mb30"} id={"Osshackathonfontlists"}>
{data&&data.hackathon.description===null?"":<div className={"markdown-body"}
dangerouslySetInnerHTML={{__html: markdownToHTML(data&&data.hackathon.description).replace(/▁/g, "▁▁▁")}}></div>}
</p>}
{opentitletype===true?<Divider dashed={true} onClick={()=>this.opentitle()} className={"pointer Breadcrumbfont"}>展开阅读全文<Icon type="down" /></Divider>:""}
{opentitletype===true&&this.state.boxoffsetHeigh===180?<Divider dashed={true} onClick={()=>this.opentitle()} className={"pointer Breadcrumbfont"}>展开阅读全文<Icon type="down" /></Divider>:""}
{hackathonedit===true?<Osshackathonmd
getosshackathon={()=>this.getosshackathonlist()}

Loading…
Cancel
Save