diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index ee59dc8b5..57f335541 100644 --- a/app/controllers/managements_controller.rb +++ b/app/controllers/managements_controller.rb @@ -611,59 +611,46 @@ end def classroom @menu_type = 2 @sub_type = 1 - @syllabus = Syllabus.where("0=0") + @courselist = CourseList.where("0=0") @sx_order = params[:sx_order].blank? ? "desc" : params[:sx_order] - # major_level_option = params[:major_level] if params[:major_level] - # discipline_category_option = params[:discipline_category_id] if params[:discipline_category_id] - # first_level_discipline_option = params[:first_level_discipline_id] if params[:first_level_discipline_id] - # syllabus_major_option = params[:major_id] if params[:major_id] keyword = params[:keyword] search = params[:search] - # if major_level_option && major_level_option != '0' - # @syllabus = @syllabus.where(:major_level=>major_level_option) - # end - # - # if discipline_category_option && discipline_category_option != '0' - # @syllabus=@syllabus.where(:discipline_category_id=>discipline_category_option) - # end - # - # if first_level_discipline_option && first_level_discipline_option != '0' - # @syllabus=@syllabus.where(:first_level_discipline_id=>first_level_discipline_option) - # end - # - # if syllabus_major_option && syllabus_major_option != '0' - # @syllabus=@syllabus.where(:major_id=>syllabus_major_option) - # end - - # if params[:school_id] && params[:school_id] != '' - # @syllabus = @syllabus.includes(:user => {:user_extensions => []}).where("user_extensions.school_id = #{params[:school_id]}") - # end - + if params[:support_shixuns_search_title] + @courselist = @courselist.where(:support_shixuns_search => params[:support_shixuns_search_title].to_i) + end if search.blank? - @syllabus = @syllabus + @courselist = @courselist else if "u_name" == keyword user_id = User.where("concat(lastname, firstname) like '%#{search}%'") - @syllabus = @syllabus.includes(:user).where("concat(users.lastname, users.firstname) like '%#{search}%'") + @courselist = @courselist.includes(:user).where("concat(users.lastname, users.firstname) like '%#{search}%'") else - @syllabus= @syllabus.where("title like '%#{search}%'") + @courselist= @courselist.where("name like '%#{search}%'") end end - - @syllabus = @syllabus.order("syllabuses.created_at #{@sx_order}") - @syllabus_count = @syllabus.count + @courselist_count = @courselist.count limit = 20 @is_remote = true - @syllabus_pages = Paginator.new @syllabus_count, limit, params['page'] || 1 - @offset ||= @syllabus_pages.offset - @syllabus = paginateHelper @syllabus, limit + @courselist_pages = Paginator.new @courselist_count, limit, params['page'] || 1 + @offset ||= @courselist_pages.offset + @courselist = paginateHelper @courselist, limit + + # @courselist = @courselist.order("courselist.created_at #{@sx_order}") respond_to do |format| format.js format.html end end + # 支撑实训检索 + def support_shixuns_search + if params[:shixun_id] + courselist = CourseList.find params[:shixun_id] + courselist.update_attributes(:support_shixuns_search => !courselist.support_shixuns_search) + end + end + # 课堂列表 def classroom_classment @menu_type = 2 @@ -679,6 +666,7 @@ end @search = params[:search] # 搜索字 @keyword = params[:keyword].blank? ? "u_name" : params[:keyword] # 根据姓名/课程名搜索 status = params[:status].to_i + courselist = params[:course_list] if params[:school_id] && params[:school_id] != '' @school_id = params[:school_id] @@ -689,6 +677,9 @@ end @courses = @courses.where(:homepage_show => params[:homepage_show].to_i) end + if params[:course_list] + @courses = @courses.where(:course_list_id => courselist) + end if params[:status] && params[:status]!='' @status = params[:status] @courses =@courses.where(:is_end =>status) @@ -813,7 +804,7 @@ end # 0 全部;1 活动的; 2 已注册; 3 锁定 def users - @menu_type =7 + @menu_type @sub_type = 1 status = params[:user_status].nil? ? 0 : params[:user_status].to_i @us_order = params[:us_order].blank? ? "desc" : params[:us_order] # 排序 @@ -832,9 +823,13 @@ end @users = User.where("status = #{status} and #{condition} like '%#{params[:research_contents]}%'").order("#{@order_key} #{@us_order}").all end end - # if params[:school_id] && params[:school_id] !='' - # @users = @users.find(params[:school_id]) - # end + + school_name = params[:school] + school = School.where("name like '%#{school_name}%'") + school_id = school.map(&:id) + user_id = UserExtensions.where(:school_id => school_id).map(&:user_id) + @users = User.where(:id => user_id) + @users_count = @users.count @limit = 20 @is_remote = true @@ -964,7 +959,7 @@ end def users_trial @menu_type = 7 @sub_type = 2 - @users = User.where(:status => 1).order("created_on desc").all + @users = User.where(:status => 1).order("last_login_on desc").all @users_count = @users.count @limit = 20 @is_remote = true @@ -1161,7 +1156,9 @@ end @type = trial_authorization_status(params[:type]) type = params[:type] || 0 # 存在type 就用type 没有就为 0 user_id = User.find_by_sql("select id from users where concat(lastname,firstname) like '%#{params[:name]}%'") - @unapproved_user = ApplyUserAuthentication.where(:status => @type, :user_id => user_id, :auth_type => 1).order("updated_at desc") + + @unapproved_user = ApplyUserAuthentication.where(:status => @type, :user_id => user_id, :auth_type => 1).find_by_sql("SELECT s.*, TIMESTAMPDIFF(SECOND, s.updated_at, now()) diff FROM `apply_user_authentications` s order by diff asc") + # @unapproved_user = ApplyUserAuthentication.where(:status => @type, :user_id => user_id, :auth_type => 1).order("updated_at desc") respond_to do |format| format.html format.js @@ -1174,7 +1171,8 @@ end @type = trial_authorization_status(params[:type]) type = params[:type] || 0 # 存在type 就用type 没有就为 0 user_id = User.find_by_sql("select id from users where concat(lastname,firstname) like '%#{params[:name]}%'") - @unapproved_user = ApplyUserAuthentication.where(:status => @type, :user_id => user_id, :auth_type => 2).order("updated_at desc") + @unapproved_user = ApplyUserAuthentication.where(:status => @type, :user_id => user_id, :auth_type => 2).find_by_sql("SELECT s.*, TIMESTAMPDIFF(SECOND, s.updated_at, now()) diff FROM `apply_user_authentications` s order by diff asc") + # @unapproved_user = ApplyUserAuthentication.where(:status => @type, :user_id => user_id, :auth_type => 2).order("updated_at desc") respond_to do |format| format.html format.js @@ -1316,4 +1314,26 @@ end format.js end end + + # 课程删除 + before_filter :find_courselist, :only => [:destroy] + + # 课程列表的删除 + def destroy + if @courselist + CourseList.where(:id => @courselist.id).destroy_all + respond_to do |format| + format.js + end + end + end + private + # Find courselist of id params[:id] + def find_courselist + @courselist = CourseList.find_by_id(params[:id]) + render_404 if @courselist.nil? + rescue ActiveRecord::RecordNotFound + render_404 + end + end diff --git a/app/models/course_list.rb b/app/models/course_list.rb index acafeb37e..33ef6ca47 100644 --- a/app/models/course_list.rb +++ b/app/models/course_list.rb @@ -3,5 +3,5 @@ class CourseList < ActiveRecord::Base has_many :shixun_major_courses has_many :courses belongs_to :user - attr_accessible :name, :user_id, :is_admin + attr_accessible :name, :user_id, :is_admin,:support_shixuns_search end diff --git a/app/views/courses/index.html.erb b/app/views/courses/index.html.erb index 49dd1a06e..ae4fb1db9 100644 --- a/app/views/courses/index.html.erb +++ b/app/views/courses/index.html.erb @@ -1,14 +1,23 @@
-
-

在线课堂

+
+

+ + +

+

+ 在线课堂 +

+

+ One who is anxious to learn, can always learn from others. +

  • <%= @syllabuses_num %>
    全部
  • <%= @create_syllabuses_count + @join_syllabuses_count %>
    我的课堂
  • - <%= link_to "+ 新建".html_safe, new_course_path, :class => "color-light-green fr font-16" , :style => "line-height:56px"%> - <%= link_to "+ 加入课堂".html_safe, join_private_courses_courses_path, :remote => true, :method => "post", :class => "color-light-green fr mr30 font-16" , :style => "line-height:56px" %> + <%= link_to "+ 新建".html_safe, new_course_path, :class => "fr font-16 white-btn orange-btn mt10" %> + <%= link_to "+ 加入课堂".html_safe, join_private_courses_courses_path, :remote => true, :method => "post", :class => "fr mr30 font-16 white-btn orange-btn mt10" %>
@@ -37,9 +46,9 @@
<%= render :partial => 'layouts/public_left_info' %> - - +<%= javascript_include_tag 'edu/shixun_course_path' %> - +
<% is_current_user = User.current.logged? && User.current == @user %> diff --git a/app/views/managements/_classroom_classment_list.html.erb b/app/views/managements/_classroom_classment_list.html.erb index 7b3dfeffe..7e5228a32 100644 --- a/app/views/managements/_classroom_classment_list.html.erb +++ b/app/views/managements/_classroom_classment_list.html.erb @@ -32,7 +32,7 @@ 删除 class="ml-3 mr5 magic-checkbox" id="join_course_role_<%= course.id %>"> - + <% end %> diff --git a/app/views/managements/_classroom_list.html.erb b/app/views/managements/_classroom_list.html.erb index c005118e3..cfece390d 100644 --- a/app/views/managements/_classroom_list.html.erb +++ b/app/views/managements/_classroom_list.html.erb @@ -15,37 +15,44 @@ - <% @syllabus.each_with_index do |syllabus,index| %> - + <% @courselist.each_with_index do |courselist, index| %> + <%= index + 1 %> - <%= link_to syllabus.title,syllabus_path(syllabus.id) %> + <%= link_to courselist.name,course_path(courselist.id) %> - <%= syllabus.courses.count %> + <%= courselist.courses.count %> - <%= %> + <%= ShixunMajorCourse.where(:course_list_id => courselist.id).map(&:shixun_id).count %> - <%= link_to syllabus.user.show_real_name, user_path(syllabus.user) %> - <%= format_time syllabus.created_at %> - 删除 - - + <%= courselist.user.try(:show_real_name) %> + + <%= format_time courselist.created_at %> + + <% if courselist.courses.count != 0 || ShixunMajorCourse.where(:course_list_id => courselist.id).map(&:shixun_id).count !=0 %> + -- + <% else %> + 删除  + <% end %> + class="ml-3 mr5 magic-checkbox" id="join_course_role_<%= courselist.id %>"> + <% end %> +
    - <%= pagination_links_full @syllabus_pages, @syllabus_count, :per_page_links => false, :remote => false, :flag => true, :is_new => true %> + <%= pagination_links_full @courselist_pages, @courselist_count, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true %>
