杨树林 5 years ago
commit 3bb7d666da

@ -67,7 +67,9 @@
<!-- <link rel="stylesheet" type="text/css" href="https://www.educoder.net/stylesheets/css/font-awesome.css?1510652321"> --> <!-- <link rel="stylesheet" type="text/css" href="https://www.educoder.net/stylesheets/css/font-awesome.css?1510652321"> -->
<link rel="stylesheet" type="text/css" href="http://47.96.87.25:48080/stylesheets/educoder/iconfont/iconfont.css"> <!--<link rel="stylesheet" type="text/css" href="http://47.96.87.25:48080/stylesheets/educoder/iconfont/iconfont.css">-->
<!--需要去build js配置-->
<link rel="stylesheet" type="text/css" href="/css/iconfont.css"> <link rel="stylesheet" type="text/css" href="/css/iconfont.css">
<style> <style>
/*<!--去除浏览器点击操作后有蓝色的底块-->*/ /*<!--去除浏览器点击操作后有蓝色的底块-->*/

@ -1,224 +1,225 @@
'use strict'; 'use strict';
// Do this as the first thing so that any code reading it knows the right env. // Do this as the first thing so that any code reading it knows the right env.
process.env.BABEL_ENV = 'production'; process.env.BABEL_ENV = 'production';
process.env.NODE_ENV = 'production'; process.env.NODE_ENV = 'production';
// Makes the script crash on unhandled rejections instead of silently // Makes the script crash on unhandled rejections instead of silently
// ignoring them. In the future, promise rejections that are not handled will // ignoring them. In the future, promise rejections that are not handled will
// terminate the Node.js process with a non-zero exit code. // terminate the Node.js process with a non-zero exit code.
process.on('unhandledRejection', err => { process.on('unhandledRejection', err => {
throw err; throw err;
}); });
// Ensure environment variables are read. // Ensure environment variables are read.
require('../config/env'); require('../config/env');
const path = require('path'); const path = require('path');
const chalk = require('chalk'); const chalk = require('chalk');
const fs = require('fs-extra'); const fs = require('fs-extra');
const webpack = require('webpack'); const webpack = require('webpack');
const config = require('../config/webpack.config.prod'); const config = require('../config/webpack.config.prod');
const paths = require('../config/paths'); const paths = require('../config/paths');
const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles');
const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages');
const printHostingInstructions = require('react-dev-utils/printHostingInstructions'); const printHostingInstructions = require('react-dev-utils/printHostingInstructions');
const FileSizeReporter = require('react-dev-utils/FileSizeReporter'); const FileSizeReporter = require('react-dev-utils/FileSizeReporter');
const printBuildError = require('react-dev-utils/printBuildError'); const printBuildError = require('react-dev-utils/printBuildError');
var CombinedStream = require('combined-stream'); var CombinedStream = require('combined-stream');
var fs2 = require('fs'); var fs2 = require('fs');
const measureFileSizesBeforeBuild = const measureFileSizesBeforeBuild =
FileSizeReporter.measureFileSizesBeforeBuild; FileSizeReporter.measureFileSizesBeforeBuild;
const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild; const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild;
const useYarn = fs.existsSync(paths.yarnLockFile); const useYarn = fs.existsSync(paths.yarnLockFile);
// These sizes are pretty large. We'll warn for bundles exceeding them. // These sizes are pretty large. We'll warn for bundles exceeding them.
const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024; const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024;
const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024; const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024;
// Warn and crash if required files are missing // Warn and crash if required files are missing
if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) {
process.exit(1); process.exit(1);
} }
function removeExceptGitDir(dir) { function removeExceptGitDir(dir) {
// readdirSync // readdirSync
const list = fs2.readdirSync(dir) const list = fs2.readdirSync(dir)
// if (err) return done(err); // if (err) return done(err);
var pending = list.length; var pending = list.length;
// if (!pending) return done(null, results); // if (!pending) return done(null, results);
list.forEach(function(file) { list.forEach(function(file) {
if (file.indexOf('.git') == -1) { if (file.indexOf('.git') == -1) {
file = path.resolve(dir, file); file = path.resolve(dir, file);
fs.removeSync(file) fs.removeSync(file)
} }
}); });
} }
// First, read the current file sizes in build directory. // First, read the current file sizes in build directory.
// This lets us display how much they changed later. // This lets us display how much they changed later.
measureFileSizesBeforeBuild(paths.appBuild) measureFileSizesBeforeBuild(paths.appBuild)
.then(previousFileSizes => { .then(previousFileSizes => {
// Remove all content but keep the directory so that // Remove all content but keep the directory so that
// if you're in it, you don't end up in Trash // if you're in it, you don't end up in Trash
// fs.emptyDirSync(paths.appBuild); // fs.emptyDirSync(paths.appBuild);
console.log('removeExceptGitDir') console.log('removeExceptGitDir')
removeExceptGitDir(paths.appBuild) removeExceptGitDir(paths.appBuild)
console.log('copyPublicFolder') console.log('copyPublicFolder')
// Merge with the public folder // Merge with the public folder
copyPublicFolder(); copyPublicFolder();
// Start the webpack build // Start the webpack build
return build(previousFileSizes); return build(previousFileSizes);
}) })
.then( .then(
({ stats, previousFileSizes, warnings }) => { ({ stats, previousFileSizes, warnings }) => {
if (warnings.length) { if (warnings.length) {
console.log(chalk.yellow('Compiled with warnings.\n')); console.log(chalk.yellow('Compiled with warnings.\n'));
console.log(warnings.join('\n\n')); console.log(warnings.join('\n\n'));
console.log( console.log(
'\nSearch for the ' + '\nSearch for the ' +
chalk.underline(chalk.yellow('keywords')) + chalk.underline(chalk.yellow('keywords')) +
' to learn more about each warning.' ' to learn more about each warning.'
); );
console.log( console.log(
'To ignore, add ' + 'To ignore, add ' +
chalk.cyan('// eslint-disable-next-line') + chalk.cyan('// eslint-disable-next-line') +
' to the line before.\n' ' to the line before.\n'
); );
} else { } else {
console.log(chalk.green('Compiled successfully.\n')); console.log(chalk.green('Compiled successfully.\n'));
} }
console.log('File sizes after gzip:\n'); console.log('File sizes after gzip:\n');
printFileSizesAfterBuild( printFileSizesAfterBuild(
stats, stats,
previousFileSizes, previousFileSizes,
paths.appBuild, paths.appBuild,
WARN_AFTER_BUNDLE_GZIP_SIZE, WARN_AFTER_BUNDLE_GZIP_SIZE,
WARN_AFTER_CHUNK_GZIP_SIZE WARN_AFTER_CHUNK_GZIP_SIZE
); );
console.log(); console.log();
const appPackage = require(paths.appPackageJson); const appPackage = require(paths.appPackageJson);
const publicUrl = paths.publicUrl; const publicUrl = paths.publicUrl;
const publicPath = config.output.publicPath; const publicPath = config.output.publicPath;
const buildFolder = path.relative(process.cwd(), paths.appBuild); const buildFolder = path.relative(process.cwd(), paths.appBuild);
printHostingInstructions( printHostingInstructions(
appPackage, appPackage,
publicUrl, publicUrl,
publicPath, publicPath,
buildFolder, buildFolder,
useYarn useYarn
); );
}, },
err => { err => {
console.log(chalk.red('Failed to compile.\n')); console.log(chalk.red('Failed to compile.\n'));
printBuildError(err); printBuildError(err);
process.exit(1); process.exit(1);
} }
); );
// Create the production build and print the deployment instructions. // Create the production build and print the deployment instructions.
function build(previousFileSizes) { function build(previousFileSizes) {
console.log('Creating an optimized production build...'); console.log('Creating an optimized production build...');
let compiler = webpack(config); let compiler = webpack(config);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
compiler.run((err, stats) => { compiler.run((err, stats) => {
if (err) { if (err) {
return reject(err); return reject(err);
} }
const messages = formatWebpackMessages(stats.toJson({}, true)); const messages = formatWebpackMessages(stats.toJson({}, true));
if (messages.errors.length) { if (messages.errors.length) {
// Only keep the first error. Others are often indicative // Only keep the first error. Others are often indicative
// of the same problem, but confuse the reader with noise. // of the same problem, but confuse the reader with noise.
if (messages.errors.length > 1) { if (messages.errors.length > 1) {
messages.errors.length = 1; messages.errors.length = 1;
} }
return reject(new Error(messages.errors.join('\n\n'))); return reject(new Error(messages.errors.join('\n\n')));
} }
if ( if (
process.env.CI && process.env.CI &&
(typeof process.env.CI !== 'string' || (typeof process.env.CI !== 'string' ||
process.env.CI.toLowerCase() !== 'false') && process.env.CI.toLowerCase() !== 'false') &&
messages.warnings.length messages.warnings.length
) { ) {
console.log( console.log(
chalk.yellow( chalk.yellow(
'\nTreating warnings as errors because process.env.CI = true.\n' + '\nTreating warnings as errors because process.env.CI = true.\n' +
'Most CI servers set it automatically.\n' 'Most CI servers set it automatically.\n'
) )
); );
return reject(new Error(messages.warnings.join('\n\n'))); return reject(new Error(messages.warnings.join('\n\n')));
} }
generateNewIndexJsp(); generateNewIndexJsp();
return resolve({ return resolve({
stats, stats,
previousFileSizes, previousFileSizes,
warnings: messages.warnings, warnings: messages.warnings,
}); });
}); });
}); });
} }
function copyPublicFolder() { function copyPublicFolder() {
fs.copySync(paths.appPublic, paths.appBuild, { fs.copySync(paths.appPublic, paths.appBuild, {
dereference: true, dereference: true,
filter: file => file !== paths.appHtml, filter: file => file !== paths.appHtml,
}); });
} }
function generateNewIndexJsp() { function generateNewIndexJsp() {
// var combinedStream = CombinedStream.create(); // var combinedStream = CombinedStream.create();
var filePath = paths.appBuild + '/index.html'; var filePath = paths.appBuild + '/index.html';
// var htmlContent = fs2.createReadStream( filePath ) // var htmlContent = fs2.createReadStream( filePath )
// stream没有replace方法 // stream没有replace方法
// htmlContent = htmlContent.replace('/js/js_min_all.js', '/react/build/js/js_min_all.js') // htmlContent = htmlContent.replace('/js/js_min_all.js', '/react/build/js/js_min_all.js')
// htmlContent = htmlContent.replace('/css/css_min_all.css', '/react/build/css/css_min_all.css') // htmlContent = htmlContent.replace('/css/css_min_all.css', '/react/build/css/css_min_all.css')
// combinedStream.append(htmlContent); // combinedStream.append(htmlContent);
// combinedStream.pipe(fs2.createWriteStream( filePath )); // combinedStream.pipe(fs2.createWriteStream( filePath ));
var outputPath = paths.appBuild + '/../../../public/react/build/index.html' var outputPath = paths.appBuild + '/../../../public/react/build/index.html'
fs2.readFile(filePath, 'utf8', function (err,data) { fs2.readFile(filePath, 'utf8', function (err,data) {
if (err) { if (err) {
return console.log(err); return console.log(err);
} }
const newVersion = '1.1.1' const newVersion = '1.1.1'
let cdnHost = 'https://shixun.educoder.net' let cdnHost = 'https://shixun.educoder.net'
cdnHost = 'https://cdn-testeduplus2.educoder.net' cdnHost = 'https://cdn-testeduplus2.educoder.net'
cdnHost = '' cdnHost = ''
var result = data.replace('/js/js_min_all.js', `${cdnHost}/react/build/js/js_min_all.js?v=${newVersion}`) var result = data.replace('/js/js_min_all.js', `${cdnHost}/react/build/js/js_min_all.js?v=${newVersion}`)
.replace('/js/js_min_all_2.js', `${cdnHost}/react/build/js/js_min_all_2.js?v=${newVersion}`) .replace('/js/js_min_all_2.js', `${cdnHost}/react/build/js/js_min_all_2.js?v=${newVersion}`)
.replace('/css/css_min_all.css', `${cdnHost}/react/build/css/css_min_all.css?v=${newVersion}`) .replace('/css/css_min_all.css', `${cdnHost}/react/build/css/css_min_all.css?v=${newVersion}`)
.replace('/js/create_kindeditor.js', `${cdnHost}/react/build/js/create_kindeditor.js?v=${newVersion}`) .replace('/css/iconfont.css', `${cdnHost}/react/build/css/iconfont.css?v=${newVersion}`)
.replace('/js/create_kindeditor.js', `${cdnHost}/react/build/js/create_kindeditor.js?v=${newVersion}`)
// .replace('/react/build/./static/css/main', `${cdnHost}/react/build/./static/css/main`)
// .replace('/react/build/./static/js/main', `${cdnHost}/react/build/./static/js/main`) // .replace('/react/build/./static/css/main', `${cdnHost}/react/build/./static/css/main`)
// .replace('/react/build/./static/js/main', `${cdnHost}/react/build/./static/js/main`)
.replace(/https:\/\/testeduplus2.educoder.net/g, '');
// .replace(/http:\/\/testbdweb.educoder.net/g, ''); .replace(/https:\/\/testeduplus2.educoder.net/g, '');
// .replace(/http:\/\/testbdweb.educoder.net/g, '');
// .replace('/css/css_min_all.css', '/react/build/css/css_min_all.css');
// .replace('/css/css_min_all.css', '/react/build/css/css_min_all.css');
fs2.writeFile(outputPath, result, 'utf8', function (err) {
if (err) return console.log(err); fs2.writeFile(outputPath, result, 'utf8', function (err) {
commitAndPush(); if (err) return console.log(err);
}); commitAndPush();
}); });
} });
}
function commitAndPush() {
var exec = require('child_process').exec; function commitAndPush() {
function puts(error, stdout, stderr) { console.log(stdout) } var exec = require('child_process').exec;
var options = {cwd:"./build"}; function puts(error, stdout, stderr) { console.log(stdout) }
exec("git status && git commit -am 'b' && git push", options, puts); var options = {cwd:"./build"};
exec("git status && git commit -am 'b' && git push", options, puts);
} }

@ -1,6 +1,6 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { getUrl2 } from 'educoder' import { getUrl2, isDev } from 'educoder'
const $ = window.$ const $ = window.$
let _url_origin = getUrl2() let _url_origin = getUrl2()
@ -81,18 +81,19 @@ class Cropper extends Component {
$.ajaxSetup({ $.ajaxSetup({
cache: true cache: true
}); });
const isDev = isDev()
let _path = isDev ? 'public' : 'build'
$('head').append($('<link rel="stylesheet" type="text/css" />') $('head').append($('<link rel="stylesheet" type="text/css" />')
.attr('href', `${_url_origin}/react/public/js/cropper/cropper.min.css`)); .attr('href', `${_url_origin}/react/${_path}/js/cropper/cropper.min.css`));
$.getScript( $.getScript(
`${_url_origin}/react/public/js/cropper/cropper.js`, `${_url_origin}/react/${_path}/js/cropper/cropper.js`,
(data, textStatus, jqxhr) => { (data, textStatus, jqxhr) => {
}); });
$.getScript( $.getScript(
`${_url_origin}/react/public/js/cropper/html2canvas.min.js`, `${_url_origin}/react/${_path}/js/cropper/html2canvas.min.js`,
(data, textStatus, jqxhr) => { (data, textStatus, jqxhr) => {
}); });

@ -37,7 +37,8 @@ function buildColumns(that) {
dataIndex: 'name', dataIndex: 'name',
key: 'index', key: 'index',
render: (content, item, index) => { render: (content, item, index) => {
return <a href="javascript:;">{(that.state.page - 1) * 20 + index + 1} </a> return item.isApply == true ? '' : <a href="javascript:;">{(that.state.page - 1) * 20 + index + 1
- (that.application_list ? that.application_list.length : 0)} </a>
} }
} }
// ,{ // ,{
@ -546,6 +547,7 @@ class studentsList extends Component{
const combineArray = teachers.slice(0) const combineArray = teachers.slice(0)
if (page == 1) { if (page == 1) {
this.state.application_list && this.state.application_list.slice(0).reverse().forEach(item => { this.state.application_list && this.state.application_list.slice(0).reverse().forEach(item => {
item.isApply = true
combineArray.unshift(item) combineArray.unshift(item)
}) })
} }

@ -356,9 +356,9 @@ class ShixunhomeWorkItem extends Component{
` `
} }
</style> </style>
{this.props.isAdmin?<div className={this.props.isAdminOrTeacher()?"homepagePostSetting homepagePostSettingname":"homepagePostSetting homepagePostSettingbox"} style={{"right":"-2px","top":"44px","display":"block"}}> {this.props.isAdmin?<div className={this.props.isAdminOrCreator()?"homepagePostSetting homepagePostSettingname":"homepagePostSetting homepagePostSettingbox"} style={{"right":"-2px","top":"44px","display":"block"}}>
<a className="btn colorblue font-16" href={"/shixuns/"+discussMessage.shixun_identifier+"/challenges"} target={"_blank"}>实训详情</a> <a className="btn colorblue font-16" href={"/shixuns/"+discussMessage.shixun_identifier+"/challenges"} target={"_blank"}>实训详情</a>
{this.props.isAdminOrTeacher()?<a onClick={()=>this.editname(discussMessage.name,discussMessage.homework_id)} className={"btn colorblue ml20 font-16"}>重命名</a>:""} {this.props.isAdminOrCreator()?<a onClick={()=>this.editname(discussMessage.name,discussMessage.homework_id)} className={"btn colorblue ml20 font-16"}>重命名</a>:""}
<WordsBtn className="btn colorblue ml20 font-16" to={`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/settings`} > 设置</WordsBtn> <WordsBtn className="btn colorblue ml20 font-16" to={`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/settings`} > 设置</WordsBtn>
</div>:""} </div>:""}

