Merge branches 'dev_aliyun' and 'ysldev_aliyun_paixugai' of https://bdgit.educoder.net/Hjqreturn/educoder into ysldev_aliyun_paixugai

dev_auth
杨树林 5 years ago
commit b7eeb70fa4

@ -136,6 +136,33 @@ $(document).on('turbolinks:load', function(){
$('.sponsor-select').select2(selectOptions);
$('.allow-school-select').select2(selectOptions);
$('.manager-select').select2({
theme: 'bootstrap4',
placeholder: '请输入要添加的管理员姓名',
multiple: true,
minimumInputLength: 1,
ajax: {
delay: 500,
url: '/admins/users',
dataType: 'json',
data: function(params){
return { keyword: params.term };
},
processResults: function(data){
return { results: data.users }
}
},
templateResult: function (item) {
if(!item.id || item.id === '') return item.text;
return $("<span>" + item.real_name + " <span class='font-12'>" + item.school_name + ' ' + item.hidden_phone + "</span></span>");
},
templateSelection: function(item){
if (item.id) {
}
return item.real_name || item.text;
}
});
// 排行榜
//链接

@ -80,6 +80,21 @@ $(document).on('turbolinks:load', function(){
})
});
// reset user login times
$('.users-list-container').on('click', '.reset-login-times-action', function(){
var $action = $(this);
var userId = $action.data('id');
$.ajax({
url: '/admins/users/' + userId + '/reset_login_times',
method: 'POST',
dataType: 'json',
success: function() {
showSuccessNotify();
}
});
});
// ***************** reward grade modal *****************
var $rewardGradeModal = $('.admin-users-reward-grade-modal');
var $form = $rewardGradeModal.find('form.admin-users-reward-grade-form');

@ -22,7 +22,7 @@ class Admins::CompetitionSettingsController < Admins::BaseController
def basic_form_params
params.permit(:identifier, :name, :sub_title, :start_time, :end_time, :mode,
:identifier, :bonus, :awards_count, :description, :course_id, :teach_start_time,
:teach_end_time, sponsor_schools: [], region_schools: [])
:teach_end_time, sponsor_schools: [], region_schools: [], manager_ids: [])
end
def nav_form_params

@ -52,6 +52,12 @@ class Admins::UsersController < Admins::BaseController
render_ok(grade: user.grade)
end
def reset_login_times
User.find(params[:id]).reset_login_times!
render_ok
end
private
def update_params

@ -5,6 +5,7 @@ class Competitions::CompetitionsController < Competitions::BaseController
before_action :allow_visit, except: [:index]
before_action :require_admin, only: [:update, :update_inform]
before_action :chart_visible, only: [:charts, :chart_rules]
before_action :check_manager_permission!, only: [:update_md_content]
def index
# 已上架 或者 即将上架
@ -152,6 +153,13 @@ class Competitions::CompetitionsController < Competitions::BaseController
render_forbidden unless (chart_module.present? && !chart_module.hidden) || admin_or_business?
end
def check_manager_permission!
return if current_user.admin_or_business?
return if current_competition.nearly_published? && current_competition.manager?(current_user)
render_forbidden
end
# 竞赛成绩导出
def chart_to_xlsx records, competition
@competition_head_cells = []

