Merge branch 'dev_aliyun' into develop

dev_forum
daiao 5 years ago
commit 0af2270f20

@ -125,8 +125,8 @@ class AccountsController < ApplicationController
set_autologin_cookie(user) set_autologin_cookie(user)
UserAction.create(:action_id => user.try(:id), :action_type => "Login", :user_id => user.try(:id), :ip => request.remote_ip) UserAction.create(:action_id => user.try(:id), :action_type => "Login", :user_id => user.try(:id), :ip => request.remote_ip)
# 注册完成后有一天的试用申请 # 注册完成后有一天的试用申请(先去掉)
UserDayCertification.create(user_id: user.id, status: 1) # UserDayCertification.create(user_id: user.id, status: 1)
end end
def set_autologin_cookie(user) def set_autologin_cookie(user)

@ -185,21 +185,29 @@ class ApplicationController < ActionController::Base
render :json => { status: status, message: message } render :json => { status: status, message: message }
end end
# 系统全局认证 # 资料是否完善
def check_auth def check_account
day_cer = UserDayCertification.find_by(user_id: current_user.id) if !current_user.profile_completed?
# 如果注册超过24小时则需要完善资料及授权 info_url = '/account/profile'
if (Time.now.to_i - day_cer.try(:created_at).to_i) > 86400 tip_exception(402, info_url)
if !current_user.profile_completed?
info_url = '/account/profile'
tip_exception(402, info_url)
elsif current_user.certification != 1
if current_user.apply_actions.exists?(container_type: 'TrialAuthorization', status: 0)
tip_exception(408, "您的试用申请正在审核中,请耐心等待")
end
tip_exception(407, "系统未授权")
end
end end
end
# 系统全局认证(暂时隐藏试用申请的判断)
def check_auth
# day_cer = UserDayCertification.find_by(user_id: current_user.id)
# # 如果注册超过24小时则需要完善资料及授权
# if (Time.now.to_i - day_cer.try(:created_at).to_i) > 86400
# if !current_user.profile_completed?
# info_url = '/account/profile'
# tip_exception(402, info_url)
# elsif current_user.certification != 1
# if current_user.apply_actions.exists?(container_type: 'TrialAuthorization', status: 0)
# tip_exception(408, "您的试用申请正在审核中,请耐心等待")
# end
# tip_exception(407, "系统未授权")
# end
# end
# if current_user.certification != 1 && current_user.apply_actions.exists?(container_type: 'TrialAuthorization', status: 0) # if current_user.certification != 1 && current_user.apply_actions.exists?(container_type: 'TrialAuthorization', status: 0)