@@ -61,5 +68,14 @@ dateType: "script" }); }); + $("input[name='support_shixuns_search']").click(function(){ + var support_shixuns_search_val = $(this).val(); + $.ajax({ + url:"<%= support_shixuns_search_managements_path %>", + data: {shixun_id: support_shixuns_search_val}, + type: 'post', + dateType: "script" + }); + }) diff --git a/app/views/managements/_depart_list.html.erb b/app/views/managements/_depart_list.html.erb index 2e0d468cc..710cf1e32 100644 --- a/app/views/managements/_depart_list.html.erb +++ b/app/views/managements/_depart_list.html.erb @@ -26,7 +26,7 @@ <% else %> - <%= render :partial => "welcome/no_data" %> + <%= render :partial => "welcome/management_no_data" %> <% end %>
diff --git a/app/views/managements/_departments_list.html.erb b/app/views/managements/_departments_list.html.erb index b3214c42c..ea74fe88f 100644 --- a/app/views/managements/_departments_list.html.erb +++ b/app/views/managements/_departments_list.html.erb @@ -21,9 +21,9 @@ <%= format_time department.created_at %> <% if UserExtensions.where(:department_id => department.id,:school_id => department.school_id ).count == 0 %> - 删除  + 删除  <% else %> - -- + -- <% end %> <%= link_to '更改', update_department_managements_path(:school_id=> department.school_id,:department_id => department.department_id), :remote => true, :class => "application-default-link" %> diff --git a/app/views/managements/_unit_list.html.erb b/app/views/managements/_unit_list.html.erb index ed0fced9a..067fe0351 100644 --- a/app/views/managements/_unit_list.html.erb +++ b/app/views/managements/_unit_list.html.erb @@ -83,9 +83,8 @@ <% else %> - <%= render :partial => "welcome/no_data" %> + <%= render :partial => "welcome/management_no_data" %> <% end %> -
    diff --git a/app/views/managements/_users_authorization_list.html.erb b/app/views/managements/_users_authorization_list.html.erb index f4ba918d8..842dcdbd6 100644 --- a/app/views/managements/_users_authorization_list.html.erb +++ b/app/views/managements/_users_authorization_list.html.erb @@ -11,6 +11,7 @@ 职业 单位 子单位 + 最后登录时间 试用状态 @@ -34,6 +35,7 @@ <%= user.professional_certification ? "已认证" : "未认证" %> <%= user.try(:user_extensions).try(:school).try(:name).blank? ? "--" : user.try(:user_extensions).try(:school) %> <%= user.try(:user_extensions).department ? user.try(:user_extensions).try(:department).try(:name).to_s : '--' %> + <%= user.last_login_on.blank? ? "--" : (format_time user.last_login_on) %> <%= identity_authentication_status(user) %> <% end %> diff --git a/app/views/managements/classroom.html.erb b/app/views/managements/classroom.html.erb index da83c96fc..1494ddf2a 100644 --- a/app/views/managements/classroom.html.erb +++ b/app/views/managements/classroom.html.erb @@ -19,6 +19,10 @@ 搜索 清除 + + + +
<% end %> @@ -26,14 +30,18 @@ <%= render :partial => "managements/classroom_list" %>
- - <%= submit_tag '',:class=>'searchIcon2',:onfocus=>"this.blur();",:style=>'border-style:none' %> - <% end %> -
-
- <%= render :partial => 'users/course_message_form', :locals => {:user => user, :courses => courses, :send_id => send_id, :send_ids => send_ids} %> -
-
- + +
+
+

