From 0ed5b1d79f39ba522a43c164a6a5cc4a3b1b0176 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Mon, 16 Sep 2019 15:49:07 +0800 Subject: [PATCH] ecs: training_objectives page --- .../ecs/ec_training_objectives_controller.rb | 2 +- app/controllers/ecs/ec_years_controller.rb | 4 + app/models/ec_training_subitem.rb | 2 + .../ecs/create_training_objective_service.rb | 17 +- .../_ec_training_objective.json.jbuilder | 2 +- .../ec_training_objectives/show.json.jbuilder | 2 +- .../ec_training_objectives/show.xlsx.axlsx | 6 +- app/views/ecs/ec_years/show.json.jbuilder | 13 + config/routes.rb | 2 +- .../EcSetting/GraduationRequirement/index.js | 72 +++++ .../GraduationRequirement/index.scss | 0 .../ecs/EcSetting/TrainingObjective/index.js | 264 ++++++++++++++++++ .../EcSetting/TrainingObjective/index.scss | 99 +++++++ .../react/src/modules/ecs/EcSetting/index.js | 110 ++++++++ .../src/modules/ecs/EcSetting/index.scss | 62 ++++ .../src/modules/ecs/EcYear/AddYearModal.js | 2 +- public/react/src/modules/ecs/EcYear/index.js | 75 ++--- .../react/src/modules/ecs/EcYear/index.scss | 10 +- public/react/src/modules/ecs/Ecs.js | 2 + 19 files changed, 697 insertions(+), 49 deletions(-) create mode 100644 app/views/ecs/ec_years/show.json.jbuilder create mode 100644 public/react/src/modules/ecs/EcSetting/GraduationRequirement/index.js create mode 100644 public/react/src/modules/ecs/EcSetting/GraduationRequirement/index.scss create mode 100644 public/react/src/modules/ecs/EcSetting/TrainingObjective/index.js create mode 100644 public/react/src/modules/ecs/EcSetting/TrainingObjective/index.scss create mode 100644 public/react/src/modules/ecs/EcSetting/index.js create mode 100644 public/react/src/modules/ecs/EcSetting/index.scss diff --git a/app/controllers/ecs/ec_training_objectives_controller.rb b/app/controllers/ecs/ec_training_objectives_controller.rb index 318faa6ff..79b232822 100644 --- a/app/controllers/ecs/ec_training_objectives_controller.rb +++ b/app/controllers/ecs/ec_training_objectives_controller.rb @@ -2,7 +2,7 @@ class Ecs::EcTrainingObjectivesController < Ecs::BaseController before_action :check_major_manager_permission!, only: [:create] def show - @training_objective = current_year.ec_training_objective + @training_objective = current_year.ec_training_objective || current_year.build_ec_training_objective respond_to do |format| format.json diff --git a/app/controllers/ecs/ec_years_controller.rb b/app/controllers/ecs/ec_years_controller.rb index 896aaed8a..9764e451d 100644 --- a/app/controllers/ecs/ec_years_controller.rb +++ b/app/controllers/ecs/ec_years_controller.rb @@ -27,6 +27,10 @@ class Ecs::EcYearsController < Ecs::BaseController .where(ec_graduation_requirements: { ec_year_id: year_ids }).group('ec_year_id').count end + def show + @year = current_year + end + def create if current_major_school.ec_years.exists?(year: params[:year].to_i) render_error('届别已存在') diff --git a/app/models/ec_training_subitem.rb b/app/models/ec_training_subitem.rb index 0c9c61fbc..736e3f0da 100644 --- a/app/models/ec_training_subitem.rb +++ b/app/models/ec_training_subitem.rb @@ -1,4 +1,6 @@ class EcTrainingSubitem < ApplicationRecord + default_scope { order(position: :asc) } + belongs_to :ec_training_objective has_many :ec_requirement_vs_objectives, foreign_key: :ec_training_objective_id, dependent: :destroy diff --git a/app/services/ecs/create_training_objective_service.rb b/app/services/ecs/create_training_objective_service.rb index c3dc3c8a6..effbf5420 100644 --- a/app/services/ecs/create_training_objective_service.rb +++ b/app/services/ecs/create_training_objective_service.rb @@ -11,13 +11,16 @@ class Ecs::CreateTrainingObjectiveService < ApplicationService def call training_objective.content = params[:content].to_s.strip - attributes = build_accepts_nested_attributes( - training_objective, - training_objective.ec_training_subitems, - params[:training_subitems], - &method(:training_subitem_param_handler) - ) - training_objective.assign_attributes(ec_training_subitems_attributes: attributes) + if params.key?(:training_subitems) + attributes = build_accepts_nested_attributes( + training_objective, + training_objective.ec_training_subitems, + params[:training_subitems], + &method(:training_subitem_param_handler) + ) + attributes.each_with_index { |attr, index| attr[:position] = index + 1 } + training_objective.assign_attributes(ec_training_subitems_attributes: attributes) + end training_objective.save! training_objective diff --git a/app/views/ecs/ec_training_objectives/shared/_ec_training_objective.json.jbuilder b/app/views/ecs/ec_training_objectives/shared/_ec_training_objective.json.jbuilder index 83414d2f4..61992d8e1 100644 --- a/app/views/ecs/ec_training_objectives/shared/_ec_training_objective.json.jbuilder +++ b/app/views/ecs/ec_training_objectives/shared/_ec_training_objective.json.jbuilder @@ -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 diff --git a/app/views/ecs/ec_training_objectives/show.json.jbuilder b/app/views/ecs/ec_training_objectives/show.json.jbuilder index a37fa1c09..00825be4c 100644 --- a/app/views/ecs/ec_training_objectives/show.json.jbuilder +++ b/app/views/ecs/ec_training_objectives/show.json.jbuilder @@ -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 diff --git a/app/views/ecs/ec_training_objectives/show.xlsx.axlsx b/app/views/ecs/ec_training_objectives/show.xlsx.axlsx index 4746be0ea..130e80e6b 100644 --- a/app/views/ecs/ec_training_objectives/show.xlsx.axlsx +++ b/app/views/ecs/ec_training_objectives/show.xlsx.axlsx @@ -6,11 +6,11 @@ wb = xlsx_package.workbook wb.styles do |style| title_style = style.add_style(sz: 16, height: 20, b: true) ec_year_style = style.add_style(sz: 10, height: 14) - label_style = style.add_style(sz: 11, b: true, bg_color: '90EE90', alignment: { horizontal: :center }) + label_style = style.add_style(sz: 11, b: true, bg_color: '90EE90', border: { style: :thin, color: '000000' }, alignment: { horizontal: :center, vertical: :center }) content_style = style.add_style(sz: 11, height: 16, border: { style: :thin, color: '000000' }) wb.add_worksheet(:name => '培养目标及目标分解') do |sheet| - sheet.add_row '培养目标及目标分解', style: title_style + sheet.add_row ['培养目标及目标分解'], style: title_style sheet.add_row [] sheet.add_row [] @@ -27,6 +27,6 @@ wb.styles do |style| end items_size = training_objective.ec_training_subitems.size - sheet.merge_cells("A9:A#{9 + items_size}") + sheet.merge_cells("A9:A#{9 + items_size - 1}") end end \ No newline at end of file diff --git a/app/views/ecs/ec_years/show.json.jbuilder b/app/views/ecs/ec_years/show.json.jbuilder new file mode 100644 index 000000000..ba8333086 --- /dev/null +++ b/app/views/ecs/ec_years/show.json.jbuilder @@ -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 \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index e1e139c9d..8098d03c9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -710,7 +710,7 @@ Rails.application.routes.draw do resources :ec_major_schools, only: [:show] do resources :users, only: [:index] resources :major_managers, only: [:create, :destroy] - resources :ec_years, only: [:index, :create, :destroy] + resources :ec_years, only: [:index, :show, :create, :destroy] end resources :ec_years, only: [] do diff --git a/public/react/src/modules/ecs/EcSetting/GraduationRequirement/index.js b/public/react/src/modules/ecs/EcSetting/GraduationRequirement/index.js new file mode 100644 index 000000000..ea46b2604 --- /dev/null +++ b/public/react/src/modules/ecs/EcSetting/GraduationRequirement/index.js @@ -0,0 +1,72 @@ +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 GraduationRequirement extends React.Component { + constructor (props) { + super(props); + + this.state = { + loading: true, + + graduationRequirements: [] + } + } + + componentDidMount() { + this.getData(); + } + + getData = () => { + let { yearId } = this.props; + + axios.get(`/ec_years/${yearId}/ec_graduation_requirements.json`).then(res => { + if(res.status === 200){ + this.setState({ + graduationRequirements: res.data.ec_graduation_requirements, + loading: false + }) + } + }).catch(e => console.log(e)) + } + + render() { + let { can_manager } = this.props.year; + let { loading } = this.state; + + return ( +
+ +
+
+
+
毕业要求(及其指标点)
+
+ 请结合本专业特色修改毕业要求文字描述及指标点,需完全覆盖12项通用标准 + 查看详情 +
+
+ 导出毕业要求 +
+ + + +
+
+
+
+
+ ) + } +} +GraduationRequirement.propTypes = { + schoolId: PropTypes.string, + majorId: PropTypes.string, + yearId: PropTypes.string, +} + +export default GraduationRequirement \ No newline at end of file diff --git a/public/react/src/modules/ecs/EcSetting/GraduationRequirement/index.scss b/public/react/src/modules/ecs/EcSetting/GraduationRequirement/index.scss new file mode 100644 index 000000000..e69de29bb diff --git a/public/react/src/modules/ecs/EcSetting/TrainingObjective/index.js b/public/react/src/modules/ecs/EcSetting/TrainingObjective/index.js new file mode 100644 index 000000000..859b987ee --- /dev/null +++ b/public/react/src/modules/ecs/EcSetting/TrainingObjective/index.js @@ -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 ( +
+ +
+
+
+
培养目标
+
+ 请结合本专业特色修改培养目标文字描述及目标分解查看详情 + 查看详情 +
+
+ 导出培养目标 +
+ + + +
+ { + can_manager && contentEditState ? ( +
+
+ + this.setState({ editContent: e.target.value })} /> + +
+
+ + +
+
+ ) : ( +
+
{ objective.content }
+ { + can_manager && ( +
+ + this.setState({ contentEditState: true })} /> + +
+ ) + } +
+ ) + } + +
+
+
分项
+
目标分解详情
+
+ { + itemsEditState || ( + + + + ) + } +
+
+
+ { + can_manager && itemsEditState ? ( +
+ { + trainingSubitems && trainingSubitems.map((item, index) => { + return ( +
+
{index + 1}
+
+ + this.onItemContentChange(e, index)} /> + +
+ { index !== 0 && this.removeItemColumn(index)} /> } + + this.addItemColumn(index + 1)} style={{ color: '#29BD8B' }} /> +
+
+
+ ) + }) + } + +
+ + +
+
+ ) : ( + objective.ec_training_items && objective.ec_training_items.map((item, index) => { + return ( +
+
{ index + 1 }
+
{ item.content }
+
+ ) + }) + ) + } +
+
+
+
+
+
+ ) + } +} +TrainingObjective.propTypes = { + schoolId: PropTypes.string, + majorId: PropTypes.string, + yearId: PropTypes.string, +} + +export default TrainingObjective \ No newline at end of file diff --git a/public/react/src/modules/ecs/EcSetting/TrainingObjective/index.scss b/public/react/src/modules/ecs/EcSetting/TrainingObjective/index.scss new file mode 100644 index 000000000..50b801459 --- /dev/null +++ b/public/react/src/modules/ecs/EcSetting/TrainingObjective/index.scss @@ -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; + } +} \ No newline at end of file diff --git a/public/react/src/modules/ecs/EcSetting/index.js b/public/react/src/modules/ecs/EcSetting/index.js new file mode 100644 index 000000000..238d8474c --- /dev/null +++ b/public/react/src/modules/ecs/EcSetting/index.js @@ -0,0 +1,110 @@ +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"; + +const { Step } = Steps; + +const TrainingObjective = CustomLoadable(() => import('./TrainingObjective/index')) + +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"]; + +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 }); + 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 ( +
+
+
+ + + { year && year.school_name } + + + { year && year.major_name } + + {year && year.year}届 + +
+ +
+ + + { + steps.map((title, index) => { + return ( + + ) + }) + } + +
+ + { + year && ( + + () }> + + ) + } +
+
+ ) + } +} + +export default EcSetting \ No newline at end of file diff --git a/public/react/src/modules/ecs/EcSetting/index.scss b/public/react/src/modules/ecs/EcSetting/index.scss new file mode 100644 index 000000000..8c8d7cbd3 --- /dev/null +++ b/public/react/src/modules/ecs/EcSetting/index.scss @@ -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; + + &-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; + } +} \ No newline at end of file diff --git a/public/react/src/modules/ecs/EcYear/AddYearModal.js b/public/react/src/modules/ecs/EcYear/AddYearModal.js index 9e91e34ec..e54ba6b73 100644 --- a/public/react/src/modules/ecs/EcYear/AddYearModal.js +++ b/public/react/src/modules/ecs/EcYear/AddYearModal.js @@ -70,7 +70,7 @@ class AddYearModal extends React.Component { onOk={this.handleOk} onCancel={this.handleCancel}> -
+
基础数据:除学生列表与成绩录入以外的所有基础数据
将自动复制上届别的数据;数据均可再编辑 diff --git a/public/react/src/modules/ecs/EcYear/index.js b/public/react/src/modules/ecs/EcYear/index.js index bb3b3bfe0..e9d3a0296 100644 --- a/public/react/src/modules/ecs/EcYear/index.js +++ b/public/react/src/modules/ecs/EcYear/index.js @@ -1,7 +1,7 @@ import React from 'react'; import { Link } from 'react-router-dom'; import axios from 'axios'; -import { Spin, Button, Table, Input, Divider, Modal, message } from 'antd'; +import { Spin, Button, Table, Input, Divider, Modal, message, Breadcrumb } from 'antd'; import './index.scss'; import AddYearModal from "./AddYearModal"; @@ -141,16 +141,16 @@ class EcYear extends React.Component { const operationRender = (_, record) => { return (
- 立即配置 + 立即配置 this.showDeleteYearConfirm(record.id)}>删除
) } const tableColumns = [ { title: '届别', dataIndex: 'year', render: text => `${text}届` }, - { title: '培养目标', dataIndex: 'training_subitem_count', render: (text, record) => linkRender(text, `/ecs/major_schools/${this.state.majorId}/academic_years/${record.id}/training_objectives`), }, - { title: '毕业要求', dataIndex: 'graduation_requirement_count', render: (text, record) => linkRender(text, `/ecs/major_schools/${this.state.majorId}/academic_years/${record.id}/graduation_requirement`), }, - { title: '课程体系', dataIndex: 'course_count', render: (text, record) => linkRender(text, `/ecs/major_schools/${this.state.majorId}/academic_years/${record.id}/ec_course_setting`), }, + { title: '培养目标', dataIndex: 'training_subitem_count', render: (text, record) => linkRender(text, `/ecs/major_schools/${this.state.majorId}/years/${record.id}/training_objectives`), }, + { title: '毕业要求', dataIndex: 'graduation_requirement_count', render: (text, record) => linkRender(text, `/ecs/major_schools/${this.state.majorId}/years/${record.id}/graduation_requirement`), }, + { title: '课程体系', dataIndex: 'course_count', render: (text, record) => linkRender(text, `/ecs/major_schools/${this.state.majorId}/years/${record.id}/ec_course_setting`), }, { title: '课程目标(达成情况)', key: 'courseTarget', render: (_, record) => { return contrastRender(record.achieved_graduation_course_count, record.course_target_count) } }, { title: '毕业要求指标点(达成情况)', key: 'graduation', render: (_, record) => { return contrastRender(record.achieved_graduation_objective_count, record.graduation_subitem_count) } }, { title: '评价结果', dataIndex: 'status', render: statusRender }, @@ -161,35 +161,46 @@ class EcYear extends React.Component {
-
-
-
{ major.name }
-
- 请选择添加参与认证的学生界别,多个界别分次添加 - 查看详情 -
-
- +
+ + + { major && major.school_name } + + { major && major.name } +
- - - -
-
- this.setState({keyword: e.target.value})} - onSearch={this.onSearch} - value={keyword} - style={{ width: 200 }}/> + +
+
+
+
{ major.name }
+
+ 请选择添加参与认证的学生界别,多个界别分次添加 + 查看详情 +
+
+
- -
- + + + +
+
+ this.setState({keyword: e.target.value})} + onSearch={this.onSearch} + value={keyword} + style={{ width: 200 }}/> +
+ +
+
+ diff --git a/public/react/src/modules/ecs/EcYear/index.scss b/public/react/src/modules/ecs/EcYear/index.scss index a0b96541d..66f49e304 100644 --- a/public/react/src/modules/ecs/EcYear/index.scss +++ b/public/react/src/modules/ecs/EcYear/index.scss @@ -1,9 +1,15 @@ .ec-year-list-page { - background: #fff; + .ec-breadcrumb { + margin-top: 10px; + margin-bottom: 10px; + } + + .ec-year-list-container { + background: #fff; + } .year-list { &-head { - margin-top: 30px; margin-bottom: -24px; padding: 20px 30px; display: flex; diff --git a/public/react/src/modules/ecs/Ecs.js b/public/react/src/modules/ecs/Ecs.js index 307754e61..dab84e8d5 100644 --- a/public/react/src/modules/ecs/Ecs.js +++ b/public/react/src/modules/ecs/Ecs.js @@ -7,6 +7,7 @@ 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 { @@ -15,6 +16,7 @@ class Ecs extends React.Component {
+