@ -6,6 +6,8 @@ import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom";
// import "antd/dist/antd.css"; // import "antd/dist/antd.css";
import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor';
import axios from 'axios'; import axios from 'axios';
import './css/TPMchallengesnew.css'; import './css/TPMchallengesnew.css';
@ -28,129 +30,10 @@ const Option = Select.Option;
const RadioGroup = Radio.Group; const RadioGroup = Radio.Group;
// 恢复数据
function md_rec_data(k,mdu,id, editor){
if(window.sessionStorage.getItem(k+mdu) !== null){
editor.setValue(window.sessionStorage.getItem(k+mdu));
md_clear_data(k,mdu,id);
}
}
// 保存数据
function md_add_data(k,mdu,d){
window.sessionStorage.setItem(k+mdu,d);
}
// 清空保存的数据
function md_clear_data(k,mdu,id){
window.sessionStorage.removeItem(k+mdu);
var id1 = "#e_tip_"+id;
var id2 = "#e_tips_"+id;
if(k == 'content'){
$(id2).html("");
}else{
$(id1).html("");
}
}
function md_elocalStorage(editor,mdu,id){
if (window.sessionStorage){
var oc = window.sessionStorage.getItem('content'+mdu);
if(oc !== null ){
$("#e_tips_"+id).data('editor', editor);
var h = '您上次有已保存的数据,是否<a style="cursor: pointer;" class="link-color-blue" onclick="md_rec_data(\'content\',\''+ mdu + '\',\'' + id + '\')">恢复</a> ? / <a style="cursor: pointer;" class="link-color-blue" onclick="md_clear_data(\'content\',\''+ mdu + '\',\'' + id + '\')">不恢复</a>';
$("#e_tips_"+id).html(h);
}
setInterval(function() {
var d = new Date();
var h = d.getHours();
var m = d.getMinutes();
var s = d.getSeconds();
h = h < 10 ? '0' + h : h;
m = m < 10 ? '0' + m : m;
s = s < 10 ? '0' + s : s;
if(editor.getValue().trim() != ""){
md_add_data("content",mdu,editor.getValue());
var id1 = "#e_tip_"+id;
var id2 = "#e_tips_"+id;
$(id1).html(" 数据已于 " + h + ':' + m + ':' + s +" 保存 ");
$(id2).html("");
}
},10000);
}else{
$("#e_tip_"+id).after('您的浏览器不支持localStorage.无法开启自动保存草稿服务,请升级浏览器!');
}
}
function create_editorMD(id, width, high, placeholder, imageUrl, callback) {
var editorName = window.editormd(id, {
width: width,
height: high,
path: path, // "/editormd/lib/"
syncScrolling: "single",
tex: true,
tocm: true,
emoji: true,
taskList: true,
codeFold: true,
searchReplace: true,
htmlDecode: "style,script,iframe",
sequenceDiagram: true,
autoFocus: false,
toolbarIcons: function () {
// Or return editormd.toolbarModes[name]; // full, simple, mini
// Using "||" set icons align right.
return ["bold", "italic", "|", "list-ul", "list-ol", "|", "code", "code-block", "|", "testIcon", "testIcon1", '|', "image", "table", '|', "watch", "clear"]
},
toolbarCustomIcons: {
testIcon: "<a type=\"inline\" class=\"latex\" ><div class='zbg'></div></a>",
testIcon1: "<a type=\"latex\" class=\"latex\" ><div class='zbg_latex'></div></a>"
},
//这个配置在simple.html中并没有但是为了能够提交表单使用这个配置可以让构造出来的HTML代码直接在第二个隐藏的textarea域中方便post提交表单。
saveHTMLToTextarea: true,
// 用于增加自定义工具栏的功能可以直接插入HTML标签不使用默认的元素创建图标
dialogMaskOpacity: 0.6,
placeholder: placeholder,
imageUpload: true,
imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"],
imageUploadURL: imageUrl,//url
onload: function () {
// this.previewing();
$("#" + id + " [type=\"latex\"]").bind("click", function () {
editorName.cm.replaceSelection("```latex");
editorName.cm.replaceSelection("\n");
editorName.cm.replaceSelection("\n");
editorName.cm.replaceSelection("```");
var __Cursor = editorName.cm.getDoc().getCursor();
editorName.cm.setCursor(__Cursor.line - 1, 0);
});
$("#" + id + " [type=\"inline\"]").bind("click", function () {
editorName.cm.replaceSelection("$$$$");
var __Cursor = editorName.cm.getDoc().getCursor();
editorName.cm.setCursor(__Cursor.line, __Cursor.ch - 2);
editorName.cm.focus();
});
$("[type=\"inline\"]").attr("title", "行内公式");
$("[type=\"latex\"]").attr("title", "多行公式");
md_elocalStorage(editorName, `exercise__${id}`, "Memochallengesnew");
callback && callback()
}
});
return editorName;
}
export default class TPMchallengesnew extends Component { export default class TPMchallengesnew extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.exercisememoMDRef=React.createRef();
this.state = { this.state = {
choice_url: undefined, choice_url: undefined,
practice_url: undefined, practice_url: undefined,
@ -180,52 +63,6 @@ export default class TPMchallengesnew extends Component {
} }
exerciseMD(initValue, id) {
this.contentChanged = false;
const placeholder = "";
// amp;
// 编辑时要传memoId
const imageUrl = `/api/attachments.json`;
// 创建editorMd
const exercise_editormd = create_editorMD(id, '100%', 400, placeholder, imageUrl, () => {
setTimeout(() => {
exercise_editormd.resize()
exercise_editormd.cm && exercise_editormd.cm.refresh()
}, 500)
if (initValue != undefined) {
exercise_editormd.setValue(initValue)
}
exercise_editormd.cm.on("change", (_cm, changeObj) => {
console.log('....contentChanged')
this.contentChanged = true;
})
});
this.exercise_editormd = exercise_editormd;
window.exercise_editormd = exercise_editormd;
}
formatSearch = (url) => {
if (typeof url !== "undefined") {
url = url.substr(1); //从起始索引号提取字符串中指定数目的字符
var arr = url.split("&"), //把字符串分割为字符串数组
obj = {},
newarr = [];
arr.forEach(function (v, i) { //数组遍历
// console.log(v);
// console.log(i);
newarr = v.split("=");
if (typeof obj[newarr[0]] === "undefined") {
obj[newarr[0]] = newarr[1];
}
});
return obj;
}
;
}
componentDidMount() { componentDidMount() {
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
let checkpointId=this.props.match.params.checkpointId; let checkpointId=this.props.match.params.checkpointId;
@ -244,9 +81,11 @@ export default class TPMchallengesnew extends Component {
position: response.data.position, position: response.data.position,
task_pass_default: response.data.task_pass_default, task_pass_default: response.data.task_pass_default,
submit_url: response.data.submit_url, submit_url: response.data.submit_url,
checkpointId:checkpointId checkpointId:checkpointId,
exercisememoMDRefval:response.data.task_pass_default
}) })
this.exerciseMD(response.data.task_pass_default, "exercisememoMD");
this.exercisememoMDRef.current.setValue(response.data.task_pass_default||'')
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
}); });
@ -296,11 +135,13 @@ export default class TPMchallengesnew extends Component {
exec_time:response.data.exec_time, exec_time:response.data.exec_time,
tab2url: "/shixuns/" + id + "/challenges/"+checkpointId+"/tab=2", tab2url: "/shixuns/" + id + "/challenges/"+checkpointId+"/tab=2",
tab3url: "/shixuns/" + id + "/challenges/"+checkpointId+"/tab=3", tab3url: "/shixuns/" + id + "/challenges/"+checkpointId+"/tab=3",
exercisememoMDRefval:response.data.task_pass
}) })
if(response.data.power===false){ if(response.data.power===false){
this.props.showSnackbar("你没有权限修改"); this.props.showSnackbar("你没有权限修改");
} }
this.exerciseMD(response.data.task_pass, "exercisememoMD");
this.exercisememoMDRef.current.setValue(response.data.task_pass||'')
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
}); });
@ -372,8 +213,7 @@ export default class TPMchallengesnew extends Component {
return return
} }
const exercise_editormdvalue = this.exercise_editormd.getValue(); const exercise_editormdvalue = this.exercisememoMDRef.current.getValue().trim();
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
let url = "/shixuns/" + id + "/challenges.json"; let url = "/shixuns/" + id + "/challenges.json";
@ -457,7 +297,7 @@ export default class TPMchallengesnew extends Component {
let {shixunCreatePractice, shixunCreatePracticeGroup, onshixunsmarkvalue, shixunsskillvaluelist,checkpointId,exec_time} = this.state; let {shixunCreatePractice, shixunCreatePracticeGroup, onshixunsmarkvalue, shixunsskillvaluelist,checkpointId,exec_time} = this.state;
const exercise_editormdvalue = this.exercise_editormd.getValue(); const exercise_editormdvalue = this.exercisememoMDRef.current.getValue().trim();
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
@ -631,11 +471,9 @@ export default class TPMchallengesnew extends Component {
<p className="color-grey-6 font-16 mb30">过关任务</p> <p className="color-grey-6 font-16 mb30">过关任务</p>
<div className="padding10-20 edu-back-greyf5 radius4" id="exercisememoMD"> <TPMMDEditor ref={this.exercisememoMDRef} placeholder="请输入选择题的题干内容" mdID={'exercisememoMD'} refreshTimeout={1500}
<textarea style={{display: 'none'}} onInput={this.Executiveorder} id="exercisememoMD_show" name="content"> </textarea> watch={true} className="courseMessageMD" initValue={this.state.exercisememoMDRefval}></TPMMDEditor>
<div className="CodeMirror cm-s-defualt">
</div>
</div>
<p id="e_tip_Memochallengesnew" className="edu-txt-right color-grey-cd font-12"></p> <p id="e_tip_Memochallengesnew" className="edu-txt-right color-grey-cd font-12"></p>
<p id="e_tips_Memochallengesnew" className="edu-txt-right color-grey-cd font-12"></p> <p id="e_tips_Memochallengesnew" className="edu-txt-right color-grey-cd font-12"></p>
</div> </div>

@ -1,306 +1,306 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Select, Input } from 'antd'; import { Select, Input } from 'antd';
import 'antd/lib/style/index.css'; import 'antd/lib/style/index.css';
import 'antd/lib/select/style/index.css'; import 'antd/lib/select/style/index.css';
import 'antd/lib/input/style/index.css'; import 'antd/lib/input/style/index.css';
import './shixunCss/ShixunSearchBar.css'; import './shixunCss/ShixunSearchBar.css';
import axios from 'axios'; import axios from 'axios';
const $ = window.$; const $ = window.$;
const Option = Select.Option; const Option = Select.Option;
const Search = Input.Search; const Search = Input.Search;
class ShixunSearchBar extends Component { class ShixunSearchBar extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = { this.state = {
status: undefined, status: undefined,
diff: undefined, diff: undefined,
InputValue: undefined, InputValue: undefined,
shixunhoverData: [], shixunhoverData: [],
shixunchildValues:'', shixunchildValues:'',
shixunsearchAllvalue:"a", shixunsearchAllvalue:"a",
openStatus:false, openStatus:false,
openLevel:false openLevel:false
} }
} }
//状态筛选 //状态筛选
status_search = (value) => { status_search = (value) => {
let newvalue = value; let newvalue = value;
if (newvalue === "0") { if (newvalue === "0") {
newvalue = " " newvalue = " "
} else if (newvalue === "1") { } else if (newvalue === "1") {
newvalue = 2 newvalue = 2
} else if (newvalue === "2") { } else if (newvalue === "2") {
newvalue = 1 newvalue = 1
} else if (newvalue === "3") { } else if (newvalue === "3") {
newvalue = 3 newvalue = 3
} }
this.setState({ this.setState({
status: newvalue, status: newvalue,
openStatus:false openStatus:false
}) })
let list = [{'type': 1}, {'value': newvalue}]; let list = [{'type': 1}, {'value': newvalue}];
this.props.StatusEnquiry(list); this.props.StatusEnquiry(list);
} }
//难度筛选 //难度筛选
diff_search = (value) => { diff_search = (value) => {
this.setState({ this.setState({
diff: value, diff: value,
openLevel:false openLevel:false
}) })
let list=[{'type':2},{'value':value}]; let list=[{'type':2},{'value':value}];
this.props.StatusEnquiry(list); this.props.StatusEnquiry(list);
} }
//输入框搜索 //输入框搜索
Input_search = (value) => { Input_search = (value) => {
this.setState({ this.setState({
InputValue: value InputValue: value
}) })
this.props.OnSearchInput(value); this.props.OnSearchInput(value);
} }
//查询 //查询
shixunsearchAll = (e) => { shixunsearchAll = (e) => {
let{shixunsearchAllvalue}=this.state; let{shixunsearchAllvalue}=this.state;
let id = e.target.value; let id = e.target.value;
if(shixunsearchAllvalue===id){ if(shixunsearchAllvalue===id){
return return
} }
if(id===0){ if(id===0){
id=" " id=" "
this.setState({ this.setState({
InputValue: " " InputValue: " "
}) })
this.props.OnSearchInput(""); this.props.OnSearchInput("");
} }
let list=[{'tag_level':1},{'tag_id':id}]; let list=[{'tag_level':1},{'tag_id':id}];
if(id!=undefined){ if(id!=undefined){
this.setState({ this.setState({
shixunsearchAllvalue:id, shixunsearchAllvalue:id,
shixunchildValues:"" shixunchildValues:""
}) })
this.props.Updatasearchlist(list); this.props.Updatasearchlist(list);
} }
} }
shixunsearchall=(e)=>{ shixunsearchall=(e)=>{
let{shixunsearchAllvalue}=this.state; let{shixunsearchAllvalue}=this.state;
let id = "a"; let id = "a";
if(shixunsearchAllvalue===id){ if(shixunsearchAllvalue===id){
return return
} }
this.setState({ this.setState({
shixunsearchAllvalue:"a", shixunsearchAllvalue:"a",
shixunchildValues:"" shixunchildValues:""
}) })
this.props.allUpdatashixunlist(); this.props.allUpdatashixunlist();
} }
//选择Tab页详情 //选择Tab页详情
getshixunchildValue = (e) => { getshixunchildValue = (e) => {
let id = e.target.name; let id = e.target.name;
let newid=e.target.id; let newid=e.target.id;
let list=[{'tag_level':2},{'tag_id':id}]; let list=[{'tag_level':2},{'tag_id':id}];
if(id!=undefined||newid!=undefined){ if(id!=undefined||newid!=undefined){
this.setState({ this.setState({
shixunsearchAllvalue:newid shixunsearchAllvalue:newid
}) })
this.props.Updatasearchlist(list); this.props.Updatasearchlist(list);
} }
} }
getshixunchildValues = (e) => { getshixunchildValues = (e) => {
let id = e.target.id; let id = e.target.id;
let newid=e.target.name; let newid=e.target.name;
let list=[{'tag_level':3},{'tag_id':id}]; let list=[{'tag_level':3},{'tag_id':id}];
if(id!=undefined||newid!=undefined){ if(id!=undefined||newid!=undefined){
this.setState({ this.setState({
shixunchildValues:id, shixunchildValues:id,
shixunsearchAllvalue:newid shixunsearchAllvalue:newid
}) })
this.props.Updatasearchlist(list); this.props.Updatasearchlist(list);
} }
} }
componentDidMount() { componentDidMount() {
let hoverUrlArr = []; let hoverUrlArr = [];
let hoverUrl = `/shixuns/menus.json`; let hoverUrl = `/shixuns/menus.json`;
axios.get(hoverUrl axios.get(hoverUrl
).then((response) => { ).then((response) => {
hoverUrlArr = response.data; hoverUrlArr = response.data;
hoverUrlArr.reverse(); hoverUrlArr.reverse();
this.setState({ this.setState({
shixunhoverData: hoverUrlArr shixunhoverData: hoverUrlArr
}) })
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
}) })
} }
// componentWillReceiveProps(nextProps) { // componentWillReceiveProps(nextProps) {
// console.log(nextProps.parsedid) // console.log(nextProps.parsedid)
// if(nextProps.newtag_level===1){ // if(nextProps.newtag_level===1){
// this.setState({ // this.setState({
// InputValue: this.props.keyword, // InputValue: this.props.keyword,
// shixunsearchAllvalue:nextProps.parsedid // shixunsearchAllvalue:nextProps.parsedid
// //
// }) // })
// }else if(nextProps.newtag_level===2){ // }else if(nextProps.newtag_level===2){
// this.setState({ // this.setState({
// InputValue: this.props.keyword, // InputValue: this.props.keyword,
// shixunsearchAllvalue:nextProps.newpalce, // shixunsearchAllvalue:nextProps.newpalce,
// shixunchildValues:nextProps.parsedid // shixunchildValues:nextProps.parsedid
// //
// }) // })
// }else if(nextProps.newtag_level===3){ // }else if(nextProps.newtag_level===3){
// this.setState({ // this.setState({
// InputValue: this.props.keyword, // InputValue: this.props.keyword,
// shixunsearchAllvalue:nextProps.newpalce, // shixunsearchAllvalue:nextProps.newpalce,
// shixunchildValues:nextProps.parsedid // shixunchildValues:nextProps.parsedid
// //
// }) // })
// } // }
// //
// //
// } // }
openStatusOption=()=>{ openStatusOption=()=>{
this.setState({ this.setState({
openLevel:false, openLevel:false,
openStatus:true openStatus:true
}) })
} }
openLevelOption=()=>{ openLevelOption=()=>{
this.setState({ this.setState({
openLevel:true, openLevel:true,
openStatus:false openStatus:false
}) })
} }
openStatusOptions=()=>{ openStatusOptions=()=>{
this.setState({ this.setState({
openLevel:false, openLevel:false,
openStatus:false openStatus:false
}) })
} }
Input_searchs = (e) => { Input_searchs = (e) => {
this.setState({ this.setState({
InputValue: e.target.value InputValue: e.target.value
}) })
} }
render() { render() {
let {shixunhoverData, shixunchildValues, shixunsearchAllvalue, InputValue,openStatus,openLevel} = this.state; let {shixunhoverData, shixunchildValues, shixunsearchAllvalue, InputValue,openStatus,openLevel} = this.state;
let {typepvisible} = this.props; let {typepvisible} = this.props;
//实训首页筛选的移入和点击事件 //实训首页筛选的移入和点击事件
$(".shaiItem").hover(function(){ $(".shaiItem").hover(function(){
var hei=parseInt($(".shaiAllItem").height())-2; var hei=parseInt($(".shaiAllItem").height())-2;
$(this).find(".subshaicontent").css("top", '34px'); $(this).find(".subshaicontent").css("top", '34px');
$(this).find(".subshaicontent").show(); $(this).find(".subshaicontent").show();
},function(){ },function(){
$(this).find(".subshaicontent").hide(); $(this).find(".subshaicontent").hide();
}); });
$(".shaiItem").live("click",function(){ $(".shaiItem").live("click",function(){
$(".shaiItem").removeClass("active"); $(".shaiItem").removeClass("active");
$(this).addClass("active"); $(this).addClass("active");
$(".subshaicontent").hide(); $(".subshaicontent").hide();
}); });
$(".subshaicontent").live("click", function(event){ $(".subshaicontent").live("click", function(event){
$(".subshaicontent").hide(); $(".subshaicontent").hide();
event.stopPropagation(); event.stopPropagation();
}); });
return ( return (
<div className="edu-back-white" > <div className="edu-back-white" >
<div className="educontent"> <div className="educontent">
<div className="pt40 pb40"> <div className="pt40 pb40">
<div className="clearfix mb30 shaiContent"> <div className="clearfix mb30 shaiContent">
<span className="shaiTitle fl mt3">方向</span> <span className="shaiTitle fl mt3">方向</span>
<div className="fl pr shaiAllItem"> <div className="fl pr shaiAllItem">
<li className={shixunsearchAllvalue==="a"?"shaiItem shixun_repertoire active":"shaiItem shixun_repertoire"} value= "a" onClick={this.shixunsearchall}>全部</li> <li className={shixunsearchAllvalue==="a"?"shaiItem shixun_repertoire active":"shaiItem shixun_repertoire"} value= "a" onClick={this.shixunsearchall}>全部</li>
{ {
shixunhoverData.map((item,key)=>{ shixunhoverData.map((item,key)=>{
return( return(
<li key={key} className={parseInt(shixunsearchAllvalue)===item.id?"shaiItem shixun_repertoire active":"shaiItem shixun_repertoire"} value={item.id} onClick={this.shixunsearchAll}> <li key={key} className={parseInt(shixunsearchAllvalue)===item.id?"shaiItem shixun_repertoire active":"shaiItem shixun_repertoire"} value={item.id} onClick={this.shixunsearchAll}>
{item.name} {item.name}
<div className="subshaicontent" id={item.id+"show"} style={{ top: '33px', display: 'none',maxHeight: '400px' }}> <div className="subshaicontent" id={item.id+"show"} style={{ top: '33px', display: 'none',maxHeight: '400px' }}>
{ {
item.sub_repertoires.map((list,k)=>{ item.sub_repertoires.map((list,k)=>{
return( return(
<div className="mt20 pb10 subshaicontent-part" key={k}> <div className="mt20 pb10 subshaicontent-part" key={k}>
<a style={{ height: '20px' }} className={ "mb15 shixun_repertoire color-dark"} name={list.id} id={item.id} onClick={this.getshixunchildValue}>{list.name}</a> <a style={{ height: '20px' }} className={ "mb15 shixun_repertoire color-dark"} name={list.id} id={item.id} onClick={this.getshixunchildValue}>{list.name}</a>
<div className="sub-Item clearfix"> <div className="sub-Item clearfix">
{ {
list.tags.map((tag,e)=>{ list.tags.map((tag,e)=>{
return( return(
<a className={parseInt(shixunchildValues)===tag.id?"shixun_repertoire active":"shixun_repertoire"} key={e} id={tag.id} name={item.id} title="subshaicontentshow" rel="subshaicontent" onClick={this.getshixunchildValues}>{tag.name}</a> <a className={parseInt(shixunchildValues)===tag.id?"shixun_repertoire active":"shixun_repertoire"} key={e} id={tag.id} name={item.id} title="subshaicontentshow" rel="subshaicontent" onClick={this.getshixunchildValues}>{tag.name}</a>
) )
}) })
} }
</div> </div>
</div> </div>
) )
}) })
} }
</div> </div>
</li> </li>
) )
}) })
} }
</div> </div>
</div> </div>
<div className="clearfix"> <div className="clearfix">
<span className="shaiTitle fl mt6">筛选</span> <span className="shaiTitle fl mt6">筛选</span>
<div className="fl" onMouseLeave={this.openStatusOptions} id={"area"}> <div className="fl" onMouseLeave={this.openStatusOptions} id={"area"}>
{/*<Select className="statusSelect" defaultValue="0" style={{ width: 120 }} onChange={this.status_search} onMouseEnter={this.openStatusOption} open={openStatus}>*/} {/*<Select className="statusSelect" defaultValue="0" style={{ width: 120 }} onChange={this.status_search} onMouseEnter={this.openStatusOption} open={openStatus}>*/}
{/*<Option value="0" type="status">全部状态</Option>*/} {/*<Option value="0" type="status">全部状态</Option>*/}
{/*<Option value="1" type="status">已发布</Option>*/} {/*<Option value="1" type="status">已发布</Option>*/}
{/*<Option value="2" type="status">未发布</Option>*/} {/*<Option value="2" type="status">未发布</Option>*/}
{/*<Option value="3" type="status">已关闭</Option>*/} {/*<Option value="3" type="status">已关闭</Option>*/}
{/*</Select>*/} {/*</Select>*/}
<Select defaultValue="0" style={{ width: 120 }} onChange={this.diff_search} onMouseEnter={this.openLevelOption} open={openLevel} getPopupContainer={() => document.getElementById("area")}> <Select defaultValue="0" style={{ width: 120 }} onChange={this.diff_search} onMouseEnter={this.openLevelOption} open={openLevel} getPopupContainer={() => document.getElementById("area")}>
<Option value="0">全部难度</Option> <Option value="0">全部难度</Option>
<Option value="1">初级学员</Option> <Option value="1">初级学员</Option>
<Option value="2">中级学员</Option> <Option value="2">中级学员</Option>
<Option value="3">高级学员</Option> <Option value="3">高级学员</Option>
<Option value="4">顶级学员</Option> <Option value="4">顶级学员</Option>
</Select> </Select>
</div> </div>
{/*<div className="fr mt3">*/} {/*<div className="fr mt3">*/}
{/*<Search*/} {/*<Search*/}
{/*style={{ width: 300 }}*/} {/*style={{ width: 300 }}*/}
{/*class="search-new-input fl"*/} {/*class="search-new-input fl"*/}
{/*placeholder="请输入创建者或名称进行搜索"*/} {/*placeholder="请输入创建者或名称进行搜索"*/}
{/*value={InputValue}*/} {/*value={InputValue}*/}
{/*onInput={this.Input_searchs}*/} {/*onInput={this.Input_searchs}*/}
{/*onSearch={value => this.Input_search(value)}*/} {/*onSearch={value => this.Input_search(value)}*/}
{/*enterButton*/} {/*enterButton*/}
{/*/>*/} {/*/>*/}
{/*</div>*/} {/*</div>*/}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
); );
} }
} }
export default ShixunSearchBar; export default ShixunSearchBar;