发送资源

+ +
+ + + + + + + + + + + +
+
+
+ <%= form_tag search_user_course_user_path(user),:method => 'get',:remote=>true,:id=>'search_user_course_form',:class=>'resourcesSearchBox' do %> + <%= hidden_field_tag(:send_id, send_id) %> + <%= hidden_field_tag(:send_ids, send_ids) %> + + + + + + <%= submit_tag '',:class=>'searchIcon2',:onfocus=>"this.blur();",:style=>'border-style:none' %> + <% end %> +
+
+ <%= render :partial => 'users/course_message_form', :locals => {:user => user, :courses => courses, :send_id => send_id, :send_ids => send_ids} %> +
+
+
+
+ diff --git a/app/views/users/search_user_course.js.erb b/app/views/users/search_user_course.js.erb index 8787e420d..4a0a783d2 100644 --- a/app/views/users/search_user_course.js.erb +++ b/app/views/users/search_user_course.js.erb @@ -28,17 +28,19 @@ pop_box_new(htmlvalue, 452, 463); <% elsif params[:send_type] == 'message' %> - $("#ajax-modal").html('<%= escape_javascript( render :partial => 'users/share_message_to_course' ,:locals => {:courses => @course, :user => @user, :send_id => @send_id, :send_ids => @send_ids}) %>'); - showModal('ajax-modal', '452px'); - $('#ajax-modal').siblings().remove(); - $('#ajax-modal').before(""); - $('#ajax-modal').parent().css("top","50%").css("left","50%"); - $('#ajax-modal').parent().addClass("popbox").addClass("resourceUploadPopup"); - $('#ajax-modal').css("padding-left","16px").css("padding-bottom","16px"); - //与更新版本弹窗js冲突新增样式代码 - $('#ajax-modal').parent().css({"border":"3px solid #269ac9", "padding":"4px"}); - var val = $("#search_course_input").val(); - $("#search_course_input").val("").focus().val(val); + var htmlvalue = "<%= escape_javascript( render :partial => 'users/share_message_to_course' ,:locals => {:courses => @course, :user => @user, :send_id => @send_id, :send_ids => @send_ids}) %>"; + pop_box_new(htmlvalue, 452, 463); +// $("#ajax-modal").html('<%#= escape_javascript( render :partial => 'users/share_message_to_course' ,:locals => {:courses => @course, :user => @user, :send_id => @send_id, :send_ids => @send_ids}) %>'); +// showModal('ajax-modal', '452px'); +// $('#ajax-modal').siblings().remove(); +// $('#ajax-modal').before(""); +// $('#ajax-modal').parent().css("top","50%").css("left","50%"); +// $('#ajax-modal').parent().addClass("popbox").addClass("resourceUploadPopup"); +// $('#ajax-modal').css("padding-left","16px").css("padding-bottom","16px"); +// //与更新版本弹窗js冲突新增样式代码 +// $('#ajax-modal').parent().css({"border":"3px solid #269ac9", "padding":"4px"}); +// var val = $("#search_course_input").val(); +// $("#search_course_input").val("").focus().val(val); <% end %> <% else %> <% if params[:send_type] == 'news' %> diff --git a/app/views/welcome/_management_no_data.html.erb b/app/views/welcome/_management_no_data.html.erb new file mode 100644 index 000000000..a4c6d0f40 --- /dev/null +++ b/app/views/welcome/_management_no_data.html.erb @@ -0,0 +1,6 @@ +
+
+ +

没有数据可以显示!

