Merge branch 'dev_aliyun' into dev_cs

dev_cs
caicai8 6 years ago
commit edcd39e7ed

@ -458,7 +458,7 @@ class StudentWorksController < ApplicationController
@shixun = @homework.shixuns.take @shixun = @homework.shixuns.take
# 提示: 这里如果includes outputs表的话 sum(:evaluate_count)会出现错误 # 提示: 这里如果includes outputs表的话 sum(:evaluate_count)会出现错误
@games = @work.myshixun.games.joins(:challenge).reorder("challenges.position asc") if @work.myshixun @games = @work.myshixun.games.joins(:challenge).reorder("challenges.position asc") if @work.myshixun
@comment = @work.student_works_scores.shixun_comment.first @comment = @work.shixun_work_comments.find_by(challenge_id: 0)
# 用户最大评测次数 # 用户最大评测次数
if @games if @games
@ -474,20 +474,38 @@ class StudentWorksController < ApplicationController
# 实训作品的评阅 # 实训作品的评阅
def shixun_work_comment def shixun_work_comment
tip_exception("评阅不能为空") if params[:comment].blank? tip_exception("请至少输入一个评阅") if params[:comment].blank? && params[:hidden_comment].blank?
tip_exception("缺少is_hidden参数") if params[:is_hidden].blank? || ![1, 0].include?(params[:is_hidden]) ActiveRecord::Base.transaction do
comment = @work.student_works_scores.shixun_comment.first || StudentWorksScore.new(student_work_id: @work.id, user_id: current_user.id) challenge = @homework.shixuns.first&.challenges.find_by(id: params[:challenge_id]) unless params[:challenge_id].blank?
if challenge.present?
comment = @work.shixun_work_comments.find_by(challenge_id: challenge.id) ||
ShixunWorkComment.new(student_work_id: @work.id, user_id: current_user.id, challenge_id: challenge.id)
else
comment = @work.shixun_work_comments.find_by(challenge_id: 0) ||
ShixunWorkComment.new(student_work_id: @work.id, user_id: current_user.id, challenge_id: 0)
end
comment.comment = params[:comment] comment.comment = params[:comment]
comment.is_hidden = params[:is_hidden] comment.hidden_comment = params[:hidden_comment]
comment.save! comment.save!
normal_status("评阅成功") normal_status("评阅成功")
end end
end
# 删除实训作品评阅 # 删除实训作品评阅
def destroy_work_comment def destroy_work_comment
@work.student_works_scores.shixun_comment.first.destroy! if @work.student_works_scores.shixun_comment.first.present? ActiveRecord::Base.transaction do
tip_exception("visible_comment参数有误") if params[:visible_comment].blank?
comment = @work.shixun_work_comments.find_by!(id: params[:comment_id])
params[:visible_comment] ? comment.comment = nil : comment.hidden_comment = nil
if comment.comment.nil? && comment.hidden_comment.nil?
comment.destroy!
else
comment.save!
end
normal_status("删除成功") normal_status("删除成功")
end end
end
def export_shixun_work_report def export_shixun_work_report
@user = @work.user @user = @work.user

@ -0,0 +1,5 @@
class ShixunWorkComment < ApplicationRecord
belongs_to :student_work
belongs_to :user
belongs_to :challenge, optional: true
end

@ -7,6 +7,7 @@ class StudentWork < ApplicationRecord
belongs_to :myshixun, optional: true belongs_to :myshixun, optional: true
has_many :student_works_evaluation_distributions, dependent: :destroy has_many :student_works_evaluation_distributions, dependent: :destroy
has_many :student_works_scores, dependent: :destroy has_many :student_works_scores, dependent: :destroy
has_many :shixun_work_comments, dependent: :destroy
belongs_to :project, optional: true belongs_to :project, optional: true
# attachtype: 1正常提交的附件 7补交的附件 # attachtype: 1正常提交的附件 7补交的附件

@ -36,6 +36,10 @@ if @shixun
challenge_score = @homework.challenge_score game.challenge_id challenge_score = @homework.challenge_score game.challenge_id
json.game_score_full challenge_score json.game_score_full challenge_score
json.game_score @work.work_challenge_score game, challenge_score json.game_score @work.work_challenge_score game, challenge_score
challenge_comment = @work.shixun_work_comments.find_by(challenge_id: game.challenge_id)
json.challenge_comment challenge_comment&.comment
json.challenge_comment_hidden challenge_comment&.hidden_comment
json.comment_id challenge_comment&.id
end end
end end
@ -54,8 +58,9 @@ if @shixun
json.passed_time @work.myshixun&.passed_time json.passed_time @work.myshixun&.passed_time
# 评阅信息 # 评阅信息
json.work_comment @user_course_identity < Course::STUDENT || !@comment&.is_hidden ? @comment&.comment : nil json.work_comment @comment&.comment
json.work_comment_hidden @comment&.is_hidden json.work_comment_hidden @user_course_identity < Course::STUDENT ? @comment&.hidden_comment : nil
json.comment_id @comment&.id
# 图形统计 # 图形统计
# 1 效率 # 1 效率