@ -41,7 +41,7 @@ class ShixunsIndex extends Component {
parsedid:undefined, parsedid:undefined,
newtag_level:undefined, newtag_level:undefined,
newpalce:undefined, newpalce:undefined,
sort:undefined sort:"desc"
} }
} }
componentDidMount(){ componentDidMount(){
@ -100,6 +100,8 @@ class ShixunsIndex extends Component {
} }
allUpdatashixunlist=()=>{ allUpdatashixunlist=()=>{
let{sort}=this.state;
this.setState({ this.setState({
order_by: 'publish_time', order_by: 'publish_time',
tag_level: 1, tag_level: 1,
@ -109,8 +111,8 @@ class ShixunsIndex extends Component {
keyword:'', keyword:'',
status: 0, status: 0,
diff: 0, diff: 0,
}) })
let params={ let params={
order_by: 'publish_time', order_by: 'publish_time',
tag_level: 1, tag_level: 1,
@ -120,6 +122,7 @@ class ShixunsIndex extends Component {
keyword:'', keyword:'',
status: 0, status: 0,
diff: 0, diff: 0,
sort:sort
} }
this.shixunresultend(params) this.shixunresultend(params)
} }
@ -135,7 +138,7 @@ class ShixunsIndex extends Component {
typepvisible:true typepvisible:true
}) })
let {order_by, page, limit, keyword, status, diff} = this.state; let {order_by, sort, limit, keyword, status, diff} = this.state;
let params={ let params={
order_by:order_by, order_by:order_by,
@ -146,6 +149,7 @@ class ShixunsIndex extends Component {
keyword:keyword, keyword:keyword,
status:status, status:status,
diff:diff, diff:diff,
sort:sort
} }
this.shixunresultend(params) this.shixunresultend(params)
@ -192,7 +196,7 @@ class ShixunsIndex extends Component {
typepvisible:true, typepvisible:true,
pages:1 pages:1
}) })
let {order_by, tag_level, tag_id, page, limit, status, diff} = this.state; let {order_by, tag_level, tag_id, sort, limit, status, diff} = this.state;
let params= { let params= {
order_by:order_by, order_by:order_by,
tag_level:tag_level, tag_level:tag_level,
@ -202,6 +206,7 @@ class ShixunsIndex extends Component {
keyword:value, keyword:value,
status:status, status:status,
diff:diff, diff:diff,
sort:sort
} }
this.shixunresultend(params) this.shixunresultend(params)
}else{ }else{
@ -247,7 +252,7 @@ class ShixunsIndex extends Component {
typepvisible:true, typepvisible:true,
pages:value pages:value
}) })
let {order_by, tag_level, tag_id, limit, keyword, status, diff} = this.state; let {order_by, tag_level, tag_id, limit, keyword, status, diff,sort} = this.state;
let params= { let params= {
order_by:order_by, order_by:order_by,
tag_level:tag_level, tag_level:tag_level,
@ -257,6 +262,7 @@ class ShixunsIndex extends Component {
keyword:keyword, keyword:keyword,
status:status, status:status,
diff:diff, diff:diff,
sort:sort
} }
let Url=`/shixuns.json`; let Url=`/shixuns.json`;

Loading…
Cancel
Save