Compare commits
1286 Commits
master
...
dev_milita
Author | SHA1 | Date |
---|---|---|
![]() |
6387d2c775 | |
|
d42793850d | |
|
1acb91286a | |
|
f45217816f | |
|
552522ef38 | |
|
2b72c68cb9 | |
|
16e5536840 | |
|
76a00475a0 | |
|
7b0a6f46dd | |
|
52adcb1938 | |
|
ee7c95965d | |
|
f2b2e7716d | |
|
86da295674 | |
|
7e548289fb | |
|
0a3670759c | |
|
c21ebf78c7 | |
|
bef193dbb9 | |
|
16e408c9e8 | |
|
f8383b43c1 | |
|
03a8e054cf | |
|
e091a061c8 | |
|
70dc6738ab | |
|
46fb02edb1 | |
|
09078a7d3c | |
|
5923d91bec | |
|
177e45979a | |
![]() |
2a46e32d02 | |
![]() |
d0e1603bbf | |
![]() |
7b63132b8b | |
|
1ec50c51b2 | |
|
20e8e98655 | |
|
e7c71d35de | |
|
d50fdb602c | |
|
1c97c59adc | |
|
c5ee88a23c | |
![]() |
6d1bf5235f | |
![]() |
62c96298e1 | |
|
a01cd81ea9 | |
![]() |
a04c61d414 | |
|
cadf447f45 | |
|
161adbe6c7 | |
|
b761369320 | |
|
1aaae843f2 | |
|
d0ac51952f | |
|
2c6861f359 | |
|
462243a3c9 | |
|
f8f479b6f9 | |
|
c39d3f6938 | |
|
bf754feb48 | |
|
5d05e5a08e | |
|
0adfda1035 | |
|
f9c380e372 | |
|
057d5431ff | |
|
c01c1f0d98 | |
|
ee3e3c6140 | |
|
14e1e0d743 | |
|
40ff820919 | |
|
0803a78ae4 | |
|
34fa849110 | |
|
c4d185a478 | |
|
dd144f1cc0 | |
|
b462961bb3 | |
|
2d428e53f6 | |
|
26d853ad38 | |
|
1007fcb692 | |
|
9e55dd084b | |
|
b18cd18c57 | |
|
6fac427540 | |
|
7b3ed4e79d | |
|
92b0777b4d | |
|
6f1ce68535 | |
|
0f26429b7d | |
|
1928e98c9d | |
|
7567cb2040 | |
|
9e24f56395 | |
|
b64d29a9a6 | |
|
ade93746ab | |
|
94f8f84456 | |
|
769ebc00d3 | |
|
816d6f609e | |
|
1a966ba129 | |
|
ebd0471888 | |
|
935a394f2a | |
|
555ca5c831 | |
|
b633da312d | |
|
e857d728ab | |
|
d0f520033e | |
|
0ea1ddccff | |
|
a6e01fbeb6 | |
|
b87c57f77d | |
![]() |
c2b1bbbf11 | |
|
951c8c2462 | |
|
98b7f23f48 | |
|
60f40e0a96 | |
|
b8c0911861 | |
|
390ea5cfff | |
|
e2be614672 | |
|
d455c3cef5 | |
|
dd7fd3ebfd | |
![]() |
9592814704 | |
|
574c068beb | |
![]() |
f9bc9d72bc | |
|
a222ad3f73 | |
|
7de4abb433 | |
|
c5dfa5a774 | |
![]() |
3ce24b9877 | |
![]() |
b5431907b5 | |
![]() |
1e9d7b74f5 | |
|
58b6d70b70 | |
|
aa59fdeb6c | |
|
967f9225a3 | |
|
0c60d7c4b9 | |
|
49b1bc9775 | |
|
457f7732de | |
|
09839d9063 | |
|
6b087e9783 | |
|
8c4d7b3796 | |
|
4979a4db18 | |
|
e037c77136 | |
|
df6985a695 | |
|
5c4ec270f1 | |
![]() |
d47c0bb55a | |
|
95c9b445c1 | |
![]() |
c897acce4b | |
|
39a96cbd05 | |
![]() |
7532fabbca | |
![]() |
bd3328d3d5 | |
|
4ac29b18dd | |
|
53fd4e2f00 | |
|
c56613a5ca | |
|
b19e4c0b3c | |
![]() |
e54cfec859 | |
![]() |
79f0610376 | |
![]() |
cb71e44a3a | |
|
2f43ff82d0 | |
![]() |
016718f3e2 | |
|
386a0efe85 | |
![]() |
18dc164cc2 | |
|
4c0fe27dac | |
![]() |
c6e1f7126d | |
|
ac573c6e25 | |
![]() |
0c8de16bf9 | |
![]() |
45dde95b5f | |
![]() |
b5198b1673 | |
![]() |
bf822e763d | |
|
268e0698f3 | |
![]() |
cba1db6c3d | |
![]() |
9d13623992 | |
![]() |
325eeb7550 | |
![]() |
83d97b3a1c | |
|
57892ff98e | |
![]() |
843c49c3a5 | |
![]() |
611366e6af | |
|
1347c01176 | |
![]() |
3f602dacb7 | |
![]() |
139dfdf7cd | |
![]() |
3791339b98 | |
|
4536144561 | |
![]() |
9031da23be | |
![]() |
b0a35d973d | |
![]() |
dd04843fdc | |
|
fa57794270 | |
![]() |
2d2ce3b833 | |
![]() |
867a864348 | |
![]() |
6ad0070c4d | |
![]() |
145ebe21c6 | |
|
81864a0a55 | |
![]() |
2ddc08715e | |
![]() |
1a80db81cf | |
![]() |
e2915a7b05 | |
|
f43b902eb9 | |
![]() |
ab0eaa520b | |
|
cc4309f6b5 | |
![]() |
5511912765 | |
![]() |
76c90faab5 | |
![]() |
16f16c7183 | |
![]() |
d8c06883b4 | |
|
146541acbd | |
![]() |
4a56895be2 | |
![]() |
2d54110047 | |
![]() |
018244c368 | |
![]() |
4b4ac537c0 | |
![]() |
d14d9ba630 | |
![]() |
0266654718 | |
|
2da1a838d4 | |
![]() |
ddb39a65fc | |
![]() |
b88dbfa36f | |
![]() |
283180c7ec | |
![]() |
91681b4cea | |
![]() |
d65ab4a920 | |
![]() |
5c00e6fbea | |
![]() |
d6b02e83f7 | |
|
3a024329a0 | |
![]() |
eaba41ced0 | |
![]() |
2b176df99a | |
![]() |
922ee1b535 | |
![]() |
39bd33b1aa | |
![]() |
01b9f84a8b | |
![]() |
6ed4d03ee9 | |
![]() |
6f39cadda0 | |
![]() |
f47f2b8f37 | |
![]() |
f254b9cb71 | |
![]() |
2580a61f42 | |
![]() |
f97f2d4c80 | |
![]() |
48edb3df17 | |
![]() |
c8eeeb4c3a | |
![]() |
4cf59d0f7d | |
![]() |
4c820954d6 | |
![]() |
c4962c4efa | |
![]() |
cec0c5d8da | |
|
9fd5357dc6 | |
![]() |
80bd13a47f | |
![]() |
9cdcb99695 | |
![]() |
273bf478b4 | |
![]() |
5efeb93e9e | |
|
28c54cf03e | |
![]() |
3dac15aa86 | |
![]() |
da4ffd203e | |
![]() |
7e32d426c8 | |
![]() |
f4f3545fd5 | |
![]() |
5ca0cdabe7 | |
![]() |
09e08af180 | |
![]() |
ba8c86ada7 | |
![]() |
aa2547290b | |
![]() |
a1b47c1340 | |
![]() |
1c279d7b06 | |
![]() |
17daf34f07 | |
![]() |
070af23ff2 | |
![]() |
f129a2cc7d | |
![]() |
eaf1cdfbfd | |
|
5569f35ee1 | |
![]() |
c97dcb1192 | |
![]() |
3e01886af0 | |
|
1778e751ad | |
![]() |
15a58c61d6 | |
![]() |
cc274970d8 | |
![]() |
129f7eab8d | |
![]() |
a9631228ec | |
![]() |
0eb589e0df | |
![]() |
dd34da9ed4 | |
![]() |
b3b50f462b | |
![]() |
9c2aac1907 | |
![]() |
7cf2c4fc2e | |
![]() |
0c5bd5503b | |
![]() |
fecf0a2b9d | |
![]() |
f9af1c814f | |
![]() |
97e8547c94 | |
|
3348a459be | |
![]() |
f4a67ee68e | |
|
f0dcdcddaf | |
![]() |
ba33ebc6f6 | |
![]() |
cf729cbd8b | |
![]() |
73b5f6650c | |
![]() |
990459823e | |
![]() |
a6b293af80 | |
![]() |
6710dc0780 | |
![]() |
b80d37fb9c | |
![]() |
15d73d4f30 | |
![]() |
e9e9851e0c | |
![]() |
cae5f321aa | |
![]() |
43c49a1fb7 | |
![]() |
c70e22d550 | |
![]() |
e0c0125004 | |
![]() |
f2ce66fa01 | |
![]() |
79bf752d7b | |
![]() |
1263ddd427 | |
![]() |
b1dbcaba9b | |
![]() |
73b0471a13 | |
![]() |
15116be32a | |
![]() |
b34fea03c8 | |
![]() |
735b096894 | |
![]() |
b1ece3e83f | |
![]() |
77c610c65e | |
![]() |
cb4e23a42d | |
![]() |
8adec8ce1d | |
![]() |
ee19abf99c | |
![]() |
b394081452 | |
![]() |
4133b296f1 | |
![]() |
ca868516bf | |
![]() |
44d3084cc8 | |
![]() |
cd11f3ea6f | |
![]() |
d73de94f35 | |
![]() |
36d20c5250 | |
![]() |
c20332b7a3 | |
![]() |
672726d683 | |
![]() |
b9682b9235 | |
![]() |
2c1a987e45 | |
![]() |
225013b74f | |
![]() |
6c55f5b039 | |
![]() |
bc37559e6f | |
|
58947d071e | |
![]() |
2d5101b865 | |
![]() |
18bd8141a2 | |
![]() |
96f15f3340 | |
![]() |
b4edd42197 | |
![]() |
0aec942c75 | |
![]() |
45a550a000 | |
![]() |
be60c68d60 | |
![]() |
b42158dc90 | |
![]() |
baa24c665a | |
![]() |
2805cd0d79 | |
![]() |
a94a8393d0 | |
![]() |
cbbf17c27a | |
![]() |
9b29599aef | |
![]() |
42b0a5dfad | |
![]() |
e117381ad5 | |
|
b4940b75d5 | |
![]() |
fd25431b12 | |
![]() |
2f019d688d | |
![]() |
073d304d2d | |
![]() |
b13d68e568 | |
![]() |
44cb89db49 | |
![]() |
e901dad75f | |
![]() |
73e19d8937 | |
![]() |
03787e1f7e | |
![]() |
f4e56f1ac5 | |
![]() |
0ee81bdbcb | |
![]() |
4e98b32950 | |
![]() |
364bdcf6d0 | |
![]() |
7cb19867f5 | |
![]() |
91839339fe | |
![]() |
04a4c16e24 | |
![]() |
1d5dacb13b | |
![]() |
acfe4f0e74 | |
![]() |
6b5c021e79 | |
![]() |
bea7069af5 | |
|
5b7235fa1e | |
![]() |
2f1f802b59 | |
![]() |
53ff8c47ce | |
![]() |
146ba8057c | |
![]() |
a781b01a8a | |
![]() |
53f531a68a | |
![]() |
7318922eaf | |
![]() |
da41f9582e | |
![]() |
223d82b5ac | |
![]() |
449a761602 | |
![]() |
3d1585411b | |
![]() |
c3ce2cc6a0 | |
![]() |
dfcecc1f2d | |
![]() |
bf6e95d182 | |
![]() |
041fe24b03 | |
|
744153b4bd | |
![]() |
c0fe0772e4 | |
![]() |
094e7d1d5a | |
![]() |
5459f76349 | |
![]() |
7d37a565b3 | |
![]() |
89eeee1677 | |
![]() |
e5e7a29a7d | |
![]() |
05ca2af608 | |
![]() |
f975ab0ec3 | |
![]() |
3596f0ed2b | |
![]() |
ab4f72701b | |
![]() |
5bbc3cace1 | |
![]() |
66be86adc8 | |
![]() |
ff0515281b | |
![]() |
4ca7d4416c | |
![]() |
4cf1d9b429 | |
![]() |
28bb01f3fe | |
![]() |
99ceed6da4 | |
![]() |
d1d9213527 | |
![]() |
3ac6021d9e | |
|
5dc9bc07ad | |
![]() |
86cc9735c5 | |
![]() |
75d789864a | |
![]() |
6012207a26 | |
![]() |
4344fcae0f | |
![]() |
85daac35a2 | |
|
16f41f4299 | |
![]() |
eef78ab880 | |
![]() |
38b1a3704b | |
![]() |
e56c271540 | |
![]() |
01a3566c1b | |
![]() |
4264c127d9 | |
![]() |
8159325806 | |
![]() |
b5fbde51af | |
|
400bd28801 | |
![]() |
15b2ce6ea9 | |
![]() |
3ae9284494 | |
|
fb63377996 | |
![]() |
6fc87e2ae3 | |
![]() |
e3f859b131 | |
![]() |
768a44f8b3 | |
![]() |
f57380b167 | |
![]() |
4c86825e0c | |
|
ea5933b4a9 | |
![]() |
7159f76f3b | |
![]() |
d20314661a | |
![]() |
9b7eb2ab85 | |
![]() |
0c79576520 | |
![]() |
22b3fe4a25 | |
![]() |
66e68f1626 | |
![]() |
7f2856a3f7 | |
![]() |
89ff62efa9 | |
![]() |
7295349d33 | |
![]() |
20820bef12 | |
![]() |
27f7eafa03 | |
![]() |
939448888a | |
|
7009db819c | |
![]() |
2f188824bd | |
![]() |
fa7c79143a | |
![]() |
7f44d0e115 | |
![]() |
9b0fd46188 | |
![]() |
923b183ff1 | |
|
60f5e7f430 | |
|
9527f69486 | |
![]() |
8440825284 | |
![]() |
320e619206 | |
![]() |
9d68d9ce09 | |
![]() |
4b536060b6 | |
|
d77e7bbd55 | |
![]() |
284c6df9fa | |
|
5e064838bc | |
![]() |
4cd32dfe52 | |
|
5730c2e37c | |
|
b82e7d9d69 | |
![]() |
eb25f7f339 | |
![]() |
bbe57de424 | |
![]() |
ecf1347ad9 | |
![]() |
d2e829e79b | |
|
03c94525aa | |
![]() |
bd3ea041ee | |
![]() |
b3745d5b3a | |
![]() |
4cf5236fde | |
|
9db4f1b18c | |
|
677c1cee1b | |
![]() |
d26b304a17 | |
![]() |
93dfd8d120 | |
![]() |
a2a2847010 | |
![]() |
f71137b8f1 | |
|
c13c7025dd | |
|
d8384ab4bd | |
![]() |
5d5570b6fc | |
![]() |
ad27cfb042 | |
![]() |
9568a60915 | |
![]() |
6c0ab5b310 | |
|
882f0760e8 | |
|
5e337cb94f | |
![]() |
7da80ad561 | |
![]() |
5e98cebfd3 | |
![]() |
f6ffe6357c | |
![]() |
553901c8e0 | |
![]() |
d4c6abbf80 | |
![]() |
feaf59c146 | |
![]() |
0bebecb28b | |
![]() |
8f92f99d84 | |
![]() |
b927d471a5 | |
|
569bc39e1e | |
![]() |
4b31ec629a | |
![]() |
fdc9d9432e | |
![]() |
8386e95676 | |
|
0e643287f9 | |
|
8a72ace09d | |
![]() |
b4e40c5ff5 | |
![]() |
e5b0e72a44 | |
![]() |
c2c3f3ef98 | |
![]() |
250f06f061 | |
![]() |
d30c466b4b | |
![]() |
009c511592 | |
![]() |
694fd1c394 | |
|
4f9a03a1af | |
![]() |
9eeb8be105 | |
![]() |
793143ad6c | |
![]() |
2725df661c | |
![]() |
8c0f99c274 | |
![]() |
bf80860f78 | |
![]() |
c8fd59d101 | |
![]() |
33f9005e2d | |
|
ea737f5b61 | |
![]() |
9711945393 | |
![]() |
de2d9751fc | |
![]() |
e0b4cdc16c | |
![]() |
2cec3f6ab4 | |
![]() |
0abf836679 | |
![]() |
baaa23e17e | |
![]() |
1b24a6205c | |
![]() |
65d4066468 | |
![]() |
3782f9d5ea | |
![]() |
d057729c0a | |
![]() |
261f5ad68b | |
![]() |
ac0fcbdd1f | |
![]() |
da18a416c8 | |
|
a05700ed5d | |
![]() |
9ce57e30d9 | |
|
7e71b5f036 | |
![]() |
5f9c463b22 | |
|
a40694f9c7 | |
|
8ef0c9d497 | |
|
55a0d71391 | |
|
b9de31421e | |
|
633b4fb8fd | |
![]() |
c4638abc9f | |
![]() |
0c86f9281a | |
|
e7b6f6fc35 | |
![]() |
d8c65edab9 | |
![]() |
ef8aef09ac | |
|
2f3d914fdf | |
![]() |
bc3d15c506 | |
![]() |
d98c9df202 | |
![]() |
4e7d47a43f | |
|
7e27014dde | |
![]() |
b7c4cc2f9b | |
|
3d9b43a784 | |
|
ed2c16661a | |
![]() |
03ae09b6ef | |
![]() |
c1ad637d84 | |
![]() |
0d6baa9df5 | |
![]() |
85b5de7d08 | |
![]() |
6f66984df2 | |
![]() |
161c300c08 | |
![]() |
eff0bcf472 | |
![]() |
e7f992385c | |
![]() |
cce463ed43 | |
![]() |
d30787dde5 | |
![]() |
7c17dcb638 | |
![]() |
514bdbc972 | |
![]() |
fdd442c377 | |
![]() |
16b89ea2f3 | |
![]() |
46942d8b59 | |
![]() |
660c655bc1 | |
![]() |
b730c6de53 | |
![]() |
af83b20272 | |
![]() |
6ac52ad282 | |
|
0718b15ae3 | |
![]() |
6f05e84f82 | |
![]() |
419bcfceb7 | |
![]() |
0d8435b0a2 | |
![]() |
2b7497f79f | |
![]() |
4318f9db73 | |
![]() |
681ffd50d0 | |
![]() |
c3d1d8151b | |
![]() |
50277b4b25 | |
![]() |
226514c627 | |
![]() |
1fb57818bc | |
|
8e4819217c | |
|
d03182cbd4 | |
![]() |
f49de16e2a | |
![]() |
1082b4af1e | |
![]() |
bdefb4e729 | |
![]() |
d13f90f45e | |
![]() |
0665b66381 | |
|
7416d9bcb6 | |
|
3bfbba2303 | |
![]() |
25fcf518fe | |
![]() |
11701869a1 | |
![]() |
034d2ee599 | |
|
fa47ae9b5e | |
|
ac93cfbc8a | |
|
bb7732c666 | |
![]() |
26d81ab2bf | |
![]() |
d473559e8a | |
![]() |
ea881ef517 | |
![]() |
3260e2483b | |
|
81d8a866f0 | |
|
0a334abede | |
![]() |
57dc08e59c | |
![]() |
a630cbc9f4 | |
![]() |
02f414787a | |
|
1ada91917e | |
![]() |
1a30c1023d | |
![]() |
1ca9f66c27 | |
![]() |
832fe0d03c | |
![]() |
27ee5ff30b | |
![]() |
6fe3928a6e | |
|
25f193a1d3 | |
![]() |
ede5ab8957 | |
![]() |
de68654963 | |
![]() |
c978956463 | |
|
e8bcebbf71 | |
|
27e4624eda | |
![]() |
ec71f2784f | |
![]() |
63b6c4ee12 | |
![]() |
02d52c0971 | |
|
afaef5f0d0 | |
|
e096e1aa50 | |
![]() |
0f28e1edc7 | |
|
ffa79d2038 | |
|
ec2d51e0d3 | |
|
a361415ebc | |
|
61bb8fdb8e | |
![]() |
7e3fc9a412 | |
|
4c4b28d0a6 | |
|
4ab36af1a9 | |
![]() |
9238d9ecf1 | |
![]() |
2910282d77 | |
|
7e6bb3c714 | |
|
b0088a24ae | |
![]() |
f78492ebad | |
|
2f25643fcc | |
|
cfcf907ef6 | |
![]() |
3a9bb5c3a3 | |
![]() |
f030f76e60 | |
|
95265e5f64 | |
![]() |
a2ade8687c | |
|
617eabebc8 | |
![]() |
25bfefb809 | |
|
91338c863c | |
![]() |
11af086c2c | |
![]() |
6d91801f2e | |
|
9786aaa4fe | |
|
34f108118b | |
|
61abecde53 | |
![]() |
7ad822ba0f | |
|
fbaa5e2061 | |
![]() |
7ca3c7197f | |
![]() |
59c1506656 | |
![]() |
9531409b95 | |
![]() |
d10175165d | |
![]() |
7ab22cfa8f | |
|
c9cd52221e | |
![]() |
5bb51eb775 | |
![]() |
c9177787c0 | |
![]() |
72d060393d | |
![]() |
d7b879920a | |
![]() |
48fc4ce190 | |
![]() |
94488ab407 | |
|
326aede507 | |
|
af490fbc0c | |
|
7ec511c190 | |
![]() |
a589c34b0a | |
![]() |
2a41938989 | |
|
c3cc105468 | |
![]() |
05646c17ee | |
![]() |
9ef7811f57 | |
![]() |
c75f490b38 | |
![]() |
390dcbdbd4 | |
|
c8a3681d4c | |
|
4d6125649d | |
![]() |
7823a70a37 | |
|
d4e3e4ca39 | |
![]() |
d67a9eaf09 | |
|
45e8dd5f2d | |
|
10c237498e | |
![]() |
0e0bf2176f | |
|
d24ac15228 | |
![]() |
c1a9f7f76c | |
![]() |
98ac0fe181 | |
|
80e20a9cca | |
|
bb8e671c20 | |
|
1954a4f8d3 | |
|
070f869aa6 | |
![]() |
d60b00b373 | |
![]() |
5c101f55a6 | |
![]() |
c14ee5c359 | |
|
aa7125abd1 | |
|
bf58961a23 | |
|
7ee151e652 | |
![]() |
7e3e35784e | |
![]() |
90f8e04e93 | |
|
b3dec1ee8e | |
|
278cdba352 | |
|
e25de315f8 | |
|
6bbdb3d7a8 | |
|
eb254de9fd | |
|
a560159a63 | |
![]() |
3ecae5ba43 | |
![]() |
0dc7a1f582 | |
|
c9279b274e | |
![]() |
ce477020de | |
|
21078af26f | |
![]() |
bc5ec6103e | |
![]() |
fcc53f5278 | |
|
da69213b8e | |
|
365ff99785 | |
|
e206de9f1f | |
![]() |
358880bfd2 | |
|
63971edc44 | |
|
020a976135 | |
|
29d74526d1 | |
![]() |
b6f2eb107c | |
|
2e1cf5ad82 | |
|
56c8f7fa82 | |
|
4db125545f | |
|
ecd1a8444e | |
|
0a0705d42c | |
|
be0e0134f3 | |
|
6904116a3a | |
|
421218ef77 | |
|
5f89356679 | |
|
cab540b812 | |
|
2ffa835b84 | |
![]() |
3f6165585d | |
|
e93778b004 | |
|
232e09c04f | |
|
459e05f465 | |
![]() |
e4005a03b3 | |
|
846a24aef4 | |
|
955eed9232 | |
![]() |
fee2aec384 | |
![]() |
97f3fa75c1 | |
|
5ee3519c21 | |
|
4270d1d8eb | |
|
dd298380a7 | |
|
255ae11012 | |
|
ec4e70d7f0 | |
|
758600e4d0 | |
|
7d4def6056 | |
|
a1cc59e89b | |
|
9e4ca503df | |
|
472ea69e29 | |
|
3c5e10fa58 | |
|
915bf69e6f | |
|
a00452b960 | |
|
3eeed4620c | |
|
54858bcd39 | |
|
6820fed5b5 | |
|
82ac32d84f | |
|
fe6f8a9349 | |
|
d4f0d21608 | |
|
56c867a4a3 | |
|
bd219c0b41 | |
|
1292019aac | |
|
33e1b7e400 | |
|
9af269061d | |
|
2557b36cea | |
|
f6c84e4fad | |
|
161866aaaf | |
|
3151314529 | |
|
775434d856 | |
|
b802fd2fbd | |
|
cee82314da | |
|
7295a71bc5 | |
|
4971dc0a3d | |
|
e591de00fd | |
|
c331dbb445 | |
|
36a58c0fe3 | |
|
0e949110fd | |
|
4ffb2acc9c | |
|
0991ba4698 | |
|
f82a51fd83 | |
|
98ed1794cf | |
|
6e756826f7 | |
|
684f9dbfe1 | |
|
9577478e97 | |
|
ff9beb0949 | |
|
f4055e50e2 | |
|
af8a5058b8 | |
|
efb918e21d | |
|
a9a3f9c977 | |
|
d6b0eee067 | |
|
ca409857bb | |
|
219590a0cd | |
|
2f88227388 | |
|
eb180d3570 | |
![]() |
a3b943f744 | |
![]() |
8b4fc88b1d | |
|
131d8fa81c | |
|
3c2e899a20 | |
|
07511efbd6 | |
|
3eaf1dc214 | |
|
9608f204e8 | |
|
534a6bdeab | |
|
ca5c279ac0 | |
|
ce3b460717 | |
|
1c87cf6b98 | |
|
614f0ea436 | |
|
a3ae80aa22 | |
|
70f9cd0997 | |
|
fa247e39bf | |
|
97a81572a9 | |
|
e084b015cf | |
|
cbe427a114 | |
|
f842f75065 | |
|
c8eed99f5d | |
|
9276136bfe | |
|
fbd4273603 | |
|
9299a1667e | |
|
10c9891b7b | |
|
e5f8eac497 | |
|
1bad39e83a | |
|
633dee9655 | |
|
e7b7d20f94 | |
|
c9e7da7df3 | |
|
7f0b770dca | |
|
801c544f65 | |
|
70536036e1 | |
|
2d8c3c5853 | |
|
5a1fcb1443 | |
|
cf1d2dd5ba | |
|
121b1aaab1 | |
|
3e42a620d9 | |
|
33297226ea | |
|
982536b547 | |
|
fd4046af04 | |
|
36683ad69b | |
|
0f92ff94a0 | |
|
2262508777 | |
|
4f64b840b0 | |
|
a04b8de39e | |
|
4d99c97370 | |
|
58f7c984a2 | |
|
9db8455de8 | |
|
4b1bccd1cd | |
|
6507c87bc8 | |
|
b423e4b7e7 | |
|
76b4cf0d9b | |
|
6d2a50ef5e | |
|
938be1da55 | |
|
eff12234fa | |
|
77fdafd58b | |
|
5fea412ca8 | |
|
954cf38074 | |
|
5f15b03462 | |
![]() |
a2f63732cf | |
![]() |
abf9b25651 | |
|
bf4ef7023d | |
|
f463b20de7 | |
|
7934f07cea | |
![]() |
f19a9f6ceb | |
![]() |
8b5e159cac | |
![]() |
16dff252c0 | |
|
fe0fab7b61 | |
|
4e18d13b6b | |
|
d81d456d76 | |
|
8c66d817b5 | |
|
7579dc8a59 | |
|
3087e5471a | |
|
4e8f304262 | |
|
48e9ca6706 | |
|
fc8a476aa3 | |
|
bdcc7a4699 | |
|
89773b5036 | |
|
387387108a | |
|
e4d4375102 | |
|
2617831a9f | |
|
f0747eab05 | |
|
54bffb41da | |
![]() |
789e84211c | |
|
12ce0aa4f5 | |
|
4a322d1e2e | |
|
a38b4af8bc | |
|
d1743b350d | |
|
7fd790fe7d | |
|
c48e3584c3 | |
|
d0ca09e780 | |
|
ed3bf55f90 | |
|
7ff29fec70 | |
|
79331db271 | |
|
4097ebb69b | |
|
fbfd5f175d | |
|
07101f5770 | |
|
652de9b441 | |
![]() |
f2a660d595 | |
|
711c2e57da | |
![]() |
6fc441d7c5 | |
|
a94d02bb8a | |
|
162fd200a5 | |
|
cc9cf251fe | |
|
cc2dd35ff4 | |
|
c6bc26c5ae | |
|
f003a99779 | |
|
6e7da0ef5b | |
![]() |
b4e2c6148a | |
|
d9bd0387db | |
|
c0cfe12db4 | |
|
dc6cfc342e | |
|
c3ecbe1f97 | |
|
b1ead191a6 | |
![]() |
0735968e73 | |
|
a59a8c3693 | |
|
14e4dc7d9e | |
![]() |
37f5bce087 | |
![]() |
951792dc11 | |
![]() |
7d7f265ffb | |
|
7495c54f8d | |
![]() |
631f8ceeea | |
![]() |
d70ddfb2f7 | |
![]() |
54741a6d8a | |
|
116c3e531f | |
|
990cfe2781 | |
|
66e1235c3b | |
|
76fdff6737 | |
|
55a6f93fe3 | |
|
4bc79b5153 | |
|
ac4488a907 | |
![]() |
3085e40426 | |
|
ea979b78ee | |
|
b1775e5158 | |
|
3678b8eb72 | |
|
12d8f5bf5d | |
|
e04fb11194 | |
|
010edf3cb2 | |
|
ab26a528b6 | |
|
6d39e25667 | |
![]() |
a2ea832208 | |
![]() |
d1bc3680b9 | |
![]() |
08416390e5 | |
|
190200d1e6 | |
|
b124364203 | |
|
2078a044b6 | |
![]() |
35c2f63c55 | |
![]() |
30c61f0a7d | |
![]() |
743dabd553 | |
![]() |
015296e065 | |
|
48c21ac245 | |
![]() |
a93b8a08c9 | |
![]() |
1c48ffb130 | |
|
0ee9280bb1 | |
|
e785e9a358 | |
|
b3b95e9856 | |
![]() |
5be8ead356 | |
|
7d78919c4a | |
|
d5b4c5425f | |
![]() |
f259f05cdc | |
|
95cd289373 | |
|
e739f5b786 | |
![]() |
c79be9a597 | |
|
fb03565a25 | |
|
7ec53a246c | |
|
56946f94e8 | |
![]() |
61ee3fe36f | |
![]() |
d5f989bbe2 | |
![]() |
f5817e5150 | |
![]() |
1c24baf3b9 | |
![]() |
3d3ef19d4a | |
|
7b77c46915 | |
|
746f552a21 | |
|
7872d5ecab | |
|
60da6bd110 | |
![]() |
a3bbf6b1c1 | |
![]() |
d37709b1a5 | |
|
aeff357660 | |
|
0e6cb3954a | |
|
ae12618c0c | |
|
1c46617144 | |
|
ec133a6880 | |
|
bcdb631c20 | |
|
8021d96cd8 | |
![]() |
914966bd39 | |
![]() |
f89f4b6628 | |
|
7407545d1f | |
![]() |
f0ffc9a29c | |
|
987eb39681 | |
![]() |
848109afe8 | |
![]() |
d7bdb35bb7 | |
![]() |
254b3173d1 | |
![]() |
44f06b7305 | |
|
b16e95923a | |
![]() |
98a7f73c04 | |
![]() |
b6a450a482 | |
|
66c495d6b5 | |
![]() |
42139ef998 | |
|
925d5ea356 | |
![]() |
ad1f0e29e7 | |
|
3498390974 | |
|
4f3e385f78 | |
|
18b289b84c | |
|
e3f49db5c0 | |
|
4add266047 | |
|
4a6012bfa9 | |
|
7fe88aa4d9 | |
|
bc6ef583fb | |
|
b268b540d8 | |
|
7e69c64c9c | |
|
85ef26f70e | |
|
8c7865d2c1 | |
|
999a15761d | |
|
5c2330512e | |
|
97f62a5684 | |
|
e74a3b6a95 | |
|
38878183d5 | |
|
0e0c13f1a4 | |
|
a667a32de0 | |
|
230e597787 | |
|
f0ea3a53c4 | |
![]() |
3da9306ed6 | |
|
51a4680481 | |
![]() |
568a632d65 | |
![]() |
5982c0df96 | |
|
21046bbcb7 | |
![]() |
0c816805fb | |
|
61a4882e58 | |
|
148e8f91eb | |
|
8f52a091fa | |
|
62eabdf7c0 | |
|
d5490d5e71 | |
|
cef374c52d | |
|
7be60d3140 | |
|
feafa5b6f3 | |
|
2dd6ed108f | |
|
969323fdde | |
|
a73b4ff79a | |
|
16ca2a359e | |
|
444d954e72 | |
|
6fc31c0bb8 | |
|
cf73f72e19 | |
|
745a25a003 | |
|
b080df1449 | |
|
0aa2a4aec3 | |
|
4dc1c4c814 | |
|
ddc576b054 | |
![]() |
28f8b6b54c | |
![]() |
7d087ec1f2 | |
|
beba8975ca | |
|
caef7a0ab3 | |
|
85f0578302 | |
![]() |
d4690cc8b5 | |
|
bff55b6810 | |
|
01f71bca87 | |
|
d3cea0ff3b | |
|
be6e3d273b | |
|
6b8f1e3749 | |
|
b5e145b4b5 | |
|
15b63be594 | |
|
032127bef6 | |
|
f4f843a7b9 | |
![]() |
38021c2e4b | |
![]() |
4233811ae3 | |
|
4cf8357463 | |
|
0ff1367ad8 | |
![]() |
8273acd195 | |
|
0e44cbbcdd | |
|
e736591a4f | |
|
d15900fc7c | |
|
4f87542f1f | |
|
94ee3601c9 | |
|
19d09c7901 | |
|
3b29605321 | |
|
6e82862307 | |
|
700ac5862e | |
|
4ccab2ed4f | |
|
3f3299a3b8 | |
|
b73a38351b | |
|
586c5d6d1d | |
|
819772d180 | |
|
e733f1886e | |
|
86d2442958 | |
|
b7fc83edf9 | |
|
74325b5dc7 | |
|
a25959bfa0 | |
|
fe72be2f30 | |
|
4d41f44100 | |
|
afa839e0b1 | |
|
83d59a2e64 | |
|
758f4267ed | |
|
38948a84cd | |
|
51d739f4a0 | |
|
706830928e | |
|
8dc08c3992 | |
|
70ec86569f | |
|
00b41844bb | |
|
81c93d2580 | |
|
a87e55103c | |
|
05101c5e32 | |
|
e72b3e687f | |
|
f25a52622d | |
|
f5fa216b23 | |
|
a57b96a1b8 | |
|
8efbea44ab | |
|
fa80b5d1df | |
|
6c95ff98f4 | |
|
cb7170a87c | |
|
7757e4b6b7 | |
|
cad9a4fc3a | |
|
dc20d3e270 | |
|
4503e1b176 | |
|
91fe328eaf | |
|
8d9d5c3ce3 | |
|
a2aa344e31 | |
|
981e199273 | |
|
b6d6309c3c | |
|
16aac3b835 | |
|
bdf3a8e72a | |
|
507976bf10 | |
|
b6c2c66321 | |
|
0b7fbe564c | |
|
ce958f3369 | |
|
0e176d9334 | |
|
3608b7b712 | |
|
b9888a81f6 | |
|
0bb6ec51c2 | |
|
7d2c90dfd1 | |
|
66c5f09813 | |
|
a4d38f8c86 | |
|
21a3c54754 | |
|
4493711521 | |
|
76b23f88db | |
|
bca9499844 | |
|
3137048aed | |
|
62b5d86082 | |
|
7a472651f1 | |
|
99c90295c0 | |
|
d7fd642f7f | |
|
97bc41e771 | |
|
6156d98af2 | |
|
6facc3e65f | |
|
c8f6891239 | |
|
11b5c87888 | |
|
2f538ff394 | |
|
48a153d434 | |
|
9c3ecabf47 | |
|
f18070da47 | |
|
1e87e0c8ec | |
|
bec68aa090 | |
|
aed83337fa | |
|
e5b7110090 | |
|
716916b7b6 | |
|
b5ccdbfcd6 | |
|
1e7df569e6 | |
|
701d9dfc99 | |
|
e7b3a01c47 | |
|
b19c084ac8 | |
|
1d4bb3f4fc | |
|
e0b267bd6c | |
|
4bf4aa7c78 | |
|
e3643be01b | |
|
9c8add0152 | |
|
edb7099131 | |
|
cce818d4e0 | |
![]() |
909663bc47 | |
|
9ea9da9672 | |
|
97bd7673e1 | |
|
2aa89426ad | |
|
5131dacf05 | |
|
6b63cd25aa | |
![]() |
8162b8b908 | |
|
7a59d43eec | |
![]() |
008ba8d1de | |
|
98a9344b02 | |
|
b8342288dd | |
|
09e81b9e78 | |
![]() |
7cf5e23cb9 | |
|
8594168d33 | |
![]() |
2d7c6cb82d | |
![]() |
c36925c136 | |
|
6ec6ab2308 | |
|
4109e4b07e | |
|
216e984740 | |
|
92f3934d5e | |
|
2ed7e0d4c4 | |
|
6cfe81aea3 | |
|
4dcbd51482 | |
|
cacb8c84ae | |
|
fb8ae3fcdf | |
|
a257d832cb | |
|
ff7d191011 | |
|
9a2c3f1754 | |
|
bcdf506e6c | |
|
ccc6cb5d26 | |
|
0661c6b932 | |
|
99947c0c87 | |
|
03cff6ec2e | |
|
f86acfebdf | |
|
9a62d7806e | |
|
a7df6da5f0 | |
|
eab68ac270 | |
|
a9e3513706 | |
|
6b20391c72 | |
|
3135300fe6 | |
|
ecc6387113 | |
|
990c4e22b0 | |
|
7eea9316dd | |
|
6a546c79e4 | |
|
4c48b6c77a | |
|
4d5430c3ed | |
|
d49af735f1 | |
|
03370e8a07 | |
|
0b43fa8952 | |
|
465c4cc8c7 | |
|
37668ddcd4 | |
|
7102594444 | |
|
b2f2df65bb | |
|
8a577fb263 | |
|
5c491071b6 | |
|
c554237076 | |
|
d22a741bf7 | |
|
383b3f5d74 | |
|
63da7adcf9 | |
|
3243aeebc6 | |
|
1a86a75345 | |
|
3b6cc99d49 | |
|
d872ffc606 | |
|
3b69c01ead | |
|
1e0608aa14 | |
|
9b6816e346 | |
|
6ee257231d | |
|
70edb73f6c | |
|
5c7553d4aa | |
|
278701f24b | |
|
97ab819bf9 | |
|
d870f17b85 | |
|
91ac6c2357 | |
|
3702d1c1a5 | |
|
93d48c359e | |
|
80dace18e9 | |
|
375cbb37df | |
|
10d933e037 | |
|
4fdd3f6f80 | |
|
458b56e33b | |
|
c32b333bc2 | |
|
c256887132 | |
|
6a588db7f6 | |
|
6c4e1c6665 | |
|
c554d2c00d | |
|
b69bf5974a | |
|
ecb1691b4d | |
|
6a9f2b31a6 | |
|
4947cd8456 | |
|
8429effe16 | |
|
49ebe450be | |
|
e3c926da77 | |
|
af48da2eb3 | |
|
6630309466 | |
|
c965da7dd5 | |
|
b44399968f | |
|
2591f28ccc | |
|
5530e8c723 | |
|
fa26dc9fa5 | |
|
4cf40f9dfc | |
|
2c034f5dff | |
|
d68d8318c1 | |
|
41ae6b1f8d | |
|
a6e2171fca | |
|
916cc293ac | |
|
5565eac601 | |
|
860b71c7c6 | |
|
f1c2841fe0 | |
|
c6d5078d42 | |
|
ebe2d625fa | |
|
b5e1a91af5 | |
|
4b8d72a6eb | |
|
f0e1858cd4 | |
|
a92468953a | |
|
fdab967b6a | |
|
7e8929f166 | |
|
0a39ed80da | |
|
5ed44f1d63 | |
|
64e639ebea | |
|
3fb9eb40f3 | |
|
efc2443bb8 | |
|
2c3d917bd4 | |
|
617f139f52 | |
|
de550d5f42 | |
|
f12230dc91 | |
|
1df2639cd5 | |
|
c746e9e634 | |
|
d8d464a332 | |
|
83e337b2e9 | |
|
5a6b7bd717 | |
|
c68a3dbd6f | |
|
350f9426ea | |
|
5bda100e32 | |
|
dde7fa730a | |
|
3f8f1b8083 | |
|
6eef4bd09e | |
|
0dcaea3db4 | |
|
033134fa83 | |
|
1bab0b01f7 | |
|
7b2f233cae | |
|
2ecdd73c7f | |
|
4e7a2fa3d7 | |
|
91662e2e3e | |
|
a7c3dee7e3 | |
|
c2129c994a | |
|
e968ece34c | |
|
70d407963e | |
|
00ccba74a1 | |
|
0790abb6f9 | |
|
6c4c161a1b | |
|
65a2bd43cf | |
|
10f813a443 | |
|
e79ec30c81 | |
|
2a7fea3612 | |
|
cc46a3ac30 | |
|
cca5f98c9b | |
|
d4535005c8 | |
|
73d128e0c9 | |
|
f09457a0ac | |
|
78c218b12b | |
|
d9f87fdd18 | |
|
33c3395221 | |
|
74d26a40d3 | |
|
3f78ed249c | |
|
07e1525f09 | |
|
a9161b86a2 | |
|
e0e6cdcc79 | |
|
3b0c708d82 | |
|
0922df3875 | |
|
ad3fe09cfb | |
|
91f4327eb4 | |
|
f2f910b5e4 | |
|
85d924db70 | |
![]() |
f1614a4b62 | |
![]() |
2fa71241db | |
![]() |
13c6556574 | |
|
5601b71937 | |
![]() |
1a024f8011 |
|
@ -6,6 +6,8 @@ yarn-debug.log*
|
|||
yarn-error.log*
|
||||
yarn.lock
|
||||
|
||||
package-lock.json*
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
|
@ -86,3 +88,4 @@ typings/
|
|||
|
||||
.DS_Store
|
||||
.idea/*
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<h3>前端react环境安装:</h3>
|
||||
<p>1、 安装node v6.9.x;此安装包含了node和npm。</p>
|
||||
<p>1、 安装node v12.10.x;此安装包含了node和npm。</p>
|
||||
<p>2、 安装cnpm(命令行): npm install -g cnpm --registry=https://registry.npm.taobao.org</p>
|
||||
<p>3、 安装依赖的js库(public/react目录下<即项目package.json所在目录>,开启命令行): cnpm install</p>
|
||||
<p>4、 如果你的ruby服务使用的是3000端口,则需要在package.json中修改"port"参数的值</p>
|
||||
|
|
34
add.txt
|
@ -1,34 +0,0 @@
|
|||
|
||||
新版tpi改动的文件:
|
||||
Index.js
|
||||
contex/TPIContextProvider.js
|
||||
page/main/LeftViewContainer.js
|
||||
taskList/TaskList.js
|
||||
TPMIndexHOC.js
|
||||
App.js
|
||||
CodeRepositoryViewContainer.js
|
||||
|
||||
Index.js
|
||||
choose={context.chooses}
|
||||
|
||||
|
||||
TPIContextProvider.js
|
||||
|
||||
LeftViewContainer.js
|
||||
|
||||
TaskList.js
|
||||
|
||||
TPMIndexHOC.js
|
||||
|
||||
MainContentContainer
|
||||
新:rep_content返回值多了一层 {content: '...'}
|
||||
|
||||
|
||||
|
||||
|
||||
TODO
|
||||
待同步
|
||||
1、timer图标样式更换
|
||||
index.html
|
||||
WebSSHTimer.css
|
||||
WebSSHTimer.js
|
|
@ -101,9 +101,14 @@ module.exports = {
|
|||
extensions: [".web.js", ".mjs", ".js", ".json", ".web.jsx", ".jsx"],
|
||||
alias: {
|
||||
educoder: __dirname + "/../src/common/educoder.js",
|
||||
src: path.join(paths.appSrc), // 整个源代码目录
|
||||
forge: path.join(paths.appSrc, 'forge'),
|
||||
military: path.join(paths.appSrc, 'military'),
|
||||
components: path.join(paths.appSrc, 'components'),
|
||||
// Support React Native Web
|
||||
// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
|
||||
"react-native": "react-native-web",
|
||||
'react-dom': '@hot-loader/react-dom',
|
||||
},
|
||||
plugins: [
|
||||
// Prevents users from importing files from outside of src/ (or node_modules/).
|
||||
|
@ -150,7 +155,7 @@ module.exports = {
|
|||
{
|
||||
libraryName: "antd",
|
||||
libraryDirectory: "es",
|
||||
style: "css",
|
||||
style: true,
|
||||
},
|
||||
],
|
||||
],
|
||||
|
@ -206,8 +211,31 @@ module.exports = {
|
|||
{
|
||||
loader: require.resolve("sass-loader"),
|
||||
},
|
||||
{
|
||||
loader: 'sass-resources-loader',
|
||||
options: {
|
||||
resources: ['src/global.scss']
|
||||
}
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
test: /\.less$/,
|
||||
use: [{
|
||||
loader: 'style-loader',
|
||||
}, {
|
||||
loader: 'css-loader', // translates CSS into CommonJS
|
||||
}, {
|
||||
loader: 'less-loader', // compiles Less to CSS
|
||||
options: {
|
||||
modifyVars: {
|
||||
'primary-color': '#4154f1',
|
||||
'link-color': '#4154f1',
|
||||
},
|
||||
javascriptEnabled: true,
|
||||
},
|
||||
}]
|
||||
},
|
||||
// "file" loader makes sure those assets get served by WebpackDevServer.
|
||||
// When you `import` an asset, you get its (virtual) filename.
|
||||
// In production, they would get copied to the `build` folder.
|
||||
|
|
|
@ -21,6 +21,7 @@ let publicPath = "/react/build/";
|
|||
const publicUrl = publicPath.slice(0, -1);
|
||||
// const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
|
||||
const shouldUseSourceMap = process.env.NODE_ENV !== "production";
|
||||
|
||||
const env = getClientEnvironment(publicPath);
|
||||
|
||||
// This is the production configuration.
|
||||
|
@ -89,6 +90,10 @@ module.exports = {
|
|||
extensions: [".web.js", ".mjs", ".js", ".json", ".web.jsx", ".jsx"],
|
||||
alias: {
|
||||
educoder: __dirname + "/../src/common/educoder.js",
|
||||
src: path.join(paths.appSrc),
|
||||
forge: path.join(paths.appSrc, 'forge'),
|
||||
military: path.join(paths.appSrc, 'military'),
|
||||
components: path.join(paths.appSrc, 'components'),
|
||||
// Support React Native Web
|
||||
// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
|
||||
"react-native": "react-native-web",
|
||||
|
@ -147,7 +152,7 @@ module.exports = {
|
|||
{
|
||||
libraryName: "antd",
|
||||
libraryDirectory: "es",
|
||||
style: "css",
|
||||
style: true,
|
||||
},
|
||||
],
|
||||
],
|
||||
|
@ -208,8 +213,31 @@ module.exports = {
|
|||
{
|
||||
loader: require.resolve("sass-loader"),
|
||||
},
|
||||
{
|
||||
loader: 'sass-resources-loader',
|
||||
options: {
|
||||
resources: ['src/global.scss']
|
||||
}
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
test: /\.less$/,
|
||||
use: [{
|
||||
loader: 'style-loader',
|
||||
}, {
|
||||
loader: 'css-loader', // translates CSS into CommonJS
|
||||
}, {
|
||||
loader: 'less-loader', // compiles Less to CSS
|
||||
options: {
|
||||
modifyVars: {
|
||||
'primary-color': '#4154f1',
|
||||
'link-color': '#4154f1',
|
||||
},
|
||||
javascriptEnabled: true,
|
||||
},
|
||||
}]
|
||||
},
|
||||
// "file" loader makes sure assets end up in the `build` folder.
|
||||
// When you `import` an asset, you get its filename.
|
||||
// This loader doesn't use a "test" so it will catch all modules
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"educoder": ["./src/common/educoder.js"],
|
||||
"forge":["./src/forge"],
|
||||
"military":["./src/military"],
|
||||
"components":["./src/components"],
|
||||
}
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"build"
|
||||
]
|
||||
}
|
23
package.json
|
@ -9,7 +9,7 @@
|
|||
"antd": "^3.26.15",
|
||||
"array-flatten": "^2.1.2",
|
||||
"autoprefixer": "7.1.6",
|
||||
"axios": "^0.18.1",
|
||||
"axios": "^0.24.0",
|
||||
"babel-eslint": "7.2.3",
|
||||
"babel-jest": "20.0.3",
|
||||
"babel-loader": "7.1.2",
|
||||
|
@ -24,11 +24,11 @@
|
|||
"classnames": "^2.2.5",
|
||||
"clipboard": "^2.0.8",
|
||||
"code-prettify": "^0.1.0",
|
||||
"codemirror": "^5.53.0",
|
||||
"codemirror": "^5.64.0",
|
||||
"connected-react-router": "4.4.1",
|
||||
"cross-env": "^7.0.3",
|
||||
"cross-port-killer": "^1.0.1",
|
||||
"css-loader": "^3.5.2",
|
||||
"dompurify": "^2.0.15",
|
||||
"dompurify": "^2.3.3",
|
||||
"dotenv": "4.0.0",
|
||||
"dotenv-expand": "4.2.0",
|
||||
"echarts": "^4.9.0",
|
||||
|
@ -51,7 +51,7 @@
|
|||
"js-base64": "^2.5.2",
|
||||
"js2wordcloud": "^1.1.12",
|
||||
"katex": "^0.11.1",
|
||||
"lodash": "^4.17.15",
|
||||
"lodash": "^4.17.21",
|
||||
"loglevel": "^1.6.8",
|
||||
"marked": "^1.0.0",
|
||||
"material-ui": "^1.0.0-beta.40",
|
||||
|
@ -84,6 +84,8 @@
|
|||
"react-color": "^2.18.0",
|
||||
"react-content-loader": "^3.1.1",
|
||||
"react-cookies": "^0.1.1",
|
||||
"react-countup": "^6.1.0",
|
||||
"react-cropper": "^2.1.8",
|
||||
"react-datepicker": "^2.14.1",
|
||||
"react-dev-utils": "^9.2.0-next.80",
|
||||
"react-dom": "^16.13.1",
|
||||
|
@ -103,7 +105,7 @@
|
|||
"redux": "^4.0.5",
|
||||
"redux-thunk": "2.3.0",
|
||||
"rsuite": "^4.3.4",
|
||||
"sass-loader": "7.3.1",
|
||||
"sass-loader": "^7.3.1",
|
||||
"save-dev": "0.0.1-security",
|
||||
"scroll-into-view": "^1.14.2",
|
||||
"showdown": "^1.9.1",
|
||||
|
@ -114,6 +116,7 @@
|
|||
"styled-components": "^4.4.1",
|
||||
"sw-precache-webpack-plugin": "0.11.4",
|
||||
"url-loader": "0.6.2",
|
||||
"wangeditor-for-react": "^1.5.6",
|
||||
"webpack-cli": "^3.3.11",
|
||||
"webpack-dev-server": "^3.10.3",
|
||||
"webpack-manifest-plugin": "^2.2.0",
|
||||
|
@ -191,6 +194,7 @@
|
|||
"port": "3007",
|
||||
"devDependencies": {
|
||||
"@babel/runtime": "7.0.0-beta.51",
|
||||
"@hot-loader/react-dom": "^16.14.0",
|
||||
"babel-cli": "^6.26.0",
|
||||
"babel-core": "^6.26.0",
|
||||
"babel-plugin-import": "^1.13.0",
|
||||
|
@ -201,7 +205,10 @@
|
|||
"babel-preset-stage-2": "^6.24.1",
|
||||
"compression-webpack-plugin": "^1.1.12",
|
||||
"concat": "^1.0.3",
|
||||
"cross-env": "^5.1.1",
|
||||
"happypack": "^5.0.1",
|
||||
"less": "^3.9.0",
|
||||
"less-loader": "^4.1.0",
|
||||
"mockjs": "^1.1.0",
|
||||
"node-sass": "^4.12.0",
|
||||
"optimize-css-assets-webpack-plugin": "^5.0.3",
|
||||
|
@ -209,9 +216,13 @@
|
|||
"react-json-view": "^1.21.3",
|
||||
"reqwest": "^2.0.5",
|
||||
"resize-observer-polyfill": "^1.5.1",
|
||||
"sass-resources-loader": "^2.2.5",
|
||||
"terser-webpack-plugin": "^2.3.5",
|
||||
"uglifyjs-webpack-plugin": "^2.2.0",
|
||||
"webpack": "^4.42.1",
|
||||
"webpack-bundle-analyzer": "^3.7.0"
|
||||
},
|
||||
"volta": {
|
||||
"node": "8.12.0"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
/*头部导航条样式---2018-03-19--by-cs*/
|
||||
.newHeader {
|
||||
background: #24292D !important;
|
||||
width: 100%;
|
||||
height: 60px !important;
|
||||
min-width: 1200px;
|
||||
|
|
|
@ -1268,11 +1268,17 @@ a.shixun-task-btn {
|
|||
|
||||
|
||||
/*-----------实训配置、评测脚本-------------*/
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 2340181 */
|
||||
src: url('iconfont.woff2?t=1631773579834') format('woff2'),
|
||||
url('iconfont.woff?t=1631773579834') format('woff'),
|
||||
url('iconfont.ttf?t=1631773579834') format('truetype');
|
||||
}
|
||||
html body {
|
||||
font-size: 14px;
|
||||
line-height: 2.0;
|
||||
background: #fafafa;
|
||||
font-family: "Microsoft YaHei", "SimSun";
|
||||
font-family: "iconfont";
|
||||
color: #05101a;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
|
@ -3939,9 +3945,13 @@ html>body #ajax-indicator {
|
|||
margin-left: 10px;
|
||||
color: #2FC25B;
|
||||
}
|
||||
.privateTag.red{
|
||||
color: #FF6832;
|
||||
border:1px solid #FF6832;
|
||||
}
|
||||
.head-nav {
|
||||
text-align: center;
|
||||
height: 70px;
|
||||
height: 58px;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
|
@ -3953,18 +3963,21 @@ html>body #ajax-indicator {
|
|||
position: absolute;
|
||||
top: 0px;
|
||||
z-index: 3;
|
||||
height: 70px;
|
||||
height: 58px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.head-nav ul#header-nav li {
|
||||
float: left;
|
||||
height: 70px;
|
||||
line-height: 70px;
|
||||
height: 58px;
|
||||
line-height: 58px;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
font-size: 16px;
|
||||
padding-right:40px;
|
||||
margin-right: 40px;
|
||||
}
|
||||
.head-nav ul#header-nav li:first-child{
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.head-nav ul#header-nav li a {
|
||||
|
@ -3975,18 +3988,30 @@ html>body #ajax-indicator {
|
|||
font-size: 16px;
|
||||
}
|
||||
|
||||
.publicNav ul#header-nav li a {
|
||||
color: #fff!important;
|
||||
}
|
||||
.publicNav .head-right i{
|
||||
color: #fff!important;
|
||||
}
|
||||
|
||||
.head-nav ul#header-nav li a:hover,.head-nav ul#header-nav li.active a {
|
||||
color: #5091FF;
|
||||
}
|
||||
|
||||
.head-nav ul#header-nav li.active a:after {
|
||||
content: "";
|
||||
width: 50%;
|
||||
height: 2px;
|
||||
background-color: #1484ef;
|
||||
left: 50%;
|
||||
margin-left: -25%;
|
||||
bottom: 8px;
|
||||
position: absolute;
|
||||
}
|
||||
.head-nav ul#header-nav li:last-child {
|
||||
margin-right: 0px
|
||||
}
|
||||
|
||||
.head-nav ul#header-nav li.active{
|
||||
/* background-color: #3B3B3B; */
|
||||
}
|
||||
|
||||
|
||||
.head-nav ul#header-nav li p:hover {
|
||||
color: #cccccc;
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 2340181 */
|
||||
src: url('iconfont.woff2?t=1634881729644') format('woff2'),
|
||||
url('iconfont.woff?t=1634881729644') format('woff'),
|
||||
url('iconfont.ttf?t=1634881729644') format('truetype');
|
||||
src: url('iconfont.woff2?t=1648801178933') format('woff2'),
|
||||
url('iconfont.woff?t=1648801178933') format('woff'),
|
||||
url('iconfont.ttf?t=1648801178933') format('truetype');
|
||||
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
|
@ -13,6 +14,270 @@
|
|||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-kaiyuanxiangmu:before {
|
||||
content: "\e91d";
|
||||
}
|
||||
|
||||
.icon-luntanjiaoliu:before {
|
||||
content: "\e91e";
|
||||
}
|
||||
|
||||
.icon-wangzhanpeizhi:before {
|
||||
content: "\e91f";
|
||||
}
|
||||
|
||||
.icon-weixuanze-chuangkekongjian:before {
|
||||
content: "\e920";
|
||||
}
|
||||
|
||||
.icon-tubiao:before {
|
||||
content: "\e921";
|
||||
}
|
||||
|
||||
.icon-gonggaofabu:before {
|
||||
content: "\e922";
|
||||
}
|
||||
|
||||
.icon-jingsaihuodong:before {
|
||||
content: "\e923";
|
||||
}
|
||||
|
||||
.icon-yonghuguanli:before {
|
||||
content: "\e924";
|
||||
}
|
||||
|
||||
.icon-shenpi:before {
|
||||
content: "\e925";
|
||||
}
|
||||
|
||||
.icon-zhuanli1:before {
|
||||
content: "\e918";
|
||||
}
|
||||
|
||||
.icon-daimaicon:before {
|
||||
content: "\e91c";
|
||||
}
|
||||
|
||||
.icon-jiangxiangicon:before {
|
||||
content: "\e916";
|
||||
}
|
||||
|
||||
.icon-shuju:before {
|
||||
content: "\e917";
|
||||
}
|
||||
|
||||
.icon-wendang:before {
|
||||
content: "\e919";
|
||||
}
|
||||
|
||||
.icon-lunwen:before {
|
||||
content: "\e91a";
|
||||
}
|
||||
|
||||
.icon-zhuanli:before {
|
||||
content: "\e91b";
|
||||
}
|
||||
|
||||
.icon-gailan1:before {
|
||||
content: "\e914";
|
||||
}
|
||||
|
||||
.icon-tuandui:before {
|
||||
content: "\e915";
|
||||
}
|
||||
|
||||
.icon-icon2:before {
|
||||
content: "\e912";
|
||||
}
|
||||
|
||||
.icon-a-21:before {
|
||||
content: "\e913";
|
||||
}
|
||||
|
||||
.icon-a-2:before {
|
||||
content: "\e90f";
|
||||
}
|
||||
|
||||
.icon-a-3:before {
|
||||
content: "\e910";
|
||||
}
|
||||
|
||||
.icon-icon1:before {
|
||||
content: "\e911";
|
||||
}
|
||||
|
||||
.icon-ioon:before {
|
||||
content: "\e90e";
|
||||
}
|
||||
|
||||
.icon-shanchu_tc_icon1:before {
|
||||
content: "\e90c";
|
||||
}
|
||||
|
||||
.icon-zhuanjiaicon:before {
|
||||
content: "\e90d";
|
||||
}
|
||||
|
||||
.icon-shengming:before {
|
||||
content: "\e90b";
|
||||
}
|
||||
|
||||
.icon-chenggong1:before {
|
||||
content: "\e907";
|
||||
}
|
||||
|
||||
.icon-a-bitian2x1:before {
|
||||
content: "\e908";
|
||||
}
|
||||
|
||||
.icon-xiala1:before {
|
||||
content: "\e909";
|
||||
}
|
||||
|
||||
.icon-xiala2:before {
|
||||
content: "\e90a";
|
||||
}
|
||||
|
||||
.icon-jiantou1:before {
|
||||
content: "\e905";
|
||||
}
|
||||
|
||||
.icon-zhangjieicon:before {
|
||||
content: "\e8fe";
|
||||
}
|
||||
|
||||
.icon-chengyuan1:before {
|
||||
content: "\e903";
|
||||
}
|
||||
|
||||
.icon-a-shangchuan2x:before {
|
||||
content: "\e8f9";
|
||||
}
|
||||
|
||||
.icon-shanchu7:before {
|
||||
content: "\e8fa";
|
||||
}
|
||||
|
||||
.icon-zuohuabeifen:before {
|
||||
content: "\e8fb";
|
||||
}
|
||||
|
||||
.icon-a-bianji11:before {
|
||||
content: "\e8f4";
|
||||
}
|
||||
|
||||
.icon-a-bitian2x:before {
|
||||
content: "\e8f5";
|
||||
}
|
||||
|
||||
.icon-a-zuohua2x:before {
|
||||
content: "\e8f7";
|
||||
}
|
||||
|
||||
.icon-lianjie3:before {
|
||||
content: "\e8f8";
|
||||
}
|
||||
|
||||
.icon-zhishitupu:before {
|
||||
content: "\e8fc";
|
||||
}
|
||||
|
||||
.icon-jisuanji1:before {
|
||||
content: "\e8fd";
|
||||
}
|
||||
|
||||
.icon-dianzi1:before {
|
||||
content: "\e8ff";
|
||||
}
|
||||
|
||||
.icon-junshililun1:before {
|
||||
content: "\e900";
|
||||
}
|
||||
|
||||
.icon-ruanjiangongcheng1:before {
|
||||
content: "\e901";
|
||||
}
|
||||
|
||||
.icon-yixue1:before {
|
||||
content: "\e902";
|
||||
}
|
||||
|
||||
.icon-tongxin1:before {
|
||||
content: "\e904";
|
||||
}
|
||||
|
||||
.icon-zhengcefagui1:before {
|
||||
content: "\e906";
|
||||
}
|
||||
|
||||
.icon-dashuju:before {
|
||||
content: "\e8f3";
|
||||
}
|
||||
|
||||
.icon-rengongzhineng:before {
|
||||
content: "\e8f6";
|
||||
}
|
||||
|
||||
.icon-a-shuangyinhao12x:before {
|
||||
content: "\e8f2";
|
||||
}
|
||||
|
||||
.icon-dingbu:before {
|
||||
content: "\e8ee";
|
||||
}
|
||||
|
||||
.icon-bangzhu1:before {
|
||||
content: "\e8ef";
|
||||
}
|
||||
|
||||
.icon-yijianfankui2:before {
|
||||
content: "\e8f0";
|
||||
}
|
||||
|
||||
.icon-fenxiang:before {
|
||||
content: "\e8f1";
|
||||
}
|
||||
|
||||
.icon-dizhi:before {
|
||||
content: "\e8eb";
|
||||
}
|
||||
|
||||
.icon-youxiang1:before {
|
||||
content: "\e8ec";
|
||||
}
|
||||
|
||||
.icon-dianhuaicon:before {
|
||||
content: "\e8ed";
|
||||
}
|
||||
|
||||
.icon-tianjiaicon:before {
|
||||
content: "\e8e8";
|
||||
}
|
||||
|
||||
.icon-lingshengicon:before {
|
||||
content: "\e8ea";
|
||||
}
|
||||
|
||||
.icon-gengduoicon:before {
|
||||
content: "\e8e5";
|
||||
}
|
||||
|
||||
.icon-shijianicon:before {
|
||||
content: "\e8e7";
|
||||
}
|
||||
|
||||
.icon-mimaicon:before {
|
||||
content: "\e8e1";
|
||||
}
|
||||
|
||||
.icon-gouicon:before {
|
||||
content: "\e8e2";
|
||||
}
|
||||
|
||||
.icon-zhankaiicon:before {
|
||||
content: "\e8e3";
|
||||
}
|
||||
|
||||
.icon-wenjian7:before {
|
||||
content: "\e8e0";
|
||||
}
|
||||
|
|
|
@ -5,6 +5,469 @@
|
|||
"css_prefix_text": "icon-",
|
||||
"description": "",
|
||||
"glyphs": [
|
||||
{
|
||||
"icon_id": "28163416",
|
||||
"name": "开源项目",
|
||||
"font_class": "kaiyuanxiangmu",
|
||||
"unicode": "e91d",
|
||||
"unicode_decimal": 59677
|
||||
},
|
||||
{
|
||||
"icon_id": "28163417",
|
||||
"name": "论坛交流",
|
||||
"font_class": "luntanjiaoliu",
|
||||
"unicode": "e91e",
|
||||
"unicode_decimal": 59678
|
||||
},
|
||||
{
|
||||
"icon_id": "28163418",
|
||||
"name": "网站配置",
|
||||
"font_class": "wangzhanpeizhi",
|
||||
"unicode": "e91f",
|
||||
"unicode_decimal": 59679
|
||||
},
|
||||
{
|
||||
"icon_id": "28163419",
|
||||
"name": "未选择-创客空间",
|
||||
"font_class": "weixuanze-chuangkekongjian",
|
||||
"unicode": "e920",
|
||||
"unicode_decimal": 59680
|
||||
},
|
||||
{
|
||||
"icon_id": "28163420",
|
||||
"name": "图标",
|
||||
"font_class": "tubiao",
|
||||
"unicode": "e921",
|
||||
"unicode_decimal": 59681
|
||||
},
|
||||
{
|
||||
"icon_id": "28163421",
|
||||
"name": "公告发布",
|
||||
"font_class": "gonggaofabu",
|
||||
"unicode": "e922",
|
||||
"unicode_decimal": 59682
|
||||
},
|
||||
{
|
||||
"icon_id": "28163422",
|
||||
"name": "竞赛活动",
|
||||
"font_class": "jingsaihuodong",
|
||||
"unicode": "e923",
|
||||
"unicode_decimal": 59683
|
||||
},
|
||||
{
|
||||
"icon_id": "28163423",
|
||||
"name": "用户管理",
|
||||
"font_class": "yonghuguanli",
|
||||
"unicode": "e924",
|
||||
"unicode_decimal": 59684
|
||||
},
|
||||
{
|
||||
"icon_id": "28163424",
|
||||
"name": "审批",
|
||||
"font_class": "shenpi",
|
||||
"unicode": "e925",
|
||||
"unicode_decimal": 59685
|
||||
},
|
||||
{
|
||||
"icon_id": "22773568",
|
||||
"name": "专利",
|
||||
"font_class": "zhuanli1",
|
||||
"unicode": "e918",
|
||||
"unicode_decimal": 59672
|
||||
},
|
||||
{
|
||||
"icon_id": "27680124",
|
||||
"name": "代码icon",
|
||||
"font_class": "daimaicon",
|
||||
"unicode": "e91c",
|
||||
"unicode_decimal": 59676
|
||||
},
|
||||
{
|
||||
"icon_id": "27664463",
|
||||
"name": "奖项icon",
|
||||
"font_class": "jiangxiangicon",
|
||||
"unicode": "e916",
|
||||
"unicode_decimal": 59670
|
||||
},
|
||||
{
|
||||
"icon_id": "27664464",
|
||||
"name": "数据",
|
||||
"font_class": "shuju",
|
||||
"unicode": "e917",
|
||||
"unicode_decimal": 59671
|
||||
},
|
||||
{
|
||||
"icon_id": "27664466",
|
||||
"name": "文档",
|
||||
"font_class": "wendang",
|
||||
"unicode": "e919",
|
||||
"unicode_decimal": 59673
|
||||
},
|
||||
{
|
||||
"icon_id": "27664467",
|
||||
"name": "论文",
|
||||
"font_class": "lunwen",
|
||||
"unicode": "e91a",
|
||||
"unicode_decimal": 59674
|
||||
},
|
||||
{
|
||||
"icon_id": "27664468",
|
||||
"name": "专利",
|
||||
"font_class": "zhuanli",
|
||||
"unicode": "e91b",
|
||||
"unicode_decimal": 59675
|
||||
},
|
||||
{
|
||||
"icon_id": "27664392",
|
||||
"name": "概览",
|
||||
"font_class": "gailan1",
|
||||
"unicode": "e914",
|
||||
"unicode_decimal": 59668
|
||||
},
|
||||
{
|
||||
"icon_id": "27664393",
|
||||
"name": "团队",
|
||||
"font_class": "tuandui",
|
||||
"unicode": "e915",
|
||||
"unicode_decimal": 59669
|
||||
},
|
||||
{
|
||||
|
||||
"icon_id": "27299393",
|
||||
"name": "icon",
|
||||
"font_class": "icon2",
|
||||
"unicode": "e912",
|
||||
"unicode_decimal": 59666
|
||||
},
|
||||
{
|
||||
"icon_id": "27299394",
|
||||
"name": "2",
|
||||
"font_class": "a-21",
|
||||
"unicode": "e913",
|
||||
"unicode_decimal": 59667
|
||||
},
|
||||
{
|
||||
"icon_id": "27200759",
|
||||
"name": "2",
|
||||
"font_class": "a-2",
|
||||
"unicode": "e90f",
|
||||
"unicode_decimal": 59663
|
||||
},
|
||||
{
|
||||
"icon_id": "27200760",
|
||||
"name": "3",
|
||||
"font_class": "a-3",
|
||||
"unicode": "e910",
|
||||
"unicode_decimal": 59664
|
||||
},
|
||||
{
|
||||
"icon_id": "27200761",
|
||||
"name": "icon",
|
||||
"font_class": "icon1",
|
||||
"unicode": "e911",
|
||||
"unicode_decimal": 59665
|
||||
},
|
||||
{
|
||||
"icon_id": "27041503",
|
||||
"name": "ioon",
|
||||
"font_class": "ioon",
|
||||
"unicode": "e90e",
|
||||
"unicode_decimal": 59662
|
||||
},
|
||||
{
|
||||
"icon_id": "26470602",
|
||||
"name": "shanchu_tc_icon",
|
||||
"font_class": "shanchu_tc_icon1",
|
||||
"unicode": "e90c",
|
||||
"unicode_decimal": 59660
|
||||
},
|
||||
{
|
||||
"icon_id": "26470603",
|
||||
"name": "专家icon",
|
||||
"font_class": "zhuanjiaicon",
|
||||
"unicode": "e90d",
|
||||
"unicode_decimal": 59661
|
||||
},
|
||||
{
|
||||
"icon_id": "12505154",
|
||||
"name": "声明",
|
||||
"font_class": "shengming",
|
||||
"unicode": "e90b",
|
||||
"unicode_decimal": 59659
|
||||
},
|
||||
{
|
||||
"icon_id": "26470597",
|
||||
"name": "成功",
|
||||
"font_class": "chenggong1",
|
||||
"unicode": "e907",
|
||||
"unicode_decimal": 59655
|
||||
},
|
||||
{
|
||||
"icon_id": "26470599",
|
||||
"name": "必填@2x",
|
||||
"font_class": "a-bitian2x1",
|
||||
"unicode": "e908",
|
||||
"unicode_decimal": 59656
|
||||
},
|
||||
{
|
||||
"icon_id": "26470600",
|
||||
"name": "下拉",
|
||||
"font_class": "xiala1",
|
||||
"unicode": "e909",
|
||||
"unicode_decimal": 59657
|
||||
},
|
||||
{
|
||||
"icon_id": "26470601",
|
||||
"name": "下拉2",
|
||||
"font_class": "xiala2",
|
||||
"unicode": "e90a",
|
||||
"unicode_decimal": 59658
|
||||
},
|
||||
{
|
||||
"icon_id": "26363219",
|
||||
"name": "箭头",
|
||||
"font_class": "jiantou1",
|
||||
"unicode": "e905",
|
||||
"unicode_decimal": 59653
|
||||
},
|
||||
{
|
||||
"icon_id": "26359564",
|
||||
"name": "章节icon ",
|
||||
"font_class": "zhangjieicon",
|
||||
"unicode": "e8fe",
|
||||
"unicode_decimal": 59646
|
||||
},
|
||||
{
|
||||
"icon_id": "26359565",
|
||||
"name": "成员",
|
||||
"font_class": "chengyuan1",
|
||||
"unicode": "e903",
|
||||
"unicode_decimal": 59651
|
||||
},
|
||||
{
|
||||
"icon_id": "26325702",
|
||||
"name": "上传@2x",
|
||||
"font_class": "a-shangchuan2x",
|
||||
"unicode": "e8f9",
|
||||
"unicode_decimal": 59641
|
||||
},
|
||||
{
|
||||
"icon_id": "26325703",
|
||||
"name": "删除 ",
|
||||
"font_class": "shanchu7",
|
||||
"unicode": "e8fa",
|
||||
"unicode_decimal": 59642
|
||||
},
|
||||
{
|
||||
"icon_id": "26325704",
|
||||
"name": "左滑备份",
|
||||
"font_class": "zuohuabeifen",
|
||||
"unicode": "e8fb",
|
||||
"unicode_decimal": 59643
|
||||
},
|
||||
{
|
||||
"icon_id": "26325698",
|
||||
"name": "编辑 (1)",
|
||||
"font_class": "a-bianji11",
|
||||
"unicode": "e8f4",
|
||||
"unicode_decimal": 59636
|
||||
},
|
||||
{
|
||||
"icon_id": "26325699",
|
||||
"name": "必填@2x",
|
||||
"font_class": "a-bitian2x",
|
||||
"unicode": "e8f5",
|
||||
"unicode_decimal": 59637
|
||||
},
|
||||
{
|
||||
"icon_id": "26325700",
|
||||
"name": "左滑@2x",
|
||||
"font_class": "a-zuohua2x",
|
||||
"unicode": "e8f7",
|
||||
"unicode_decimal": 59639
|
||||
},
|
||||
{
|
||||
"icon_id": "26325701",
|
||||
"name": "链接",
|
||||
"font_class": "lianjie3",
|
||||
"unicode": "e8f8",
|
||||
"unicode_decimal": 59640
|
||||
},
|
||||
{
|
||||
"icon_id": "25748537",
|
||||
"name": "知识图谱",
|
||||
"font_class": "zhishitupu",
|
||||
"unicode": "e8fc",
|
||||
"unicode_decimal": 59644
|
||||
},
|
||||
{
|
||||
"icon_id": "25748551",
|
||||
"name": "计算机",
|
||||
"font_class": "jisuanji1",
|
||||
"unicode": "e8fd",
|
||||
"unicode_decimal": 59645
|
||||
},
|
||||
{
|
||||
"icon_id": "25748553",
|
||||
"name": "电子",
|
||||
"font_class": "dianzi1",
|
||||
"unicode": "e8ff",
|
||||
"unicode_decimal": 59647
|
||||
},
|
||||
{
|
||||
"icon_id": "25748554",
|
||||
"name": "军事理论",
|
||||
"font_class": "junshililun1",
|
||||
"unicode": "e900",
|
||||
"unicode_decimal": 59648
|
||||
},
|
||||
{
|
||||
"icon_id": "25748555",
|
||||
"name": "软件工程",
|
||||
"font_class": "ruanjiangongcheng1",
|
||||
"unicode": "e901",
|
||||
"unicode_decimal": 59649
|
||||
},
|
||||
{
|
||||
"icon_id": "25748556",
|
||||
"name": "医学",
|
||||
"font_class": "yixue1",
|
||||
"unicode": "e902",
|
||||
"unicode_decimal": 59650
|
||||
},
|
||||
{
|
||||
"icon_id": "25748558",
|
||||
"name": "通信",
|
||||
"font_class": "tongxin1",
|
||||
"unicode": "e904",
|
||||
"unicode_decimal": 59652
|
||||
},
|
||||
{
|
||||
"icon_id": "25748560",
|
||||
"name": "政策法规",
|
||||
"font_class": "zhengcefagui1",
|
||||
"unicode": "e906",
|
||||
"unicode_decimal": 59654
|
||||
},
|
||||
{
|
||||
"icon_id": "25748528",
|
||||
"name": "大数据",
|
||||
"font_class": "dashuju",
|
||||
"unicode": "e8f3",
|
||||
"unicode_decimal": 59635
|
||||
},
|
||||
{
|
||||
"icon_id": "25748531",
|
||||
"name": "人工智能",
|
||||
"font_class": "rengongzhineng",
|
||||
"unicode": "e8f6",
|
||||
"unicode_decimal": 59638
|
||||
},
|
||||
{
|
||||
"icon_id": "25733167",
|
||||
"name": "双引号(1)@2x",
|
||||
"font_class": "a-shuangyinhao12x",
|
||||
"unicode": "e8f2",
|
||||
"unicode_decimal": 59634
|
||||
},
|
||||
{
|
||||
"icon_id": "25701947",
|
||||
"name": "顶部",
|
||||
"font_class": "dingbu",
|
||||
"unicode": "e8ee",
|
||||
"unicode_decimal": 59630
|
||||
},
|
||||
{
|
||||
"icon_id": "25701948",
|
||||
"name": "帮助",
|
||||
"font_class": "bangzhu1",
|
||||
"unicode": "e8ef",
|
||||
"unicode_decimal": 59631
|
||||
},
|
||||
{
|
||||
"icon_id": "25701949",
|
||||
"name": "意见反馈",
|
||||
"font_class": "yijianfankui2",
|
||||
"unicode": "e8f0",
|
||||
"unicode_decimal": 59632
|
||||
},
|
||||
{
|
||||
"icon_id": "25701950",
|
||||
"name": "分享",
|
||||
"font_class": "fenxiang",
|
||||
"unicode": "e8f1",
|
||||
"unicode_decimal": 59633
|
||||
},
|
||||
{
|
||||
"icon_id": "25580217",
|
||||
"name": "地址",
|
||||
"font_class": "dizhi",
|
||||
"unicode": "e8eb",
|
||||
"unicode_decimal": 59627
|
||||
},
|
||||
{
|
||||
"icon_id": "25580218",
|
||||
"name": "邮箱",
|
||||
"font_class": "youxiang1",
|
||||
"unicode": "e8ec",
|
||||
"unicode_decimal": 59628
|
||||
},
|
||||
{
|
||||
"icon_id": "25580219",
|
||||
"name": "电话icon",
|
||||
"font_class": "dianhuaicon",
|
||||
"unicode": "e8ed",
|
||||
"unicode_decimal": 59629
|
||||
},
|
||||
{
|
||||
"icon_id": "25284174",
|
||||
"name": "添加icon",
|
||||
"font_class": "tianjiaicon",
|
||||
"unicode": "e8e8",
|
||||
"unicode_decimal": 59624
|
||||
},
|
||||
{
|
||||
"icon_id": "25284175",
|
||||
"name": "铃声icon",
|
||||
"font_class": "lingshengicon",
|
||||
"unicode": "e8ea",
|
||||
"unicode_decimal": 59626
|
||||
},
|
||||
{
|
||||
"icon_id": "25204490",
|
||||
"name": "更多icon",
|
||||
"font_class": "gengduoicon",
|
||||
"unicode": "e8e5",
|
||||
"unicode_decimal": 59621
|
||||
},
|
||||
{
|
||||
"icon_id": "25204491",
|
||||
"name": "时间icon",
|
||||
"font_class": "shijianicon",
|
||||
"unicode": "e8e7",
|
||||
"unicode_decimal": 59623
|
||||
},
|
||||
{
|
||||
"icon_id": "25188228",
|
||||
"name": "密码icon",
|
||||
"font_class": "mimaicon",
|
||||
"unicode": "e8e1",
|
||||
"unicode_decimal": 59617
|
||||
},
|
||||
{
|
||||
"icon_id": "25188229",
|
||||
"name": "钩icon",
|
||||
"font_class": "gouicon",
|
||||
"unicode": "e8e2",
|
||||
"unicode_decimal": 59618
|
||||
},
|
||||
{
|
||||
"icon_id": "25188230",
|
||||
"name": "展开icon",
|
||||
"font_class": "zhankaiicon",
|
||||
"unicode": "e8e3",
|
||||
"unicode_decimal": 59619
|
||||
},
|
||||
{
|
||||
"icon_id": "24656750",
|
||||
"name": "文件",
|
||||
|
|
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 9.7 KiB |
|
@ -2,10 +2,11 @@
|
|||
<html lang="zh-CN" class="notranslate translated-ltr" translate="no">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name=”Keywords” Content=”trustie,trustieforge,forge,确实让创建更美好,协同开发平台″>
|
||||
<meta name=”Keywords” Content=”TrustieOpenSourceProject″>
|
||||
<meta name=”Keywords” Content=”issue,bug,tracker,软件工程,课程实践″>
|
||||
<meta name=”Description” Content=”持续构建协同、共享、可信的软件创建生态开源创作与软件生产相结合,支持大规模群体开展软件协同创新活动”>
|
||||
<title>红山开源社区</title>
|
||||
<meta name="keywords" content="红山开源,创客空间,群智共享">
|
||||
<meta name="keywords" content="红山开源社区,开源开放,众创,论坛">
|
||||
<meta name="keywords" content="issue,bug,tracker">
|
||||
<meta name="description" content="红山开源是一个依托互联网群体智慧实现世界范围内资源深度融合、开放共享和协同创新的开源社区" />
|
||||
<meta name="theme-color" content="#000000">
|
||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
|
||||
|
||||
|
@ -14,13 +15,54 @@
|
|||
<link rel="stylesheet" type="text/css" href="%PUBLIC_URL%css/editormd.min.css">
|
||||
<link rel="stylesheet" type="text/css" href="%PUBLIC_URL%css/merge.css">
|
||||
<%= htmlWebpackPlugin.tags.headTags %>
|
||||
<style>
|
||||
#ie_info{
|
||||
display: none;
|
||||
text-align: center;
|
||||
margin: 10vh;
|
||||
color: #4154f1;
|
||||
font-size: 40px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!--用于markdown转html -->
|
||||
<div id="ie_info">不支持当前浏览器,请更换浏览器!<br/>推荐使用谷歌浏览器、360浏览器极速模式、火狐浏览器或Edge浏览器!</div>
|
||||
<div id="md_div" style="display: none;"></div>
|
||||
<div id="root" class="page -layout-v -fit widthunit"></div>
|
||||
<div id="picture_display" style="display: none;"></div>
|
||||
<script src="%PUBLIC_URL%js/jquery-1.8.3.min.js"></script>
|
||||
<script>
|
||||
var getExplorer = (function () {
|
||||
var explorer = window.navigator.userAgent,
|
||||
compare = function (s) { return (explorer.indexOf(s) >= 0); },
|
||||
ie11 = (function () { return ("ActiveXObject" in window) })();
|
||||
if (compare("MSIE") || ie11) { return 'ie'; }
|
||||
else if (compare("Firefox") && !ie11) { return 'Firefox'; }
|
||||
else if (compare("Chrome") && !ie11) {
|
||||
if (explorer.indexOf("Edge") > -1) {
|
||||
return 'Edge';
|
||||
} else {
|
||||
return 'Chrome';
|
||||
}
|
||||
}
|
||||
else if (compare("Opera") && !ie11) { return 'Opera'; }
|
||||
else if (compare("Safari") && !ie11) { return 'Safari'; }
|
||||
})()
|
||||
if (getExplorer == 'ie') {
|
||||
$('#ie_info').css({display:'block'});
|
||||
$('#root').css({display:'none'});
|
||||
}
|
||||
window.onload=function(){
|
||||
$(".newContainer").delegate("a.anchors","click",function(){
|
||||
let h = $(this).offset().top - 180;
|
||||
$("html,body").animate({scrollTop:h},10);
|
||||
window.location.hash = $(this).attr("name");
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
<script src="%PUBLIC_URL%js/js_min_all.js"></script>
|
||||
<script src="%PUBLIC_URL%js/codemirror/codemirror.js"></script>
|
||||
<script src="%PUBLIC_URL%js/editormd/editormd.min.js"></script>
|
||||
|
|
172
readme.txt
|
@ -1,172 +0,0 @@
|
|||
其他的文档位置:
|
||||
/educoder/public/react/public/js/readme.txt 关于js_min_all
|
||||
/educoder/educoder/public/react/scripts/readme-cdn.txt 关于CDN
|
||||
/educoder/public/react/src/modules/page/readme.txt 关于TPI
|
||||
/educoder/public/editormd/lib/readme-marked.txt 关于md编辑器 marked.js
|
||||
|
||||
1、 安装node v6.9.x;此安装包含了node和npm。
|
||||
|
||||
2、 安装cnpm(命令行): npm install -g cnpm --registry=https://registry.npm.taobao.org
|
||||
|
||||
3、 安装依赖的js库(public/react目录下<即项目package.json所在目录>,开启命令行): cnpm install
|
||||
|
||||
4、 如果你的ruby服务使用的是3000端口,则需要在package.json中修改"port"参数的值
|
||||
|
||||
5、 启动服务(命令行-目录同3): npm start
|
||||
|
||||
6、 build初始化 npm run build
|
||||
|
||||
注意:
|
||||
1、cnpm install 之前先需要修改下ruby mine的一个settings,防止ruby mine对node_modules目录里的内容建索引(详情见线上文档-react开发环境搭建)
|
||||
|
||||
|
||||
线上文档-react开发环境搭建 地址: https://www.trustie.net/boards/6862/topics/46425
|
||||
|
||||
2、package.json中配置:
|
||||
"proxy": "http://localhost:3000",
|
||||
"port": "3007"
|
||||
|
||||
目前暂时必须写为和上面的一样,ruby服务端口为3000,node服务端口为3007;当当前端口为3007时,程序会将axios发出的请求转到localhost:3000上,进行跨域请求。
|
||||
|
||||
3、静态js加载问题:
|
||||
editormd源码改动,注释掉了564行 加载codemirror/codemirror.min的js代码。因为codemirror 已经加载了,codemirror对象会带有插件,重复加载会覆盖全局codemirror对象,使得之前加载的插件失效
|
||||
|
||||
----------------------------------------------------------------------------------------------
|
||||
|
||||
React开发相关知识点
|
||||
需要了解的ES6的知识 https://www.trustie.net/boards/6862/topics/46427
|
||||
|
||||
----------------------------------------------------------------------------------------------
|
||||
|
||||
新加入的lib有: axios、material-ui、lodash、classnames、moment、immutability-helper
|
||||
rc-tree、rc-form 、rc-rate、rc-pagination、rc-select 、showdown
|
||||
考虑替代删除确认弹出框的组件http://react-component.github.io/tooltip/examples/onVisibleChange.html
|
||||
|
||||
|
||||
----------------------------------------------------------------------------------------------
|
||||
TPI State整理 START
|
||||
----------------------------------------------------------------------------------------------
|
||||
TPIContextProvider 详情接口的所有state
|
||||
|
||||
Index.js
|
||||
taskListLoading
|
||||
challenges
|
||||
challengesDrawerOpen
|
||||
|
||||
MainContentContainer.js
|
||||
repositoryCode: '',
|
||||
currentPath: '', // 当前所选的path,可能是一个只读的path(只读path的话,challenge.athIndex为-1)
|
||||
isEditablePath // 是否是可以编辑的path()
|
||||
|
||||
open: false, // 繁忙等级等提示用Dialog, TODO 考虑重构封装到根组件
|
||||
gameBuilding: false, // 评测中标志
|
||||
codeStatus: 2, // 0 已修改 1 保存中 2 已保存 3 保存失败
|
||||
|
||||
codeLoading: false, // code加载中
|
||||
resetCodeDialogOpen: false, // TODO考虑重构封装到根组件
|
||||
resetPassedCodeDialogOpen: false, // TODO考虑重构封装到根组件
|
||||
|
||||
|
||||
LeftViewContainer.js
|
||||
tabIndex: 0, 页签index
|
||||
dialogOpen: false,
|
||||
gameAnswer: '', 答案
|
||||
snackbarOpen: false,
|
||||
comments: [], 评论
|
||||
comment_count_without_reply: 0, 评论数量 TODO 和详情接口字段重复
|
||||
// 默认pageSize为10
|
||||
currentPage: 1, 评论分页
|
||||
loadingComments: true, 评论加载中
|
||||
gotNewReply: false, 新的回复
|
||||
|
||||
CodeRepositoryViewContainer.js
|
||||
drawerOpen: false,
|
||||
loadingFirstRepoFiles: false, drawer里的loading状态
|
||||
fileTreeData: "", 文件树
|
||||
codeRepositoryViewExpanded: false, 展开状态
|
||||
|
||||
|
||||
CodeEvaluateView.js
|
||||
testSetsInitedArray: testSetsExpandedArrayInitVal.slice(0), 测试集是否初始化标志
|
||||
evaluateViewExpanded: false,
|
||||
tabIndex: 1, 页签index
|
||||
----------------------------------------------------------------------------------------------
|
||||
TPI State整理 END
|
||||
----------------------------------------------------------------------------------------------
|
||||
|
||||
----------------------------------------------------------------------------------------------
|
||||
重要:TPI实现时修改的js库的记录 START
|
||||
----------------------------------------------------------------------------------------------
|
||||
|
||||
----------------------------------------------------------------------------------------------
|
||||
重要:TPI实现时修改的js库的记录 END
|
||||
----------------------------------------------------------------------------------------------
|
||||
create_kindeditor.js __isR 表示是react环境,react环境下采用事件通知react组件来处理
|
||||
if (window['__isR'] === true) {
|
||||
$(document).trigger("onReply", { commentContent:tContents, id:id, editor:params.editor } );
|
||||
} else {
|
||||
params.form.submit();
|
||||
}
|
||||
|
||||
editormd.min.js 直接注释掉了codemirror.min的加载,应该改成有codeMirror了则不加载
|
||||
// codemirror 已经加载了,codemirror会有插件,重复加载会使得之前加载的插件失效
|
||||
// editormd.loadScript(loadPath + "codemirror/codemirror.min", function() {
|
||||
对应提交项
|
||||
Revision: 73d95ce266d5d7e55a3a88d08d1247b3a08c7caf
|
||||
Date: 2018/4/2 16:12:21
|
||||
Message: 切下一题时更新左侧editormd里的内容,更新右侧codemirror内容。
|
||||
|
||||
js_min_all.js 最后面手动加入了若干js代码,还没做分离、再合并处理 date:180507
|
||||
is_cdn_link tpi_html_show方法
|
||||
|
||||
|
||||
|
||||
|
||||
----------------------------------------------------------------------------------------------
|
||||
TPM使用react实现的利弊 START
|
||||
----------------------------------------------------------------------------------------------
|
||||
1、全部使用react重写
|
||||
做法:第一屏使用新接口,之前的js脚本还是继续使用,有必要的话(需要局部刷新的),将部分jquery实现改为react实现
|
||||
利:
|
||||
tpi中评论组件、文件树组件方便复用
|
||||
js、css库管理方便
|
||||
|
||||
暂时不依赖于react的状态管理
|
||||
之前的ajax请求还是可以暂时复用
|
||||
|
||||
|
||||
弊:
|
||||
接口评估?
|
||||
rails模板要改成jsx语法
|
||||
头部功能区域、底部静态链接区域会存在重复代码 : react版和非react版
|
||||
codemirror等组件的使用会不会有问题?
|
||||
|
||||
学习成本
|
||||
|
||||
!!目前决定,新页面或者评论组件所在页面使用react实现
|
||||
----------------------------------------------------------------------------------------------
|
||||
TPM使用react实现的利弊 END
|
||||
----------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
其他方式:comments组件build到新入口后,将代码copy到rails页面
|
||||
----------------------------------------------------------------------------------------------
|
||||
不错的库 START
|
||||
----------------------------------------------------------------------------------------------
|
||||
https://livicons.com/icons-original -- 收费 动画icon
|
||||
https://github.com/maxwellito/vivus -- 让SVG标签动起来
|
||||
http://ianlunn.github.io/Hover/ -- hover 动画
|
||||
https://github.com/legomushroom/mojs
|
||||
https://github.com/juliangarnier/anime --js动画
|
||||
https://codepen.io/juliangarnier/pen/gmOwJX
|
||||
https://github.com/daneden/animate.css
|
||||
|
||||
|
||||
A responsive tour snippet, with a step-by-step guide(onboarding) to help users understand how to use your website.
|
||||
|
||||
https://github.com/sorich87/bootstrap-tour
|
||||
https://github.com/linkedin/hopscotch
|
||||
https://github.com/Robophil/Product-Tour
|
||||
|
||||
code editor
|
||||
https://microsoft.github.io/monaco-editor/
|
938
src/App.js
|
@ -4,10 +4,10 @@ import { broadcastChannelOnmessage, isDev, queryString } from 'educoder';
|
|||
import { notification } from 'antd';
|
||||
|
||||
import './index.css';
|
||||
|
||||
let message501 = false;
|
||||
|
||||
broadcastChannelOnmessage('refreshPage', () => {
|
||||
window.location.reload();
|
||||
window.location.reload()
|
||||
})
|
||||
|
||||
function locationurl(list) {
|
||||
|
@ -25,18 +25,22 @@ if (isDev) {
|
|||
}
|
||||
debugType = window.location.search.indexOf('debug=t') !== -1 ? 'teacher' :
|
||||
window.location.search.indexOf('debug=s') !== -1 ? 'student' :
|
||||
window.location.search.indexOf('debug=a') !== -1 ? 'admin' : parsed.debug || 'admin'
|
||||
}
|
||||
window.location.search.indexOf('debug=a') !== -1 ? 'a' : parsed.debug || 'admin'
|
||||
}
|
||||
window._debugType = debugType;
|
||||
export function initAxiosInterceptors(props) {
|
||||
// 判断网络是否连接
|
||||
initOnlineOfflineListener();
|
||||
|
||||
var proxy = "https://testforgeplus.trustie.net";
|
||||
// var proxy = "http://192.168.1.40:3000";
|
||||
// var proxy = "http://111.8.36.180:8000";
|
||||
var proxy = "http://117.50.100.12:49999"
|
||||
// var proxy = "https://www.osredm.com";
|
||||
|
||||
//响应前的设置
|
||||
axios.interceptors.request.use(
|
||||
config => {
|
||||
if(config.url.indexOf("http") !== -1) {
|
||||
if(config.url.substr(0, 4) === "http") {
|
||||
return config
|
||||
}
|
||||
requestProxy(config);
|
||||
|
@ -68,6 +72,8 @@ export function initAxiosInterceptors(props) {
|
|||
if (response.data.status === -1) {
|
||||
if (window.location.pathname.startsWith('/tasks/')) {
|
||||
props.showSnackbar(response.data.message || '服务器异常,请联系管理员。')
|
||||
} else if(window.location.pathname.startsWith('/login') || window.location.pathname.startsWith('/register') || window.location.pathname.startsWith('/resetPassword')) {
|
||||
return response;
|
||||
} else {
|
||||
notification.open({
|
||||
message: "提示",
|
||||
|
|
|
@ -9,7 +9,20 @@ class Loading extends Component {
|
|||
}
|
||||
|
||||
render() {
|
||||
return ""
|
||||
return (
|
||||
<div className="App" style={{ minHeight: '800px', width: "100%" }}>
|
||||
<style>
|
||||
{
|
||||
`
|
||||
.margintop{
|
||||
margin-top:20%;
|
||||
}
|
||||
`
|
||||
}
|
||||
</style>
|
||||
<Spin size="large" className={"margintop"} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
import React from 'react'
|
||||
import MiniPagination from './components/mini-pagination'
|
||||
|
||||
export default () => {
|
||||
function onPageChange(page) {
|
||||
console.log(page, '-----------')
|
||||
}
|
||||
return <MiniPagination onChange={onPageChange} current={1} total={100} pageSize={16} />
|
||||
}
|
|
@ -13,7 +13,7 @@ export function handleDateString(dateString) {
|
|||
if (miniute < 30 || miniute == 60) {
|
||||
return [ar[0], '30'].join(':')
|
||||
}
|
||||
if (miniute < 60) {
|
||||
if (miniute < 60) {
|
||||
// 加一个小时
|
||||
const tempStr = [ar[0], '00'].join(':');
|
||||
const format = "YYYY-MM-DD HH:mm";
|
||||
|
@ -21,7 +21,7 @@ export function handleDateString(dateString) {
|
|||
_moment.add(1, 'hours')
|
||||
return _moment.format(format)
|
||||
}
|
||||
|
||||
|
||||
return dateString
|
||||
}
|
||||
|
||||
|
@ -39,64 +39,59 @@ export function getNextHalfHourOfMoment(moment) {
|
|||
return moment
|
||||
}
|
||||
|
||||
export function formatSeconds(value) {
|
||||
export function formatSeconds(value) {
|
||||
|
||||
var theTime = parseInt(value);// 秒
|
||||
var middle= 0;// 分
|
||||
var hour= 0;// 小时
|
||||
|
||||
if(theTime > 60) {
|
||||
middle= parseInt(theTime/60);
|
||||
theTime = parseInt(theTime%60);
|
||||
if(middle> 60) {
|
||||
hour= parseInt(middle/60);
|
||||
middle= parseInt(middle%60);
|
||||
}
|
||||
}
|
||||
var result = ""+parseInt(theTime)+"秒";
|
||||
if(middle > 0) {
|
||||
if(hour>0){
|
||||
result = ""+parseInt(middle)+"分";
|
||||
}else{
|
||||
result = ""+parseInt(middle)+"分"+result;
|
||||
}
|
||||
|
||||
}
|
||||
if(hour> 0) {
|
||||
result = ""+parseInt(hour)+"小时"+result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
var theTime = parseInt(value);// 秒
|
||||
var middle = 0;// 分
|
||||
var hour = 0;// 小时
|
||||
|
||||
export function formatDuring(mss){
|
||||
var days = parseInt(mss / (1000 * 60 * 60 * 24));
|
||||
var hours = parseInt((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
|
||||
var minutes = parseInt((mss % (1000 * 60 * 60)) / (1000 * 60));
|
||||
// console.log("formatDuringformatDuring");
|
||||
// console.log(days);
|
||||
// console.log(hours);
|
||||
// console.log(minutes);
|
||||
// console.log(Math.abs(days));
|
||||
// console.log(Math.abs(hours));
|
||||
// console.log(Math.abs(minutes));
|
||||
if (theTime > 60) {
|
||||
middle = parseInt(theTime / 60);
|
||||
theTime = parseInt(theTime % 60);
|
||||
if (middle > 60) {
|
||||
hour = parseInt(middle / 60);
|
||||
middle = parseInt(middle % 60);
|
||||
}
|
||||
}
|
||||
var result = "" + parseInt(theTime) + "秒";
|
||||
if (middle > 0) {
|
||||
if (hour > 0) {
|
||||
result = "" + parseInt(middle) + "分";
|
||||
} else {
|
||||
result = "" + parseInt(middle) + "分" + result;
|
||||
}
|
||||
|
||||
try {
|
||||
days = Math.abs(days);
|
||||
} catch (e) {
|
||||
}
|
||||
if (hour > 0) {
|
||||
result = "" + parseInt(hour) + "小时" + result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
try {
|
||||
hours = Math.abs(hours);
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
try {
|
||||
minutes = Math.abs(minutes);
|
||||
} catch (e) {
|
||||
export function formatDuring(s) {
|
||||
s = Math.abs(s);
|
||||
let days = Math.floor(s / (60 * 60 * 24));
|
||||
let hours = Math.floor((s % (60 * 60 * 24)) / (60 * 60));
|
||||
let minutes = Math.floor((s % (60 * 60)) / (60));
|
||||
let second = Math.floor(s % 60);
|
||||
|
||||
}
|
||||
return days + "天" + hours + "小时" + minutes + "分";
|
||||
if (days) {
|
||||
if(hours){
|
||||
return days + "天" + hours + "小时";
|
||||
}
|
||||
return days + "天";
|
||||
}
|
||||
if (hours) {
|
||||
if(minutes){
|
||||
return hours + "小时" + minutes + "分";
|
||||
}
|
||||
return hours + "小时" ;
|
||||
}
|
||||
if (minutes) {
|
||||
return minutes + "分";
|
||||
}
|
||||
return second + "秒";
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -3,6 +3,6 @@ export function isDev() {
|
|||
}
|
||||
|
||||
// const isMobile
|
||||
export const isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
|
||||
export const isMobile = (/android|webos|iphone|ipad|ipod|blackberry|honor|huawei|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
|
||||
|
||||
// const isWeiXin = (/MicroMessenger/i.test(navigator.userAgent.toLowerCase()));
|
||||
|
|
|
@ -1,15 +1,30 @@
|
|||
import { queryString } from 'educoder'
|
||||
import { queryString } from "educoder";
|
||||
export function updatePageParams(pageNum, props) {
|
||||
const url = props.match.url
|
||||
|
||||
const _search = props.location.search;
|
||||
let parsed = {};
|
||||
if (_search) {
|
||||
parsed = queryString.parse(_search);
|
||||
}
|
||||
const url = props.match.url;
|
||||
|
||||
// 修改page參數
|
||||
parsed.page = pageNum
|
||||
const _search = props.location.search;
|
||||
let parsed = {};
|
||||
if (_search) {
|
||||
parsed = queryString.parse(_search);
|
||||
}
|
||||
|
||||
props.history.push(`${url}?${queryString.stringify(parsed)}`)
|
||||
// 修改page參數
|
||||
parsed.page = pageNum;
|
||||
|
||||
props.history.push(`${url}?${queryString.stringify(parsed)}`);
|
||||
}
|
||||
|
||||
export function goUser(login) {
|
||||
const main_web_site_url =
|
||||
localStorage.chromesetting &&
|
||||
JSON.parse(localStorage.chromesetting).main_web_site_url;
|
||||
window.location.href = `${main_web_site_url}/accounts/${login}`;
|
||||
}
|
||||
|
||||
export function goUserMes(user_id) {
|
||||
const main_web_site_url =
|
||||
localStorage.chromesetting &&
|
||||
JSON.parse(localStorage.chromesetting).main_web_site_url;
|
||||
const login =sessionStorage.current_user &&JSON.parse(sessionStorage.current_user).login;
|
||||
window.location.href = `${main_web_site_url}/users/${login}/message_detail?user_id=${user_id}`;
|
||||
}
|
||||
|
|
|
@ -68,8 +68,11 @@ export function appendFileSizeToUploadFile(item) {
|
|||
return `${item.title}${uploadNameSizeSeperator}${item.filesize}`
|
||||
}
|
||||
export function appendFileSizeToUploadFileAll(fileList) {
|
||||
return fileList.map(item => {
|
||||
if (item.name.indexOf(uploadNameSizeSeperator) === -1) {
|
||||
return fileList && fileList.map(item => {
|
||||
if(!item.name)item.name=item.fileName;
|
||||
if(!item.uid)item.uid="rc-upload" + item.id;
|
||||
if(!item.size)item.size=item.fileSize;
|
||||
if ((item.name).indexOf(uploadNameSizeSeperator) == -1) {
|
||||
return Object.assign({}, item, { name: `${item.name}${uploadNameSizeSeperator}${bytesToSize(item.size)}` })
|
||||
}
|
||||
return item
|
||||
|
|
|
@ -1,19 +1,21 @@
|
|||
import React from "react";
|
||||
import md5 from 'md5';
|
||||
import {Input} from "antd";
|
||||
import { Input } from "antd";
|
||||
const { Search } = Input;
|
||||
|
||||
const $ = window.$;
|
||||
const isDev = window.location.port == 3007;
|
||||
const isdev2= window.location.hostname ==='www.educoder.net'
|
||||
export const TEST_HOST = "https://testforgeplus.trustie.net/"
|
||||
export const TEST_HOST = "http://111.8.36.180:8000";
|
||||
export function getImageUrl(path) {
|
||||
// https://www.educoder.net
|
||||
// https://testbdweb.trustie.net
|
||||
// const local = 'http://localhost:3000'
|
||||
const local = 'https://testforgeplus.trustie.net';
|
||||
// const local = 'http://localhost:3000'
|
||||
// const local = 'http://39.105.176.215:49999';
|
||||
const local = 'http://111.8.36.180:8000';
|
||||
path && !path.startsWith('/') && !path.startsWith('http') && (path = '/'.concat(path));
|
||||
if (isDev) {
|
||||
return `${local}/${path}`
|
||||
return `${local}${path}`
|
||||
}
|
||||
return `${path}`;
|
||||
}
|
||||
|
@ -36,50 +38,65 @@ export function numFormat(num, digits){
|
|||
}
|
||||
|
||||
export function getImage(path) {
|
||||
// https://www.educoder.net
|
||||
// https://testbdweb.trustie.net
|
||||
// const local = 'http://localhost:3000'
|
||||
const local = 'https://testforgeplus.trustie.net/';
|
||||
if(path.indexOf("http://")===-1){
|
||||
const local = 'http://111.8.36.180:8000';
|
||||
if (path&&path.indexOf("http://") === -1) {
|
||||
if (isDev) {
|
||||
return `${local}/images/${path}`
|
||||
}
|
||||
return `/${path}`;
|
||||
}else{
|
||||
} else {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
export function getTestImage(path) {
|
||||
const local = 'http://111.8.36.180:8000';
|
||||
if (path && path.indexOf("http://") === -1) {
|
||||
if (isDev) {
|
||||
return `${local}${path}`
|
||||
}
|
||||
return `${path}`;
|
||||
} else {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
export function getLogoImageUrl(path) {
|
||||
const local = 'http://111.8.36.180:8000';
|
||||
|
||||
if (isDev) {
|
||||
return `${local}/${path}`
|
||||
}
|
||||
return `/${path}`;
|
||||
}
|
||||
|
||||
export function getcdnImageUrl(path) {
|
||||
// https://www.educoder.net
|
||||
// https://testbdweb.trustie.net
|
||||
// const local = 'http://localhost:3000'
|
||||
const testlocal = 'https://testali-cdn.educoder.net'
|
||||
const local='https://ali-cdn.educoder.net'
|
||||
let firstStr=path.substr(0,1);
|
||||
const testlocal = 'https://testali-cdn.educoder.net'
|
||||
const local = 'https://ali-cdn.educoder.net'
|
||||
let firstStr = path.substr(0, 1);
|
||||
if (isdev2) {
|
||||
return `${local}/${path}`;
|
||||
}else{
|
||||
if(firstStr=="/"){
|
||||
} else {
|
||||
if (firstStr == "/") {
|
||||
return `${path}`
|
||||
}else{
|
||||
} else {
|
||||
return `/${path}`
|
||||
}
|
||||
}
|
||||
// return `${local}/${path}`;
|
||||
}
|
||||
|
||||
export function setcndImagesUrl(path){
|
||||
export function setcndImagesUrl(path) {
|
||||
const testlocal = 'https://testali-cdn.educoder.net'
|
||||
const local='https://ali-cdn.educoder.net'
|
||||
let firstStr=path.substr(0,1);
|
||||
if(firstStr=="/"){
|
||||
const local = 'https://ali-cdn.educoder.net'
|
||||
let firstStr = path.substr(0, 1);
|
||||
if (firstStr == "/") {
|
||||
if (!isdev2) {
|
||||
return `${path}`
|
||||
}
|
||||
return `${local}${path}`;
|
||||
//return isDev?`${testlocal}${path}`:`${local}${path}`;
|
||||
}else{
|
||||
//return isDev?`${testlocal}${path}`:`${local}${path}`;
|
||||
} else {
|
||||
if (!isdev2) {
|
||||
return `/${path}`
|
||||
}
|
||||
|
@ -90,31 +107,31 @@ export function setcndImagesUrl(path){
|
|||
|
||||
|
||||
|
||||
export function setImagesUrl(path){
|
||||
export function setImagesUrl(path) {
|
||||
const testlocal = 'https://testali-cdn.educoder.net'
|
||||
const local='https://ali-cdn.educoder.net'
|
||||
let firstStr=path.substr(0,1);
|
||||
if(firstStr=="/"){
|
||||
const local = 'https://ali-cdn.educoder.net'
|
||||
let firstStr = path.substr(0, 1);
|
||||
if (firstStr == "/") {
|
||||
if (!isdev2) {
|
||||
return `${path}`
|
||||
}
|
||||
return `${local}${path}`;
|
||||
// return isDev?`${testlocal}${path}`:`${path}`;
|
||||
}else{
|
||||
} else {
|
||||
if (!isdev2) {
|
||||
return `/${path}`
|
||||
}
|
||||
return `${local}/${path}`;
|
||||
//return isDev?`${testlocal}/${path}`:`/${path}`;
|
||||
//return isDev?`${testlocal}/${path}`:`/${path}`;
|
||||
}
|
||||
}
|
||||
|
||||
export function getUrl(path, goTest) {
|
||||
const local = 'https://testforgeplus.trustie.net'
|
||||
const local = TEST_HOST;
|
||||
if (isDev) {
|
||||
return `${local}${path?path:''}`
|
||||
return `${local}${path ? path : ''}`
|
||||
}
|
||||
return `${path ? path: ''}`;
|
||||
return `${path ? path : ''}`;
|
||||
}
|
||||
|
||||
export function getUrlmys(path, goTest) {
|
||||
|
@ -128,9 +145,9 @@ export function getUrlmys(path, goTest) {
|
|||
// const local = 'https://testeduplus2.educoder.net'
|
||||
const local = 'https://test-jupyterweb.educoder.net'
|
||||
if (isDev) {
|
||||
return `${local}${path?path:''}`
|
||||
return `${local}${path ? path : ''}`
|
||||
}
|
||||
return `${path ? path: ''}`;
|
||||
return `${path ? path : ''}`;
|
||||
}
|
||||
export function getStaticUrl() {
|
||||
const local = TEST_HOST;
|
||||
|
@ -141,27 +158,29 @@ export function getStaticUrl() {
|
|||
return ''
|
||||
}
|
||||
export function getUrl2(path, goTest) {
|
||||
const local = 'http://localhost:3000'
|
||||
const local = 'http://localhost:3000'
|
||||
if (isDev) {
|
||||
return `${local}${path?path:''}`
|
||||
return `${local}${path ? path : ''}`
|
||||
}
|
||||
return `${path ? path: ''}`;
|
||||
return `${path ? path : ''}`;
|
||||
}
|
||||
const newopens ="79e33abd4b6588941ab7622aed1e67e8";
|
||||
const newopens = "79e33abd4b6588941ab7622aed1e67e8";
|
||||
let newtimestamp;
|
||||
let checkSubmitFlgs = false;
|
||||
function railsgettimess(proxy) {
|
||||
if(checkSubmitFlgs===false){
|
||||
$.ajax({url:proxy,
|
||||
async:false,success:function(data){
|
||||
if(data.status===0){
|
||||
newtimestamp=data.message;
|
||||
if (checkSubmitFlgs === false) {
|
||||
$.ajax({
|
||||
url: proxy,
|
||||
async: false, success: function (data) {
|
||||
if (data.status === 0) {
|
||||
newtimestamp = data.message;
|
||||
checkSubmitFlgs = true;
|
||||
}
|
||||
}})
|
||||
}
|
||||
})
|
||||
|
||||
window.setTimeout(function () {
|
||||
checkSubmitFlgs=false;
|
||||
checkSubmitFlgs = false;
|
||||
}, 2500);
|
||||
}
|
||||
}
|
||||
|
@ -204,8 +223,8 @@ export function getUploadActionUrlOfAuth(id) {
|
|||
}
|
||||
|
||||
export function getRandomNumber(type) {
|
||||
let anewopens=md5(newopens+newtimestamp);
|
||||
return type===true?`randomcode=${newtimestamp}&client_key=${anewopens}`:`?randomcode=${newtimestamp}&client_key=${anewopens}`
|
||||
let anewopens = md5(newopens + newtimestamp);
|
||||
return type === true ? `randomcode=${newtimestamp}&client_key=${anewopens}` : `?randomcode=${newtimestamp}&client_key=${anewopens}`
|
||||
}
|
||||
|
||||
export function test(path) {
|
||||
|
@ -239,14 +258,78 @@ export function htmlEncode(str) {
|
|||
return s;
|
||||
}
|
||||
|
||||
export function publicSearchs(Placeholder,onSearch,onInputs,onChanges,loadings) {
|
||||
return(<Search
|
||||
placeholder= { Placeholder || "请输入内容进行搜索" }
|
||||
export function publicSearchs(Placeholder, onSearch, onInputs, onChanges, loadings) {
|
||||
return (<Search
|
||||
placeholder={Placeholder || "请输入内容进行搜索"}
|
||||
onSearch={onSearch}
|
||||
// value={searchValue}
|
||||
onInput={onInputs}
|
||||
onChange={onChanges}
|
||||
loading={loadings||false}
|
||||
loading={loadings || false}
|
||||
allowClear={true}
|
||||
></Search>)
|
||||
}
|
||||
export function getUrlToken(name, str) {
|
||||
const reg = new RegExp(`(^|&)${ name}=([^&]*)(&|$)`);
|
||||
const r = str.substr(1).match(reg);
|
||||
if (r != null) return decodeURIComponent(r[2]); return null;
|
||||
}
|
||||
|
||||
|
||||
export function turnbar(str){
|
||||
let s = str;
|
||||
if(s && s.length>0){
|
||||
if(s.indexOf("%")>-1){
|
||||
s = s.replaceAll('%','_25');
|
||||
}
|
||||
if(s.indexOf("#")>-1){
|
||||
s = s.replaceAll('#','%23');
|
||||
}
|
||||
if(s.indexOf("/")>-1){
|
||||
s = s.replaceAll('/','%2F');
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
export function returnbar(str){
|
||||
let s = str;
|
||||
if(s && s.length>0){
|
||||
if(str.indexOf("_25")>-1){
|
||||
s = s.replaceAll('_25','%');
|
||||
}
|
||||
if(s.indexOf("%23")>-1){
|
||||
s = s.replaceAll('%23','#');
|
||||
}
|
||||
if(s.indexOf("%2F")>-1){
|
||||
s = s.replaceAll('%2F','/');
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
// 手动添加/修改mate标签
|
||||
export function addMeta(name, content){
|
||||
if(document.querySelector(`meta[name='${name}']`)){
|
||||
document.querySelector(`meta[name='${name}']`).content=content;
|
||||
}else{
|
||||
const meta = document.createElement('meta');
|
||||
meta.content = content;
|
||||
meta.name = name;
|
||||
document.getElementsByTagName('head')[0].appendChild(meta);
|
||||
}
|
||||
};
|
||||
|
||||
export function IsPC(){
|
||||
var userAgentInfo = navigator.userAgent;
|
||||
var Agents = ["Android", "iPhone",
|
||||
"SymbianOS", "Windows Phone",
|
||||
"iPad", "iPod"];
|
||||
var flag = true;
|
||||
for (var v = 0; v < Agents.length; v++) {
|
||||
if (userAgentInfo.indexOf(Agents[v]) > 0) {
|
||||
flag = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return flag;
|
||||
}
|
|
@ -6,7 +6,8 @@ export {
|
|||
getUploadLogoActionUrl as getUploadLogoActionUrl,numFormat as numFormat,
|
||||
getImageUrl as getImageUrl,getImage as getImage, getmyUrl as getmyUrl, getRandomNumber as getRandomNumber, getUrl as getUrl, publicSearchs as publicSearchs, getRandomcode as getRandomcode, getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl
|
||||
, getUploadActionUrl as getUploadActionUrl, getUploadActionUrltwo as getUploadActionUrltwo, getUploadActionUrlthree as getUploadActionUrlthree, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth
|
||||
, getTaskUrlById as getTaskUrlById, TEST_HOST, htmlEncode as htmlEncode, getupload_git_file as getupload_git_file, getcdnImageUrl as getcdnImageUrl
|
||||
, getTaskUrlById as getTaskUrlById, TEST_HOST, htmlEncode as htmlEncode, getupload_git_file as getupload_git_file, getcdnImageUrl as getcdnImageUrl,getTestImage as getTestImage,getLogoImageUrl as getLogoImageUrl,
|
||||
turnbar,returnbar,getUrlToken,addMeta,IsPC
|
||||
} from './UrlTool';
|
||||
|
||||
export { setmiyah as setmiyah } from './Component';
|
||||
|
@ -19,7 +20,7 @@ export {
|
|||
, broadcastChannelPostMessage, broadcastChannelOnmessage
|
||||
} from './EventUtil';
|
||||
|
||||
export { updatePageParams as updatePageParams } from './RouterUtil';
|
||||
export { updatePageParams as updatePageParams ,goUserMes,goUser} from './RouterUtil';
|
||||
|
||||
export { bytesToSize as bytesToSize } from './UnitUtil';
|
||||
|
||||
|
|
|
@ -155,7 +155,8 @@ renderer.heading = function (text, level, raw) {
|
|||
level: level,
|
||||
text: text
|
||||
})
|
||||
return '<h' + level + ' id="' + anchor + '">' + text + '</h' + level + '>'
|
||||
let id = anchor.replace(/[.,/#!$%^&*;:{}=\-_`~():,。¥;「」|?》《~·【】‘、!]/g,"");
|
||||
return '<h' + level + ' id="' + id + '" class="markdown_anchors"><a name="#'+id+'" class="anchors"><i class="iconfont icon-lianjieicon font-14"></i></a>' + text + '</h' + level + '>'
|
||||
}
|
||||
marked.setOptions({
|
||||
silent: true,
|
||||
|
|
|
@ -0,0 +1,125 @@
|
|||
/* eslint-disable react/jsx-no-duplicate-props */
|
||||
import React, { useState } from 'react';
|
||||
import * as ReactDOM from 'react-dom';
|
||||
import { Modal, Button } from 'antd';
|
||||
import './index.scss';
|
||||
|
||||
// 函数式调用删除、通知等模态框
|
||||
|
||||
InitModal.defaultProps = {
|
||||
okText: '确认', //确定按钮的文字
|
||||
cancelText: '取消', //取消按钮的文字
|
||||
className: '', //传入的模态框类名
|
||||
inputId: 'copyText', //要复制的文本的ID
|
||||
onCancel:()=>{}, //取消的回调
|
||||
onOk:()=>{}, //确认的回调
|
||||
title:'提示', //模态框名字
|
||||
contentTitle:'', //内容标题
|
||||
content:'', //详细内容
|
||||
afterClose:()=>{}, //关闭模态框以后的回调
|
||||
};
|
||||
|
||||
// 使用函数调用删除组件
|
||||
export default function DelModal(props) {
|
||||
renderModal({ ...props, type: 'delete' })
|
||||
}
|
||||
|
||||
// 使用函数调用选择模态框组件
|
||||
export function Confirm(props) {
|
||||
renderModal({ ...props, type: 'confirm' })
|
||||
}
|
||||
|
||||
function renderModal(props) {
|
||||
const { type, afterClose } = props;
|
||||
const div = document.createElement('div');
|
||||
document.body.appendChild(div);
|
||||
|
||||
function destroy() {
|
||||
afterClose && afterClose();
|
||||
const unmountResult = ReactDOM.unmountComponentAtNode(div);
|
||||
if (unmountResult && div.parentNode) {
|
||||
div.parentNode.removeChild(div);
|
||||
}
|
||||
}
|
||||
|
||||
function modalType(type) {
|
||||
if (type === 'delete') {
|
||||
return <InitModal
|
||||
title="删除"
|
||||
contentTitle="确定要删除吗?"
|
||||
okText="确认删除"
|
||||
{...props}
|
||||
|
||||
afterClose={destroy}
|
||||
contentTitle={<React.Fragment>
|
||||
<i className="red-circle iconfont icon-shanchu_tc_icon mr3"></i>
|
||||
{props.contentTitle}
|
||||
</React.Fragment>}
|
||||
/>
|
||||
} else if (type === 'confirm') {
|
||||
return <InitModal title="选择" afterClose={destroy} {...props} />
|
||||
} else {
|
||||
return <InitModal title="选择" afterClose={destroy} {...props} />
|
||||
}
|
||||
}
|
||||
|
||||
function render() {
|
||||
setTimeout(() => {
|
||||
ReactDOM.render(
|
||||
modalType(type),
|
||||
div,
|
||||
);
|
||||
});
|
||||
}
|
||||
render();
|
||||
}
|
||||
|
||||
// 选择模态框组件
|
||||
function InitModal({
|
||||
onCancel,
|
||||
onOk,
|
||||
title,
|
||||
contentTitle,
|
||||
content,
|
||||
okText,
|
||||
cancelText,
|
||||
afterClose,
|
||||
className,
|
||||
}) {
|
||||
|
||||
const [visible, setVisible] = useState(true);
|
||||
|
||||
function onCancelModal() {
|
||||
setVisible(false);
|
||||
onCancel && onCancel()
|
||||
}
|
||||
|
||||
function onSuccess() {
|
||||
setVisible(false);
|
||||
onOk && onOk();
|
||||
}
|
||||
|
||||
return (
|
||||
<Modal
|
||||
visible={visible}
|
||||
onCancel={onCancelModal}
|
||||
afterClose={afterClose}
|
||||
title={title}
|
||||
className={`myself-modal ${className}`}
|
||||
centered
|
||||
footer={[
|
||||
<Button type="default" key="back" onClick={onCancelModal}>
|
||||
{cancelText}
|
||||
</Button>,
|
||||
<Button className="foot-submit" key="submit" onClick={onSuccess}>
|
||||
{okText}
|
||||
</Button>,
|
||||
]}
|
||||
>
|
||||
<div>
|
||||
{contentTitle && <p className="content-title">{contentTitle}</p>}
|
||||
<p className="content-descibe">{content}</p>
|
||||
</div>
|
||||
</Modal>
|
||||
)
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
.myself-modal {
|
||||
.ant-modal-header {
|
||||
padding: 9px 24px;
|
||||
background: #f8f8f8;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
.ant-modal-title {
|
||||
text-align: left;
|
||||
}
|
||||
.ant-modal-close {
|
||||
top: 0px !important;
|
||||
}
|
||||
.ant-modal-close-x {
|
||||
font-size: 24px;
|
||||
}
|
||||
.ant-modal-body {
|
||||
text-align: center;
|
||||
}
|
||||
.content-title {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 2rem 0 1rem !important;
|
||||
font-size: 16px;
|
||||
color: #333;
|
||||
letter-spacing: 0;
|
||||
line-height: 29px;
|
||||
font-weight: 400;
|
||||
}
|
||||
.red-circle {
|
||||
align-self: flex-start;
|
||||
color: #ca0002;
|
||||
font-size: 1.5rem !important;
|
||||
}
|
||||
.content-descibe {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
line-height: 33px;
|
||||
font-weight: 400;
|
||||
}
|
||||
.ant-modal-footer {
|
||||
padding: 2rem 0;
|
||||
text-align: center;
|
||||
border: 0;
|
||||
.ant-btn {
|
||||
width: 6rem;
|
||||
}
|
||||
}
|
||||
.foot-submit {
|
||||
margin-left: 3rem;
|
||||
color: #df0002;
|
||||
&:hover {
|
||||
border-color: #df0002;
|
||||
}
|
||||
}
|
||||
.ant-btn-default:hover,
|
||||
.ant-btn-default:active,
|
||||
.ant-btn-default:focus {
|
||||
background: #f3f4f6;
|
||||
color: #333;
|
||||
border-color: #d0d0d0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
import React from 'react';
|
||||
import { Modal , Button } from 'antd';
|
||||
import './index.scss';
|
||||
|
||||
function Modals({visible,title,content,onOk,onCancel}){
|
||||
return(
|
||||
<Modal
|
||||
className="modalsStyle"
|
||||
visible={visible}
|
||||
title={title}
|
||||
onCancel={onCancel}
|
||||
closable={true}
|
||||
footer={
|
||||
<div>
|
||||
<Button onClick={onCancel}>取消</Button>
|
||||
<Button type={"primary"} style={{marginLeft:"20px"}} onClick={onOk}>确定</Button>
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<div>{content}</div>
|
||||
</Modal>
|
||||
)
|
||||
}
|
||||
export default Modals;
|
|
@ -0,0 +1,27 @@
|
|||
import React, { Fragment } from 'react';
|
||||
import { Table, Pagination } from 'antd';
|
||||
import './index.scss';
|
||||
|
||||
export default (props) => {
|
||||
const {handleRow, total, setCurPage, current, onShowSizeChange, showSizeChanger, pagination} = props;
|
||||
|
||||
return (
|
||||
<div className='pagination-table'>
|
||||
<Table
|
||||
{...props}
|
||||
pagination={false}
|
||||
onRow={handleRow}
|
||||
/>
|
||||
{total > 10 && (!pagination) &&
|
||||
<Pagination
|
||||
showQuickJumper
|
||||
onShowSizeChange={onShowSizeChange}
|
||||
onChange={setCurPage}
|
||||
current={current}
|
||||
total={total}
|
||||
showSizeChanger={showSizeChanger}
|
||||
/>}
|
||||
</div>
|
||||
|
||||
)
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
.pagination-table {
|
||||
margin-top: 1rem;
|
||||
padding: 1.5rem;
|
||||
background-color: #ffffff;
|
||||
box-shadow:0px 0px 10px rgba(88, 116, 255, 0.18);
|
||||
.ant-table {
|
||||
border-radius: 0 0 4px 4px;
|
||||
tr > td{
|
||||
border-bottom: none;
|
||||
border-top: 1px solid #e2e6f5;
|
||||
}
|
||||
tr:first-child > td{border-top: none;}
|
||||
tr:last-child > td{border-bottom: 1px solid #e2e6f5;}
|
||||
.ant-table-expanded-row td{border-top: none;}
|
||||
}
|
||||
.ant-table-thead tr th div {
|
||||
color: #181818;
|
||||
font-weight: 500;
|
||||
}
|
||||
.ant-table-wrapper {
|
||||
::-webkit-scrollbar {
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
}
|
||||
.ant-table-hide-scrollbar {
|
||||
margin-bottom: -5px;
|
||||
overflow-y: hidden !important;
|
||||
::-webkit-scrollbar {
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.ant-pagination {
|
||||
margin: 2rem 1.5rem;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
|
@ -1,12 +1,12 @@
|
|||
import React, { useEffect, useRef, useMemo } from 'react'
|
||||
import 'katex/dist/katex.min.css'
|
||||
import marked, { getTocContent, cleanToc, getMathExpressions, resetMathExpressions } from '../common/marked';
|
||||
import 'code-prettify'
|
||||
import 'code-prettify';
|
||||
import dompurify from 'dompurify';
|
||||
|
||||
import { renderToString } from 'katex'
|
||||
|
||||
const preRegex = /<pre[^>]*>/g
|
||||
const preRegex = /<pre[^>]*>/g;
|
||||
function _unescape(str) {
|
||||
let div = document.createElement('div')
|
||||
div.innerHTML = str
|
||||
|
@ -30,7 +30,7 @@ export default ({
|
|||
cleanToc()
|
||||
}
|
||||
rs = rs.replace(/(__special_katext_id_\d+__)/g, (_match, capture) => {
|
||||
const { type, expression } = math_expressions[capture]
|
||||
const { type, expression } = math_expressions[capture];
|
||||
return renderToString(_unescape(expression) || '', { displayMode: type === 'block', throwOnError: false, output: 'html' })
|
||||
})
|
||||
rs = rs.replace(/▁/g, "▁▁▁")
|
||||
|
@ -46,7 +46,7 @@ export default ({
|
|||
let id = decodeURIComponent(u.split("#")[1]);
|
||||
let ele = document.getElementById(id);
|
||||
if(ele){
|
||||
window.scrollTo(0, ele.offsetTop + 120);
|
||||
window.scrollTo(0, ele.offsetTop);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
import React, { forwardRef, useState } from 'react';
|
||||
import { Upload , Icon , message } from "antd";
|
||||
import { getUploadActionUrl } from 'educoder';
|
||||
let chromeSettingArray = JSON.parse(localStorage.getItem('chromesetting'));
|
||||
|
||||
function UploadImage({ getImageId , imageId }){
|
||||
// 上传前
|
||||
function beforeUpload(file){
|
||||
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
|
||||
if (!isJpgOrPng) {
|
||||
message.error('上传的图片只能是JPG或者PNG格式!');
|
||||
}
|
||||
const isLt2M = file.size / 1024 / 1024 < 2;
|
||||
if (!isLt2M) {
|
||||
message.error('上传的图片不能超过2MB!');
|
||||
}
|
||||
return isJpgOrPng && isLt2M;
|
||||
}
|
||||
// 上传完成后
|
||||
function handleChange(info){
|
||||
if(info && info.file && info.file.status === "done"){
|
||||
getImageId(info.file.response.id);
|
||||
}
|
||||
}
|
||||
|
||||
return(
|
||||
<Upload
|
||||
listType="picture-card"
|
||||
className="avatar-uploader"
|
||||
showUploadList={false}
|
||||
action={getUploadActionUrl()}
|
||||
accept=".png,.jpg,.jpeg"
|
||||
beforeUpload={beforeUpload}
|
||||
onChange={handleChange}
|
||||
>
|
||||
{
|
||||
imageId ? <img src={`${chromeSettingArray.current_main_site_url}/api/attachments/${imageId}`} alt="avatar" style={{ width: '100%' }} /> :
|
||||
<div>
|
||||
<Icon type={'plus'} />
|
||||
<div className="ant-upload-text">点击上传</div>
|
||||
</div>
|
||||
}
|
||||
</Upload>
|
||||
)
|
||||
}
|
||||
export default forwardRef(UploadImage);
|
|
@ -0,0 +1,280 @@
|
|||
import React , { useEffect , useState } from 'react';
|
||||
import { TPMIndexHOC} from '../../modules/tpm/TPMIndexHOC';
|
||||
import { Timeline, Carousel } from 'antd';
|
||||
import { getImageUrl } from 'educoder';
|
||||
import CountUp from 'react-countup';
|
||||
import axios from 'axios';
|
||||
import './AboutUs.scss';
|
||||
import subititle from './image/subtitle.png';
|
||||
import achievements from './image/achievements.png';
|
||||
import earth from './image/earth.png';
|
||||
import computer from './image/computer.png';
|
||||
import position from './image/position.png';
|
||||
import quan1 from './image/quan1.png';
|
||||
import quan2 from './image/quan2.png';
|
||||
import fun1 from './image/fun1.png';
|
||||
import fun2 from './image/fun2.png';
|
||||
import fun3 from './image/fun3.png';
|
||||
import fun4 from './image/fun4.png';
|
||||
import fun5 from './image/fun5.png';
|
||||
|
||||
function AboutUs(){
|
||||
const countUpProps = {
|
||||
redraw: true,
|
||||
start: 0,
|
||||
duration: 2,
|
||||
suffix: "+"
|
||||
};
|
||||
const [selectTitle, setSelectTitle] = useState(1);
|
||||
//用于刷新组件
|
||||
const [flush, setFlush] = useState(false);
|
||||
//合作单位
|
||||
const [units, setUnits] = useState([]);
|
||||
|
||||
useEffect(()=>{
|
||||
//添加浏览器滚动监听事件
|
||||
window.addEventListener('scroll', scrollListener);
|
||||
//请求topics.json接口获取合作单位信息
|
||||
axios.get(`/topics.json`, { params: { topic_type: "cooperator", limit: 20, group_size: 5}}).then(response=>{
|
||||
response && setUnits(response.data.topics);
|
||||
});
|
||||
return ()=>window.removeEventListener('scroll', scrollListener);
|
||||
},[])
|
||||
|
||||
function scrollListener(e){
|
||||
const top = e.srcElement.scrollingElement.scrollTop;
|
||||
//回到顶部时导航栏选中【关于我们】
|
||||
top < 555 && setSelectTitle(1);
|
||||
if (top > 2800 && top< 4000){
|
||||
setFlush(true);
|
||||
}else{
|
||||
setFlush(false);
|
||||
}
|
||||
}
|
||||
|
||||
return(
|
||||
<div className="aboutUs_body">
|
||||
<div className="aboutUs_head df">
|
||||
<p className="head_title">GitLink 确实开源</p>
|
||||
<p className="head_cont font-20 mt36">新一代开源创新服务平台,让您的创意在这里释放</p>
|
||||
</div>
|
||||
<div className="aboutUs_title df">
|
||||
<a className={selectTitle === 1 ? "active" : ""} href="#value1" onClick={() => setSelectTitle(1)}>关于我们</a>
|
||||
<a className={selectTitle === 2 ? "active" : ""} href="#value2" onClick={() => setSelectTitle(2)}>平台统计</a>
|
||||
<a className={selectTitle === 3 ? "active" : ""} href="#value3" onClick={() => setSelectTitle(3)}>加入我们</a>
|
||||
<a className={selectTitle === 4 ? "active" : ""} href="#value4" onClick={() => setSelectTitle(4)}>合作单位</a>
|
||||
</div>
|
||||
<div className="aboutUs">
|
||||
<a id="value1" className="mao"></a>
|
||||
{/* 关于我们 */}
|
||||
<div className="about_us">
|
||||
<div className="au_bg">
|
||||
<div className="au_title">关于我们</div>
|
||||
{/* 简介 */}
|
||||
<div className="au_cont subt df">
|
||||
<div className="cont1_introduction">
|
||||
<p className="subtitle">简介</p>
|
||||
<div className="font-16">GitLink(确实开源)是CCF官方指定的开源创新服务平台,旨在以“为开源创新服务”为使命,以“成为开源创新的汇聚地”为愿景,秉承“创新、开放、协作、共享”的价值观,致力于为大规模开源开放协同创新助力赋能,打造创新成果孵化和新工科人才培养的开源创新生态!</div>
|
||||
</div>
|
||||
<img src={subititle} className="subtitleImg"></img>
|
||||
</div>
|
||||
</div>
|
||||
{/* 确实开源 一脉传承 */}
|
||||
<div className="au_cont inherit pl30">
|
||||
<p className="subtitle">确实开源 一脉传承</p>
|
||||
<div>本世纪以来,随着软件创新需求和应用规模的飞速增长,软件开发队伍、开发资源、可信评估呈现出规模化、开放化、持续化的新特点,软件开发活动面临协同难、复用难、评估难的制约,经典的工程化软件开发方法面临严峻挑战,严重影响了软件开发效率和质量的提升。在此背景下,国防科技大学联合国内多所知名高校、科研机构和软件企业,围绕开源创新开展了持续性探索,构建形成了以Trustie(确实)为代表的一系列开源创新服务基础设施。自2006年以来,Trustie经过三个阶段的演化发展,于2021年迎来全面升级:在中国计算机学会(CCF)的带领指导下,共同推进产学研用深度融合,共筑新一代开源创新服务平台GitLink!</div>
|
||||
<div className="inherit_items">
|
||||
<img src={quan1} className="quan1Img"/>
|
||||
<img src={quan2} className="quan2Img"/>
|
||||
<Timeline>
|
||||
<Timeline.Item dot={<i className="iconfont icon-a-yuanquan2x font-20"></i>}>
|
||||
<div className="timeline_cont">
|
||||
<p>Trustie 1.0阶段(2006年-2014年)</p>
|
||||
<div>国防科技大学、北京大学、北京航空航天大学、中国科学院软件研究所等单位合作开展了基于网络的软件开发群体化方法与技术研究,揭示了以大众化协同开发、开放式资源共享、持续性可信评估为核心的互联网大规模协同机理,与软件开发工程化方法相结合,系统地提出了基于网络的软件开发群体化方法,并于2008年发布了可信的国家软件资源共享与协同生产环境(简称“Trustie v1.0”,中文简称“确实”),重点解决大规模软件协同开发、可信评估、运行监控和持续演化等问题。</div>
|
||||
</div>
|
||||
</Timeline.Item>
|
||||
<Timeline.Item dot={<i className="iconfont icon-a-yuanquan2x"></i>}>
|
||||
<div className="timeline_cont">
|
||||
<p>Trustie 2.0阶段(2014年-2020年)</p>
|
||||
<div>在科技部项目的持续资助下,国防科技大学联合国内多所知名高校、科研机构和软件企业,致力于系统研究新型软件开发方法,为开源生态建设提供方法指导和实践指南,支撑科教领域原始创新成果的开源孵化和开源人才培养,并于2014年发布了面向软件创新和教育的开源社区Trustie v2.0,重点探索协作开发社区、知识分享社区、应用服务社区等“大外围”软件涉众的联接,以及基于开源大数据的智能化开发等技术。</div>
|
||||
</div>
|
||||
</Timeline.Item>
|
||||
<Timeline.Item dot={<i className="iconfont icon-a-yuanquan2x"></i>}>
|
||||
<div className="timeline_cont">
|
||||
<p>Trustie 3.0阶段 (2020年至今)</p>
|
||||
<div>Trustie在已有的技术积累基础上,进一步联合国内高等院校、科研机构、产业企业和开源组织等,在中国计算机学会(CCF)的带领指导下,共同推进产学研用深度融合,致力于联接互联网海量群智资源,探索开源创新成果开放与共享、开源生态协作与共建的新模式和新方法,升级形成了新一代开源创新服务平台GitLink,力图破解软件开发群智范式背后的本质机理,建立面向“大外围”开放创新的群智激发与汇聚关键机制,实现面向大规模软件涉众的稳态群智激发与汇聚。</div>
|
||||
</div>
|
||||
</Timeline.Item>
|
||||
</Timeline>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 特色功能 确实给力 */}
|
||||
<div className="feature_function_bg">
|
||||
<div className="au_cont">
|
||||
<p className="au_title">特色功能 确实给力</p>
|
||||
<table><tr>
|
||||
<td>
|
||||
<div className="feat_func_cont">
|
||||
<div className="feat_fun_img"><img src={fun1} /></div>
|
||||
<div>
|
||||
<p>分布式协作开发</p>
|
||||
<div>支持在线文件编辑、 <br />分支管理、贡献统计、<br />仓库复刻、合并请求 </div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div className="feat_func_cont">
|
||||
<div className="feat_fun_img"><img src={fun2} /></div>
|
||||
<div>
|
||||
<p>一站式过程管理</p>
|
||||
<div>支持疑修、里程碑、 <br />通知提醒、标签归档、Wiki文档、组织管理 </div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div className="feat_func_cont">
|
||||
<div className="feat_fun_img"><img src={fun3} /></div>
|
||||
<div>
|
||||
<p>高效流水线运维</p>
|
||||
<div>提供轻量级工作流引擎<br />并支持自定义配置、 <br/>静态扫描、制品构建 </div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div className="feat_func_cont">
|
||||
<div className="feat_fun_img"><img src={fun4} /></div>
|
||||
<div>
|
||||
<p>多层次代码分析</p>
|
||||
<div>支持代码溯源分析、 <br />许可证风险分析、开源漏洞检测和加固建议 </div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div className="feat_func_cont">
|
||||
<div className="feat_fun_img"><img src={fun5} /></div>
|
||||
<div>
|
||||
<p>多维度用户画像</p>
|
||||
<div>支持开发活动统计、 <br />贡献日历、能力建模、<br />角色与专业定位分析 </div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 成果作用,确实有效 */}
|
||||
<div className="au_cont df pl30">
|
||||
<img src={achievements} className="achievementsImg"></img>
|
||||
<div className="cont1_achievements">
|
||||
<p className="subtitle ml0">成果作用 确实有效</p>
|
||||
<div>GitLink(确实开源)为我国创新型软件产业发展提供了关键技术支撑和实践指南,为各类开源创新活动以及我国军地开源社区建设提供了有效支撑,为推动开源创新发展和创新人才培养发挥了重要作用。<br/>通过10多年的发展,GitLink平台显著提升了大型软件企业软件生产能力,支持了我国航空、航天、国防等多个关键领域的可信软件生产,为包括新一代人工智能启智社区、ARM绿色计算社区、科技部云计算与大数据木兰社区、科技委可控开源创造行动红山社区等的建设提供关键技术支撑,为我国关键领域开源社区生态建设发挥了重要作用!</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 平台统计 */}
|
||||
<div className="about_us statistics">
|
||||
<a id="value2" className="mao"></a>
|
||||
<div className="au_title">平台统计</div>
|
||||
<p>联接海量群智资源,汇聚优秀开源组织,孵化优质创新成果</p>
|
||||
<img src={earth} className="earthImg"/>
|
||||
<div className="statistics_cont df">
|
||||
<div>
|
||||
<CountUp {...countUpProps} start={0} end={50000} />
|
||||
<p>开发者</p>
|
||||
</div>
|
||||
<div>
|
||||
<CountUp {...countUpProps} end={1000} />
|
||||
<p>组织</p>
|
||||
</div>
|
||||
<div>
|
||||
<CountUp {...countUpProps} end={1400000} />
|
||||
<p>仓库</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 加入我们 */}
|
||||
<div className="join_us_bg">
|
||||
<a id="value3" className="mao"></a>
|
||||
<div className="au_cont">
|
||||
<div className="au_title">加入我们</div>
|
||||
<p className="subtitle">探索你的未来</p>
|
||||
<p>GitLink团队在寻找新的小伙伴,期待着您的加入,让我们一起为开源创新贡献力量!</p>
|
||||
<img src={computer} className="joinUsImg"/>
|
||||
{/* 轮播图 */}
|
||||
<Carousel autoplay easing="none">
|
||||
<div className="df">
|
||||
<div className="position">
|
||||
<p className="df"><img src={position} /><span className="ml10">前端开发工程师</span></p>
|
||||
<div>
|
||||
1、全日制本科及以上学历,5年以上Web前端开发经验,熟练使用Gulp、Webpack等构建工具;<br />
|
||||
2、熟练掌握VUE或React编程;有前端模块化、组件化、自动化开发经验者优先;<br />
|
||||
3、精通jQuery、Ajax、Json等技术,对VUE,NodeJs等技术有所涉及;<br />
|
||||
4、熟悉前端开发技术(HTML5、JS、JSON、XHTML、CSS3、ES6),了解各项技术的相关标准,并严格按照标准进行开发。<br />
|
||||
</div>
|
||||
</div>
|
||||
<div className="position right">
|
||||
<p className="df"><img src={position} /><span className="ml10">后端开发工程师</span></p>
|
||||
<div>
|
||||
1、全日制本科及以上学历,计算机、软件工程相关专业者优先;<br />
|
||||
2、3年以上Java开发相关经验,扎实的Java编程基础,参与过1个以上大/中型高并发、高性能系统架构设计、开发和调优;<br />
|
||||
3、熟练掌握Spring、SpringBoot、Spring MVC、MyBatis等开源框架,掌握MVC框架模式及BS架构;<br />
|
||||
4、精通SQL,熟练使用MySQL、Oracle等数据库,并具有一定的SQL优化能力;熟悉Redis、MongoDB等常用NoSQL解决方案,了解各自的优缺点以及使用场景者优先。<br />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="df">
|
||||
<div className="position">
|
||||
<p className="df"><img src={position} /><span className="ml10">软件测试工程师</span></p>
|
||||
<div>
|
||||
1、熟悉主流开发技术框架,具备软件工程的基本知识;<br />
|
||||
2、熟练掌握各种测试理论和测试技术,精通测试过程设计和用例设计方法;<br />
|
||||
3、熟悉性能测试、自动化测试、安全测试其中一种或多种测试工具;(LoadRunner、Jmeter、Selenium、QTP、Robot、Firebug、AppScan,PyCharm等),熟练运用工具从事过相关测试工作;<br />
|
||||
4、熟悉掌握一种编程语言(Java/Python/C++等);<br />
|
||||
5、熟悉Oracle/MySQL数据库,并能熟练编写SQL语句,熟练常用Linux命令;<br />
|
||||
6、有整体质量意识,测试管理经验。<br />
|
||||
</div>
|
||||
</div>
|
||||
<div className="position right">
|
||||
<p className="df"><img src={position} /><span className="ml10">产品经理</span></p>
|
||||
<div>
|
||||
1、计算机或相关专业本科以上学历;3年以上工作经验;<br />
|
||||
2、熟悉开源软件项目的管理流程,了解软件需求的调研方法,具备需求分析能力;<br />
|
||||
3、能以专业的方式向客户提供技术咨询,良好的方案设计能力和文字功底;<br />
|
||||
4、具备良好的交流、沟通和表达能力,良好的方案演示和介绍技巧;<br />
|
||||
5、了解互联网产品的基本思路及基础方法论,能够基于数据提出产品优化策略;<br />
|
||||
6、承受较强的工作压力,强烈的团队合作意识与工作责任心;<br />
|
||||
7、有良好人际交往能力,工作积极主动,自信心强,有较强的学习能力。<br />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Carousel>
|
||||
<p className="delivery">简历投递邮箱:zengyt#csxjy.com.cn 曾先生 (用@符号替换#)</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 合作单位 */}
|
||||
<div className="unit">
|
||||
<a id="value4" className="mao"></a>
|
||||
<div className="au_title">合作单位</div>
|
||||
<table>
|
||||
{units && units.map(group =>{
|
||||
return (
|
||||
<tr>
|
||||
{group.map(item =>{
|
||||
return(
|
||||
<td><a href={item.url} target="_blank"><img src={getImageUrl(item.image)}></img></a></td>
|
||||
)
|
||||
})}
|
||||
</tr>
|
||||
)
|
||||
})}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
export default TPMIndexHOC(AboutUs);
|
|
@ -0,0 +1,338 @@
|
|||
.aboutUs_body{
|
||||
font-size: 16px;
|
||||
color: #182332;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
& table{
|
||||
text-align: center;
|
||||
margin: 0 auto;
|
||||
}
|
||||
& .df{
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
}
|
||||
& .join_us_bg, .feature_function_bg, .feat_fun_img, .aboutUs_head{
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
& .mao{
|
||||
position: relative;
|
||||
top: -70px;
|
||||
}
|
||||
}
|
||||
.aboutUs_head.df{
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
height: 500px;
|
||||
line-height: 500px;
|
||||
background-image: url('./image/banner.png');
|
||||
& p{
|
||||
text-align: center;
|
||||
}
|
||||
& .head_title{
|
||||
line-height: 50px;
|
||||
font-size: 48px;
|
||||
font-weight: 600;
|
||||
background-image: -webkit-linear-gradient(bottom,#4CDBF5,#5AACFF);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
& .head_cont{
|
||||
line-height: 39px;
|
||||
color: #FFFFFF;
|
||||
opacity: 0.9;
|
||||
}
|
||||
}
|
||||
.aboutUs_title{
|
||||
width: 800px;
|
||||
height: 62px;
|
||||
margin: 0 auto;
|
||||
&>table{
|
||||
width: 800px;
|
||||
font-weight: 400;
|
||||
}
|
||||
& a.active{
|
||||
color: #466AFF;
|
||||
height: 62px;
|
||||
line-height: 62px;
|
||||
border-bottom: 2px solid;
|
||||
}
|
||||
}
|
||||
.aboutUs{
|
||||
& .au_title{
|
||||
font-size: 38px;
|
||||
font-weight: 500;
|
||||
color: #1E1E1E;
|
||||
text-align: center;
|
||||
padding-top: 50px;
|
||||
// line-height: 53px;
|
||||
}
|
||||
& .subtitle{
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: #000000;
|
||||
margin-bottom: 23px !important;
|
||||
}
|
||||
}
|
||||
.about_us{
|
||||
// 关于我们
|
||||
& .au_cont.df{
|
||||
justify-content: space-between;
|
||||
}
|
||||
& .au_bg{ background: linear-gradient(180deg, #F3F9FF 0%, rgba(255, 255, 255, 0) 100%);}
|
||||
& .cont1_introduction{
|
||||
width: 472px;
|
||||
&>div{
|
||||
line-height: 34px;
|
||||
}
|
||||
}
|
||||
& .cont1_achievements{
|
||||
width: 581px;
|
||||
& .subtitle.ml0{margin-left: 0;}
|
||||
&>div{
|
||||
font-size: 15px;
|
||||
line-height: 36px;
|
||||
}
|
||||
}
|
||||
& .subtitleImg{
|
||||
width: 650px;
|
||||
height: 330px;
|
||||
}
|
||||
& .achievementsImg{
|
||||
width: 507px;
|
||||
height: 384px;
|
||||
}
|
||||
//时间轴
|
||||
& .inherit_items{
|
||||
position: relative;
|
||||
& .quan1Img{
|
||||
width: 140px;
|
||||
height: 167px;
|
||||
position: absolute;
|
||||
left: -290px;
|
||||
top: 90px;
|
||||
}
|
||||
& .quan2Img{
|
||||
width: 100px;
|
||||
height: 120px;
|
||||
position: absolute;
|
||||
right: -170px;
|
||||
bottom: 80px;
|
||||
}
|
||||
}
|
||||
.inherit{
|
||||
& .icon-a-yuanquan2x{
|
||||
color: #466aff;
|
||||
}
|
||||
& .ant-timeline-item-tail{
|
||||
border-left: 2px solid rgba(108, 134, 172, 0.42);
|
||||
height: calc(100% - -30px);
|
||||
}
|
||||
& .ant-timeline-item:last-child .ant-timeline-item-tail{
|
||||
display: block;
|
||||
height: calc(100% - 18px);
|
||||
}
|
||||
& .ant-timeline-item-content{
|
||||
margin: 0 0 -15px 18px;
|
||||
}
|
||||
}
|
||||
.timeline_cont{
|
||||
margin-left: 35px;
|
||||
&>p{
|
||||
font-size: 20px;
|
||||
font-weight: 500;
|
||||
color: #466AFF;
|
||||
margin: 45px 0 30px !important;
|
||||
}
|
||||
&>div{
|
||||
width: 980px;
|
||||
padding: 20px 35px;
|
||||
background: #F5F7FA;
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
color: #182332;
|
||||
line-height: 33px;
|
||||
&:after,&:before{
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 21px;
|
||||
top: 100px;
|
||||
border-top: 10px solid transparent;
|
||||
border-bottom: 10px solid transparent;
|
||||
border-right: 14px solid #F5F7FA;
|
||||
}
|
||||
}
|
||||
}
|
||||
//特色功能 确实给力
|
||||
& .feature_function_bg{
|
||||
position: relative;
|
||||
height: 630px;
|
||||
background-image: url(./image/funBg.png);
|
||||
& .au_cont p.au_title{
|
||||
font-size: 30px;
|
||||
padding: 50px 0 70px;
|
||||
color: #FFFFFF;
|
||||
opacity: 0.9;
|
||||
}
|
||||
& table{
|
||||
position: relative;
|
||||
background: none;
|
||||
width: 1200px;}
|
||||
& .funBg2 {
|
||||
width: 1600px;
|
||||
left: 50%;
|
||||
margin-left: -800px;
|
||||
position: absolute;
|
||||
bottom: -15px;
|
||||
}
|
||||
}
|
||||
|
||||
& .feat_func_cont{
|
||||
width: 200px;
|
||||
& .feat_fun_img{
|
||||
height: 205px;
|
||||
line-height: 205px;
|
||||
background-image: url('./image/funBg3.png');
|
||||
&:hover{background-image: url('./image/funBg4.png');}
|
||||
}
|
||||
& img{ width: 175px;}
|
||||
& p{
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
color: #FFFFFF;
|
||||
line-height: 28px;
|
||||
background-image: -webkit-linear-gradient(bottom,#4FFDFF,#0183FF);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
& div>div{
|
||||
margin: 10px auto;
|
||||
width: 142px;
|
||||
font-size: 14px;
|
||||
line-height: 28px;
|
||||
color: #FFFFFF;
|
||||
opacity: 0.76;
|
||||
}
|
||||
}
|
||||
|
||||
// 平台统计
|
||||
&.statistics{
|
||||
text-align: center;
|
||||
background: linear-gradient(180deg, #ECF3FF 0%, #FFFFFF 100%);
|
||||
height: 640px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
& .statistics_cont{
|
||||
width: 1014px;
|
||||
height: 203px;
|
||||
background: #FFFFFF;
|
||||
opacity: 0.83;
|
||||
position: absolute;
|
||||
top: 230px;
|
||||
left: 50%;
|
||||
margin-left: -500px;
|
||||
& span{
|
||||
font-size: 48px;
|
||||
font-weight: bold;
|
||||
color: #1338D1;
|
||||
}
|
||||
& p{
|
||||
width: 111px;
|
||||
height: 38px;
|
||||
line-height: 38px;
|
||||
border: 1px solid #182332;
|
||||
margin: 0 auto;
|
||||
font-size: 22px;
|
||||
color: #1E1E1E;
|
||||
}
|
||||
}
|
||||
& .earthImg{
|
||||
width: 1500px;
|
||||
margin-top: -120px;
|
||||
animation: moving 60s linear infinite;
|
||||
}
|
||||
@keyframes moving {
|
||||
0% { transform: rotate(0deg);}
|
||||
50% { transform: rotate(180deg);}
|
||||
100% { transform: rotate(360deg);}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 加入我们
|
||||
.join_us_bg{
|
||||
height: 710px;
|
||||
margin-top: 40px;
|
||||
background-image: url(./image/joinUs.png);
|
||||
& .au_cont{position: relative;}
|
||||
& .joinUsImg{
|
||||
width: 260px;
|
||||
height: 265px;
|
||||
position: absolute;
|
||||
top: 27px;
|
||||
right: 10px;
|
||||
}
|
||||
& .df{
|
||||
display: flex !important;
|
||||
margin-top: 30px;
|
||||
}
|
||||
& .position{
|
||||
width: 540px;
|
||||
&.right{ margin-right: -30px;}
|
||||
& p{
|
||||
justify-content: flex-start;
|
||||
height: 60px;
|
||||
background: #253DA0;
|
||||
line-height: 60px;
|
||||
padding-left: 20px;
|
||||
& img{width: 30px;}
|
||||
& span{
|
||||
font-weight: 500;
|
||||
color: #FFFFFF;
|
||||
line-height: 22px;
|
||||
}
|
||||
}
|
||||
& div{
|
||||
height: 306px;
|
||||
font-size: 14px;
|
||||
line-height: 34px;
|
||||
padding: 20px;
|
||||
background: #FFFFFF;}
|
||||
}
|
||||
& .ant-carousel .slick-dots-bottom{bottom: -30px;}
|
||||
& .ant-carousel .slick-dots li button{
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 10px;
|
||||
background: #466AFF;
|
||||
}
|
||||
& .delivery{
|
||||
height: 60px;
|
||||
line-height: 60px;
|
||||
margin-left: 35px;
|
||||
}
|
||||
}
|
||||
//合作单位
|
||||
.unit{
|
||||
margin-bottom: 60px;
|
||||
& table{
|
||||
width: 1200px;
|
||||
height: 550px;
|
||||
margin-top: 15px;
|
||||
border-collapse: separate;
|
||||
border-spacing: 10px 10px;
|
||||
& td{
|
||||
width: 224px;
|
||||
height: 122px;
|
||||
box-shadow: 0px 1px 8px 1px rgba(0, 0, 0, 0.06);
|
||||
border-radius: 6px;
|
||||
border: 2px solid #FFFFFF;
|
||||
&:hover{ border: 1px solid #466AFF;}
|
||||
}
|
||||
}
|
||||
}
|
||||
.au_cont{
|
||||
width: 1200px;
|
||||
margin: 50px auto;
|
||||
&.pl30 .subtitle{ margin-left: -30px;}
|
||||
}
|
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 1.7 MiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 130 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 454 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 859 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 172 KiB |
|
@ -124,7 +124,9 @@ class Activity extends Component{
|
|||
</Menu>
|
||||
)
|
||||
render(){
|
||||
const { time , data , page , project_trends , isSpin , pr_count , new_pr_count , close_issues_count , open_issues_count , pr_all_count ,issues_count } = this.state;
|
||||
const { time , data , page , project_trends , isSpin ,
|
||||
pr_count , new_pr_count , close_issues_count , open_issues_count , pr_all_count ,issues_count,
|
||||
type,status } = this.state;
|
||||
let name = time ? ARRAY.filter(item=>item.id === parseInt(time)) :[{name:"全部"}];
|
||||
|
||||
const first_per = pr_all_count > 0 ? `${parseFloat(pr_count/pr_all_count).toFixed(2)*100}%` :"50%";
|
||||
|
@ -150,25 +152,25 @@ class Activity extends Component{
|
|||
<p className="percent_red" style={{width:`${third_per}`}}></p>
|
||||
<p className="percent_green" style={{width:`${fourth_per}`}}></p>
|
||||
</div>
|
||||
<span>{data && data.issues_count}易修</span>
|
||||
<span>{data && data.issues_count}疑修</span>
|
||||
</div>
|
||||
</div>
|
||||
<ul className="percentBox">
|
||||
<li>
|
||||
<span className="purple">{data && data.pr_count}</span>
|
||||
<span className="change" onClick={()=>this.changeTrends("PullRequest","delay")}>已处理的合并请求</span>
|
||||
<span className={type==="PullRequest" && status==="delay" ?`change active`:"change"} onClick={()=>this.changeTrends("PullRequest","delay")}>已处理的合并请求</span>
|
||||
</li>
|
||||
<li>
|
||||
<span className="green">{data && data.new_pr_count}</span>
|
||||
<span className="change" onClick={()=>this.changeTrends("PullRequest","not_delay")}>未处理的合并请求</span>
|
||||
<span className={type==="PullRequest"&& status==="not_delay" ?`change active`:"change"} onClick={()=>this.changeTrends("PullRequest","not_delay")}>未处理的合并请求</span>
|
||||
</li>
|
||||
<li>
|
||||
<span className="red">{data && data.close_issues_count}</span>
|
||||
<span className="change" onClick={()=>this.changeTrends("Issue","delay")}>已关闭的易修</span>
|
||||
<span className={type==="Issue"&& status==="delay" ?`change active`:"change"} onClick={()=>this.changeTrends("Issue","delay")}>已关闭的疑修</span>
|
||||
</li>
|
||||
<li>
|
||||
<span className="green">{data && data.open_issues_count}</span>
|
||||
<span className="change" onClick={()=>this.changeTrends("Issue","not_delay")}>未处理的易修</span>
|
||||
<span className={type==="Issue"&& status==="not_delay" ?`change active`:"change"} onClick={()=>this.changeTrends("Issue","not_delay")}>未处理的疑修</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -14,20 +14,20 @@ class ActivityItem extends Component {
|
|||
{/* 如果是版本发布 */}
|
||||
{item.trend_type === "VersionRelease" ?
|
||||
<p className="itemLine">
|
||||
<Link to={`/${owner}/${projectsId}/releases`} className="color-blue font-16">{item.name}</Link>
|
||||
<Link to={`/${owner}/${projectsId}/releases`} className="font-16">{item.name}</Link>
|
||||
<span className="activity_type">{item.trend_type}</span>
|
||||
</p >
|
||||
:
|
||||
// 如果是任务
|
||||
item.trend_type === "Issue" ?
|
||||
<p className="itemLine">
|
||||
<Link to={`/${owner}/${projectsId}/issues/${item.trend_id}`} className="color-blue font-16">{item.name}</Link>
|
||||
<Link to={`/${owner}/${projectsId}/issues/${item.trend_id}`} className="font-16">{item.name}</Link>
|
||||
<span className="activity_type">{item.trend_type}</span>
|
||||
</p >
|
||||
:
|
||||
// 如果是合并请求
|
||||
<p className="itemLine">
|
||||
<Link to={`/${owner}/${projectsId}/pulls/${item.trend_id}`} className="color-blue font-16">{item.name}</Link>
|
||||
<Link to={`/${owner}/${projectsId}/pulls/${item.trend_id}`} className="font-16">{item.name}</Link>
|
||||
<span className="activity_type">{item.trend_type}</span>
|
||||
</p >
|
||||
}
|
||||
|
|
|
@ -107,6 +107,10 @@
|
|||
color: black;
|
||||
cursor: pointer;
|
||||
}
|
||||
.change.active{
|
||||
color: #466AFF !important;
|
||||
}
|
||||
|
||||
.change:hover{
|
||||
color: #4183c4;
|
||||
color: #466AFF;
|
||||
}
|
|
@ -7,10 +7,10 @@ function CloneAddress({http_url , ssh_url , zip_url , tar_url}) {
|
|||
const [ key , setKey ] = useState("HTTP");
|
||||
return (
|
||||
<div className="downMenu">
|
||||
<div style={{borderBottom:"1px solid #eee"}}>
|
||||
<div>
|
||||
<Menu className="urlMenu" selectedKeys={[key]} mode={"horizontal"}>
|
||||
<Menu.Item key="HTTP" onClick={(e)=>{setKey(e.key)}}>HTTP</Menu.Item>
|
||||
<Menu.Item key="SSH" onClick={(e)=>{setKey(e.key)}}>SSH</Menu.Item>
|
||||
{ssh_url && <Menu.Item key="SSH" onClick={(e)=>{setKey(e.key)}}>SSH</Menu.Item>}
|
||||
</Menu>
|
||||
<div className="gitAddressClone">
|
||||
<input type="text" id="copy_rep_content" value={key==="HTTP" ? http_url:ssh_url} />
|
||||
|
@ -18,8 +18,8 @@ function CloneAddress({http_url , ssh_url , zip_url , tar_url}) {
|
|||
</div>
|
||||
</div>
|
||||
<Menu className="edu-txt-center">
|
||||
<Menu.Item><a href={zip_url}>下载 ZIP</a></Menu.Item>
|
||||
<Menu.Item><a href={tar_url}>下载 TAR.GZ</a></Menu.Item>
|
||||
{zip_url && <Menu.Item style={{borderTop:"1px solid #eee"}}><a href={zip_url}>下载 ZIP</a></Menu.Item>}
|
||||
{tar_url && <Menu.Item><a href={tar_url}>下载 TAR.GZ</a></Menu.Item>}
|
||||
</Menu>
|
||||
</div>
|
||||
)
|
||||
|
|
|
@ -3,6 +3,7 @@ import { Dropdown} from 'antd';
|
|||
import './branch.scss';
|
||||
import SelectOverlay from './SelectOverlay';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import { turnbar } from 'educoder';
|
||||
|
||||
export default (({ projectsId , branch , owner , changeBranch , branchList , tagflag = true })=>{
|
||||
const [ showValue , setShowValue ] = useState(branch);
|
||||
|
@ -35,7 +36,8 @@ export default (({ projectsId , branch , owner , changeBranch , branchList , tag
|
|||
|
||||
function ChangeB(params) {
|
||||
setVisible(false);
|
||||
changeBranch(params);
|
||||
let en = turnbar(params);
|
||||
changeBranch(en);
|
||||
}
|
||||
|
||||
const menu = (
|
||||
|
|
|
@ -66,9 +66,10 @@ function AddMember({getID,login,showNotification}){
|
|||
};
|
||||
|
||||
function addCollaborator(){
|
||||
if(source && source.length>0){
|
||||
if(source && source.length>0&&searchKey){
|
||||
getID && getID(id);
|
||||
setSearchKey(undefined);
|
||||
setID(undefined)
|
||||
}else{
|
||||
showNotification("请选择存在的用户!");
|
||||
}
|
||||
|
|
|
@ -9,10 +9,10 @@ function Cards({img , title, desc , rightBtn , src , bottomInfos}){
|
|||
{img &&<div className="img"><img src={getImageUrl(`/${img}`)} alt=""/></div>}
|
||||
<div className="content">
|
||||
<p className="titles">
|
||||
<Link to={src}>{title}</Link>
|
||||
<a href={src} className='organizationName font-18'>{title}</a>
|
||||
{rightBtn}
|
||||
</p>
|
||||
<div className="desc">
|
||||
<div className="desc font-15 pr10">
|
||||
{desc}
|
||||
</div>
|
||||
{bottomInfos}
|
||||
|
|
|
@ -16,15 +16,13 @@ li.ant-menu-item{
|
|||
.cards{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding:20px 34px;
|
||||
padding:35px 30px;
|
||||
background-color: #fff;
|
||||
margin-bottom:18px;
|
||||
min-height: 130px;
|
||||
border:1px solid #eee;
|
||||
.img{
|
||||
margin-right: 20px;
|
||||
width: 190px;
|
||||
height: 90px;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border:1px solid rgba(238,238,238,1);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
@ -41,13 +39,16 @@ li.ant-menu-item{
|
|||
.titles{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 10px!important;
|
||||
margin-bottom: 15px!important;
|
||||
align-items: center;
|
||||
height: 22px;
|
||||
line-height: 22px;;
|
||||
&>a{
|
||||
font-size:18px ;
|
||||
color: #333;
|
||||
line-height: 22px;
|
||||
.organizationName{
|
||||
color: #1e2941;
|
||||
font-weight: 700;
|
||||
}
|
||||
.settingsLink{
|
||||
color:#104fd9;
|
||||
}
|
||||
}
|
||||
.desc{
|
||||
|
@ -56,7 +57,10 @@ li.ant-menu-item{
|
|||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
line-height: 20px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.bottomInfos{
|
||||
color:#67738e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -313,17 +317,17 @@ li.ant-menu-item{
|
|||
}
|
||||
}
|
||||
.-task-sidebar>div {
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
height: 48px;
|
||||
line-height: 48px;
|
||||
box-sizing: border-box;
|
||||
width: 40px;
|
||||
width: 48px;
|
||||
color: #999;
|
||||
font-size: 20px;
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
border-radius: 50%;
|
||||
background: #FFFFFF;
|
||||
box-shadow: 0px 0px 10px 1px #F1F1F1;
|
||||
box-shadow: 0px 0px 12px 5px rgba(208, 208, 208, 0.2);
|
||||
}
|
||||
|
||||
.-task-sidebar>div i {
|
||||
|
@ -334,36 +338,40 @@ li.ant-menu-item{
|
|||
color: #fff !important;
|
||||
}
|
||||
.-task-sidebar>div:hover{
|
||||
background: #1890FF;
|
||||
background: #466AFF;
|
||||
box-shadow: 0px 0px 10px 2px #B6D0FC;
|
||||
}
|
||||
.helpBox{
|
||||
width: 260px;
|
||||
z-index: 103;
|
||||
&.shareContent{
|
||||
width: 200px;
|
||||
width: 160px;
|
||||
}
|
||||
.ant-popover-title{
|
||||
font-size: 16px;
|
||||
}
|
||||
.ant-popover-inner-content{
|
||||
padding:0px;
|
||||
}
|
||||
p.titlecontent{
|
||||
font-size: 18px;
|
||||
font-size: 16px;
|
||||
color: #333;
|
||||
line-height: 20px;
|
||||
padding:15px 20px;
|
||||
}
|
||||
.faqUl{
|
||||
padding:0px 20px 10px;
|
||||
padding:10px 15px;
|
||||
max-height: 230px;
|
||||
overflow-y: auto;
|
||||
font-size: 13px;
|
||||
li{
|
||||
background: #F5F5F5;
|
||||
border-radius: 20px;
|
||||
padding:0px 20px;
|
||||
padding:0px 15px;
|
||||
color: #333;
|
||||
height: 34px;
|
||||
line-height: 34px;
|
||||
margin-bottom: 10px;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
margin-bottom: 3px !important;
|
||||
a{
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
|
@ -379,19 +387,18 @@ li.ant-menu-item{
|
|||
}
|
||||
}
|
||||
.shareUl{
|
||||
padding:10px 0px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.titlecontent{
|
||||
margin-right: 20px;
|
||||
}
|
||||
li > i{
|
||||
font-size: 32px!important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// tooltip样式
|
||||
.tooltipBox .ant-tooltip-inner{
|
||||
padding: 8px 12px;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.-task-desc {
|
||||
background: #494949;
|
||||
|
@ -439,3 +446,21 @@ li.ant-menu-item{
|
|||
border-left: 5px solid #494949;
|
||||
border-bottom: 6px solid transparent
|
||||
}
|
||||
//头部输入框样式
|
||||
.headSerach{
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border-radius: 4px;
|
||||
padding-left: 20px;
|
||||
//修改antd输入框默认样式
|
||||
.ant-input,.ant-input:focus{
|
||||
border: none !important;
|
||||
background-color: rgba(255, 255, 255, 0) !important;
|
||||
}
|
||||
&:hover{
|
||||
padding: 2px 20px 2px 20px;
|
||||
background: #FFF;
|
||||
& i{
|
||||
color: #333;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import './Component.scss';
|
|||
import { getUser } from '../GetData/getData';
|
||||
import axios from 'axios';
|
||||
|
||||
function Contributors({contributors,owner,projectsId,currentLogin}){
|
||||
function Contributors({owner,projectsId,currentLogin}){
|
||||
const [ menuList ,setMenuList ]= useState([]);
|
||||
const [ list , setList ]= useState(undefined);
|
||||
const [ total , setTotal ]= useState(0);
|
||||
|
@ -16,11 +16,18 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
|
|||
const [ isSpin , setIsSpin ] = useState(false);
|
||||
|
||||
useEffect(()=>{
|
||||
if(contributors && contributors.total_count>0){
|
||||
setTotal(contributors.total_count);
|
||||
setList(contributors.list);
|
||||
}
|
||||
},[contributors])
|
||||
getData();
|
||||
},[])
|
||||
|
||||
function getData(){
|
||||
const url = `/${owner}/${projectsId}/contributors.json`;
|
||||
axios.get(url).then(result=>{
|
||||
if(result){
|
||||
setTotal(result.data.total_count);
|
||||
setList(result.data.list);
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
|
||||
useEffect(()=>{
|
||||
if(login){
|
||||
|
@ -148,15 +155,15 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
|
|||
}
|
||||
|
||||
return(
|
||||
total > 0 ?
|
||||
<div className="halfs">
|
||||
<Link to={`/${owner}/${projectsId}/contribute`} className="font-16 color-ooo hoverA">
|
||||
<span>贡献者</span>
|
||||
{ contributors && contributors.total_count > 0 && <span className="infoCount">{contributors.total_count}</span>}
|
||||
{ total > 0 && <span className="infoCount">{total}</span>}
|
||||
</Link>
|
||||
<div className="attrPerson" onMouseLeave={()=>setVisibleFunc(false)}>
|
||||
{
|
||||
total > 0 ?
|
||||
list.map((item,key)=>{
|
||||
list && list.length>0 && list.map((item,key)=>{
|
||||
return(
|
||||
<Popover content={menu} visible={item.visible} overlayClassName="menuPanels" placement="top">
|
||||
<Link key={key} to={`/${item.login}`}>
|
||||
|
@ -165,10 +172,9 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
|
|||
</Popover>
|
||||
)
|
||||
})
|
||||
:""
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>:""
|
||||
)
|
||||
}
|
||||
export default Contributors;
|
|
@ -25,7 +25,7 @@ function DeleteBox({
|
|||
>
|
||||
<div className="desc">
|
||||
<AlignCenter className="descMain"><i className="iconfont icon-shanchu_tc_icon mr10"></i>{content}</AlignCenter>
|
||||
<p>{subTitle}</p>
|
||||
<p className="task-hide-2" style={{WebkitLineClamp:5}}>删除后未来事件将不会推送至此Webhook地址:<span title={subTitle}>{subTitle}</span></p>
|
||||
</div>
|
||||
</Modals>
|
||||
)
|
||||
|
|
|
@ -1,15 +1,10 @@
|
|||
import React, { useEffect, useState } from 'react';
|
||||
import { Drawer , Tree , Spin } from 'antd';
|
||||
import { turnbar} from 'educoder';
|
||||
import './Component.scss';
|
||||
import axios from 'axios';
|
||||
const { TreeNode , DirectoryTree } = Tree;
|
||||
|
||||
function turnbar(str){
|
||||
if(str && str.length>0 && str.indexOf("/")>-1){
|
||||
return str.replaceAll('/','%2F');
|
||||
}
|
||||
return str;
|
||||
}
|
||||
function DrawerPanel({visible,onClose,branch,owner,projectsId,history, name , list}){
|
||||
const [ treeData , setTreeData ] = useState(undefined);
|
||||
const [ isSpin , setIsSpin ] = useState(true);
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
|
||||
|
||||
import React , { useState , useEffect } from 'react';
|
||||
import { Select } from 'antd';
|
||||
import axios from 'axios';
|
||||
|
@ -57,7 +59,6 @@ const LANGUAGE = [
|
|||
|
||||
export default (({ language , select_language })=>{
|
||||
const [ languages , setLanguage ] = useState(undefined);
|
||||
|
||||
// useEffect(()=>{
|
||||
// const url = '/dev_ops/languages.json';
|
||||
// axios.get(url).then(result=>{
|
||||
|
|
|
@ -5,7 +5,7 @@ import './Component.scss';
|
|||
export default (()=>{
|
||||
return(
|
||||
<div className="handleBox">
|
||||
<a href="https://forum.trustie.net/forums/3075/detail" target="_blank" >
|
||||
<a href="https://help.osredm.com/" target="_blank" >
|
||||
<img src={Handbook} alt=""/>
|
||||
</a>
|
||||
</div>
|
||||
|
|
|
@ -32,7 +32,7 @@ export default ({history}) => {
|
|||
/>
|
||||
</div>
|
||||
:
|
||||
<i className="iconfont icon-sousuo font-18 color-grey-6 ml30" onClick={() => {
|
||||
<i className="iconfont icon-sousuo font-18 ml30" style={{color:"#a5a5a5"}} onClick={() => {
|
||||
setOpenSearch(true)
|
||||
}} />
|
||||
}
|
||||
|
|
|
@ -1,18 +1,41 @@
|
|||
import React, { useEffect, useState } from 'react';
|
||||
import { FlexAJ } from '../Component/layout';
|
||||
import { Divider } from 'antd';
|
||||
import axios from 'axios';
|
||||
|
||||
function LanguagePower({languages}){
|
||||
function LanguagePower({owner,projectsId}){
|
||||
const [ array , setArray ] = useState(undefined);
|
||||
|
||||
|
||||
useEffect(()=>{
|
||||
if(languages){
|
||||
let arr = [];
|
||||
Object.keys(languages).map((item,key)=>{
|
||||
arr.push({name:item,percent:languages[item],color:getColor()});
|
||||
})
|
||||
setArray(arr);
|
||||
}
|
||||
},[languages])
|
||||
getData();
|
||||
},[])
|
||||
|
||||
function getData(){
|
||||
const url = `/${owner}/${projectsId}/languages.json`;
|
||||
axios.get(url).then(result=>{
|
||||
if(result){
|
||||
let languages = result.data;
|
||||
if(languages){
|
||||
let arr = [];
|
||||
Object.keys(languages).map((item,key)=>{
|
||||
arr.push({name:item,percent:languages[item],color:getColor()});
|
||||
})
|
||||
setArray(arr);
|
||||
}
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
|
||||
// useEffect(()=>{
|
||||
// if(languages){
|
||||
// let arr = [];
|
||||
// Object.keys(languages).map((item,key)=>{
|
||||
// arr.push({name:item,percent:languages[item],color:getColor()});
|
||||
// })
|
||||
// setArray(arr);
|
||||
// }
|
||||
// },[languages])
|
||||
|
||||
function getColor(){
|
||||
let str = "#";
|
||||
|
@ -24,7 +47,9 @@ function LanguagePower({languages}){
|
|||
return str;
|
||||
}
|
||||
return(
|
||||
(array && array.length > 0) ?
|
||||
<div>
|
||||
<Divider />
|
||||
<p className="font-16 color-ooo aboutSubTitle">开发语言</p>
|
||||
<div className="progress">
|
||||
{
|
||||
|
@ -47,8 +72,7 @@ function LanguagePower({languages}){
|
|||
}
|
||||
</FlexAJ>
|
||||
}
|
||||
|
||||
</div>
|
||||
</div>:""
|
||||
)
|
||||
}
|
||||
export default LanguagePower;
|
|
@ -29,12 +29,12 @@
|
|||
font-weight: 500;
|
||||
color: #FFFFFF;
|
||||
margin-top: 60px;
|
||||
padding-left: 20px;
|
||||
}
|
||||
.markdown-body{
|
||||
box-shadow: 0px 0px 17px rgba(0,0,0,0.2);
|
||||
border-radius: 4px;
|
||||
margin-top: 17px!important;
|
||||
color: white;
|
||||
}
|
||||
.nContent{
|
||||
padding:20px 34px;
|
||||
|
|
|
@ -4,17 +4,47 @@ import './Index.scss';
|
|||
import '../../css/index.scss';
|
||||
import RenderHtml from '../../../components/render-html';
|
||||
import cookie from 'react-cookies';
|
||||
// import axios from 'axios';
|
||||
|
||||
function SystemNotice({system_notification,history}){
|
||||
function SystemNotice({showNotice,system_notification,history,login,hideSystemNotice,location}){
|
||||
const [ visible , setVisible ] = useState(false);
|
||||
|
||||
useEffect(()=>{
|
||||
if(system_notification && !cookie.load('notice_stage')){
|
||||
setVisible(true);
|
||||
let pathname=history.location.pathname;
|
||||
let isCompetition=pathname.indexOf('/competition/')>-1;
|
||||
let openNotice=true;
|
||||
// 非启智竞赛路由不展示启智通知
|
||||
if(isCompetition&&system_notification.subject.indexOf('启智')&&!(pathname.indexOf('/competition/qz2022')>-1)){
|
||||
openNotice=false;
|
||||
}
|
||||
|
||||
openNotice&&setVisible(true);
|
||||
}
|
||||
|
||||
},[system_notification,history.location])
|
||||
|
||||
// useEffect(()=>{
|
||||
|
||||
// if(system_notification && !system_notification.is_read && showNotice && login){
|
||||
// setVisible(true);
|
||||
// }
|
||||
// },[system_notification,login])
|
||||
|
||||
function sureContinue() {
|
||||
// if(login && ( system_notification && system_notification.id )){
|
||||
// const url = `/users/${login}/system_notification_histories.json`;
|
||||
// axios.post(url,{
|
||||
// system_notification_id:system_notification.id
|
||||
// }).then(result=>{
|
||||
// if(result){
|
||||
// setVisible(false);
|
||||
// hideSystemNotice();
|
||||
// }
|
||||
// }).catch(error=>{})
|
||||
// }else{
|
||||
// setVisible(false);
|
||||
// hideSystemNotice();
|
||||
// }
|
||||
cookie.remove('notice_stage');
|
||||
|
||||
let inFifteenMinutes = new Date(new Date().getTime() + 24 * 3600 * 1000);//一天
|
||||
|
|
|
@ -23,9 +23,13 @@ $(window).scroll(function () {
|
|||
function SiderBar() {
|
||||
const [ data , setData ] = useState([]);
|
||||
const [ visible , setVisible ] = useState(false);
|
||||
const [ login , setLogin ]= useState(false);
|
||||
|
||||
useEffect(()=>{
|
||||
getFAQ();
|
||||
getCurrentUser();
|
||||
//页面加载完成之后隐藏回到顶点
|
||||
$(".-task-sidebar .gotop").hide();
|
||||
},[])
|
||||
|
||||
function getFAQ(){
|
||||
|
@ -36,9 +40,19 @@ function SiderBar() {
|
|||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
|
||||
//获取当前登录账号信息->用于建议反馈
|
||||
function getCurrentUser(){
|
||||
let url = `/users/get_user_info.json`;
|
||||
axios.get(url).then((response) => {
|
||||
if (response && response.data && response.data.login) {
|
||||
setLogin(response.data.login);
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
|
||||
function content(list){
|
||||
return <div>
|
||||
<p className="titlecontent">帮助</p>
|
||||
<ul className="faqUl">
|
||||
{
|
||||
list && list.map((i,k)=>{
|
||||
|
@ -59,31 +73,46 @@ function SiderBar() {
|
|||
</ul>
|
||||
</div>
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={"-task-sidebar"} >
|
||||
<ShareModal visible={visible} urlValue={window.location.href} onCancel={()=>setVisible(false)}/>
|
||||
{/* 平台反馈 */}
|
||||
<Tooltip title="意见反馈" placement={"left"} overlayClassName="tooltipBox">
|
||||
<div className="consult">
|
||||
<a href={login ? `/Gitlink/forgeplus/issues/new?type=feedback`:`/login?go_page=/Gitlink/forgeplus/issues/new?type=feedback`}>
|
||||
<i className="iconfont icon-yijianfankui2"></i>
|
||||
</a>
|
||||
</div>
|
||||
</Tooltip>
|
||||
|
||||
{/* 帮助 */}
|
||||
{
|
||||
data && data.length > 0 && (data[0] && data[0].question) ?
|
||||
<Popover content={content(data)} overlayClassName="helpBox" placement={"left"}>
|
||||
<Popover title="帮助" content={content(data)} overlayClassName="helpBox" placement={"left"}>
|
||||
<div className="feedback">
|
||||
<i className="iconfont icon-bangzhu font-22"></i>
|
||||
<i className="iconfont icon-bangzhu1 font-22"></i>
|
||||
</div>
|
||||
</Popover>
|
||||
:""
|
||||
}
|
||||
|
||||
{/* 分享 */}
|
||||
{/* <div className="scan pr" title="微信扫一扫">
|
||||
<span className="inline erweima"><i className="iconfont icon-erweima color-white font-22 fl"></i></span>
|
||||
</div>*/}
|
||||
<ShareModal visible={visible} urlValue={window.location.href} onCancel={()=>setVisible(false)}/>
|
||||
<Popover content={shareContent()} overlayClassName="helpBox shareContent" placement={"left"}>
|
||||
<div className="consult">
|
||||
<i className="iconfont icon-fenxiang1"></i>
|
||||
<i className="iconfont icon-fenxiang"></i>
|
||||
</div>
|
||||
</Popover>
|
||||
<div className="gotop">
|
||||
<Tooltip title="返回顶部" placement={"right"}>
|
||||
|
||||
{/* 返回顶部 */}
|
||||
<Tooltip title="返回顶部" placement={"left"} overlayClassName="tooltipBox">
|
||||
<div className="gotop">
|
||||
<a><i className="iconfont icon-huidaodingbu1"></i></a>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
</Tooltip>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -17,9 +17,9 @@ function SiderBarShareModal({visible,urlValue,onCancel}) {
|
|||
value={urlValue}
|
||||
size={200}
|
||||
fgColor="#000000"
|
||||
style={{margin:"20px"}}
|
||||
style={{margin:"0 20px 20px"}}
|
||||
/>}
|
||||
<p>打开微信“扫一扫”,点击右上角菜单,即可将网页分享至朋友圈</p>
|
||||
<p>打开微信“扫一扫”,点击右上角菜单,即可将网页分享至朋友圈</p>
|
||||
</div>
|
||||
</Modal>
|
||||
)
|
||||
|
|
|
@ -5,7 +5,7 @@ const Nav = styled.div`{
|
|||
background-color:#fff;
|
||||
padding:20px 30px;
|
||||
border-bottom:1px solid #eee;
|
||||
font-size:16px;
|
||||
font-size:18px;
|
||||
color:#333;
|
||||
display:flex;
|
||||
justify-content: space-between;
|
||||
|
|
|
@ -7,6 +7,8 @@ export const Banner = styled.div`{
|
|||
border-bottom:1px solid #eee;
|
||||
background-color:#fff;
|
||||
border-radius:5px 5px 0px 0px;
|
||||
justify-content: space-between;
|
||||
display: flex;
|
||||
}`
|
||||
export const AlignCenterBetween = styled.div`{
|
||||
display:flex;
|
||||
|
|
|
@ -36,15 +36,15 @@ function About(props, ref) {
|
|||
const [ disabled, setDisabled ] = useState(false);
|
||||
const [ typeFlag, setTypeFlag] = useState(false);
|
||||
|
||||
const AuthorLogin = props.projectDetail && props.projectDetail.author && props.projectDetail.author.login;
|
||||
const isPermission = props.projectDetail && props.projectDetail.permission && props.projectDetail.permission!=="Reporter";
|
||||
const CurrentLogin = props.current_user && props.current_user.login;
|
||||
useEffect(()=>{
|
||||
if(CurrentLogin === AuthorLogin){
|
||||
if(isPermission){
|
||||
auth('get');
|
||||
}else{
|
||||
setIsSpining(false);
|
||||
}
|
||||
},[AuthorLogin,CurrentLogin])
|
||||
},[isPermission,CurrentLogin])
|
||||
|
||||
function auth(type){
|
||||
const url = `/${owner}/${projectsId}/ci_authorize.json`;
|
||||
|
@ -167,17 +167,17 @@ function About(props, ref) {
|
|||
<img src={activate} alt="" width="250px" />
|
||||
<P>定义DevOps工作流,帮助您检测bug、发布代码…</P>
|
||||
{
|
||||
CurrentLogin !== AuthorLogin ?
|
||||
!isPermission ?
|
||||
<div className="noOperation">DevOps开启功能暂未对项目创建者以外的角色开放,可以联系项目创建者进行开启,开启后便可查看构建信息。</div>:""
|
||||
}
|
||||
<a href={"https://forum.trustie.net/forums/3110/detail"} target="_blank" style={{ color: "#5091FF"}}>
|
||||
了解什么是DevOps?
|
||||
</a>
|
||||
<a href={"https://forum.trustie.net/forums/3080/detail"} target="_blank" style={{ color: "#5091FF"}}>
|
||||
如何使用DevOps?
|
||||
如何使用引擎(Engine)功能?
|
||||
</a>
|
||||
{
|
||||
AuthorLogin === CurrentLogin ?
|
||||
isPermission ?
|
||||
<React.Fragment>
|
||||
{
|
||||
step === 0 && !typeFlag ?
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import React from 'react';
|
||||
import { Table , Popconfirm } from 'antd';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { turnbar } from "educoder";
|
||||
|
||||
// const STATUS = {
|
||||
// running:"运行中",
|
||||
|
@ -10,12 +11,6 @@ import { Link } from 'react-router-dom';
|
|||
// killed:"已撤销",
|
||||
// pending:"准备中"
|
||||
// }
|
||||
function turnbar(str){
|
||||
if(str && str.length>0 && str.indexOf("/")>-1){
|
||||
return str.replaceAll('/','%2F');
|
||||
}
|
||||
return str;
|
||||
}
|
||||
function renderTableStatus(status) {
|
||||
switch (status) {
|
||||
case "running":
|
||||
|
|
|
@ -17,7 +17,7 @@ function Sure({datas , name , saveFunc , sureSubmit , loading}){
|
|||
return(
|
||||
<div>
|
||||
<div style={{padding:"0px 15px 15px 15px"}}>
|
||||
工作流名称:{name}
|
||||
流水线名称:{name}
|
||||
</div>
|
||||
<div className="editorBody" style={{marginTop:"0px"}}>
|
||||
<Editors value={value} theme={"vs-grey"} height={"600px"} visible/>
|
||||
|
|
|
@ -5,7 +5,7 @@ import { AlignCenterBetween , Blueline , FlexAJ } from '../../Component/layout';
|
|||
function head({manager , parameter}){
|
||||
return(
|
||||
<AlignCenterBetween>
|
||||
<span className="font-20">工作流配置</span>
|
||||
<span className="font-20">引擎配置</span>
|
||||
<FlexAJ>
|
||||
{
|
||||
parameter && <Blueline onClick={parameter}>参数管理</Blueline>
|
||||
|
|
|
@ -66,7 +66,7 @@ export default ((props)=>{
|
|||
{/* 原本的两种合为一个 */}
|
||||
<Route path="/:owner/:projectsId/devops"
|
||||
render={
|
||||
(p) =>{return( p.location.state.open_devops?<Dispose {...props} {...p}/>:<About {...props} {...p}/>)}
|
||||
(p) =>{return( p.location && p.location.state && p.location.state.open_devops?<Dispose {...props} {...p}/>:<About {...props} {...p}/>)}
|
||||
}
|
||||
></Route>
|
||||
</Switch>
|
||||
|
|
|
@ -103,7 +103,7 @@ function Params(props){
|
|||
<New visble={visible} successFunc={successFunc} CancelFunc={CancelFunc} editList={editList}/>
|
||||
<Banner>
|
||||
<FlexAJ>
|
||||
<span className="font-18">工作流 - 参数管理</span>
|
||||
<span className="font-18">引擎 - 参数管理</span>
|
||||
<Link to={`/${owner}/${projectsId}/devops`} className="font-14 color-grey-9 ml20">返回</Link>
|
||||
</FlexAJ>
|
||||
</Banner>
|
||||
|
|
|
@ -126,7 +126,7 @@ function Mould(props){
|
|||
<div>
|
||||
<New wrappedComponentRef={(f) => childRef.current = f} ref={childRef} visible={visible} onCancel={()=>setVisible(false)} onOk={onOk}></New>
|
||||
<Banner>
|
||||
<FlexAJ><span>工作流 - 模板管理</span><Link to={`/${owner}/${projectsId}/devops`} className="font-14 color-grey-9">返回</Link></FlexAJ>
|
||||
<FlexAJ><span>引擎 - 模板管理</span><Link to={`/${owner}/${projectsId}/devops`} className="font-14 color-grey-9">返回</Link></FlexAJ>
|
||||
</Banner>
|
||||
<Div className="disposeList">
|
||||
<FlexAJ>
|
||||
|
|
|
@ -5,7 +5,7 @@ import { Menu, Popconfirm } from "antd";
|
|||
import { TagsLine } from "../Component/OpsStatus";
|
||||
import { Time } from "../Utils/Time";
|
||||
import { truncateCommitId } from "../common/util";
|
||||
import { getUrl } from 'educoder';
|
||||
import { getImageUrl } from 'educoder';
|
||||
|
||||
const SubMenu = Menu.SubMenu;
|
||||
const Img = styled.img`
|
||||
|
@ -70,7 +70,7 @@ export default ({ data, repeatSet , chooseSteps }) => {
|
|||
<div>
|
||||
<FlexAJ className="leftheader">
|
||||
<AlignCenter>
|
||||
<Img src={getUrl(`/images/${data && data.author && data.author.image_url}`)} />
|
||||
<Img src={getImageUrl(`/${data && data.author && data.author.image_url}`)} />
|
||||
{data && data.started &&
|
||||
<span className="nest">
|
||||
开始时间:<span> {data.started}</span>
|
||||
|
|
|
@ -12,7 +12,7 @@ function ServiceModal({sureModal}){
|
|||
<div className="mt30" style={{textAlign:"center"}}>
|
||||
<Radio.Group value={type} onChange={changeType}>
|
||||
<Radio value={1}>自有服务器</Radio>
|
||||
<Radio value={2}>Trustie服务器</Radio>
|
||||
<Radio value={2}>GitLink服务器</Radio>
|
||||
</Radio.Group>
|
||||
<p className="mt30"><Button type="primary" onClick={()=>sureModal(type)}>下一步</Button></p>
|
||||
</div>
|
||||
|
|
|
@ -5,7 +5,7 @@ export const getBranch = async (id,owner)=>{
|
|||
}
|
||||
// 获取标签列表
|
||||
export const getTag = async (id,owner)=>{
|
||||
return (await axios.get(`/${owner}/${id}/tags.json`)).data;
|
||||
return (await axios.get(`/${owner}/${id}/tags.json`,{params:{only_name:true}})).data.tags;
|
||||
}
|
||||
// 获取hooks(仓库设置-管理web钩子)列表
|
||||
export const getHooks = async (id,params)=>{
|
||||
|
|
|
@ -1,85 +1,87 @@
|
|||
import React, { useState , forwardRef, useEffect } from 'react';
|
||||
import { Form , Modal , Input , Radio } from 'antd';
|
||||
import { Form , Modal , Input , Radio ,Button} from 'antd';
|
||||
import Axios from 'axios';
|
||||
import CheckProfile from '../Component/ProfileModal/Profile';
|
||||
// import CheckProfile from '../Component/ProfileModal/Profile';
|
||||
function AddProjectModal(props){
|
||||
const { getFieldDecorator, validateFields , setFieldsValue } = props && props.form;
|
||||
const [ visible , setVisible ] = useState(false);
|
||||
|
||||
export default Form.create()(
|
||||
forwardRef((props)=>{
|
||||
const { getFieldDecorator, validateFields , setFieldsValue } = props && props.form;
|
||||
const [ visible , setVisible ] = useState(false);
|
||||
|
||||
useEffect(()=>{
|
||||
if(!visible){
|
||||
setFieldsValue({
|
||||
code:undefined,
|
||||
role:"developer"
|
||||
})
|
||||
}
|
||||
},[visible])
|
||||
|
||||
function onOk() {
|
||||
validateFields((error,values)=>{
|
||||
if(!error){
|
||||
const url = `/applied_projects.json`;
|
||||
Axios.post(url,{
|
||||
applied_project:{
|
||||
...values
|
||||
}
|
||||
}).then(result=>{
|
||||
if(result && result.data){
|
||||
setVisible(false);
|
||||
props.showNotification("申请加入项目成功,等待审核!");
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
useEffect(()=>{
|
||||
if(!visible){
|
||||
setFieldsValue({
|
||||
code:undefined,
|
||||
role:"developer"
|
||||
})
|
||||
}
|
||||
function checkValue(rule, value, callback){
|
||||
if(!value){
|
||||
callback();
|
||||
},[visible])
|
||||
|
||||
function onOk() {
|
||||
validateFields((error,values)=>{
|
||||
console.log(error)
|
||||
if(!error){
|
||||
const url = `/applied_projects.json`;
|
||||
Axios.post(url,{
|
||||
applied_project:{
|
||||
...values
|
||||
}
|
||||
}).then(result=>{
|
||||
if(result && result.data){
|
||||
setVisible(false);
|
||||
props.showNotification("申请加入项目成功,等待审核!");
|
||||
}
|
||||
}).catch(error=>{})
|
||||
}
|
||||
})
|
||||
}
|
||||
function checkValue(rule, value, callback){
|
||||
if(!value){
|
||||
callback("请输入6位数的邀请码");
|
||||
}else{
|
||||
if(value.length < 6 || value.length > 6){
|
||||
callback("请输入6位数的邀请码");
|
||||
}
|
||||
callback();
|
||||
}
|
||||
}
|
||||
callback();
|
||||
}
|
||||
|
||||
return(
|
||||
<React.Fragment>
|
||||
<Modal
|
||||
title="加入项目"
|
||||
width="480px"
|
||||
visible={visible}
|
||||
centered={true}
|
||||
onOk={onOk}
|
||||
onCancel={()=>setVisible(false)}
|
||||
>
|
||||
<Form layout={'inline'} className="inviteForm">
|
||||
<Form.Item label="项目邀请码">
|
||||
{getFieldDecorator("code",{
|
||||
rules:[
|
||||
{required:true,message:"请输入6位项目邀请码"},
|
||||
{validator:checkValue}
|
||||
]
|
||||
})(
|
||||
<Input placeholder="请输入6位项目邀请码" autoComplete={"off"} maxLength="6" style={{width:"300px"}}/>
|
||||
)}
|
||||
</Form.Item>
|
||||
<Form.Item label="选择角色">
|
||||
{getFieldDecorator("role",{
|
||||
rules:[{required:true,message:"请选择角色"}]
|
||||
})(
|
||||
<Radio.Group defaultValue={"developer"}>
|
||||
<Radio value="manager">管理员</Radio>
|
||||
<Radio value="developer">开发者</Radio>
|
||||
<Radio value="reporter">报告者</Radio>
|
||||
</Radio.Group>
|
||||
)}
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</Modal>
|
||||
<CheckProfile {...props} sureFunc={()=>setVisible(true)}>加入项目</CheckProfile>
|
||||
</React.Fragment>
|
||||
)
|
||||
})
|
||||
)
|
||||
return(
|
||||
<React.Fragment>
|
||||
<Modal
|
||||
title="加入项目"
|
||||
width="480px"
|
||||
visible={visible}
|
||||
centered={true}
|
||||
onOk={onOk}
|
||||
onCancel={()=>setVisible(false)}
|
||||
>
|
||||
<Form layout={'inline'} className="inviteForm">
|
||||
<Form.Item label="项目邀请码">
|
||||
{getFieldDecorator("code",{
|
||||
rules:[
|
||||
{required:true,message:" "},
|
||||
{validator:checkValue}
|
||||
]
|
||||
})(
|
||||
<Input placeholder="请输入6位项目邀请码" autoComplete={"off"} maxLength={6} style={{width:"300px"}}/>
|
||||
)}
|
||||
</Form.Item>
|
||||
<Form.Item label="选择角色">
|
||||
{getFieldDecorator("role",{
|
||||
rules:[{required:true,message:"请选择角色"}]
|
||||
})(
|
||||
<Radio.Group>
|
||||
<Radio value="manager">管理员</Radio>
|
||||
<Radio value="developer">开发者</Radio>
|
||||
<Radio value="reporter">报告者</Radio>
|
||||
</Radio.Group>
|
||||
)}
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</Modal>
|
||||
{/* 红山无资料要求限制,暂时注释 */}
|
||||
{/* <CheckProfile {...props} sureFunc={()=>setVisible(true)}>加入项目</CheckProfile> */}
|
||||
<Button type="primary" onClick={()=>setVisible(true)}>加入项目</Button>
|
||||
</React.Fragment>
|
||||
)
|
||||
}
|
||||
export default Form.create()(forwardRef(AddProjectModal));
|
|
@ -19,48 +19,45 @@ function Footer(){
|
|||
|
||||
return(
|
||||
<div>
|
||||
<div style={{height:"543px"}}></div>
|
||||
<div className="newFooter edu-txt-center">
|
||||
{value && showhtml(value)}
|
||||
{/* <div className="footerInfos">
|
||||
<ul>
|
||||
<li>社区</li>
|
||||
<li><a href={`/`} target="_blank">网站首页</a></li>
|
||||
<li><a href={`https://www.trustie.net/agreement`} target="_blank">服务协议</a></li>
|
||||
<li><a href={`https://forum.trustie.net/forums/1168/detail`} target="_blank">帮助中心</a></li>
|
||||
<li><a href={`https://forum.trustie.net/`} target="_blank">问吧交流</a></li>
|
||||
<li><a href={`https://www.trustie.net/cooperation`} target="_blank">合作伙伴</a></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li>支持与服务</li>
|
||||
<li><a href={`https://forgeplus.trustie.net/docs/api`} target="_blank">API文档</a></li>
|
||||
<li><a href={`https://forum.trustie.net/forums/1168/detail`} target="_blank">帮助中心</a></li>
|
||||
<li><a href={`https://git-scm.com`} target="_blank">Git常用命令</a></li>
|
||||
<li><a href={`https://forum.trustie.net/forums/3080/detail`} target="_blank">DevOps使用文档</a></li>
|
||||
<li><a href={`https://forgeplus.trustie.net/projects/jasder/forgeplus/tree/master/CHANGELOG.md`} target="_blank">日志更新</a></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li>合作伙伴</li>
|
||||
<li><a href={`http://www.sei.pku.edu.cn`} target="_blank">北京大学</a></li>
|
||||
<li><a href={`http://scse.buaa.edu.cn`} target="_blank">北京航空航天大学</a></li>
|
||||
<li><a href={`https://www.nju.edu.cn`} target="_blank">南京大学</a></li>
|
||||
<li><a href={`https://www.xtu.edu.cn`} target="_blank">湘潭大学</a></li>
|
||||
<li><a href={`http://www.iscas.ac.cn`} target="_blank">ISCAS</a></li>
|
||||
<li><a href={`https://www.ucloud.cn`} target="_blank">UCloud优刻得</a></li>
|
||||
<li><a href={`http://www.inforbus.com`} target="_blank">中创软件</a></li>
|
||||
<li><a href={`https://www.inspur.com`} target="_blank">浪潮集团</a></li>
|
||||
<li><a href={`http://www.copu.org.cn`} target="_blank">中国开源软件推进联盟</a></li>
|
||||
<li><a href={`https://www.sjtu.edu.cn`} target="_blank">上海交通大学</a></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li>合作伙伴</li>
|
||||
<li><span>热线:</span></li>
|
||||
<li><span>QQ群:1071514693</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<p className="footerCopy">© Copyright 2007~2021 国防科技大学Trustie团队 & IntelliDE <a href="https://beian.miit.gov.cn">湘ICP备 17009477号</a></p> */}
|
||||
</div>
|
||||
<div style={{height:'107px'}}></div>
|
||||
{value && showhtml(value)}
|
||||
</div>
|
||||
// {/* <div className="footEdition">
|
||||
// <div className="footContent">
|
||||
// <ul className="center">
|
||||
// <img src={""} alt="Gitlink(确实开源)" height="29px"/>
|
||||
// <p>(确实开源)</p>
|
||||
// </ul>
|
||||
// <ul>
|
||||
// <li className="thehead">社区</li>
|
||||
// <li><a href="/">网站首页</a></li>
|
||||
// <li><a href="https://forum.trustie.net/forums/1168/detail">帮助中心</a></li>
|
||||
// <li><a href="https://forum.trustie.net/">论坛交流</a></li>
|
||||
// <li><a href="https://www.trustie.net/cooperation">合作伙伴</a></li>
|
||||
// </ul>
|
||||
// <ul>
|
||||
// <li className="thehead">支持与服务</li>
|
||||
// <li><a href="https://forgeplus.trustie.net/docs/api">API文档</a></li>
|
||||
// <li><a href="https://git-scm.com">Git常用命令</a></li>
|
||||
// <li><a href="https://forum.trustie.net/forums/3080/detail">DevOps使用文档</a></li>
|
||||
// <li><a href='https://www.trustie.net/agreement'>服务协议</a></li>
|
||||
// </ul>
|
||||
// <ul>
|
||||
// <li className="thehead">加入我们</li>
|
||||
// <li className="theline">
|
||||
// <div className="mr50">
|
||||
// <li>公众号</li>
|
||||
// <img src={"Img"} alt="公众号"/>
|
||||
// </div>
|
||||
// <div>
|
||||
// <li>QQ群</li>
|
||||
// <img src={"qqImg"} alt="QQ群"/>
|
||||
// </div>
|
||||
// </li>
|
||||
// </ul>
|
||||
// </div>
|
||||
// <p className="copyrightDesc">©Copyright 2007~2021 国防科技大学Gitlink团队 & IntelliDE <br/>湘ICP备 17009477号</p>
|
||||
// </div> */}
|
||||
)
|
||||
}
|
||||
export default Footer;
|
||||
|
|
|
@ -2,7 +2,8 @@ import React, { Component } from 'react';
|
|||
import AccountProfile from "../../modules/user/AccountProfile";
|
||||
import { getImageUrl } from 'educoder'
|
||||
import axios from 'axios';
|
||||
import { Input , notification , Dropdown ,Popover, Menu,Badge, Button } from 'antd';
|
||||
import cookie from 'react-cookies';
|
||||
import { notification , Dropdown ,Popover, Menu,Badge } from 'antd';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
import LoginDialog from '../../modules/login/LoginDialog';
|
||||
|
@ -14,10 +15,8 @@ import CheckProfile from '../Component/ProfileModal/Profile';
|
|||
|
||||
import './header.scss';
|
||||
import NoticeContent from './NoticeContent';
|
||||
const $ = window.$
|
||||
import MainLogo from './img/logo.png';
|
||||
// TODO 这部分脚本从公共脚本中直接调用
|
||||
const { Search } = Input;
|
||||
let old_url;
|
||||
|
||||
window._header_componentHandler = null;
|
||||
// 非trustie链接则新开页跳转
|
||||
|
@ -43,8 +42,8 @@ class NewHeader extends Component {
|
|||
setevaluatinghides: false,
|
||||
occupation: 0,
|
||||
mydisplay: false,
|
||||
headtypesonClickbool: false,
|
||||
headtypess: "/",
|
||||
// headtypesonClickbool: false,
|
||||
// headtypess: "/",
|
||||
settings: null,
|
||||
visiblemyss: false,
|
||||
openSearch:false,
|
||||
|
@ -55,28 +54,6 @@ class NewHeader extends Component {
|
|||
this.geturlsdata();
|
||||
window._header_componentHandler = this;
|
||||
|
||||
//下拉框的显示隐藏
|
||||
var hoverTimeout;
|
||||
var hoveredPanel;
|
||||
$(".edu-menu-panel").hover(function () {
|
||||
if (hoverTimeout) { // 一次只显示一个panel
|
||||
if (hoveredPanel && hoveredPanel !== this) {
|
||||
$(hoveredPanel).find(".edu-menu-list").hide()
|
||||
}
|
||||
clearTimeout(hoverTimeout);
|
||||
hoverTimeout = null;
|
||||
}
|
||||
hoveredPanel = this;
|
||||
$(this).find(".edu-menu-list").show();
|
||||
}, function () {
|
||||
var that = this;
|
||||
// 延迟hide
|
||||
hoverTimeout = setTimeout(function () {
|
||||
$(that).find(".edu-menu-list").hide();
|
||||
}, 800)
|
||||
|
||||
});
|
||||
//获取游览器地址
|
||||
try {
|
||||
window.sessionStorage.setItem("yslgeturls", JSON.stringify(window.location.href))
|
||||
} catch (e) {}
|
||||
|
@ -98,11 +75,17 @@ class NewHeader extends Component {
|
|||
|
||||
educoderlogin = () => {
|
||||
//登录账号
|
||||
this.setState({
|
||||
isRender: true
|
||||
})
|
||||
if(window.location.pathname === "/"){
|
||||
window.location.href="/login";
|
||||
}else{
|
||||
this.setState({
|
||||
isRender: true
|
||||
})
|
||||
}
|
||||
}
|
||||
educoderloginysl = () => {
|
||||
//退出账号时清除登录页面的下次自动登录(用户再次打开登录页面时下次自动登录框不勾选)
|
||||
cookie.remove("autologin");
|
||||
//退出账号
|
||||
var url = `/accounts/logout.json`;
|
||||
axios.get((url)).then((result) => {
|
||||
|
@ -154,12 +137,12 @@ class NewHeader extends Component {
|
|||
AccountProfiletype: false
|
||||
})
|
||||
};
|
||||
headtypesonClick = (url, bool) => {
|
||||
this.setState({
|
||||
headtypess: url,
|
||||
headtypesonClickbool: bool,
|
||||
})
|
||||
}
|
||||
// headtypesonClick = (url, bool) => {
|
||||
// this.setState({
|
||||
// headtypess: url,
|
||||
// headtypesonClickbool: bool,
|
||||
// })
|
||||
// }
|
||||
//获取数据为空的时候
|
||||
gettablogourlnull = () => {
|
||||
this.setState({
|
||||
|
@ -199,9 +182,9 @@ class NewHeader extends Component {
|
|||
geturlsdata = () => {
|
||||
let url = "/setting.json";
|
||||
axios.get(url).then((response) => {
|
||||
if (response && response.data) {
|
||||
if (response && response.data && response.data.setting) {
|
||||
this.setState({ settings: response.data.setting });
|
||||
localStorage.setItem('chromesetting', JSON.stringify(response.data.setting));
|
||||
response.data.setting&&localStorage.setItem('chromesetting', JSON.stringify(response.data.setting));
|
||||
localStorage.setItem('chromesettingresponse', JSON.stringify(response));
|
||||
} else {
|
||||
this.gettablogourlnull();
|
||||
|
@ -213,12 +196,27 @@ class NewHeader extends Component {
|
|||
|
||||
matchpaths = (url) => {
|
||||
const { match } = this.props;
|
||||
if(url){
|
||||
if (match.path.indexOf(url) > -1) {
|
||||
return true
|
||||
}else {
|
||||
return false
|
||||
const hostname = window.location.hostname;
|
||||
const port = window.location.port;
|
||||
const isDev = window.location.port == 3007;
|
||||
let isdev2= isDev ?'http://192.168.1.40:3000':`http://${hostname}`;
|
||||
let str = "";
|
||||
if(url.indexOf("http")>-1){
|
||||
if(url.indexOf("https")>-1){
|
||||
isdev2 = `https://${hostname}`;
|
||||
}
|
||||
if(port){
|
||||
isdev2 += `:${port}`;
|
||||
}
|
||||
str = isdev2+match.path;
|
||||
}else{
|
||||
str = match.path;
|
||||
}
|
||||
|
||||
if (url && str === url) {
|
||||
return true
|
||||
}else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -279,96 +277,18 @@ class NewHeader extends Component {
|
|||
};
|
||||
|
||||
render() {
|
||||
const { match ,resetUserInfo ,showNotification} = this.props;
|
||||
const { resetUserInfo ,showNotification,publicNav} = this.props;
|
||||
let current_user = this.props.user;
|
||||
let {
|
||||
AccountProfiletype,
|
||||
user,
|
||||
isRender,
|
||||
headtypesonClickbool,
|
||||
headtypess,
|
||||
settings,
|
||||
visible,
|
||||
} = this.state;
|
||||
/*用户名称 用户头像url*/
|
||||
let activeIndex = false;
|
||||
let activeForums = false;
|
||||
let activeShixuns = false;
|
||||
let activePaths = false;
|
||||
let coursestype = false;
|
||||
let activePackages = false;
|
||||
let activeMoopCases = false;
|
||||
let activeCompetitions = false;
|
||||
|
||||
if (match.path === '/forums') {
|
||||
activeForums = true;
|
||||
} else if (match.path.startsWith('/shixuns')) {
|
||||
activeShixuns = true;
|
||||
} else if (match.path.startsWith('/paths')) {
|
||||
activePaths = true;
|
||||
} else if (match.path.startsWith('/courses')) {
|
||||
coursestype = true;
|
||||
} else if (match.path.startsWith('/crowdsourcing')) {
|
||||
activePackages = true;
|
||||
} else if (match.path.startsWith('/moop_cases')) {
|
||||
activeMoopCases = true;
|
||||
} else if (match.path.startsWith('/competitions')) {
|
||||
activeCompetitions = true;
|
||||
} else {
|
||||
activeIndex = true;
|
||||
}
|
||||
|
||||
let headtypes = '/';
|
||||
if (settings) {
|
||||
if (settings.navbar) {
|
||||
if (settings.navbar.length > 0) {
|
||||
if (match.path === '/') {
|
||||
if (headtypesonClickbool === false) {
|
||||
headtypes = undefined;
|
||||
} else {
|
||||
headtypes = headtypess;
|
||||
}
|
||||
} else {
|
||||
for (var i = 0; i < settings.navbar.length; i++) {
|
||||
if (match.path === settings.navbar[i].link) {
|
||||
headtypes = settings.navbar[i].link;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let shixuntype = false;
|
||||
let pathstype = false;
|
||||
let coursestypes = false;
|
||||
if (this.props && this.props.mygetHelmetapi != null) {
|
||||
let shixun = "/shixuns";
|
||||
let paths = "/paths";
|
||||
let courses = "/courses";
|
||||
this.props.mygetHelmetapi && this.props.mygetHelmetapi.navbar && this.props.mygetHelmetapi.navbar.map((item, key) => {
|
||||
var reg = RegExp(item.link);
|
||||
if (shixun.match(reg)) {
|
||||
if (item.hidden === true) {
|
||||
shixuntype = true
|
||||
}
|
||||
}
|
||||
if (paths.match(reg)) {
|
||||
if (item.hidden === true) {
|
||||
pathstype = true
|
||||
}
|
||||
}
|
||||
if (courses.match(reg)) {
|
||||
if (item.hidden === true) {
|
||||
coursestypes = true
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
let search_url = settings && settings.common && settings.common.search;
|
||||
return (
|
||||
<div className="newHeaders" id="nHeader">
|
||||
<div className={publicNav ? `newHeaders publicNav`:`newHeaders`} id="nHeader">
|
||||
<div className="headerContent">
|
||||
{isRender === true ?
|
||||
<LoginDialog
|
||||
|
@ -383,42 +303,49 @@ class NewHeader extends Component {
|
|||
{...this.props}
|
||||
{...this.state}
|
||||
/> : ""}
|
||||
{/* <div style={{width:"78px"}}>
|
||||
{
|
||||
publicNav &&
|
||||
<a href={'https://www.ccf.org.cn/'} className={"fl"}>
|
||||
<img src={MainLogo} alt="ccf" />
|
||||
</a>
|
||||
}
|
||||
</div> */}
|
||||
{
|
||||
settings && settings.nav_logo_url ?
|
||||
<a href={settings && settings.new_course.default_url} className={"fl mr50"} style={{minWidth:"45px"}}>
|
||||
<img alt="可控开源社区" className="logoimg" style={{ heigth: "40px" }} src={getImageUrl(`/${settings.nav_logo_url}`)}></img>
|
||||
<a href={settings && settings.new_course.default_url} className={"fl mr50"}>
|
||||
<img alt="红山开源" className="logoimg" src={getImageUrl(`/${settings.nav_logo_url}`)}></img>
|
||||
</a>
|
||||
:
|
||||
""
|
||||
}
|
||||
<div className="head-nav pr" id={"head-navpre1"}>
|
||||
<div id={"head-navpre1"} className={"head-nav pr"}>
|
||||
{
|
||||
settings && settings.navbar && settings.navbar.length > 0 ?
|
||||
<ul id="header-nav">
|
||||
{
|
||||
settings.navbar && settings.navbar.map((item, key) => {
|
||||
var new_link = item.link;
|
||||
var user_login = current_user && current_user.login;
|
||||
var is_hidden = item.hidden
|
||||
if (new_link && (new_link.indexOf("courses") > -1 || new_link.indexOf("contests") > -1)) {
|
||||
if (user_login) {
|
||||
if (new_link.indexOf("courses") > -1) {
|
||||
new_link = new_link.replace(/courses/g, user_login + "/courses")
|
||||
} else if (new_link.indexOf("contests") > -1) {
|
||||
new_link = new_link.replace(/contests/g, user_login + "/contests")
|
||||
}
|
||||
} else {
|
||||
is_hidden = true
|
||||
}
|
||||
}
|
||||
if (user_login && (new_link && new_link.indexOf("homes") > -1)) {
|
||||
new_link = new_link.replace(/homes/g, user_login + "/user_activities")
|
||||
}
|
||||
|
||||
// var user_login = current_user && current_user.login;
|
||||
var is_hidden = item.hidden;
|
||||
// if (new_link && (new_link.indexOf("courses") > -1 || new_link.indexOf("contests") > -1)) {
|
||||
// if (user_login) {
|
||||
// if (new_link.indexOf("courses") > -1) {
|
||||
// new_link = new_link.replace(/courses/g, user_login + "/courses")
|
||||
// } else if (new_link.indexOf("contests") > -1) {
|
||||
// new_link = new_link.replace(/contests/g, user_login + "/contests")
|
||||
// }
|
||||
// } else {
|
||||
// is_hidden = true
|
||||
// }
|
||||
// }
|
||||
// if (user_login && (new_link && new_link.indexOf("homes") > -1)) {
|
||||
// new_link = new_link.replace(/homes/g, user_login + "/user_activities")
|
||||
// }
|
||||
var waiLian = (new_link && str.filter(item=>new_link.indexOf(item)>-1) );
|
||||
var wl = waiLian && waiLian.length>0;
|
||||
return (
|
||||
<li key={key} onClick={() => this.headtypesonClick(item.link, true)} className={`${this.matchpaths(item.link) === true ? 'pr active' : 'pr'}`} style={!is_hidden ? { display: 'flex' } : { display: 'none' }}>
|
||||
<li key={key} className={`${this.matchpaths(new_link) === true ? 'pr active' : 'pr'}`} style={{display:!is_hidden ? 'flex' : 'none'} }>
|
||||
<a href={new_link} target={wl ? "_self":"_blank"}>{item.name}</a>
|
||||
</li>
|
||||
)
|
||||
|
@ -433,7 +360,8 @@ class NewHeader extends Component {
|
|||
{
|
||||
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">
|
||||
<i className="iconfont icon-tianjiafangda color-grey-6 ml30 mr15"></i>
|
||||
{/* <img src={require(`./img/add.png`)} alt="" width="16px" className="mr15 ml30"/> */}
|
||||
<i className="iconfont icon-tianjiafangda ml15 mr15 color-grey-6 font-18"></i>
|
||||
</Dropdown>:""
|
||||
}
|
||||
|
||||
|
@ -446,9 +374,10 @@ class NewHeader extends Component {
|
|||
onVisibleChange={this.handleVisibleChange}
|
||||
destroyTooltipOnHide
|
||||
>
|
||||
<Link to={"/settings/notice"} className="message-icon">
|
||||
<Link to={"/settings/notice"} className="message-icon mt3">
|
||||
{current_user && <Badge count={current_user.message_unread_total}>
|
||||
<i className="iconfont icon-xiaoxilingdang color-grey-6 ml15 mr15"></i>
|
||||
{/* <img src={require(`./img/ring.png`)} alt="" width="16px" className="ml15 mr15"/> */}
|
||||
<i className="iconfont icon-xiaoxilingdang ml15 mr15 color-grey-6 font-18"></i>
|
||||
</Badge>}
|
||||
</Link>
|
||||
</Popover>
|
||||
|
@ -459,8 +388,12 @@ class NewHeader extends Component {
|
|||
<span className="font-15 ml30">
|
||||
<a onClick={() => this.educoderlogin()} className="mr5 color-grey-6">登录</a>
|
||||
{
|
||||
settings && settings.common && settings.common.register &&
|
||||
<span><em className="vertical-line"></em><a className="ml5 color-grey-6" href={`${settings.common.register}`} target="_blank">注册</a></span>
|
||||
(settings && settings.common && settings.common.register) ?
|
||||
publicNav ?
|
||||
<a href='/register' className="regBtn">立即注册</a>
|
||||
:
|
||||
<span><em className="vertical-line"></em><a className="ml5 color-grey-6" href='/register'>注册</a></span>
|
||||
:""
|
||||
}
|
||||
</span>
|
||||
:
|
||||
|
|
|
@ -23,6 +23,9 @@ function NoticeContent({ visible, showNotification, resetUserInfo, current_user:
|
|||
const [atPage, setAtPage] = useState(0);
|
||||
const [atUnreadList, setAtUnreadList] = useState([]);//未读@我列表
|
||||
|
||||
//记录用户点击的消息
|
||||
const [clickItem, setClickItem] = useState(undefined);
|
||||
|
||||
useEffect(() => {
|
||||
resetUserInfo();
|
||||
}, [noticeUnreadCount,atUnreadCount]);
|
||||
|
@ -150,23 +153,26 @@ function NoticeContent({ visible, showNotification, resetUserInfo, current_user:
|
|||
|
||||
|
||||
function changeReadMark(item) {
|
||||
if (item.type === "notification") {
|
||||
let list = noticeUnreadList.slice();
|
||||
let index = noticeUnreadList.indexOf(item);
|
||||
list[index].status = 2;
|
||||
setNoticeUnreadList(list);
|
||||
if (noticeUnreadCount > 0) {
|
||||
setNoticeUnreadCount(noticeUnreadCount - 1);
|
||||
}
|
||||
} else if (item.type === "atme") {
|
||||
let list = atUnreadList.slice();
|
||||
let index = atUnreadList.indexOf(item);
|
||||
list[index].status = 2;
|
||||
setAtUnreadList(list);
|
||||
if (atUnreadCount > 0) {
|
||||
setAtUnreadCount(atUnreadCount - 1);
|
||||
if (!clickItem || clickItem.id !== item.id){
|
||||
if (item.type === "notification") {
|
||||
let list = noticeUnreadList.slice();
|
||||
let index = noticeUnreadList.indexOf(item);
|
||||
if (list[index].status === 1 && noticeUnreadCount > 0) {
|
||||
setNoticeUnreadCount(noticeUnreadCount - 1);
|
||||
}
|
||||
list[index].status = 2;
|
||||
setNoticeUnreadList(list);
|
||||
} else if (item.type === "atme") {
|
||||
let list = atUnreadList.slice();
|
||||
let index = atUnreadList.indexOf(item);
|
||||
if (list[index].status === 1 && atUnreadCount > 0) {
|
||||
setAtUnreadCount(atUnreadCount - 1);
|
||||
}
|
||||
list[index].status = 2;
|
||||
setAtUnreadList(list);
|
||||
}
|
||||
}
|
||||
setClickItem(item);
|
||||
}
|
||||
|
||||
return (
|
||||
|
@ -219,12 +225,12 @@ function NoticeContent({ visible, showNotification, resetUserInfo, current_user:
|
|||
{atUnreadList.map(item => {
|
||||
return (
|
||||
<div key={item.id + Math.random()} className="noticeCont-back" onClick={() => { readItem(item) }}>
|
||||
<div className="noticeCont">
|
||||
<div className={`noticeCont ${item.notification_url ? 'pointer' : ''}`}>
|
||||
<span style={{ visibility: item.status === 1 ? 'visible' : 'hidden' }}>
|
||||
<Badge color="#FA2020" />
|
||||
</span>
|
||||
<div className="noticeCont-text">
|
||||
<span className="content-span atme-cont-span" dangerouslySetInnerHTML={{ __html: "<b>" + (item.sender ? item.sender.name : '') + "</b> " + item.content + " 中@我" }}></span>
|
||||
<span className="content-span atme-cont-span" dangerouslySetInnerHTML={{ __html: item.content }}></span>
|
||||
<span className="timeSpan">{item.time_ago}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|