Compare commits

..

50 Commits

Author SHA1 Message Date
caishi 00402ef13d Merge branch 'master' of https://git.trustie.net/jasder/forgeplus-react
# Conflicts:
#	src/forge/Main/sub/UpdateDescModal.jsx
2021-08-09 10:37:23 +08:00
caishi 8f2df90555 代码style 2021-08-09 10:36:15 +08:00
caishi 7530d3f9c4 Merge branch 'develop' 2021-08-06 17:07:54 +08:00
hc1913847458 b7869e5203 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus-react 2021-08-05 10:48:43 +08:00
hc1913847458 b238bb51ca 限制字符 2021-08-05 10:47:22 +08:00
hc1913847458 ad7ab189b1 限制字符 2021-08-04 14:42:08 +08:00
caishi c9802c26a4 Merge branch 'develop' 2021-08-02 10:35:49 +08:00
caishi 4ec840f252 Merge branch 'develop' 2021-07-30 20:13:49 +08:00
caishi 44a8f806e0 Merge branch 'develop' 2021-07-30 17:44:17 +08:00
caishi 9408ad7dcb Merge branch 'develop' 2021-07-30 17:03:19 +08:00
caishi 810ea37bed Merge branch 'develop' 2021-07-26 09:38:44 +08:00
caishi 6679fe8a48 Merge branch 'develop' 2021-07-22 17:44:30 +08:00
caishi d31b932efe Merge branch 'develop' 2021-07-21 10:10:53 +08:00
caishi 07852b204c Merge branch 'develop' 2021-07-05 20:35:59 +08:00
caishi 934ac61b77 Merge branch 'develop' 2021-07-02 18:19:02 +08:00
caishi 95091d0e08 Merge branch 'develop' 2021-07-02 15:37:43 +08:00
caishi e31ff9bdf3 Merge branch 'develop' 2021-07-01 17:00:43 +08:00
caishi eba6ed0876 搜索的接口改用正式版对应的服务器地址 2021-06-28 10:44:42 +08:00
caishi db682ace86 Merge branch 'develop' 2021-06-25 18:34:19 +08:00
caishi 777dbd0f43 Merge branch 'develop' 2021-06-25 18:21:48 +08:00
caishi b44b6530e5 Merge branch 'develop' 2021-06-25 09:14:50 +08:00
caishi b808bcee99 Merge branch 'develop' 2021-06-18 16:56:18 +08:00
caishi c0f7c489fb Merge branch 'develop' 2021-06-11 18:11:43 +08:00
caishi bc64cbb415 Merge branch 'develop' 2021-06-08 14:56:20 +08:00
caishi fa169b27cd Merge branch 'develop' 2021-05-26 16:48:35 +08:00
caishi 3e0814344f Merge branch 'develop' 2021-05-25 11:25:04 +08:00
caishi eb58f91dbf Merge branch 'develop' 2021-05-21 19:21:32 +08:00
caishi 513255428c Merge branch 'develop'
# Conflicts:
#	package-lock.json
2021-05-14 17:04:57 +08:00
caishi 8baf2cb49c install babel-polyfill 2021-05-08 17:28:14 +08:00
caishi 705bfb07bd Merge branch 'develop' 2021-05-08 16:53:26 +08:00
caishi d783d998fc 编辑合并请求-url地址错误 2021-05-08 14:36:12 +08:00
caishi 51925542b8 Merge branch 'develop'
# Conflicts:
#	public/css/edu-purge.css
2021-05-07 16:37:21 +08:00
caishi ff06efe109 merge develop 2021-05-06 17:15:43 +08:00
caishi c33561c212 新建项目-maxlength 2021-05-06 17:14:42 +08:00
caishi 2deb6f8f9d 设置所有标签的marginbottom为0 2021-05-06 17:14:30 +08:00
caishi 63d69a955e 代码库-提交描述未换行 2021-05-06 17:14:19 +08:00
caishi 4d652d238d 不能修改组织账号 2021-04-27 17:25:00 +08:00
caishi 6da4dbc165 组织团队-无数据显示错误 2021-04-27 09:45:14 +08:00
caishi f65f4c273a 组织基本设置-正则和新建的页面不一致 2021-04-26 16:32:12 +08:00
caishi 1af504825c 代码库编辑文件-切换到其它目录后要重新将编辑状态改为显示状态 2021-04-25 18:00:05 +08:00
caishi e94cf68cc5 样式覆盖 2021-04-23 18:04:49 +08:00
caishi 5fa2fd99b9 Merge branch 'develop' 2021-04-23 14:51:04 +08:00
caishi 20ab8a6683 Merge branch 'develop' 2021-04-23 14:47:50 +08:00
caishi a7f709a663 Merge branch 'develop' 2021-04-23 14:16:30 +08:00
caishi 63c2cfed70 Merge branch 'develop' 2021-04-22 10:58:30 +08:00
caishi 80cd6fbae0 md文件要用Markdown渲染 2021-04-20 15:33:21 +08:00
caishi 49d3db6746 合并请求-提出申请者头像显示问题 2021-04-20 11:18:44 +08:00
caishi bc11ec68e3 注释 2021-04-20 10:57:46 +08:00
caishi 2d2deec224 Merge branch 'develop' 2021-04-20 10:56:50 +08:00
caishi 8c58f77afb 去掉右侧悬浮手册按钮 2021-04-09 14:18:44 +08:00
223 changed files with 3263 additions and 5895 deletions

