Merge branches 'dev_aliyun' and 'new_shixuns_repository' of https://bdgit.educoder.net/Hjqreturn/educoder into new_shixuns_repository

dev_static
杨树明 5 years ago
commit 98b1053056

@ -10,6 +10,7 @@ class Admins::BaseController < ApplicationController
before_action :require_login, :require_admin! before_action :require_login, :require_admin!
after_action :rebind_event_if_ajax_render_partial after_action :rebind_event_if_ajax_render_partial
skip_before_action :check_sign
private private

@ -61,7 +61,7 @@ class Admins::UsersController < Admins::BaseController
private private
def update_params def update_params
params.require(:user).permit(%i[lastname nickname gender identity technical_title student_id params.require(:user).permit(%i[lastname nickname gender identity technical_title student_id is_shixun_marker
mail phone location location_city school_id department_id admin business is_test mail phone location location_city school_id department_id admin business is_test
password professional_certification authentication]) password professional_certification authentication])
end end

@ -24,17 +24,21 @@ class ApplicationController < ActionController::Base
# 所有请求必须合法签名 # 所有请求必须合法签名
def check_sign def check_sign
Rails.logger.info("66666 #{params}") Rails.logger.info("66666 #{params}")
suffix = request.url.split(".").last
suffix_arr = ["xls", "xlsx"] # excel文件先注释
unless suffix_arr.include?(suffix)
if params[:client_key].present? if params[:client_key].present?
Rails.logger.info("111111 #{params[:client_key]}") randomcode = params[:randomcode]
Rails.logger.info("00000 #{params[:timestamp]}") tip_exception(501, "请求不合理") unless (Time.now.to_i - randomcode.to_i).between?(0,5)
timestamp = params[:timestamp]
sign = Digest::MD5.hexdigest("#{OPENKEY}#{timestamp}") sign = Digest::MD5.hexdigest("#{OPENKEY}#{randomcode}")
Rails.logger.info("2222 #{sign}") Rails.logger.info("2222 #{sign}")
tip_exception(501, "请求不合理") if sign != params[:client_key] tip_exception(501, "请求不合理") if sign != params[:client_key]
else else
tip_exception(501, "请求不合理") tip_exception(501, "请求不合理")
end end
end end
end
# 全局配置参数 # 全局配置参数
# 返回name对应的value # 返回name对应的value
@ -42,6 +46,12 @@ class ApplicationController < ActionController::Base
EduSetting.get(name) EduSetting.get(name)
end end
def shixun_marker
unless current_user.is_shixun_marker? || current_user.admin_or_business?
tip_exception(403, "..")
end
end
# 实训的访问权限 # 实训的访问权限
def shixun_access_allowed def shixun_access_allowed
if !current_user.shixun_permission(@shixun) if !current_user.shixun_permission(@shixun)

@ -5,6 +5,7 @@ class AttachmentsController < ApplicationController
before_action :require_login, :check_auth, except: [:show] before_action :require_login, :check_auth, except: [:show]
before_action :find_file, only: %i[show destroy] before_action :find_file, only: %i[show destroy]
before_action :attachment_candown, only: [:show] before_action :attachment_candown, only: [:show]
skip_before_action :check_sign, only: [:show, :create]
include ApplicationHelper include ApplicationHelper

@ -1,4 +1,6 @@
class DepartmentsController < ApplicationController class DepartmentsController < ApplicationController
skip_before_action :check_sign
def for_option def for_option
render_ok(departments: current_school.departments.without_deleted.select(:id, :name).as_json) render_ok(departments: current_school.departments.without_deleted.select(:id, :name).as_json)
end end

@ -44,12 +44,13 @@ class HacksController < ApplicationController
begin begin
logger.info("##########{hack_params}") logger.info("##########{hack_params}")
hack = Hack.new(hack_params) hack = Hack.new(hack_params)
ActiveRecord::Base.transaction do
hack.user_id = current_user.id hack.user_id = current_user.id
hack.identifier = generate_identifier Hack, 8 hack.identifier = generate_identifier Hack, 8
ActiveRecord::Base.transaction do
hack.save! hack.save!
# 创建测试集与代码 # 创建测试集与代码
hack.hack_sets.create!(hack_sets_params) hack.hack_sets.create!(hack_sets_params)
# 新建知识点
hack_codes = hack.hack_codes.new(hack_code_params) hack_codes = hack.hack_codes.new(hack_code_params)
hack_codes.modify_time = Time.now hack_codes.modify_time = Time.now
hack_codes.save! hack_codes.save!

@ -1,6 +1,10 @@
class MainController < ApplicationController class MainController < ApplicationController
skip_before_action :check_sign skip_before_action :check_sign
def first_stamp
render :json => { status: 0, message: Time.now.to_i }
end
def index def index
render file: 'public/react/build/index.html', :layout => false render file: 'public/react/build/index.html', :layout => false
end end

@ -1,4 +1,5 @@
class SchoolsController < ApplicationController class SchoolsController < ApplicationController
skip_before_action :check_sign
def school_list def school_list
schools = School.all schools = School.all

@ -24,6 +24,7 @@ class ShixunsController < ApplicationController
before_action :portion_allowed, only: [:copy] before_action :portion_allowed, only: [:copy]
before_action :special_allowed, only: [:send_to_course, :search_user_courses] before_action :special_allowed, only: [:send_to_course, :search_user_courses]
before_action :shixun_marker, only: [:new, :create]
## 获取课程列表 ## 获取课程列表
def index def index
@ -1151,4 +1152,5 @@ private
end end
md5.hexdigest md5.hexdigest
end end
end end

@ -7,6 +7,8 @@ class SubjectsController < ApplicationController
:search_members, :add_subject_members, :statistics, :shixun_report, :school_report, :search_members, :add_subject_members, :statistics, :shixun_report, :school_report,
:up_member_position, :down_member_position, :update_team_title] :up_member_position, :down_member_position, :update_team_title]
before_action :require_admin, only: [:copy_subject] before_action :require_admin, only: [:copy_subject]
before_action :shixun_marker, only: [:new, :create, :add_shixun_to_stage]
include ApplicationHelper include ApplicationHelper
include SubjectsHelper include SubjectsHelper

@ -10,7 +10,6 @@ class Admins::IdentityAuths::AgreeApplyService < ApplicationService
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
apply.update!(status: 1) apply.update!(status: 1)
user.update!(authentication: true) user.update!(authentication: true)
RewardGradeService.call(user, container_id: user.id, container_type: 'Authentication', score: 500) RewardGradeService.call(user, container_id: user.id, container_type: 'Authentication', score: 500)
deal_tiding! deal_tiding!

@ -10,7 +10,7 @@ class Admins::ProfessionalAuths::AgreeApplyService < ApplicationService
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
apply.update!(status: 1) apply.update!(status: 1)
user.update!(professional_certification: true) user.update!(professional_certification: true)
user.update!(is_shixun_marker: true) if user.is_teacher?
RewardGradeService.call(user, container_id: user.id, container_type: 'Professional', score: 500) RewardGradeService.call(user, container_id: user.id, container_type: 'Professional', score: 500)
deal_tiding! deal_tiding!

@ -25,6 +25,7 @@ class Admins::UpdateUserService < ApplicationService
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
user.save! user.save!
user.user_extension.save! user.user_extension.save!
user.update!(is_shixun_marker: true) if user.is_certification_teacher
update_gitlab_password if params[:password].present? update_gitlab_password if params[:password].present?
end end
@ -36,7 +37,7 @@ class Admins::UpdateUserService < ApplicationService
def user_attributes def user_attributes
params.slice(*%i[lastname nickname mail phone admin business is_test params.slice(*%i[lastname nickname mail phone admin business is_test
professional_certification authentication]) professional_certification authentication is_shixun_marker])
end end
def user_extension_attributes def user_extension_attributes

@ -120,6 +120,7 @@
<div class="d-flex"> <div class="d-flex">
<%= f.input :professional_certification, as: :boolean, label: '职业认证', checked_value: 1, unchecked_value: 0 %> <%= f.input :professional_certification, as: :boolean, label: '职业认证', checked_value: 1, unchecked_value: 0 %>
<%= f.input :authentication, as: :boolean, label: '实名认证', wrapper_html: { class: 'ml-3' }, checked_value: 1, unchecked_value: 0 %> <%= f.input :authentication, as: :boolean, label: '实名认证', wrapper_html: { class: 'ml-3' }, checked_value: 1, unchecked_value: 0 %>
<%= f.input :is_shixun_marker, as: :boolean, label: '实训制作', wrapper_html: { class: 'ml-3' }, checked_value: 1, unchecked_value: 0 %>
</div> </div>
</div> </div>

@ -14,6 +14,7 @@ json.email @user.mail
json.profile_completed @user.profile_completed? json.profile_completed @user.profile_completed?
json.professional_certification @user.professional_certification json.professional_certification @user.professional_certification
json.main_site current_laboratory.main_site? json.main_site current_laboratory.main_site?
json.is_shixun_marker current_user.is_shixun_marker? || current_user.admin_or_business?
if @course if @course
json.course_identity @course_identity json.course_identity @course_identity
json.course_name @course.name json.course_name @course.name