+
+
\ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index bc1a8e856..71137bf9e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -228,6 +228,7 @@ RedmineApp::Application.routes.draw do post 'add_department' get 'shixun_feedback' match 'update_user',:via=>[:get,:post] + post 'support_shixuns_search' end end # Enable Grack support diff --git a/public/javascripts/edu/shixun_course_path.js b/public/javascripts/edu/shixun_course_path.js new file mode 100644 index 000000000..4b5a95a71 --- /dev/null +++ b/public/javascripts/edu/shixun_course_path.js @@ -0,0 +1,435 @@ +/** + * Created by Administrator on 2017/9/8. + */ +var Point = function(x, y) { + this.x = x; + this.y = y; +}; + +var Circle = function(rad, centerPoint) { //圆 + this.rad = rad; + this.centerPoint = centerPoint; +}; + +var DelaunayDataSet = function(vertex, context) { //三角形 + this.vertex = vertex; + this.context = context; + + this.fillTriangleColor = "#ff0000"; + this.fillTriangleCheck = true; + + this.strokeTriangleColor = "rgba(255, 255, 255,0)";//棱锥边的颜色 + this.strokeTriangleCheck = true; +} + +var TriSettings = []; +var lights = []; +var max_lights = 20;//小球的数量 +DelaunayDataSet.prototype.drawLight = function() { +// alert(this.context.canvas.height) + while (lights.length < max_lights) { + var light = { + x: Math.random() * this.context.canvas.width, + y: Math.random() * this.context.canvas.height, + angle: Math.random() * 360 * (Math.PI / 180), + speed: Math.random() * 1 + } + lights.push(light); + } + for (var i = 0; i < lights.length; i++) { + var light = lights[i]; + light.x += Math.cos(light.angle) * light.speed;// 速度*[-1,1] + light.y += Math.sin(light.angle) * light.speed; + if (light.x < 0 || light.y < 0 || light.x > this.context.canvas.width || light.y > this.context.canvas.height) { + light.x = Math.random() * this.context.canvas.width; + light.y = Math.random() * this.context.canvas.height; + continue; + } + with(this.context) { + fillStyle = "#ffffff";//小球颜色 + beginPath(); + arc(light.x, light.y, 5, 0, 2 * Math.PI, false);//圆形的半径 + shadowColor = '#ffffff';//小球阴影色 + shadowBlur = 10;//模糊级数 + shadowOffsetX = 0; + shadowOffsetY = 0; + fill(); + closePath(); + + } + } + this.context.shadowBlur = 0; +}; + +DelaunayDataSet.prototype.drawTriangle = function() { + + for (var i = 0; i < this.triangleVertexNumber.length; i += 3) { + + + if (this.triangleVertexNumber[i] !== 0 && this.triangleVertexNumber[i] !== 1 && this.triangleVertexNumber[i] !== 2 && this.triangleVertexNumber[i + 1] !== 0 && this.triangleVertexNumber[i + 1] !== 1 && this.triangleVertexNumber[i + 1] !== 2 && this.triangleVertexNumber[i + 2] !== 0 && this.triangleVertexNumber[i + 2] !== 1 && this.triangleVertexNumber[i + 2] !== 2) { + + var ctx = this.context; + var points = []; + points.push({ + x: this.vertex[this.triangleVertexNumber[i]].x, + y: this.vertex[this.triangleVertexNumber[i]].y + }); + points.push({ + x: this.vertex[this.triangleVertexNumber[i + 1]].x, + y: this.vertex[this.triangleVertexNumber[i + 1]].y + }); + points.push({ + x: this.vertex[this.triangleVertexNumber[i + 2]].x, + y: this.vertex[this.triangleVertexNumber[i + 2]].y + }); + + ctx.beginPath(); + ctx.moveTo(points[0].x, points[0].y)//开始划线的起点 + ctx.lineTo(points[1].x, points[1].y)//三个结束点 + ctx.lineTo(points[2].x, points[2].y) + ctx.lineTo(points[0].x, points[0].y) + + if (this.fillTriangleCheck) { + var settings = TriSettings[i]; + if (!settings) { + var num = 120 + (80 / this.triangleVertexNumber.length * i) | 0; + var sp = new Point(this.vertex[this.triangleVertexNumber[i]].x, this.vertex[this.triangleVertexNumber[i]].y); + var ep = new Point(sp.x + 50 + Math.random() * 200, sp.y + 50 + Math.random() * 200); + var opacity = .05 + Math.random() * .6;//背景透明度 + settings = { + start_point: sp, + end_point: ep, + opacity: opacity + } + TriSettings[i] = settings; + } + + var color = '255,88,00'; + var collision = false; + for (var l = 0; l < lights.length; l++) { + var collision = is_in_triangle(lights[l].x, lights[l].y, points[0].x, points[0].y, points[1].x, points[1].y, points[2].x, points[2].y) + if (collision) { + color = '255,255,255';//背景渐变色 + continue; + } + } + + var grad = ctx.createLinearGradient(settings.start_point.x, settings.start_point.y, settings.end_point.x, settings.end_point.y); + grad.addColorStop(0, 'rgba(255,88,00,' + settings.opacity + ')');//开始颜色到结束颜色的透明度及颜色的变化 + grad.addColorStop(1, 'rgba(' + color + ',' + settings.opacity + ')');//三角形渐变的颜色 + ctx.fillStyle = grad; + ctx.fill(); + } + + if (this.strokeTriangleCheck) { + ctx.strokeStyle = this.strokeTriangleColor; + ctx.stroke(); + } + + ctx.closePath(); + + } + } +}; + +DelaunayDataSet.prototype.update = function() { + + var vertexNumber = this.vertex.length; + this.triangleVertexNumber = [0, 1, 2]; + this.circumCircles = []; + + + var firstCircle = calculationCircle(this.vertex[0], this.vertex[1], this.vertex[2]); + this.circumCircles.push(firstCircle); + + for (var i = 3; i < vertexNumber; i++) { + calTriangles(this, i); + if (i > 3) { + removeTriangle(this, i); + } + } + +}; + + +// define the method which is very useful + + +function distanceBetweenPoints(pt1, pt2) { + var dx = pt2.x - pt1.x; + var dy = pt2.y - pt1.y; + + return Math.sqrt(dx * dx + dy * dy); +} + +function distanceBetweenPointAndCircle(pt, circle) { + var dx = pt.x - circle.centerPoint.x; + var dy = pt.y - circle.centerPoint.y; + + return Math.sqrt(dx * dx + dy * dy); +} + +function judgeBetweenDistance(_pt, _circle) { + var dis = distanceBetweenPointAndCircle(_pt, _circle); + + var circleJudge = false; + if (dis < _circle.rad) { + circleJudge = true; + } + + return circleJudge; +} + +//this is the process of 3 ( separating of the triangles, add the circum circles, and deleting the extra triangle + + +function calTriangles(_delaunayDataSet, num) { + var newNumber = num; + var pt = _delaunayDataSet.vertex[newNumber]; + + var tempVertexNumber = []; + var tempCircles = []; + var tempNumbers = []; + + for (var i = 0; i < _delaunayDataSet.circumCircles.length; i++) { + if (judgeBetweenDistance(pt, _delaunayDataSet.circumCircles[i])) { + tempNumbers.push(i); + + var selectingNum01 = _delaunayDataSet.triangleVertexNumber[3 * i]; + var selectingNum02 = _delaunayDataSet.triangleVertexNumber[3 * i + 1]; + var selectingNum03 = _delaunayDataSet.triangleVertexNumber[3 * i + 2]; + + tempVertexNumber.push(selectingNum01); + tempVertexNumber.push(selectingNum02); + tempVertexNumber.push(newNumber); + + tempVertexNumber.push(selectingNum02); + tempVertexNumber.push(selectingNum03); + tempVertexNumber.push(newNumber); + + tempVertexNumber.push(selectingNum03); + tempVertexNumber.push(selectingNum01); + tempVertexNumber.push(newNumber); + + var ct01circle1 = calculationCircle(_delaunayDataSet.vertex[selectingNum01], _delaunayDataSet.vertex[selectingNum02], _delaunayDataSet.vertex[newNumber]); + var ct01circle2 = calculationCircle(_delaunayDataSet.vertex[selectingNum02], _delaunayDataSet.vertex[selectingNum03], _delaunayDataSet.vertex[newNumber]); + var ct01circle3 = calculationCircle(_delaunayDataSet.vertex[selectingNum03], _delaunayDataSet.vertex[selectingNum01], _delaunayDataSet.vertex[newNumber]); + + tempCircles.push(ct01circle1); + tempCircles.push(ct01circle2); + tempCircles.push(ct01circle3); + } + } + + for (i = 0; i < tempVertexNumber.length; i++) { + _delaunayDataSet.triangleVertexNumber.push(tempVertexNumber[i]); + } + + for (i = 0; i < tempCircles.length; i++) { + _delaunayDataSet.circumCircles.push(tempCircles[i]); + } + + for (i = 0; i < tempNumbers.length; i++) { + var num = tempNumbers[i] - i; + + var slicedObjectPtNumbers; + var slicedCircles; + + if (num == 0) { + slicedObjectPtNumbers = _delaunayDataSet.triangleVertexNumber.slice(3); + slicedCircles = _delaunayDataSet.circumCircles.slice(1); + } else { + var slicedObjectPtNumberBefore = _delaunayDataSet.triangleVertexNumber.slice(0, 3 * num); + var slicedObjectPtNumberAfter = _delaunayDataSet.triangleVertexNumber.slice(3 * num + 3); + slicedObjectPtNumbers = slicedObjectPtNumberBefore.concat(slicedObjectPtNumberAfter); + + var slicedCircleBefore = _delaunayDataSet.circumCircles.slice(0, num); + var slicedCircleAfter = _delaunayDataSet.circumCircles.slice(1 + num); + slicedCircles = slicedCircleBefore.concat(slicedCircleAfter); + } + + _delaunayDataSet.triangleVertexNumber = slicedObjectPtNumbers; + _delaunayDataSet.circumCircles = slicedCircles; + } + +} + +function calculationCircle(pt01, pt02, pt03) { + + var x1 = pt01.x; + var y1 = pt01.y; + + var x2 = pt02.x; + var y2 = pt02.y; + + var x3 = pt03.x; + var y3 = pt03.y; + + var c = 2.0 * ((x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1)); + var tempX = ((y3 - y1) * (x2 * x2 - x1 * x1 + y2 * y2 - y1 * y1) + (y1 - y2) * (x3 * x3 - x1 * x1 + y3 * y3 - y1 * y1)) / c; + var tempY = ((x1 - x3) * (x2 * x2 - x1 * x1 + y2 * y2 - y1 * y1) + (x2 - x1) * (x3 * x3 - x1 * x1 + y3 * y3 - y1 * y1)) / c; + var tempPt = new Point(tempX, tempY); + + var tempRad = Math.sqrt(Math.pow(tempX - x1, 2) + Math.pow(tempY - y1, 2)); + + return new Circle(tempRad, tempPt); +} + +function removeTriangle(_delaunayDataSet, tempVertexNum) { + var circumcircleArrays = _delaunayDataSet.circumCircles; + var ommitCircumCircleNumbers = []; + + for (var i = 0; i < circumcircleArrays.length; i++) { + var vertexNum01 = _delaunayDataSet.triangleVertexNumber[i * 3]; + var vertexNum02 = _delaunayDataSet.triangleVertexNumber[i * 3 + 1]; + var vertexNum03 = _delaunayDataSet.triangleVertexNumber[i * 3 + 2]; + + for (var num = 0; num < tempVertexNum; num++) { + if (num != vertexNum01 && num != vertexNum02 && num != vertexNum03) { + + if (judgeBetweenDistance(_delaunayDataSet.vertex[num], circumcircleArrays[i])) { + ommitCircumCircleNumbers.push(i); + break; + } + + } + } + + } + + + //omit + var tempCircumCircleArray = []; + var tempTriagneNumberArray = []; + + for (i = 0; i < circumcircleArrays.length; i++) { + for (var j = 0; j < ommitCircumCircleNumbers.length; j++) { + if (ommitCircumCircleNumbers[j] == i) { + break; + } + } + + if (j == ommitCircumCircleNumbers.length) { + + tempTriagneNumberArray.push(_delaunayDataSet.triangleVertexNumber[3 * i]); + tempTriagneNumberArray.push(_delaunayDataSet.triangleVertexNumber[3 * i + 1]); + tempTriagneNumberArray.push(_delaunayDataSet.triangleVertexNumber[3 * i + 2]); + + tempCircumCircleArray.push(_delaunayDataSet.circumCircles[i]); + } + } + + _delaunayDataSet.triangleVertexNumber = []; + for (i = 0; i < tempTriagneNumberArray.length; i++) { + _delaunayDataSet.triangleVertexNumber[i] = tempTriagneNumberArray[i]; + } + + _delaunayDataSet.circumCircles = []; + for (i = 0; i < tempCircumCircleArray.length; i++) { + _delaunayDataSet.circumCircles[i] = tempCircumCircleArray[i]; + } +} + +function initTriangle(context, recWid, recHig, recTop, recLeft) { + var vertex = []; + + var bigRad = Math.sqrt(Math.pow(recWid, 2) + Math.pow(recHig, 2)) / 2; + var bigCirclePos = new Point(recWid / 2 + recLeft, recHig / 2 + recTop); + + vertex.push(new Point(bigCirclePos.x - Math.sqrt(3) * bigRad, bigCirclePos.y - bigRad)); + vertex.push(new Point(bigCirclePos.x + Math.sqrt(3) * bigRad, bigCirclePos.y - bigRad)); + vertex.push(new Point(bigCirclePos.x, bigCirclePos.y + bigRad * 2)); + + return new DelaunayDataSet(vertex, context); +} + +function is_in_triangle(px, py, ax, ay, bx, by, cx, cy) { + + var v0 = [cx - ax, cy - ay]; + var v1 = [bx - ax, by - ay]; + var v2 = [px - ax, py - ay]; + + var dot00 = (v0[0] * v0[0]) + (v0[1] * v0[1]); + var dot01 = (v0[0] * v1[0]) + (v0[1] * v1[1]); + var dot02 = (v0[0] * v2[0]) + (v0[1] * v2[1]); + var dot11 = (v1[0] * v1[0]) + (v1[1] * v1[1]); + var dot12 = (v1[0] * v2[0]) + (v1[1] * v2[1]); + + var invDenom = 1 / (dot00 * dot11 - dot01 * dot01); + + var u = (dot11 * dot02 - dot01 * dot12) * invDenom; + var v = (dot00 * dot12 - dot01 * dot02) * invDenom; + + return ((u >= 0) && (v >= 0) && (u + v < 1)); +} + +window.requestAnimFrame = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 80); + }; +})(); + +(function() { + var canvas = document.getElementById("myCanvas"); + var canvasWid = 1200; + var canvasHig = 130; + + canvas.width = canvasWid; + canvas.height = canvasHig; + var context = canvas.getContext("2d"); + + var recWid = canvasWid; + var recHig = canvasHig; + + var recTop = 0; + var recLeft = 0; + + var delaneyNum = 30; + var myDelaunayDataSet = initTriangle(context, recWid, recHig, recTop, recLeft); + + var tempPt; + tempPt = new Point(0, 0); + myDelaunayDataSet.vertex.push(tempPt); + + tempPt = new Point(canvasWid, 0); + myDelaunayDataSet.vertex.push(tempPt); + + tempPt = new Point(0, canvasHig); + myDelaunayDataSet.vertex.push(tempPt); + + tempPt = new Point(canvasWid, canvasHig); + myDelaunayDataSet.vertex.push(tempPt); + + for (var i = 0; i < delaneyNum - 4; i++) { + var pt = new Point(Math.random() * recWid + recLeft, Math.random() * recHig + recTop); + myDelaunayDataSet.vertex.push(pt); + } + + var mousePos = new Point(canvasWid / 2, canvasHig / 2); + myDelaunayDataSet.vertex.push(mousePos); + + myDelaunayDataSet.update(); + myDelaunayDataSet.drawTriangle(); + + function getMousePos(canvas, evt) { + var rect = canvas.getBoundingClientRect(); + return new Point(evt.clientX - rect.left, evt.clientY - rect.top); + } + + loop(); + + function loop() { + context.clearRect(0, 0, canvasWid, canvasHig); + context.fillStyle='rgba(255,75,00,0.5)'; + context.fillRect(0,0,1350,130); +// context.font="30px Arial"; +// context.fillText("在线课堂",550,75); +// context.font="22px Arial"; +// context.fillText("One who is anxious to learn, can always learn from others.",300,140); + myDelaunayDataSet.drawTriangle(); + myDelaunayDataSet.drawLight(); + requestAnimFrame(loop); + } + +})(); \ No newline at end of file diff --git a/public/stylesheets/css/edu-common.css b/public/stylesheets/css/edu-common.css index dc99710ce..fe86c8fba 100644 --- a/public/stylesheets/css/edu-common.css +++ b/public/stylesheets/css/edu-common.css @@ -336,13 +336,13 @@ html>body #ajax-indicator { position: fixed; } .user_course_filtrate:hover .user_filtrate_span1{color: #FF7500!important;} .user_course_filtrate:hover .user_filtrate_span2{background: #FF7500!important;} /*课堂----------筛选切换(没有数字,默认白色背景)*/ -.course_filtrate{width: auto;padding:0px 10px;text-align: center;background: #fff;border-radius: 10px;margin-right: 20px;line-height: 26px;border: 1px solid #d1d1d1} -.course_filtrate:hover{background: #FF7500; color: #ffffff;border: 0px solid white } -.course_filtrate_bg{background: #FF7500; color: #ffffff!important;border: 0px solid white } +.course_filtrate{width: auto;padding:0px 10px;text-align: center;background: #eeeeee;border-radius: 10px;margin-right: 20px;line-height: 26px;} +.course_filtrate:hover{background: #FF7500; color: #ffffff; } +.course_filtrate_bg{background: #FF7500; color: #ffffff!important; } /*我的课堂----------筛选切换(没有数字,默认灰色背景)*/ -.edu-filter-cir-grey{color: #666;width: auto;padding:0px 15px;text-align: center;background: #eeeeee;border-radius: 10px;margin-right: 20px;display: block; height:25px; line-height:25px;border: 1px solid #d1d1d1} -.edu-filter-cir-grey:hover{background: #FF7500; color: #ffffff;border: 0px solid white } -.edu-filter-cir-grey.active{background: #FF7500; color: #ffffff!important;border: 0px solid white } +.edu-filter-cir-grey{color: #666;width: auto;padding:0px 15px;text-align: center;background: #eeeeee;border-radius: 10px;margin-right: 20px;display: block; height:25px; line-height:25px;} +.edu-filter-cir-grey:hover{background: #FF7500; color: #ffffff;} +.edu-filter-cir-grey.active{background: #FF7500; color: #ffffff!important;} /*最新和最热导航条的公用样式*/ @@ -448,12 +448,17 @@ input::-ms-clear{display:none;} .transform90{transform: rotate(90deg);} /*---------------------编辑器边框------------------------*/ .kindeditor{background: #F0F0EE;height:22px;border:1px solid #CCCCCC;border-bottom: none} -<<<<<<< HEAD /*两端对齐*/ .justify{text-align: justify;} -======= + /**/ #edu-tab-nav .edu-position-hidebox li a{font-size: 12px} ->>>>>>> dev_xucheng +/*在线课堂*/ +a.white-btn.green-btn{color:#29bd8b;border:1px solid #29bd8b; } +a.white-btn.orange-btn{color: #FF7500;border: 1px solid #FF7500} +a.white-btn.orange-btn:hover{color: #FFFFFF;border: 1px solid #FF7500;background: #ff7500} +.white-btn{cursor: pointer;display: inline-block;padding: 0 12px;border: none;letter-spacing: 1px;font-size: 14px;height: 30px;line-height: 30px;border-radius: 3px;} +.courseRefer{float:left; max-height:120px;margin-bottom:10px;overflow:auto; overflow-x:hidden;} +.logo {width: 295px;height: 30px;border-style:none;position: absolute;top:50%;left:39%;} \ No newline at end of file