diff --git a/app/controllers/course_videos_controller.rb b/app/controllers/course_videos_controller.rb
new file mode 100644
index 000000000..0d5a3e460
--- /dev/null
+++ b/app/controllers/course_videos_controller.rb
@@ -0,0 +1,34 @@
+class CourseVideosController < ApplicationController
+ before_action :require_login
+ before_action :validate_params
+ before_action :find_course, only: [:create]
+ before_action :find_video, only: [:update]
+ before_action :teacher_allowed
+
+ def create
+ title = params[:name].strip
+ link = params[:link].strip
+ @course.course_videos.create!(title: title, link: link, is_link: 1, user_id: current_user.id)
+ render_ok
+ end
+
+ def update
+ title = params[:name].strip
+ link = params[:link].strip
+ @video.update!(title: title, link: link)
+ render_ok
+ end
+
+ private
+
+ def validate_params
+ tip_exception("视频名称不能为空") if params[:name].blank?
+ tip_exception("链接地址不能为空") if params[:link].blank?
+ end
+
+ def find_video
+ @video = CourseVideo.find params[:id]
+ @course = @video.course
+ end
+
+end
\ No newline at end of file
diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb
index 0a59c379a..2e94e435d 100644
--- a/app/controllers/courses_controller.rb
+++ b/app/controllers/courses_controller.rb
@@ -102,25 +102,32 @@ class CoursesController < ApplicationController
end
def course_videos
- videos = @course.videos
+ videos = @course.course_videos
@video_module = @course.course_modules.find_by(module_type: "video")
if params[:category_id].present? && params[:category_id].to_i != 0
@category = @video_module&.course_second_categories.find_by(id: params[:category_id])
tip_exception("子目录id有误") if !@category.present?
- videos = videos.where(course_videos: {course_second_category_id: params[:category_id].to_i})
+ videos = videos.where(course_second_category_id: params[:category_id].to_i)
end
videos = custom_sort(videos, params[:sort_by], params[:sort_direction])
@count = videos.count
- @videos = paginate videos.includes(user: :user_extension)
+ @videos = paginate videos.includes(video: [user: :user_extension], user: :user_extension)
end
def delete_course_video
- video = Video.find_by(id: params[:video_id])
- tip_exception(404, "找不到资源") if video.blank?
- tip_exception(403, "...") unless (video.user_id == current_user.id || current_user.admin_or_business?)
- video.destroy!
- AliyunVod::Service.delete_video([video.uuid]) rescue nil
+ if params[:is_link]
+ video = @course.course_videos.find_by!(id: params[:video_id])
+ tip_exception(403, "...") unless (video.user_id == current_user.id || current_user.admin_or_business?)
+ video.destroy!
+ else
+ video = Video.find_by(id: params[:video_id])
+ tip_exception(404, "找不到资源") if video.blank?
+ tip_exception(403, "...") unless (video.user_id == current_user.id || current_user.admin_or_business?)
+ video.destroy!
+ AliyunVod::Service.delete_video([video.uuid]) rescue nil
+ end
+
render_ok
end
@@ -130,7 +137,7 @@ class CoursesController < ApplicationController
category = @course.course_second_categories.find_by(id: params[:new_category_id])
if params[:new_category_id].to_i == 0 || category.present?
- videos = @course.course_videos.where(video_id: params[:video_ids])
+ videos = @course.course_videos.where(video_id: params[:video_ids]).or(@course.course_videos.where(id: params[:video_ids]))
videos.update_all(course_second_category_id: params[:new_category_id])
normal_status(0, "操作成功")
diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb
index 25e0de44a..c1fa48be8 100644
--- a/app/controllers/files_controller.rb
+++ b/app/controllers/files_controller.rb
@@ -7,7 +7,7 @@ class FilesController < ApplicationController
before_action :file_validate_sort_type, only: :index
before_action :validate_send_message_to_course_params, only: :bulk_send
before_action :set_pagination, only: %i[index public_with_course_and_project mine_with_course_and_project]
- before_action :validate_upload_params, only: %i[upload import]
+ before_action :validate_upload_params, only: %i[import]
before_action :find_file, only: %i[show setting update]
before_action :publish_params, only: %i[upload import update]
@@ -163,6 +163,7 @@ class FilesController < ApplicationController
# 上传资源
def upload
+ find_course_second_category_id
attachment_ids = params[:attachment_ids]
course_second_category_id = params[:course_second_category_id] || 0 # 0: 为主目录, 其他为次目录id
# is_unified_setting = params.has_key?(:is_unified_setting) ? params[:is_unified_setting] : true
@@ -170,25 +171,48 @@ class FilesController < ApplicationController
# course_group_publish_times = params[:course_group_publish_times] || []
begin
- attachment_ids.each do |attchment_id|
- attachment = Attachment.find_by_id attchment_id
- unless attachment.nil?
- attachment.container = @course
- attachment.course_second_category_id = course_second_category_id
- attachment.description = params[:description]
- attachment.is_public = params[:is_public] && @course.is_public == 1 ? 1 : 0
- attachment.is_publish = @atta_is_publish
- attachment.delay_publish = @atta_delay_publish
- attachment.publish_time = @atta_publish_time
- attachment.unified_setting = @unified_setting
- if @unified_setting == 0
- attachment_group_setting attachment, params[:group_settings]
+ if attachment_ids.present?
+ attachment_ids.each do |attchment_id|
+ attachment = Attachment.find_by_id attchment_id
+ unless attachment.nil?
+ attachment.container = @course
+ attachment.course_second_category_id = course_second_category_id
+ attachment.description = params[:description]
+ attachment.is_public = params[:is_public] && @course.is_public == 1 ? 1 : 0
+ attachment.is_publish = @atta_is_publish
+ attachment.delay_publish = @atta_delay_publish
+ attachment.publish_time = @atta_publish_time
+ attachment.unified_setting = @unified_setting
+ if @unified_setting == 0
+ attachment_group_setting attachment, params[:group_settings]
+ end
+ # attachment.set_publish_time(publish_time) if is_unified_setting
+ # attachment.set_course_group_publish_time(@course, course_group_publish_times) if @course.course_groups.size > 0 && !is_unified_setting && publish_time.blank?
+ attachment.save!
end
- # attachment.set_publish_time(publish_time) if is_unified_setting
- # attachment.set_course_group_publish_time(@course, course_group_publish_times) if @course.course_groups.size > 0 && !is_unified_setting && publish_time.blank?
- attachment.save!
end
+ else
+ tip_exception("资源名称不能为空") if params[:name].blank?
+ tip_exception("资源名称不能超过60个字符") if params[:name].strip.length > 60
+ tip_exception("链接地址不能为空") if params[:link].blank?
+ attachment = Attachment.new
+ attachment.container = @course
+ attachment.course_second_category_id = course_second_category_id
+ attachment.author_id = current_user.id
+ attachment.filename = params[:name].strip
+ attachment.link = params[:link].strip
+ attachment.description = params[:description]
+ attachment.is_public = params[:is_public] && @course.is_public == 1 ? 1 : 0
+ attachment.is_publish = @atta_is_publish
+ attachment.delay_publish = @atta_delay_publish
+ attachment.publish_time = @atta_publish_time
+ attachment.unified_setting = @unified_setting
+ if @unified_setting == 0
+ attachment_group_setting attachment, params[:group_settings]
+ end
+ attachment.save!
end
+
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
diff --git a/app/models/course_video.rb b/app/models/course_video.rb
index e61a439dc..246be34fd 100644
--- a/app/models/course_video.rb
+++ b/app/models/course_video.rb
@@ -1,4 +1,7 @@
class CourseVideo < ApplicationRecord
belongs_to :course
- belongs_to :video
+ belongs_to :video, optional: true
+ belongs_to :user, optional: true
+
+ validates :title, length: { maximum: 60, too_long: "不能超过60个字符" }
end
diff --git a/app/views/courses/course_videos.json.jbuilder b/app/views/courses/course_videos.json.jbuilder
index db4f4006c..bee5e89cb 100644
--- a/app/views/courses/course_videos.json.jbuilder
+++ b/app/views/courses/course_videos.json.jbuilder
@@ -1,8 +1,22 @@
json.count @count
-json.videos @videos, partial: 'users/videos/video', as: :video
+
+json.videos @videos do |video|
+ if video.is_link
+ json.(video, :id, :title, :link, :user_id)
+
+ user = video.user
+ json.user_name user&.real_name
+ json.user_img url_to_avatar(user)
+ json.user_login user&.login
+ else
+ json.partial! 'users/videos/video', locals: { video: video.video }
+ end
+end
+
json.course_id @course.id
if @category.present?
json.category_id @category.id
json.category_name @category.name
end
-json.course_module_id @video_module&.id
\ No newline at end of file
+json.course_module_id @video_module&.id
+json.has_category @video_module.course_second_categories.size > 0
\ No newline at end of file
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index f9671eec1..4c5c808ac 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -183,6 +183,9 @@ zh-CN:
attendance_date: '签到日期'
start_time: '开始时间'
end_time: '结束时间'
+ course_video:
+ title: '视频名称'
+ link: '链接地址'
diff --git a/config/routes.rb b/config/routes.rb
index 1f9d4cfc4..7bf1b6c1b 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -538,6 +538,8 @@ Rails.application.routes.draw do
get 'search_slim'
end
+ resources :course_videos, only:[:create, :update], shallow: true
+
resources :course_stages, shallow: true do
member do
post :up_position
diff --git a/db/migrate/20200309101753_add_link_to_course_videos.rb b/db/migrate/20200309101753_add_link_to_course_videos.rb
new file mode 100644
index 000000000..d5580d92e
--- /dev/null
+++ b/db/migrate/20200309101753_add_link_to_course_videos.rb
@@ -0,0 +1,8 @@
+class AddLinkToCourseVideos < ActiveRecord::Migration[5.2]
+ def change
+ add_column :course_videos, :is_link, :boolean, default: 0
+ add_column :course_videos, :title, :string
+ add_column :course_videos, :link, :string
+ add_column :course_videos, :user_id, :integer, index: true
+ end
+end
diff --git a/db/migrate/20200309123121_add_link_to_attachments.rb b/db/migrate/20200309123121_add_link_to_attachments.rb
new file mode 100644
index 000000000..23510be26
--- /dev/null
+++ b/db/migrate/20200309123121_add_link_to_attachments.rb
@@ -0,0 +1,5 @@
+class AddLinkToAttachments < ActiveRecord::Migration[5.2]
+ def change
+ add_column :attachments, :link, :string
+ end
+end
diff --git a/public/react/src/common/components/comment/CommentForm.js b/public/react/src/common/components/comment/CommentForm.js
index 11eea72e2..058cceda7 100644
--- a/public/react/src/common/components/comment/CommentForm.js
+++ b/public/react/src/common/components/comment/CommentForm.js
@@ -10,11 +10,9 @@ import './index.scss';
import React, { useState } from 'react';
import { Form, Button, Input } from 'antd';
import QuillForEditor from '../../quillForEditor';
-// import { QuillDeltaToHtmlConverter } from 'quill-delta-to-html'
-// import {formatDelta} from './util';
const FormItem = Form.Item;
-function CommentForm (props) {
+function CommentForm(props) {
const {
onCancel,
@@ -28,9 +26,6 @@ function CommentForm (props) {
const [focus, setFocus] = useState(false);
const options = [
- // ['bold', 'italic', 'underline'],
- // [{header: [1,2,3,false]}],
- 'code-block',
'link',
'image',
'formula'
@@ -52,12 +47,10 @@ function CommentForm (props) {
// 编辑器内容变化时
const handleContentChange = (content) => {
- console.log('编辑器内容', content);
setCtx(content);
try {
// const _html = new QuillDeltaToHtmlConverter(content.ops, {}).convert();
- // props.form.setFieldsValue({'comment': _html.replace(/<\/?[^>]*>/g, '')});
- props.form.setFieldsValue({'comment': content});
+ props.form.setFieldsValue({ 'comment': content });
} catch (error) {
console.log(error);
}
@@ -69,7 +62,7 @@ function CommentForm (props) {
if (!err) {
setShowQuill(false);
const content = ctx;
- props.form.setFieldsValue({'comment': ''});
+ props.form.setFieldsValue({ 'comment': '' });
setCtx('');
// const _html = formatDelta(content.ops);
// console.log('保存的内容=====》》》》', content);
@@ -95,7 +88,7 @@ function CommentForm (props) {
{
getFieldDecorator('comment', {
rules: [
- { required: true, message: '评论内容不能为空'}
+ { required: true, message: '评论内容不能为空' }
],
})(