@ -0,0 +1,13 @@
class CreateShixunWorkComments < ActiveRecord::Migration[5.2]
def change
create_table :shixun_work_comments do |t|
t.references :student_work, index: true, type: :integer
t.references :challenge, index: true, type: :integer, default: 0
t.references :user, index: true, type: :integer
t.text :comment
t.text :hidden_comment
t.timestamps
end
end
end

@ -0,0 +1,13 @@
class MigrateShixunWorkComment < ActiveRecord::Migration[5.2]
def change
StudentWorksScore.where(is_ultimate: 0, score: nil).where("created_at > '2019-09-04 00:00:00'").each do |work_score|
if work_score.student_work && work_score.student_work.homework_common&.shixuns
if work_score.is_hidden
ShixunWorkComment.create!(student_work_id: work_score.student_work_id, user_id: work_score.user_id, hidden_comment: work_score.comment)
else
ShixunWorkComment.create!(student_work_id: work_score.student_work_id, user_id: work_score.user_id, comment: work_score.comment)
end
end
end
end
end

@ -218,7 +218,7 @@ function _initSider() {
}) })
} }
$(function() { $(function() {
loadHeader(); // loadHeader();
_initSider(); _initSider();
$(window).scroll(function() { $(window).scroll(function() {
@ -436,86 +436,86 @@ function editormd_to_html(id, callback) {
} }
function loadHeader() { function loadHeader() {
//头部导航条的----------显示搜索框 // //头部导航条的----------显示搜索框
$("#search-open").on("click", function(e) { // $("#search-open").on("click", function(e) {
$(this).hide(); // $(this).hide();
// $("#header-nav").animate({opacity:"0"},1000); // // $("#header-nav").animate({opacity:"0"},1000);
$(".posi-search").show() // $(".posi-search").show()
// .animate({opacity:"1"},1000); // // .animate({opacity:"1"},1000);
$("#header-nav").css("z-index", "2"); // $("#header-nav").css("z-index", "2");
$(".posi-search").css("z-index", "3"); // $(".posi-search").css("z-index", "3");
// $(".search-input").val(""); // 不清空 // // $(".search-input").val(""); // 不清空
$(".search-input").focus(); // $(".search-input").focus();
$(".search-all .search-content").hide(); // $(".search-all .search-content").hide();
e.stopPropagation(); // e.stopPropagation();
//阻止冒泡 // //阻止冒泡
}); // });
$(".search-input").on("click", function(e) { // $(".search-input").on("click", function(e) {
e.stopPropagation(); // e.stopPropagation();
//阻止冒泡 // //阻止冒泡
}); // });
//搜索框输入内容 // //搜索框输入内容
$(".search-input").on("input", function(e) { // $(".search-input").on("input", function(e) {
if ($(".search-input").val() == "") { // if ($(".search-input").val() == "") {
$(".search-all .search-content").hide(); // $(".search-all .search-content").hide();
} else { // } else {
$(".search-all .search-content").show(); // $(".search-all .search-content").show();
} // }
e.stopPropagation(); // e.stopPropagation();
//阻止冒泡 // //阻止冒泡
}); // });
//搜索 // //搜索
$("#header_keyword_search").on("click", header_search); // $("#header_keyword_search").on("click", header_search);
$("input[name='search_keyword']").on("keydown", function(event) { // $("input[name='search_keyword']").on("keydown", function(event) {
var code; // var code;
if (!event) { // if (!event) {
event = window.event; // event = window.event;
//针对ie浏览器 // //针对ie浏览器
code = event.keyCode; // code = event.keyCode;
} else { // } else {
code = event.keyCode; // code = event.keyCode;
} // }
if (code == 13) { // if (code == 13) {
header_search(); // header_search();
return false; // return false;
} // }
}); // });
$(".search-clear").click(function(e) { // $(".search-clear").click(function(e) {
e.stopPropagation(); // e.stopPropagation();
}); // });
//切换搜索条件 // //切换搜索条件
$("#searchkey li").click(function(e) { // $("#searchkey li").click(function(e) {
var key = $($(this).children("a")[0]).html(); // var key = $($(this).children("a")[0]).html();
switch (key) { // switch (key) {
case '实训': // case '实训':
$("#search_type").val('1'); // $("#search_type").val('1');
break; // break;
case '课堂': // case '课堂':
$("#search_type").val('2'); // $("#search_type").val('2');
break; // break;
case '用户': // case '用户':
$("#search_type").val('3'); // $("#search_type").val('3');
break; // break;
} // }
$("#searchkey").siblings(".searchkey").html(key); // $("#searchkey").siblings(".searchkey").html(key);
// $("#searchkey").hide(); // // $("#searchkey").hide();
e.stopPropagation(); // e.stopPropagation();
//阻止冒泡 // //阻止冒泡
}); // });
//切换选择导航条 // //切换选择导航条
$("#header-nav li").click(function() { // $("#header-nav li").click(function() {
$("#header-nav li").removeClass("active"); // $("#header-nav li").removeClass("active");
$(this).addClass("active"); // $(this).addClass("active");
}); // });
//点击页面其它(与搜索框无关的地方)都会将搜索框隐藏,所以与搜索框有关的地方需要阻止冒泡 // //点击页面其它(与搜索框无关的地方)都会将搜索框隐藏,所以与搜索框有关的地方需要阻止冒泡
$("body").on("click", function() { // $("body").on("click", function() {
closeSearch(); // closeSearch();
}); // });
//
$(".search_history").on("click", function() { // $(".search_history").on("click", function() {
$("input[name='search_keyword']").val($(this).html()); // $("input[name='search_keyword']").val($(this).html());
header_search(); // header_search();
}); // });
} }
function header_search() { function header_search() {

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

@ -22,6 +22,8 @@
--> -->
<title>EduCoder</title> <title>EduCoder</title>
<script type="text/javascript"> <script type="text/javascript">
window.__testImageUrl = "https://pre-newweb.educoder.net/react/build/images/share_logo_icon.jpg"
window.__isR = true; window.__isR = true;
// 不支持ie9 ie10 // 不支持ie9 ie10
if ( if (

@ -327,11 +327,11 @@ class App extends Component {
wx.ready(function () { wx.ready(function () {
console.log('wx is ready') console.log('wx is ready')
var shareData = { var shareData = {
title: 'EduCoder', title: 'EduCoder - 首页',
desc: '创新源于实践', desc: 'Educoder是一个面向计算机类的互联网IT教育和实战平台提供企业级工程实训以实现工程化专业教学的自动化和智能化。高校和企业人员可以在此开展计算机实践性教学活动将传统的知识传授和时兴的工程实战一体化。',
link: currentUrl, link: currentUrl,
imgUrl: window.__testImageUrl imgUrl: window.__testImageUrl
|| (currentUrl.endsWith('/') ? currentUrl : currentUrl + '/') + 'images/educoder/index/subject/subject15.jpg' || (currentUrl.endsWith('/') ? currentUrl : currentUrl + '/') + 'react/build/images/share_logo_icon.jpg'
}; };
wx.onMenuShareAppMessage(shareData);//分享给好友 wx.onMenuShareAppMessage(shareData);//分享给好友

@ -20,6 +20,8 @@ export { markdownToHTML, uploadNameSizeSeperator, appendFileSizeToUploadFile, ap
downloadFile, sortDirections } from './TextUtil' downloadFile, sortDirections } from './TextUtil'
export { handleDateString, getNextHalfHourOfMoment,formatDuring } from './DateUtil' export { handleDateString, getNextHalfHourOfMoment,formatDuring } from './DateUtil'
export { configShareForIndex, configShareForPaths, configShareForShixuns, configShareForCourses, configShareForSinglePath, configShareForSingleShixun } from './util/ShareUtil'
export { isDev as isDev, isMobile } from './Env' export { isDev as isDev, isMobile } from './Env'
export { toStore as toStore, fromStore as fromStore } from './Store' export { toStore as toStore, fromStore as fromStore } from './Store'

@ -0,0 +1,79 @@
const host = window.location.host
const wx = window.wx
function share(shareData) {
wx.onMenuShareAppMessage(shareData);//分享给好友
wx.onMenuShareTimeline(shareData);//分享到朋友圈
wx.onMenuShareQQ(shareData);//分享给手机QQ
wx.onMenuShareWeibo(shareData);//分享腾讯微博
wx.onMenuShareQZone(shareData);//分享到QQ空间
}
/**
实践课程 平台提供涵盖基础入门案例实践和创新应用的完整实训项目体系通过由浅入深的实训路径帮助学生快速提升实战能力
实训项目 覆盖不同专业的IT实验和实训每周更新无需配置本机实验环境随时随地开启企业级真实实训
翻转课堂 自动评测实训任务支持技能统计提供教学活动分析报告减轻教师和助教的辅导压力免去作业发布和批改的困扰实时了解学生学习情况全面提升教师施教效率和水平
单个课程和实训 获取课程/实训的简介 该课程或者实训展示的缩略图
*/
export function configShareForIndex () {
var shareData = {
title: 'EduCoder - 首页',
desc: 'Educoder是一个面向计算机类的互联网IT教育和实战平台提供企业级工程实训以实现工程化专业教学的自动化和智能化。高校和企业人员可以在此开展计算机实践性教学活动将传统的知识传授和时兴的工程实战一体化。',
link: host,
imgUrl: window.__testImageUrl
|| host + '/react/build/images/share_logo_icon.jpg'
};
share(shareData)
}
export function configShareForPaths () {
var shareData = {
title: 'EduCoder - 实践课程',
desc: '平台提供涵盖基础入门、案例实践和创新应用的完整实训项目体系,通过由浅入深的实训路径,帮助学生快速提升实战能力。',
link: `${host}/paths`,
imgUrl: window.__testImageUrl
|| host + '/react/build/images/share_logo_icon.jpg'
};
share(shareData)
}
export function configShareForShixuns () {
var shareData = {
title: 'EduCoder - 实训项目',
desc: '覆盖不同专业的IT实验和实训每周更新无需配置本机实验环境随时随地开启企业级真实实训。',
link: `${host}/shixuns`,
imgUrl: window.__testImageUrl
|| host + '/react/build/images/share_logo_icon.jpg'
};
share(shareData)
}
export function configShareForCourses () {
var shareData = {
title: 'EduCoder - 翻转课堂',
desc: '自动评测实训任务,支持技能统计,提供教学活动分析报告,减轻教师和助教的辅导压力,免去作业发布和批改的困扰,实时了解学生学习情况,全面提升教师施教效率和水平。',
link: `${host}/courses`,
imgUrl: window.__testImageUrl
|| host + '/react/build/images/share_logo_icon.jpg'
};
share(shareData)
}
// detail
export function configShareForSinglePath (title, desc, path, imgUrl) {
var shareData = {
title: title,
desc: desc,
link: `${host}/${path}`,
imgUrl: imgUrl || window.__testImageUrl
|| host + '/react/build/images/share_logo_icon.jpg'
};
share(shareData)
}
export function configShareForSingleShixun (title, desc, path, imgUrl) {
var shareData = {
title: title,
desc: desc,
link: `${host}/${path}`,
imgUrl: imgUrl || window.__testImageUrl
|| host + '/react/build/images/share_logo_icon.jpg'
};
share(shareData)
}

@ -9,10 +9,11 @@ class AppraiseModal extends Component{
this.state={ this.state={
group_ids:[], group_ids:[],
fileList:[], fileList:[],
textareaval:undefined,
Inputsval:undefined, Inputsval:undefined,
valuetype:0, valuetype:0,
textareavaltype:false textareavaltype:false,
comment:undefined,
hidden_comment:undefined
} }
} }
@ -25,32 +26,40 @@ class AppraiseModal extends Component{
} }
onChanges=(e)=>{ comment=(e)=>{
this.setState({ this.setState({
valuetype:e.target.value comment:e.target.value
}) })
} }
settextarea=(e)=>{ hidden_comment=(e)=>{
this.setState({ this.setState({
textareaval:e.target.value hidden_comment:e.target.value
}) })
} }
Saves=()=>{ Saves=()=>{
let{textareaval,valuetype}=this.state; let{textareaval,valuetype,comment,hidden_comment}=this.state;
let commenttype=comment===undefined||comment===null||comment==="";
let hidden_commenttype=hidden_comment===undefined||hidden_comment===null||hidden_comment==="";
if(textareaval===undefined||textareaval===null||textareaval===""){ if(commenttype===true&&hidden_commenttype===true){
this.setState({ this.setState({
textareavaltype:true textareavaltype:true
}) })
return return
} }
//comment 是 text 可见的评阅内容
// hidden_comment 是 text 不可见的评阅内容
// challenge_id 否 int 关卡id关卡评阅才需传关卡id
let url=`/student_works/${this.props.match.params.homeworkid}/shixun_work_comment.json` let url=`/student_works/${this.props.match.params.homeworkid}/shixun_work_comment.json`
axios.post(url, { axios.post(url, {
comment:textareaval, comment:textareaval,
is_hidden:valuetype hidden_comment:valuetype
}).then((response) => { }).then((response) => {
if(response.data.status===0){ if(response.data.status===0){
this.props.showNotification(response.data.message) this.props.showNotification(response.data.message)
@ -64,15 +73,41 @@ class AppraiseModal extends Component{
} }
render(){ render(){
let {textareaval,Inputsval,textareavaltype,Inputsvaltype}=this.state; let {textareavaltype,comment,hidden_comment}=this.state;
const radioStyle = {
display: 'block',
height: '30px',
lineHeight: '30px',
};
return( return(
<div> <div>
<style>
{
`
@media (max-width: 2000px) {
.WordNumberTextarea{
height: 130px !important;
}
}
@media (max-width: 1350px) {
.HomeworkModal{
top:10px !important;
}
.WordNumberTextarea{
height: 80px !important;
}
}
@media (max-width: 1250px) {
.HomeworkModal{
top:0px !important;
}
.WordNumberTextarea{
height: 40px !important;
}
}
`
}
</style>
<Modal <Modal
keyboard={false} keyboard={false}
className={"HomeworkModal"} className={"HomeworkModal"}
@ -91,12 +126,9 @@ class AppraiseModal extends Component{
padding: 0px 15px 15px 15px; padding: 0px 15px 15px 15px;
} }
.font{ .font{
width: 48px; font-size: 14px;
height: 16px;
font-size: 16px;
font-weight: 400; font-weight: 400;
color: rgba(5,16,26,1); color: rgba(5,16,26,1);
line-height: 16px;
} }
.newfont{ .newfont{
height: 16px; height: 16px;
@ -110,25 +142,31 @@ class AppraiseModal extends Component{
} }
</style> </style>
<div className="clearfix"> <div className="clearfix">
<p className={"font mt10 mb10"}> <p className={"font mt10 mb10 ml10"}>
权限 可见:(学生可查看老师的评阅内容
</p> </p>
<Radio.Group onChange={this.onChanges} value={this.state.valuetype}> {/*<Radio.Group onChange={this.onChanges} value={this.state.valuetype}>*/}
<Radio value={0} style={radioStyle} className={"newfont"}>可见 (学生查看老师的评阅内容</Radio> {/*<Radio value={0} style={radioStyle} className={"newfont"}>可见 (学生查看老师的评阅内容)</Radio>*/}
<Radio value={1} style={radioStyle} className={"newfont"}>不可见 (仅对课堂老师可见</Radio> {/*<Radio value={1} style={radioStyle} className={"newfont"}>不可见 (仅对课堂老师可见)</Radio>*/}
</Radio.Group> {/*</Radio.Group>*/}
<WordNumberTextarea
placeholder={"请填写评阅内容"}
onInput={(e)=>this.comment(e)}
value={comment}
maxlength={500}
/>
<p className={"font mt10 mb20"}> <p className={"font mt10 mb10 ml10"}>
内容 不可见:(仅对课堂老师可见
</p> </p>
<WordNumberTextarea <WordNumberTextarea
placeholder={"请填写评阅内容"} placeholder={"请填写评阅内容"}
onInput={(e)=>this.settextarea(e)} onInput={(e)=>this.hidden_comment(e)}
value={textareaval} value={hidden_comment}
maxlength={500} maxlength={500}
/> />
<li style={{height:"20px",lineHeight:"20px"}} className={textareavaltype===true?"color-red mt20 mb10":"none"}><span>评阅内容为空</span></li> <li style={{height:"20px",lineHeight:"20px"}} className={textareavaltype===true?"color-red mt20 mb10":"none"}><span>评阅内容至少有一个不为空</span></li>
</div> </div>
<div className={textareavaltype===false?"mt20 clearfix edu-txt-center":"clearfix edu-txt-center"}> <div className={textareavaltype===false?"mt20 clearfix edu-txt-center":"clearfix edu-txt-center"}>

@ -157,6 +157,42 @@ class Ecerciseallbackagain extends Component{
console.log() console.log()
return( return(
<div> <div>
<style>
{
`
@media (max-width: 2000px) {
.newupload_select_box{
height: 265px !important;
}
}
@media (max-width: 1350px) {
.HomeworkModal{
top:10px !important;
}
.newupload_select_box{
height: 220px !important;
}
}
@media (max-width: 1250px) {
.HomeworkModal{
top:0px !important;
}
.newupload_select_box{
height: 150px !important;
}
}
.eerxisbox:hover {
background: #e4eaf6;
}
.upload_select_box li:hover {
background:transparent;
}
`
}
</style>
<Modal <Modal
className={"HomeworkModal"} className={"HomeworkModal"}
title={this.props.modalname} title={this.props.modalname}
@ -174,6 +210,7 @@ class Ecerciseallbackagain extends Component{
} }
.fontlefts{text-align: left;} .fontlefts{text-align: left;}
`}</style> `}</style>
<div className="clearfix edu-txt-center mb10" style={{color:"#333333",fontSize: '15px'}}>学生将得到一次重新答题的机会现有的答题情况将被清空</div> <div className="clearfix edu-txt-center mb10" style={{color:"#333333",fontSize: '15px'}}>学生将得到一次重新答题的机会现有的答题情况将被清空</div>
<ul className="clearfix edu-txt-center ml35"> <ul className="clearfix edu-txt-center ml35">
<li className="fl paddingleft22 fontlefts" style={{width:'160px'}}>姓名</li> <li className="fl paddingleft22 fontlefts" style={{width:'160px'}}>姓名</li>
@ -182,7 +219,7 @@ class Ecerciseallbackagain extends Component{
</ul> </ul>
{datalist===undefined?"": {datalist===undefined?"":
<ul className="upload_select_box fl clearfix mt10 mb10" style={{"overflow-y":"auto",height: "319px"}} <ul className="upload_select_box fl clearfix mt10 mb10 newupload_select_box" style={{"overflow-y":"auto"}}
id="search_not_members_list" id="search_not_members_list"
onScroll={this.contentViewScroll} onScroll={this.contentViewScroll}
> >
@ -190,7 +227,7 @@ class Ecerciseallbackagain extends Component{
{ datalist.map((item,key)=>{ { datalist.map((item,key)=>{
return( return(
<div className="clearfix edu-txt-center lineh-40" key={key}> <div className="clearfix edu-txt-center lineh-40 eerxisbox" key={key}>
<li className="fl" style={{width: '158px'}}> <li className="fl" style={{width: '158px'}}>
<Checkbox <Checkbox
className="fl task-hide edu-txt-left" className="fl task-hide edu-txt-left"
@ -198,8 +235,12 @@ class Ecerciseallbackagain extends Component{
value={item.user_id} value={item.user_id}
key={item.user_id} key={item.user_id}
> >
<label style={{"textAlign": "left", "color": "#05101A"}} <a style={{"textAlign": "left"}}
className="task-hide color-grey-name" title="frerere">{item.user_name}</label> className="task-hide color-grey-name"
href={`/users/${item.user_id}/courses`}
target={'_blank'}
title={item.user_name}
>{item.user_name}</a>
</Checkbox> </Checkbox>
</li> </li>
<li className="fl" style={{width: '150px'}}> <li className="fl" style={{width: '150px'}}>
@ -220,7 +261,7 @@ class Ecerciseallbackagain extends Component{
<Checkbox checked={onChangetype} onChange={this.onChange}>{onChangetype===true?"清除":"全选"}</Checkbox> <Checkbox checked={onChangetype} onChange={this.onChange}>{onChangetype===true?"清除":"全选"}</Checkbox>
</div> </div>
<div className="clearfix mt30 edu-txt-center mb10"> <div className="clearfix edu-txt-center">
<a className="task-btn color-white mr30" onClick={this.issCancel}>取消</a> <a className="task-btn color-white mr30" onClick={this.issCancel}>取消</a>
<a className="task-btn task-btn-orange" onClick={this.isSave}>确认</a> <a className="task-btn task-btn-orange" onClick={this.isSave}>确认</a>
</div> </div>

@ -155,19 +155,20 @@ class ShixunWorkReport extends Component {
}) })
} }
showAppraiseModal=(sum)=>{ showAppraiseModal=(type,id)=>{
// if(sum===undefined){ if(type==="child"){
// this.setState({ this.setState({
// showAppraiseModaltype:true, showAppraisetype:type,
// }) challenge_id:id
// }else{ })
// this.setState({ }else{
// showAppraiseModaltype:true, this.setState({
// work_comment:undefined, showAppraisetype:type,
// work_type:0, challenge_id:undefined
// }) })
// }
// }
let{work_comment,work_comment_hidden}=this.state; let{work_comment,work_comment_hidden}=this.state;
this.setState({ this.setState({
showAppraiseModaltype:true, showAppraiseModaltype:true,
@ -253,6 +254,9 @@ class ShixunWorkReport extends Component {
modalSave={this.state.modalSave} modalSave={this.state.modalSave}
modalCancel={this.state.modalCancel} modalCancel={this.state.modalCancel}
></Modals> ></Modals>
{showAppraiseModaltype===true?<AppraiseModal {showAppraiseModaltype===true?<AppraiseModal
{...this.props} {...this.props}
{...this.state} {...this.state}
@ -299,7 +303,7 @@ class ShixunWorkReport extends Component {
{/*>评阅</a> : ""}*/} {/*>评阅</a> : ""}*/}
{this.props.isAdmin() ?<a {this.props.isAdmin() ?<a
className=" color-blue font-14 fr ml20 mt15" className=" color-blue font-14 fr ml20 mt15"
onClick={()=>this.showAppraiseModal(1)} onClick={()=>this.showAppraiseModal("main")}
>评阅</a>:""} >评阅</a>:""}
</div> </div>
{/*{work_comment===null||work_comment===undefined?"评阅":"编辑评阅"}*/} {/*{work_comment===null||work_comment===undefined?"评阅":"编辑评阅"}*/}
@ -421,6 +425,7 @@ class ShixunWorkReport extends Component {
jumptopic={this.jumptopic} jumptopic={this.jumptopic}
getdatalist={()=>this.getdatalist()} getdatalist={()=>this.getdatalist()}
setupdalist={(challenge_score,overall_appraisal,work_score)=>this.setupdalist(challenge_score,overall_appraisal,work_score)} setupdalist={(challenge_score,overall_appraisal,work_score)=>this.setupdalist(challenge_score,overall_appraisal,work_score)}
showAppraiseModal={(type,id)=>this.showAppraiseModal(type,id)}
/> />
</div> </div>
@ -483,7 +488,7 @@ class ShixunWorkReport extends Component {
>删除</a>:""} >删除</a>:""}
{this.props&&this.props.isAdminOrTeacher()===true?<a className="color-blue font-14 fr" {this.props&&this.props.isAdminOrTeacher()===true?<a className="color-blue font-14 fr"
onClick={()=>this.showAppraiseModal()} onClick={()=>this.showAppraiseModal("main")}
>编辑</a>:""} >编辑</a>:""}
</div> </div>

@ -273,7 +273,7 @@ class ShixunWorkModal extends Component{
</div> </div>
: :
<ul className="upload_select_box fl clearfix mt10 mb10" tyle={{"overflow-y":"auto"}}id="search_not_members_list" <ul className="upload_select_box fl clearfix mt10 mb10" style={{"overflow-y":"auto"}} id="search_not_members_list"
onScroll={this.contentViewScroll} onScroll={this.contentViewScroll}
> >
@ -286,7 +286,7 @@ class ShixunWorkModal extends Component{
group_list&&group_list.length===0?"":group_list.map((item,key)=>{ group_list&&group_list.length===0?"":group_list.map((item,key)=>{
return( return(
<div className="clearfix edu-txt-center lineh-40 bor-bottom-greyE" key={key}> <div className="clearfix edu-txt-center lineh-40 bor-bottom-greyE" key={key}>
<li className="fl task-hide" style={{width: '240px'}}> <li className="fl task-hide" style={{width: '240px',paddingLeft: '10px'}}>
<Checkbox <Checkbox
className="fl task-hide edu-txt-left" className="fl task-hide edu-txt-left"
name="shixun_homework[]" name="shixun_homework[]"
@ -294,7 +294,7 @@ class ShixunWorkModal extends Component{
key={item=== undefined?"":item.id} key={item=== undefined?"":item.id}
> >
<label style={{"textAlign": "left", "color": "#05101A"}} <label style={{"textAlign": "left", "color": "#05101A"}}
className="task-hide color-grey-name" title="frerere">{item===undefined?"":item.name}</label> className="task-hide color-grey-name" title={item===undefined?"":item.name}>{item===undefined?"":item.name}</label>
</Checkbox> </Checkbox>
</li> </li>
<li className="fl" style={{width: '100px'}}> <li className="fl" style={{width: '100px'}}>

@ -29,7 +29,9 @@ class OfficialAcademicTranscript extends Component {
elapsedtime:item.time_consuming, elapsedtime:item.time_consuming,
empvalue:{myself:item.myself_experience,experience:item.experience}, empvalue:{myself:item.myself_experience,experience:item.experience},
game_scores:{game_score:item.game_score,game_score_full:item.game_score_full}, game_scores:{game_score:item.game_score,game_score_full:item.game_score_full},
challenge_id:{id:item.challenge_id} challenge_id:{id:item.challenge_id},
challenge_comment: item.challenge_comment,
challenge_comment_hidden: item.challenge_comment_hidden,
// adjustmentminute:asdasd // adjustmentminute:asdasd
}) })
}) })
@ -196,6 +198,20 @@ class OfficialAcademicTranscript extends Component {
// min={0} max={record.game_scores.game_score_full} // min={0} max={record.game_scores.game_score_full}
/></a> /></a>
{/*<a style={{textAlign: "center"}} className="color-blue font-14 mr20">查看</a>*/} {/*<a style={{textAlign: "center"}} className="color-blue font-14 mr20">查看</a>*/}
</span>
),
},{
title: '操作',
key: 'operation',
dataIndex: 'operation',
render: (text, record) => (
<span>
{console.log(record)}
<a
className=" color-blue font-14 fr mr22"
onClick={()=>this.props.showAppraiseModal("child",record.challenge_id.id,record.challenge_comment,record.challenge_comment_hidden)}
>评阅</a>
</span> </span>
), ),
}]; }];
@ -210,6 +226,13 @@ class OfficialAcademicTranscript extends Component {
} }
} }
) )
columns.some((item,key)=> {
if (item.title === "操作") {
columns.splice(key, 1)
return true
}
}
)
} }
return ( return (
<div> <div>
@ -276,6 +299,9 @@ class OfficialAcademicTranscript extends Component {
.linhe15{ .linhe15{
line-height: 15px; line-height: 15px;
} }
.mr22{
margin-right: 22px;
}
`} `}
</style> </style>
{datas===undefined?"":<Table {datas===undefined?"":<Table

@ -10,9 +10,8 @@
resize:none; /*禁止拉伸*/ resize:none; /*禁止拉伸*/
border: none; /*去掉默认边框*/ border: none; /*去掉默认边框*/
width: 100%; width: 100%;
height:150px; height:130px;
border:none; border:none;
padding: 10px;
display: block; display: block;
} }
@ -26,12 +25,9 @@
height: auto; height: auto;
border: 1px solid rgba(234,234,234,1); border: 1px solid rgba(234,234,234,1);
border-radius: 0.125rem; border-radius: 0.125rem;
margin: 0.31rem; margin: 10px 10px 0px 10px;
padding: 0.19rem; padding: 10px 10px 5px 10px;
backgroud:rgba(234,234,234,1); backgroud:rgba(234,234,234,1);
padding-bottom: 10px;
padding-right: 10px;
} }
.WordNumberTextarea-count { .WordNumberTextarea-count {
display: inline-block; display: inline-block;

@ -518,7 +518,7 @@ class DetailCardsEditAndAdd extends Component{
style={{"width":"298px"}} style={{"width":"298px"}}
name="shixun_homework[]" name="shixun_homework[]"
> >
<label style={{"textAlign":"left","color":"#05101A"}} className="task-hide color-grey-name" title="frerere">{item.shixun_name}</label> <label style={{"textAlign":"left","color":"#05101A"}} className="task-hide color-grey-name" title={item.shixun_name}>{item.shixun_name}</label>
</Checkbox> </Checkbox>
</li> </li>
<li className="fl with30 edu-txt-left task-hide paddingl5">{item.school_users}</li> <li className="fl with30 edu-txt-left task-hide paddingl5">{item.school_users}</li>

@ -554,7 +554,7 @@ class DetailCardsEditAndEdit extends Component{
style={{"width":"298px"}} style={{"width":"298px"}}
name="shixun_homework[]" name="shixun_homework[]"
> >
<label style={{"textAlign":"left","color":"#05101A"}} className="task-hide color-grey-name" title="frerere">{item.shixun_name}</label> <label style={{"textAlign":"left","color":"#05101A"}} className="task-hide color-grey-name" title={item.shixun_name}>{item.shixun_name}</label>
</Checkbox> </Checkbox>
</li> </li>
<li className="fl with30 edu-txt-left task-hide paddingl5">{item.school_users}</li> <li className="fl with30 edu-txt-left task-hide paddingl5">{item.school_users}</li>

@ -459,8 +459,8 @@ class PathDetailIndex extends Component{
this.props.checkIfLogin()===false?"":progress === undefined ? "" : progress === null ? "" : this.props.checkIfLogin()===false?"":progress === undefined ? "" : progress === null ? "" :
<div className="edu-back-white myProgress padding40-20 mb10"> <div className="edu-back-white myProgress padding40-20 mb10">
<p className="mb20"> <p className="mb20">
<span className="font-16 mr10">我的进展</span> <span className="font-16 mr10">关卡数</span>
<Tooltip placement="bottom" title="获得经验值/总经验值"> <Tooltip placement="bottom" title="已通过关卡数/总关卡数">
<span className="color-green" >{progress.my_score} / {progress.all_score}</span> <span className="color-green" >{progress.my_score} / {progress.all_score}</span>
</Tooltip> </Tooltip>
</p> </p>

@ -76,8 +76,7 @@
-o-transition: all 1s; -o-transition: all 1s;
width: 100%; width: 100%;
position: absolute; position: absolute;
top: -50%; top: -17.5px;
margin-top: 67.5px;
} }
.squareCard .squareImg img:hover{ .squareCard .squareImg img:hover{
transform: scale(1.05); transform: scale(1.05);

@ -240,6 +240,7 @@ export default class TPMevaluation extends Component {
this.setState({ this.setState({
evaluationlist:newevaluationlist evaluationlist:newevaluationlist
}) })
console.log(newevaluationlist)
} }
@ -539,6 +540,14 @@ export default class TPMevaluation extends Component {
this.setevaluationlist(newevaluationlist); this.setevaluationlist(newevaluationlist);
} }
// 修改测试集的匹配规则
changeEvaluationRule=(e,key)=>{
let {evaluationlist}=this.state;
let newevaluationlist=evaluationlist;
newevaluationlist[key].match_rule=e.target.value
this.setevaluationlist(newevaluationlist);
}
evaluationoninputvalue=(e,key,type)=>{ evaluationoninputvalue=(e,key,type)=>{
$.fn.autoHeight = function(){ $.fn.autoHeight = function(){
function autoHeight(elem){ function autoHeight(elem){
@ -1159,6 +1168,13 @@ export default class TPMevaluation extends Component {
autoHeight="true" autoHeight="true"
onInput={(e)=>this.evaluationoninputvalue(e,key,"yq")} onInput={(e)=>this.evaluationoninputvalue(e,key,"yq")}
></textarea> ></textarea>
<div className="clearfix lineh-30">
<span className="fl mr10 color-grey-6">匹配规则</span>
<RadioGroup className="fl" value={item.match_rule} onChange={(e)=>this.changeEvaluationRule(e,key)}>
<Radio value='full'>完全匹配</Radio>
<Radio value='last'>末尾匹配</Radio>
</RadioGroup>
</div>
</div> </div>
) )
})} })}

@ -121,7 +121,7 @@ class TPMRightSection extends Component {
<div className="padding20 edu-back-white mb10 mt10" style={{ <div className="padding20 edu-back-white mb10 mt10" style={{
display: TPMRightSectionData === undefined?"none":TPMRightSectionData.paths===undefined?"":TPMRightSectionData.paths.length === 0 ? "none" : "block" display: TPMRightSectionData === undefined?"none":TPMRightSectionData.paths===undefined?"":TPMRightSectionData.paths.length === 0 ? "none" : "block"
}}> }}>
<p className="mb20 font-16 clearfix">相关实践课程</p> <p className="mb20 font-16 clearfix">所属课程</p>
<div className="recommend-list" > <div className="recommend-list" >
{ {
TPMRightSectionData===undefined?"":TPMRightSectionData.paths===undefined?"":TPMRightSectionData.paths.map((i,k)=>{ TPMRightSectionData===undefined?"":TPMRightSectionData.paths===undefined?"":TPMRightSectionData.paths.map((i,k)=>{
@ -164,7 +164,7 @@ class TPMRightSection extends Component {
<div className="padding20 edu-back-white" <div className="padding20 edu-back-white"
style={{ style={{
display: display:
TPMRightSectionData === undefined?"none":TPMRightSectionData.recommands===undefined?"none":TPMRightSectionData.recommands.length === 0 ? "none" : "block" TPMRightSectionData === undefined?"none":TPMRightSectionData.recommands===undefined?"none":TPMRightSectionData.recommands.length === 0 ||TPMRightSectionData.paths===undefined?"":TPMRightSectionData.paths.length === 0 ? "none" : "block"
}} }}
> >
<p className="mb20 font-16 clearfix">推荐实训</p> <p className="mb20 font-16 clearfix">推荐实训</p>

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe ShixunWorkComment, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end
Loading…
Cancel
Save