1190
.idea/workspace.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -19,8 +19,7 @@ const getClientEnvironment = require("./env");
let publicPath = "/react/build/"; let publicPath = "/react/build/";
const publicUrl = publicPath.slice(0, -1); 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); const env = getClientEnvironment(publicPath);
// This is the production configuration. // This is the production configuration.
@ -55,8 +54,7 @@ module.exports = {
}, },
bail: true, bail: true,
mode: "production", mode: "production",
// devtool: false, //测试版 devtool: false, //测试版
devtool: shouldUseSourceMap?'source-map':false,
entry: [require.resolve("./polyfills"), paths.appIndexJs], entry: [require.resolve("./polyfills"), paths.appIndexJs],
output: { output: {
path: paths.appBuild, path: paths.appBuild,

40
package-lock.json generated
View File

@ -1273,7 +1273,7 @@
}, },
"babel-cli": { "babel-cli": {
"version": "6.26.0", "version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", "resolved": "https://registry.npm.taobao.org/babel-cli/download/babel-cli-6.26.0.tgz",
"integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -1296,7 +1296,7 @@
"dependencies": { "dependencies": {
"chokidar": { "chokidar": {
"version": "1.7.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "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",
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"dev": true, "dev": true,
"optional": true, "optional": true,
@ -1314,7 +1314,7 @@
}, },
"source-map": { "source-map": {
"version": "0.5.7", "version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true "dev": true
} }
@ -1413,7 +1413,7 @@
}, },
"babel-helper-bindify-decorators": { "babel-helper-bindify-decorators": {
"version": "6.24.1", "version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", "resolved": "https://registry.npm.taobao.org/babel-helper-bindify-decorators/download/babel-helper-bindify-decorators-6.24.1.tgz",
"integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -1476,7 +1476,7 @@
}, },
"babel-helper-explode-class": { "babel-helper-explode-class": {
"version": "6.24.1", "version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", "resolved": "https://registry.npm.taobao.org/babel-helper-explode-class/download/babel-helper-explode-class-6.24.1.tgz",
"integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -1676,7 +1676,7 @@
}, },
"babel-plugin-syntax-async-generators": { "babel-plugin-syntax-async-generators": {
"version": "6.13.0", "version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-async-generators/download/babel-plugin-syntax-async-generators-6.13.0.tgz",
"integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
"dev": true "dev": true
}, },
@ -1687,7 +1687,7 @@
}, },
"babel-plugin-syntax-decorators": { "babel-plugin-syntax-decorators": {
"version": "6.13.0", "version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-decorators/download/babel-plugin-syntax-decorators-6.13.0.tgz",
"integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
"dev": true "dev": true
}, },
@ -1723,7 +1723,7 @@
}, },
"babel-plugin-transform-async-generator-functions": { "babel-plugin-transform-async-generator-functions": {
"version": "6.24.1", "version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-async-generator-functions/download/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
"integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -1755,7 +1755,7 @@
}, },
"babel-plugin-transform-decorators": { "babel-plugin-transform-decorators": {
"version": "6.24.1", "version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-decorators/download/babel-plugin-transform-decorators-6.24.1.tgz",
"integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -2060,7 +2060,7 @@
}, },
"babel-plugin-transform-runtime": { "babel-plugin-transform-runtime": {
"version": "6.23.0", "version": "6.23.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-runtime/download/babel-plugin-transform-runtime-6.23.0.tgz",
"integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=",
"requires": { "requires": {
"babel-runtime": "^6.22.0" "babel-runtime": "^6.22.0"
@ -2077,7 +2077,7 @@
}, },
"babel-polyfill": { "babel-polyfill": {
"version": "6.26.0", "version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "resolved": "https://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz",
"integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
"requires": { "requires": {
"babel-runtime": "^6.26.0", "babel-runtime": "^6.26.0",
@ -2087,7 +2087,7 @@
"dependencies": { "dependencies": {
"regenerator-runtime": { "regenerator-runtime": {
"version": "0.10.5", "version": "0.10.5",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", "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=" "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
} }
} }
@ -2131,7 +2131,7 @@
}, },
"babel-preset-es2015": { "babel-preset-es2015": {
"version": "6.24.1", "version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", "resolved": "https://registry.npm.taobao.org/babel-preset-es2015/download/babel-preset-es2015-6.24.1.tgz",
"integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -2179,7 +2179,7 @@
}, },
"babel-preset-react": { "babel-preset-react": {
"version": "6.24.1", "version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "resolved": "https://registry.npm.taobao.org/babel-preset-react/download/babel-preset-react-6.24.1.tgz",
"integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
"requires": { "requires": {
"babel-plugin-syntax-jsx": "^6.3.13", "babel-plugin-syntax-jsx": "^6.3.13",
@ -2212,7 +2212,7 @@
}, },
"babel-preset-stage-2": { "babel-preset-stage-2": {
"version": "6.24.1", "version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", "resolved": "https://registry.npm.taobao.org/babel-preset-stage-2/download/babel-preset-stage-2-6.24.1.tgz",
"integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -2224,7 +2224,7 @@
}, },
"babel-preset-stage-3": { "babel-preset-stage-3": {
"version": "6.24.1", "version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", "resolved": "https://registry.npm.taobao.org/babel-preset-stage-3/download/babel-preset-stage-3-6.24.1.tgz",
"integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -3507,7 +3507,7 @@
}, },
"code-prettify": { "code-prettify": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/code-prettify/-/code-prettify-0.1.0.tgz", "resolved": "https://registry.npm.taobao.org/code-prettify/download/code-prettify-0.1.0.tgz",
"integrity": "sha1-RocMyMGlDQm61TmzOpg9vUqjSx4=" "integrity": "sha1-RocMyMGlDQm61TmzOpg9vUqjSx4="
}, },
"codemirror": { "codemirror": {
@ -11673,7 +11673,7 @@
}, },
"output-file-sync": { "output-file-sync": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", "resolved": "https://registry.npm.taobao.org/output-file-sync/download/output-file-sync-1.1.2.tgz",
"integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -19100,7 +19100,7 @@
}, },
"user-home": { "user-home": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", "resolved": "https://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz",
"integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
"dev": true "dev": true
}, },
@ -19157,7 +19157,7 @@
}, },
"v8flags": { "v8flags": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", "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",
"integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
"dev": true, "dev": true,
"requires": { "requires": {

View File

@ -114,6 +114,14 @@ a:visited {
color: #898989; color: #898989;
} }
a:hover {
color: #FF7500;
}
a:hover.fa {
color: #FF7500;
}
input, input,
textarea, textarea,
select { select {

View File

@ -97,6 +97,10 @@ a:visited {
color: #05101a; color: #05101a;
} }
a:hover {
color: #459be5;
}
ol, ol,
ul, ul,
li { li {

View File

@ -1,4 +1,3 @@
@charset "utf-8";
/* 头部 */ /* 头部 */
.header { .header {
width: 100%; width: 100%;
@ -1272,7 +1271,7 @@ html body {
font-size: 14px; font-size: 14px;
line-height: 2.0; line-height: 2.0;
background: #fafafa; background: #fafafa;
font-family: "Microsoft YaHei", "SimSun"; font-family: "微软雅黑", "宋体";
color: #05101a; color: #05101a;
height: 100%; height: 100%;
position: relative; position: relative;
@ -1308,7 +1307,6 @@ td,
span { span {
margin: 0; margin: 0;
padding: 0; padding: 0;
margin-bottom: 0px!important;
} }
table, table,
@ -1365,6 +1363,10 @@ a:visited {
color: #05101a; color: #05101a;
} }
a:hover {
color: #459be5;
}
ol, ol,
ul, ul,
li { li {
@ -1471,7 +1473,7 @@ a.edu-txt-w80,
/*隐藏*/ /*隐藏*/
.none { .none {
display: none!important; display: none
} }
.block { .block {
@ -2434,11 +2436,7 @@ a.hoverLine:hover{
.color-grey-9 { .color-grey-9 {
color: #333333 !important; color: #999999 !important;
}
a:hover{
color: #466AFF !important;
} }
.color-grey-98 { .color-grey-98 {
@ -2460,7 +2458,7 @@ a:hover{
.color-grey-B3 { .color-grey-B3 {
color: #B3B3B3 !important; color: #B3B3B3 !important;
} }
`
.color-grey-B4 { .color-grey-B4 {
color: #B4B4B4 !important; color: #B4B4B4 !important;
} }
@ -2473,23 +2471,33 @@ a:hover{
a.color-grey-name:hover, a.color-grey-name:hover,
a.color-dark:hover, a.color-dark:hover,
a.color-grey-6:hover, a.color-grey-6:hover,
a.color-grey-3:hover,a.color-ooo:hover { a.color-grey-3:hover {
color: #2A61FF !important; color: #4cacff !important;
}
a.color-grey-9:hover,
a.color-grey-8:hover,
a.color-grey-c:hover {
color: #111C24 !important;
} }
/*蓝色*/ /*蓝色*/
.color-blue { .color-blue {
color: #2A61FF !important; color: #4CACFF !important;
}
.color-blue-file {
color: #4598FA!important;
} }
/* 绿色 */ /* 绿色 */
.color-green-file{
color: #28BD6C;
}
/*主*/ /*主*/
.color-blue_4C { .color-blue_4C {
color: #4CACFF !important; color: #4CACFF !important;
} }
a.color-blue:hover,
a.color-blue_4C:hover {
color: #459BE6 !important;
}
/*橙色*/ /*橙色*/
.color-orange { .color-orange {

View File

@ -1,8 +1,8 @@
@font-face { @font-face {
font-family: "iconfont"; /* Project id 2340181 */ font-family: "iconfont"; /* Project id 2340181 */
src: url('iconfont.woff2?t=1630632852475') format('woff2'), src: url('iconfont.woff2?t=1627870211301') format('woff2'),
url('iconfont.woff?t=1630632852475') format('woff'), url('iconfont.woff?t=1627870211301') format('woff'),
url('iconfont.ttf?t=1630632852475') format('truetype'); url('iconfont.ttf?t=1627870211301') format('truetype');
} }
.iconfont { .iconfont {
@ -13,246 +13,6 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.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 { .icon-qingqiuicon:before {
content: "\e871"; content: "\e871";
} }
@ -289,10 +49,22 @@
content: "\e898"; content: "\e898";
} }
.icon-xialaanniu_icon:before {
content: "\e89a";
}
.icon-weixuanzhongqingqiuicon:before {
content: "\e89b";
}
.icon-xiezuozheguanliicon:before { .icon-xiezuozheguanliicon:before {
content: "\e8a1"; content: "\e8a1";
} }
.icon-xuanzhongxiangyingicon:before {
content: "\e8a2";
}
.icon-xuanzhongfenzhiicon:before { .icon-xuanzhongfenzhiicon:before {
content: "\e8a3"; content: "\e8a3";
} }
@ -309,6 +81,18 @@
content: "\e8af"; content: "\e8af";
} }
.icon-xinzengmulu_xuantingicon:before {
content: "\e884";
}
.icon-xinzengyemian_morenicon:before {
content: "\e885";
}
.icon-zhankai_morenicon:before {
content: "\e889";
}
.icon-shanchu_tc_icon:before { .icon-shanchu_tc_icon:before {
content: "\e88c"; content: "\e88c";
} }
@ -317,14 +101,26 @@
content: "\e88d"; content: "\e88d";
} }
.icon-xinzengyemian_shubiaodianjiicon:before {
content: "\e88e";
}
.icon-daorumoban_icon:before { .icon-daorumoban_icon:before {
content: "\e86f"; content: "\e86f";
} }
.icon-daochu_xuanfu:before {
content: "\e870";
}
.icon-cuowu:before { .icon-cuowu:before {
content: "\e872"; content: "\e872";
} }
.icon-chenggong1:before {
content: "\e873";
}
.icon-gengduo_icon:before { .icon-gengduo_icon:before {
content: "\e874"; content: "\e874";
} }
@ -333,10 +129,26 @@
content: "\e875"; content: "\e875";
} }
.icon-fuzhi_icon:before {
content: "\e876";
}
.icon-shanchuicon:before { .icon-shanchuicon:before {
content: "\e877"; content: "\e877";
} }
.icon-a-lajitong_icon3x:before {
content: "\e878";
}
.icon-shouqi_morenicon:before {
content: "\e879";
}
.icon-huanying_icon:before {
content: "\e87a";
}
.icon-sousuo_shanchuicon:before { .icon-sousuo_shanchuicon:before {
content: "\e87b"; content: "\e87b";
} }
@ -349,10 +161,22 @@
content: "\e87e"; content: "\e87e";
} }
.icon-wenjianjia_icon:before {
content: "\e87f";
}
.icon-xialaanniu:before { .icon-xialaanniu:before {
content: "\e880"; content: "\e880";
} }
.icon-xinzengmulu_morenicon:before {
content: "\e882";
}
.icon-xinzengmulu_shubiaodianjiicon:before {
content: "\e883";
}
.icon-erciqueren_icon:before { .icon-erciqueren_icon:before {
content: "\e867"; content: "\e867";
} }

File diff suppressed because one or more lines are too long

View File

@ -5,426 +5,6 @@
"css_prefix_text": "icon-", "css_prefix_text": "icon-",
"description": "", "description": "",
"glyphs": [ "glyphs": [
{
"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", "icon_id": "23261798",
"name": "请求icon", "name": "请求icon",
@ -488,6 +68,20 @@
"unicode": "e898", "unicode": "e898",
"unicode_decimal": 59544 "unicode_decimal": 59544
}, },
{
"icon_id": "23144154",
"name": "下拉按钮_icon",
"font_class": "xialaanniu_icon",
"unicode": "e89a",
"unicode_decimal": 59546
},
{
"icon_id": "23144155",
"name": "未选中请求icon",
"font_class": "weixuanzhongqingqiuicon",
"unicode": "e89b",
"unicode_decimal": 59547
},
{ {
"icon_id": "23144158", "icon_id": "23144158",
"name": "协作者管理icon", "name": "协作者管理icon",
@ -495,6 +89,13 @@
"unicode": "e8a1", "unicode": "e8a1",
"unicode_decimal": 59553 "unicode_decimal": 59553
}, },
{
"icon_id": "23144159",
"name": "选中响应icon",
"font_class": "xuanzhongxiangyingicon",
"unicode": "e8a2",
"unicode_decimal": 59554
},
{ {
"icon_id": "23144160", "icon_id": "23144160",
"name": "选中分支icon", "name": "选中分支icon",
@ -523,6 +124,27 @@
"unicode": "e8af", "unicode": "e8af",
"unicode_decimal": 59567 "unicode_decimal": 59567
}, },
{
"icon_id": "23046282",
"name": "新增目录_悬停icon",
"font_class": "xinzengmulu_xuantingicon",
"unicode": "e884",
"unicode_decimal": 59524
},
{
"icon_id": "23046283",
"name": "新增页面_默认icon",
"font_class": "xinzengyemian_morenicon",
"unicode": "e885",
"unicode_decimal": 59525
},
{
"icon_id": "23046287",
"name": "展开_默认icon",
"font_class": "zhankai_morenicon",
"unicode": "e889",
"unicode_decimal": 59529
},
{ {
"icon_id": "23046290", "icon_id": "23046290",
"name": "shanchu_tc_icon", "name": "shanchu_tc_icon",
@ -537,6 +159,13 @@
"unicode": "e88d", "unicode": "e88d",
"unicode_decimal": 59533 "unicode_decimal": 59533
}, },
{
"icon_id": "23046311",
"name": "新增页面_鼠标点击icon",
"font_class": "xinzengyemian_shubiaodianjiicon",
"unicode": "e88e",
"unicode_decimal": 59534
},
{ {
"icon_id": "23046244", "icon_id": "23046244",
"name": "导入模版_icon", "name": "导入模版_icon",
@ -544,6 +173,13 @@
"unicode": "e86f", "unicode": "e86f",
"unicode_decimal": 59503 "unicode_decimal": 59503
}, },
{
"icon_id": "23046247",
"name": "导出_悬浮",
"font_class": "daochu_xuanfu",
"unicode": "e870",
"unicode_decimal": 59504
},
{ {
"icon_id": "23046252", "icon_id": "23046252",
"name": "错误", "name": "错误",
@ -551,6 +187,13 @@
"unicode": "e872", "unicode": "e872",
"unicode_decimal": 59506 "unicode_decimal": 59506
}, },
{
"icon_id": "23046254",
"name": "成功",
"font_class": "chenggong1",
"unicode": "e873",
"unicode_decimal": 59507
},
{ {
"icon_id": "23046255", "icon_id": "23046255",
"name": "更多_icon", "name": "更多_icon",
@ -565,6 +208,13 @@
"unicode": "e875", "unicode": "e875",
"unicode_decimal": 59509 "unicode_decimal": 59509
}, },
{
"icon_id": "23046262",
"name": "复制_icon",
"font_class": "fuzhi_icon",
"unicode": "e876",
"unicode_decimal": 59510
},
{ {
"icon_id": "23046268", "icon_id": "23046268",
"name": "删除icon", "name": "删除icon",
@ -572,6 +222,27 @@
"unicode": "e877", "unicode": "e877",
"unicode_decimal": 59511 "unicode_decimal": 59511
}, },
{
"icon_id": "23046269",
"name": "垃圾桶_icon@3x",
"font_class": "a-lajitong_icon3x",
"unicode": "e878",
"unicode_decimal": 59512
},
{
"icon_id": "23046270",
"name": "收起_默认icon",
"font_class": "shouqi_morenicon",
"unicode": "e879",
"unicode_decimal": 59513
},
{
"icon_id": "23046271",
"name": "欢迎_icon",
"font_class": "huanying_icon",
"unicode": "e87a",
"unicode_decimal": 59514
},
{ {
"icon_id": "23046273", "icon_id": "23046273",
"name": "搜索_删除icon", "name": "搜索_删除icon",
@ -593,6 +264,13 @@
"unicode": "e87e", "unicode": "e87e",
"unicode_decimal": 59518 "unicode_decimal": 59518
}, },
{
"icon_id": "23046277",
"name": "文件夹_icon",
"font_class": "wenjianjia_icon",
"unicode": "e87f",
"unicode_decimal": 59519
},
{ {
"icon_id": "23046278", "icon_id": "23046278",
"name": "下拉按钮", "name": "下拉按钮",
@ -600,6 +278,20 @@
"unicode": "e880", "unicode": "e880",
"unicode_decimal": 59520 "unicode_decimal": 59520
}, },
{
"icon_id": "23046280",
"name": "新增目录_默认icon",
"font_class": "xinzengmulu_morenicon",
"unicode": "e882",
"unicode_decimal": 59522
},
{
"icon_id": "23046281",
"name": "新增目录_鼠标点击icon",
"font_class": "xinzengmulu_shubiaodianjiicon",
"unicode": "e883",
"unicode_decimal": 59523
},
{ {
"icon_id": "22906287", "icon_id": "22906287",
"name": "二次确认_icon", "name": "二次确认_icon",

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -3,7 +3,7 @@ import './App.css';
import { ConfigProvider } from 'antd' import { ConfigProvider } from 'antd'
import zhCN from 'antd/lib/locale-provider/zh_CN'; import zhCN from 'antd/lib/locale-provider/zh_CN';
import { import {
// BrowserRouter as Router, BrowserRouter as Router,
Route, Route,
Switch Switch
} from 'react-router-dom'; } from 'react-router-dom';
@ -19,7 +19,7 @@ import moment from 'moment'
import { MuiThemeProvider, createMuiTheme } from 'material-ui/styles'; import { MuiThemeProvider, createMuiTheme } from 'material-ui/styles';
import SiderBar from './forge/Component/SiderBar' import SiderBar from './forge/Component/SiderBar'
import { SnackbarHOC } from 'educoder'; import { SnackbarHOC } from 'educoder'
import { initAxiosInterceptors } from './AppConfig' import { initAxiosInterceptors } from './AppConfig'
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import configureStore from './redux/stores/configureStore'; import configureStore from './redux/stores/configureStore';
@ -39,11 +39,6 @@ const Projects = Loadable({
loader: () => import('./forge/Index'), loader: () => import('./forge/Index'),
loading: Loading, loading: Loading,
}) })
// forge项目详情
const ProjectDetail = Loadable({
loader: () => import("./forge/Main/DetailAdaptor"),
loading: Loading,
});
//forge安全设置 //forge安全设置
const Security = Loadable({ const Security = Loadable({
loader: () => import('./forge/SecuritySetting/Index'), loader: () => import('./forge/SecuritySetting/Index'),
@ -87,24 +82,11 @@ const Search = Loadable({
loader: () => import('./modules/search/'), loader: () => import('./modules/search/'),
loading: Loading, loading: Loading,
}) })
const WikiPreview = Loadable({
loader: () => import('./forge/Wiki/Preview'),
loading: Loading,
})
const ProjectIndex = Loadable({ const ProjectIndex = Loadable({
loader: () => import("./forge/Index"), loader: () => import("./forge/Index"),
loading: Loading,
});
const CreateMerge = Loadable({
loader: () => import('./forge/Merge/NewMerge'),
loading: Loading, 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 { class App extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
@ -114,51 +96,6 @@ class App extends Component {
mydisplay: false, mydisplay: false,
occupation: 0, occupation: 0,
mygetHelmetapi: null, 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,
});
} }
} }
@ -178,19 +115,13 @@ class App extends Component {
componentDidMount() { componentDidMount() {
document.title = "loading..."; document.title = "loading...";
initAxiosInterceptors(this.props);
this.getAppdata(); this.getAppdata();
window.addEventListener('error', (event) => { window.addEventListener('error', (event) => {
const msg = `${event.type}: ${event.message}`; const msg = `${event.type}: ${event.message}`;
}); });
} }
componentWillUnmount() {
this.unlisten && this.unlisten(); // 执行解绑
}
//修改登录方法 //修改登录方法
Modifyloginvalue = () => { Modifyloginvalue = () => {
this.setState({ this.setState({
@ -261,139 +192,87 @@ class App extends Component {
}; };
render() { render() {
const { mygetHelmetapi, pathType} = this.state; const { mygetHelmetapi } = this.state;
let personal = mygetHelmetapi && mygetHelmetapi.personal; let personal = mygetHelmetapi && mygetHelmetapi.personal;
return ( return (
<Provider store={store}> <Provider store={store}>
<ConfigProvider locale={zhCN}> <ConfigProvider locale={zhCN}>
<MuiThemeProvider theme={theme}> <MuiThemeProvider theme={theme}>
<LoginDialog {...this.props} {...this.state} Modifyloginvalue={() => this.Modifyloginvalue()}></LoginDialog> <LoginDialog {...this.props} {...this.state} Modifyloginvalue={() => this.Modifyloginvalue()}></LoginDialog>
<SiderBar /> <SiderBar/>
{/* <Router> */} <Router>
<Switch> <Switch>
{/* wiki预览 */} {/*项目*/}
<Route path="/:owner/:projectsId/wiki/preview/:projectName/:projectId" render={ <Route
(props) => { path={"/projects/:owner/:projectId/devops/:opsId/detail"}
return (<WikiPreview {...this.props} {...props} {...this.state} />) render={
} (props) => {
} /> return (<OpsDetail {...this.props} {...props} {...this.state} />)
}
{/* 项目PR */} }>
<Route path="/:owner/:projectsId/pulls/new" </Route>
render={ <Route
(props) => (<ProjectDetail {...this.props} {...props} {...this.state} />) path={"/settings"}
} render={
></Route> (props) => {
return (<Security {...this.props} {...props} {...this.state} />)
{/*项目*/} }
<Route }>
path={"/:owner/:projectId/devops/:opsId/detail"} </Route>
render={ {/*项目*/}
(props) => { <Route
return (<OpsDetail {...this.props} {...props} {...this.state} />) path={"/projects"}
} render={
}> (props) => {
</Route> return (<Projects {...this.props} {...props} {...this.state} />)
<Route }
path={"/settings"} }>
render={ </Route>
(props) => { <Route
return (<Security {...this.props} {...props} {...this.state} />) path="/register"
} render={
}> (props) => {
</Route> return (<EducoderLogin {...this.props} {...props} {...this.state} />)
<Route
path="/register"
render={
(props) => {
return (<EducoderLogin {...this.props} {...props} {...this.state} />)
}
}
/>
{/*403*/}
<Route path="/403" component={Shixunauthority} />
<Route path="/500" component={http500} />
{/*404*/}
<Route path="/nopage" component={Shixunnopage} />
{/* 查询 */}
<Route path="/search" component={Search} />
<Route exact path="/explore"
render={
(props) => (
<ProjectIndex {...this.props} {...props} />
)
}
/>
{/* 组织 */}
<Route path={"/organize"}
render={
(props) => {
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
}
}>
</Route>
{/*新建项目等*/}
<Route
path={"/projects"}
render={
(props) => {
return (<Projects {...this.props} {...props} {...this.state} />)
}
}>
</Route>
{/* 判断为用户/组织,并进入对应页面 */}
{
pathType === 'User' ?
<Route exact path="/:username"
render={
(props) => {
return (<InfosIndex {...this.props} {...this.state} />)
}
} }
/> : pathType === 'Organization' ? <Route path={"/:OIdentifier"}
render={
(props) => {
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
}
}>
</Route> : pathType === '404' ? <Route component={Shixunnopage} />:
<Route exact path="/"
render={
(props) => (
personal && personal.length > 0 ?
<InfosIndex {...this.props} {...props} />
:
<ProjectIndex {...this.props} {...props} />
)
}
/>
// <Route path="/" component={Loading} />
// <Route path="/" component={Shixunnopage} />
}
{/* 个人主页 */}
<Route path="/:username"
render={
(props) => {
return (<InfosIndex {...this.props} {...this.state} />)
} }
/>
{/*403*/}
<Route path="/403" component={Shixunauthority} />
<Route path="/500" component={http500} />
<Route path={"/organize"}
render={
(props) => {
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
}
}>
</Route>
{/*404*/}
<Route path="/nopage" component={Shixunnopage} />
{/* 查询 */}
<Route path="/search" component={Search} />
{/* 个人主页 */}
<Route path="/users/:username"
render={
(props) => {
return (<InfosIndex {...this.props} {...this.state} />)
}
}></Route> }></Route>
<Route exact path="/"
render={
<Route component={Shixunnopage} /> (props) => (
</Switch> personal && personal.length > 0 ?
{/* </Router> */} <InfosIndex {...this.props} {...props} />
:
<ProjectIndex {...this.props} {...props} />
)
}
/>
<Route component={Shixunnopage} />
</Switch>
</Router>
</MuiThemeProvider> </MuiThemeProvider>
</ConfigProvider> </ConfigProvider>
</Provider> </Provider>

View File

@ -85,10 +85,7 @@ export function initAxiosInterceptors(props) {
} }
if (response.data.status === 404) { if (response.data.status === 404) {
let responseURL = response.request ? response.request.responseURL:''; locationurl('/nopage');
if (responseURL.indexOf('/api/users/') === -1 && responseURL.indexOf('/api/organizations/') === -1 ) {
locationurl('/nopage');
}
} }
if (response.data.status === 500) { if (response.data.status === 500) {

View File

@ -195,7 +195,7 @@ class College extends Component {
align: 'center', align: 'center',
className: "edu-txt-center font-14 maxnamewidth105", className: "edu-txt-center font-14 maxnamewidth105",
render: (text, record) => ( render: (text, record) => (
<a href={`/${record.login}`} title={record.name} target="_blank" className="task-hide maxnamewidth105" style={{ <a href={`/users/${record.login}`} title={record.name} target="_blank" className="task-hide maxnamewidth105" style={{
color:'#007bff', color:'#007bff',
}}> { }}> {

View File

@ -218,7 +218,7 @@ a:hover {
} }
.color-blue { .color-blue {
color: #2A61FF; color: #4CACFF;
} }
.color-huang { .color-huang {

View File

@ -1,5 +1,4 @@
import moment from "moment"; import moment from "moment";
import { number } from "prop-types";
// 处理整点 半点 // 处理整点 半点
// 取传入时间往后的第一个半点 // 取传入时间往后的第一个半点
@ -98,41 +97,3 @@ export function formatDuring(mss){
} }
return days + "天" + hours + "小时" + minutes + "分"; 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 "刚刚";
}

View File

@ -18,23 +18,6 @@ export function getImageUrl(path) {
return `${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) { export function getImage(path) {
// https://www.educoder.net // https://www.educoder.net
// https://testbdweb.trustie.net // https://testbdweb.trustie.net

View File

@ -3,7 +3,7 @@
// export { default as OrderStateUtil } from '../routes/Order/components/OrderStateUtil'; // export { default as OrderStateUtil } from '../routes/Order/components/OrderStateUtil';
export { export {
getUploadLogoActionUrl as getUploadLogoActionUrl,numFormat as numFormat, getUploadLogoActionUrl as getUploadLogoActionUrl,
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 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 , 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 , 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, markdownToHTML, uploadNameSizeSeperator, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll, isImageExtension,
downloadFile, sortDirections, validateLength, mdJSONParse, exportMdtoHtml downloadFile, sortDirections, validateLength, mdJSONParse, exportMdtoHtml
} from './TextUtil' } from './TextUtil'
export { handleDateString, getNextHalfHourOfMoment, formatDuring, formatSeconds ,timeAgo} from './DateUtil' export { handleDateString, getNextHalfHourOfMoment, formatDuring, formatSeconds } from './DateUtil'
export { configShareForIndex, configShareForPaths, configShareForShixuns, configShareForCourses, configShareForCustom } from './util/ShareUtil' export { configShareForIndex, configShareForPaths, configShareForShixuns, configShareForCourses, configShareForCustom } from './util/ShareUtil'

View File

@ -435,11 +435,11 @@ class TPIContextProvider extends Component {
image_url: "avatars/User/1" image_url: "avatars/User/1"
login: "innov" login: "innov"
name: "Coder" name: "Coder"
user_url: "/innov" user_url: "/users/innov"
*/ */
let user = resData.user; let user = resData.user;
user.username = resData.user.name; user.username = resData.user.name;
user.user_url = `/${resData.user.login}`; user.user_url = `/users/${resData.user.login}`;
// user.image_url = resData.image_url; // user.image_url = resData.image_url;
user.is_teacher = resData.is_teacher; user.is_teacher = resData.is_teacher;
resData.user = user; resData.user = user;

View File

@ -14,25 +14,25 @@ class ActivityItem extends Component {
{/* 如果是版本发布 */} {/* 如果是版本发布 */}
{item.trend_type === "VersionRelease" ? {item.trend_type === "VersionRelease" ?
<p className="itemLine"> <p className="itemLine">
<Link to={`/${owner}/${projectsId}/releases`} className="color-blue font-16">{item.name}</Link> <Link to={`/projects/${owner}/${projectsId}/version`} className="color-blue font-16">{item.name}</Link>
<span className="activity_type">{item.trend_type}</span> <span className="activity_type">{item.trend_type}</span>
</p > </p >
: :
// 如果是任务 // 如果是任务
item.trend_type === "Issue" ? item.trend_type === "Issue" ?
<p className="itemLine"> <p className="itemLine">
<Link to={`/${owner}/${projectsId}/issues/${item.trend_id}`} className="color-blue font-16">{item.name}</Link> <Link to={`/projects/${owner}/${projectsId}/issues/${item.trend_id}/detail`} className="color-blue font-16">{item.name}</Link>
<span className="activity_type">{item.trend_type}</span> <span className="activity_type">{item.trend_type}</span>
</p > </p >
: :
// 如果是合并请求 // 如果是合并请求
<p className="itemLine"> <p className="itemLine">
<Link to={`/${owner}/${projectsId}/pulls/${item.trend_id}/Messagecount`} className="color-blue font-16">{item.name}</Link> <Link to={`/projects/${owner}/${projectsId}/pulls/${item.trend_id}/Messagecount`} className="color-blue font-16">{item.name}</Link>
<span className="activity_type">{item.trend_type}</span> <span className="activity_type">{item.trend_type}</span>
</p > </p >
} }
<p className="itemLine mt10"> <p className="itemLine mt10">
<Link to={`/${item && item.user_login}`} className="show-user-link"> <Link to={`/users/${item && item.user_login}`} className="show-user-link">
<img alt="" src={getImageUrl(`/${item.user_avatar}`)} className="createImage" /> <img alt="" src={getImageUrl(`/${item.user_avatar}`)} className="createImage" />
<span className="mr20">{item.user_name}</span> <span className="mr20">{item.user_name}</span>
</Link> </Link>

View File

@ -1,20 +1,28 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Menu } from 'antd'; import { Dropdown, Menu, Tooltip } from 'antd';
import "./branch.scss"; import "./branch.scss";
import CopyTool from '../Component/CopyTool';
function CloneAddress({http_url , ssh_url , zip_url , tar_url}) { function CloneAddress({http_url , ssh_url , zip_url , tar_url}) {
const [ key , setKey ] = useState("HTTP"); const [ key , setKey ] = useState("HTTP");
// 点击按钮复制功能
function jsCopy(){
var e = document.getElementById("copy_rep_content");
e.select();
document.execCommand("Copy");
}
return ( return (
<div className="downMenu"> <div className="downMenu">
<div style={{borderBottom:"1px solid #eee"}}> <div style={{padding:"10px 20px 20px 20px",borderBottom:"1px solid #eee"}}>
<Menu className="urlMenu" selectedKeys={[key]} mode={"horizontal"}> <Menu className="urlMenu" selectedKeys={[key]} mode={"horizontal"}>
<Menu.Item key="HTTP" onClick={(e)=>{setKey(e.key)}}>HTTP</Menu.Item> <Menu.Item key="HTTP" onClick={(e)=>{setKey(e.key)}}>HTTP</Menu.Item>
<Menu.Item key="SSH" onClick={(e)=>{setKey(e.key)}}>SSH</Menu.Item> <Menu.Item key="SSH" onClick={(e)=>{setKey(e.key)}}>SSH</Menu.Item>
</Menu> </Menu>
<div className="gitAddressClone"> <div className="gitAddressClone">
<input type="text" id="copy_rep_content" value={key==="HTTP" ? http_url:ssh_url} /> <input type="text" id="copy_rep_content" value={key==="HTTP" ? http_url:ssh_url} />
<CopyTool inputId="copy_rep_content" className="copytool"/> <Tooltip title="复制链接">
<span className="color-blue" onClick={jsCopy}><i className="iconfont icon-fuzhi"></i></span>
</Tooltip>
</div> </div>
</div> </div>
<Menu className="edu-txt-center"> <Menu className="edu-txt-center">

View File

@ -1,36 +1,116 @@
import React , { useState , useEffect } from 'react'; import React , { useState , useEffect } from 'react';
import { Popover , Dropdown , Input , Spin } from 'antd'; import { Popover , Input , Spin } from 'antd';
import './branch.scss'; import './branch.scss';
import { getBranch , getTag } from '../GetData/getData'; import { getBranch , getTag } from '../GetData/getData';
import SelectOverlay from './SelectOverlay';
export default (({ projectsId , branch , owner , changeBranch , branchList , tagflag = true })=>{ export default (({ projectsId , branch , owner , changeBranch , branchList , tagflag = true })=>{
const [ showValue , setShowValue ] = useState(branch); 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 [ data , setData ] = useState(undefined);
const [ datas , setDatas ] = useState(undefined);
useEffect(()=>{ useEffect(()=>{
setShowValue(branch); setShowValue(branch);
},[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);
}
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 = ( const menu = (
<SelectOverlay <div>
changeBranch={changeBranch} <div className="padding10 bor-bottom-greyE">
tagflag={tagflag} <Input
projectsId={projectsId} placeholder="请输入分支或标签名称搜索"
owner={owner} autocomplete="off" className="OptionsInput" value={inputValue}
branchList={branchList} onChange={changeInputValue} style={{width:"220px"}}
/> />
<ul className="navUl">
<li className={nav === 0?"navli active":"navli"} onClick={()=>changeNav(0)}><i className="iconfont icon-fenzhi1 font-14 mr3"></i>分支列表</li>
{ tagflag && <li className={nav === 1?"navli active":"navli"} onClick={()=>changeNav(1)}><i className="iconfont icon-biaoqian3 font-14 mr3"></i>标签列表</li> }
</ul>
</div>
<Spin spinning={isSpin}>
<ul className="OptionsUl" id="ul-btn">
{
datas && datas.length>0 ?
datas.map((item,key)=>{
return(
<li key={key} onClick={()=>chooseitem(item.name)}><a className="task-hide ulALink">{item.name}</a></li>
)
}):
<p className="listTips">暂无{inputValue}{nav === 0 ?"分支":"标签"}~</p>
}
</ul>
</Spin>
</div>
); );
return( return(
<Dropdown placement='bottomLeft' overlay={menu} overlayClassName="branch-tagBox-list" trigger={['click']} > <Popover placement='bottomLeft' visible={flag} content={menu} onClick={()=>setFlag(!flag)} overlayClassName="branch-tagBox-list">
<div className="branch-tagBox"> <div className="branch-tagBox">
{/* {nav === 0 ?"分支":"标签"} */} {/* {nav === 0 ?"分支":"标签"} */}
<span className="color-grey-9 mr3 ml8"><i className="iconfont icon-fenzhi2 font-18"></i></span> <span className="color-grey-9 mr3 ml8"><i className="iconfont icon-fenzhi2 font-18"></i></span>
<span className="ant-dropdown-link task-hide" style={{fontWeight:"500"}}> <a className="ant-dropdown-link">
{showValue} {showValue}
</span> </a>
<i className="showtag iconfont icon-sanjiaoxing-down font-15 color-grey-9 mr5 ml5 mt1" /> <i className="showtag iconfont icon-xiajiantou font-14 color-grey-9 mr8" />
</div> </div>
</Dropdown> </Popover>
) )
}) })

View File

@ -1,84 +0,0 @@
import React , { useState , useEffect } from 'react';
import { Input , Spin , Menu } from 'antd';
import { getBranch , getTag } from '../GetData/getData';
function SelectOverlay({ changeBranch , tagflag , branchList , projectsId , owner }) {
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(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);
}
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);
}else{
getTags(projectsId,owner);
}
}
return(
<div className="overlayBranch">
<div className="padding15" style={{paddingBottom:"0px"}}>
<Input
prefix={<i className="iconfont icon-sousuo_icon1 font-14"></i>}
placeholder="请输入分支或标签名称搜索"
autocomplete="off" className="OptionsInput"
value={inputValue}
onChange={changeInputValue}
/>
</div>
<Menu mode="horizontal" className="navUl" selectedKeys={[keys]} onClick={changeNav}>
<Menu.Item key={"branch"}>分支</Menu.Item>
{ tagflag && <Menu.Item key={"tag"}>标签</Menu.Item> }
</Menu>
<Spin spinning={isSpin}>
<ul className="OptionsUl" id="ul-btn">
{
datas && datas.length>0 ?
datas.map((item,key)=>{
return(
<li key={key} onClick={()=>chooseitem(item.name)}><a className="task-hide ulALink">{item.name}</a></li>
)
}):
<p className="listTips">暂无{inputValue}{nav === 0 ?"分支":"标签"}~</p>
}
</ul>
</Spin>
</div>
)
}
export default SelectOverlay;

View File

@ -27,11 +27,10 @@
overflow-y: auto; overflow-y: auto;
} }
.OptionsUl li{ .OptionsUl li{
height: 30px; height: 35px;
line-height: 30px; line-height: 35px;
cursor: pointer; cursor: pointer;
padding:0px 20px; padding:0px 10px;
margin:5px 0px;
} }
.OptionsUl li:hover{ .OptionsUl li:hover{
background-color: #F0F0F0; background-color: #F0F0F0;
@ -46,49 +45,38 @@
width: 100%; width: 100%;
} }
.branch-tagBox{ .branch-tagBox{
border:1px solid #D0D0D0; border:1px solid #eee;
border-radius: 3px; border-radius: 3px;
height: 32px; height: 40px;
display: flex; display: flex;
align-items: center; align-items: center;
cursor: pointer; cursor: pointer;
min-width: 104px; min-width: 140px;
} }
.branch-tagBox:hover{ .branch-tagBox-list .ant-popover-arrow{
background-color: #F3F4F6; display: none;
} }
.branch-tagBox-list{ .branch-tagBox-list.ant-popover.ant-popover-placement-bottom{
background: #FFFFFF; padding-top:0px;
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{ .branch-tagBox .ant-dropdown-link{
width: 325px; display: block;
.navUl{ flex:1;
margin-top: 8px; }
height: 30px; .branch-tagBox-list .ant-popover-inner-content{
line-height: 30px; padding:0px;
li{ }
height: 30px; .navUl{
line-height: 30px; display: flex;
padding:0px 5px; justify-content: space-between;
margin-left: 20px!important; align-items: center;
} margin-top: 5px;
} }
.navUl li{
cursor: pointer;
}
.navUl li.active{
color:#5091FF;
} }
.listTips{ .listTips{
padding:20px 0px; padding:20px 0px;
@ -98,7 +86,6 @@
.urlMenu{ .urlMenu{
line-height: 30px; line-height: 30px;
margin-bottom: 10px; margin-bottom: 10px;
padding:15px 20px 0px 20px;
border-bottom: none; border-bottom: none;
li.ant-menu-item{ li.ant-menu-item{
height: 30px; height: 30px;
@ -116,6 +103,3 @@
} }
} }
} }
.copytool{
margin:0px 10px;
}

View File

@ -55,7 +55,6 @@ function AddGroup({organizeId,getGroupID}){
function addCollaborator(){ function addCollaborator(){
getGroupID && getGroupID(id); getGroupID && getGroupID(id);
setID(undefined);
} }
return( return(

View File

@ -113,14 +113,7 @@ li.ant-menu-item{
z-index: 10000; z-index: 10000;
} }
.laterest{ .laterest{
background-color: #EF3131; color: #05690d;
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){ @media screen and (max-width: 1800px){
@ -162,112 +155,41 @@ li.ant-menu-item{
margin:0px 20px!important; margin:0px 20px!important;
} }
} }
.hoverA{
display:flex;
align-items: center;
max-width: 78px;
&:hover a{
color:#2A61FF !important ;
}
}
.menuPanels{ .menuPanels{
width: 295px; width: 240px;
.leftline{ height: 180px;
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{ .ant-popover-content,.ant-popover-inner{
height: 100%; height: 100%;
width: 100%; width: 100%;
} }
.ant-popover-inner-content{
padding:0px;
}
} }
.halfs{ .halfs{
margin-top: 24px; margin-top: 24px;
padding:24px 0px 0px 0px; padding:24px 0px 0px 0px;
border-top: 1px solid #e8e8e8; border-top: 1px solid #e8e8e8;
} .attrPerson{
.aboutSubTitle{ padding-bottom: 24px;
display: flex; }
align-items: center;
}
.menuMaininfos{
padding:10px 16px 14px;
border-bottom: 1px solid #eee;
} }
.menuinfos{ .menuinfos{
padding:10px 20px 16px; padding:15px 0px;
&>a{ &>a{
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
border-right: 1px solid #eee;
flex: 1; flex: 1;
& >span:first-child{ & >span:first-child{
font-size: 16px; font-size: 18px;
font-weight: 500; font-weight: 400;
color: #333; color: #333;
line-height: 22px;
} }
& >span:last-child{ & >span:last-child{
color: #666; color: #666;
font-weight: 400; }
line-height: 20px; &:last-child{
margin-top: 6px; border-right: none;
} }
} }
} }

View File

@ -1,13 +1,13 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { AlignCenter , FlexAJ } from '../Component/layout'; import { AlignCenter , FlexAJ } from '../Component/layout';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { Popover , Spin , Button } from 'antd'; import { Popover , Spin } from 'antd';
import { getImageUrl } from 'educoder'; import { getImageUrl } from 'educoder';
import './Component.scss'; import './Component.scss';
import { getUser } from '../GetData/getData'; import { getUser } from '../GetData/getData';
import axios from 'axios'; import axios from 'axios';
function Contributors({contributors,owner,projectsId,currentLogin}){ function Contributors({contributors,owner,projectsId}){
const [ menuList ,setMenuList ]= useState([]); const [ menuList ,setMenuList ]= useState([]);
const [ list , setList ]= useState(undefined); const [ list , setList ]= useState(undefined);
const [ total , setTotal ]= useState(0); const [ total , setTotal ]= useState(0);
@ -46,60 +46,46 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
} }
} }
function renderOrganize(list) {
let str = "";
list.map(i=>{
str = str+i.name + "、";
})
return str && str.substr(0,str.length - 1);
}
function setMenusFunc(data){ function setMenusFunc(data){
if(data){ if(data){
let ele = ( let ele = (
<Spin spinning={isSpin}> <Spin spinning={isSpin}>
<FlexAJ className="menuMaininfos"> <FlexAJ>
<AlignCenter> <AlignCenter>
<Link to={`/${data.login}`}><img src={getImageUrl(`/${data.image_url}`)} alt="" className="radius" width="38px" height="38px"/></Link> <Link to={`/users/${data.login}`}><img src={getImageUrl(`/${data.image_url}`)} alt="" className="radius" width="38px" height="38px"/></Link>
<Link to={`/users/${data.login}`} className="ml10">{data.name}</Link>
<div className="ml10">
<Link to={`/${data.login}`}>{data.name}</Link>
{ data.location && <span className="leftline">{data.location}</span> }
{
data.organizations && data.organizations.length>0&&
<p className="task-hide" style={{maxWidth:"215px"}}>
所属组织{renderOrganize(data.organizations)}
</p>
}
</div>
</AlignCenter> </AlignCenter>
{
data.is_watch ? <a className="color-grey-9" onClick={()=>FocusFunc(false,data.login)}>取消关注</a>:<a className="color-blue" onClick={()=>FocusFunc(true,data.login)}>关注</a>
}
</FlexAJ> </FlexAJ>
<AlignCenter className="menuinfos"> <AlignCenter className="menuinfos">
<Link to={`/${data.login}/projects`}> <a href={data.projects_url}>
<span>{data.projects_count}</span> <span>{data.projects_count}</span>
<span>项目数</span> <span>项目数</span>
</Link> </a>
<Link to={`/${data.login}/followers`}> <a href={data.followers_url}>
<span>{data.followers_count}</span> <span>{data.followers_count}</span>
<span>粉丝数</span> <span>粉丝数</span>
</Link> </a>
<Link to={`/${data.login}/following`}> <a href={data.following_url}>
<span>{data.following_count}</span> <span>{data.following_count}</span>
<span>关注数</span> <span>关注数</span>
</Link> </a>
</AlignCenter> </AlignCenter>
<div className={"pb20"} style={{display:"flex",justifyContent:'center'}}> {
{ data.organizations && data.organizations.length > 0 ?
currentLogin && (currentLogin === data.login) <AlignCenter className="font-12 pt4 pb4">
? <span>所属组织</span>
<Button className="currentBtn">当前用户</Button> <div className="task-hide flex1">
: {renderArray(data.organizations)}
data.is_watch ? </div>
<Button type={"default"} onClick={()=>FocusFunc(false,data.login)}>已关注</Button> </AlignCenter>
: :""
<Button type={"primary"} onClick={()=>FocusFunc(true,data.login)}>关注TA</Button> }
} {
</div> data.location && <AlignCenter className="font-12 pt4 pb4"><span>所在地址:</span><span className="ml5">{data.location}</span></AlignCenter>
}
</Spin> </Spin>
) )
setMenu(ele); setMenu(ele);
@ -149,17 +135,17 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
return( return(
<div className="halfs"> <div className="halfs">
<Link to={`/${owner}/${projectsId}/contribute`} className="font-16 color-ooo hoverA"> <FlexAJ>
<span>贡献者</span> <AlignCenter><span className="font-16 color-grey-6">贡献者</span>{ contributors && contributors.total_count > 0 && <span className="infoCount">{contributors.total_count}</span>}</AlignCenter>
{ contributors && contributors.total_count > 0 && <span className="infoCount">{contributors.total_count}</span>} <Link className="font-12 color-grey-9" to={`/projects/${owner}/${projectsId}/contribute`}>全部</Link>
</Link> </FlexAJ>
<div className="attrPerson" onMouseLeave={()=>setVisibleFunc(false)}> <div className="attrPerson" onMouseLeave={()=>setVisibleFunc(false)}>
{ {
total > 0 ? total > 0 ?
list.map((item,key)=>{ list.map((item,key)=>{
return( return(
<Popover content={menu} visible={item.visible} overlayClassName="menuPanels" placement="top"> <Popover content={menu} visible={item.visible} overlayClassName="menuPanels" placement="top">
<Link key={key} to={`/${item.login}`}> <Link key={key} to={`/users/${item.login}`}>
<img src={getImageUrl(`/${item.image_url}`)} alt="" onMouseOver={()=>setVisibleFunc(true,item.login,key)}/> <img src={getImageUrl(`/${item.image_url}`)} alt="" onMouseOver={()=>setVisibleFunc(true,item.login,key)}/>
</Link> </Link>
</Popover> </Popover>

View File

@ -1,51 +0,0 @@
import React, { useState, useCallback, memo } from 'react';
import { Tooltip } from 'antd';
CopyTool.defaultProps = {
beforeText: '复制链接', //
afterText: '复制成功', //
className: '', //svgclass
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 (
<Tooltip
placement="top"
title={title}
onVisibleChange={() => { setTitle(beforeText) }}
>
<i className={`iconfont icon-fuzhiicon ${className}`} style={{ color: '#466aff' }} onClick={copyUrl}></i>
</Tooltip>
);
}
export default memo(CopyTool);

View File

@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { AlignCenter } from '../layout'; import { AlignCenter } from '../layout';
import { Button } from 'antd'; import { Modal , Button } from 'antd';
import Modals from '../PublicModal/Index'; import './Index.scss';
function DeleteBox({ function DeleteBox({
visible , visible ,
@ -12,22 +12,24 @@ function DeleteBox({
content content
}) { }) {
return( return(
<Modals <Modal
visible={visible}
onCancel={onCancel}
title={title} title={title}
btn={ width="600px"
className="deleteBox"
footer={
<div> <div>
<Button size={'large'} onClick={onCancel}>取消</Button> <Button size={'large'} onClick={onCancel}>取消</Button>
<Button type={"danger"} size={"large"} onClick={onSuccess}>确认删除</Button> <Button type={"danger"} size={"large"} onClick={onSuccess}>确认删除</Button>
</div> </div>
} }
onCancel={onCancel}
visible={visible}
> >
<div className="desc"> <div className="desc">
<AlignCenter className="descMain"><i className="iconfont icon-shanchu_tc_icon mr10"></i>{content}</AlignCenter> <AlignCenter className="descMain"><i className="iconfont icon-shanchu_tc_icon mr10"></i>{content}</AlignCenter>
<p>{subTitle}</p> <p>{subTitle}</p>
</div> </div>
</Modals> </Modal>
) )
} }
export default DeleteBox; export default DeleteBox;

View File

@ -0,0 +1,45 @@
.deleteBox{
.ant-modal-header{
background-color: #f8f8f8;
border-bottom: none;
.ant-modal-title{
text-align: left;
font-size: 20px;
}
}
.ant-modal-body{
padding:30px 50px;
p{
font-size: 16px;
line-height: 26px;
color:#666;
word-break: break-all;
}
.desc{
.descMain{
align-items: center;
justify-content: center;
font-size: 20px;
margin-bottom: 10px;
i{
font-size: 38px!important;
color:#DF0002
}
}
}
}
.ant-modal-footer{
border-top: none;
text-align: center;
padding-bottom: 40px;
button{
width: 120px;
margin:0px 20px;
&.ant-btn-danger{
background-color: #fff;
color: #DF0002;
border-color: #D0D0D0;
}
}
}
}

View File

@ -78,7 +78,7 @@ function DrawerPanel({visible,onClose,branch,owner,projectsId,history, name , li
if(dataref.type==="file"){ if(dataref.type==="file"){
onClose(); onClose();
let value = turnbar(branch); let value = turnbar(branch);
history.push(`/${owner}/${projectsId}/tree/${value}/${dataref.path}`); history.push(`/projects/${owner}/${projectsId}/tree/${value}/${dataref.path}`);
} }
} }

View File

@ -1,6 +1,6 @@
.ant-modal-mask{ .ant-modal-mask{
z-index: 1031; z-index: 1001;
} }
.ant-modal-wrap{ .ant-modal-wrap{
z-index: 1032; z-index: 1002;
} }

View File

@ -25,7 +25,7 @@ function LanguagePower({languages}){
} }
return( return(
<div> <div>
<p className="font-16 color-ooo aboutSubTitle">开发语言</p> <p className="font-16 color-grey-6">开发语言</p>
<div className="progress"> <div className="progress">
{ {
array && array.map((item,key)=>{ array && array.map((item,key)=>{

View File

@ -45,15 +45,15 @@ const Div = styled.div`{
export default (({ user , img, name, time, focusStatus, is_current_user, login , successFunc }) => { export default (({ user , img, name, time, focusStatus, is_current_user, login , successFunc }) => {
return ( return (
<Div> <Div>
<Link to={`/${user && user.login}`}><Img src={getImageUrl(`/${img}`)} /></Link> <Link to={`/users/${user && user.login}`}><Img src={getImageUrl(`/${img}`)} /></Link>
<div className="m-infos"> <div className="m-infos">
<Link to={`/${user && user.login}`}><Name>{name}</Name></Link> <Link to={`/users/${user && user.login}`}><Name>{name}</Name></Link>
<Time><I className="iconfont icon-shijian"></I>加入时间:{time}</Time> <Time><I className="iconfont icon-shijian"></I>加入时间:{time}</Time>
{ {
is_current_user ? is_current_user ?
<Button type="default">当前用户</Button> <Button type="default">当前用户</Button>
: :
<FocusButton is_watch={focusStatus} id={login} successFunc={successFunc} notReset={true}/> <FocusButton is_watch={focusStatus} id={login} successFunc={successFunc}/>
} }
</div> </div>
</Div> </Div>

View File

@ -1,72 +0,0 @@
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(
<Modals
title="完善资料"
onCancel={onNo}
visible={modalVis}
btn={
addMemberCheck?
<div>
<Button type={'primary'} size={"large"} onClick={onNo}>好的</Button>
</div>
:
<div>
<Button size={"large"} onClick={onNo}>暂不补充</Button>
<Button type={'primary'} size={"large"} onClick={onOk}>好的</Button>
</div>
}
>
<div className="contents">
<img src={ProfileImg} alt=""/>
{
addMemberCheck ?
<p>目标用户个人资料不完整需提醒目标用户补充资料后以进行后续操作</p>
:
<p>您目前的个人资料不完整需要补充资料以进行后续操作是否前往补充个人信息</p>
}
</div>
</Modals>
)
}
export default ProfileModal;

View File

@ -1,18 +0,0 @@
.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;
}

View File

@ -1,17 +0,0 @@
import React from 'react';
function Profile({children,sureFunc,showCompeleteDialog , completeProfile, className}) {
function checkProfile() {
if(!completeProfile){
showCompeleteDialog && showCompeleteDialog();
}else{
sureFunc();
}
}
return(
<a className={className} onClick={checkProfile}>{children}</a>
)
}
export default Profile;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -1,20 +0,0 @@
import React from 'react';
import { Modal } from 'antd';
import './Index.scss';
function Modals({title,children,btn,onCancel,visible}) {
return(
<Modal
visible={visible}
onCancel={onCancel}
title={title}
width={"520px"}
footer={btn}
centered={true}
wrapClassName={"deleteBox"}
>
{children}
</Modal>
)
}
export default Modals;

View File

@ -1,75 +0,0 @@
.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);
}
}
}
}
}

View File

@ -1,34 +1,38 @@
import React from 'react'; import React from 'react';
import { AlignTop } from '../Component/layout'; import { AlignCenter , AlignTop , FlexAJ } from '../Component/layout';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
function Releases({owner,projectsId,releaseVersions , baseOperate , projectType}){ function Releases({owner,projectsId,releaseVersions , baseOperate , projectType}){
return( return(
<div> <div>
<Link to={`/${owner}/${projectsId}/releases`} className="font-16 color-ooo hoverA"> <FlexAJ>
<span>发行版</span> <AlignCenter><span className="font-16 color-grey-6">发行版</span>
{ releaseVersions && releaseVersions.total_count > 0 && <span className="infoCount">{releaseVersions.total_count}</span>} { releaseVersions && releaseVersions.total_count > 0 && <span className="infoCount">{releaseVersions.total_count}</span>}
</Link> </AlignCenter>
{ (releaseVersions && releaseVersions.total_count > 0) || projectType ===2 ?
<Link className="font-12 color-grey-9" to={`/projects/${owner}/${projectsId}/releases`}>全部</Link>
:
baseOperate && <Link className="font-12 color-blue" to={`/projects/${owner}/${projectsId}/releases/new`}>新建</Link>
}
</FlexAJ>
{ {
releaseVersions && releaseVersions.total_count>0 ? releaseVersions && releaseVersions.total_count>0 ?
releaseVersions.list.map((item,key)=>{ releaseVersions.list.map((item,key)=>{
return( return(
key === 0 &&<AlignTop className="mt10"> key === 0 &&<AlignTop className="mt10">
<i className="iconfont icon-biaoqian3 color-grey-6 font-18 mr10"></i>
<div> <div>
<p className="font-16 color-grey-6"> <p className="font-16 color-grey-6">
<Link to={`/${owner}/${projectsId}/releases`}>{item.name}</Link> <Link to={`/projects/${owner}/${projectsId}/releases`}>{item.name}</Link>
<span className="font-12 laterest ml5">最新</span> <span className="font-12 laterest ml5">最新</span>
</p> </p>
<p className="color-grey-3 font-12">{item.created_at}</p> <p className="color-grey-9 font-13">{item.created_at}</p>
</div> </div>
</AlignTop> </AlignTop>
) )
}) })
: :""
<div className="mt8">
您暂未发布任何版本{baseOperate && projectType !==2 && <Link className="color-blue ml20" to={`/projects/${owner}/${projectsId}/releases/new`}>创建新版本</Link>}
</div>
} }
</div> </div>

View File

@ -2,9 +2,9 @@ import React from 'react';
import {Popover} from 'antd'; import {Popover} from 'antd';
import './Component.scss'; import './Component.scss';
export default (({menu , children, overlayClassName})=>{ export default (({menu , children})=>{
return( return(
<Popover content={menu} trigger={['click']} placement='bottom' overlayClassName={overlayClassName}> <Popover content={menu} trigger={['click']} placement='bottom'>
{children} {children}
</Popover> </Popover>
) )

View File

@ -20,7 +20,7 @@ export default ({ url , name , column , id , login })=>{
`; `;
return( return(
id? id?
<Link to={`/${login}`}> <Link to={`/users/${login}`}>
<Img> <Img>
{ url && <img src={url} alt=""/> } { url && <img src={url} alt=""/> }
<span>{name}</span> <span>{name}</span>

View File

@ -149,7 +149,7 @@ function About(props, ref) {
axios.post(url).then(result=>{ axios.post(url).then(result=>{
setIsSpining(false); setIsSpining(false);
if(result && result.data.status === 0){ if(result && result.data.status === 0){
props.history.push(`/${owner}/${projectsId}/devops`); props.history.push(`/projects/${owner}/${projectsId}/devops/dispose`);
// open_devops // open_devops
let { changeOpenDevops } = props; let { changeOpenDevops } = props;
changeOpenDevops && changeOpenDevops(true); changeOpenDevops && changeOpenDevops(true);

View File

@ -96,7 +96,7 @@ function Dispose(props){
setVisible(false); setVisible(false);
if(result && result.data){ if(result && result.data){
props.showNotification("流水线新增成功,请进行工作流配置!"); props.showNotification("流水线新增成功,请进行工作流配置!");
props.history.push(`/${owner}/${projectsId}/devops/${result.data.id}`); props.history.push(`/projects/${owner}/${projectsId}/devops/dispose/${result.data.id}`);
}else{ }else{
props.showNotification("流水线新增失败,请稍后再试!"); props.showNotification("流水线新增失败,请稍后再试!");
} }
@ -134,12 +134,12 @@ function Dispose(props){
// //
function toModalManage(){ function toModalManage(){
props.history.push(`/${owner}/${projectsId}/devops/mould`); props.history.push(`/projects/${owner}/${projectsId}/devops/mould`);
} }
// //
function toparameter(){ function toparameter(){
props.history.push(`/${owner}/${projectsId}/devops/params`); props.history.push(`/projects/${owner}/${projectsId}/devops/params`);
} }
const operate = current_user && (permission && permission !== "Reporter"); const operate = current_user && (permission && permission !== "Reporter");

View File

@ -73,7 +73,7 @@ function List({ list, operate , projectsId , owner , showModal , deleteFunc }){
render:(value,item)=>{ render:(value,item)=>{
let v = turnbar(item.branch); let v = turnbar(item.branch);
return( return(
<Link to={`/${owner}/${projectsId}/tree/${v}/${value}`} className="color-blue">{value}</Link> <Link to={`/projects/${owner}/${projectsId}/tree/${v}/${value}`} className="color-blue">{value}</Link>
) )
} }
}, },
@ -117,7 +117,7 @@ function List({ list, operate , projectsId , owner , showModal , deleteFunc }){
return( return(
<span> <span>
{ operate ? { operate ?
<Link to={`/${owner}/${projectsId}/devops/${item.id}`} className="mr10 color-grey-6"> <Link to={`/projects/${owner}/${projectsId}/devops/dispose/${item.id}`} className="mr10 color-grey-6">
<i className="iconfont icon-zaibianji font-13 mr3"></i>编辑</Link> :"" <i className="iconfont icon-zaibianji font-13 mr3"></i>编辑</Link> :""
} }
{ operate ? { operate ?
@ -125,7 +125,7 @@ function List({ list, operate , projectsId , owner , showModal , deleteFunc }){
<a className="mr10 color-grey-6"><i className="iconfont icon-lajitong font-13 mr3"></i>删除</a> <a className="mr10 color-grey-6"><i className="iconfont icon-lajitong font-13 mr3"></i>删除</a>
</Popconfirm>:"" </Popconfirm>:""
} }
<Link to={`/${owner}/${projectsId}/devops/list/${item.branch}`} className="color-grey-6"><i className="iconfont icon-yunhang font-13 mr3"></i>查看运行记录</Link> <Link to={`/projects/${owner}/${projectsId}/devops/list/${item.branch}`} className="color-grey-6"><i className="iconfont icon-yunhang font-13 mr3"></i>查看运行记录</Link>
</span> </span>
) )
} }

View File

@ -36,37 +36,39 @@ export default ((props)=>{
return( return(
<WhiteBack className="opsPanel"> <WhiteBack className="opsPanel">
<Switch {...props}> <Switch {...props}>
<Route path="/projects/:owner/:projectsId/devops/dispose/:disposeId"
<Route path="/:owner/:projectsId/devops/params" render={
(p) => (<New {...props} {...p}/>)
}
></Route>
<Route path="/projects/:owner/:projectsId/devops/params"
render={ render={
(p) => (<Params {...props} {...p}/>) (p) => (<Params {...props} {...p}/>)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/devops/mould" <Route path="/projects/:owner/:projectsId/devops/mould"
render={ render={
(p) => (<Mould {...props} {...p}/>) (p) => (<Mould {...props} {...p}/>)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/devops/new" <Route path="/projects/:owner/:projectsId/devops/dispose/new"
render={ render={
(p) => (<New {...props} {...p}/>) (p) => (<New {...props} {...p}/>)
} }
></Route> ></Route>
<Route path="/projects/:owner/:projectsId/devops/dispose"
<Route path="/:owner/:projectsId/devops/list/:branch" render={
(p) => (<Dispose {...props} {...p}/>)
}
></Route>
<Route path="/projects/:owner/:projectsId/devops/list/:branch"
render={ render={
(p) => (<Stucture {...props} {...p}/>) (p) => (<Stucture {...props} {...p}/>)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/devops/:disposeId" <Route path="/projects/:owner/:projectsId/devops"
render={ render={
(p) => (<New {...props} {...p}/>) (p) => (<About {...props} {...p}/>)
}
></Route>
{/* 原本的两种合为一个 */}
<Route path="/:owner/:projectsId/devops"
render={
(p) =>{return( p.location.state.open_devops?<Dispose {...props} {...p}/>:<About {...props} {...p}/>)}
} }
></Route> ></Route>
</Switch> </Switch>

View File

@ -26,7 +26,7 @@ export default ((props)=>{
return( return(
<div className="disposePanel"> <div className="disposePanel">
<Banner> <Banner>
{ permission !=="Reporter" && <Link to={`/${owner}/${props.match.params.projectsId}/devops`}>工作流配置</Link>} { permission !=="Reporter" && <Link to={`/projects/${owner}/${props.match.params.projectsId}/devops/dispose`}>工作流配置</Link>}
</Banner> </Banner>
<Div> <Div>
<Dispost {...props}/> <Dispost {...props}/>

View File

@ -104,7 +104,7 @@ function Params(props){
<Banner> <Banner>
<FlexAJ> <FlexAJ>
<span className="font-18">工作流 - 参数管理</span> <span className="font-18">工作流 - 参数管理</span>
<Link to={`/${owner}/${projectsId}/devops`} className="font-14 color-grey-9 ml20">返回</Link> <Link to={`/projects/${owner}/${projectsId}/devops/dispose`} className="font-14 color-grey-9 ml20">返回</Link>
</FlexAJ> </FlexAJ>
</Banner> </Banner>
<Div className="disposeList"> <Div className="disposeList">

View File

@ -126,7 +126,7 @@ function Mould(props){
<div> <div>
<New wrappedComponentRef={(f) => childRef.current = f} ref={childRef} visible={visible} onCancel={()=>setVisible(false)} onOk={onOk}></New> <New wrappedComponentRef={(f) => childRef.current = f} ref={childRef} visible={visible} onCancel={()=>setVisible(false)} onOk={onOk}></New>
<Banner> <Banner>
<FlexAJ><span>工作流 - 模板管理</span><Link to={`/${owner}/${projectsId}/devops`} className="font-14 color-grey-9">返回</Link></FlexAJ> <FlexAJ><span>工作流 - 模板管理</span><Link to={`/projects/${owner}/${projectsId}/devops/dispose`} className="font-14 color-grey-9">返回</Link></FlexAJ>
</Banner> </Banner>
<Div className="disposeList"> <Div className="disposeList">
<FlexAJ> <FlexAJ>

View File

@ -198,7 +198,7 @@ function Structure(props,ref){
} }
function clickRows(event,e){ function clickRows(event,e){
props.history.push(`/${owner}/${projectsId}/devops/${e.number}/detail`); props.history.push(`/projects/${owner}/${projectsId}/devops/${e.number}/detail`);
} }
const column = [ const column = [
{ {
@ -290,7 +290,7 @@ function Structure(props,ref){
<Banner> <Banner>
<FlexAJ> <FlexAJ>
<span>构建列表</span> <span>构建列表</span>
<Link to={`/${owner}/${projectsId}/devops`} className="font-15 color-grey-9">返回</Link> <Link to={`/projects/${owner}/${projectsId}/devops/dispose`} className="font-15 color-grey-9">返回</Link>
</FlexAJ> </FlexAJ>
</Banner> </Banner>
<Div> <Div>

View File

@ -275,7 +275,7 @@ function disposePipeline(props){
...params ...params
}).then(result=>{ }).then(result=>{
if(result){ if(result){
props.history.push(`/${owner}/${projectsId}/devops`); props.history.push(`/projects/${owner}/${projectsId}/devops/dispose`);
} }
setLoading(false); setLoading(false);
}).catch(error=>{ }).catch(error=>{

View File

@ -48,7 +48,7 @@ export default (props) => {
axios.post(url).then((result) => { axios.post(url).then((result) => {
if (result && result.data) { if (result && result.data) {
props.showNotification("工作流正在重新构建!"); props.showNotification("工作流正在重新构建!");
props.history.push(`/${owner}/${projectId}/devops/${result.data.number}/detail`); props.history.push(`/projects/${owner}/${projectId}/devops/${result.data.number}/detail`);
} }
}) })
.catch((error) => { .catch((error) => {
@ -87,7 +87,7 @@ export default (props) => {
</AlignCenter> </AlignCenter>
<Link <Link
style={{ color: "#ddd" }} style={{ color: "#ddd" }}
to={`/${owner}/${projectId}/devops`} to={`/projects/${owner}/${projectId}/devops/dispose`}
> >
<i className="iconfont icon-yiguanbi font-15 mr5"></i>退出 <i className="iconfont icon-yiguanbi font-15 mr5"></i>退出
</Link> </Link>

View File

@ -41,15 +41,14 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
// //
function onOk(){ function onOk(){
validateFields((error,values)=>{ validateFields((error,values)=>{
console.log(...values);
if(!error){ if(!error){
const url = `/${owner}/${repo}/applied_transfer_projects.json`; const url = `/${owner}/${repo}/applied_transfer_projects.json`;
Axios.post(url,{ Axios.post(url,{
...values ...values
}).then(result=>{ }).then(result=>{
if(result && result.data.id){ if(result){
onSuccess(result.data && result.data.owner); onSuccess(result.data && result.data.owner);
}else{
onSuccess();
} }
}).catch(error=>{}) }).catch(error=>{})
} }
@ -105,7 +104,7 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
</ul> </ul>
: :
<ul className="descUl"> <ul className="descUl">
<li>仓库仅可以转移到您具有管理权限的组织中</li> <li>仓库仅可以转移到您已经加入的组织中不可以转移到未加入的组织中</li>
<li>涉及到仓库改名操作请提前做好仓库备份并且在转移后对本地仓库的remote进行修改</li> <li>涉及到仓库改名操作请提前做好仓库备份并且在转移后对本地仓库的remote进行修改</li>
<li>转移仓库到组织后你和组织创建者/管理员同时拥有对该仓库的管理操作</li> <li>转移仓库到组织后你和组织创建者/管理员同时拥有对该仓库的管理操作</li>
</ul> </ul>

View File

@ -1,7 +1,6 @@
import React, { useState , forwardRef, useEffect } from 'react'; import React, { useState , forwardRef, useEffect } from 'react';
import { Form , Modal , Input , Radio } from 'antd'; import { Form , Modal , Input , Radio } from 'antd';
import Axios from 'axios'; import Axios from 'axios';
import CheckProfile from '../Component/ProfileModal/Profile';
export default Form.create()( export default Form.create()(
forwardRef((props)=>{ forwardRef((props)=>{
@ -78,7 +77,7 @@ export default Form.create()(
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>
<CheckProfile {...props} sureFunc={()=>setVisible(true)}>加入项目</CheckProfile> <a onClick={()=>setVisible(true)}>加入项目</a>
</React.Fragment> </React.Fragment>
) )
}) })

View File

@ -10,7 +10,6 @@ import HeadSearch from '../Component/HeadSearch';
import AddProjectModal from './AddProjectModal'; import AddProjectModal from './AddProjectModal';
import '../../modules/tpm/TPMIndex.css'; import '../../modules/tpm/TPMIndex.css';
import CheckProfile from '../Component/ProfileModal/Profile';
import './header.scss'; import './header.scss';
const $ = window.$ const $ = window.$
@ -224,15 +223,6 @@ class NewHeader extends Component {
} }
} }
checkProfile=(url)=>{
const { showCompeleteDialog , completeProfile } = this.props;
if(!completeProfile){
showCompeleteDialog && showCompeleteDialog();
}else{
window.location.href(url);
}
}
addMenu=(list)=>{ addMenu=(list)=>{
return( return(
list && list.length >0 && list && list.length >0 &&
@ -241,16 +231,11 @@ class NewHeader extends Component {
{ {
list.map((item,key)=>{ list.map((item,key)=>{
return( return(
(item.name !=="加入课堂" && item.name !=="加入开发项目") && (item.name !=="加入课堂" && item.name !=="加入开发项目") && <Menu.Item key={item.name+key}><a href={item.url}>{item.name}</a></Menu.Item>
<Menu.Item key={item.name+key}>
<CheckProfile {...this.props} sureFunc={()=>{window.location.href=item.url}}>{item.name}</CheckProfile>
</Menu.Item>
) )
}) })
} }
<Menu.Item> <Menu.Item><AddProjectModal showNotification={this.props.showNotification}/></Menu.Item>
<AddProjectModal {...this.props} showNotification={this.props.showNotification}/>
</Menu.Item>
</Menu> </Menu>
</div> </div>
) )
@ -260,7 +245,7 @@ class NewHeader extends Component {
return( return(
<Menu className="currentMenu"> <Menu className="currentMenu">
<Menu.Item> <Menu.Item>
<span className="currentName" title={current_user && current_user.username}>{current_user && current_user.username}</span> <span title={current_user && current_user.username}>{current_user && current_user.username}</span>
</Menu.Item> </Menu.Item>
{ {
personal && personal.length > 0 && personal.map((item,key)=>{ personal && personal.length > 0 && personal.map((item,key)=>{
@ -269,7 +254,7 @@ class NewHeader extends Component {
) )
}) })
} }
<li><Link to={`/settings/profile`}>设置</Link></li> <li><Link to={`/settings/SSH`}>设置</Link></li>
<Menu.Item><a onClick={() => this.educoderloginysl()}>退出</a></Menu.Item> <Menu.Item><a onClick={() => this.educoderloginysl()}>退出</a></Menu.Item>
</Menu> </Menu>
) )
@ -362,7 +347,7 @@ class NewHeader extends Component {
}) })
} }
let search_url = settings && settings.common && settings.common.search; // let search_url = settings && settings.common && settings.common.search;
let notice_url = settings && settings.common && settings.common.notice; let notice_url = settings && settings.common && settings.common.notice;
return ( return (
<div className="newHeaders" id="nHeader"> <div className="newHeaders" id="nHeader">
@ -400,16 +385,16 @@ class NewHeader extends Component {
if (new_link && (new_link.indexOf("courses") > -1 || new_link.indexOf("contests") > -1)) { if (new_link && (new_link.indexOf("courses") > -1 || new_link.indexOf("contests") > -1)) {
if (user_login) { if (user_login) {
if (new_link.indexOf("courses") > -1) { if (new_link.indexOf("courses") > -1) {
new_link = new_link.replace(/courses/g, user_login + "/courses") new_link = new_link.replace(/courses/g, "users/" + user_login + "/courses")
} else if (new_link.indexOf("contests") > -1) { } else if (new_link.indexOf("contests") > -1) {
new_link = new_link.replace(/contests/g, user_login + "/contests") new_link = new_link.replace(/contests/g, "users/" + user_login + "/contests")
} }
} else { } else {
is_hidden = true is_hidden = true
} }
} }
if (user_login && (new_link && new_link.indexOf("homes") > -1)) { if (user_login && (new_link && new_link.indexOf("homes") > -1)) {
new_link = new_link.replace(/homes/g, user_login + "/user_activities") new_link = new_link.replace(/homes/g, "users/" + user_login + "/user_activities")
} }
var waiLian = (new_link && str.filter(item=>new_link.indexOf(item)>-1) ); var waiLian = (new_link && str.filter(item=>new_link.indexOf(item)>-1) );
@ -427,7 +412,7 @@ class NewHeader extends Component {
</div> </div>
<div className="head-right"> <div className="head-right">
{/* {search_url ? this.SearchInput(openSearch,search_url):""} */} {/* {search_url ? this.SearchInput(openSearch,search_url):""} */}
{ search_url && <HeadSearch {...this.props}/>} <HeadSearch {...this.props}/>
{ {
current_user && (current_user.main_site || current_user.login) && (settings && settings.add && settings.add.length>0)? current_user && (current_user.main_site || current_user.login) && (settings && settings.add && settings.add.length>0)?
<Dropdown overlay={this.addMenu(settings && settings.add)} placement="bottomRight"> <Dropdown overlay={this.addMenu(settings && settings.add)} placement="bottomRight">
@ -457,7 +442,7 @@ class NewHeader extends Component {
</span> </span>
: :
<Dropdown placement={`bottomRight`} overlay={this.renderMenu(settings && settings.personal)}> <Dropdown placement={`bottomRight`} overlay={this.renderMenu(settings && settings.personal)}>
<a href={`/${this.props.current_user && this.props.current_user.login}`}> <a href={`/users/${this.props.current_user && this.props.current_user.login}`}>
<img alt="头像" src={getImageUrl(`/${user.image_url}`)} className="currentImg"></img> <img alt="头像" src={getImageUrl(`/${user.image_url}`)} className="currentImg"></img>
</a> </a>
</Dropdown> </Dropdown>

View File

@ -30,13 +30,6 @@
width: 120px; width: 120px;
text-align: center; text-align: center;
padding:0px; padding:0px;
.currentName{
padding:0px 8px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
display: block;
}
li{ li{
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;

View File

@ -12,7 +12,6 @@ import Loadable from "react-loadable";
import Loading from "../Loading"; import Loading from "../Loading";
import { ImageLayerOfCommentHOC } from "../modules/page/layers/ImageLayerOfCommentHOC"; import { ImageLayerOfCommentHOC } from "../modules/page/layers/ImageLayerOfCommentHOC";
const ProjectNew = Loadable({ const ProjectNew = Loadable({
loader: () => import("./New/Index"), loader: () => import("./New/Index"),
loading: Loading, loading: Loading,
@ -22,23 +21,21 @@ const ProjectIndex = Loadable({
loading: Loading, loading: Loading,
}); });
// 项目详情放在用户和组织下作为二级菜单存在 const ProjectDetail = Loadable({
// const ProjectDetail = Loadable({ loader: () => import("./Main/Detail"),
// loader: () => import("./Main/Detail"), loading: Loading,
// loading: Loading, });
// });
class Index extends Component { class Index extends Component {
componentDidUpdate = () => { componentDidUpdate=()=>{
this.props.history.listen(() => { this.props.history.listen(()=>{
if (document.body.scrollTop || document.documentElement.scrollTop > 0) { if (document.body.scrollTop || document.documentElement.scrollTop > 0) {
window.scrollTo(0, 0) window.scrollTo(0, 0)
} }
}) })
} }
render() { render() {
return ( return (
<div className="newMain clearfix"> <div className="newMain clearfix">
<Switch {...this.props}> <Switch {...this.props}>
@ -55,24 +52,23 @@ class Index extends Component {
)} )}
></Route> ></Route>
<Route <Route
path="/projects/mirror/new" path="/projects/new"
render={(props) => ( render={(props) => (
<ProjectNew {...this.props} {...props} /> <ProjectNew {...this.props} {...props} />
)} )}
></Route> ></Route>
{/* <Route <Route
path="/:owner/:projectsId" path="/projects/:owner/:projectsId"
render={(props) => ( render={(props) => (
<ProjectDetail {...this.props} {...props} /> <ProjectDetail {...this.props} {...props} />
)} )}
></Route> */} ></Route>
<Route <Route
path="/explore" path="/projects"
render={(props) => ( render={(props) => (
<ProjectIndex {...this.props} {...props} /> <ProjectIndex {...this.props} {...props} />
)} )}
></Route> ></Route>
<Route <Route
path="/" path="/"
render={(props) => ( render={(props) => (
@ -90,10 +86,3 @@ export default withRouter(
parentSelector: ".newMain", parentSelector: ".newMain",
})(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(Index)))) })(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(Index))))
); );
// export default withRouter(
// ImageLayerOfCommentHOC({
// imgSelector: ".imageLayerParent img, .imageLayerParent .imageTarget",
// parentSelector: ".newMain",
// })(Index)
// );

View File

@ -1,9 +1,8 @@
import React , { useEffect , useState } from 'react'; import React , { useEffect , useState } from 'react';
import { WhiteBack , Box , LongWidth , ShortWidth , Gap , AlignCenter , FlexAJ } from '../Component/layout'; import { WhiteBack , Box , LongWidth , ShortWidth , Gap , AlignCenter , FlexAJ } from '../Component/layout';
import { Dropdown , Menu , Divider , Spin, Button , Typography } from 'antd'; import { Dropdown , Menu , Divider , Spin, Button } from 'antd';
import { getImageUrl } from "educoder"; import { getImageUrl } from "educoder";
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { truncateCommitId } from "../common/util";
import CloneAddress from '../Branch/CloneAddress'; import CloneAddress from '../Branch/CloneAddress';
import SelectBranch from '../Branch/Select'; import SelectBranch from '../Branch/Select';
@ -21,11 +20,10 @@ import DrawerPanel from '../Component/DrawerPanel';
import UpdateDescModal from './sub/UpdateDescModal'; import UpdateDescModal from './sub/UpdateDescModal';
import Nodata from '../Nodata'; import Nodata from '../Nodata';
import Invite from './sub/Invite'; import Invite from './sub/Invite';
import CheckProfile from '../Component/ProfileModal/Profile';
/** /**
* projectDetail.type:0是托管项目1是镜像项目2是同步镜像项目(为2时不支持在线创建在线上传在线修改在线删除创建合并请求等功能) * projectDetail.type:0是托管项目1是镜像项目2是同步镜像项目(为2时不支持在线创建在线上传在线修改在线删除创建合并请求等功能)
*/ */
const { Paragraph } = Typography;
function turnbar(str){ function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){ if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F'); return str.replaceAll('/','%2F');
@ -114,7 +112,7 @@ function CoderDepot(props){
useEffect(()=>{ useEffect(()=>{
if (projectsId && owner && defaultBranch){ if (projectsId && owner && defaultBranch){
let b = turnbar(branchName) ; let b = turnbar(branchName) ;
if(pathname.indexOf(`/${owner}/${projectsId}`) > -1 && pathname.indexOf(`/tree/${b}/`) > -1) { if(pathname.indexOf(`/projects/${owner}/${projectsId}`) > -1 && pathname.indexOf(`/tree/${b}/`) > -1) {
let url = pathname.split(`/tree/${b}/`)[1]; let url = pathname.split(`/tree/${b}/`)[1];
setTreeValue(url); setTreeValue(url);
getFileInfo(url,branchName); getFileInfo(url,branchName);
@ -200,7 +198,7 @@ function CoderDepot(props){
// //
function changeBranch(value){ function changeBranch(value){
let checkvalue = turnbar(value); let checkvalue = turnbar(value);
let url = `/${owner}/${projectsId}${value && `/tree/${checkvalue}`}${treeValue ? `/${treeValue}`:""}`; let url = `/projects/${owner}/${projectsId}${value && `/tree/${checkvalue}`}${treeValue ? `/${treeValue}`:""}`;
props.history.push(url); props.history.push(url);
} }
@ -209,13 +207,9 @@ function CoderDepot(props){
let b = branchName || defaultBranch; let b = branchName || defaultBranch;
let checkvalue = turnbar(b); let checkvalue = turnbar(b);
return ( return (
<Menu className="fileMenu"> <Menu>
<Menu.Item> <Menu.Item><a onClick={()=>urlLink(`/projects/${owner}/${projectsId}/${checkvalue}/uploadfile${treeValue === undefined ? "" : `/${treeValue}`}`)}>上传文件</a></Menu.Item>
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/${checkvalue}/uploadfile${treeValue === undefined ? "" : `/${treeValue}`}`)}>上传文件</CheckProfile> <Menu.Item><a onClick={()=>urlLink(`/projects/${owner}/${projectsId}/${checkvalue}/newfile${treeValue === undefined ? "" : `/${treeValue}`}`)}>新建文件</a></Menu.Item>
</Menu.Item>
<Menu.Item>
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/${checkvalue}/newfile${treeValue === undefined ? "" : `/${treeValue}`}`)}>新建文件</CheckProfile>
</Menu.Item>
</Menu> </Menu>
) )
} }
@ -234,12 +228,12 @@ function CoderDepot(props){
setTreeValue(undefined); setTreeValue(undefined);
let branch = branchName || defaultBranch; let branch = branchName || defaultBranch;
let checkvalue = turnbar(branch); let checkvalue = turnbar(branch);
props.history.push(`/${owner}/${projectsId}/tree/${checkvalue}`); props.history.push(`/projects/${owner}/${projectsId}/tree/${checkvalue}`);
}; };
// //
function returnUlr(url){ function returnUlr(url){
let enBranch = turnbar(branchName); let enBranch = turnbar(branchName);
props.history.push(`/${owner}/${projectsId}/tree${enBranch?`/${enBranch}`:""}/${url}`); props.history.push(`/projects/${owner}/${projectsId}/tree${enBranch?`/${enBranch}`:""}/${url}`);
} }
// //
function goToSubRoot(path,type,filename){ function goToSubRoot(path,type,filename){
@ -247,7 +241,7 @@ function CoderDepot(props){
let enBranch = branchName || defaultBranch; let enBranch = branchName || defaultBranch;
let checkvalue = turnbar(enBranch); let checkvalue = turnbar(enBranch);
setType(type); setType(type);
props.history.push(`/${owner}/${projectsId}${`/tree/${checkvalue}`}${path?`/${path}`:""}`); props.history.push(`/projects/${owner}/${projectsId}${`/tree/${checkvalue}`}${path?`/${path}`:""}`);
} }
} }
@ -259,7 +253,7 @@ function CoderDepot(props){
// //
let enBranch = branchName || defaultBranch; let enBranch = branchName || defaultBranch;
let checkvalue = turnbar(enBranch); let checkvalue = turnbar(enBranch);
props.history.push(`/${owner}/${projectsId}/tree/${checkvalue}/${path}`); props.history.push(`/projects/${owner}/${projectsId}/tree/${checkvalue}/${path}`);
setType("file"); setType("file");
setEditReadme(true); setEditReadme(true);
}; };
@ -303,7 +297,6 @@ function CoderDepot(props){
const { current_user } = props; const { current_user } = props;
const baseOperate = projectDetail && projectDetail.permission && projectDetail.permission !=="Reporter"; const baseOperate = projectDetail && projectDetail.permission && projectDetail.permission !=="Reporter";
const fileOperate = type === "dir" && projectDetail && projectDetail.type !== 2 && ((projectDetail.permission && projectDetail.permission !=="Reporter") || (current_user && current_user.admin)); const fileOperate = type === "dir" && projectDetail && projectDetail.type !== 2 && ((projectDetail.permission && projectDetail.permission !=="Reporter") || (current_user && current_user.admin));
return( return(
<WhiteBack> <WhiteBack>
<UpdateDescModal desc={desc} website={website} lesson_url={lesson_url} visible={openModal} onCancel={()=>setOpenModal(false)} onOk={okUpdate}/> <UpdateDescModal desc={desc} website={website} lesson_url={lesson_url} visible={openModal} onCancel={()=>setOpenModal(false)} onOk={okUpdate}/>
@ -322,7 +315,7 @@ function CoderDepot(props){
list = {mainFlag ? dirInfo : undefined} list = {mainFlag ? dirInfo : undefined}
/> />
<div className="drawerBtn" onClick={()=>setVisible(true)}> <div className="drawerBtn" onClick={()=>setVisible(true)}>
<i className="iconfont icon-zuohuaicon font-14"></i> <i className="iconfont icon-youjiantou font-16"></i>
<span>目录</span> <span>目录</span>
</div> </div>
</React.Fragment> </React.Fragment>
@ -335,7 +328,7 @@ function CoderDepot(props){
<div className="panelmenu"> <div className="panelmenu">
<FlexAJ> <FlexAJ>
<AlignCenter> <AlignCenter>
<div className="mr30"> <div className="mr20">
{ {
props && props.platform ? props && props.platform ?
<SelectBranch <SelectBranch
@ -352,69 +345,59 @@ function CoderDepot(props){
} }
</div> </div>
<AlignCenter className="mr20"> <AlignCenter className="mr20">
<Link to={`/${owner}/${projectsId}/branches`} className="iconBtn"> <Link to={`/projects/${owner}/${projectsId}/branchs`} className="color-grey-9">
<i className="iconfont icon-master_icon font-16"></i> <i className="iconfont icon-fenzhi2 font-18 color-grey-9 mr3"></i>
<span>分支</span> <span className="color-grey-6 mr3">{projectDetail && projectDetail.branches && projectDetail.branches.total_count}</span>分支
<span>{projectDetail && projectDetail.branches && projectDetail.branches.total_count}</span>
</Link> </Link>
</AlignCenter> </AlignCenter>
<AlignCenter className="mr20"> <AlignCenter className="mr20">
<Link to={`/${owner}/${projectsId}/tags`} className="iconBtn"> <Link to={`/projects/${owner}/${projectsId}/tag`} className="color-grey-9">
<i className="iconfont icon-biaoqianicon font-16"></i> <i className="iconfont icon-biaoqian3 font-16 color-grey-9 mr3"></i>
<span>标签</span> <span className="color-grey-6 mr3">{projectDetail && projectDetail.tags && projectDetail.tags.total_count}</span>标签
<span>{projectDetail && projectDetail.tags && projectDetail.tags.total_count}</span>
</Link> </Link>
</AlignCenter> </AlignCenter>
</AlignCenter> </AlignCenter>
<AlignCenter className="depotBtn"> <AlignCenter>
{ {
baseOperate && ((projectDetail.type !== 2 && pullsFlag) || issuesFlag )&& baseOperate && ((projectDetail.type !== 2 && pullsFlag) || issuesFlag )&&
<div className="addOptionBtn"> <div className="mr20 addOptionBtn">
{ {
projectDetail.type !== 2 && pullsFlag && projectDetail.type !== 2 && pullsFlag &&
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/pulls/new`)} >+ 合并请求</CheckProfile> <a onClick={()=>urlLink(`/projects/${owner}/${projectsId}/pulls/new`)} >+ 合并请求</a>
} }
{ {
issuesFlag && issuesFlag &&
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/issues/new`)} >+ 易修</CheckProfile> <a onClick={()=>urlLink(`/projects/${owner}/${projectsId}/issues/new`)} >+ 任务</a>
} }
</div> </div>
} }
{ fileOperate && { fileOperate &&
<Dropdown <Dropdown overlay={fileMenu()} className="mr20" trigger={['click']}>
overlay={fileMenu()} <Button type="default">文件 <i className="iconfont icon-sanjiaoxing-down ml3 font-14 color-grey-9"></i></Button>
className="mr10"
trigger={['click']}
getPopupContainer={document.parentNode}
>
<a>文件 <i className="iconfont icon-sanjiaoxing-down ml3 font-14 color-grey-6 mr-5"></i></a>
</Dropdown> </Dropdown>
} }
<Dropdown overlay={downloadMenu} placement="bottomRight" trigger={['click']}> <Dropdown overlay={downloadMenu} placement="bottomRight" trigger={['click']}>
<Button type={'primary'}>下载 <i className="iconfont icon-sanjiaoxing-down ml3 font-14 color-white mr-3"></i></Button> <Button type={'primary'}>下载 <i className="iconfont icon-sanjiaoxing-down ml3 font-14 color-white"></i></Button>
</Dropdown> </Dropdown>
</AlignCenter> </AlignCenter>
</FlexAJ> </FlexAJ>
{ {
(dirInfo && dirInfo.length>0) || fileInfo ? dirInfo || fileInfo ?
<div className="listtable"> <div className="listtable">
{ {
lastCommit && lastCommit &&
<div className="listtablehead"> <div className="listtablehead">
<User url={getImageUrl(`/${lastCommitAuthor && lastCommitAuthor.image_url}`)} name={lastCommitAuthor && lastCommitAuthor.name} id={lastCommitAuthor && lastCommitAuthor.id} login={lastCommitAuthor && lastCommitAuthor.login}/> <User url={getImageUrl(`/${lastCommitAuthor && lastCommitAuthor.image_url}`)} name={lastCommitAuthor && lastCommitAuthor.name} id={lastCommitAuthor && lastCommitAuthor.id} login={lastCommitAuthor && lastCommitAuthor.login}/>
<div onClick={()=>props.history.push(`/${owner}/${projectsId}/commits/${truncateCommitId(lastCommit.sha)}`)} className={hideBtn && hide ? "ellipsistxt hidetxt" :"ellipsistxt"}> <div className={hideBtn && hide ? "ellipsistxt hidetxt" :"ellipsistxt"}>
<pre id="ptxt">{lastCommit.message}</pre> <pre id="ptxt">{lastCommit && lastCommit.message}</pre>
</div> </div>
{ hideBtn && <span className="ellipsis" onClick={()=>changeHide(hide)}><i className="iconfont icon-shenglvehao"></i></span> } { hideBtn && <span className="ellipsis" onClick={()=>changeHide(hide)}><i className="iconfont icon-shenglvehao"></i></span> }
<span className="ml20 color-grey-6 font-12 mt3">{lastCommit.time_from_now}</span> <span className="ml12 color-grey-9 mt3">{lastCommit && lastCommit.time_from_now}</span>
{ { commitCount ? <Link to={`/projects/${owner}/${projectsId}/commits/branch/${turnbar(branchName || defaultBranch)}`} className="ml12 color-grey-9">
commitCount ? <i className="iconfont icon-tijiao mr3 font-17 color-grey-9"></i>{commitCount}次提交
<Link to={`/${owner}/${projectsId}/commits/branch/${turnbar(branchName || defaultBranch)}`} className="ml20 color-grey-3"style={{height:"28px",lineHeight:"28px"}}> </Link>:"" }
<i className="iconfont icon-tijiaoicon mr3 font-16"></i><span style={{fontWeight:"500"}}>{commitCount}次提交</span>
</Link>:""
}
</div> </div>
} }
<ul className="listtablebody"> <ul className="listtablebody">
@ -458,7 +441,7 @@ function CoderDepot(props){
: "" : ""
} }
{ {
(dirInfo && dirInfo.length === 0) && !fileInfo ? <Nodata _html="暂未发现文件"/> :"" (dirInfo && dirInfo.length === 0) && (fileInfo && fileInfo.length === 0) ? <Nodata _html="暂未发现文件"/> :""
} }
{/* readme文件显示(显示文件详情时不显示readme文件) */} {/* readme文件显示(显示文件详情时不显示readme文件) */}
{ dirInfo && (readme && readme.content) ? <ReadMe ChangeFile={ChangeFile} readme={readme} operate={props && (props.isManager || props.isDeveloper) && projectDetail.type !==2 } history={props.history} /> :"" } { dirInfo && (readme && readme.content) ? <ReadMe ChangeFile={ChangeFile} readme={readme} operate={props && (props.isManager || props.isDeveloper) && projectDetail.type !==2 } history={props.history} /> :"" }
@ -469,48 +452,45 @@ function CoderDepot(props){
<ShortWidth> <ShortWidth>
<Gap style={{paddingLeft:"30px"}}> <Gap style={{paddingLeft:"30px"}}>
<div className="panelmenu"> <div className="panelmenu">
<FlexAJ className="font-18 color-ooo mb20" style={{lineHeight:"28px"}}>关于 <FlexAJ className="font-18 color-grey-6 mb20" style={{lineHeight:"28px"}}>简介
{ {projectDetail.permission && (projectDetail.permission==="Admin" || projectDetail.permission==="Owner") && <i onClick={()=>setOpenModal(true)} className="iconfont icon-anquanshezhi color-grey-9 font-15"></i>}
projectDetail.permission && (projectDetail.permission==="Admin" || projectDetail.permission==="Owner" || projectDetail.permission==="Manager") &&
<i onClick={()=>setOpenModal(true)} className="iconfont icon-a-shezhi color-grey-9 font-15"></i>
}
</FlexAJ> </FlexAJ>
{desc && <p className="font-14 color-grey-3 mb15 task-hide-2" style={{lineHeight:"24px",WebkitLineClamp:"4",textAlign:"justify",wordBreak:"break-all"}}>{desc}</p>} {desc && <p className="font-14 color-grey-9 mb15 task-hide-2" style={{lineHeight:"22px",WebkitLineClamp:"4",textAlign:"justify",wordBreak:"break-all"}}>{desc}</p>}
{ {
website && website &&
<div className="color-grey-6 df pinfos mb5"> <p className="color-grey-6 df">
<i className="iconfont icon-lianjie2 font-15 mr10"></i> <i className="iconfont icon-lianjie2 font-15 mr10 color-grey-9"></i>
<a href={website} target="_blank" style={{wordBreak:"break-all",lineHeight:"20px",marginTop:"5px",textDecoration:"underline"}}>{website}</a> <a href={website} className="color-grey-6" target="_blank" style={{wordBreak:"break-all",lineHeight:"20px",marginTop:"5px",textDecoration:"underline"}}>{website}</a>
</div> </p>
} }
<div className="pinfos mb5"> <p>
<i className="iconfont icon-zishuwenjian_icon font-15 mr10"></i> <i className="iconfont icon-wenjian4 font-15 mr10 color-grey-9"></i>
<a href="#readme">README.md</a> <a href="#readme" className="color-grey-6">README.md</a>
</div> </p>
<div className="color-grey-6 mb5"> <p className="color-grey-6">
<i className="iconfont icon-neicunicon font-15 mr10"></i> <i className="iconfont icon-dataBase font-15 mr10 color-grey-6"></i>
<span>{projectDetail && projectDetail.size}</span> <span>{projectDetail && projectDetail.size}</span>
</div> </p>
{ {
projectDetail && projectDetail.license_name && projectDetail && projectDetail.license_name &&
<div className="pinfos"> <p className="color-grey-6">
<i className="iconfont icon-xieyiicon font-16 mr10"></i> <i className="iconfont icon-tianping font-16 mr10 color-grey-3"></i>
<Link to={`/${owner}/${projectsId}/tree/${branchName || defaultBranch}/LICENSE`} className="color-grey-6">{projectDetail.license_name}</Link> <span>{projectDetail.license_name}</span>
</div> </p>
} }
</div> </div>
{ {
inviteCode && inviteCode &&
<div> <div>
<Divider /> <Divider />
<Invite code={inviteCode}/> <Invite code={inviteCode} className={"detailsCode"}/>
</div> </div>
} }
{ {
lesson_url && lesson_url &&
<div> <div>
<Divider /> <Divider />
<p className="font-16 color-ooo">实践课程</p> <p className="font-16 color-grey-6">实践课程</p>
<a href={lesson_url} target="_blank" className="color-grey-6" style={{textDecoration:"underline",wordBreak:"break-all"}}>{lesson_url}</a> <a href={lesson_url} target="_blank" className="color-grey-6" style={{textDecoration:"underline",wordBreak:"break-all"}}>{lesson_url}</a>
</div> </div>
} }
@ -531,8 +511,8 @@ function CoderDepot(props){
} }
{/* 贡献者 */} {/* 贡献者 */}
{ {
projectDetail && projectDetail.contributors && projectDetail.contributors.total_count >0 && projectDetail && projectDetail.contributors &&
<Contributors contributors={projectDetail.contributors} owner={owner} projectsId={projectsId} /> <Contributors contributors={projectDetail && projectDetail.contributors} owner={owner} projectsId={projectsId} />
} }
{/* 语言 */} {/* 语言 */}
{ projectDetail && projectDetail.languages && { projectDetail && projectDetail.languages &&

View File

@ -4,8 +4,8 @@ import { truncateCommitId } from '../common/util';
const typeIco = { const typeIco = {
"submodule":"icon-file-submodule font-17", "submodule":"icon-file-submodule font-17",
"file":'icon-wenjian6 font-15 color-blue-file', "file":'icon-wenjia font-15',
"dir":"icon-wenjianjia4 font-15 color-blue_4C" "dir":"icon-wenjianjia1 font-15"
} }
function CoderDepotCatalogue({item , goToSubRoot , owner , projectsId }){ function CoderDepotCatalogue({item , goToSubRoot , owner , projectsId }){
@ -13,15 +13,15 @@ function CoderDepotCatalogue({item , goToSubRoot , owner , projectsId }){
<li> <li>
<span> <span>
<a onClick={()=>goToSubRoot(item.path,item.type,item.name)} className={item.type === "submodule" && "submoduleStyle"}> <a onClick={()=>goToSubRoot(item.path,item.type,item.name)} className={item.type === "submodule" && "submoduleStyle"}>
<i className={`iconfont ${typeIco[`${item.type}`]} mr8`}></i>{item.name} <i className={`iconfont ${typeIco[`${item.type}`]} color-green-file mr5`}></i>{item.name}
</a> </a>
</span> </span>
<span title="init project"> <span title="init project">
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.commit && item.commit.sha}`)}`} title={item.commit && item.commit.message}> <Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.commit && item.commit.sha}`)}`} title={item.commit && item.commit.message}>
{item.commit && item.commit.message} {item.commit && item.commit.message}
</Link> </Link>
</span> </span>
<span title={item.commit && item.commit.created_at}>{item.commit && item.commit.time_from_now}</span> <span>{item.commit && item.commit.time_from_now}</span>
</li> </li>
) )
} }

View File

@ -1,9 +1,8 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import RenderHtml from '../../components/render-html'; import RenderHtml from '../../components/render-html';
import { AlignCenter } from '../Component/layout'; import { AlignCenter } from '../Component/layout';
import { Dropdown , Anchor , Spin } from 'antd'; import { Dropdown , Menu , Spin } from 'antd';
import { Link } from 'react-router-dom';
import ReadmeCatelogue from './sub/ReadmeCatelogue';
const $ = window.$; const $ = window.$;
function CoderDepotReadme({ operate , history , readme , ChangeFile }){ function CoderDepotReadme({ operate , history , readme , ChangeFile }){
@ -24,45 +23,49 @@ function CoderDepotReadme({ operate , history , readme , ChangeFile }){
const anchor = el.id; const anchor = el.id;
const level = el.tagName.replace("H", ""); const level = el.tagName.replace("H", "");
const href = `#${anchor}`; const href = `#${anchor}`;
return { href:`${href}`,text:el.textContent , level:level } return { href:`${path}${href}`,text:el.textContent , level:level }
}); });
setMenuList(items); setMenuList(items);
},[content]) },[content])
function menu(){ function menu(){
if(menuList && menuList.length > 0){ if(menuList && menuList.length > 0){
let hash = history.location.hash;
return( return(
<ReadmeCatelogue menuList={menuList} hash={history.location.hash}/> <Menu className="menuslist">
{
menuList.map((item,key)=>{
return(
<Menu.Item key={item.id} className={decodeURI(hash).indexOf(item.text)>-1 ?"active":""}><Link to={`${item.href}`} style={{paddingLeft:`${item.level *10}px`}} title={item.text}>{item.text}</Link></Menu.Item>
)
})
}
</Menu>
) )
}else{ }else{
return <Spin /> return <Spin />
} }
} }
return( return(
<div className="commonBox readBox" id="readme"> <div className="commonBox" id="readme">
<Anchor offsetTop={70} targetOffset={160}> <div className="commonBox-title boxTitle">
<div className="commonBox-title boxTitle"> <AlignCenter>
<AlignCenter> <Dropdown overlay={menu()}>
<Dropdown overlay={menu()} trigger={['hover']} overlayClassName="menuslist"> <span className="catelogue">
<span className="catelogue"> <i className="iconfont icon-zhangjie1 font-14 mr5"></i>
<i className="iconfont icon-muluicon font-12 mr5"></i> <span>目录</span>
<span>目录</span> </span>
</span> </Dropdown>
</Dropdown> <span className="commonBox-title-read">README.md</span>
</AlignCenter>
<span className="commonBox-title-read"><a href="#readme ">README.md</a></span> {
operate ?
</AlignCenter> <a className="ml20 pull-right" onClick={() =>ChangeFile(readme && readme.path, false)}>
{ <i className="iconfont icon-bianji6 font-16 color-blue"></i>
operate ? </a>
<a className="ml20 pull-right" onClick={() =>ChangeFile(readme && readme.path, false)}> :""
<i className="iconfont icon-a-bianji font-17 color-grey-6"></i> }
</a> </div>
:""
}
</div>
</Anchor>
{ {
content && content &&
<div className="commonBox-info"> <div className="commonBox-info">

View File

@ -4,7 +4,7 @@ import { Dropdown , Menu , Icon , Tooltip , Spin } from 'antd';
import { truncateCommitId } from '../common/util'; import { truncateCommitId } from '../common/util';
import { getBranch } from '../GetData/getData'; import { getBranch } from '../GetData/getData';
import Nodata from '../Nodata'; import Nodata from '../Nodata';
import './list.scss'; import './list.css';
function turnbar(str){ function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){ if(str && str.length>0 && str.indexOf("/")>-1){
@ -38,9 +38,9 @@ export default ((props)=>{
return( return(
<li key={key}> <li key={key}>
<div> <div>
<Link to={`/${owner}/${projectsId}/tree/${turnbar(item.name)}`} className="color-blue font-15" style={{"maxWidth":"100px"}}>{item.name}</Link> <Link to={`/projects/${owner}/${projectsId}/tree/${turnbar(item.name)}`} className="color-blue font-15" style={{"maxWidth":"100px"}}>{item.name}</Link>
<p className="f-wrap-alignCenter mt15"> <p className="f-wrap-alignCenter mt15">
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.last_commit.sha}`)}`} className="mr5 commitKey" style={{marginLeft:0}}>{item.last_commit && truncateCommitId(item.last_commit.sha)}</Link> <Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.last_commit.sha}`)}`} className="mr5 commitKey" style={{marginLeft:0}}>{item.last_commit && truncateCommitId(item.last_commit.sha)}</Link>
<span className="color-grey-3 hide-1 messages leftPoint">{item.last_commit && item.last_commit.message}</span> <span className="color-grey-3 hide-1 messages leftPoint">{item.last_commit && item.last_commit.message}</span>
<span className="color-grey-8 ml30">最后更新于{item.last_commit && item.last_commit.time_from_now}</span> <span className="color-grey-8 ml30">最后更新于{item.last_commit && item.last_commit.time_from_now}</span>
</p> </p>
@ -48,7 +48,7 @@ export default ((props)=>{
<span> <span>
{ {
(isManager || isDeveloper) && (projectDetail && projectDetail.type!==2) && (isManager || isDeveloper) && (projectDetail && projectDetail.type!==2) &&
<Link to={`/${owner}/${projectsId}/pulls/new/${item.name}`} className="mr20 color-blue mr30">创建合并请求</Link> <Link to={`/projects/${owner}/${projectsId}/pulls/new/${item.name}`} className="mr20 color-blue mr30">创建合并请求</Link>
} }
<Dropdown overlay={menu(item.zip_url,item.tar_url)} trigger={['click']} placement="bottomRight" className="color-green-file"> <Dropdown overlay={menu(item.zip_url,item.tar_url)} trigger={['click']} placement="bottomRight" className="color-green-file">
<a className="ant-dropdown-link"> <a className="ant-dropdown-link">

View File

@ -101,7 +101,7 @@ class CoderRootCommit extends Component{
// 切换分支 search:tag为根据标签搜索 // 切换分支 search:tag为根据标签搜索
changeBranch=(value)=>{ changeBranch=(value)=>{
const { projectsId , owner } = this.props.match.params; const { projectsId , owner } = this.props.match.params;
this.props.history.push(`/${owner}/${projectsId}/commits/branch/${value}`); this.props.history.push(`/projects/${owner}/${projectsId}/commits/branch/${value}`);
} }
ChangePage=(page)=>{ ChangePage=(page)=>{
@ -141,13 +141,13 @@ class CoderRootCommit extends Component{
return( return(
<div key={k}> <div key={k}>
<AlignTop> <AlignTop>
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="commitKey" style={{marginLeft:0,marginTop:"3px"}}>{truncateCommitId(`${item.sha}`)}</Link> <Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="commitKey" style={{marginLeft:0,marginTop:"3px"}}>{truncateCommitId(`${item.sha}`)}</Link>
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="commitDesc">{item.message}</Link> <Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="commitDesc">{item.message}</Link>
</AlignTop> </AlignTop>
<p className="f-wrap-alignCenter mt15"> <p className="f-wrap-alignCenter mt15">
{ {
item.id ? item.id ?
<Link to={`/${item.login}`} className="show-user-link"> <Link to={`/users/${item.login}`} className="show-user-link">
{item.image_url?<img src={getImageUrl(`/${item.image_url}`)} alt="" width="28px" height="28px" className="mr15 radius"/>:""} {item.image_url?<img src={getImageUrl(`/${item.image_url}`)} alt="" width="28px" height="28px" className="mr15 radius"/>:""}
<label className="font-14 color-grey-6" style={{verticalAlign:'middle'}}>{item.name ?`${item.name}:`:""}提交于 {item.time_from_now}</label> <label className="font-14 color-grey-6" style={{verticalAlign:'middle'}}>{item.name ?`${item.name}:`:""}提交于 {item.time_from_now}</label>
</Link>: </Link>:

View File

@ -1,6 +1,6 @@
import React, { Component } from "react"; import React, { Component } from "react";
import { Popconfirm , Select } from "antd"; import { Popconfirm , Select } from "antd";
import "./list.scss"; import "./list.css";
import axios from "axios"; import axios from "axios";
import Meditor from "../Newfile/m_editor"; import Meditor from "../Newfile/m_editor";
import RenderHtml from "../../components/render-html"; import RenderHtml from "../../components/render-html";
@ -149,7 +149,7 @@ class CoderRootFileDetail extends Component {
.then((result) => { .then((result) => {
if (result) { if (result) {
this.props.showNotification("删除成功!"); this.props.showNotification("删除成功!");
this.props.history.push(`/${owner}/${projectsId}`); this.props.history.push(`/projects/${owner}/${projectsId}`);
} }
}) })
.catch((error) => { .catch((error) => {

View File

@ -87,57 +87,57 @@ class CoderRootIndex extends Component{
<Top {...this.props} {...this.state}/> <Top {...this.props} {...this.state}/>
<Switch {...this.props}> <Switch {...this.props}>
{/* 新建文件 */} {/* 新建文件 */}
<Route path="/:owner/:projectsId/:branch/newfile/:path" <Route path="/projects/:owner/:projectsId/:branch/newfile/:path"
render={ render={
(props) => (<FileNew {...this.props} {...props} {...this.state} />) (props) => (<FileNew {...this.props} {...props} {...this.state} />)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/:branch/uploadfile" <Route path="/projects/:owner/:projectsId/:branch/uploadfile"
render={ render={
(props) => (<UploadFile {...this.props} {...props} {...this.state} />) (props) => (<UploadFile {...this.props} {...props} {...this.state} />)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/:branch/newfile" <Route path="/projects/:owner/:projectsId/:branch/newfile"
render={ render={
(props) => (<FileNew {...this.props} {...props} {...this.state} getTopCount={this.getTopCount} />) (props) => (<FileNew {...this.props} {...props} {...this.state} getTopCount={this.getTopCount} />)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/commits/branch/:branchName" <Route path="/projects/:owner/:projectsId/commits/branch/:branchName"
render={ render={
() => (<CoderRootCommit {...this.props} {...this.state} commit_class="main" getTopCount={this.getTopCount} />) () => (<CoderRootCommit {...this.props} {...this.state} commit_class="main" getTopCount={this.getTopCount} />)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/commits/:sha" <Route path="/projects/:owner/:projectsId/commits/:sha"
render={ render={
(props) => (<Diff {...this.props} {...props} {...this.state}/>) (props) => (<Diff {...this.props} {...props} {...this.state}/>)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/commits" <Route path="/projects/:owner/:projectsId/commits"
render={ render={
() => (<CoderRootCommit {...this.props} {...this.state} commit_class="main" getTopCount={this.getTopCount} />) () => (<CoderRootCommit {...this.props} {...this.state} commit_class="main" getTopCount={this.getTopCount} />)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/releases/:versionId/update" <Route path="/projects/:owner/:projectsId/releases/:versionId/update"
render={ render={
(props) => (<CoderRootVersionUpdate {...this.props} {...this.state} {...props} />) (props) => (<CoderRootVersionUpdate {...this.props} {...this.state} {...props} />)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/releases/new" <Route path="/projects/:owner/:projectsId/releases/new"
render={ render={
() => (<CoderRootVersionNew {...this.props} {...this.state} />) () => (<CoderRootVersionNew {...this.props} {...this.state} />)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/releases" <Route path="/projects/:owner/:projectsId/releases"
render={ render={
() => (<CoderRootVersion {...this.props} {...this.state} />) () => (<CoderRootVersion {...this.props} {...this.state} />)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/tags" <Route path="/projects/:owner/:projectsId/tag"
render={ render={
() => (<CoderRootTag {...this.props} {...this.state} />) () => (<CoderRootTag {...this.props} {...this.state} />)
} }
></Route> ></Route>
<Route path="/:owner/:projectsId/branches" <Route path="/projects/:owner/:projectsId/branchs"
render={ render={
() => (<CoderRootBranch {...this.props} {...this.state} />) () => (<CoderRootBranch {...this.props} {...this.state} />)
} }

View File

@ -49,7 +49,7 @@ export default (( props, { projectDetail }) => {
<span className="font-16">{item.name}</span> <span className="font-16">{item.name}</span>
</span> </span>
<span className="ul_tbody_third"> <span className="ul_tbody_third">
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.id}`)}`} className="commitKey" style={{ "marginLeft": 0 }}>{truncateCommitId(`${item.id}`)}</Link> <Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.id}`)}`} className="commitKey" style={{ "marginLeft": 0 }}>{truncateCommitId(`${item.id}`)}</Link>
</span> </span>
<span className="ul_tbody_forth"> <span className="ul_tbody_forth">
<a href={item.tarball_url} style={{ color: "#4CC1DA" }} className="mr30"><i className="iconfont icon-TAR font-18 mr5"></i>TAR</a> <a href={item.tarball_url} style={{ color: "#4CC1DA" }} className="mr30"><i className="iconfont icon-TAR font-18 mr5"></i>TAR</a>

View File

@ -1,13 +1,10 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Spin, Tooltip } from 'antd'; import { Spin, Tooltip , Button } from 'antd';
import { Link, Route, Switch } from 'react-router-dom'; import { Link, Route, Switch } from 'react-router-dom';
import { Content, AlignTop } from '../Component/layout'; import { Content , AlignTop } from '../Component/layout';
import DetailBanner from './sub/DetailBanner'; import DetailBanner from './sub/DetailBanner';
import '../css/index.scss' import '../css/index.scss'
import './list.scss'; import './list.css';
import { ImageLayerOfCommentHOC } from "../../modules/page/layers/ImageLayerOfCommentHOC";
import Loadable from 'react-loadable'; import Loadable from 'react-loadable';
import Loading from '../../Loading'; import Loading from '../../Loading';
@ -106,12 +103,12 @@ const Contribute = Loadable({
}) })
const CoderRootCommit = Loadable({ const CoderRootCommit = Loadable({
loader: () => import('./CoderRootCommit'), loader: () => import('./CoderRootCommit'),
loading: Loading, loading: Loading,
}) })
const CoderDepot = Loadable({ const CoderDepot = Loadable({
loader: () => import('./CoderDepot'), loader: () => import('./CoderDepot'),
loading: Loading, loading: Loading,
}) })
const TrendsIndex = Loadable({ const TrendsIndex = Loadable({
@ -130,40 +127,30 @@ const Source = Loadable({
const DevIndex = Loadable({ const DevIndex = Loadable({
loader: () => import('../DevOps/Index'), loader: () => import('../DevOps/Index'),
loading: Loading, loading: Loading,
}); })
const Wiki = Loadable({
loader: () => import('../Wiki/Index'),
loading: Loading,
});
const WikiEdit = Loadable({
loader: () => import('../Wiki/EditWiki'),
loading: Loading,
});
/** /**
* permissionManager:管理员Reporter报告人员(只有读取权限)Developer开发人员除不能设置仓库信息外 * permissionManager:管理员Reporter报告人员(只有读取权限)Developer开发人员除不能设置仓库信息外
*/ */
function checkPathname(projectsId, owner, pathname) { function checkPathname(projectsId,owner,pathname){
let name = ""; let name = "";
if (pathname && pathname !== `/${owner}/${projectsId}`) { if(pathname && pathname !== `/projects/${owner}/${projectsId}`){
let url = pathname.split(`/${owner}/${projectsId}`)[1] || ""; let url = pathname.split(`/projects/${owner}/${projectsId}`)[1];
if (url.indexOf("/about") > -1) { if(url.indexOf("/about")>-1){
name = "about" name="about"
} else if (url.indexOf("/issues") > -1 || url.indexOf("Milepost") > 0) { }else if(url.indexOf("/issues")>-1 ||url.indexOf("Milepost") > 0){
name = "issues"; name = "issues";
} else if (url.indexOf("/pulls") > -1) { }else if(url.indexOf("/pulls")>-1){
name = "pulls" name="pulls"
} else if (url.indexOf("/milestones") > -1) { }else if(url.indexOf("/milestones")>-1){
name = "milestones" name="milestones"
} else if (url.indexOf("/activity") > -1) { }else if(url.indexOf("/activity")>-1){
name = "activity" name="activity"
} else if (url.indexOf("/settings") > -1) { }else if(url.indexOf("/setting")>-1){
name = "settings" name="setting"
} else if (url.indexOf(`/devops`) > -1) { }else if(url.indexOf(`/devops`)>-1){
name = "devops" name="devops"
} else if (url.indexOf(`/source`) > -1) { }else if(url.indexOf(`/source`)>-1){
name = "source" name="source"
} else if (url.indexOf(`/wiki`) > -1) {
name = "wiki"
} }
} }
return name; return name;
@ -186,15 +173,15 @@ class Detail extends Component {
branchs: undefined, branchs: undefined,
branchList: undefined, branchList: undefined,
project: null, project: null,
firstSync: false, firstSync:false,
secondSync: false, secondSync:false,
open_devops: false, open_devops:false,
forkSpin: false, forkSpin:false,
// 默认分支 // 默认分支
defaultBranch: undefined, defaultBranch:undefined,
// 非本平台项目 // 非本平台项目
platform: false platform:false
} }
} }
@ -211,38 +198,36 @@ class Detail extends Component {
} }
getProject = (num) => { getProject = (num) => {
const { projectsId, owner } = this.props.match.params; const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/simple.json`; const url = `/${owner}/${projectsId}/simple.json`;
axios.get(url).then((result) => { axios.get(url).then((result) => {
if (result && result.data) { if (result && result.data) {
this.setState({ this.setState({
project: result.data, project: result.data,
open_devops: result.data.open_devops, open_devops:result.data.open_devops,
platform: result.data.platform && result.data.platform !== 'educoder' platform:result.data.platform && result.data.platform !== 'educoder'
}) })
if (result.data.type !== 0 && result.data.mirror_status === 1) { if (result.data.type !== 0 && result.data.mirror_status === 1) {
console.log("--------start channel --------"); console.log("--------start channel --------");
// 是镜像项目,且未完成迁移 // 是镜像项目,且未完成迁移
this.canvasChannel(); this.canvasChannel();
if (num) { if(num){
this.setState({ this.setState({
secondSync: true, secondSync:true,
firstSync: false firsrtSync:false
}) })
} else { }else{
this.setState({ this.setState({
firstSync: true, firstSync:true,
secondSync: false secondSync:false
}) })
} }
} else if (result.data.mirror_status === 2) { }else{
this.deleteProjectBack();
} else {
this.getDetail(); this.getDetail();
this.setState({ this.setState({
firstSync: false, firsrtSync:false,
secondSync: false secondSync:false
}) })
} }
} }
@ -250,9 +235,9 @@ class Detail extends Component {
} }
// 工作流激活后修改状态 // 工作流激活后修改状态
changeOpenDevops = (flag) => { changeOpenDevops=(flag)=>{
this.setState({ this.setState({
open_devops: flag open_devops:flag
}) })
} }
canvasChannel = () => { canvasChannel = () => {
@ -262,7 +247,7 @@ class Detail extends Component {
var cable = actioncable.createConsumer(`wss://${name}/cable`); var cable = actioncable.createConsumer(`wss://${name}/cable`);
this.canvasChannel1 = cable.subscriptions.create({ this.canvasChannel1 = cable.subscriptions.create({
channel: `MirrorProjectChannel`, channel: `MirrorProjectChannel`,
id: project && project.id id: project && project.identifier
}, { }, {
connected: () => { connected: () => {
console.log("###### channel connected! ######"); console.log("###### channel connected! ######");
@ -270,41 +255,16 @@ class Detail extends Component {
disconnected: () => { }, disconnected: () => { },
received: data => { received: data => {
console.log(`###### ---received data--- ######`); console.log(`###### ---received data--- ######`);
console.log(data);
if (data) { if (data) {
if ( data.project && data.project.mirror_status === 2) {
this.deleteProjectBack();
}
this.getDetail(); this.getDetail();
this.setState({
firstSync: false,
secondSync: false
});
cable.subscriptions.consumer.disconnect(); cable.subscriptions.consumer.disconnect();
} }
} }
}) })
} }
deleteProjectBack = () => {
const { history } = this.props;
const { projectsId, owner } = this.props.match.params;
axios.delete(`/${owner}/${projectsId}.json`).then(res => {
let hash = '/projects/mirror/new';
if (res && res.data) {
history.push({
pathname: hash,
mirror_status: 2
});
}
else {
window.location.hash = hash;
}
});
}
getDetail = () => { getDetail = () => {
const { projectsId, owner } = this.props.match.params; const { projectsId , owner } = this.props.match.params;
this.getBanner(); this.getBanner();
const url = `/${owner}/${projectsId}/detail.json`; const url = `/${owner}/${projectsId}/detail.json`;
axios.get(url).then((result) => { axios.get(url).then((result) => {
@ -321,29 +281,29 @@ class Detail extends Component {
watchers_count: result.data.watchers_count, watchers_count: result.data.watchers_count,
praises_count: result.data.praises_count, praises_count: result.data.praises_count,
forked_count: result.data.forked_count, forked_count: result.data.forked_count,
defaultBranch: result.data.default_branch defaultBranch:result.data.default_branch
}) })
} }
}).catch((error) => { }) }).catch((error) => { })
} }
// 获取动态导航栏菜单 // 获取动态导航栏菜单
getBanner() { getBanner(){
const { projectsId, owner } = this.props.match.params; const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/menu_list.json`; const url = `/${owner}/${projectsId}/menu_list.json`;
axios.get(url).then(result => { axios.get(url).then(result=>{
if (result) { if(result){
this.setState({ this.setState({
bannerList: result.data bannerList:result.data
}) })
} }
}).catch(error => { }) }).catch(error=>{})
} }
// 关注和取消关注 // 关注和取消关注
focusFunc = (flag) => { focusFunc = (flag) => {
const { platform } = this.state; const { platform } = this.state;
if (!platform) return; if(!platform)return;
const { project_id } = this.state; const { project_id } = this.state;
axios({ axios({
@ -358,15 +318,15 @@ class Detail extends Component {
this.setWatchersCount(result.data.watchers_count, result.data.watched); this.setWatchersCount(result.data.watchers_count, result.data.watched);
} }
}) })
.catch(error => { .catch(error => {
console.log(error); console.log(error);
}); });
} }
// 点赞和取消点赞 // 点赞和取消点赞
pariseFunc = (flag) => { pariseFunc = (flag) => {
const { platform } = this.state; const { platform } = this.state;
if (!platform) return; if(!platform)return;
const { project_id } = this.state; const { project_id } = this.state;
axios({ axios({
method: flag ? 'delete' : 'post', method: flag ? 'delete' : 'post',
@ -376,9 +336,9 @@ class Detail extends Component {
this.setPraisesCount(result.data.praises_count, result.data.praised) this.setPraisesCount(result.data.praises_count, result.data.praised)
} }
}) })
.catch(error => { .catch(error => {
console.log(error); console.log(error);
}); });
} }
setWatchersCount = (count, is_watched) => { setWatchersCount = (count, is_watched) => {
@ -398,24 +358,24 @@ class Detail extends Component {
// fork项目 // fork项目
forkFunc = () => { forkFunc = () => {
const { platform } = this.state; const { platform } = this.state;
if (!platform) return; if(!platform)return;
this.setState({ this.setState({
forkSpin: true forkSpin:true
}) })
const { current_user } = this.props const { current_user } = this.props
const { projectsId, owner } = this.props.match.params; const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/forks.json`; const url = `/${owner}/${projectsId}/forks.json`;
axios.post(url).then(result => { axios.post(url).then(result => {
if (result && result.data.status === 0) { if (result && result.data.status === 0) {
this.props.history.push(`/${current_user && current_user.login}/${result.data.identifier}`); this.props.history.push(`/projects/${current_user && current_user.login}/${result.data.identifier}`);
this.props.showNotification(result.data.message); this.props.showNotification(result.data.message);
} }
this.setState({ this.setState({
forkSpin: false forkSpin:false
}) })
}).catch(error => { }).catch(error => {
this.setState({ this.setState({
forkSpin: false forkSpin:false
}) })
}) })
} }
@ -423,8 +383,8 @@ class Detail extends Component {
// 同步镜像 // 同步镜像
synchronismMirror = () => { synchronismMirror = () => {
const { platform } = this.state; const { platform } = this.state;
if (!platform) return; if(!platform)return;
const { projectsId, owner } = this.props.match.params; const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/sync_mirror.json`; const url = `/${owner}/${projectsId}/sync_mirror.json`;
axios.post(url).then(result => { axios.post(url).then(result => {
if (result && result.data && result.data.status === 0) { if (result && result.data && result.data.status === 0) {
@ -438,352 +398,330 @@ class Detail extends Component {
}) })
} }
textFunc = (forked_from_project_id, fork_info) => { textFunc = (forked_from_project_id,fork_info)=>{
let type = fork_info && fork_info.fork_project_user_type; let type = fork_info && fork_info.fork_project_user_type;
return forked_from_project_id && fork_info ? return forked_from_project_id && fork_info ?
<div className="color-grey-9 df"> <div className="color-grey-9 df">
<span>复刻自</span> <span>复刻自</span>
<Link to={`/${fork_info.fork_project_user_login}`} className="show-user-link color-grey-6 ml5">{fork_info.fork_project_user_name}</Link> <Link to={`${type ==="Organization" ? "/organize":'/users'}/${fork_info.fork_project_user_login}`} className="show-user-link color-grey-6 ml5">{fork_info.fork_project_user_name}</Link>
<span> / </span> <span> / </span>
<Link to={`/${fork_info.fork_project_user_login}/${fork_info.fork_project_identifier}`} className="color-grey-6 task-hide flex1" style={{ maxWidth: "400px" }} title={fork_info.fork_form_name}>{fork_info.fork_form_name}</Link> <Link to={`/projects/${fork_info.fork_project_user_login}/${fork_info.fork_project_identifier}`} className="color-grey-6 task-hide flex1" style={{maxWidth:"400px"}} title={fork_info.fork_form_name}>{fork_info.fork_form_name}</Link>
</div> : "" </div> : ""
} }
render() { render() {
const { projectDetail, watchers_count, praises_count, const { projectDetail, watchers_count, praises_count,
forked_count, firstSync, secondSync, forked_count, firstSync , secondSync ,
isManager, watched, praised, isManager, watched, praised,
project, open_devops, platform, defaultBranch, bannerList, forkSpin } = this.state; project , open_devops , platform , defaultBranch , bannerList , forkSpin } = this.state;
const url = this.props.history.location.pathname; const url = this.props.history.location.pathname;
const urlArr = url.split("/"); const urlArr = url.split("/");
const urlFlag = (urlArr.length === 3); const urlFlag = (urlArr.length === 3);
const { projectsId, owner } = this.props.match.params; const { projectsId , owner } = this.props.match.params;
const { current_user } = this.props; const { current_user } = this.props;
let pathname = checkPathname(projectsId, owner, url); let pathname = checkPathname(projectsId,owner,url);
const { state } = this.props.history.location; const { state } = this.props.history.location;
const common = { const common = {
getDetail: this.getDetail, getDetail: this.getDetail,
changeOpenDevops: this.changeOpenDevops, changeOpenDevops:this.changeOpenDevops,
defaultBranch defaultBranch
} }
return ( return (
<div> <div>
<div className="detailHeader-wrapper"> <div className="detailHeader-wrapper">
<div className="normal"> <div className="normal">
<AlignTop style={{ padding: "18px 0px 10px", justifyContent: "space-between" }}> <AlignTop style={{padding:"20px 0px 10px",justifyContent:"space-between"}}>
<div> <div>
<AlignTop> <AlignTop>
<div className="projectallName"> <div className="projectallName">
{project && project.author && {project && project.author &&
<Link to={`/${project.author.login}`}>{project.author.name}</Link> <Link to={`${project.author.type ==="Organization" ? "/organize":'/users'}/${project.author.login}`}>{project.author.name}</Link>
} }
<span className="ml5 mr5">/</span> <span className="ml5 mr5">/</span>
<Link to={`/${owner}/${projectsId}`} className="projectN mt6">{projectDetail && projectDetail.name}</Link> <Link to={`/projects/${owner}/${projectsId}`} className="projectN mt6">{projectDetail && projectDetail.name}</Link>
</div> </div>
{projectDetail && projectDetail.private && <span className="privateTag mt6">私有</span>} { projectDetail && projectDetail.private && <span className="privateTag mt6">私有</span>}
</AlignTop> </AlignTop>
<div className="mt8"> <div className="mt8">
{ {
projectDetail && projectDetail.forked_from_project_id && projectDetail.fork_info ? projectDetail && projectDetail.forked_from_project_id && projectDetail.fork_info ?
this.textFunc(projectDetail.forked_from_project_id, projectDetail.fork_info) this.textFunc(projectDetail.forked_from_project_id,projectDetail.fork_info)
: "" :""
} }
{ {
projectDetail && projectDetail.type && projectDetail.type !== 0 ? projectDetail && projectDetail.type && projectDetail.type !== 0 ?
<span className="color-grey-9">导入于 <a className="color-grey-6" target="_blank" href={projectDetail.mirror_url}>{projectDetail.mirror_url}</a></span> <span className="color-grey-9">镜像自 <a className="color-grey-6" target="_blank" href={projectDetail.mirror_url}>{projectDetail.mirror_url}</a></span>
: "" :""
} }
</div> </div>
</div> </div>
<div> <div>
{ {
firstSync ? "" : firstSync ? "":
<span className="df"> <span className="df">
{
((current_user && current_user.admin) || isManager) && (projectDetail && projectDetail.type && projectDetail.type === 2) ?
<a className="synchronism ml30" onClick={this.synchronismMirror}>同步镜像</a> : ""
}
<Button className="detail_tag_btn">
<a className="detail_tag_btn_name" style={{cursor:platform?"pointer":"default"}} onClick={() => this.focusFunc(watched)}>
<i className={watched ? "iconfont icon-shixing color-orange font-16 mr3":"iconfont icon-kongxing color-grey-9 font-16 mr3"}></i>
<span>{watched ? '取消关注' : '关注'}</span>
</a>
{ {
((current_user && current_user.admin) || isManager) && (projectDetail && projectDetail.type && projectDetail.type === 2) ? watchers_count > 0 ?
<a className="synchronism ml30" onClick={this.synchronismMirror}>同步镜像</a> : "" platform ?
<Link className="detail_tag_btn_count" style={{color:`${watched?"#2878FF":"#666"}`}} to={platform?{ pathname: `/projects/${owner}/${projectsId}/watchers`, state }:""}>
{watchers_count}
</Link>
:
<span className="detail_tag_btn_count">{watchers_count}</span>
:""
} }
<span className="detail_tag_btn"> </Button>
<a className="detail_tag_btn_name" style={{ cursor: platform ? "pointer" : "default" }} onClick={() => this.focusFunc(watched)}> <Button className="detail_tag_btn">
<i className={watched ? "iconfont icon-shixing color-orange font-16 mr3" : "iconfont icon-kongxing color-grey-9 font-16 mr3"}></i> <a className="detail_tag_btn_name" style={{cursor:platform?"pointer":"default"}} onClick={() => this.pariseFunc(praised)}>
<span>{watched ? '取消关注' : '关注'}</span> <i className={praised ? "iconfont icon-weibiaoti105 color-orange font-14 mr3":"iconfont icon-guanzhu color-grey-9 font-14 mr3"}></i>
<span>{praised ? '取消点赞' : '点赞'}</span>
</a>
{
praises_count > 0 ?
platform ?
<Link className="detail_tag_btn_count" style={{color:`${praised?"#2878FF":"#666"}`}} to={{ pathname: `/projects/${owner}/${projectsId}/stargazers`, state }}>
{praises_count}
</Link>:
<span className="detail_tag_btn_count">{praises_count}</span>
:""
}
</Button>
<Button className="detail_tag_btn" loading={forkSpin}>
<Tooltip title="复刻是fork的中文名即复制代码仓库" placement="bottom">
<a className="detail_tag_btn_name" style={{cursor:platform?"pointer":"default"}} onClick={this.forkFunc}>
<i className="iconfont icon-fork color-grey-9 mr3"></i>
</a> </a>
{ </Tooltip>
watchers_count > 0 ? {
platform ? forked_count > 0 ?
<Link className="detail_tag_btn_count" style={{ color: `#666` }} to={platform ? { pathname: `/${owner}/${projectsId}/following`, state } : ""}> platform ?
{watchers_count} <Link className="detail_tag_btn_count" to={{ pathname: `/projects/${owner}/${projectsId}/fork_users`, state }}>
</Link> {forked_count}
: </Link>
<span className="detail_tag_btn_count">{watchers_count}</span> :
: "" <span className="detail_tag_btn_count">{forked_count}</span>
} :""
</span> }
<span className="detail_tag_btn"> </Button>
<a className="detail_tag_btn_name" style={{ cursor: platform ? "pointer" : "default" }} onClick={() => this.pariseFunc(praised)}> </span>
<i className={praised ? "iconfont icon-weibiaoti105 color-orange font-14 mr3" : "iconfont icon-guanzhu color-grey-9 font-14 mr3"}></i>
<span>{praised ? '取消点赞' : '点赞'}</span>
</a>
{
praises_count > 0 ?
platform ?
<Link className="detail_tag_btn_count" style={{ color: `#666` }} to={{ pathname: `/${owner}/${projectsId}/stargazers`, state }}>
{praises_count}
</Link> :
<span className="detail_tag_btn_count">{praises_count}</span>
: ""
}
</span>
<span className="detail_tag_btn" loading={forkSpin}>
<Tooltip title="复刻是fork的中文名即复制代码仓库" placement="bottom">
<a className="detail_tag_btn_name" style={{ cursor: platform ? "pointer" : "default" }} onClick={this.forkFunc}>
<i className="iconfont icon-fork color-grey-9 mr3 font-16"></i><span></span>
</a>
</Tooltip>
{
forked_count > 0 ?
platform ?
<Link className="detail_tag_btn_count" to={{ pathname: `/${owner}/${projectsId}/members`, state }}>
{forked_count}
</Link>
:
<span className="detail_tag_btn_count">{forked_count}</span>
: ""
}
</span>
</span>
} }
</div> </div>
</AlignTop> </AlignTop>
{ {
firstSync ? "" : firstSync ? "" :
<DetailBanner <DetailBanner
history={this.props.history} history={this.props.history}
list={bannerList} list={bannerList}
owner={owner} owner={owner}
projectsId={projectsId} projectsId={projectsId}
pathname={pathname} pathname={pathname}
state={state} state={state}
projectDetail={projectDetail} projectDetail={projectDetail}
open_devops={open_devops} open_devops={open_devops}
platform={platform} platform={platform}
urlFlag={urlFlag} urlFlag={urlFlag}
isManager={isManager} isManager={isManager}
/> />
} }
</div> </div>
</div> </div>
{ {
firstSync ? firstSync ?
<Content className="spincontent"> <Content className="spincontent">
<Spin className="spinstyle" tip={project && `正在从 ${project.mirror_url} 迁移`} size="large" /> <Spin className="spinstyle" tip={project && `正在从 ${project.mirror_url} 迁移`} size="large" />
</Content> </Content>
: :
<Spin spinning={secondSync} className="spinstyle" tip="正在同步镜像" size="large"> <Spin spinning={secondSync} className="spinstyle" tip="正在同步镜像" size="large">
<Switch {...this.props}> <Switch {...this.props}>
{/* 资源 */} {/* 资源 */}
<Route path="/:owner/:projectsId/source" <Route path="/projects/:owner/:projectsId/source"
render={ render={
() => (<Source {...this.props} {...this.state} {...common} />) () => (<Source {...this.props} {...this.state} {...common} />)
} }
></Route> ></Route>
{/* 主页 */} {/* 主页 */}
<Route path="/:owner/:projectsId/about" <Route path="/projects/:owner/:projectsId/about"
render={ render={
() => (<DevAbout {...this.props} {...this.state} {...common} />) () => (<DevAbout {...this.props} {...this.state} {...common} />)
} }
></Route> ></Route>
{/* wiki新增文件 */} {/* 工作流 */}
<Route path="/:owner/:projectsId/wiki/add" <Route path="/projects/:owner/:projectsId/devops"
render={ render={
() => (<WikiEdit {...this.props} {...this.state} {...common} />) () => (<DevIndex {...this.props} {...this.state} {...common} />)
} }
></Route> ></Route>
{/* wiki编辑文件 */} {/* 标签列表 */}
<Route path="/:owner/:projectsId/wiki/edit/:wikiName" <Route path="/projects/:owner/:projectsId/issues/tags"
render={ render={
() => (<WikiEdit {...this.props} {...this.state} {...common} />) (props) => (<TagList {...this.props} {...props} {...this.state} {...common} />)
} }
></Route> ></Route>
{/* wiki */} {/* 仓库设置 */}
<Route path="/:owner/:projectsId/wiki" <Route path="/projects/:owner/:projectsId/setting"
render={ render={
() => (<Wiki {...this.props} {...this.state} {...common} />) (props) => (<Setting {...this.props} {...props} {...this.state} {...common} />)
} }
></Route> ></Route>
{/* 工作流 */} {/* 任务详情 */}
<Route path="/:owner/:projectsId/devops" <Route path="/projects/:owner/:projectsId/issues/:orderId/detail"
render={ render={
() => (<DevIndex {...this.props} {...this.state} {...common} />) (props) => (<OrderDetail {...this.props} {...this.state} {...props} {...common} />)
} }
></Route> ></Route>
{/* 标签列表 */} {/*修改里程碑*/}
<Route path="/:owner/:projectsId/issues/tags" <Route path="/projects/:owner/:projectsId/milestones/:meilid/edit"
render={ render={
(props) => (<TagList {...this.props} {...props} {...this.state} {...common} />) (props) => (<OrderupdateMilepost {...this.props} {...props} {...this.state} {...common} />)
} }
></Route> ></Route>
{/* 仓库设置 */} {/* 新建里程碑 */}
<Route path="/:owner/:projectsId/settings" <Route path="/projects/:owner/:projectsId/milestones/new"
render={ render={
(props) => (<Setting {...this.props} {...props} {...this.state} {...common} />) (props) => (<OrdernewMilepost {...this.props} {...props} {...this.state} {...common} />)
} }
></Route> ></Route>
{/*里程碑详情*/}
<Route path="/projects/:owner/:projectsId/milestones/:meilid"
render={
(props) => (<MilepostDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 里程碑 */}
<Route path="/projects/:owner/:projectsId/milestones"
render={
(props) => (<OrderMilepost {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 里程碑页面新建任务 */}
<Route path="/projects/:owner/:projectsId/issues/:milepostId/new"
render={
(props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 新建任务 */}
<Route path="/projects/:owner/:projectsId/issues/new"
render={
(props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 修改详情 */}
<Route path="/projects/:owner/:projectsId/issues/:orderId/updatedetail"
render={
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 复制详情 */}
<Route path="/projects/:owner/:projectsId/issues/:orderId/copyetail"
render={
(props) => (<OrdercopyDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 动态 */}
<Route path="/projects/:owner/:projectsId/activity"
render={
(props) => (<TrendsIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 代码Index */}
<Route path="/projects/:owner/:projectsId/issues"
render={
(props) => (<OrderIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 新建合并请求 */}
<Route path="/projects/:owner/:projectsId/pulls/new/:branch"
render={
(props) => (<CreateMerge {...this.props} {...props} {...this.state} {...common} is_fork={true} />)
}
></Route>
<Route path="/projects/:owner/:projectsId/pulls/new"
render={
(props) => (<CreateMerge {...this.props} {...props} {...this.state} {...common} is_fork={true} />)
}
></Route>
<Route path="/projects/:owner/:projectsId/pulls/:mergeId/UpdateMerge"
render={
(props) => (<UpdateMerge {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:owner/:projectsId/pulls/:mergeId/Messagecount"
render={
(props) => (<MessageCount {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:owner/:projectsId/pulls/:mergeId/MergeSubmit"
render={
(props) => (<MessageCount {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/*修改里程碑*/} <Route path="/projects/:owner/:projectsId/pulls"
<Route path="/:owner/:projectsId/milestones/:meilid/edit" render={
render={ (props) => (<MergeIndexDetail {...this.props} {...props} {...this.state} {...common} />)
(props) => (<OrderupdateMilepost {...this.props} {...props} {...this.state} {...common} />) }
} ></Route>
></Route> <Route path="/projects/:owner/:projectsId/watchers"
{/* 新建里程碑 */} render={
<Route path="/:owner/:projectsId/milestones/new" (props) => (<WatchUsers {...this.props} {...props} {...this.state} {...common} />)
render={ }
(props) => (<OrdernewMilepost {...this.props} {...props} {...this.state} {...common} />) ></Route>
} <Route path="/projects/:owner/:projectsId/stargazers"
></Route> render={
{/*里程碑详情*/} (props) => (<PraiseUsers {...this.props} {...props} {...this.state} {...common} />)
<Route path="/:owner/:projectsId/milestones/:meilid" }
render={ ></Route>
(props) => (<MilepostDetail {...this.props} {...props} {...this.state} {...common} />) <Route path="/projects/:owner/:projectsId/fork_users"
} render={
></Route> (props) => (<ForkUsers {...this.props} {...props} {...this.state} {...common} />)
{/* 里程碑 */} }
<Route path="/:owner/:projectsId/milestones" ></Route>
render={ {/* 贡献者列表 */}
(props) => (<OrderMilepost {...this.props} {...props} {...this.state} {...common} />) <Route path="/projects/:owner/:projectsId/contribute"
} render={
></Route> () => (<Contribute {...this.props} {...this.state} {...common} />)
{/* 里程碑页面新建任务 */} }
<Route path="/:owner/:projectsId/issues/:milepostId/new" ></Route>
render={
(props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 新建任务 */}
<Route path="/:owner/:projectsId/issues/new"
render={
(props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 修改详情 */}
<Route path="/:owner/:projectsId/issues/:orderId/updatedetail"
render={
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 复制详情 */}
<Route path="/:owner/:projectsId/issues/:orderId/copyetail"
render={
(props) => (<OrdercopyDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 任务详情 */}
<Route path="/:owner/:projectsId/issues/:orderId"
render={
(props) => (<OrderDetail {...this.props} {...this.state} {...props} {...common} />)
}
></Route>
{/* 动态 */}
<Route path="/:owner/:projectsId/activity"
render={
(props) => (<TrendsIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 代码Index */}
<Route path="/:owner/:projectsId/issues"
render={
(props) => (<OrderIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 新建合并请求 */}
<Route path="/:owner/:projectsId/pulls/new/:branch"
render={
(props) => (<CreateMerge {...this.props} {...props} {...this.state} {...common} is_fork={true} />)
}
></Route>
<Route path="/:owner/:projectsId/pulls/new"
render={
(props) => (<CreateMerge {...this.props} {...props} {...this.state} {...common} is_fork={true} />)
}
></Route>
<Route path="/:owner/:projectsId/pulls/:mergeId/UpdateMerge"
render={
(props) => (<UpdateMerge {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/:owner/:projectsId/pulls/:mergeId/Messagecount"
render={
(props) => (<MessageCount {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/:owner/:projectsId/pulls/:mergeId/MergeSubmit"
render={
(props) => (<MessageCount {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/:owner/:projectsId/pulls" {/* 代码库----详情页面 */}
render={ <Route path="/projects/:owner/:projectsId/commits/branch/:branchName"
(props) => (<MergeIndexDetail {...this.props} {...props} {...this.state} {...common} />) render={
} (props) => (<CoderRootCommit {...this.props} {...props} {...this.state} {...common}/>)
></Route> }
<Route path="/:owner/:projectsId/following" ></Route>
render={ <Route path="/projects/:owner/:projectsId/tree/:branchName"
(props) => (<WatchUsers {...this.props} {...props} {...this.state} {...common} />) render={
} (props) => (<CoderDepot {...this.props} {...props} {...this.state} {...common}/>)
></Route> }
<Route path="/:owner/:projectsId/stargazers" ></Route>
render={ <Route path="/projects/:owner/:projectsId/:subIndex"
(props) => (<PraiseUsers {...this.props} {...props} {...this.state} {...common} />) render={
} (props) => (<CoderRootIndex {...this.props} {...props} {...this.state} {...common}/>)
></Route> }
<Route path="/:owner/:projectsId/members" ></Route>
render={ <Route path="/projects/:owner/:projectsId"
(props) => (<ForkUsers {...this.props} {...props} {...this.state} {...common} />) render={
} (props) => (<CoderDepot {...this.props} {...props} {...this.state} {...common}/>)
></Route> }
{/* 贡献者列表 */} ></Route>
<Route path="/:owner/:projectsId/contribute" </Switch>
render={ </Spin>
() => (<Contribute {...this.props} {...this.state} {...common} />)
}
></Route>
{/* 代码库----详情页面 */}
<Route path="/:owner/:projectsId/commits/branch/:branchName"
render={
(props) => (<CoderRootCommit {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/:owner/:projectsId/tree/:branchName"
render={
(props) => (<CoderDepot {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/:owner/:projectsId/:subIndex"
render={
(props) => (<CoderRootIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/:owner/:projectsId"
render={
(props) => (<CoderDepot {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
</Switch>
</Spin>
} }
</div> </div>
) )
} }
} }
export default ImageLayerOfCommentHOC({ export default Detail;
imgSelector: ".imageLayerParent img, .imageLayerParent .imageTarget",
parentSelector: ".newContainer",
})(Detail);

View File

@ -1,28 +0,0 @@
import React from 'react';
import { Route, Switch } from "react-router-dom";
import { withRouter } from "react-router";
import Loadable from "react-loadable";
import Loading from "../../Loading";
import { SnackbarHOC } from "educoder";
import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC";
import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC";
// forge项目详情
const ProjectDetail = Loadable({
loader: () => import("../Main/Detail"),
loading: Loading,
});
export default withRouter(
(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC((props) => {
return (
<Switch>
<Route
path="/:owner/:projectsId"
render={(p) => (
<ProjectDetail {...props} {...p} />
)}
></Route>
</Switch>
)
}))))
)

View File

@ -12,19 +12,19 @@ class DetailTop extends Component {
{ {
platform ? platform ?
<React.Fragment> <React.Fragment>
<Link to={`/${owner}/${projectsId}/commits`} className={pathname.indexOf("/commits") > 0 ? "active" : ""}> <Link to={`/projects/${owner}/${projectsId}/commits`} className={pathname.indexOf("/commits") > 0 ? "active" : ""}>
<i className="iconfont icon-tijiaojilu font-20 mr3 font-bd"></i> <i className="iconfont icon-tijiaojilu font-20 mr3 font-bd"></i>
<span>{(coderCount && coderCount.commits_count) || 0}</span> <span>{(coderCount && coderCount.commits_count) || 0}</span>
</Link> </Link>
<Link to={`/${owner}/${projectsId}/branches`} className={pathname.indexOf("/branches") > 0 ? "active" : ""}> <Link to={`/projects/${owner}/${projectsId}/branchs`} className={pathname.indexOf("/branchs") > 0 ? "active" : ""}>
<i className="iconfont icon-fenzhi1 font-18 mr3"></i> <i className="iconfont icon-fenzhi1 font-18 mr3"></i>
<span>{(coderCount && coderCount.branches_count) || 0}</span> <span>{(coderCount && coderCount.branches_count) || 0}</span>
</Link> </Link>
<Link to={`/${owner}/${projectsId}/tags`} className={pathname.indexOf("/tags") > 0 ? "active" : ""}> <Link to={`/projects/${owner}/${projectsId}/tag`} className={pathname.indexOf("/tag") > 0 ? "active" : ""}>
<i className="iconfont icon-biaoqian3 font-18 mr3"></i> <i className="iconfont icon-biaoqian3 font-18 mr3"></i>
<span>{(coderCount && coderCount.tags_count) || 0}</span> <span>{(coderCount && coderCount.tags_count) || 0}</span>
</Link> </Link>
<Link to={`/${owner}/${projectsId}/releases`} className={pathname.indexOf("/releases") > 0 ? "active" : ""}> <Link to={`/projects/${owner}/${projectsId}/releases`} className={pathname.indexOf("/releases") > 0 ? "active" : ""}>
<i className="iconfont icon-fahangban font-18 mr3"></i> <i className="iconfont icon-fahangban font-18 mr3"></i>
<span>{(coderCount && coderCount.version_releasesed_count) || 0}</span> <span>{(coderCount && coderCount.version_releasesed_count) || 0}</span>
</Link> </Link>

View File

@ -59,7 +59,7 @@ export default ({ match , history }) => {
{commit && commit.message && {commit && commit.message &&
<pre className="task-hide" style={{marginBottom:"0px",height:"28px",whiteSpace:"pre-wrap"}}>{commit.message}</pre> <pre className="task-hide" style={{marginBottom:"0px",height:"28px",whiteSpace:"pre-wrap"}}>{commit.message}</pre>
} }
<Button type="primary" onClick={()=>{history.push(`/${owner}/${projectsId}/tree/${truncateCommitId(sha)}`)}} className="ml30">浏览代码</Button> <Button type="primary" onClick={()=>{history.push(`/projects/${owner}/${projectsId}/tree/${truncateCommitId(sha)}`)}} className="ml30">浏览代码</Button>
</div> </div>
</div> </div>
<div className="f-wrap-between" style={{ alignItems: "center" }}> <div className="f-wrap-between" style={{ alignItems: "center" }}>

View File

@ -1,19 +1,18 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { Menu, Input , Spin, Pagination , Popover , Select } from 'antd'; import { Menu, Input , Spin, Pagination , Popover , Select } from 'antd';
import Slider from "react-slick"; import Slider from "react-slick";
import { getImageUrl } from 'educoder'; import { getImageUrl } from 'educoder';
import "slick-carousel/slick/slick.css"; import "slick-carousel/slick/slick.css";
import "slick-carousel/slick/slick-theme.css"; import "slick-carousel/slick/slick-theme.css";
import '../css/index.scss' import '../css/index.scss'
import './list.scss'; import './list.css';
import './Index.scss'; import './Index.scss';
import ListItem from './IndexItem' import ListItem from './IndexItem'
import axios from 'axios'; import axios from 'axios';
import img_new from '../Images/new.png'; import img_new from '../Images/new.png';
import img_array from '../Images/array.png'; import img_array from '../Images/array.png';
import banner from '../Images/banner_list.jpg'; import banner from '../Images/banner_list.jpg';
import CheckProfile from '../Component/ProfileModal/Profile';
const Search = Input.Search; const Search = Input.Search;
class Index extends Component { class Index extends Component {
@ -229,7 +228,7 @@ class Index extends Component {
} }
getoDetail=(login,identifier)=>{ getoDetail=(login,identifier)=>{
this.props.history.push(`/${login}/${identifier}`); this.props.history.push(`/projects/${login}/${identifier}`);
} }
// 选择语言类别 // 选择语言类别
@ -255,14 +254,10 @@ class Index extends Component {
newItem = ()=>{ newItem = ()=>{
return( return(
<ul> <Menu>
<li> <Menu.Item key="created_mirror"><Link to={`/projects/mirror/new`}>新建镜像项目</Link></Menu.Item>
<CheckProfile {...this.props} sureFunc={()=>{this.props.history.push('/projects/deposit/new')}}>新建项目</CheckProfile> <Menu.Item key="created_deposit"><Link to={`/projects/deposit/new`}>新建托管项目</Link></Menu.Item>
</li> </Menu>
<li>
<CheckProfile {...this.props} sureFunc={()=>{this.props.history.push('/projects/mirror/new')}}>导入项目</CheckProfile>
</li>
</ul>
) )
} }
@ -392,13 +387,7 @@ class Index extends Component {
<div> <div>
{ {
current_user && current_user.login && current_user && current_user.login &&
<Popover <Popover content={this.newItem()} trigger={["click"]} placement='bottom' className="mr50">
overlayClassName="newPopUl"
content={this.newItem()}
trigger={["click"]}
placement='bottom'
className="mr50"
>
<a className="ant-dropdown-link"> <a className="ant-dropdown-link">
<span className="color-blue font-16"><img src={img_new} alt="" width="13px" /> 新建</span> <span className="color-blue font-16"><img src={img_new} alt="" width="13px" /> 新建</span>
</a> </a>

View File

@ -13,21 +13,6 @@
} }
} }
} }
.iconBtn{
i{
color: #666;
}
span{
margin-left: 4px;
color: #333!important;
&:last-child{
font-weight: 500;
}
}
&:hover span,&:hover i{
color: #466AFF!important;
}
}
/* recommandProjects */ /* recommandProjects */
.recommandProjects.slick-slider{ .recommandProjects.slick-slider{
width: 1230px; width: 1230px;
@ -123,77 +108,46 @@
margin: 0 auto; margin: 0 auto;
.panelmenu{ .panelmenu{
padding-top:30px; padding-top:30px;
.depotBtn{
.mr-5{
margin-right: -5px;
}
.ant-btn{
height: 32px;
line-height: 32px;
width: 83px;
text-align: center;
padding:0px ;
font-weight: 500;
font-size: 14px;
}
.ant-btn-default{
color: #333;
border-color: #d0d0d0;
&:hover{
background: #F3F4F6;
}
}
.ant-btn-primary{
color: #fff;
background-color: #466AFF;
border: none;
&:hover{
background-color: rgba(70,106,255,0.85);
}
}
}
} }
.depotBtn,.addOptionBtn{ .addOptionBtn{
height: 32px;
line-height: 30px;
display: flex; display: flex;
border:1px solid #d9d9d9;
border-radius: 2px;
a{ a{
color: #333!important; padding:0px 13px;
font-weight: 500!important; color: rgba(0, 0, 0, 0.65);
border-radius: 5px; cursor: pointer;
width: 83px; }
height: 32px; & > a:first-child{
line-height: 30px; border-right: 1px solid #d9d9d9;
background: #fff; }
border: 1px solid #D0D0D0; & > a:last-child{
margin-right: 10px; border-right: none;
text-align: center;
&:hover,&:active{
background: #F3F4F6;
}
} }
} }
.infoCount{ .infoCount{
display: inline-block; display: inline-block;
width: 24px; padding:0px 5px;
text-align: center; height: 16px;
height: 24px; line-height: 16px;
line-height: 24px; background-color: #eee;
background-color:rgba(153, 153, 153, 0.13);; color:#999;
color:#666;
border-radius: 12px; border-radius: 12px;
margin-left: 6px; margin-left: 10px;
font-size: 12px; font-size: 12px;
} }
.attrPerson{ .attrPerson{
padding-top: 12px; padding-top: 15px;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
padding-bottom: 2px;
a{ a{
margin: 0px 17px 0px 0px; margin: 10px 10px 0px 0px;
img{ img{
border-radius: 50%; border-radius: 50%;
width: 40px; width: 35px;
height: 40px; height: 35px;
} }
&:nth-child(6){ &:nth-child(6){
margin-right: 0px; margin-right: 0px;
@ -202,15 +156,15 @@
} }
.progress{ .progress{
display: flex; display: flex;
border-radius: 2px; border-radius: 10px;
height: 11px; height: 7px;
margin-top: 12px; margin-top: 12px;
span{ span{
&:first-child{ &:first-child{
border-radius: 2px 0px 0px 2px; border-radius: 10px 0px 0px 10px;
} }
&:last-child{ &:last-child{
border-radius: 0px 2px 2px 0px; border-radius: 0px 10px 10px 0px;
} }
} }
} }
@ -230,11 +184,10 @@
padding-left: 15px; padding-left: 15px;
position: relative; position: relative;
min-width: 33.5%; min-width: 33.5%;
font-size: 12px;
font-weight: 400;
color: #666;
span{ span{
color: #666;
&:last-child{ &:last-child{
color: #999;
margin-left: 5px; margin-left: 5px;
} }
} }
@ -242,18 +195,18 @@
} }
.listtable{ .listtable{
margin-top: 20px; margin-top: 20px;
border:1px solid #d9d9d9;
border-radius: 4px;
.listtablehead{ .listtablehead{
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: flex-start; align-items: flex-start;
border-bottom: 1px solid #d9d9d9; border-bottom: 1px solid #d9d9d9;
padding:12px 20px 11px; padding:7px 20px;
border-radius: 4px 4px 0px 0px; border-radius: 4px 4px 0px 0px;
border: 1px solid rgba(42, 97, 255, 0.23); background-color: #FAFBFC;
background-color: #FAFCFF;
.ellipsistxt{ .ellipsistxt{
margin-top: 6px; margin-top: 6px;
cursor: pointer;
#ptxt{ #ptxt{
margin-bottom: 0px; margin-bottom: 0px;
word-break: break-all; word-break: break-all;
@ -274,37 +227,32 @@
overflow: hidden; overflow: hidden;
position: relative; position: relative;
padding-right:8px; padding-right:8px;
// &::after{ &::after{
// position: absolute; position: absolute;
// right: 0px; right: 0px;
// bottom: 0px; bottom: 0px;
// content:"..."; content:"...";
// } }
} }
} }
.ellipsis{ .ellipsis{
margin-left: 8px; margin-left: 8px;
cursor: pointer; cursor: pointer;
border-radius: 2px; border-radius: 2px;
height: 16px; background-color: #c1c1c1;
background: rgba(153, 153, 153, 0.2);
border-radius: 2px;
padding:0px 4px; padding:0px 4px;
height: 14px; height: 14px;
line-height: 14px; line-height: 14px;
margin-top: 9px; margin-top: 9px;
i{ i{
font-size: 15px!important; font-size: 15px!important;
color: #333; color: #fff;
height: 14px; height: 14px;
line-height: 14px; line-height: 14px;
} }
} }
} }
.listtablebody{ .listtablebody{
border-radius:0px 0px 4px 4px ;
border: 1px solid #D0D0D0;
border-top: none;
li.listtablepath{ li.listtablepath{
a{color: #40a9ff;} a{color: #40a9ff;}
p{ p{
@ -312,15 +260,12 @@
} }
} }
& > li{ & > li{
height: 38px; height: 42px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
border-bottom: 1px solid #d9d9d9; border-bottom: 1px solid #d9d9d9;
padding:0px 20px 0px 24px; padding:0px 20px 0px 24px;
&:hover{
background-color: #F3F4F6;
}
& > span:first-child{ & > span:first-child{
width: 30%; width: 30%;
overflow: hidden; overflow: hidden;
@ -347,10 +292,8 @@
.drawerBtn{ .drawerBtn{
position: fixed; position: fixed;
left: -13px; left: -13px;
width: 33px; border:1px solid rgb(207,205,223);
background: #FFFFFF; width: 34px;
box-shadow: 0px 0px 8px 3px rgba(0, 0, 0, 0.09);
border: 1px solid #666666;
border-radius: 0px 12px 12px 0px; border-radius: 0px 12px 12px 0px;
height: 70px; height: 70px;
top:50%; top:50%;
@ -358,63 +301,63 @@
cursor: pointer; cursor: pointer;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: flex-end;
justify-content: center; justify-content: center;
padding-left: 7px;
&:hover{ &:hover{
box-shadow: 0px 0px 8px 3px rgba(0, 0, 0, 0.09); box-shadow: 1px 0px 7px rgba(0,0,0,0.1);
} }
span{ span{
writing-mode: vertical-lr; writing-mode: vertical-lr;
color: #333; color: #202429;
width: 25px; width: 25px;
font-size: 14px;
} }
i{ i{
color: #333; color: #24292e;
height: 14px; height: 18px;
line-height: 14px; line-height: 18px;
width: 14px; width: 18px;
margin-left: 2px;
margin-bottom: 3px;
} }
} }
.downMenu{ .downMenu{
width: 329px; width: 330px;
box-shadow: 0px 0px 9px rgba(134, 134, 134,0.4);
background-color: #fff; background-color: #fff;
box-shadow: 0px 1px 8px 1px rgba(212, 212, 212, 0.5); .ant-menu-vertical .ant-menu-item:hover{
padding-bottom: 14px; background-color: #e6f7ff;
.ant-menu-item{
height: 50px;
line-height: 50px;
}
}
.fileMenu{
width: 83px;
li{
padding:6px 0px!important;
text-align: center;
width: 100%;
} }
} }
.catelogue{ .menuslist{
cursor: pointer; max-height: 200px;
background: #FAFBFC; overflow-y: auto;
padding:10px 15px;
border-radius: 4px; border-radius: 4px;
border: 1px solid #D0D0D0; .ant-dropdown-menu-item{
border-radius: 8px;
text-align: left!important;
a{
width: 350px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.ant-dropdown-menu-item.active{
background-color: #e6f7ff;
}
}
.catelogue{
border:1px solid rgb(211, 211, 211);
font-size: 15px; font-size: 15px;
font-weight: normal; font-weight: normal;
margin-right: 12px; border-radius: 5px;
margin-right: 10px;
padding:0px 10px; padding:0px 10px;
height: 30px; height: 30px;
line-height: 30px; line-height: 30px;
color: #666!important; color: #666!important;
display: flex; display: flex;
align-items: center; align-items: center;
&:hover{
background-color: #F3F4F6;
}
span{ span{
margin-top: 1px; margin-top: 1px;
} }
@ -428,23 +371,3 @@
color: #05101a; color: #05101a;
} }
} }
.pinfos{
i,a{color: #666;}
&:hover i,&:hover a{
color: #2A61FF!important;
}
}
.graph{
flex:1;
margin:0px 12px;
.ant-typography{
white-space: pre-wrap;
margin-bottom: 0px;
}
}
.ant-anchor-wrapper{
padding-left: 2px;
.ant-anchor-ink::before{
background-color: #fff;
}
}

View File

@ -5,7 +5,7 @@ import { AlignCenter } from '../Component/layout';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import '../css/index.scss'; import '../css/index.scss';
import Nodata from '../Nodata'; import Nodata from '../Nodata';
import './list.scss'; import './list.css';
import img_parise from '../Images/parise.png'; import img_parise from '../Images/parise.png';
class IndexItem extends Component { class IndexItem extends Component {
@ -28,35 +28,35 @@ class IndexItem extends Component {
<img className="p-r-photo" alt="" src={item.author && item.author.image_url} ></img> <img className="p-r-photo" alt="" src={item.author && item.author.image_url} ></img>
</a> </a>
: :
<Link to={`/${item.author && item.author.login}`} className="show-user-link"> <Link to={item.author && (item.author.type === "Organization" ? `/organize/${item.author.login}`:`/users/${item.author.login}`)} className="show-user-link">
<img className="p-r-photo" alt="" src={getImageUrl(`/${item.author && item.author.image_url}`)} ></img> <img className="p-r-photo" alt="" src={getImageUrl(`/${item.author && item.author.image_url}`)} ></img>
</Link> </Link>
} }
<div className="p-r-Infos"> <div className="p-r-Infos">
<div className="p-r-name"> <div className="p-r-name">
<AlignCenter> <AlignCenter>
<Link to={`/${item.author.login}/${item.identifier}`} title={`${item.author.name}/${item.name}`} className="color-grey-3 font-18 task-hide " style={{maxWidth: 470 }}> <Link to={`/projects/${item.author.login}/${item.identifier}`} title={`${item.author.name}/${item.name}`} className="color-grey-3 font-18 task-hide " style={{maxWidth: 470 }}>
{item.author.name}/{item.name} {item.author.name}/{item.name}
</Link> </Link>
{ !item.is_public && <span className="privateTag">私有</span> } { !item.is_public && <span className="privateTag">私有</span> }
{ {
item.forked_from_project_id ? item.forked_from_project_id ?
<Tooltip title="该项目是一个fork仓库" className="ml5"> <span className="ml5">
<i className="iconfont icon-fork font-18 color-orange" /> <i className="iconfont icon-fork font-18 color-orange" />
</Tooltip> </span>
: "" : ""
} }
{ {
item.type && item.type === 2 ? item.type && item.type === 2 ?
<Tooltip title="该项目是一个同步镜像仓库" className="ml5"> <Tooltip title="该项目是一个镜像" className="ml5">
<i className="iconfont icon-banbenku font-18 color-green" /> <i className="iconfont icon-banbenku font-18 color-green" />
</Tooltip>:"" </Tooltip>:""
} }
{ {
item.type && item.type === 1 ? item.type && item.type === 1 ?
<Tooltip title="该项目是一个导入于其他网站的仓库" className="ml5"> <span className="ml5">
<i className="iconfont icon-jingxiang font-18 color-green" /> <i className="iconfont icon-jingxiang font-18 color-green" />
</Tooltip>:"" </span>:""
} }
</AlignCenter> </AlignCenter>
<span className="p-r-tags"> <span className="p-r-tags">

View File

@ -218,92 +218,74 @@
} }
/* -----------详情------------ */ /* -----------详情------------ */
.detailHeader-wrapper{ .detailHeader-wrapper{
background-color:#FBFCFF; background-color:#FAFBFC;
border-bottom:1px solid #e2e2e2; /* background: url(../Images/forgeBanner.jpg) no-repeat center; */
/* background-size:cover; */
} }
.headerMenu-wrapper{ .headerMenu-wrapper{
font-size: 16px;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
cursor: pointer; }
li{ .headerMenu-wrapper li{
text-align: center; position: relative;
padding:0px; text-align: center;
margin-right: 40px; height: 40px;
display: flex; line-height: 28px;
& > a{ margin-right: 40px;
position: relative; }
font-size: 14px; .headerMenu-wrapper li a{
height: 36px; color: #666;
line-height: 24px; }
display: block; .headerMenu-wrapper li a > img{
color: #000!important; margin-right: 8px;
&> span.num{ }
line-height: 24px; .headerMenu-wrapper li a > span.num{
margin-left: 5px; height: 28px;
font-size: 12px; line-height: 29px;
float: right; margin-left: 8px;
color: #666!important; font-size: 12px;
background-color: rgba(153, 153, 153, 0.13);; color: #2878FF;
border-radius: 50%; float: right;
width: 24px; }
height: 24px; .headerMenu-wrapper li.active::after{
} position: absolute;
} bottom:0px;
height:2px;
&.active a::after,&:hover a::after{ background-color: #5091FF;
position: absolute; content:'';
bottom:0px; left: 0px;
height:2px; width:100%;
background-color:rgba(153, 153, 153, 0.2);
content:'';
left: 0px;
width:100%;
}
&.active span{
font-weight: 500;
}
&.active a::after{
background-color: #466AFF;
}
}
} }
.detail_tag_btn{ .detail_tag_btn{
height:32px; height:26px;
line-height: 32px; line-height: 26px;
border-radius:5px; border-radius:5px;
border:1px solid #D0D0D0; border:1px solid #f1f1f1;
display: flex; display: flex;
align-items: center; align-items: center;
margin-left: 10px; margin-left: 30px;
padding:0px; padding:0px;
background-color:#FAFBFC; background-color: transparent;
box-shadow: none; box-shadow: none;
.detail_tag_btn_name{
padding:0px 10px;
text-align: center;
height: 30px;
line-height: 30px;
border-radius:5px 0px 0px 5px;
&:hover
{
background-color: #F3F4F6;
}
span{
color: #333!important;
}
}
.detail_tag_btn_count{
width: 42px;
text-align: center;
background: #fff;
border-radius: 0px 4px 4px 0px;
height:100%;
border-left: 1px solid #D0D0D0;
}
} }
.ant-tooltip { .ant-tooltip {
max-width: fit-content!important; max-width: fit-content!important;
} }
.detail_tag_btn_name{
padding:0px 10px;
color: #666!important;
}
.detail_tag_btn_name img{
margin-right: 10px;
}
.detail_tag_btn_count{
padding:0px 10px;
background: #fff;
border-radius: 0px 4px 4px 0px;
font-size: 12px;
height:100%;
}
.files-md{ .files-md{
padding:20px; padding:20px;
} }
@ -354,7 +336,6 @@
.gitAddressClone{ .gitAddressClone{
margin:14px 20px!important;
display: flex; display: flex;
height: 40px; height: 40px;
align-items: center; align-items: center;
@ -518,7 +499,7 @@
} }
.addFile a{ .addFile a{
display: block; display: block;
background-color: rgba(76, 172, 255,0.8); background-color: rgb(76, 172, 255,0.8);
color: #fff; color: #fff;
cursor: pointer; cursor: pointer;
height: 32px; height: 32px;
@ -533,7 +514,7 @@
border-left: 1px solid rgba(247, 247, 247, 0.3); border-left: 1px solid rgba(247, 247, 247, 0.3);
} }
.addFile a:active{ .addFile a:active{
background-color: rgba(76, 172, 255,1); background-color: rgb(76, 172, 255,1);
} }
@ -572,7 +553,7 @@
} }
.commonBox{ .commonBox{
border:1px solid #ddd; border:1px solid #ddd;
margin-top: 18px; margin-top: 30px;
border-radius: 4px; border-radius: 4px;
} }
.commonBox .commonBox-title{ .commonBox .commonBox-title{
@ -586,28 +567,14 @@
border-bottom: 1px solid #d9d9d9; border-bottom: 1px solid #d9d9d9;
border-radius: 4px 4px 0px 0px; border-radius: 4px 4px 0px 0px;
} }
.readBox{
border:none;
&.commonBox .commonBox-info{
border:1px solid #D0D0D0;
border-top: none;
border-radius: 0px 0px 4px 4px;
padding:20px 38px;
}
}
.commonBox .commonBox-title.boxTitle{ .commonBox .commonBox-title.boxTitle{
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
height: 55px;
line-height: 55px;
background: #FAFCFF;
border-radius: 4px 4px 0px 0px;
border: 1px solid rgba(42, 97, 255, 0.23);
} }
.synchronism{ .synchronism{
display: block; display: block;
height: 34px; height: 26px;
line-height: 34px; line-height: 26px;
padding:0px 15px; padding:0px 15px;
color: #fff!important; color: #fff!important;
background-color: #28BD6C; background-color: #28BD6C;
@ -616,19 +583,10 @@
.files_info{ .files_info{
cursor: pointer; cursor: pointer;
} }
.commonBox { .commonBox .commonBox-info{
.commonBox-info{ padding:20px 15px;
padding:20px 15px;
}
}
.commonBox-title-read{
vertical-align: middle;
color: #000;
font-size: 14px;
&:hover {
color: #466AFF;
}
} }
.commonBox-title-read{vertical-align: middle;color: #666;}
@media screen and (max-width: 370px){ @media screen and (max-width: 370px){
.p-r-tags,.p-r-btn{ .p-r-tags,.p-r-btn{
@ -669,7 +627,9 @@
.item:last-child{ .item:last-child{
border-bottom:none; border-bottom:none;
} }
.gitAddressClone{
margin: 0 !important;
}
.item_title small{ .item_title small{
font-weight: 400; font-weight: 400;
margin-left: 10px; margin-left: 10px;
@ -773,12 +733,3 @@ a.color-grey-ccc:hover{
display: flex; display: flex;
justify-content: center; justify-content: center;
} }
.depotNum{
color: #666!important;
span:last-child{
color: #333;
}
&:hover span:last-child{
color: #2A61FF;
}
}

View File

@ -52,7 +52,7 @@ function Contribute(props){
<AlignCenter> <AlignCenter>
<img alt="" style={{borderRadius:"50%",marginRight:"10px"}} src={getImageUrl(`/${item.image_url}`)} width="50px" height="50px"/> <img alt="" style={{borderRadius:"50%",marginRight:"10px"}} src={getImageUrl(`/${item.image_url}`)} width="50px" height="50px"/>
<div> <div>
<Link to={`/${item.login}`} className="font-16">{item.name}</Link> <Link to={`/users/${item.login}`} className="font-16">{item.name}</Link>
<p className="font-12 color-grey-9">提交{item.contributions}</p> <p className="font-12 color-grey-9">提交{item.contributions}</p>
</div> </div>
</AlignCenter> </AlignCenter>

View File

@ -1,7 +1,6 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Skeleton , Tooltip} from 'antd'; import { Skeleton , Tooltip} from 'antd';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { numFormat } from 'educoder';
function DetailBanner({ history,list , owner , projectsId , isManager , url , pathname , state , urlFlag , projectDetail , platform ,open_devops }){ function DetailBanner({ history,list , owner , projectsId , isManager , url , pathname , state , urlFlag , projectDetail , platform ,open_devops }){
const [ menuName , setMenuName ] = useState(undefined); const [ menuName , setMenuName ] = useState(undefined);
@ -11,115 +10,105 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
if(pathname && pathname==="source"){ if(pathname && pathname==="source"){
let a = list.filter(item=>item.menu_name === "resources"); let a = list.filter(item=>item.menu_name === "resources");
if(a && a.length === 0){ if(a && a.length === 0){
history.push(`/${owner}/${projectsId}`); history.push(`/projects/${owner}/${projectsId}`);
} }
} }
setMenuName(list); setMenuName(list);
} }
},[list]); },[list]);
return( return(
<div className="f-wrap-between mt25"> <div className="f-wrap-between mt15">
{ {
menuName && projectDetail ? menuName && projectDetail ?
<ul className="headerMenu-wrapper"> <ul className="headerMenu-wrapper">
{ {
Array.isArray(menuName)&& menuName.map((item,key)=>{ menuName.map((item,key)=>{
return( return(
<React.Fragment key={item.menu_name}> <React.Fragment>
{ {
item.menu_name === "home" && item.menu_name === "home" &&
<li className={pathname==="about" ? "active" : ""}> <li className={pathname==="about" ? "active" : ""}>
<Link to={{ pathname: `/${owner}/${projectsId}/about`, state }}> <Link to={{ pathname: `/projects/${owner}/${projectsId}/about`, state }}>
<i className={"iconfont icon-zhuye-fill color-grey-3 mr5 font-14"}></i> <i className={(pathname==="" || urlFlag) ? "iconfont icon-zhuye1 color-grey-3 mr5 font-14":"iconfont icon-zhuye1 color-grey-6 font-14 mr5"}></i>
<span>主页</span> <span>主页</span>
</Link> </Link>
</li> </li>
} }
{ {
item.menu_name === "code" && item.menu_name === "code" &&
<li className={(pathname==="" || urlFlag) ? "active" : ""}> <li className={(pathname==="" || urlFlag) ? "active" : ""}>
<Link to={{ pathname: `/${owner}/${projectsId}`, state }}> <Link to={{ pathname: `/projects/${owner}/${projectsId}`, state }}>
<i className={"iconfont icon-daimakuicon1 color-grey-3 mr5 font-14"}></i> <i className={(pathname==="" || urlFlag) ? "iconfont icon-daimaku color-grey-3 mr5 font-14":"iconfont icon-daimaku color-grey-6 font-14 mr5"}></i>
<span>代码库</span> <span>代码库</span>
</Link> </Link>
</li> </li>
} }
{ {
item.menu_name === "issues" && item.menu_name === "issues" &&
<li className={pathname==="issues" ? "active" : ""}> <li className={pathname==="issues" ? "active" : ""}>
<Link to={{ pathname: `/${owner}/${projectsId}/issues`, state }}> <Tooltip title="易修是Issue的中文名即问题列表" placement="bottom">
<Tooltip title="易修是Issue的中文名即问题列表" placement="bottom"> <Link to={{ pathname: `/projects/${owner}/${projectsId}/issues`, state }}>
<i className={"iconfont icon-yixiuicon1 color-grey-3 mr5 font-14"}></i> <i className={pathname==="issues" ? "iconfont icon-renwu color-grey-3 mr5 font-14":"iconfont icon-renwu color-grey-6 font-14 mr5"}></i>
<span>易修</span> <span>易修</span>
</Tooltip> {projectDetail && projectDetail.issues_count ? <span className="num">{projectDetail.issues_count}</span> : ""}
{projectDetail && projectDetail.issues_count ? <span className="num">{numFormat(projectDetail.issues_count)}</span> : ""}
</Link> </Link>
</Tooltip>
</li> </li>
} }
{ {
item.menu_name === "pulls" && projectDetail && parseInt(projectDetail.type) !== 2 && platform ? item.menu_name === "pulls" && projectDetail && parseInt(projectDetail.type) !== 2 && platform ?
<li className={pathname==="pulls" ? "active" : ""}> <li className={pathname==="pulls" ? "active" : ""}>
<Link to={{ pathname: `/${owner}/${projectsId}/pulls`, state }}> <Link to={{ pathname: `/projects/${owner}/${projectsId}/pulls`, state }}>
<i className={"iconfont icon-hebingqingqiu1 color-grey-3 mr5 font-14"}></i> <i className={pathname==="pulls" ? "iconfont icon-hebingqingqiu1 color-grey-3 mr5 font-14":"iconfont icon-hebingqingqiu1 color-grey-6 font-14 mr5"}></i>
<span>合并请求</span> <span>合并请求</span>
{projectDetail && projectDetail.pull_requests_count ? <span className="num">{numFormat(projectDetail.pull_requests_count)}</span> : ""} {projectDetail && projectDetail.pull_requests_count ? <span className="num">{projectDetail.pull_requests_count}</span> : ""}
</Link> </Link>
</li>:"" </li>:""
} }
{
item.menu_name === "wiki" &&
<li className={pathname === "wiki" ? "active" : ""}>
<Link to={{ pathname: `/${owner}/${projectsId}/wiki`, state }}>
<i className={"iconfont icon-a-wikiicon1 color-grey-3 mr5 font-14"}></i>
<span>Wiki</span>
</Link>
</li>
}
{ {
item.menu_name === "devops" && platform ? item.menu_name === "devops" && platform ?
<li className={pathname==="devops" ? "active" : ""}> <li className={pathname==="devops" ? "active" : ""}>
{/* <Link to={{ pathname: `/${owner}/${projectsId}/devops${open_devops ? `/dispose`:""}`, state }}> */} <Link to={{ pathname: `/projects/${owner}/${projectsId}/devops${open_devops ? `/dispose`:""}`, state }}>
<Link to={{ pathname: `/${owner}/${projectsId}/devops`, state:{...state,open_devops} }}> <i className="iconfont icon-gongzuoliu font-13 mr8"></i>工作流(beta版)
<i className="iconfont icon-gongzuoliuicon font-13 mr5 color-grey-3"></i>工作流(beta版)
{projectDetail && projectDetail.ops_count ? <span>{projectDetail.ops_count}</span> : ""} {projectDetail && projectDetail.ops_count ? <span>{projectDetail.ops_count}</span> : ""}
</Link> </Link>
</li> </li>
:"" :""
} }
{ {/* {
item.menu_name === "resources" && item.menu_name === "resources" &&
<li className={pathname==="source" ? "active" : ""}> <li className={pathname==="source" ? "active" : ""}>
<Link to={{ pathname: `/${owner}/${projectsId}/source`, state }}> <Link to={{ pathname: `/projects/${owner}/${projectsId}/source`, state }}>
<i className={pathname==="source" ? "iconfont icon-ziyuanpaihanghetuijian color-grey-3 mr5 font-14":"iconfont icon-ziyuanpaihanghetuijian color-grey-6 font-14 mr5"}></i> <i className={pathname==="source" ? "iconfont icon-ziyuanpaihanghetuijian color-grey-3 mr5 font-14":"iconfont icon-ziyuanpaihanghetuijian color-grey-6 font-14 mr5"}></i>
<span>资源库</span> <span>资源库</span>
{projectDetail && projectDetail.source_count ? <span className="num">{projectDetail.source_count}</span> :""} {projectDetail && projectDetail.source_count ? <span className="num">{projectDetail.source_count}</span> :""}
</Link> </Link>
</li> </li>
} } */}
{ {
item.menu_name === "versions" && item.menu_name === "versions" &&
<li className={pathname==="milestones" ? "active" : ""}> <li className={pathname==="milestones" ? "active" : ""}>
<Link to={{ pathname: `/${owner}/${projectsId}/milestones`, state }}> <Link to={{ pathname: `/projects/${owner}/${projectsId}/milestones`, state }}>
<i className={pathname==="milestones" ? "iconfont icon-lichengbeiicon color-grey-3 mr5 font-14":"iconfont icon-lichengbeiicon color-grey-6 font-14 mr5"}></i> <i className={pathname==="milestones" ? "iconfont icon-lichengbei color-grey-3 mr5 font-14":"iconfont icon-lichengbei color-grey-6 font-14 mr5"}></i>
<span>里程碑</span> <span>里程碑</span>
{projectDetail && projectDetail.versions_count ? <span className="num">{numFormat(projectDetail.versions_count)}</span> :""} {projectDetail && projectDetail.versions_count ? <span className="num">{projectDetail.versions_count}</span> :""}
</Link> </Link>
</li> </li>
} }
{ {
item.menu_name === "activity" && item.menu_name === "activity" &&
<li className={pathname==="activity" ? "active" : ""}> <li className={pathname==="activity" ? "active" : ""}>
<Link to={{ pathname: `/${owner}/${projectsId}/activity`, state }}> <Link to={{ pathname: `/projects/${owner}/${projectsId}/activity`, state }}>
<i className={pathname==="activity" ? "iconfont icon-dongtaiicon color-grey-3 mr5 font-14":"iconfont icon-dongtaiicon color-grey-6 font-14 mr5"}></i> <i className={pathname==="activity" ? "iconfont icon-tongzhi color-grey-3 mr5 font-14":"iconfont icon-tongzhi color-grey-6 font-14 mr5"}></i>
<span>动态</span> <span>动态</span>
</Link> </Link>
</li> </li>
} }
{ {
item.menu_name === "settings" && item.menu_name === "setting" &&
<li className={pathname === "settings" ? "active" : ""}> <li className={pathname === "setting" ? "active" : ""}>
<Link to={`/${owner}/${projectsId}/settings`}> <Link to={`/projects/${owner}/${projectsId}/setting`}>
<i className={url && url.indexOf("/settings") > 0 ? "iconfont icon-cangkushezhiicon color-grey-3 mr5 font-14":"iconfont icon-cangkushezhiicon color-grey-6 font-14 mr5"}></i> <i className={url && url.indexOf("/setting") > 0 ? "iconfont icon-cangku color-grey-3 mr5 font-14":"iconfont icon-cangku color-grey-6 font-14 mr5"}></i>
<span>仓库设置</span> <span>仓库设置</span>
</Link> </Link>
</li> </li>

View File

@ -1,15 +1,26 @@
import React from 'react'; import React from 'react';
import { Tooltip , message } from 'antd';
import './sub.scss'; import './sub.scss';
import CopyTool from '../../Component/CopyTool';
function Invite({code,className}) { function Invite({code,className}) {
function jsCopy(id) {
const copyEle = document.querySelector(id); //
const range = document.createRange(); // range
window.getSelection().removeAllRanges(); //selection
range.selectNode(copyEle); //
window.getSelection().addRange(range); //
document.execCommand("Copy"); // copy
message.success('复制成功');
}
return( return(
<div className={className}> <div className={className}>
<span className="font-16 color-ooo">邀请码</span> <span className="font-16 color-grey-6">邀请码</span>
<div> <div>
<input value={code} id="devitecode" style={{width:"62px",border:"none",cursor:"default"}} readOnly/> <span id="devitecode">{code}</span>
<CopyTool timeOut={true} beforeText={<p className="edu-txt-center">可以通过邀请码邀请成员加入项目<br/>点击复制邀请码</p>} className="ml8 font-16" inputId="devitecode"/> <Tooltip title={<p className="edu-txt-center">可以通过邀请码邀请成员加入项目<br/>点击复制邀请码</p>} placement={"bottom"}>
<i className="iconfont icon-fuzhi2 font-16 color-blue ml8" onClick={()=>jsCopy("#devitecode")}></i>
</Tooltip>
</div> </div>
</div> </div>
) )

View File

@ -1,57 +0,0 @@
import React , { useState , useEffect } from 'react';
import { Anchor , Input } from 'antd';
import './sub.scss';
import { Base64 } from 'js-base64';
const { Link } = Anchor;
function ReadmeCatelogue({ menuList , hash }) {
const [ goHref , setGoHref ] = useState("");
const [ value , setValue ] = useState("");
const [ menu , setMenu] = useState(menuList);
function onChange(link){
setGoHref(link);
};
function changeValue(e) {
setValue(e.target.value);
if(e.target.value){
let m = menuList.filter(i=>i.text.indexOf(e.target.value)>-1);
setMenu(m);
}else{
setMenu(menuList);
}
}
return(
<div>
<div className="searchBox">
<Input
placeholder={"请输入关键字"}
value={value}
onChange={changeValue}
prefix={<i className="iconfont icon-sousuo_icon1 font-14"></i>}/>
</div>
{
menu && menu.length>0?
<div className="anchorBox">
<Anchor affix={false} onChange={onChange}>
{
menu.map((item,key)=>{
return(
<div style={{paddingLeft:`${item.level *10}px`}} className={goHref===item.href?"items active":"items"}>
<Link href={`#${item.text}`} title={item.text} />
</div>
)
})
}
</Anchor>
</div>
:""
}
</div>
)
}
export default ReadmeCatelogue;

View File

@ -24,44 +24,7 @@
} }
} }
.menuslist{ .detailsCode{
z-index: 100; display: flex;
width: 297px; justify-content: space-between;
background: #FFFFFF;
box-shadow: 0px 4px 8px 2px rgba(212, 212, 212, 0.5);
border-radius: 4px;
.searchBox{
padding:15px;
border-bottom: 1px solid #eee;
}
.ant-anchor-wrapper{
margin-left: 0px;
padding:5px 15px;
max-height: 255px!important;
.items{
border-radius: 4px;
margin-bottom: 5px;
cursor: pointer;
.ant-anchor-link-title{
color: #333333!important;
}
&:hover{
background-color: #F3F4F6;
}
&.active{
background-color: #2A61FF;
.ant-anchor-link-title{
color: #fff!important;
}
}
}
.ant-anchor-link{
padding:0px;
height: 30px;
line-height: 30px;
}
.ant-anchor-ink::before{
background-color: #fff;
}
}
} }

View File

@ -16,10 +16,10 @@ function Commits({ commits , projectsId , owner }){
<div className="prInfo"> <div className="prInfo">
<FlexAJ> <FlexAJ>
<AlignCenter> <AlignCenter>
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="commitKey" style={{marginLeft:0}}>{truncateCommitId(`${item.sha}`)}</Link> <Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="commitKey" style={{marginLeft:0}}>{truncateCommitId(`${item.sha}`)}</Link>
<p className="ml15 font-16 color-grey-3 task-hide" style={{maxWidth:"700px"}}>{item.message}</p> <p className="ml15 font-16 color-grey-3 task-hide" style={{maxWidth:"700px"}}>{item.message}</p>
</AlignCenter> </AlignCenter>
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(item.sha)}`} className="color-blue">浏览代码</Link> <Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(item.sha)}`} className="color-blue">浏览代码</Link>
</FlexAJ> </FlexAJ>
<AlignCenter className="mt15"> <AlignCenter className="mt15">
<User url={getImageUrl(`/${item.committer && item.committer.image_url}`)} name={`${item.committer && item.committer.name}`}></User><span>提交于{item.time_from_now}</span> <User url={getImageUrl(`/${item.committer && item.committer.image_url}`)} name={`${item.committer && item.committer.name}`}></User><span>提交于{item.time_from_now}</span>

View File

@ -47,7 +47,7 @@ function Files({data,history,owner,projectsId}){
<span>{item.name}</span> <span>{item.name}</span>
</AlignCenter> </AlignCenter>
<span> <span>
<Button className="mr20" onClick={()=>{history.push(`/${owner}/${projectsId}/tree/${truncateCommitId(item.sha)}/${item.name}`)}}>查看文件</Button> <Button className="mr20" onClick={()=>{history.push(`/projects/${owner}/${projectsId}/tree/${truncateCommitId(item.sha)}/${item.name}`)}}>查看文件</Button>
<span className="color-green">+{item.addition}</span> <span className="color-green">+{item.addition}</span>
<span className="color-red ml20">-{item.deletion}</span> <span className="color-red ml20">-{item.deletion}</span>
</span> </span>

View File

@ -228,7 +228,7 @@ class MergeDetail extends Component {
<div> <div>
{ {
data && data.issue.user_permission ? data && data.issue.user_permission ?
<Link to={`/${owner}/${projectsId}/pulls/${mergeid}/updatemerge`} className="color-blue fr">编辑</Link> <Link to={`/projects/${owner}/${projectsId}/pulls/${mergeid}/updatemerge`} className="color-blue fr">编辑</Link>
: '' : ''
} }
</div> </div>
@ -248,8 +248,8 @@ class MergeDetail extends Component {
<div className="detailHeader-wrapper"> <div className="detailHeader-wrapper">
<div className="normal f-wrap-between"> <div className="normal f-wrap-between">
<ul className="headerMenu-wrapper"> <ul className="headerMenu-wrapper">
<li className={url.indexOf("Messagecount") > 0 ? "active" : ""}><Link to={`/${owner}/${projectsId}/pulls/${mergeid}/Messagecount`}>对话内容</Link></li> <li className={url.indexOf("Messagecount") > 0 ? "active" : ""}><Link to={`/projects/${owner}/${projectsId}/pulls/${mergeid}/Messagecount`}>对话内容</Link></li>
<li className={url.indexOf("MergeSubmit") > 0 ? "active" : ""}><Link to={`/${owner}/${projectsId}/pulls/${mergeid}/MergeSubmit`}>代码提交</Link></li> <li className={url.indexOf("MergeSubmit") > 0 ? "active" : ""}><Link to={`/projects/${owner}/${projectsId}/pulls/${mergeid}/MergeSubmit`}>代码提交</Link></li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -49,7 +49,7 @@ class MergeItem extends Component {
}; };
render() { render() {
const { issues, project_name, project_author_name , user_admin_or_developer} = this.props; const { issues, project_name, project_author_name , user_admin_or_member} = this.props;
const { projectsId , owner } = this.props.match.params; const { projectsId , owner } = this.props.match.params;
const { current_user } = this.props; const { current_user } = this.props;
const renderList = () => { const renderList = () => {
@ -62,7 +62,7 @@ class MergeItem extends Component {
<p className="mb15 df" style={{ alignItems: "center" }}> <p className="mb15 df" style={{ alignItems: "center" }}>
<i className={`iconfont icon-hebingqingqiu1 font-14 mr3 i_${status}`}></i> <i className={`iconfont icon-hebingqingqiu1 font-14 mr3 i_${status}`}></i>
<Link <Link
to={`/${owner}/${projectsId}/pulls/${item.pull_request_id}/Messagecount`} to={`/projects/${owner}/${projectsId}/pulls/${item.pull_request_id}/Messagecount`}
className="hide-1 font-15 color-grey-3 fwb lineh-30 mr10" className="hide-1 font-15 color-grey-3 fwb lineh-30 mr10"
style={{ maxWidth: "300px" }} style={{ maxWidth: "300px" }}
> >
@ -78,7 +78,7 @@ class MergeItem extends Component {
</p> </p>
<p className="grid-item font-13"> <p className="grid-item font-13">
<Link <Link
to={`/${item && item.author_login}`} to={`/users/${item && item.author_login}`}
className="show-user-link" className="show-user-link"
> >
<img <img
@ -91,7 +91,7 @@ class MergeItem extends Component {
</Link> </Link>
<AlignCenter> <AlignCenter>
<Link <Link
to={`/${item && item.author_login}`} to={`/users/${item && item.author_login}`}
className="show-user-link color-grey-8 ml5" className="show-user-link color-grey-8 ml5"
> >
{item && item.author_name} {item && item.author_name}
@ -109,7 +109,7 @@ class MergeItem extends Component {
item.pull_request_head && item.pull_request_head &&
<Tag className="pr-branch-tag"> <Tag className="pr-branch-tag">
<Link <Link
to={`/${item.is_original ? item.fork_project_user : owner}/${ item.is_original ? item.fork_project_identifier : projectsId }/tree/${turnbar(item.pull_request_head)}`} to={`/projects/${item.is_original ? item.fork_project_user : owner}/${ item.is_original ? item.fork_project_identifier : projectsId }/tree/${turnbar(item.pull_request_head)}`}
className="maxW200px hide-1 ver-middle" className="maxW200px hide-1 ver-middle"
> >
{item.is_original {item.is_original
@ -133,7 +133,7 @@ class MergeItem extends Component {
item.pull_request_base && item.pull_request_base &&
<Tag className="pr-branch-tag"> <Tag className="pr-branch-tag">
<Link <Link
to={`/${owner}/${projectsId}/tree/${turnbar(item.pull_request_base)}`} to={`/projects/${owner}/${projectsId}/tree/${turnbar(item.pull_request_base)}`}
className="maxW200px hide-1 ver-middle" className="maxW200px hide-1 ver-middle"
> >
{/* {item.is_fork ? item.pull_request_base : `${item.author_name}:${item.pull_request_base}`} */} {/* {item.is_fork ? item.pull_request_base : `${item.author_name}:${item.pull_request_base}`} */}
@ -156,7 +156,7 @@ class MergeItem extends Component {
<li> <li>
{item.assign_user_name ? ( {item.assign_user_name ? (
<Link <Link
to={`/${item.assign_user_login}`} to={`/users/${item.assign_user_login}`}
className="show-user-link" className="show-user-link"
> >
{item.assign_user_name} {item.assign_user_name}
@ -175,7 +175,7 @@ class MergeItem extends Component {
{item.journals_count ? ( {item.journals_count ? (
<Link <Link
className="mr5 color-grey-8" className="mr5 color-grey-8"
to={`/${owner}/${projectsId}/pulls/${item.pull_request_id}/Messagecount`} to={`/projects/${owner}/${projectsId}/pulls/${item.pull_request_id}/Messagecount`}
> >
<i className="iconfont icon-huifu1 font-15 mr5 ver-middle"></i> <i className="iconfont icon-huifu1 font-15 mr5 ver-middle"></i>
{item.journals_count} {item.journals_count}
@ -183,7 +183,7 @@ class MergeItem extends Component {
) : ( ) : (
"" ""
)} )}
{user_admin_or_developer && item.pull_request_status === 0 ? ( {user_admin_or_member && item.pull_request_status === 0 ? (
<div <div
className="milepostleft" className="milepostleft"
style={{ style={{
@ -196,7 +196,7 @@ class MergeItem extends Component {
> >
<div className="grid-item mr15 color-grey-9"> <div className="grid-item mr15 color-grey-9">
<Link <Link
to={`/${owner}/${projectsId}/pulls/${item.pull_request_id}/updatemerge`} to={`/projects/${owner}/${projectsId}/pulls/${item.pull_request_id}/updatemerge`}
className="color-grey-9" className="color-grey-9"
> >
<i className="iconfont icon-bianji3 font-14 mr5"></i> <i className="iconfont icon-bianji3 font-14 mr5"></i>

View File

@ -100,7 +100,7 @@ class MergeSubmit extends Component{
width:"10%", width:"10%",
render: (text,item) => ( render: (text,item) => (
<span className="f-wrap-alignCenter"> <span className="f-wrap-alignCenter">
<Link to={`/${item.login}`} className="show-user-link"> <Link to={`/users/${item.login}`} className="show-user-link">
<img src={getImageUrl(`/${item.image_url}`)} alt="" width="28px" height="28px" className="mr3 radius"/> <img src={getImageUrl(`/${item.image_url}`)} alt="" width="28px" height="28px" className="mr3 radius"/>
<label className="hide-1" style={{maxWidth:"75px",'vertical-align':'middle'}}>{text}</label> <label className="hide-1" style={{maxWidth:"75px",'vertical-align':'middle'}}>{text}</label>
</Link> </Link>
@ -110,7 +110,7 @@ class MergeSubmit extends Component{
title:"SHA", title:"SHA",
dataIndex: 'sha', dataIndex: 'sha',
render: (text) => ( render: (text) => (
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${text}`)}`} className="commitKey">{text}</Link> <Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${text}`)}`} className="commitKey">{text}</Link>
) )
},{ },{
title:"备注", title:"备注",

View File

@ -361,7 +361,7 @@ class MessageCount extends Component {
<div className="mt15"> <div className="mt15">
<Tag className="pr-branch-tag"> <Tag className="pr-branch-tag">
<Link <Link
to={`/${data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}/${data.pull_request.is_original?data.project_identifier:projectsId}/tree/${turnbar(data.pull_request && data.pull_request.head)}`} to={`/projects/${data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}/${data.pull_request.is_original?data.project_identifier:projectsId}/tree/${turnbar(data.pull_request && data.pull_request.head)}`}
className="ver-middle" className="ver-middle"
> >
{data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}: {turnbar(data.pull_request && data.pull_request.head)} {data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}: {turnbar(data.pull_request && data.pull_request.head)}
@ -376,7 +376,7 @@ class MessageCount extends Component {
</span> </span>
<Tag className="pr-branch-tag"> <Tag className="pr-branch-tag">
<Link <Link
to={`/${owner}/${projectsId}/tree/${data.pull_request.base}`} to={`/projects/${owner}/${projectsId}/tree/${data.pull_request.base}`}
className="ver-middle" className="ver-middle"
> >
{data.issue.project_author_name}:{data.pull_request.base} {data.issue.project_author_name}:{data.pull_request.base}
@ -386,14 +386,14 @@ class MessageCount extends Component {
} }
<div className="mt15"> <div className="mt15">
<Link to={`/${data.issue.author_login}`} className="show-user-link"> <Link to={`/users/${data.issue.author_login}`} className="show-user-link">
<img className="mr5" src={getImageUrl(`/${data.issue.author_picture}`)} <img className="mr5" src={getImageUrl(`/${data.issue.author_picture}`)}
alt="" width="24" height="24" style={{borderRadius:"50%"}} alt="" width="24" height="24" style={{borderRadius:"50%"}}
/> />
</Link> </Link>
<span className="ver-middle"> <span className="ver-middle">
<span className="color-grey-8 mr5"></span> <span className="color-grey-8 mr5"></span>
<Link to={`/${data.issue.author_login}`} className="show-user-link color-blue"> <Link to={`/users/${data.issue.author_login}`} className="show-user-link color-blue">
{data.issue.author_name} {data.issue.author_name}
</Link> </Link>
<span className="ml5 color-grey-8"> <span className="ml5 color-grey-8">
@ -408,7 +408,7 @@ class MessageCount extends Component {
<span className="color-grey-8">审查人员</span> <span className="color-grey-8">审查人员</span>
{data.issue.assign_user_name ? ( {data.issue.assign_user_name ? (
<Link <Link
to={`/${data.issue.assign_user_login}`} to={`/users/${data.issue.assign_user_login}`}
className="show-user-link color-blue" className="show-user-link color-blue"
> >
{data.issue.assign_user_name} {data.issue.assign_user_name}
@ -448,7 +448,7 @@ class MessageCount extends Component {
type="green" type="green"
ghost ghost
className="ml20" className="ml20"
onClick={()=>{this.props.history.push(`/${owner}/${projectsId}/pulls/${mergeId}/UpdateMerge`);}} onClick={()=>{this.props.history.push(`/projects/${owner}/${projectsId}/pulls/${mergeId}/UpdateMerge`);}}
> >
编辑 编辑
</Button> </Button>

View File

@ -48,10 +48,8 @@ class NewMerge extends Component {
this.compareProject(this.state.id,pull,"master"); this.compareProject(this.state.id,pull,"master");
} }
} }
// 页面销毁取消监听 // 页面销毁取消监听
componentWillUnmount () { componentWillUnmount () {
console.log('----------destoyed---------');
window.removeEventListener('popstate', this.handleBack, false); window.removeEventListener('popstate', this.handleBack, false);
}; };
@ -62,11 +60,8 @@ class NewMerge extends Component {
//获取新建分支数据 //获取新建分支数据
getmergelist = (projectsId) => { getmergelist = (projectsId) => {
this.setState({isSpin: true}); this.setState({isSpin: true})
// const { owner } = this.props.match.params; const { owner } = this.props.match.params;
let owner =this.props.history.location.pathname.split('/')[1];
console.log('owner:'+owner);
console.log(this.props);
const url = `/${owner}/${projectsId}/pulls/new.json`; const url = `/${owner}/${projectsId}/pulls/new.json`;
axios axios
.get(url) .get(url)
@ -191,7 +186,7 @@ class NewMerge extends Component {
// this.ischeckmerge(); // this.ischeckmerge();
let { id ,merge , pull } = this.state; let { id ,merge , pull } = this.state;
if(type==="pull"){ if(type==="pull"){
this.props.history.push(`/${owner}/${projectsId}/pulls/new/${pull}`) this.props.history.push(`/projects/${owner}/${projectsId}/pulls/new/${pull}`)
this.compareProject(id,value,merge); this.compareProject(id,value,merge);
}else{ }else{
this.compareProject(id,pull,value); this.compareProject(id,pull,value);
@ -213,7 +208,7 @@ class NewMerge extends Component {
merge_user_login: is_fork_id ? projects_names[0].project_user_login : undefined merge_user_login: is_fork_id ? projects_names[0].project_user_login : undefined
} }
}) })
this.props.history.push(`/${login}/${identifier}/pulls/new`); this.props.history.push(`/projects/${login}/${identifier}/pulls/new`);
this.newMergelist(login,identifier); this.newMergelist(login,identifier);
}; };
@ -269,9 +264,7 @@ class NewMerge extends Component {
show_message, show_message,
default_message, default_message,
merge_head, merge_head,
projects_names, projects_names,id,comparesData
id,
comparesData
} = this.state; } = this.state;
const renderBrances = (list, type) => { const renderBrances = (list, type) => {
@ -305,7 +298,6 @@ class NewMerge extends Component {
return <div dangerouslySetInnerHTML={{ __html: html }}></div>; return <div dangerouslySetInnerHTML={{ __html: html }}></div>;
}; };
let { project } = this.props; let { project } = this.props;
return ( return (
<div> <div>
<div className="main"> <div className="main">

View File

@ -4,11 +4,10 @@ import "./merge.css";
import "../Order/order.css"; import "../Order/order.css";
import "../Order/index.scss"; import "../Order/index.scss";
import NoneData from "./no_data"; import NoneData from "./no_data";
import MergeItem from "./MergeItem"; import OrderItem from "./MergeItem";
import './Index.scss'; import './Index.scss';
import axios from "axios"; import axios from "axios";
import CheckProfile from '../Component/ProfileModal/Profile';
const Search = Input.Search; const Search = Input.Search;
/** /**
@ -213,7 +212,7 @@ class merge extends Component {
checkOperation() { checkOperation() {
const { projectsId,owner } = this.props.match.params; const { projectsId,owner } = this.props.match.params;
this.props.history.push(`/${owner}/${projectsId}/pulls/new`); this.props.history.push(`/projects/${owner}/${projectsId}/pulls/new`);
} }
render() { render() {
const { projectsId , owner } = this.props.match.params; const { projectsId , owner } = this.props.match.params;
@ -256,10 +255,10 @@ class merge extends Component {
/> />
</div> </div>
{ {
data && data.user_admin_or_developer && data && data.user_admin_or_member &&
<CheckProfile {...this.props} className="topWrapper_btn ml10" sureFunc={() => this.checkOperation()}> <a className="topWrapper_btn ml10" onClick={() => this.checkOperation()}>
+&nbsp;新建合并请求 +&nbsp;新建合并请求
</CheckProfile> </a>
} }
</div> </div>
<div className="f-wrap-between screenWrap"> <div className="f-wrap-between screenWrap">
@ -388,7 +387,7 @@ class merge extends Component {
<Spin spinning={isSpin}> <Spin spinning={isSpin}>
{data && data.search_count && data.search_count > 0 ? ( {data && data.search_count && data.search_count > 0 ? (
<div> <div>
<MergeItem <OrderItem
issues={issues} issues={issues}
search_count={search_count} search_count={search_count}
page={select_params.page} page={select_params.page}
@ -397,8 +396,8 @@ class merge extends Component {
project_author_name={data.project_author_name} project_author_name={data.project_author_name}
{...this.props} {...this.props}
{...this.state} {...this.state}
user_admin_or_developer={data && data.user_admin_or_developer} user_admin_or_member={data && data.user_admin_or_member}
></MergeItem> ></OrderItem>
</div> </div>
):""} ):""}
{search_count > select_params.limit ? ( {search_count > select_params.limit ? (

View File

@ -165,7 +165,7 @@ class MergeForm extends Component {
this.setState({ this.setState({
isSpin: false, isSpin: false,
}); });
this.props.history.push(`/${owner}/${projectsId}/pulls`); this.props.history.push(`/projects/${owner}/${projectsId}/pulls`);
const { getDetail } = this.props; const { getDetail } = this.props;
getDetail && getDetail(); getDetail && getDetail();
} else { } else {
@ -195,7 +195,7 @@ class MergeForm extends Component {
isSpin: false, isSpin: false,
}); });
this.props.history.push( this.props.history.push(
`/${owner}/${projectsId}/pulls/${mergeId}/Messagecount` `/projects/${owner}/${projectsId}/pulls/${mergeId}/Messagecount`
); );
} else { } else {
this.setState({ this.setState({
@ -287,7 +287,7 @@ class MergeForm extends Component {
type="default" type="default"
className="ml30" className="ml30"
onClick={()=>{ onClick={()=>{
this.props.history.push(merge_type === "new" ? `/${owner}/${projectsId}/pulls` : `/${owner}/${projectsId}/pulls/${mergeId}/detail`) this.props.history.push(merge_type === "new" ? `/projects/${owner}/${projectsId}/pulls` : `/projects/${owner}/${projectsId}/pulls/${mergeId}/detail`)
}} }}
> >
<span className="plr10">取消</span> <span className="plr10">取消</span>

View File

@ -12,7 +12,7 @@ class Nodata extends Component{
<h3>欢迎使用合并请求</h3> <h3>欢迎使用合并请求</h3>
<div className="color-grey-8"> <div className="color-grey-8">
合并请求可以帮助您与他人协作编写代码在使用之前请先创建一个 <Link className="color-blue" to={`/${owner}/${projectsId}/pulls/new`}>合并请求</Link> 合并请求可以帮助您与他人协作编写代码在使用之前请先创建一个 <Link className="color-blue" to={`/projects/${owner}/${projectsId}/pulls/new`}>合并请求</Link>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,11 +1,10 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { Input , Form , Select , Checkbox , Button , Spin , AutoComplete, Modal } from 'antd'; import { Input , Form , Select , Checkbox , Button , Spin , AutoComplete } from 'antd';
import { Base64 } from 'js-base64'; import { Base64 } from 'js-base64';
import { AlignCenter } from '../Component/layout';
import '../css/index.scss'; import '../css/index.scss';
import './new.scss' import './new.css'
import axios from 'axios'; import axios from 'axios';
const Option = Select.Option; const Option = Select.Option;
@ -45,12 +44,7 @@ class Index extends Component {
project_category_name: undefined, project_category_name: undefined,
license_name: undefined, license_name: undefined,
ignore_name: undefined, ignore_name: undefined,
descNum:0, descNum:0
categoreFlag:false,
languageFlag:false,
ignoreFlag:false,
licenseFlag:false,
} }
} }
componentDidMount = () => { componentDidMount = () => {
@ -64,8 +58,6 @@ class Index extends Component {
this.getGitignore(); this.getGitignore();
// 获取开源许可证 // 获取开源许可证
this.getLicenses(); this.getLicenses();
//判断是否为删除新建项目失败后返回,并执行对应逻辑
this.isDeleteProjectBack();
} }
componentDidUpdate=(prevPros)=>{ componentDidUpdate=(prevPros)=>{
if(prevPros && this.props && !this.props.checkIfLogin()){ if(prevPros && this.props && !this.props.checkIfLogin()){
@ -77,7 +69,6 @@ class Index extends Component {
getOwner=()=>{ getOwner=()=>{
const { OIdentifier } = this.props.match.params; const { OIdentifier } = this.props.match.params;
const { user_id } = this.props && this.props.current_user; const { user_id } = this.props && this.props.current_user;
const url = `/owners.json`; const url = `/owners.json`;
axios.get(url).then(result=>{ axios.get(url).then(result=>{
if(result && result.data){ if(result && result.data){
@ -86,13 +77,16 @@ class Index extends Component {
OwnerList: owner, OwnerList: owner,
}) })
if(OIdentifier){ if(OIdentifier){
owner = owner.filter(item=>item.login === OIdentifier); owner = owner.filter(item=>item.name === OIdentifier);
this.props.form.setFieldsValue({
user_id:OIdentifier
})
}else if(user_id){ }else if(user_id){
owner = owner.filter(item=>item.id === user_id); owner = owner.filter(item=>item.id === user_id);
this.props.form.setFieldsValue({
user_id:owner && owner[0].name
})
} }
this.props.form.setFieldsValue({
user_id:owner && owner[0].name
})
owner && this.setState({ owner && this.setState({
owners_id:owner[0].id, owners_id:owner[0].id,
owners_name:owner[0].name owners_name:owner[0].name
@ -150,31 +144,6 @@ class Index extends Component {
}).catch((error) => { }) }).catch((error) => { })
} }
isDeleteProjectBack = () => {
let mirror_status = this.props.history.location.mirror_status;
if (mirror_status === 2 && sessionStorage.newProjectValue) {
Modal.warning({
title: '警告',
content: '项目导入失败!请按操作规范重新导入项目!',
});
let newProjectValue = JSON.parse(sessionStorage.newProjectValue);
if (newProjectValue) {
this.setState({
project_language_id: newProjectValue.project_language_id,
project_category_id: newProjectValue.project_category_id,
license_id: newProjectValue.license_id,
ignore_id: newProjectValue.ignore_id
});
delete newProjectValue.project_language_id;
delete newProjectValue.project_category_id;
delete newProjectValue.license_id;
delete newProjectValue.ignore_id;
this.props.form.setFieldsValue(newProjectValue);
}
}
}
// 设置option // 设置option
setOptionsList = (data, _head, name) => { setOptionsList = (data, _head, name) => {
if (data && data.length > 0) { if (data && data.length > 0) {
@ -195,40 +164,35 @@ class Index extends Component {
subMitFrom = () => { subMitFrom = () => {
this.props.form.validateFieldsAndScroll((err, values) => { this.props.form.validateFieldsAndScroll((err, values) => {
console.log(values);
if (!err) { if (!err) {
this.setState({ this.setState({
isSpin: true isSpin: true
}) })
const { projectsType } = this.props.match.params; const { projectsType } = this.props.match.params;
const { const { project_language_id, project_category_id, license_id, ignore_id , owners_id , owners_name } = this.state;
project_language_id, project_category_id, license_id, ignore_id , owners_id ,
ignoreFlag,licenseFlag,categoreFlag,languageFlag
} = this.state;
const decoderPass = Base64.encode(values.password); const decoderPass = Base64.encode(values.password);
const url = (projectsType && projectsType === "mirror") ? "/projects/migrate.json" : "/projects.json"; const url = (projectsType && projectsType === "mirror") ? "/projects/migrate.json" : "/projects.json";
// 新建项目的时候,暂存数据,如果失败,返回的时候可以重新赋值
sessionStorage.newProjectValue=JSON.stringify({...values,project_language_id,project_category_id,license_id,ignore_id});
axios.post(url, { axios.post(url, {
...values, ...values,
auth_password:decoderPass, auth_password:decoderPass,
project_language_id:languageFlag ? project_language_id : undefined, project_language_id,
project_category_id:categoreFlag ? project_category_id : undefined, project_category_id,
license_id:licenseFlag ? license_id : undefined, license_id,
ignore_id:ignoreFlag ? ignore_id : undefined, ignore_id,
user_id:owners_id user_id:owners_id
}).then((result) => { }).then((result) => {
if (result && result.data.id) { if (result && result.data.id) {
projectsType && projectsType !== "mirror" && this.props.showNotification(`托管项目创建成功!`); this.setState({
this.props.history.push(`/${result.data.login}/${result.data.identifier}`); isSpin: false
})
this.props.showNotification(`${projectsType && projectsType === "mirror" ? "镜像" : "托管"}项目创建成功!`);
this.props.history.push(`/projects/${result.data.login}/${result.data.identifier}`);
} }
this.setState({
isSpin: false
})
}).catch((error) => { }).catch((error) => {
this.setState({ this.setState({
isSpin: false isSpin: false
}) })
console.log(error);
}) })
} else { } else {
this.setState({ this.setState({
@ -323,28 +287,41 @@ class Index extends Component {
mirrorCheck, mirrorCheck,
descNum, descNum
ignoreFlag,
licenseFlag,
languageFlag,
categoreFlag
} = this.state; } = this.state;
return ( return (
<div className="main back-white" style={{padding:"0px",border:"none"}}> <div className="main back-white" style={{padding:"0px",border:"none"}}>
<div className="newPanel"> <div className="newPanel">
<div className="newPanel_title">{projectsType && projectsType === "mirror" ? "导入" : "新建"}项目</div> <div className="newPanel_title">创建{projectsType && projectsType === "mirror" ? "镜像" : "托管"}项目</div>
<Spin spinning={isSpin}> <Spin spinning={isSpin}>
<Form> <Form>
<div className="newPanel_content"> <div className="newPanel_content">
<Form.Item
{ label="拥有者"
>
{getFieldDecorator('user_id', {
rules: [{
required: true, message: '请选择拥有者'
},{
validator:(rule, value, callback) => this.checkId(rule, value, callback, OwnerList, '拥有者')
}],
})(
<AutoComplete
placeholder="请选择拥有者"
onChange={(value, e) => this.ChangePlatform(value, e, 'owners', OwnerList)}
className="plateAutoComplete"
onBlur={(value) => this.blurCategory(value, OwnerList, "owners")}
>
{owners_list}
</AutoComplete>
)}
</Form.Item>
{
projectsType && projectsType === "mirror" && projectsType && projectsType === "mirror" &&
<React.Fragment> <React.Fragment>
<Form.Item <Form.Item
label="导入仓库URL" label="镜像版本库地址"
style={{ marginBottom: "0px" }} style={{ marginBottom: "0px" }}
colon={false}
> >
{getFieldDecorator('clone_addr', { {getFieldDecorator('clone_addr', {
rules: [{ rules: [{
@ -359,16 +336,12 @@ class Index extends Component {
} }
{ {
projectsType && projectsType === "mirror" && projectsType && projectsType === "mirror" &&
<div className="pb10"> <React.Fragment>
<p className="mt10 mb10 color-grey-3 pointer" onClick={this.changeMirrorCheck}> <p className="mt10 mb10 color-grey-3 pointer" onClick={this.changeMirrorCheck}>需要授权验证<i className={mirrorCheck?"iconfont icon-xiajiantou font-13 ml10 color-grey-8":"iconfont icon-youjiantou font-13 ml10 color-grey-8"}></i></p>
需要授权验证<i className={mirrorCheck ? "iconfont icon-xiajiantou font-13 ml10 color-grey-8":"iconfont icon-youjiantou font-13 ml10 color-grey-8"}></i>
<span className="ml20 font-12 color-red">如果导入项目为私有仓库则必须填写相应平台正确的用户名和密码</span>
</p>
{ {
mirrorCheck && mirrorCheck &&
<div className="df mb10" style={{alignItems:'center'}}> <div className="df mb20" style={{alignItems:'center'}}>
<span className="mr10">用户名</span> <span className="mr10">用户名</span>
<input type="password" style={{display:"none"}} />
<Form.Item <Form.Item
style={{ marginBottom: "0px" }} style={{ marginBottom: "0px" }}
label="" label=""
@ -382,153 +355,153 @@ class Index extends Component {
<span className="mr10">密码</span> <span className="mr10">密码</span>
<Form.Item <Form.Item
style={{ marginBottom: "0px" }} style={{ marginBottom: "0px" }}
label=""
> >
{getFieldDecorator('password', { {getFieldDecorator('password', {
rules: [], rules: [],
})( })(
<Input.Password placeholder="请输入对应平台的登录用户名" autocomplete='new-password' style={{width:"240px"}}/> <Input placeholder="请输入对应平台的登录密码" type="password" style={{width:"240px"}}/>
)} )}
</Form.Item> </Form.Item>
</div> </div>
} }
</div> </React.Fragment>
} }
<AlignCenter>
<Form.Item
label="拥有者"
style={{width:"260px"}}
colon={false}
className="explainPos"
>
{getFieldDecorator('user_id', {
rules: [{
required: true, message: '请选择拥有者'
},{
validator:(rule, value, callback) => this.checkId(rule, value, callback, OwnerList, '拥有者')
}],
})(
<AutoComplete
style={{width:"260px",height:"35px"}}
placeholder="请选择拥有者"
onChange={(value, e) => this.ChangePlatform(value, e, 'owners', OwnerList)}
className="plateAutoComplete"
onBlur={(value) => this.blurCategory(value, OwnerList, "owners")}
>
{owners_list}
</AutoComplete>
)}
</Form.Item>
<span className="ml10 mr10 mt10 font-18">/</span>
<Form.Item
label="项目名称"
className="flex1 explainPos"
colon={false}
>
{getFieldDecorator('name', {
rules: [{
required: true, message: '请填写项目名称'
}],
})(
<Input placeholder="例如:团队协作方法与研究" maxLength={50}/>
)}
</Form.Item>
</AlignCenter>
<Form.Item <Form.Item
label={<span>项目标识 <span className="color-grey-9">(项目url标识部分)</span></span>} label="项目名称"
colon={false}
> >
{getFieldDecorator('repository_name', { {getFieldDecorator('name', {
rules: [{ rules: [{
required: true, message: '请填写项目标识' required: true, message: '请填写项目名称'
}], }],
})( })(
<Input placeholder="项目标识请使用与项目相关的英文关键字" maxLength={100} /> <Input placeholder="例如:团队协作方法与研究" maxLength={50}/>
)} )}
</Form.Item> </Form.Item>
<div className="pr"> <div className="pr">
<span className="toprightNum">{descNum}/200</span> <span className="toprightNum">{descNum}/200</span>
<Form.Item <Form.Item
label="项目简介" label="项目简介"
colon={false}
style={{marginBottom:"0px"}}
> >
{getFieldDecorator('description', { {getFieldDecorator('description', {
rules: [], rules: [{
required: true, message: '请填写项目简介'
}],
})( })(
<Input.TextArea maxLength={200} placeholder="项目的介绍" autoSize={{ minRows: 2, maxRows: 6 }} onChange={this.changeDesc}/> <Input.TextArea maxLength={200} placeholder="项目的介绍" autoSize={{ minRows: 2, maxRows: 6 }} onChange={this.changeDesc}/>
)} )}
</Form.Item> </Form.Item>
</div> </div>
<Form.Item
label="仓库名称"
>
{getFieldDecorator('repository_name', {
rules: [{
required: true, message: '请填写仓库名称'
}],
})(
<Input placeholder="仓库名称请使用与项目相关的英文关键字" maxLength={100} />
)}
</Form.Item>
<Form.Item
label="项目类别"
>
{getFieldDecorator('project_category', {
rules: [{
required: true, message: '请选择大类别',
}, {
validator: (rule, value, callback) => this.checkId(rule, value, callback, CategoryList, '项目类别')
}],
})(
<AutoComplete
placeholder="请选择项目类别"
onChange={(value, e) => this.ChangePlatform(value, e, 'project_category', CategoryList)}
className="plateAutoComplete"
onBlur={(value) => this.blurCategory(value, CategoryList, "project_category")}
>
{project_category_list}
</AutoComplete>
)}
</Form.Item>
<Form.Item
label="项目语言"
>
{getFieldDecorator('project_language', {
rules: [{
required: true, message: '请选择项目语言'
}, {
validator: (rule, value, callback) => this.checkId(rule, value, callback, LanguageList, '项目语言')
}],
})(
<AutoComplete
placeholder="请选择项目语言"
onChange={(value, e) => this.ChangePlatform(value, e, 'project_language', LanguageList)}
className="plateAutoComplete"
onBlur={(value) => this.blurCategory(value, LanguageList, "project_language")}
>
{project_language_list}
</AutoComplete>
)}
</Form.Item>
{ {
(projectsType === "deposit" || !projectsType) && (projectsType === "deposit" || !projectsType) &&
<React.Fragment> <React.Fragment>
<Form.Item <Form.Item
className="privatePart" label=".gitignore"
> >
{getFieldDecorator('ignoreFlag')( {getFieldDecorator('ignore', {
<Checkbox checked={ignoreFlag} onChange={(e)=>this.setState({ignoreFlag:e.target.checked})}>.gitignore</Checkbox> rules: [{
required: true, message: '请选择gitignore'
}, {
validator: (rule, value, callback) => this.checkId(rule, value, callback, GitignoreList, 'gitignore')
}],
})(
<AutoComplete
placeholder="请选择gitignore用来定义哪些文件不需要添加到版本管理中"
onChange={(value, e) => this.ChangePlatform(value, e, 'ignore', GitignoreList)}
className="plateAutoComplete"
onBlur={(value) => this.blurCategory(value, GitignoreList, "ignore")}
>
{ignore_list}
</AutoComplete>
)} )}
</Form.Item> </Form.Item>
{ ignoreFlag &&
<Form.Item>
{getFieldDecorator('ignore', {
rules: [{
required: ignoreFlag, message: '请选择gitignore'
}, {
validator: (rule, value, callback) => this.checkId(rule, value, callback, GitignoreList, 'gitignore')
}],
})(
<AutoComplete
placeholder="请选择gitignore用来定义哪些文件不需要添加到版本管理中"
onChange={(value, e) => this.ChangePlatform(value, e, 'ignore', GitignoreList)}
className="plateAutoComplete"
onBlur={(value) => this.blurCategory(value, GitignoreList, "ignore")}
>
{ignore_list}
</AutoComplete>
)}
</Form.Item>
}
<Form.Item <Form.Item
className="privatePart" label="开源许可证"
> >
{getFieldDecorator('licenseFlag')( {getFieldDecorator('license', {
<Checkbox checked={licenseFlag} onChange={(e)=>this.setState({licenseFlag:e.target.checked})}>开源许可证</Checkbox> rules: [{
required: true, message: '请选择开源许可证'
}, {
validator: (rule, value, callback) => this.checkId(rule, value, callback, LicensesList, '开源许可证')
}],
})(
<AutoComplete
placeholder="请选择开源许可证"
onChange={(value, e) => this.ChangePlatform(value, e, 'license', LicensesList)}
className="plateAutoComplete"
onBlur={(value) => this.blurCategory(value, LicensesList, "license")}
>
{license_list}
</AutoComplete>
)} )}
</Form.Item> </Form.Item>
{ licenseFlag &&
<Form.Item>
{getFieldDecorator('license', {
rules: [{
required: licenseFlag, message: '请选择开源许可证'
}, {
validator: (rule, value, callback) => this.checkId(rule, value, callback, LicensesList, '开源许可证')
}],
})(
<AutoComplete
placeholder="请选择开源许可证"
onChange={(value, e) => this.ChangePlatform(value, e, 'license', LicensesList)}
className="plateAutoComplete"
onBlur={(value) => this.blurCategory(value, LicensesList, "license")}
>
{license_list}
</AutoComplete>
)}
</Form.Item>
}
</React.Fragment> </React.Fragment>
} }
<Form.Item <Form.Item
label="可见性"
style={{ margin: "0px" }}
className="privatePart" className="privatePart"
> >
{getFieldDecorator('private')( {getFieldDecorator('private')(
<Checkbox value="limit">将项目设为私有<span className="font-13 color-grey-9">(只有项目所有人或拥有权限的项目成员才能看到)</span></Checkbox> <Checkbox value="limit">将项目设为私有<span className="ml15 font-13 color-grey-9">(只有项目所有人或拥有权限的项目成员才能看到)</span></Checkbox>
)} )}
</Form.Item > </Form.Item >
{ {
projectsType && projectsType === "mirror" && projectsType && projectsType === "mirror" &&
<Form.Item <Form.Item
label="迁移类型:"
style={{ margin: "0px" }}
className="privatePart" className="privatePart"
> >
{getFieldDecorator('is_mirror')( {getFieldDecorator('is_mirror')(
@ -536,69 +509,12 @@ class Index extends Component {
)} )}
</Form.Item > </Form.Item >
} }
<Form.Item <div>
style={{ margin: "0px" }}
className="privatePart"
>
{getFieldDecorator('categoreFlag')(
<Checkbox checked={categoreFlag} onChange={(e)=>this.setState({categoreFlag:e.target.checked})}>项目类别</Checkbox>
)}
</Form.Item>
{categoreFlag &&
<Form.Item
className="privatePart"
>
{getFieldDecorator('project_category', {
rules: [{
required: categoreFlag, message: '请选择项目类别',
}, {
validator: (rule, value, callback) => this.checkId(rule, value, callback, CategoryList, '项目类别')
}],
})(
<AutoComplete
placeholder="请选择项目类别"
onChange={(value, e) => this.ChangePlatform(value, e, 'project_category', CategoryList)}
className="plateAutoComplete"
onBlur={(value) => this.blurCategory(value, CategoryList, "project_category")}
>
{project_category_list}
</AutoComplete>
)}
</Form.Item>
}
<Form.Item
className="privatePart"
>
{getFieldDecorator('languageFlag')(
<Checkbox checked={languageFlag} onChange={(e)=>this.setState({languageFlag:e.target.checked})}>项目语言</Checkbox>
)}
</Form.Item>
{languageFlag &&
<Form.Item>
{getFieldDecorator('project_language', {
rules: [{
required: languageFlag, message: '请选择项目语言'
}, {
validator: (rule, value, callback) => this.checkId(rule, value, callback, LanguageList, '项目语言')
}],
})(
<AutoComplete
placeholder="请选择项目语言"
onChange={(value, e) => this.ChangePlatform(value, e, 'project_language', LanguageList)}
className="plateAutoComplete"
onBlur={(value) => this.blurCategory(value, LanguageList, "project_language")}
>
{project_language_list}
</AutoComplete>
)}
</Form.Item>
}
<div className="mt20">
<span className="ant-form-item-required"></span> <span className="ant-form-item-required"></span>
</div> </div>
<Form.Item className="formTip mt20"> <Form.Item className="formTip mt20">
<Button type="primary" onClick={this.subMitFrom} className="mr20">{projectsType && projectsType === "mirror" ? "导入" : "创建"}项目</Button> <Button type="primary" onClick={this.subMitFrom} className="mr20">创建项目</Button>
<Link to={'/explore'} className="btn_32">取消</Link> <Link to={'/projects'} className="btn_32">取消</Link>
</Form.Item> </Form.Item>
</div> </div>
</Form> </Form>

View File

@ -12,13 +12,7 @@
border-bottom: 1px solid #f0f0f0 border-bottom: 1px solid #f0f0f0
} }
.newPanel_content{ .newPanel_content{
padding:2rem; padding:1rem 2rem;
}
.newPanel_content form .ant-row.ant-form-item{
margin-bottom: 25px;
}
.newPanel_content .ant-form-item-label label{
font-size: 16px;
} }
.newPanel_content .ant-form-item-control-wrapper{ .newPanel_content .ant-form-item-control-wrapper{
flex: 1; flex: 1;
@ -31,35 +25,24 @@
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
.newContent_inline{ .newContent_inline{
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-between; justify-content: space-between;
align-items:flex-end align-items:flex-end
} }
.explainPos{
.ant-form-explain{
position: absolute;
}
}
.newContent_inline > .ant-form-item:nth-child(2){ .newContent_inline > .ant-form-item:nth-child(2){
margin-left: 20px; margin-left: 20px;
} }
.privatePart{ .newPanel_content .privatePart .ant-form-item-label{
margin-bottom: 0px!important; margin-left: 0px;
.ant-form-item-label{
margin-left: 0px;
}
} }
.newPanel_content .ant-form-item-label{ .newPanel_content .ant-form-item-label{
line-height: 25px; line-height: 25px;
height: 25px; height: 25px;
} margin-left: -0.8rem;
.plateAutoComplete{
.ant-input{
height: 34px!important;
}
} }
@media screen and (max-width: 750px){ @media screen and (max-width: 750px){
.newPanel_content{ .newPanel_content{

View File

@ -86,7 +86,7 @@ class UserSubmitComponent extends Component {
const { getTopCount } = this.props; const { getTopCount } = this.props;
getTopCount && getTopCount(values.branchname); getTopCount && getTopCount(values.branchname);
} }
let url = `/${owner}/${projectsId}${values.branchname ? `/tree/${turnbar(values.branchname)}`: (branch ? `/tree/${turnbar(branch)}` : "")}`; let url = `/projects/${owner}/${projectsId}${values.branchname ? `/tree/${turnbar(values.branchname)}`: (branch ? `/tree/${turnbar(branch)}` : "")}`;
this.props.history.push(url); this.props.history.push(url);
} }
}) })
@ -123,7 +123,7 @@ class UserSubmitComponent extends Component {
this.setState({ isSpin: false }); this.setState({ isSpin: false });
if (result.data && result.data.status === 1) { if (result.data && result.data.status === 1) {
let b = currentBranch || branch; let b = currentBranch || branch;
let url = `/${owner}/${projectsId}${(values.branchname ? `/tree/${turnbar(values.branchname)}` : (b ? `/tree/${turnbar(b)}`:""))}`; let url = `/projects/${owner}/${projectsId}${(values.branchname ? `/tree/${turnbar(values.branchname)}` : (b ? `/tree/${turnbar(b)}`:""))}`;
this.props.history.push(url); this.props.history.push(url);
this.props.showNotification("文件修改成功!"); this.props.showNotification("文件修改成功!");
} }
@ -150,7 +150,7 @@ class UserSubmitComponent extends Component {
return ( return (
<div> <div>
<span className="df" style={{ alignItems: "center" }}> <span className="df" style={{ alignItems: "center" }}>
<Link to={`/${current_user && current_user.login}`} className="show-user-link" > <Link to={`/users/${current_user && current_user.login}`} className="show-user-link" >
<img <img
src={getImageUrl(`/${current_user && current_user.image_url}`)} src={getImageUrl(`/${current_user && current_user.image_url}`)}
alt="" alt=""
@ -248,7 +248,7 @@ class UserSubmitComponent extends Component {
<Button <Button
type="primary grey" type="primary grey"
onClick={() => { onClick={() => {
this.props.history.push(`/${owner}/${projectsId}`); this.props.history.push(`/projects/${owner}/${projectsId}`);
}} }}
className="mr20" className="mr20"
> >

View File

@ -63,11 +63,11 @@ function Apply(props) {
{ {
list.map((i,k)=>{ list.map((i,k)=>{
return( return(
<li key={k}> <li>
<Link to={`/${i.user && i.user.login}`}><img src={getImageUrl(`/${i.user && i.user.image_url}`)} alt="" className="notifyImg"/></Link> <Link to={`/users/${i.user && i.user.login}`}><img src={getImageUrl(`/${i.user && i.user.image_url}`)} alt="" className="notifyImg"/></Link>
<div className="notifyFlex"> <div className="notifyFlex">
<p className="notifyInfos"> <p className="notifyInfos">
<Link to={`/${i.user && i.user.login}`} className="font-15 mr20">{i.user && i.user.name}</Link> <Link to={`/users/${i.user && i.user.login}`} className="font-15 mr20">{i.user && i.user.name}</Link>
<span className="color-grey-9">{i.time_ago}</span> <span className="color-grey-9">{i.time_ago}</span>
</p> </p>
<FlexAJ> <FlexAJ>

View File

@ -33,7 +33,7 @@ function Index(props){
useEffect(()=>{ useEffect(()=>{
if((username && current_user && (current_user.login !== username))){ if((username && current_user && (current_user.login !== username))){
props.history.push(`/${username}`); props.history.push(`/users/${username}`);
} }
},[current_user,username]) },[current_user,username])
@ -47,14 +47,14 @@ function Index(props){
useEffect(()=>{ useEffect(()=>{
if(pathname && username){ if(pathname && username){
if(pathname === `/${username}/notice`){ if(pathname === `/users/${username}/notice`){
setMenu("notify"); setMenu("notify");
changeNum(user.undo_messages); changeNum(user.undo_messages);
} }
if(pathname === `/${username}/notice/undo`){ if(pathname === `/users/${username}/notice/undo`){
setMenu("undo"); setMenu("undo");
} }
if(pathname === `/${username}/notice/apply`){ if(pathname === `/users/${username}/notice/apply`){
setMenu("apply"); setMenu("apply");
} }
} }
@ -70,9 +70,9 @@ function Index(props){
function deleteEvent(type,count) { function deleteEvent(type,count) {
let c = count; let c = count;
if(type==="apply"){ if(type==="apply"){
setApplyCount(applyCount-count);
}else if(type==="undo"){
setTransferCount(transferCount-count); setTransferCount(transferCount-count);
}else if(type==="undo"){
setApplyCount(applyCount-count);
}else{ }else{
setMessagesCount(0); setMessagesCount(0);
c = messagesCount; c = messagesCount;
@ -84,19 +84,19 @@ function Index(props){
<div> <div>
<ul className="noticeMenu"> <ul className="noticeMenu">
<li className={menu === "notify" ? "active":""}> <li className={menu === "notify" ? "active":""}>
<Link to={`/${username}/notice`} onClick={changeNum}> <Link to={`/users/${username}/notice`} onClick={changeNum}>
<span>通知</span> <span>通知</span>
{messagesCount ? <span className="unNum">{messagesCount}</span>:""} {messagesCount ? <span className="unNum">{messagesCount}</span>:""}
</Link> </Link>
</li> </li>
<li className={menu === "undo" ? "active":""}> <li className={menu === "undo" ? "active":""}>
<Link to={`/${username}/notice/undo`}> <Link to={`/users/${username}/notice/undo`}>
<span>接收仓库</span> <span>接收仓库</span>
{transferCount ? <span className="unNum">{transferCount}</span>:""} {transferCount ? <span className="unNum">{transferCount}</span>:""}
</Link> </Link>
</li> </li>
<li className={menu === "apply" ? "active":""}> <li className={menu === "apply" ? "active":""}>
<Link to={`/${username}/notice/apply`}> <Link to={`/users/${username}/notice/apply`}>
<span>成员申请</span> <span>成员申请</span>
{applyCount ? <span className="unNum">{applyCount}</span>:""} {applyCount ? <span className="unNum">{applyCount}</span>:""}
</Link> </Link>
@ -104,19 +104,19 @@ function Index(props){
</ul> </ul>
<Switch> <Switch>
<Route <Route
path="/:username/notice/apply" path="/users/:username/notice/apply"
render={(p) => { render={(p) => {
return <Apply {...props} {...p} deleteEvent={deleteEvent}/>; return <Apply {...props} {...p} deleteEvent={deleteEvent}/>;
}} }}
></Route> ></Route>
<Route <Route
path="/:username/notice/undo" path="/users/:username/notice/undo"
render={(p) => { render={(p) => {
return <UndoEvent {...props} {...p} deleteEvent={deleteEvent}/>; return <UndoEvent {...props} {...p} deleteEvent={deleteEvent}/>;
}} }}
></Route> ></Route>
<Route <Route
path="/:username/notice" path="/users/:username/notice"
render={(p) => { render={(p) => {
return <Notify {...props} {...p} deleteEvent={deleteEvent}/>; return <Notify {...props} {...p} deleteEvent={deleteEvent}/>;
}} }}

View File

@ -44,13 +44,13 @@ function Notify(props){
if(status){ if(status){
switch(status){ switch(status){
case 'canceled': case 'canceled':
return <p>取消转移<Link to={`/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>仓库</p> return <p>取消转移<Link to={`/projects/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>仓库</p>
case 'common': case 'common':
return <p>正在将<Link to={`/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>仓库转移给<Link to={`/${owner && owner.login}`}>{owner && owner.name}</Link></p> return <p>正在将<Link to={`/projects/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>仓库转移给<Link to={`/users/${owner && owner.login}`}>{owner && owner.name}</Link></p>
case 'successed': case 'successed':
return <p><Link to={`/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>仓库成功转移给<Link to={`/${owner && owner.login}`}>{owner && owner.name}</Link></p> return <p><Link to={`/projects/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>仓库成功转移给<Link to={`/users/${owner && owner.login}`}>{owner && owner.name}</Link></p>
default: default:
return <p>拒绝转移<Link to={`/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>仓库</p> return <p>拒绝转移<Link to={`/projects/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>仓库</p>
} }
}else{ }else{
return "" return ""
@ -62,9 +62,9 @@ function Notify(props){
if(status){ if(status){
switch(status){ switch(status){
case 'successed': case 'successed':
return <p>已通过你加入<Link to={`/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>项目的申请</p> return <p>已通过你加入<Link to={`/projects/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>项目的申请</p>
default: default:
return <p>已拒绝你加入<Link to={`/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>项目的申请</p> return <p>已拒绝你加入<Link to={`/projects/${project && project.owner && project.owner.login}/${project && project.identifier}`}>{project && project.name}</Link>项目的申请</p>
} }
}else{ }else{
return "" return ""
@ -80,13 +80,12 @@ function Notify(props){
<ul className="notifyList"> <ul className="notifyList">
{ {
list.map((i,k)=>{ list.map((i,k)=>{
console.log(i);
return( return(
<li i={k}> <li>
<Link to={`/${i.applied_user && i.applied_user.login}`}><img src={getImageUrl(`/${i.applied_user && i.applied_user.image_url}`)} alt="" className="notifyImg" /></Link> <Link to={`/users/${i.login}`}><img src={getImageUrl(`/${i.applied_user && i.applied_user.image_url}`)} alt="" className="notifyImg"/></Link>
<div className="notifyFlex"> <div className="notifyFlex">
<p className="notifyInfos"> <p className="notifyInfos">
<Link to={`/${i.applied_user && i.applied_user.login}`} className="font-15 mr20">{i.applied_user && i.applied_user.name}</Link> <Link to={`/users/${i.applied_user && i.applied_user.login}`} className="font-15 mr20">{i.applied_user && i.applied_user.name}</Link>
<span className="color-grey-9">{i.time_ago}</span> <span className="color-grey-9">{i.time_ago}</span>
</p> </p>
{ i.applied_type === "AppliedProject" ? renderApplyStatus(i.status,i.applied):renderStatus(i.status,i.applied)} { i.applied_type === "AppliedProject" ? renderApplyStatus(i.status,i.applied):renderStatus(i.status,i.applied)}

View File

@ -53,7 +53,7 @@ function UndoEvent(props){
Axios.post(url).then(result=>{ Axios.post(url).then(result=>{
if(result && result.data){ if(result && result.data){
getList(); getList();
props && props.deleteEvent("undo",1); props && props.deleteEvent("apply",1);
} }
}).catch(error=>{}) }).catch(error=>{})
} }
@ -61,23 +61,23 @@ function UndoEvent(props){
return( return(
<div> <div>
<Spin spinning={isSpin}> <Spin spinning={isSpin}>
<div > <div style={{minHeight:"400px"}}>
{ {
list && list.length > 0 ? list && list.length > 0 ?
<ul className="notifyList"> <ul className="notifyList">
{ {
list.map((i,k)=>{ list.map((i,k)=>{
return( return(
<li key={k}> <li>
<Link to={`/${i.user && i.user.login}`}><img src={getImageUrl(`/${i.user && i.user.image_url}`)} alt="" className="notifyImg"/></Link> <Link to={`/users/${i.user && i.user.login}`}><img src={getImageUrl(`/${i.user && i.user.image_url}`)} alt="" className="notifyImg"/></Link>
<div className="notifyFlex"> <div className="notifyFlex">
<p className="notifyInfos"> <p className="notifyInfos">
<Link to={`/${i.user && i.user.login}`} className="font-15 mr20">{i.user && i.user.name}</Link> <Link to={`/users/${i.login}`} className="font-15 mr20">{i.user && i.user.name}</Link>
<span className="color-grey-9">{i.time_ago}</span> <span className="color-grey-9">{i.time_ago}</span>
</p> </p>
<FlexAJ> <FlexAJ>
<p className="color-grey-6">请求将仓库<Link to={`/${i.project && i.project.owner && i.project.owner.login}/${i.project && i.project.identifier}`}>{i.project && i.project.name}</Link> <p className="color-grey-6">请求将仓库<Link to={`/projects/${i.project && i.project.owner && i.project.owner.login}/${i.project && i.project.identifier}`}>{i.project && i.project.name}</Link>
转移给<Link to={`/${i.owner && i.owner.login}`}>{i.owner && i.owner.name}</Link>是否接受</p> 转移给<Link to={`/users/${i.owner && i.owner.login}`}>{i.owner && i.owner.name}</Link>是否接受</p>
{ {
i.status === "common" && i.status === "common" &&
<span> <span>

View File

@ -85,7 +85,7 @@ class Detail extends Component {
}) })
.then((result) => { .then((result) => {
if (result) { if (result) {
this.props.history.push(`/${owner}/${projectsId}/issues`); this.props.history.push(`/projects/${owner}/${projectsId}/issues`);
} }
}) })
.catch((error) => { .catch((error) => {
@ -132,7 +132,7 @@ class Detail extends Component {
.then((result) => { .then((result) => {
if (result) { if (result) {
this.props.history.push( this.props.history.push(
`/${owner}/${projectsId}/issues/${result.data.issue_id}/copyetail` `/projects/${owner}/${projectsId}/issues/${result.data.issue_id}/copyetail`
); );
} }
}) })
@ -207,7 +207,7 @@ class Detail extends Component {
<div className="background-f boder-4"> <div className="background-f boder-4">
<div className="grid-item border-1f pd20 "> <div className="grid-item border-1f pd20 ">
<Link <Link
to={`/${data && data.author_login}`} to={`/users/${data && data.author_login}`}
className="show-user-link" className="show-user-link"
> >
<img <img
@ -240,7 +240,7 @@ class Detail extends Component {
<div className="mt10"> <div className="mt10">
<span className="color-grey-9 mr5"></span> <span className="color-grey-9 mr5"></span>
<Link <Link
to={`/${data && data.author_login}`} to={`/users/${data && data.author_login}`}
className="show-user-link color-blue" className="show-user-link color-blue"
> >
{data && data.author_name} {data && data.author_name}
@ -269,7 +269,7 @@ class Detail extends Component {
</Popconfirm> </Popconfirm>
<Link <Link
to={`/${owner}/${projectsId}/issues/${orderId}/updatedetail`} to={`/projects/${owner}/${projectsId}/issues/${orderId}/updatedetail`}
className="color-blue fr" className="color-blue fr"
> >
编辑 编辑

View File

@ -4,7 +4,6 @@ import { Dropdown, Icon, Menu, Pagination, Typography, Popconfirm, Spin } from '
import NoneData from '../Nodata'; import NoneData from '../Nodata';
import axios from 'axios'; import axios from 'axios';
import './order.css'; import './order.css';
import CheckProfile from '../Component/ProfileModal/Profile';
const { Text } = Typography; const { Text } = Typography;
@ -119,12 +118,11 @@ class Milepost extends Component {
} }
ChangePage = (page) => { ChangePage = (page) => {
document.body.scrollIntoView();
this.setState({ this.setState({
page page
}) })
const { status } = this.state;
this.getList( page , status ); this.getList(page);
} }
// 排序 // 排序
@ -189,7 +187,7 @@ class Milepost extends Component {
</ul> </ul>
{ {
data && data.user_admin_or_member ? data && data.user_admin_or_member ?
<CheckProfile {...this.props} className="topWrapper_btn" sureFunc={() => {this.props.history.push(`/${owner}/${projectsId}/milestones/new`)}}>新的里程碑</CheckProfile> <Link to={`/projects/${owner}/${projectsId}/milestones/new`} className="topWrapper_btn">新的里程碑</Link>
: '' : ''
} }
</div> </div>
@ -206,7 +204,7 @@ class Milepost extends Component {
<div className="milepostwidth"> <div className="milepostwidth">
<div className="grid-item width100"> <div className="grid-item width100">
<i className="iconfont icon-lubiaosignpost3 font-12 mr3"></i> <i className="iconfont icon-lubiaosignpost3 font-12 mr3"></i>
<Link to={`/${owner}/${projectsId}/milestones/${item.id}`} className="font-16">{item.name}</Link> <Link to={`/projects/${owner}/${projectsId}/milestones/${item.id}`} className="font-16">{item.name}</Link>
</div> </div>
</div> </div>
</div> </div>
@ -230,7 +228,7 @@ class Milepost extends Component {
<div className="milepostleft"> <div className="milepostleft">
<div className="grid-item ml15 color-grey-9"> <div className="grid-item ml15 color-grey-9">
<i className="iconfont icon-bianji3 font-14 mr5"></i> <i className="iconfont icon-bianji3 font-14 mr5"></i>
<Link to={`/${owner}/${projectsId}/milestones/${item.id}/edit`} className="color-grey-9">编辑</Link> <Link to={`/projects/${owner}/${projectsId}/milestones/${item.id}/edit`} className="color-grey-9">编辑</Link>
</div> </div>
<div className="grid-item ml15 color-grey-9"> <div className="grid-item ml15 color-grey-9">
<i className={item.status === "closed" ? "iconfont icon-gouxuan font-14 mr5":"iconfont icon-yiguanbi1 font-14 mr5"}></i> <i className={item.status === "closed" ? "iconfont icon-gouxuan font-14 mr5":"iconfont icon-yiguanbi1 font-14 mr5"}></i>
@ -261,7 +259,7 @@ class Milepost extends Component {
{ {
data && data.versions_count > limit ? data && data.versions_count > limit ?
<div className="mt30 mb50 edu-txt-center"> <div className="mt30 mb50 edu-txt-center">
<Pagination simple current={page} total={data && data.versions_count} pageSize={limit} onChange={this.ChangePage}></Pagination> <Pagination simple defaultCurrent={page} total={data && data.versions_count} pageSize={limit} onChange={this.ChangePage}></Pagination>
</div> : "" </div> : ""
} }
</div> </div>

View File

@ -2,8 +2,7 @@ import React, { Component } from "react";
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { Dropdown, Menu, Icon, Pagination, Spin } from 'antd'; import { Dropdown, Menu, Icon, Pagination, Spin } from 'antd';
import './order.css'; import './order.css';
import { FlexAJ } from '../Component/layout'; import { FlexAJ } from '../Component/layout'
import CheckProfile from '../Component/ProfileModal/Profile';
import NoneData from '../Nodata'; import NoneData from '../Nodata';
import OrderItem from './OrderItem'; import OrderItem from './OrderItem';
@ -114,7 +113,7 @@ class MilepostDetail extends Component {
this.setState({ this.setState({
data: result.data, data: result.data,
issues: result.data.issues, issues: result.data.issues,
search_count: params.status_type ==="1" ? result.data.open_issues_count : result.data.close_issues_count, search_count: result.data.search_count,
isSpin: false isSpin: false
}) })
} }
@ -239,8 +238,8 @@ class MilepostDetail extends Component {
<span className="font-weight-bold">{data && data.percent && data.percent.toFixed(2)}%完成 </span> <span className="font-weight-bold">{data && data.percent && data.percent.toFixed(2)}%完成 </span>
</span> </span>
<div className="milepostdiv"> <div className="milepostdiv">
<Link to={`/${owner}/${projectsId}/milestones/${meilid}/edit`} className="topWrapper_btn" style={{ marginRight: 15 }} >编辑里程碑</Link> <Link to={`/projects/${owner}/${projectsId}/milestones/${meilid}/edit`} className="topWrapper_btn" style={{ marginRight: 15 }} >编辑里程碑</Link>
<CheckProfile {...this.props} sureFunc={()=>{this.props.history.push(`/${owner}/${projectsId}/issues/${meilid}/new`)}} className="topWrapper_btn">创建易修</CheckProfile> <Link to={`/projects/${owner}/${projectsId}/issues/${meilid}/new`} className="topWrapper_btn">创建易修</Link>
</div> </div>
</FlexAJ> </FlexAJ>
</div> </div>

Some files were not shown because too many files have changed in this diff Show More