diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..7a73a41b
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
diff --git a/config/webpack.config.prod.js b/config/webpack.config.prod.js
index a7b2c9f4..4a9d9465 100644
--- a/config/webpack.config.prod.js
+++ b/config/webpack.config.prod.js
@@ -19,7 +19,8 @@ const getClientEnvironment = require("./env");
let publicPath = "/react/build/";
const publicUrl = publicPath.slice(0, -1);
-const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
+// const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
+const shouldUseSourceMap = process.env.NODE_ENV !== "production";
const env = getClientEnvironment(publicPath);
// This is the production configuration.
@@ -54,7 +55,8 @@ module.exports = {
},
bail: true,
mode: "production",
- devtool: false, //测试版
+ // devtool: false, //测试版
+ devtool: shouldUseSourceMap?'source-map':false,
entry: [require.resolve("./polyfills"), paths.appIndexJs],
output: {
path: paths.appBuild,
diff --git a/package-lock.json b/package-lock.json
index 31e8c629..9ea84263 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
- "name": "educoder",
- "version": "0.1.0",
+ "name": "forge",
+ "version": "3.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -990,6 +990,18 @@
"react-lifecycles-compat": "^3.0.4",
"warning": "^4.0.3"
}
+ },
+ "react-slick": {
+ "version": "0.25.2",
+ "resolved": "https://registry.nlark.com/react-slick/download/react-slick-0.25.2.tgz",
+ "integrity": "sha1-VjMbZ9R9i8/i3OtqyrHI/VvR9rw=",
+ "requires": {
+ "classnames": "^2.2.5",
+ "enquire.js": "^2.1.6",
+ "json2mq": "^0.2.0",
+ "lodash.debounce": "^4.0.8",
+ "resize-observer-polyfill": "^1.5.0"
+ }
}
}
},
@@ -1261,7 +1273,7 @@
},
"babel-cli": {
"version": "6.26.0",
- "resolved": "https://registry.npm.taobao.org/babel-cli/download/babel-cli-6.26.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
"integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
"dev": true,
"requires": {
@@ -1284,7 +1296,7 @@
"dependencies": {
"chokidar": {
"version": "1.7.0",
- "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz?cache=0&sync_timestamp=1602585438968&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-1.7.0.tgz",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"dev": true,
"optional": true,
@@ -1302,7 +1314,7 @@
},
"source-map": {
"version": "0.5.7",
- "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
}
@@ -1401,7 +1413,7 @@
},
"babel-helper-bindify-decorators": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-helper-bindify-decorators/download/babel-helper-bindify-decorators-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
"integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
"dev": true,
"requires": {
@@ -1464,7 +1476,7 @@
},
"babel-helper-explode-class": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-helper-explode-class/download/babel-helper-explode-class-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
"integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
"dev": true,
"requires": {
@@ -1664,7 +1676,7 @@
},
"babel-plugin-syntax-async-generators": {
"version": "6.13.0",
- "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-async-generators/download/babel-plugin-syntax-async-generators-6.13.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
"integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
"dev": true
},
@@ -1675,7 +1687,7 @@
},
"babel-plugin-syntax-decorators": {
"version": "6.13.0",
- "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-decorators/download/babel-plugin-syntax-decorators-6.13.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
"integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
"dev": true
},
@@ -1711,7 +1723,7 @@
},
"babel-plugin-transform-async-generator-functions": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-async-generator-functions/download/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
"integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
"dev": true,
"requires": {
@@ -1743,7 +1755,7 @@
},
"babel-plugin-transform-decorators": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-decorators/download/babel-plugin-transform-decorators-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
"integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
"dev": true,
"requires": {
@@ -2048,7 +2060,7 @@
},
"babel-plugin-transform-runtime": {
"version": "6.23.0",
- "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-runtime/download/babel-plugin-transform-runtime-6.23.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz",
"integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=",
"requires": {
"babel-runtime": "^6.22.0"
@@ -2065,9 +2077,8 @@
},
"babel-polyfill": {
"version": "6.26.0",
- "resolved": "https://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
"integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
- "dev": true,
"requires": {
"babel-runtime": "^6.26.0",
"core-js": "^2.5.0",
@@ -2076,9 +2087,8 @@
"dependencies": {
"regenerator-runtime": {
"version": "0.10.5",
- "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz?cache=0&sync_timestamp=1595456367497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.10.5.tgz",
- "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
- "dev": true
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
}
}
},
@@ -2121,7 +2131,7 @@
},
"babel-preset-es2015": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-preset-es2015/download/babel-preset-es2015-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
"integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
"dev": true,
"requires": {
@@ -2169,7 +2179,7 @@
},
"babel-preset-react": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-preset-react/download/babel-preset-react-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz",
"integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
"requires": {
"babel-plugin-syntax-jsx": "^6.3.13",
@@ -2202,7 +2212,7 @@
},
"babel-preset-stage-2": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-preset-stage-2/download/babel-preset-stage-2-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
"integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
"dev": true,
"requires": {
@@ -2214,7 +2224,7 @@
},
"babel-preset-stage-3": {
"version": "6.24.1",
- "resolved": "https://registry.npm.taobao.org/babel-preset-stage-3/download/babel-preset-stage-3-6.24.1.tgz",
+ "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
"integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
"dev": true,
"requires": {
@@ -2367,6 +2377,12 @@
}
}
},
+ "base16": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/base16/download/base16-1.0.0.tgz",
+ "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=",
+ "dev": true
+ },
"base64-js": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
@@ -3409,9 +3425,9 @@
"integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="
},
"clipboard": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz",
- "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==",
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz",
+ "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==",
"requires": {
"good-listener": "^1.2.2",
"select": "^1.1.2",
@@ -3491,7 +3507,7 @@
},
"code-prettify": {
"version": "0.1.0",
- "resolved": "https://registry.npm.taobao.org/code-prettify/download/code-prettify-0.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/code-prettify/-/code-prettify-0.1.0.tgz",
"integrity": "sha1-RocMyMGlDQm61TmzOpg9vUqjSx4="
},
"codemirror": {
@@ -3859,6 +3875,69 @@
"warning": "^4.0.3"
}
},
+ "cross-env": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+ "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "requires": {
+ "cross-spawn": "^7.0.1"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "cross-fetch": {
+ "version": "3.1.4",
+ "resolved": "https://registry.nlark.com/cross-fetch/download/cross-fetch-3.1.4.tgz",
+ "integrity": "sha1-lyPzo6JHv4uJA586OAqSROj6Lzk=",
+ "dev": true,
+ "requires": {
+ "node-fetch": "2.6.1"
+ },
+ "dependencies": {
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.nlark.com/node-fetch/download/node-fetch-2.6.1.tgz?cache=0&sync_timestamp=1626684741221&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.1.tgz",
+ "integrity": "sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI=",
+ "dev": true
+ }
+ }
+ },
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
@@ -3893,11 +3972,6 @@
"randomfill": "^1.0.3"
}
},
- "crypto-js": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/crypto-js/download/crypto-js-4.0.0.tgz",
- "integrity": "sha1-KQSrJnep0EKFai6i74DekuSjbcw="
- },
"crypto-random-string": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
@@ -5063,11 +5137,11 @@
}
},
"echarts": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/echarts/-/echarts-4.7.0.tgz",
- "integrity": "sha512-NlOTdUcAsIyCCG+N4uh0ZEvXtrPW2jvcuqf03RyqYeCKzyPbiOQ4I3MdKXMhxG3lBdqQNdNXVT71SB4KTQjN0A==",
+ "version": "4.9.0",
+ "resolved": "https://registry.nlark.com/echarts/download/echarts-4.9.0.tgz",
+ "integrity": "sha1-qbm6oD8Doqcx5jQMVb77V6nhNH0=",
"requires": {
- "zrender": "4.3.0"
+ "zrender": "4.3.2"
}
},
"echarts-wordcloud": {
@@ -6209,6 +6283,41 @@
"bser": "2.1.1"
}
},
+ "fbemitter": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/fbemitter/download/fbemitter-3.0.0.tgz",
+ "integrity": "sha1-ALKhr1QRJUqrQWzXX55iib7kv/M=",
+ "dev": true,
+ "requires": {
+ "fbjs": "^3.0.0"
+ },
+ "dependencies": {
+ "fbjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/fbjs/download/fbjs-3.0.0.tgz?cache=0&sync_timestamp=1602048313843&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffbjs%2Fdownload%2Ffbjs-3.0.0.tgz",
+ "integrity": "sha1-CQcGf7P1enj0XZXx6s/8rNYjwWU=",
+ "dev": true,
+ "requires": {
+ "cross-fetch": "^3.0.4",
+ "fbjs-css-vars": "^1.0.0",
+ "loose-envify": "^1.0.0",
+ "object-assign": "^4.1.0",
+ "promise": "^7.1.1",
+ "setimmediate": "^1.0.5",
+ "ua-parser-js": "^0.7.18"
+ }
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz",
+ "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
+ "dev": true,
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ }
+ }
+ },
"fbjs": {
"version": "0.8.17",
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
@@ -6238,6 +6347,12 @@
}
}
},
+ "fbjs-css-vars": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/fbjs-css-vars/download/fbjs-css-vars-1.0.2.tgz",
+ "integrity": "sha1-IWVRE2rgL+JVkyw+yHdfGOLAeLg=",
+ "dev": true
+ },
"fecha": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
@@ -6682,6 +6797,42 @@
"readable-stream": "^2.3.6"
}
},
+ "flux": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npm.taobao.org/flux/download/flux-4.0.1.tgz",
+ "integrity": "sha1-eENQKwKEHUqqU0rws3MDSh917lw=",
+ "dev": true,
+ "requires": {
+ "fbemitter": "^3.0.0",
+ "fbjs": "^3.0.0"
+ },
+ "dependencies": {
+ "fbjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/fbjs/download/fbjs-3.0.0.tgz?cache=0&sync_timestamp=1602048313843&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffbjs%2Fdownload%2Ffbjs-3.0.0.tgz",
+ "integrity": "sha1-CQcGf7P1enj0XZXx6s/8rNYjwWU=",
+ "dev": true,
+ "requires": {
+ "cross-fetch": "^3.0.4",
+ "fbjs-css-vars": "^1.0.0",
+ "loose-envify": "^1.0.0",
+ "object-assign": "^4.1.0",
+ "promise": "^7.1.1",
+ "setimmediate": "^1.0.5",
+ "ua-parser-js": "^0.7.18"
+ }
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz",
+ "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
+ "dev": true,
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ }
+ }
+ },
"flv.js": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/flv.js/-/flv.js-1.5.0.tgz",
@@ -9898,6 +10049,11 @@
"esprima": "^4.0.0"
}
},
+ "js2wordcloud": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npm.taobao.org/js2wordcloud/download/js2wordcloud-1.1.12.tgz",
+ "integrity": "sha1-8BdC2k5qyzAAsoY1dmQWjvn8o64="
+ },
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
@@ -10320,6 +10476,12 @@
"resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz",
"integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU="
},
+ "lodash.curry": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npm.taobao.org/lodash.curry/download/lodash.curry-4.1.1.tgz",
+ "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=",
+ "dev": true
+ },
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -10330,6 +10492,12 @@
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
"integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
},
+ "lodash.flow": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npm.taobao.org/lodash.flow/download/lodash.flow-3.5.0.tgz",
+ "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=",
+ "dev": true
+ },
"lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
@@ -11551,7 +11719,7 @@
},
"output-file-sync": {
"version": "1.1.2",
- "resolved": "https://registry.npm.taobao.org/output-file-sync/download/output-file-sync-1.1.2.tgz",
+ "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
"integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
"dev": true,
"requires": {
@@ -13960,6 +14128,12 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
+ "pure-color": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npm.taobao.org/pure-color/download/pure-color-1.3.0.tgz",
+ "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=",
+ "dev": true
+ },
"purgecss": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.1.2.tgz",
@@ -14034,9 +14208,9 @@
"integrity": "sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8="
},
"qrcode.react": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-1.0.0.tgz",
- "integrity": "sha512-jBXleohRTwvGBe1ngV+62QvEZ/9IZqQivdwzo9pJM4LQMoCM2VnvNBnKdjvGnKyDZ/l0nCDgsPod19RzlPvm/Q==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/qrcode.react/download/qrcode.react-1.0.1.tgz",
+ "integrity": "sha1-KDS7UOXidf/lr2kG7/FTkf6eOKU=",
"requires": {
"loose-envify": "^1.4.0",
"prop-types": "^15.6.0",
@@ -14731,6 +14905,18 @@
"prop-types": "^15.6.2"
}
},
+ "react-base16-styling": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npm.taobao.org/react-base16-styling/download/react-base16-styling-0.6.0.tgz",
+ "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=",
+ "dev": true,
+ "requires": {
+ "base16": "^1.0.0",
+ "lodash.curry": "^4.0.1",
+ "lodash.flow": "^3.3.0",
+ "pure-color": "^1.2.0"
+ }
+ },
"react-beautiful-dnd": {
"version": "10.1.1",
"resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-10.1.1.tgz",
@@ -15096,6 +15282,18 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "react-json-view": {
+ "version": "1.21.3",
+ "resolved": "https://registry.npm.taobao.org/react-json-view/download/react-json-view-1.21.3.tgz",
+ "integrity": "sha1-8YQgnujxvzdPsMQbCBPP9UVJxHU=",
+ "dev": true,
+ "requires": {
+ "flux": "^4.0.1",
+ "react-base16-styling": "^0.6.0",
+ "react-lifecycles-compat": "^3.0.4",
+ "react-textarea-autosize": "^8.3.2"
+ }
+ },
"react-jss": {
"version": "8.6.1",
"resolved": "https://registry.npmjs.org/react-jss/-/react-jss-8.6.1.tgz",
@@ -15255,9 +15453,9 @@
}
},
"react-slick": {
- "version": "0.25.2",
- "resolved": "https://registry.nlark.com/react-slick/download/react-slick-0.25.2.tgz",
- "integrity": "sha1-VjMbZ9R9i8/i3OtqyrHI/VvR9rw=",
+ "version": "0.28.1",
+ "resolved": "https://registry.nlark.com/react-slick/download/react-slick-0.28.1.tgz",
+ "integrity": "sha1-EsGNmRtZQy35w3V7pUCiJ7P7hbk=",
"requires": {
"classnames": "^2.2.5",
"enquire.js": "^2.1.6",
@@ -15284,6 +15482,34 @@
"prop-types": "^15.5.4"
}
},
+ "react-textarea-autosize": {
+ "version": "8.3.3",
+ "resolved": "https://registry.nlark.com/react-textarea-autosize/download/react-textarea-autosize-8.3.3.tgz?cache=0&sync_timestamp=1622628433420&other_urls=https%3A%2F%2Fregistry.nlark.com%2Freact-textarea-autosize%2Fdownload%2Freact-textarea-autosize-8.3.3.tgz",
+ "integrity": "sha1-9wkTlFNp2kU/1VTBaPa6rNH6BNg=",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.10.2",
+ "use-composed-ref": "^1.0.0",
+ "use-latest": "^1.0.0"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.14.8",
+ "resolved": "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.14.8.tgz",
+ "integrity": "sha1-cRmlb0IQGIUmlCkLn5FICXORtEY=",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.9",
+ "resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&sync_timestamp=1626993001371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz",
+ "integrity": "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I=",
+ "dev": true
+ }
+ }
+ },
"react-transition-group": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
@@ -16406,6 +16632,11 @@
}
}
},
+ "save-dev": {
+ "version": "0.0.1-security",
+ "resolved": "https://registry.npmjs.org/save-dev/-/save-dev-0.0.1-security.tgz",
+ "integrity": "sha512-k6knZTDNK8PKKbIqnvxiOveJinuw2LcQjqDoaorZWP9M5AR2EPsnpDeSbeoZZ0pHr5ze1uoaKdK8NBGQrJ34Uw=="
+ },
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
@@ -17040,6 +17271,11 @@
"is-fullwidth-code-point": "^2.0.0"
}
},
+ "slick-carousel": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npm.taobao.org/slick-carousel/download/slick-carousel-1.8.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslick-carousel%2Fdownload%2Fslick-carousel-1.8.1.tgz",
+ "integrity": "sha1-pL+ykBSIe7Zs5Si5C9DNomLMj40="
+ },
"snapdragon": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@@ -18374,6 +18610,12 @@
"integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
"dev": true
},
+ "ts-essentials": {
+ "version": "2.0.12",
+ "resolved": "https://registry.nlark.com/ts-essentials/download/ts-essentials-2.0.12.tgz",
+ "integrity": "sha1-yTA/PXT3X6dSjD1JuA4ImrCdh0U=",
+ "dev": true
+ },
"tslib": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
@@ -18883,9 +19125,33 @@
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
},
+ "use-composed-ref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/use-composed-ref/download/use-composed-ref-1.1.0.tgz",
+ "integrity": "sha1-kiDk6UqXt7AtfSfq6rCzcDRDi7w=",
+ "dev": true,
+ "requires": {
+ "ts-essentials": "^2.0.3"
+ }
+ },
+ "use-isomorphic-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/use-isomorphic-layout-effect/download/use-isomorphic-layout-effect-1.1.1.tgz",
+ "integrity": "sha1-e7ZYkXDNKYehUgQvkIT57/t1wiU=",
+ "dev": true
+ },
+ "use-latest": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/use-latest/download/use-latest-1.2.0.tgz",
+ "integrity": "sha1-pE9lcrgojgly7EEb3QhAraNm8jI=",
+ "dev": true,
+ "requires": {
+ "use-isomorphic-layout-effect": "^1.0.0"
+ }
+ },
"user-home": {
"version": "1.1.1",
- "resolved": "https://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
"integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
"dev": true
},
@@ -18942,7 +19208,7 @@
},
"v8flags": {
"version": "2.1.1",
- "resolved": "https://registry.npm.taobao.org/v8flags/download/v8flags-2.1.1.tgz?cache=0&sync_timestamp=1590964281452&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv8flags%2Fdownload%2Fv8flags-2.1.1.tgz",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
"integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
"dev": true,
"requires": {
@@ -20486,6 +20752,16 @@
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
},
+ "xterm": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npm.taobao.org/xterm/download/xterm-4.8.1.tgz",
+ "integrity": "sha1-FVoXKaQ+Gom0BlJOIsVjQznjnKE="
+ },
+ "xterm-addon-fit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npm.taobao.org/xterm-addon-fit/download/xterm-addon-fit-0.4.0.tgz",
+ "integrity": "sha1-BuDF0KaqrPsAnvVl76HIHpPZAZM="
+ },
"y18n": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
@@ -20523,9 +20799,9 @@
}
},
"zrender": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/zrender/-/zrender-4.3.0.tgz",
- "integrity": "sha512-Dii6j2bDsPkxQayuVf2DXJeruIB/mKVxxcGRZQ9GExiBd4c3w7+oBuvo1O/JGHeFeA1nCmSDVDs/S7yKZG1nrA=="
+ "version": "4.3.2",
+ "resolved": "https://registry.npm.taobao.org/zrender/download/zrender-4.3.2.tgz",
+ "integrity": "sha1-7HQy+UFcgsc1hLa3uMR+GwFiCcY="
}
}
}
diff --git a/package.json b/package.json
index 2e61175b..04142cb4 100644
--- a/package.json
+++ b/package.json
@@ -22,10 +22,11 @@
"case-sensitive-paths-webpack-plugin": "2.1.1",
"chalk": "1.1.3",
"classnames": "^2.2.5",
- "clipboard": "^2.0.6",
+ "clipboard": "^2.0.8",
"code-prettify": "^0.1.0",
"codemirror": "^5.53.0",
"connected-react-router": "4.4.1",
+ "cross-env": "^7.0.3",
"css-loader": "^3.5.2",
"dompurify": "^2.0.15",
"dotenv": "4.0.0",
@@ -103,6 +104,7 @@
"redux-thunk": "2.3.0",
"rsuite": "^4.3.4",
"sass-loader": "7.3.1",
+ "save-dev": "0.0.1-security",
"scroll-into-view": "^1.14.2",
"showdown": "^1.9.1",
"showdown-katex": "^0.8.0",
@@ -122,8 +124,8 @@
},
"scripts": {
"start": "node --max_old_space_size=15360 scripts/start.js",
- "build": "NODE_ENV=production node --max_old_space_size=15360 scripts/build.js",
- "test-build": "NODE_ENV=testBuild node --max_old_space_size=15360 scripts/build.js",
+ "build": "cross-env NODE_ENV=production node --max_old_space_size=15360 scripts/build.js",
+ "test-build": "cross-env NODE_ENV=testBuild node --max_old_space_size=15360 scripts/build.js",
"pre-build": "NODE_ENV=preBuild node --max_old_space_size=15360 scripts/build.js",
"gen_stats": "NODE_ENV=production webpack --profile --config=./config/webpack.config.prod.js --json > stats.json",
"ana": "webpack-bundle-analyzer ./stats.json",
@@ -193,6 +195,7 @@
"babel-core": "^6.26.0",
"babel-plugin-import": "^1.13.0",
"babel-plugin-transform-runtime": "^6.23.0",
+ "babel-polyfill": "^6.26.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1",
"babel-preset-stage-2": "^6.24.1",
@@ -203,6 +206,7 @@
"node-sass": "^4.12.0",
"optimize-css-assets-webpack-plugin": "^5.0.3",
"purgecss": "^2.1.2",
+ "react-json-view": "^1.21.3",
"reqwest": "^2.0.5",
"resize-observer-polyfill": "^1.5.1",
"terser-webpack-plugin": "^2.3.5",
diff --git a/public/css/edu-common.css b/public/css/edu-common.css
index 96a8277d..56790f05 100755
--- a/public/css/edu-common.css
+++ b/public/css/edu-common.css
@@ -114,14 +114,6 @@ a:visited {
color: #898989;
}
-a:hover {
- color: #FF7500;
-}
-
-a:hover.fa {
- color: #FF7500;
-}
-
input,
textarea,
select {
diff --git a/public/css/edu-main.css b/public/css/edu-main.css
index 3cbe5fcb..1d995903 100644
--- a/public/css/edu-main.css
+++ b/public/css/edu-main.css
@@ -97,10 +97,6 @@ a:visited {
color: #05101a;
}
-a:hover {
- color: #459be5;
-}
-
ol,
ul,
li {
diff --git a/public/css/edu-purge.css b/public/css/edu-purge.css
index 2c470f7a..70478686 100644
--- a/public/css/edu-purge.css
+++ b/public/css/edu-purge.css
@@ -1,3 +1,4 @@
+@charset "utf-8";
/* 头部 */
.header {
width: 100%;
@@ -1271,7 +1272,7 @@ html body {
font-size: 14px;
line-height: 2.0;
background: #fafafa;
- font-family: "微软雅黑", "宋体";
+ font-family: "Microsoft YaHei", "SimSun";
color: #05101a;
height: 100%;
position: relative;
@@ -1307,6 +1308,7 @@ td,
span {
margin: 0;
padding: 0;
+ margin-bottom: 0px!important;
}
table,
@@ -1363,10 +1365,6 @@ a:visited {
color: #05101a;
}
-a:hover {
- color: #459be5;
-}
-
ol,
ul,
li {
@@ -1473,7 +1471,7 @@ a.edu-txt-w80,
/*隐藏*/
.none {
- display: none
+ display: none!important;
}
.block {
@@ -1522,7 +1520,15 @@ a.edu-txt-w80,
.font-16 {
font-size: 16px !important;
}
-
+.weight400{
+ font-weight: 400;
+}
+.weight500{
+ font-weight: 500;
+}
+.weight{
+ font-weight: bold;
+}
.font-17 {
font-size: 17px !important;
}
@@ -1542,6 +1548,9 @@ a.edu-txt-w80,
.font-25 {
font-size: 25px !important;
}
+.font-26 {
+ font-size: 26px !important;
+}
.font-24 {
font-size: 24px !important;
@@ -1563,6 +1572,9 @@ a.edu-txt-w80,
font-size: 36px !important;
}
+.font-40 {
+ font-size: 40px !important;
+}
.font-50 {
font-size: 50px !important;
}
@@ -1748,12 +1760,20 @@ a.decoration {
margin-bottom: 10px;
}
+.mb12 {
+ margin-bottom: 12px;
+}
+
+.mb13 {
+ margin-bottom: 13px;
+}
+
.mb14 {
margin-bottom: 14px;
}
.mb15 {
- margin-bottom: 15px;
+ margin-bottom: 15px!important;
}
.mb16 {
@@ -2424,13 +2444,23 @@ input::-ms-clear {
.color-grey-c {
color: #ccc !important;
}
-
+a.hoverLine:hover{
+ text-decoration: underline;
+}
.color-grey-cd {
color: #cdcdcd !important;
}
+.color-grey-d {
+ color: #ddd;
+}
+
.color-grey-9 {
- color: #999999 !important;
+ color: #999 !important;
+}
+
+a:hover{
+ color: #466AFF !important;
}
.color-grey-98 {
@@ -2465,33 +2495,23 @@ input::-ms-clear {
a.color-grey-name:hover,
a.color-dark:hover,
a.color-grey-6:hover,
-a.color-grey-3:hover {
- color: #4cacff !important;
-}
-
-a.color-grey-9:hover,
-a.color-grey-8:hover,
-a.color-grey-c:hover {
- color: #111C24 !important;
+a.color-grey-3:hover,a.color-ooo:hover {
+ color: #2A61FF !important;
}
/*蓝色*/
.color-blue {
- color: #4CACFF !important;
+ color: #2A61FF !important;
+}
+.color-blue-file {
+ color: #4598FA!important;
}
/* 绿色 */
-.color-green-file{
- color: #28BD6C;
-}
/*主*/
.color-blue_4C {
color: #4CACFF !important;
}
-a.color-blue:hover,
-a.color-blue_4C:hover {
- color: #459BE6 !important;
-}
/*橙色*/
.color-orange {
@@ -3409,7 +3429,7 @@ a.user_bluebg_btn {
}
.cdefault {
- cursor: default
+ cursor: default!important;
}
@@ -3584,42 +3604,6 @@ a.user_bluebg_btn {
margin-right: 5px;
}
-/*-------------------个人主页:右侧提示区域--------------------------*/
-.-task-sidebar {
- position: fixed;
- width: 40px;
- height: 180px;
- right: 0;
- bottom: 80px;
- z-index: 10;
-}
-
-.-task-sidebar div {
- height: 40px;
- line-height: 40px;
- box-sizing: border-box;
- width: 40px;
- background: #4CACFF;
- color: #fff;
- font-size: 20px;
- text-align: center;
- margin-bottom: 5px;
- border-radius: 4px;
-}
-
-.-task-sidebar div i {
- color: #fff;
-}
-
-.-task-sidebar div i:hover {
- color: #fff !important;
-}
-
-.gotop {
- background-color: rgba(208, 207, 207, 0.5) !important;
- padding: 0px !important;
-}
-
/***** loading ******/
/*****载入中******/
@@ -3944,11 +3928,21 @@ html>body #ajax-indicator {
max-height: 340px;
}/*头部导航条样式---2018-03-19--by-cs*/
+.privateTag{
+ display: block;
+ padding:0px 6px;
+ border-radius: 12px;
+ border:1px solid #2FC25B;
+ height: 18px;
+ line-height: 18px;
+ font-size: 12px;
+ margin-left: 10px;
+ color: #2FC25B;
+}
.head-nav {
text-align: center;
height: 70px;
box-sizing: border-box;
- min-width: 780px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -6711,4 +6705,13 @@ p{
right: 0px;
top:4px;
color: #999;
+<<<<<<< HEAD
+=======
+}
+.ant-input, .ant-input .ant-input-suffix{
+ background-color: #fff!important;
+}
+.has-error .ant-input{
+ background-color: #FEF1F0!important;
+>>>>>>> pre_develop
}
\ No newline at end of file
diff --git a/public/css/iconfont.css b/public/css/iconfont.css
index 7035af05..3866189c 100644
--- a/public/css/iconfont.css
+++ b/public/css/iconfont.css
@@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 2340181 */
- src: url('iconfont.woff2?t=1622517296245') format('woff2'),
- url('iconfont.woff?t=1622517296245') format('woff'),
- url('iconfont.ttf?t=1622517296245') format('truetype');
+ src: url('iconfont.woff2?t=1632964996877') format('woff2'),
+ url('iconfont.woff?t=1632964996877') format('woff'),
+ url('iconfont.ttf?t=1632964996877') format('truetype');
}
.iconfont {
@@ -13,6 +13,462 @@
-moz-osx-font-smoothing: grayscale;
}
+.icon-wenjian7:before {
+ content: "\e8e0";
+}
+
+.icon-xiangyoujiantou:before {
+ content: "\e8de";
+}
+
+.icon-xiangzuojiantou:before {
+ content: "\e8df";
+}
+
+.icon-a-liulanicon2x:before {
+ content: "\e8dd";
+}
+
+.icon-wenjianicon:before {
+ content: "\e8dc";
+}
+
+.icon-a-yuanquan2x:before {
+ content: "\e8db";
+}
+
+.icon-xiangmubiaoqian:before {
+ content: "\e8da";
+}
+
+.icon-icon:before {
+ content: "\e8ce";
+}
+
+.icon-tar:before {
+ content: "\e8cf";
+}
+
+.icon-a-fuzhi2:before {
+ content: "\e8d0";
+}
+
+.icon-fujian1:before {
+ content: "\e8d1";
+}
+
+.icon-a-bianji1:before {
+ content: "\e8d2";
+}
+
+.icon-banbenicon:before {
+ content: "\e8d3";
+}
+
+.icon-shanchuicon2:before {
+ content: "\e8d4";
+}
+
+.icon-a-lajitong_icon3x:before {
+ content: "\e8d5";
+}
+
+.icon-xialaanniu2:before {
+ content: "\e8d6";
+}
+
+.icon-xiazai-icon:before {
+ content: "\e8d7";
+}
+
+.icon-master_icon1:before {
+ content: "\e8d8";
+}
+
+.icon-shangchuanicon:before {
+ content: "\e8d9";
+}
+
+.icon-gerenziliao1:before {
+ content: "\e8c7";
+}
+
+.icon-lichengbeiicon:before {
+ content: "\e885";
+}
+
+.icon-cangkushezhiicon:before {
+ content: "\e889";
+}
+
+.icon-dongtaiicon:before {
+ content: "\e88a";
+}
+
+.icon-gongzuoliuicon:before {
+ content: "\e88b";
+}
+
+.icon-yixiuicon1:before {
+ content: "\e89b";
+}
+
+.icon-a-wikiicon1:before {
+ content: "\e8c6";
+}
+
+.icon-daimakuicon1:before {
+ content: "\e8c5";
+}
+
+.icon-wodetongzhi:before {
+ content: "\e8c8";
+}
+
+.icon-tongzhiguanli:before {
+ content: "\e8c9";
+}
+
+.icon-xuanzhong3:before {
+ content: "\e8ca";
+}
+
+.icon-xitongtongzhiicon:before {
+ content: "\e8cb";
+}
+
+.icon-xiaoxi2:before {
+ content: "\e8cc";
+}
+
+.icon-sshmiyue:before {
+ content: "\e8cd";
+}
+
+.icon-gerenziliao:before {
+ content: "\e8c4";
+}
+
+.icon-xinshouzhiyin:before {
+ content: "\e8e4";
+}
+
+.icon-xinjianxiangmu:before {
+ content: "\e8e6";
+}
+
+.icon-jiaruketang1:before {
+ content: "\e8e9";
+}
+
+.icon-xiangmugonggao:before {
+ content: "\e8c2";
+}
+
+.icon-chengguo:before {
+ content: "\e8c3";
+}
+
+.icon-chengjiaogonggao:before {
+ content: "\e8c0";
+}
+
+.icon-jishuzichan:before {
+ content: "\e8c1";
+}
+
+.icon-feibiaogonggao:before {
+ content: "\e8bc";
+}
+
+.icon-zhongbiaogonggao:before {
+ content: "\e8bd";
+}
+
+.icon-gengzhenggonggao:before {
+ content: "\e8be";
+}
+
+.icon-zhaobiaogonggao:before {
+ content: "\e8bf";
+}
+
+.icon-wenjian6:before {
+ content: "\e8ba";
+}
+
+.icon-wenjianjia4:before {
+ content: "\e8bb";
+}
+
+.icon-quxiaoguanzhu:before {
+ content: "\e89a";
+}
+
+.icon-dianzan_icon:before {
+ content: "\e8a2";
+}
+
+.icon-wenjian5:before {
+ content: "\e896";
+}
+
+.icon-wenjianjia3:before {
+ content: "\e8a9";
+}
+
+.icon-fuzhiicon:before {
+ content: "\e886";
+}
+
+.icon-zhuye-fill:before {
+ content: "\e876";
+}
+
+.icon-daimakuicon:before {
+ content: "\e884";
+}
+
+.icon-xinjian2:before {
+ content: "\e8b0";
+}
+
+.icon-xieyiicon:before {
+ content: "\e870";
+}
+
+.icon-neicunicon:before {
+ content: "\e891";
+}
+
+.icon-zishuwenjian_icon:before {
+ content: "\e8a6";
+}
+
+.icon-biaoqianicon:before {
+ content: "\e882";
+}
+
+.icon-a-bianji:before {
+ content: "\e883";
+}
+
+.icon-lianjieicon:before {
+ content: "\e887";
+}
+
+.icon-hebingqingqiuicon:before {
+ content: "\e888";
+}
+
+.icon-morendianzan_icon:before {
+ content: "\e88e";
+}
+
+.icon-muluicon:before {
+ content: "\e894";
+}
+
+.icon-a-shezhi:before {
+ content: "\e899";
+}
+
+.icon-tijiaoicon:before {
+ content: "\e89e";
+}
+
+.icon-morenguanzhu_ICON:before {
+ content: "\e89f";
+}
+
+.icon-xialaanniu1:before {
+ content: "\e8a4";
+}
+
+.icon-zuohuaicon:before {
+ content: "\e8b5";
+}
+
+.icon-master_icon:before {
+ content: "\e8b6";
+}
+
+.icon-morenfuke_icon:before {
+ content: "\e8b7";
+}
+
+.icon-a-wikiicon:before {
+ content: "\e8b8";
+}
+
+.icon-yixiuicon:before {
+ content: "\e8b9";
+}
+
+.icon-suofang:before {
+ content: "\e87f";
+}
+
+.icon-fangdaicon:before {
+ content: "\e881";
+}
+
+.icon-sousuo_icon1:before {
+ content: "\e873";
+}
+
+.icon-huanying_icon:before {
+ content: "\e878";
+}
+
+.icon-wenjianjia2:before {
+ content: "\e879";
+}
+
+.icon-shanchuicon1:before {
+ content: "\e87a";
+}
+
+.icon-qingqiuicon:before {
+ content: "\e871";
+}
+
+.icon-xiangyingicon:before {
+ content: "\e87c";
+}
+
+.icon-duoxuanxuanzhong:before {
+ content: "\e88f";
+}
+
+.icon-cuowuicon:before {
+ content: "\e890";
+}
+
+.icon-chenggongicon:before {
+ content: "\e892";
+}
+
+.icon-weixuanzhongxiangyingicon:before {
+ content: "\e893";
+}
+
+.icon-bitianicon:before {
+ content: "\e895";
+}
+
+.icon-weixuanzhongxiangmubiaoqianicon:before {
+ content: "\e897";
+}
+
+.icon-liebiaoicon:before {
+ content: "\e898";
+}
+
+.icon-xiezuozheguanliicon:before {
+ content: "\e8a1";
+}
+
+.icon-xuanzhongfenzhiicon:before {
+ content: "\e8a3";
+}
+
+.icon-xuanzhongjibenshezhiicon:before {
+ content: "\e8a5";
+}
+
+.icon-xuanzhongxiangmubiaoqianicon:before {
+ content: "\e8aa";
+}
+
+.icon-a-xuanzhongwebhookicon:before {
+ content: "\e8af";
+}
+
+.icon-shanchu_tc_icon:before {
+ content: "\e88c";
+}
+
+.icon-wiki_icon:before {
+ content: "\e88d";
+}
+
+.icon-daorumoban_icon:before {
+ content: "\e86f";
+}
+
+.icon-cuowu:before {
+ content: "\e872";
+}
+
+.icon-gengduo_icon:before {
+ content: "\e874";
+}
+
+.icon-fucengguanbi_icon:before {
+ content: "\e875";
+}
+
+.icon-shanchuicon:before {
+ content: "\e877";
+}
+
+.icon-sousuo_shanchuicon:before {
+ content: "\e87b";
+}
+
+.icon-sousuo_icon:before {
+ content: "\e87d";
+}
+
+.icon-wendangyulan_icon:before {
+ content: "\e87e";
+}
+
+.icon-xialaanniu:before {
+ content: "\e880";
+}
+
+.icon-erciqueren_icon:before {
+ content: "\e867";
+}
+
+.icon-xuanzhongssh_icon:before {
+ content: "\e868";
+}
+
+.icon-weixuanzhonganquanshezhi_icon:before {
+ content: "\e869";
+}
+
+.icon-weixuanzhongssh_icon:before {
+ content: "\e86a";
+}
+
+.icon-xuanzhonganquanshezhi_icon:before {
+ content: "\e86b";
+}
+
+.icon-shanchu_icon:before {
+ content: "\e86c";
+}
+
+.icon-liebiaossh_icon:before {
+ content: "\e86e";
+}
+
+.icon-file-submodule:before {
+ content: "\e866";
+}
+
+.icon-nv1:before {
+ content: "\e864";
+}
+
+.icon-nan1:before {
+ content: "\e865";
+}
+
.icon-youxiang:before {
content: "\e8b2";
}
diff --git a/public/css/iconfont.eot b/public/css/iconfont.eot
deleted file mode 100644
index d13e3094..00000000
Binary files a/public/css/iconfont.eot and /dev/null differ
diff --git a/public/css/iconfont.js b/public/css/iconfont.js
index 068c8e0a..a32ef5e5 100644
--- a/public/css/iconfont.js
+++ b/public/css/iconfont.js
@@ -1 +1 @@
-!function(c){var l,a,h,i,o,z,t='',p=(p=document.getElementsByTagName("script"))[p.length-1].getAttribute("data-injectcss");if(p&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}function v(){o||(o=!0,h())}l=function(){var c,l,a;(a=document.createElement("div")).innerHTML=t,t=null,(l=a.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",c=l,(a=document.body).firstChild?(l=a.firstChild).parentNode.insertBefore(c,l):a.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(a=function(){document.removeEventListener("DOMContentLoaded",a,!1),l()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(h=l,i=c.document,o=!1,(z=function(){try{i.documentElement.doScroll("left")}catch(c){return void setTimeout(z,50)}v()})(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,v())})}(window);
\ No newline at end of file
+!function(c){var a,l,h,i,o,z='',t=(t=document.getElementsByTagName("script"))[t.length-1].getAttribute("data-injectcss"),p=function(c,a){a.parentNode.insertBefore(c,a)};if(t&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}function v(){o||(o=!0,h())}function m(){try{i.documentElement.doScroll("left")}catch(c){return void setTimeout(m,50)}v()}a=function(){var c,a;(a=document.createElement("div")).innerHTML=z,z=null,(c=a.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",a=c,(c=document.body).firstChild?p(a,c.firstChild):c.appendChild(a))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(l=function(){document.removeEventListener("DOMContentLoaded",l,!1),a()},document.addEventListener("DOMContentLoaded",l,!1)):document.attachEvent&&(h=a,i=c.document,o=!1,m(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,v())})}(window);
diff --git a/public/css/iconfont.json b/public/css/iconfont.json
index 877958d7..5acfb6e9 100644
--- a/public/css/iconfont.json
+++ b/public/css/iconfont.json
@@ -5,6 +5,804 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
+ {
+ "icon_id": "24656750",
+ "name": "文件",
+ "font_class": "wenjian7",
+ "unicode": "e8e0",
+ "unicode_decimal": 59616
+ },
+ {
+ "icon_id": "630094",
+ "name": "向右箭头",
+ "font_class": "xiangyoujiantou",
+ "unicode": "e8de",
+ "unicode_decimal": 59614
+ },
+ {
+ "icon_id": "630095",
+ "name": "向左箭头",
+ "font_class": "xiangzuojiantou",
+ "unicode": "e8df",
+ "unicode_decimal": 59615
+ },
+ {
+ "icon_id": "24600282",
+ "name": "浏览icon@2x",
+ "font_class": "a-liulanicon2x",
+ "unicode": "e8dd",
+ "unicode_decimal": 59613
+ },
+ {
+ "icon_id": "24567893",
+ "name": "文件icon",
+ "font_class": "wenjianicon",
+ "unicode": "e8dc",
+ "unicode_decimal": 59612
+ },
+ {
+ "icon_id": "24527422",
+ "name": "圆圈@2x",
+ "font_class": "a-yuanquan2x",
+ "unicode": "e8db",
+ "unicode_decimal": 59611
+ },
+ {
+ "icon_id": "24378423",
+ "name": "项目标签",
+ "font_class": "xiangmubiaoqian",
+ "unicode": "e8da",
+ "unicode_decimal": 59610
+ },
+ {
+ "icon_id": "24368060",
+ "name": "icon",
+ "font_class": "icon",
+ "unicode": "e8ce",
+ "unicode_decimal": 59598
+ },
+ {
+ "icon_id": "24368061",
+ "name": "tar",
+ "font_class": "tar",
+ "unicode": "e8cf",
+ "unicode_decimal": 59599
+ },
+ {
+ "icon_id": "24289113",
+ "name": "复制 (2)",
+ "font_class": "a-fuzhi2",
+ "unicode": "e8d0",
+ "unicode_decimal": 59600
+ },
+ {
+ "icon_id": "24289114",
+ "name": "附件",
+ "font_class": "fujian1",
+ "unicode": "e8d1",
+ "unicode_decimal": 59601
+ },
+ {
+ "icon_id": "24289115",
+ "name": "编 辑",
+ "font_class": "a-bianji1",
+ "unicode": "e8d2",
+ "unicode_decimal": 59602
+ },
+ {
+ "icon_id": "24289116",
+ "name": "版本icon",
+ "font_class": "banbenicon",
+ "unicode": "e8d3",
+ "unicode_decimal": 59603
+ },
+ {
+ "icon_id": "24289117",
+ "name": "删除icon",
+ "font_class": "shanchuicon2",
+ "unicode": "e8d4",
+ "unicode_decimal": 59604
+ },
+ {
+ "icon_id": "24289118",
+ "name": "垃圾桶_icon@3x",
+ "font_class": "a-lajitong_icon3x",
+ "unicode": "e8d5",
+ "unicode_decimal": 59605
+ },
+ {
+ "icon_id": "24289119",
+ "name": "下拉按钮",
+ "font_class": "xialaanniu2",
+ "unicode": "e8d6",
+ "unicode_decimal": 59606
+ },
+ {
+ "icon_id": "24289120",
+ "name": "下载-icon",
+ "font_class": "xiazai-icon",
+ "unicode": "e8d7",
+ "unicode_decimal": 59607
+ },
+ {
+ "icon_id": "24289121",
+ "name": "master_icon",
+ "font_class": "master_icon1",
+ "unicode": "e8d8",
+ "unicode_decimal": 59608
+ },
+ {
+ "icon_id": "24289122",
+ "name": "上传icon",
+ "font_class": "shangchuanicon",
+ "unicode": "e8d9",
+ "unicode_decimal": 59609
+ },
+ {
+ "icon_id": "24059956",
+ "name": "个人资料",
+ "font_class": "gerenziliao1",
+ "unicode": "e8c7",
+ "unicode_decimal": 59591
+ },
+ {
+ "icon_id": "24059409",
+ "name": "里程碑icon",
+ "font_class": "lichengbeiicon",
+ "unicode": "e885",
+ "unicode_decimal": 59525
+ },
+ {
+ "icon_id": "24059410",
+ "name": "仓库设置icon",
+ "font_class": "cangkushezhiicon",
+ "unicode": "e889",
+ "unicode_decimal": 59529
+ },
+ {
+ "icon_id": "24059411",
+ "name": "动态icon",
+ "font_class": "dongtaiicon",
+ "unicode": "e88a",
+ "unicode_decimal": 59530
+ },
+ {
+ "icon_id": "24059412",
+ "name": "工作流icon",
+ "font_class": "gongzuoliuicon",
+ "unicode": "e88b",
+ "unicode_decimal": 59531
+ },
+ {
+ "icon_id": "24059413",
+ "name": "易修icon",
+ "font_class": "yixiuicon1",
+ "unicode": "e89b",
+ "unicode_decimal": 59547
+ },
+ {
+ "icon_id": "24059414",
+ "name": "wiki icon",
+ "font_class": "a-wikiicon1",
+ "unicode": "e8c6",
+ "unicode_decimal": 59590
+ },
+ {
+ "icon_id": "24047186",
+ "name": "代码库icon",
+ "font_class": "daimakuicon1",
+ "unicode": "e8c5",
+ "unicode_decimal": 59589
+ },
+ {
+ "icon_id": "24047189",
+ "name": "我的通知",
+ "font_class": "wodetongzhi",
+ "unicode": "e8c8",
+ "unicode_decimal": 59592
+ },
+ {
+ "icon_id": "24047190",
+ "name": "通知管理",
+ "font_class": "tongzhiguanli",
+ "unicode": "e8c9",
+ "unicode_decimal": 59593
+ },
+ {
+ "icon_id": "24047191",
+ "name": "选中",
+ "font_class": "xuanzhong3",
+ "unicode": "e8ca",
+ "unicode_decimal": 59594
+ },
+ {
+ "icon_id": "24047192",
+ "name": "系统通知icon",
+ "font_class": "xitongtongzhiicon",
+ "unicode": "e8cb",
+ "unicode_decimal": 59595
+ },
+ {
+ "icon_id": "24047193",
+ "name": "消息",
+ "font_class": "xiaoxi2",
+ "unicode": "e8cc",
+ "unicode_decimal": 59596
+ },
+ {
+ "icon_id": "24047194",
+ "name": "ssh密钥",
+ "font_class": "sshmiyue",
+ "unicode": "e8cd",
+ "unicode_decimal": 59597
+ },
+ {
+ "icon_id": "24014152",
+ "name": "个人资料",
+ "font_class": "gerenziliao",
+ "unicode": "e8c4",
+ "unicode_decimal": 59588
+ },
+ {
+ "icon_id": "23655968",
+ "name": "新手指引",
+ "font_class": "xinshouzhiyin",
+ "unicode": "e8e4",
+ "unicode_decimal": 59620
+ },
+ {
+ "icon_id": "23655969",
+ "name": "新建项目",
+ "font_class": "xinjianxiangmu",
+ "unicode": "e8e6",
+ "unicode_decimal": 59622
+ },
+ {
+ "icon_id": "23658111",
+ "name": "加入课堂",
+ "font_class": "jiaruketang1",
+ "unicode": "e8e9",
+ "unicode_decimal": 59625
+ },
+ {
+ "icon_id": "23791639",
+ "name": "项目公告",
+ "font_class": "xiangmugonggao",
+ "unicode": "e8c2",
+ "unicode_decimal": 59586
+ },
+ {
+ "icon_id": "23791640",
+ "name": "成果",
+ "font_class": "chengguo",
+ "unicode": "e8c3",
+ "unicode_decimal": 59587
+ },
+ {
+ "icon_id": "23791410",
+ "name": "成交公告",
+ "font_class": "chengjiaogonggao",
+ "unicode": "e8c0",
+ "unicode_decimal": 59584
+ },
+ {
+ "icon_id": "23791411",
+ "name": "技术资产",
+ "font_class": "jishuzichan",
+ "unicode": "e8c1",
+ "unicode_decimal": 59585
+ },
+ {
+ "icon_id": "23790928",
+ "name": "废标公告",
+ "font_class": "feibiaogonggao",
+ "unicode": "e8bc",
+ "unicode_decimal": 59580
+ },
+ {
+ "icon_id": "23790929",
+ "name": "中标公告",
+ "font_class": "zhongbiaogonggao",
+ "unicode": "e8bd",
+ "unicode_decimal": 59581
+ },
+ {
+ "icon_id": "23790930",
+ "name": "更正公告",
+ "font_class": "gengzhenggonggao",
+ "unicode": "e8be",
+ "unicode_decimal": 59582
+ },
+ {
+ "icon_id": "23790931",
+ "name": "招标公告",
+ "font_class": "zhaobiaogonggao",
+ "unicode": "e8bf",
+ "unicode_decimal": 59583
+ },
+ {
+ "icon_id": "23732532",
+ "name": "文件",
+ "font_class": "wenjian6",
+ "unicode": "e8ba",
+ "unicode_decimal": 59578
+ },
+ {
+ "icon_id": "23732533",
+ "name": "文件夹",
+ "font_class": "wenjianjia4",
+ "unicode": "e8bb",
+ "unicode_decimal": 59579
+ },
+ {
+ "icon_id": "23642443",
+ "name": "取消关注",
+ "font_class": "quxiaoguanzhu",
+ "unicode": "e89a",
+ "unicode_decimal": 59546
+ },
+ {
+ "icon_id": "23642444",
+ "name": "点赞_icon",
+ "font_class": "dianzan_icon",
+ "unicode": "e8a2",
+ "unicode_decimal": 59554
+ },
+ {
+ "icon_id": "23639530",
+ "name": "文件",
+ "font_class": "wenjian5",
+ "unicode": "e896",
+ "unicode_decimal": 59542
+ },
+ {
+ "icon_id": "23639533",
+ "name": "文件夹",
+ "font_class": "wenjianjia3",
+ "unicode": "e8a9",
+ "unicode_decimal": 59561
+ },
+ {
+ "icon_id": "23639440",
+ "name": "复制icon",
+ "font_class": "fuzhiicon",
+ "unicode": "e886",
+ "unicode_decimal": 59526
+ },
+ {
+ "icon_id": "23639422",
+ "name": "主页-fill",
+ "font_class": "zhuye-fill",
+ "unicode": "e876",
+ "unicode_decimal": 59510
+ },
+ {
+ "icon_id": "23639423",
+ "name": "代码库icon",
+ "font_class": "daimakuicon",
+ "unicode": "e884",
+ "unicode_decimal": 59524
+ },
+ {
+ "icon_id": "23572260",
+ "name": "新建",
+ "font_class": "xinjian2",
+ "unicode": "e8b0",
+ "unicode_decimal": 59568
+ },
+ {
+ "icon_id": "23567674",
+ "name": "协议icon",
+ "font_class": "xieyiicon",
+ "unicode": "e870",
+ "unicode_decimal": 59504
+ },
+ {
+ "icon_id": "23567675",
+ "name": "内存icon",
+ "font_class": "neicunicon",
+ "unicode": "e891",
+ "unicode_decimal": 59537
+ },
+ {
+ "icon_id": "23567676",
+ "name": "自述文件_icon",
+ "font_class": "zishuwenjian_icon",
+ "unicode": "e8a6",
+ "unicode_decimal": 59558
+ },
+ {
+ "icon_id": "23472253",
+ "name": "标签icon",
+ "font_class": "biaoqianicon",
+ "unicode": "e882",
+ "unicode_decimal": 59522
+ },
+ {
+ "icon_id": "23472254",
+ "name": "编 辑",
+ "font_class": "a-bianji",
+ "unicode": "e883",
+ "unicode_decimal": 59523
+ },
+ {
+ "icon_id": "23472258",
+ "name": "链接icon",
+ "font_class": "lianjieicon",
+ "unicode": "e887",
+ "unicode_decimal": 59527
+ },
+ {
+ "icon_id": "23472259",
+ "name": "合并请求icon",
+ "font_class": "hebingqingqiuicon",
+ "unicode": "e888",
+ "unicode_decimal": 59528
+ },
+ {
+ "icon_id": "23472263",
+ "name": "默认点赞_icon",
+ "font_class": "morendianzan_icon",
+ "unicode": "e88e",
+ "unicode_decimal": 59534
+ },
+ {
+ "icon_id": "23472265",
+ "name": "目录icon",
+ "font_class": "muluicon",
+ "unicode": "e894",
+ "unicode_decimal": 59540
+ },
+ {
+ "icon_id": "23472267",
+ "name": "设 置",
+ "font_class": "a-shezhi",
+ "unicode": "e899",
+ "unicode_decimal": 59545
+ },
+ {
+ "icon_id": "23472269",
+ "name": "提交icon",
+ "font_class": "tijiaoicon",
+ "unicode": "e89e",
+ "unicode_decimal": 59550
+ },
+ {
+ "icon_id": "23472270",
+ "name": "默认关注_ICON",
+ "font_class": "morenguanzhu_ICON",
+ "unicode": "e89f",
+ "unicode_decimal": 59551
+ },
+ {
+ "icon_id": "23472272",
+ "name": "下拉按钮",
+ "font_class": "xialaanniu1",
+ "unicode": "e8a4",
+ "unicode_decimal": 59556
+ },
+ {
+ "icon_id": "23472276",
+ "name": "左滑icon",
+ "font_class": "zuohuaicon",
+ "unicode": "e8b5",
+ "unicode_decimal": 59573
+ },
+ {
+ "icon_id": "23472277",
+ "name": "master_icon",
+ "font_class": "master_icon",
+ "unicode": "e8b6",
+ "unicode_decimal": 59574
+ },
+ {
+ "icon_id": "23472278",
+ "name": "默认复刻_icon",
+ "font_class": "morenfuke_icon",
+ "unicode": "e8b7",
+ "unicode_decimal": 59575
+ },
+ {
+ "icon_id": "23472279",
+ "name": "wiki icon",
+ "font_class": "a-wikiicon",
+ "unicode": "e8b8",
+ "unicode_decimal": 59576
+ },
+ {
+ "icon_id": "23472280",
+ "name": "易修icon",
+ "font_class": "yixiuicon",
+ "unicode": "e8b9",
+ "unicode_decimal": 59577
+ },
+ {
+ "icon_id": "23436350",
+ "name": "缩放",
+ "font_class": "suofang",
+ "unicode": "e87f",
+ "unicode_decimal": 59519
+ },
+ {
+ "icon_id": "23436351",
+ "name": "放大icon",
+ "font_class": "fangdaicon",
+ "unicode": "e881",
+ "unicode_decimal": 59521
+ },
+ {
+ "icon_id": "23384231",
+ "name": "搜索_icon",
+ "font_class": "sousuo_icon1",
+ "unicode": "e873",
+ "unicode_decimal": 59507
+ },
+ {
+ "icon_id": "23384232",
+ "name": "欢迎_icon",
+ "font_class": "huanying_icon",
+ "unicode": "e878",
+ "unicode_decimal": 59512
+ },
+ {
+ "icon_id": "23384233",
+ "name": "文件夹",
+ "font_class": "wenjianjia2",
+ "unicode": "e879",
+ "unicode_decimal": 59513
+ },
+ {
+ "icon_id": "23384234",
+ "name": "删除icon",
+ "font_class": "shanchuicon1",
+ "unicode": "e87a",
+ "unicode_decimal": 59514
+ },
+ {
+ "icon_id": "23261798",
+ "name": "请求icon",
+ "font_class": "qingqiuicon",
+ "unicode": "e871",
+ "unicode_decimal": 59505
+ },
+ {
+ "icon_id": "23261799",
+ "name": "响应icon",
+ "font_class": "xiangyingicon",
+ "unicode": "e87c",
+ "unicode_decimal": 59516
+ },
+ {
+ "icon_id": "23144143",
+ "name": "多选选中",
+ "font_class": "duoxuanxuanzhong",
+ "unicode": "e88f",
+ "unicode_decimal": 59535
+ },
+ {
+ "icon_id": "23144144",
+ "name": "错误icon",
+ "font_class": "cuowuicon",
+ "unicode": "e890",
+ "unicode_decimal": 59536
+ },
+ {
+ "icon_id": "23144146",
+ "name": "成功icon",
+ "font_class": "chenggongicon",
+ "unicode": "e892",
+ "unicode_decimal": 59538
+ },
+ {
+ "icon_id": "23144147",
+ "name": "未选中响应icon",
+ "font_class": "weixuanzhongxiangyingicon",
+ "unicode": "e893",
+ "unicode_decimal": 59539
+ },
+ {
+ "icon_id": "23144149",
+ "name": "必填icon",
+ "font_class": "bitianicon",
+ "unicode": "e895",
+ "unicode_decimal": 59541
+ },
+ {
+ "icon_id": "23144151",
+ "name": "未选中项目标签icon",
+ "font_class": "weixuanzhongxiangmubiaoqianicon",
+ "unicode": "e897",
+ "unicode_decimal": 59543
+ },
+ {
+ "icon_id": "23144152",
+ "name": "列表icon",
+ "font_class": "liebiaoicon",
+ "unicode": "e898",
+ "unicode_decimal": 59544
+ },
+ {
+ "icon_id": "23144158",
+ "name": "协作者管理icon",
+ "font_class": "xiezuozheguanliicon",
+ "unicode": "e8a1",
+ "unicode_decimal": 59553
+ },
+ {
+ "icon_id": "23144160",
+ "name": "选中分支icon",
+ "font_class": "xuanzhongfenzhiicon",
+ "unicode": "e8a3",
+ "unicode_decimal": 59555
+ },
+ {
+ "icon_id": "23144162",
+ "name": "选中基本设置icon",
+ "font_class": "xuanzhongjibenshezhiicon",
+ "unicode": "e8a5",
+ "unicode_decimal": 59557
+ },
+ {
+ "icon_id": "23144165",
+ "name": "选中项目标签icon",
+ "font_class": "xuanzhongxiangmubiaoqianicon",
+ "unicode": "e8aa",
+ "unicode_decimal": 59562
+ },
+ {
+ "icon_id": "23144167",
+ "name": "选中webhook icon",
+ "font_class": "a-xuanzhongwebhookicon",
+ "unicode": "e8af",
+ "unicode_decimal": 59567
+ },
+ {
+ "icon_id": "23046290",
+ "name": "shanchu_tc_icon",
+ "font_class": "shanchu_tc_icon",
+ "unicode": "e88c",
+ "unicode_decimal": 59532
+ },
+ {
+ "icon_id": "23046293",
+ "name": "wiki_icon",
+ "font_class": "wiki_icon",
+ "unicode": "e88d",
+ "unicode_decimal": 59533
+ },
+ {
+ "icon_id": "23046244",
+ "name": "导入模版_icon",
+ "font_class": "daorumoban_icon",
+ "unicode": "e86f",
+ "unicode_decimal": 59503
+ },
+ {
+ "icon_id": "23046252",
+ "name": "错误",
+ "font_class": "cuowu",
+ "unicode": "e872",
+ "unicode_decimal": 59506
+ },
+ {
+ "icon_id": "23046255",
+ "name": "更多_icon",
+ "font_class": "gengduo_icon",
+ "unicode": "e874",
+ "unicode_decimal": 59508
+ },
+ {
+ "icon_id": "23046258",
+ "name": "复层关闭_icon",
+ "font_class": "fucengguanbi_icon",
+ "unicode": "e875",
+ "unicode_decimal": 59509
+ },
+ {
+ "icon_id": "23046268",
+ "name": "删除icon",
+ "font_class": "shanchuicon",
+ "unicode": "e877",
+ "unicode_decimal": 59511
+ },
+ {
+ "icon_id": "23046273",
+ "name": "搜索_删除icon",
+ "font_class": "sousuo_shanchuicon",
+ "unicode": "e87b",
+ "unicode_decimal": 59515
+ },
+ {
+ "icon_id": "23046275",
+ "name": "搜索_icon",
+ "font_class": "sousuo_icon",
+ "unicode": "e87d",
+ "unicode_decimal": 59517
+ },
+ {
+ "icon_id": "23046276",
+ "name": "文档预览_icon",
+ "font_class": "wendangyulan_icon",
+ "unicode": "e87e",
+ "unicode_decimal": 59518
+ },
+ {
+ "icon_id": "23046278",
+ "name": "下拉按钮",
+ "font_class": "xialaanniu",
+ "unicode": "e880",
+ "unicode_decimal": 59520
+ },
+ {
+ "icon_id": "22906287",
+ "name": "二次确认_icon",
+ "font_class": "erciqueren_icon",
+ "unicode": "e867",
+ "unicode_decimal": 59495
+ },
+ {
+ "icon_id": "22906288",
+ "name": "选中ssh_icon",
+ "font_class": "xuanzhongssh_icon",
+ "unicode": "e868",
+ "unicode_decimal": 59496
+ },
+ {
+ "icon_id": "22906289",
+ "name": "未选中安全设置_icon",
+ "font_class": "weixuanzhonganquanshezhi_icon",
+ "unicode": "e869",
+ "unicode_decimal": 59497
+ },
+ {
+ "icon_id": "22906290",
+ "name": "未选中ssh_icon",
+ "font_class": "weixuanzhongssh_icon",
+ "unicode": "e86a",
+ "unicode_decimal": 59498
+ },
+ {
+ "icon_id": "22906291",
+ "name": "选中安全设置_icon",
+ "font_class": "xuanzhonganquanshezhi_icon",
+ "unicode": "e86b",
+ "unicode_decimal": 59499
+ },
+ {
+ "icon_id": "22906292",
+ "name": "删除_icon",
+ "font_class": "shanchu_icon",
+ "unicode": "e86c",
+ "unicode_decimal": 59500
+ },
+ {
+ "icon_id": "22906293",
+ "name": "列表ssh_icon",
+ "font_class": "liebiaossh_icon",
+ "unicode": "e86e",
+ "unicode_decimal": 59502
+ },
+ {
+ "icon_id": "17575494",
+ "name": "file-submodule",
+ "font_class": "file-submodule",
+ "unicode": "e866",
+ "unicode_decimal": 59494
+ },
+ {
+ "icon_id": "7539612",
+ "name": "nv",
+ "font_class": "nv1",
+ "unicode": "e864",
+ "unicode_decimal": 59492
+ },
+ {
+ "icon_id": "7539613",
+ "name": "nan",
+ "font_class": "nan1",
+ "unicode": "e865",
+ "unicode_decimal": 59493
+ },
{
"icon_id": "21936935",
"name": "邮箱",
diff --git a/public/css/iconfont.svg b/public/css/iconfont.svg
deleted file mode 100644
index d6d0adbc..00000000
--- a/public/css/iconfont.svg
+++ /dev/null
@@ -1,1874 +0,0 @@
-
-
-
-
diff --git a/public/index.html b/public/index.html
index f039d86e..9489fe42 100755
--- a/public/index.html
+++ b/public/index.html
@@ -1,5 +1,5 @@
-
+
diff --git a/public/js/editormd/editormd.min.js b/public/js/editormd/editormd.min.js
index 0add3b37..860a4de0 100755
--- a/public/js/editormd/editormd.min.js
+++ b/public/js/editormd/editormd.min.js
@@ -3319,9 +3319,9 @@
text = text.replace(emailReg, function ($1, $2, $3, $4) {
return $1.replace(/@/g, "_#_@_#_");
});
-
+ // " + editormd.urls.atLinkBase + "" + $2 + "
text = text.replace(atLinkReg, function ($1, $2) {
- return "" + $1 + "";
+ return " " + $1 + " ";
}).replace(/_#_@_#_/g, "@");
}
diff --git a/src/App.css b/src/App.css
index 205c64f7..8d916d39 100644
--- a/src/App.css
+++ b/src/App.css
@@ -60,12 +60,13 @@ body {
.ant-progress-textno {
color: #f5222d;
}
-
+.CodeMirror pre.CodeMirror-line{
+ font-size: 16px!important;
+}
/* md多空格 */
.markdown-body p {
margin:10px 0px!important;
font-size: 16px !important;
- line-height: 2 !important;
white-space: pre-wrap;
}
@@ -87,6 +88,10 @@ body {
border-left: 1px solid rgb(221, 221, 221);
/* 某些情况下,被cm盖住了 */
z-index: 99;
+ padding:8px 8px 50px;
+}
+.editormd-preview .markdown-body{
+ padding:0px !important;
}
/* 图片点击放大的场景,隐藏图片链接 */
diff --git a/src/App.js b/src/App.js
index 6c338245..8e6a9af2 100644
--- a/src/App.js
+++ b/src/App.js
@@ -3,7 +3,7 @@ import './App.css';
import { ConfigProvider } from 'antd'
import zhCN from 'antd/lib/locale-provider/zh_CN';
import {
- BrowserRouter as Router,
+ // BrowserRouter as Router,
Route,
Switch
} from 'react-router-dom';
@@ -17,10 +17,9 @@ import marked from './common/marked';
import moment from 'moment'
import { MuiThemeProvider, createMuiTheme } from 'material-ui/styles';
+import SiderBar from './forge/Component/SiderBar'
-import history from './history';
-
-import { SnackbarHOC } from 'educoder'
+import { SnackbarHOC } from 'educoder';
import { initAxiosInterceptors } from './AppConfig'
import { Provider } from 'react-redux';
import configureStore from './redux/stores/configureStore';
@@ -40,6 +39,16 @@ const Projects = Loadable({
loader: () => import('./forge/Index'),
loading: Loading,
})
+// forge项目详情
+const ProjectDetail = Loadable({
+ loader: () => import("./forge/Main/DetailAdaptor"),
+ loading: Loading,
+});
+//forge安全设置
+const Security = Loadable({
+ loader: () => import('./forge/SecuritySetting/Index'),
+ loading: Loading,
+})
//forge项目-devOps详情
const OpsDetail = Loadable({
loader: () => import('./forge/DevOps/opsDetail'),
@@ -74,6 +83,27 @@ const EducoderLogin = Loadable({
loader: () => import('./modules/login/EducoderLogin'),
loading: Loading,
})
+const Search = Loadable({
+ loader: () => import('./modules/search/'),
+ loading: Loading,
+})
+const WikiPreview = Loadable({
+ loader: () => import('./forge/Wiki/Preview'),
+ loading: Loading,
+})
+
+const ProjectIndex = Loadable({
+ loader: () => import("./forge/Index"),
+ loading: Loading,
+});
+
+// const CreateMerge = Loadable({
+// loader: () => import('./forge/Merge/NewMerge'),
+// loading: Loading,
+// })
+
+// 此处仅维护前端可能的一级路由,不用进行项目或者组织判断的字段。
+const keyWord = ["explore", "settings", "setting", "mulan", "wiki", "issues", "setting", "trending", "code", "projects", "pulls", "mine", "login", "register", "email", "export", "nopage", "404", "403", "500", "501", "search", "organize"];
class App extends Component {
constructor(props) {
@@ -84,6 +114,51 @@ class App extends Component {
mydisplay: false,
occupation: 0,
mygetHelmetapi: null,
+ pathType: null,
+ pathName: null,
+ }
+ }
+
+ UNSAFE_componentWillMount() {
+ initAxiosInterceptors(this.props);
+ let pathname = window.location.pathname ? window.location.pathname.split('/')[1] : '';
+ pathname && this.getPathnameType(pathname);
+
+ // 添加路由监听,决定组织还是个人
+ this.unlisten = this.props.history.listen((location) => {
+ let newPathname = location.pathname.split('/')[1];
+ if (this.state.pathName !== newPathname) {
+ // this.setState({ pathType: '' });
+ newPathname && this.getPathnameType(newPathname);
+ }
+ });
+ }
+
+ shouldComponentUpdate(nextProps, nextState) {
+ // (!keyWord.includes(this.props.location.pathname.split('/')[1])) &&
+ if (nextProps.location.pathname.split('/')[1] !== this.props.location.pathname.split('/')[1] && nextState.pathType === this.state.pathType) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ getPathnameType = (pathname) => {
+ if (!keyWord.includes(pathname)) {
+ let url = `/owners/${pathname}.json`;
+ axios.get(url).then((response) => {
+ if (response && response.status === 200) {
+ this.setState({
+ pathType: response.data.type || '404',
+ pathName: pathname,
+ })
+ }
+ });
+ }else{
+ this.setState({
+ pathType: pathname,
+ pathName: pathname,
+ });
}
}
@@ -100,43 +175,22 @@ class App extends Component {
Addcoursestypes: false
})
};
- ModalCancelsy = () => {
- this.setState({
- mydisplay: false,
- })
- window.location.href = "/";
- };
- ModalshowCancelsy = () => {
- this.setState({
- mydisplay: true,
- })
- };
- disableVideoContextMenu = () => {
- window.$("body").on("mousedown", "video", function (event) {
- if (event.which === 3) {
- window.$('video').bind('contextmenu', function () { return false; });
- } else {
- window.$('video').unbind('contextmenu');
- }
- });
- }
componentDidMount() {
document.title = "loading...";
- this.disableVideoContextMenu();
- history.listen(() => {
- this.forceUpdate()
- const $ = window.$
- $("html").animate({ scrollTop: $('html').scrollTop() - 0 })
- });
- initAxiosInterceptors(this.props);
this.getAppdata();
window.addEventListener('error', (event) => {
const msg = `${event.type}: ${event.message}`;
});
+
}
+
+ componentWillUnmount() {
+ this.unlisten && this.unlisten(); // 执行解绑
+ }
+
//修改登录方法
Modifyloginvalue = () => {
this.setState({
@@ -207,69 +261,139 @@ class App extends Component {
};
render() {
+ const { mygetHelmetapi, pathType} = this.state;
+ let personal = mygetHelmetapi && mygetHelmetapi.personal;
return (
this.Modifyloginvalue()}>
-
-
- {/*项目*/}
- {
- return ()
- }
- }>
-
- {/*项目*/}
- {
- return ()
- }
- }>
-
- {
- return ()
- }
- }
- />
- {/*403*/}
-
+
+ {/* */}
+
+ {/* wiki预览 */}
+ {
+ return ()
+ }
+ } />
-
- {
- return ()
- }
- }>
-
- {/*404*/}
-
- {/* 个人主页 */}
- {
- return ()
- }
- }>
- (
-
- )
+ {/* 项目PR */}
+ ()
+ }
+ >
+
+ {/*项目*/}
+ {
+ return ()
}
- />
-
-
-
+ }>
+
+ {
+ return ()
+ }
+ }>
+
+
+ {
+ return ()
+ }
+ }
+ />
+ {/*403*/}
+
+
+
+
+ {/*404*/}
+
+
+ {/* 查询 */}
+
+
+ (
+
+ )
+ }
+ />
+
+
+ {/* 组织 */}
+ {
+ return ()
+ }
+ }>
+
+
+ {/*新建项目等*/}
+ {
+ return ()
+ }
+ }>
+
+
+ {/* 判断为用户/组织,并进入对应页面 */}
+ {
+ pathType === 'User' ?
+ {
+ return ()
+ }
+ }
+ /> : pathType === 'Organization' ? {
+ return ()
+ }
+ }>
+ : pathType === '404' ? :
+ (
+ personal && personal.length > 0 ?
+
+ :
+
+ )
+ }
+ />
+ //
+ //
+ }
+
+
+
+ {/* 个人主页 */}
+ {
+ return ()
+ }
+ }>
+
+
+
+
+ {/* */}
diff --git a/src/AppConfig.js b/src/AppConfig.js
index 034612ec..ea85a4e5 100644
--- a/src/AppConfig.js
+++ b/src/AppConfig.js
@@ -85,7 +85,10 @@ export function initAxiosInterceptors(props) {
}
if (response.data.status === 404) {
- locationurl('/nopage');
+ let responseURL = response.request ? response.request.responseURL:'';
+ if (responseURL.indexOf('/api/users/') === -1 && responseURL.indexOf('/api/organizations/') === -1 ) {
+ locationurl('/nopage');
+ }
}
if (response.data.status === 500) {
diff --git a/src/Loading.js b/src/Loading.js
index f9905747..8175b7df 100644
--- a/src/Loading.js
+++ b/src/Loading.js
@@ -9,20 +9,7 @@ class Loading extends Component {
}
render() {
- return (
-
-
-
-
- );
+ return ""
}
}
diff --git a/src/college/College.js b/src/college/College.js
index 85d43fb7..f7a3ab6c 100644
--- a/src/college/College.js
+++ b/src/college/College.js
@@ -195,7 +195,7 @@ class College extends Component {
align: 'center',
className: "edu-txt-center font-14 maxnamewidth105",
render: (text, record) => (
- {
diff --git a/src/college/colleagecss/colleage.css b/src/college/colleagecss/colleage.css
index 9220b8ac..65f32322 100644
--- a/src/college/colleagecss/colleage.css
+++ b/src/college/colleagecss/colleage.css
@@ -218,7 +218,7 @@ a:hover {
}
.color-blue {
- color: #4CACFF;
+ color: #2A61FF;
}
.color-huang {
diff --git a/src/common/DateUtil.js b/src/common/DateUtil.js
index 859182e1..8846d274 100644
--- a/src/common/DateUtil.js
+++ b/src/common/DateUtil.js
@@ -1,4 +1,5 @@
import moment from "moment";
+import { number } from "prop-types";
// 处理整点 半点
// 取传入时间往后的第一个半点
@@ -97,3 +98,41 @@ export function formatDuring(mss){
}
return days + "天" + hours + "小时" + minutes + "分";
}
+
+/*
+ 返回:多久以前
+ backDate:以前的某个日期
+*/
+export function timeAgo(backDate) {
+ try {
+ moment(backDate);
+ } catch (e) {
+ return '刚刚';
+ }
+ if(typeof backDate ==='number'){
+ backDate=backDate*1000
+ }else{
+ backDate= moment(backDate);
+ }
+ let time = new Date() - backDate;
+ var days = Math.floor(time / (1000 * 60 * 60 * 24));
+ var hours = Math.floor((time % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+ var minutes = Math.floor((time % (1000 * 60 * 60)) / (1000 * 60));
+ var seconds = Math.floor((time % (1000 * 60 * 60)) / 1000);
+ if (time <= 0) {
+ return "刚刚";
+ }
+ if (days) {
+ return days + "天前";
+ }
+ if (hours) {
+ return hours + "小时前";
+ }
+ if (minutes) {
+ return minutes + "分前";
+ }
+ if (seconds) {
+ return seconds + "秒前";
+ }
+ return "刚刚";
+}
\ No newline at end of file
diff --git a/src/common/TextUtil.js b/src/common/TextUtil.js
index 94e73631..d1aa0e9c 100644
--- a/src/common/TextUtil.js
+++ b/src/common/TextUtil.js
@@ -69,7 +69,7 @@ export function appendFileSizeToUploadFile(item) {
}
export function appendFileSizeToUploadFileAll(fileList) {
return fileList.map(item => {
- if (item.name.indexOf(uploadNameSizeSeperator) == -1) {
+ if (item.name.indexOf(uploadNameSizeSeperator) === -1) {
return Object.assign({}, item, { name: `${item.name}${uploadNameSizeSeperator}${bytesToSize(item.size)}` })
}
return item
diff --git a/src/common/UrlTool.js b/src/common/UrlTool.js
index 6ccea6a9..f1800a75 100644
--- a/src/common/UrlTool.js
+++ b/src/common/UrlTool.js
@@ -18,6 +18,23 @@ export function getImageUrl(path) {
return `${path}`;
}
+export function numFormat(num, digits){
+ let d = digits || 1;
+ var si = [
+ { value: 1, symbol: "" },
+ { value: 1E3, symbol: "k" },
+ { value: 1E4, symbol: "W" }
+ ];
+ var rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
+ var i;
+ for (i = si.length - 1; i > 0; i--) {
+ if (num >= si[i].value) {
+ break;
+ }
+ }
+ return (num / si[i].value).toFixed(d).replace(rx, "$1") + si[i].symbol;
+}
+
export function getImage(path) {
// https://www.educoder.net
// https://testbdweb.trustie.net
@@ -162,28 +179,28 @@ export function getmyUrl(geturl) {
}
export function getUploadActionUrl(path, goTest) {
- return `${getUrl()}/api/attachments.json?debug=${window._debugType || 'admin'}`;
+ return `${getUrl()}/api/attachments.json${isDev ?`${isDev ?`?debug=${window._debugType || 'admin'}` : ""}` : ""}`;
}
export function getUploadLogoActionUrl() {
- return `${getUrl()}/api/resumes/logo.json?debug=${window._debugType || 'admin'}`;
+ return `${getUrl()}/api/resumes/logo.json${isDev ?`?debug=${window._debugType || 'admin'}` : ""}`;
}
export function getUploadActionUrltwo(id) {
- return `${getUrlmys()}/api/shixuns/${id}/upload_data_sets.json?debug=${window._debugType || 'admin'}`
+ return `${getUrlmys()}/api/shixuns/${id}/upload_data_sets.json${isDev ?`?debug=${window._debugType || 'admin'}` : ""}`
}
export function getUploadActionUrlthree() {
- return `${getUrlmys()}/api/jupyters/import_with_tpm.json?debug=${window._debugType || 'admin'}`
+ return `${getUrlmys()}/api/jupyters/import_with_tpm.json${isDev ?`?debug=${window._debugType || 'admin'}` : ""}`
}
export function getupload_git_file(id) {
- return `${getUrlmys()}/api/shixuns/${id}/upload_git_file.json?debug=${window._debugType || 'admin'}`
+ return `${getUrlmys()}/api/shixuns/${id}/upload_git_file.json${isDev ?`?debug=${window._debugType || 'admin'}` : ""}`
}
export function getUploadActionUrlOfAuth(id) {
- return `${getUrl()}/api/users/accounts/${id}/auth_attachment.json?debug=${window._debugType || 'admin'}`
+ return `${getUrl()}/api/users/accounts/${id}/auth_attachment.json${isDev ?`?debug=${window._debugType || 'admin'}` : ""}`
}
export function getRandomNumber(type) {
diff --git a/src/common/educoder.js b/src/common/educoder.js
index 1fc86893..1a063d82 100644
--- a/src/common/educoder.js
+++ b/src/common/educoder.js
@@ -3,7 +3,7 @@
// export { default as OrderStateUtil } from '../routes/Order/components/OrderStateUtil';
export {
- getUploadLogoActionUrl as getUploadLogoActionUrl,
+ getUploadLogoActionUrl as getUploadLogoActionUrl,numFormat as numFormat,
getImageUrl as getImageUrl,getImage as getImage, getmyUrl as getmyUrl, getRandomNumber as getRandomNumber, getUrl as getUrl, publicSearchs as publicSearchs, getRandomcode as getRandomcode, getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl
, getUploadActionUrl as getUploadActionUrl, getUploadActionUrltwo as getUploadActionUrltwo, getUploadActionUrlthree as getUploadActionUrlthree, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth
, getTaskUrlById as getTaskUrlById, TEST_HOST, htmlEncode as htmlEncode, getupload_git_file as getupload_git_file, getcdnImageUrl as getcdnImageUrl
@@ -27,7 +27,7 @@ export {
markdownToHTML, uploadNameSizeSeperator, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll, isImageExtension,
downloadFile, sortDirections, validateLength, mdJSONParse, exportMdtoHtml
} from './TextUtil'
-export { handleDateString, getNextHalfHourOfMoment, formatDuring, formatSeconds } from './DateUtil'
+export { handleDateString, getNextHalfHourOfMoment, formatDuring, formatSeconds ,timeAgo} from './DateUtil'
export { configShareForIndex, configShareForPaths, configShareForShixuns, configShareForCourses, configShareForCustom } from './util/ShareUtil'
diff --git a/src/components/render-html.jsx b/src/components/render-html.jsx
index 3601ea32..b24fc092 100644
--- a/src/components/render-html.jsx
+++ b/src/components/render-html.jsx
@@ -46,18 +46,18 @@ export default ({
let id = decodeURIComponent(u.split("#")[1]);
let ele = document.getElementById(id);
if(ele){
- window.scrollTo(0, ele.offsetTop + 220);
+ window.scrollTo(0, ele.offsetTop + 120);
}
}
}
- },[url])
+ },[url,html])
const el = useRef();
function onAncherHandler(e) {
- let target = e.target
+ let target = e.target;
if (target.tagName.toUpperCase() === 'A') {
- let ancher = target.getAttribute('href')
- if (ancher.startsWith('#')) {
+ let ancher = target.getAttribute('href');
+ if (ancher && ancher.startsWith('#')) {
e.preventDefault()
let viewEl = document.getElementById(ancher.replace('#', ''))
if (viewEl) {
diff --git a/src/context/TPIContextProvider.js b/src/context/TPIContextProvider.js
index 22b24727..f3ea3e0f 100644
--- a/src/context/TPIContextProvider.js
+++ b/src/context/TPIContextProvider.js
@@ -435,11 +435,11 @@ class TPIContextProvider extends Component {
image_url: "avatars/User/1"
login: "innov"
name: "Coder"
- user_url: "/users/innov"
+ user_url: "/innov"
*/
let user = resData.user;
user.username = resData.user.name;
- user.user_url = `/users/${resData.user.login}`;
+ user.user_url = `/${resData.user.login}`;
// user.image_url = resData.image_url;
user.is_teacher = resData.is_teacher;
resData.user = user;
diff --git a/src/forge/Activity/Activity.js b/src/forge/Activity/Activity.js
index 163495bd..4a7a1d34 100644
--- a/src/forge/Activity/Activity.js
+++ b/src/forge/Activity/Activity.js
@@ -1,7 +1,7 @@
import React , { Component } from 'react';
import { Dropdown , Menu , Icon , Pagination , Spin } from 'antd';
import '../css/index.scss';
-import '../Branch/branch.css';
+import '../Branch/branch.scss';
import './activity.css';
import NoneData from '../Nodata';
@@ -10,6 +10,10 @@ import ActivityItem from './ActivityItem';
import axios from 'axios';
const LIMIT = 15;
const ARRAY = [
+ {
+ id:"",
+ name:'全部'
+ },
{
id:1,
name:'1天'
@@ -32,10 +36,15 @@ class Activity extends Component{
constructor(props){
super(props);
this.state={
- time:'30',
+ time:undefined,
type:undefined,
state:undefined,
page:1,
+ pr_count:undefined,
+ new_pr_count:undefined,
+ close_issues_count:undefined,
+ open_issues_count:undefined,
+ pr_all_count:undefined,issues_count:undefined,
data:undefined,
project_trends:undefined,
@@ -63,8 +72,15 @@ class Activity extends Component{
this.setState({
data:result.data,
project_trends:result.data.project_trends,
- isSpin:false
+ isSpin:false,
+ pr_count:result.data.pr_count,
+ new_pr_count:result.data.new_pr_count,
+ close_issues_count:result.data.close_issues_count,
+ open_issues_count:result.data.open_issues_count,
+ pr_all_count:result.data.pr_all_count,
+ issues_count:result.data.issues_count,
})
+ window.scrollTo(0,0);
}
}).catch(error=>{
console.log(error);
@@ -74,19 +90,19 @@ class Activity extends Component{
// 切换周期
changeTime=(e)=>{
this.setState({
- time:e.key,
+ time:e.key ==="item_0"?undefined:e.key,
isSpin:true
})
const { type,status,page } = this.state;
- this.getInfo(e.key,type,status,page);
+ this.getInfo(e.key ==="item_0"?undefined:e.key,type,status,page);
}
//筛选
changeTrends=(type,status)=>{
this.setState({
- type,status
+ type,status,page:1
})
- const {time,page}=this.state;
- this.getInfo(time,type,status,page);
+ const {time}=this.state;
+ this.getInfo(time,type,status,1);
}
// 分页
ChangePage=(page)=>{
@@ -108,12 +124,14 @@ class Activity extends Component{
)
render(){
- const { time , data , page , project_trends , isSpin } = this.state;
+ const { time , data , page , project_trends , isSpin , pr_count , new_pr_count , close_issues_count , open_issues_count , pr_all_count ,issues_count } = this.state;
+ let name = time ? ARRAY.filter(item=>item.id === parseInt(time)) :[{name:"全部"}];
- let name = time && ARRAY.filter(item=>item.id === parseInt(time)) ;
- const second_per = (parseInt(data && data.close_issues_count)/parseInt(data && data.issues_count)*100)+'%';
- const third_per = (parseInt(data && data.close_issues_count)/parseInt(data && data.issues_count)*100)+'%';
- const fourth_per = (parseInt(data && data.open_issues_count)/parseInt(data && data.issues_count)*100)+'%';
+ const first_per = pr_all_count > 0 ? `${parseFloat(pr_count/pr_all_count).toFixed(2)*100}%` :"50%";
+ const second_per =pr_all_count > 0 ? `${parseFloat(new_pr_count/pr_all_count).toFixed(2)*100}%` :"50%";
+ const third_per =issues_count > 0 ?`${parseFloat(close_issues_count/issues_count).toFixed(2)*100}%` :"50%";
+ const fourth_per =issues_count > 0 ?`${parseFloat(open_issues_count/issues_count).toFixed(2)*100}%` :"50%";
+
return(
@@ -122,7 +140,7 @@ class Activity extends Component{
{data && data.pr_all_count}合并请求
@@ -132,25 +150,25 @@ class Activity extends Component{
-
{data && data.issues_count}任务
+
{data && data.issues_count}易修
-
{data && data.pr_count}
- this.changeTrends("PullRequest","close")}>已处理的合并请求
+ this.changeTrends("PullRequest","delay")}>已处理的合并请求
-
{data && data.new_pr_count}
- this.changeTrends("PullRequest","create")}>未处理的合并请求
+ this.changeTrends("PullRequest","not_delay")}>未处理的合并请求
-
{data && data.close_issues_count}
- this.changeTrends("Issue","close")}>已关闭的任务
+ this.changeTrends("Issue","delay")}>已关闭的易修
-
{data && data.open_issues_count}
- this.changeTrends("Issue","create")}>未处理的任务
+ this.changeTrends("Issue","not_delay")}>未处理的易修
diff --git a/src/forge/Activity/ActivityItem.js b/src/forge/Activity/ActivityItem.js
index b726a4af..48a72e79 100644
--- a/src/forge/Activity/ActivityItem.js
+++ b/src/forge/Activity/ActivityItem.js
@@ -14,25 +14,25 @@ class ActivityItem extends Component {
{/* 如果是版本发布 */}
{item.trend_type === "VersionRelease" ?
- {item.name}
+ {item.name}
{item.trend_type}
:
// 如果是任务
item.trend_type === "Issue" ?
- {item.name}
+ {item.name}
{item.trend_type}
:
// 如果是合并请求
- {item.name}
+ {item.name}
{item.trend_type}
}
-
+
{item.user_name}
diff --git a/src/forge/Branch/CloneAddress.js b/src/forge/Branch/CloneAddress.js
index 89cd3f4e..c2e6dd74 100644
--- a/src/forge/Branch/CloneAddress.js
+++ b/src/forge/Branch/CloneAddress.js
@@ -1,39 +1,27 @@
-import React, { Component } from 'react';
-import { Dropdown, Icon, Tooltip } from 'antd';
-import "./branch.css";
+import React, { useState } from 'react';
+import { Menu } from 'antd';
+import "./branch.scss";
+import CopyTool from '../Component/CopyTool';
-class CloneAddress extends Component {
- // 点击按钮复制功能
- jsCopy = () => {
- var e = document.getElementById("copy_rep_content");
- e.select();
- document.execCommand("Copy");
- }
-
- render() {
- const { http_url, downloadUrl } = this.props;
- return (
-
- {/*
版本库地址已变更,请基于新地址提交代码
*/}
- {
- http_url &&
HTTP
- }
-
-
- this.jsCopy()}>
-
- {
- downloadUrl &&
-
-
-
-
-
-
-
- }
+function CloneAddress({http_url , ssh_url , zip_url , tar_url}) {
+ const [ key , setKey ] = useState("HTTP");
+ return (
+
+
+
+
+
+
+
- )
- }
+
+
+ )
}
export default CloneAddress;
\ No newline at end of file
diff --git a/src/forge/Branch/Select.jsx b/src/forge/Branch/Select.jsx
index 0f0b0de4..ff3dd829 100644
--- a/src/forge/Branch/Select.jsx
+++ b/src/forge/Branch/Select.jsx
@@ -1,116 +1,65 @@
-import React , { useState , useEffect } from 'react';
-import { Popover , Input , Spin } from 'antd';
-import './branch.css';
-import { getBranch , getTag } from '../GetData/getData';
-
+import React , { useState , useEffect , useRef } from 'react';
+import { Dropdown} from 'antd';
+import './branch.scss';
+import SelectOverlay from './SelectOverlay';
+import { findDOMNode } from 'react-dom';
export default (({ projectsId , branch , owner , changeBranch , branchList , tagflag = true })=>{
const [ showValue , setShowValue ] = useState(branch);
- const [ inputValue , setInputValue] = useState(undefined);
- const [ nav , setNav ] = useState(0);
- const [ isSpin , setIsSpin ] = useState(true);
- const [ flag , setFlag ] = useState(false);
+ const [ visible , setVisible ] = useState(false);
- const [ data , setData ] = useState(undefined);
- const [ datas , setDatas ] = useState(undefined);
+ const refFa = useRef(null);
+ const refBox = useRef(null);
+
+ useEffect(() => {
+ document.addEventListener('click', clickMe , false);
+ }, [])
+
+ const clickMe = ({ target }) => {
+ // 查找父组件
+ const faComponent = findDOMNode(refFa.current);
+ const boxComponent = findDOMNode(refBox.current);
+
+ if (faComponent && boxComponent) {
+ const isChild = faComponent.contains(target);
+ const isBox = boxComponent.contains(target);
+ if(!isChild && !isBox){
+ setVisible(false);
+ }
+ }
+ }
useEffect(()=>{
setShowValue(branch);
},[branch])
- useEffect(()=>{
- document.body.addEventListener('click', e => {
- let name = e.target.className;
- let turn = name === "ant-input OptionsInput" || name === "navli active"|| name === "navli" || name === "padding10 bor-bottom-greyE";
- if(turn){
- return;
- }else{
- setFlag(false);
- }
- })
- })
-
- useEffect(()=>{
- if(branchList){
- setData(branchList);
- setDatas(branchList);
- setIsSpin(false);
- }
- },[branchList])
-
-
- async function getBranchs(id,owner){
- let result = await getBranch(id,owner);
- setData(result);
- setDatas(result);
- setIsSpin(false);
+ function ChangeB(params) {
+ setVisible(false);
+ changeBranch(params);
}
- async function getTags(id,owner){
- let result = await getTag(id,owner);
- setData(result);
- setDatas(result);
- setIsSpin(false);
- }
-
- function changeInputValue(e){
- setInputValue(e.target.value);
- let filter = e.target.value ? data && data.length>0 && data.filter(item=>item.name.indexOf(e.target.value)>-1) : data;
- setDatas(filter);
- }
-
- function changeNav(nav){
- setNav(nav);
- setIsSpin(true);
- if(nav === 0){
- getBranchs(projectsId,owner);
- }else{
- getTags(projectsId,owner);
- }
- }
- function chooseitem(value){
- // setShowValue(value);
- changeBranch(value);
- }
-
const menu = (
-
-
-
-
- - changeNav(0)}>分支列表
- { tagflag && - changeNav(1)}>标签列表
}
-
-
-
-
-
+
+
);
return(
-
setFlag(!flag)} overlayClassName="branch-tagBox-list">
-
+
+ setVisible(visible ? false : true)}>
{/* {nav === 0 ?"分支":"标签"} */}
-
+
{showValue}
-
-
+
+
-
+
)
})
\ No newline at end of file
diff --git a/src/forge/Branch/SelectOverlay.jsx b/src/forge/Branch/SelectOverlay.jsx
new file mode 100644
index 00000000..0be56732
--- /dev/null
+++ b/src/forge/Branch/SelectOverlay.jsx
@@ -0,0 +1,90 @@
+import React , { useState , useEffect } from 'react';
+import { Input , Spin , Menu } from 'antd';
+import { getBranch , getTag } from '../GetData/getData';
+
+function SelectOverlay({ changeBranch , tagflag , projectsId , owner , visible }) {
+ const [ inputValue , setInputValue] = useState(undefined);
+ const [ nav , setNav ] = useState(0);
+ const [ isSpin , setIsSpin ] = useState(true);
+
+ const [ data , setData ] = useState(undefined);
+ const [ datas , setDatas ] = useState(undefined);
+ const [ keys ,setKeys] = useState("branch");
+
+ useEffect(()=>{
+ if(visible){
+ setKeys("branch");
+ getBranchs(projectsId,owner);
+ setIsSpin(true);
+ }
+ },[visible])
+
+ async function getBranchs(id,owner){
+ let result = await getBranch(id,owner);
+ setData(result);
+ setDatas(result);
+ setIsSpin(false);
+ }
+ async function getTags(id,owner){
+ let result = await getTag(id,owner);
+ setData(result);
+ setDatas(result);
+ setIsSpin(false);
+ }
+ function chooseitem(value){
+ changeBranch(value);
+ }
+ function changeInputValue(e){
+ setInputValue(e.target.value);
+ let filter = e.target.value ? data && data.length>0 && data.filter(item=>item.name.indexOf(e.target.value)>-1) : data;
+ setDatas(filter);
+ }
+
+ function changeNav(e){
+ setKeys(e.key);
+ setIsSpin(true);
+ if(e.key === "branch"){
+ getBranchs(projectsId,owner);
+ setNav(0);
+ }else{
+ getTags(projectsId,owner);
+ setNav(1);
+ }
+ }
+
+ return(
+
+
+ }
+ placeholder={`请输入分支${tagflag ? "或标签" :""}名称搜索`}
+ autocomplete="off" className="OptionsInput"
+ value={inputValue}
+ onChange={changeInputValue}
+ />
+
+
+
+
+
+
+ )
+}
+export default SelectOverlay;
\ No newline at end of file
diff --git a/src/forge/Branch/branch.css b/src/forge/Branch/branch.css
deleted file mode 100644
index 962b0197..00000000
--- a/src/forge/Branch/branch.css
+++ /dev/null
@@ -1,84 +0,0 @@
-.branchDropdown{
- border:1px solid #eee;
- border-radius: 4px;
- display: flex;
- justify-content: center;
- height: 40px;
- line-height: 40px;
- min-width: 220px;
-}
-.branchDropdown .ant-dropdown-trigger{
- width: 100%;
- padding:0px 15px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- cursor: pointer;
-}
-.branchOptions{
- width: 220px;
- box-shadow: 0px 0px 3px 1px rgba(134, 134, 134, 0.4);
- border-radius: 3px;
- background: #fff;
- max-height: 300px;
-}
-.OptionsUl{
- max-height: 220px;
- overflow-y: auto;
-}
-.OptionsUl li{
- height: 35px;
- line-height: 35px;
- cursor: pointer;
- padding:0px 10px;
-}
-.OptionsUl li:hover{
- background-color: #F0F0F0;
-}
-.OptionsUl li a{
- display: block;
-}
-.OptionsInput{
- height: 32px;
- padding-left: 4px;
- line-height: 32px;
- width: 100%;
-}
-.branch-tagBox{
- border:1px solid #eee;
- border-radius: 3px;
- height: 40px;
- display: flex;
- align-items: center;
- cursor: pointer;
- min-width: 140px;
-}
-.branch-tagBox-list .ant-popover-arrow{
- display: none;
-}
-.branch-tagBox-list.ant-popover.ant-popover-placement-bottom{
- padding-top:0px;
-}
-.branch-tagBox .ant-dropdown-link{
- display: block;
- flex:1;
-}
-.branch-tagBox-list .ant-popover-inner-content{
- padding:0px;
-}
-.navUl{
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-top: 5px;
-}
-.navUl li{
- cursor: pointer;
-}
-.navUl li.active{
- color:#5091FF;
-}
-.listTips{
- padding:20px 0px;
- text-align: center;
-}
\ No newline at end of file
diff --git a/src/forge/Branch/branch.scss b/src/forge/Branch/branch.scss
new file mode 100644
index 00000000..030b05cd
--- /dev/null
+++ b/src/forge/Branch/branch.scss
@@ -0,0 +1,129 @@
+.branchDropdown{
+ border:1px solid #eee;
+ border-radius: 4px;
+ display: flex;
+ justify-content: center;
+ height: 40px;
+ line-height: 40px;
+ min-width: 220px;
+}
+.branchDropdown .ant-dropdown-trigger{
+ width: 100%;
+ padding:0px 15px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ cursor: pointer;
+}
+.branchOptions{
+ width: 220px;
+ box-shadow: 0px 0px 3px 1px rgba(134, 134, 134, 0.4);
+ border-radius: 3px;
+ background: #fff;
+ max-height: 300px;
+}
+.OptionsUl{
+ min-height: 50px;
+ max-height: 220px;
+ overflow-y: auto;
+}
+.OptionsUl li{
+ height: 30px;
+ line-height: 30px;
+ cursor: pointer;
+ padding:0px 20px;
+ margin:5px 0px;
+}
+.OptionsUl li:hover{
+ background-color: #F0F0F0;
+}
+.OptionsUl li a{
+ display: block;
+}
+.OptionsInput{
+ height: 32px;
+ padding-left: 4px;
+ line-height: 32px;
+ width: 100%;
+}
+.branch-tagBox{
+ border:1px solid #D0D0D0;
+ border-radius: 3px;
+ height: 32px;
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+ min-width: 104px;
+}
+.branch-tagBox:hover{
+ background-color: #F3F4F6;
+}
+.branch-tagBox-list{
+ background: #FFFFFF;
+ box-shadow: 0px 4px 8px 2px rgba(212, 212, 212, 0.5);
+ border-radius: 4px;
+ .ant-popover-arrow{
+ display: none;
+ }
+ &.ant-popover.ant-popover-placement-bottom{
+ padding-top:0px;
+ }
+ .branch-tagBox .ant-dropdown-link{
+ display: block;
+ flex:1;
+ max-width: 105px;
+ }
+ .ant-popover-inner-content{
+ padding:0px;
+ }
+}
+.overlayBranch{
+ width: 325px;
+ .navUl{
+ margin-top: 8px;
+ height: 30px;
+ line-height: 30px;
+ li{
+ height: 30px;
+ line-height: 30px;
+ padding:0px 5px;
+ margin-left: 20px!important;
+ &.ant-menu-item-selected{
+ border-color:#466aff!important;
+ color:#466aff!important;
+ }
+ &.ant-menu-item-active{
+ border-color:transparent ;
+ }
+ }
+ }
+}
+.listTips{
+ padding:20px 0px;
+ text-align: center;
+}
+
+.urlMenu{
+ line-height: 30px;
+ margin-bottom: 10px;
+ padding:15px 20px 0px 20px;
+ border-bottom: none;
+ li.ant-menu-item{
+ height: 30px;
+ line-height: 30px;
+ padding:0px 5px;
+ margin-right: 20px!important;
+ &.ant-menu-item-selected,&.ant-menu-item-active{
+ color: #333;
+ }
+ &.ant-menu-item-selected{
+ border-color:#466aff!important;
+ }
+ &.ant-menu-item-active{
+ border-color:transparent ;
+ }
+ }
+}
+.copytool{
+ margin:0px 10px;
+}
\ No newline at end of file
diff --git a/src/forge/Component/AddGroup.jsx b/src/forge/Component/AddGroup.jsx
index 656175d5..feff6f37 100644
--- a/src/forge/Component/AddGroup.jsx
+++ b/src/forge/Component/AddGroup.jsx
@@ -55,6 +55,7 @@ function AddGroup({organizeId,getGroupID}){
function addCollaborator(){
getGroupID && getGroupID(id);
+ setID(undefined);
}
return(
diff --git a/src/forge/Component/AddMember.jsx b/src/forge/Component/AddMember.jsx
index f1c14f07..f927850c 100644
--- a/src/forge/Component/AddMember.jsx
+++ b/src/forge/Component/AddMember.jsx
@@ -4,7 +4,7 @@ import axios from 'axios';
import { getImageUrl } from 'educoder';
const { Option } = AutoComplete;
-function AddMember({getID,login}){
+function AddMember({getID,login,showNotification}){
const [ id , setID ] = useState(undefined);
const [ source , setSource ] = useState(undefined);
const [ searchKey , setSearchKey ] = useState(undefined);
@@ -66,8 +66,12 @@ function AddMember({getID,login}){
};
function addCollaborator(){
- getID && getID(id);
- setSearchKey(undefined);
+ if(source && source.length>0){
+ getID && getID(id);
+ setSearchKey(undefined);
+ }else{
+ showNotification("请选择存在的用户!");
+ }
}
return(
diff --git a/src/forge/Component/Cards.jsx b/src/forge/Component/Cards.jsx
index 498b375c..f9a3d52e 100644
--- a/src/forge/Component/Cards.jsx
+++ b/src/forge/Component/Cards.jsx
@@ -3,7 +3,7 @@ import { getImageUrl } from 'educoder';
import { Link } from 'react-router-dom';
import './Component.scss';
-function Cards({img , title, desc , rightBtn , src}){
+function Cards({img , title, desc , rightBtn , src , bottomInfos}){
return(
{img &&
}
@@ -15,6 +15,7 @@ function Cards({img , title, desc , rightBtn , src}){
{desc}
+ {bottomInfos}
)
diff --git a/src/forge/Component/Component.scss b/src/forge/Component/Component.scss
index 46aa8fcc..30a62005 100644
--- a/src/forge/Component/Component.scss
+++ b/src/forge/Component/Component.scss
@@ -112,6 +112,16 @@ li.ant-menu-item{
right:240px;
z-index: 10000;
}
+.laterest{
+ background-color: #EF3131;
+ color: #fff;
+ font-size: 12px;
+ margin-left: 10px;
+ padding:0px 5px;
+ border-radius: 2px;
+ height: 18px;
+ line-height: 18px;
+}
@media screen and (max-width: 1800px){
.handleBox{
@@ -152,41 +162,280 @@ li.ant-menu-item{
margin:0px 20px!important;
}
}
-
+.hoverA{
+ display:flex;
+ align-items: center;
+ max-width: 78px;
+ &:hover a{
+ color:#2A61FF !important ;
+ }
+}
.menuPanels{
- width: 240px;
- height: 180px;
+ width: 295px;
+ .leftline{
+ position: relative;
+ color: #666;
+ height: 16px;
+ margin-left: 14px;
+ font-size: 12px;
+ &::before{
+ position: absolute;
+ left: -7px;
+ top:3px;
+ height: 12px;
+ width: 1px;
+ background-color: #999;
+ content: "";
+ }
+ }
+ .ant-btn{
+ height: 36px;
+ line-height: 34px;
+ width: 83px;
+ text-align: center;
+ padding:0px ;
+ font-weight: 500;
+ font-size: 14px;
+ &.currentBtn{
+ cursor: default;
+ color: #333;
+ &:hover{
+ color: #333;
+ border-color: #d0d0d0;
+ }
+ }
+ }
+ .ant-btn-default{
+ color: #333;
+ border-color: #d0d0d0;
+ &:hover{
+ background: #F3F4F6;
+ }
+ }
+ .ant-btn{
+ width: 102px;
+ height: 32px;
+ line-height: 30px;
+ }
+ .ant-btn-primary{
+ color: #fff;
+ background-color: #466AFF;
+ border:none;
+ &:hover{
+ background-color: rgba(70,106,255,0.85);
+ }
+ }
+ .focusPanelHeadInfo{
+ padding:14px 16px;
+ border-bottom: 1px solid #eee;
+ }
.ant-popover-content,.ant-popover-inner{
height: 100%;
width: 100%;
}
+ .ant-popover-inner-content{
+ padding:0px;
+ }
}
.halfs{
margin-top: 24px;
padding:24px 0px 0px 0px;
border-top: 1px solid #e8e8e8;
- .attrPerson{
- padding-bottom: 24px;
- }
+}
+.aboutSubTitle{
+ display: flex;
+ align-items: center;
+}
+.menuMaininfos{
+ padding:10px 16px 14px;
+ border-bottom: 1px solid #eee;
}
.menuinfos{
- padding:15px 0px;
+ padding:10px 20px 16px;
&>a{
display: flex;
flex-direction: column;
align-items: center;
- border-right: 1px solid #eee;
flex: 1;
& >span:first-child{
- font-size: 18px;
- font-weight: 400;
+ font-size: 16px;
+ font-weight: 500;
color: #333;
+ line-height: 22px;
}
& >span:last-child{
color: #666;
- }
- &:last-child{
- border-right: none;
+ font-weight: 400;
+ line-height: 20px;
+ margin-top: 6px;
}
}
-}
\ No newline at end of file
+}
+
+/*-------------------个人主页:右侧提示区域--------------------------*/
+.-task-sidebar {
+ position: fixed;
+ width: 40px;
+ right: 0;
+ bottom: 80px;
+ z-index: 10;
+}
+
+@media screen and (max-width: 1920px){
+ .-task-sidebar{
+ right:220px;
+ }
+}
+@media screen and (max-width: 1750px){
+ .-task-sidebar{
+ right:160px;
+ }
+}
+@media screen and (max-width: 1650px){
+ .-task-sidebar{
+ right:115px;
+ }
+}
+@media screen and (max-width: 1550px){
+ .-task-sidebar{
+ right:90px;
+ }
+}
+@media screen and (max-width: 1450px){
+ .-task-sidebar{
+ right:45px;
+ }
+}
+@media screen and (max-width: 1200px){
+ .-task-sidebar{
+ right:0px;
+ display: none;
+ }
+}
+.-task-sidebar>div {
+ height: 40px;
+ line-height: 40px;
+ box-sizing: border-box;
+ width: 40px;
+ color: #999;
+ font-size: 20px;
+ text-align: center;
+ margin-bottom: 20px;
+ border-radius: 50%;
+ background: #FFFFFF;
+ box-shadow: 0px 0px 10px 1px #F1F1F1;
+}
+
+.-task-sidebar>div i {
+ color: #999;
+}
+
+.-task-sidebar>div:hover i {
+ color: #fff !important;
+}
+.-task-sidebar>div:hover{
+ background: #1890FF;
+ box-shadow: 0px 0px 10px 2px #B6D0FC;
+}
+.helpBox{
+ width: 260px;
+ z-index: 103;
+ &.shareContent{
+ width: 200px;
+ }
+ .ant-popover-inner-content{
+ padding:0px;
+ }
+ p.titlecontent{
+ font-size: 18px;
+ color: #333;
+ line-height: 20px;
+ padding:15px 20px;
+ }
+ .faqUl{
+ padding:0px 20px 10px;
+ max-height: 230px;
+ overflow-y: auto;
+ li{
+ background: #F5F5F5;
+ border-radius: 20px;
+ padding:0px 20px;
+ color: #333;
+ height: 34px;
+ line-height: 34px;
+ margin-bottom: 10px;
+ a{
+ display: block;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ &:hover{
+ background-color: #D1E9FF;
+ a{
+ color: #333!important;
+ }
+ }
+ }
+ }
+ .shareUl{
+ padding:10px 0px;
+ display: flex;
+ align-items: center;
+ .titlecontent{
+ margin-right: 20px;
+ }
+ li > i{
+ font-size: 32px!important;
+ }
+ }
+}
+
+
+
+.-task-desc {
+ background: #494949;
+ width: 90px;
+ line-height: 36px;
+ text-align: center;
+ position: absolute;
+ color: #fff;
+ font-size: 13px;
+ z-index: 999999;
+ opacity: 0;
+}
+
+.-task-desc div {
+ position: absolute;
+ top: 10px;
+ right: -7px;
+ height: 13px;
+}
+
+.-task-desc div img {
+ float: left
+}
+
+.-task-sidebar .scan_ewm {
+ position: absolute !important;
+ right: 45px !important;
+ bottom: 0px !important;
+ background-color: #494949 !important;
+ -webkit-box-sizing: border-box !important;
+ box-sizing: border-box !important;
+ font-size: 14px !important;
+ line-height: 16px !important;
+ display: none;
+ height: 213px !important;
+}
+
+.trangle_right {
+ position: absolute;
+ right: -5px;
+ bottom: 15px;
+ width: 0;
+ height: 0px;
+ border-top: 6px solid transparent;
+ border-left: 5px solid #494949;
+ border-bottom: 6px solid transparent
+}
diff --git a/src/forge/Component/Contributors.jsx b/src/forge/Component/Contributors.jsx
index 1e26354a..e88acc05 100644
--- a/src/forge/Component/Contributors.jsx
+++ b/src/forge/Component/Contributors.jsx
@@ -1,13 +1,13 @@
import React, { useEffect, useState } from 'react';
import { AlignCenter , FlexAJ } from '../Component/layout';
import { Link } from 'react-router-dom';
-import { Popover , Spin } from 'antd';
+import { Popover , Spin , Button } from 'antd';
import { getImageUrl } from 'educoder';
import './Component.scss';
import { getUser } from '../GetData/getData';
import axios from 'axios';
-function Contributors({contributors,owner,projectsId}){
+function Contributors({contributors,owner,projectsId,currentLogin}){
const [ menuList ,setMenuList ]= useState([]);
const [ list , setList ]= useState(undefined);
const [ total , setTotal ]= useState(0);
@@ -46,46 +46,60 @@ function Contributors({contributors,owner,projectsId}){
}
}
+ function renderOrganize(list) {
+ let str = "";
+ list.map(i=>{
+ str = str+i.name + "、";
+ })
+ return str && str.substr(0,str.length - 1);
+ }
+
function setMenusFunc(data){
if(data){
let ele = (
-
+
-
- {data.name}
-
- {
- data.is_watch ? FocusFunc(false,data.login)}>取消关注:FocusFunc(true,data.login)}>关注
- }
-
-
-
- {data.projects_count}
- 项目数
-
-
- {data.followers_count}
- 粉丝数
-
-
- {data.following_count}
- 关注数
-
-
- {
- data.organizations && data.organizations.length > 0 ?
-
- 所属组织:
-
- {renderArray(data.organizations)}
+
})
+
+
+
{data.name}
+ { data.location &&
{data.location} }
+ {
+ data.organizations && data.organizations.length>0&&
+
+ 所属组织:{renderOrganize(data.organizations)}
+
+ }
- :""
- }
- {
- data.location &&
所在地址:{data.location}
- }
+
+
+
+ {data.projects_count}
+ 项目数
+
+
+ {data.followers_count}
+ 粉丝数
+
+
+ {data.following_count}
+ 关注数
+
+
+
+ {
+ currentLogin && (currentLogin === data.login)
+ ?
+
+ :
+ data.is_watch ?
+
+ :
+
+ }
+
)
setMenu(ele);
@@ -135,17 +149,17 @@ function Contributors({contributors,owner,projectsId}){
return(
-
- 贡献者{ contributors && contributors.total_count > 0 && {contributors.total_count}}
- 全部
-
+
+
贡献者
+ { contributors && contributors.total_count > 0 &&
{contributors.total_count}}
+
setVisibleFunc(false)}>
{
total > 0 ?
list.map((item,key)=>{
return(
-
+
setVisibleFunc(true,item.login,key)}/>
diff --git a/src/forge/Component/CopyTool.jsx b/src/forge/Component/CopyTool.jsx
new file mode 100644
index 00000000..36ed1d8c
--- /dev/null
+++ b/src/forge/Component/CopyTool.jsx
@@ -0,0 +1,51 @@
+import React, { useState, useCallback, memo } from 'react';
+import { Tooltip } from 'antd';
+
+CopyTool.defaultProps = {
+ beforeText: '复制链接', //浮动过去显示的文字
+ afterText: '复制成功', //点击后显示的文字
+ className: '', //传给svg的class
+ inputId: 'copyText', //要复制的文本的ID
+ timeOut:true, //复制后将浮动的文字改为beforeText
+};
+
+
+function CopyTool({ beforeText, afterText, className , inputId , timeOut }) {
+ const [title, setTitle] = useState(() => {
+ return beforeText;
+ });
+
+ // 复制链接
+ const copyUrl = useCallback(() => {
+ const copyEle = document.querySelector(`#${inputId}`); // 获取要复制的节点
+ if (!copyEle) {
+ console.error("您的CopyTool未设置正确的inputId");
+ return;
+ }
+ copyEle.select(); // 执行选中元素
+ if (document.execCommand('copy')) {
+ document.execCommand('copy');
+ }
+ document.getSelection().removeAllRanges();
+
+ setTitle(afterText);
+ if(timeOut){
+ setTimeout(function(){
+ setTitle(beforeText);
+ },1500)
+ }
+ }, []);
+
+ return (
+
{ setTitle(beforeText) }}
+ >
+
+
+ );
+}
+
+
+export default memo(CopyTool);
\ No newline at end of file
diff --git a/src/forge/Component/DeleteModal/Index.jsx b/src/forge/Component/DeleteModal/Index.jsx
new file mode 100644
index 00000000..c3c13689
--- /dev/null
+++ b/src/forge/Component/DeleteModal/Index.jsx
@@ -0,0 +1,33 @@
+import React from 'react';
+import { AlignCenter } from '../layout';
+import { Button } from 'antd';
+import Modals from '../PublicModal/Index';
+
+function DeleteBox({
+ visible ,
+ onCancel ,
+ onSuccess ,
+ title ,
+ subTitle,
+ content
+}) {
+ return(
+
+
+
+
+ }
+ onCancel={onCancel}
+ visible={visible}
+ >
+
+
{content}
+
{subTitle}
+
+
+ )
+}
+export default DeleteBox;
\ No newline at end of file
diff --git a/src/forge/Component/DrawerPanel.jsx b/src/forge/Component/DrawerPanel.jsx
index 8070f3fa..fa99e6c6 100644
--- a/src/forge/Component/DrawerPanel.jsx
+++ b/src/forge/Component/DrawerPanel.jsx
@@ -4,6 +4,12 @@ import './Component.scss';
import axios from 'axios';
const { TreeNode , DirectoryTree } = Tree;
+function turnbar(str){
+ if(str && str.length>0 && str.indexOf("/")>-1){
+ return str.replaceAll('/','%2F');
+ }
+ return str;
+}
function DrawerPanel({visible,onClose,branch,owner,projectsId,history, name , list}){
const [ treeData , setTreeData ] = useState(undefined);
const [ isSpin , setIsSpin ] = useState(true);
@@ -71,7 +77,8 @@ function DrawerPanel({visible,onClose,branch,owner,projectsId,history, name , li
let dataref = event.node.props.dataRef;
if(dataref.type==="file"){
onClose();
- history.push(`/projects/${owner}/${projectsId}/tree/${branch}/${dataref.path}`);
+ let value = turnbar(branch);
+ history.push(`/${owner}/${projectsId}/tree/${value}/${dataref.path}`);
}
}
diff --git a/src/forge/Component/EAccount.scss b/src/forge/Component/EAccount.scss
new file mode 100644
index 00000000..6fe44ab3
--- /dev/null
+++ b/src/forge/Component/EAccount.scss
@@ -0,0 +1,6 @@
+.ant-modal-mask{
+ z-index: 1031;
+}
+.ant-modal-wrap{
+ z-index: 1032;
+}
\ No newline at end of file
diff --git a/src/forge/Component/EducoderAccount.jsx b/src/forge/Component/EducoderAccount.jsx
new file mode 100644
index 00000000..51fe0ded
--- /dev/null
+++ b/src/forge/Component/EducoderAccount.jsx
@@ -0,0 +1,60 @@
+import React , {forwardRef, useEffect} from 'react';
+import { Modal , Form , Input , Button } from 'antd';
+import './EAccount.scss';
+
+function EducoderAccount({form , visible , onOk , email}){
+ const { getFieldDecorator, validateFields , setFieldsValue } = form;
+
+ useEffect(()=>{
+ if(email){
+ setFieldsValue({email})
+ }
+ },[email])
+
+ function onSure(){
+ validateFields((error,values)=>{
+ if(!error){
+ onOk(values);
+ }
+ })
+ }
+ const layout = {
+ labelCol: { span: 5 },
+ wrapperCol: { span: 18 },
+ };
+ return(
+
确定
+ }
+ centered
+ >
+
+
+ 为确保您能正常使用平台功能,请确认以下信息:
+
+
+ {getFieldDecorator("email",{
+ rules:[{required:true,message:"请输入邮箱账号"}]
+ })(
+
+ )}
+
+
+ {getFieldDecorator("password",{
+ rules:[{required:true,message:"请输入邮箱密码"}]
+ })(
+
+ )}
+
+
+
+
+ )
+}
+export default Form.create()(forwardRef(EducoderAccount));
\ No newline at end of file
diff --git a/src/forge/Component/HeadSearch.jsx b/src/forge/Component/HeadSearch.jsx
new file mode 100644
index 00000000..fb7c9f25
--- /dev/null
+++ b/src/forge/Component/HeadSearch.jsx
@@ -0,0 +1,41 @@
+import React, { useState } from "react";
+import { Input ,notification} from "antd";
+
+const { Search } = Input;
+export default ({history}) => {
+ const [openSearch, setOpenSearch] = useState(false);
+
+ function onGlobalSearch(value) {
+ history.push('/search?value=' + value);
+ // window.location.href = `search?value=` + value;
+ // history.push({
+ // pathname:'/search',
+ // state:value
+ // })
+ }
+ return (
+
+ {
+ openSearch ?
+ {
+ setTimeout(() => {
+ setOpenSearch(false)
+ }, 500)
+ }}
+ >
+
+
+ :
+ {
+ setOpenSearch(true)
+ }} />
+ }
+
+ )
+};
diff --git a/src/forge/Component/LanguagePower.jsx b/src/forge/Component/LanguagePower.jsx
index 3197309c..8d3e361b 100644
--- a/src/forge/Component/LanguagePower.jsx
+++ b/src/forge/Component/LanguagePower.jsx
@@ -25,7 +25,7 @@ function LanguagePower({languages}){
}
return(
-
开发语言
+
开发语言
{
array && array.map((item,key)=>{
diff --git a/src/forge/Component/MemberCards.jsx b/src/forge/Component/MemberCards.jsx
index 393ddbb1..48d90e13 100644
--- a/src/forge/Component/MemberCards.jsx
+++ b/src/forge/Component/MemberCards.jsx
@@ -45,15 +45,15 @@ const Div = styled.div`{
export default (({ user , img, name, time, focusStatus, is_current_user, login , successFunc }) => {
return (
-
})
+
- {name}
+ {name}
{
is_current_user ?
:
-
+
}
diff --git a/src/forge/Component/ModalFun/index.jsx b/src/forge/Component/ModalFun/index.jsx
new file mode 100644
index 00000000..8fee2c73
--- /dev/null
+++ b/src/forge/Component/ModalFun/index.jsx
@@ -0,0 +1,125 @@
+/* eslint-disable react/jsx-no-duplicate-props */
+import React, { useState } from 'react';
+import * as ReactDOM from 'react-dom';
+import { Modal, Button } from 'antd';
+import './index.scss';
+
+// 函数式调用删除、通知等模态框
+
+InitModal.defaultProps = {
+ okText: '确认', //确定按钮的文字
+ cancelText: '取消', //取消按钮的文字
+ className: '', //传入的模态框类名
+ inputId: 'copyText', //要复制的文本的ID
+ onCancel:()=>{}, //取消的回调
+ onOk:()=>{}, //确认的回调
+ title:'提示', //模态框名字
+ contentTitle:'', //内容标题
+ content:'', //详细内容
+ afterClose:()=>{}, //关闭模态框以后的回调
+};
+
+// 使用函数调用删除组件
+export default function DelModal(props) {
+ renderModal({ ...props, type: 'delete' })
+}
+
+// 使用函数调用选择模态框组件
+export function Confirm(props) {
+ renderModal({ ...props, type: 'confirm' })
+}
+
+function renderModal(props) {
+ const { type, afterClose } = props;
+ const div = document.createElement('div');
+ document.body.appendChild(div);
+
+ function destroy() {
+ afterClose && afterClose();
+ const unmountResult = ReactDOM.unmountComponentAtNode(div);
+ if (unmountResult && div.parentNode) {
+ div.parentNode.removeChild(div);
+ }
+ }
+
+ function modalType(type) {
+ if (type === 'delete') {
+ return
+
+ {props.contentTitle}
+ }
+ />
+ } else if (type === 'confirm') {
+ return
+ } else {
+ return
+ }
+ }
+
+ function render() {
+ setTimeout(() => {
+ ReactDOM.render(
+ modalType(type),
+ div,
+ );
+ });
+ }
+ render();
+}
+
+// 选择模态框组件
+function InitModal({
+ onCancel,
+ onOk,
+ title,
+ contentTitle,
+ content,
+ okText,
+ cancelText,
+ afterClose,
+ className,
+}) {
+
+ const [visible, setVisible] = useState(true);
+
+ function onCancelModal() {
+ setVisible(false);
+ onCancel && onCancel()
+ }
+
+ function onSuccess() {
+ setVisible(false);
+ onOk && onOk();
+ }
+
+ return (
+
+ {cancelText}
+ ,
+ ,
+ ]}
+ >
+
+ {contentTitle &&
{contentTitle}
}
+
{content}
+
+
+ )
+}
diff --git a/src/forge/Component/ModalFun/index.scss b/src/forge/Component/ModalFun/index.scss
new file mode 100644
index 00000000..24f7b021
--- /dev/null
+++ b/src/forge/Component/ModalFun/index.scss
@@ -0,0 +1,63 @@
+.myself-modal {
+ .ant-modal-header {
+ padding: 9px 24px;
+ background: #f8f8f8;
+ border-bottom: 1px solid #eee;
+ }
+ .ant-modal-title {
+ text-align: left;
+ }
+ .ant-modal-close {
+ top: 0px !important;
+ }
+ .ant-modal-close-x {
+ font-size: 24px;
+ }
+ .ant-modal-body {
+ text-align: center;
+ }
+ .content-title {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin: 2rem 0 1rem !important;
+ font-size: 16px;
+ color: #333;
+ letter-spacing: 0;
+ line-height: 29px;
+ font-weight: 400;
+ }
+ .red-circle {
+ align-self: flex-start;
+ color: #ca0002;
+ font-size: 1.5rem !important;
+ }
+ .content-descibe {
+ font-size: 14px;
+ color: #666;
+ line-height: 33px;
+ font-weight: 400;
+ }
+ .ant-modal-footer {
+ padding: 2rem 0;
+ text-align: center;
+ border: 0;
+ .ant-btn {
+ width: 6rem;
+ }
+ }
+ .foot-submit {
+ margin-left: 3rem;
+ color: #df0002;
+ &:hover {
+ border-color: #df0002;
+ }
+ }
+ .ant-btn-default:hover,
+ .ant-btn-default:active,
+ .ant-btn-default:focus {
+ background: #f3f4f6;
+ color: #333;
+ border-color: #d0d0d0;
+ }
+}
\ No newline at end of file
diff --git a/src/forge/Component/Monaco.jsx b/src/forge/Component/Monaco.jsx
new file mode 100644
index 00000000..aa70d803
--- /dev/null
+++ b/src/forge/Component/Monaco.jsx
@@ -0,0 +1,62 @@
+import React, {useEffect, useRef, useState} from 'react';
+import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js';
+import './Component.scss';
+
+function Monaco(props) {
+ const {
+ style = { // dom节点样式
+ height: '400px',
+ },
+ value = '', // 代码文本
+ onChange = () => { // 改变的事件
+ },
+ fontSize = 14, // 代码字体大小
+ monacoOptions = {
+ scrollBeyondLastLine: false,
+ lineNumbers: "off",
+ wordWrap: true,
+ overviewRulerBorder: true,
+ lineHeight: 24,
+ readOnly:true
+ }, // monaco 自定义属性
+ language = 'html', // 语言 支持 js ts sql css json html等
+ } = props;
+ const editOrRef = useRef();
+ const ThisEditor = useRef();
+ useEffect(() => {
+ ThisEditor.current = monaco.editor.create(editOrRef.current, {
+ value: value || '',
+ language,
+ theme: "vs-grey",
+ fontSize: fontSize + 'px',
+ minimap: { // 关闭代码缩略图
+ enabled: false,
+ },
+ ...monacoOptions,
+ });
+
+ ThisEditor.current.onDidChangeModelContent((e) => {
+ let newValue = ThisEditor.current.getValue();
+ onChange(newValue);
+ });
+ return () => {
+ ThisEditor.current.dispose();
+ ThisEditor.current = undefined; // 清除编辑器对象
+ }
+ }, []);
+ useEffect(() => {
+ if (ThisEditor.current) {
+ ThisEditor.current.updateOptions({
+ fontSize: fontSize + 'px',
+ })
+ }
+ }, [fontSize]);
+
+ return (
+
+
+
+ );
+}
+
+export default Monaco;
\ No newline at end of file
diff --git a/src/forge/Component/NoticeModal/Index.scss b/src/forge/Component/NoticeModal/Index.scss
new file mode 100644
index 00000000..18e4dcda
--- /dev/null
+++ b/src/forge/Component/NoticeModal/Index.scss
@@ -0,0 +1,90 @@
+.systemBox{
+ .ant-modal-body{
+ padding:1px 0px 0px 0px;
+ .sysBox{
+ background-image: url('./bg.png');
+ background-repeat: no-repeat;
+ background-size: 100% 334px;
+ margin-top: -55px;
+ }
+ .sysnoticeBox{
+ width: 100%;
+ padding:80px 0px 34px;
+ display: flex;
+ flex-direction: column;
+ width: 780px;
+ margin: 0px auto;
+ p.ntitle{
+ height: 33px;
+ font-size: 24px;
+ font-weight: 500;
+ color: #31FFF7;
+ line-height: 33px;
+ text-align: center;
+ }
+ p.nSubtitle{
+ height: 25px;
+ line-height: 25px;
+ font-size: 18px;
+ font-weight: 500;
+ color: #FFFFFF;
+ margin-top: 60px;
+ padding-left: 20px;
+ }
+ .markdown-body{
+ box-shadow: 0px 0px 17px rgba(0,0,0,0.2);
+ border-radius: 4px;
+ margin-top: 17px!important;
+ }
+ .nContent{
+ padding:20px 34px;
+ background-color: #fff;
+ line-height: 30px;
+ font-size: 15px;
+ font-weight: 400;
+ color: #333;
+ .realmName{
+ margin-top: 20px;
+ display: flex;
+ ul{
+ width: 50%;
+ padding-left: 0px!important;
+ li{
+ font-size: 15px;
+ font-weight: 500;
+ line-height: 32px;
+ text-align: left;
+ color: #000;
+ list-style-type: none!important;
+ &:first-child{
+ color: #E65714;
+ }
+ }
+ }
+ }
+ .nSubdesc{
+ font-size: 15px;
+ font-weight: 400;
+ color: #000000;
+ line-height: 31px;
+ margin-top: 20px;
+ }
+ .nInfo{
+ font-size: 14px;
+ font-weight: 400;
+ color: #333333;
+ text-align: right;
+ margin-top: 25px;
+ p{
+ height: 20px;
+ line-height: 20px;
+ }
+ }
+ }
+ .nBtn{
+ text-align: center;
+ margin-top: 33px;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/forge/Component/NoticeModal/SystemNotice.jsx b/src/forge/Component/NoticeModal/SystemNotice.jsx
new file mode 100644
index 00000000..1560c1ff
--- /dev/null
+++ b/src/forge/Component/NoticeModal/SystemNotice.jsx
@@ -0,0 +1,76 @@
+import React , { useEffect , useState } from 'react';
+import { Modal , Button } from 'antd';
+import './Index.scss';
+import '../../css/index.scss';
+import RenderHtml from '../../../components/render-html';
+import cookie from 'react-cookies';
+
+function SystemNotice({system_notification,history}){
+ const [ visible , setVisible ] = useState(false);
+
+ useEffect(()=>{
+ if(system_notification && !cookie.load('notice_stage')){
+ setVisible(true);
+ }
+ },[system_notification,history.location])
+
+ function sureContinue() {
+ cookie.remove('notice_stage');
+
+ let inFifteenMinutes = new Date(new Date().getTime() + 24 * 3600 * 1000);//一天
+ // let inFifteenMinutes = new Date(new Date().getTime() + 60 * 1000);//一分钟
+ cookie.save('notice_stage', true,{ expires: inFifteenMinutes,path:"/" });
+
+ setVisible(false);
+ }
+
+ return (
+
+
+
+
{system_notification && system_notification.subject}
+
{system_notification && system_notification.sub_subject}
+ {/*
+
+ 为了给用户提供更加稳定、优质的服务,我们即将对平台门户首页、平台名称、平台域名进行一次全面升级与变更。原平台名称:Trustie(中文名:确实)将于2021年10月xx日统一更改为Gitlink(中文名:确实开源)。届时平台域名将统一进行更换,更换规则如下
+
+
+
+ - 原域名:
+ - 官网顶级域名https://www.trustie.net
+ - 版本库子域名https://forgeplus.trustie.net
+ - 论坛子域名https://forum.trustie.net/forums
+
+
+ - 更换后域名:
+ - 官网顶级域名https://www.gitlink.org.cn
+ - 版本库子域名https://www.git.gitlink.org.cn
+ - 论坛子域名https://forum.gitlink.org.cn
+
+
+
+ 自2021年10月xx日起,旧域名将停止访问。因平台名称与域名变更给您带来的不便,我们深表歉意!非常感谢您一直以来对本平台的信任与支持,我们将一如既往地为您提供优质的服务。 特此通知!
+
+
+
Gitlink运营团队
+
2021年10月xx日
+
+
*/}
+
+
+
+
+
+
+
+ )
+}
+export default SystemNotice;
\ No newline at end of file
diff --git a/src/forge/Component/NoticeModal/bg.png b/src/forge/Component/NoticeModal/bg.png
new file mode 100644
index 00000000..625b3c31
Binary files /dev/null and b/src/forge/Component/NoticeModal/bg.png differ
diff --git a/src/forge/Component/ProfileModal/Index.jsx b/src/forge/Component/ProfileModal/Index.jsx
new file mode 100644
index 00000000..7cead761
--- /dev/null
+++ b/src/forge/Component/ProfileModal/Index.jsx
@@ -0,0 +1,72 @@
+import React , { useEffect , useState } from 'react';
+import Modals from '../PublicModal/Index';
+import { Button } from 'antd';
+import axios from 'axios';
+
+import ProfileImg from './images/profile.png';
+import './Index.scss';
+
+function ProfileModal({visible,onCancel,history}) {
+ const [ modalVis , setModalVis ] = useState(visible);
+ const [ addMemberCheck , setAddMemberCheck ] = useState(false);
+
+ useEffect(()=>{
+ axios.interceptors.response.use((response) => {
+ if (response && (response.data.status === 411 || response.data.status === 412)) {
+ setModalVis(true);
+ if(response.data.status === 412){
+ setAddMemberCheck(true);
+ }
+ }
+ return response;
+ }, (error) => {
+ });
+ },[])
+
+ useEffect(()=>{
+ setModalVis(visible);
+ },[visible])
+
+ function onOk(){
+ onCancel();
+ setModalVis(false);
+ setTimeout(function(){
+ window.open(`/settings/profile`,"_blank");
+ },200)
+ }
+
+ function onNo() {
+ onCancel();
+ setModalVis(false);
+ }
+
+ return(
+
+
+
+ :
+
+
+
+
+ }
+ >
+
+

+ {
+ addMemberCheck ?
+
目标用户个人资料不完整,需提醒目标用户补充资料后以进行后续操作
+ :
+
您目前的个人资料不完整,需要补充资料以进行后续操作。是否前往补充个人信息?
+ }
+
+
+ )
+}
+export default ProfileModal;
\ No newline at end of file
diff --git a/src/forge/Component/ProfileModal/Index.scss b/src/forge/Component/ProfileModal/Index.scss
new file mode 100644
index 00000000..cf13121e
--- /dev/null
+++ b/src/forge/Component/ProfileModal/Index.scss
@@ -0,0 +1,18 @@
+.contents{
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin:10px auto 0px;
+ img{
+ margin-right: 13px;
+ width: 44px;
+ }
+ p{
+ line-height: 29px;
+ max-width: 327px;
+ font-size: 16px!important;
+ }
+}
+.font-44{
+ font-size: 44px!important;
+}
\ No newline at end of file
diff --git a/src/forge/Component/ProfileModal/Profile.jsx b/src/forge/Component/ProfileModal/Profile.jsx
new file mode 100644
index 00000000..e63c1286
--- /dev/null
+++ b/src/forge/Component/ProfileModal/Profile.jsx
@@ -0,0 +1,17 @@
+import React from 'react';
+
+function Profile({children,sureFunc,showCompeleteDialog , completeProfile, className}) {
+
+ function checkProfile() {
+ if(!completeProfile){
+ showCompeleteDialog && showCompeleteDialog();
+ }else{
+ sureFunc();
+ }
+ }
+
+ return(
+
{children}
+ )
+}
+export default Profile;
\ No newline at end of file
diff --git a/src/forge/Component/ProfileModal/images/profile.png b/src/forge/Component/ProfileModal/images/profile.png
new file mode 100644
index 00000000..6dbed21f
Binary files /dev/null and b/src/forge/Component/ProfileModal/images/profile.png differ
diff --git a/src/forge/Component/PublicModal/Index.jsx b/src/forge/Component/PublicModal/Index.jsx
new file mode 100644
index 00000000..c12e12b1
--- /dev/null
+++ b/src/forge/Component/PublicModal/Index.jsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import { Modal } from 'antd';
+import './Index.scss';
+
+function Modals({title,children,btn,onCancel,visible}) {
+ return(
+
+ {children}
+
+ )
+}
+export default Modals;
\ No newline at end of file
diff --git a/src/forge/Component/PublicModal/Index.scss b/src/forge/Component/PublicModal/Index.scss
new file mode 100644
index 00000000..1a0fbf31
--- /dev/null
+++ b/src/forge/Component/PublicModal/Index.scss
@@ -0,0 +1,75 @@
+.deleteBox{
+ z-index: 1033;
+ .ant-modal-close-x{
+ font-size: 17px!important;
+ }
+ .ant-modal-header{
+ background-color: #f8f8f8;
+ padding:10px 30px;
+ .ant-modal-title{
+ text-align: left;
+ font-size: 16px;
+ font-weight: bold;
+ }
+ }
+ .ant-modal-close{
+ top:0px !important;
+ font-size: 24px !important;
+ }
+ .ant-modal-body{
+ padding:30px 50px;
+ p{
+ font-size: 14px;
+ line-height: 26px;
+ color:#666;
+ word-break: break-all;
+ }
+ .desc{
+ .descMain{
+ align-items: center;
+ justify-content: center;
+ font-size: 20px;
+ margin-bottom: 10px;
+ i.red{
+ color:#DF0002;
+ }
+ }
+ }
+ }
+ .ant-modal-footer{
+ border-top: none;
+ text-align: center;
+ padding-bottom: 40px;
+ button,a{
+ width: 96px;
+ height: 32px;
+ margin:0px 20px;
+ font-weight: 400;
+ font-size: 14px;
+ &.ant-btn{
+ border-color: #D0D0D0;
+ color: #666;
+ &:hover,&:active,&:focus{
+ background: #f3f4f6;
+ }
+ }
+ &.ant-btn-danger{
+ background-color: #fff;
+ color: #DF0002;
+ border-color: #D0D0D0;
+ &:hover,&:active,&:focus{
+ border-color: #DF0002;
+ background-color: #fff;
+ }
+ }
+ &.ant-btn.ant-btn-primary{
+ background-color: #466AFF;
+ color: #fff;
+ border-color: #466AFF;
+ &:hover,&:focus,&:active{
+ background-color: rgba(70,106,255,0.85);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/forge/Component/Releases.jsx b/src/forge/Component/Releases.jsx
index 501c6b63..260e6bd2 100644
--- a/src/forge/Component/Releases.jsx
+++ b/src/forge/Component/Releases.jsx
@@ -1,38 +1,35 @@
import React from 'react';
-import { AlignCenter , AlignTop , FlexAJ } from '../Component/layout';
+import { AlignTop } from '../Component/layout';
import { Link } from 'react-router-dom';
-function Releases({owner,projectsId,releaseVersions}){
-
+function Releases({ owner, projectsId, releaseVersions, distribution }) {
return(
-
- 发行版
- { releaseVersions && releaseVersions.total_count > 0 && {releaseVersions.total_count}}
-
- { releaseVersions && releaseVersions.total_count > 0 ?
- 全部
- :
- 新建
- }
-
+
+
发行版
+ { releaseVersions && releaseVersions.total_count > 0 &&
{releaseVersions.total_count}}
+
{
releaseVersions && releaseVersions.total_count>0 ?
releaseVersions.list.map((item,key)=>{
return(
key === 0 &&
-
-
- {item.name}
+
+ {/* 如果是点击最新则发行版列表页只展示最新的一个 */}
+ {item.name}
最新
-
{item.created_at}
+
{item.created_at}
)
})
- :""
+ :
+
+ 您暂未发布任何版本
+ {distribution && 创建新版本}
+
}
diff --git a/src/forge/Component/SearchUser.jsx b/src/forge/Component/SearchUser.jsx
index 0203d24f..79d23fb6 100644
--- a/src/forge/Component/SearchUser.jsx
+++ b/src/forge/Component/SearchUser.jsx
@@ -1,45 +1,49 @@
-import React , { useState } from 'react';
+import React , { useState , useEffect } from 'react';
import { AutoComplete } from 'antd';
import { getImageUrl } from "educoder";
import axios from 'axios';
const Option = AutoComplete.Option;
-export default ({ getUser })=>{
+export default ({ getUser , placeholder, width ,value })=>{
+ const [ source , setSource ] = useState(undefined);
const [ searchKey , setSearchKey ] = useState(undefined);
- const [ userDataSource , setUserDataSource ] = useState(undefined);
+
+ useEffect(()=>{
+ if(!value){
+ setSearchKey(undefined);
+ }
+ },[value])
+
+ useEffect(()=>{
+ getUserList();
+ },[searchKey])
function getUserList(e){
const url = `/users/list.json`;
axios.get(url, {
params: {
- search: e,
+ search: searchKey,
},
- })
- .then((result) => {
+ }).then((result) => {
if (result) {
- setUserDataSource(result.data.users);
+ sourceOptions(result.data.users);
}
})
.catch((error) => {
console.log(error);
});
};
-
- function changeInputUser(value){
- setSearchKey(value);
- getUserList(value);
- }
- function selectInputUser(id, option){
- setSearchKey(option.props.value);
- getUserList(option.props.value);
- getUser && getUser(id);
- }
- const source =
- userDataSource && userDataSource.map((item, key) => {
+ function sourceOptions(userDataSource){
+ const s = userDataSource && userDataSource.map((item, key) => {
return (
-
);
});
+ setSource(s);
+ }
+
+ function changeInputUser(e){
+ setSearchKey(e);
+ };
+
+ // 选择用户
+ function selectInputUser(e, option){
+ setSearchKey(option.props.name);
+ getUser(option.props.login);
+ };
+
return(
-
+
+
trigger.parentNode}
+ dataSource={source}
+ value={searchKey}
+ style={{ width: width || 300 }}
+ onChange={changeInputUser}
+ onSelect={selectInputUser}
+ placeholder={placeholder || "搜索需要添加的用户..."}
+ allowClear
+ />
+
)
}
\ No newline at end of file
diff --git a/src/forge/Component/SiderBar.js b/src/forge/Component/SiderBar.js
new file mode 100644
index 00000000..3d6b8acf
--- /dev/null
+++ b/src/forge/Component/SiderBar.js
@@ -0,0 +1,91 @@
+import React, { useEffect, useState } from 'react';
+import { Popover , Tooltip } from 'antd';
+import './Component.scss';
+import axios from 'axios';
+import ShareModal from './SiderBarShareModal';
+
+const $ = window.$;
+
+$(window).scroll(function () {
+ if ($(".gotop").length > 0) {
+ if ($(document).scrollTop() > 0) {
+ $(".-task-sidebar .gotop").show();
+ $(".gotop").click(function () {
+ $("html,body").scrollTop(0);
+ });
+ }
+ if ($(document).scrollTop() === 0) {
+ $(".-task-sidebar .gotop").hide();
+ }
+ }
+});
+
+function SiderBar() {
+ const [ data , setData ] = useState([]);
+ const [ visible , setVisible ] = useState(false);
+
+ useEffect(()=>{
+ getFAQ();
+ },[])
+
+ function getFAQ(){
+ const url = `/faqs.json`;
+ axios.get(url).then(result=>{
+ if(result && result.data){
+ setData(result.data);
+ }
+ }).catch(error=>{})
+ }
+ function content(list){
+ return
+
帮助
+
+ {
+ list && list.map((i,k)=>{
+ return(
+ - {i.question}
+ )
+ })
+ }
+
+
+ }
+
+ function shareContent(){
+ return
+
+ 分享到
+ - setVisible(true)}>
+
+
+ }
+ return (
+
+
setVisible(false)}/>
+ {
+ data && data.length > 0 && (data[0] && data[0].question) ?
+
+
+
+
+
+ :""
+ }
+ {/*
+
+
*/}
+
+
+
+
+
+
+
+ )
+}
+
+export default SiderBar;
diff --git a/src/forge/Component/SiderBarShareModal.jsx b/src/forge/Component/SiderBarShareModal.jsx
new file mode 100644
index 00000000..aa8db379
--- /dev/null
+++ b/src/forge/Component/SiderBarShareModal.jsx
@@ -0,0 +1,27 @@
+import React from 'react';
+import { Modal } from 'antd';
+import QRCode from 'qrcode.react';
+
+function SiderBarShareModal({visible,urlValue,onCancel}) {
+ return(
+
+
+ {urlValue &&
}
+
打开微信“扫一扫”,点击右上角菜单,即可将网页分享至朋友圈
+
+
+ )
+}
+export default SiderBarShareModal;
\ No newline at end of file
diff --git a/src/forge/Component/Sort.jsx b/src/forge/Component/Sort.jsx
index 58f8a5d2..a15f04da 100644
--- a/src/forge/Component/Sort.jsx
+++ b/src/forge/Component/Sort.jsx
@@ -2,9 +2,9 @@ import React from 'react';
import {Popover} from 'antd';
import './Component.scss';
-export default (({menu , children})=>{
+export default (({menu , children, overlayClassName})=>{
return(
-
+
{children}
)
diff --git a/src/forge/Component/User.jsx b/src/forge/Component/User.jsx
index 8701e607..0d970173 100644
--- a/src/forge/Component/User.jsx
+++ b/src/forge/Component/User.jsx
@@ -1,10 +1,11 @@
import React from 'react';
import styled from 'styled-components';
+import { Link } from 'react-router-dom';
-
-export default ({ url , name , column })=>{
+export default ({ url , name , column , id , login })=>{
const Img = styled.span`
display:flex;
+ font-weight: bold;
${column && "flex-direction: column;text-align:center;"}
align-items: center;
& img{
@@ -19,6 +20,14 @@ export default ({ url , name , column })=>{
}
`;
return(
+ id?
+
+
+ { url &&
}
+ {name}
+
+
+ :
{ url &&
}
{name}
diff --git a/src/forge/DevOps/About.jsx b/src/forge/DevOps/About.jsx
index b9b10dad..31ced220 100644
--- a/src/forge/DevOps/About.jsx
+++ b/src/forge/DevOps/About.jsx
@@ -36,8 +36,7 @@ function About(props, ref) {
const [ disabled, setDisabled ] = useState(false);
const [ typeFlag, setTypeFlag] = useState(false);
-
- const AuthorLogin = props.author && props.author.login;
+ const AuthorLogin = props.projectDetail && props.projectDetail.author && props.projectDetail.author.login;
const CurrentLogin = props.current_user && props.current_user.login;
useEffect(()=>{
if(CurrentLogin === AuthorLogin){
@@ -56,11 +55,6 @@ function About(props, ref) {
setIsSpining(false);
if(result && result.data ){
setStep(result.data.step);
- // setStep(0);
- // setFieldsValue({...result.data.cloud_account});
- // if(result.data.cloud_account){
- // setDisabled(true);
- // }
}
}).catch(error=>{
setIsSpining(false);
@@ -155,7 +149,7 @@ function About(props, ref) {
axios.post(url).then(result=>{
setIsSpining(false);
if(result && result.data.status === 0){
- props.history.push(`/projects/${owner}/${projectsId}/devops/dispose`);
+ props.history.push(`/${owner}/${projectsId}/devops`);
// 需要将顶部的open_devops修改
let { changeOpenDevops } = props;
changeOpenDevops && changeOpenDevops(true);
diff --git a/src/forge/DevOps/Dispose.jsx b/src/forge/DevOps/Dispose.jsx
index 2211dbb5..1e08cdab 100644
--- a/src/forge/DevOps/Dispose.jsx
+++ b/src/forge/DevOps/Dispose.jsx
@@ -96,7 +96,7 @@ function Dispose(props){
setVisible(false);
if(result && result.data){
props.showNotification("流水线新增成功,请进行工作流配置!");
- props.history.push(`/projects/${owner}/${projectsId}/devops/dispose/${result.data.id}`);
+ props.history.push(`/${owner}/${projectsId}/devops/${result.data.id}`);
}else{
props.showNotification("流水线新增失败,请稍后再试!");
}
@@ -134,12 +134,12 @@ function Dispose(props){
// 模板管理
function toModalManage(){
- props.history.push(`/projects/${owner}/${projectsId}/devops/mould`);
+ props.history.push(`/${owner}/${projectsId}/devops/mould`);
}
// 参数管理
function toparameter(){
- props.history.push(`/projects/${owner}/${projectsId}/devops/params`);
+ props.history.push(`/${owner}/${projectsId}/devops/params`);
}
const operate = current_user && (permission && permission !== "Reporter");
diff --git a/src/forge/DevOps/Dispose/List.jsx b/src/forge/DevOps/Dispose/List.jsx
index 72a26785..297c5556 100644
--- a/src/forge/DevOps/Dispose/List.jsx
+++ b/src/forge/DevOps/Dispose/List.jsx
@@ -10,6 +10,12 @@ import { Link } from 'react-router-dom';
// killed:"已撤销",
// pending:"准备中"
// }
+function turnbar(str){
+ if(str && str.length>0 && str.indexOf("/")>-1){
+ return str.replaceAll('/','%2F');
+ }
+ return str;
+}
function renderTableStatus(status) {
switch (status) {
case "running":
@@ -65,8 +71,9 @@ function List({ list, operate , projectsId , owner , showModal , deleteFunc }){
width:"15%",
ellipsis:true,
render:(value,item)=>{
+ let v = turnbar(item.branch);
return(
- {value}
+ {value}
)
}
},
@@ -110,7 +117,7 @@ function List({ list, operate , projectsId , owner , showModal , deleteFunc }){
return(
{ operate ?
-
+
编辑 :""
}
{ operate ?
@@ -118,7 +125,7 @@ function List({ list, operate , projectsId , owner , showModal , deleteFunc }){
删除
:""
}
- 查看运行记录
+ 查看运行记录
)
}
diff --git a/src/forge/DevOps/Dispose/PipelineName.jsx b/src/forge/DevOps/Dispose/PipelineName.jsx
index 3cf7f96a..63ee5437 100644
--- a/src/forge/DevOps/Dispose/PipelineName.jsx
+++ b/src/forge/DevOps/Dispose/PipelineName.jsx
@@ -42,7 +42,7 @@ function PipelineName({visible,onCancel,onOk,value ,branchList}){
触发条件:
-