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

courseware
杨树明 5 years ago
commit ce59271ad9

@ -7,13 +7,13 @@ class Admins::CoursesController < Admins::BaseController
courses = Admins::CourseQuery.call(params)
@ended_courses = courses.where(is_end: 1).size
@processed_courses = courses.where(is_end: 0).size
@courses = paginate courses.includes(:school, :students, :attachments, :homework_commons, teacher: :user_extension)
@courses = paginate courses.includes(:school, :students, :teacher_course_members, :informs, :course_videos, :attachments, :homework_commons, teacher: :user_extension)
respond_to do |format|
format.js
format.html
format.xlsx do
@courses = courses.includes(:school, :students, :attachments, :homework_commons, :course_acts, teacher: :user_extension)
@courses = courses.includes(:school, :students, :teacher_course_members, :informs, :course_videos, :attachments, :homework_commons, :course_activities, teacher: [user_extension: :department])
filename = "课堂列表_#{Time.current.strftime('%Y%m%d%H%M%S')}.xlsx"
render xlsx: 'index', filename: filename
end

@ -2,6 +2,7 @@ class AttendancesController < ApplicationController
before_action :require_login
before_action :find_course, only: [:index, :statistics]
before_action :find_attendance, except: [:index, :statistics]
before_action :user_course_identity
def index
@ -66,9 +67,53 @@ class AttendancesController < ApplicationController
@avg_leave_rate = data[:avg_leave_rate]
end
def edit
@groups = @course.course_groups.where(id: @attendance.course_attendance_groups.pluck(:course_group_id))
end
def update
tip_exception(403, "") unless @user_course_identity < Course::PROFESSOR || @attendance.user_id == current_user.id
a_end_time = "#{@attendance.attendance_date} #{@attendance.end_time}".to_time
new_end_time = "#{params[:attendance_date]} #{params[:end_time]}".to_time
@attendance.update!(update_params)
# 如果历史签到变为了正在签到,将未创建的学生签到数据补上
if a_end_time < Time.current && new_end_time > Time.current
create_absence_student_data
end
render_ok
end
private
def find_attendance
@attendance = CourseAttendance.find params[:id]
@course = @attendance.course
end
def update_params
params.permit(:name, :mode, :attendance_date, :start_time, :end_time)
end
def create_absence_student_data
group_ids = @attendance.course_attendance_groups.pluck(:course_group_id)
if group_ids.include?(0)
students = @course.students
else
students = @course.students.where(course_group_id: group_ids)
end
none_users = students.where.not(user_id: @attendance.course_member_attendances.pluck(:user_id))
attrs = %i[course_attendance_id user_id course_member_id course_id course_group_id created_at updated_at]
same_attrs = {course_attendance_id: attendance.id, course_id: course.id}
CourseMemberAttendance.bulk_insert(*attrs) do |worker|
none_users.each do |student|
next if @attendance.course_member_attendances.exists?(user_id: student.user_id)
worker.add same_attrs.merge(user_id: student.user_id, course_member_id: student.id, course_group_id: student.course_group_id)
end
end
end
end