@ -15,6 +15,7 @@ Rails.application.routes.draw do
scope '/api' do scope '/api' do
get 'home/index' get 'home/index'
get 'home/search' get 'home/search'
get 'main/first_stamp'
get 'search', to: 'searchs#index' get 'search', to: 'searchs#index'
@ -1336,6 +1337,7 @@ Rails.application.routes.draw do
root 'main#index' root 'main#index'
## react用 ## react用
get '*path', to: 'main#index', constraints: ReactConstraint.new get '*path', to: 'main#index', constraints: ReactConstraint.new
end end

@ -0,0 +1,9 @@
class AddIsShixunMarkerForUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :is_shixun_marker, :boolean, :default => false
User.joins(:user_extension)
.where(users: {professional_certification: 1}, user_extensions: {identity: 0})
.update_all(is_shixun_marker: 1)
end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

@ -6,9 +6,10 @@ import { requestProxy } from "./indexEduplus2RequestProxy";
import { broadcastChannelOnmessage ,SetAppModel, isDev, queryString } from 'educoder'; import { broadcastChannelOnmessage ,SetAppModel, isDev, queryString } from 'educoder';
import { notification } from 'antd'; import { notification } from 'antd';
import './index.css'; import './index.css';
const $ = window.$;
const opens ="79e33abd4b6588941ab7622aed1e67e8"; const opens ="79e33abd4b6588941ab7622aed1e67e8";
let timestamp = Date.parse(new Date()); let timestamp;
const newopens=md5(opens+timestamp) let checkSubmitFlg = false;
broadcastChannelOnmessage('refreshPage', () => { broadcastChannelOnmessage('refreshPage', () => {
window.location.reload() window.location.reload()
}) })
@ -20,7 +21,7 @@ function locationurl(list){
window.location.href=list window.location.href=list
} }
} }
let hashTimeout
// TODO 开发期多个身份切换 // TODO 开发期多个身份切换
let debugType ="" let debugType =""
@ -40,7 +41,29 @@ if (isDev) {
//ebugType="teacher"; //ebugType="teacher";
// 学生 // 学生
//debugType="student"; //debugType="student";
function railsgettimes(proxy) {
if(timestamp&&checkSubmitFlg===false){
$.ajax({url:proxy,async:false,success:function(data){
if(data.status===0){
timestamp=data.message;
}
}})
checkSubmitFlg=true
window.setTimeout(function () {
checkSubmitFlg=false;
}, 2500);
}else if(checkSubmitFlg===false){
$.ajax({url:proxy,async:false,success:function(data){
if(data.status===0){
timestamp=data.message;
}
}})
checkSubmitFlg=true
window.setTimeout(function () {
checkSubmitFlg=false;
}, 2500);
}
}
window._debugType = debugType; window._debugType = debugType;
export function initAxiosInterceptors(props) { export function initAxiosInterceptors(props) {
initOnlineOfflineListener() initOnlineOfflineListener()
@ -66,6 +89,7 @@ export function initAxiosInterceptors(props) {
window.setfalseInRequestMap = function(keyName) { window.setfalseInRequestMap = function(keyName) {
requestMap[keyName] = false; requestMap[keyName] = false;
} }
axios.interceptors.request.use( axios.interceptors.request.use(
config => { config => {
@ -95,19 +119,23 @@ export function initAxiosInterceptors(props) {
} }
if(`${config[0]}`!=`true`){ if(`${config[0]}`!=`true`){
if (window.location.port === "3007") { if (window.location.port === "3007") {
railsgettimes(`${proxy}/api/main/first_stamp.json`);
let newopens=md5(opens+timestamp)
config.url = `${proxy}${url}`; config.url = `${proxy}${url}`;
if (config.url.indexOf('?') == -1) { if (config.url.indexOf('?') == -1) {
config.url = `${config.url}?debug=${debugType}&timestamp=${timestamp}&client_key=${newopens}`; config.url = `${config.url}?debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`;
} else { } else {
config.url = `${config.url}&debug=${debugType}&timestamp=${timestamp}&client_key=${newopens}`; config.url = `${config.url}&debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`;
} }
} else { } else {
// 加api前缀 // 加api前缀
railsgettimes(`/api/main/first_stamp.json`);
let newopens=md5(opens+timestamp)
config.url = url; config.url = url;
if (config.url.indexOf('?') == -1) { if (config.url.indexOf('?') == -1) {
config.url = `${config.url}?&timestamp=${timestamp}&client_key=${newopens}`; config.url = `${config.url}?&randomcode=${timestamp}&client_key=${newopens}`;
} else { } else {
config.url = `${config.url}&timestamp=${timestamp}&client_key=${newopens}`; config.url = `${config.url}&randomcode=${timestamp}&client_key=${newopens}`;
} }
} }
} }

@ -1,3 +1,5 @@
import md5 from 'md5';
const $ = window.$;
const isDev = window.location.port == 3007; const isDev = window.location.port == 3007;
export const TEST_HOST = "https://test-newweb.educoder.net" export const TEST_HOST = "https://test-newweb.educoder.net"
export function getImageUrl(path) { export function getImageUrl(path) {
@ -68,19 +70,46 @@ export function getUrl2(path, goTest) {
} }
return `${path ? path: ''}`; return `${path ? path: ''}`;
} }
const newopens ="79e33abd4b6588941ab7622aed1e67e8";
let newtimestamp;
let checkSubmitFlgs = false;
function railsgettimess(proxy) {
if(checkSubmitFlgs===false){
$.ajax({url:proxy,async:false,success:function(data){
if(data.status===0){
newtimestamp=data.message;
}
}})
checkSubmitFlgs=true
window.setTimeout(function () {
checkSubmitFlgs=false;
}, 2500);
}
}
export function Railsgettimes() {
railsgettimess(`${getUrl()}/api/main/first_stamp.json`);
}
export function getUploadActionUrl(path, goTest) { export function getUploadActionUrl(path, goTest) {
return `${getUrl()}/api/attachments.json${isDev ? `?debug=${window._debugType || 'admin'}` : ''}` Railsgettimes()
let anewopens=md5(newopens+newtimestamp);
return `${getUrl()}/api/attachments.json${isDev ? `?debug=${window._debugType || 'admin'}&randomcode=${newtimestamp}&client_key=${anewopens}` : `?randomcode=${newtimestamp}&client_key=${anewopens}`}`;
} }
export function getUploadActionUrltwo(id) { export function getUploadActionUrltwo(id) {
Railsgettimes()
return `${getUrlmys()}/api/shixuns/${id}/upload_data_sets.json${isDev ? `?debug=${window._debugType || 'admin'}` : ''}` let anewopens=md5(newopens+newtimestamp);
return `${getUrlmys()}/api/shixuns/${id}/upload_data_sets.json${isDev ? `?debug=${window._debugType || 'admin'}&randomcode=${newtimestamp}&client_key=${anewopens}` : `?randomcode=${newtimestamp}&client_key=${anewopens}`}`
} }
export function getUploadActionUrlthree() { export function getUploadActionUrlthree() {
Railsgettimes()
return `${getUrlmys()}/api/jupyters/import_with_tpm.json${isDev ? `?debug=${window._debugType || 'admin'}` : ''}` let anewopens=md5(newopens+newtimestamp);
return `${getUrlmys()}/api/jupyters/import_with_tpm.json${isDev ? `?debug=${window._debugType || 'admin'}&randomcode=${newtimestamp}&client_key=${anewopens}` : `?randomcode=${newtimestamp}&client_key=${anewopens}`}`
} }
export function getUploadActionUrlOfAuth(id) { export function getUploadActionUrlOfAuth(id) {
return `${getUrl()}/api/users/accounts/${id}/auth_attachment.json${isDev ? `?debug=${window._debugType || 'admin'}` : ''}` Railsgettimes()
let anewopens=md5(newopens+newtimestamp);
return `${getUrl()}/api/users/accounts/${id}/auth_attachment.json${isDev ? `?debug=${window._debugType || 'admin'}&randomcode=${newtimestamp}&client_key=${anewopens}` : `?randomcode=${newtimestamp}&client_key=${anewopens}`}`
} }
export function test(path) { export function test(path) {
@ -96,6 +125,11 @@ export function getTaskUrlById(id) {
return `/tasks/${id}` return `/tasks/${id}`
} }
export function getRandomcode(url) {
Railsgettimes()
let anewopens=md5(newopens+newtimestamp);
return `${url}?&randomcode=${newtimestamp}&client_key=${anewopens}`
}
export function htmlEncode(str) { export function htmlEncode(str) {
var s = ""; var s = "";

@ -2,7 +2,7 @@
// export { default as OrderStateUtil } from '../routes/Order/components/OrderStateUtil'; // export { default as OrderStateUtil } from '../routes/Order/components/OrderStateUtil';
export { getImageUrl as getImageUrl, getUrl as getUrl, getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl export { getImageUrl as getImageUrl, getUrl as getUrl, getRandomcode as getRandomcode,getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl
, getUploadActionUrl as getUploadActionUrl,getUploadActionUrltwo as getUploadActionUrltwo ,getUploadActionUrlthree as getUploadActionUrlthree, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth , getUploadActionUrl as getUploadActionUrl,getUploadActionUrltwo as getUploadActionUrltwo ,getUploadActionUrlthree as getUploadActionUrlthree, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth
, getTaskUrlById as getTaskUrlById, TEST_HOST ,htmlEncode as htmlEncode } from './UrlTool'; , getTaskUrlById as getTaskUrlById, TEST_HOST ,htmlEncode as htmlEncode } from './UrlTool';
export { default as queryString } from './UrlTool2'; export { default as queryString } from './UrlTool2';

@ -0,0 +1,62 @@
import React, { Component } from 'react';
import {getImageUrl} from 'educoder';
import { Modal} from 'antd';
import axios from 'axios';
import '../modules/user/account/common.css';
import './gotoqqgroup.css'
class GotoQQgroup extends Component {
constructor(props) {
super(props);
this.state={
}
}
modalCancel=()=>{
try {
this.props.setgoshowqqgtounp(false);
}catch (e) {
}
}
setDownload=()=>{
//立即联系
try {
this.props.setgoshowqqgtounp(false);
}catch (e) {
}
}
render() {
return(
<Modal
keyboard={false}
closable={false}
footer={null}
destroyOnClose={true}
title="提示"
centered={true}
visible={this.props.goshowqqgtounp===undefined?false:this.props.goshowqqgtounp}
width="530px"
>
<div className="educouddiv intermediatecenter verticallayout">
<div className="tabeltext-alignleft mt10"><p>您可以在QQ服务群向管理员申请获得继续操作的权限</p></div>
<img width={"200px"} className="mt10" src={getImageUrl("images/educoder/qqqun20191230.png")}/>
<div className="tabeltext-alignleft mt10"><p>群号612934990</p></div>
<div className="clearfix mt30 edu-txt-center">
<a className="task-btn mr30" onClick={()=>this.modalCancel()}>取消</a>
<a className="task-btn task-btn-orange" target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=2f2043d88c1bd61d182b98bf1e061c6185e23055bec832c07d8148fe11c5a6cd">立即联系</a>
</div>
</div>
</Modal>
)
}
}
export default GotoQQgroup;

@ -0,0 +1,61 @@
/* 中间居中 */
.intermediatecenter{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
/* 简单居中 */
.intermediatecenterysls{
display: flex;
align-items: center;
}
.spacearound{
display: flex;
justify-content: space-around;
}
.spacebetween{
display: flex;
justify-content: space-between;
}
/* 头顶部居中 */
.topcenter{
display: -webkit-flex;
flex-direction: column;
align-items: center;
}
/* x轴正方向排序 */
/* 一 二 三 四 五 六 七 八 */
.sortinxdirection{
display: flex;
flex-direction:row;
}
/* x轴反方向排序 */
/* 八 七 六 五 四 三 二 一 */
.xaxisreverseorder{
display: flex;
flex-direction:row-reverse;
}
/* 垂直布局 正方向*/
/*
*/
.verticallayout{
display: flex;
flex-direction:column;
}
/* 垂直布局 反方向*/
.reversedirection{
display: flex;
flex-direction:column-reverse;
}

@ -6,7 +6,7 @@ import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames' import classNames from 'classnames'
import { getImageUrl, toPath, getUrl,getUploadActionUrl } from 'educoder';
import './CommentItemMDEditor.css' import './CommentItemMDEditor.css'
const $ = window.$; const $ = window.$;
@ -36,7 +36,7 @@ class CommentItemMDEditor extends Component {
if( $(`#${initMD_ID} textarea`).length === 1 ) { // 没有初始化 if( $(`#${initMD_ID} textarea`).length === 1 ) { // 没有初始化
const placeholder = '我要回复...' const placeholder = '我要回复...'
// const imageUrl = `/upload_with_markdown?container_id=${commentId}&container_type=Memo`; // const imageUrl = `/upload_with_markdown?container_id=${commentId}&container_type=Memo`;
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
const otherOptions = { const otherOptions = {
watch: false, watch: false,

@ -1,7 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import {Button, Card, Row, Col ,Upload,Icon,message,Tabs} from 'antd'; import {Button, Card, Row, Col ,Upload,Icon,message,Tabs} from 'antd';
import axios from 'axios'; import axios from 'axios';
import {getImageUrl,getUrl,appendFileSizeToUploadFileAll,appendFileSizeToUploadFile} from 'educoder'; import {getUploadActionUrl,getUrl,appendFileSizeToUploadFileAll,appendFileSizeToUploadFile} from 'educoder';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';
const { TabPane } = Tabs; const { TabPane } = Tabs;
class CompetitionContentsMd extends Component{ class CompetitionContentsMd extends Component{
@ -184,7 +184,7 @@ class CompetitionContentsMd extends Component{
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleContentUploadChange, onChange: this.handleContentUploadChange,
onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'), onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'),
beforeUpload: (file) => { beforeUpload: (file) => {

@ -1,7 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import {Button,Layout,Row, Col,Divider,Table} from 'antd'; import {Button,Layout,Row, Col,Divider,Table} from 'antd';
import axios from 'axios'; import axios from 'axios';
import {getImageUrl} from 'educoder'; import {getImageUrl,getRandomcode} from 'educoder';
import './CompetitionContentspdfdownload.css'; import './CompetitionContentspdfdownload.css';
// import NoneData from "../../../courses/shixunHomework/shixunHomework"; // import NoneData from "../../../courses/shixunHomework/shixunHomework";
@ -158,7 +158,7 @@ class CompetitionContentspdfdownload extends Component{
return( return(
<span className={"mr10"} key={key}> <span className={"mr10"} key={key}>
<img src={ getImageUrl(`images/educoder/pdfs.png`)} /> <img src={ getImageUrl(`images/educoder/pdfs.png`)} />
<a className={"pdfdownloadfont4CACFF ml10"} href={item.url} download="" <a className={"pdfdownloadfont4CACFF ml10"} href={getRandomcode(item.url)} download=""
title="下载" mce_href="#">立即下载</a> title="下载" mce_href="#">立即下载</a>
</span> </span>
) )
@ -172,7 +172,7 @@ class CompetitionContentspdfdownload extends Component{
return( return(
<span className={"mr10"} key={key}> <span className={"mr10"} key={key}>
<img src={ getImageUrl(`images/educoder/pdfs.png`)} /> <img src={ getImageUrl(`images/educoder/pdfs.png`)} />
<a className={"pdfdownloadfont4CACFF ml10"} href={item.url} download="" <a className={"pdfdownloadfont4CACFF ml10"} href={getRandomcode(item.url)} download=""
title="下载" mce_href="#">立即下载</a> title="下载" mce_href="#">立即下载</a>
</span> </span>
) )

@ -3,7 +3,7 @@ import { Input, InputNumber, Form, Button, Checkbox, Upload, Icon, message, Moda
import axios from 'axios' import axios from 'axios'
import '../css/busyWork.css' import '../css/busyWork.css'
import '../css/Courses.css' import '../css/Courses.css'
import { WordsBtn, getUrl, ConditionToolTip, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll } from 'educoder' import {getUploadActionUrl, ConditionToolTip, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll } from 'educoder'
import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor';
import CBreadcrumb from '../common/CBreadcrumb' import CBreadcrumb from '../common/CBreadcrumb'
@ -333,7 +333,7 @@ class NewWorkForm extends Component{
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleContentUploadChange, onChange: this.handleContentUploadChange,
onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'), onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'),
beforeUpload: (file) => { beforeUpload: (file) => {
@ -352,7 +352,7 @@ class NewWorkForm extends Component{
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleAnswerUploadChange, onChange: this.handleAnswerUploadChange,
onRemove: (file) => this.onAttachmentRemove(file, 'answerFileList'), onRemove: (file) => this.onAttachmentRemove(file, 'answerFileList'),
beforeUpload: (file) => { beforeUpload: (file) => {

@ -150,8 +150,8 @@ class TabRightComponents extends Component{
{this.props.isAdmin()? <li className="li_line drop_down fr color-blue font-16 mt20" style={{"padding":"0 20px"}}> {this.props.isAdmin()? <li className="li_line drop_down fr color-blue font-16 mt20" style={{"padding":"0 20px"}}>
导出<i className="iconfont icon-xiajiantou font-12 ml2"></i> 导出<i className="iconfont icon-xiajiantou font-12 ml2"></i>
<ul className="drop_down_menu" style={{"right":"-34px","left":"unset","height":"auto"}}> <ul className="drop_down_menu" style={{"right":"-34px","left":"unset","height":"auto"}}>
<li><a href={exportResultUrl} onClick={(url)=>this.confirmysl(exportResultUrl)} className="color-dark">导出成绩</a></li> <li><a onClick={(url)=>this.confirmysl(exportResultUrl)} className="color-dark">导出成绩</a></li>
<li><a href={exportUrl} onClick={(url)=>this.confirmysl(exportUrl)} className="color-dark">导出作品附件</a></li> <li><a onClick={(url)=>this.confirmysl(exportUrl)} className="color-dark">导出作品附件</a></li>
</ul> </ul>
</li>:""} </li>:""}

@ -1,7 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import {Button, Card, Row, Col ,Upload,Icon,message,Tabs} from 'antd'; import {Button, Card, Row, Col ,Upload,Icon,message,Tabs} from 'antd';
import axios from 'axios'; import axios from 'axios';
import {getImageUrl,getUrl,appendFileSizeToUploadFileAll,appendFileSizeToUploadFile} from 'educoder'; import {getUploadActionUrl,getUrl,appendFileSizeToUploadFileAll,appendFileSizeToUploadFile} from 'educoder';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';
const { TabPane } = Tabs; const { TabPane } = Tabs;
class CompetitionContentsMd extends Component{ class CompetitionContentsMd extends Component{
@ -184,7 +184,7 @@ class CompetitionContentsMd extends Component{
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleContentUploadChange, onChange: this.handleContentUploadChange,
onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'), onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'),
beforeUpload: (file) => { beforeUpload: (file) => {

@ -1,7 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import {Button,Layout,Row, Col,Divider,Table} from 'antd'; import {Button,Layout,Row, Col,Divider,Table} from 'antd';
import axios from 'axios'; import axios from 'axios';
import {getImageUrl} from 'educoder'; import {getImageUrl,getRandomcode} from 'educoder';
import './CompetitionContentspdfdownload.css'; import './CompetitionContentspdfdownload.css';
// import NoneData from "../../../courses/shixunHomework/shixunHomework"; // import NoneData from "../../../courses/shixunHomework/shixunHomework";
@ -158,7 +158,7 @@ class CompetitionContentspdfdownload extends Component{
return( return(
<span className={"mr10"} key={key}> <span className={"mr10"} key={key}>
<img src={ getImageUrl(`images/educoder/pdfs.png`)} /> <img src={ getImageUrl(`images/educoder/pdfs.png`)} />
<a className={"pdfdownloadfont4CACFF ml10"} href={item.url} download="" <a className={"pdfdownloadfont4CACFF ml10"} href={getRandomcode(item.url)} download=""
title="下载" mce_href="#">立即下载</a> title="下载" mce_href="#">立即下载</a>
</span> </span>
) )
@ -172,7 +172,7 @@ class CompetitionContentspdfdownload extends Component{
return( return(
<span className={"mr10"} key={key}> <span className={"mr10"} key={key}>
<img src={ getImageUrl(`images/educoder/pdfs.png`)} /> <img src={ getImageUrl(`images/educoder/pdfs.png`)} />
<a className={"pdfdownloadfont4CACFF ml10"} href={item.url} download="" <a className={"pdfdownloadfont4CACFF ml10"} href={getRandomcode(item.url)} download=""
title="下载" mce_href="#">立即下载</a> title="下载" mce_href="#">立即下载</a>
</span> </span>
) )

@ -6,7 +6,7 @@ import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom";
// import "antd/dist/antd.css"; // import "antd/dist/antd.css";
import { getImageUrl, toPath, getUrl } from 'educoder'; import { getImageUrl, toPath, getUrl,getUploadActionUrl } from 'educoder';
import axios from 'axios'; import axios from 'axios';
@ -171,7 +171,7 @@ export default class CoursesMarkdown extends Component {
// const placeholder = ""; // const placeholder = "";
// amp; // amp;
// 编辑时要传memoId // 编辑时要传memoId
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
// 创建editorMd // 创建editorMd
const answers_editormd = create_editorMD(_id, '100%', 400, placeholder, imageUrl, () => { const answers_editormd = create_editorMD(_id, '100%', 400, placeholder, imageUrl, () => {

@ -1,7 +1,7 @@
import React,{ Component } from "react"; import React,{ Component } from "react";
import { Modal,Checkbox,Select,Input,Upload,Button,Icon,message,DatePicker,Tooltip,Radio} from "antd"; import { Modal,Checkbox,Select,Input,Upload,Button,Icon,message,DatePicker,Tooltip,Radio} from "antd";
import axios from'axios'; import axios from'axios';
import {getUrl,handleDateString,appendFileSizeToUploadFileAll} from 'educoder'; import {getUrl,handleDateString,appendFileSizeToUploadFileAll,getUploadActionUrl} from 'educoder';
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';
import moment from 'moment'; import moment from 'moment';
import Modals from '../../modals/Modals'; import Modals from '../../modals/Modals';
@ -264,7 +264,7 @@ class Selectsetting extends Component{
const uploadProps = { const uploadProps = {
width: 600, width: 600,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleChange, onChange: this.handleChange,
onRemove: this.onAttachmentRemove, onRemove: this.onAttachmentRemove,
beforeUpload: (file) => { beforeUpload: (file) => {

@ -2,7 +2,7 @@ import React,{ Component } from "react";
import { Modal,Checkbox,Upload,Button,Icon,message,DatePicker,Select,Tooltip,Radio} from "antd"; import { Modal,Checkbox,Upload,Button,Icon,message,DatePicker,Select,Tooltip,Radio} from "antd";
import axios from 'axios'; import axios from 'axios';
import Modals from '../../modals/Modals'; import Modals from '../../modals/Modals';
import {getUrl,handleDateString,bytesToSize,appendFileSizeToUploadFileAll} from 'educoder'; import {getUploadActionUrl,handleDateString,appendFileSizeToUploadFileAll} from 'educoder';
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';
import moment from 'moment'; import moment from 'moment';
const CheckboxGroup = Checkbox.Group; const CheckboxGroup = Checkbox.Group;
@ -246,7 +246,7 @@ class Sendresource extends Component{
const uploadProps = { const uploadProps = {
width: 600, width: 600,
// showUploadList:false, // showUploadList:false,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleChange, onChange: this.handleChange,
onRemove: this.onAttachmentRemove, onRemove: this.onAttachmentRemove,
beforeUpload: (file) => { beforeUpload: (file) => {

@ -1,7 +1,7 @@
import React,{ Component } from "react"; import React,{ Component } from "react";
import {Checkbox,Input,Table, Pagination,Menu,Spin} from "antd"; import {Checkbox,Input,Table, Pagination,Menu,Spin} from "antd";
import {Link,NavLink} from 'react-router-dom'; import {Link,NavLink} from 'react-router-dom';
import { WordsBtn ,ActionBtn,queryString,downloadFile} from 'educoder'; import { WordsBtn ,ActionBtn,queryString,getRandomcode} from 'educoder';
import CoursesListType from '../coursesPublic/CoursesListType'; import CoursesListType from '../coursesPublic/CoursesListType';
import '../css/members.css'; import '../css/members.css';
import '../css/busyWork.css'; import '../css/busyWork.css';
@ -404,7 +404,7 @@ class Testpapersettinghomepage extends Component{
<ul className="drop_down_menu" style={{"right":"-34px","left":"unset","height":"auto"}}> <ul className="drop_down_menu" style={{"right":"-34px","left":"unset","height":"auto"}}>
<li><a onClick={()=>this.confirmysl(`/exercises/${this.props.match.params.Id}/exercise_lists.xlsx`,this.child)}>学生成绩</a></li> <li><a onClick={()=>this.confirmysl(`/exercises/${this.props.match.params.Id}/exercise_lists.xlsx`,this.child)}>学生成绩</a></li>
{/* <li><a onClick={()=>this.confpdf(`/api/exercises/${this.props.match.params.Id}/export_exercise`)} >空白试卷</a></li> */} {/* <li><a onClick={()=>this.confpdf(`/api/exercises/${this.props.match.params.Id}/export_exercise`)} >空白试卷</a></li> */}
<li><a href={`/api/exercises/${this.props.match.params.Id}/export_exercise`} target="_blank">空白试卷</a></li> <li><a href={getRandomcode(`/api/exercises/${this.props.match.params.Id}/export_exercise`)} target="_blank">空白试卷</a></li>
{/*<li><a onClick={()=>this.confirmysl(`/zip/export_exercises?exercise_id=${this.props.match.params.Id}${this.state.groupyslsval===null||this.state.groupyslsval===undefined?null:this.state.groupyslsval}`)}>学生答题试卷</a></li>*/} {/*<li><a onClick={()=>this.confirmysl(`/zip/export_exercises?exercise_id=${this.props.match.params.Id}${this.state.groupyslsval===null||this.state.groupyslsval===undefined?null:this.state.groupyslsval}`)}>学生答题试卷</a></li>*/}
</ul> </ul>
</li></Spin>:""} </li></Spin>:""}

@ -2,7 +2,7 @@ import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Spin,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Spin,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';
import { WordsBtn,getUrl ,bytesToSize,getImageUrl,appendFileSizeToUploadFileAll,appendFileSizeToUploadFile} from 'educoder'; import { WordsBtn,getUploadActionUrl ,bytesToSize,getImageUrl,appendFileSizeToUploadFileAll,appendFileSizeToUploadFile} from 'educoder';
import axios from 'axios'; import axios from 'axios';
import Modals from '../../../modals/Modals'; import Modals from '../../../modals/Modals';
const Search = Input.Search; const Search = Input.Search;
@ -512,7 +512,7 @@ class GraduationTasksSubmitedit extends Component{
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleChange, onChange: this.handleChange,
onRemove: this.onAttachmentRemove, onRemove: this.onAttachmentRemove,
beforeUpload: (file) => { beforeUpload: (file) => {

@ -3,7 +3,7 @@ import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Tooltip,Spin} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Tooltip,Spin} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';
import { WordsBtn,getUrl,getImageUrl,bytesToSize,appendFileSizeToUploadFileAll} from 'educoder'; import { WordsBtn,getUrl,getImageUrl,getUploadActionUrl,appendFileSizeToUploadFileAll} from 'educoder';
import axios from 'axios'; import axios from 'axios';
import Modals from '../../../modals/Modals'; import Modals from '../../../modals/Modals';
const Search = Input.Search; const Search = Input.Search;
@ -536,7 +536,7 @@ render(){
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleChange, onChange: this.handleChange,
onRemove: this.onAttachmentRemove, onRemove: this.onAttachmentRemove,
beforeUpload: (file) => { beforeUpload: (file) => {

@ -2,7 +2,7 @@ import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';
import { WordsBtn,getUrl ,bytesToSize,appendFileSizeToUploadFileAll,AttachmentList,appendFileSizeToUploadFile} from 'educoder'; import { WordsBtn,getUrl ,getUploadActionUrl,appendFileSizeToUploadFileAll,AttachmentList,appendFileSizeToUploadFile} from 'educoder';
import axios from 'axios'; import axios from 'axios';
import Modals from '../../../modals/Modals'; import Modals from '../../../modals/Modals';
import '../../css/Courses.css'; import '../../css/Courses.css';
@ -314,7 +314,7 @@ class GraduationTasksedit extends Component{
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleChange, onChange: this.handleChange,
onRemove: this.onAttachmentRemove, onRemove: this.onAttachmentRemove,
beforeUpload: (file) => { beforeUpload: (file) => {

@ -7,7 +7,7 @@ import {
} from 'antd'; } from 'antd';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';
import axios from 'axios' import axios from 'axios'
import {getUrl} from 'educoder'; import {getUrl,getUploadActionUrl} from 'educoder';
import "../../common/formCommon.css" import "../../common/formCommon.css"
// import './board.css' // import './board.css'
@ -248,7 +248,7 @@ class GraduateTopicPostWorksNew extends Component{
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleChange, onChange: this.handleChange,
onRemove: this.onAttachmentRemove, onRemove: this.onAttachmentRemove,
beforeUpload: (file) => { beforeUpload: (file) => {

@ -1,6 +1,6 @@
import React,{ Component } from "react"; import React,{ Component } from "react";
import {Table, Pagination,Popover,Spin, Row, Col ,Tabs, Icon} from "antd"; import {Table, Pagination,Popover,Spin, Row, Col ,Tabs, Icon} from "antd";
import { WordsBtn,on, off, trigger ,getImageUrl,sortDirections} from 'educoder'; import { WordsBtn,on, off, getRandomcode ,getImageUrl,sortDirections} from 'educoder';
import axios from'axios'; import axios from'axios';
import Dropdownbox from './Dropdownbox'; import Dropdownbox from './Dropdownbox';
import Dynamiclist from './Dynamiclist'; import Dynamiclist from './Dynamiclist';
@ -172,7 +172,7 @@ class Statistics extends Component{
} }
}) })
this.props.slowDownload(`${url}?${urllist}`); this.props.slowDownload(getRandomcode(`${url}?${urllist}`));
} }

@ -7,7 +7,7 @@ import PropTypes from 'prop-types';
import classNames from 'classnames' import classNames from 'classnames'
import { isDev } from 'educoder' import { getUploadActionUrl } from 'educoder'
import './MemoDetailEditor.css' import './MemoDetailEditor.css'
@ -36,7 +36,7 @@ class MemoDetailMDEditor extends Component {
// 因为props.memo不存在时本组件不会被加载这里直接在didMount里初始化即可 // 因为props.memo不存在时本组件不会被加载这里直接在didMount里初始化即可
const placeholder = '我要回复...' const placeholder = '我要回复...'
// const imageUrl = `/upload_with_markdown?container_id=${this.props.memo.id}&container_type=Memo`; // const imageUrl = `/upload_with_markdown?container_id=${this.props.memo.id}&container_type=Memo`;
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
if (this.isMDInited) { if (this.isMDInited) {
return; return;
} }

@ -7,7 +7,7 @@ import PropTypes from 'prop-types';
import classNames from 'classnames' import classNames from 'classnames'
import { isDev } from 'educoder' import { getUploadActionUrl } from 'educoder'
import './MemoDetailEditor.css' import './MemoDetailEditor.css'
@ -35,7 +35,7 @@ class MemoDetailMDEditortwo extends Component {
// 因为props.memo不存在时本组件不会被加载这里直接在didMount里初始化即可 // 因为props.memo不存在时本组件不会被加载这里直接在didMount里初始化即可
const placeholder = '我要回复...' const placeholder = '我要回复...'
// const imageUrl = `/upload_with_markdown?container_id=${this.props.memo.id}&container_type=Memo`; // const imageUrl = `/upload_with_markdown?container_id=${this.props.memo.id}&container_type=Memo`;
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
// 执行太快了,样式不正常 // 执行太快了,样式不正常
window.__tt = 400; window.__tt = 400;

@ -441,7 +441,7 @@ class MemoNew extends Component {
// amp; // amp;
// 编辑时要传memoId // 编辑时要传memoId
// const imageUrl = `/upload_with_markdown?container_id=&container_type=Memo`; // const imageUrl = `/upload_with_markdown?container_id=&container_type=Memo`;
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
// 创建editorMd // 创建editorMd

@ -34,10 +34,12 @@ class ShixunsHome extends Component {
configShareForIndex() configShareForIndex()
const upsystem=`/users/system_update.json`; const upsystem=`/users/system_update.json`;
axios.get(upsystem).then((response)=>{ axios.get(upsystem).then((response)=>{
if(response.data){
let updata=response.data; let updata=response.data;
this.setState({ this.setState({
updata:updata updata:updata
}) })
}
}).catch((error)=>{ }).catch((error)=>{
console.log(error); console.log(error);
}) })
@ -50,7 +52,7 @@ class ShixunsHome extends Component {
}) })
} }
}).catch((error)=>{ }).catch((error)=>{
console.log(error) // console.log(error)
}); });
} }

@ -7,6 +7,8 @@ import Addshixuns from './Addshixuns';
import '../ShixunPaths.css'; import '../ShixunPaths.css';
import axios from 'axios'; import axios from 'axios';
import NewShixunModel from '../../courses/coursesPublic/NewShixunModel'; import NewShixunModel from '../../courses/coursesPublic/NewShixunModel';
import GotoQQgroup from "../../../modal/GotoQQgroup";
const $ = window.$; const $ = window.$;
const Search = Input.Search; const Search = Input.Search;
@ -54,7 +56,9 @@ class DetailCardsEditAndAdd extends Component{
ChooseShixunListshixun_list:undefined, ChooseShixunListshixun_list:undefined,
stage_nametype:false, stage_nametype:false,
descriptiontype:false, descriptiontype:false,
Addshixunstype:false Addshixunstype:false,
goshowqqgtounp:false,
} }
this.onDragEnd = this.onDragEnd.bind(this); this.onDragEnd = this.onDragEnd.bind(this);
} }
@ -315,6 +319,12 @@ class DetailCardsEditAndAdd extends Component{
} }
Addshixuns=()=>{ Addshixuns=()=>{
// debugger
// console.log("点击了新建实训Addshixuns");
if(this.props&&this.props.current_user&&this.props.current_user.is_shixun_marker===false){
this.setgoshowqqgtounp(true);
return;
}
this.setState({ this.setState({
Addshixunstype:true, Addshixunstype:true,
}) })
@ -349,7 +359,12 @@ class DetailCardsEditAndAdd extends Component{
console.log(error) console.log(error)
}); });
} }
// 处理弹框
setgoshowqqgtounp=(bool)=>{
this.setState({
goshowqqgtounp:bool
})
}
render(){ render(){
let {selectShixun, let {selectShixun,
@ -368,11 +383,19 @@ class DetailCardsEditAndAdd extends Component{
Modalsbottomval, Modalsbottomval,
ChooseShixunListshixun_list, ChooseShixunListshixun_list,
stage_nametype, stage_nametype,
descriptiontype} = this.state descriptiontype,
goshowqqgtounp
} = this.state
return( return(
<div> <div>
{
goshowqqgtounp===true?
<GotoQQgroup {...this.state} {...this.props} setgoshowqqgtounp={(bool)=>this.setgoshowqqgtounp(bool)}></GotoQQgroup>
:
""
}
<Modals <Modals
modalsType={Modalstype} modalsType={Modalstype}
modalsTopval={Modalstopval} modalsTopval={Modalstopval}

@ -5,6 +5,8 @@ import { DragDropContext,Draggable, Droppable} from 'react-beautiful-dnd';
import Modals from '../../modals/Modals'; import Modals from '../../modals/Modals';
import Addshixuns from './Addshixuns'; import Addshixuns from './Addshixuns';
import NewShixunModel from '../../courses/coursesPublic/NewShixunModel'; import NewShixunModel from '../../courses/coursesPublic/NewShixunModel';
import GotoQQgroup from "../../../modal/GotoQQgroup";
import '../ShixunPaths.css'; import '../ShixunPaths.css';
import axios from 'axios'; import axios from 'axios';
const $ = window.$; const $ = window.$;
@ -56,7 +58,8 @@ class DetailCardsEditAndEdit extends Component{
ChooseShixunListshixun_list:undefined, ChooseShixunListshixun_list:undefined,
stage_nametype:false, stage_nametype:false,
descriptiontype:false, descriptiontype:false,
Addshixunstype:false Addshixunstype:false,
goshowqqgtounp:false,
} }
this.onDragEnd = this.onDragEnd.bind(this); this.onDragEnd = this.onDragEnd.bind(this);
} }
@ -77,6 +80,10 @@ class DetailCardsEditAndEdit extends Component{
} }
Addshixuns=()=>{ Addshixuns=()=>{
if(this.props&&this.props.current_user&&this.props.current_user.is_shixun_marker===false){
this.setgoshowqqgtounp(true);
return;
}
this.setState({ this.setState({
Addshixunstype:true, Addshixunstype:true,
}) })
@ -349,7 +356,12 @@ class DetailCardsEditAndEdit extends Component{
console.log(error) console.log(error)
}); });
} }
// 处理弹框
setgoshowqqgtounp=(bool)=>{
this.setState({
goshowqqgtounp:bool
})
}
render(){ render(){
let {selectShixun, let {selectShixun,
@ -369,11 +381,18 @@ class DetailCardsEditAndEdit extends Component{
delectfunvalue, delectfunvalue,
ChooseShixunListshixun_list, ChooseShixunListshixun_list,
stage_nametype, stage_nametype,
descriptiontype descriptiontype,
goshowqqgtounp
} = this.state } = this.state
return( return(
<div> <div>
{
goshowqqgtounp===true?
<GotoQQgroup {...this.state} {...this.props} setgoshowqqgtounp={(bool)=>this.setgoshowqqgtounp(bool)}></GotoQQgroup>
:
""
}
<Modals <Modals
modalsType={Modalstype} modalsType={Modalstype}
modalsTopval={Modalstopval} modalsTopval={Modalstopval}

@ -2,6 +2,7 @@ import React,{ Component } from "react";
import {getUrl,markdownToHTML} from 'educoder'; import {getUrl,markdownToHTML} from 'educoder';
import {Input,Button} from 'antd'; import {Input,Button} from 'antd';
import TPMMDEditor from "../tpm/challengesnew/TPMMDEditor";
import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";
import axios from 'axios'; import axios from 'axios';
@ -11,79 +12,11 @@ require('codemirror/lib/codemirror.css');
const $ = window.$; const $ = window.$;
let origin = getUrl();
let path = getUrl("/editormd/lib/");
function create_editorMD(id, width, high, placeholder, imageUrl,initValue, callback) {
var editorName = window.editormd(id, {
width: width,
height: high,
path: path, // "/editormd/lib/"
markdown : initValue,
syncScrolling: "single",
tex: true,
tocm: true,
emoji: true,
taskList: true,
codeFold: true,
searchReplace: true,
htmlDecode: "style,script,iframe",
sequenceDiagram: true,
autoFocus: false,
placeholder: placeholder,
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,
imageUpload: true,
imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"],
imageUploadURL: imageUrl,//url
onload: function () {
// this.previewing();
var id = this.id;
var editorName = this;
$("#" + 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 - 3);
editorName.cm.focus();
});
$("[type=\"inline\"]").attr("title", "行内公式");
$("[type=\"latex\"]").attr("title", "多行公式");
callback && callback()
}
});
// 一个页面有多个md时onload方法只执行了一次
// window.md_elocalStorage(editorName, `MemoQuestion_${id}`, `${id}`);
return editorName;
}
class PathNew extends Component{ class PathNew extends Component{
constructor(props){ constructor(props){
super(props); super(props);
this.contentMdRef = React.createRef();
this.Point_editMD = React.createRef();
this.state={ this.state={
pathName:"", pathName:"",
description:"", description:"",
@ -104,7 +37,7 @@ class PathNew extends Component{
}) })
return; return;
} }
let des=this.Des_editMD.getValue(); let des= this.contentMdRef.current.getValue().trim();
if(des===""){ if(des===""){
this.props.showSnackbar("请输入实践课程的简介"); this.props.showSnackbar("请输入实践课程的简介");
window.location.href="#part_Des"; window.location.href="#part_Des";
@ -115,7 +48,7 @@ class PathNew extends Component{
window.location.href="#part_Des"; window.location.href="#part_Des";
return; return;
} }
let point = this.Point_editMD.getValue(); let point = this.Point_editMD.current.getValue().trim();
if(point===""){ if(point===""){
this.props.showSnackbar("请输入实践课程的学习须知"); this.props.showSnackbar("请输入实践课程的学习须知");
window.location.href="#part_point"; window.location.href="#part_point";
@ -207,13 +140,9 @@ class PathNew extends Component{
this.setState({ this.setState({
pathName: response.data.name pathName: response.data.name
}) })
this.contentMdRef.current.setValue(response.data && response.data.description);
this.Point_editMD.current.setValue(response.data && response.data.learning_notes);
const Des_editMD = create_editorMD("shixun_introduction","100%","490px"
,"请在此输入实践课程的简介最大限制8000个字符","/api/attachments.json", response.data.description,"");
this.Des_editMD=Des_editMD;
const Point_editMD = create_editorMD("shixun_propaedeutics","100%","260px"
,"请在此输入实践课程的学习须知最大限制2000个字符","/api/attachments.json",response.data.learning_notes,"");
this.Point_editMD=Point_editMD;
} }
}).catch((error)=>{ }).catch((error)=>{
console.log(error); console.log(error);
@ -221,10 +150,8 @@ class PathNew extends Component{
} else { } else {
this.isEditPage = false this.isEditPage = false
const Des_editMD = create_editorMD("shixun_introduction","100%","490px","请在此输入实践课程的简介最大限制8000个字符","/api/attachments.json","",""); this.contentMdRef.current.setValue("");
this.Des_editMD=Des_editMD; this.Point_editMD.current.setValue("");
const Point_editMD = create_editorMD("shixun_propaedeutics","100%","260px","请在此输入实践课程的学习须知最大限制2000个字符","/api/attachments.json","","");
this.Point_editMD=Point_editMD;
} }
} }
@ -266,8 +193,14 @@ class PathNew extends Component{
<div className="df"> <div className="df">
<span className="mr30 color-orange pt10">*</span> <span className="mr30 color-orange pt10">*</span>
<div className="flex1 mr20"> <div className="flex1 mr20">
<div id="shixun_introduction" className="new_li editormd editormd-vertical"> <div id="shixun_introduction" className="new_li">
<textarea className="input-100-45" name="description" placeholder="请在此输入实践课程的简介" value={description}></textarea> {/*<textarea className="input-100-45" name="description" placeholder="请在此输入实践课程的简介" value={description}></textarea>*/}
<TPMMDEditor ref={this.contentMdRef} placeholder="请在此输入实践课程的简介最大限制8000个字符" mdID={'courseContentMD'}
refreshTimeout={1500}
className="courseMessageMD"
// initValue={this.state.description === null ? "" : this.state.description}
></TPMMDEditor>
</div> </div>
<p id="e_tip_shixun_introduction" className="edu-txt-right color-grey-cd font-12"></p> <p id="e_tip_shixun_introduction" className="edu-txt-right color-grey-cd font-12"></p>
<p id="e_tips_shixun_introduction" className="edu-txt-right color-grey-cd font-12"></p> <p id="e_tips_shixun_introduction" className="edu-txt-right color-grey-cd font-12"></p>
@ -280,8 +213,13 @@ class PathNew extends Component{
<div className="df"> <div className="df">
<span className="mr30 color-orange pt10">*</span> <span className="mr30 color-orange pt10">*</span>
<div className="flex1 mr20"> <div className="flex1 mr20">
<div id="shixun_propaedeutics" className="new_li editormd editormd-vertical"> <div id="shixun_propaedeutics" className="new_li ">
<textarea name="learning_notes" placeholder="请在此输入实践课程的学习须知" value={point}></textarea> {/*<textarea name="learning_notes" placeholder="请在此输入实践课程的学习须知" value={point}></textarea>*/}
<TPMMDEditor ref={this.Point_editMD} placeholder="请在此输入实践课程的学习须知最大限制2000个字符" mdID={'Point_editMDs'}
refreshTimeout={1500}
className="courseMessageMD"
// initValue={this.state.description === null ? "" : this.state.description}
></TPMMDEditor>
</div> </div>
<p id="e_tip_shixun_propaedeutics" className="edu-txt-right color-grey-cd font-12"></p> <p id="e_tip_shixun_propaedeutics" className="edu-txt-right color-grey-cd font-12"></p>
<p id="e_tips_shixun_propaedeutics" className="edu-txt-right color-grey-cd font-12"></p> <p id="e_tips_shixun_propaedeutics" className="edu-txt-right color-grey-cd font-12"></p>

@ -4,7 +4,7 @@ import {Input, Select, Radio, Checkbox, Popconfirm, message, Modal} from 'antd';
import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom"; import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom";
import { getImageUrl, toPath, getUrl } from 'educoder'; import { getImageUrl, getUploadActionUrl, getUrl } from 'educoder';
require('codemirror/lib/codemirror.css'); require('codemirror/lib/codemirror.css');
@ -222,7 +222,7 @@ export default class MDEditors extends Component {
const _placeholder = placeholder || ""; const _placeholder = placeholder || "";
// amp; // amp;
// 编辑时要传memoId // 编辑时要传memoId
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
// 创建editorMd // 创建editorMd
let react_id = `react_${_id}`; let react_id = `react_${_id}`;

@ -19,7 +19,9 @@ import Addcourses from '../courses/coursesPublic/Addcourses';
import LoginDialog from '../login/LoginDialog'; import LoginDialog from '../login/LoginDialog';
import Trialapplication from '../login/Trialapplication' import Trialapplication from '../login/Trialapplication';
import GotoQQgroup from '../../modal/GotoQQgroup'
import 'antd/lib/modal/style/index.css'; import 'antd/lib/modal/style/index.css';
@ -31,6 +33,8 @@ import 'antd/lib/input/style/index.css';
import './TPMIndex.css'; import './TPMIndex.css';
const $ = window.$ const $ = window.$
// TODO 这部分脚本从公共脚本中直接调用 // TODO 这部分脚本从公共脚本中直接调用
@ -69,6 +73,7 @@ class NewHeader extends Component {
headtypesonClickbool:false, headtypesonClickbool:false,
headtypess:"/", headtypess:"/",
mygetHelmetapi2: null, mygetHelmetapi2: null,
goshowqqgtounp:false,
} }
console.log("176") console.log("176")
// console.log(props); // console.log(props);
@ -649,6 +654,18 @@ submittojoinclass=(value)=>{
return; return;
} }
if(this.props&&this.props.current_user&&this.props.current_user.is_shixun_marker===false){
this.setgoshowqqgtounp(true);
return;
}
if(url !== undefined || url!==""){ if(url !== undefined || url!==""){
window.location.href = url; window.location.href = url;
} }
@ -790,6 +807,14 @@ submittojoinclass=(value)=>{
return false return false
} }
} }
// 处理弹框
setgoshowqqgtounp=(bool)=>{
this.setState({
goshowqqgtounp:bool
})
}
render() { render() {
const isLogin = true; // 这里不会出现未登录的情况,服务端在服务端路由时发现如果是未登录,则跳转到登录页了。 const isLogin = true; // 这里不会出现未登录的情况,服务端在服务端路由时发现如果是未登录,则跳转到登录页了。
const {match} = this.props; const {match} = this.props;
@ -808,6 +833,7 @@ submittojoinclass=(value)=>{
headtypesonClickbool, headtypesonClickbool,
headtypess, headtypess,
mygetHelmetapi2, mygetHelmetapi2,
goshowqqgtounp,
}=this.state; }=this.state;
/* /*
用户名称 用户头像url 用户名称 用户头像url
@ -898,7 +924,9 @@ submittojoinclass=(value)=>{
}) })
} }
// console.log("newHeadersnewHeaders");
// console.log(this.props);
// this.props.current_user.is_shixun_marker
return ( return (
<div className="newHeaders" id="nHeader" > <div className="newHeaders" id="nHeader" >
@ -914,6 +942,14 @@ submittojoinclass=(value)=>{
{...this.props} {...this.props}
{...this.state} {...this.state}
/>:""} />:""}
{
goshowqqgtounp===true?
<GotoQQgroup {...this.state} {...this.props} setgoshowqqgtounp={(bool)=>this.setgoshowqqgtounp(bool)}></GotoQQgroup>
:
""
}
<a href={"/"} onClick={()=>this.headtypesonClick("/",false)} className={"fl mr30 ml25 mt10"}> <a href={"/"} onClick={()=>this.headtypesonClick("/",false)} className={"fl mr30 ml25 mt10"}>
{ {
mygetHelmetapi2 === null ? mygetHelmetapi2 === null ?
@ -1100,9 +1136,6 @@ submittojoinclass=(value)=>{
{/*<a href={this.props.Headertop===undefined?"":this.props.Headertop.course_url}>课堂</a>*/} {/*<a href={this.props.Headertop===undefined?"":this.props.Headertop.course_url}>课堂</a>*/}
<Link to={this.props.Headertop===undefined?"":'/courses'}>翻转课堂</Link> <Link to={this.props.Headertop===undefined?"":'/courses'}>翻转课堂</Link>
</li> </li>
{}
{console.log(activeShixuns)}
<li className={`${activeShixuns === true ? 'pr active' : 'pr'}`}> <li className={`${activeShixuns === true ? 'pr active' : 'pr'}`}>
<Link to="/shixuns">实训项目</Link> <Link to="/shixuns">实训项目</Link>
{/*<img src={getImageUrl("images/educoder/hot-h.png")} className="nav-img">*/} {/*<img src={getImageUrl("images/educoder/hot-h.png")} className="nav-img">*/}
@ -1287,7 +1320,9 @@ submittojoinclass=(value)=>{
{this.props.current_user&&this.props.current_user.user_identity==="学生"?"":coursestypes===false? {this.props.current_user&&this.props.current_user.user_identity==="学生"?"":coursestypes===false?
<li><a onClick={(url)=>this.getUser("/courses/new")}>{this.props.user&&this.props.user.main_site===false?"新建课堂":"新建翻转课堂"}</a></li>:"" <li><a onClick={(url)=>this.getUser("/courses/new")}>{this.props.user&&this.props.user.main_site===false?"新建课堂":"新建翻转课堂"}</a></li>:""
} }
{shixuntype===true?"":<li><a onClick={(url)=>this.getUser("/shixuns/new")}>新建实训项目</a></li>} {shixuntype===true?"":
<li><a onClick={(url)=>this.getUser("/shixuns/new")}>新建实训项目</a></li>
}
{this.props.user&&this.props.user.main_site===false?"":this.props.Headertop===undefined?"":<li><a onClick={(url)=>this.getUser("/paths/new")} >新建实践课程</a></li>} {this.props.user&&this.props.user.main_site===false?"":this.props.Headertop===undefined?"":<li><a onClick={(url)=>this.getUser("/paths/new")} >新建实践课程</a></li>}
{this.props.user&&this.props.user.main_site===true?"":this.props.Headertop===undefined?"": {this.props.user&&this.props.user.main_site===true?"":this.props.Headertop===undefined?"":
pathstype===true?"":this.props.user&&this.props.user.admin===true||this.props.user&&this.props.user.is_teacher===true||this.props.user&&this.props.user.business===true?<li><a onClick={(url)=>this.getUser("/paths/new")} >新建实践课程</a></li>:"" pathstype===true?"":this.props.user&&this.props.user.admin===true||this.props.user&&this.props.user.is_teacher===true||this.props.user&&this.props.user.business===true?<li><a onClick={(url)=>this.getUser("/paths/new")} >新建实践课程</a></li>:""

@ -15,7 +15,7 @@ import axios from 'axios';
import './css/TPMsettings.css'; import './css/TPMsettings.css';
import { getImageUrl, toPath, getUrl ,appendFileSizeToUploadFileAll, getUploadActionUrl} from 'educoder'; import { getImageUrl, toPath, getUrl ,getUploadActionUrl} from 'educoder';
let origin = getUrl(); let origin = getUrl();
@ -280,7 +280,7 @@ export default class TPMsettings extends Component {
const placeholder = ""; const placeholder = "";
// amp; // amp;
// 编辑时要传memoId // 编辑时要传memoId
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
// 创建editorMd // 创建editorMd
const description_editormd =create_editorMD(id, '100%', 400, placeholder, imageUrl, initValue,()=> { const description_editormd =create_editorMD(id, '100%', 400, placeholder, imageUrl, initValue,()=> {
@ -307,7 +307,7 @@ export default class TPMsettings extends Component {
const placeholder = ""; const placeholder = "";
// amp; // amp;
// 编辑时要传memoId // 编辑时要传memoId
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
// 创建editorMd // 创建editorMd
const evaluate_script_editormd =create_editorMD(id, '100%', 400, placeholder, imageUrl, initValue,()=> { const evaluate_script_editormd =create_editorMD(id, '100%', 400, placeholder, imageUrl, initValue,()=> {

@ -6,7 +6,7 @@ import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom";
// import "antd/dist/antd.css"; // import "antd/dist/antd.css";
import { getImageUrl, toPath, getUrl } from 'educoder'; import { getImageUrl, getUploadActionUrl, getUrl } from 'educoder';
import '../../courses/css/Courses.css' import '../../courses/css/Courses.css'
import axios from 'axios'; import axios from 'axios';
@ -226,7 +226,7 @@ export default class TPMMDEditor extends Component {
const _placeholder = placeholder || ""; const _placeholder = placeholder || "";
// amp; // amp;
// 编辑时要传memoId // 编辑时要传memoId
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
// 创建editorMd // 创建editorMd
let react_id = `react_${_id}`; let react_id = `react_${_id}`;
// 将实例存到了window // 将实例存到了window

@ -1,6 +1,6 @@
import React, {Component} from 'react'; import React, {Component} from 'react';
import {getUrl} from 'educoder'; import {getUrl,getUploadActionUrl} from 'educoder';
let path = getUrl("/editormd/lib/"); let path = getUrl("/editormd/lib/");
@ -85,7 +85,7 @@ export default class TPMeditorMD extends Component {
// amp; // amp;
// 编辑时要传memoId // 编辑时要传memoId
// const imageUrl = `/upload_with_markdown?container_id=&container_type=Memo`; // const imageUrl = `/upload_with_markdown?container_id=&container_type=Memo`;
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
// 创建editorMd // 创建editorMd
let questio_editormd = create_editorMD(id, '100%', 400, placeholder, imageUrl, () => { let questio_editormd = create_editorMD(id, '100%', 400, placeholder, imageUrl, () => {

@ -6,7 +6,7 @@ import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom";
// import "antd/dist/antd.css"; // import "antd/dist/antd.css";
import { getImageUrl, toPath, getUrl } from 'educoder'; import { getImageUrl, getUploadActionUrl, getUrl } from 'educoder';
import axios from 'axios'; import axios from 'axios';
@ -170,7 +170,7 @@ export default class TPManswer extends Component {
const placeholder = ""; const placeholder = "";
// amp; // amp;
// 编辑时要传memoId // 编辑时要传memoId
const imageUrl = `/api/attachments.json`; const imageUrl = `${getUploadActionUrl()}`;
// 创建editorMd // 创建editorMd
const answers_editormd = create_editorMD(id, '100%', 400, placeholder, imageUrl, () => { const answers_editormd = create_editorMD(id, '100%', 400, placeholder, imageUrl, () => {

@ -243,7 +243,7 @@ class Newshixuns extends Component {
const placeholder = ""; const placeholder = "";
// amp; // amp;
// 编辑时要传memoId // 编辑时要传memoId
const imageUrl = `/api/attachments.json`; const imageUrl = `getUploadActionUrl`;
// 创建editorMd // 创建editorMd
const taskpass_editormd = create_editorMD("memoMD", '100%', 400, placeholder, imageUrl, () => { const taskpass_editormd = create_editorMD("memoMD", '100%', 400, placeholder, imageUrl, () => {

@ -12,6 +12,7 @@ import classNames from 'classnames'
import 'antd/lib/switch/style/index.css' import 'antd/lib/switch/style/index.css'
import './shixunCss/ShixunCardList.css'; import './shixunCss/ShixunCardList.css';
import GotoQQgroup from '../../../modal/GotoQQgroup'
import { on, off } from 'educoder' import { on, off } from 'educoder'
@ -33,6 +34,7 @@ class ShixunCardList extends Component {
shixunid:"", shixunid:"",
upcircle:false, upcircle:false,
typekeyid:undefined, typekeyid:undefined,
goshowqqgtounp:false,
} }
} }
@ -171,6 +173,10 @@ class ShixunCardList extends Component {
this.props.showProfileCompleteDialog() this.props.showProfileCompleteDialog()
return return
} }
if(this.props&&this.props.current_user&&this.props.current_user.is_shixun_marker===false){
this.setgoshowqqgtounp(true);
return;
}
if(url !== undefined || url!==""){ if(url !== undefined || url!==""){
window.location.href = url; window.location.href = url;
@ -178,8 +184,15 @@ class ShixunCardList extends Component {
} }
// 处理弹框
setgoshowqqgtounp=(bool)=>{
this.setState({
goshowqqgtounp:bool
})
}
render(){ render(){
let {mine,InputValue,upcircle}=this.state; let {mine,InputValue,upcircle,goshowqqgtounp}=this.state;
// console.log("NewHeadermygetHelmetapi123123123123"); // console.log("NewHeadermygetHelmetapi123123123123");
let shixuntype=false; let shixuntype=false;
@ -196,10 +209,19 @@ class ShixunCardList extends Component {
} }
}) })
} }
return ( return (
<div className="educontent mt20"> <div className="educontent mt20">
<div className="clearfix"> <div className="clearfix">
{
goshowqqgtounp===true?
<GotoQQgroup {...this.state} {...this.props} setgoshowqqgtounp={(bool)=>this.setgoshowqqgtounp(bool)}></GotoQQgroup>
:
""
}
{/*<div className="fl mr20 font-16 bestChoose shixun_repertoire active"*/} {/*<div className="fl mr20 font-16 bestChoose shixun_repertoire active"*/}
{/*id={"all"}*/} {/*id={"all"}*/}
{/*onClick={(e)=>this.latestHot(e,1)}>全部*/} {/*onClick={(e)=>this.latestHot(e,1)}>全部*/}

@ -116,3 +116,4 @@ button.ant-btn.ant-btn-primary.grayBtn {
overflow-y: auto; overflow-y: auto;
} }
} }

@ -9,6 +9,7 @@ import { setImagesUrl } from 'educoder';
import "./usersInfo.css" import "./usersInfo.css"
import Create from './publicCreatNew' import Create from './publicCreatNew'
import GotoQQgroup from "../../../modal/GotoQQgroup";
class InfosShixun extends Component{ class InfosShixun extends Component{
constructor(props){ constructor(props){
@ -22,7 +23,8 @@ class InfosShixun extends Component{
sort_by: "updated_at", sort_by: "updated_at",
sort_direction: "desc", sort_direction: "desc",
totalCount:undefined, totalCount:undefined,
data:undefined data:undefined,
goshowqqgtounp:false,
} }
} }
@ -144,6 +146,13 @@ class InfosShixun extends Component{
this.getCourses(category, status, sort_by, page, sort_directiony); this.getCourses(category, status, sort_by, page, sort_directiony);
} }
// 处理弹框
setgoshowqqgtounp=(bool)=>{
this.setState({
goshowqqgtounp:bool
})
}
render(){ render(){
let{ let{
@ -154,7 +163,8 @@ class InfosShixun extends Component{
data, data,
totalCount, totalCount,
sort_direction, sort_direction,
isSpin isSpin,
goshowqqgtounp
} = this.state; } = this.state;
let is_current=this.props.is_current; let is_current=this.props.is_current;
@ -171,6 +181,12 @@ class InfosShixun extends Component{
); );
return( return(
<div className="educontent"> <div className="educontent">
{
goshowqqgtounp===true?
<GotoQQgroup {...this.state} {...this.props} setgoshowqqgtounp={(bool)=>this.setgoshowqqgtounp(bool)}></GotoQQgroup>
:
""
}
<Spin size="large" spinning={isSpin}> <Spin size="large" spinning={isSpin}>
<style> <style>
{ {
@ -368,7 +384,7 @@ class InfosShixun extends Component{
{/* 298 */} {/* 298 */}
{ {
page == 1 && is_current && !category ? page == 1 && is_current && !category ?
<Create href={"/shixuns/new"} name={"新建实训"} index="2"></Create>:"" <Create href={"/shixuns/new"} name={"新建实训"} index="2" {...this.props} {...this.state} setgoshowqqgtounp={(bool)=>this.setgoshowqqgtounp(bool)}></Create>:""
} }
{ {
(!data || (data && data.shixuns.length==0)) && category && <NoneData></NoneData> (!data || (data && data.shixuns.length==0)) && category && <NoneData></NoneData>

@ -1,7 +1,7 @@
import React,{ Component } from "react"; import React,{ Component } from "react";
import { Input, InputNumber, Form, Button, Checkbox, Upload, Icon, message, Modal } from "antd"; import { Input, InputNumber, Form, Button, Checkbox, Upload, Icon, message, Modal } from "antd";
import axios from 'axios' import axios from 'axios'
import { WordsBtn, getUrl, ConditionToolTip, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll } from 'educoder' import { getUploadActionUrl, getUrl, ConditionToolTip, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll } from 'educoder'
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';
const $ = window.$; const $ = window.$;
const MAX_TITLE_LENGTH = 60; const MAX_TITLE_LENGTH = 60;
@ -191,7 +191,7 @@ class NewGtaskForms extends Component{
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUploadActionUrl()}`,
onChange: this.handleContentUploadChange, onChange: this.handleContentUploadChange,
onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'), onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'),
beforeUpload: (file) => { beforeUpload: (file) => {

@ -7,37 +7,65 @@ import Loading from '../../../Loading';
import axios from 'axios'; import axios from 'axios';
import {getImageUrl} from 'educoder'; import {getImageUrl} from 'educoder';
import { TPMIndexHOC } from '../../tpm/TPMIndexHOC'; import { TPMIndexHOC } from '../../tpm/TPMIndexHOC';
import { CNotificationHOC } from '../../courses/common/CNotificationHOC' import { CNotificationHOC } from '../../courses/common/CNotificationHOC';
import GotoQQgroup from '../../../modal/GotoQQgroup';
import "./usersInfo.css" import "./usersInfo.css"
class publicCreateNew extends Component{ class publicCreateNew extends Component{
constructor(props){ constructor(props){
super(props); super(props);
this.state={
}
} }
//头部获取是否已经登录了 //头部获取是否已经登录了
getUser=(url)=> { getUser=(url,name)=> {
if (this.props.user&&this.props.user.email===undefined||this.props.user&&this.props.user.email===null||this.props.user&&this.props.user.email==="") { if (this.props.user&&this.props.user.email===undefined||this.props.user&&this.props.user.email===null||this.props.user&&this.props.user.email==="") {
this.props.showNotification("请先绑定邮箱,谢谢"); this.props.showNotification("请先绑定邮箱,谢谢");
return return
} }
if(name==="新建实训"){
if(this.props&&this.props.current_user&&this.props.current_user.is_shixun_marker===false){
this.props.setgoshowqqgtounp(true);
return;
}
}
if(url !== undefined || url!==""){ if(url !== undefined || url!==""){
window.location.href = url; window.location.href = url;
} }
} }
getUsers=(url,name)=> {
if(name==="新建实训"){
if(this.props&&this.props.current_user&&this.props.current_user.is_shixun_marker===false){
this.props.setgoshowqqgtounp(true);
return;
}
}
if(url !== undefined || url!==""){
window.location.href = url;
}
}
render() { render() {
let {href,name,index}=this.props; let {href,name,index}=this.props;
return ( return (
<div className="square-Item" style={{"height":`${index=="1"?"289":index=="2"?"298":index=="3"?"295":"289"}px`}}> <div className="square-Item" style={{"height":`${index=="1"?"289":index=="2"?"298":index=="3"?"295":"289"}px`}}>
<div className="substance substancepad"> <div className="substance substancepad">
{this.props.Createtype==="projects"?<a onClick={()=>this.getUser(href)}> {this.props.Createtype==="projects"?<a onClick={()=>this.getUser(href,name)}>
<div className="substancenenew"> <div className="substancenenew">
<div className="leftten"></div> <div className="leftten"></div>
<div className="topten"></div> <div className="topten"></div>
</div> </div>
</a>: <a href={`${href}`}> </a>: <a onClick={()=>this.getUsers(href,name)}>
<div className="substancenenew"> <div className="substancenenew">
<div className="leftten"></div> <div className="leftten"></div>
<div className="topten"></div> <div className="topten"></div>

Loading…
Cancel
Save