@ -13,6 +13,7 @@ class CoursesController < ApplicationController
before_action :require_login, except: [:index, :show, :students, :teachers, :board_list, :mine, :all_course_groups, before_action :require_login, except: [:index, :show, :students, :teachers, :board_list, :mine, :all_course_groups,
:left_banner, :top_banner] :left_banner, :top_banner]
before_action :check_account, only: [:new, :create, :apply_to_join_course]
before_action :check_auth, except: [:index, :show, :students, :teachers, :board_list, :mine, :all_course_groups, before_action :check_auth, except: [:index, :show, :students, :teachers, :board_list, :mine, :all_course_groups,
:left_banner, :top_banner, :apply_to_join_course, :exit_course] :left_banner, :top_banner, :apply_to_join_course, :exit_course]
before_action :set_course, :user_course_identity, only: [:show, :update, :destroy, :settings, :set_invite_code_halt, before_action :set_course, :user_course_identity, only: [:show, :update, :destroy, :settings, :set_invite_code_halt,
@ -116,6 +117,7 @@ class CoursesController < ApplicationController
# GET /courses/new # GET /courses/new
def new def new
@course = Course.new @course = Course.new
normal_status("成功")
end end
# Get /courses/:id/settings # Get /courses/:id/settings
@ -926,12 +928,12 @@ class CoursesController < ApplicationController
role = course_message.content == 2 ? '7' : '9' # 7:助教 9:教师 role = course_message.content == 2 ? '7' : '9' # 7:助教 9:教师
ApplyTeacherRoleJoinCourseNotifyJob.perform_later(current_user.id, course.id, role) ApplyTeacherRoleJoinCourseNotifyJob.perform_later(current_user.id, course.id, role)
teacher_role = 1
message = "#{course_message.content == 2 ? '助教' : '教师'}申请已提交,请等待审核" message = "#{course_message.content == 2 ? '助教' : '教师'}申请已提交,请等待审核"
else else
message = "#{existing_course_message.content == 2 ? '助教' : '教师'}申请已提交,请等待审核" message = "#{existing_course_message.content == 2 ? '助教' : '教师'}申请已提交,请等待审核"
end end
end end
teacher_role = 1
end end
if teacher_role && current_user.student_of_course?(course) if teacher_role && current_user.student_of_course?(course)

@ -37,7 +37,8 @@ class GamesController < ApplicationController
# 上一关、下一关 # 上一关、下一关
prev_game = @game.prev_of_current_game(@shixun.id, @game.myshixun_id, game_challenge.position) prev_game = @game.prev_of_current_game(@shixun.id, @game.myshixun_id, game_challenge.position)
next_game = @game.next_of_current_game(@shixun.id, @game.myshixun_id, game_challenge.position) #next_game = @game.next_of_current_game(@shixun.id, @game.myshixun_id, game_challenge.position)
next_game = user_next_game(@shixun, game_challenge, @game, @identity)
# 关卡点赞数, praise_or_tread = 1则表示赞过 # 关卡点赞数, praise_or_tread = 1则表示赞过
praise_count = game_challenge.praises_count praise_count = game_challenge.praises_count
@ -962,4 +963,14 @@ class GamesController < ApplicationController
@identity = current_user.game_identity(@game) @identity = current_user.game_identity(@game)
raise Educoder::TipException.new(403, "..") if @identity > User::EDU_GAME_MANAGER raise Educoder::TipException.new(403, "..") if @identity > User::EDU_GAME_MANAGER
end end
# identity用户身份
def user_next_game(shixun, challenge, game, identity)
next_game = game.next_of_current_game(shixun.id, game.myshixun_id, challenge.position)
# 实训允许跳关 、 当前关卡已经通关、 用户是已认证的老师以上权限的人,允许跳关
if shixun.task_pass || game.status == 2 || identity <= User::EDU_CERTIFICATION_TEACHER
next_game
else
nil
end
end
end end

@ -113,6 +113,15 @@ class HomeworkCommonsController < ApplicationController
else else
if @user_course_identity == Course::STUDENT if @user_course_identity == Course::STUDENT
@work = @homework.user_work(current_user.id) @work = @homework.user_work(current_user.id)
# 学生访问列表时计算个人成绩
if @homework.homework_type == "practice"
myshixun = Myshixun.find_by(shixun_id: @shixun.id, user_id: current_user.id)
if @work && myshixun
challenge_settings = @homework.homework_challenge_settings
games = myshixun.games.where(challenge_id: challenge_settings.pluck(:challenge_id))
HomeworksService.new.update_myshixun_work_score @work, myshixun, games, @homework, challenge_settings
end
end
# 学生已提交作品且补交(提交)已截止、作品公开、非匿评阶段 # 学生已提交作品且补交(提交)已截止、作品公开、非匿评阶段
if @work&.work_status.to_i > 0 && (@homework.work_public || @homework.score_open) && if @work&.work_status.to_i > 0 && (@homework.work_public || @homework.score_open) &&

@ -7,9 +7,9 @@ class MyshixunsController < ApplicationController
## TPI关卡列表 ## TPI关卡列表
def challenges def challenges
# @challenges = Challenge.where(shixun_id: params[:shixun_id]) # @challenges = Challenge.where(shixun_id: params[:shixun_id])
@shixun = @myshixun.shixun
@shixun_status = @myshixun.shixun.status
@games = @myshixun.games.includes(:challenge).reorder("challenges.position") @games = @myshixun.games.includes(:challenge).reorder("challenges.position")
@identity = current_user.game_identity(@games.first)
end end
@ -42,7 +42,7 @@ class MyshixunsController < ApplicationController
if e.message != "ActiveRecord::RecordInvalid" if e.message != "ActiveRecord::RecordInvalid"
logger.error("######delete_repository_error:#{e.message}") logger.error("######delete_repository_error:#{e.message}")
end end
raise ActiveRecord::Rollback raise "delete_repository_error:#{e.message}"
end end
end end

@ -3,6 +3,8 @@ class ShixunsController < ApplicationController
include ApplicationHelper include ApplicationHelper
before_action :require_login, :check_auth, except: [:download_file, :index, :menus] before_action :require_login, :check_auth, except: [:download_file, :index, :menus]
before_action :check_account, only: [:new, :create, :shixun_exec]
before_action :check_auth, except: [:download_file, :index, :menus] before_action :check_auth, except: [:download_file, :index, :menus]
before_action :find_shixun, :shixun_access_allowed, except: [:index, :new, :create, :menus, :get_recommend_shixuns, before_action :find_shixun, :shixun_access_allowed, except: [:index, :new, :create, :menus, :get_recommend_shixuns,
@ -716,7 +718,7 @@ class ShixunsController < ApplicationController
logger.error("##########project_fork error #{e.message}") logger.error("##########project_fork error #{e.message}")
@current_task.destroy! @current_task.destroy!
end end
raise ActiveRecord::Rollback raise "实训云平台繁忙繁忙等级81"
end end
end end
end end

@ -1,6 +1,7 @@
class SubjectsController < ApplicationController class SubjectsController < ApplicationController
before_action :require_login, :check_auth, except: [:index] before_action :require_login, :check_auth, except: [:index]
# before_action :check_auth, except: [:index] # before_action :check_auth, except: [:index]
before_action :check_account, only: [:new, :create]
before_action :find_subject, except: [:index, :create, :new, :append_to_stage] before_action :find_subject, except: [:index, :create, :new, :append_to_stage]
before_action :allowed, only: [:update, :edit, :destroy, :publish, :cancel_publish, :cancel_has_publish, before_action :allowed, only: [:update, :edit, :destroy, :publish, :cancel_publish, :cancel_has_publish,
:search_members, :add_subject_members, :statistics, :shixun_report, :school_report, :search_members, :add_subject_members, :statistics, :shixun_report, :school_report,

@ -1,2 +1,14 @@
module MyshixunsHelper module MyshixunsHelper
# 获取tpi的identifier,
# identity表示用户关卡的身份
# task_pass: 实训是否允许跳关
def get_game_identifier task_pass, game, game_identity
# 允许跳关、 关卡已经开启、 用户是已认证老师以上的身份
if task_pass || game.status != 3 || game_identity <= User::EDU_CERTIFICATION_TEACHER
game.identifier
else
nil
end
end
end end

@ -35,7 +35,7 @@ class HomeworkCommon < ApplicationRecord
has_many :homework_review_results, :dependent => :destroy has_many :homework_review_results, :dependent => :destroy
validates :name, length: { maximum: 60 } validates :name, length: { maximum: 60 }
validates :description, length: { maximum: 5000 } validates :description, length: { maximum: 15000 }
validates :reference_answer, length: { maximum: 5000 } validates :reference_answer, length: { maximum: 5000 }
# after_update :update_activity # after_update :update_activity

@ -4,6 +4,7 @@ class Shixun < ApplicationRecord
# status: 0编辑 1申请发布 2正式发布 3关闭 -1软删除 # status: 0编辑 1申请发布 2正式发布 3关闭 -1软删除
# hide_code 隐藏代码窗口 # hide_code 隐藏代码窗口
# code_hidden: 隐藏代码目录 # code_hidden: 隐藏代码目录
# task_pass: 跳关
has_many :challenges, dependent: :destroy has_many :challenges, dependent: :destroy
has_many :challenge_tags, through: :challenges has_many :challenge_tags, through: :challenges
has_many :myshixuns, :dependent => :destroy has_many :myshixuns, :dependent => :destroy

@ -2,8 +2,8 @@ json.users do
json.array! @users do |user| json.array! @users do |user|
json.id user.id json.id user.id
json.name user.real_name json.name user.real_name
json.student_id user.user_extension.try(:student_id) json.student_id user&.student_id
json.school_name user.user_extension.school.name json.school_name user&.school_name
json.added @course.course_member?(user.id, 4) json.added @course.course_member?(user.id, 4)
end end
end end

@ -3,7 +3,7 @@ json.array! @games do |game|
json.partial! 'challenges/challenge', locals: { challenge: challenge } json.partial! 'challenges/challenge', locals: { challenge: challenge }
json.status game.status json.status game.status
json.star game.star json.star game.star
json.identifier game.identifier json.identifier get_game_identifier(@shixun.task_pass, game, @identity)
json.get_gold game.user_get_gold_and_experience(@shixun_status, challenge)[0] json.get_gold game.user_get_gold_and_experience(@shixun.status, challenge)[0]
json.get_experience game.user_get_gold_and_experience(@shixun_status, challenge)[1] json.get_experience game.user_get_gold_and_experience(@shixun.status, challenge)[1]
end end

@ -7,6 +7,7 @@ json.is_teacher @user.user_extension&.teacher?
json.user_identity @user.identity json.user_identity @user.identity
json.tidding_count 0 json.tidding_count 0
json.user_phone_binded @user.phone.present? json.user_phone_binded @user.phone.present?
json.profile_completed @user.profile_completed?
if @course if @course
json.course_identity @course_identity json.course_identity @course_identity
json.course_name @course.name json.course_name @course.name

@ -0,0 +1,12 @@
class AddIsMdForHomeworks < ActiveRecord::Migration[5.2]
def change
# add_column :homework_commons, :is_md, :boolean, :default => true
# add_column :homework_banks, :is_md, :boolean, :default => true
#
#
# add_column :exercise_questions,:is_md, :boolean, :default => true
# add_column :poll_questions,:is_md, :boolean, :default => true
#
# add_column :exercise_bank_questions, :is_md, :boolean, :default => true
end
end

@ -0,0 +1,14 @@
class MigrateCourseIsMd < ActiveRecord::Migration[5.2]
def change
# HomeworkCommon.where(homework_type: [1, 3]).where("created_at < '2019-07-21 00:00:00'").update_all(is_md: false)
# HomeworkBank.where(homework_type: [1, 3]).where("created_at < '2019-07-21 00:00:00'").update_all(is_md: false)
#
# HomeworkCommon.where(homework_type: [1, 3]).where("created_at >= '2019-07-21 00:00:00' and homework_bank_id is not null").each do |homework|
#
# end
#
# ExerciseQuestion.where("created_at < '2019-07-21 00:00:00'").update_all(is_md: false)
# PollQuestion.where("created_at < '2019-07-21 00:00:00'").update_all(is_md: false)
# ExerciseBankQuestion.where("created_at < '2019-07-21 00:00:00'").update_all(is_md: false)
end
end

@ -18,6 +18,9 @@ import Notcompletedysl from './modules/user/Notcompletedysl';
import Trialapplicationysl from './modules/login/Trialapplicationysl'; import Trialapplicationysl from './modules/login/Trialapplicationysl';
import Trialapplicationreview from './modules/user/Trialapplicationreview'; import Trialapplicationreview from './modules/user/Trialapplicationreview';
import Addcourses from "./modules/courses/coursesPublic/Addcourses"; import Addcourses from "./modules/courses/coursesPublic/Addcourses";
import AccountProfile from"./modules/user/AccountProfile";
import Trialapplication from './modules/login/Trialapplication' import Trialapplication from './modules/login/Trialapplication'
import NotFoundPage from './NotFoundPage' import NotFoundPage from './NotFoundPage'
@ -278,6 +281,7 @@ class App extends Component {
<Trialapplicationysl {...this.props} {...this.state}></Trialapplicationysl> <Trialapplicationysl {...this.props} {...this.state}></Trialapplicationysl>
<Trialapplicationreview {...this.props} {...this.state}></Trialapplicationreview> <Trialapplicationreview {...this.props} {...this.state}></Trialapplicationreview>
<Addcourses {...this.props} {...this.state}/> <Addcourses {...this.props} {...this.state}/>
<AccountProfile {...this.props} {...this.state}/>
{/*{*/} {/*{*/}
{/* isRender === true?*/} {/* isRender === true?*/}
{/* <LoginDialog></LoginDialog> : ""*/} {/* <LoginDialog></LoginDialog> : ""*/}

@ -6,28 +6,30 @@ export function isImageExtension(fileName) {
export function markdownToHTML(oldContent, selector) { export function markdownToHTML(oldContent, selector) {
window.$('#md_div').html('') window.$('#md_div').html('')
// markdown to html // markdown to html
try { if (selector && oldContent && oldContent.startsWith('<p')) { // 普通html处理
window.$(selector).html(oldContent)
} else {
try {
var markdwonParser = window.editormd.markdownToHTML("md_div", {
markdown: oldContent, // .replace(/▁/g,"▁▁▁"),
emoji: true,
htmlDecode: "style,script,iframe", // you can filter tags decode
taskList: true,
tex: true, // 默认不解析
flowChart: true, // 默认不解析
sequenceDiagram: true // 默认不解析
});
} catch(e) {
var markdwonParser = window.editormd.markdownToHTML("md_div", { console.error(e)
markdown: oldContent, }
emoji: true,
htmlDecode: "style,script,iframe", // you can filter tags decode const content = window.$('#md_div').html()
taskList: true, if (selector) {
tex: true, // 默认不解析 window.$(selector).html(content)
flowChart: true, // 默认不解析 }
sequenceDiagram: true // 默认不解析 return content
});
} catch(e) {
console.error(e)
}
const content = window.$('#md_div').html()
if (selector) {
window.$(selector).html(content)
} }
return content
} }
export function appendFileSizeToUploadFile(item) { export function appendFileSizeToUploadFile(item) {

@ -1,27 +1,44 @@
import React,{ Component } from "react"; import React,{ Component } from "react";
import { markdownToHTML } from 'educoder' import { markdownToHTML } from 'educoder'
/**
selector 需要传入唯一的selector作为id不然会引起冲突
delay 如果有公式需要传入delay={true}
*/
class MarkdownToHtml extends Component{ class MarkdownToHtml extends Component{
constructor(props){ constructor(props){
super(props); super(props);
this.state={ this.state={
} }
} }
_markdownToHTML = (content, selector) => {
if (this.props.delay == true) {
(function(content, selector) {
// console.log('selector: ', selector)
setTimeout(() => {
markdownToHTML(content, selector)
}, 600)
})(content, selector)
} else {
markdownToHTML(content, selector)
}
}
componentDidUpdate = (prevProps) => { componentDidUpdate = (prevProps) => {
if (this.props.content) { if (this.props.content) {
if ( prevProps.content != this.props.content ) { if ( prevProps.content != this.props.content ) {
markdownToHTML(this.props.content, `.markdown_to_html_${this.props.selector || ''}`) this._markdownToHTML(this.props.content, `.markdown_to_html_${this.props.selector || ''}`)
} }
} }
} }
componentDidMount () { componentDidMount () {
this.props.content && markdownToHTML(this.props.content, `.markdown_to_html_${this.props.selector || ''}`) this.props.content && this._markdownToHTML(this.props.content, `.markdown_to_html_${this.props.selector || ''}`)
} }
render(){ render(){
const { style, className } = this.props
return( return(
<div id="memo_content_editorMd" className={`new_li markdown-body ${this.props.className} markdown_to_html_${this.props.selector || ''}`} <div id="memo_content_editorMd" className={`new_li markdown-body ${className} markdown_to_html_${this.props.selector || ''}`}
// dangerouslySetInnerHTML={{__html: markdownToHTML(this.props.content)}} // dangerouslySetInnerHTML={{__html: markdownToHTML(this.props.content)}}
style={style}
> >
</div> </div>
) )

@ -87,7 +87,7 @@ class CommonWorkQuestion extends Component{
{/* 内容区 */} {/* 内容区 */}
<div className="padding40 memoContent new_li"> <div className="padding40 memoContent new_li">
<MarkdownToHtml content={description}></MarkdownToHtml> <MarkdownToHtml content={description} selector="work_content"></MarkdownToHtml>
{ attachments && attachments.map((item) => { { attachments && attachments.map((item) => {
return ( <div className="color-grey"> return ( <div className="color-grey">

@ -18,14 +18,22 @@ export function CNotificationHOC(options = {}) {
} }
showNotification = (description, message = "提示", icon) => { showNotification = (description, message = "提示", icon) => {
const data = { // const data = {
message, // message,
description // description
} // }
if (icon) { // if (icon) {
data.icon = icon; // data.icon = icon;
} // }
notification.open(data); // notification.open(data);
notification.open({
message:message,
description: description,
style: {
zIndex: 99999999
},
});
} }
bytesToSize = (bytes) => { bytesToSize = (bytes) => {

@ -4,6 +4,7 @@ import axios from 'axios';
import {getImageUrl, trigger, on, off} from 'educoder'; import {getImageUrl, trigger, on, off} from 'educoder';
import { Tooltip, message,Popover} from 'antd'; import { Tooltip, message,Popover} from 'antd';
import CoursesListType from '../coursesPublic/CoursesListType'; import CoursesListType from '../coursesPublic/CoursesListType';
import AccountProfile from"../../user/AccountProfile";
import Addcourses from '../coursesPublic/Addcourses'; import Addcourses from '../coursesPublic/Addcourses';
import '../css/Courses.css'; import '../css/Courses.css';
import Modals from "../../modals/Modals"; import Modals from "../../modals/Modals";
@ -88,6 +89,13 @@ class CoursesBanner extends Component {
} }
tojoinclass = (val) => { tojoinclass = (val) => {
if(this.props.current_user&&this.props.current_user.profile_completed===false){
this.setState({
AccountProfiletype:true
})
return
}
if (val === 1) { if (val === 1) {
this.setState({ this.setState({
Addcoursestypes: true, Addcoursestypes: true,
@ -326,15 +334,30 @@ class CoursesBanner extends Component {
postsettings=()=>{ postsettings=()=>{
window.location.href = "/courses/" + this.props.match.params.coursesId + "/settings"; window.location.href = "/courses/" + this.props.match.params.coursesId + "/settings";
} }
hideAccountProfile=()=>{
this.setState({
AccountProfiletype:false
})
}
render() { render() {
let { Addcoursestypes, coursedata, modalsType, modalsTopval, loadtype,modalsBottomval,antIcon,is_guide} = this.state; let { Addcoursestypes, coursedata, modalsType, modalsTopval, loadtype,modalsBottomval,antIcon,is_guide,AccountProfiletype} = this.state;
return ( return (
<div> <div>
{ {
is_guide && <Guide></Guide> is_guide && <Guide></Guide>
} }
{AccountProfiletype===true?<AccountProfile
hideAccountProfile={()=>this.hideAccountProfile()}
{...this.state}
{...this.props}
/>:""}
{ {
coursedata === undefined || coursedata.status===401? <div id="course_info_1309" className="courseHead" style={{height: '206px'}}></div>:<div id="course_info_1309" className="courseHead" style={{height: '206px'}}> coursedata === undefined || coursedata.status===401? <div id="course_info_1309" className="courseHead" style={{height: '206px'}}></div>:<div id="course_info_1309" className="courseHead" style={{height: '206px'}}>

@ -38,7 +38,6 @@ class Addcourses extends Component{
} }
return response; return response;
}, (error) => { }, (error) => {
//TODO 这里如果样式变了会出现css不加载的情况
}); });

@ -1560,9 +1560,28 @@ input.ant-input-number-input:focus {
border-radius: 5px; border-radius: 5px;
} }
.ant-modal-wrap{ @media screen and (min-width: 1400px) {
overflow: hidden; .ant-modal-wrap{
overflow: hidden;
}
}
/* 设置了浏览器宽度不小于1201px时 abc 显示1200px宽度 */
@media screen and (max-width: 1400px) {
}
/* 设置了浏览器宽度不大于1200px时 abc 显示900px宽度 */
@media screen and (max-width: 900px) {
}
/* 设置了浏览器宽度不大于900px时 abc 显示200px宽度 */
@media screen and (max-width: 500px) {
} }
/* 设置了浏览器宽度不大于500px时 abc 显示100px宽度 */
/* 试卷答题 */ /* 试卷答题 */
.stageTable .ant-table-tbody tr:last-child td,.stageTable .ant-table-thead > tr > th{ .stageTable .ant-table-tbody tr:last-child td,.stageTable .ant-table-thead > tr > th{

@ -7,7 +7,7 @@ import {
} from 'antd'; } from 'antd';
import axios from 'axios' import axios from 'axios'
import { qNameArray } from './common' import { qNameArray } from './common'
import {getUrl, ActionBtn, markdownToHTML} from 'educoder'; import {getUrl, ActionBtn, markdownToHTML, MarkdownToHtml} from 'educoder';
import QestionDisplayHeader from './QestionDisplayHeader' import QestionDisplayHeader from './QestionDisplayHeader'
const { TextArea } = Input; const { TextArea } = Input;
const confirm = Modal.confirm; const confirm = Modal.confirm;
@ -68,10 +68,14 @@ class MainDisplay extends Component{
{ standard_answer[0] && { standard_answer[0] &&
<React.Fragment> <React.Fragment>
<div style={{color: '#05101A'}} className="font-16 mb5 font-bd">参考答案</div> <div style={{color: '#05101A'}} className="font-16 mb5 font-bd">参考答案</div>
<div className="mainQuestionDisplay markdown-body"
<MarkdownToHtml content={standard_answer[0]} selector={'answer_' + qNumber}
delay={true} className=""
></MarkdownToHtml>
{/* <div className="mainQuestionDisplay markdown-body"
dangerouslySetInnerHTML={{__html: markdownToHTML(standard_answer[0])}} dangerouslySetInnerHTML={{__html: markdownToHTML(standard_answer[0])}}
> >
</div> </div> */}
</React.Fragment> </React.Fragment>
} }

@ -7,7 +7,7 @@ import {
} from 'antd'; } from 'antd';
import axios from 'axios' import axios from 'axios'
import { qNameArray } from './common' import { qNameArray } from './common'
import {getUrl, ActionBtn, markdownToHTML} from 'educoder'; import {getUrl, ActionBtn, markdownToHTML, MarkdownToHtml} from 'educoder';
import QestionDisplayHeader from './QestionDisplayHeader' import QestionDisplayHeader from './QestionDisplayHeader'
const { TextArea } = Input; const { TextArea } = Input;
const confirm = Modal.confirm; const confirm = Modal.confirm;
@ -108,8 +108,12 @@ class NullDisplay extends Component{
<span className="lineh-40">答案填空{index+1}</span> <span className="lineh-40">答案填空{index+1}</span>
<div className="answers"> <div className="answers">
{ answers.answer_text.map((item, itemIndex) => { { answers.answer_text.map((item, itemIndex) => {
return <span className="answer" key={itemIndex}>{item}</span> return <MarkdownToHtml
className="answer" key={itemIndex} delay={true}
content={item} selector={'null_' + (index + 1) + '' + (itemIndex + 1)}
></MarkdownToHtml>
})} })}
{/* <span className="answer" key={itemIndex}>{item}</span> */}
</div> </div>
</div> </div>
}) })

@ -7,7 +7,7 @@ import {
} from 'antd'; } from 'antd';
import axios from 'axios' import axios from 'axios'
import { qNameArray } from './common' import { qNameArray } from './common'
import {getUrl, ActionBtn, markdownToHTML} from 'educoder'; import {getUrl, ActionBtn, markdownToHTML, MarkdownToHtml} from 'educoder';
const { TextArea } = Input; const { TextArea } = Input;
const confirm = Modal.confirm; const confirm = Modal.confirm;
const $ = window.$ const $ = window.$
@ -80,8 +80,13 @@ class QestionDisplayHeader extends Component{
</React.Fragment>} </React.Fragment>}
</div> </div>
</div> </div>
<span className="markdown-body" dangerouslySetInnerHTML={{__html: markdownToHTML(question_title)}} { question_title &&
style={{ display: 'inline-block', width:'100%' , margin: '10px 0px 15px' }}></span> <MarkdownToHtml content={question_title} selector={'qtitle_' + (index + 1)} style={{ display: 'inline-block', width:'100%' , margin: '10px 0px 15px' }}
delay={true}
></MarkdownToHtml>
// <div className="markdown-body" dangerouslySetInnerHTML={{__html: markdownToHTML(question_title)}}
// style={{ display: 'inline-block', width:'100%' , margin: '10px 0px 15px' }}></div>
}
</React.Fragment> </React.Fragment>
) )
} }

@ -7,7 +7,7 @@ import {
} from 'antd'; } from 'antd';
import axios from 'axios' import axios from 'axios'
import QestionDisplayHeader from './QestionDisplayHeader' import QestionDisplayHeader from './QestionDisplayHeader'
import {getUrl, ActionBtn, markdownToHTML} from 'educoder'; import {getUrl, ActionBtn, markdownToHTML, MarkdownToHtml} from 'educoder';
const { TextArea } = Input; const { TextArea } = Input;
const confirm = Modal.confirm; const confirm = Modal.confirm;
const $ = window.$ const $ = window.$
@ -100,16 +100,22 @@ class SingleDisplay extends Component{
return ( return (
<div className="mb10 clearfix" key={optionIndex}> <div className="mb10 clearfix" key={optionIndex}>
<Radio disabled className="fl lineh-20" checked={item.standard_boolean}>{prefix}</Radio> <Radio disabled className="fl lineh-20" checked={item.standard_boolean}>{prefix}</Radio>
<span style={{ display: 'inline-block'}} className="markdown-body fl" <MarkdownToHtml content={item.choice_text} selector={'single_' + (index + 1) + '' + (optionIndex + 1)} style={{ float: 'left', display: 'inline-block' }}
dangerouslySetInnerHTML={{__html: markdownToHTML(item.choice_text)}}></span> delay={true}
></MarkdownToHtml>
{/* <span style={{ display: 'inline-block'}} className="markdown-body fl"
dangerouslySetInnerHTML={{__html: markdownToHTML(item.choice_text)}}></span> */}
</div>) </div>)
} else { } else {
return ( return (
<div className="mb10 clearfix" key={optionIndex}> <div className="mb10 clearfix" key={optionIndex}>
<Checkbox disabled className="fl lineh-20" checked={item.standard_boolean}>{prefix}</Checkbox> <Checkbox disabled className="fl lineh-20" checked={item.standard_boolean}>{prefix}</Checkbox>
<span style={{ display: 'inline-block'}} className="markdown-body fl" <MarkdownToHtml content={item.choice_text} selector={'single_' + (index + 1)+ '' + (optionIndex + 1)} style={{ float: 'left', display: 'inline-block' }}
dangerouslySetInnerHTML={{__html: markdownToHTML(item.choice_text)}}></span> delay={true}
></MarkdownToHtml>
{/* <span style={{ display: 'inline-block'}} className="markdown-body fl"
dangerouslySetInnerHTML={{__html: markdownToHTML(item.choice_text)}}></span> */}
</div>) </div>)
} }
})} })}

@ -78,6 +78,12 @@ class CoursesNew extends Component {
console.log(error); console.log(error);
}) })
}else{ }else{
let url = "/courses/new.json"
axios.get(url).then((result) => {
console.log(result)
}).catch((error) => {
console.log(error);
})
// console.log(user_school); // console.log(user_school);
this.props.form.setFieldsValue({ this.props.form.setFieldsValue({
school:user_school, school:user_school,
@ -302,7 +308,7 @@ class CoursesNew extends Component {
if(value!=""){ if(value!=""){
this.props.form.setFieldsValue({ this.props.form.setFieldsValue({
classroom:value, classroom:value,
course:value // course:value
}); });
this.Searchvalue(value) this.Searchvalue(value)
} }
@ -312,7 +318,7 @@ class CoursesNew extends Component {
handleChange=(value)=>{ handleChange=(value)=>{
this.props.form.setFieldsValue({ this.props.form.setFieldsValue({
course:value, // course:value,
classroom:value classroom:value
}) })
}; };
@ -325,7 +331,8 @@ class CoursesNew extends Component {
// fetching: true, // fetching: true,
// }); // });
this.setState({ this.setState({
fetching: true fetching: true,
school: value
}) })
this.getschool(value) this.getschool(value)
} }
@ -365,9 +372,13 @@ class CoursesNew extends Component {
if (result.data.status===0) { if (result.data.status===0) {
this.setState({ this.setState({
searchlistscholl: result.data.school_names, searchlistscholl: result.data.school_names,
fetching: false
})
})
if(result.data.school_names.length!=0){
this.setState({
fetching: false
})
}
} }
}).catch((error)=>{ }).catch((error)=>{
console.log(error) console.log(error)
@ -460,7 +471,7 @@ class CoursesNew extends Component {
<AutoComplete style={{ width: 280 }} <AutoComplete style={{ width: 280 }}
onSearch={this.handleSearch} onSearch={this.handleSearch}
// onChange={this.handleChange} onChange={this.handleChange}
className={"fl construction "} className={"fl construction "}
placeholder="例如:数据结构" placeholder="例如:数据结构"
> >

@ -15,7 +15,8 @@ import {
Pagination, Pagination,
Radio, Radio,
Tooltip, Tooltip,
notification notification,
Spin,
} from "antd"; } from "antd";
import './style.css'; import './style.css';
import 'moment/locale/zh-cn'; import 'moment/locale/zh-cn';
@ -2253,7 +2254,7 @@ class Listofworksstudentone extends Component {
render() { render() {
let {columns,course_groupysls,datajs,isAdmin, course_groupyslstwo, unlimited, unlimitedtwo, course_group_info, orders, task_status, checkedValuesine, searchtext, teacherlist, visible,visibles, game_list,columnsstu, limit,experience, boolgalist,viewtrainingdata, teacherdata, page, data, jobsettingsdata, styletable, datas, order, loadingstate,computeTimetype} = this.state; let {columns,course_groupysls,datajs,isAdmin, course_groupyslstwo, unlimited, unlimitedtwo, course_group_info, orders, task_status, checkedValuesine, searchtext, teacherlist, visible,visibles, game_list,columnsstu, limit,experience, boolgalist,viewtrainingdata, teacherdata, page, data, jobsettingsdata, styletable, datas, order, loadingstate,computeTimetype} = this.state;
const antIcon = <Icon type="loading" style={{ fontSize: 24 }} spin />;
// console.log(this.state.student_works); // console.log(this.state.student_works);
// console.log("841"); // console.log("841");
// console.log(this.state.columns); // console.log(this.state.columns);
@ -2384,13 +2385,16 @@ class Listofworksstudentone extends Component {
background:#EDEDED; background:#EDEDED;
cursor: pointer; cursor: pointer;
} }
.shixunSpin{
color:#FF6801;
margin-right: 10px;
}
`} `}
</style> </style>
{computeTimetype===false?<li className="clearfix startbox"> {computeTimetype===false?<li className="clearfix startbox">
<Spin indicator={antIcon} spinning={!computeTimetype} className={"shixunSpin"}/>
<span className={"startfont"}> <span className={"startfont"}>
正在执行成绩计算请稍后刷新页面查看结果 正在执行成绩计算完成后将为您自动刷新结果温馨提示执行时间因作品数量而异
温馨提示执行时间因作品数量而异
</span> </span>
</li>:""} </li>:""}
@ -2630,10 +2634,10 @@ class Listofworksstudentone extends Component {
<style> <style>
{ {
` `
body { body {
overflow: hidden !important; overflow: hidden !important;
} }
` `
} }
</style> </style>
<TraineetraininginformationModal <TraineetraininginformationModal
@ -2654,12 +2658,19 @@ class Listofworksstudentone extends Component {
<div className={"educontent "}> <div className={"educontent "}>
<div className="edu-back-white" style={{width: "1200"}}> <div className="edu-back-white" style={{width: "1200"}}>
<style>
{
`
.shixunSpin{
color:#FF6801;
margin-right: 10px;
}
`}
</style>
{computeTimetype===false?<li className="clearfix startbox mb20"> {computeTimetype===false?<li className="clearfix startbox mb20">
<Spin indicator={antIcon} spinning={!computeTimetype} className={"shixunSpin"}/>
<span className={"startfont"}> <span className={"startfont"}>
正在执行成绩计算请稍后刷新页面查看结果 正在执行成绩计算完成后将为您自动刷新结果温馨提示执行时间因作品数量而异
温馨提示执行时间因作品数量而异
</span> </span>
</li>:""} </li>:""}
@ -2774,12 +2785,20 @@ class Listofworksstudentone extends Component {
<div className={"educontent mb20"}> <div className={"educontent mb20"}>
<div className="edu-back-white"> <div className="edu-back-white">
<style>
{
`
.shixunSpin{
color:#FF6801;
margin-right: 10px;
}
`}
</style>
{computeTimetype===false?<li className="clearfix startbox mb20"> {computeTimetype===false?<li className="clearfix startbox mb20">
<Spin indicator={antIcon} spinning={!computeTimetype} className={"shixunSpin"}/>
<span className={"startfont"}> <span className={"startfont"}>
正在执行成绩计算请稍后刷新页面查看结果 正在执行成绩计算完成后将为您自动刷新结果温馨提示执行时间因作品数量而异
温馨提示执行时间因作品数量而异
</span> </span>
</li>:""} </li>:""}

@ -23,7 +23,8 @@ import {
Radio, Radio,
Tooltip, Tooltip,
notification, notification,
Pagination Pagination,
Spin,
} from "antd"; } from "antd";
import {Link, Switch, Route, Redirect} from 'react-router-dom'; import {Link, Switch, Route, Redirect} from 'react-router-dom';
import axios from 'axios'; import axios from 'axios';
@ -653,7 +654,7 @@ class ShixunStudentWork extends Component {
) )
} }
const antIcon = <Icon type="loading" style={{ fontSize: 24 }} spin />;
return ( return (
<div className=" clearfix " style={{margin: "auto" , minWidth:"1200px"}}> <div className=" clearfix " style={{margin: "auto" , minWidth:"1200px"}}>
{this.state.showmodel===true?<ShixunWorkModal {this.state.showmodel===true?<ShixunWorkModal
@ -716,11 +717,16 @@ class ShixunStudentWork extends Component {
color:rgba(255,104,0,1); color:rgba(255,104,0,1);
} }
.shixunSpin{
color:#FF6801;
margin-right: 10px;
}
`} `}
</style> </style>
<li className="clearfix startbox mb20" style={{display:duplicatechecking===true?"":"none"}}> <li className="clearfix startbox mb20" style={{display:duplicatechecking===true?"":"none"}}>
<Spin indicator={antIcon} spinning={duplicatechecking} className={"shixunSpin"}/>
<span className={"startfont"}> <span className={"startfont"}>
正在执行查重请稍后刷新页面查看结果 温馨提示执行时间因查重作品数以及作品的代码量而异 正在执行查重完成后将为您自动刷新结果 温馨提示执行时间因查重作品数以及作品的代码量而异
</span> </span>
</li> </li>

@ -13,6 +13,7 @@ import axios from 'axios';
import './LoginDialog.css'; import './LoginDialog.css';
import { broadcastChannelPostMessage } from 'educoder' import { broadcastChannelPostMessage } from 'educoder'
import Notcompletedysl from "../user/Notcompletedysl";
const $ = window.$; const $ = window.$;
var wait = 60; var wait = 60;
@ -100,6 +101,7 @@ class LoginDialog extends Component {
authCodeType:true, authCodeType:true,
authCodeclass:'log-botton mt5', authCodeclass:'log-botton mt5',
isRender: false, isRender: false,
MyEduCoderModals:false,
}; };
} }
@ -365,11 +367,9 @@ class LoginDialog extends Component {
description:response.data.message, description:response.data.message,
}); });
}else{ }else{
if(response.data.identity === null || response.data.identity === undefined){
this.props.history.push("/interesse");
return; broadcastChannelPostMessage('refreshPage')
}
broadcastChannelPostMessage('refreshPage')
this.setState({ this.setState({
isRender:false isRender:false
}) })
@ -388,17 +388,28 @@ class LoginDialog extends Component {
console.log(error) console.log(error)
}) })
} };
setNotcompleteds=()=>{
this.setState({
Notcompleteds:true,
MyEduCoderModals:false
})
};
setMyEduCoderModals=()=>{
this.setState({
MyEduCoderModals:true
})
};
onKeydowns=(e)=>{ onKeydowns=(e)=>{
let {disabled}=this.state; let {disabled}=this.state;
if( disabled===false&& e.keyCode === 13){ if( disabled===false&& e.keyCode === 13){
this.loginEDU() this.loginEDU()
console.log(1) console.log(1)
} }
} };
getloginurl=(url)=>{ getloginurl=(url)=>{
window.location.href = url; window.location.href = url;
} };
render() { render() {
let{open,login,speedy,loginValue,regular,isGoing,isGoingValue,disabled,bottonclass, let{open,login,speedy,loginValue,regular,isGoing,isGoingValue,disabled,bottonclass,
dialogBox,shortcutnum,disabledType,gaincode,authCodeType,authCodeclass, isRender}=this.state; dialogBox,shortcutnum,disabledType,gaincode,authCodeType,authCodeclass, isRender}=this.state;
@ -414,6 +425,10 @@ class LoginDialog extends Component {
disableBackdropClick={true} disableBackdropClick={true}
onClose={() => this.handleDialogClose()} onClose={() => this.handleDialogClose()}
> >
<Notcompletedysl
modalsType={this.state.MyEduCoderModals}
setNotcompleteds={()=>{this.setNotcompleteds()}}
/>
{isRender===true? {isRender===true?
<div className={dialogBox}> <div className={dialogBox}>
<div id="closeIcon" onClick={()=>{this.handleDialogClose()}}> <div id="closeIcon" onClick={()=>{this.handleDialogClose()}}>

@ -100,7 +100,8 @@ class Header extends Component {
{/*<img src="/images/task/coin.png" className="fl" width="30" height="30" alt=""/>*/} {/*<img src="/images/task/coin.png" className="fl" width="30" height="30" alt=""/>*/}
<span style={{width:'20px', height:'20px', background:'#FFD633', borderRadius: '10px', marginTop: '3px' }} className="fl"></span> <span style={{width:'20px', height:'20px', background:'#FFD633', borderRadius: '10px', marginTop: '3px' }} className="fl"></span>
<span className="ml5 color-white fl" id="user_grade"> <span className="ml5 color-white fl" id="user_grade">
<a href={`${user.user_url}/user_grade`} target="_blank">{ grade === 0 ? grade : (grade || '')}</a> {/* href={`${user.user_url}/user_grade`} target="_blank" */}
<span>{ grade === 0 ? grade : (grade || '')}</span>
</span> </span>
</div>} </div>}

@ -320,20 +320,23 @@ class TPIMonaco extends Component {
editor.focus(); editor.focus();
}, 600) }, 600)
window.editor_monaco.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_S, () => {
this.props.doFileUpdateRequestOnCodeMirrorBlur();
return false;
});
}) })
window.document.onkeydown = (e) => { // window.document.onkeydown = (e) => {
e = window.event || e; // e = window.event || e;
if(e.keyCode== 83 && e.ctrlKey){ // if(e.keyCode== 83 && e.ctrlKey){
/*延迟兼容FF浏览器 */ // /*延迟兼容FF浏览器 */
// setTimeout(function(){ // // setTimeout(function(){
// alert('ctrl+s'); // // alert('ctrl+s');
// },1); // // },1);
this.props.doFileUpdateRequestOnCodeMirrorBlur(); // this.props.doFileUpdateRequestOnCodeMirrorBlur();
return false; // return false;
} // }
}; // };
} }
onFontSizeChange = (value) => { onFontSizeChange = (value) => {
toStore('cmFontSize', value) toStore('cmFontSize', value)

@ -1,14 +1,14 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import {getImageUrl} from 'educoder'; import {getImageUrl} from 'educoder';
import {Tooltip,Modal,Icon,Spin,message} from 'antd'; import {Tooltip,Modal,Icon,Spin,message} from 'antd';
import '../../paths/ShixunPaths.css';
import DetailCardsEditAndAdd from './DetailCardsEditAndAdd'; import DetailCardsEditAndAdd from './DetailCardsEditAndAdd';
import DetailCardsEditAndEdit from './DetailCardsEditAndEdit'; import DetailCardsEditAndEdit from './DetailCardsEditAndEdit';
import AccountProfile from"../../user/AccountProfile";
import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import axios from 'axios'; import axios from 'axios';
import { DragDropContext , Draggable, Droppable} from 'react-beautiful-dnd'; import { DragDropContext , Draggable, Droppable} from 'react-beautiful-dnd';
import Modals from '../../modals/Modals'; import Modals from '../../modals/Modals';
import '../../paths/ShixunPaths.css';
const $ = window.$ const $ = window.$
// //
// //a little function to help us with reordering the result // //a little function to help us with reordering the result
@ -193,7 +193,12 @@ class DetailCards extends Component{
} }
startgameid=(id)=>{ startgameid=(id)=>{
if(this.props.current_user&&this.props.current_user.profile_completed===false){
this.setState({
AccountProfiletype:true
})
return
}
let url = "/shixuns/" + id + "/shixun_exec.json"; let url = "/shixuns/" + id + "/shixun_exec.json";
axios.get(url).then((response) => { axios.get(url).then((response) => {
@ -292,10 +297,16 @@ class DetailCards extends Component{
startshixunCombattype:false startshixunCombattype:false
}) })
} }
render(){ hideAccountProfile=()=>{
this.setState({
AccountProfiletype:false
})
}
render(){
let { pathCardsList, let { pathCardsList,
dropid, dropid,
dropidtype, AccountProfiletype,
idsum, idsum,
pathCardsedittype, pathCardsedittype,
pathlistedit, pathlistedit,
@ -317,6 +328,12 @@ class DetailCards extends Component{
return( return(
<div> <div>
{AccountProfiletype===true?<AccountProfile
hideAccountProfile={()=>this.hideAccountProfile()}
{...this.state}
{...this.props}
/>:""}
<Modals <Modals
modalsType={Modalstype} modalsType={Modalstype}
modalsTopval={Modalstopval} modalsTopval={Modalstopval}

@ -466,7 +466,7 @@ class DetailCardsEditAndAdd extends Component{
<span className="color-orange-tip">{ChooseShixunList && ChooseShixunList.shixuns_count}</span> <span className="color-orange-tip">{ChooseShixunList && ChooseShixunList.shixuns_count}</span>
<span>个实训</span> <span>个实训</span>
</span> </span>
<div className="fr search-new"> <div className="fr search-new mb0">
<Search <Search
placeholder="请输入创建者或者实训名称进行搜索" placeholder="请输入创建者或者实训名称进行搜索"
onInput={this.searchNameInput} onInput={this.searchNameInput}

@ -499,7 +499,7 @@ class DetailCardsEditAndEdit extends Component{
<span className="color-orange-tip">{ChooseShixunList && ChooseShixunList.shixuns_count}</span> <span className="color-orange-tip">{ChooseShixunList && ChooseShixunList.shixuns_count}</span>
<span>个实训</span> <span>个实训</span>
</span> </span>
<div className="fr search-new"> <div className="fr search-new mb0">
<Search <Search
placeholder="请输入创建者或者实训名称进行搜索" placeholder="请输入创建者或者实训名称进行搜索"
onInput={this.searchNameInput} onInput={this.searchNameInput}

@ -158,6 +158,15 @@ class PathNew extends Component{
} }
componentDidMount() { componentDidMount() {
let url = "/paths/new.json"
axios.get(url).then((result) => {
console.log(result)
}).catch((error) => {
console.log(error);
})
let pathId = this.props.match.params.pathId; let pathId = this.props.match.params.pathId;
if (pathId) { if (pathId) {
this.isEditPage = true this.isEditPage = true

@ -1,7 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import { Redirect } from 'react-router'; import { Redirect } from 'react-router';
import AccountProfile from"../user/AccountProfile";
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
// import searchImg from '../../../../images/educoder/icon/search.svg' // import searchImg from '../../../../images/educoder/icon/search.svg'
@ -182,7 +182,15 @@ class NewHeader extends Component {
}) })
return; return;
} }
this.setState({
if(user&&user.profile_completed===false){
this.setState({
AccountProfiletype:true
})
return;
}
this.setState({
Addcoursestypes:true, Addcoursestypes:true,
}) })
} }
@ -201,7 +209,15 @@ class NewHeader extends Component {
}) })
return; return;
} }
this.setState({
if(user&&user.profile_completed===false){
this.setState({
AccountProfiletype:true
})
return;
}
this.setState({
tojoinitemtype:true tojoinitemtype:true
}) })
} }
@ -527,24 +543,36 @@ submittojoinclass=(value)=>{
} }
//头部获取是否已经登录了 //头部获取是否已经登录了
getUser=(url)=>{ getUser=(url)=>{
console.log("点击了503") // console.log("点击了503")
console.log(url); // console.log(url);
let{user} =this.state; let{user} =this.state;
if(user===undefined){ if(user===undefined){
this.setState({ this.setState({
isRender:true isRender:true
}) })
return return
} }
if(user&&user.login===""){ if(user&&user.login===""){
this.setState({ this.setState({
isRender:true isRender:true
}) })
return; return;
} }
if(user&&user.profile_completed===false){
this.setState({
AccountProfiletype:true
})
return;
}
if(url !== undefined || url!==""){ if(url !== undefined || url!==""){
window.location.href = url; window.location.href = url;
} }
} }
//修改登录方法 //修改登录方法
@ -554,6 +582,12 @@ submittojoinclass=(value)=>{
}) })
} }
hideAccountProfile=()=>{
this.setState({
AccountProfiletype:false
})
}
render() { render() {
const isLogin = true; // 这里不会出现未登录的情况,服务端在服务端路由时发现如果是未登录,则跳转到登录页了。 const isLogin = true; // 这里不会出现未登录的情况,服务端在服务端路由时发现如果是未登录,则跳转到登录页了。
const {match ,} = this.props; const {match ,} = this.props;
@ -568,7 +602,7 @@ submittojoinclass=(value)=>{
Checkboxteachingtype, Checkboxteachingtype,
code_notice, code_notice,
checked_notice, checked_notice,
RadioGroupvalue, AccountProfiletype,
submitapplications, submitapplications,
submitapplicationsvalue, submitapplicationsvalue,
user, user,
@ -610,6 +644,12 @@ submittojoinclass=(value)=>{
{...this.props} {...this.props}
/>:""} />:""}
{AccountProfiletype===true?<AccountProfile
hideAccountProfile={()=>this.hideAccountProfile()}
{...this.state}
{...this.props}
/>:""}
<div className="educontent clearfix"> <div className="educontent clearfix">
{/*<%= link_to image_tag("/images/educoder/logo.png", alt:"高校智能化教学与实训平台", className:"logoimg"), home_path %>*/} {/*<%= link_to image_tag("/images/educoder/logo.png", alt:"高校智能化教学与实训平台", className:"logoimg"), home_path %>*/}
<a href="/"> <a href="/">

@ -8,6 +8,8 @@ import PropTypes from 'prop-types';
import {Modal,Input,Radio,Pagination,message,Spin,Icon,Tooltip} from 'antd'; import {Modal,Input,Radio,Pagination,message,Spin,Icon,Tooltip} from 'antd';
import AccountProfile from"../user/AccountProfile";
import 'antd/lib/pagination/style/index.css'; import 'antd/lib/pagination/style/index.css';
import axios from 'axios' import axios from 'axios'
@ -381,6 +383,14 @@ class TPMBanner extends Component {
//开始实战按钮 //开始实战按钮
startshixunCombat=(id, reset)=>{ startshixunCombat=(id, reset)=>{
if(this.props.current_user&&this.props.current_user.profile_completed===false){
this.setState({
AccountProfiletype:true
})
return
}
let {shixunsDetails} = this.props let {shixunsDetails} = this.props
if( shixunsDetails.shixun_status>1){ if( shixunsDetails.shixun_status>1){
this.setState({ this.setState({
@ -455,7 +465,11 @@ class TPMBanner extends Component {
}) })
} }
hideAccountProfile=()=>{
this.setState({
AccountProfiletype:false
})
}
render() { render() {
let { let {
@ -480,7 +494,7 @@ class TPMBanner extends Component {
shixunsreplace, shixunsreplace,
hidestartshixunsreplacevalue, hidestartshixunsreplacevalue,
Forkvisibletype, Forkvisibletype,
Senttothevcaluetype, AccountProfiletype,
isIE} = this.state; isIE} = this.state;
let {shixunsDetails, shixunId, star_info, star_infos} = this.props; let {shixunsDetails, shixunId, star_info, star_infos} = this.props;
let challengeBtnTipText = ''; let challengeBtnTipText = '';
@ -555,6 +569,13 @@ class TPMBanner extends Component {
<div> <div>
<div className="shixunDetail_top"> <div className="shixunDetail_top">
{AccountProfiletype===true?<AccountProfile
hideAccountProfile={()=>this.hideAccountProfile()}
{...this.state}
{...this.props}
/>:""}
{this.state.Modalstype===true?<Modals {this.state.Modalstype===true?<Modals
modalsType={this.state.Modalstype} modalsType={this.state.Modalstype}
modalsTopval={this.state.Modalstopval} modalsTopval={this.state.Modalstopval}

@ -256,11 +256,12 @@ export default class TPMevaluation extends Component {
this.setevaluationlist(newevaluationlist); this.setevaluationlist(newevaluationlist);
} }
getfilepath=(e,shixunfilepath)=>{ getfilepath=(e,shixunfilepath,type)=>{
this.setState({ this.setState({
evaluationvisible: true, evaluationvisible: true,
selectpath:e.target.value, selectpath:e.target.value,
selectpatharr:[], selectpatharr:[],
pathtype:type
}); });
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
let url ="/shixuns/"+id+"/repository.json"; let url ="/shixuns/"+id+"/repository.json";
@ -283,9 +284,9 @@ export default class TPMevaluation extends Component {
}); });
} }
sendgetfilepath=(newpath,type)=>{ sendgetfilepath=(newpath,type,newpathtype)=>{
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
let{path,main}=this.state; let{path,main,pathtype}=this.state;
let ary=main; let ary=main;
let paths=path; let paths=path;
@ -329,10 +330,18 @@ export default class TPMevaluation extends Component {
}); });
} }
if(pathtype===2){
this.setState({
selectpath: newpathtype,
})
}
} }
goblakepath=(path,key)=>{ goblakepath=(path,key)=>{
let {main,selectpath} =this.state; let {main,selectpath,pathtype} =this.state;
let newmain=[] let newmain=[]
for(var i=0;i<=key;i++){ for(var i=0;i<=key;i++){
newmain.push(main[i]) newmain.push(main[i])
@ -355,6 +364,17 @@ export default class TPMevaluation extends Component {
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
}); });
if(pathtype===2){
// var str=path;
// str.slice(0,str.length-1)
// debugger
// console.log(str)
this.setState({
selectpath: path,
})
}
} }
// delesavegetfilepath=(value)=>{ // delesavegetfilepath=(value)=>{
// let {selectpatharr} = this.state // let {selectpatharr} = this.state
@ -381,7 +401,36 @@ export default class TPMevaluation extends Component {
// }) // })
// } // }
savegetfilepath=(value)=>{ savegetfilepath=(value)=>{
let {selectpath,saveshixunfilepath} = this.state let {selectpath,saveshixunfilepath,pathtype} = this.state
if(pathtype===1){
let newselectpath;
if(saveshixunfilepath==="shixunfilepathplay"){
newselectpath=value
}else{
const type = selectpath.split('');
let types=false;
for(var i=0; i<type.length; i++){
if(type[i]===value){
types=true
return
}
}
if(types===false){
newselectpath=selectpath+value+ ""
}else{
newselectpath=selectpath
}
}
this.setState({
// selectpatharr:newarr,
selectpath: newselectpath,
})
}
// let newarr =selectpatharr; // let newarr =selectpatharr;
// let arrtype=false; // let arrtype=false;
// let arrsum=0; // let arrsum=0;
@ -405,31 +454,7 @@ export default class TPMevaluation extends Component {
let newselectpath;
if(saveshixunfilepath==="shixunfilepathplay"){
newselectpath=value
}else{
const type = selectpath.split('');
let types=false;
for(var i=0; i<type.length; i++){
if(type[i]===value){
types=true
return
}
}
if(types===false){
newselectpath=selectpath+value+ ""
}else{
newselectpath=selectpath
}
}
this.setState({
// selectpatharr:newarr,
selectpath: newselectpath,
})
} }
evaluationenter=()=>{ evaluationenter=()=>{
@ -650,9 +675,10 @@ export default class TPMevaluation extends Component {
selectpath:e.target.value selectpath:e.target.value
}) })
} }
updatepath=(e,name)=>{ updatepath=(e,name,type)=>{
this.setState({ this.setState({
[name]:e.target.value [name]:e.target.value,
pathtype:type
}) })
} }
@ -818,8 +844,8 @@ export default class TPMevaluation extends Component {
placeholder="请选择版本库中的代码文件。例: src/step1/HelloWorld.java" placeholder="请选择版本库中的代码文件。例: src/step1/HelloWorld.java"
value={shixunfilepath} value={shixunfilepath}
style={{ width:StudentTaskPapers===true?'100%':""}} style={{ width:StudentTaskPapers===true?'100%':""}}
onInput={(e)=>this.updatepath(e,"shixunfilepath")} onInput={(e)=>this.updatepath(e,"shixunfilepath",1)}
onClick={(e)=>this.getfilepath(e,"shixunfilepath")} onClick={(e)=>this.getfilepath(e,"shixunfilepath",1)}
/> />
<p className="color-grey-9 mt15">该文件将直接显示给学生需要学生在其中填写代码</p> <p className="color-grey-9 mt15">该文件将直接显示给学生需要学生在其中填写代码</p>
</div> </div>
@ -844,7 +870,7 @@ export default class TPMevaluation extends Component {
{ {
main.length===0?"":main.map((item,key)=>{ main.length===0?"":main.map((item,key)=>{
return( return(
<a className="f14 fb" onClick={()=>this.goblakepath(item.path,key)}>{item.val}</a> <a className="f14 fb" onClick={()=>this.goblakepath(item.path,key,item)}>{item.val}</a>
) )
}) })
} }
@ -853,7 +879,7 @@ export default class TPMevaluation extends Component {
return( return(
<li className="entry" key={key}> <li className="entry" key={key}>
<div className="filename_no_report hidden">{ <div className="filename_no_report hidden">{
item.type==="tree"?<a onClick={()=>this.sendgetfilepath(item.name,item.type)} data-remote="true"> item.type==="tree"?<a onClick={()=>this.sendgetfilepath(item.name,item.type,path+item.name)} data-remote="true">
<i className="iconfont icon-wenjianjia color-blue mr2"></i> <i className="iconfont icon-wenjianjia color-blue mr2"></i>
{path+item.name}</a>:<a data-remote="true"> {path+item.name}</a>:<a data-remote="true">
<i className="iconfont icon-zuoye color-blue mr2"></i> <i className="iconfont icon-zuoye color-blue mr2"></i>
@ -873,7 +899,7 @@ export default class TPMevaluation extends Component {
<div className="clearfix mt20"> <div className="clearfix mt20">
<label className="fl mt5 directory_filepath">选中的文件路径</label> <label className="fl mt5 directory_filepath">选中的文件路径</label>
<Input id="points_tusi" placeholder="选中的文件路径" className="fl input-60-40" <Input id="points_tusi" placeholder="选中的文件路径" className="fl input-60-40"
style={{width:"440px"}} style={{width:"400px"}}
onInput={(e)=>this.saveselectpath(e)} onInput={(e)=>this.saveselectpath(e)}
value={selectpath}/> value={selectpath}/>
</div> </div>
@ -897,8 +923,8 @@ export default class TPMevaluation extends Component {
placeholder="请选择版本库中的代码文件。例src/step1/HelloWorldTest.java" placeholder="请选择版本库中的代码文件。例src/step1/HelloWorldTest.java"
value={shixunfilepathplay} value={shixunfilepathplay}
style={{width:StudentTaskDocs===true?'100%':""}} style={{width:StudentTaskDocs===true?'100%':""}}
onInput={(e)=>this.updatepath(e,"shixunfilepathplay")} onInput={(e)=>this.updatepath(e,"shixunfilepathplay",1)}
onClick={(e)=>this.getfilepath(e,"shixunfilepathplay")} onClick={(e)=>this.getfilepath(e,"shixunfilepathplay",1)}
/> />
<p className="color-grey-9 mt15">该文件由平台执行用来测试平台学员代码是否正确</p> <p className="color-grey-9 mt15">该文件由平台执行用来测试平台学员代码是否正确</p>
</div> </div>
@ -958,8 +984,8 @@ export default class TPMevaluation extends Component {
id="shixun_file_expect_picture_path" name="challenge[original_picture_path]" id="shixun_file_expect_picture_path" name="challenge[original_picture_path]"
placeholder="请选择版本库中存储了待处理图片的路径。例src/step1/expectedimages" placeholder="请选择版本库中存储了待处理图片的路径。例src/step1/expectedimages"
value={shixunfileexpectpicturepath} value={shixunfileexpectpicturepath}
onInput={(e)=>this.updatepath(e,"shixunfileexpectpicturepath")} onInput={(e)=>this.updatepath(e,"shixunfileexpectpicturepath",2)}
onClick={(e)=>this.getfilepath(e,"shixunfileexpectpicturepath")} onClick={(e)=>this.getfilepath(e,"shixunfileexpectpicturepath",2)}
/> />
<p className="color-grey-9 mt15"> <p className="color-grey-9 mt15">
该路径下的文件将在学员评测本关任务时作为原始图片显示在查看效果页供学员参考,任务为图片处理时请指定该路径并注意与程序文件所在文件夹分开 该路径下的文件将在学员评测本关任务时作为原始图片显示在查看效果页供学员参考,任务为图片处理时请指定该路径并注意与程序文件所在文件夹分开
@ -980,8 +1006,8 @@ export default class TPMevaluation extends Component {
id="shixun_file_standard_picture_path" name="challenge[expect_picture_path]" id="shixun_file_standard_picture_path" name="challenge[expect_picture_path]"
placeholder="请选择版本库中存储了标准答案代码输出文件的路径。例src/step1/expectedimages" placeholder="请选择版本库中存储了标准答案代码输出文件的路径。例src/step1/expectedimages"
value={shixunfilestandardpicturepath} value={shixunfilestandardpicturepath}
onInput={(e)=>this.updatepath(e,"shixunfilestandardpicturepath")} onInput={(e)=>this.updatepath(e,"shixunfilestandardpicturepath",2)}
onClick={(e)=>this.getfilepath(e,"shixunfilestandardpicturepath")} onClick={(e)=>this.getfilepath(e,"shixunfilestandardpicturepath",2)}
/> />
<p className="color-grey-9 mt15"> <p className="color-grey-9 mt15">
该路径下的文件将在学员评测本关任务时作为参考答案显示在查看效果页供学员参考任务输出结果为文件时请指定该路径并注意与程序文件所在文件夹分开 该路径下的文件将在学员评测本关任务时作为参考答案显示在查看效果页供学员参考任务输出结果为文件时请指定该路径并注意与程序文件所在文件夹分开
@ -1001,8 +1027,8 @@ export default class TPMevaluation extends Component {
<input type="text" className="input-100-45 change" autoComplete="off" <input type="text" className="input-100-45 change" autoComplete="off"
id="shixun_file_picture_path" name="challenge[picture_path]" id="shixun_file_picture_path" name="challenge[picture_path]"
value={shixunfilepicturepath} value={shixunfilepicturepath}
onInput={(e)=>this.updatepath(e,"shixunfilepicturepath")} onInput={(e)=>this.updatepath(e,"shixunfilepicturepath",2)}
onClick={(e)=>this.getfilepath(e,"shixunfilepicturepath")} onClick={(e)=>this.getfilepath(e,"shixunfilepicturepath",2)}
placeholder="请在版本库中指定用来保存学员代码实际输出结果的路径。例src/step1/outputimages"/> placeholder="请在版本库中指定用来保存学员代码实际输出结果的路径。例src/step1/outputimages"/>
<p className="color-grey-9 mt15"> <p className="color-grey-9 mt15">
学员评测本关任务时生成的文件将保存在该路径下并作为实际输出显示在查看效果页供学员确认任务输出结果为文件时请指定该路径并注意与程序文件所在文件夹分开 学员评测本关任务时生成的文件将保存在该路径下并作为实际输出显示在查看效果页供学员确认任务输出结果为文件时请指定该路径并注意与程序文件所在文件夹分开

@ -743,10 +743,12 @@ class Newshixuns extends Component {
onChangeTimePicker = (value, dateString) => { onChangeTimePicker = (value, dateString) => {
this.setState({ this.setState({
TimePickervalue: handleDateStrings(dateString) TimePickervalue: moment(handleDateStrings(dateString))
}) })
} }
// 附件相关 START
// 附件相关 START
handleChange = (info) => { handleChange = (info) => {
console.log("handleChange1"); console.log("handleChange1");
let fileList = info.fileList; let fileList = info.fileList;
@ -1279,13 +1281,14 @@ class Newshixuns extends Component {
<li className="fl"> <li className="fl">
<DatePicker <DatePicker
showToday={false} showToday={false}
showTime
locale={locale} locale={locale}
showTime={{ format: 'HH:mm' }} showTime={{ format: 'HH:mm' }}
style={{"width": "184px"}} style={{"width": "184px"}}
format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD HH:mm"
placeholder="请选择开启时间" placeholder="请选择开启时间"
onChange={this.onChangeTimePicker} onChange={this.onChangeTimePicker}
value={TimePickervalue && moment(TimePickervalue, "YYYY-MM-DD HH:mm")}
disabledTime={disabledDateTime} disabledTime={disabledDateTime}
dropdownClassName="hideDisable" dropdownClassName="hideDisable"
/> />

@ -20,6 +20,8 @@ import '../shixunchildCss/Challenges.css'
import axios from 'axios'; import axios from 'axios';
import AccountProfile from"../../../user/AccountProfile";
const $ = window.$; const $ = window.$;
class Challenges extends Component { class Challenges extends Component {
@ -218,7 +220,14 @@ class Challenges extends Component {
//开始实战按钮 //开始实战按钮
startshixunCombat = (type, ids, id) => { startshixunCombat = (type, ids, id) => {
if(this.props.current_user&&this.props.current_user.profile_completed===false){
this.setState({
AccountProfiletype:true
})
return
}
debugger
let { ChallengesDataList } = this.state; let { ChallengesDataList } = this.state;
// let id = this.props.match.params.shixunId; // let id = this.props.match.params.shixunId;
this.setState({ this.setState({
@ -271,8 +280,15 @@ class Challenges extends Component {
startshixunCombattype:false startshixunCombattype:false
}) })
} }
hideAccountProfile=()=>{
this.setState({
AccountProfiletype:false
})
}
render() { render() {
let { ChallengesDataList, startbtns, sumidtype ,startshixunCombattype,shixunsreplace,shixunsmessage,hidestartshixunsreplacevalue,operationstrue} = this.state; let { ChallengesDataList, startbtns, sumidtype ,startshixunCombattype,shixunsreplace,shixunsmessage,hidestartshixunsreplacevalue,operationstrue,AccountProfiletype} = this.state;
let { loadingContent } = this.props; let { loadingContent } = this.props;
if (ChallengesDataList != undefined) { if (ChallengesDataList != undefined) {
this.updatamakedown("ReactMarkdown") this.updatamakedown("ReactMarkdown")
@ -281,6 +297,12 @@ class Challenges extends Component {
const antIcon = <Icon type="loading" style={{ fontSize: 24 }} spin />; const antIcon = <Icon type="loading" style={{ fontSize: 24 }} spin />;
return ( return (
<React.Fragment> <React.Fragment>
{AccountProfiletype===true?<AccountProfile
hideAccountProfile={()=>this.hideAccountProfile()}
{...this.state}
{...this.props}
/>:""}
{loadingContent ? {loadingContent ?
<CircularProgress size={40} thickness={3} style={{ <CircularProgress size={40} thickness={3} style={{
marginLeft: 'auto', marginLeft: 'auto',

@ -0,0 +1,74 @@
import React, { Component } from 'react';
import {getImageUrl} from 'educoder';
import {Modal} from 'antd';
import axios from 'axios';
class AccountProfile extends Component {
constructor(props) {
super(props);
this.state = {
AccountProfiletype:false
}
}
componentDidMount() {
if(this.props.AccountProfiletype!=undefined){
this.setState({
AccountProfiletype:this.props.AccountProfiletype
})
}
axios.interceptors.response.use((response) => {
if (response != undefined)
if (response && response.data.status === 402) {
this.setState({
AccountProfiletype: true
})
}
return response;
}, (error) => {
});
}
gotoback=()=>{
if(this.props.AccountProfiletype!=undefined){
this.setState({
AccountProfiletype:false
})
this.props.hideAccountProfile()
}else{
window.location.href="/";
this.setState({
AccountProfiletype:false
})
}
}
render() {
return(
<Modal
keyboard={false}
title="提示"
visible={this.state.AccountProfiletype}
closable={false}
footer={null}
destroyOnClose={true}
centered={true}
width="530px"
>
<div className="task-popup-content">
<p className="task-popup-text-center font-16">您需要去完善您的个人资料才能使用此功能</p>
<div className="clearfix mt30 edu-txt-center">
<a className="task-btn mr30" onClick={()=>this.gotoback()}>取消</a>
<a className="task-btn task-btn-orange" href={"/account/profile/edit"}>立即完善</a>
</div>
</div>
</Modal>
)
}
}
export default AccountProfile;

@ -691,7 +691,7 @@ class LoginRegisterComponent extends Component {
<Input style={loginInputsyl} type="text" autoComplete="off" onClick={this.changeTypey} <Input style={loginInputsyl} type="text" autoComplete="off" onClick={this.changeTypey}
className={Phonenumberisnotco && Phonenumberisnotco !== "" ?" color-grey-9 loginInputzhucheyslass bor-reds":" color-grey-9 loginInputzhuche"} className={Phonenumberisnotco && Phonenumberisnotco !== "" ?" color-grey-9 loginInputzhucheyslass bor-reds":" color-grey-9 loginInputzhuche"}
placeholder="输入注册手机号或邮箱" value={this.state.login} placeholder="输入注册手机号或邮箱" value={this.state.login}
onBlur={(e) => this.inputOnBlurzhuche(e)} // onBlur={(e) => this.inputOnBlurzhuche(e)}
onChange={this.loginInputonChange} style={{marginTop: '10px', height: "38px"}}></Input> onChange={this.loginInputonChange} style={{marginTop: '10px', height: "38px"}}></Input>
{ {
Phonenumberisnotco && Phonenumberisnotco !== "" ? Phonenumberisnotco && Phonenumberisnotco !== "" ?

@ -340,10 +340,10 @@ class LoginRegisterComponent extends Component {
} }
if(response.data.identity === null || response.data.identity === undefined){ // if(response.data.profile_completed !== null || response.data.profile_completed === false){
this.props.history.push("/interesse"); // this.setMyEduCoderModals();
return; // return;
} // }
if (response.status === 200) { if (response.status === 200) {
if (response.data.status === 402) { if (response.data.status === 402) {
@ -458,13 +458,13 @@ class LoginRegisterComponent extends Component {
return; return;
} }
}else { }else {
this.setState({ // this.setState({
logins: "", // logins: "",
dragOk: false, // dragOk: false,
codes: "", // codes: "",
passwords: "", // passwords: "",
Agreetotheterms: "", // Agreetotheterms: "",
}) // })
this.setMyEduCoderModals(); this.setMyEduCoderModals();
} }
} }
@ -1028,7 +1028,7 @@ class LoginRegisterComponent extends Component {
value={this.state.logins} value={this.state.logins}
type="text" autoComplete="off" type="text" autoComplete="off"
onChange={this.loginInputonChanges} onChange={this.loginInputonChanges}
onBlur={(e) => this.inputOnBlurzhuche(e, 2)} // onBlur={(e) => this.inputOnBlurzhuche(e, 2)}
style={{marginTop: '30px' , height: '38px',color:'#999999',fontSize:"14px"}}></Input> style={{marginTop: '30px' , height: '38px',color:'#999999',fontSize:"14px"}}></Input>
{ {
Phonenumberisnotcos && Phonenumberisnotcos !== "" ? Phonenumberisnotcos && Phonenumberisnotcos !== "" ?
@ -1038,10 +1038,10 @@ class LoginRegisterComponent extends Component {
: <div style={{height:"25px"}}></div> : <div style={{height:"25px"}}></div>
} }
<Notcompletedysl {this.state.MyEduCoderModals===true? <Notcompletedysl
modalsType={this.state.MyEduCoderModals} modalsType={this.state.MyEduCoderModals}
setNotcompleteds={()=>{this.setNotcompleteds()}} setNotcompleteds={()=>{this.setNotcompleteds()}}
/> />:""}
{ {
Whethertoverify===false&&pciphone===true? Whethertoverify===false&&pciphone===true?

@ -16,24 +16,28 @@ class Notcompletedysl extends Component {
// console.log("Notcompletedysl"); // console.log("Notcompletedysl");
// console.log("开发了402了"); // console.log("开发了402了");
axios.interceptors.response.use((response) => { // axios.interceptors.response.use((response) => {
// console.log(response); // // console.log(response);
if (response != undefined) // if (response != undefined)
if (response && response.data.status === 402) { // if (response && response.data.status === 402) {
this.setState({ // this.setState({
modalsType: true // modalsType: true
}) // })
} // }
return response; // return response;
}, (error) => { // }, (error) => {
//TODO 这里如果样式变了会出现css不加载的情况 // //TODO 这里如果样式变了会出现css不加载的情况
//
}); // });
} }
modalCancel=()=>{ modalCancel=()=>{
window.location.href = "/"; var weekArray = JSON.parse(window.sessionStorage.getItem('yslgeturls'));
if(weekArray===undefined){
weekArray="/";
}
window.location.href = weekArray;
} }
setDownload=()=>{ setDownload=()=>{
@ -51,15 +55,14 @@ class Notcompletedysl extends Component {
destroyOnClose={true} destroyOnClose={true}
title="提示" title="提示"
centered={true} centered={true}
visible={this.state.modalsType} visible={this.props.modalsType}
width="530px" width="530px"
> >
<div className="educouddiv"> <div className="educouddiv">
<div className={"tabeltext-alignleft mt10"}><p>您尚未完善个人资料</p></div> <div className={"tabeltext-alignleft mt20"}><p>完善您的资料将获得更多的使用权限</p></div>
<div className={"tabeltext-alignleft mt10"}><p>请在完成资料后提交试用申请</p></div>
<div className="clearfix mt30 edu-txt-center"> <div className="clearfix mt30 edu-txt-center">
<a className="task-btn mr30" onClick={()=>this.modalCancel()}>取消</a> <a className="task-btn mr30" onClick={()=>this.modalCancel()}>取消</a>
<a className="task-btn task-btn-orange" onClick={()=>this.setDownload()}>立即完善资料</a> <a className="task-btn task-btn-orange" onClick={()=>this.setDownload()}>立即完善</a>
</div> </div>
</div> </div>
</Modal> </Modal>

@ -106,6 +106,8 @@ class AccountBasic extends Component {
this.setState({ this.setState({
school_id, school_id,
school: selectedName school: selectedName
}, () => {
this.filterList(selectedName)
}) })
} else if(basicInfo && basicInfo.school_name){ } else if(basicInfo && basicInfo.school_name){
this.setState({ this.setState({
@ -199,7 +201,7 @@ class AccountBasic extends Component {
} }
// 过滤学校 // 过滤学校
filterList=(e)=>{ filterList =(e)=>{
const inputVal = e.trim() const inputVal = e.trim()
let arr=[]; let arr=[];
if(inputVal){ if(inputVal){
@ -211,7 +213,7 @@ class AccountBasic extends Component {
}) })
this.setState({ this.setState({
school: inputVal, school: inputVal,
filterSchoolList:arr filterSchoolList: arr
}) })
} else { } else {
this.setState({ this.setState({
@ -254,6 +256,7 @@ class AccountBasic extends Component {
this.setState({ this.setState({
department_id: '', department_id: '',
departmentsName: e, departmentsName: e,
filterDepartments: [],
}) })
this.this_department_id = '' this.this_department_id = ''
return; return;
@ -261,7 +264,7 @@ class AccountBasic extends Component {
this.this_department_id = arr[0].id this.this_department_id = arr[0].id
this.setState({ this.setState({
departmentsName:e, departmentsName:e,
department_id: arr[0].id department_id: arr[0].id,
}) })
} }
@ -365,7 +368,6 @@ class AccountBasic extends Component {
// this.setState({ schoolList }) // this.setState({ schoolList })
this.getSchoolList(this.props.basicInfo, name); this.getSchoolList(this.props.basicInfo, name);
this.props.form.setFieldsValue({ this.props.form.setFieldsValue({
name: name name: name
}) })
@ -400,6 +402,7 @@ class AccountBasic extends Component {
filterDepartments, filterDepartments,
school, school,
school_id, school_id,
departments,
departmentsName, departmentsName,
identity identity
}=this.state; }=this.state;
@ -676,7 +679,7 @@ class AccountBasic extends Component {
</Form.Item> </Form.Item>
{!filterSchoolList || (filterSchoolList && filterSchoolList.length==0 )&& school && {!filterSchoolList || (filterSchoolList && filterSchoolList.length==0 )&& school &&
<div style={{marginLeft: '100px',height:"20px",lineHeight:"20px"}}> <div style={{marginLeft: '113px',height:"20px",lineHeight:"20px"}}>
<span> <span>
<span style={{color: '#CDCDCD'}}>未找到包含{school}的高校</span> <span style={{color: '#CDCDCD'}}>未找到包含{school}的高校</span>
<span style={{color: '#4CACFF', cursor: 'pointer'}} onClick={this.showApplyForAddOrgModal}>申请新增</span> <span style={{color: '#4CACFF', cursor: 'pointer'}} onClick={this.showApplyForAddOrgModal}>申请新增</span>
@ -716,10 +719,12 @@ class AccountBasic extends Component {
</Form.Item> </Form.Item>
{ {
!filterDepartments || (filterDepartments && filterDepartments.length==0 )&& departmentsName && (!filterDepartments || (filterDepartments && filterDepartments.length==0 )
<div style={{marginLeft: '100px',height:"20px",lineHeight:"20px"}}> || (departmentsName == '' && !this.state.department_id
&& (!departments || departments.length == 0) )) &&
<div style={{marginLeft: '113px',height:"20px",lineHeight:"20px"}}>
<span> <span>
<span style={{color: '#CDCDCD'}}>未找到包含{departmentsName}的院系/部门</span> <span style={{color: '#CDCDCD'}}>{departmentsName ? `未找到包含“${departmentsName}”的院系/部门` : '未找到院系'}</span>
<span style={{color: '#4CACFF', cursor: 'pointer'}} onClick={this.showApplyForAddChildOrgModal}>申请新增</span> <span style={{color: '#4CACFF', cursor: 'pointer'}} onClick={this.showApplyForAddChildOrgModal}>申请新增</span>
</span> </span>
</div> </div>

@ -132,7 +132,7 @@ class RealNameCertificationModal extends Component{
multiple: true, multiple: true,
showUploadList: false, showUploadList: false,
// https://newweb.educoder.net // https://newweb.educoder.net
action: `/api/users/accounts/${this.props.current_user.login}/auth_attachment.json`, action: this.props.current_user ? `/api/users/accounts/${this.props.current_user.login}/auth_attachment.json` : '',
className: 'idPic-uploader', className: 'idPic-uploader',
onChange: this.handleChange2, onChange: this.handleChange2,
}; };

@ -239,14 +239,14 @@ class Infos extends Component{
<div className="inline"> <div className="inline">
<div className="fl headtab"> <div className="fl headtab">
<span>{is_current ? "我":"TA"}的经验值</span> <span>{is_current ? "我":"TA"}的经验值</span>
<a <a style={{ cursor: 'default' }}
// href={`${this.props.Headertop && this.props.Headertop.old_url}/users/${username}/user_experience`} // href={`${this.props.Headertop && this.props.Headertop.old_url}/users/${username}/user_experience`}
>{data && data.experience}</a> >{data && data.experience}</a>
</div> </div>
<em className="v-h-line fl"></em> <em className="v-h-line fl"></em>
<div className="fl headtab"> <div className="fl headtab">
<span>{is_current ? "我":"TA"}的金币</span> <span>{is_current ? "我":"TA"}的金币</span>
<a <a style={{ cursor: 'default' }}
// href={`${this.props.Headertop && this.props.Headertop.old_url}/users/${username}/user_grade`} // href={`${this.props.Headertop && this.props.Headertop.old_url}/users/${username}/user_grade`}
id="user_code">{data && data.grade}</a> id="user_code">{data && data.grade}</a>
</div> </div>
@ -255,14 +255,14 @@ class Infos extends Component{
</div> </div>
<div className="fl headtab"> <div className="fl headtab">
<span>{is_current ? "我":"TA"}的粉丝</span> <span>{is_current ? "我":"TA"}的粉丝</span>
<a <a style={{ cursor: 'default' }}
// href={`${this.props.Headertop && this.props.Headertop.old_url}/users/${username}/user_fanslist`} // href={`${this.props.Headertop && this.props.Headertop.old_url}/users/${username}/user_fanslist`}
id="user_h_fan_count">{data && data.fan_count}</a> id="user_h_fan_count">{data && data.fan_count}</a>
</div> </div>
<em className="v-h-line fl"></em> <em className="v-h-line fl"></em>
<div className="fl headtab"> <div className="fl headtab">
<span>{is_current ? "我":"TA"}的关注</span> <span>{is_current ? "我":"TA"}的关注</span>
<a <a style={{ cursor: 'default' }}
// href={`${this.props.Headertop && this.props.Headertop.old_url}/users/${username}/user_watchlist`} // href={`${this.props.Headertop && this.props.Headertop.old_url}/users/${username}/user_watchlist`}
>{data && data.follow_count}</a> >{data && data.follow_count}</a>
</div> </div>

@ -130,7 +130,7 @@ class InfosCourse extends Component{
this.props.current_user && this.props.current_user.user_identity != "学生" ? <Create href={"/courses/new"} name={"新建课堂"} index="1"></Create> : "" this.props.current_user && this.props.current_user.user_identity != "学生" ? <Create href={"/courses/new"} name={"新建课堂"} index="1"></Create> : ""
} }
{ {
(!data || data.courses.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" || category) && <NoneData></NoneData> (!data || data.courses.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" ) && <NoneData></NoneData>
} }
{ {
data && data.courses && data.courses.map((item,key)=>{ data && data.courses && data.courses.map((item,key)=>{

@ -152,7 +152,7 @@ class InfosPath extends Component{
this.props.current_user && this.props.current_user.user_identity != "学生" ? <Create href={"/paths/new"} name={"新建实践课程"} index="3"></Create>:"" this.props.current_user && this.props.current_user.user_identity != "学生" ? <Create href={"/paths/new"} name={"新建实践课程"} index="3"></Create>:""
} }
{ {
(!data || data.subjects.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" || category) && <NoneData></NoneData> (!data || data.subjects.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" ) && <NoneData></NoneData>
} }
{ {
data && data.subjects && data.subjects.map((item,key)=>{ data && data.subjects && data.subjects.map((item,key)=>{

@ -125,7 +125,7 @@ class InfosProject extends Component{
<Create href={`${this.props.Headertop && this.props.Headertop.old_url}/projects/new`} name={"新建项目"} index="4"></Create>:"" <Create href={`${this.props.Headertop && this.props.Headertop.old_url}/projects/new`} name={"新建项目"} index="4"></Create>:""
} }
{ {
(!data || data.projects.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" || category) && <NoneData></NoneData> (!data || data.projects.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" ) && <NoneData></NoneData>
} }
{ {
data && data.projects && data.projects.map((item,key)=>{ data && data.projects && data.projects.map((item,key)=>{

@ -161,7 +161,7 @@ class InfosShixun extends Component{
<Create href={"/shixuns/new"} name={"新建实训"} index="2"></Create>:"" <Create href={"/shixuns/new"} name={"新建实训"} index="2"></Create>:""
} }
{ {
(!data || data.shixuns.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" || category) && <NoneData></NoneData> (!data || data.shixuns.length==0) && (this.props.current_user && this.props.current_user.user_identity === "学生" ) && <NoneData></NoneData>
} }
{ {
data && data.shixuns && data.shixuns.map((item,key)=>{ data && data.shixuns && data.shixuns.map((item,key)=>{

Loading…
Cancel
Save