@ -25,7 +25,7 @@ class CourseVideosController < ApplicationController
course_video = CourseVideo.find(@video.id)
@watch_course_videos = course_video.watch_course_videos.joins("
JOIN watch_video_histories ON watch_video_histories.watch_course_video_id = watch_course_videos.id
JOIN watch_video_histories ON watch_video_histories.watch_course_video_id = watch_course_videos.id AND watch_video_histories.end_at IS NOT NULL
JOIN course_members ON course_members.user_id = watch_course_videos.user_id AND course_members.course_id = #{@course.id} AND role = 4
").group("watch_video_histories.watch_course_video_id").where("watch_course_videos.end_at IS NOT NULL").select("watch_course_videos.id")
@ -35,7 +35,7 @@ class CourseVideosController < ApplicationController
@watch_course_videos = @watch_course_videos.where("course_members.course_group_id = ?", params[:group_id])
end
@watch_course_videos = @watch_course_videos.select("count(watch_video_histories.id) AS freq, watch_course_videos.*")
@watch_course_videos = @watch_course_videos.select("count(watch_course_videos.course_video_id) AS freq, watch_course_videos.*")
if params[:order].present?
key = params[:order].split("-")

@ -1491,10 +1491,11 @@ class CoursesController < ApplicationController
@videos = CourseVideo.joins("
JOIN videos ON course_videos.course_id = #{@course.id} AND videos.id = course_videos.video_id
LEFT JOIN (
SELECT watch_course_videos.course_video_id, SUM(watch_course_videos.total_duration) AS time, COUNT(watch_course_videos.course_video_id) AS num
SELECT watch_course_videos.course_video_id, SUM(watch_course_videos.total_duration) AS time, COUNT(watch_video_histories.watch_course_video_id) AS num
FROM watch_course_videos
JOIN course_videos ON course_videos.id = watch_course_videos.course_video_id AND watch_course_videos.end_at IS NOT NULL
JOIN course_members ON course_members.user_id = watch_course_videos.user_id AND course_members.course_id = #{@course.id} AND role = 4
JOIN watch_video_histories ON watch_course_videos.id = watch_video_histories.watch_course_video_id AND watch_video_histories.end_at IS NOT NULL
WHERE course_videos.course_id = #{@course.id}
GROUP BY watch_course_videos.course_video_id
) AS hisotries ON hisotries.course_video_id = course_videos.id").select("course_videos.id")
@ -1521,16 +1522,19 @@ class CoursesController < ApplicationController
JOIN videos ON course_videos.course_id = #{@course.id} AND videos.id = course_videos.video_id
JOIN watch_course_videos ON course_videos.id = watch_course_videos.course_video_id AND watch_course_videos.user_id = #{current_user.id}
JOIN (
SELECT watch_course_videos.course_video_id, COUNT(watch_course_videos.course_video_id) AS num
SELECT watch_course_videos.course_video_id, COUNT(watch_video_histories.watch_course_video_id) AS num
FROM watch_course_videos
JOIN course_videos ON course_videos.id = watch_course_videos.course_video_id
JOIN course_members ON course_members.user_id = watch_course_videos.user_id AND course_members.course_id = #{@course.id} AND role = 4
JOIN watch_video_histories ON watch_course_videos.id = watch_video_histories.watch_course_video_id AND watch_video_histories.end_at IS NOT NULL
WHERE course_videos.course_id = #{@course.id} AND watch_course_videos.user_id = #{current_user.id} AND watch_course_videos.end_at IS NOT NULL
GROUP BY watch_course_videos.course_video_id
) AS hisotries ON hisotries.course_video_id = course_videos.id").select("course_videos.id")
@count = @videos.count
@videos = @videos.includes(video: :user)
if params[:order].present?
key = params[:order].split("-")
if ["freq", 'total_duration'].include?(key.first) && ["desc", "asc"].include?(key.last)
@ -1538,24 +1542,32 @@ class CoursesController < ApplicationController
end
end
@videos = @videos.select("course_videos.id, watch_course_videos.start_at, watch_course_videos.total_duration, watch_course_videos.end_at, watch_course_videos.is_finished, videos.title, IFNULL(hisotries.num,0) AS freq")
@videos = @videos.select("course_videos.id, course_videos.video_id, watch_course_videos.start_at, watch_course_videos.total_duration, watch_course_videos.end_at, watch_course_videos.is_finished, videos.title, IFNULL(hisotries.num,0) AS freq")
@videos = paginate @videos
end
# 课堂视频的统计总览
def watch_statics
course_videos = @course.course_videos.joins(:watch_course_videos).joins("
JOIN course_members ON course_members.user_id = watch_course_videos.user_id AND course_members.course_id = #{@course.id} AND role = 4
").where("watch_course_videos.end_at IS NOT NULL")
@total_duration = course_videos.sum(:total_duration).round(0)
@frequencies = course_videos.joins("JOIN watch_video_histories ON watch_course_videos.id = watch_video_histories.watch_course_video_id").count(:id)
@people_num = course_videos.count(:id)
course_videos = @course.course_videos.joins(:watch_course_videos).joins("JOIN course_members ON course_members.user_id = watch_course_videos.user_id AND course_members.course_id = #{@course.id} AND role = 4").where("watch_course_videos.end_at IS NOT NULL")
if params[:all].present?
return normal_status(403, "你没有权限操作") unless current_user.teacher_of_course?(@course)
@total_duration = course_videos.sum(:total_duration).round(0)
@frequencies = course_videos.joins("JOIN watch_video_histories ON watch_course_videos.id = watch_video_histories.watch_course_video_id AND watch_video_histories.end_at IS NOT NULL").count(:id)
@num = course_videos.count(:id)
else
course_videos = course_videos.where("course_members.user_id = #{current_user.id}")
@total_duration = course_videos.sum(:total_duration).round(0)
@frequencies = course_videos.joins("JOIN watch_video_histories ON watch_course_videos.id = watch_video_histories.watch_course_video_id AND watch_video_histories.end_at IS NOT NULL").count(:id)
@num = course_videos.count(:id)
end
render json: {
total_duration: @total_duration,
freq: @frequencies,
people_num: @people_num,
begin_at: '2020-03-13 24:00'
freq: @frequencies,
num: @num,
begin_at: '2020-03-13 24:00'
}
end

@ -32,8 +32,7 @@ class FilesController < ApplicationController
end
end
@attachments = @attachments.includes(author: [:user_extension, :course_members])
.ordered(sort: sort.to_i, sort_type: sort_type.strip)
@attachments = @attachments.ordered(sort: sort.to_i, sort_type: sort_type.strip)
@total_count = @attachments.size
@unlink_count = @attachments.no_link.size
@ -59,7 +58,8 @@ class FilesController < ApplicationController
@attachments = @attachments.no_link
end
@attachments = @attachments.page(@page).per(@page_size)
@attachments = @attachments.includes(:course_second_category, author: [:user_extension, :course_members])
.page(@page).per(@page_size)
end
def bulk_publish

@ -477,6 +477,8 @@ class StudentWorksController < ApplicationController
@user_evaluate_count = 0
end
@view_tpi = ((@user_course_identity < Course::STUDENT && current_user.is_certification_teacher) || current_user.admin_or_business?) && @work.myshixun.present?
# 图形效率图的数据
@echart_data = student_efficiency(@homework, @work) if @work.myshixun
end

@ -28,6 +28,7 @@ class Attachment < ApplicationRecord
scope :no_link, -> {where(link: nil)}
validates_length_of :description, maximum: 100, message: "不能超过100个字符"
validates :link, format: { with: CustomRegexp::URL, message: "必须为网址超链接" }, allow_blank: true
DCODES = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z)

@ -406,6 +406,15 @@ class Course < ApplicationRecord
homework_commons.select{|homework| homework.homework_type == type}.size
end
# 课堂作业数
def published_course_homework_count type
homework_commons.select{|homework| homework.homework_type == type && homework.publish_time.present? && homework.publish_time <= Time.now}.size
end
def student_works_count
StudentWork.joins(:homework_common).where(homework_commons: {course_id: id}).where("work_status > 0").size
end
private
#创建课程后,给该用户发送消息

@ -33,12 +33,10 @@ class CreateWatchVideoService < ApplicationService
if watch_course_video.present?
watch_course_video.total_duration = watch_course_video.watch_video_histories.sum(:total_duration)
watch_course_video.end_at = current_time
if !watch_course_video.is_finished && watch_course_video.watch_duration < params[:watch_duration]
if !watch_course_video.is_finished
# 更新课程视频的时长及是否看完状态
watch_course_video.watch_duration = params[:watch_duration]
if params[:ed].present?
watch_course_video.is_finished = watch_course_video.total_duration >= watch_course_video.duration
end
watch_course_video.watch_duration = params[:watch_duration] if watch_course_video.watch_duration < params[:watch_duration]
watch_course_video.is_finished = watch_course_video.total_duration >= watch_course_video.duration if params[:ed].present?
end
watch_course_video.save!
end

@ -3,22 +3,28 @@ wb = xlsx_package.workbook
wb.styles do |s|
blue_cell = s.add_style :bg_color => "FAEBDC", :sz => 10,:height => 25,:b => true, :border => { :style => :thin, :color =>"000000" },:alignment => {wrap_text: true,:horizontal => :center,:vertical => :center}
wb.add_worksheet(name: "课堂列表") do |sheet|
sheet.add_row %w(ID 课堂名称 成员 资源 普通作业 分组作业 实训作业 试卷 评测次数 私有 状态 单位 创建者 创建时间 动态时间), :height => 25,:style => blue_cell
sheet.add_row %w(ID 课堂名称 老师 学生 资源 公告 视频 普通作业 分组作业 实训作业 实训作业已发布数 作品数 试卷 评测次数 私有 状态 单位 部门 创建者 创建时间 动态时间), :height => 25,:style => blue_cell
@courses.each do |course|
data = [
course.id,
course.name,
course.course_members_count,
course.teacher_course_members.size,
course.students.size,
get_attachment_count(course, 0),
course.course_homework_count(1),
course.course_homework_count(3),
course.course_homework_count(4),
course.informs.size,
course.course_videos.size,
course.course_homework_count("normal"),
course.course_homework_count("group"),
course.course_homework_count("practice"),
course.published_course_homework_count("practice"),
course.student_works_count,
course.exercises_count,
course.evaluate_count,
course.is_public == 1 ? "--" : "√",
course.is_end ? "已结束" : "正在进行",
course.school&.name,
course.teacher&.department_name,
course.teacher&.real_name,
course.created_at&.strftime('%Y-%m-%d %H:%M'),
course.max_activity_time ? course.max_activity_time&.strftime('%Y-%m-%d %H:%M') : "--"

@ -3,18 +3,22 @@
<tr>
<th width="4%">序号</th>
<th width="4%">ID</th>
<th width="10%" class="text-left">课堂名称</th>
<th width="5%">成员</th>
<th width="8%" class="text-left">课堂名称</th>
<th width="4%">老师</th>
<th width="4%">学生</th>
<th width="4%">资源</th>
<th width="4%">公告</th>
<th width="4%">视频</th>
<th width="4%">普通作业</th>
<th width="4%">分组作业</th>
<th width="4%">实训作业</th>
<th width="4%">作品数</th>
<th width="4%">试卷</th>
<th width="6%">评测次数</th>
<th width="4%">私有</th>
<th width="6%">状态</th>
<th width="10%">单位</th>
<th width="7%">创建者</th>
<th width="4%">状态</th>
<th width="8%">单位</th>
<th width="6%">创建者</th>
<th width="10%"><%= sort_tag('创建时间', name: 'created_at', path: admins_courses_path) %></th>
<th width="4%">首页</th>
<th width="5%">邮件通知</th>

@ -3,11 +3,15 @@
<td class="text-left">
<%= link_to(course.name, "/classrooms/#{course.id}", target: '_blank') %>
</td>
<td><%= course.course_members_count %></td>
<td><%= course.teacher_course_members.size %></td>
<td><%= course.students.size %></td>
<td><%= get_attachment_count(course, 0) %></td>
<td><%= course.informs.size %></td>
<td><%= course.course_videos.size %></td>
<td><%= course.course_homework_count("normal") %></td>
<td><%= course.course_homework_count("group") %></td>
<td><%= course.course_homework_count("practice") %></td>
<td><%= course.student_works_count %></td>
<td><%= course.exercises_count %></td>
<td><%= course.evaluate_count %></td>
<td><%= course.is_public == 1 ? "--" : "√" %></td>

@ -0,0 +1,4 @@
json.(@attendance, :name, :mode, :attendance_date, :start_time, :end_time)
json.groups @groups do |group|
json.(group, :id, :name)
end

@ -2,7 +2,7 @@ json.has_course_groups @has_course_groups
json.course_modules do
json.array! @course_modules do |course_module|
json.value course_module.id
json.title course_module.module_name
json.title course_module.module_name.to_s + "(根目录)"
json.children course_module.first_categories do |category|
json.title category.name
json.value category.id

@ -30,6 +30,7 @@ json.course_modules @course_modules.each do |mod|
json.third_category category.children do |child|
json.partial! "category_info", category: child
json.parent_id child.parent_id
end
end
end

@ -1,7 +1,7 @@
json.data do
json.array! @videos.each do |d|
json.title d.title
json.user_name @current_user&.real_name
json.user_name d.video.user&.real_name
json.is_finished d.is_finished ? true : false
json.total_duration d.total_duration.round(0)
json.freq d['freq']

@ -17,7 +17,7 @@ json.data do
end
# json.partial! "files/course_groups", attachment_group_settings: attachment.attachment_group_settings
json.category_id attachment.course_second_category_id
unless @parent_category_id.present? && @parent_category_id != 0
if (@parent_category_id.blank? || @parent_category_id != 0) && attachment.course_second_category&.parent_id.to_i != 0
json.category_name attachment.course_second_category&.name
end
end

@ -87,4 +87,6 @@ if @shixun
end
end
json.view_tpi @view_tpi

@ -64,6 +64,7 @@ zh-CN:
description: '章节描述'
attachment:
description: '资源描述'
link: '链接'
message:
subject: '标题'
message_detail:

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

@ -30,6 +30,12 @@
<div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe73a;</span>
<div class="name">返回左键头</div>
<div class="code-name">&amp;#xe73a;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe739;</span>
<div class="name">返回</div>
@ -2090,6 +2096,15 @@
<div class="content font-class">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-zuojiantou1"></span>
<div class="name">
返回左键头
</div>
<div class="code-name">.icon-zuojiantou1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-fanhui"></span>
<div class="name">
@ -5134,6 +5149,14 @@
<div class="content symbol">
<ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-zuojiantou1"></use>
</svg>
<div class="name">返回左键头</div>
<div class="code-name">#icon-zuojiantou1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-fanhui"></use>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -5,6 +5,13 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "13511742",
"name": "返回左键头",
"font_class": "zuojiantou1",
"unicode": "e73a",
"unicode_decimal": 59194
},
{
"icon_id": "13458315",
"name": "返回",

@ -20,6 +20,9 @@ Created by iconfont
/>
<missing-glyph />
<glyph glyph-name="zuojiantou1" unicode="&#59194;" d="M832.503909-127.983381a63.919062 63.919062 0 0 0-38.990629 12.144622L151.765893 340.543347a51.13525 51.13525 0 0 0 0 85.651544l639.190625 457.021297a67.754206 67.754206 0 0 0 87.569116-8.309479 50.496059 50.496059 0 0 0-9.58786-77.342065L289.831068 383.369119l581.663469-412.277953a50.496059 50.496059 0 0 0 9.587859-77.342066 63.919062 63.919062 0 0 0-48.578487-21.732481z" horiz-adv-x="1024" />
<glyph glyph-name="fanhui" unicode="&#59193;" d="M590.769231-107.362462H315.076923c-31.507692 0-63.015385 23.630769-63.015385 63.015385s23.630769 63.015385 63.015385 63.015385h275.692308c259.938462 0 378.092308 7.876923 378.092307 252.061538s-118.153846 252.061538-378.092307 252.061539H315.076923c-31.507692 0-63.015385 23.630769-63.015385 63.015384s31.507692 55.138462 63.015385 55.138462h275.692308c228.430769 0 496.246154 0 496.246154-378.092308s-267.815385-370.215385-496.246154-370.215385zM47.261538 514.914462l259.938462-196.923077c39.384615-23.630769 86.646154-15.753846 110.276923 15.753846 7.876923 15.753846 15.753846 31.507692 15.753846 47.261538v393.846154c0 47.261538-31.507692 78.769231-78.769231 78.769231-15.753846 0-31.507692-7.876923-47.261538-15.753846l-259.938462-196.923077c-39.384615-31.507692-47.261538-78.769231-15.753846-110.276923 0-7.876923 7.876923-15.753846 15.753846-15.753846z" horiz-adv-x="1102" />

Before

Width:  |  Height:  |  Size: 410 KiB

After

Width:  |  Height:  |  Size: 410 KiB

@ -18,7 +18,7 @@ class Fileslistitem extends Component {
settingList = (bools) => {
let {discussMessage} = this.props
console.log(discussMessage);
this.setState({
discussMessageid: discussMessage.id
})

@ -49,6 +49,8 @@ class Fileslists extends Component{
link: "",
//是否展开
istowshowid:'',
//新增参数判断几级目录
parent_category_id:'',
}
}
@ -144,10 +146,6 @@ class Fileslists extends Component{
}
}
}
updadatalist=(id)=>{
@ -166,7 +164,7 @@ class Fileslists extends Component{
let list = response.data.course_modules;
let course_second_categoriess;
list.map((item, key) => {
course_second_categoriess = item.children
course_second_categoriess = item.children?item.children:[]
})
this.setState({
@ -184,8 +182,8 @@ class Fileslists extends Component{
}
updatafiled=()=>{
let{sort}=this.state;
console.log(5)
let{sort}=this.state;
if(this.props.match.params.main_id){
this.seactall(undefined,sort);
}else if(this.props.match.params.Id){
@ -219,12 +217,15 @@ class Fileslists extends Component{
})
newsort="desc"
}
console.log(1)
this.getfileslist(pagesize,page,tagname,searchValue,newsort,sorttype,coursesecondcategoryid);
}
getfileslist=(pagesize,page,tagname,searchValue,sort,sorttype,coursesecondcategoryid)=>{
this.updadatalist(0);
let url = "/files.json";
const courseid = this.props.match.params.coursesId;
let id=coursesecondcategoryid;
@ -251,7 +252,8 @@ class Fileslists extends Component{
unpublish_count:list.unpublish_count,
files:list.files,
filesId:list.id,
name:list.name,
name:list.name,
parent_category_id:list.parent_category_id,
course_is_public:result.data.data.course_is_public,
page:page
@ -456,17 +458,21 @@ class Fileslists extends Component{
}
addDir = () => {
let {filesId,course_modules}=this.state;
let {filesId,course_modules,coursesecondcategoryid}=this.state;
//调用获取资源接口 刷新数据
this.setState({
checkBoxValues:[]
})
})
if(parseInt(this.props.match.params.main_id)!=parseInt(this.props.coursesids)){
trigger('attachmentAddlog', {id: parseInt( course_modules&&course_modules.course_modules[0].value),name:'资源'})
trigger('attachmentAddlog', {id: parseInt( course_modules&&course_modules.course_modules[0].value),name:'资源',coursesecondcategoryid:coursesecondcategoryid})
}else{
console.log(parseInt(filesId))
trigger('attachmentAddlog', {id:parseInt(filesId),name:'资源'})
}
trigger('attachmentAddlog', {id:parseInt(filesId),name:'资源',coursesecondcategoryid:coursesecondcategoryid})
}
}
@ -559,7 +565,9 @@ class Fileslists extends Component{
PaginationTask=(page)=>{
let {search,order,selectpage,checkAllValue,checkBoxValues}=this.state;
let selectpagetype=selectpage===page?true:false
let selectpagetype=selectpage===page&&checkBoxValues.length===15?true:false
console.log(selectpagetype)
this.setState({
page:page,
checkAllValue:selectpagetype,
@ -786,7 +794,7 @@ class Fileslists extends Component{
course_groupslist:id
})
}
render(){
let { searchValue,
@ -822,6 +830,7 @@ class Fileslists extends Component{
} = this.state;
let category_id= this.props.match.params.category_id;
// console.log(this.state.course_groups)
return(
<React.Fragment >
@ -961,7 +970,7 @@ class Fileslists extends Component{
firstRowRight={
<React.Fragment>
{/*{this.props.isAdmin()?parseInt(this.props.match.params.main_id)===parseInt(this.props.coursesids)?<WordsBtn style="blue" onClick={()=>this.addDir()} className={"mr30 font-16"}>新建目录</WordsBtn>:"":""}*/}
{this.props.isAdmin()?<WordsBtn style="blue" onClick={()=>this.addDir()} className={"mr30 font-16"}>新建目录</WordsBtn>:""}
{this.props.isAdmin()?this.state.parent_category_id===null||this.state.parent_category_id===undefined||this.state.parent_category_id===0?<WordsBtn style="blue" onClick={()=>this.addDir()} className={"mr30 font-16"}>新建目录</WordsBtn>:"":''}
{this.props.isAdmin()?parseInt(this.props.match.params.main_id)!=parseInt(this.props.coursesids)?<WordsBtn style="blue" onClick={()=>this.editDir(name)} className={"mr30 font-16"}>目录重命名</WordsBtn>:"":""}
{this.props.isAdmin()||this.props.isStudent() ? this.props.user&&this.props.user.main_site===true? <WordsBtn style="blue" className="mr30 font-16" onClick={()=>this.addResource()}>选用资源</WordsBtn>:"":""}
@ -1012,43 +1021,43 @@ class Fileslists extends Component{
margin-left: 10px;
padding: 10px;
}
.bordboom{
border-bottom: 1 solid red;
}
`}
</style>
<ul className="drop_down_menu" style={{"right":"0px","left":"unset","min-width":'180px'}}>
{/* <p style={{marginLeft:15,color:"#000000",fontSize:20}}>资源</p> */}
{this.state.course_second_categories.length>10? <p className="drop_down_search">
{this.state.course_second_categories&&this.state.course_second_categories.length>10? <p className="drop_down_search">
<Input placeholder="搜索" value={this.state.dirSearchValue} onChange={(e) => {this.setState({dirSearchValue: e.target.value})}}/>
</p>:""}
{course_modules&&course_modules.course_modules.map((item,key)=>{
return(
filesId&&filesId===item.value?"":<li key={key} id={item.value} onClick={() => this.moveTos(0)} title={item.module_name}>{item.module_name}</li>
filesId&&filesId===item.value?"":<li key={key} id={item.value} onClick={() => this.moveTos(0)} title={item.title}>{item.title}</li>
)
})}
{ course_modules&&course_modules.course_modules.map( (item,key) => {
return item.children.filter((item)=> {
return item.children&&item.children.filter((item)=> {
return (!this.state.dirSearchValue || item.name.indexOf(this.state.dirSearchValue) != -1)
}).map((itm,k)=>{
return(
filesId&&filesId===itm.value?"":
<div>
<div className="bordboom">
<div className="bordboom" style={{display:'flex',marginTop:15,height:30}}>
<div onClick={() => this.moveTos(itm.value )} style={{marginLeft:15,width:200,color:'#000000',overflow: 'hidden',textOverflow:'ellipsis',whiteSpace: 'nowrap'}}>{itm.title}</div>
{itm.children.length===0?'':<i style={{marginLeft:15}} onClick={() => this.istowshow(itm,filesId)} className="iconfont icon-xiajiantou font-12 ml2"></i>}
<div onClick={() => this.moveTos(itm.value )} style={{marginLeft:15,width:itm.title.length>13?200:undefined,color:'#000000',overflow: 'hidden',textOverflow:'ellipsis',whiteSpace: 'nowrap'}}>{itm.title}</div>
{itm.children.length===0?'':<i style={{marginLeft:15,marginRight:15}} onClick={() => this.istowshow(itm,filesId)} className="iconfont icon-xiajiantou font-12 ml2"></i>}
</div>
{ this.state.istowshowid===itm.value?
itm.children.map((tt,ti) => {
return(
filesId&&filesId===itm.id?"":
<div style={{marginLeft:30}} key={ti} id={tt.value} onClick={() => this.moveTos(tt.value )} title={tt.name}>{tt.title}</div>
)
})
:''}
{ this.state.istowshowid===itm.value?
itm.children.map((tt,ti) => {
return(
filesId&&filesId===itm.id?"":
<Tooltip placement="right"title={tt.title.length>13?tt.title:''} >
<div style={{marginLeft:30,width:tt.title.length>13?200:undefined,color:'#000000',overflow: 'hidden',textOverflow:'ellipsis',whiteSpace: 'nowrap'}} key={ti} id={tt.value} onClick={() => this.moveTos(tt.value )} title={tt.name}>{tt.title}</div>
</Tooltip>
)
})
:''}
</div>
)
})

@ -0,0 +1,5 @@
.bordboom{
width: 100%;
border-bottom: 1 solid red;
}

@ -268,7 +268,6 @@ class VideoIndex extends Component {
const newOperation = flag;
const new_upload = flag && (is_teacher && this.props.checkIfProfessionalCertification());
const isAdmin = this.props&& this.props.isAdmin();
return (
@ -333,7 +332,7 @@ class VideoIndex extends Component {
:
<WordsBtn style="blue" className="ml30 font-16 tongjis"
onClick={() => this.statisticsy(true)}
><i className="iconfont icon-tongji1 mr5"></i></WordsBtn>
><i className="iconfont icon-tongji1 mr5 font-14"></i></WordsBtn>
}
</span>
@ -378,12 +377,9 @@ class VideoIndex extends Component {
</div>
</div>
:
(
isAdmin?
<Videostatistics {...this.props} {...this.state} statisticsy={(b) => this.statisticsy(b)}></Videostatistics>
:
<Videostatisticscomtwo {...this.props} {...this.state} mytitle={""} ></Videostatisticscomtwo>
)
<Videostatistics {...this.props} {...this.state} statisticsy={(b) => this.statisticsy(b)}></Videostatistics>
}
{
statistics === false ?

@ -178,7 +178,6 @@
margin:0px auto;
}
.tongjis{
border: 1px solid #4CACFF;
padding-left: 10px;
padding-right: 10px;
padding-top: 5px;
@ -187,3 +186,6 @@
line-height: 1px;
}
.font-14{
font-size: 14px !important;
}

@ -74,9 +74,7 @@ class Coursesleftnav extends Component{
sanshow:'',
sansandiantype:undefined,
//新增参数判断打开关闭 默认关闭
showPreson:true,
//判断二级还是三级目录点击
sanclick:'issan',
showPreson:false,
//获取资源id 判断是否选中的事资源来判控
treeDataid:'',
//默认值
@ -201,8 +199,7 @@ class Coursesleftnav extends Component{
this.Navmodalnames(e,5,"editSecondname", data.id, data.name);
}
attachmentAddlog=(e,data)=>{
console.log(data.id,data.name)
this.Navmodalnames(e,1,"attachment",data.id,data.name);
this.Navmodalnames(e,1,"attachment",data.id,data.name,data.coursesecondcategoryid,data.coursesecondcategoryid===undefined?false:true);
}
flieseditDir=(e, data)=>{
this.Navmodalnames(e,4,"editSecondname",data.id,data.name);
@ -407,13 +404,11 @@ class Coursesleftnav extends Component{
}
selectnavids=(e,key,id,type,urls,index,santype)=>{
const doesShow = this.state.showPreson;
this.setState({
selectnavid:true,
newselectnavid:id,
url:urls,
showPreson:santype==='san'?!doesShow:'',
indexs:index
})
this.props.updataleftNavfun();
@ -612,7 +607,7 @@ class Coursesleftnav extends Component{
}
Navmodalnames=(e,id,type,setnavid,name,towid)=>{
Navmodalnames=(e,id,type,setnavid,name,towid,showPreson)=>{
e.stopPropagation();//阻止冒泡
this.getatahcment()
navidtype=false
@ -625,6 +620,7 @@ class Coursesleftnav extends Component{
Navmodaltypename:id,
Navmodalziyname:name,
treedefaultValue:towid,
showPreson:showPreson,
setnavid:setnavid,
parentid:towid,
NavmodalValue:""
@ -639,7 +635,8 @@ class Coursesleftnav extends Component{
Navmodaltypename:id,
setnavid:setnavid,
treedefaultValue:towid,
Navmodalziyname:name,
showPreson:showPreson,
Navmodalziyname:'',
parentid:towid,
NavmodalValue:name
})
@ -723,7 +720,6 @@ class Coursesleftnav extends Component{
if(type===true){
this.updasaveNavmoda()
trigger('files')
}else{
this.updasaveNavmoda()
this.props.history.push(`/classrooms/${coursesId}/file/${result.data.category_id}`);
@ -915,7 +911,7 @@ class Coursesleftnav extends Component{
}
tronChange=(value)=>{
console.log(this.state.treeDataid)
this.setState({
parentid:this.state.treeDataid===value?0:value
@ -1078,7 +1074,7 @@ class Coursesleftnav extends Component{
let {twosandiantypes,twosandiantypenum}=this.state;
return (item.type==="graduation"?"": <div className={item.type===twosandiantypes&&twosandiantypenum===index?"sandianboxs":"sandianboxs"} >
{/*作业/资源*/}
{item.type==="attachment"&&san!=='san'?<div onClick={e=>this.Navmodalnames(e,1,"attachment",item.id,"资源",iem.category_id)}>新建目录</div>:""}
{item.type==="attachment"&&san!=='san'?<div onClick={e=>this.Navmodalnames(e,1,"attachment",item.id,"资源",iem.category_id,true)}>新建目录</div>:""}
{item.type==="shixun_homework"||item.type==="attachment"||item.type==="graduation"||item.type==="common_homework"||item.type==="group_homework"?<div onClick={e=>this.Navmodalnames(e,4,"editSecondname",iem.category_id,iem.category_name)}>重命名</div>:""}
{item.type==="shixun_homework"||item.type==="attachment"||item.type==="common_homework"||item.type==="group_homework"?<div onClick={e=>this.deleteSecondary(e,1,iem.category_id)}>删除</div>:""}
{/*分班*/}
@ -1197,10 +1193,12 @@ class Coursesleftnav extends Component{
<TreeSelect
className={"input-flex-35 greyInput fl"}
style={{width:200}}
dropdownStyle={{ maxHeight: 400 ,width:300,overflow: 'auto' }}
style={{width:200,color:'#000000'}}
dropdownStyle={{ maxHeight: 400 ,width:600,overflow: 'auto',color:'#000000'}}
treeData={this.state.treeData}
placeholder="资源"
placeholder="资源(根目录)"
disabled={this.state.showPreson}
defaultValue={this.state.treedefaultValue}
treeDefaultExpandAll
onChange={this.tronChange}
@ -1376,16 +1374,16 @@ class Coursesleftnav extends Component{
</a>
{
this.props.location.pathname!==iem.second_category_url?"":iem.third_category.map((itt,index)=>{
iem.third_category===undefined?"":iem.third_category.map((itt,index)=>{
if(itt.category_type!=="attachment"){
return
return
}
return(
<div onClick={this.getatahcment}>
<div onClick={this.getatahcment} style={{display:this.state.newselectnavid===undefined?'none':itt.parent_id===this.state.newselectnavid?'block':'none'}}>
{/*"/classrooms/"+this.props.match.params.coursesId+"/"+item.type+"/"+iem.category_type+"/"+iem.category_id*/}
<a className={"Draggablelichild"} key={index}>
<li className="clearfix width93 Draggableli" key={index} onClick={(e)=>this.selectnavids(e,key,itt.category_id,item.type+"child",itt.second_category_url,key)} onMouseLeave={(e)=>this.sansandianhide(e,index,item.type)} onMouseEnter={(e)=>this.sansandianshow(e,index,item.type,itt.category_name)}
<li className="clearfix width93 Draggableli" key={index} onClick={(e)=>this.selectnavids(e,key,itt.parent_id,item.type+"child",itt.second_category_url,key)} onMouseLeave={(e)=>this.sansandianhide(e,index,item.type)} onMouseEnter={(e)=>this.sansandianshow(e,index,item.type,itt.category_name)}
key={index}
ref={provided.innerRef}
{...provided.draggableProps}
@ -1393,7 +1391,7 @@ class Coursesleftnav extends Component{
// title={iem.category_name.length<10?"":iem.category_name}
>
<a className="fl pl46 pd0 Draggablelichild">
<span style={{marginLeft:20}} className={this.props.location.pathname===itt.second_category_url?"color-blue fl ml38 maxwidth170 task-hide Draggablelichild":"fl ml38 maxwidth170 task-hide Draggablelichild"} onMouseEnter={(e)=>this.sansandianshowys(e,index,item.type)}>{itt.category_name}</span>
<span style={{marginLeft:15}} className={this.props.location.pathname===itt.second_category_url?"color-blue fl ml38 maxwidth155 task-hide Draggablelichild":"fl ml38 maxwidth155 task-hide Draggablelichild"} onMouseEnter={(e)=>this.sansandianshowys(e,index,item.type)}>{itt.category_name}</span>
<span className={sansandiantype===undefined?this.props.location.pathname===itt.second_category_url?"fr mr20 color-blue Draggablelichild font-14":"fr mr20 color999 Draggablelichild font-14":item.type===twosandiantypes&&sansandiantype===index&&itt.category_id!=0?"none":this.props.location.pathname===itt.second_category_url?"fr mr20 color-blue Draggablelichild font-14":"fr mr20 color999 Draggablelichild font-14"} >{itt.category_count===0?"":itt.category_count}</span>
@ -1416,7 +1414,7 @@ class Coursesleftnav extends Component{
</li>
</a>
</div>
</div>
)
})

@ -213,17 +213,25 @@ class sendResources extends Component{
}
// console.log("description");
// console.log(description);
if(description===undefined||description===null){
if(description===undefined){
}else {
if(description.length>100){
this.setState({
descriptiontype:true
})
return
}
}else if(description.length>100){
this.setState({
descriptiontype:true
})
return
}
if(this.props.Exterchainname==="资源设置"){
//设置
let coursesId=this.props.match.params.coursesId;
@ -240,13 +248,17 @@ class sendResources extends Component{
description:description,
delay_publish:Radiovalue,
}).then((result)=>{
if(result.data.status===0){
this.ModalCancelModalCancel();
this.props.updataleftNavfun();
this.props.showNotification("设置资源成功");
this.props.setupdate(1,false)
}else{
this.props.showNotification(result.data.message);
if(result){
if(result.data){
if(result.data.status===0){
this.ModalCancelModalCancel();
this.props.updataleftNavfun();
this.props.showNotification("设置资源成功");
this.props.setupdate(1,false)
}else{
this.props.showNotification(result.data.message);
}
}
}
})
@ -266,22 +278,20 @@ class sendResources extends Component{
description:description,
delay_publish:Radiovalue,
}).then((result)=>{
if(result.data.status===0){
this.ModalCancelModalCancel();
this.props.updataleftNavfun();
this.props.showNotification("上传资源成功");
this.props.setupdate(1,false)
}else{
this.props.showNotification(result.data.message);
if(result){
if(result.data){
if(result.data.status===0){
this.ModalCancelModalCancel();
this.props.updataleftNavfun();
this.props.showNotification("上传资源成功");
this.props.setupdate(1,false)
}else{
this.props.showNotification(result.data.message);
}
}
}
})
}
}
settextarea=(e)=>{
@ -348,7 +358,7 @@ class sendResources extends Component{
}
handleChangess=(e)=>{
this.setState({
this.setState({
resourceurl:e.target.value,
resourceurlbool:false,
})

@ -2519,7 +2519,6 @@ class Listofworksstudentone extends Component {
axios.get(url).then((response) => {
if (response) {
if (response.data.status === 0) {
setTimeout(() => {
this.props.showNotification(`${response.data.message}`);
// var homeworkid = this.props.match.params.homeworkid;
this.Getalistofworks(homeworkid, false);
@ -2529,12 +2528,14 @@ class Listofworksstudentone extends Component {
} catch (e) {
}
}, 2500);
}
}
// this.Getalistofworkstwo("", "", "", "", 1, 20);
}).catch((error) => {
console.log(error)
this.setState({
computeTimetype:true
})
});
}
@ -3364,10 +3365,6 @@ class Listofworksstudentone extends Component {
axios.get(url).then((response) => {
if (response) {
if (response.data.status === 0) {
// if(response.data.message!==undefined){
// return;
// }
setTimeout(() => {
this.setState({
loadingstate: true
})
@ -3382,13 +3379,13 @@ class Listofworksstudentone extends Component {
} catch (e) {
}
}, 2500);
}
// this.props.history.replace( matchurl );
}
}).catch((error) => {
console.log(error)
this.setState({
computeTimetype:true
})
});
};
@ -3672,27 +3669,9 @@ class Listofworksstudentone extends Component {
<li className="clearfix mt10">
<div className="fr search-newysl" style={{marginBottom: '1px'}}>
{/*{course_is_end===true?"":<span>*/}
{/*{teacherdata&&teacherdata.update_score===true&&computeTimetype===true?*/}
{/* (this.props.isNotMember()===false?<div className={"computeTime font-16"} onClick={this.setComputeTimet}>*/}
{/* 查看最新成绩*/}
{/* </div>:""):*/}
{/* teacherdata&&teacherdata.homework_status!==undefined&&teacherdata.homework_status[0]=== "未发布"? "":*/}
{/* (this.props.isNotMember()===false?<div className={"computeTimes font-16"}>*/}
{/* 查看最新成绩*/}
{/* </div>:"")*/}
{/*}*/}
{/*</span>}*/}
<span className="search-newyslw fr ml20">
{/*<Search*/}
{/* placeholder="请输入姓名或学号搜索"*/}
{/* id="subject_search_input"*/}
{/* autoComplete="off"*/}
{/* value={searchtext}*/}
{/* // onKeyUp={(e) => this.onSearchKeywordKeyUpt(e)}*/}
{/* onInput={this.inputSearchValuest}*/}
{/* onSearch={this.searchValuest}*/}
{/*></Search>*/}
{publicSearchs("请输入姓名或学号搜索",this.searchValuest,this.inputSearchValuest,this.inputSearchValuest)}
</span>
</div>
@ -3993,27 +3972,7 @@ class Listofworksstudentone extends Component {
<div className="fr">
{/*<span className="fl mr10 color-grey-6 ">计算成绩时间:{teacherdata&&teacherdata.calculation_time==null?"--": moment(teacherdata&&teacherdata.calculation_time).format('YYYY-MM-DD HH:mm')}</span>*/}
{/* { course_is_end===true?"":teacherdata&&teacherdata.task_operation[0]==="开启挑战"?"":<span>*/}
{/* {computeTimetype===true?*/}
{/* (this.props.isNotMember()===false?*/}
{/* (*/}
{/* teacherdata&&teacherdata.update_score===true?*/}
{/* <div className={"computeTime font-16"} onClick={this.setComputeTime}>*/}
{/* 查看最新成绩*/}
{/* </div>*/}
{/* :""*/}
{/* )*/}
{/* :"")*/}
{/* :*/}
{/* (teacherdata&&teacherdata.homework_status!==undefined&&teacherdata.homework_status[0]=== "未发布"? "":*/}
{/* this.props.isNotMember()===false?*/}
{/* <div className={"computeTimes font-16"}>*/}
{/* 查看最新成绩*/}
{/* </div>*/}
{/* :"")*/}
{/* }*/}
{/*</span>}*/}
</div>
@ -4238,24 +4197,7 @@ class Listofworksstudentone extends Component {
</style>
<div className="fr">
{/*<span className="fl mr10 color-grey-6 ">计算成绩时间:{teacherdata&&teacherdata.calculation_time==null?"--": moment(teacherdata&&teacherdata.calculation_time).format('YYYY-MM-DD HH:mm')}</span>*/}
{/* { course_is_end===true?"":teacherdata&&teacherdata.task_operation&&teacherdata.task_operation[0]==="开启挑战"?"":<span>*/}
{/* {computeTimetype===true?*/}
{/* (this.props.isNotMember()===false?*/}
{/* (*/}
{/* teacherdata&&teacherdata.update_score===true?*/}
{/* <div className={"computeTime font-16"} onClick={this.setComputeTime}>*/}
{/* 查看最新成绩*/}
{/* </div>:""*/}
{/* )*/}
{/* :""):*/}
{/* teacherdata&&teacherdata.homework_status!==undefined&&teacherdata.homework_status[0]=== "未发布"? "":*/}
{/* (this.props.isNotMember()===false?<div className={"computeTimes font-16"}>*/}
{/* 查看最新成绩*/}
{/* </div>:"")*/}
{/* }*/}
{/*</span>}*/}
</div>
</div>
</div>

@ -38,6 +38,7 @@ class ShixunWorkReport extends Component {
work_comment_hidden:undefined,
work_comment:undefined,
has_commit: false,
shixun_detail:[]
}
}
@ -113,7 +114,8 @@ class ShixunWorkReport extends Component {
work_comment_hidden:result.data.work_comment_hidden,
work_comment:result.data.work_comment,
spinning: false,
has_commit: result.data.has_commit
has_commit: result.data.has_commit,
shixun_detail:result.data.shixun_detail
})
}
@ -305,7 +307,7 @@ class ShixunWorkReport extends Component {
}
render() {
let {data, showAppraiseModaltype, work_comment_hidden, work_comment, has_commit} = this.state;
let {data, showAppraiseModaltype, work_comment_hidden, work_comment, has_commit,shixun_detail} = this.state;
let category_id=data===undefined?"":data.category===null?"":data.category.category_id;
let homework_common_id=data===undefined?"":data.homework_common_id;
@ -313,7 +315,8 @@ class ShixunWorkReport extends Component {
const antIcon = <Icon type="loading" style={{ fontSize: 24 }} spin />;
// let showAppraiseModals=this.props&&this.props.isAdminOrTeacher()===true?work_comment===null||work_comment===undefined?false:true:work_comment===null||work_comment===undefined?false:true;
let showAppraiseModals=work_comment===null||work_comment===undefined?false:true;
// let showAppraiseModals=work_comment===null||work_comment===undefined?false:true;
// console.log(this.props.isAdmin())
document.title=data&&data.course_name;
return (
@ -454,7 +457,20 @@ class ShixunWorkReport extends Component {
<div className="stud-class-set">
<div className="clearfix edu-back-white poll_list">
<div className="font-16 color-dark-21 shixunreporttitleboxtop pd20">总体评价</div>
<div className="font-16 color-dark-21 shixunreporttitleboxtop pd20">
<div className={"fl"}>总体评价</div>
<div className={"fr"}>
{
this.props&&this.props.isAdmin()===true?shixun_detail&&shixun_detail.map((item,key)=>{
if(key===0){
return(
<a className={"color-blue font-16"} href={/tasks/+item.game_identifier} target="_blank" >查看学员实训</a>
)
}
}):""
}
</div>
</div>
<div className="font-16 color-dark-21 shixunreporttitleboxbom pd20">
<div style={{clear:"both",height:'100px'}}>

@ -65,9 +65,15 @@ class Detailss extends Component {
position: "relative"
}}>
<div className="ws100s teacherentrydiv ">
<p className="ws100s teachedivp ymaxnamewidthdivp">
{item && item.name}
</p>
<div className="ws100s sortinxdirection">
<p className="sortinxdirection" onClick={()=>this.props.qiandaoxiangq(false)}>
<i style={{color:'#BBBBBB'}} className="iconfont icon-zuojiantou1 posiivsiconmyss mr5 colorbluesigin xiaoshou font-14" onClick={()=>this.props.qiandaoxiangq(false)}></i>
</p>
<p className="ws100s teachedivp ymaxnamewidthdivp86">
{item && item.name}
</p>
</div>
<div className="ws100s sortinxdirection mt17">
<div className="teachedivps">

@ -100,7 +100,19 @@
width: 80%;
}
.ws50s{
width: 50%;
width: 50%;
}
.ws40s{
width: 40%;
}
.ws45s{
width: 45%;
}
.ws46s{
width: 46%;
}
.ws47s{
width: 47%;
}
.hs30s{
height: 30%;
@ -211,6 +223,14 @@
white-space:nowrap;
cursor: default;
}
.ymaxnamewidthdivp86{
max-width:86%;
width: 86%;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
cursor: default;
}
.teachedivps{
font-size:14px;
font-family:Microsoft YaHei;
@ -332,6 +352,9 @@
.h40s{
line-height: 40px !important;
}
.h36s{
line-height: 36px !important;
}
.h28s{
line-height: 28px !important;
}
@ -408,6 +431,14 @@
white-space:nowrap;
cursor: default;
}
.maxnamewidth140s{
width: 140px;
max-width: 140px;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
cursor: default;
}
.maxnamewidth200s{
text-align: center;
width: 200px;
@ -425,6 +456,14 @@
white-space:nowrap;
cursor: default;
}
.maxnamewidth90s{
width: 90px;
max-width: 90px;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
cursor: default;
}
.maxnamewidth100s{
width: 100px;
max-width: 100px;
@ -440,3 +479,12 @@
.mr32{
margin-right: 32px;
}
.mr27{
margin-right: 27px;
}
.pd15s{
padding-bottom: 15px !important;
}
.ml32{
margin-left: 32px;
}

@ -43,14 +43,8 @@ class Signindetails extends Component{
<div className="ws100s" style={{
position: "relative",
}}>
<div className="ws100s mb20">
<p className="sortinxdirection" >
<i className="iconfont icon-zuojiantou posiivsiconmyss mr5 colorbluesigin xiaoshou" onClick={()=>this.props.qiandaoxiangq(false)}></i>
<p className="fh mr20 colorbluesigin xiaoshou" onClick={()=>this.props.qiandaoxiangq(false)}>正在签到</p>
</p>
</div>
<Detailss
qiandaoxiangq={(b)=>this.props.qiandaoxiangq(b)}
defaultActiveKey={this.props.defaultActiveKey}
headdata={headdata}
switattendance_id={this.props.switattendance_id}

@ -4,6 +4,8 @@ import '../signin/css/signincdi.css';
import Videostatisticscom from './component/Videostatisticscom';
import Videostatisticslist from './component/Videostatisticslist';
import Videostatisticscomtwo from './component/Videostatisticscomtwo';
import Studenticscom from './component/Studenticscom';
import Studentstatistics from './component/Studentstatistics';
//在线学习
@ -21,16 +23,23 @@ class Videostatistics extends Component{
}
componentDidMount() {
this.togetdatas();
const myisAdmin= this.props&& this.props.isAdmin();
if(myisAdmin===true){
this.togetdatas();
}else{
this.togetdataStudent();
}
}
details=()=>{
}
togetdatas(){
console.log("视频统计老师");
const CourseId=this.props.match.params.coursesId;
let url=`/courses/${CourseId}/watch_statics.json`;
axios.get(url).then((response) => {
axios.get(url,{params: {all:true}}).then((response) => {
if(response){
this.setState({
watch_staticsdata:response.data,
@ -44,6 +53,24 @@ class Videostatistics extends Component{
});
}
togetdataStudent(){
console.log("视频统计学生数据");
const CourseId=this.props.match.params.coursesId;
let url=`/courses/${CourseId}/watch_statics.json`;
axios.get(url).then((response) => {
if(response){
this.setState({
watch_staticsdata:response.data,
})
}
}).catch((error) => {
});
}
tisticsbools=(bool,id,mytitle)=>{
this.setState({
tisticsbool:bool,
@ -55,6 +82,7 @@ class Videostatistics extends Component{
render(){
let {watch_staticsdata,tisticsbool,tisid,mytitle}= this.state;
const isAdmin = this.props&& this.props.isAdmin();
return(
<React.Fragment>
@ -64,24 +92,22 @@ class Videostatistics extends Component{
<div className="ws100s" style={{
position: "relative",
}}>
<div className="ws100s " style={{
position: "absolute",
top: "-29px",
}}>
<p className="sortinxdirection" >
<i className="iconfont icon-zuojiantou posiivsiconmyss mr5 colorbluesigin xiaoshou" onClick={()=>this.props.statisticsy(false)}></i>
<p className="fh mr20 colorbluesigin xiaoshou" onClick={()=>this.props.statisticsy(false)}>返回</p>
</p>
{
isAdmin?
<Videostatisticscom {...this.state} {...this.props} watch_staticsdata={watch_staticsdata} statisticsy={(b)=>this.props.statisticsy(b)}></Videostatisticscom>
:
<Studenticscom {...this.state} {...this.props} watch_staticsdata={watch_staticsdata} statisticsy={(b)=>this.props.statisticsy(b)}></Studenticscom>
</div>
<Videostatisticscom {...this.state} {...this.props} watch_staticsdata={watch_staticsdata} ></Videostatisticscom>
}
<div>
<Videostatisticslist {...this.state} {...this.props} tisticsbools={(b,id,t)=>this.tisticsbools(b,id,t)}></Videostatisticslist>
{ isAdmin?
<Videostatisticslist {...this.state} {...this.props} tisticsbools={(b,id,t)=>this.tisticsbools(b,id,t)}></Videostatisticslist>
:
<Studentstatistics {...this.state} {...this.props} tisticsbools={(b,id,t)=>this.tisticsbools(b,id,t)}></Studentstatistics>
}
</div>

@ -0,0 +1,108 @@
import React, {Component} from "react";
import '../../signin/css/signincdi.css';
import {Progress, message} from 'antd';
import {getImageUrl} from 'educoder';
import axios from 'axios';
//条目
class Studenticscom extends Component {
//条目组件
constructor(props) {
super(props);
this.state = {}
}
componentDidMount() {
}
componentDidUpdate = (prevProps) => {
}
render() {
return (
<React.Fragment>
<div className="ws100s edu-back-white sortinxdirection" style={{
position: "relative"
}}>
<div className="ws100s teacherentrydivss ">
<div className="ws100s sortinxdirection">
<p className="sortinxdirection h40s" onClick={()=>this.props.statisticsy(false)} >
<i className="iconfont icon-zuojiantou1 font-14 posiivsiconmyss mr5 colorbluesigin xiaoshou h36s" style={{color:'#BBBBBB'}} onClick={()=>this.props.statisticsy(false)} ></i>
</p>
<div className="ws47s sptits font-18" style={{
color:"#333333"
}}><span className="ml10">视频统计总览</span></div>
<div className="ws50s sptitss xaxisreverseorder">播放数据从{this.props.watch_staticsdata&&this.props.watch_staticsdata.begin_at?this.props.watch_staticsdata.begin_at:0}开始统计</div>
</div>
<style>
{
`
.yslsprenshu{
background-image: url(${getImageUrl(`images/qiandao/studentbz1.png`)});
background-repeat:no-repeat;
-moz-background-size:100% 100%;
background-size:100% 100%;
}
.yslspcishu{
background-image: url(${getImageUrl(`images/qiandao/studentbz2.png`)});
background-repeat:no-repeat;
-moz-background-size:100% 100%;
background-size:100% 100%;
}
.yslshipingshi{
background-image: url(${getImageUrl(`images/qiandao/studentbz3.png`)});
background-repeat:no-repeat;
-moz-background-size:100% 100%;
background-size:100% 100%;
}
`
}
</style>
<div className="ws100s spacearound mt10">
<div className="yslsprenshu mr30" style={{width:260,height:100}}>
<div className="ws100s verticallayout tbrt">
<div className="ws100s ts">观看总次数</div>
<div className="ws100s tss">{this.props.watch_staticsdata&&this.props.watch_staticsdata.freq?this.props.watch_staticsdata.freq:0}</div>
</div>
</div>
<div className="yslspcishu mr30" style={{width:260,height:100}}>
<div className="ws100s verticallayout tbrt">
<div className="ws100s ts">观看总个数</div>
<div className="ws100s tss">{this.props.watch_staticsdata&&this.props.watch_staticsdata.num?this.props.watch_staticsdata.num:0}</div>
</div>
</div>
<div className="yslshipingshi" style={{width:260,height:100}}>
<div className="ws100s verticallayout tbrt">
<div className="ws100 ts">总观看时长</div>
<div className="ws100s tss">{this.props.watch_staticsdata&&this.props.watch_staticsdata.total_duration?this.props.watch_staticsdata.total_duration:0}</div>
</div>
</div>
</div>
</div>
</div>
</React.Fragment>
)
}
}
export default Studenticscom;

@ -0,0 +1,318 @@
import React, {Component} from "react";
import '../../signin/css/signincdi.css';
import {Pagination,Table,Spin} from 'antd';
import {getImageUrl,sortDirections,formatSeconds} from 'educoder';
import axios from 'axios';
import LoadingSpin from "../../../../common/LoadingSpin";
import NoneDatas from "../../signin/component/NoneDatas";
//条目
class Studentstatistics extends Component {
//条目组件
constructor(props) {
super(props);
this.state = {
columnsstu: [
{
title: '序号',
dataIndex: 'number',
key: 'number',
align: "center",
className: 'font-14',
width: '90px',
render: (text, record) => (
<span style={{width: '90px'}}>{record.number}</span>
),
},
{
title: '视频名称',
dataIndex: 'title',
key: 'title',
align: "center",
className: 'font-14 maxnamewidth150s',
width: '150px',
render: (text, record) => (
<span style={{width: '150px'}} className="maxnamewidth150s">
<a className="maxnamewidth150s" style={{
color:"#333333"
}} title={record.title}>{record.title}</a>
</span>
),
},
{
title: '观看次数(次)',
dataIndex: 'feq',
key: 'feq',
align: "center",
className: 'font-14',
width: '98px',
sorter: true,
sortDirections: sortDirections,
render: (text, record) => (
<span style={{width: '98px'}}>{record.feq}</span>
),
},
{
title: '观看时长',
dataIndex: 'total_duration',
key: 'total_duration',
align: "center",
className: 'font-14 maxnamewidth100s',
width: '100px',
sorter: true,
sortDirections: sortDirections,
render: (text, record) => (
<span style={{width: '100px'}} className="maxnamewidth100s">
<a className="maxnamewidth100s" style={{
color:"#333333"
}} title={record.total_duration}>{record.total_duration}</a>
</span>
),
},
{
title: '发布人',
dataIndex: 'user_name',
key: 'user_name',
align: "center",
className: 'font-14 maxnamewidth100s',
width: '100px',
render: (text, record) => (
<span style={{width: '100px'}} className="maxnamewidth100s">
<a className="maxnamewidth100s" style={{
color:"#333333"
}} title={record.user_name}>{record.user_name}</a>
</span>
),
},
{
title: '是否看完',
dataIndex: 'is_finished',
key: 'is_finished',
align: "center",
className: 'font-14',
width: '90px',
render: (text, record) => (
<span style={{width: '90px'}}>{record.is_finished === true ?
<span style={{color: "#5091FF"}}></span> : <span style={{color: "#E02020"}}></span>}</span>
),
},
],
loading:false,
data:[],
page:1,
limit:20,
members_count:0,
order:undefined,
}
}
componentDidMount() {
let data={
page:1,
order:this.state.order
}
this.togetdatas(data);
}
componentDidUpdate = (prevProps) => {
}
paginationonChange = (pageNumber) => {
this.setState({
page: pageNumber,
})
let data={
page:pageNumber,
order:this.state.order
}
this.togetdatas(data);
}
togetdatas(data){
this.setState({
loading:true
})
const CourseId=this.props.match.params.coursesId;
let url=`/courses/${CourseId}/own_watch_histories.json`;
axios.get(url,{params:data
}).then((response) => {
if (response) {
if (response.data) {
if (response.data.data.length > 0) {
let datalists = [];
for (var i = 0; i < response.data.data.length; i++) {
datalists.push({
number: (parseInt(this.state.page) - 1) * parseInt(this.state.limit) + (i + 1),
title: response.data.data[i].title,
user_name: response.data.data[i].user_name,
is_finished: response.data.data[i].is_finished,
total_duration:response.data.data[i].total_duration?formatSeconds(response.data.data[i].total_duration):0,
feq:response.data.data[i].feq,
start_at:response.data.data[i].start_at,
end_at:response.data.data[i].end_at,
})
}
this.setState({
data: datalists,
members_count: response.data.count,
})
} else {
this.setState({
data: [],
members_count: response.data.count,
})
}
} else {
this.setState({
data: [],
members_count: response.data.count,
})
}
}
this.setState({
loading:false
})
}).catch((error) => {
this.setState({
loading:false
})
});
}
//实训作业tbale 列表塞选数据
table1handleChange = (pagination, filters, sorter) => {
if (JSON.stringify(sorter) === "{}") {
//没有选择
} else {
try {
//学生学号排序
if (sorter.columnKey === "feq"||sorter.columnKey === "total_duration") {
let mysorder="";
if (sorter.order === "ascend") {
if(sorter.columnKey === "feq"){
mysorder="feq-asc";
}else{
mysorder="total_duration-asc";
}
//升序
let data={
page:this.state.page,
order:mysorder
}
this.togetdatas(data);
this.setState({
order: mysorder,
})
} else if (sorter.order === "descend") {
if(sorter.columnKey === "feq"){
mysorder="feq-desc";
}else{
mysorder="total_duration-desc";
}
//降序
let data={
page:this.state.page,
order:mysorder
}
this.togetdatas(data);
this.setState({
order: mysorder,
})
}
}
} catch (e) {
}
}
}
render() {
let {loading,data,columnsstu,page,members_count,limit}=this.state;
return (
<React.Fragment>
<div className="ws100s mt20">
<div className="ws100s edu-back-white">
<div className="ws100s teacherentrydivss pd15s">
<div className="ws100s sortinxdirection">
<div className="ws100s sptits font-18">统计列表</div>
</div>
</div>
<style>
{
`
.ysltableo .ant-table-thead > tr > th, .ant-table-tbody > tr > td {
padding: 10px 10px;
}
`
}
</style>
<div className="ws100s ysltableo teacherentrydivs pdinstop0" style={{ minHeight: "400px"}}>
{
data&&data.length===0?
<div style={{
minHeight: "400px",
}} className="ws100s">
<NoneDatas></NoneDatas>
</div>
: data&&data.length>0?
<Spin spinning={loading}>
<Table
columns={columnsstu}
dataSource={data}
pagination={false}
onChange={this.table1handleChange}
/>
</Spin>:
<div style={{
minHeight: "400px",
}} className="ws100s">
<NoneDatas></NoneDatas>
</div>
}
</div>
</div>
<div className="mb30 clearfix educontent mt40 intermediatecenter">
{
data&&data.length>0?
<Pagination showQuickJumper current={this.state.page} onChange={this.paginationonChange}
pageSize={this.state.limit}
total={this.state.members_count}></Pagination>
:""
}
</div>
</div>
</React.Fragment>
)
}
}
export default Studentstatistics;

@ -35,7 +35,12 @@ class Videostatisticscom extends Component {
}}>
<div className="ws100s teacherentrydivss ">
<div className="ws100s sortinxdirection">
<div className="ws50s sptits">视频统计总览</div>
<p className="sortinxdirection h40s" onClick={()=>this.props.statisticsy(false)} >
<i className="iconfont icon-zuojiantou1 font-14 posiivsiconmyss mr5 colorbluesigin xiaoshou h36s" style={{color:'#BBBBBB'}} onClick={()=>this.props.statisticsy(false)} ></i>
</p>
<div className="ws47s sptits font-18" style={{
color:"#333333"
}}><span className="ml10">视频统计总览</span></div>
<div className="ws50s sptitss xaxisreverseorder">播放数据从{this.props.watch_staticsdata&&this.props.watch_staticsdata.begin_at?this.props.watch_staticsdata.begin_at:0}开始统计</div>
</div>
<style>
@ -63,17 +68,17 @@ class Videostatisticscom extends Component {
`
}
</style>
<div className="ws100s spacearound mt20">
<div className="yslsprenshu" style={{width:260,height:100}}>
<div className="ws100s spacearound mt10">
<div className="yslsprenshu mr30" style={{width:260,height:100}}>
<div className="ws100s verticallayout tbrt">
<div className="ws100s ts">观看总人数</div>
<div className="ws100s tss">{this.props.watch_staticsdata&&this.props.watch_staticsdata.people_num?this.props.watch_staticsdata.people_num:0}</div>
<div className="ws100s tss">{this.props.watch_staticsdata&&this.props.watch_staticsdata.num?this.props.watch_staticsdata.num:0}</div>
</div>
</div>
<div className="yslspcishu" style={{width:260,height:100}}>
<div className="yslspcishu mr30" style={{width:260,height:100}}>
<div className="ws100s verticallayout tbrt">
<div className="ws100s ts">观看总人次</div>
<div className="ws100s tss">{this.props.watch_staticsdata&&this.props.watch_staticsdata.freq?this.props.watch_staticsdata.freq:0}</div>

@ -5,6 +5,7 @@ import {getImageUrl, sortDirections,formatSeconds} from 'educoder';
import axios from 'axios';
import LoadingSpin from "../../../../common/LoadingSpin";
import NoneDatas from "../../signin/component/NoneDatas";
import moment from 'moment';
//条目
@ -52,9 +53,9 @@ class Videostatisticscomtwo extends Component {
key: 'is_finished',
align: "center",
className: 'font-14',
width: '98px',
width: '90px',
render: (text, record) => (
<span style={{width: '98px'}}>{record.is_finished === true ?
<span style={{width: '90px'}}>{record.is_finished === true ?
<span style={{color: "#5091FF"}}></span> : <span style={{color: "#E02020"}}></span>}</span>
),
},
@ -63,12 +64,12 @@ class Videostatisticscomtwo extends Component {
dataIndex: 'total_duration',
key: 'total_duration',
align: "center",
className: 'font-14 maxnamewidth150s',
width: '150px',
className: 'font-14 maxnamewidth140s',
width: '140px',
sorter: true,
sortDirections: sortDirections,
render: (text, record) => (
<span style={{width: '150px'}} className="maxnamewidth150s"><a className="maxnamewidth150s" style={{
<span style={{width: '140px'}} className="maxnamewidth140s"><a className="maxnamewidth140s" style={{
color:"#333333"
}} title={record.total_duration}>{record.total_duration}</a></span>
),
@ -78,13 +79,13 @@ class Videostatisticscomtwo extends Component {
dataIndex: 'feq',
key: 'feq',
align: "center",
className: 'font-14 maxnamewidth100s',
width: '100px',
className: 'font-14 maxnamewidth140s',
width: '140px',
sorter: true,
sortDirections: sortDirections,
render: (text, record) => (
<span style={{width: '100px'}} className="maxnamewidth100s">
<a className="maxnamewidth100s" style={{
<span style={{width: '140px'}} className="maxnamewidth140s">
<a className="maxnamewidth140s" style={{
color:"#333333"
}} title={record.feq}>{record.feq}</a>
</span>
@ -95,13 +96,13 @@ class Videostatisticscomtwo extends Component {
dataIndex: 'start_at',
key: 'start_at',
align: "center",
className: 'font-14 maxnamewidth100s',
width: '100px',
className: 'font-14 maxnamewidth90s',
width: '90px',
render: (text, record) => (
<span style={{width: '100px'}} >
<a className="maxnamewidth100s" style={{
<span style={{width: '90px'}} >
<a className="maxnamewidth90s" style={{
color:"#333333"
}} title= {record.start_at}> {record.start_at}</a>
}} title= {moment(record.start_at).format('YYYY-MM-DD HH:mm:ss')}> {record.start_at}</a>
</span>
),
},
@ -110,13 +111,13 @@ class Videostatisticscomtwo extends Component {
dataIndex: 'end_at',
key: 'end_at',
align: "center",
className: 'font-14 maxnamewidth100s',
width: '100px',
className: 'font-14 maxnamewidth90s',
width: '90px',
render: (text, record) => (
<span style={{width: '100px'}} >
<a className="maxnamewidth100s" style={{
<span style={{width: '90px'}} >
<a className="maxnamewidth90s" style={{
color:"#333333"
}} title= {record.end_at}>{record.end_at}</a>
}} title={moment(record.end_at).format('YYYY-MM-DD HH:mm:ss')}>{record.end_at}</a>
</span>
),
}
@ -203,7 +204,7 @@ class Videostatisticscomtwo extends Component {
number: (parseInt(this.state.page) - 1) * parseInt(this.state.limit) + (i + 1),
user_name: response.data.data[i].user_name,
is_finished: response.data.data[i].is_finished,
total_duration: response.data.data[i].total_duration,
total_duration: response.data.data[i].total_duration?formatSeconds(response.data.data[i].total_duration):0,
feq: response.data.data[i].feq,
start_at: response.data.data[i].start_at,
end_at: response.data.data[i].end_at,
@ -291,10 +292,24 @@ class Videostatisticscomtwo extends Component {
}
} else {
data = {
id: CourseId,
page: this.state.page
try {
if(id!==null&&id===0){
data = {
id: CourseId,
page: this.state.page,
group_id: id
}
}else{
data = {
id: CourseId,
page: this.state.page
}
}
}catch (e) {
}
}
this.getdatas(data);
}
@ -443,7 +458,19 @@ class Videostatisticscomtwo extends Component {
mytitle=this.props&&this.props.mytitle;
}else{
mytitle=this.state.data[0].title;
if(this.state.data){
if(this.state.data.length>0){
try {
if(this.state.data[0].title){
mytitle=this.state.data[0].title;
}
}catch (e) {
}
}
}
}
return (
@ -451,14 +478,14 @@ class Videostatisticscomtwo extends Component {
<div className="ws100s">
<div className="ws100s teacherentrydivss edu-back-white ">
<div className="ws100s sortinxdirection">
<div className="ws50s sptits">{mytitle}</div>
<div className="ws50s sptits font-18">{mytitle}</div>
<div className="ws50s sptitss xaxisreverseorder font-14" style={{
color: "#5091FF",
lineHeight: "42px",
}}>
{
isAdmin === true ?
<div className="xiaoshou" onClick={() => this.props.tisticsbools(false, null)}>
<div className="xiaoshou ml32" onClick={() => this.props.tisticsbools(false, null)}>
<span className="mr5 xiaoshou">视频统计总览</span><i className="iconfont icon-fanhui font-13 xiaoshou"></i>
</div>
:""
@ -468,14 +495,14 @@ class Videostatisticscomtwo extends Component {
isAdmin === true ?
<div className="xiaoshou" onClick={() => this.fenbanone()}>
<Dropdown getPopupContainer={trigger => trigger.parentNode} overlay={menu}
placement="bottomCenter">
placement="bottomLeft">
<span>
<span className="mr5 xiaoshou">分班</span>
{
fbbool === true ?
<i className="iconfont icon-sanjiaoxing-up font-13 mr32 xiaoshou"></i>
<i className="iconfont icon-sanjiaoxing-up font-13 xiaoshou"></i>
:
<i className="iconfont icon-sanjiaoxing-down font-13 mr32 xiaoshou"></i>
<i className="iconfont icon-sanjiaoxing-down font-13 xiaoshou"></i>
}
</span>
</Dropdown>
@ -492,7 +519,7 @@ class Videostatisticscomtwo extends Component {
{
`
.ysltableo .ant-table-thead > tr > th, .ant-table-tbody > tr > td {
padding: 10px 10px;
padding: 10px 5px;
}
`
}

@ -152,7 +152,7 @@ class Videostatisticslist extends Component {
number: (parseInt(this.state.page) - 1) * parseInt(this.state.limit) + (i + 1),
title: response.data.videos[i].title,
people_num: response.data.videos[i].people_num,
total_time: response.data.videos[i].total_time,
total_time: response.data.videos[i].total_time?formatSeconds(response.data.videos[i].total_time):0,
user_name: response.data.videos[i].user_name,
id: response.data.videos[i].id,
})
@ -250,9 +250,9 @@ class Videostatisticslist extends Component {
<React.Fragment>
<div className="ws100s mt20">
<div className="ws100s edu-back-white">
<div className="ws100s teacherentrydivss ">
<div className="ws100s teacherentrydivss pd15s">
<div className="ws100s sortinxdirection">
<div className="ws100s sptits">统计详情</div>
<div className="ws100s sptits font-18">统计列表</div>
</div>
</div>
@ -268,13 +268,13 @@ class Videostatisticslist extends Component {
<div className="ws100s ysltableo teacherentrydivs pdinstop0" style={{ minHeight: "400px"}}>
{
data.length===0?
data&&data.length===0?
<div style={{
minHeight: "400px",
}} className="ws100s">
<NoneDatas></NoneDatas>
</div>
:
: data&&data.length>0?
<Spin spinning={loading}>
<Table
columns={columnsstu}
@ -284,6 +284,12 @@ class Videostatisticslist extends Component {
/>
</Spin>
:
<div style={{
minHeight: "400px",
}} className="ws100s">
<NoneDatas></NoneDatas>
</div>
}

@ -30,6 +30,12 @@
<div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe73a;</span>
<div class="name">返回左键头</div>
<div class="code-name">&amp;#xe73a;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe739;</span>
<div class="name">返回</div>
@ -2090,6 +2096,15 @@
<div class="content font-class">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-zuojiantou1"></span>
<div class="name">
返回左键头
</div>
<div class="code-name">.icon-zuojiantou1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-fanhui"></span>
<div class="name">
@ -5134,6 +5149,14 @@
<div class="content symbol">
<ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-zuojiantou1"></use>
</svg>
<div class="name">返回左键头</div>
<div class="code-name">#icon-zuojiantou1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-fanhui"></use>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -5,6 +5,13 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "13511742",
"name": "返回左键头",
"font_class": "zuojiantou1",
"unicode": "e73a",
"unicode_decimal": 59194
},
{
"icon_id": "13458315",
"name": "返回",

@ -20,6 +20,9 @@ Created by iconfont
/>
<missing-glyph />
<glyph glyph-name="zuojiantou1" unicode="&#59194;" d="M832.503909-127.983381a63.919062 63.919062 0 0 0-38.990629 12.144622L151.765893 340.543347a51.13525 51.13525 0 0 0 0 85.651544l639.190625 457.021297a67.754206 67.754206 0 0 0 87.569116-8.309479 50.496059 50.496059 0 0 0-9.58786-77.342065L289.831068 383.369119l581.663469-412.277953a50.496059 50.496059 0 0 0 9.587859-77.342066 63.919062 63.919062 0 0 0-48.578487-21.732481z" horiz-adv-x="1024" />
<glyph glyph-name="fanhui" unicode="&#59193;" d="M590.769231-107.362462H315.076923c-31.507692 0-63.015385 23.630769-63.015385 63.015385s23.630769 63.015385 63.015385 63.015385h275.692308c259.938462 0 378.092308 7.876923 378.092307 252.061538s-118.153846 252.061538-378.092307 252.061539H315.076923c-31.507692 0-63.015385 23.630769-63.015385 63.015384s31.507692 55.138462 63.015385 55.138462h275.692308c228.430769 0 496.246154 0 496.246154-378.092308s-267.815385-370.215385-496.246154-370.215385zM47.261538 514.914462l259.938462-196.923077c39.384615-23.630769 86.646154-15.753846 110.276923 15.753846 7.876923 15.753846 15.753846 31.507692 15.753846 47.261538v393.846154c0 47.261538-31.507692 78.769231-78.769231 78.769231-15.753846 0-31.507692-7.876923-47.261538-15.753846l-259.938462-196.923077c-39.384615-31.507692-47.261538-78.769231-15.753846-110.276923 0-7.876923 7.876923-15.753846 15.753846-15.753846z" horiz-adv-x="1102" />

Before

Width:  |  Height:  |  Size: 410 KiB

After

Width:  |  Height:  |  Size: 410 KiB

Loading…
Cancel
Save