@ -1241,6 +1241,8 @@ class ExercisesController < ApplicationController
#筛选/分类,排序
order = params[:order]
order_type = params[:order_type] || "desc"
if @exercise_users_list.present? && @exercise_users_list.size > 0
@exercise_users_count = @exercise_users_list.size #当前显示的全部成员数量
teacher_reviews = @exercise_users_list.exercise_review
@ -1280,11 +1282,11 @@ class ExercisesController < ApplicationController
exercise_user_joins = @exercise_users_list.joins(user: :user_extension)
if order == "student_id"
@exercise_users_list = exercise_user_joins.order("user_extensions.student_id DESC")
@exercise_users_list = exercise_user_joins.order("user_extensions.student_id #{order_type}")
elsif order == "score"
@exercise_users_list = exercise_user_joins.order("#{order} DESC")
@exercise_users_list = exercise_user_joins.order("#{order} #{order_type}")
else
@exercise_users_list = exercise_user_joins.order("end_at DESC, start_at DESC")
@exercise_users_list = exercise_user_joins.order("end_at #{order_type}, start_at #{order_type}")
end
@export_ex_users = @exercise_users_list
@ -1407,11 +1409,16 @@ class ExercisesController < ApplicationController
min_score = exercise_scores.min.present? ? exercise_scores.min : 0.0
max_score = exercise_scores.max.present? ? exercise_scores.max : 0.0
total_score = exercise_scores.sum.present? ? exercise_scores.sum : 0.0
average_score = @exercise_commit_user_counts > 0 ? (total_score / @exercise_commit_user_counts).round(1) : 0.0
fail_counts = exercise_scores.count{|a| a < 60.0}
pass_counts = exercise_scores.count{|a| a < 70.0 && a >= 60.0}
good_counts = exercise_scores.count{|a| a < 90.0 && a >= 70.0}
best_counts = exercise_scores.count{|a| a >= 90.0 && a <= 100.0}
average_score = @exercise_commit_user_counts > 0 ? (total_score.round(1) / @exercise_commit_user_counts).round(1) : 0.0
question_scores = @exercise.question_scores
fail_score = question_scores * 0.6.round(2)
pass_score = question_scores * 0.7.round(2)
good_score = question_scores * 0.9.round(2)
fail_counts = exercise_scores.count{|a| a < fail_score}
pass_counts = exercise_scores.count{|a| a < pass_score && a >= fail_score}
good_counts = exercise_scores.count{|a| a < good_score && a >= pass_score}
best_counts = exercise_scores.count{|a| a >= good_score && a <= question_scores}
end
@counts_array = {
:commit_percent => commit_percent,

@ -440,6 +440,7 @@ class HomeworkCommonsController < ApplicationController
@user = current_user
@work = @homework.user_work(current_user.id) if @user_course_identity == Course::STUDENT
@course_groups = @course.course_groups.where(id: @course.charge_group_ids(@user))
@shixun = @homework.shixuns.take if @homework.homework_type == "practice"
end
def update_settings

@ -1068,7 +1068,7 @@ class PollsController < ApplicationController
#筛选/分类,排序
order = params[:order]
# b_sort = params[:sort] || "desc"
order_type = params[:order_type] || "desc"
choose_type = params[:commit_status]
group_id = params[:poll_group_id]
search_content = params[:search]
@ -1095,9 +1095,9 @@ class PollsController < ApplicationController
poll_users_joins = @poll_users_list.joins(user: :user_extension)
if order == "student_id"
@poll_users_list = poll_users_joins.order("user_extensions.student_id DESC")
@poll_users_list = poll_users_joins.order("user_extensions.student_id #{order_type}")
else
@poll_users_list = poll_users_joins.order("end_at DESC")
@poll_users_list = poll_users_joins.order("end_at #{order_type}")
end
@poll_users_size = @poll_users_list.count

@ -11,6 +11,6 @@ class Users::AuthenticationAppliesController < Users::BaseAccountController
private
def create_params
params.permit(:name, :id_number, :upload_image)
params.permit(:name, :gender, :id_number, :upload_image)
end
end

@ -112,7 +112,7 @@ module ExportHelper
@work_cells_column.push(row_cells_column)
end
else #实训题
shixun = homework.shixuns.first
shixun = homework.shixuns.take
shixun_head_cells = %w(完成情况 通关时间 学员在EduCoder做实训花费的时间 总评测次数 获得经验值 关卡得分)
eff_boolean = homework.work_efficiency
if eff_boolean
@ -123,9 +123,12 @@ module ExportHelper
if allow_late_boolean #允许迟交
eff_score_cell.push("迟交扣分")
end
shixun_time_cells = %w(最终成绩 更新时间 作业发布到学员完成作业所耗的时间 评语)
shixun_time_cells = %w(最终成绩 更新时间 作业发布到学员完成作业所耗的时间 总评语)
for i in 1 .. shixun.challenges.size
shixun_time_cells << "#{i}关评语"
end
@work_head_cells = (head_cells_format + shixun_head_cells + eff_score_cell + shixun_time_cells).reject(&:blank?)
works.includes(:student_works_scores, user: :user_extension, myshixun: :games).each_with_index do |w, index|
works.includes(:shixun_work_comments, :student_works_scores, user: :user_extension, myshixun: :games).each_with_index do |w, index|
myshixun = w.try(:myshixun)
w_user = w.user
w_1 = (index + 1)
@ -165,21 +168,20 @@ module ExportHelper
w_16 = w.update_time ? format_time(w.update_time) : "--" "更新时间"
myshixun_complete = myshixun && myshixun.status == 1
w_17 = myshixun_complete && w.cost_time ? (game_spend_time w.cost_time) : "未完成"
teacher_comments = w.student_works_scores
if teacher_comments.present?
w_18 = ""
teacher_comments.each do |t|
user_name = t.user&.real_name
user_time = format_time(t.updated_at)
user_score = t&.score
user_comment = t.comment.present? ? t.comment : "--"
comment_title = "#{user_name} #{user_time.to_s} #{user_score.to_s}\n#{user_comment}\n\n"
w_18 = w_18 + comment_title
end
teacher_comment = w.shixun_work_comments.select{|comment| comment.challenge_id == 0}.first
if teacher_comment.present?
w_18 = "学生可见:\n #{teacher_comment.comment.to_s} \n\n 老师可见:\n#{teacher_comment.hidden_comment.to_s}"
else
w_18 = "--"
end
row_cells_column = [w_1,w_2,w_3,w_3_1,w_4,w_5,w_6,w_7,w_8,w_9,w_10,w_11,w_12,w_13,w_14,w_15,w_16,w_17,w_18]
# 关卡评语
shixun.challenges.pluck(:id).each do |challenge_id|
challenge_comment = w.shixun_work_comments.select{|comment| comment.challenge_id == challenge_id}.first
row_cells_column << (challenge_comment.present? ? "学生可见:\n #{challenge_comment.comment.to_s} \n\n 老师可见:\n#{challenge_comment.hidden_comment.to_s}" : "--")
end
row_cells_column = row_cells_column.reject(&:blank?)
@work_cells_column.push(row_cells_column)
end

@ -32,6 +32,7 @@ class LimitForbidControl::Base
# 锁定
if value >= allow_times.to_i
Rails.logger.info("[LimitForbidControl] Lock #{cache_key}")
Rails.cache.write(forbid_cache_key, true, expires_in: forbid_expires)
Rails.cache.delete(cache_key)
else
@ -40,6 +41,7 @@ class LimitForbidControl::Base
end
def clear
Rails.logger.info("[LimitForbidControl] Clear #{cache_key}")
Rails.cache.delete(forbid_cache_key)
Rails.cache.delete(cache_key)
end

@ -46,7 +46,16 @@ class Challenge < ApplicationRecord
#self.challenge_chooses.pluck(:score).sum
end
# 关卡总分
def challenge_difficulty
case difficulty
when 1 then "简单"
when 2 then "中等"
when 3 then "困难"
else ''
end
end
# 关卡总分
def all_score
self.score
# if self.st == 1

@ -26,6 +26,9 @@ class Competition < ApplicationRecord
has_many :sponsor_schools, -> { where(source: :sponsor) }, class_name: 'CompetitionSchool' # 主办方
has_many :region_schools, -> { where(source: :region) }, class_name: 'CompetitionSchool' # 开放范围
has_many :competition_managers, dependent: :destroy
has_many :managers, through: :competition_managers, source: :user
after_create :create_competition_modules
def mode_type
@ -75,6 +78,11 @@ class Competition < ApplicationRecord
status?
end
# 即将发布
def nearly_published?
!published? && published_at.present?
end
# 是否为个人赛
def personal?
competition_staffs.sum(:maximum).to_i == 1 || (competition_staffs.nil? && max_num == 1)
@ -134,6 +142,10 @@ class Competition < ApplicationRecord
# competition_awards.pluck(:num)&.sum > 0 ? competition_awards.pluck(:num)&.sum : 20
# end
def manager?(user)
user && competition_managers.exists?(user_id: user.id)
end
private
def get_module_name type

@ -0,0 +1,4 @@
class CompetitionManager < ApplicationRecord
belongs_to :user
belongs_to :competition
end

@ -196,7 +196,7 @@ class Course < ApplicationRecord
end
def all_course_module_types
%w[activity announcement online_learning shixun_homework common_homework group_homework exercise attachment course_group graduation poll board]
%w[activity announcement online_learning shixun_homework common_homework group_homework exercise attachment course_group graduation poll board statistics]
end
def get_course_module_by_type(type)
@ -386,6 +386,7 @@ class Course < ApplicationRecord
when 'attachment' then '资源'
when 'board' then '讨论'
when 'course_group' then '分班'
when 'statistics' then '统计'
else ''
end
end
@ -404,6 +405,7 @@ class Course < ApplicationRecord
when 'attachment' then 10
when 'board' then 11
when 'course_group' then 12
when 'statistics' then 13
else 100
end
end

@ -37,6 +37,9 @@ class Exercise < ApplicationRecord
DEADLINE = 3 #已截止
ENDED = 4 #课堂已结束
def question_scores
exercise_questions.pluck(:question_score).sum
end
def create_exercise_list
str = ""

@ -660,6 +660,10 @@ class User < ApplicationRecord
end
end
def reset_login_times!
LimitForbidControl::UserLogin.new(self).clear
end
protected
def validate_password_length
# 管理员的初始密码是5位

@ -46,12 +46,12 @@ class Admins::UserStatisticQuery < ApplicationQuery
finish_challenge = finish_challenge.where(updated_at: time_range)
end
study_myshixun_map = study_myshixun.group(:user_id).count
finish_myshixun_map = finish_myshixun.group(:user_id).count
study_challenge_map = study_challenge.group(:user_id).count
finish_challenge_map = finish_challenge.group(:user_id).count
evaluate_count_map = study_challenge.group(:user_id).sum(:evaluate_count)
cost_time_map = study_challenge.group(:user_id).sum(:cost_time)
study_myshixun_map = study_myshixun.reorder(nil).group(:user_id).count
finish_myshixun_map = finish_myshixun.reorder(nil).group(:user_id).count
study_challenge_map = study_challenge.reorder(nil).group(:user_id).count
finish_challenge_map = finish_challenge.reorder(nil).group(:user_id).count
evaluate_count_map = study_challenge.reorder(nil).group(:user_id).sum(:evaluate_count)
cost_time_map = study_challenge.reorder(nil).group(:user_id).sum(:cost_time)
users.each do |user|
user._extra_data = {

@ -34,6 +34,18 @@ class Admins::CompetitionBasicSettingService < ApplicationService
setting.save!
end
# 管理员设置
params[:manager_ids] = Array.wrap(params[:manager_ids]).map(&:to_i)
old_manager_ids = competition.competition_managers.pluck(:user_id)
new_manager_ids = params[:manager_ids] - old_manager_ids
delete_manager_ids = old_manager_ids - params[:manager_ids]
CompetitionManager.bulk_insert(*%i[user_id competition_id created_at updated_at]) do |worker|
new_manager_ids.each do |manager_id|
worker.add(user_id: manager_id, competition_id: competition.id)
end
end
competition.competition_managers.where(user_id: delete_manager_ids).delete_all
# 主办方设置
params[:sponsor_schools] = Array.wrap(params[:sponsor_schools]).map(&:to_i)
new_sponsor_school_ids = competition.sponsor_schools.pluck(:school_id)

@ -10,13 +10,15 @@ class Admins::CompetitionStageCreateService < ApplicationService
ActiveRecord::Base.transaction do
stage = CompetitionStage.create!(competition_id: competition.id, name: params[:stage_name], score_rate: (params[:score_rate].to_i / 100).round(2))
params[:stage].each do |section|
stage_section = CompetitionStageSection.create!(competition_id: competition.id, competition_stage_id: stage.id,
start_time: section["start_time"], end_time: section["end_time"],
entry: section["entry"], score_source: section["score_source"])
section["identifiers"].each do |identifier|
CompetitionEntry.create!(competition_stage_section_id: stage_section.id, competition_stage_id: stage.id,
shixun_identifier: identifier)
unless params[:stage].blank?
params[:stage].each do |section|
stage_section = CompetitionStageSection.create!(competition_id: competition.id, competition_stage_id: stage.id,
start_time: section["start_time"], end_time: section["end_time"],
entry: section["entry"], score_source: section["score_source"])
section["identifiers"].each do |identifier|
CompetitionEntry.create!(competition_stage_section_id: stage_section.id, competition_stage_id: stage.id,
shixun_identifier: identifier)
end
end
end

@ -13,13 +13,15 @@ class Admins::CompetitionStageUpdateService < ApplicationService
stage.competition_stage_sections.destroy_all
params[:stage].each do |section|
stage_section = CompetitionStageSection.create!(competition_id: competition.id, competition_stage_id: stage.id,
start_time: section["start_time"], end_time: section["end_time"],
entry: section["entry"], score_source: section["score_source"])
section["identifiers"].each do |identifier|
CompetitionEntry.create!(competition_stage_section_id: stage_section.id, competition_stage_id: stage.id,
shixun_identifier: identifier)
unless params[:stage].blank?
params[:stage].each do |section|
stage_section = CompetitionStageSection.create!(competition_id: competition.id, competition_stage_id: stage.id,
start_time: section["start_time"], end_time: section["end_time"],
entry: section["entry"], score_source: section["score_source"])
section["identifiers"].each do |identifier|
CompetitionEntry.create!(competition_stage_section_id: stage_section.id, competition_stage_id: stage.id,
shixun_identifier: identifier)
end
end
end

@ -22,6 +22,8 @@ class Users::ApplyAuthenticationService < ApplicationService
user.authentication = false
user.save!
user.user_extension.update!(gender: params[:gender].to_i) if params[:gender].present?
user.apply_user_authentication.create!(auth_type: 1, status: 0)
move_image_file! unless params[:upload_image].to_s == 'false'

@ -1,7 +1,7 @@
class Users::CourseService
include CustomSortable
sort_columns :updated_at, default_by: :updated_at, default_direction: :desc
sort_columns :created_at, :updated_at, default_by: :updated_at, default_direction: :desc
attr_reader :user, :params
@ -15,7 +15,7 @@ class Users::CourseService
courses = status_filter(courses)
custom_sort(courses, :updated_at, params[:sort_direction])
custom_sort(courses, params[:sort_by], params[:sort_direction])
end
private

@ -1,7 +1,7 @@
class Users::ProjectService
include CustomSortable
sort_columns :updated_on, default_by: :updated_on, default_direction: :desc
sort_columns :created_on, :updated_on, default_by: :updated_on, default_direction: :desc
attr_reader :user, :params
@ -21,7 +21,7 @@ class Users::ProjectService
projects = category_filter(projects)
projects = status_filter(projects)
custom_sort(projects, :updated_on, params[:sort_direction])
custom_sort(projects, params[:sort_by], params[:sort_direction])
end
private

@ -77,6 +77,10 @@ class Users::ShixunService
sort_by = sort_by&.downcase
sort_direction = sort_direction&.downcase
if sort_by.blank? || !%w(updated_at created_at).include?(sort_by)
sort_by = 'updated_at'
end
if sort_direction.blank? || !%w(desc asc).include?(sort_direction)
sort_direction = 'desc'
end
@ -87,11 +91,11 @@ class Users::ShixunService
case params[:category]
when 'study' then
relations.order("myshixuns.updated_at #{sort_direction}")
relations.order("myshixuns.#{sort_by} #{sort_direction}")
when 'manage' then
relations.order("shixuns.updated_at #{sort_direction}")
relations.order("shixuns.#{sort_by} #{sort_direction}")
else
relations.order("shixuns.created_at #{sort_direction}")
relations.order("shixuns.#{sort_by} #{sort_direction}")
end
end
end

@ -1,7 +1,7 @@
class Users::SubjectService
include CustomSortable
sort_columns :updated_at, default_by: :updated_at, default_direction: :desc
sort_columns :created_at, :updated_at, default_by: :updated_at, default_direction: :desc
attr_reader :user, :params
@ -14,7 +14,7 @@ class Users::SubjectService
subjects = category_scope_subjects
subjects = user_policy_filter(subjects)
custom_sort(subjects.distinct, :updated_at, params[:sort_direction])
custom_sort(subjects.distinct, params[:sort_by], params[:sort_direction])
end
private

@ -45,12 +45,14 @@ class ExercisePublishTask
Rails.logger.info("log--------------------------------exercise_end start")
puts "--------------------------------exercise_end start"
# 1。统一设置的试卷
exercises = Exercise.includes(:exercise_users,:exercise_questions).where("exercise_status = 2 AND unified_setting = true AND end_time <= ?",Time.now + 900)
exercises = Exercise.includes(:exercise_users,:exercise_questions).where("exercise_status = 2 AND
unified_setting = true AND end_time <= ?",Time.now + 900)
exercises&.each do |exercise|
ex_type = exercise.exercise_questions.pluck(:question_type).uniq
exercise.update_column('exercise_status', 3)
exercise.exercise_users&.each do |exercise_user|
begin
Rails.logger.info("true: user_id:#{exercise_user.user_id}--commit_status:#{exercise_user.commit_status}")
if (exercise_user&.commit_status == 0) && (exercise_user&.start_at.present?)
s_score = calculate_student_score(exercise, exercise_user.user)[:total_score]
if ex_type.include?(4) #是否包含主观题
@ -60,6 +62,9 @@ class ExercisePublishTask
end
total_score_subjective_score = subjective_score < 0.0 ? 0.0 : subjective_score
total_score = s_score + total_score_subjective_score
Rails.logger.info("true: user_id:#{exercise_user.user_id}--subjective_score:#{subjective_score}")
Rails.logger.info("true: user_id:#{exercise_user.user_id}--s_score:#{s_score}")
Rails.logger.info("true: user_id:#{exercise_user.user_id}--commit_method:#{exercise_user.commit_method}")
commit_option = {
:status => 1,
:commit_status => 1,
@ -94,6 +99,7 @@ class ExercisePublishTask
exercise_users = exercise.exercise_users.where(:user_id => users.pluck(:user_id))
exercise_users&.each do |exercise_user|
begin
Rails.logger.info("false: user_id:#{exercise_user.user_id}--commit_status:#{exercise_user.commit_status}")
if exercise_user.commit_status == 0 && !exercise_user.start_at.nil?
if ex_types.include?(4) #是否包含主观题
subjective_score = exercise_user.subjective_score
@ -103,6 +109,9 @@ class ExercisePublishTask
s_score = calculate_student_score(exercise, exercise_user.user)[:total_score]
total_score_subjective_score = subjective_score < 0.0 ? 0.0 : subjective_score
total_score = s_score + total_score_subjective_score
Rails.logger.info("false: user_id:#{exercise_user.user_id}--s_score:#{s_score}")
Rails.logger.info("false: user_id:#{exercise_user.user_id}--subjective_score:#{subjective_score}")
Rails.logger.info("false: user_id:#{exercise_user.user_id}--commit_method:#{exercise_user.commit_method}")
commit_option = {
:status => 1,
:commit_status => 1,

@ -93,6 +93,16 @@
</div>
</div>
<div class="row align-items-center d-flex mb-2">
<div class="col-1 text-right">
管理员
</div>
<div class="col-5 text-left sponsorPanel">
<% manager_data = @competition.managers.map { |u| [u.name, u.id] } %>
<%= select_tag :manager_ids, options_for_select(manager_data, @competition.managers.map(&:id)), class: 'form-control manager-select', multiple: true %>
</div>
</div>
<div class="row align-items-center d-flex mb-2">
<div class="col-1 text-right">
主办方
@ -360,7 +370,7 @@
</div><span class=" mt-2">%</span>
<div class="flex-1">
<a href="javascript:void(0)" class="btn btn-outline-primary export-action ml20 add-task-sub">新增子阶段</a>
<% if stage.max_end_time > Time.now %>
<% if stage.max_end_time && stage.max_end_time > Time.now %>
<%= agree_link '发送短信提醒', send_message_admins_competition_competition_stage_path(@competition, stage, element: ".send-message-#{stage.id}"),
class: 'btn btn-outline-primary ml20', 'data-confirm': '确认执行发送短信操作?' %>
<% end %>
@ -492,6 +502,7 @@
</div>
<% end %>
<% end %>
<div class="error my-2 danger text-danger"></div>
</div>
</div>
</div>

@ -2,15 +2,15 @@
<thead class="thead-light">
<tr>
<th width="10%" class="text-left">真实姓名</th>
<th width="16%">邮件地址</th>
<th width="15%">邮件地址</th>
<th width="10%">手机号码</th>
<th width="14%">单位</th>
<th width="8%">角色</th>
<th width="7%">角色</th>
<th width="10%"><%= sort_tag('创建于', name: 'created_on', path: admins_users_path) %></th>
<th width="10%"><%= sort_tag('最后登录', name: 'last_login_on', path: admins_users_path) %></th>
<th width="6%"><%= sort_tag('经验值', name: 'experience', path: admins_users_path) %></th>
<th width="6%"><%= sort_tag('金币', name: 'grade', path: admins_users_path) %></th>
<th width="12%">操作</th>
<th width="14%">操作</th>
</tr>
</thead>
<tbody>
@ -33,8 +33,6 @@
<td class="action-container">
<%= link_to '编辑', edit_admins_user_path(user), class: 'action' %>
<%= javascript_void_link('奖励', class: 'action reward-grade-action', data: { toggle: 'modal', target: '.admin-users-reward-grade-modal', id: user.id }) %>
<%= javascript_void_link '解锁', class: 'action unlock-action', data: { id: user.id }, style: user.locked? ? '' : 'display: none;' %>
<% if user.registered? %>
@ -45,7 +43,14 @@
<%= javascript_void_link '加锁', class: 'action lock-action', data: { id: user.id }, style: user.locked? || user.registered? ? 'display: none;' : '' %>
<% end %>
<%= delete_link '删除', admins_user_path(user, element: ".user-item-#{user.id}"), class: 'delete-user-action' %>
<%= javascript_void_link('更多', class: 'action dropdown-toggle', 'data-toggle': 'dropdown', 'aria-haspopup': true, 'aria-expanded': false) %>
<div class="dropdown-menu more-action-dropdown">
<%= javascript_void_link('奖励', class: 'dropdown-item reward-grade-action', data: { toggle: 'modal', target: '.admin-users-reward-grade-modal', id: user.id }) %>
<%= javascript_void_link '恢复禁密账号', class: 'dropdown-item reset-login-times-action', data: { id: user.id } %>
<%= delete_link '删除', admins_user_path(user, element: ".user-item-#{user.id}"), class: 'dropdown-item delete-user-action' %>
</div>
</td>
</tr>
<% end %>

@ -30,3 +30,7 @@ if @competition.mode == 2
json.member_of_course @user.member_of_course?(@competition.competition_mode_setting&.course)
end
json.permission do
json.editable @user.admin_or_business? || (@competition.nearly_published? && @competition.manager?(@user))
end

@ -24,4 +24,5 @@ json.course_identity @user_course_identity
json.excellent @course.excellent
if @course.is_end == 0
json.days_remaining (@course.end_date.to_date - Time.now.to_date).to_i
end
end
json.teacher_applies_count CourseMessage.unhandled_join_course_requests_by_course(@course).size if @user_course_identity < Course::ASSISTANT_PROFESSOR

@ -15,17 +15,19 @@ json.group_settings @course_groups do |group|
end
if @homework.homework_type == "practice"
json.shixun_identifier @homework.shixuns.first.try(:identifier)
json.shixun_identifier @shixun.try(:identifier)
json.task_pass @shixun&.task_pass
json.(@homework, :work_efficiency, :eff_score)
json.(@homework.homework_detail_manual, :answer_open_evaluation, :shixun_evaluation)
total_exp = 0
json.challenge_settings @homework.shixuns.first.try(:challenges).each do |challenge|
json.challenge_settings @shixun.try(:challenges).each do |challenge|
json.challenge_id challenge.id
json.challenge_name challenge.subject
json.checked challenge_setting(@homework, challenge.id).present?
json.challenge_score challenge_setting(@homework, challenge.id).try(:score).to_f
json.challenge_exp challenge.score
json.difficulty challenge.challenge_difficulty
total_exp += challenge.score
end

@ -906,6 +906,7 @@ Rails.application.routes.draw do
post :lock
post :unlock
post :active
post :reset_login_times
end
end
resource :import_users, only: [:create]

@ -0,0 +1,7 @@
class ReCounterCourseGroups < ActiveRecord::Migration[5.2]
def change
CourseGroup.find_each do |group|
CourseGroup.reset_counters(group.id, :course_members_count)
end
end
end

@ -0,0 +1,10 @@
class CreateCompetitionManagers < ActiveRecord::Migration[5.2]
def change
create_table :competition_managers do |t|
t.references :user
t.references :competition
t.timestamps
end
end
end

@ -0,0 +1,7 @@
class AddStatisticsToCourseModule < ActiveRecord::Migration[5.2]
def change
Course.includes(:course_modules).all.each do |course|
CourseModule.create!(course_id: course.id, module_type: "statistics", hidden:0, module_name: "统计", position: course.course_modules.pluck(:position).max + 1)
end
end
end

@ -83,7 +83,7 @@ namespace :poll_publish do
end
task :end => :environment do
puts "--------------------------------poll_publish end start"
#1.统一设置的截止
polls = Poll.includes(:poll_users).where("polls_status = 2 AND end_time <=?",Time.now + 900)
polls.each do |poll|
@ -92,6 +92,7 @@ namespace :poll_publish do
end
#2.分班设置的截止
# polls = Poll.includes(:poll_users).where("polls_status = 2 AND unified_setting = false AND end_time > ?",Time.now + 900)
# poll_ids = polls.blank? ? "(-1)" : "(" + polls.map(&:id).join(",") + ")"
# polls_group_settings = PollGroupSetting.where("end_time <= '#{Time.now}' and poll_id in #{poll_ids}")

File diff suppressed because one or more lines are too long

@ -136184,6 +136184,33 @@ $(document).on('turbolinks:load', function(){
$('.sponsor-select').select2(selectOptions);
$('.allow-school-select').select2(selectOptions);
$('.manager-select').select2({
theme: 'bootstrap4',
placeholder: '请输入要添加的管理员姓名',
multiple: true,
minimumInputLength: 1,
ajax: {
delay: 500,
url: '/admins/users',
dataType: 'json',
data: function(params){
return { keyword: params.term };
},
processResults: function(data){
return { results: data.users }
}
},
templateResult: function (item) {
if(!item.id || item.id === '') return item.text;
return $("<span>" + item.real_name + " <span class='font-12'>" + item.school_name + ' ' + item.hidden_phone + "</span></span>");
},
templateSelection: function(item){
if (item.id) {
}
return item.real_name || item.text;
}
});
// 排行榜
//链接
@ -138762,6 +138789,21 @@ $(document).on('turbolinks:load', function(){
})
});
// reset user login times
$('.users-list-container').on('click', '.reset-login-times-action', function(){
var $action = $(this);
var userId = $action.data('id');
$.ajax({
url: '/admins/users/' + userId + '/reset_login_times',
method: 'POST',
dataType: 'json',
success: function() {
showSuccessNotify();
}
});
});
// ***************** reward grade modal *****************
var $rewardGradeModal = $('.admin-users-reward-grade-modal');
var $form = $rewardGradeModal.find('form.admin-users-reward-grade-form');

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1079,14 +1079,14 @@
<div class="name">下降</div>
<div class="code-name">&amp;#xe669;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe800;</span>
<div class="name">复制</div>
<div class="code-name">&amp;#xe800;</div>
<li class="dib">
<span class="icon iconfont">&#xe800;</span>
<div class="name">复制</div>
<div class="code-name">&amp;#xe800;</div>
</li>
<li class="dib">
<li class="dib">
<span class="icon iconfont">&#xe7f9;</span>
<div class="name">更多</div>
<div class="code-name">&amp;#xe7f9;</div>
@ -1212,6 +1212,12 @@
<div class="code-name">&amp;#xe604;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6d3;</span>
<div class="name">主页</div>
<div class="code-name">&amp;#xe6d3;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6a3;</span>
<div class="name">yunweijiankong</div>
@ -1302,6 +1308,12 @@
<div class="code-name">&amp;#xe6b6;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6bf;</span>
<div class="name">统计</div>
<div class="code-name">&amp;#xe6bf;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6b8;</span>
<div class="name">menu_3voucher</div>
@ -1343,31 +1355,31 @@
<div class="name">nenghaofenxi@1x</div>
<div class="code-name">&amp;#xe6be;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6c1;</span>
<div class="name">detection@1x</div>
<div class="code-name">&amp;#xe6c1;</div>
<li class="dib">
<span class="icon iconfont">&#xe6c1;</span>
<div class="name">detection@1x</div>
<div class="code-name">&amp;#xe6c1;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6c2;</span>
<div class="name">community@1x</div>
<div class="code-name">&amp;#xe6c2;</div>
<li class="dib">
<span class="icon iconfont">&#xe6c2;</span>
<div class="name">community@1x</div>
<div class="code-name">&amp;#xe6c2;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6c3;</span>
<div class="name">hosting@1x</div>
<div class="code-name">&amp;#xe6c3;</div>
<li class="dib">
<span class="icon iconfont">&#xe6c3;</span>
<div class="name">hosting@1x</div>
<div class="code-name">&amp;#xe6c3;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6c4;</span>
<div class="name">project@1x</div>
<div class="code-name">&amp;#xe6c4;</div>
<li class="dib">
<span class="icon iconfont">&#xe6c4;</span>
<div class="name">project@1x</div>
<div class="code-name">&amp;#xe6c4;</div>
</li>
</ul>
<div class="article markdown">
<h2 id="unicode-">Unicode 引用</h2>
@ -2992,17 +3004,17 @@
<div class="code-name">.icon-xiajiang
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-fuzhi1"></span>
<div class="name">
复制
</div>
<div class="code-name">.icon-fuzhi1
</div>
</li>
<li class="dib">
<li class="dib">
<span class="icon iconfont icon-fuzhi1"></span>
<div class="name">
复制
</div>
<div class="code-name">.icon-fuzhi1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-gengduo1"></span>
<div class="name">
更多
@ -3191,6 +3203,15 @@
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-zhuye"></span>
<div class="name">
主页
</div>
<div class="code-name">.icon-zhuye
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-yunweijiankong"></span>
<div class="name">
@ -3326,6 +3347,15 @@
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-tongji"></span>
<div class="name">
统计
</div>
<div class="code-name">.icon-tongji
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-menu_voucher"></span>
<div class="name">
@ -3388,43 +3418,43 @@
<div class="code-name">.icon-nenghaofenxix
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-detectionx"></span>
<div class="name">
detection@1x
</div>
<div class="code-name">.icon-detectionx
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-communityx"></span>
<div class="name">
community@1x
</div>
<div class="code-name">.icon-communityx
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-hostingx2"></span>
<div class="name">
hosting@1x
</div>
<div class="code-name">.icon-hostingx2
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-projectx"></span>
<div class="name">
project@1x
</div>
<div class="code-name">.icon-projectx
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-detectionx"></span>
<div class="name">
detection@1x
</div>
<div class="code-name">.icon-detectionx
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-communityx"></span>
<div class="name">
community@1x
</div>
<div class="code-name">.icon-communityx
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-hostingx2"></span>
<div class="name">
hosting@1x
</div>
<div class="code-name">.icon-hostingx2
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-projectx"></span>
<div class="name">
project@1x
</div>
<div class="code-name">.icon-projectx
</div>
</li>
</ul>
<div class="article markdown">
<h2 id="font-class-">font-class 引用</h2>
@ -4853,16 +4883,16 @@
<div class="name">下降</div>
<div class="code-name">#icon-xiajiang</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-fuzhi1"></use>
</svg>
<div class="name">复制</div>
<div class="code-name">#icon-fuzhi1</div>
</li>
<li class="dib">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-fuzhi1"></use>
</svg>
<div class="name">复制</div>
<div class="code-name">#icon-fuzhi1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-gengduo1"></use>
</svg>
@ -5030,6 +5060,14 @@
<div class="code-name">#icon-tianjiadaohang</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-zhuye"></use>
</svg>
<div class="name">主页</div>
<div class="code-name">#icon-zhuye</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-yunweijiankong"></use>
@ -5150,6 +5188,14 @@
<div class="code-name">#icon-xuexizhongxin</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-tongji"></use>
</svg>
<div class="name">统计</div>
<div class="code-name">#icon-tongji</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-menu_voucher"></use>
@ -5205,38 +5251,38 @@
<div class="name">nenghaofenxi@1x</div>
<div class="code-name">#icon-nenghaofenxix</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-detectionx"></use>
</svg>
<div class="name">detection@1x</div>
<div class="code-name">#icon-detectionx</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-communityx"></use>
</svg>
<div class="name">community@1x</div>
<div class="code-name">#icon-communityx</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-hostingx2"></use>
</svg>
<div class="name">hosting@1x</div>
<div class="code-name">#icon-hostingx2</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-projectx"></use>
</svg>
<div class="name">project@1x</div>
<div class="code-name">#icon-projectx</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-detectionx"></use>
</svg>
<div class="name">detection@1x</div>
<div class="code-name">#icon-detectionx</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-communityx"></use>
</svg>
<div class="name">community@1x</div>
<div class="code-name">#icon-communityx</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-hostingx2"></use>
</svg>
<div class="name">hosting@1x</div>
<div class="code-name">#icon-hostingx2</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-projectx"></use>
</svg>
<div class="name">project@1x</div>
<div class="code-name">#icon-projectx</div>
</li>
</ul>
<div class="article markdown">

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1384,6 +1384,13 @@
"unicode": "e604",
"unicode_decimal": 58884
},
{
"icon_id": "8361866",
"name": "主页",
"font_class": "zhuye",
"unicode": "e6d3",
"unicode_decimal": 59091
},
{
"icon_id": "9219273",
"name": "yunweijiankong",
@ -1489,6 +1496,13 @@
"unicode": "e6b6",
"unicode_decimal": 59062
},
{
"icon_id": "10527626",
"name": "统计",
"font_class": "tongji",
"unicode": "e6bf",
"unicode_decimal": 59071
},
{
"icon_id": "10610051",
"name": "menu_3voucher",

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 303 KiB

After

Width:  |  Height:  |  Size: 306 KiB

@ -150,16 +150,16 @@ export function initAxiosInterceptors(props) {
throw new axios.Cancel('Operation canceled by the user.');
} else {
// hash跳转
var hash = window.location.hash;
if (hash) {
hashTimeout && window.clearTimeout(hashTimeout)
hashTimeout = setTimeout(() => {
var element = document.querySelector(hash);
if (element) {
element.scrollIntoView();
}
}, 400)
}
// var hash = window.location.hash;
// if (hash) {
// hashTimeout && window.clearTimeout(hashTimeout)
// hashTimeout = setTimeout(() => {
// var element = document.querySelector(hash);
// if (element) {
// element.scrollIntoView();
// }
// }, 400)
// }
}
// if(response.data.status === 401){
// console.log("401401401")

@ -68,7 +68,8 @@ class Registration extends React.Component {
mutiple_limited: false,
teamutiple_limited: false,
members_count: 0,
mode: 0
mode: 0,
region_schools: [],
}
}
@ -82,8 +83,8 @@ class Registration extends React.Component {
// //// //////console.log(this.props.isAdmin())
try {
const {keyword, page, per_page} = this.state;
this.Getdata(keyword, page, per_page, this.props.user.admin);
this.GetenrollmentAPI();
this.Getdata(keyword, page, per_page, this.props.user.admin);// 获取列表数据
this.GetenrollmentAPI();//获取我的报名配置
} catch (e) {
// const {keyword, page, per_page} = this.state;
// this.Getdata(keyword, page, per_page, this.props.isAdmin());
@ -104,6 +105,8 @@ class Registration extends React.Component {
this.Getdata(keyword, page, per_page, this.props.user.admin);
//取报名配置
this.GetenrollmentAPI();
//取模式
this.Getdataheader();
}
}
@ -116,6 +119,7 @@ class Registration extends React.Component {
if (result.data) {
this.setState({
mode: result.data.mode,
region_schools: result.data.region_schools
})
}
@ -454,6 +458,37 @@ class Registration extends React.Component {
return
}
let {region_schools} = this.state;
//判断是否是否是同一个学校数组元素为0就不用判断
try {
if (region_schools.length > 0) {
let i = 0;
for (var r = 0; r < region_schools.length; r++) {
if (region_schools[r] === this.props.user.user_school) {
// 终止循环
break;
}
i = i + 1;
}
if (i === region_schools.length) {
//如果i 等于region_schools.length说明本次循环中没有相同的学校本人不支持报名
try {
this.props.showNotification(`本竞赛只面向部分学校/单位开放,你暂时没有参赛资格!`);
} catch (e) {
}
this.Getdataheader();
return
}
}
} catch (e) {
}
if (this.props.user.is_teacher === true) {
try {
@ -541,6 +576,34 @@ class Registration extends React.Component {
return
}
let {region_schools} = this.state;
//判断是否是否是同一个学校数组元素为0就不用判断
try {
if (region_schools.length > 0) {
let i = 0;
for (var r = 0; r < region_schools.length; r++) {
if (region_schools[r] === this.props.user.user_school) {
// 终止循环
break;
}
i = i + 1;
}
if (i === region_schools.length) {
//如果i 等于region_schools.length说明本次循环中没有相同的学校本人不支持报名
try {
this.props.showNotification(`本竞赛只面向部分学校/单位开放,你暂时没有参赛资格!`);
} catch (e) {
}
this.Getdataheader();
return
}
}
} catch (e) {
}
if (this.props.user.is_teacher === true) {

@ -124,7 +124,7 @@ class CompetitionsIndex extends Component{
size="large"
dataSource={datas&&datas}
renderItem={(item,key) => (
<a href={item.competition_status==="ended"?`/competitions/${item.identifier}/common_header`:item.competition_status==="nearly_published"? this.props.current_user&&this.props.current_user.business===true?`/competitions/${item.identifier}/common_header`:this.props.current_user&&this.props.current_user.admin===true?`/competitions/${item.identifier}/common_header`:null:item.competition_status==="progressing"?`/competitions/${item.identifier}/common_header`:null}
<a target="_blank" href={item.competition_status==="ended"?`/competitions/${item.identifier}/common_header`:item.competition_status==="nearly_published"? this.props.current_user&&this.props.current_user.business===true?`/competitions/${item.identifier}/common_header`:this.props.current_user&&this.props.current_user.admin===true?`/competitions/${item.identifier}/common_header`:null:item.competition_status==="progressing"?`/competitions/${item.identifier}/common_header`:null}
className={item.competition_status==="ended"?"competitionstitlesshou":item.competition_status==="nearly_published"?
this.props.current_user&&this.props.current_user.admin===true?"competitionstitlesshou":this.props.current_user&&this.props.current_user.business===true?"competitionstitlesshou":"endedfont":"competitionstitlesshou"}
>
@ -181,7 +181,7 @@ class CompetitionsIndex extends Component{
<List.Item.Meta
title={<a className={item.competition_status==="ended"?"competitionstitlesshou":item.competition_status==="nearly_published"?
this.props.current_user&&this.props.current_user.admin===true?"competitionstitlesshou":this.props.current_user&&this.props.current_user.business===true?"competitionstitlesshou":"endedfont":"competitionstitlesshou"}>
<a className={"competitionstitles"}
<a target="_blank" className={"competitionstitles"}
href={item.competition_status==="ended"?`/competitions/${item.identifier}/common_header`:item.competition_status==="nearly_published"? this.props.current_user&&this.props.current_user.business===true?`/competitions/${item.identifier}/common_header`:this.props.current_user&&this.props.current_user.admin===true?`/competitions/${item.identifier}/common_header`:null:item.competition_status==="progressing"?`/competitions/${item.identifier}/common_header`:null}
>{item.name}{item.sub_title===null?"":`——${item.sub_title}`}</a>
{/*<span>{item.sub_title===null?"":*/}

@ -31,6 +31,9 @@ class CompetitionCommon extends Component{
window.document.title = '竞赛';
if(this.props.match.params.identifier!=null){
this.getbannerdata();
// this.setState({
// thiskeys:this.props.location.search.replace('?menu=', '')
// })
// let url=`/competitions/${this.props.match.params.identifier}.json`;
// axios.get(url).then((response) => {
// if(response.status===200){
@ -45,19 +48,34 @@ class CompetitionCommon extends Component{
}
getbannerdata=()=>{
let menuid=this.props.location.search.replace('?menu=', '');
let url=`/competitions/${this.props.match.params.identifier}/common_header.json`;
axios.get(url).then((response) => {
if(response.status===200){
this.setState({
data:response.data,
thiskeys:response.data.competition_modules[0].id
data:response.data,
thiskeys:menuid===undefined||menuid===""?response.data.competition_modules[0].id:menuid
})
this.getrightdata(
response.data.competition_modules[0].id,
response.data.competition_modules[0].module_type,
response.data.competition_modules[0].module_url,
response.data.competition_modules[0].has_url
)
if(menuid===undefined||menuid===""){
this.getrightdata(
response.data.competition_modules[0].id,
response.data.competition_modules[0].module_type,
response.data.competition_modules[0].module_url,
response.data.competition_modules[0].has_url
)
}else{
let newlist=response.data.competition_modules;
newlist.map((item,key)=>{
if(`${item.id}`===`${menuid}`){
this.getrightdata(
item.id,
item.module_type,
item.module_url,
item.has_url
)
}
})
}
}
}).catch((error) => {
console.log(error)
@ -83,6 +101,7 @@ class CompetitionCommon extends Component{
getrightdatas=(e)=>{
let keys=parseInt(e.key);
this.getlistdata(keys)
this.props.history.replace(`?menu=${keys}`);
}
getlistdata=(keys,listkey)=>{
@ -109,7 +128,7 @@ class CompetitionCommon extends Component{
if(response.status===200){
this.setState({
chart_rules:response.data,
tabkey:tabkey===undefined?response.data.stages[0].id===null?"0":`${response.data.stages[0].id}`:tabkey
tabkey:tabkey===undefined?response.data.stages[0].id===null?"0":`${response.data.stages[0].id}`:tabkey
})
@ -121,6 +140,7 @@ class CompetitionCommon extends Component{
}
getrightdata=(id,typeid,module_url,has_url,listkey)=>{
// if(typeid==="enroll"){
// this.props.history.replace(`/competitions/${this.props.match.params.identifier}/enroll`);
// return
@ -234,7 +254,7 @@ class CompetitionCommon extends Component{
}
render() {
let {data,has_url,module_type,Competitionedittype,mdContentdata}=this.state;
let {data,thiskeys,Competitionedittype}=this.state;
return (
data===undefined?"":<div className={"educontent clearfix mt20 "}>
@ -327,7 +347,7 @@ class CompetitionCommon extends Component{
<Layout className={'teamsLayout mt40'}>
<Sider>
<Menu mode="inline" className="CompetitionMenu" defaultSelectedKeys={[`${this.state.thiskeys}`]} onClick={(e)=>this.getrightdatas(e)}>
<Menu mode="inline" className="CompetitionMenu" selectedKeys={[`${this.state.thiskeys}`]} onClick={(e)=>this.getrightdatas(e)}>
{data&&data.competition_modules.map((item,key)=>{
if(item.module_type!="enroll"){
return(

@ -9,20 +9,19 @@ class CompetitionContents extends Component{
constructor(props) {
super(props)
this.state={
hash:undefined
}
}
componentDidMount(){
window.document.title = '竞赛';
this.props.MdifHasAnchorJustScorll();
}
render() {
let{mdContentdata}=this.props;
//
let{mdContentdata}=this.props;
//mdhash滚动
this.props.MdifHasAnchorJustScorll();
return (
<div className={"fr"}>

@ -30,6 +30,7 @@ class CompetitionContents extends Component{
}).catch((error) => {
console.log(error)
})
this.props.MdifHasAnchorJustScorll();
}
derivefun=(url)=>{
@ -65,6 +66,7 @@ class CompetitionContents extends Component{
});
}
render() {
this.props.MdifHasAnchorJustScorll();
const operations = <div>
<Button className={"fr"} type="primary" ghost onClick={()=>this.props.Competitionedit()}>编辑</Button>
<Button className={"fr mr20"} type="primary" ghost>
@ -76,40 +78,40 @@ class CompetitionContents extends Component{
title: 'usersum',
dataIndex: 'usersum',
key: 'name',
render: text => <a className={"color-blue"}>{text}</a>,
render: text => <span className={"color-blue"}>{text}</span>,
},
{
title: 'userimg',
dataIndex: 'userimg',
key: 'userimg',
render: (text, record) =>(
<a href={`/users/${record.user_login}`} className="color-dark">
<span href={`/users/${record.user_login}`} className="color-dark">
<img className={"Competitionuserimg"} src={getImageUrl(`images/${record.userimg===null?`avatars/User/0?1442652658`:record.userimg}`)}/>
</a>),
</span>),
},
{
title: 'username',
dataIndex: 'username',
key: 'username',
render: text => <a title={text}>{text}</a>,
render: text => <span title={text}>{text}</span>,
},
{
title: 'school',
dataIndex: 'school',
key: 'school',
render: text => <a title={text}>{text}</a>,
render: text => <span title={text}>{text}</span>,
},
{
title: 'spendtime',
dataIndex: 'spendtime',
key: 'spendtime',
render: text => <a>{text}</a>,
render: text => <span>{text}</span>,
},
{
title: 'score',
dataIndex: 'score',
key: 'score',
render: text => <a className={"color-blue"}>{text}</a>,
render: text => <span className={"color-blue"}>{text}</span>,
},
];

@ -477,8 +477,9 @@ class CoursesBanner extends Component {
render() {
let { Addcoursestypes, coursedata,excellent, modalsType, modalsTopval, loadtype,modalsBottomval,antIcon,is_guide,AccountProfiletype,modalstrsvalue} = this.state;
const isCourseEnd = this.props.isCourseEnd()
document.title=coursedata===undefined || coursedata.status===401 || coursedata.status===407?"":coursedata.name;
const isCourseEnd = this.props.isCourseEnd();
document.title=coursedata===undefined || coursedata.status===401 || coursedata.status===407?"":coursedata.name;
return (
<div>
{/*{*/}
@ -705,18 +706,29 @@ class CoursesBanner extends Component {
`}
</style>
<Breadcrumb separator="|" className={"mt5"}>
<Breadcrumb.Item onClick={()=>this.setHistoryFun("/courses/"+this.props.match.params.coursesId+"/teachers")} className={"pointer"}>
<span className="color-grey-c font-16"><span className={"mr10"}>教师</span> <span className={"mr10"}>{coursedata.teacher_count}</span></span>
<Breadcrumb.Item className={"pointer"}>
<Tooltip visible={coursedata.teacher_applies_count===undefined?false:coursedata.teacher_applies_count>0?true:false}
placement="topLeft"
title={<pre>{coursedata.teacher_applies_count===undefined?"":coursedata.teacher_applies_count>0?<span>您有{coursedata.teacher_applies_count}条新的加入申请<a className={"daishenp"} onClick={()=>this.setHistoryFun("/courses/"+this.props.match.params.coursesId+"/teachers?tab=2")}>待审批</a></span>:""}</pre>}>
<span className="color-grey-c font-16" onClick={()=>this.setHistoryFun("/courses/"+this.props.match.params.coursesId+"/teachers")}>
<span className={"mr10"}>教师</span>
<span className={"mr10"}>{coursedata.teacher_count}</span>
</span>
</Tooltip>
</Breadcrumb.Item>
<Breadcrumb.Item
className={excellent===true&&coursedata.course_end === true?this.props.isAdminOrTeacher()===true?"pointer":"":"pointer"}
onClick={excellent===true&&coursedata.course_end === true?this.props.isAdminOrTeacher()===true?()=>this.setHistoryFun("/courses/"+this.props.match.params.coursesId+"/students"):"":()=>this.setHistoryFun("/courses/"+this.props.match.params.coursesId+"/students")}
>
<span className="color-grey-c font-16"><span className={"mr10 ml10"}>学生</span> <span className={"mr10"}>{coursedata.student_count}</span></span>
</Breadcrumb.Item>
<Breadcrumb.Item>{coursedata.credit===null?"":
<span className="color-grey-c font-16"><span className={"mr10 ml10"}>学分</span> <span className={"mr10"}>{coursedata.credit}</span></span>
}</Breadcrumb.Item>
</Breadcrumb>
{/*<li className={"mt7 teachersbox"} >*/}

@ -391,9 +391,8 @@ class OneSelfOrderModal extends Component{
{this.props.modaltype===undefined||this.props.modaltype===2
|| this.props.usingCheckBeforePost ?"":<div className="clearfix edu-txt-center lineh-40 F4FAFF">
<li style={{ width: '100%',padding: "0px 10px"}} className={"mb10"}>
<span style={{"float":"left","color":"#05101A"}} className="task-hide color-grey-name ml50">分班名称</span>
<span style={{"float":"right","color":"#05101A"}} className="task-hide color-grey-name mr70">截止时间</span>
<span style={{"float":"left","color":"#05101A"}} className="task-hide color-grey-name color-grey-9">分班名称</span>
<span style={{"float":"right","color":"#05101A","margin-right": "145px"}} className="task-hide color-grey-name color-grey-9">截止时间</span>
</li>
</div>}
{this.props.modaltype===undefined||this.props.modaltype===2

@ -1744,4 +1744,9 @@ input.ant-input-number-input:focus {
line-height: 62px;
color: #fff;
margin: 0 auto;
}
.daishenp{
color: #F79946 !important;
text-decoration: underline !important;
}

@ -542,6 +542,7 @@ class Exercise extends Component{
{...this.props}
{...this.state}
style="grey"
single={true}
checkBoxValues={this.state.checkBoxValues}
action={this.reloadList}
></ImmediatelyEnd>

@ -421,8 +421,8 @@ class Testpapersettinghomepage extends Component{
className={"btn fr color-blue font-16 mt20 mr20"}
checkBoxValues={[parseInt(this.props.match.params.Id)]}
Exercisetype={"exercise"}
// single={true}
action={this.Commonheadofthetestpaper}
single={true}
></ImmediatelyEnd>:"":""}
{isAdmin === true?Commonheadofthetestpaper!==undefined&&Commonheadofthetestpaper.user_permission.exercise_unpublish_count>0? <ImmediatelyPublish
{...this.props}

@ -50,10 +50,14 @@ function CourseGroupChooserModal({ course_groups = [], isAdminOrCreator, item, i
application_id: record.application_id,
approval: approval,
group_id: arg_course_groups
})
props.showNotification(`${approval == 1? '同意' : '拒绝'}`)
fetchAll(1)
modalEl.current.setVisible(false)
}).then((result) => {
if (result.data.status === 0) {
props.showNotification(`${approval == 1? '同意' : '拒绝'}`)
fetchAll(1)
modalEl.current.setVisible(false)
window.location.reload();
}})
}
return (
<ModalWrapper

@ -258,7 +258,7 @@ class studentsList extends Component{
// approval 2 - 拒绝
onAgree = (record, approval = 1) => {
const isAdminOrCreator = this.props.isAdminOrCreator()
const { course_groups } = this.state
const { course_groups ,filterKey} = this.state
if (approval == 1 && isAdminOrCreator && course_groups && course_groups.length) {
this.setState({ clickRecord: record}, () => {
this.setGroupChooserModalVisible(true)
@ -280,7 +280,7 @@ class studentsList extends Component{
.then((response) => {
if (response.data.status == 0) {
this.props.showNotification(`${approval == 1? '同意' : '拒绝'}`)
this.fetchAll(1)
this.fetchAll(1,filterKey)
}
})
.catch(function (error) {
@ -299,7 +299,20 @@ class studentsList extends Component{
this.setState({
isSpin:true
})
this.fetchAll(1);
let newmenuid=this.props.location.search.replace('?tab=', '');
if(newmenuid===undefined||newmenuid===""||newmenuid==="1"||newmenuid===1){
this.setState({
filterKey:'1'
})
this.fetchAll(1,'1');
}else{
this.setState({
filterKey:'2'
})
this.fetchAll(1,'2');
}
const isAdminOrTeacher = this.props.isAdminOrTeacher()
const isAdmin = this.props.isAdmin()
@ -319,10 +332,11 @@ class studentsList extends Component{
this.getCourseGroups()
}
addTeacherSuccessListener = (e, data) => {
// const params = JSON.parse(data)
// const coursesId = this.props.match.params.coursesId
if (window.location.pathname.endsWith('teachers')) {
this.fetchAll(1)
this.fetchAll(1,this.state.filterKey)
} else {
// this.props.history.push(`/courses/${coursesId}/teachers`)
}
@ -382,9 +396,11 @@ class studentsList extends Component{
});
}
onChangeRoleSuccess = () => {
this.fetchAll()
this.fetchAll(undefined,this.state.filterKey)
}
fetchAll = async (argPage) => {
fetchAll = async (argPage,filterKey) => {
let { searchValue }=this.state
this.setState({
isSpin:true
})
@ -395,7 +411,7 @@ class studentsList extends Component{
const sortedInfo = this.state.sortedInfo;
let page = argPage || this.state.page
let { searchValue, filterKey }=this.state
let order = 1;
if (sortedInfo.columnKey == 'role') {
order = 1;
@ -463,8 +479,8 @@ class studentsList extends Component{
// join_graduation_group
joinGraduationGroup = (graduation_group_id) => {
const courseId = this.props.match.params.coursesId
const courseId = this.props.match.params.coursesId
let { filterKey }=this.state
let url= `/courses/${courseId}/join_graduation_group.json`;
axios.post(url, {
course_member_list: this.state.checkBoxValues.map (item => { return { course_member_id: item } }),
@ -472,7 +488,7 @@ class studentsList extends Component{
}).then((result)=>{
if(result.data.status==0){
this.props.showNotification('操作成功。')
this.fetchAll()
this.fetchAll(undefined,filterKey)
}
}).catch((error)=>{
console.log(error);
@ -480,6 +496,7 @@ class studentsList extends Component{
}
onInputSearchChange = (e) => {
let {filterKey}=this.state;
this.setState({
searchValue: e.target.value
})
@ -488,12 +505,12 @@ class studentsList extends Component{
clearTimeout(this.timeoutHandler)
}
this.timeoutHandler = setTimeout(() => {
this.fetchAll(1)
this.fetchAll(1,filterKey)
}, 1200)
}
onPressEnter = (e) => {
this.fetchAll(1)
this.fetchAll(1,this.state.filterKey)
}
@ -530,7 +547,7 @@ class studentsList extends Component{
changeRole = (member, role) => {
const courseId = this.props.match.params.coursesId
let {filterKey}=this.state;
let url= `/courses/${courseId}/change_course_teacher.json`;
axios.post(url, {
course_member_id: member.course_member_id
@ -543,7 +560,7 @@ class studentsList extends Component{
}).then((result)=>{
if(result.data.status==0){
this.props.showNotification('操作成功。')
this.fetchAll()
this.fetchAll(undefined,filterKey)
}
}).catch((error)=>{
console.log(error);
@ -559,9 +576,11 @@ class studentsList extends Component{
this.refs.addAdminModal.setVisible(true)
}
changeAdminSuccess = () => {
this.fetchAll()
let {filterKey}=this.state;
this.fetchAll(undefined,filterKey)
}
onDelete = (member) => {
let {filterKey}=this.state;
this.props.confirm({
content: `确认要将“${member.name}”从教师列表中移除吗?`,
onOk: () => {
@ -577,7 +596,7 @@ class studentsList extends Component{
// {"status":1,"message":"删除成功"}
this.props.showNotification('删除成功')
trigger('updatabanner')
this.fetchAll()
this.fetchAll(undefined,filterKey)
}
})
.catch(function (error) {
@ -602,12 +621,13 @@ class studentsList extends Component{
}
onTableChange = (pagination, filters, sorter) => {
let {filterKey}=this.state;
console.log('Various parameters', pagination, filters, sorter);
this.setState({
page: pagination.current,
sortedInfo: sorter,
}, () => {
this.fetchAll()
this.fetchAll(undefined,filterKey)
});
};
clearSelection = () => {
@ -620,7 +640,7 @@ class studentsList extends Component{
page:1,
isSpin:true
}, () => {
this.fetchAll();
this.fetchAll(undefined,e.key);
})
}
setGroupChooserModalVisible = (visible) => {
@ -654,7 +674,9 @@ class studentsList extends Component{
const isSuperAdmin = this.props.isSuperAdmin()
const hasGraduationModule = this.hasGraduationModule()
const coursesId = this.props.match.params.coursesId
return(
<React.Fragment>
{/* <AddTeacherModal ref="addTeacherModal"
@ -693,7 +715,7 @@ class studentsList extends Component{
}
secondRowLeft={
isAdminOrTeacher ? <div className="fl mt6 task_menu_ul " style={{ width: '600px' }}>
<Menu mode="horizontal" defaultSelectedKeys="1" onClick={this.selectedStatus}>
<Menu mode="horizontal" selectedKeys={[`${this.state.filterKey}`]} onClick={this.selectedStatus}>
<Menu.Item key="1">已审批({total_count})</Menu.Item>
<Menu.Item key="2">待审批({apply_size})</Menu.Item>
</Menu>
@ -740,9 +762,11 @@ class studentsList extends Component{
<div className="mt20 edu-back-white padding20 teacherList">
{ course_groups && !!course_groups.length && <CourseGroupChooserModal
{...this.state}
{...this.props}
props={{match: this.props.match, showNotification: this.props.showNotification}}
record={this.state.clickRecord}
fetchAll={this.fetchAll}
fetchAll={(e)=>this.fetchAll(e,this.state.filterKey)}
course_groups={course_groups}
visible={this.state.groupChooserModalVisible}
setVisible={this.setGroupChooserModalVisible}

@ -563,6 +563,7 @@ class Poll extends Component{
{...this.props}
{...this.state}
style="grey"
single={true}
checkBoxValues={this.state.checkBoxValues}
action={this.successFun}
></ImmediatelyEnd>

@ -202,7 +202,7 @@ class PollDetailIndex extends Component{
className={"font-16"}
checkBoxValues={[this.props.match.params.pollId]}
action={this.getPollInfo}
single={true}
// single={true}
></ImmediatelyEnd>
</li>
:""

@ -14,6 +14,7 @@ export function ImageLayerOfCommentHOC(options = {}) {
imageSrc: ''
}
}
onDelegateClick = (event) => {
const imageSrc = event.target.src || event.target.getAttribute('src') || event.target.getAttribute('href')
// 判断imageSrc是否是图片
@ -35,6 +36,7 @@ export function ImageLayerOfCommentHOC(options = {}) {
return false;
}
}
// jQuery._data( $('.newMain')[0], "events" )
componentDidMount() {
this.props.wrappedComponentRef && this.props.wrappedComponentRef(this.refs['wrappedComponentRef'])
@ -45,6 +47,7 @@ export function ImageLayerOfCommentHOC(options = {}) {
.delegate(options.imgSelector || ".J_Comment_Reply .comment_content img, .J_Comment_Reply .childrenCommentsView img","click", this.onDelegateClick);
}, 1200)
}
componentWillUnmount() {
$(options.parentSelector || ".commentsDelegateParent", 'click', this.onDelegateClick)
}
@ -55,9 +58,24 @@ export function ImageLayerOfCommentHOC(options = {}) {
imageSrc: '',
})
}
MdifHasAnchorJustScorll=()=>{
//mdhash滚动
let anchor = decodeURI(this.props.location.hash).replace('#', '');
// 对应id的话, 滚动到相应位置
if (!!anchor) {
let anchorElement = document.getElementsByName(anchor);
if (anchorElement) {
if (anchorElement.length!=0) {
anchorElement[anchorElement.length-1].scrollIntoView();
}
}
}
}
render() {
this.MdifHasAnchorJustScorll();
return (
<React.Fragment>
<ImageLayer {...this.state} onImageLayerClose={this.onImageLayerClose}></ImageLayer>

@ -609,6 +609,21 @@ export function TPMIndexHOC(WrappedComponent) {
hideGlobalLoading = () => {
this.setState({ globalLoading: false })
}
MdifHasAnchorJustScorll=()=>{
//mdhash滚动
let anchor = decodeURI(this.props.location.hash).replace('#', '');
// 对应id的话, 滚动到相应位置
if (!!anchor) {
let anchorElement = document.getElementsByName(anchor);
if (anchorElement) {
if (anchorElement.length>0){
anchorElement[anchorElement.length-1].scrollIntoView();
}
}
}
}
render() {
let{Headertop,Footerdown, isRender, AccountProfiletype,mygetHelmetapi}=this.state;
const common = {
@ -643,6 +658,7 @@ export function TPMIndexHOC(WrappedComponent) {
hideGlobalLoading: this.hideGlobalLoading,
yslslowCheckresults:this.yslslowCheckresults,
yslslowCheckresultsNo:this.yslslowCheckresultsNo,
MdifHasAnchorJustScorll:this.MdifHasAnchorJustScorll
};
// console.log("this.props.mygetHelmetapi");

@ -1079,14 +1079,14 @@
<div class="name">下降</div>
<div class="code-name">&amp;#xe669;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe800;</span>
<div class="name">复制</div>
<div class="code-name">&amp;#xe800;</div>
<li class="dib">
<span class="icon iconfont">&#xe800;</span>
<div class="name">复制</div>
<div class="code-name">&amp;#xe800;</div>
</li>
<li class="dib">
<li class="dib">
<span class="icon iconfont">&#xe7f9;</span>
<div class="name">更多</div>
<div class="code-name">&amp;#xe7f9;</div>
@ -1212,6 +1212,12 @@
<div class="code-name">&amp;#xe604;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6d3;</span>
<div class="name">主页</div>
<div class="code-name">&amp;#xe6d3;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6a3;</span>
<div class="name">yunweijiankong</div>
@ -1302,6 +1308,12 @@
<div class="code-name">&amp;#xe6b6;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6bf;</span>
<div class="name">统计</div>
<div class="code-name">&amp;#xe6bf;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6b8;</span>
<div class="name">menu_3voucher</div>
@ -1343,31 +1355,31 @@
<div class="name">nenghaofenxi@1x</div>
<div class="code-name">&amp;#xe6be;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6c1;</span>
<div class="name">detection@1x</div>
<div class="code-name">&amp;#xe6c1;</div>
<li class="dib">
<span class="icon iconfont">&#xe6c1;</span>
<div class="name">detection@1x</div>
<div class="code-name">&amp;#xe6c1;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6c2;</span>
<div class="name">community@1x</div>
<div class="code-name">&amp;#xe6c2;</div>
<li class="dib">
<span class="icon iconfont">&#xe6c2;</span>
<div class="name">community@1x</div>
<div class="code-name">&amp;#xe6c2;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6c3;</span>
<div class="name">hosting@1x</div>
<div class="code-name">&amp;#xe6c3;</div>
<li class="dib">
<span class="icon iconfont">&#xe6c3;</span>
<div class="name">hosting@1x</div>
<div class="code-name">&amp;#xe6c3;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6c4;</span>
<div class="name">project@1x</div>
<div class="code-name">&amp;#xe6c4;</div>
<li class="dib">
<span class="icon iconfont">&#xe6c4;</span>
<div class="name">project@1x</div>
<div class="code-name">&amp;#xe6c4;</div>
</li>
</ul>
<div class="article markdown">
<h2 id="unicode-">Unicode 引用</h2>
@ -2992,17 +3004,17 @@
<div class="code-name">.icon-xiajiang
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-fuzhi1"></span>
<div class="name">
复制
</div>
<div class="code-name">.icon-fuzhi1
</div>
</li>
<li class="dib">
<li class="dib">
<span class="icon iconfont icon-fuzhi1"></span>
<div class="name">
复制
</div>
<div class="code-name">.icon-fuzhi1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-gengduo1"></span>
<div class="name">
更多
@ -3191,6 +3203,15 @@
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-zhuye"></span>
<div class="name">
主页
</div>
<div class="code-name">.icon-zhuye
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-yunweijiankong"></span>
<div class="name">
@ -3326,6 +3347,15 @@
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-tongji"></span>
<div class="name">
统计
</div>
<div class="code-name">.icon-tongji
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-menu_voucher"></span>
<div class="name">
@ -3388,43 +3418,43 @@
<div class="code-name">.icon-nenghaofenxix
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-detectionx"></span>
<div class="name">
detection@1x
</div>
<div class="code-name">.icon-detectionx
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-communityx"></span>
<div class="name">
community@1x
</div>
<div class="code-name">.icon-communityx
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-hostingx2"></span>
<div class="name">
hosting@1x
</div>
<div class="code-name">.icon-hostingx2
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-projectx"></span>
<div class="name">
project@1x
</div>
<div class="code-name">.icon-projectx
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-detectionx"></span>
<div class="name">
detection@1x
</div>
<div class="code-name">.icon-detectionx
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-communityx"></span>
<div class="name">
community@1x
</div>
<div class="code-name">.icon-communityx
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-hostingx2"></span>
<div class="name">
hosting@1x
</div>
<div class="code-name">.icon-hostingx2
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-projectx"></span>
<div class="name">
project@1x
</div>
<div class="code-name">.icon-projectx
</div>
</li>
</ul>
<div class="article markdown">
<h2 id="font-class-">font-class 引用</h2>
@ -4853,16 +4883,16 @@
<div class="name">下降</div>
<div class="code-name">#icon-xiajiang</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-fuzhi1"></use>
</svg>
<div class="name">复制</div>
<div class="code-name">#icon-fuzhi1</div>
</li>
<li class="dib">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-fuzhi1"></use>
</svg>
<div class="name">复制</div>
<div class="code-name">#icon-fuzhi1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-gengduo1"></use>
</svg>
@ -5030,6 +5060,14 @@
<div class="code-name">#icon-tianjiadaohang</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-zhuye"></use>
</svg>
<div class="name">主页</div>
<div class="code-name">#icon-zhuye</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-yunweijiankong"></use>
@ -5150,6 +5188,14 @@
<div class="code-name">#icon-xuexizhongxin</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-tongji"></use>
</svg>
<div class="name">统计</div>
<div class="code-name">#icon-tongji</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-menu_voucher"></use>
@ -5205,38 +5251,38 @@
<div class="name">nenghaofenxi@1x</div>
<div class="code-name">#icon-nenghaofenxix</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-detectionx"></use>
</svg>
<div class="name">detection@1x</div>
<div class="code-name">#icon-detectionx</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-communityx"></use>
</svg>
<div class="name">community@1x</div>
<div class="code-name">#icon-communityx</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-hostingx2"></use>
</svg>
<div class="name">hosting@1x</div>
<div class="code-name">#icon-hostingx2</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-projectx"></use>
</svg>
<div class="name">project@1x</div>
<div class="code-name">#icon-projectx</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-detectionx"></use>
</svg>
<div class="name">detection@1x</div>
<div class="code-name">#icon-detectionx</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-communityx"></use>
</svg>
<div class="name">community@1x</div>
<div class="code-name">#icon-communityx</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-hostingx2"></use>
</svg>
<div class="name">hosting@1x</div>
<div class="code-name">#icon-hostingx2</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-projectx"></use>
</svg>
<div class="name">project@1x</div>
<div class="code-name">#icon-projectx</div>
</li>
</ul>
<div class="article markdown">

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1384,6 +1384,13 @@
"unicode": "e604",
"unicode_decimal": 58884
},
{
"icon_id": "8361866",
"name": "主页",
"font_class": "zhuye",
"unicode": "e6d3",
"unicode_decimal": 59091
},
{
"icon_id": "9219273",
"name": "yunweijiankong",
@ -1489,6 +1496,13 @@
"unicode": "e6b6",
"unicode_decimal": 59062
},
{
"icon_id": "10527626",
"name": "统计",
"font_class": "tongji",
"unicode": "e6bf",
"unicode_decimal": 59071
},
{
"icon_id": "10610051",
"name": "menu_3voucher",

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 303 KiB

After

Width:  |  Height:  |  Size: 306 KiB

Loading…
Cancel
Save