commit
52041806fe
@ -0,0 +1,22 @@
|
||||
class Ecs::UsersController < Ecs::BaseController
|
||||
skip_before_action :check_user_permission!
|
||||
before_action :check_manager_permission!
|
||||
|
||||
def index
|
||||
users = UserQuery.call(params)
|
||||
|
||||
@count = users.count
|
||||
@users = paginate users.includes(user_extension: [:school, :department])
|
||||
@manager_ids = current_major_school.ec_major_school_users.pluck(:user_id)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def current_major_school
|
||||
@_ec_major_school ||= EcMajorSchool.find(params[:ec_major_school_id])
|
||||
end
|
||||
|
||||
def current_school
|
||||
@_current_school ||= current_major_school.school
|
||||
end
|
||||
end
|
@ -0,0 +1,22 @@
|
||||
module Ecs::EcYearsHelper
|
||||
def achieved_graduation_course_count(ec_year)
|
||||
return 0 if ec_year.ec_courses.count.zero?
|
||||
|
||||
course_ids = ec_year.ec_courses.map(&:id)
|
||||
target_count_map = EcCourseTarget.where(ec_course_id: course_ids).group(:ec_course_id).count
|
||||
|
||||
ec_year.ec_courses.sum { |course| course.complete_target_count == target_count_map[course.id] ? 1 : 0 }
|
||||
end
|
||||
|
||||
def achieved_graduation_objective_count(ec_year)
|
||||
return 0 if ec_year.ec_graduation_subitems.count.zero?
|
||||
|
||||
subitem_ids = ec_year.ec_graduation_subitems.reorder(nil).pluck(:id)
|
||||
|
||||
relations = EcGraduationRequirementCalculation.joins(:ec_course_support).where(ec_course_supports: { ec_graduation_subitem_id: subitem_ids })
|
||||
|
||||
reached_map = relations.where(status: true).group('ec_graduation_subitem_id').count
|
||||
|
||||
reached_map.keys.size
|
||||
end
|
||||
end
|
@ -1,7 +1,6 @@
|
||||
class EcCourseStudentScore < ApplicationRecord
|
||||
belongs_to :ec_year_student
|
||||
belongs_to :ec_course
|
||||
belongs_to :ec_course_target
|
||||
|
||||
has_many :ec_student_score_targets, dependent: :delete_all
|
||||
end
|
@ -1,3 +1,9 @@
|
||||
class ApplicationQuery
|
||||
include Callable
|
||||
|
||||
private
|
||||
|
||||
def strip_param(key)
|
||||
params[key].to_s.strip.presence
|
||||
end
|
||||
end
|
@ -0,0 +1,28 @@
|
||||
class UserQuery < ApplicationQuery
|
||||
attr_reader :params
|
||||
|
||||
def initialize(params)
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
users = User.where(type: 'User')
|
||||
|
||||
# 真实姓名
|
||||
if name = strip_param(:name)
|
||||
users = users.where('LOWER(CONCAT(users.lastname, users.firstname)) LIKE ?', "%#{name.downcase}%")
|
||||
end
|
||||
|
||||
# 单位名称
|
||||
if school = strip_param(:school)
|
||||
users = users.joins(user_extension: :school).where('schools.name LIKE ?', "%#{school}%")
|
||||
end
|
||||
|
||||
# 职业
|
||||
if (identity = strip_param(:identity)) && UserExtension.identities.keys.include?(identity)
|
||||
users = users.joins(:user_extension).where(user_extensions: { identity: identity })
|
||||
end
|
||||
|
||||
users
|
||||
end
|
||||
end
|
@ -1 +1 @@
|
||||
json.course_evaluations @course_evaluations, partial: 'shared/ec_course_evaluation', as: :ec_course_evaluation
|
||||
json.course_evaluations @course_evaluations, partial: 'ecs/course_evaluations/shared/ec_course_evaluation', as: :ec_course_evaluation
|
||||
|
@ -1 +1 @@
|
||||
json.partial! 'shared/ec_course_evaluation', ec_course_evaluation: @course_evaluation
|
||||
json.partial! 'ecs/course_evaluations/shared/ec_course_evaluation', ec_course_evaluation: @course_evaluation
|
||||
|
@ -1 +1 @@
|
||||
json.course_evaluations @course_evaluations, partial: 'shared/ec_course_evaluation_slim', as: :ec_course_evaluation
|
||||
json.course_evaluations @course_evaluations, partial: 'ecs/course_evaluations/shared/ec_course_evaluation_slim', as: :ec_course_evaluation
|
||||
|
@ -1,2 +1,2 @@
|
||||
|
||||
json.course_targets @course_targets, partial: 'shared/course_target', as: :ec_course_target
|
||||
json.course_targets @course_targets, partial: 'ecs/course_targets/shared/course_target', as: :ec_course_target
|
||||
|
@ -1,2 +1,2 @@
|
||||
json.count @count
|
||||
json.ec_courses @ec_courses, partial: 'shared/ec_course_slim', as: :ec_course
|
||||
json.ec_courses @ec_courses, partial: 'ecs/ec_courses/shared/ec_course_slim', as: :ec_course
|
@ -1,3 +1,3 @@
|
||||
|
||||
json.count @graduation_requirements.size
|
||||
json.graduation_requirements @graduation_requirements, partial: 'shared/ec_graduation_requirement', as: :ec_graduation_requirement
|
||||
json.graduation_requirements @graduation_requirements, partial: '/ecs/ec_graduation_requirements/shared/ec_graduation_requirement', as: :ec_graduation_requirement
|
||||
|
@ -1,2 +1,2 @@
|
||||
|
||||
json.partial! 'shared/ec_graduation_requirement', ec_graduation_requirement: @graduation_requirement
|
||||
json.partial! 'ecs/ec_graduation_requirements/shared/ec_graduation_requirement', ec_graduation_requirement: @graduation_requirement
|
||||
|
@ -0,0 +1,6 @@
|
||||
json.extract! @major, :id, :code, :name, :template_major
|
||||
json.school_id @major.school.id
|
||||
json.school_name @major.school.name
|
||||
|
||||
can_manager = @major.manager?(current_user) || @major.school.manager?(current_user) || current_user.admin_or_business?
|
||||
json.can_manager can_manager
|
@ -1,2 +1,7 @@
|
||||
json.count @count
|
||||
json.es_majors @ec_majors, partial: 'ecs/majors/shared/ec_major', as: :ec_major
|
||||
json.ec_majors do
|
||||
json.array! @ec_majors.each do |major|
|
||||
json.extract! major, :id, :name, :code
|
||||
json.selected @major_ids.include?(major.id)
|
||||
end
|
||||
end
|
||||
|
@ -1,3 +1,3 @@
|
||||
json.extract! ec_training_objective, :id, :content
|
||||
|
||||
json.ec_training_items ec_training_objective.ec_training_subitems, partial: 'ec_training_subitem', as: :ec_training_subitem
|
||||
json.ec_training_items ec_training_objective.ec_training_subitems, partial: '/ecs/ec_training_objectives/shared/ec_training_subitem', as: :ec_training_subitem
|
||||
|
@ -1 +1 @@
|
||||
json.partial! 'shared/ec_training_objective', ec_training_objective: @training_objective
|
||||
json.partial! '/ecs/ec_training_objectives/shared/ec_training_objective', ec_training_objective: @training_objective
|
||||
|
@ -0,0 +1,13 @@
|
||||
json.extract! @year, :id, :year
|
||||
|
||||
major = @year.ec_major_school
|
||||
json.major_id major.id
|
||||
json.major_name major.name
|
||||
json.major_code major.code
|
||||
|
||||
school = major.school
|
||||
json.school_id school.id
|
||||
json.school_name school.name
|
||||
|
||||
can_manager = major.manager?(current_user) || school.manager?(current_user) || current_user.admin_or_business?
|
||||
json.can_manager can_manager
|
@ -1 +1 @@
|
||||
json.partial! 'shared/ec_graduation_subitem', ec_graduation_subitem: @graduation_subitem
|
||||
json.partial! 'ecs/graduation_course_supports/shared/ec_graduation_subitem', ec_graduation_subitem: @graduation_subitem
|
||||
|
@ -1,3 +1,3 @@
|
||||
json.course_count @course_count
|
||||
json.graduation_subitems @graduation_subitems, partial: 'shared/ec_graduation_subitem', as: :ec_graduation_subitem
|
||||
json.graduation_subitems @graduation_subitems, partial: 'ecs/graduation_course_supports/shared/ec_graduation_subitem', as: :ec_graduation_subitem
|
||||
json.count @graduation_subitems.size
|
||||
|
@ -1 +0,0 @@
|
||||
json.partial! 'ecs/shared/user', user: @user
|
@ -1,4 +1,4 @@
|
||||
|
||||
json.graduation_requirements @graduation_requirements, partial: 'ecs/ec_graduation_requirements/shared/ec_graduation_requirement', as: :ec_graduation_requirement
|
||||
json.training_subitems @training_subitems, partial: 'ecs/ec_training_subitems/shared/ec_training_subitem', as: :ec_training_subitem
|
||||
json.requirement_support_objectives @requirement_support_objectives, partial: 'shared/requirement_support_objective', as: :requirement_support_objective
|
||||
json.requirement_support_objectives @requirement_support_objectives, partial: 'ecs/requirement_support_objectives/shared/requirement_support_objective', as: :requirement_support_objective
|
||||
|
@ -1 +1 @@
|
||||
json.score_levels @score_levels, partial: 'shared/ec_score_level', as: :ec_score_level
|
||||
json.score_levels @score_levels, partial: 'ecs/score_levels/shared/ec_score_level', as: :ec_score_level
|
||||
|
@ -1,2 +1,2 @@
|
||||
json.count @count
|
||||
json.students @students, partial: 'shared/ec_year_student', as: :ec_year_student
|
||||
json.students @students, partial: 'ecs/students/shared/ec_year_student', as: :ec_year_student
|
@ -1,4 +1,4 @@
|
||||
|
||||
json.graduation_standards @graduation_standards, partial: 'ecs/shared/ec_graduation_standard', as: :ec_graduation_standard
|
||||
json.graduation_subitems @graduation_subitems, partial: 'ecs/shared/ec_graduation_subitem', as: :ec_graduation_subitem
|
||||
json.subitem_support_standards @subitem_support_standards, partial: 'shared/subitem_support_standard', as: :subitem_support_standard
|
||||
json.subitem_support_standards @subitem_support_standards, partial: 'ecs/subitem_support_standards/shared/subitem_support_standard', as: :subitem_support_standard
|
||||
|
@ -0,0 +1,12 @@
|
||||
json.count @count
|
||||
json.users do
|
||||
json.array! @users.each do |user|
|
||||
json.id user.id
|
||||
json.name user.real_name
|
||||
json.identity user.identity
|
||||
json.school_name user.school_name
|
||||
json.department_name user.department_name
|
||||
json.phone Util.conceal(user.phone, :phone)
|
||||
json.manager @manager_ids.include?(user.id)
|
||||
end
|
||||
end
|
@ -0,0 +1,11 @@
|
||||
class ChangeEcCourseSupports < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
add_column :ec_course_supports, :ec_graduation_subitem_id, :integer, index: true
|
||||
|
||||
execute <<-SQL
|
||||
UPDATE ec_course_supports ecs SET ec_graduation_subitem_id = (
|
||||
SELECT ec_graduation_subitem_id FROM ec_graduation_subitem_courses egsc WHERE egsc.ec_course_support_id = ecs.id
|
||||
)
|
||||
SQL
|
||||
end
|
||||
end
|
After Width: | Height: | Size: 79 KiB |
@ -0,0 +1,352 @@
|
||||
.eaSystemp a{
|
||||
color:#05101a;
|
||||
}
|
||||
.eaSystemp span{
|
||||
color: #05101a !important;
|
||||
}
|
||||
.eacourse p{
|
||||
height:84px;
|
||||
margin-bottom:0px !important;
|
||||
}
|
||||
.eacourse #training_objective_contents{
|
||||
height:81px;
|
||||
}
|
||||
.courseSystem{
|
||||
font-size:18px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
line-height:45px;
|
||||
color:rgba(5,16,26,1);
|
||||
}
|
||||
.SystemParameters{
|
||||
font-size:14px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
line-height:45px;
|
||||
color:rgba(50,50,50,1);
|
||||
}
|
||||
.Systemnum{
|
||||
font-size:14px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
color:#FF6800;
|
||||
}
|
||||
.newSystem{
|
||||
width:1200px;
|
||||
overflow:auto;
|
||||
background: #FFF;
|
||||
}
|
||||
.newSystem .clearfix .column-1{
|
||||
width: 113px !important;
|
||||
text-align: center;
|
||||
}
|
||||
.operationColumn{
|
||||
margin: 0px 10%;
|
||||
width:100%;
|
||||
height:100%;
|
||||
}
|
||||
.operationalter{
|
||||
margin: 20px 16px;
|
||||
}
|
||||
.SystemModifythelist .column-1{
|
||||
width: 120px !important;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.SystemModifythelist .column-3{
|
||||
padding-left: 96px;
|
||||
margin-right: 23px;
|
||||
}
|
||||
.operationright{
|
||||
float:right !important;
|
||||
}
|
||||
|
||||
.newSystem p{
|
||||
/*padding: 10px 33px !important;*/
|
||||
margin-bottom: 0em;
|
||||
}
|
||||
.newSystem li{
|
||||
margin:0 !important;
|
||||
}
|
||||
.SystemModifythelist{
|
||||
background:#FFF !important;
|
||||
}
|
||||
|
||||
.SystemModifythelist .column-1:nth-child(1){
|
||||
margin-left: 7px;
|
||||
}
|
||||
|
||||
.Systempoint{
|
||||
font-size:12px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
color:rgba(152,152,152,1);
|
||||
}
|
||||
.editorModify{
|
||||
background:#FFF !important;
|
||||
}
|
||||
.newSystem .editorModify .column-1{
|
||||
width: 194px !important;
|
||||
text-align: left;
|
||||
margin-left: 30px;
|
||||
}
|
||||
.newSystem .editorModify .column-1:nth-child(1){
|
||||
margin-right: 510px;
|
||||
}
|
||||
.editorModify .ant-select{
|
||||
width: 556px !important;
|
||||
margin-left: 36px;
|
||||
}
|
||||
.editorModify .ant-select .ant-select-selection{
|
||||
height: 30px !important;
|
||||
}
|
||||
.editorModify .ant-select .ant-select-selection .ant-select-selection__rendered{
|
||||
height: 30px !important;
|
||||
}
|
||||
.editorModify .ant-select .ant-select-selection .ant-select-selection__rendered .ant-select-selection-selected-value{
|
||||
line-height: 30px !important;
|
||||
}
|
||||
.inputWeight{
|
||||
width: 20%;
|
||||
font-size:14px;
|
||||
height:30px;
|
||||
margin-left: 20px;
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
.SetTheAssociated{
|
||||
width: 314px;
|
||||
height: 30px;
|
||||
float: right;
|
||||
margin-right: -3.5%;
|
||||
}
|
||||
.SetTheAssociatedchild{
|
||||
width: 120px;
|
||||
height: 30px;
|
||||
background: rgba(255,255,255,1);
|
||||
border: 1px solid rgba(234,234,234,1);
|
||||
border-radius: 4px;
|
||||
float: left;
|
||||
margin-right: 10px;
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
/*margin-left: 34px;*/
|
||||
}
|
||||
.operatebutton{
|
||||
margin-left: 20px;
|
||||
/* margin-top: 16px; */
|
||||
}
|
||||
.editbulebutton{
|
||||
width:120px;
|
||||
height:30px;
|
||||
background:rgba(76,172,255,1);
|
||||
border-radius:2px;
|
||||
color:#FFF;
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
}
|
||||
.editglybutton{
|
||||
width:120px;
|
||||
height:30px;
|
||||
border:1px solid rgba(205,205,205,1);
|
||||
border-radius:2px;
|
||||
color:#999;
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
}
|
||||
|
||||
.editglybuttonbox{
|
||||
width: 275px;
|
||||
margin-bottom: 30px;
|
||||
margin-right: 20px;
|
||||
margin-right:7%;
|
||||
}
|
||||
.editglybuttonboxs{
|
||||
width: 275px;
|
||||
margin-bottom: 30px;
|
||||
margin-right: 20px;
|
||||
margin-right:3%;
|
||||
}
|
||||
.defalutCancelbtn:hover {
|
||||
border: 1px solid #B2B2B2;
|
||||
color: #B2B2B2!important;
|
||||
}
|
||||
|
||||
.gouxuanbule{
|
||||
color:#4CACFF;
|
||||
}
|
||||
.gouxuanwhite{
|
||||
color:#FFF;
|
||||
}
|
||||
.icon-gouxuan{
|
||||
cursor: pointer;
|
||||
}
|
||||
/* 谷歌 */
|
||||
input::-webkit-outer-spin-button,
|
||||
input::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
/* 火狐 */
|
||||
input{
|
||||
-moz-appearance:textfield;
|
||||
}
|
||||
.inputWeight{
|
||||
text-indent:0.625rem;
|
||||
}
|
||||
|
||||
.columnlocation{
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
}
|
||||
.paddingLF{
|
||||
padding:0 33px;
|
||||
}
|
||||
.width20{
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
.defalutSubmitbtn,.defalutCancelbtn{
|
||||
cursor: pointer;
|
||||
}
|
||||
.mb290{
|
||||
margin-bottom:290px;
|
||||
}
|
||||
.Spinlarge{
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
margin-top: 25px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
.DDred{
|
||||
color:#DD1717;
|
||||
}
|
||||
.color-666{
|
||||
color:#666666 !important;
|
||||
}
|
||||
.color-05101A{
|
||||
color:#05101A !important;
|
||||
}
|
||||
.ec_graduation_name{
|
||||
margin-right:20px !important;
|
||||
}
|
||||
.column-width575{
|
||||
color: transparent !important;
|
||||
}
|
||||
.column-width130{
|
||||
width: 130px !important;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
|
||||
.ListTableLine li>span {
|
||||
max-width: 550px !important;
|
||||
}
|
||||
|
||||
.graduateRequirement .clearfix .column-1 {
|
||||
width: 76px!important;
|
||||
}
|
||||
|
||||
.newrightcalculatebutton{
|
||||
width: 50px;
|
||||
height: 25px;
|
||||
border: 1px solid rgba(76,172,255,1);
|
||||
border-radius: 1px;
|
||||
line-height: 25px;
|
||||
text-align: center;
|
||||
margin-top: 7px;
|
||||
cursor: pointer;
|
||||
color: rgba(76,172,255,1);
|
||||
}
|
||||
.columnbox{
|
||||
height: 53px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.ant-modal-mask {
|
||||
background-color: rgba(5,16,26,0.4);
|
||||
}
|
||||
.ecmodeldelet{
|
||||
top:300px;
|
||||
}
|
||||
.ecmodeldelet .ant-modal-header{
|
||||
padding: 0px 24px;
|
||||
}
|
||||
.ecmodeldelet .ant-modal-title{
|
||||
padding: 0px 15px;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
line-height: 70px;
|
||||
height: 70px;
|
||||
border-radius: 10px 10px 0px 0px;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.bor-red {
|
||||
border: 1px solid #db0505 !important;
|
||||
}
|
||||
|
||||
.ml93{
|
||||
margin-left:93px;
|
||||
}
|
||||
.ml26{
|
||||
margin-left: 26px;
|
||||
}
|
||||
.finishtarget{
|
||||
width: 69px;
|
||||
/* height: 48px; */
|
||||
line-height: 20px;
|
||||
text-align: center;
|
||||
margin-right: 48px;
|
||||
}
|
||||
|
||||
.bordereaeaea{
|
||||
border-bottom: 1px solid transparent !important;
|
||||
}
|
||||
|
||||
.heightimportant{
|
||||
height: 30px !important;
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
.heightimportant:focus {
|
||||
background-color: #fff;
|
||||
}
|
||||
.inputWeight:focus {
|
||||
background-color: #fff;
|
||||
}
|
||||
.heightlineimportant{
|
||||
line-height: 30px !important;
|
||||
}
|
||||
|
||||
.ant-select-selection:hover{
|
||||
border-color: #d9d9d9 !important;
|
||||
}
|
||||
.ant-input:focus {
|
||||
outline: 0;
|
||||
-webkit-box-shadow: 0 0 0 2px transparent !important;
|
||||
box-shadow: 0 0 0 2px transparent !important;
|
||||
}
|
||||
.ant-input{
|
||||
border-color: #d9d9d9 !important;
|
||||
}
|
||||
.ant-select-selection:focus{
|
||||
-webkit-box-shadow: 0 0 0 2px transparent !important;
|
||||
box-shadow: 0 0 0 2px transparent !important;
|
||||
}
|
||||
.ant-select-selection:active{
|
||||
-webkit-box-shadow: 0 0 0 2px transparent !important;
|
||||
box-shadow: 0 0 0 2px transparent !important;
|
||||
}
|
||||
|
||||
.ant-select-selection:focus{
|
||||
border-color: #d9d9d9 !important;
|
||||
}
|
||||
.ant-select-selection{
|
||||
-webkit-box-shadow: 0 0 0 2px transparent !important;
|
||||
box-shadow: 0 0 0 2px transparent !important;
|
||||
}
|
||||
|
||||
.mt60{
|
||||
margin-top:60px;
|
||||
}
|
@ -0,0 +1,94 @@
|
||||
.ec-graduation-requirement-page {
|
||||
background: #fff;
|
||||
|
||||
.graduation-requirement {
|
||||
&-body {
|
||||
margin-top: -24px;
|
||||
}
|
||||
|
||||
&-items {
|
||||
&-head {
|
||||
padding: 15px 30px;
|
||||
display: flex;
|
||||
background: #F5F5F5;
|
||||
}
|
||||
|
||||
&-body {
|
||||
margin: 0 30px;
|
||||
|
||||
&-item {
|
||||
padding: 10px 0px;
|
||||
border-bottom: 1px solid #eaeaea;
|
||||
|
||||
&.active {
|
||||
.item-row {
|
||||
margin-bottom: 10px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.item-column-operation {
|
||||
width: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
border-bottom: unset;
|
||||
}
|
||||
|
||||
.item-head {
|
||||
margin-bottom: 10px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.item-row {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.no-column {
|
||||
width: 60px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.item-content-column {
|
||||
flex: 1;
|
||||
padding-left: 10px;
|
||||
display: flex;
|
||||
|
||||
.ant-form-item {
|
||||
flex: 1;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.item-column-operation {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
width: 80px;
|
||||
|
||||
& > i {
|
||||
margin: 0 5px;
|
||||
font-size: 16px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.edit-form {
|
||||
margin-top: 10px;
|
||||
text-align: right;
|
||||
|
||||
button {
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
i.edit-action {
|
||||
color: #29BD8B;
|
||||
cursor: pointer;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
@ -0,0 +1,264 @@
|
||||
import React from 'react';
|
||||
import PropTypes from "prop-types";
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Spin, Button, Input, Divider, Icon, Tooltip, Form, message } from 'antd';
|
||||
import axios from 'axios';
|
||||
|
||||
import './index.scss';
|
||||
|
||||
class TrainingObjective extends React.Component {
|
||||
constructor (props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
loading: true,
|
||||
contentEditState: false,
|
||||
itemsEditState: false,
|
||||
submitState: false,
|
||||
validateState: false,
|
||||
itemSubmitState: false,
|
||||
itemValidateState: false,
|
||||
|
||||
objective: {},
|
||||
editContent: '',
|
||||
trainingSubitems: []
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.getData();
|
||||
}
|
||||
|
||||
getData = () => {
|
||||
let { yearId } = this.props;
|
||||
|
||||
axios.get(`/ec_years/${yearId}/ec_training_objectives.json`).then(res => {
|
||||
if(res.status === 200){
|
||||
this.setState({
|
||||
objective: res.data,
|
||||
editContent: res.data.content,
|
||||
trainingSubitems: res.data.ec_training_items,
|
||||
loading: false
|
||||
})
|
||||
}
|
||||
}).catch(e => console.log(e))
|
||||
}
|
||||
|
||||
saveContentEdit = () => {
|
||||
let { editContent } = this.state;
|
||||
this.setState({ validateState: editContent.length === 0 });
|
||||
if(editContent.length === 0){ return; }
|
||||
|
||||
this.setState(
|
||||
{ submitState: true },
|
||||
() => {
|
||||
this.updateTrainingObjective(
|
||||
{ content: editContent },
|
||||
() => {
|
||||
this.setState({ submitState: false, contentEditState: false });
|
||||
this.getData();
|
||||
},
|
||||
_e => {
|
||||
this.setState({ submitState: false })
|
||||
}
|
||||
)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
cancelContentEdit = () => {
|
||||
this.setState({ editContent: this.state.objective.content, contentEditState: false });
|
||||
}
|
||||
|
||||
editItemsContent = () => {
|
||||
let { trainingSubitems } = this.state;
|
||||
if(!trainingSubitems || trainingSubitems.length === 0){
|
||||
trainingSubitems = [{ id: null, content: null }]
|
||||
}
|
||||
this.setState({ trainingSubitems: trainingSubitems, itemsEditState: true });
|
||||
}
|
||||
|
||||
addItemColumn = (index) => {
|
||||
let { trainingSubitems } = this.state;
|
||||
trainingSubitems.splice(index, 0, { id: null, content: null });
|
||||
this.setState({ trainingSubitems })
|
||||
}
|
||||
|
||||
removeItemColumn = (index) => {
|
||||
let { trainingSubitems } = this.state;
|
||||
trainingSubitems.splice(index, 1);
|
||||
this.setState({ trainingSubitems })
|
||||
}
|
||||
|
||||
onItemContentChange = (e, index) => {
|
||||
let { trainingSubitems } = this.state;
|
||||
trainingSubitems[index].content = e.target.value;
|
||||
|
||||
this.setState({ trainingSubitems: trainingSubitems });
|
||||
}
|
||||
|
||||
saveItemsContentEdit = () => {
|
||||
let { objective, trainingSubitems } = this.state;
|
||||
|
||||
let errorItem = trainingSubitems.find(item => !item.content || item.content.length === 0);
|
||||
this.setState({ itemValidateState: !!errorItem });
|
||||
|
||||
if(errorItem){ return }
|
||||
|
||||
this.setState(
|
||||
{ itemSubmitState: true },
|
||||
() => {
|
||||
this.updateTrainingObjective(
|
||||
{ content: objective.content, training_subitems: trainingSubitems },
|
||||
() => {
|
||||
this.setState({ itemSubmitState: false, itemsEditState: false });
|
||||
this.getData();
|
||||
},
|
||||
_e => {
|
||||
this.setState({ itemSubmitState: false })
|
||||
}
|
||||
)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
cancelItemsContentEdit = () => {
|
||||
this.setState({ trainingSubitems: this.state.objective.ec_training_items, itemsEditState: false, itemValidateState: false });
|
||||
}
|
||||
|
||||
updateTrainingObjective = (data, success, fail) => {
|
||||
let { yearId } = this.props;
|
||||
let url = `/ec_years/${yearId}/ec_training_objectives.json`;
|
||||
|
||||
axios.post(url, data).then(res => {
|
||||
if(res){
|
||||
message.success('操作成功');
|
||||
success();
|
||||
}
|
||||
}).catch(e => {
|
||||
console.log(e);
|
||||
fail(e);
|
||||
})
|
||||
}
|
||||
|
||||
render() {
|
||||
let { can_manager } = this.props.year;
|
||||
let { loading, contentEditState, itemsEditState, objective, editContent, trainingSubitems, validateState, itemValidateState, itemSubmitState, submitState } = this.state;
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Spin spinning={loading} size='large' style={{ marginTop: '15%' }}>
|
||||
<div className="educontent ec-training-objective-page">
|
||||
<div className="ec-head">
|
||||
<div className="ec-head-left">
|
||||
<div className="ec-head-label">培养目标</div>
|
||||
<div className="ec-head-tip">
|
||||
<span>请结合本专业特色修改培养目标文字描述及目标分解查看详情</span>
|
||||
<Link to="/forums/3529" target="_blank" className="link ml10">查看详情</Link>
|
||||
</div>
|
||||
</div>
|
||||
<a href={`/api/ec_years/${this.props.yearId}/ec_training_objectives.xlsx`} target="_blank" className="ant-btn ant-btn-primary color-white">导出培养目标</a>
|
||||
</div>
|
||||
|
||||
<Divider/>
|
||||
|
||||
<div className="training-objective-body">
|
||||
{
|
||||
can_manager && contentEditState ? (
|
||||
<div className="training-objective-content block">
|
||||
<div>
|
||||
<Form.Item label={false} validateStatus={validateState && (!editContent || editContent.length === 0) ? 'error' : ''}>
|
||||
<Input.TextArea rows={6} value={editContent} onChange={e => this.setState({ editContent: e.target.value })} />
|
||||
</Form.Item>
|
||||
</div>
|
||||
<div className="training-objective-content-form">
|
||||
<Button type="primary" loading={submitState} onClick={this.saveContentEdit}>保存</Button>
|
||||
<Button loading={submitState} onClick={this.cancelContentEdit}>取消</Button>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="training-objective-content">
|
||||
<div className="training-objective-content-text">{ objective.content }</div>
|
||||
{
|
||||
can_manager && (
|
||||
<div className="training-objective-content-edit">
|
||||
<Tooltip title="编辑">
|
||||
<Icon type="edit" theme="filled" className="edit-action" onClick={() => this.setState({ contentEditState: true })} />
|
||||
</Tooltip>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
<div className="training-objective-items">
|
||||
<div className="training-objective-items-head">
|
||||
<div className="no-column">分项</div>
|
||||
<div className="item-content-column">目标分解详情</div>
|
||||
<div className="operation-column">
|
||||
{
|
||||
!can_manager || itemsEditState || (
|
||||
<Tooltip title="编辑">
|
||||
<Icon type="edit" theme="filled" className="edit-action" onClick={this.editItemsContent} />
|
||||
</Tooltip>
|
||||
)
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div className="training-objective-items-body">
|
||||
{
|
||||
can_manager && itemsEditState ? (
|
||||
<div>
|
||||
{
|
||||
trainingSubitems && trainingSubitems.map((item, index) => {
|
||||
return (
|
||||
<div className="training-objective-items-body-item" key={index}>
|
||||
<div className="no-column">{index + 1}</div>
|
||||
<div className="item-content-column">
|
||||
<Form.Item label={false} validateStatus={itemValidateState && (!item.content || item.content.length === 0) ? 'error' : ''}>
|
||||
<Input.TextArea rows={2} value={item.content} onChange={e => this.onItemContentChange(e, index)} />
|
||||
</Form.Item>
|
||||
<div className="item-column-operation">
|
||||
{ index !== 0 && <Icon type="delete" onClick={() => this.removeItemColumn(index)} /> }
|
||||
|
||||
<Icon type="plus-circle" onClick={() => this.addItemColumn(index + 1)} style={{ color: '#29BD8B' }} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
<div className="training-objective-content-form">
|
||||
<Button type="primary" loading={itemSubmitState} onClick={this.saveItemsContentEdit}>保存</Button>
|
||||
<Button disabled={itemSubmitState} onClick={this.cancelItemsContentEdit}>取消</Button>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
objective.ec_training_items && objective.ec_training_items.map((item, index) => {
|
||||
return (
|
||||
<div className="training-objective-items-body-item" key={index}>
|
||||
<div className="no-column">{ index + 1 }</div>
|
||||
<div className="item-content-column">{ item.content }</div>
|
||||
</div>
|
||||
)
|
||||
})
|
||||
)
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Spin>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
TrainingObjective.propTypes = {
|
||||
schoolId: PropTypes.string,
|
||||
majorId: PropTypes.string,
|
||||
yearId: PropTypes.string,
|
||||
}
|
||||
|
||||
export default TrainingObjective
|
@ -0,0 +1,99 @@
|
||||
.ec-training-objective-page {
|
||||
background: #ffffff;
|
||||
|
||||
.training-objective {
|
||||
&-body {
|
||||
margin-top: -24px;
|
||||
min-height: 600px;
|
||||
}
|
||||
|
||||
&-content {
|
||||
display: flex;
|
||||
padding: 20px 30px;
|
||||
line-height: 2.0;
|
||||
|
||||
&.block {
|
||||
display: block;
|
||||
}
|
||||
|
||||
&-text {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
&-edit {
|
||||
margin-left: 20px;
|
||||
|
||||
& > i {
|
||||
color: #29BD8B;
|
||||
cursor: pointer;
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
&-form {
|
||||
margin-top: 10px;
|
||||
text-align: right;
|
||||
|
||||
button {
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-items {
|
||||
&-head {
|
||||
padding: 15px 30px;
|
||||
display: flex;
|
||||
background: #F5F5F5;
|
||||
}
|
||||
|
||||
&-body {
|
||||
margin: 0 30px;
|
||||
|
||||
&-item {
|
||||
display: flex;
|
||||
min-height: 48px;
|
||||
padding: 10px 0px;
|
||||
border-bottom: 1px solid #eaeaea;
|
||||
|
||||
&:last-child {
|
||||
border-bottom: unset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.no-column {
|
||||
width: 40px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.item-content-column {
|
||||
flex: 1;
|
||||
padding-left: 10px;
|
||||
display: flex;
|
||||
|
||||
.ant-form-item {
|
||||
flex: 1;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.item-column-operation {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
width: 80px;
|
||||
|
||||
& > i {
|
||||
margin: 15px 10px;
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
i.edit-action {
|
||||
color: #29BD8B;
|
||||
cursor: pointer;
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
@ -0,0 +1,148 @@
|
||||
import React from 'react';
|
||||
import { Switch, Route, Link } from 'react-router-dom';
|
||||
import { Steps, Breadcrumb } from 'antd';
|
||||
import axios from 'axios';
|
||||
|
||||
import './index.scss';
|
||||
|
||||
import CustomLoadable from "../../../CustomLoadable";
|
||||
import Loadable from 'react-loadable';
|
||||
import Loading from "../../../Loading";
|
||||
const { Step } = Steps;
|
||||
const steps = ["培养目标", "毕业要求", "培养目标VS毕业要求", "毕业要求VS通用标准", "学生", "课程体系", "课程体系VS毕业要求", "达成度评价结果"];
|
||||
const stepTypes = ["training_objectives", "graduation_requirement", "requirement_vs_objective", "requirement_vs_standard", "students", "courses", "requirement_vs_courses", "reach_calculation_info"];
|
||||
const EcStudentList=Loadable({
|
||||
loader: () => import('../subroute/ecStudentList/EcStudentList'),
|
||||
loading: Loading,
|
||||
});
|
||||
const Curriculum=Loadable({
|
||||
loader: () => import('../../../modules/ecs/curriculum/Curriculum'),
|
||||
loading: Loading,
|
||||
});
|
||||
const TrainingObjective=Loadable({
|
||||
loader: () => import('./TrainingObjective/index'),
|
||||
loading: Loading,
|
||||
});
|
||||
const GraduationRequirement=Loadable({
|
||||
loader: () => import('./GraduationRequirement/index'),
|
||||
loading: Loading,
|
||||
});
|
||||
const CourseSupports=Loadable({
|
||||
loader: () => import('./CourseSupports/index'),
|
||||
loading: Loading,
|
||||
});
|
||||
|
||||
class EcSetting extends React.Component {
|
||||
constructor (props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
schoolId: null,
|
||||
majorId: props.match.params.majorId,
|
||||
yearId: props.match.params.yearId,
|
||||
year: null,
|
||||
|
||||
stepIndex: 0,
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.setupStep();
|
||||
this.getYearDetail();
|
||||
}
|
||||
|
||||
getYearDetail = () => {
|
||||
let { majorId, yearId } = this.state;
|
||||
axios.get(`/ec_major_schools/${majorId}/ec_years/${yearId}.json`).then(res => {
|
||||
if(res){
|
||||
this.setState({ year: res.data, schoolId: res.data.school_id })
|
||||
}
|
||||
}).catch(e => console.log(e))
|
||||
}
|
||||
|
||||
onStepChange = (stepIndex) => {
|
||||
let { majorId, yearId } = this.state;
|
||||
let type = stepTypes[stepIndex];
|
||||
|
||||
this.setState({ stepIndex: stepIndex });
|
||||
if(type==="courses"){
|
||||
this.props.history.push(`/ecs/major_schools/${majorId}/years/${yearId}/${type}/ec_course_support_setting/1`);
|
||||
}else {
|
||||
this.props.history.push(`/ecs/major_schools/${majorId}/years/${yearId}/${type}`);
|
||||
}
|
||||
}
|
||||
|
||||
setupStep = () => {
|
||||
let type = this.props.match.params.type;
|
||||
|
||||
let stepIndex = stepTypes.indexOf(type);
|
||||
this.setState({ stepIndex: stepIndex });
|
||||
}
|
||||
|
||||
render() {
|
||||
let { year, schoolId, majorId, yearId } = this.state;
|
||||
let { stepIndex } = this.state;
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className="ec-page">
|
||||
<div className="educontent ec-breadcrumb">
|
||||
<Breadcrumb separator=">">
|
||||
<Breadcrumb.Item key="department">
|
||||
<Link to={`/ecs/department?school_id=${schoolId}`}>{ year && year.school_name }</Link>
|
||||
</Breadcrumb.Item>
|
||||
<Breadcrumb.Item key="major-school">
|
||||
<Link to={`/ecs/major_schools/${majorId}`}>{ year && year.major_name }</Link>
|
||||
</Breadcrumb.Item>
|
||||
<Breadcrumb.Item key="year">{year && year.year}届</Breadcrumb.Item>
|
||||
</Breadcrumb>
|
||||
</div>
|
||||
|
||||
<div className="educontent ec-steps">
|
||||
<Steps type="navigation"
|
||||
size='small'
|
||||
className="ec-steps-box"
|
||||
current={stepIndex}
|
||||
onChange={this.onStepChange}>
|
||||
|
||||
{
|
||||
steps.map((title, index) => {
|
||||
return (
|
||||
<Step subTitle={title} status={index === stepIndex ? 'process' : 'wait'} key={index}/>
|
||||
)
|
||||
})
|
||||
}
|
||||
</Steps>
|
||||
</div>
|
||||
|
||||
{
|
||||
year && (
|
||||
<Switch>
|
||||
<Route extra path='/ecs/major_schools/:majorId/years/:yearId/training_objectives'
|
||||
render={ (props) => (<TrainingObjective {...this.props} {...props} {...this.state} />) }></Route>
|
||||
<Route extra path='/ecs/major_schools/:majorId/years/:yearId/graduation_requirement'
|
||||
render={ (props) => (<GraduationRequirement {...this.props} {...props} {...this.state} />) }></Route>
|
||||
|
||||
|
||||
{/*学生*/}
|
||||
<Route extra path='/ecs/major_schools/:majorId/years/:yearId/students'
|
||||
render={ (props) => (<EcStudentList {...this.props} {...props} {...this.state} />) }></Route>
|
||||
{/*课程体系*/}
|
||||
<Route extra path='/ecs/major_schools/:majorId/years/:yearId/courses'
|
||||
render={ (props) => (<Curriculum {...this.props} {...props} {...this.state} />) }></Route>
|
||||
{/*课程体系VS毕业要求*/}
|
||||
<Route extra path='/ecs/major_schools/:major_school_id/years/:ec_year_id/requirement_vs_courses'
|
||||
render={ (props) => (<CourseSupports {...this.props} {...props} {...this.state} />) }></Route>
|
||||
|
||||
|
||||
|
||||
</Switch>
|
||||
)
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default EcSetting
|
@ -0,0 +1,62 @@
|
||||
.ec-page {
|
||||
margin-bottom: 50px;
|
||||
|
||||
.ec-breadcrumb {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.ec-steps {
|
||||
&-box {
|
||||
margin-bottom: 10px;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
justify-content: space-between;
|
||||
background: #fff;
|
||||
|
||||
.ant-steps-item {
|
||||
flex: unset !important;
|
||||
|
||||
&-container {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
&.ant-steps-item-active {
|
||||
.ant-steps-item-subtitle {
|
||||
color: #1890ff;
|
||||
}
|
||||
}
|
||||
|
||||
&-subtitle {
|
||||
margin-left: 0;
|
||||
margin-right: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ec-head {
|
||||
margin-bottom: -24px;
|
||||
padding: 20px 30px;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
justify-content: space-between;
|
||||
|
||||
&-left {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
&-label {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
&-tip {
|
||||
font-size: 14px;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
|
||||
.link {
|
||||
color: #007bff;
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
.add-year-modal {
|
||||
.add-year {
|
||||
&-container {
|
||||
padding: 0 40px;
|
||||
}
|
||||
|
||||
&-tip {
|
||||
margin-bottom: 20px;
|
||||
color: #666666;
|
||||
line-height: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&-content {
|
||||
padding: 0 50px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
&-label {
|
||||
|
||||
}
|
||||
|
||||
&-select {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ant-modal-footer {
|
||||
padding-bottom: 20px;
|
||||
text-align: center;
|
||||
border-top: unset;
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
.ec-year-list-page {
|
||||
.ec-breadcrumb {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.ec-year-list-container {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.year-list {
|
||||
&-head {
|
||||
margin-bottom: -24px;
|
||||
padding: 20px 30px;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
justify-content: space-between;
|
||||
|
||||
&-left {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
&-label {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
&-tip {
|
||||
font-size: 14px;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
&-body {
|
||||
margin-top: -24px;
|
||||
}
|
||||
|
||||
&-search {
|
||||
padding: 20px 30px;
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
&-table {
|
||||
min-height: 400px;
|
||||
|
||||
th, td {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.link {
|
||||
color: #007bff;
|
||||
}
|
||||
|
||||
.operation-box {
|
||||
.link {
|
||||
margin: 0 5px;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
import React from 'react';
|
||||
import { Switch, Route } from 'react-router-dom';
|
||||
import { SnackbarHOC } from 'educoder';
|
||||
|
||||
import CustomLoadable from "../../CustomLoadable";
|
||||
import {TPMIndexHOC} from "../tpm/TPMIndexHOC";
|
||||
|
||||
const Home = CustomLoadable(() => import('./Home/index'));
|
||||
const EcYear = CustomLoadable(() => import('./EcYear/index'));
|
||||
const EcSetting = CustomLoadable(() => import('./EcSetting/index'));
|
||||
|
||||
class Ecs extends React.Component {
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div className="newMain clearfix">
|
||||
<Switch>
|
||||
<Route extra path='/ecs/department' component={Home}></Route>
|
||||
<Route path='/ecs/major_schools/:majorId/years/:yearId/:type' component={EcSetting}></Route>
|
||||
<Route extra path='/ecs/major_schools/:majorId' component={EcYear}></Route>
|
||||
</Switch>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default SnackbarHOC() (TPMIndexHOC ( Ecs ));
|
@ -0,0 +1,179 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Modal, Input, Table, message } from 'antd';
|
||||
import axios from 'axios';
|
||||
|
||||
import './AddMajorModal.scss';
|
||||
|
||||
const { Search } = Input;
|
||||
const tableColumns = [
|
||||
{ title: '专业代码', dataIndex: 'code', key: 'code', width: 100, },
|
||||
{ title: '专业名称', dataIndex: 'name', key: 'name', },
|
||||
{ title: '', dataIndex: 'selected', key: 'selected', width: 80, render: selected => selected && <span className="color-orange">已选择</span> },
|
||||
];
|
||||
const defaultPagination = { current: 1, pageSize: 10, total: 0 };
|
||||
|
||||
class AddMajorModal extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
loading: false,
|
||||
confirmLoading: false,
|
||||
error: '',
|
||||
keyword: '',
|
||||
pagination: {...defaultPagination},
|
||||
|
||||
schoolId: props.schoolId,
|
||||
majorData: [],
|
||||
selectedData: []
|
||||
}
|
||||
|
||||
this.getMajors = this.getMajors.bind(this);
|
||||
this.selectMajor = this.selectMajor.bind(this);
|
||||
this.onAfterModalClose = this.onAfterModalClose.bind(this);
|
||||
this.handleOk = this.handleOk.bind(this);
|
||||
this.handleCancel = this.handleCancel.bind(this);
|
||||
this.onPaginationChange = this.onPaginationChange.bind(this);
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps) {
|
||||
if(!prevProps.visible && this.props.visible){
|
||||
this.getMajors();
|
||||
}
|
||||
}
|
||||
|
||||
onSearch = () => {
|
||||
this.setState({ pagination: {...defaultPagination} }, () => {
|
||||
this.getMajors();
|
||||
})
|
||||
}
|
||||
|
||||
getMajors(){
|
||||
let { schoolId, keyword, pagination } = this.state;
|
||||
|
||||
this.setState({ loading: true });
|
||||
axios.get(`/schools/${schoolId}/ec_majors.json`, {
|
||||
params: {
|
||||
search: keyword,
|
||||
page: pagination.current,
|
||||
per_page: pagination.pageSize
|
||||
}
|
||||
}).then(res => {
|
||||
if(res.status === 200){
|
||||
let pagination = { ...this.state.pagination };
|
||||
pagination.total = res.data.count;
|
||||
|
||||
this.setState({
|
||||
majorData: res.data.ec_majors,
|
||||
loading: false,
|
||||
pagination,
|
||||
})
|
||||
}
|
||||
}).catch(e => {
|
||||
console.log(e);
|
||||
this.setState({ loading: false })
|
||||
})
|
||||
}
|
||||
|
||||
getCheckboxProps(record){
|
||||
return { ...record, disabled: record.selected }
|
||||
}
|
||||
|
||||
selectMajor(selectedRowKeys){
|
||||
this.setState({ selectedData: selectedRowKeys });
|
||||
}
|
||||
|
||||
onPaginationChange(page, pageSize){
|
||||
this.setState({ pagination: { current: page, pageSize: pageSize } }, () => {
|
||||
this.getMajors()
|
||||
});
|
||||
}
|
||||
|
||||
handleOk(){
|
||||
let { selectedData } = this.state;
|
||||
|
||||
if(selectedData.length === 0){
|
||||
this.setState({ error: '请选择专业' });
|
||||
return;
|
||||
}
|
||||
|
||||
this.submitMajor(selectedData);
|
||||
}
|
||||
|
||||
handleCancel(){
|
||||
this.props.onHide(false);
|
||||
}
|
||||
|
||||
onAfterModalClose(){
|
||||
this.setState({
|
||||
error: '',
|
||||
keyword: '',
|
||||
pagination: {...defaultPagination},
|
||||
majorData: [],
|
||||
selectedData: [],
|
||||
});
|
||||
}
|
||||
|
||||
submitMajor(ids) {
|
||||
let { schoolId } = this.state;
|
||||
|
||||
this.setState({ confirmLoading: true });
|
||||
axios.post(`/schools/${schoolId}/ec_major_schools.json`, { major_ids: ids }).then(res => {
|
||||
if(res.status === 200){
|
||||
message.success('操作成功');
|
||||
this.setState({ confirmLoading: false });
|
||||
this.props.onHide(true);
|
||||
}
|
||||
}).catch(e => {
|
||||
console.log(e);
|
||||
this.setState({ confirmLoading: false });
|
||||
})
|
||||
}
|
||||
|
||||
render() {
|
||||
let { loading, keyword, majorData, selectedData, pagination } = this.state;
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Modal
|
||||
title="添加认证专业"
|
||||
wrapClassName="add-major-modal"
|
||||
visible={this.props.visible}
|
||||
confirmLoading={this.state.confirmLoading}
|
||||
afterClose={this.onAfterModalClose}
|
||||
onOk={this.handleOk}
|
||||
onCancel={this.handleCancel}>
|
||||
|
||||
<div className="add-major-search">
|
||||
<Search
|
||||
placeholder="专业代码/专业名称检索"
|
||||
onInput={e => this.setState({keyword: e.target.value})}
|
||||
onSearch={this.onSearch}
|
||||
value={keyword}/>
|
||||
</div>
|
||||
|
||||
<div className="add-major-body">
|
||||
<Table rowKey="id"
|
||||
rowSelection={{onChange: this.selectMajor, getCheckboxProps: this.getCheckboxProps, selectedRowKeys: selectedData}}
|
||||
loading={loading}
|
||||
columns={tableColumns}
|
||||
dataSource={majorData}
|
||||
pagination={{...pagination, onChange: this.onPaginationChange}}
|
||||
size="small"
|
||||
scroll={{ y: 200 }}/>
|
||||
<div className="error">{ this.state.error }</div>
|
||||
</div>
|
||||
</Modal>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
AddMajorModal.propTypes = {
|
||||
schoolId: PropTypes.number,
|
||||
visible: PropTypes.bool,
|
||||
onHide: PropTypes.func
|
||||
}
|
||||
|
||||
export default AddMajorModal
|
@ -0,0 +1,29 @@
|
||||
.add-major-modal {
|
||||
.add-major-search {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.ant-modal-body {
|
||||
padding-bottom: 0;
|
||||
|
||||
.major-row {
|
||||
padding: 10px;
|
||||
}
|
||||
.ant-table-thead {
|
||||
background: #fafafa;
|
||||
}
|
||||
.ant-table-scroll {
|
||||
min-height: 250px;
|
||||
}
|
||||
|
||||
.error {
|
||||
height: 20px;
|
||||
margin-top: -20px;
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
.ant-modal-footer {
|
||||
padding-bottom: 20px;
|
||||
text-align: center;
|
||||
border-top: unset;
|
||||
}
|
||||
}
|
@ -0,0 +1,226 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Modal, Input, Table, message, Select, Form, Row, Col, Button } from 'antd';
|
||||
import axios from 'axios';
|
||||
|
||||
import './AddManagerModal.scss';
|
||||
|
||||
const { Option } = Select;
|
||||
|
||||
const columnRender = (text) => <div style={{ wordWrap: 'break-word', wordBreak: 'break-all' }}> {text} </div>
|
||||
const tableColumns = [
|
||||
{ title: '姓名', dataIndex: 'name', key: 'name', width: 60, render: columnRender },
|
||||
{ title: '职称', dataIndex: 'identity', key: 'identity', width: 60, },
|
||||
{ title: '单位', dataIndex: 'school_name', key: 'school_name', render: (_, record) => columnRender(`${record.school_name} ${record.department_name}`) },
|
||||
{ title: '手机号', dataIndex: 'phone', key: 'phone', width: 80, },
|
||||
];
|
||||
const defaultPagination = { current: 1, pageSize: 20, total: 0 };
|
||||
|
||||
class AddManagerModal extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
loading: false,
|
||||
confirmLoading: false,
|
||||
nameValidateStatus: '',
|
||||
error: '',
|
||||
name: '',
|
||||
school: props.schoolName,
|
||||
identity: '',
|
||||
pagination: {...defaultPagination},
|
||||
|
||||
schoolId: props.schoolId,
|
||||
userData: [],
|
||||
selectedData: []
|
||||
}
|
||||
|
||||
this.getUsers = this.getUsers.bind(this);
|
||||
this.selectUser = this.selectUser.bind(this);
|
||||
this.onAfterModalClose = this.onAfterModalClose.bind(this);
|
||||
this.handleOk = this.handleOk.bind(this);
|
||||
this.handleCancel = this.handleCancel.bind(this);
|
||||
this.onPaginationChange = this.onPaginationChange.bind(this);
|
||||
}
|
||||
|
||||
onSearch = () => {
|
||||
this.setState({ pagination: {...defaultPagination} }, () => {
|
||||
this.getUsers();
|
||||
})
|
||||
}
|
||||
|
||||
getUsers(){
|
||||
let { majorId } = this.props;
|
||||
let { name, school, identity, pagination } = this.state;
|
||||
|
||||
if(name.length === 0){
|
||||
this.setState({ nameValidateStatus: 'error' });
|
||||
return;
|
||||
}
|
||||
|
||||
this.setState({ loading: true });
|
||||
axios.get(`/ec_major_schools/${majorId}/users.json`, {
|
||||
params: {
|
||||
name, school, identity,
|
||||
page: pagination.current,
|
||||
per_page: pagination.pageSize
|
||||
}
|
||||
}).then(res => {
|
||||
if(res.status === 200){
|
||||
let pagination = { ...this.state.pagination };
|
||||
pagination.total = res.data.count;
|
||||
|
||||
this.setState({
|
||||
userData: res.data.users,
|
||||
loading: false,
|
||||
pagination,
|
||||
})
|
||||
}
|
||||
}).catch(e => {
|
||||
console.log(e);
|
||||
this.setState({ loading: false })
|
||||
})
|
||||
}
|
||||
|
||||
getCheckboxProps(record){
|
||||
return { ...record, disabled: record.manager }
|
||||
}
|
||||
|
||||
selectUser(selectedRowKeys){
|
||||
this.setState({ selectedData: selectedRowKeys });
|
||||
}
|
||||
|
||||
onPaginationChange(page, pageSize){
|
||||
this.setState({ pagination: { current: page, pageSize: pageSize } }, () => {
|
||||
this.getUsers()
|
||||
});
|
||||
}
|
||||
|
||||
onNameChange = (e) => {
|
||||
let name = e.target.value;
|
||||
let nameValidateStatus = '';
|
||||
|
||||
if(name.length === 0){
|
||||
nameValidateStatus = 'error'
|
||||
}
|
||||
|
||||
this.setState({ nameValidateStatus, name });
|
||||
}
|
||||
|
||||
handleOk(){
|
||||
this.setState({ error: '' });
|
||||
let { selectedData } = this.state;
|
||||
|
||||
if(selectedData.length === 0){
|
||||
this.setState({ error: '请选择至少一个用户' });
|
||||
return;
|
||||
}
|
||||
|
||||
this.submitUsers(selectedData);
|
||||
}
|
||||
|
||||
handleCancel(){
|
||||
this.props.onHide(false);
|
||||
}
|
||||
|
||||
onAfterModalClose(){
|
||||
this.setState({
|
||||
error: '',
|
||||
nameValidateStatus: '',
|
||||
name: '',
|
||||
school: this.props.schoolName,
|
||||
identity: '',
|
||||
pagination: {...defaultPagination},
|
||||
userData: [],
|
||||
selectedData: [],
|
||||
});
|
||||
}
|
||||
|
||||
submitUsers(ids) {
|
||||
let { majorId } = this.props;
|
||||
|
||||
this.setState({ confirmLoading: true });
|
||||
axios.post(`/ec_major_schools/${majorId}/major_managers.json`, { user_ids: ids }).then(res => {
|
||||
if(res.status !== 200){ return }
|
||||
|
||||
message.success('操作成功');
|
||||
this.setState({ confirmLoading: false });
|
||||
this.props.onHide(true);
|
||||
}).catch(e => {
|
||||
console.log(e);
|
||||
this.setState({ confirmLoading: false });
|
||||
})
|
||||
}
|
||||
|
||||
render() {
|
||||
let { loading, name, school, identity, userData, selectedData, pagination, nameValidateStatus } = this.state;
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Modal
|
||||
title="添加管理员"
|
||||
wrapClassName="add-ec-manager-modal"
|
||||
visible={this.props.visible}
|
||||
confirmLoading={this.state.confirmLoading}
|
||||
afterClose={this.onAfterModalClose}
|
||||
onOk={this.handleOk}
|
||||
onCancel={this.handleCancel}>
|
||||
|
||||
<div className="add-ec-manager-search">
|
||||
<Form layout="horizontal">
|
||||
<Row>
|
||||
<Col span={12}>
|
||||
<Form.Item label="姓名" labelCol={{ span: 6 }} wrapperCol={{span: 16}} validateStatus={nameValidateStatus}>
|
||||
<Input onChange={this.onNameChange} value={name} placeholder="请输入姓名" />
|
||||
</Form.Item>
|
||||
</Col>
|
||||
<Col span={12}>
|
||||
<Form.Item label="职业" labelCol={{ span: 6 }} wrapperCol={{span: 17}} >
|
||||
<Select value={identity} onChange={value => this.setState({ identity: value }) } placeholder="请选择职业">
|
||||
<Option value="">全部</Option>
|
||||
<Option value="teacher">教师</Option>
|
||||
<Option value="student">学生</Option>
|
||||
<Option value="professional">专业人士</Option>
|
||||
</Select>
|
||||
</Form.Item>
|
||||
</Col>
|
||||
</Row>
|
||||
<Row>
|
||||
<Col span={18}>
|
||||
<Form.Item label="学校" labelCol={{ span: 4 }} wrapperCol={{span: 18}}>
|
||||
<Input onChange={e => this.setState({ school: e.target.value })} value={school} placeholder="请输入学校名称"/>
|
||||
</Form.Item>
|
||||
</Col>
|
||||
<Col span={4} offset={2}>
|
||||
<Button type="primary" className="mt5" onClick={this.onSearch}>搜索</Button>
|
||||
</Col>
|
||||
</Row>
|
||||
</Form>
|
||||
</div>
|
||||
|
||||
<div className="add-ec-manager-body">
|
||||
<Table rowKey="id"
|
||||
rowSelection={{onChange: this.selectUser, getCheckboxProps: this.getCheckboxProps, selectedRowKeys: selectedData, columnWidth: 40}}
|
||||
loading={loading}
|
||||
columns={tableColumns}
|
||||
dataSource={userData}
|
||||
pagination={{...pagination, onChange: this.onPaginationChange}}
|
||||
size="small"
|
||||
scroll={{ y: 200 }}/>
|
||||
<div className="error">{ this.state.error }</div>
|
||||
</div>
|
||||
</Modal>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
AddManagerModal.propTypes = {
|
||||
schoolId: PropTypes.string,
|
||||
schoolName: PropTypes.string,
|
||||
majorId: PropTypes.number,
|
||||
visible: PropTypes.bool,
|
||||
onHide: PropTypes.func
|
||||
}
|
||||
|
||||
export default AddManagerModal
|
@ -0,0 +1,35 @@
|
||||
.add-ec-manager-modal {
|
||||
.ant-modal-body {
|
||||
padding-bottom: 0;
|
||||
|
||||
.ant-table-thead {
|
||||
background: #fafafa;
|
||||
}
|
||||
.ant-table-scroll {
|
||||
min-height: 250px;
|
||||
}
|
||||
|
||||
.add-ec-manager-search {
|
||||
margin-bottom: 20px;
|
||||
|
||||
.ant-form-item {
|
||||
margin-bottom: 0;
|
||||
|
||||
&-label > label {
|
||||
font-size: 14px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.error {
|
||||
height: 20px;
|
||||
margin-top: -20px;
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
.ant-modal-footer {
|
||||
padding-bottom: 20px;
|
||||
text-align: center;
|
||||
border-top: unset;
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Tag, message } from 'antd';
|
||||
import axios from 'axios';
|
||||
|
||||
class MajorManager extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
schoolId: props.schoolId,
|
||||
majorId: props.majorId,
|
||||
canManage: props.canManage,
|
||||
managers: props.managers
|
||||
}
|
||||
|
||||
this.deleteManager = this.deleteManager.bind(this);
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps) {
|
||||
if(this.props.managers.length !== prevProps.managers.length){
|
||||
this.setState({ managers: this.props.managers });
|
||||
}
|
||||
}
|
||||
|
||||
deleteManager(managerId){
|
||||
axios.delete(`/ec_major_schools/${this.state.majorId}/major_managers/${managerId}.json`).then(result => {
|
||||
if(result.status === 200){
|
||||
message.success('操作成功');
|
||||
}
|
||||
}).catch(e => { console.log(e) })
|
||||
}
|
||||
|
||||
render() {
|
||||
let { canManage, managers } = this.state;
|
||||
|
||||
return (
|
||||
<div className="manager-box-content">
|
||||
{
|
||||
managers && managers.map(manager => {
|
||||
return (
|
||||
<Tag key={manager.id} closable={canManage} onClose={() => { this.deleteManager(manager.id) }} color="blue">
|
||||
{ manager.name }
|
||||
</Tag>
|
||||
)
|
||||
})
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
MajorManager.propTypes = {
|
||||
schoolId: PropTypes.string,
|
||||
majorId: PropTypes.number,
|
||||
canManage: PropTypes.bool,
|
||||
managers: PropTypes.array
|
||||
}
|
||||
|
||||
export default MajorManager
|
@ -0,0 +1,127 @@
|
||||
.ec-home {
|
||||
.head-image {
|
||||
width: 100%;
|
||||
height: 240px;
|
||||
background-size: 100% 100%;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: -webkit-flex;
|
||||
}
|
||||
|
||||
.ec-home-item {
|
||||
background: #fff;
|
||||
|
||||
&-head {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
&-label {
|
||||
margin-right: 20px;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
&-tip {
|
||||
color: #999;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
&.major-list-item {
|
||||
.ec-home-item {
|
||||
&-head {
|
||||
margin-bottom: -24px;
|
||||
padding: 20px 30px;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
&-tip {
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.school-manager-item {
|
||||
padding: 20px 30px;
|
||||
}
|
||||
|
||||
.ec-school-manager {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
&-item {
|
||||
margin-right: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
&-name {
|
||||
display: block;
|
||||
text-align: center;
|
||||
max-width: 48px;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
color: #666;
|
||||
}
|
||||
}
|
||||
|
||||
.major-list-item {
|
||||
.major-list {
|
||||
&-container {
|
||||
|
||||
}
|
||||
|
||||
&-head {
|
||||
margin-top: -24px;
|
||||
padding: 20px 30px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
.total { font-size: 12px; }
|
||||
}
|
||||
|
||||
&-body {
|
||||
padding-bottom: 30px;
|
||||
}
|
||||
|
||||
&-row {
|
||||
padding: 10px 15px;
|
||||
border-bottom: 1px solid #eee;
|
||||
|
||||
&:last-child { border-bottom: unset; }
|
||||
|
||||
&.head {
|
||||
background: #F5F5F5;
|
||||
}
|
||||
.ant-btn-link {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.operate-box {
|
||||
.link {
|
||||
margin: 0 5px;
|
||||
}
|
||||
}
|
||||
.manager-box {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
&-content {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
.link {
|
||||
color: #007bff;
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
.newedu-class-container{
|
||||
width:1240px;
|
||||
height:84px;
|
||||
}
|
||||
.ecnewbutton{
|
||||
width:68px;
|
||||
height:30px;
|
||||
background:rgba(76,172,255,1);
|
||||
border-radius:2px;
|
||||
float:right;
|
||||
}
|
||||
.newedu-title-bottom{
|
||||
width:1240px;
|
||||
height:65px;
|
||||
}
|
||||
.edu-con-bottom {
|
||||
padding: 10px 0;
|
||||
background: #fff;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.TabledataSource .ant-table-wrapper{
|
||||
width: 1240px;
|
||||
}
|
||||
.ant-table-thead{
|
||||
background:rgba(245,245,245,1);
|
||||
}
|
@ -0,0 +1,576 @@
|
||||
.TrainingLecturer{
|
||||
font-size:18px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
color:#656565;
|
||||
}
|
||||
.TrainingTheory{
|
||||
font-size:18px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
color:#05101A !important;
|
||||
}
|
||||
#SystemParameters{
|
||||
height: 81px;
|
||||
line-height: 40px;
|
||||
}
|
||||
#SystemParameters .SystemParameters:nth-child(1){
|
||||
font-size:14px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
/* color:#989898 !important; */
|
||||
}
|
||||
#SystemParameters .SystemParameters:nth-child(2){
|
||||
font-size:14px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
color:#989898 !important;
|
||||
}
|
||||
.operationright{
|
||||
float:right !important;
|
||||
}
|
||||
.ml75{
|
||||
margin-left:75px;
|
||||
}
|
||||
.mlim30{
|
||||
margin-left:30px !important;
|
||||
}
|
||||
.RadioGroupbox{
|
||||
display: inline-block;
|
||||
width: 100px;
|
||||
height: 25px;
|
||||
position: relative;
|
||||
}
|
||||
.RadioGroupboxab{
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
left: 30px;
|
||||
}
|
||||
.buttoninline{
|
||||
display: inline-block;
|
||||
margin-left: 29px;
|
||||
position: relative;
|
||||
/* width: 100px; */
|
||||
margin-top: 0px;
|
||||
height: 25px;
|
||||
}
|
||||
.placeholder::-moz-placeholder{font-size:12px;}
|
||||
.placeholder::-webkit-input-placeholder{font-size:12px;}
|
||||
.placeholder:-ms-input-placeholder{font-size:12px;}
|
||||
.mr16{
|
||||
margin-right:16px;
|
||||
}
|
||||
.defalutSubmitbtn{
|
||||
cursor: pointer;
|
||||
}
|
||||
.defalutCancelbtn{
|
||||
cursor: pointer;
|
||||
}
|
||||
.newSystem{
|
||||
background: #fff;
|
||||
}
|
||||
/* #EvaluationsList{
|
||||
padding:20px 0px;
|
||||
} */
|
||||
.mt55{
|
||||
margin-top:55px !important;
|
||||
}
|
||||
.mb100{
|
||||
margin-bottom:100px !important;
|
||||
}
|
||||
.mt26{
|
||||
margin-top:26px !important;
|
||||
}
|
||||
.mb80{
|
||||
margin-bottom:80px !important;
|
||||
}
|
||||
.color99{
|
||||
color:#999999;
|
||||
}
|
||||
.ant-select-selection__placeholder{
|
||||
width: 100%;
|
||||
font-size:14px;
|
||||
height:58px;
|
||||
}
|
||||
.mt70{
|
||||
margin-top:70px;
|
||||
}
|
||||
.mb50{
|
||||
margin-bottom:50px;
|
||||
}
|
||||
/* 谷歌 */
|
||||
input::-webkit-outer-spin-button,
|
||||
input::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
margin: 0;
|
||||
font-size:14px;
|
||||
}
|
||||
/* 火狐 */
|
||||
input{
|
||||
-moz-appearance:textfield;
|
||||
font-size:14px;
|
||||
}
|
||||
.ColorF68{
|
||||
color:#FF6800;
|
||||
}
|
||||
.eaSystemp a{
|
||||
color:#05101a;
|
||||
}
|
||||
.eaSystemp span{
|
||||
color: #05101a !important;
|
||||
}
|
||||
.editorModify div .ant-input-lg{
|
||||
font-size: 14px;
|
||||
}
|
||||
#Coursemultiple div div ul .ant-select-selection__choice{
|
||||
margin-left: 0px;
|
||||
height: 20px !important;
|
||||
min-height: 29px;
|
||||
font-size: 14px;
|
||||
line-height: 27px;
|
||||
margin-top: 4px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
#Coursemultiple .ant-select-selection--multiple{
|
||||
min-height: 40px !important;
|
||||
line-height: 38px !important;
|
||||
}
|
||||
#Coursemultiple div div ul .ant-select-search.ant-select-search--inline{
|
||||
margin-left: 0px;
|
||||
height: 20px !important;
|
||||
min-height: 29px;
|
||||
font-size: 14px;
|
||||
line-height: 27px;
|
||||
margin-top: 4px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
.neweditSubentry{
|
||||
position: relative;
|
||||
top: -4px;
|
||||
left: 7px;
|
||||
}
|
||||
.nulleditSubentry{
|
||||
position: relative;
|
||||
top: -4px;
|
||||
left: 3px;
|
||||
}
|
||||
.percentage{
|
||||
margin-left: 8px;
|
||||
padding-left: 25px !important;
|
||||
}
|
||||
.Coursetitle{
|
||||
margin-bottom:0px !important;
|
||||
}
|
||||
.textaligncenter{
|
||||
padding-left: 30px !important;
|
||||
width: 70px !important;
|
||||
}
|
||||
.ml72{
|
||||
margin-left:72px;
|
||||
}
|
||||
|
||||
.bordereaeaea{
|
||||
border-bottom: 1px solid transparent !important;
|
||||
}
|
||||
.ecnowrap{
|
||||
max-width: 170px;
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
-o-text-overflow: ellipsis;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
color: #40a9ff !important;
|
||||
margin-right: 108px;
|
||||
}
|
||||
.ecblock{
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.Spinlarge{
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
margin-top: 25px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
/* .ant-select-search{
|
||||
display:none;
|
||||
}
|
||||
.ant-select-search--inline{
|
||||
display:none;
|
||||
} */
|
||||
.boxinline-block{
|
||||
display: inline-block;
|
||||
}
|
||||
.boxinline{
|
||||
margin-right: 20px;
|
||||
}
|
||||
.evaluationdataClass{
|
||||
margin-left: 217px !important;
|
||||
width: 589px !important;
|
||||
display: inline-block;
|
||||
}
|
||||
.absolute{
|
||||
position:absolute;
|
||||
}
|
||||
.ml115{
|
||||
margin-left: 115px;
|
||||
}
|
||||
.ml100{
|
||||
margin-left: 100px;
|
||||
}
|
||||
.Importclassroomdata{
|
||||
position: absolute;
|
||||
right: 18px;
|
||||
top: 26px;
|
||||
}
|
||||
.Importclassroomdatas{
|
||||
position: absolute;
|
||||
right: 375px!important;
|
||||
top: 122px !important;
|
||||
}
|
||||
.Importclassroomdatass {
|
||||
position: absolute;
|
||||
right: 375px !important;
|
||||
top: 248px !important;
|
||||
}
|
||||
|
||||
#SystemParameters{
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.newSystem .newtarget_scoreclass{
|
||||
padding: 10px 0px !important;
|
||||
margin: 0px 20px !important;
|
||||
}
|
||||
|
||||
.newSystem .newtarget_target{
|
||||
padding: 10px 0px !important;
|
||||
margin: 0px 30px !important;
|
||||
border-bottom:1px solid transparent !important;
|
||||
}
|
||||
|
||||
.nowrap329{
|
||||
max-width: 329px !important;
|
||||
text-align: left;
|
||||
overflow:hidden;
|
||||
text-overflow:ellipsis;
|
||||
white-space:nowrap;
|
||||
color:transparent !important;
|
||||
min-width: 329px !important;
|
||||
}
|
||||
.ListTableLine li>.column-500{
|
||||
max-width: 360px !important;
|
||||
text-align: left;
|
||||
min-width: 360px !important;
|
||||
}
|
||||
.color-666{
|
||||
color:#666666 !important;
|
||||
}
|
||||
.color-05101A{
|
||||
color:#05101A !important;
|
||||
}
|
||||
#SystemParametersP{
|
||||
position:relative;
|
||||
margin-bottom:0px !important;
|
||||
}
|
||||
.major_name{
|
||||
cursor:inherit;
|
||||
}
|
||||
.padding1030{
|
||||
padding: 10px 30px;
|
||||
height: 60px !important;
|
||||
}
|
||||
.color-red{
|
||||
color:#DD1717;
|
||||
}
|
||||
.color-redFF{
|
||||
color:#FF6666;
|
||||
}
|
||||
.margin-left63{
|
||||
margin-left: 63px !important;
|
||||
}
|
||||
.colorTransparent{
|
||||
color:transparent !important;
|
||||
}
|
||||
.color999{
|
||||
color: #999999 !important;
|
||||
}
|
||||
.operationrightbotton{
|
||||
margin-top: 2px!important;
|
||||
margin-right: -25px;
|
||||
}
|
||||
.mr2{
|
||||
margin-right:2px;
|
||||
}
|
||||
.colorFF6800{
|
||||
color: #FF6800 !important;
|
||||
}
|
||||
.lineheight60{
|
||||
line-height: 52px !important;
|
||||
}
|
||||
.mr13{
|
||||
margin-right: 13px;
|
||||
}
|
||||
.mr14{
|
||||
margin-right: 14px;
|
||||
}
|
||||
|
||||
.ecmorelist{
|
||||
margin: 0 auto;
|
||||
width: 100px;
|
||||
/* height: 100px; */
|
||||
display: block;
|
||||
}
|
||||
|
||||
.padding10im{
|
||||
padding: 10px 0px !important;
|
||||
}
|
||||
|
||||
.lipadding10im{
|
||||
margin: 0 0px!important;
|
||||
}
|
||||
|
||||
.lipadding20im{
|
||||
padding: 10px 20px!important;
|
||||
}
|
||||
|
||||
.marlr19{
|
||||
margin: 0 19px!important;
|
||||
}
|
||||
.mrj15{
|
||||
margin-right: -15px;
|
||||
}
|
||||
.margin64px{
|
||||
margin: 0 64px!important;
|
||||
}
|
||||
.marginright84{
|
||||
margin-right: 84px!important;
|
||||
}
|
||||
|
||||
.marginright162{
|
||||
margin-right: 162px;
|
||||
}
|
||||
.width86{
|
||||
width: 86px!important;
|
||||
}
|
||||
|
||||
.ant-modal-mask {
|
||||
background-color: rgba(5,16,26,0.4);
|
||||
}
|
||||
.ecmodeldelet{
|
||||
/* 考虑有各种尺寸的屏幕,用比例 */
|
||||
top:36%;
|
||||
}
|
||||
.ecmodeldelet .ant-modal-header{
|
||||
padding: 0px 24px;
|
||||
}
|
||||
.ecmodeldelet .ant-modal-title{
|
||||
padding: 0px 15px;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
line-height: 70px;
|
||||
height: 70px;
|
||||
border-radius: 10px 10px 0px 0px;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
}
|
||||
a.TrainingLecturer:hover{
|
||||
color:#4CACFF !important;
|
||||
}
|
||||
|
||||
.newSystem .lipadding10im{
|
||||
margin: 0 0px!important;
|
||||
}
|
||||
|
||||
.operationleft{
|
||||
float:left !important;
|
||||
}
|
||||
.color4D4D4D{
|
||||
color:#4D4D4D !important;
|
||||
}
|
||||
|
||||
/* #SystemParameters .SystemParameters:nth-child(1){
|
||||
color:#4D4D4D !important;
|
||||
} */
|
||||
|
||||
.color4CACFF{
|
||||
color:#4CACFF !important;
|
||||
}
|
||||
|
||||
.SystemParameters4CACFF{
|
||||
font-size:14px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
line-height: 45px;
|
||||
}
|
||||
|
||||
.detaillist{
|
||||
text-align: center !important;
|
||||
width: 133px !important;
|
||||
height: 24px ;
|
||||
}
|
||||
|
||||
.associatedclass{
|
||||
margin-right: 128px !important;
|
||||
}
|
||||
|
||||
.associatedclasslist{
|
||||
width: 234px;
|
||||
height: 20px;
|
||||
font-size: 14px;
|
||||
font-family: MicrosoftYaHei;
|
||||
font-weight: 400;
|
||||
color: rgba(101,101,101,1);
|
||||
line-height: 22px;
|
||||
margin: 6px auto;
|
||||
}
|
||||
|
||||
.associatedclasslists{
|
||||
width: 323px;
|
||||
height: 35px;
|
||||
font-size: 14px;
|
||||
font-family: MicrosoftYaHei;
|
||||
font-weight: 400;
|
||||
color: rgba(101,101,101,1);
|
||||
line-height: 22px;
|
||||
margin: 6px auto;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.newecmodeldelet{
|
||||
width:600px !important;
|
||||
top:100px;
|
||||
}
|
||||
|
||||
.assclasslistsearch{
|
||||
width:454px;
|
||||
height:36px;
|
||||
background:rgba(244,244,244,1);
|
||||
border:1px solid rgba(234,234,234,1);
|
||||
border-radius:4px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.assclassposition{
|
||||
position: absolute;
|
||||
top: 3px;
|
||||
left: 9px;
|
||||
}
|
||||
|
||||
.assclasslistsearchbtn{
|
||||
width: 64px;
|
||||
height: 35px !important;
|
||||
font-weight: 300 !important;
|
||||
line-height: 35px !important;
|
||||
}
|
||||
.btnweight{
|
||||
font-weight: 300 !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.CBCBCB{
|
||||
background:#CBCBCB!important;
|
||||
}
|
||||
.clear{
|
||||
clear: both;
|
||||
}
|
||||
.ml120{
|
||||
margin-left: 120px;
|
||||
}
|
||||
.ml88{
|
||||
margin-left: 88px;
|
||||
}
|
||||
.assclasslistmid{
|
||||
width: 540px;
|
||||
height: 282px;
|
||||
background: rgba(244,250,255,1);
|
||||
border-radius: 4px;
|
||||
margin-left: 10px;
|
||||
overflow: auto;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.assclasslistsubmit{
|
||||
margin-top: 26px !important;
|
||||
margin-bottom: 8px !important;
|
||||
}
|
||||
.ant-modal-header{
|
||||
border-top-left-radius:10px;
|
||||
border-top-right-radius:10px;
|
||||
}
|
||||
.ant-modal-content{
|
||||
border-radius: 10px;
|
||||
}
|
||||
.assclasslistmidname{
|
||||
width: 160px;
|
||||
overflow: hidden;
|
||||
/* height: 24px; */
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.bordereaeaeas{
|
||||
border-bottom: 1px solid #eaeaea !important;
|
||||
}
|
||||
.isreloadsbtn{
|
||||
width: 80px !important;
|
||||
font-weight: 400 !important;
|
||||
padding: 0px !important;
|
||||
padding-left: 10px !important;
|
||||
}
|
||||
|
||||
.f5f5f5{
|
||||
color:rgb(245, 245, 245) !important;
|
||||
}
|
||||
|
||||
.ant-select-selection{
|
||||
border-radius: 0px !important;
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
|
||||
.ant-select-selection:focus{
|
||||
border-radius: 0px !important;
|
||||
background-color: #fff;
|
||||
border-color: #d9d9d9 !important;
|
||||
}
|
||||
|
||||
.listchildbox{
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.listchildboxs{
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.ant-input:focus, .ant-input:hover{
|
||||
border-color: transparent;
|
||||
}
|
||||
.inputWeight{
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
.inputWeight:focus {
|
||||
background-color: #fff;
|
||||
}
|
||||
.ant-input:focus {
|
||||
outline: 0;
|
||||
-webkit-box-shadow: 0 0 0 2px transparent !important;
|
||||
box-shadow: 0 0 0 2px transparent !important;
|
||||
}
|
||||
|
||||
.ant-input{
|
||||
border-color: #d9d9d9 !important;
|
||||
}
|
||||
|
||||
.mt60{
|
||||
margin-top:60px;
|
||||
}
|
||||
|
||||
.SystemParameters{
|
||||
height:auto;
|
||||
}
|
@ -0,0 +1,368 @@
|
||||
.eaSystemp a{
|
||||
color:#05101a;
|
||||
}
|
||||
.eaSystemp span{
|
||||
color: #05101a !important;
|
||||
}
|
||||
.eacourse p{
|
||||
height:84px;
|
||||
margin-bottom:0px !important;
|
||||
}
|
||||
.eacourse #training_objective_contents{
|
||||
height:81px;
|
||||
}
|
||||
.courseSystem{
|
||||
font-size:18px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
line-height:45px;
|
||||
color:rgba(5,16,26,1);
|
||||
}
|
||||
.SystemParameters{
|
||||
font-size:14px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
line-height:45px;
|
||||
color:rgba(50,50,50,1);
|
||||
}
|
||||
.SystemParametersysls{
|
||||
font-size:14px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
color:rgba(50,50,50,1);
|
||||
}
|
||||
.Systemnum{
|
||||
font-size:14px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
color:#FF6800;
|
||||
}
|
||||
.newSystem{
|
||||
width:1200px;
|
||||
overflow:auto;
|
||||
background: #FFF;
|
||||
}
|
||||
.newSystem .clearfix .column-1{
|
||||
width: 113px !important;
|
||||
text-align: center;
|
||||
}
|
||||
.operationColumn{
|
||||
margin: 0px 10%;
|
||||
width:100%;
|
||||
height:100%;
|
||||
}
|
||||
.operationalter{
|
||||
margin: 20px 16px;
|
||||
}
|
||||
.SystemModifythelist .column-1{
|
||||
width: 120px !important;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.SystemModifythelist .column-3{
|
||||
padding-left: 96px;
|
||||
margin-right: 23px;
|
||||
}
|
||||
.operationright{
|
||||
float:right !important;
|
||||
}
|
||||
|
||||
.newSystem p{
|
||||
/*padding: 10px 33px !important;*/
|
||||
margin-bottom: 0em;
|
||||
}
|
||||
.newSystem li{
|
||||
margin:0 !important;
|
||||
}
|
||||
.SystemModifythelist{
|
||||
background:#FFF !important;
|
||||
}
|
||||
|
||||
.SystemModifythelist .column-1:nth-child(1){
|
||||
margin-left: 7px;
|
||||
}
|
||||
|
||||
.Systempoint{
|
||||
font-size:12px;
|
||||
font-family:MicrosoftYaHei;
|
||||
font-weight:400;
|
||||
color:rgba(152,152,152,1);
|
||||
}
|
||||
.editorModify{
|
||||
background:#FFF !important;
|
||||
}
|
||||
.newSystem .editorModify .column-1{
|
||||
width: 194px !important;
|
||||
text-align: left;
|
||||
margin-left: 30px;
|
||||
}
|
||||
.newSystem .editorModify .column-1:nth-child(1){
|
||||
margin-right: 510px;
|
||||
}
|
||||
.editorModify .ant-select{
|
||||
width: 556px !important;
|
||||
margin-left: 36px;
|
||||
}
|
||||
.editorModify .ant-select .ant-select-selection{
|
||||
height: 30px !important;
|
||||
}
|
||||
.editorModify .ant-select .ant-select-selection .ant-select-selection__rendered{
|
||||
height: 30px !important;
|
||||
}
|
||||
.editorModify .ant-select .ant-select-selection .ant-select-selection__rendered .ant-select-selection-selected-value{
|
||||
line-height: 30px !important;
|
||||
}
|
||||
.inputWeight{
|
||||
width: 20%;
|
||||
font-size:14px;
|
||||
height:30px;
|
||||
margin-left: 20px;
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
.SetTheAssociated{
|
||||
width: 314px;
|
||||
height: 30px;
|
||||
float: right;
|
||||
margin-right: -3.5%;
|
||||
}
|
||||
.SetTheAssociatedchild{
|
||||
width: 120px;
|
||||
height: 30px;
|
||||
background: rgba(255,255,255,1);
|
||||
border: 1px solid rgba(234,234,234,1);
|
||||
border-radius: 4px;
|
||||
float: left;
|
||||
margin-right: 10px;
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
/*margin-left: 34px;*/
|
||||
}
|
||||
.operatebutton{
|
||||
margin-left: 20px;
|
||||
/* margin-top: 16px; */
|
||||
}
|
||||
.editbulebutton{
|
||||
width:120px;
|
||||
height:30px;
|
||||
background:rgba(76,172,255,1);
|
||||
border-radius:2px;
|
||||
color:#FFF;
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
}
|
||||
.editglybutton{
|
||||
width:120px;
|
||||
height:30px;
|
||||
border:1px solid rgba(205,205,205,1);
|
||||
border-radius:2px;
|
||||
color:#999;
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
}
|
||||
|
||||
.editglybuttonbox{
|
||||
width: 275px;
|
||||
margin-bottom: 30px;
|
||||
margin-right: 20px;
|
||||
margin-right:7%;
|
||||
}
|
||||
.editglybuttonboxs{
|
||||
width: 275px;
|
||||
margin-bottom: 30px;
|
||||
margin-right: 20px;
|
||||
margin-right:3%;
|
||||
}
|
||||
.defalutCancelbtn:hover {
|
||||
border: 1px solid #B2B2B2;
|
||||
color: #B2B2B2!important;
|
||||
}
|
||||
|
||||
.gouxuanbule{
|
||||
color:#4CACFF;
|
||||
}
|
||||
.gouxuanwhite{
|
||||
color:#FFF;
|
||||
}
|
||||
.icon-gouxuan{
|
||||
cursor: pointer;
|
||||
}
|
||||
/* 谷歌 */
|
||||
input::-webkit-outer-spin-button,
|
||||
input::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
/* 火狐 */
|
||||
input{
|
||||
-moz-appearance:textfield;
|
||||
}
|
||||
.inputWeight{
|
||||
text-indent:0.625rem;
|
||||
}
|
||||
|
||||
.columnlocation{
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
}
|
||||
.paddingLF{
|
||||
padding:0 33px;
|
||||
}
|
||||
.width20{
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
.defalutSubmitbtn,.defalutCancelbtn{
|
||||
cursor: pointer;
|
||||
}
|
||||
.mb290{
|
||||
margin-bottom:290px;
|
||||
}
|
||||
.Spinlarge{
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
margin-top: 25px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
.DDred{
|
||||
color:#DD1717;
|
||||
}
|
||||
.color-666{
|
||||
color:#666666 !important;
|
||||
}
|
||||
.color-05101A{
|
||||
color:#05101A !important;
|
||||
}
|
||||
.ec_graduation_name{
|
||||
margin-right:20px !important;
|
||||
}
|
||||
.column-width575{
|
||||
color: transparent !important;
|
||||
}
|
||||
.column-width130{
|
||||
width: 130px !important;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
|
||||
.ListTableLine li>span {
|
||||
max-width: 550px !important;
|
||||
}
|
||||
|
||||
.graduateRequirement .clearfix .column-1 {
|
||||
width: 76px!important;
|
||||
}
|
||||
.newrightcalculatebutton{
|
||||
width: 50px;
|
||||
height: 25px;
|
||||
border: 1px solid rgba(76,172,255,1);
|
||||
border-radius: 1px;
|
||||
line-height: 25px;
|
||||
text-align: center;
|
||||
margin-top: 7px;
|
||||
cursor: pointer;
|
||||
color: rgba(76,172,255,1);
|
||||
}
|
||||
.newrightcalculatebuttons{
|
||||
width: 50px;
|
||||
height: 25px;
|
||||
border: 1px solid rgba(76,172,255,1);
|
||||
border-radius: 1px;
|
||||
line-height: 25px;
|
||||
text-align: center;
|
||||
margin-top:9px;
|
||||
cursor: pointer;
|
||||
color: rgba(76,172,255,1);
|
||||
}
|
||||
.columnbox{
|
||||
height: 53px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.ant-modal-mask {
|
||||
background-color: rgba(5,16,26,0.4);
|
||||
}
|
||||
.ecmodeldelet{
|
||||
top:300px;
|
||||
}
|
||||
.ecmodeldelet .ant-modal-header{
|
||||
padding: 0px 24px;
|
||||
}
|
||||
.ecmodeldelet .ant-modal-title{
|
||||
padding: 0px 15px;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
line-height: 70px;
|
||||
height: 70px;
|
||||
border-radius: 10px 10px 0px 0px;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.bor-red {
|
||||
border: 1px solid #db0505 !important;
|
||||
}
|
||||
|
||||
.ml93{
|
||||
margin-left:93px;
|
||||
}
|
||||
.ml26{
|
||||
margin-left: 26px;
|
||||
}
|
||||
.finishtarget{
|
||||
width: 69px;
|
||||
/* height: 48px; */
|
||||
line-height: 20px;
|
||||
text-align: center;
|
||||
margin-right: 48px;
|
||||
}
|
||||
|
||||
.bordereaeaea{
|
||||
border-bottom: 1px solid transparent !important;
|
||||
}
|
||||
|
||||
.heightimportant{
|
||||
height: 30px !important;
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
.heightimportant:focus {
|
||||
background-color: #fff;
|
||||
}
|
||||
.inputWeight:focus {
|
||||
background-color: #fff;
|
||||
}
|
||||
.heightlineimportant{
|
||||
line-height: 30px !important;
|
||||
}
|
||||
|
||||
.ant-select-selection:hover{
|
||||
border-color: #d9d9d9 !important;
|
||||
}
|
||||
.ant-input:focus {
|
||||
outline: 0;
|
||||
-webkit-box-shadow: 0 0 0 2px transparent !important;
|
||||
box-shadow: 0 0 0 2px transparent !important;
|
||||
}
|
||||
.ant-input{
|
||||
border-color: #d9d9d9 !important;
|
||||
}
|
||||
.ant-select-selection:focus{
|
||||
-webkit-box-shadow: 0 0 0 2px transparent !important;
|
||||
box-shadow: 0 0 0 2px transparent !important;
|
||||
}
|
||||
.ant-select-selection:active{
|
||||
-webkit-box-shadow: 0 0 0 2px transparent !important;
|
||||
box-shadow: 0 0 0 2px transparent !important;
|
||||
}
|
||||
|
||||
.ant-select-selection:focus{
|
||||
border-color: #d9d9d9 !important;
|
||||
}
|
||||
.ant-select-selection{
|
||||
-webkit-box-shadow: 0 0 0 2px transparent !important;
|
||||
box-shadow: 0 0 0 2px transparent !important;
|
||||
}
|
||||
|
||||
.mt60{
|
||||
margin-top:60px;
|
||||
}
|
After Width: | Height: | Size: 674 B |
@ -0,0 +1,32 @@
|
||||
import React, { Component } from 'react';
|
||||
|
||||
class Curriculumtwo extends Component {
|
||||
//测试用
|
||||
constructor(props) {
|
||||
super(props)
|
||||
// console.log(props);
|
||||
}
|
||||
|
||||
componentWillMount(){
|
||||
}
|
||||
componentDidMount(){
|
||||
// console.log(this.props);
|
||||
console.log("Curriculumtwo");
|
||||
console.log(this.props.match.params.type);
|
||||
this.props.Ontitine(this.props.match.params.type);
|
||||
}
|
||||
|
||||
|
||||
render() {
|
||||
// console.log("Curriculumtwo");
|
||||
// console.log(this.props);
|
||||
return (
|
||||
<div className="educontent fl">
|
||||
<span>测试</span>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
export default Curriculumtwo;
|
@ -0,0 +1,104 @@
|
||||
#traningNav {
|
||||
display: flex
|
||||
}
|
||||
#traningNav>li {
|
||||
float: none !important;
|
||||
}
|
||||
/* 最后一个item 占满剩余空间 */
|
||||
#traningNav>li:last-child{
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
#traningNav>li>.ecTitle {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border: 1px solid rgba(65, 140, 205, 1);
|
||||
border-radius: 50%;
|
||||
text-align: center;
|
||||
line-height: 22px;
|
||||
display: inline-block;
|
||||
color: rgba(65, 140, 205, 1) !important;
|
||||
margin-right: 10px;
|
||||
}
|
||||
#traningNav>li>.ecTitles {
|
||||
line-height: 16px !important;
|
||||
height: 18px!important;
|
||||
width: 18px!important;
|
||||
}
|
||||
|
||||
#traningNav>li>.ecTitlefont:hover{
|
||||
color: rgba(65, 140, 205, 1) !important;
|
||||
}
|
||||
|
||||
.ecimgs3{
|
||||
background: url("./img/3.png");
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
-moz-background-size: 100% 100%;
|
||||
height: 90px;
|
||||
line-height: 90px;
|
||||
width: 235px;
|
||||
}
|
||||
.ecimgs2{
|
||||
background: url("./img/4.png");
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
-moz-background-size: 100% 100%;
|
||||
height: 90px;
|
||||
line-height: 90px;
|
||||
width: 190px;
|
||||
}
|
||||
.ecimgs11{
|
||||
background: url("./img/3.png");
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
-moz-background-size: 100% 100%;
|
||||
height: 90px;
|
||||
line-height: 90px;
|
||||
width: 146px;
|
||||
}
|
||||
.ml18{
|
||||
margin-left: 18px;
|
||||
}
|
||||
.ecimgs{
|
||||
height: 90px;
|
||||
line-height: 90px;
|
||||
}
|
||||
.ecmarginleft{
|
||||
margin-left: 23px;
|
||||
}
|
||||
|
||||
#traningNav>li>.ecTitlefontFFF{
|
||||
color:#fff !important;
|
||||
}
|
||||
|
||||
#traningNav>li>.ecTitleFFF {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border: 1px solid #fff;
|
||||
border-radius: 50%;
|
||||
text-align: center;
|
||||
line-height: 22px;
|
||||
display: inline-block;
|
||||
color: #fff !important;
|
||||
margin-right: 10px;
|
||||
}
|
||||
.traningNavs{
|
||||
padding: 0px 0px 0px 0px !important;
|
||||
}
|
||||
.traningNavs>li{
|
||||
padding: 0px 10px 30px 10px !important;
|
||||
}
|
||||
|
||||
.mb0{
|
||||
margin-bottom: 0px !important;
|
||||
}
|
||||
|
||||
.info2{
|
||||
width:232px;
|
||||
text-align: center;
|
||||
}
|
||||
.info1{
|
||||
width: 206px;
|
||||
text-align: center;
|
||||
}
|
@ -0,0 +1,100 @@
|
||||
import React, { Component } from 'react';
|
||||
import './ecTitle.css';
|
||||
|
||||
class EcTitleCourseEvaluations extends Component {
|
||||
constructor(props) {
|
||||
super(props)
|
||||
this.state = {
|
||||
schooldata:{},
|
||||
ecComponentState:"",
|
||||
ecpaths:""
|
||||
}
|
||||
}
|
||||
componentWillReceiveProps(nextProps){
|
||||
const {schooldata,ecComponentState,ecpath}=nextProps;
|
||||
this.setState({
|
||||
schooldata:schooldata,
|
||||
ecComponentState:ecComponentState,
|
||||
ecpaths:ecpath
|
||||
})
|
||||
}
|
||||
|
||||
render() {
|
||||
let{schooldata,ecComponentState,ecpaths}=this.state;
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className="mb10 mt10 eaSystemp">
|
||||
|
||||
<a href={schooldata.user_url}>{schooldata.user_name===undefined?"":schooldata.user_name+" > "}</a>
|
||||
<a href={schooldata.school_url}>{schooldata.school_name===undefined?"":schooldata.school_name+"认证"}</a>
|
||||
<a href={schooldata.major_url}>{schooldata.school_name===undefined?"":" > "+schooldata.major_name+" > "}</a>
|
||||
<span> {schooldata.school_name===undefined?"":schooldata.year+"届"}</span>
|
||||
|
||||
</div>
|
||||
|
||||
<ul className="clearfix mb0 traningNavs " id="traningNav" style={{display:ecpaths==='none'?"none":"flex"}}>
|
||||
<li className={"ecimgs"}>
|
||||
<a className={"ecTitle ecTitles"} >1</a>
|
||||
<a className={"ecTitlefont"} href={schooldata.major_training}>培养目标</a>
|
||||
</li>
|
||||
<li className={"ecimgs"}>
|
||||
<a className={"ecTitle ecTitles"} >2</a>
|
||||
<a className={"ecTitlefont"} href={schooldata.graduation_requirement_url} >毕业要求</a>
|
||||
</li>
|
||||
<li className={"ecimgs"}>
|
||||
<a className={"ecTitle ecTitles"} >3</a>
|
||||
<a className={"ecTitlefont"} href={schooldata.requirement_vs_objective_url}>毕业要求 vs 培养目标</a>
|
||||
</li>
|
||||
<li className={"ecimgs"}>
|
||||
<a className={"ecTitle ecTitles"} >4</a>
|
||||
<a className={"ecTitlefont"} href={schooldata.requirement_vs_standard}>毕业要求 vs 通用标准</a>
|
||||
</li>
|
||||
<li className={ecpaths==="ecStudentList"?"ecimgs11":"ecimgs"} style={{width: ecpaths==="ecStudentList"?'126px':'83px'}}>
|
||||
<a className={ ecpaths==="ecStudentList"?"ml18 ecTitleFFF ecTitles":"ecTitle"} >5</a>
|
||||
<a className={ ecpaths==="ecStudentList"?"ecTitlefontFFF":"ecTitlefont"} href={schooldata.students_url}>学生</a>
|
||||
</li>
|
||||
<li className={ecpaths==="ec_course_support_setting"||ecpaths==="show"?"ecimgs11":"ecimgs"}>
|
||||
<a className={ ecpaths==="ec_course_support_setting"||ecpaths==="show"?"ml18 ecTitleFFF ecTitles":"ecTitle ecTitles"} >6</a>
|
||||
<a className={ ecpaths==="ec_course_support_setting"||ecpaths==="show"?"ecTitlefontFFF":"ecTitlefont"} href={schooldata.course_setting_url}>课程体系</a>
|
||||
</li>
|
||||
<li className={ecpaths==="requirement_vs_courses"?"ecimgs3":"ecimgs"}>
|
||||
<a className={ ecpaths==="requirement_vs_courses"?"ecmarginleft ecTitleFFF ecTitles":"ecTitle ecTitles"} >7</a>
|
||||
<a className={ ecpaths==="requirement_vs_courses"?"ecTitlefontFFF":"ecTitlefont"} href={schooldata.requirement_vs_courses}>课程体系 vs 毕业要求</a>
|
||||
</li>
|
||||
<li className={ecpaths==="reach_calculation_info"?"ecimgs2 info2":"ecimgs"}>
|
||||
<a className={ ecpaths==="reach_calculation_info"?"ecTitleFFF ml18 ecTitles":"ecTitle ecTitles"} >8</a>
|
||||
<a className={ ecpaths==="reach_calculation_info"?"ecTitlefontFFF":"ecTitlefont"} href={schooldata.reach_calculation_info_url}>达成度评价结果</a>
|
||||
</li>
|
||||
{/*<li className={ecComponentState==="ecCourseSupports"?"active edu-menu-panel":"edu-menu-panel"}>*/}
|
||||
{/*<a>毕业要求</a>*/}
|
||||
{/*<i className="iconfont icon-xiajiantou font-14 ml5" style={{display:ecComponentState==="ecCourseSupports"?"inline-block":"none"}}></i>*/}
|
||||
{/*<ul className="edu-menu-list" style={{width:'200px',right:'unset',top:'34px'}}>*/}
|
||||
{/*<li><a href={schooldata.major_training} >专业培养目标</a></li>*/}
|
||||
{/*<li><a href={schooldata.graduation_requirement_url} >毕业要求指标点</a></li>*/}
|
||||
{/*<li><a href={schooldata.requirement_vs_objective_url} >毕业要求vs培养目标</a></li>*/}
|
||||
{/*<li><a href={schooldata.requirement_vs_standard} >毕业要求vs通用要求</a></li>*/}
|
||||
{/*<li><a href={schooldata.requirement_vs_courses} >毕业要求vs课程体系</a></li>*/}
|
||||
{/*</ul>*/}
|
||||
{/*</li>*/}
|
||||
|
||||
{/*<li className={ecComponentState==="ecCourseEvaluations"?"active edu-menu-panel":"edu-menu-panel"}>*/}
|
||||
{/*<a href={schooldata.course_setting_url}>课程配置</a>*/}
|
||||
{/*</li>*/}
|
||||
|
||||
{/*<li className={ecComponentState==="ecCompletion"?"active edu-menu-panel":"edu-menu-panel"}>*/}
|
||||
{/*<a>达成度计算</a>*/}
|
||||
{/*<i className="iconfont icon-xiajiantou font-14 ml5" style={{display:ecComponentState==="ecCompletion"?"inline-block":"none"}}></i>*/}
|
||||
{/*<ul className="edu-menu-list" style={{width:'200px',right:'unset',top:'34px'}}>*/}
|
||||
{/*<li><a href={schooldata.completion_calculation_url}>课程达成计算</a></li>*/}
|
||||
{/*<li><a href={schooldata.reach_calculation_info_url}>毕业要求指标点达成计算</a></li>*/}
|
||||
{/*</ul>*/}
|
||||
{/*</li>*/}
|
||||
{/*<a className="fr color-grey-6 font-16" href={schooldata.go_back_url}>返回</a>*/}
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
)}
|
||||
}
|
||||
|
||||
export default EcTitleCourseEvaluations;
|
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 1.6 KiB |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue