版本库调整

dev_aliyun2
杨树明 5 years ago committed by harry
parent 0de33314da
commit 9c6b7c587c

@ -0,0 +1,391 @@
'use strict';
// extract-css-assets-webpack-plugin
const autoprefixer = require('autoprefixer');
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const ManifestPlugin = require('webpack-manifest-plugin');
const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');
const eslintFormatter = require('react-dev-utils/eslintFormatter');
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin');
// const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
// const TerserPlugin = require('terser-webpack-plugin');
const paths = require('./paths');
const getClientEnvironment = require('./env');
// Webpack uses `publicPath` to determine where the app is being served from.
// It requires a trailing slash, or the file assets will get an incorrect path.
const publicPath = paths.servedPath;
// Some apps do not use client-side routing with pushState.
// For these, "homepage" can be set to "." to enable relative asset paths.
const shouldUseRelativeAssetPaths = publicPath === './';
// Source maps are resource heavy and can cause out of memory issue for large source files.
const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false';
// `publicUrl` is just like `publicPath`, but we will provide it to our app
// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
// Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz.
const publicUrl = publicPath.slice(0, -1);
// Get environment variables to inject into our app.
const env = getClientEnvironment(publicUrl);
// Assert this just to be safe.
// Development builds of React are slow and not intended for production.
if (env.stringified['process.env'].NODE_ENV !== '"production"') {
throw new Error('Production builds must have NODE_ENV=production.');
}
// Note: defined here because it will be used more than once.
const cssFilename = './static/css/[name].[contenthash:8].css';
// ExtractTextPlugin expects the build output to be flat.
// (See https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/27)
// However, our output is structured with css, js and media folders.
// To have this structure working with relative paths, we have to use custom options.
const extractTextPluginOptions = shouldUseRelativeAssetPaths
? // Making sure that the publicPath goes back to to build folder.
{ publicPath: Array(cssFilename.split('/').length).join('../') }
: {};
// This is the production configuration.
// It compiles slowly and is focused on producing a fast and minimal bundle.
// The development configuration is different and lives in a separate file.
// 上线用的
// console.log('publicPath ', publicPath)
module.exports = {
// optimization: {
// minimize: true,
// minimizer: [new TerserPlugin()],
// },
// externals: {
// 'react': 'window.React'
// },
// Don't attempt to continue if there are any errors.
bail: true,
// We generate sourcemaps in production. This is slow but gives good results.
// You can exclude the *.map files from the build during deployment.
// devtool: shouldUseSourceMap ? 'nosources-source-map' : false, //正式版
devtool:false,//测试版
// In production, we only want to load the polyfills and the app code.
entry: [require.resolve('./polyfills'), paths.appIndexJs],
output: {
// The build folder.
path: paths.appBuild,
// Generated JS file names (with nested folders).
// There will be one main bundle, and one file per asynchronous chunk.
// We don't currently advertise code splitting but Webpack supports it.
filename: './static/js/[name].[chunkhash:8].js',
chunkFilename: './static/js/[name].[chunkhash:8].chunk.js',
// We inferred the "public path" (such as / or /my-project) from homepage.
// cdn
// publicPath: 'https://shixun.educoder.net/react/build/', //publicPath, https://cdn.educoder.net
// publicPath: 'https://cdn-testeduplus2.educoder.net/react/build/', //publicPath, https://cdn.educoder.net
publicPath: '/react/build/', //publicPath, https://cdn.educoder.net
// Point sourcemap entries to original disk location (format as URL on Windows)
devtoolModuleFilenameTemplate: info =>
path
.relative(paths.appSrc, info.absoluteResourcePath)
.replace(/\\/g, '/'),
},
resolve: {
// This allows you to set a fallback for where Webpack should look for modules.
// We placed these paths second because we want `node_modules` to "win"
// if there are any conflicts. This matches Node resolution mechanism.
// https://github.com/facebookincubator/create-react-app/issues/253
modules: ['node_modules', paths.appNodeModules].concat(
// It is guaranteed to exist because we tweak it in `env.js`
process.env.NODE_PATH.split(path.delimiter).filter(Boolean)
),
// These are the reasonable defaults supported by the Node ecosystem.
// We also include JSX as a common component filename extension to support
// some tools, although we do not recommend using it, see:
// https://github.com/facebookincubator/create-react-app/issues/290
// `web` extension prefixes have been added for better support
// for React Native Web.
extensions: ['.web.js', '.mjs', '.js', '.json', '.web.jsx', '.jsx'],
alias: {
"educoder": __dirname + "/../src/common/educoder.js",
// Support React Native Web
// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
'react-native': 'react-native-web',
},
plugins: [
// Prevents users from importing files from outside of src/ (or node_modules/).
// This often causes confusion because we only process files within src/ with babel.
// To fix this, we prevent you from importing files out of src/ -- if you'd like to,
// please link the files into your node_modules/ and let module-resolution kick in.
// Make sure your source files are compiled, as they will not be processed in any way.
new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]),
],
},
module: {
strictExportPresence: true,
rules: [
// TODO: Disable require.ensure as it's not a standard language feature.
// We are waiting for https://github.com/facebookincubator/create-react-app/issues/2176.
// { parser: { requireEnsure: false } },
// First, run the linter.
// It's important to do this before Babel processes the JS.
{
test: /\.(js|jsx|mjs)$/,
enforce: 'pre',
use: [
{
options: {
formatter: eslintFormatter,
eslintPath: require.resolve('eslint'),
},
loader: require.resolve('eslint-loader'),
},
],
include: paths.appSrc,
},
{
// "oneOf" will traverse all following loaders until one will
// match the requirements. When no loader matches it will fall
// back to the "file" loader at the end of the loader list.
oneOf: [
// "url" loader works just like "file" loader but it also embeds
// assets smaller than specified size as data URLs to avoid requests.
{
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
loader: require.resolve('url-loader'),
options: {
limit: 10000,
name: 'static/media/[name].[hash:8].[ext]',
},
},
// Process JS with Babel.
{
test: /\.(js|jsx|mjs)$/,
include: paths.appSrc,
loader: require.resolve('babel-loader'),
options: {
compact: true,
},
},
// The notation here is somewhat confusing.
// "postcss" loader applies autoprefixer to our CSS.
// "css" loader resolves paths in CSS and adds assets as dependencies.
// "style" loader normally turns CSS into JS modules injecting <style>,
// but unlike in development configuration, we do something different.
// `ExtractTextPlugin` first applies the "postcss" and "css" loaders
// (second argument), then grabs the result CSS and puts it into a
// separate file in our build process. This way we actually ship
// a single CSS file in production instead of JS code injecting <style>
// tags. If you use code splitting, however, any async bundles will still
// use the "style" loader inside the async code so CSS from them won't be
// in the main CSS file.
{
test: /\.css$/,
loader: ExtractTextPlugin.extract(
Object.assign(
{
fallback: {
loader: require.resolve('style-loader'),
options: {
hmr: false,
},
},
use: [
{
loader: require.resolve('css-loader'),
options: {
importLoaders: 1,
minimize: true,
sourceMap: shouldUseSourceMap,
},
},
{
loader: require.resolve('postcss-loader'),
options: {
// Necessary for external CSS imports to work
// https://github.com/facebookincubator/create-react-app/issues/2677
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
autoprefixer({
browsers: [
'>1%',
'last 4 versions',
'Firefox ESR',
'not ie < 9', // React doesn't support IE8 anyway
],
flexbox: 'no-2009',
}),
],
},
},
],
},
extractTextPluginOptions
)
),
// Note: this won't work without `new ExtractTextPlugin()` in `plugins`.
},
{
test: /\.scss$/,
use: [
require.resolve("style-loader"),
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 1,
minimize: true,
sourceMap: shouldUseSourceMap,
},
},
{
loader: require.resolve("sass-loader")
}
],
},
// "file" loader makes sure assets end up in the `build` folder.
// When you `import` an asset, you get its filename.
// This loader doesn't use a "test" so it will catch all modules
// that fall through the other loaders.
{
loader: require.resolve('file-loader'),
// Exclude `js` files to keep "css" loader working as it injects
// it's runtime that would otherwise processed through "file" loader.
// Also exclude `html` and `json` extensions so they get processed
// by webpacks internal loaders.
exclude: [/\.(js|jsx|mjs)$/, /\.html$/, /\.json$/],
options: {
name: 'static/media/[name].[hash:8].[ext]',
},
},
// ** STOP ** Are you adding a new loader?
// Make sure to add the new loader(s) before the "file" loader.
],
},
],
},
plugins: [
// Makes some environment variables available in index.html.
// The public URL is available as %PUBLIC_URL% in index.html, e.g.:
// <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
// In production, it will be an empty string unless you specify "homepage"
// in `package.json`, in which case it will be the pathname of that URL.
new InterpolateHtmlPlugin(env.raw),
// Generates an `index.html` file with the <script> injected.
new HtmlWebpackPlugin({
inject: true,
template: paths.appHtml,
minify: {
removeComments: true,
collapseWhitespace: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeStyleLinkTypeAttributes: true,
keepClosingSlash: true,
minifyJS: true,
minifyCSS: true,
minifyURLs: true,
},
}),
// Makes some environment variables available to the JS code, for example:
// if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`.
// It is absolutely essential that NODE_ENV was set to production here.
// Otherwise React will be compiled in the very slow development mode.
new webpack.DefinePlugin(env.stringified),
// Minify the code.
// new webpack.optimize.UglifyJsPlugin({
// compress: {
// warnings: false,
// // Disabled because of an issue with Uglify breaking seemingly valid code:
// // https://github.com/facebookincubator/create-react-app/issues/2376
// // Pending further investigation:
// // https://github.com/mishoo/UglifyJS2/issues/2011
// comparisons: false,
// },
// mangle: {
// safari10: true,
// },
// output: {
// comments: false,
// // Turned on because emoji and regex is not minified properly using default
// // https://github.com/facebookincubator/create-react-app/issues/2488
// ascii_only: true,
// },
// sourceMap: shouldUseSourceMap,
// }),
//正式版上线后打开去掉debuger和console
new ParallelUglifyPlugin({
cacheDir: '.cache/',
uglifyJS:{
output: {
comments: false
},
compress: {
drop_debugger: false,
drop_console: false
}
}
}),
// Note: this won't work without ExtractTextPlugin.extract(..) in `loaders`.
new ExtractTextPlugin({
filename: cssFilename,
}),
// Generate a manifest file which contains a mapping of all asset filenames
// to their corresponding output file so that tools can pick it up without
// having to parse `index.html`.
new ManifestPlugin({
fileName: 'asset-manifest.json',
}),
// Generate a service worker script that will precache, and keep up to date,
// the HTML & assets that are part of the Webpack build.
new SWPrecacheWebpackPlugin({
// By default, a cache-busting query parameter is appended to requests
// used to populate the caches, to ensure the responses are fresh.
// If a URL is already hashed by Webpack, then there is no concern
// about it being stale, and the cache-busting can be skipped.
dontCacheBustUrlsMatching: /\.\w{8}\./,
filename: 'service-worker.js',
logger(message) {
if (message.indexOf('Total precache size is') === 0) {
// This message occurs for every build and is a bit too noisy.
return;
}
if (message.indexOf('Skipping static resource') === 0) {
// This message obscures real errors so we ignore it.
// https://github.com/facebookincubator/create-react-app/issues/2612
return;
}
// console.log(message);
},
minify: true,
// For unknown URLs, fallback to the index page
navigateFallback: publicUrl + '/index.html',
// Ignores URLs starting from /__ (useful for Firebase):
// https://github.com/facebookincubator/create-react-app/issues/2237#issuecomment-302693219
navigateFallbackWhitelist: [/^(?!\/__).*/],
// Don't precache sourcemaps (they're large) and build asset manifest:
staticFileGlobsIgnorePatterns: [/\.map$/, /asset-manifest\.json$/],
}),
// Moment.js is an extremely popular library that bundles large locale files
// by default due to how Webpack interprets its code. This is a practical
// solution that requires the user to opt into importing specific locales.
// https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
// You can remove this if you don't use Moment.js:
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
// new MonacoWebpackPlugin(),
],
// Some libraries import Node modules but don't use them in the browser.
// Tell Webpack to provide empty mocks for them so importing them works.
node: {
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty',
},
};

@ -98,274 +98,299 @@ function railsgettimes(proxy) {
} }
} }
window._debugType = debugType;
export function initAxiosInterceptors(props) {
initOnlineOfflineListener()
// TODO 避免重复的请求 https://github.com/axios/axios#cancellation
// https://github.com/axios/axios/issues/1497
// TODO 读取到package.json中的配置
var proxy = "http://localhost:3000"
// proxy = "http://testbdweb.trustie.net"
// proxy = "http://testbdweb.educoder.net"
// proxy = "https://testeduplus2.educoder.net"
//proxy="http://47.96.87.25:48080"
proxy = "https://pre-newweb.educoder.net"
proxy = "https://test-newweb.educoder.net"
proxy = "https://test-jupyterweb.educoder.net"
//proxy="http://192.168.2.63:3001"
// 在这里使用requestMap控制避免用户通过双击等操作发出重复的请求
// 如果需要支持重复的请求考虑config里面自定义一个allowRepeat参考来控制
const requestMap = {};
window.setfalseInRequestMap = function (keyName) {
requestMap[keyName] = false;
}
window._debugType = debugType;
export function initAxiosInterceptors(props) {
initOnlineOfflineListener()
// TODO 避免重复的请求 https://github.com/axios/axios#cancellation
let proxy = "https://test-newweb.educoder.net"
axios.interceptors.request.use( window._debugType = debugType;
config => { export function initAxiosInterceptors(props) {
// config.headers['Content-Type']= 'no-cache' initOnlineOfflineListener()
// if (token) { // 每次发送请求之前判断是否存在token如果存在则统一在http请求的header都加上token不用每次请求都手动添加了 // TODO 避免重复的请求 https://github.com/axios/axios#cancellation
// config.headers.Authorization = token;
// }
// --------------------------------------------- 測試3007连测试服的代码 let proxy = "https://test-newweb.educoder.net"
// if (url.indexOf('file_update') != -1 || url.indexOf('game_build') != -1 || url.indexOf('game_status') != -1) {
// proxy = 'https://testbdweb.trustie.net'
// } else {
// proxy = 'http://localhost:3000'
// }
// ---------------------------------------------
if (config.url.indexOf(proxy) != -1 || config.url.indexOf(':') != -1) {
return config
}
requestProxy(config)
let url = `/api${config.url}`; axios.interceptors.request.use(
config => {
// config.headers['Content-Type']= 'no-cache'
// if (token) { // 每次发送请求之前判断是否存在token如果存在则统一在http请求的header都加上token不用每次请求都手动添加了
// config.headers.Authorization = token;
// }
//qq登录去掉api // --------------------------------------------- 測試3007连测试服的代码
if (config.params && config.params.redirect_uri != undefined) { // if (url.indexOf('file_update') != -1 || url.indexOf('game_build') != -1 || url.indexOf('game_status') != -1) {
if (config.params.redirect_uri.indexOf('otherloginqq') != -1) { // proxy = 'https://testbdweb.trustie.net'
url = `${config.url}`; // } else {
// proxy = 'http://localhost:3000'
// }
// ---------------------------------------------
if (config.url.indexOf(proxy) != -1 || config.url.indexOf(':') != -1) {
return config
} }
} requestProxy(config)
if (`${config[0]}` != `true`) {
let timestamp = Date.parse(new Date()) / 1000; let url = `/api${config.url}`;
if (window.location.port === "3007") {
// let timestamp=railsgettimes(proxy); //qq登录去掉api
// console.log(timestamp) if (config.params && config.params.redirect_uri != undefined) {
railsgettimes(`${proxy}/api/main/first_stamp.json`); if (config.params.redirect_uri.indexOf('otherloginqq') != -1) {
let newopens = md5(opens + timestamp) url = `${config.url}`;
config.url = `${proxy}${url}`;
if (config.url.indexOf('?') == -1) {
config.url = `${config.url}?debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`;
} else {
config.url = `${config.url}&debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`;
} }
} else { }
// 加api前缀 if (`${config[0]}` != `true`) {
railsgettimes(`/api/main/first_stamp.json`); let timestamp = Date.parse(new Date()) / 1000;
let newopens = md5(opens + timestamp) if (window.location.port === "3007") {
config.url = url; // let timestamp=railsgettimes(proxy);
if (config.url.indexOf('?') == -1) { // console.log(timestamp)
config.url = `${config.url}?randomcode=${timestamp}&client_key=${newopens}`; railsgettimes(`${proxy}/api/main/first_stamp.json`);
let newopens = md5(opens + timestamp)
config.url = `${proxy}${url}`;
if (config.url.indexOf('?') == -1) {
config.url = `${config.url}?debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`;
} else {
config.url = `${config.url}&debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`;
}
} else { } else {
config.url = `${config.url}&randomcode=${timestamp}&client_key=${newopens}`; // 加api前缀
railsgettimes(`/api/main/first_stamp.json`);
let newopens = md5(opens + timestamp)
config.url = url;
if (config.url.indexOf('?') == -1) {
config.url = `${config.url}?randomcode=${timestamp}&client_key=${newopens}`;
} else {
config.url = `${config.url}&randomcode=${timestamp}&client_key=${newopens}`;
}
} }
} }
} //
// // console.log(config);
// console.log(config); // if (config.method === "post") {
// if (config.method === "post") { // if (requestMap[config.url] === true) { // 避免重复的请求 导致页面f5刷新 也会被阻止 显示这个方法会影响到定制信息
// if (requestMap[config.url] === true) { // 避免重复的请求 导致页面f5刷新 也会被阻止 显示这个方法会影响到定制信息 // // console.log(config);
// // console.log(config); // // console.log(JSON.parse(config));
// // console.log(JSON.parse(config)); // // console.log(config.url);
// // console.log(config.url); // // console.log("被阻止了是重复请求=================================");
// // console.log("被阻止了是重复请求================================="); // return false;
// return false; // }
// } // }
// } // 非file_update请求
// 非file_update请求 if (config.url.indexOf('update_file') === -1) {
if (config.url.indexOf('update_file') === -1) { requestMap[config.url] = true;
requestMap[config.url] = true;
window.setTimeout("setfalseInRequestMap('" + config.url + "')", 900)
window.setTimeout("setfalseInRequestMap('" + config.url + "')", 900) }
} // setTimeout("setfalseInRequestMap(" + config.url + ")", 1200)
// setTimeout("setfalseInRequestMap(" + config.url + ")", 1200) return config;
return config; },
}, err => {
err => { return Promise.reject(err);
return Promise.reject(err); });
});
window.setfalseInRequestMap = function (keyName) {
window.setfalseInRequestMap = function (keyName) { requestMap[keyName] = false;
requestMap[keyName] = false; }
}
//响应前的设置
axios.interceptors.request.use(
config => {
setpostcookie()
clearAllCookie()
// config.headers['Content-Type']= 'no-cache'
// if (token) { // 每次发送请求之前判断是否存在token如果存在则统一在http请求的header都加上token不用每次请求都手动添加了
// config.headers.Authorization = token;
// }
// --------------------------------------------- 測試3007连测试服的代码
// if (url.indexOf('file_update') != -1 || url.indexOf('game_build') != -1 || url.indexOf('game_status') != -1) {
// proxy = 'https://testbdweb.trustie.net'
// } else {
// proxy = 'http://localhost:3000'
// }
// ---------------------------------------------
if (config.url.indexOf(proxy) != -1 || config.url.indexOf(':') != -1) { //响应前的设置
return config axios.interceptors.request.use(
} config => {
requestProxy(config) setpostcookie()
clearAllCookie()
// config.headers['Content-Type']= 'no-cache'
// if (token) { // 每次发送请求之前判断是否存在token如果存在则统一在http请求的header都加上token不用每次请求都手动添加了
// config.headers.Authorization = token;
// }
// --------------------------------------------- 測試3007连测试服的代码
// if (url.indexOf('file_update') != -1 || url.indexOf('game_build') != -1 || url.indexOf('game_status') != -1) {
// proxy = 'https://testbdweb.trustie.net'
// } else {
// proxy = 'http://localhost:3000'
// }
// ---------------------------------------------
if (config.url.indexOf(proxy) != -1 || config.url.indexOf(':') != -1) {
return config
}
requestProxy(config)
let url = `/api${config.url}`; let url = `/api${config.url}`;
//qq登录去掉api //qq登录去掉api
if (config.params && config.params.redirect_uri != undefined) { if (config.params && config.params.redirect_uri != undefined) {
if (config.params.redirect_uri.indexOf('otherloginqq') != -1) { if (config.params.redirect_uri.indexOf('otherloginqq') != -1) {
url = `${config.url}`; url = `${config.url}`;
}
} }
} if (`${config[0]}` != `true`) {
if (`${config[0]}` != `true`) { let timestamp = Date.parse(new Date()) / 1000;
let timestamp = Date.parse(new Date()) / 1000; if (window.location.port === "3007") {
if (window.location.port === "3007") { railsgettimes(`${proxy}/api/main/first_stamp.json`);
railsgettimes(`${proxy}/api/main/first_stamp.json`); let newopens = md5(opens + timestamp)
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}&randomcode=${timestamp}&client_key=${newopens}`;
config.url = `${config.url}?debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`; } else {
config.url = `${config.url}debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`;
}
} else { } else {
config.url = `${config.url}debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`; railsgettimes(`/api/main/first_stamp.json`);
let newopens = md5(opens + timestamp)
config.url = url;
if (config.url.indexOf('?') == -1) {
config.url = `${config.url}?randomcode=${timestamp}&client_key=${newopens}`;
} else {
config.url = `${config.url}&randomcode=${timestamp}&client_key=${newopens}`;
}
} }
} else { setpostcookie();
railsgettimes(`/api/main/first_stamp.json`); }
let newopens = md5(opens + timestamp) if (config.method === "post") {
config.url = url; if (requestMap[config.url] === true) { // 避免重复的请求 导致页面f5刷新 也会被阻止 显示这个方法会影响到定制信息
if (config.url.indexOf('?') == -1) { return false;
config.url = `${config.url}?randomcode=${timestamp}&client_key=${newopens}`;
} else {
config.url = `${config.url}&randomcode=${timestamp}&client_key=${newopens}`;
} }
} }
setpostcookie(); // 非file_update请求
} if (config.url.indexOf('update_file') === -1) {
if (config.method === "post") { requestMap[config.url] = true;
if (requestMap[config.url] === true) { // 避免重复的请求 导致页面f5刷新 也会被阻止 显示这个方法会影响到定制信息
return false; window.setTimeout("setfalseInRequestMap('" + config.url + "')", 900)
} }
} // setTimeout("setfalseInRequestMap(" + config.url + ")", 1200)
// 非file_update请求 return config;
if (config.url.indexOf('update_file') === -1) { },
requestMap[config.url] = true; err => {
return Promise.reject(err);
});
window.setTimeout("setfalseInRequestMap('" + config.url + "')", 900) axios.interceptors.response.use(function (response) {
}
// setTimeout("setfalseInRequestMap(" + config.url + ")", 1200)
return config;
},
err => {
return Promise.reject(err);
});
axios.interceptors.response.use(function (response) { if (response === undefined) {
return
}
if (response.data.status === -1) {
// console.error('error:', response.data.message)
// throw new Error()
// https://github.com/axios/axios/issues?utf8=%E2%9C%93&q=cancel+request+in+response+interceptors+
// https://github.com/axios/axios/issues/583
// message.info(response.data.message || '服务端返回status -1请联系管理员。');
// props.showSnackbar( response.data.message || '服务器异常,请联系管理员。' )
if (window.location.pathname.startsWith('/tasks/')) {
props.showSnackbar(response.data.message || '服务器异常,请联系管理员。')
} else {
notification.open({
message: "提示",
description: response.data.message || '服务器异常,请联系管理员。',
style: {
zIndex: 99999999
},
});
// notification['error']({
// message:"提示",
// description: response.data.message || '服务器异常,请联系管理员。',
// });
}
if (response === undefined) { throw new axios.Cancel('Operation canceled by the user.');
return
}
if (response.data.status === -1) {
// console.error('error:', response.data.message)
// throw new Error()
// https://github.com/axios/axios/issues?utf8=%E2%9C%93&q=cancel+request+in+response+interceptors+
// https://github.com/axios/axios/issues/583
// message.info(response.data.message || '服务端返回status -1请联系管理员。');
// props.showSnackbar( response.data.message || '服务器异常,请联系管理员。' )
if (window.location.pathname.startsWith('/tasks/')) {
props.showSnackbar(response.data.message || '服务器异常,请联系管理员。')
} else { } else {
notification.open({ // hash跳转
message: "提示", // var hash = window.location.hash;
description: response.data.message || '服务器异常,请联系管理员。', // if (hash) {
style: { // hashTimeout && window.clearTimeout(hashTimeout)
zIndex: 99999999 // hashTimeout = setTimeout(() => {
}, // var element = document.querySelector(hash);
}); // if (element) {
// notification['error']({ // element.scrollIntoView();
// message:"提示", // }
// description: response.data.message || '服务器异常,请联系管理员。', // }, 400)
// }); // }
} }
// if(response.data.status === 401){
throw new axios.Cancel('Operation canceled by the user.'); // console.log("401401401")
} else {
// hash跳转
// var hash = window.location.hash;
// if (hash) {
// hashTimeout && window.clearTimeout(hashTimeout)
// hashTimeout = setTimeout(() => {
// var element = document.querySelector(hash);
// if (element) {
// element.scrollIntoView();
// }
// }, 400)
// } // }
} if (response.data.status === 403 || response.data.status === "403") {
// if(response.data.status === 401){
// console.log("401401401")
// }
if (response.data.status === 403 || response.data.status === "403") {
locationurl('/403'); locationurl('/403');
} }
if (response.data.status === 404) { if (response.data.status === 404) {
locationurl('/nopage'); locationurl('/nopage');
} }
if (response.data.status === 500) { if (response.data.status === 500) {
locationurl('/500'); locationurl('/500');
} }
if (response.data.status === 501) { if (response.data.status === 501) {
if (message501 === false) { if (message501 === false) {
message501 = true message501 = true
notification.open({ notification.open({
message: "提示", message: "提示",
description: response.data.message || '访问异常,请求不合理', description: response.data.message || '访问异常,请求不合理',
style: { style: {
zIndex: 99999999 zIndex: 99999999
} }
}) })
}
window.setTimeout(function () {
message501 = false
}, 2000);
} }
window.setTimeout(function () { requestMap[response.config.url] = false;
message501 = false setpostcookie();
}, 2000); return response;
} }, function (error) {
requestMap[response.config.url] = false; return Promise.reject(error);
setpostcookie(); });
return response; // -----------------------------------------------------------------------------------
}, function (error) {
return Promise.reject(error);
});
// -----------------------------------------------------------------------------------
} }
function initOnlineOfflineListener() { function initOnlineOfflineListener() {
const $ = window.$ const $ = window.$
$(window).bind("online", () => { $(window).bind("online", () => {
notification.destroy() notification.destroy()
notification.success({ notification.success({
duration: 2, duration: 2,
message: '网络恢复正常', message: '网络恢复正常',
description: description:
'网络恢复正常,感谢使用。', '网络恢复正常,感谢使用。',
}) })
}); });
$(window).bind("offline", () => { $(window).bind("offline", () => {
notification.destroy() notification.destroy()
notification.warning({ notification.warning({
duration: null, duration: null,
message: '网络异常', message: '网络异常',
description: description:
'网络异常,请检测网络后重试。', '网络异常,请检测网络后重试。',
}) })
}); });
} }

@ -1,4 +1,4 @@
import React, {Component} from 'react'; import React, { Component } from 'react';
import { import {
Button, Button,
} from 'antd'; } from 'antd';
@ -12,11 +12,11 @@ class Bottomsubmit extends Component {
cannelfun = () => { cannelfun = () => {
// window.location.href= // window.location.href=
if(this.props.Cohetepaperbool===true){ if (this.props.Cohetepaperbool === true) {
this.props.setCohetepaperbool(false); this.props.setCohetepaperbool(false);
}else { } else {
this.props.history.replace(this.props.url); this.props.history.replace(this.props.url);
} }
} }
@ -39,8 +39,8 @@ class Bottomsubmit extends Component {
<button type="button" className="ant-btn mr20 newshixunmode backgroundFFF" onClick={() => this.cannelfun()}> <button type="button" className="ant-btn mr20 newshixunmode backgroundFFF" onClick={() => this.cannelfun()}>
<span> </span></button> <span> </span></button>
<Button type="button" className="ant-btn newshixunmode mr40 ant-btn-primary" type="primary" <Button type="button" className="ant-btn newshixunmode mr40 ant-btn-primary" type="primary"
htmlType="submit" onClick={() => this.props.onSubmits()} htmlType="submit" onClick={() => this.props.onSubmits()}
loading={this.props.loadings}><span>{this.props.bottomvalue===undefined?"保存":this.props.bottomvalue}</span></Button> loading={this.props.loadings}><span>{this.props.bottomvalue === undefined ? "保存" : this.props.bottomvalue}</span></Button>
</div> </div>
</div> </div>
</div> </div>

@ -54,11 +54,15 @@ class Repository extends Component {
let { match, author, git_url, lastest_commit,repositoryLoading, commits,trees,pathArray , TPMRightSectionData } = this.props; let { match, author, git_url, lastest_commit,repositoryLoading, commits,trees,pathArray , TPMRightSectionData } = this.props;
let matchpath =this.props.match.path; let matchpath =this.props.match.path;
let Repositoryflag =""; let Repositoryflag ="";
if(matchpath==="/shixuns/:shixunId/repository"){
if( matchpath.indexOf("repository")>-1){
Repositoryflag ="repository"; Repositoryflag ="repository";
}else if(matchpath==="/shixuns/:shixunId/secret_repository"){ }
if(matchpath.indexOf("secret_repository")>-1){
Repositoryflag ="secret_repository"; Repositoryflag ="secret_repository";
} }
if (!author) { if (!author) {
author = {} author = {}
} }

@ -2,6 +2,7 @@ import React, { Component } from 'react';
import { Form , Upload , Input , notification, message } from 'antd'; import { Form , Upload , Input , notification, message } from 'antd';
import axios from 'axios'; import axios from 'axios';
import { getupload_git_file } from 'educoder'; import { getupload_git_file } from 'educoder';
import Repositoryfile from './Repositoryfile';
import Bottomsubmit from "../../../modals/Bottomsubmit"; import Bottomsubmit from "../../../modals/Bottomsubmit";
import "./Repository.css" import "./Repository.css"
const { Dragger } = Upload; const { Dragger } = Upload;
@ -10,6 +11,7 @@ class RepositoryAddFileupload_files extends Component {
super(props); super(props);
this.state={ this.state={
filspath:"", filspath:"",
visibles:false,
message:undefined, message:undefined,
fileList: [ fileList: [
// { // {
@ -49,23 +51,17 @@ class RepositoryAddFileupload_files extends Component {
console.log(info) console.log(info)
console.log(info.file) console.log(info.file)
// if (info.file.status === 'done') {
// notification.open({ let fileList = [...info.fileList];
// message: '提示', fileList = fileList.slice(-2);
// description: result.data.messages, fileList = fileList.map(file => {
// }); if (file.response) {
let fileList = [...info.fileList]; file.url = file.response.url;
fileList = fileList.slice(-2); }
fileList = fileList.map(file => { return file;
if (file.response) { });
file.url = file.response.url; this.setState({ fileList });
} }
return file;
});
this.setState({ fileList });
}; };
onAttachmentRemove=(info)=>{ onAttachmentRemove=(info)=>{
@ -110,6 +106,24 @@ class RepositoryAddFileupload_files extends Component {
message:e.target.value message:e.target.value
}) })
} }
Selectfiledirectory=()=>{
this.setState({
visibles:true
})
}
hideNewFolder=()=>{
this.setState({
visibles:false
})
}
selectupfilspath=(value)=>{
this.setState({
filspath:value
})
}
render(){ render(){
const {getFieldDecorator} = this.props.form; const {getFieldDecorator} = this.props.form;
let { shixunId } = this.props.match.params; let { shixunId } = this.props.match.params;
@ -151,7 +165,7 @@ class RepositoryAddFileupload_files extends Component {
message:this.state.message, message:this.state.message,
secret_repository:Repositoryflagtype secret_repository:Repositoryflagtype
}, },
// fileList:this.state.fileList, fileList:this.state.fileList,
// showUploadList:false, // showUploadList:false,
action: `${getupload_git_file(shixunId)}`, action: `${getupload_git_file(shixunId)}`,
onChange: this.handleChange, onChange: this.handleChange,
@ -170,6 +184,15 @@ class RepositoryAddFileupload_files extends Component {
return( return(
<div> <div>
{this.state.visibles===true?<Repositoryfile
titles={"选择文件上传目录"}
evaluationvisible={this.state.visibles}
hideNewFolder={this.hideNewFolder}
{...this.state}
{...this.props}
selectupfils={true}
selectupfilspath={(value)=>this.selectupfilspath(value)}
/>:""}
<div className="educontent mt30"> <div className="educontent mt30">
<style> <style>
{` {`
@ -230,7 +253,7 @@ class RepositoryAddFileupload_files extends Component {
<p className="ant-form-item-label"> <p className="ant-form-item-label">
<div className={"color888 font-16"}>{this.state.filspath} <span className={"color-blue"}>选择文件目录</span></div> <div className={"color888 font-16"}>当前目录{this.state.filspath===""?"./":this.state.filspath} <span className={"color-blue"} onClick={this.Selectfiledirectory}>选择文件目录</span></div>
</p> </p>
{/*<div className="mt10 mb25 repoCMWrapper filecode">*/} {/*<div className="mt10 mb25 repoCMWrapper filecode">*/}

@ -30,10 +30,12 @@ class Repositoryfile extends Component{
let {main} =this.state; let {main} =this.state;
let matchpath =this.props.match.path; let matchpath =this.props.match.path;
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
let url =""; let url ="";
if(matchpath==="/shixuns/:shixunId/repository"){ if( matchpath.indexOf("repository")>-1){
url ="/shixuns/"+id+"/repository.json"; url ="/shixuns/"+id+"/repository.json";
}else if(matchpath==="/shixuns/:shixunId/secret_repository"){ }
if(matchpath.indexOf("secret_repository")>-1){
url ="/shixuns/"+id+"/secret_repository.json"; url ="/shixuns/"+id+"/secret_repository.json";
} }
let newmain=[] let newmain=[]
@ -68,12 +70,13 @@ class Repositoryfile extends Component{
let matchpath =this.props.match.path; let matchpath =this.props.match.path;
let url =""; let url ="";
if(matchpath==="/shixuns/:shixunId/repository"){
if( matchpath.indexOf("repository")>-1){
url ="/shixuns/"+id+"/repository.json"; url ="/shixuns/"+id+"/repository.json";
}else if(matchpath==="/shixuns/:shixunId/secret_repository"){ }
if(matchpath.indexOf("secret_repository")>-1){
url ="/shixuns/"+id+"/secret_repository.json"; url ="/shixuns/"+id+"/secret_repository.json";
} }
let ary=main; let ary=main;
let paths=path; let paths=path;
@ -115,34 +118,44 @@ class Repositoryfile extends Component{
} }
handleSubmit = (e) => { handleSubmit = (e) => {
let {path}=this.state; let {path}=this.state;
let matchpath =this.props.match.path; let matchpath =this.props.match.path;
let flag =false; let flag =false;
if(matchpath==="/shixuns/:shixunId/repository"){
flag =false; if( matchpath.indexOf("repository")>-1){
}else if(matchpath==="/shixuns/:shixunId/secret_repository"){ flag =false;
flag =true; }
} if(matchpath.indexOf("secret_repository")>-1){
flag =true;
let url=`/shixuns/${this.props.match.params.shixunId}/upload_git_folder.json`; }
this.props.form.validateFieldsAndScroll((err, values) => { if(this.props.selectupfils===true){
if (!err) { console.log(path)
console.log('Received values of form: ', values); this.props.selectupfilspath(path);
let paths=path+values.name; this.props.showNotification("选择文件目录成功")
axios.post(url,{ this.props.hideNewFolder();
path: paths, }else{
secret_repository:flag, let url=`/shixuns/${this.props.match.params.shixunId}/upload_git_folder.json`;
}).then((result)=>{ this.props.form.validateFieldsAndScroll((err, values) => {
if(result){ if (!err) {
if(result.data.status===0){ console.log('Received values of form: ', values);
this.props.showNotification("新建成功") let paths=path+values.name;
axios.post(url,{
path: paths,
secret_repository:flag,
}).then((result)=>{
if(result){
if(result.data.status===0){
this.props.showNotification("新建成功")
this.props.hideNewFolder();
}
} }
} }).catch((error)=>{
}).catch((error)=>{ console.log(error);
console.log(error); })
}) }
} });
}); }
}; };
render(){ render(){
@ -154,7 +167,7 @@ class Repositoryfile extends Component{
return( return(
evaluationvisible===true?<Modal evaluationvisible===true?<Modal
keyboard={false} keyboard={false}
title="新建文件夹" title={this.props.titles?this.props.titles:"新建文件夹"}
visible={evaluationvisible} visible={evaluationvisible}
closable={false} closable={false}
footer={false} footer={false}
@ -199,10 +212,10 @@ class Repositoryfile extends Component{
<span onClick={()=>this.savegetfilepath(path+item.name,item.type)}>{item.name}</span> <span onClick={()=>this.savegetfilepath(path+item.name,item.type)}>{item.name}</span>
</a> </a>
*/} */}
<div className="clearfix mt5"> <div className="clearfix mt5">
<label className=" mt5">选中的新建文件夹目录</label> <label className=" mt5">选中的新建文件夹目录</label>
<div className={"mt5 mb5"} >{path}</div> <div className={"mt5 mb5"} >{path}</div>
<Form> {this.props.selectupfils===true?"": <Form>
<Form.Item <Form.Item
className="mt15" className="mt15"
> >
@ -218,15 +231,18 @@ class Repositoryfile extends Component{
/> />
)} )}
</Form.Item> </Form.Item>
</Form> </Form>}
</div> </div>
<a className="task-btn task-btn-orange fr" <div className={"clearfix edu-txt-center mt20"}>
style={{marginTop: '20px',marginLeft:'20px'}} id="add_path" <a className="task-btn task-btn-orange fr"
// onClick={()=>this.evaluationenter()} style={{marginTop: '20px',marginLeft:'20px'}} id="add_path"
onClick={() => this.handleSubmit()}>确定</a> // onClick={()=>this.evaluationenter()}
<a className="pop_close task-btn mb10 fr" onClick={() => this.handleSubmit()}>确定</a>
style={{marginTop: '20px'}} id="back_page" onClick={()=>this.evaluationhideModal()}>取消</a> <a className="pop_close task-btn mb10 fr"
style={{marginTop: '20px'}} id="back_page" onClick={()=>this.evaluationhideModal()}>取消</a>
</div>
</div> </div>
</div> </div>
</Modal>:"" </Modal>:""

Loading…
Cancel
Save