Compare commits
1147 Commits
master
...
gitlink_se
Author | SHA1 | Date |
---|---|---|
zhangxunhui | 815f05b74b | |
Xunhui Zhang | 11122e6d9f | |
caishi | 0b959c4a9b | |
caishi | 9f58eb1a5a | |
caishi | dbadc3f1a0 | |
caishi | 41d24b341c | |
caishi | 102f0bc04a | |
xxq250 | 7690843ff8 | |
caishi | 284d230821 | |
xxq250 | f9773a7e42 | |
caishi | e4a95602cc | |
何童崇 | 6a6f8d292f | |
xxq250 | 4f40755af1 | |
何童崇 | 70838266ad | |
何童崇 | 7fd94060db | |
谢思 | 872ca88ae8 | |
xxq250 | b5d65e5311 | |
谢思 | 68f209272c | |
何童崇 | ea079eb475 | |
caishi | 51d028336f | |
caishi | 4cd25cffc7 | |
caishi | b59409e2fc | |
yystopf | 6ac8a9863d | |
caishi | feb6ad6d89 | |
caishi | a3c6ad78ee | |
caishi | 04e10722e3 | |
xxq250 | 5007377c57 | |
谢思 | 3bf38174b3 | |
xxq250 | eec4fa4204 | |
谢思 | bce4543ab4 | |
谢思 | 41c0a29bef | |
谢思 | 3482c17d1f | |
谢思 | 13a54a3e29 | |
谢思 | cbf0f827dd | |
谢思 | 3c358c8175 | |
谢思 | ad7f878357 | |
谢思 | fc6b6dbede | |
谢思 | e7a23064a8 | |
谢思 | 947b7a4be6 | |
谢思 | c601d6681b | |
何童崇 | 6649db21b1 | |
谢思 | aac55ea94f | |
谢思 | baf69efac8 | |
谢思 | d49659deb3 | |
谢思 | a6ed2ca451 | |
谢思 | 83c2517824 | |
何童崇 | 27b6732ac4 | |
谢思 | 60c01d8682 | |
caishi | 5daada4b98 | |
何童崇 | 5156441c2a | |
谢思 | de206759bd | |
谢思 | d375ed8b02 | |
谢思 | 5edf45988e | |
caishi | 4c0f3497a9 | |
caishi | d4a59e9a94 | |
何童崇 | d91446dc12 | |
xxq250 | 87f26db26d | |
何童崇 | 4a4d767710 | |
caishi | 4f71cd1c0a | |
caishi | 1f7dda2526 | |
yystopf | e8a74dc780 | |
caishi | fc3a1e4088 | |
caishi | 335e484167 | |
caishi | 4d613fd07f | |
caishi | cb87a9d075 | |
caishi | 25a3e10c27 | |
xxq250 | 60327188eb | |
xxq250 | 4b3e62b907 | |
谢思 | 714b90581b | |
xxq250 | ff1e063979 | |
unknown | 4264c127d9 | |
xxq250 | 400bd28801 | |
何童崇 | 15b2ce6ea9 | |
何童崇 | 3ae9284494 | |
caishi | fb63377996 | |
caishi | 9527f69486 | |
caishi | b82e7d9d69 | |
caishi | 9db4f1b18c | |
caishi | c13c7025dd | |
caishi | d8384ab4bd | |
xxq250 | 882f0760e8 | |
caishi | 5e337cb94f | |
caishi | 569bc39e1e | |
caishi | 0e643287f9 | |
xxq250 | 3d9b43a784 | |
caishi | ed2c16661a | |
xxq250 | 8e4819217c | |
caishi | d03182cbd4 | |
xxq250 | 7416d9bcb6 | |
caishi | 3bfbba2303 | |
caishi | fa47ae9b5e | |
caishi | ac93cfbc8a | |
caishi | bb7732c666 | |
caishi | 81d8a866f0 | |
caishi | 0a334abede | |
xxq250 | 1ada91917e | |
caishi | 25f193a1d3 | |
caishi | e8bcebbf71 | |
xxq250 | afaef5f0d0 | |
caishi | e096e1aa50 | |
caishi | ec2d51e0d3 | |
xxq250 | 4ab36af1a9 | |
caishi | b0088a24ae | |
caishi | 2f25643fcc | |
caishi | 91338c863c | |
xxq250 | 9786aaa4fe | |
caishi | 34f108118b | |
caishi | 61abecde53 | |
xxq250 | 326aede507 | |
caishi | c3cc105468 | |
caishi | 80e20a9cca | |
xxq250 | bb8e671c20 | |
caishi | 1954a4f8d3 | |
caishi | b3dec1ee8e | |
caishi | 278cdba352 | |
caishi | e25de315f8 | |
xxq250 | 6bbdb3d7a8 | |
谢思 | eb254de9fd | |
xxq250 | c9279b274e | |
何童崇 | ce477020de | |
xxq250 | 21078af26f | |
何童崇 | bc5ec6103e | |
何童崇 | fcc53f5278 | |
谢思 | da69213b8e | |
xxq250 | 365ff99785 | |
谢思 | e206de9f1f | |
何童崇 | 358880bfd2 | |
谢思 | 63971edc44 | |
谢思 | 020a976135 | |
谢思 | 29d74526d1 | |
xxq250 | 2e1cf5ad82 | |
caishi | 56c8f7fa82 | |
caishi | 4db125545f | |
caishi | ecd1a8444e | |
caishi | 0a0705d42c | |
xxq250 | be0e0134f3 | |
hucong | 6904116a3a | |
hucong | 421218ef77 | |
xxq250 | 5f89356679 | |
hucong | cab540b812 | |
caishi | 2ffa835b84 | |
caishi | e93778b004 | |
caishi | 232e09c04f | |
xxq250 | 459e05f465 | |
caishi | 5ee3519c21 | |
caishi | 4270d1d8eb | |
hucong | dd298380a7 | |
caishi | 255ae11012 | |
caishi | ec4e70d7f0 | |
caishi | 758600e4d0 | |
xxq250 | 7d4def6056 | |
caishi | a1cc59e89b | |
xxq250 | 9e4ca503df | |
caishi | 472ea69e29 | |
xxq250 | 3c5e10fa58 | |
caishi | 915bf69e6f | |
xxq250 | a00452b960 | |
hucong | 3eeed4620c | |
xxq250 | 54858bcd39 | |
hucong | 6820fed5b5 | |
xxq250 | 82ac32d84f | |
xxq250 | fe6f8a9349 | |
caishi | d4f0d21608 | |
hucong | 56c867a4a3 | |
hucong | bd219c0b41 | |
caishi | 1292019aac | |
caishi | 33e1b7e400 | |
xxq250 | 9af269061d | |
谢思 | 2557b36cea | |
谢思 | f6c84e4fad | |
xxq250 | 161866aaaf | |
hucong | 3151314529 | |
hucong | 775434d856 | |
caishi | b802fd2fbd | |
caishi | cee82314da | |
caishi | 7295a71bc5 | |
xxq250 | 4971dc0a3d | |
caishi | e591de00fd | |
谢思 | c331dbb445 | |
caishi | 36a58c0fe3 | |
caishi | 0e949110fd | |
caishi | 4ffb2acc9c | |
xxq250 | 0991ba4698 | |
caishi | f82a51fd83 | |
caishi | 98ed1794cf | |
baladiwei | 6e756826f7 | |
谢思 | 684f9dbfe1 | |
谢思 | 9577478e97 | |
caishi | ff9beb0949 | |
caishi | f4055e50e2 | |
caishi | af8a5058b8 | |
xxq250 | efb918e21d | |
caishi | a9a3f9c977 | |
caishi | d6b0eee067 | |
xxq250 | ca409857bb | |
何童崇 | 219590a0cd | |
caishi | 2f88227388 | |
caishi | a3b943f744 | |
caishi | 8b4fc88b1d | |
caishi | 131d8fa81c | |
xxq250 | 3c2e899a20 | |
caishi | 07511efbd6 | |
caishi | 3eaf1dc214 | |
caishi | 9608f204e8 | |
xxq250 | 534a6bdeab | |
谢思 | ca5c279ac0 | |
谢思 | ce3b460717 | |
xxq250 | 1c87cf6b98 | |
caishi | 614f0ea436 | |
xiaoxiaoqiong | a3ae80aa22 | |
baladiwei | 70f9cd0997 | |
谢思 | fa247e39bf | |
caishi | 97a81572a9 | |
caishi | e084b015cf | |
xiaoxiaoqiong | cbe427a114 | |
xiaoxiaoqiong | f842f75065 | |
caishi | c8eed99f5d | |
xxq250 | fbd4273603 | |
caishi | 9299a1667e | |
baladiwei | 10c9891b7b | |
谢思 | e5f8eac497 | |
caishi | 633dee9655 | |
starlee | e7b7d20f94 | |
xxq250 | 801c544f65 | |
hucong | 5a1fcb1443 | |
谢思 | cf1d2dd5ba | |
谢思 | 121b1aaab1 | |
谢思 | 3e42a620d9 | |
hucong | 33297226ea | |
谢思 | 982536b547 | |
hucong | fd4046af04 | |
hucong | 36683ad69b | |
hucong | 2262508777 | |
谢思 | 4f64b840b0 | |
谢思 | a04b8de39e | |
谢思 | 4d99c97370 | |
谢思 | 58f7c984a2 | |
hucong | 9db8455de8 | |
谢思 | 4b1bccd1cd | |
jasder | eff12234fa | |
谢思 | 77fdafd58b | |
谢思 | 5fea412ca8 | |
yystopf | 5f15b03462 | |
caishi | a2f63732cf | |
caishi | abf9b25651 | |
谢思 | bf4ef7023d | |
谢思 | f463b20de7 | |
谢思 | 7934f07cea | |
caishi | f19a9f6ceb | |
caishi | 8b5e159cac | |
caishi | 16dff252c0 | |
谢思 | fe0fab7b61 | |
谢思 | 4e18d13b6b | |
谢思 | d81d456d76 | |
jasder | 8c66d817b5 | |
jasder | 7579dc8a59 | |
谢思 | 3087e5471a | |
谢思 | 4e8f304262 | |
谢思 | 48e9ca6706 | |
谢思 | fc8a476aa3 | |
jasder | 89773b5036 | |
谢思 | 387387108a | |
hucong | 2617831a9f | |
hucong | f0747eab05 | |
caishi | 789e84211c | |
谢思 | 12ce0aa4f5 | |
jasder | 4a322d1e2e | |
谢思 | a38b4af8bc | |
jasder | d1743b350d | |
baladiwei | 7fd790fe7d | |
谢思 | c48e3584c3 | |
谢思 | d0ca09e780 | |
baladiwei | ed3bf55f90 | |
谢思 | 7ff29fec70 | |
谢思 | 79331db271 | |
hucong | fbfd5f175d | |
hucong | 07101f5770 | |
yystopf | 652de9b441 | |
caishi | f2a660d595 | |
jasder | 711c2e57da | |
caishi | 6fc441d7c5 | |
谢思 | a94d02bb8a | |
谢思 | cc2dd35ff4 | |
谢思 | f003a99779 | |
caishi | b4e2c6148a | |
谢思 | b1ead191a6 | |
caishi | 0735968e73 | |
caishi | 37f5bce087 | |
caishi | 951792dc11 | |
caishi | 7d7f265ffb | |
jasder | 7495c54f8d | |
jasder | 631f8ceeea | |
jasder | d70ddfb2f7 | |
jasder | 54741a6d8a | |
jasder | 116c3e531f | |
谢思 | 990cfe2781 | |
谢思 | 66e1235c3b | |
谢思 | 76fdff6737 | |
谢思 | 55a6f93fe3 | |
谢思 | 4bc79b5153 | |
谢思 | ac4488a907 | |
caishi | 3085e40426 | |
jasder | ea979b78ee | |
hucong | b1775e5158 | |
hucong | 3678b8eb72 | |
谢思 | 12d8f5bf5d | |
hucong | e04fb11194 | |
hucong | 010edf3cb2 | |
jasder | ab26a528b6 | |
jasder | 6d39e25667 | |
caishi | a2ea832208 | |
caishi | d1bc3680b9 | |
caishi | 08416390e5 | |
hucong | 190200d1e6 | |
hucong | b124364203 | |
谢思 | 2078a044b6 | |
caishi | 35c2f63c55 | |
caishi | 30c61f0a7d | |
caishi | 743dabd553 | |
caishi | 015296e065 | |
jasder | 48c21ac245 | |
caishi | a93b8a08c9 | |
jasder | 1c48ffb130 | |
jasder | 0ee9280bb1 | |
jasder | e785e9a358 | |
jasder | b3b95e9856 | |
caishi | 5be8ead356 | |
jasder | 7d78919c4a | |
jasder | d5b4c5425f | |
caishi | f259f05cdc | |
jasder | 95cd289373 | |
jasder | e739f5b786 | |
caishi | c79be9a597 | |
jasder | fb03565a25 | |
jasder | 7ec53a246c | |
jasder | 56946f94e8 | |
caishi | 61ee3fe36f | |
caishi | d5f989bbe2 | |
caishi | f5817e5150 | |
caishi | 1c24baf3b9 | |
caishi | 3d3ef19d4a | |
jasder | 7b77c46915 | |
hucong | 746f552a21 | |
hucong | 7872d5ecab | |
hucong | 60da6bd110 | |
caishi | a3bbf6b1c1 | |
caishi | d37709b1a5 | |
hucong | aeff357660 | |
hucong | 0e6cb3954a | |
hucong | ae12618c0c | |
谢思 | 1c46617144 | |
谢思 | ec133a6880 | |
谢思 | bcdb631c20 | |
谢思 | 8021d96cd8 | |
jasder | 3bf9de2d4c | |
jasder | 6be0d12e8c | |
caishi | b000fc11f3 | |
caishi | 914966bd39 | |
caishi | f89f4b6628 | |
jasder | 7407545d1f | |
caishi | f0ffc9a29c | |
jasder | 987eb39681 | |
caishi | 848109afe8 | |
caishi | d7bdb35bb7 | |
caishi | 254b3173d1 | |
caishi | 44f06b7305 | |
jasder | b16e95923a | |
jasder | 98a7f73c04 | |
jasder | a0fa4eccf0 | |
jasder | d81b40969a | |
jasder | b6a450a482 | |
jasder | 9f4069fc6a | |
jasder | 257519f98b | |
jasder | 0c180ace32 | |
jasder | b703c27d44 | |
jasder | fe2318021e | |
jasder | 8f9e9b0152 | |
jasder | cde55c1b3c | |
jasder | 0f0130742e | |
jasder | 66c495d6b5 | |
caishi | 42139ef998 | |
jasder | 925d5ea356 | |
jasder | ad1f0e29e7 | |
jasder | 12f97cce62 | |
jasder | 2f90ccab3c | |
谢思 | 3498390974 | |
谢思 | 035296732a | |
谢思 | cc62bde5b4 | |
谢思 | 4f3e385f78 | |
jasder | 5ef02c698d | |
caishi | 13c58faad8 | |
谢思 | 6435b09982 | |
谢思 | a0081bf3b1 | |
谢思 | 18b289b84c | |
jasder | a542ed3dcd | |
caishi | 057881097d | |
caishi | d47c725b96 | |
jasder | be3e2b6936 | |
caishi | 76c2d205eb | |
caishi | 2c867f9856 | |
caishi | 7b74564ecc | |
jasder | b31503ee0d | |
jasder | eadec88e0c | |
谢思 | 31af77e704 | |
谢思 | 6ff27a559f | |
谢思 | fe1bacb984 | |
谢思 | 573ec813a6 | |
谢思 | 11b92ac52b | |
jasder | e992849723 | |
jasder | 0c52ea22a7 | |
谢思 | b6b19eabe9 | |
jasder | edbd47ea0f | |
caishi | 644e3c3f73 | |
caishi | e7a322e038 | |
谢思 | a2c5c1ea6f | |
caishi | dfa9b3d835 | |
谢思 | e3f49db5c0 | |
jasder | e744714da0 | |
jasder | 14df994cd6 | |
caishi | e9546951c9 | |
caishi | 9de7ac7c90 | |
baladiwei | 3e3e9f3681 | |
jasder | 4b2651339b | |
jasder | 4b9cc26d9c | |
谢思 | 66108083fd | |
caishi | adfd2ae66c | |
jasder | f78eecd775 | |
caishi | b30f2169e4 | |
caishi | 8ace7da3a7 | |
caishi | 35110b7db4 | |
谢思 | 4add266047 | |
caishi | 95050bb3bd | |
jasder | f97c90f20e | |
caishi | afd2cec4f2 | |
caishi | 0903edfd2c | |
谢思 | 4a6012bfa9 | |
caishi | 1aa6c05869 | |
jasder | 94fd500423 | |
jasder | 90cfac4436 | |
caishi | db2c3b707a | |
caishi | bb1175de01 | |
jasder | c45a6ffe1a | |
caishi | c0f2c77e1a | |
caishi | c386bcf5e7 | |
jasder | 0b4baa1d03 | |
jasder | c0afc7a052 | |
hucong | 1826c1923f | |
caishi | 76d8c4b67a | |
caishi | fbbb3c3aa6 | |
jasder | 2f06288507 | |
hucong | 47b6c3d948 | |
hucong | f6b59e0a3a | |
hucong | bb6fe08c54 | |
jasder | a7283b5567 | |
hucong | 05eb0367ba | |
caishi | 3ca38e76a1 | |
hucong | 7b180560a6 | |
hucong | 17cf0412cd | |
jasder | f65781b49b | |
谢思 | 7fe88aa4d9 | |
jasder | 82d8a0d198 | |
caishi | 0d7805fc9d | |
jasder | 68b34ab418 | |
caishi | 5223a84dac | |
jasder | 4afb131aef | |
谢思 | 5d19f6c06b | |
baladiwei | a4902739f2 | |
yuzhantian | bfcf714822 | |
巴拉迪维 | fc305ae952 | |
baladiwei | 095e27fcc3 | |
谢思 | 5c819070bb | |
yuzhantian | 8e3bd741cb | |
谢思 | bc6ef583fb | |
jasder | baba177244 | |
谢思 | 38c553d87c | |
谢思 | b268b540d8 | |
baladiwei | de79518e0d | |
谢思 | a7c2120cf3 | |
谢思 | 8dcc6c6d59 | |
谢思 | 7e69c64c9c | |
谢思 | 85ef26f70e | |
caishi | fe4c5a79d2 | |
谢思 | 8c7865d2c1 | |
yuzhantian | fd21cc6d00 | |
jasder | 2fc59748b4 | |
jasder | 2060e28ca2 | |
caishi | 94ceec26e9 | |
jasder | e5787e3e66 | |
jasder | 8ae34b8f32 | |
caishi | 6244ad3323 | |
caishi | 1fbe6671b1 | |
hucong | cda7311fa1 | |
jasder | 4c25aed9a0 | |
caishi | b578383e8d | |
jasder | d05829ac80 | |
hucong | e726ba40ea | |
baladiwei | 279d358be9 | |
yuzhantian | 50f785bf42 | |
yuzhantian | a09d330a7e | |
谢思 | 9812761b47 | |
jasder | c037712b3e | |
谢思 | 19b7381120 | |
谢思 | 999a15761d | |
jasder | a54f1b6e1a | |
hucong | 8b186467a4 | |
jasder | 4902a26646 | |
caishi | c282a1e034 | |
hucong | 112aacb6a1 | |
jasder | 0a81bc6e6e | |
hucong | 1406b30a54 | |
hucong | fd58c70c54 | |
jasder | 8cb0e32afa | |
caishi | 6837be3104 | |
hucong | 539fa64358 | |
hucong | 63a74cc076 | |
hucong | 1c5b5a66d8 | |
jasder | 898e3f3256 | |
谢思 | bcbd915bd1 | |
jasder | 1ed49e7221 | |
谢思 | 5bbec01c1c | |
谢思 | 8bdd619dde | |
caishi | 82f6e03ca7 | |
baladiwei | e04496f662 | |
谢思 | ed548d16e8 | |
谢思 | 66c5662d01 | |
caishi | 9e390cf878 | |
caishi | cd30082956 | |
jasder | 7a8540045b | |
jasder | 8a6ed077d1 | |
caishi | 9600d52a80 | |
caishi | 07049cbbc6 | |
谢思 | 208c1de930 | |
谢思 | 873ab992bc | |
jasder | 4e3215c6f9 | |
caishi | b0d1379281 | |
caishi | 7a50c73040 | |
jasder | 92fb98e303 | |
hucong | 8e1fb80f96 | |
hucong | 825cee4eac | |
hucong | dcb597ea37 | |
jasder | dc6bad6b3e | |
谢思 | 756e3f0416 | |
caishi | 7130a05b23 | |
caishi | 08b5f7edc0 | |
jasder | 26d1b2edc8 | |
hucong | f6c5fd7550 | |
jasder | 860f52e7e1 | |
谢思 | 1b9602df77 | |
谢思 | 5c2330512e | |
jasder | 1684e5c04f | |
谢思 | d7ab95eccc | |
yuzhantian | 5a88a1a4e6 | |
jasder | a489271a2f | |
jasder | c73b1c9e29 | |
谢思 | 9be6116cb8 | |
jasder | 170977432e | |
caishi | bc158891e7 | |
caishi | 68caf0751e | |
yuzhantian | 8a8f8693fe | |
yuzhantian | da7ff8c749 | |
jasder | aa0280d57a | |
jasder | 9b4f1b7cd9 | |
caishi | 6f57261c85 | |
caishi | c2f0462811 | |
caishi | 078a453dcf | |
jasder | 3be536d37a | |
jasder | 256ab53e90 | |
caishi | bdf6c7afe4 | |
caishi | e9619542ea | |
jasder | e7b977cc6b | |
caishi | f0778614ba | |
caishi | 4a5d4ea288 | |
jasder | 843b8f2894 | |
谢思 | 5195f22f00 | |
谢思 | 5c529e6521 | |
caishi | 202cec92e9 | |
jasder | 58287f488f | |
hucong | fb05890701 | |
hucong | f989e62702 | |
caishi | 15b02d9d08 | |
caishi | bba4745381 | |
jasder | 2b5443d74c | |
谢思 | 0ad1af9f51 | |
谢思 | 633a540fe7 | |
谢思 | e0c8552c1e | |
jasder | 63dc5b5572 | |
jasder | aaea118d65 | |
hucong | 5dedc2d6bc | |
caishi | b226495277 | |
hucong | 299c0d4abe | |
hucong | 1a393d8e9f | |
hucong | 1ee20877ec | |
caishi | 766c6ea68b | |
caishi | 7b4e7d3542 | |
jasder | 0080a07734 | |
谢思 | a91fb41ef0 | |
jasder | a400046c91 | |
caishi | 437253e2eb | |
caishi | a76ca41446 | |
caishi | 676914cc9d | |
jasder | 9ce86f4102 | |
caishi | a6675d6c3f | |
caishi | dfd7d9f03f | |
jasder | 464b9a2be2 | |
谢思 | 30acf6ed34 | |
caishi | 68a5ca9380 | |
baladiwei | 4c0f059ae5 | |
caishi | 0fea52b923 | |
caishi | 5b2198ce4c | |
baladiwei | 29ced2aded | |
hucong | 7a06e21933 | |
谢思 | 3d3c0b5095 | |
jasder | 6d1b410ba1 | |
谢思 | 71670f1214 | |
谢思 | b7fe034faf | |
jasder | 030c6ad61f | |
hucong | 0b3444b37e | |
jasder | 4db06a9fd7 | |
caishi | 1a5f81887a | |
caishi | d51bea4928 | |
caishi | 11053da351 | |
jasder | 0629d87a9f | |
jasder | 4ad7042a93 | |
谢思 | c42d249fd9 | |
caishi | 3da9306ed6 | |
hucong | 08047fb002 | |
jasder | 20c0f76043 | |
谢思 | 5726969431 | |
谢思 | 9ebdbec859 | |
谢思 | 1750544c0d | |
谢思 | 30512cb4f4 | |
caishi | 568a632d65 | |
caishi | 5982c0df96 | |
jasder | 9be808e37f | |
caishi | 27f62f4455 | |
baladiwei | f34b8f8756 | |
jasder | f23d00167e | |
何童崇 | dd62dd1704 | |
jasder | 21046bbcb7 | |
谢思 | 68b1e0c704 | |
jasder | 79f486dcd2 | |
谢思 | fc26e362d0 | |
谢思 | 79afad5006 | |
jasder | e2b2836a87 | |
caishi | 0c816805fb | |
jasder | 9e322cff79 | |
jasder | 8818bafad2 | |
durian | 28bc235b0b | |
谢思 | 50627aba6b | |
hucong | 89bfb3a986 | |
baladiwei | a64887d420 | |
durian | cd3a82195b | |
谢思 | 7d3c6bd4f5 | |
谢思 | aaf6bcb320 | |
谢思 | 73ca563a0f | |
durian | 724c110437 | |
谢思 | ca7ab2ebe0 | |
durian | e0a5e4348e | |
谢思 | e5bb8d10b2 | |
谢思 | 3b3cc7f639 | |
谢思 | 44d529e867 | |
谢思 | 55f3bc6201 | |
谢思 | 26de781181 | |
谢思 | 295d0dbe5c | |
谢思 | 1402029bfe | |
谢思 | 5d83c85b2d | |
caishi | 28f8b6b54c | |
caishi | 7d087ec1f2 | |
jasder | beba8975ca | |
谢思 | d91d4e5ef8 | |
谢思 | c70c3f9a7a | |
baladiwei | f208972bb8 | |
durian | 2777ebcda2 | |
谢思 | a80a20ef6e | |
谢思 | ab351fd8f8 | |
谢思 | 3a816ce5e5 | |
谢思 | abc04a28a7 | |
谢思 | 9d6235b08c | |
谢思 | 4079765edb | |
durian | 76ffd0e8b9 | |
谢思 | 975dfad4aa | |
jasder | 465ae57b07 | |
caishi | d4690cc8b5 | |
谢思 | e1372fdd02 | |
何童崇 | 628606480a | |
tongChong | cd949d4f2a | |
谢思 | 78014b02bf | |
何童崇 | a299b9a841 | |
caishi | 38021c2e4b | |
yystopf | bcde15cec1 | |
caishi | 23b423a32d | |
caishi | 4233811ae3 | |
tongChong | 993b1bde40 | |
谢思 | d45e87d46f | |
谢思 | cdc2ca755e | |
何童崇 | d7242f0fa1 | |
yystopf | a1c8440fe2 | |
caishi | 6cfb56e6ca | |
caishi | 8273acd195 | |
caishi | a5c3cd168e | |
何童崇 | 44dc10ff8c | |
tongChong | 0d9d9887f4 | |
谢思 | def926bff0 | |
谢思 | 94a7cf1e6c | |
caishi | 09a75bc77c | |
caishi | 25186132f2 | |
何童崇 | 7e683ac6bb | |
tongChong | 7cf0ae4e67 | |
谢思 | 0462b28abf | |
何童崇 | ff1ffc120f | |
yystopf | 7158eca4f6 | |
caishi | 917374ba11 | |
caishi | f6ec470070 | |
caishi | 0b2a5a910b | |
tongChong | 23ccaadba2 | |
谢思 | 4bb1b8d538 | |
何童崇 | 06314a51a6 | |
何童崇 | 49fad4b8bc | |
tongChong | 4e8657357f | |
谢思 | dcbba90c18 | |
谢思 | ec65ac3cef | |
谢思 | 49c66c73a7 | |
谢思 | 6ca0e48697 | |
何童崇 | 52c5187d0e | |
tongChong | 6430ed76a6 | |
谢思 | c1ea865f1e | |
tongChong | 480fcc1f8e | |
谢思 | ee6a40a5d9 | |
谢思 | aaa58e532b | |
何童崇 | ebf927dc46 | |
tongChong | 9b6ad6340f | |
谢思 | f6a98e4169 | |
谢思 | 9050c5ca2b | |
何童崇 | 71438d1030 | |
何童崇 | 0e31deb88c | |
谢思 | d55242f7e8 | |
tongChong | 9852bb14c3 | |
谢思 | c0a4432c18 | |
谢思 | 9ea8ec422d | |
谢思 | 7fbd76630c | |
何童崇 | bc11ac3d79 | |
谢思 | c5bb61cb9a | |
谢思 | f30903072e | |
谢思 | dabe7d6551 | |
caishi | 5c81abb253 | |
tongChong | 3598225cac | |
谢思 | 1b21d9e3fb | |
jasder | 875d715e58 | |
jasder | 4eae7e68b8 | |
jasder | 3f33e03549 | |
jasder | c3546a66cd | |
谢思 | 4795de938e | |
caishi | 8c0757c942 | |
caishi | 41af42ce6f | |
caishi | 0ffa5e0cae | |
caishi | 747ae8ccd5 | |
jasder | 6eb9108aa7 | |
caishi | 828de5d770 | |
caishi | 007feded68 | |
jasder | 5f90b85c1d | |
caishi | f1a4f7c68f | |
jasder | 98ca09e64b | |
caishi | 3e9c9ea6d1 | |
caishi | 3a16c4be8a | |
caishi | 81623b38f7 | |
caishi | 06f3eacb9d | |
caishi | 93736781c5 | |
hc1913847458 | 5bfb6ee4c1 | |
jasder | baf9a3f4a8 | |
caishi | eb89f6a6a7 | |
caishi | a24132412e | |
caishi | d558443c22 | |
tongChong | 495e11fb4c | |
谢思 | c477fbe89a | |
谢思 | e07e435557 | |
caishi | a4475e995b | |
caishi | e0aeab0e20 | |
谢思 | 8e17efb9c6 | |
hc1913847458 | ef7cc1ebd6 | |
hc1913847458 | 9e1ce515a8 | |
hc1913847458 | 1e1f2a0e2f | |
hc1913847458 | 19afa410b1 | |
hc1913847458 | fbb73968c9 | |
caishi | 0768ab2970 | |
caishi | 46e8135585 | |
hc1913847458 | 540553199a | |
jasder | 1c8ad3dc60 | |
hc1913847458 | b3c9eb3c33 | |
caishi | 64b1c51fad | |
何童崇 | 22b5859b62 | |
hc1913847458 | e0d1de7a53 | |
jasder | fc274f09e9 | |
hc1913847458 | f8075ccb2f | |
caishi | 46c604bf92 | |
caishi | daf81be4f6 | |
caishi | 030c779103 | |
jasder | 3c5c4266cd | |
hc1913847458 | 94fbc972be | |
tongChong | ca51702799 | |
谢思 | e721399e17 | |
何童崇 | 244881f142 | |
谢思 | b6cf496efa | |
何童崇 | 6665a15aa3 | |
何童崇 | a667f41ec1 | |
hc1913847458 | 5424973c52 | |
tongChong | 258de069e4 | |
谢思 | cb58481daf | |
jasder | 548cdee35b | |
caishi | 488d04284c | |
hc1913847458 | 01f1a5c68c | |
hc1913847458 | 6f80d439c3 | |
hc1913847458 | 6696222c02 | |
hc1913847458 | 4acfb88ee5 | |
hc1913847458 | 97e6a5d5f2 | |
hc1913847458 | b26f300832 | |
hc1913847458 | 349851dc59 | |
hc1913847458 | 09e9f01f7e | |
hc1913847458 | da657e559b | |
caishi | 53fa18907d | |
hc1913847458 | 9d4893eb49 | |
caishi | 6e849aa800 | |
caishi | 194f6af412 | |
caishi | d5652fba18 | |
caishi | fbe5da1014 | |
caishi | 478b080d45 | |
caishi | dcef7e7872 | |
caishi | 2882289267 | |
caishi | 37f608cdb8 | |
caishi | 984856a29c | |
caishi | cbfb73d1cb | |
caishi | 411b4e9de6 | |
hc1913847458 | b611308f3c | |
jasder | 154225d229 | |
baladiwei | c859a16837 | |
何童崇 | 33a669a940 | |
jasder | 7b2d842ac2 | |
何童崇 | 245086cf47 | |
何童崇 | a90eeac318 | |
何童崇 | 1764fbdb88 | |
caishi | 22ccc3c974 | |
jasder | 46f83ed44d | |
jasder | 657bfbc6df | |
jasder | 7e1dde4ecd | |
caishi | 3d6136bbbb | |
jasder | b6ed5d79e7 | |
caishi | 21ce83e537 | |
jasder | 03a8e79382 | |
caishi | 3fce9a99ad | |
caishi | db18cd41b0 | |
caishi | 7fb7dbe687 | |
jasder | 5e58f349cd | |
何童崇 | 4e08bf6fe3 | |
caishi | bc8e513b97 | |
caishi | 4621a75ec8 | |
何童崇 | 17671a7c87 | |
jasder | 47ecda06ca | |
何童崇 | ebd94ed3a1 | |
caishi | d1128a0dfc | |
baladiwei | 47f5d98d79 | |
何童崇 | a5bdf26f96 | |
何童崇 | f6a0c3b33f | |
jasder | 9d2dc3426c | |
caishi | 5abe75d637 | |
何童崇 | 9e14821125 | |
jasder | 2f3f33d58e | |
caishi | 43b31427d8 | |
何童崇 | 03d568f5f7 | |
何童崇 | 24c4c746cd | |
jasder | 3fc0737e43 | |
何童崇 | 4f39f03b19 | |
caishi | b475edae74 | |
caishi | dbb5efdcd5 | |
caishi | 322260c3fc | |
caishi | 375ad38364 | |
baladiwei | ef6f334d94 | |
何童崇 | 559b797c2e | |
caishi | adc134ec44 | |
caishi | bf3f404238 | |
jasder | 9b62b3b047 | |
caishi | c14f06301f | |
caishi | 105e1c61b8 | |
何童崇 | 80dde2bc97 | |
caishi | 3b03ead3af | |
caishi | 86f50d4278 | |
baladiwei | bddc0f2f91 | |
何童崇 | 30a141c92e | |
caishi | 58115f8dae | |
baladiwei | 9655cd5105 | |
何童崇 | 01b3ee8d49 | |
何童崇 | 662a758980 | |
何童崇 | 0b64631222 | |
何童崇 | eb02b814a9 | |
baladiwei | ca9a606e53 | |
baladiwei | 8adf7f8de6 | |
何童崇 | 349c2a6f35 | |
baladiwei | f096d6db6e | |
何童崇 | 492e8e067f | |
baladiwei | 95ae2bbd46 | |
caishi | a1b5395b8c | |
caishi | dee7b23f3e | |
caishi | f7dd67d41a | |
caishi | e7fd980116 | |
caishi | d8ab7c0759 | |
caishi | d64eb738f7 | |
jasder | 55080f93c1 | |
何童崇 | e606147d03 | |
caishi | 7851785335 | |
何童崇 | 52e08e77e5 | |
baladiwei | fcac8c782a | |
caishi | 061fa0ee71 | |
caishi | 5d465ec782 | |
baladiwei | 39fef1ce3c | |
caishi | 0d0b164370 | |
caishi | ec84ed56b0 | |
caishi | 466ed1fe1b | |
caishi | 9b101403a1 | |
何童崇 | d1a3c7b9c3 | |
何童崇 | ba263a28f1 | |
jasder | fb872f3a3d | |
何童崇 | 19ef012a0e | |
jasder | b3d62b9cf1 | |
何童崇 | d988c4ea5f | |
caishi | 313f1edc71 | |
caishi | 8adc662e9b | |
何童崇 | ff75065a0a | |
何童崇 | 6e74f88d9e | |
caishi | 6beb4c2c8a | |
何童崇 | e8dadb187b | |
caishi | 3a1fd14e7c | |
caishi | 20f64bdf81 | |
caishi | 2347d04710 | |
caishi | d13d94e9cf | |
caishi | 3294d99516 | |
caishi | 00402ef13d | |
caishi | 8f2df90555 | |
caishi | 7530d3f9c4 | |
caishi | 001cb8da53 | |
caishi | d09e6e2bc6 | |
caishi | e2ad3b1308 | |
caishi | 14f80d56ad | |
caishi | 65e7025035 | |
hc1913847458 | aa786f0cf0 | |
hc1913847458 | 2aad9c67f5 | |
hc1913847458 | b7869e5203 | |
hc1913847458 | b238bb51ca | |
hc1913847458 | de636eed6d | |
caishi | 4bde5da97c | |
caishi | f944ebad6f | |
hc1913847458 | ad7ab189b1 | |
caishi | 5140bfbe77 | |
caishi | affbe87dfd | |
caishi | dd1beb3116 | |
caishi | d67862156c | |
caishi | c9802c26a4 | |
caishi | 47365c0bed | |
caishi | 4ec840f252 | |
caishi | b1ec068663 | |
caishi | 44a8f806e0 | |
caishi | 51d34a7667 | |
caishi | 9408ad7dcb | |
caishi | 2b47c1ff9a | |
caishi | f7698334ab | |
caishi | 810ea37bed | |
caishi | f100875b0f | |
caishi | 6679fe8a48 | |
caishi | 4f9f5649a9 | |
caishi | d31b932efe | |
caishi | f90243243f | |
caishi | 7a5db58a03 | |
caishi | 0889ee69c5 | |
caishi | 876ee66a05 | |
caishi | cb514315a6 | |
caishi | c5b729038c | |
caishi | a6d713d1f6 | |
caishi | ee1217e171 | |
caishi | 967ff385aa | |
caishi | e6e0546e27 | |
caishi | 1bb339bfb1 | |
caishi | 07852b204c | |
caishi | 275b7d2015 | |
caishi | 9e9e4c07bf | |
caishi | 934ac61b77 | |
caishi | f854d2164c | |
caishi | 95091d0e08 | |
caishi | e48628389e | |
caishi | e31ff9bdf3 | |
caishi | 62b9abedbb | |
caishi | f97ca92e41 | |
caishi | 84bbf5fd52 | |
caishi | ff60cf11e1 | |
caishi | 45f188e6f4 | |
caishi | 4b832f40c0 | |
caishi | eba6ed0876 | |
caishi | db682ace86 | |
caishi | 1cdf316852 | |
caishi | 777dbd0f43 | |
caishi | 79996bd185 | |
caishi | 2d312b6176 | |
caishi | b44b6530e5 | |
caishi | bad4f79a0c | |
caishi | fad42414dc | |
caishi | c10799b6d0 | |
caishi | b808bcee99 | |
caishi | cb95e50a82 | |
caishi | 5eaebd4e42 | |
caishi | e9badf0d7c | |
caishi | e72e817bb1 | |
caishi | b5835145f7 | |
caishi | d4e1b2f414 | |
caishi | f4b3afde6a | |
caishi | 5806f60491 | |
caishi | 8298aef72f | |
caishi | 7ed8d1c8c3 | |
何童崇 | 1d274985ca | |
caishi | c0f7c489fb | |
何童崇 | 71d1eb57cc | |
caishi | 56434a9714 | |
caishi | 8b161630c3 | |
何童崇 | 405053696c | |
caishi | 3dffbce8d9 | |
caishi | 63e9cfe394 | |
何童崇 | b38cdd4bb3 | |
caishi | cacb8c84ae | |
何童崇 | 681d0b17e3 | |
caishi | fb8ae3fcdf | |
caishi | a257d832cb | |
caishi | ff7d191011 | |
caishi | 9a2c3f1754 | |
caishi | bcdf506e6c | |
caishi | ccc6cb5d26 | |
caishi | 0661c6b932 | |
caishi | b5fa231adf | |
caishi | 39f0a165b6 | |
caishi | 2157f2ffe5 | |
caishi | 7c40f9be36 | |
caishi | 93694594c4 | |
caishi | 99947c0c87 | |
caishi | 03cff6ec2e | |
caishi | f86acfebdf | |
caishi | 9a62d7806e | |
caishi | a7df6da5f0 | |
caishi | eab68ac270 | |
caishi | a9e3513706 | |
caishi | 6b20391c72 | |
caishi | 32299252ad | |
caishi | a12ab04ec0 | |
何童崇 | f93df6069c | |
何童崇 | ff2586f5b9 | |
caishi | b7613584f9 | |
caishi | bc64cbb415 | |
caishi | 0b7d6ab5fd | |
caishi | 3d764d3075 | |
caishi | 3cd51d1c72 | |
caishi | 40f8f5d872 | |
caishi | e185ae6484 | |
caishi | 0bfa7572a5 | |
caishi | fd19a43168 | |
何童崇 | dd9c11dbd9 | |
何童崇 | 695d5e4f50 | |
何童崇 | b88c5b1faf | |
caishi | 975d49b80b | |
caishi | 4b6592dfb3 | |
caishi | 1432afebfd | |
caishi | a9285f37e7 | |
caishi | d41dce26b1 | |
caishi | 7bbda5f65d | |
caishi | fa169b27cd | |
caishi | 0274cf84ee | |
caishi | 8e419e63da | |
caishi | 1378ba5c93 | |
caishi | 3e0814344f | |
caishi | ae9b48953e | |
caishi | eb58f91dbf | |
caishi | 3453aa31eb | |
caishi | ebf75ed433 | |
caishi | a1bd41795a | |
caishi | 513255428c | |
caishi | 09bf75c6c3 | |
caishi | 70af7dae5f | |
caishi | 3135300fe6 | |
caishi | d029840874 | |
caishi | 303e06586e | |
nigel007 | 01d3972d3e | |
nigel007 | 36691c25a4 | |
nigel007 | 95bc2d7e3e | |
nigel007 | c52fa2e79f | |
nigel007 | c7da648ae8 | |
caishi | 7ccc1221ef | |
caishi | 6a6f0ca784 | |
caishi | b70dd5928e | |
caishi | 8baf2cb49c | |
caishi | ecc6387113 | |
caishi | 990c4e22b0 | |
caishi | 7eea9316dd | |
caishi | 6a546c79e4 | |
caishi | 4c48b6c77a | |
caishi | 4d5430c3ed | |
caishi | d49af735f1 | |
caishi | 03370e8a07 | |
caishi | 0b43fa8952 | |
caishi | 465c4cc8c7 | |
caishi | 37668ddcd4 | |
caishi | 7102594444 | |
nigel007 | fe681a07d9 | |
nigel007 | 21762c21eb | |
caishi | b2f2df65bb | |
caishi | 8a577fb263 | |
caishi | 5c491071b6 | |
caishi | c554237076 | |
caishi | d22a741bf7 | |
caishi | 383b3f5d74 | |
caishi | 63da7adcf9 | |
caishi | 3243aeebc6 | |
caishi | 1a86a75345 | |
caishi | 3b6cc99d49 | |
caishi | d872ffc606 | |
caishi | 3b69c01ead | |
caishi | 1e0608aa14 | |
caishi | 9b6816e346 | |
caishi | 6ee257231d | |
caishi | 70edb73f6c | |
caishi | 5c7553d4aa | |
caishi | 278701f24b | |
caishi | 97ab819bf9 | |
caishi | d870f17b85 | |
caishi | 91ac6c2357 | |
caishi | 3702d1c1a5 | |
caishi | 93d48c359e | |
caishi | 80dace18e9 | |
caishi | 375cbb37df | |
caishi | 10d933e037 | |
caishi | 4fdd3f6f80 | |
caishi | 458b56e33b | |
caishi | c256887132 | |
caishi | 6a588db7f6 | |
caishi | 6c4e1c6665 | |
caishi | c554d2c00d | |
caishi | b69bf5974a | |
caishi | ecb1691b4d | |
caishi | 6a9f2b31a6 | |
caishi | 4947cd8456 | |
caishi | 8429effe16 | |
caishi | 49ebe450be | |
caishi | e3c926da77 | |
caishi | af48da2eb3 | |
caishi | 6630309466 | |
caishi | a7c3dee7e3 |
|
@ -1,3 +1,4 @@
|
||||||
|
.idea/
|
||||||
# Logs
|
# Logs
|
||||||
logs
|
logs
|
||||||
*.log
|
*.log
|
||||||
|
@ -37,7 +38,7 @@ bower_components
|
||||||
|
|
||||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
build/
|
build/
|
||||||
|
src/.umi/
|
||||||
# Dependency directories
|
# Dependency directories
|
||||||
node_modules/
|
node_modules/
|
||||||
jspm_packages/
|
jspm_packages/
|
||||||
|
|
1450
.idea/workspace.xml
|
@ -0,0 +1,2 @@
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,124 @@
|
||||||
|
木兰宽松许可证, 第2版
|
||||||
|
|
||||||
|
2020年1月 http://license.coscl.org.cn/MulanPSL2
|
||||||
|
|
||||||
|
您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束:
|
||||||
|
|
||||||
|
0. 定义
|
||||||
|
|
||||||
|
“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。
|
||||||
|
|
||||||
|
“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。
|
||||||
|
|
||||||
|
“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。
|
||||||
|
|
||||||
|
“法人实体” 是指提交贡献的机构及其“关联实体”。
|
||||||
|
|
||||||
|
“关联实体” 是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。
|
||||||
|
|
||||||
|
1. 授予版权许可
|
||||||
|
|
||||||
|
每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。
|
||||||
|
|
||||||
|
2. 授予专利许可
|
||||||
|
|
||||||
|
每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。
|
||||||
|
|
||||||
|
3. 无商标许可
|
||||||
|
|
||||||
|
“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。
|
||||||
|
|
||||||
|
4. 分发限制
|
||||||
|
|
||||||
|
您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。
|
||||||
|
|
||||||
|
5. 免责声明与责任限制
|
||||||
|
|
||||||
|
“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。
|
||||||
|
|
||||||
|
6. 语言
|
||||||
|
|
||||||
|
“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。
|
||||||
|
|
||||||
|
条款结束
|
||||||
|
|
||||||
|
如何将木兰宽松许可证,第2版,应用到您的软件
|
||||||
|
|
||||||
|
如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步:
|
||||||
|
|
||||||
|
1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字;
|
||||||
|
|
||||||
|
2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中;
|
||||||
|
|
||||||
|
3, 请将如下声明文本放入每个源文件的头部注释中。
|
||||||
|
|
||||||
|
Copyright (c) [Year] [name of copyright holder]
|
||||||
|
[Software Name] is licensed under Mulan PSL v2.
|
||||||
|
You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||||
|
You may obtain a copy of Mulan PSL v2 at:
|
||||||
|
http://license.coscl.org.cn/MulanPSL2
|
||||||
|
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||||
|
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||||
|
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
|
See the Mulan PSL v2 for more details.
|
||||||
|
Mulan Permissive Software License,Version 2
|
||||||
|
Mulan Permissive Software License,Version 2 (Mulan PSL v2)
|
||||||
|
|
||||||
|
January 2020 http://license.coscl.org.cn/MulanPSL2
|
||||||
|
|
||||||
|
Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions:
|
||||||
|
|
||||||
|
0. Definition
|
||||||
|
|
||||||
|
Software means the program and related documents which are licensed under this License and comprise all Contribution(s).
|
||||||
|
|
||||||
|
Contribution means the copyrightable work licensed by a particular Contributor under this License.
|
||||||
|
|
||||||
|
Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License.
|
||||||
|
|
||||||
|
Legal Entity means the entity making a Contribution and all its Affiliates.
|
||||||
|
|
||||||
|
Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity.
|
||||||
|
|
||||||
|
1. Grant of Copyright License
|
||||||
|
|
||||||
|
Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not.
|
||||||
|
|
||||||
|
2. Grant of Patent License
|
||||||
|
|
||||||
|
Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken.
|
||||||
|
|
||||||
|
3. No Trademark License
|
||||||
|
|
||||||
|
No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in section 4.
|
||||||
|
|
||||||
|
4. Distribution Restriction
|
||||||
|
|
||||||
|
You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software.
|
||||||
|
|
||||||
|
5. Disclaimer of Warranty and Limitation of Liability
|
||||||
|
|
||||||
|
THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
6. Language
|
||||||
|
|
||||||
|
THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL.
|
||||||
|
|
||||||
|
END OF THE TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software
|
||||||
|
|
||||||
|
To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps:
|
||||||
|
|
||||||
|
Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner;
|
||||||
|
Create a file named "LICENSE" which contains the whole context of this License in the first directory of your software package;
|
||||||
|
Attach the statement to the appropriate annotated syntax at the beginning of each source file.
|
||||||
|
Copyright (c) [Year] [name of copyright holder]
|
||||||
|
[Software Name] is licensed under Mulan PSL v2.
|
||||||
|
You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||||
|
You may obtain a copy of Mulan PSL v2 at:
|
||||||
|
http://license.coscl.org.cn/MulanPSL2
|
||||||
|
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||||
|
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||||
|
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
|
See the Mulan PSL v2 for more details.
|
|
@ -19,7 +19,8 @@ const getClientEnvironment = require("./env");
|
||||||
|
|
||||||
let publicPath = "/react/build/";
|
let publicPath = "/react/build/";
|
||||||
const publicUrl = publicPath.slice(0, -1);
|
const publicUrl = publicPath.slice(0, -1);
|
||||||
const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
|
// const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
|
||||||
|
const shouldUseSourceMap = process.env.NODE_ENV !== "production";
|
||||||
const env = getClientEnvironment(publicPath);
|
const env = getClientEnvironment(publicPath);
|
||||||
|
|
||||||
// This is the production configuration.
|
// This is the production configuration.
|
||||||
|
@ -54,7 +55,8 @@ module.exports = {
|
||||||
},
|
},
|
||||||
bail: true,
|
bail: true,
|
||||||
mode: "production",
|
mode: "production",
|
||||||
devtool: false, //测试版
|
// devtool: false, //测试版
|
||||||
|
devtool: shouldUseSourceMap?'source-map':false,
|
||||||
entry: [require.resolve("./polyfills"), paths.appIndexJs],
|
entry: [require.resolve("./polyfills"), paths.appIndexJs],
|
||||||
output: {
|
output: {
|
||||||
path: paths.appBuild,
|
path: paths.appBuild,
|
||||||
|
|
35
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "forge",
|
"name": "forge",
|
||||||
"version": "0.1.0",
|
"version": "3.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@monaco-editor/react": "^2.3.0",
|
"@monaco-editor/react": "^2.3.0",
|
||||||
|
@ -9,11 +9,12 @@
|
||||||
"antd": "^3.26.15",
|
"antd": "^3.26.15",
|
||||||
"array-flatten": "^2.1.2",
|
"array-flatten": "^2.1.2",
|
||||||
"autoprefixer": "7.1.6",
|
"autoprefixer": "7.1.6",
|
||||||
"axios": "^0.18.1",
|
"axios": "^0.24.0",
|
||||||
"babel-eslint": "7.2.3",
|
"babel-eslint": "7.2.3",
|
||||||
"babel-jest": "20.0.3",
|
"babel-jest": "20.0.3",
|
||||||
"babel-loader": "7.1.2",
|
"babel-loader": "7.1.2",
|
||||||
"babel-plugin-syntax-dynamic-import": "^6.18.0",
|
"babel-plugin-syntax-dynamic-import": "^6.18.0",
|
||||||
|
"babel-polyfill": "^6.26.0",
|
||||||
"babel-preset-react-app": "^3.1.1",
|
"babel-preset-react-app": "^3.1.1",
|
||||||
"babel-runtime": "6.26.0",
|
"babel-runtime": "6.26.0",
|
||||||
"bizcharts": "^3.5.8",
|
"bizcharts": "^3.5.8",
|
||||||
|
@ -21,15 +22,17 @@
|
||||||
"case-sensitive-paths-webpack-plugin": "2.1.1",
|
"case-sensitive-paths-webpack-plugin": "2.1.1",
|
||||||
"chalk": "1.1.3",
|
"chalk": "1.1.3",
|
||||||
"classnames": "^2.2.5",
|
"classnames": "^2.2.5",
|
||||||
"clipboard": "^2.0.6",
|
"clipboard": "^2.0.8",
|
||||||
"code-prettify": "^0.1.0",
|
"code-prettify": "^0.1.0",
|
||||||
"codemirror": "^5.53.0",
|
"codemirror": "^5.64.0",
|
||||||
"connected-react-router": "4.4.1",
|
"connected-react-router": "4.4.1",
|
||||||
|
"cross-env": "^7.0.3",
|
||||||
"css-loader": "^3.5.2",
|
"css-loader": "^3.5.2",
|
||||||
"dompurify": "^2.0.15",
|
"dompurify": "^2.3.3",
|
||||||
"dotenv": "4.0.0",
|
"dotenv": "4.0.0",
|
||||||
"dotenv-expand": "4.2.0",
|
"dotenv-expand": "4.2.0",
|
||||||
"echarts": "^4.7.0",
|
"echarts": "^4.9.0",
|
||||||
|
"echarts-wordcloud": "^2.0.0",
|
||||||
"editor.md": "^1.5.0",
|
"editor.md": "^1.5.0",
|
||||||
"eslint": "4.10.0",
|
"eslint": "4.10.0",
|
||||||
"eslint-config-react-app": "^2.1.0",
|
"eslint-config-react-app": "^2.1.0",
|
||||||
|
@ -46,8 +49,9 @@
|
||||||
"install": "^0.12.2",
|
"install": "^0.12.2",
|
||||||
"jest": "20.0.4",
|
"jest": "20.0.4",
|
||||||
"js-base64": "^2.5.2",
|
"js-base64": "^2.5.2",
|
||||||
|
"js2wordcloud": "^1.1.12",
|
||||||
"katex": "^0.11.1",
|
"katex": "^0.11.1",
|
||||||
"lodash": "^4.17.15",
|
"lodash": "^4.17.21",
|
||||||
"loglevel": "^1.6.8",
|
"loglevel": "^1.6.8",
|
||||||
"marked": "^1.0.0",
|
"marked": "^1.0.0",
|
||||||
"material-ui": "^1.0.0-beta.40",
|
"material-ui": "^1.0.0-beta.40",
|
||||||
|
@ -62,7 +66,7 @@
|
||||||
"postcss-loader": "2.0.8",
|
"postcss-loader": "2.0.8",
|
||||||
"promise": "8.0.1",
|
"promise": "8.0.1",
|
||||||
"prop-types": "^15.6.1",
|
"prop-types": "^15.6.1",
|
||||||
"qrcode.react": "^1.0.0",
|
"qrcode.react": "^1.0.1",
|
||||||
"qs": "^6.9.3",
|
"qs": "^6.9.3",
|
||||||
"quill": "^1.3.7",
|
"quill": "^1.3.7",
|
||||||
"quill-delta-to-html": "^0.11.0",
|
"quill-delta-to-html": "^0.11.0",
|
||||||
|
@ -80,6 +84,8 @@
|
||||||
"react-color": "^2.18.0",
|
"react-color": "^2.18.0",
|
||||||
"react-content-loader": "^3.1.1",
|
"react-content-loader": "^3.1.1",
|
||||||
"react-cookies": "^0.1.1",
|
"react-cookies": "^0.1.1",
|
||||||
|
"react-countup": "^6.1.0",
|
||||||
|
"react-cropper": "^2.1.8",
|
||||||
"react-datepicker": "^2.14.1",
|
"react-datepicker": "^2.14.1",
|
||||||
"react-dev-utils": "^9.2.0-next.80",
|
"react-dev-utils": "^9.2.0-next.80",
|
||||||
"react-dom": "^16.13.1",
|
"react-dom": "^16.13.1",
|
||||||
|
@ -92,6 +98,7 @@
|
||||||
"react-resizable": "^1.10.1",
|
"react-resizable": "^1.10.1",
|
||||||
"react-router": "^4.2.0",
|
"react-router": "^4.2.0",
|
||||||
"react-router-dom": "^4.2.2",
|
"react-router-dom": "^4.2.2",
|
||||||
|
"react-slick": "^0.28.1",
|
||||||
"react-split-pane": "^0.1.91",
|
"react-split-pane": "^0.1.91",
|
||||||
"react-url-query": "^1.5.0",
|
"react-url-query": "^1.5.0",
|
||||||
"react-zmage": "^0.8.5-beta.31",
|
"react-zmage": "^0.8.5-beta.31",
|
||||||
|
@ -99,9 +106,11 @@
|
||||||
"redux-thunk": "2.3.0",
|
"redux-thunk": "2.3.0",
|
||||||
"rsuite": "^4.3.4",
|
"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",
|
"scroll-into-view": "^1.14.2",
|
||||||
"showdown": "^1.9.1",
|
"showdown": "^1.9.1",
|
||||||
"showdown-katex": "^0.8.0",
|
"showdown-katex": "^0.8.0",
|
||||||
|
"slick-carousel": "^1.8.1",
|
||||||
"store": "^2.0.12",
|
"store": "^2.0.12",
|
||||||
"style-loader": "0.19.0",
|
"style-loader": "0.19.0",
|
||||||
"styled-components": "^4.4.1",
|
"styled-components": "^4.4.1",
|
||||||
|
@ -117,8 +126,8 @@
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node --max_old_space_size=15360 scripts/start.js",
|
"start": "node --max_old_space_size=15360 scripts/start.js",
|
||||||
"build": "NODE_ENV=production node --max_old_space_size=15360 scripts/build.js",
|
"build": "cross-env NODE_ENV=production node --max_old_space_size=15360 scripts/build.js",
|
||||||
"test-build": "NODE_ENV=testBuild node --max_old_space_size=15360 scripts/build.js",
|
"test-build": "cross-env NODE_ENV=testBuild node --max_old_space_size=15360 scripts/build.js",
|
||||||
"pre-build": "NODE_ENV=preBuild node --max_old_space_size=15360 scripts/build.js",
|
"pre-build": "NODE_ENV=preBuild node --max_old_space_size=15360 scripts/build.js",
|
||||||
"gen_stats": "NODE_ENV=production webpack --profile --config=./config/webpack.config.prod.js --json > stats.json",
|
"gen_stats": "NODE_ENV=production webpack --profile --config=./config/webpack.config.prod.js --json > stats.json",
|
||||||
"ana": "webpack-bundle-analyzer ./stats.json",
|
"ana": "webpack-bundle-analyzer ./stats.json",
|
||||||
|
@ -180,7 +189,7 @@
|
||||||
"eslintConfig": {
|
"eslintConfig": {
|
||||||
"extends": "react-app"
|
"extends": "react-app"
|
||||||
},
|
},
|
||||||
"proxy": "http://localhost:3000",
|
"proxy": "http://localhost:3001",
|
||||||
"port": "3007",
|
"port": "3007",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/runtime": "7.0.0-beta.51",
|
"@babel/runtime": "7.0.0-beta.51",
|
||||||
|
@ -188,6 +197,7 @@
|
||||||
"babel-core": "^6.26.0",
|
"babel-core": "^6.26.0",
|
||||||
"babel-plugin-import": "^1.13.0",
|
"babel-plugin-import": "^1.13.0",
|
||||||
"babel-plugin-transform-runtime": "^6.23.0",
|
"babel-plugin-transform-runtime": "^6.23.0",
|
||||||
|
"babel-polyfill": "^6.26.0",
|
||||||
"babel-preset-es2015": "^6.24.1",
|
"babel-preset-es2015": "^6.24.1",
|
||||||
"babel-preset-react": "^6.24.1",
|
"babel-preset-react": "^6.24.1",
|
||||||
"babel-preset-stage-2": "^6.24.1",
|
"babel-preset-stage-2": "^6.24.1",
|
||||||
|
@ -198,9 +208,10 @@
|
||||||
"node-sass": "^4.12.0",
|
"node-sass": "^4.12.0",
|
||||||
"optimize-css-assets-webpack-plugin": "^5.0.3",
|
"optimize-css-assets-webpack-plugin": "^5.0.3",
|
||||||
"purgecss": "^2.1.2",
|
"purgecss": "^2.1.2",
|
||||||
|
"react-json-view": "^1.21.3",
|
||||||
"reqwest": "^2.0.5",
|
"reqwest": "^2.0.5",
|
||||||
"resize-observer-polyfill": "^1.5.1",
|
"resize-observer-polyfill": "^1.5.1",
|
||||||
"terser-webpack-plugin": "^2.3.5",
|
"terser-webpack-plugin": "^2.3.8",
|
||||||
"uglifyjs-webpack-plugin": "^2.2.0",
|
"uglifyjs-webpack-plugin": "^2.2.0",
|
||||||
"webpack": "^4.42.1",
|
"webpack": "^4.42.1",
|
||||||
"webpack-bundle-analyzer": "^3.7.0"
|
"webpack-bundle-analyzer": "^3.7.0"
|
||||||
|
|
|
@ -38,78 +38,6 @@
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
.head-nav ul#header-nav li {
|
|
||||||
float: left;
|
|
||||||
height: 60px;
|
|
||||||
line-height: 60px;
|
|
||||||
margin-right: 30px;
|
|
||||||
cursor: pointer;
|
|
||||||
position: relative;
|
|
||||||
font-size: 16px
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li a {
|
|
||||||
display: block;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
color: #fff
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li a:hover {
|
|
||||||
color: #cccccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li:last-child {
|
|
||||||
margin-right: 0px
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li.active a {
|
|
||||||
color: #459be5 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li.active p {
|
|
||||||
color: #459be5 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li p:hover {
|
|
||||||
color: #cccccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li p {
|
|
||||||
display: block;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
color: #fff
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li.active div ul li a {
|
|
||||||
color: #000 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li.active div ul li a:hover {
|
|
||||||
color: #FFF !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li.active ul li a {
|
|
||||||
color: #000 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li.active ul li a:hover {
|
|
||||||
color: #FFF !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li.active:after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
left: 0px;
|
|
||||||
top: auto;
|
|
||||||
bottom: 10px;
|
|
||||||
right: auto;
|
|
||||||
height: 2px;
|
|
||||||
width: 14px;
|
|
||||||
background-color: #459be5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-img {
|
.nav-img {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 2px;
|
top: 2px;
|
||||||
|
|
|
@ -114,14 +114,6 @@ a:visited {
|
||||||
color: #898989;
|
color: #898989;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:hover {
|
|
||||||
color: #FF7500;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover.fa {
|
|
||||||
color: #FF7500;
|
|
||||||
}
|
|
||||||
|
|
||||||
input,
|
input,
|
||||||
textarea,
|
textarea,
|
||||||
select {
|
select {
|
||||||
|
|
|
@ -97,10 +97,6 @@ a:visited {
|
||||||
color: #05101a;
|
color: #05101a;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:hover {
|
|
||||||
color: #459be5;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol,
|
ol,
|
||||||
ul,
|
ul,
|
||||||
li {
|
li {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
@charset "utf-8";
|
||||||
/* 头部 */
|
/* 头部 */
|
||||||
.header {
|
.header {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -1267,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 {
|
html body {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
line-height: 2.0;
|
line-height: 2.0;
|
||||||
background: #fafafa;
|
background: #fafafa;
|
||||||
font-family: "微软雅黑", "宋体";
|
font-family: "iconfont";
|
||||||
color: #05101a;
|
color: #05101a;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
@ -1307,6 +1314,7 @@ td,
|
||||||
span {
|
span {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
margin-bottom: 0px!important;
|
||||||
}
|
}
|
||||||
|
|
||||||
table,
|
table,
|
||||||
|
@ -1363,10 +1371,6 @@ a:visited {
|
||||||
color: #05101a;
|
color: #05101a;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:hover {
|
|
||||||
color: #459be5;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol,
|
ol,
|
||||||
ul,
|
ul,
|
||||||
li {
|
li {
|
||||||
|
@ -1473,7 +1477,7 @@ a.edu-txt-w80,
|
||||||
|
|
||||||
/*隐藏*/
|
/*隐藏*/
|
||||||
.none {
|
.none {
|
||||||
display: none
|
display: none!important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.block {
|
.block {
|
||||||
|
@ -1522,7 +1526,15 @@ a.edu-txt-w80,
|
||||||
.font-16 {
|
.font-16 {
|
||||||
font-size: 16px !important;
|
font-size: 16px !important;
|
||||||
}
|
}
|
||||||
|
.weight400{
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
.weight500{
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
.weight{
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
.font-17 {
|
.font-17 {
|
||||||
font-size: 17px !important;
|
font-size: 17px !important;
|
||||||
}
|
}
|
||||||
|
@ -1542,6 +1554,9 @@ a.edu-txt-w80,
|
||||||
.font-25 {
|
.font-25 {
|
||||||
font-size: 25px !important;
|
font-size: 25px !important;
|
||||||
}
|
}
|
||||||
|
.font-26 {
|
||||||
|
font-size: 26px !important;
|
||||||
|
}
|
||||||
|
|
||||||
.font-24 {
|
.font-24 {
|
||||||
font-size: 24px !important;
|
font-size: 24px !important;
|
||||||
|
@ -1563,6 +1578,9 @@ a.edu-txt-w80,
|
||||||
font-size: 36px !important;
|
font-size: 36px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.font-40 {
|
||||||
|
font-size: 40px !important;
|
||||||
|
}
|
||||||
.font-50 {
|
.font-50 {
|
||||||
font-size: 50px !important;
|
font-size: 50px !important;
|
||||||
}
|
}
|
||||||
|
@ -1748,12 +1766,20 @@ a.decoration {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mb12 {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mb13 {
|
||||||
|
margin-bottom: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
.mb14 {
|
.mb14 {
|
||||||
margin-bottom: 14px;
|
margin-bottom: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mb15 {
|
.mb15 {
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px!important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mb16 {
|
.mb16 {
|
||||||
|
@ -2424,13 +2450,23 @@ input::-ms-clear {
|
||||||
.color-grey-c {
|
.color-grey-c {
|
||||||
color: #ccc !important;
|
color: #ccc !important;
|
||||||
}
|
}
|
||||||
|
a.hoverLine:hover{
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
.color-grey-cd {
|
.color-grey-cd {
|
||||||
color: #cdcdcd !important;
|
color: #cdcdcd !important;
|
||||||
}
|
}
|
||||||
|
.color-grey-d {
|
||||||
|
color: #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.color-grey-9 {
|
.color-grey-9 {
|
||||||
color: #999999 !important;
|
color: #999 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover{
|
||||||
|
color: #466AFF !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.color-grey-98 {
|
.color-grey-98 {
|
||||||
|
@ -2465,33 +2501,23 @@ input::-ms-clear {
|
||||||
a.color-grey-name:hover,
|
a.color-grey-name:hover,
|
||||||
a.color-dark:hover,
|
a.color-dark:hover,
|
||||||
a.color-grey-6:hover,
|
a.color-grey-6:hover,
|
||||||
a.color-grey-3:hover {
|
a.color-grey-3:hover,a.color-ooo:hover {
|
||||||
color: #4cacff !important;
|
color: #2A61FF !important;
|
||||||
}
|
|
||||||
|
|
||||||
a.color-grey-9:hover,
|
|
||||||
a.color-grey-8:hover,
|
|
||||||
a.color-grey-c:hover {
|
|
||||||
color: #111C24 !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*蓝色*/
|
/*蓝色*/
|
||||||
.color-blue {
|
.color-blue {
|
||||||
color: #4CACFF !important;
|
color: #2A61FF !important;
|
||||||
|
}
|
||||||
|
.color-blue-file {
|
||||||
|
color: #4598FA!important;
|
||||||
}
|
}
|
||||||
/* 绿色 */
|
/* 绿色 */
|
||||||
.color-green-file{
|
|
||||||
color: #28BD6C;
|
|
||||||
}
|
|
||||||
/*主*/
|
/*主*/
|
||||||
.color-blue_4C {
|
.color-blue_4C {
|
||||||
color: #4CACFF !important;
|
color: #4CACFF !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.color-blue:hover,
|
|
||||||
a.color-blue_4C:hover {
|
|
||||||
color: #459BE6 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*橙色*/
|
/*橙色*/
|
||||||
.color-orange {
|
.color-orange {
|
||||||
|
@ -3409,7 +3435,7 @@ a.user_bluebg_btn {
|
||||||
}
|
}
|
||||||
|
|
||||||
.cdefault {
|
.cdefault {
|
||||||
cursor: default
|
cursor: default!important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3584,42 +3610,6 @@ a.user_bluebg_btn {
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------个人主页:右侧提示区域--------------------------*/
|
|
||||||
.-task-sidebar {
|
|
||||||
position: fixed;
|
|
||||||
width: 40px;
|
|
||||||
height: 180px;
|
|
||||||
right: 0;
|
|
||||||
bottom: 80px;
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
.-task-sidebar div {
|
|
||||||
height: 40px;
|
|
||||||
line-height: 40px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
width: 40px;
|
|
||||||
background: #4CACFF;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 20px;
|
|
||||||
text-align: center;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.-task-sidebar div i {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.-task-sidebar div i:hover {
|
|
||||||
color: #fff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gotop {
|
|
||||||
background-color: rgba(208, 207, 207, 0.5) !important;
|
|
||||||
padding: 0px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***** loading ******/
|
/***** loading ******/
|
||||||
/*****载入中******/
|
/*****载入中******/
|
||||||
|
@ -3944,11 +3934,25 @@ html>body #ajax-indicator {
|
||||||
max-height: 340px;
|
max-height: 340px;
|
||||||
}/*头部导航条样式---2018-03-19--by-cs*/
|
}/*头部导航条样式---2018-03-19--by-cs*/
|
||||||
|
|
||||||
|
.privateTag{
|
||||||
|
display: block;
|
||||||
|
padding:0px 6px;
|
||||||
|
border-radius: 12px;
|
||||||
|
border:1px solid #2FC25B;
|
||||||
|
height: 18px;
|
||||||
|
line-height: 18px;
|
||||||
|
font-size: 12px;
|
||||||
|
margin-left: 10px;
|
||||||
|
color: #2FC25B;
|
||||||
|
}
|
||||||
|
.privateTag.red{
|
||||||
|
color: #FF6832;
|
||||||
|
border:1px solid #FF6832;
|
||||||
|
}
|
||||||
.head-nav {
|
.head-nav {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
height: 70px;
|
height: 58px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
min-width: 780px;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
@ -3959,25 +3963,25 @@ html>body #ajax-indicator {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0px;
|
top: 0px;
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
height: 70px;
|
height: 58px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
.head-nav ul#header-nav li {
|
.head-nav ul#header-nav li {
|
||||||
float: left;
|
float: left;
|
||||||
height: 70px;
|
height: 58px;
|
||||||
line-height: 70px;
|
line-height: 58px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
position: relative;
|
position: relative;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
padding:0px 20px;
|
padding-right:40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.head-nav ul#header-nav li a {
|
.head-nav ul#header-nav li a {
|
||||||
display: block;
|
display: block;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
color: #333;
|
color: #fff;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3989,10 +3993,6 @@ html>body #ajax-indicator {
|
||||||
margin-right: 0px
|
margin-right: 0px
|
||||||
}
|
}
|
||||||
|
|
||||||
.head-nav ul#header-nav li.active{
|
|
||||||
/* background-color: #3B3B3B; */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.head-nav ul#header-nav li p:hover {
|
.head-nav ul#header-nav li p:hover {
|
||||||
color: #cccccc;
|
color: #cccccc;
|
||||||
|
@ -6712,3 +6712,9 @@ p{
|
||||||
top:4px;
|
top:4px;
|
||||||
color: #999;
|
color: #999;
|
||||||
}
|
}
|
||||||
|
.ant-input, .ant-input .ant-input-suffix{
|
||||||
|
background-color: #fff!important;
|
||||||
|
}
|
||||||
|
.has-error .ant-input{
|
||||||
|
background-color: #FEF1F0!important;
|
||||||
|
}
|
Before Width: | Height: | Size: 733 KiB |
After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 9.4 KiB |
|
@ -1,5 +1,5 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="zh-CN" class="notranslate translated-ltr" translate="no">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name=”Keywords” Content=”trustie,trustieforge,forge,确实让创建更美好,协同开发平台″>
|
<meta name=”Keywords” Content=”trustie,trustieforge,forge,确实让创建更美好,协同开发平台″>
|
||||||
|
|
|
@ -3319,9 +3319,9 @@
|
||||||
text = text.replace(emailReg, function ($1, $2, $3, $4) {
|
text = text.replace(emailReg, function ($1, $2, $3, $4) {
|
||||||
return $1.replace(/@/g, "_#_@_#_");
|
return $1.replace(/@/g, "_#_@_#_");
|
||||||
});
|
});
|
||||||
|
// " + editormd.urls.atLinkBase + "" + $2 + "
|
||||||
text = text.replace(atLinkReg, function ($1, $2) {
|
text = text.replace(atLinkReg, function ($1, $2) {
|
||||||
return "<a href=\"" + editormd.urls.atLinkBase + "" + $2 + "\" title=\"@" + $2 + "\" class=\"at-link\">" + $1 + "</a>";
|
return "<span title=\"@" + $2 + "\" class=\"at-link\"> " + $1 + " </span>";
|
||||||
}).replace(/_#_@_#_/g, "@");
|
}).replace(/_#_@_#_/g, "@");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
12
src/App.css
|
@ -60,12 +60,13 @@ body {
|
||||||
.ant-progress-textno {
|
.ant-progress-textno {
|
||||||
color: #f5222d;
|
color: #f5222d;
|
||||||
}
|
}
|
||||||
|
.CodeMirror pre.CodeMirror-line{
|
||||||
|
font-size: 16px!important;
|
||||||
|
}
|
||||||
/* md多空格 */
|
/* md多空格 */
|
||||||
.markdown-body p {
|
.markdown-body p {
|
||||||
margin:10px 0px!important;
|
margin:10px 0px!important;
|
||||||
font-size: 16px !important;
|
font-size: 16px !important;
|
||||||
line-height: 2 !important;
|
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,6 +88,13 @@ body {
|
||||||
border-left: 1px solid rgb(221, 221, 221);
|
border-left: 1px solid rgb(221, 221, 221);
|
||||||
/* 某些情况下,被cm盖住了 */
|
/* 某些情况下,被cm盖住了 */
|
||||||
z-index: 99;
|
z-index: 99;
|
||||||
|
padding:8px 8px 50px;
|
||||||
|
}
|
||||||
|
.editormd-preview .markdown-body{
|
||||||
|
padding:0px !important;
|
||||||
|
}
|
||||||
|
.editormd-preview{
|
||||||
|
width: 50%!important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 图片点击放大的场景,隐藏图片链接 */
|
/* 图片点击放大的场景,隐藏图片链接 */
|
||||||
|
|
292
src/App.js
|
@ -3,24 +3,23 @@ import './App.css';
|
||||||
import { ConfigProvider } from 'antd'
|
import { ConfigProvider } from 'antd'
|
||||||
import zhCN from 'antd/lib/locale-provider/zh_CN';
|
import zhCN from 'antd/lib/locale-provider/zh_CN';
|
||||||
import {
|
import {
|
||||||
BrowserRouter as Router,
|
|
||||||
Route,
|
Route,
|
||||||
Switch
|
Switch
|
||||||
} from 'react-router-dom';
|
} from 'react-router-dom';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import LoginDialog from './modules/login/LoginDialog';
|
import LoginDialog from './modules/login/LoginDialog';
|
||||||
import 'babel-polyfill';
|
import 'babel-polyfill';
|
||||||
import Loading from './Loading'
|
import Loading from './Loading';
|
||||||
|
|
||||||
import Loadable from 'react-loadable';
|
import Loadable from 'react-loadable';
|
||||||
import marked from './common/marked';
|
import marked from './common/marked';
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
|
|
||||||
import { MuiThemeProvider, createMuiTheme } from 'material-ui/styles';
|
import { MuiThemeProvider, createMuiTheme } from 'material-ui/styles';
|
||||||
|
import SiderBar from './forge/Component/SiderBar';
|
||||||
|
import SiderBarHelp from './glcc/siderBarHelp';
|
||||||
|
|
||||||
import history from './history';
|
import { SnackbarHOC } from 'educoder';
|
||||||
|
|
||||||
import { SnackbarHOC } from 'educoder'
|
|
||||||
import { initAxiosInterceptors } from './AppConfig'
|
import { initAxiosInterceptors } from './AppConfig'
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
import configureStore from './redux/stores/configureStore';
|
import configureStore from './redux/stores/configureStore';
|
||||||
|
@ -40,6 +39,16 @@ const Projects = Loadable({
|
||||||
loader: () => import('./forge/Index'),
|
loader: () => import('./forge/Index'),
|
||||||
loading: Loading,
|
loading: Loading,
|
||||||
})
|
})
|
||||||
|
// forge项目详情
|
||||||
|
const ProjectDetail = Loadable({
|
||||||
|
loader: () => import("./forge/Main/DetailAdaptor"),
|
||||||
|
loading: Loading,
|
||||||
|
});
|
||||||
|
//forge安全设置
|
||||||
|
const Security = Loadable({
|
||||||
|
loader: () => import('./forge/SecuritySetting/Index'),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
//forge项目-devOps详情
|
//forge项目-devOps详情
|
||||||
const OpsDetail = Loadable({
|
const OpsDetail = Loadable({
|
||||||
loader: () => import('./forge/DevOps/opsDetail'),
|
loader: () => import('./forge/DevOps/opsDetail'),
|
||||||
|
@ -70,10 +79,53 @@ const OrganizeIndex = Loadable({
|
||||||
loader: () => import('./forge/Team/Index'),
|
loader: () => import('./forge/Team/Index'),
|
||||||
loading: Loading,
|
loading: Loading,
|
||||||
})
|
})
|
||||||
const EducoderLogin = Loadable({
|
|
||||||
loader: () => import('./modules/login/EducoderLogin'),
|
const Search = Loadable({
|
||||||
|
loader: () => import('./modules/search/'),
|
||||||
loading: Loading,
|
loading: Loading,
|
||||||
})
|
})
|
||||||
|
const WikiPreview = Loadable({
|
||||||
|
loader: () => import('./forge/Wiki/Preview'),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
|
||||||
|
const ProjectIndex = Loadable({
|
||||||
|
loader: () => import("./forge/Index"),
|
||||||
|
loading: Loading,
|
||||||
|
});
|
||||||
|
|
||||||
|
const Home = Loadable({
|
||||||
|
loader: () => import('./home/Index'),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
|
||||||
|
const LoginRegisterPage = Loadable({
|
||||||
|
loader: () => import("./modules/loginRegister/LoginRegisterPage"),
|
||||||
|
loading: Loading,
|
||||||
|
});
|
||||||
|
|
||||||
|
const AboutUs = Loadable({
|
||||||
|
loader: () => import("./forge/AboutUs/AboutUs"),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
|
||||||
|
const Teaching = Loadable({
|
||||||
|
loader : () => import("./forge/TeachingPractice/Teaching"),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
|
||||||
|
const Glcc = Loadable({
|
||||||
|
loader : () => import("./glcc"),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
|
||||||
|
// const CreateMerge = Loadable({
|
||||||
|
// loader: () => import('./forge/Merge/NewMerge'),
|
||||||
|
// loading: Loading,
|
||||||
|
// })
|
||||||
|
|
||||||
|
// 此处仅维护前端可能的一级路由,不用进行项目或者组织判断的字段。
|
||||||
|
const keyWord = ["explore", "settings", "setting", "mulan", "wiki", "issues", "setting", "trending", "code", "projects", "pulls", "mine", "login", "register", "email", "export", "nopage", "404", "403", "500", "501", "search", "organize", "login", "register", "resetPassword", "aboutus","educoder"];
|
||||||
|
|
||||||
class App extends Component {
|
class App extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
@ -84,6 +136,54 @@ class App extends Component {
|
||||||
mydisplay: false,
|
mydisplay: false,
|
||||||
occupation: 0,
|
occupation: 0,
|
||||||
mygetHelmetapi: null,
|
mygetHelmetapi: null,
|
||||||
|
pathType: null,
|
||||||
|
pathName: null,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UNSAFE_componentWillMount() {
|
||||||
|
initAxiosInterceptors(this.props);
|
||||||
|
let pathname = window.location.pathname ? window.location.pathname.split('/')[1] : '';
|
||||||
|
pathname && this.getPathnameType(pathname);
|
||||||
|
|
||||||
|
// 添加路由监听,决定组织还是个人
|
||||||
|
this.unlisten = this.props.history.listen((location,history) => {
|
||||||
|
let newPathname = location.pathname.split('/')[1];
|
||||||
|
if (this.state.pathName !== newPathname) {
|
||||||
|
// this.setState({ pathType: '' });
|
||||||
|
newPathname && this.getPathnameType(newPathname);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
shouldComponentUpdate(nextProps, nextState) {
|
||||||
|
if(!nextProps.location.pathname==='/'){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// 阻止个人与组织切换时(组件渲染)请求导致的404
|
||||||
|
if (nextProps.location.pathname.split('/')[1] !== this.props.location.pathname.split('/')[1] && nextState.pathType === this.state.pathType) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getPathnameType = (pathname) => {
|
||||||
|
if (!keyWord.includes(pathname)) {
|
||||||
|
let url = `/owners/${pathname}.json`;
|
||||||
|
axios.get(url).then((response) => {
|
||||||
|
if (response && response.status === 200) {
|
||||||
|
this.setState({
|
||||||
|
pathType: response.data.type || '404',
|
||||||
|
pathName: pathname,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
this.setState({
|
||||||
|
pathType: pathname,
|
||||||
|
pathName: pathname,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,43 +200,22 @@ class App extends Component {
|
||||||
Addcoursestypes: false
|
Addcoursestypes: false
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
ModalCancelsy = () => {
|
|
||||||
this.setState({
|
|
||||||
mydisplay: false,
|
|
||||||
})
|
|
||||||
window.location.href = "/";
|
|
||||||
};
|
|
||||||
ModalshowCancelsy = () => {
|
|
||||||
this.setState({
|
|
||||||
mydisplay: true,
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
disableVideoContextMenu = () => {
|
|
||||||
window.$("body").on("mousedown", "video", function (event) {
|
|
||||||
if (event.which === 3) {
|
|
||||||
window.$('video').bind('contextmenu', function () { return false; });
|
|
||||||
} else {
|
|
||||||
window.$('video').unbind('contextmenu');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
document.title = "loading...";
|
document.title = "loading...";
|
||||||
this.disableVideoContextMenu();
|
|
||||||
history.listen(() => {
|
|
||||||
this.forceUpdate()
|
|
||||||
const $ = window.$
|
|
||||||
$("html").animate({ scrollTop: $('html').scrollTop() - 0 })
|
|
||||||
});
|
|
||||||
|
|
||||||
initAxiosInterceptors(this.props);
|
|
||||||
this.getAppdata();
|
this.getAppdata();
|
||||||
|
|
||||||
window.addEventListener('error', (event) => {
|
window.addEventListener('error', (event) => {
|
||||||
const msg = `${event.type}: ${event.message}`;
|
const msg = `${event.type}: ${event.message}`;
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
this.unlisten && this.unlisten(); // 执行解绑
|
||||||
|
}
|
||||||
|
|
||||||
//修改登录方法
|
//修改登录方法
|
||||||
Modifyloginvalue = () => {
|
Modifyloginvalue = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
|
@ -207,23 +286,119 @@ class App extends Component {
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
const { pathType, pathName } = this.state;
|
||||||
return (
|
return (
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<ConfigProvider locale={zhCN}>
|
<ConfigProvider locale={zhCN}>
|
||||||
<MuiThemeProvider theme={theme}>
|
<MuiThemeProvider theme={theme}>
|
||||||
<LoginDialog {...this.props} {...this.state} Modifyloginvalue={() => this.Modifyloginvalue()}></LoginDialog>
|
<LoginDialog {...this.props} {...this.state} Modifyloginvalue={() => this.Modifyloginvalue()}></LoginDialog>
|
||||||
<Router>
|
{pathName && pathName.indexOf("glcc") === -1 ? <SiderBar /> : <SiderBarHelp/>}
|
||||||
|
{/* <Router> */}
|
||||||
<Switch>
|
<Switch>
|
||||||
|
{/* wiki预览 */}
|
||||||
|
<Route path="/:owner/:projectsId/wiki/preview/:projectName/:projectId" render={
|
||||||
|
(props) => {
|
||||||
|
return (<WikiPreview {...this.props} {...props} {...this.state} />)
|
||||||
|
}
|
||||||
|
} />
|
||||||
|
|
||||||
|
{/* 项目PR */}
|
||||||
|
<Route path="/:owner/:projectsId/compare"
|
||||||
|
render={
|
||||||
|
(props) => (<ProjectDetail {...this.props} {...props} {...this.state} />)
|
||||||
|
}
|
||||||
|
></Route>
|
||||||
|
|
||||||
{/*项目*/}
|
{/*项目*/}
|
||||||
<Route
|
<Route
|
||||||
path={"/projects/:owner/:projectId/devops/:opsId/detail"}
|
path={"/:owner/:projectId/devops/:opsId/detail"}
|
||||||
render={
|
render={
|
||||||
(props) => {
|
(props) => {
|
||||||
return (<OpsDetail {...this.props} {...props} {...this.state} />)
|
return (<OpsDetail {...this.props} {...props} {...this.state} />)
|
||||||
}
|
}
|
||||||
}>
|
}>
|
||||||
</Route>
|
</Route>
|
||||||
{/*项目*/}
|
<Route
|
||||||
|
path={"/settings"}
|
||||||
|
render={
|
||||||
|
(props) => {
|
||||||
|
return (<Security {...this.props} {...props} {...this.state} />)
|
||||||
|
}
|
||||||
|
}>
|
||||||
|
</Route>
|
||||||
|
|
||||||
|
{/*403*/}
|
||||||
|
<Route path="/403" component={Shixunauthority} />
|
||||||
|
|
||||||
|
<Route path="/500" component={http500} />
|
||||||
|
|
||||||
|
{/*404*/}
|
||||||
|
<Route path="/nopage" component={Shixunnopage} />
|
||||||
|
|
||||||
|
{/* 查询 */}
|
||||||
|
<Route path="/search" component={Search} />
|
||||||
|
|
||||||
|
<Route exact path="/explore/all"
|
||||||
|
render={
|
||||||
|
(props) => (
|
||||||
|
<ProjectIndex {...this.props} {...props} />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<Route exact path="/explore"
|
||||||
|
render={
|
||||||
|
(props) => (
|
||||||
|
<ProjectIndex {...this.props} {...props} />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* 登录 */}
|
||||||
|
<Route
|
||||||
|
path="/login"
|
||||||
|
render={(props) =><LoginRegisterPage {...this.props} {...props}/>}
|
||||||
|
></Route>
|
||||||
|
|
||||||
|
{/* 注册 */}
|
||||||
|
<Route
|
||||||
|
path="/register"
|
||||||
|
render={(props) =><LoginRegisterPage {...this.props} {...props}/>}
|
||||||
|
></Route>
|
||||||
|
|
||||||
|
{/* 忘记密码 */}
|
||||||
|
<Route
|
||||||
|
path="/resetPassword"
|
||||||
|
render={(props) =><LoginRegisterPage {...this.props} {...props}/>}
|
||||||
|
></Route>
|
||||||
|
|
||||||
|
{/* 关于我们 */}
|
||||||
|
<Route
|
||||||
|
path = "/aboutus"
|
||||||
|
render = {(props)=><AboutUs {...this.props} {...props}/>}
|
||||||
|
></Route>
|
||||||
|
|
||||||
|
{/* 教学实践 */}
|
||||||
|
<Route
|
||||||
|
path="/educoder"
|
||||||
|
render={(props) => <Teaching {...this.props} {...props} />}
|
||||||
|
></Route>
|
||||||
|
|
||||||
|
{/*glcc */}
|
||||||
|
<Route
|
||||||
|
path="/glcc"
|
||||||
|
render={(props) => <Glcc {...this.props} {...props} />}
|
||||||
|
></Route>
|
||||||
|
|
||||||
|
{/* 组织 */}
|
||||||
|
<Route path={"/organize"}
|
||||||
|
render={
|
||||||
|
(props) => {
|
||||||
|
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
|
||||||
|
}
|
||||||
|
}>
|
||||||
|
</Route>
|
||||||
|
|
||||||
|
{/*新建项目等*/}
|
||||||
<Route
|
<Route
|
||||||
path={"/projects"}
|
path={"/projects"}
|
||||||
render={
|
render={
|
||||||
|
@ -232,44 +407,44 @@ class App extends Component {
|
||||||
}
|
}
|
||||||
}>
|
}>
|
||||||
</Route>
|
</Route>
|
||||||
<Route
|
|
||||||
path="/register"
|
{/* 判断为用户/组织,并进入对应页面 */}
|
||||||
|
{
|
||||||
|
pathType === 'User' ?
|
||||||
|
<Route exact path="/:username"
|
||||||
render={
|
render={
|
||||||
(props) => {
|
(props) => {
|
||||||
return (<EducoderLogin {...this.props} {...props} {...this.state} />)
|
return (<InfosIndex {...this.props} {...this.state} />)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/>
|
/> : pathType === 'Organization' ? <Route path={"/:OIdentifier"}
|
||||||
{/*403*/}
|
|
||||||
<Route path="/403" component={Shixunauthority} />
|
|
||||||
|
|
||||||
<Route path="/500" component={http500} />
|
|
||||||
<Route path={"/organize"}
|
|
||||||
render={
|
render={
|
||||||
(props) => {
|
(props) => {
|
||||||
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
|
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
|
||||||
}
|
}
|
||||||
}>
|
}>
|
||||||
</Route>
|
</Route> : pathType === '404' ? <Route component={Shixunnopage} />:
|
||||||
{/*404*/}
|
""
|
||||||
<Route path="/nopage" component={Shixunnopage} />
|
}
|
||||||
|
<Route exact path="/"
|
||||||
|
render={
|
||||||
|
(props) => (
|
||||||
|
<Home {...props} {...this.props} {...this.state}/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
|
||||||
{/* 个人主页 */}
|
{/* 个人主页 */}
|
||||||
<Route path="/users/:username"
|
<Route path="/:username"
|
||||||
render={
|
render={
|
||||||
(props) => {
|
(props) => {
|
||||||
return (<InfosIndex {...this.props} {...this.state} />)
|
return (<InfosIndex {...this.props} {...this.state} />)
|
||||||
}
|
}
|
||||||
}></Route>
|
}></Route>
|
||||||
<Route exact path="/"
|
|
||||||
render={
|
|
||||||
(props) => (
|
|
||||||
<Projects {...this.props} {...props} {...this.state}></Projects>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
<Route component={Shixunnopage} />
|
<Route component={Shixunnopage} />
|
||||||
</Switch>
|
</Switch>
|
||||||
</Router>
|
|
||||||
</MuiThemeProvider>
|
</MuiThemeProvider>
|
||||||
</ConfigProvider>
|
</ConfigProvider>
|
||||||
</Provider>
|
</Provider>
|
||||||
|
@ -389,3 +564,4 @@ moment.defineLocale('zh-cn', {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
export default SnackbarHOC()(App);
|
export default SnackbarHOC()(App);
|
||||||
|
|
||||||
|
|
|
@ -32,11 +32,12 @@ export function initAxiosInterceptors(props) {
|
||||||
// 判断网络是否连接
|
// 判断网络是否连接
|
||||||
initOnlineOfflineListener();
|
initOnlineOfflineListener();
|
||||||
|
|
||||||
var proxy = "https://testforgeplus.trustie.net";
|
// var proxy = "https://testforgeplus.trustie.net";
|
||||||
|
var proxy = "http://localhost:3001";
|
||||||
//响应前的设置
|
//响应前的设置
|
||||||
axios.interceptors.request.use(
|
axios.interceptors.request.use(
|
||||||
config => {
|
config => {
|
||||||
if(config.url.indexOf("http") !== -1) {
|
if(config.url.substr(0, 4) === "http") {
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
requestProxy(config);
|
requestProxy(config);
|
||||||
|
@ -68,6 +69,8 @@ export function initAxiosInterceptors(props) {
|
||||||
if (response.data.status === -1) {
|
if (response.data.status === -1) {
|
||||||
if (window.location.pathname.startsWith('/tasks/')) {
|
if (window.location.pathname.startsWith('/tasks/')) {
|
||||||
props.showSnackbar(response.data.message || '服务器异常,请联系管理员。')
|
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 {
|
} else {
|
||||||
notification.open({
|
notification.open({
|
||||||
message: "提示",
|
message: "提示",
|
||||||
|
@ -85,8 +88,11 @@ export function initAxiosInterceptors(props) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.data.status === 404) {
|
if (response.data.status === 404) {
|
||||||
|
let responseURL = response.request ? response.request.responseURL:'';
|
||||||
|
if (responseURL.indexOf('/api/users/') === -1 && responseURL.indexOf('/api/organizations/') === -1 ) {
|
||||||
locationurl('/nopage');
|
locationurl('/nopage');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (response.data.status === 500) {
|
if (response.data.status === 500) {
|
||||||
locationurl('/500');
|
locationurl('/500');
|
||||||
|
|
|
@ -9,20 +9,7 @@ class Loading extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return ""
|
||||||
<div className="App" style={{ minHeight: '800px', width: "100%" }}>
|
|
||||||
<style>
|
|
||||||
{
|
|
||||||
`
|
|
||||||
.margintop{
|
|
||||||
margin-top:20%;
|
|
||||||
}
|
|
||||||
`
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<Spin size="large" className={"margintop"} />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -195,7 +195,7 @@ class College extends Component {
|
||||||
align: 'center',
|
align: 'center',
|
||||||
className: "edu-txt-center font-14 maxnamewidth105",
|
className: "edu-txt-center font-14 maxnamewidth105",
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<a href={`/users/${record.login}`} title={record.name} target="_blank" className="task-hide maxnamewidth105" style={{
|
<a href={`/${record.login}`} title={record.name} target="_blank" className="task-hide maxnamewidth105" style={{
|
||||||
color:'#007bff',
|
color:'#007bff',
|
||||||
|
|
||||||
}}> {
|
}}> {
|
||||||
|
|
|
@ -218,7 +218,7 @@ a:hover {
|
||||||
}
|
}
|
||||||
|
|
||||||
.color-blue {
|
.color-blue {
|
||||||
color: #4CACFF;
|
color: #2A61FF;
|
||||||
}
|
}
|
||||||
|
|
||||||
.color-huang {
|
.color-huang {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
|
import { number } from "prop-types";
|
||||||
|
|
||||||
// 处理整点 半点
|
// 处理整点 半点
|
||||||
// 取传入时间往后的第一个半点
|
// 取传入时间往后的第一个半点
|
||||||
|
@ -97,3 +98,41 @@ export function formatDuring(mss){
|
||||||
}
|
}
|
||||||
return days + "天" + hours + "小时" + minutes + "分";
|
return days + "天" + hours + "小时" + minutes + "分";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
返回:多久以前
|
||||||
|
backDate:以前的某个日期
|
||||||
|
*/
|
||||||
|
export function timeAgo(backDate) {
|
||||||
|
try {
|
||||||
|
moment(backDate);
|
||||||
|
} catch (e) {
|
||||||
|
return '刚刚';
|
||||||
|
}
|
||||||
|
if(typeof backDate ==='number'){
|
||||||
|
backDate=backDate*1000
|
||||||
|
}else{
|
||||||
|
backDate= moment(backDate);
|
||||||
|
}
|
||||||
|
let time = new Date() - backDate;
|
||||||
|
var days = Math.floor(time / (1000 * 60 * 60 * 24));
|
||||||
|
var hours = Math.floor((time % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
|
||||||
|
var minutes = Math.floor((time % (1000 * 60 * 60)) / (1000 * 60));
|
||||||
|
var seconds = Math.floor((time % (1000 * 60 * 60)) / 1000);
|
||||||
|
if (time <= 0) {
|
||||||
|
return "刚刚";
|
||||||
|
}
|
||||||
|
if (days) {
|
||||||
|
return days + "天前";
|
||||||
|
}
|
||||||
|
if (hours) {
|
||||||
|
return hours + "小时前";
|
||||||
|
}
|
||||||
|
if (minutes) {
|
||||||
|
return minutes + "分前";
|
||||||
|
}
|
||||||
|
if (seconds) {
|
||||||
|
return seconds + "秒前";
|
||||||
|
}
|
||||||
|
return "刚刚";
|
||||||
|
}
|
|
@ -69,7 +69,7 @@ export function appendFileSizeToUploadFile(item) {
|
||||||
}
|
}
|
||||||
export function appendFileSizeToUploadFileAll(fileList) {
|
export function appendFileSizeToUploadFileAll(fileList) {
|
||||||
return fileList.map(item => {
|
return fileList.map(item => {
|
||||||
if (item.name.indexOf(uploadNameSizeSeperator) == -1) {
|
if (item.name.indexOf(uploadNameSizeSeperator) === -1) {
|
||||||
return Object.assign({}, item, { name: `${item.name}${uploadNameSizeSeperator}${bytesToSize(item.size)}` })
|
return Object.assign({}, item, { name: `${item.name}${uploadNameSizeSeperator}${bytesToSize(item.size)}` })
|
||||||
}
|
}
|
||||||
return item
|
return item
|
||||||
|
|
|
@ -18,6 +18,23 @@ export function getImageUrl(path) {
|
||||||
return `${path}`;
|
return `${path}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function numFormat(num, digits){
|
||||||
|
let d = digits || 1;
|
||||||
|
var si = [
|
||||||
|
{ value: 1, symbol: "" },
|
||||||
|
{ value: 1E3, symbol: "k" },
|
||||||
|
{ value: 1E4, symbol: "W" }
|
||||||
|
];
|
||||||
|
var rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
|
||||||
|
var i;
|
||||||
|
for (i = si.length - 1; i > 0; i--) {
|
||||||
|
if (num >= si[i].value) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (num / si[i].value).toFixed(d).replace(rx, "$1") + si[i].symbol;
|
||||||
|
}
|
||||||
|
|
||||||
export function getImage(path) {
|
export function getImage(path) {
|
||||||
// https://www.educoder.net
|
// https://www.educoder.net
|
||||||
// https://testbdweb.trustie.net
|
// https://testbdweb.trustie.net
|
||||||
|
@ -233,3 +250,36 @@ export function publicSearchs(Placeholder,onSearch,onInputs,onChanges,loadings)
|
||||||
allowClear={true}
|
allowClear={true}
|
||||||
></Search>)
|
></Search>)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
|
@ -3,10 +3,11 @@
|
||||||
// export { default as OrderStateUtil } from '../routes/Order/components/OrderStateUtil';
|
// export { default as OrderStateUtil } from '../routes/Order/components/OrderStateUtil';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
getUploadLogoActionUrl as getUploadLogoActionUrl,
|
getUploadLogoActionUrl as getUploadLogoActionUrl,numFormat as numFormat,
|
||||||
getImageUrl as getImageUrl,getImage as getImage, getmyUrl as getmyUrl, getRandomNumber as getRandomNumber, getUrl as getUrl, publicSearchs as publicSearchs, getRandomcode as getRandomcode, getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl
|
getImageUrl as getImageUrl,getImage as getImage, getmyUrl as getmyUrl, getRandomNumber as getRandomNumber, getUrl as getUrl, publicSearchs as publicSearchs, getRandomcode as getRandomcode, getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl
|
||||||
, getUploadActionUrl as getUploadActionUrl, getUploadActionUrltwo as getUploadActionUrltwo, getUploadActionUrlthree as getUploadActionUrlthree, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth
|
, getUploadActionUrl as getUploadActionUrl, getUploadActionUrltwo as getUploadActionUrltwo, getUploadActionUrlthree as getUploadActionUrlthree, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth
|
||||||
, getTaskUrlById as getTaskUrlById, TEST_HOST, htmlEncode as htmlEncode, getupload_git_file as getupload_git_file, getcdnImageUrl as getcdnImageUrl
|
, getTaskUrlById as getTaskUrlById, TEST_HOST, htmlEncode as htmlEncode, getupload_git_file as getupload_git_file, getcdnImageUrl as getcdnImageUrl,
|
||||||
|
turnbar,returnbar
|
||||||
} from './UrlTool';
|
} from './UrlTool';
|
||||||
|
|
||||||
export { setmiyah as setmiyah } from './Component';
|
export { setmiyah as setmiyah } from './Component';
|
||||||
|
@ -27,7 +28,7 @@ export {
|
||||||
markdownToHTML, uploadNameSizeSeperator, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll, isImageExtension,
|
markdownToHTML, uploadNameSizeSeperator, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll, isImageExtension,
|
||||||
downloadFile, sortDirections, validateLength, mdJSONParse, exportMdtoHtml
|
downloadFile, sortDirections, validateLength, mdJSONParse, exportMdtoHtml
|
||||||
} from './TextUtil'
|
} from './TextUtil'
|
||||||
export { handleDateString, getNextHalfHourOfMoment, formatDuring, formatSeconds } from './DateUtil'
|
export { handleDateString, getNextHalfHourOfMoment, formatDuring, formatSeconds ,timeAgo} from './DateUtil'
|
||||||
|
|
||||||
export { configShareForIndex, configShareForPaths, configShareForShixuns, configShareForCourses, configShareForCustom } from './util/ShareUtil'
|
export { configShareForIndex, configShareForPaths, configShareForShixuns, configShareForCourses, configShareForCustom } from './util/ShareUtil'
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ export default ({
|
||||||
cleanToc()
|
cleanToc()
|
||||||
}
|
}
|
||||||
rs = rs.replace(/(__special_katext_id_\d+__)/g, (_match, capture) => {
|
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' })
|
return renderToString(_unescape(expression) || '', { displayMode: type === 'block', throwOnError: false, output: 'html' })
|
||||||
})
|
})
|
||||||
rs = rs.replace(/▁/g, "▁▁▁")
|
rs = rs.replace(/▁/g, "▁▁▁")
|
||||||
|
@ -46,18 +46,18 @@ export default ({
|
||||||
let id = decodeURIComponent(u.split("#")[1]);
|
let id = decodeURIComponent(u.split("#")[1]);
|
||||||
let ele = document.getElementById(id);
|
let ele = document.getElementById(id);
|
||||||
if(ele){
|
if(ele){
|
||||||
window.scrollTo(0, ele.offsetTop + 220);
|
window.scrollTo(0, ele.offsetTop + 120);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},[url])
|
},[url,html])
|
||||||
|
|
||||||
const el = useRef();
|
const el = useRef();
|
||||||
function onAncherHandler(e) {
|
function onAncherHandler(e) {
|
||||||
let target = e.target
|
let target = e.target;
|
||||||
if (target.tagName.toUpperCase() === 'A') {
|
if (target.tagName.toUpperCase() === 'A') {
|
||||||
let ancher = target.getAttribute('href')
|
let ancher = target.getAttribute('href');
|
||||||
if (ancher.startsWith('#')) {
|
if (ancher && ancher.startsWith('#')) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
let viewEl = document.getElementById(ancher.replace('#', ''))
|
let viewEl = document.getElementById(ancher.replace('#', ''))
|
||||||
if (viewEl) {
|
if (viewEl) {
|
||||||
|
|
|
@ -435,11 +435,11 @@ class TPIContextProvider extends Component {
|
||||||
image_url: "avatars/User/1"
|
image_url: "avatars/User/1"
|
||||||
login: "innov"
|
login: "innov"
|
||||||
name: "Coder"
|
name: "Coder"
|
||||||
user_url: "/users/innov"
|
user_url: "/innov"
|
||||||
*/
|
*/
|
||||||
let user = resData.user;
|
let user = resData.user;
|
||||||
user.username = resData.user.name;
|
user.username = resData.user.name;
|
||||||
user.user_url = `/users/${resData.user.login}`;
|
user.user_url = `/${resData.user.login}`;
|
||||||
// user.image_url = resData.image_url;
|
// user.image_url = resData.image_url;
|
||||||
user.is_teacher = resData.is_teacher;
|
user.is_teacher = resData.is_teacher;
|
||||||
resData.user = user;
|
resData.user = user;
|
||||||
|
|
|
@ -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{
|
||||||
|
min-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 |
|
@ -1,7 +1,7 @@
|
||||||
import React , { Component } from 'react';
|
import React , { Component } from 'react';
|
||||||
import { Dropdown , Menu , Icon , Pagination , Spin } from 'antd';
|
import { Dropdown , Menu , Icon , Pagination , Spin } from 'antd';
|
||||||
import '../css/index.scss';
|
import '../css/index.scss';
|
||||||
import '../Branch/branch.css';
|
import '../Branch/branch.scss';
|
||||||
import './activity.css';
|
import './activity.css';
|
||||||
import NoneData from '../Nodata';
|
import NoneData from '../Nodata';
|
||||||
|
|
||||||
|
@ -10,6 +10,10 @@ import ActivityItem from './ActivityItem';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
const LIMIT = 15;
|
const LIMIT = 15;
|
||||||
const ARRAY = [
|
const ARRAY = [
|
||||||
|
{
|
||||||
|
id:"",
|
||||||
|
name:'全部'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id:1,
|
id:1,
|
||||||
name:'1天'
|
name:'1天'
|
||||||
|
@ -32,10 +36,15 @@ class Activity extends Component{
|
||||||
constructor(props){
|
constructor(props){
|
||||||
super(props);
|
super(props);
|
||||||
this.state={
|
this.state={
|
||||||
time:'30',
|
time:undefined,
|
||||||
type:undefined,
|
type:undefined,
|
||||||
state:undefined,
|
state:undefined,
|
||||||
page:1,
|
page:1,
|
||||||
|
pr_count:undefined,
|
||||||
|
new_pr_count:undefined,
|
||||||
|
close_issues_count:undefined,
|
||||||
|
open_issues_count:undefined,
|
||||||
|
pr_all_count:undefined,issues_count:undefined,
|
||||||
|
|
||||||
data:undefined,
|
data:undefined,
|
||||||
project_trends:undefined,
|
project_trends:undefined,
|
||||||
|
@ -63,8 +72,15 @@ class Activity extends Component{
|
||||||
this.setState({
|
this.setState({
|
||||||
data:result.data,
|
data:result.data,
|
||||||
project_trends:result.data.project_trends,
|
project_trends:result.data.project_trends,
|
||||||
isSpin:false
|
isSpin:false,
|
||||||
|
pr_count:result.data.pr_count,
|
||||||
|
new_pr_count:result.data.new_pr_count,
|
||||||
|
close_issues_count:result.data.close_issues_count,
|
||||||
|
open_issues_count:result.data.open_issues_count,
|
||||||
|
pr_all_count:result.data.pr_all_count,
|
||||||
|
issues_count:result.data.issues_count,
|
||||||
})
|
})
|
||||||
|
window.scrollTo(0,0);
|
||||||
}
|
}
|
||||||
}).catch(error=>{
|
}).catch(error=>{
|
||||||
console.log(error);
|
console.log(error);
|
||||||
|
@ -74,19 +90,19 @@ class Activity extends Component{
|
||||||
// 切换周期
|
// 切换周期
|
||||||
changeTime=(e)=>{
|
changeTime=(e)=>{
|
||||||
this.setState({
|
this.setState({
|
||||||
time:e.key,
|
time:e.key ==="item_0"?undefined:e.key,
|
||||||
isSpin:true
|
isSpin:true
|
||||||
})
|
})
|
||||||
const { type,status,page } = this.state;
|
const { type,status,page } = this.state;
|
||||||
this.getInfo(e.key,type,status,page);
|
this.getInfo(e.key ==="item_0"?undefined:e.key,type,status,page);
|
||||||
}
|
}
|
||||||
//筛选
|
//筛选
|
||||||
changeTrends=(type,status)=>{
|
changeTrends=(type,status)=>{
|
||||||
this.setState({
|
this.setState({
|
||||||
type,status
|
type,status,page:1
|
||||||
})
|
})
|
||||||
const {time,page}=this.state;
|
const {time}=this.state;
|
||||||
this.getInfo(time,type,status,page);
|
this.getInfo(time,type,status,1);
|
||||||
}
|
}
|
||||||
// 分页
|
// 分页
|
||||||
ChangePage=(page)=>{
|
ChangePage=(page)=>{
|
||||||
|
@ -108,12 +124,16 @@ class Activity extends Component{
|
||||||
</Menu>
|
</Menu>
|
||||||
)
|
)
|
||||||
render(){
|
render(){
|
||||||
const { time , data , page , project_trends , isSpin } = this.state;
|
const { time , data , page , project_trends , isSpin ,
|
||||||
|
pr_count , new_pr_count , close_issues_count , open_issues_count , pr_all_count ,issues_count,
|
||||||
|
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%";
|
||||||
|
const second_per =pr_all_count > 0 ? `${parseFloat(new_pr_count/pr_all_count).toFixed(2)*100}%` :"50%";
|
||||||
|
const third_per =issues_count > 0 ?`${parseFloat(close_issues_count/issues_count).toFixed(2)*100}%` :"50%";
|
||||||
|
const fourth_per =issues_count > 0 ?`${parseFloat(open_issues_count/issues_count).toFixed(2)*100}%` :"50%";
|
||||||
|
|
||||||
let name = time && ARRAY.filter(item=>item.id === parseInt(time)) ;
|
|
||||||
const second_per = (parseInt(data && data.close_issues_count)/parseInt(data && data.issues_count)*100)+'%';
|
|
||||||
const third_per = (parseInt(data && data.close_issues_count)/parseInt(data && data.issues_count)*100)+'%';
|
|
||||||
const fourth_per = (parseInt(data && data.open_issues_count)/parseInt(data && data.issues_count)*100)+'%';
|
|
||||||
return(
|
return(
|
||||||
<div className="main">
|
<div className="main">
|
||||||
|
|
||||||
|
@ -122,7 +142,7 @@ class Activity extends Component{
|
||||||
<div className="orderInfo">
|
<div className="orderInfo">
|
||||||
<div>
|
<div>
|
||||||
<div className="percentLine prPercent">
|
<div className="percentLine prPercent">
|
||||||
<p className="percent_purple" style={{width:'100%'}}></p>
|
<p className="percent_purple" style={{width:first_per}}></p>
|
||||||
<p className="percent_green resetStyle" style={{width:`${second_per}`}}></p>
|
<p className="percent_green resetStyle" style={{width:`${second_per}`}}></p>
|
||||||
</div>
|
</div>
|
||||||
<span>{data && data.pr_all_count}合并请求</span>
|
<span>{data && data.pr_all_count}合并请求</span>
|
||||||
|
@ -132,25 +152,25 @@ class Activity extends Component{
|
||||||
<p className="percent_red" style={{width:`${third_per}`}}></p>
|
<p className="percent_red" style={{width:`${third_per}`}}></p>
|
||||||
<p className="percent_green" style={{width:`${fourth_per}`}}></p>
|
<p className="percent_green" style={{width:`${fourth_per}`}}></p>
|
||||||
</div>
|
</div>
|
||||||
<span>{data && data.issues_count}任务</span>
|
<span>{data && data.issues_count}疑修</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<ul className="percentBox">
|
<ul className="percentBox">
|
||||||
<li>
|
<li>
|
||||||
<span className="purple">{data && data.pr_count}</span>
|
<span className="purple">{data && data.pr_count}</span>
|
||||||
<span className="change" onClick={()=>this.changeTrends("PullRequest","close")}>已处理的合并请求</span>
|
<span className={type==="PullRequest" && status==="delay" ?`change active`:"change"} onClick={()=>this.changeTrends("PullRequest","delay")}>已处理的合并请求</span>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<span className="green">{data && data.new_pr_count}</span>
|
<span className="green">{data && data.new_pr_count}</span>
|
||||||
<span className="change" onClick={()=>this.changeTrends("PullRequest","create")}>未处理的合并请求</span>
|
<span className={type==="PullRequest"&& status==="not_delay" ?`change active`:"change"} onClick={()=>this.changeTrends("PullRequest","not_delay")}>未处理的合并请求</span>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<span className="red">{data && data.close_issues_count}</span>
|
<span className="red">{data && data.close_issues_count}</span>
|
||||||
<span className="change" onClick={()=>this.changeTrends("Issue","close")}>已关闭的任务</span>
|
<span className={type==="Issue"&& status==="delay" ?`change active`:"change"} onClick={()=>this.changeTrends("Issue","delay")}>已关闭的疑修</span>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<span className="green">{data && data.open_issues_count}</span>
|
<span className="green">{data && data.open_issues_count}</span>
|
||||||
<span className="change" onClick={()=>this.changeTrends("Issue","create")}>未处理的任务</span>
|
<span className={type==="Issue"&& status==="not_delay" ?`change active`:"change"} onClick={()=>this.changeTrends("Issue","not_delay")}>未处理的疑修</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -14,25 +14,25 @@ class ActivityItem extends Component {
|
||||||
{/* 如果是版本发布 */}
|
{/* 如果是版本发布 */}
|
||||||
{item.trend_type === "VersionRelease" ?
|
{item.trend_type === "VersionRelease" ?
|
||||||
<p className="itemLine">
|
<p className="itemLine">
|
||||||
<Link to={`/projects/${owner}/${projectsId}/version`} 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>
|
<span className="activity_type">{item.trend_type}</span>
|
||||||
</p >
|
</p >
|
||||||
:
|
:
|
||||||
// 如果是任务
|
// 如果是任务
|
||||||
item.trend_type === "Issue" ?
|
item.trend_type === "Issue" ?
|
||||||
<p className="itemLine">
|
<p className="itemLine">
|
||||||
<Link to={`/projects/${owner}/${projectsId}/issues/${item.trend_id}/detail`} 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>
|
<span className="activity_type">{item.trend_type}</span>
|
||||||
</p >
|
</p >
|
||||||
:
|
:
|
||||||
// 如果是合并请求
|
// 如果是合并请求
|
||||||
<p className="itemLine">
|
<p className="itemLine">
|
||||||
<Link to={`/projects/${owner}/${projectsId}/pulls/${item.trend_id}/Messagecount`} 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>
|
<span className="activity_type">{item.trend_type}</span>
|
||||||
</p >
|
</p >
|
||||||
}
|
}
|
||||||
<p className="itemLine mt10">
|
<p className="itemLine mt10">
|
||||||
<Link to={`/users/${item && item.user_login}`} className="show-user-link">
|
<Link to={`/${item && item.user_login}`} className="show-user-link">
|
||||||
<img alt="" src={getImageUrl(`/${item.user_avatar}`)} className="createImage" />
|
<img alt="" src={getImageUrl(`/${item.user_avatar}`)} className="createImage" />
|
||||||
<span className="mr20">{item.user_name}</span>
|
<span className="mr20">{item.user_name}</span>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
|
@ -107,6 +107,10 @@
|
||||||
color: black;
|
color: black;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
.change:hover{
|
.change.active{
|
||||||
color: #4183c4;
|
color: #466AFF !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.change:hover{
|
||||||
|
color: #466AFF;
|
||||||
}
|
}
|
|
@ -0,0 +1,119 @@
|
||||||
|
import React , { useState , useEffect } from 'react';
|
||||||
|
import { Spin } from 'antd';
|
||||||
|
import { Blueback } from '../Component/layout';
|
||||||
|
import Editor from "react-monaco-editor";
|
||||||
|
import Modals from './DisposeModal';
|
||||||
|
import FileLanguage from '../Component/OpsFileLanguage';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
|
||||||
|
function Dispose(props){
|
||||||
|
const [ spining , setSpining ] = useState(true);
|
||||||
|
const [ info , setInfo ] = useState('.trustie-pipeline.yml');
|
||||||
|
const [ visible , setVisible ] = useState(false);
|
||||||
|
const [ ymlValue , setYmlValue ] = useState("");
|
||||||
|
const [ sha , setSha ] = useState(undefined);
|
||||||
|
const [ fileLanguage , setFileLanguage ] = useState(undefined);
|
||||||
|
const [ first , setFirst ] = useState(false);
|
||||||
|
|
||||||
|
let projectsId = props.match.params.projectsId;
|
||||||
|
let owner = props.match.params.owner;
|
||||||
|
useEffect(()=>{
|
||||||
|
if(projectsId){
|
||||||
|
const url = `/${owner}/${projectsId}/get_trustie_pipeline.json`;
|
||||||
|
axios.get(url,{
|
||||||
|
params:{
|
||||||
|
project_id:projectsId
|
||||||
|
}
|
||||||
|
}).then(result=>{
|
||||||
|
if(result && result.data.content){
|
||||||
|
setInfo(result.data.name);
|
||||||
|
setYmlValue(result.data.content);
|
||||||
|
setFirst(true);
|
||||||
|
setSha(result.data.sha);
|
||||||
|
}else{
|
||||||
|
setFirst(false);
|
||||||
|
}
|
||||||
|
setSpining(false);
|
||||||
|
}).catch(error=>{
|
||||||
|
console.log(error);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},[projectsId])
|
||||||
|
|
||||||
|
// 修改文件内容
|
||||||
|
function changeEditor(value){
|
||||||
|
setYmlValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 切换语言
|
||||||
|
function select_language(value,array){
|
||||||
|
setFileLanguage(value);
|
||||||
|
setYmlValue( array && array.content);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确定提交
|
||||||
|
function submit(){
|
||||||
|
let url = '';
|
||||||
|
const { defaultBranch } = props;
|
||||||
|
let params = {
|
||||||
|
branch: defaultBranch,
|
||||||
|
content:ymlValue,
|
||||||
|
filepath:info,
|
||||||
|
message:''
|
||||||
|
}
|
||||||
|
if(first){
|
||||||
|
// 为true,则是编辑否则是新建
|
||||||
|
url = `/${owner}/${projectsId}/update_trustie_pipeline.json`;
|
||||||
|
axios.put(url,{
|
||||||
|
...params,
|
||||||
|
sha
|
||||||
|
}).then(result=>{
|
||||||
|
if(result){
|
||||||
|
setVisible(true);
|
||||||
|
}
|
||||||
|
}).catch(error=>{
|
||||||
|
console.log(error);
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
url = `/${owner}/${projectsId}/create_file.json`;
|
||||||
|
axios.post(url,params).then(result=>{
|
||||||
|
if(result){
|
||||||
|
setVisible(true);
|
||||||
|
}
|
||||||
|
}).catch(error=>{
|
||||||
|
console.log(error);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function suresubmit(){
|
||||||
|
setVisible(false);
|
||||||
|
props.history.push(`/projects/${owner}/${projectsId}/devops/list`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(
|
||||||
|
<Spin spinning={spining}>
|
||||||
|
<Modals visible={visible} closeFunc={(flag)=>setVisible(flag)} sureFunc={suresubmit}></Modals>
|
||||||
|
<p>编程语言:</p>
|
||||||
|
|
||||||
|
<div className="mt20 mb20">
|
||||||
|
<FileLanguage language={fileLanguage} select_language={select_language}/>
|
||||||
|
</div>
|
||||||
|
<p>配置脚本:</p>
|
||||||
|
<div className="editorBody">
|
||||||
|
<p className="editorHead">{info}</p>
|
||||||
|
<Editor
|
||||||
|
height="300px"
|
||||||
|
language={"yml"}
|
||||||
|
theme={"vs-grey"}
|
||||||
|
defaultValue="请输入内容"
|
||||||
|
value={ymlValue}
|
||||||
|
options={"editor_options"}
|
||||||
|
onChange={changeEditor}
|
||||||
|
></Editor>
|
||||||
|
</div>
|
||||||
|
<Blueback onClick={submit}>确定提交</Blueback>
|
||||||
|
</Spin>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default Dispose;
|
|
@ -1,39 +1,27 @@
|
||||||
import React, { Component } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { Dropdown, Icon, Tooltip } from 'antd';
|
import { Menu } from 'antd';
|
||||||
import "./branch.css";
|
import "./branch.scss";
|
||||||
|
import CopyTool from '../Component/CopyTool';
|
||||||
|
|
||||||
class CloneAddress extends Component {
|
function CloneAddress({http_url , ssh_url , zip_url , tar_url}) {
|
||||||
// 点击按钮复制功能
|
const [ key , setKey ] = useState("HTTP");
|
||||||
jsCopy = () => {
|
|
||||||
var e = document.getElementById("copy_rep_content");
|
|
||||||
e.select();
|
|
||||||
document.execCommand("Copy");
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { http_url, downloadUrl } = this.props;
|
|
||||||
return (
|
return (
|
||||||
|
<div className="downMenu">
|
||||||
|
<div>
|
||||||
|
<Menu className="urlMenu" selectedKeys={[key]} mode={"horizontal"}>
|
||||||
|
<Menu.Item key="HTTP" onClick={(e)=>{setKey(e.key)}}>HTTP</Menu.Item>
|
||||||
|
{ssh_url && <Menu.Item key="SSH" onClick={(e)=>{setKey(e.key)}}>SSH</Menu.Item>}
|
||||||
|
</Menu>
|
||||||
<div className="gitAddressClone">
|
<div className="gitAddressClone">
|
||||||
{/* <p className="addressTips"><span>版本库地址已变更,请基于新地址提交代码</span></p> */}
|
<input type="text" id="copy_rep_content" value={key==="HTTP" ? http_url:ssh_url} />
|
||||||
{
|
<CopyTool inputId="copy_rep_content" className="copytool"/>
|
||||||
http_url && <span>HTTP</span>
|
</div>
|
||||||
}
|
</div>
|
||||||
<input type="text" id="copy_rep_content" value={http_url} />
|
<Menu className="edu-txt-center">
|
||||||
<Tooltip title="复制链接">
|
{zip_url && <Menu.Item style={{borderTop:"1px solid #eee"}}><a href={zip_url}>下载 ZIP</a></Menu.Item>}
|
||||||
<span className="color-blue" onClick={() => this.jsCopy()}><i className="iconfont icon-fuzhi"></i></span>
|
{tar_url && <Menu.Item><a href={tar_url}>下载 TAR.GZ</a></Menu.Item>}
|
||||||
</Tooltip>
|
</Menu>
|
||||||
{
|
|
||||||
downloadUrl &&
|
|
||||||
<span>
|
|
||||||
<Dropdown overlay={downloadUrl} trigger={['click']} placement="bottomRight">
|
|
||||||
<a className="ant-dropdown-link">
|
|
||||||
<Icon type="cloud-download" className="font-18 fl color-blue" />
|
|
||||||
</a>
|
|
||||||
</Dropdown>
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
export default CloneAddress;
|
export default CloneAddress;
|
|
@ -1,116 +1,67 @@
|
||||||
import React , { useState , useEffect } from 'react';
|
import React , { useState , useEffect , useRef } from 'react';
|
||||||
import { Popover , Input , Spin } from 'antd';
|
import { Dropdown} from 'antd';
|
||||||
import './branch.css';
|
import './branch.scss';
|
||||||
import { getBranch , getTag } from '../GetData/getData';
|
import SelectOverlay from './SelectOverlay';
|
||||||
|
import { findDOMNode } from 'react-dom';
|
||||||
|
import { turnbar } from 'educoder';
|
||||||
|
|
||||||
export default (({ projectsId , branch , owner , changeBranch , branchList , tagflag = true })=>{
|
export default (({ projectsId , branch , owner , changeBranch , branchList , tagflag = true })=>{
|
||||||
const [ showValue , setShowValue ] = useState(branch);
|
const [ showValue , setShowValue ] = useState(branch);
|
||||||
const [ inputValue , setInputValue] = useState(undefined);
|
const [ visible , setVisible ] = useState(false);
|
||||||
const [ nav , setNav ] = useState(0);
|
|
||||||
const [ isSpin , setIsSpin ] = useState(true);
|
|
||||||
const [ flag , setFlag ] = useState(false);
|
|
||||||
|
|
||||||
const [ data , setData ] = useState(undefined);
|
const refFa = useRef(null);
|
||||||
const [ datas , setDatas ] = useState(undefined);
|
const refBox = useRef(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
document.addEventListener('click', clickMe , false);
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const clickMe = ({ target }) => {
|
||||||
|
// 查找父组件
|
||||||
|
const faComponent = findDOMNode(refFa.current);
|
||||||
|
const boxComponent = findDOMNode(refBox.current);
|
||||||
|
|
||||||
|
if (faComponent && boxComponent) {
|
||||||
|
const isChild = faComponent.contains(target);
|
||||||
|
const isBox = boxComponent.contains(target);
|
||||||
|
if(!isChild && !isBox){
|
||||||
|
setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
setShowValue(branch);
|
setShowValue(branch);
|
||||||
},[branch])
|
},[branch])
|
||||||
|
|
||||||
useEffect(()=>{
|
function ChangeB(params) {
|
||||||
document.body.addEventListener('click', e => {
|
setVisible(false);
|
||||||
let name = e.target.className;
|
let en = turnbar(params);
|
||||||
let turn = name === "ant-input OptionsInput" || name === "navli active"|| name === "navli" || name === "padding10 bor-bottom-greyE";
|
changeBranch(en);
|
||||||
if(turn){
|
|
||||||
return;
|
|
||||||
}else{
|
|
||||||
setFlag(false);
|
|
||||||
}
|
}
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
useEffect(()=>{
|
|
||||||
if(branchList){
|
|
||||||
setData(branchList);
|
|
||||||
setDatas(branchList);
|
|
||||||
setIsSpin(false);
|
|
||||||
}
|
|
||||||
},[branchList])
|
|
||||||
|
|
||||||
|
|
||||||
async function getBranchs(id,owner){
|
|
||||||
let result = await getBranch(id,owner);
|
|
||||||
setData(result);
|
|
||||||
setDatas(result);
|
|
||||||
setIsSpin(false);
|
|
||||||
}
|
|
||||||
async function getTags(id,owner){
|
|
||||||
let result = await getTag(id,owner);
|
|
||||||
setData(result);
|
|
||||||
setDatas(result);
|
|
||||||
setIsSpin(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
function changeInputValue(e){
|
|
||||||
setInputValue(e.target.value);
|
|
||||||
let filter = e.target.value ? data && data.length>0 && data.filter(item=>item.name.indexOf(e.target.value)>-1) : data;
|
|
||||||
setDatas(filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
function changeNav(nav){
|
|
||||||
setNav(nav);
|
|
||||||
setIsSpin(true);
|
|
||||||
if(nav === 0){
|
|
||||||
getBranchs(projectsId,owner);
|
|
||||||
}else{
|
|
||||||
getTags(projectsId,owner);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function chooseitem(value){
|
|
||||||
// setShowValue(value);
|
|
||||||
changeBranch(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const menu = (
|
const menu = (
|
||||||
<div>
|
<div ref={refFa}>
|
||||||
<div className="padding10 bor-bottom-greyE">
|
<SelectOverlay
|
||||||
<Input
|
visible={visible}
|
||||||
placeholder="请输入分支或标签名称搜索"
|
changeBranch={ChangeB}
|
||||||
autocomplete="off" className="OptionsInput" value={inputValue}
|
tagflag={tagflag}
|
||||||
onChange={changeInputValue} style={{width:"220px"}}
|
projectsId={projectsId}
|
||||||
|
owner={owner}
|
||||||
|
branchList={branchList}
|
||||||
/>
|
/>
|
||||||
<ul className="navUl">
|
|
||||||
<li className={nav === 0?"navli active":"navli"} onClick={()=>changeNav(0)}><i className="iconfont icon-fenzhi1 font-14 mr3"></i>分支列表</li>
|
|
||||||
{ tagflag && <li className={nav === 1?"navli active":"navli"} onClick={()=>changeNav(1)}><i className="iconfont icon-biaoqian3 font-14 mr3"></i>标签列表</li> }
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<Spin spinning={isSpin}>
|
|
||||||
<ul className="OptionsUl" id="ul-btn">
|
|
||||||
{
|
|
||||||
datas && datas.length>0 ?
|
|
||||||
datas.map((item,key)=>{
|
|
||||||
return(
|
|
||||||
<li key={key} onClick={()=>chooseitem(item.name)}><a className="task-hide ulALink">{item.name}</a></li>
|
|
||||||
)
|
|
||||||
}):
|
|
||||||
<p className="listTips">暂无{inputValue}{nav === 0 ?"分支":"标签"}~</p>
|
|
||||||
}
|
|
||||||
</ul>
|
|
||||||
</Spin>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
return(
|
return(
|
||||||
<Popover placement='bottomLeft' visible={flag} content={menu} onClick={()=>setFlag(!flag)} overlayClassName="branch-tagBox-list">
|
<Dropdown placement='bottomLeft' visible={visible} overlay={menu} overlayClassName="branch-tagBox-list" trigger={['click']} >
|
||||||
<div className="branch-tagBox">
|
<div className="branch-tagBox" ref={refBox} onClick={()=>setVisible(visible ? false : true)}>
|
||||||
{/* {nav === 0 ?"分支":"标签"} */}
|
{/* {nav === 0 ?"分支":"标签"} */}
|
||||||
<span className="color-grey-9 mr3 ml8"><i className="iconfont icon-fenzhi2 font-18"></i></span>
|
<span className="color-grey-9 mr3 ml8"><i className="iconfont icon-fenzhi2 font-18"></i></span>
|
||||||
<a className="ant-dropdown-link">
|
<span className="ant-dropdown-link task-hide" style={{fontWeight:"500",minWidth:"45px",maxWidth:"270px"}}>
|
||||||
{showValue}
|
{showValue}
|
||||||
</a>
|
</span>
|
||||||
<i className="showtag iconfont icon-xiajiantou font-14 color-grey-9 mr8" />
|
<i className="showtag iconfont icon-sanjiaoxing-down font-15 color-grey-9 mr5 ml5 mt1" />
|
||||||
</div>
|
</div>
|
||||||
</Popover>
|
</Dropdown>
|
||||||
)
|
)
|
||||||
})
|
})
|
|
@ -0,0 +1,90 @@
|
||||||
|
import React , { useState , useEffect } from 'react';
|
||||||
|
import { Input , Spin , Menu } from 'antd';
|
||||||
|
import { getBranch , getTag } from '../GetData/getData';
|
||||||
|
|
||||||
|
function SelectOverlay({ changeBranch , tagflag , projectsId , owner , visible }) {
|
||||||
|
const [ inputValue , setInputValue] = useState(undefined);
|
||||||
|
const [ nav , setNav ] = useState(0);
|
||||||
|
const [ isSpin , setIsSpin ] = useState(true);
|
||||||
|
|
||||||
|
const [ data , setData ] = useState(undefined);
|
||||||
|
const [ datas , setDatas ] = useState(undefined);
|
||||||
|
const [ keys ,setKeys] = useState("branch");
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
if(visible){
|
||||||
|
setKeys("branch");
|
||||||
|
getBranchs(projectsId,owner);
|
||||||
|
setIsSpin(true);
|
||||||
|
}
|
||||||
|
},[visible])
|
||||||
|
|
||||||
|
async function getBranchs(id,owner){
|
||||||
|
let result = await getBranch(id,owner);
|
||||||
|
setData(result);
|
||||||
|
setDatas(result);
|
||||||
|
setIsSpin(false);
|
||||||
|
}
|
||||||
|
async function getTags(id,owner){
|
||||||
|
let result = await getTag(id,owner);
|
||||||
|
setData(result);
|
||||||
|
setDatas(result);
|
||||||
|
setIsSpin(false);
|
||||||
|
}
|
||||||
|
function chooseitem(value){
|
||||||
|
changeBranch(value);
|
||||||
|
}
|
||||||
|
function changeInputValue(e){
|
||||||
|
setInputValue(e.target.value);
|
||||||
|
let filter = e.target.value ? data && data.length>0 && data.filter(item=>item.name.indexOf(e.target.value)>-1) : data;
|
||||||
|
setDatas(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
function changeNav(e){
|
||||||
|
setKeys(e.key);
|
||||||
|
setIsSpin(true);
|
||||||
|
if(e.key === "branch"){
|
||||||
|
getBranchs(projectsId,owner);
|
||||||
|
setNav(0);
|
||||||
|
}else{
|
||||||
|
getTags(projectsId,owner);
|
||||||
|
setNav(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(
|
||||||
|
<div className="overlayBranch">
|
||||||
|
<div className="padding15" style={{paddingBottom:"0px"}}>
|
||||||
|
<Input
|
||||||
|
prefix={<i className="iconfont icon-sousuo_icon1 font-14"></i>}
|
||||||
|
placeholder={`请输入分支${tagflag ? "或标签" :""}名称搜索`}
|
||||||
|
autocomplete="off" className="OptionsInput"
|
||||||
|
value={inputValue}
|
||||||
|
onChange={changeInputValue}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<Menu mode="horizontal" className="navUl" selectedKeys={[keys]} onClick={changeNav}>
|
||||||
|
<Menu.Item key={"branch"}>分支</Menu.Item>
|
||||||
|
{ tagflag && <Menu.Item key={"tag"}>标签</Menu.Item> }
|
||||||
|
</Menu>
|
||||||
|
<Spin spinning={isSpin}>
|
||||||
|
<ul className="OptionsUl" id="ul-btn">
|
||||||
|
{
|
||||||
|
datas && datas.length>0 &&
|
||||||
|
datas.map((item,key)=>{
|
||||||
|
return(
|
||||||
|
<li key={key} onClick={()=>chooseitem(item.name)}><a className="task-hide ulALink">{item.name}</a></li>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
{
|
||||||
|
datas && datas.length === 0 &&
|
||||||
|
<p className="listTips">暂无{inputValue}{nav === 0 ?"分支":"标签"}~</p>
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
</Spin>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default SelectOverlay;
|
|
@ -1,84 +0,0 @@
|
||||||
.branchDropdown{
|
|
||||||
border:1px solid #eee;
|
|
||||||
border-radius: 4px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
height: 40px;
|
|
||||||
line-height: 40px;
|
|
||||||
min-width: 220px;
|
|
||||||
}
|
|
||||||
.branchDropdown .ant-dropdown-trigger{
|
|
||||||
width: 100%;
|
|
||||||
padding:0px 15px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.branchOptions{
|
|
||||||
width: 220px;
|
|
||||||
box-shadow: 0px 0px 3px 1px rgba(134, 134, 134, 0.4);
|
|
||||||
border-radius: 3px;
|
|
||||||
background: #fff;
|
|
||||||
max-height: 300px;
|
|
||||||
}
|
|
||||||
.OptionsUl{
|
|
||||||
max-height: 220px;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
.OptionsUl li{
|
|
||||||
height: 35px;
|
|
||||||
line-height: 35px;
|
|
||||||
cursor: pointer;
|
|
||||||
padding:0px 10px;
|
|
||||||
}
|
|
||||||
.OptionsUl li:hover{
|
|
||||||
background-color: #F0F0F0;
|
|
||||||
}
|
|
||||||
.OptionsUl li a{
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.OptionsInput{
|
|
||||||
height: 32px;
|
|
||||||
padding-left: 4px;
|
|
||||||
line-height: 32px;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.branch-tagBox{
|
|
||||||
border:1px solid #eee;
|
|
||||||
border-radius: 3px;
|
|
||||||
height: 40px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
cursor: pointer;
|
|
||||||
min-width: 140px;
|
|
||||||
}
|
|
||||||
.branch-tagBox-list .ant-popover-arrow{
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.branch-tagBox-list.ant-popover.ant-popover-placement-bottom{
|
|
||||||
padding-top:0px;
|
|
||||||
}
|
|
||||||
.branch-tagBox .ant-dropdown-link{
|
|
||||||
display: block;
|
|
||||||
flex:1;
|
|
||||||
}
|
|
||||||
.branch-tagBox-list .ant-popover-inner-content{
|
|
||||||
padding:0px;
|
|
||||||
}
|
|
||||||
.navUl{
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
.navUl li{
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.navUl li.active{
|
|
||||||
color:#5091FF;
|
|
||||||
}
|
|
||||||
.listTips{
|
|
||||||
padding:20px 0px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
.branchDropdown{
|
||||||
|
border:1px solid #eee;
|
||||||
|
border-radius: 4px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
min-width: 220px;
|
||||||
|
}
|
||||||
|
.branchDropdown .ant-dropdown-trigger{
|
||||||
|
width: 100%;
|
||||||
|
padding:0px 15px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.branchOptions{
|
||||||
|
width: 220px;
|
||||||
|
box-shadow: 0px 0px 3px 1px rgba(134, 134, 134, 0.4);
|
||||||
|
border-radius: 3px;
|
||||||
|
background: #fff;
|
||||||
|
max-height: 300px;
|
||||||
|
}
|
||||||
|
.OptionsUl{
|
||||||
|
min-height: 50px;
|
||||||
|
max-height: 220px;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
.OptionsUl li{
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
cursor: pointer;
|
||||||
|
padding:0px 20px;
|
||||||
|
margin:5px 0px;
|
||||||
|
}
|
||||||
|
.OptionsUl li:hover{
|
||||||
|
background-color: #F0F0F0;
|
||||||
|
}
|
||||||
|
.OptionsUl li a{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.OptionsInput{
|
||||||
|
height: 32px;
|
||||||
|
padding-left: 4px;
|
||||||
|
line-height: 32px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.branch-tagBox{
|
||||||
|
border:1px solid #D0D0D0;
|
||||||
|
border-radius: 3px;
|
||||||
|
height: 32px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
min-width: 104px;
|
||||||
|
}
|
||||||
|
.branch-tagBox:hover{
|
||||||
|
background-color: #F3F4F6;
|
||||||
|
}
|
||||||
|
.branch-tagBox-list{
|
||||||
|
background: #FFFFFF;
|
||||||
|
box-shadow: 0px 4px 8px 2px rgba(212, 212, 212, 0.5);
|
||||||
|
border-radius: 4px;
|
||||||
|
.ant-popover-arrow{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
&.ant-popover.ant-popover-placement-bottom{
|
||||||
|
padding-top:0px;
|
||||||
|
}
|
||||||
|
.branch-tagBox .ant-dropdown-link{
|
||||||
|
display: block;
|
||||||
|
flex:1;
|
||||||
|
max-width: 105px;
|
||||||
|
}
|
||||||
|
.ant-popover-inner-content{
|
||||||
|
padding:0px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.overlayBranch{
|
||||||
|
width: 325px;
|
||||||
|
.navUl{
|
||||||
|
margin-top: 8px;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
li{
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
padding:0px 5px;
|
||||||
|
margin-left: 20px!important;
|
||||||
|
&.ant-menu-item-selected{
|
||||||
|
border-color:#466aff!important;
|
||||||
|
color:#466aff!important;
|
||||||
|
}
|
||||||
|
&.ant-menu-item-active{
|
||||||
|
border-color:transparent ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.listTips{
|
||||||
|
padding:20px 0px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.urlMenu{
|
||||||
|
line-height: 30px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
padding:15px 20px 0px 20px;
|
||||||
|
border-bottom: none;
|
||||||
|
li.ant-menu-item{
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
padding:0px 5px;
|
||||||
|
margin-right: 20px!important;
|
||||||
|
&.ant-menu-item-selected,&.ant-menu-item-active{
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
&.ant-menu-item-selected{
|
||||||
|
border-color:#466aff!important;
|
||||||
|
}
|
||||||
|
&.ant-menu-item-active{
|
||||||
|
border-color:transparent ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.copytool{
|
||||||
|
margin:0px 10px;
|
||||||
|
}
|
|
@ -55,6 +55,7 @@ function AddGroup({organizeId,getGroupID}){
|
||||||
|
|
||||||
function addCollaborator(){
|
function addCollaborator(){
|
||||||
getGroupID && getGroupID(id);
|
getGroupID && getGroupID(id);
|
||||||
|
setID(undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(
|
return(
|
||||||
|
|
|
@ -4,7 +4,7 @@ import axios from 'axios';
|
||||||
import { getImageUrl } from 'educoder';
|
import { getImageUrl } from 'educoder';
|
||||||
|
|
||||||
const { Option } = AutoComplete;
|
const { Option } = AutoComplete;
|
||||||
function AddMember({getID,login}){
|
function AddMember({getID,login,showNotification}){
|
||||||
const [ id , setID ] = useState(undefined);
|
const [ id , setID ] = useState(undefined);
|
||||||
const [ source , setSource ] = useState(undefined);
|
const [ source , setSource ] = useState(undefined);
|
||||||
const [ searchKey , setSearchKey ] = useState(undefined);
|
const [ searchKey , setSearchKey ] = useState(undefined);
|
||||||
|
@ -45,7 +45,7 @@ function AddMember({getID,login}){
|
||||||
src={getImageUrl(`/${item && item.image_url}`)}
|
src={getImageUrl(`/${item && item.image_url}`)}
|
||||||
alt=""
|
alt=""
|
||||||
/>
|
/>
|
||||||
<span className="ml10" style={{ "vertical-align": "middle" }}>
|
<span className="ml10" style={{ verticalAlign: "middle" }}>
|
||||||
{item.username}
|
{item.username}
|
||||||
<span className="color-grey ml10">({item.login})</span>
|
<span className="color-grey ml10">({item.login})</span>
|
||||||
</span>
|
</span>
|
||||||
|
@ -66,7 +66,13 @@ function AddMember({getID,login}){
|
||||||
};
|
};
|
||||||
|
|
||||||
function addCollaborator(){
|
function addCollaborator(){
|
||||||
|
if(source && source.length>0&&searchKey){
|
||||||
getID && getID(id);
|
getID && getID(id);
|
||||||
|
setSearchKey(undefined);
|
||||||
|
setID(undefined)
|
||||||
|
}else{
|
||||||
|
showNotification("请选择存在的用户!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return(
|
return(
|
||||||
|
|
|
@ -113,7 +113,14 @@ li.ant-menu-item{
|
||||||
z-index: 10000;
|
z-index: 10000;
|
||||||
}
|
}
|
||||||
.laterest{
|
.laterest{
|
||||||
color: #05690d;
|
background-color: #EF3131;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 12px;
|
||||||
|
margin-left: 10px;
|
||||||
|
padding:0px 5px;
|
||||||
|
border-radius: 2px;
|
||||||
|
height: 18px;
|
||||||
|
line-height: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 1800px){
|
@media screen and (max-width: 1800px){
|
||||||
|
@ -155,41 +162,301 @@ li.ant-menu-item{
|
||||||
margin:0px 20px!important;
|
margin:0px 20px!important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.hoverA{
|
||||||
|
display:flex;
|
||||||
|
align-items: center;
|
||||||
|
max-width: 78px;
|
||||||
|
&:hover a{
|
||||||
|
color:#2A61FF !important ;
|
||||||
|
}
|
||||||
|
}
|
||||||
.menuPanels{
|
.menuPanels{
|
||||||
width: 240px;
|
width: 295px;
|
||||||
height: 180px;
|
.leftline{
|
||||||
|
position: relative;
|
||||||
|
color: #666;
|
||||||
|
height: 16px;
|
||||||
|
margin-left: 14px;
|
||||||
|
font-size: 12px;
|
||||||
|
&::before{
|
||||||
|
position: absolute;
|
||||||
|
left: -7px;
|
||||||
|
top:3px;
|
||||||
|
height: 12px;
|
||||||
|
width: 1px;
|
||||||
|
background-color: #999;
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-btn{
|
||||||
|
height: 36px;
|
||||||
|
line-height: 34px;
|
||||||
|
width: 83px;
|
||||||
|
text-align: center;
|
||||||
|
padding:0px ;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 14px;
|
||||||
|
&.currentBtn{
|
||||||
|
cursor: default;
|
||||||
|
color: #333;
|
||||||
|
&:hover{
|
||||||
|
color: #333;
|
||||||
|
border-color: #d0d0d0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-btn-default{
|
||||||
|
color: #333;
|
||||||
|
border-color: #d0d0d0;
|
||||||
|
&:hover{
|
||||||
|
background: #F3F4F6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-btn{
|
||||||
|
width: 102px;
|
||||||
|
height: 32px;
|
||||||
|
line-height: 30px;
|
||||||
|
}
|
||||||
|
.ant-btn-primary{
|
||||||
|
color: #fff;
|
||||||
|
background-color: #466AFF;
|
||||||
|
border:none;
|
||||||
|
&:hover{
|
||||||
|
background-color: rgba(70,106,255,0.85);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.focusPanelHeadInfo{
|
||||||
|
padding:14px 16px;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
.ant-popover-content,.ant-popover-inner{
|
.ant-popover-content,.ant-popover-inner{
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
.ant-popover-inner-content{
|
||||||
|
padding:0px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.halfs{
|
.halfs{
|
||||||
margin-top: 24px;
|
margin-top: 24px;
|
||||||
padding:24px 0px 0px 0px;
|
padding:24px 0px 0px 0px;
|
||||||
border-top: 1px solid #e8e8e8;
|
border-top: 1px solid #e8e8e8;
|
||||||
.attrPerson{
|
|
||||||
padding-bottom: 24px;
|
|
||||||
}
|
}
|
||||||
|
.aboutSubTitle{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.menuMaininfos{
|
||||||
|
padding:10px 16px 14px;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
}
|
}
|
||||||
.menuinfos{
|
.menuinfos{
|
||||||
padding:15px 0px;
|
padding:10px 20px 16px;
|
||||||
&>a{
|
&>a{
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
border-right: 1px solid #eee;
|
|
||||||
flex: 1;
|
flex: 1;
|
||||||
& >span:first-child{
|
& >span:first-child{
|
||||||
font-size: 18px;
|
font-size: 16px;
|
||||||
font-weight: 400;
|
font-weight: 500;
|
||||||
color: #333;
|
color: #333;
|
||||||
|
line-height: 22px;
|
||||||
}
|
}
|
||||||
& >span:last-child{
|
& >span:last-child{
|
||||||
color: #666;
|
color: #666;
|
||||||
}
|
font-weight: 400;
|
||||||
&:last-child{
|
line-height: 20px;
|
||||||
border-right: none;
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-------------------个人主页:右侧提示区域--------------------------*/
|
||||||
|
.-task-sidebar {
|
||||||
|
position: fixed;
|
||||||
|
width: 40px;
|
||||||
|
right: 10px;
|
||||||
|
bottom: 80px;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1920px){
|
||||||
|
.-task-sidebar{
|
||||||
|
right:220px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 1750px){
|
||||||
|
.-task-sidebar{
|
||||||
|
right:160px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 1650px){
|
||||||
|
.-task-sidebar{
|
||||||
|
right:115px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 1550px){
|
||||||
|
.-task-sidebar{
|
||||||
|
right:90px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 1450px){
|
||||||
|
.-task-sidebar{
|
||||||
|
right:45px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 1200px){
|
||||||
|
.-task-sidebar{
|
||||||
|
right:0px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.-task-sidebar>div {
|
||||||
|
height: 48px;
|
||||||
|
line-height: 48px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
width: 48px;
|
||||||
|
color: #999;
|
||||||
|
font-size: 20px;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: #FFFFFF;
|
||||||
|
box-shadow: 0px 0px 12px 5px rgba(208, 208, 208, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.-task-sidebar>div i {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.-task-sidebar>div:hover i {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
.-task-sidebar>div:hover{
|
||||||
|
background: #466AFF;
|
||||||
|
box-shadow: 0px 0px 10px 2px #B6D0FC;
|
||||||
|
}
|
||||||
|
.helpBox{
|
||||||
|
width: 260px;
|
||||||
|
z-index: 103;
|
||||||
|
&.shareContent{
|
||||||
|
width: 160px;
|
||||||
|
}
|
||||||
|
.ant-popover-title{
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.ant-popover-inner-content{
|
||||||
|
padding:0px;
|
||||||
|
}
|
||||||
|
p.titlecontent{
|
||||||
|
font-size: 16px;
|
||||||
|
color: #333;
|
||||||
|
line-height: 20px;
|
||||||
|
padding:15px 20px;
|
||||||
|
}
|
||||||
|
.faqUl{
|
||||||
|
padding:10px 15px;
|
||||||
|
max-height: 230px;
|
||||||
|
overflow-y: auto;
|
||||||
|
font-size: 13px;
|
||||||
|
li{
|
||||||
|
background: #F5F5F5;
|
||||||
|
border-radius: 20px;
|
||||||
|
padding:0px 15px;
|
||||||
|
color: #333;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
margin-bottom: 3px !important;
|
||||||
|
a{
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
&:hover{
|
||||||
|
background-color: #D1E9FF;
|
||||||
|
a{
|
||||||
|
color: #333!important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.shareUl{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
li > i{
|
||||||
|
font-size: 32px!important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// tooltip样式
|
||||||
|
.tooltipBox .ant-tooltip-inner{
|
||||||
|
padding: 8px 12px;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.-task-desc {
|
||||||
|
background: #494949;
|
||||||
|
width: 90px;
|
||||||
|
line-height: 36px;
|
||||||
|
text-align: center;
|
||||||
|
position: absolute;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 13px;
|
||||||
|
z-index: 999999;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.-task-desc div {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: -7px;
|
||||||
|
height: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.-task-desc div img {
|
||||||
|
float: left
|
||||||
|
}
|
||||||
|
|
||||||
|
.-task-sidebar .scan_ewm {
|
||||||
|
position: absolute !important;
|
||||||
|
right: 45px !important;
|
||||||
|
bottom: 0px !important;
|
||||||
|
background-color: #494949 !important;
|
||||||
|
-webkit-box-sizing: border-box !important;
|
||||||
|
box-sizing: border-box !important;
|
||||||
|
font-size: 14px !important;
|
||||||
|
line-height: 16px !important;
|
||||||
|
display: none;
|
||||||
|
height: 213px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trangle_right {
|
||||||
|
position: absolute;
|
||||||
|
right: -5px;
|
||||||
|
bottom: 15px;
|
||||||
|
width: 0;
|
||||||
|
height: 0px;
|
||||||
|
border-top: 6px solid transparent;
|
||||||
|
border-left: 5px solid #494949;
|
||||||
|
border-bottom: 6px solid transparent
|
||||||
|
}
|
||||||
|
//头部输入框样式
|
||||||
|
.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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,13 +1,13 @@
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { AlignCenter , FlexAJ } from '../Component/layout';
|
import { AlignCenter , FlexAJ } from '../Component/layout';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { Popover , Spin } from 'antd';
|
import { Popover , Spin , Button } from 'antd';
|
||||||
import { getImageUrl } from 'educoder';
|
import { getImageUrl } from 'educoder';
|
||||||
import './Component.scss';
|
import './Component.scss';
|
||||||
import { getUser } from '../GetData/getData';
|
import { getUser } from '../GetData/getData';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
function Contributors({contributors,owner,projectsId}){
|
function Contributors({owner,projectsId,currentLogin}){
|
||||||
const [ menuList ,setMenuList ]= useState([]);
|
const [ menuList ,setMenuList ]= useState([]);
|
||||||
const [ list , setList ]= useState(undefined);
|
const [ list , setList ]= useState(undefined);
|
||||||
const [ total , setTotal ]= useState(0);
|
const [ total , setTotal ]= useState(0);
|
||||||
|
@ -16,11 +16,18 @@ function Contributors({contributors,owner,projectsId}){
|
||||||
const [ isSpin , setIsSpin ] = useState(false);
|
const [ isSpin , setIsSpin ] = useState(false);
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
if(contributors && contributors.total_count>0){
|
getData();
|
||||||
setTotal(contributors.total_count);
|
},[])
|
||||||
setList(contributors.list);
|
|
||||||
|
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=>{})
|
||||||
}
|
}
|
||||||
},[contributors])
|
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
if(login){
|
if(login){
|
||||||
|
@ -46,46 +53,60 @@ function Contributors({contributors,owner,projectsId}){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function renderOrganize(list) {
|
||||||
|
let str = "";
|
||||||
|
list.map(i=>{
|
||||||
|
str = str+i.name + "、";
|
||||||
|
})
|
||||||
|
return str && str.substr(0,str.length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
function setMenusFunc(data){
|
function setMenusFunc(data){
|
||||||
if(data){
|
if(data){
|
||||||
let ele = (
|
let ele = (
|
||||||
<Spin spinning={isSpin}>
|
<Spin spinning={isSpin}>
|
||||||
<FlexAJ>
|
<FlexAJ className="menuMaininfos">
|
||||||
<AlignCenter>
|
<AlignCenter>
|
||||||
<Link to={`/users/${data.login}`}><img src={getImageUrl(`/${data.image_url}`)} alt="" className="radius" width="38px" height="38px"/></Link>
|
<Link to={`/${data.login}`}><img src={getImageUrl(`/${data.image_url}`)} alt="" className="radius" width="38px" height="38px"/></Link>
|
||||||
<Link to={`/users/${data.login}`} className="ml10">{data.name}</Link>
|
|
||||||
</AlignCenter>
|
<div className="ml10">
|
||||||
|
<Link to={`/${data.login}`}>{data.name}</Link>
|
||||||
|
{ data.location && <span className="leftline">{data.location}</span> }
|
||||||
{
|
{
|
||||||
data.is_watch ? <a className="color-grey-9" onClick={()=>FocusFunc(false,data.login)}>取消关注</a>:<a className="color-blue" onClick={()=>FocusFunc(true,data.login)}>关注</a>
|
data.organizations && data.organizations.length>0&&
|
||||||
|
<p className="task-hide" style={{maxWidth:"215px"}}>
|
||||||
|
所属组织:{renderOrganize(data.organizations)}
|
||||||
|
</p>
|
||||||
}
|
}
|
||||||
</FlexAJ>
|
|
||||||
<AlignCenter className="menuinfos">
|
|
||||||
<a href={data.projects_url}>
|
|
||||||
<span>{data.projects_count}</span>
|
|
||||||
<span>项目数</span>
|
|
||||||
</a>
|
|
||||||
<a href={data.followers_url}>
|
|
||||||
<span>{data.followers_count}</span>
|
|
||||||
<span>粉丝数</span>
|
|
||||||
</a>
|
|
||||||
<a href={data.following_url}>
|
|
||||||
<span>{data.following_count}</span>
|
|
||||||
<span>关注数</span>
|
|
||||||
</a>
|
|
||||||
</AlignCenter>
|
|
||||||
{
|
|
||||||
data.organizations && data.organizations.length > 0 ?
|
|
||||||
<AlignCenter className="font-12 pt4 pb4">
|
|
||||||
<span>所属组织:</span>
|
|
||||||
<div className="task-hide flex1">
|
|
||||||
{renderArray(data.organizations)}
|
|
||||||
</div>
|
</div>
|
||||||
</AlignCenter>
|
</AlignCenter>
|
||||||
:""
|
</FlexAJ>
|
||||||
}
|
<AlignCenter className="menuinfos">
|
||||||
|
<Link to={`/${data.login}/projects`}>
|
||||||
|
<span>{data.projects_count}</span>
|
||||||
|
<span>项目数</span>
|
||||||
|
</Link>
|
||||||
|
<Link to={`/${data.login}/followers`}>
|
||||||
|
<span>{data.followers_count}</span>
|
||||||
|
<span>粉丝数</span>
|
||||||
|
</Link>
|
||||||
|
<Link to={`/${data.login}/following`}>
|
||||||
|
<span>{data.following_count}</span>
|
||||||
|
<span>关注数</span>
|
||||||
|
</Link>
|
||||||
|
</AlignCenter>
|
||||||
|
<div className={"pb20"} style={{display:"flex",justifyContent:'center'}}>
|
||||||
{
|
{
|
||||||
data.location && <AlignCenter className="font-12 pt4 pb4"><span>所在地址:</span><span className="ml5">{data.location}</span></AlignCenter>
|
currentLogin && (currentLogin === data.login)
|
||||||
|
?
|
||||||
|
<Button className="currentBtn">当前用户</Button>
|
||||||
|
:
|
||||||
|
data.is_watch ?
|
||||||
|
<Button type={"default"} onClick={()=>FocusFunc(false,data.login)}>已关注</Button>
|
||||||
|
:
|
||||||
|
<Button type={"primary"} onClick={()=>FocusFunc(true,data.login)}>关注TA</Button>
|
||||||
}
|
}
|
||||||
|
</div>
|
||||||
</Spin>
|
</Spin>
|
||||||
)
|
)
|
||||||
setMenu(ele);
|
setMenu(ele);
|
||||||
|
@ -134,27 +155,26 @@ function Contributors({contributors,owner,projectsId}){
|
||||||
}
|
}
|
||||||
|
|
||||||
return(
|
return(
|
||||||
|
total > 0 ?
|
||||||
<div className="halfs">
|
<div className="halfs">
|
||||||
<FlexAJ>
|
<Link to={`/${owner}/${projectsId}/contribute`} className="font-16 color-ooo hoverA">
|
||||||
<AlignCenter><span className="font-16 color-grey-6">贡献者</span>{ contributors && contributors.total_count > 0 && <span className="infoCount">{contributors.total_count}</span>}</AlignCenter>
|
<span>贡献者</span>
|
||||||
<Link className="font-12 color-grey-9" to={`/projects/${owner}/${projectsId}/contribute`}>全部</Link>
|
{ total > 0 && <span className="infoCount">{total}</span>}
|
||||||
</FlexAJ>
|
</Link>
|
||||||
<div className="attrPerson" onMouseLeave={()=>setVisibleFunc(false)}>
|
<div className="attrPerson" onMouseLeave={()=>setVisibleFunc(false)}>
|
||||||
{
|
{
|
||||||
total > 0 ?
|
list && list.length>0 && list.map((item,key)=>{
|
||||||
list.map((item,key)=>{
|
|
||||||
return(
|
return(
|
||||||
<Popover content={menu} visible={item.visible} overlayClassName="menuPanels" placement="top">
|
<Popover content={menu} visible={item.visible} overlayClassName="menuPanels" placement="top">
|
||||||
<Link key={key} to={`/users/${item.login}`}>
|
<Link key={key} to={`/${item.login}`}>
|
||||||
<img src={getImageUrl(`/${item.image_url}`)} alt="" onMouseOver={()=>setVisibleFunc(true,item.login,key)}/>
|
<img src={getImageUrl(`/${item.image_url}`)} alt="" onMouseOver={()=>setVisibleFunc(true,item.login,key)}/>
|
||||||
</Link>
|
</Link>
|
||||||
</Popover>
|
</Popover>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
:""
|
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>:""
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
export default Contributors;
|
export default Contributors;
|
|
@ -0,0 +1,51 @@
|
||||||
|
import React, { useState, useCallback, memo } from 'react';
|
||||||
|
import { Tooltip } from 'antd';
|
||||||
|
|
||||||
|
CopyTool.defaultProps = {
|
||||||
|
beforeText: '复制链接', //浮动过去显示的文字
|
||||||
|
afterText: '复制成功', //点击后显示的文字
|
||||||
|
className: '', //传给svg的class
|
||||||
|
inputId: 'copyText', //要复制的文本的ID
|
||||||
|
timeOut:true, //复制后将浮动的文字改为beforeText
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function CopyTool({ beforeText, afterText, className , inputId , timeOut }) {
|
||||||
|
const [title, setTitle] = useState(() => {
|
||||||
|
return beforeText;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 复制链接
|
||||||
|
const copyUrl = useCallback(() => {
|
||||||
|
const copyEle = document.querySelector(`#${inputId}`); // 获取要复制的节点
|
||||||
|
if (!copyEle) {
|
||||||
|
console.error("您的CopyTool未设置正确的inputId");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
copyEle.select(); // 执行选中元素
|
||||||
|
if (document.execCommand('copy')) {
|
||||||
|
document.execCommand('copy');
|
||||||
|
}
|
||||||
|
document.getSelection().removeAllRanges();
|
||||||
|
|
||||||
|
setTitle(afterText);
|
||||||
|
if(timeOut){
|
||||||
|
setTimeout(function(){
|
||||||
|
setTitle(beforeText);
|
||||||
|
},1500)
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Tooltip
|
||||||
|
placement="top"
|
||||||
|
title={title}
|
||||||
|
onVisibleChange={() => { setTitle(beforeText) }}
|
||||||
|
>
|
||||||
|
<i className={`iconfont icon-fuzhiicon ${className}`} style={{ color: '#466aff' }} onClick={copyUrl}></i>
|
||||||
|
</Tooltip>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export default memo(CopyTool);
|
|
@ -0,0 +1,33 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { AlignCenter } from '../layout';
|
||||||
|
import { Button } from 'antd';
|
||||||
|
import Modals from '../PublicModal/Index';
|
||||||
|
|
||||||
|
function DeleteBox({
|
||||||
|
visible ,
|
||||||
|
onCancel ,
|
||||||
|
onSuccess ,
|
||||||
|
title ,
|
||||||
|
subTitle,
|
||||||
|
content
|
||||||
|
}) {
|
||||||
|
return(
|
||||||
|
<Modals
|
||||||
|
title={title}
|
||||||
|
btn={
|
||||||
|
<div>
|
||||||
|
<Button size={'large'} onClick={onCancel}>取消</Button>
|
||||||
|
<Button type={"danger"} size={"large"} onClick={onSuccess}>确认删除</Button>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
onCancel={onCancel}
|
||||||
|
visible={visible}
|
||||||
|
>
|
||||||
|
<div className="desc">
|
||||||
|
<AlignCenter className="descMain"><i className="iconfont icon-shanchu_tc_icon mr10"></i>{content}</AlignCenter>
|
||||||
|
<p className="task-hide-2" style={{WebkitLineClamp:5}}>删除后未来事件将不会推送至此Webhook地址:<span title={subTitle}>{subTitle}</span></p>
|
||||||
|
</div>
|
||||||
|
</Modals>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default DeleteBox;
|
|
@ -1,5 +1,6 @@
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { Drawer , Tree , Spin } from 'antd';
|
import { Drawer , Tree , Spin } from 'antd';
|
||||||
|
import { turnbar} from 'educoder';
|
||||||
import './Component.scss';
|
import './Component.scss';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
const { TreeNode , DirectoryTree } = Tree;
|
const { TreeNode , DirectoryTree } = Tree;
|
||||||
|
@ -71,7 +72,8 @@ function DrawerPanel({visible,onClose,branch,owner,projectsId,history, name , li
|
||||||
let dataref = event.node.props.dataRef;
|
let dataref = event.node.props.dataRef;
|
||||||
if(dataref.type==="file"){
|
if(dataref.type==="file"){
|
||||||
onClose();
|
onClose();
|
||||||
history.push(`/projects/${owner}/${projectsId}/tree/${branch}/${dataref.path}`);
|
let value = turnbar(branch);
|
||||||
|
history.push(`/${owner}/${projectsId}/tree/${value}/${dataref.path}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
.ant-modal-mask{
|
.ant-modal-mask{
|
||||||
z-index: 1001;
|
z-index: 1031;
|
||||||
}
|
}
|
||||||
.ant-modal-wrap{
|
.ant-modal-wrap{
|
||||||
z-index: 1002;
|
z-index: 1032;
|
||||||
.ant-form-explain{
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
import React, { useState } from "react";
|
||||||
|
import { Input ,notification} from "antd";
|
||||||
|
|
||||||
|
const { Search } = Input;
|
||||||
|
export default ({history}) => {
|
||||||
|
const [openSearch, setOpenSearch] = useState(false);
|
||||||
|
|
||||||
|
function onGlobalSearch(value) {
|
||||||
|
history.push('/search?value=' + value);
|
||||||
|
// window.location.href = `search?value=` + value;
|
||||||
|
// history.push({
|
||||||
|
// pathname:'/search',
|
||||||
|
// state:value
|
||||||
|
// })
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<React.Fragment>
|
||||||
|
{
|
||||||
|
openSearch ?
|
||||||
|
<div
|
||||||
|
onBlur={() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
setOpenSearch(false)
|
||||||
|
}, 500)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Search placeholder="请输入搜索关键字"
|
||||||
|
className={`search-input mr20`}
|
||||||
|
onSearch={onGlobalSearch}
|
||||||
|
autoFocus={true}
|
||||||
|
style={{width:'260px'}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<i className="iconfont icon-sousuo font-18 ml30" style={{color:"#a5a5a5"}} onClick={() => {
|
||||||
|
setOpenSearch(true)
|
||||||
|
}} />
|
||||||
|
}
|
||||||
|
</React.Fragment>
|
||||||
|
)
|
||||||
|
};
|
|
@ -1,10 +1,21 @@
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { FlexAJ } from '../Component/layout';
|
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);
|
const [ array , setArray ] = useState(undefined);
|
||||||
|
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
|
getData();
|
||||||
|
},[])
|
||||||
|
|
||||||
|
function getData(){
|
||||||
|
const url = `/${owner}/${projectsId}/languages.json`;
|
||||||
|
axios.get(url).then(result=>{
|
||||||
|
if(result){
|
||||||
|
let languages = result.data;
|
||||||
if(languages){
|
if(languages){
|
||||||
let arr = [];
|
let arr = [];
|
||||||
Object.keys(languages).map((item,key)=>{
|
Object.keys(languages).map((item,key)=>{
|
||||||
|
@ -12,7 +23,19 @@ function LanguagePower({languages}){
|
||||||
})
|
})
|
||||||
setArray(arr);
|
setArray(arr);
|
||||||
}
|
}
|
||||||
},[languages])
|
}
|
||||||
|
}).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(){
|
function getColor(){
|
||||||
let str = "#";
|
let str = "#";
|
||||||
|
@ -24,8 +47,10 @@ function LanguagePower({languages}){
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
return(
|
return(
|
||||||
|
(array && array.length > 0) ?
|
||||||
<div>
|
<div>
|
||||||
<p className="font-16 color-grey-6">开发语言</p>
|
<Divider />
|
||||||
|
<p className="font-16 color-ooo aboutSubTitle">开发语言</p>
|
||||||
<div className="progress">
|
<div className="progress">
|
||||||
{
|
{
|
||||||
array && array.map((item,key)=>{
|
array && array.map((item,key)=>{
|
||||||
|
@ -47,8 +72,7 @@ function LanguagePower({languages}){
|
||||||
}
|
}
|
||||||
</FlexAJ>
|
</FlexAJ>
|
||||||
}
|
}
|
||||||
|
</div>:""
|
||||||
</div>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
export default LanguagePower;
|
export default LanguagePower;
|
|
@ -45,15 +45,15 @@ const Div = styled.div`{
|
||||||
export default (({ user , img, name, time, focusStatus, is_current_user, login , successFunc }) => {
|
export default (({ user , img, name, time, focusStatus, is_current_user, login , successFunc }) => {
|
||||||
return (
|
return (
|
||||||
<Div>
|
<Div>
|
||||||
<Link to={`/users/${user && user.login}`}><Img src={getImageUrl(`/${img}`)} /></Link>
|
<Link to={`/${user && user.login}`}><Img src={getImageUrl(`/${img}`)} /></Link>
|
||||||
<div className="m-infos">
|
<div className="m-infos">
|
||||||
<Link to={`/users/${user && user.login}`}><Name>{name}</Name></Link>
|
<Link to={`/${user && user.login}`}><Name>{name}</Name></Link>
|
||||||
<Time><I className="iconfont icon-shijian"></I>加入时间:{time}</Time>
|
<Time><I className="iconfont icon-shijian"></I>加入时间:{time}</Time>
|
||||||
{
|
{
|
||||||
is_current_user ?
|
is_current_user ?
|
||||||
<Button type="default">当前用户</Button>
|
<Button type="default">当前用户</Button>
|
||||||
:
|
:
|
||||||
<FocusButton is_watch={focusStatus} id={login} successFunc={successFunc}/>
|
<FocusButton is_watch={focusStatus} id={login} successFunc={successFunc} notReset={true}/>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</Div>
|
</Div>
|
||||||
|
|
|
@ -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,62 @@
|
||||||
|
import React, {useEffect, useRef, useState} from 'react';
|
||||||
|
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js';
|
||||||
|
import './Component.scss';
|
||||||
|
|
||||||
|
function Monaco(props) {
|
||||||
|
const {
|
||||||
|
style = { // dom节点样式
|
||||||
|
height: '400px',
|
||||||
|
},
|
||||||
|
value = '', // 代码文本
|
||||||
|
onChange = () => { // 改变的事件
|
||||||
|
},
|
||||||
|
fontSize = 14, // 代码字体大小
|
||||||
|
monacoOptions = {
|
||||||
|
scrollBeyondLastLine: false,
|
||||||
|
lineNumbers: "off",
|
||||||
|
wordWrap: true,
|
||||||
|
overviewRulerBorder: true,
|
||||||
|
lineHeight: 24,
|
||||||
|
readOnly:true
|
||||||
|
}, // monaco 自定义属性
|
||||||
|
language = 'html', // 语言 支持 js ts sql css json html等
|
||||||
|
} = props;
|
||||||
|
const editOrRef = useRef();
|
||||||
|
const ThisEditor = useRef();
|
||||||
|
useEffect(() => {
|
||||||
|
ThisEditor.current = monaco.editor.create(editOrRef.current, {
|
||||||
|
value: value || '',
|
||||||
|
language,
|
||||||
|
theme: "vs-grey",
|
||||||
|
fontSize: fontSize + 'px',
|
||||||
|
minimap: { // 关闭代码缩略图
|
||||||
|
enabled: false,
|
||||||
|
},
|
||||||
|
...monacoOptions,
|
||||||
|
});
|
||||||
|
|
||||||
|
ThisEditor.current.onDidChangeModelContent((e) => {
|
||||||
|
let newValue = ThisEditor.current.getValue();
|
||||||
|
onChange(newValue);
|
||||||
|
});
|
||||||
|
return () => {
|
||||||
|
ThisEditor.current.dispose();
|
||||||
|
ThisEditor.current = undefined; // 清除编辑器对象
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
useEffect(() => {
|
||||||
|
if (ThisEditor.current) {
|
||||||
|
ThisEditor.current.updateOptions({
|
||||||
|
fontSize: fontSize + 'px',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, [fontSize]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div style={style} ref={editOrRef}>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Monaco;
|
|
@ -0,0 +1,90 @@
|
||||||
|
.systemBox{
|
||||||
|
.ant-modal-body{
|
||||||
|
padding:1px 0px 0px 0px;
|
||||||
|
.sysBox{
|
||||||
|
background-image: url('./bg.png');
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: 100% 334px;
|
||||||
|
margin-top: -55px;
|
||||||
|
}
|
||||||
|
.sysnoticeBox{
|
||||||
|
width: 100%;
|
||||||
|
padding:80px 0px 34px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 780px;
|
||||||
|
margin: 0px auto;
|
||||||
|
p.ntitle{
|
||||||
|
height: 33px;
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #31FFF7;
|
||||||
|
line-height: 33px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
p.nSubtitle{
|
||||||
|
height: 25px;
|
||||||
|
line-height: 25px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #FFFFFF;
|
||||||
|
margin-top: 60px;
|
||||||
|
}
|
||||||
|
.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;
|
||||||
|
background-color: #fff;
|
||||||
|
line-height: 30px;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #333;
|
||||||
|
.realmName{
|
||||||
|
margin-top: 20px;
|
||||||
|
display: flex;
|
||||||
|
ul{
|
||||||
|
width: 50%;
|
||||||
|
padding-left: 0px!important;
|
||||||
|
li{
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 32px;
|
||||||
|
text-align: left;
|
||||||
|
color: #000;
|
||||||
|
list-style-type: none!important;
|
||||||
|
&:first-child{
|
||||||
|
color: #E65714;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.nSubdesc{
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #000000;
|
||||||
|
line-height: 31px;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
.nInfo{
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #333333;
|
||||||
|
text-align: right;
|
||||||
|
margin-top: 25px;
|
||||||
|
p{
|
||||||
|
height: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.nBtn{
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 33px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
import React , { useEffect , useState } from 'react';
|
||||||
|
import { Modal , Button } from 'antd';
|
||||||
|
import './Index.scss';
|
||||||
|
import '../../css/index.scss';
|
||||||
|
import RenderHtml from '../../../components/render-html';
|
||||||
|
// import cookie from 'react-cookies';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
function SystemNotice({showNotice,system_notification,history,login,hideSystemNotice}){
|
||||||
|
const [ visible , setVisible ] = useState(false);
|
||||||
|
|
||||||
|
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);//一天
|
||||||
|
// // let inFifteenMinutes = new Date(new Date().getTime() + 60 * 1000);//一分钟
|
||||||
|
// cookie.save('notice_stage', true,{ expires: inFifteenMinutes,path:"/" });
|
||||||
|
|
||||||
|
// setVisible(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
visible = {visible}
|
||||||
|
width="1000px"
|
||||||
|
footer={false}
|
||||||
|
title={false}
|
||||||
|
centered={true}
|
||||||
|
closable={false}
|
||||||
|
wrapClassName={'systemBox'}
|
||||||
|
>
|
||||||
|
<div className="sysBox">
|
||||||
|
<div className="sysnoticeBox">
|
||||||
|
<p className="ntitle">{system_notification && system_notification.subject}</p>
|
||||||
|
<p className="nSubtitle">{system_notification && system_notification.sub_subject}</p>
|
||||||
|
{/* <div className="nContent">
|
||||||
|
<div className="nMaindesc">
|
||||||
|
为了给用户提供更加稳定、优质的服务,我们即将对平台门户首页、平台名称、平台域名进行一次全面升级与变更。原平台名称:Trustie(中文名:确实)将于2021年10月xx日统一更改为Gitlink(中文名:确实开源)。届时平台域名将统一进行更换,更换规则如下
|
||||||
|
</div>
|
||||||
|
<div className="realmName">
|
||||||
|
<ul>
|
||||||
|
<li>原域名:</li>
|
||||||
|
<li>官网顶级域名https://www.trustie.net</li>
|
||||||
|
<li>版本库子域名https://forgeplus.trustie.net</li>
|
||||||
|
<li>论坛子域名https://forum.trustie.net/forums</li>
|
||||||
|
</ul>
|
||||||
|
<ul>
|
||||||
|
<li>更换后域名:</li>
|
||||||
|
<li>官网顶级域名https://www.gitlink.org.cn</li>
|
||||||
|
<li>版本库子域名https://www.git.gitlink.org.cn</li>
|
||||||
|
<li>论坛子域名https://forum.gitlink.org.cn</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div className="nSubdesc">
|
||||||
|
自2021年10月xx日起,旧域名将停止访问。因平台名称与域名变更给您带来的不便,我们深表歉意!非常感谢您一直以来对本平台的信任与支持,我们将一如既往地为您提供优质的服务。 特此通知!
|
||||||
|
</div>
|
||||||
|
<div className="nInfo">
|
||||||
|
<p>Gitlink运营团队</p>
|
||||||
|
<p>2021年10月xx日</p>
|
||||||
|
</div>
|
||||||
|
</div> */}
|
||||||
|
<RenderHtml className="break_word_comments imageLayerParent" value={system_notification && system_notification.content} url={history.location}/>
|
||||||
|
<div className="nBtn">
|
||||||
|
<Button type="primary" className="btnblue" onClick={sureContinue}>确认并继续</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default SystemNotice;
|
After Width: | Height: | Size: 280 KiB |
|
@ -0,0 +1,72 @@
|
||||||
|
import React , { useEffect , useState } from 'react';
|
||||||
|
import Modals from '../PublicModal/Index';
|
||||||
|
import { Button } from 'antd';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
import ProfileImg from './images/profile.png';
|
||||||
|
import './Index.scss';
|
||||||
|
|
||||||
|
function ProfileModal({visible,onCancel,history}) {
|
||||||
|
const [ modalVis , setModalVis ] = useState(visible);
|
||||||
|
const [ addMemberCheck , setAddMemberCheck ] = useState(false);
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
axios.interceptors.response.use((response) => {
|
||||||
|
if (response && (response.data.status === 411 || response.data.status === 412)) {
|
||||||
|
setModalVis(true);
|
||||||
|
if(response.data.status === 412){
|
||||||
|
setAddMemberCheck(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}, (error) => {
|
||||||
|
});
|
||||||
|
},[])
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
setModalVis(visible);
|
||||||
|
},[visible])
|
||||||
|
|
||||||
|
function onOk(){
|
||||||
|
onCancel();
|
||||||
|
setModalVis(false);
|
||||||
|
setTimeout(function(){
|
||||||
|
window.open(`/settings/profile`,"_blank");
|
||||||
|
},200)
|
||||||
|
}
|
||||||
|
|
||||||
|
function onNo() {
|
||||||
|
onCancel();
|
||||||
|
setModalVis(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(
|
||||||
|
<Modals
|
||||||
|
title="完善资料"
|
||||||
|
onCancel={onNo}
|
||||||
|
visible={modalVis}
|
||||||
|
btn={
|
||||||
|
addMemberCheck?
|
||||||
|
<div>
|
||||||
|
<Button type={'primary'} size={"large"} onClick={onNo}>好的</Button>
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<div>
|
||||||
|
<Button size={"large"} onClick={onNo}>暂不补充</Button>
|
||||||
|
<Button type={'primary'} size={"large"} onClick={onOk}>好的</Button>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<div className="contents">
|
||||||
|
<img src={ProfileImg} alt=""/>
|
||||||
|
{
|
||||||
|
addMemberCheck ?
|
||||||
|
<p>目标用户个人资料不完整,需提醒目标用户补充资料后以进行后续操作</p>
|
||||||
|
:
|
||||||
|
<p>您目前的个人资料不完整,需要补充资料以进行后续操作。是否前往补充个人信息?</p>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</Modals>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default ProfileModal;
|
|
@ -0,0 +1,18 @@
|
||||||
|
.contents{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin:10px auto 0px;
|
||||||
|
img{
|
||||||
|
margin-right: 13px;
|
||||||
|
width: 44px;
|
||||||
|
}
|
||||||
|
p{
|
||||||
|
line-height: 29px;
|
||||||
|
max-width: 327px;
|
||||||
|
font-size: 16px!important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.font-44{
|
||||||
|
font-size: 44px!important;
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function Profile({children,sureFunc,showCompeleteDialog , completeProfile, className}) {
|
||||||
|
|
||||||
|
function checkProfile() {
|
||||||
|
if(!completeProfile){
|
||||||
|
showCompeleteDialog && showCompeleteDialog();
|
||||||
|
}else{
|
||||||
|
sureFunc();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(
|
||||||
|
<a className={className} onClick={checkProfile}>{children}</a>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default Profile;
|
After Width: | Height: | Size: 7.2 KiB |
|
@ -0,0 +1,20 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { Modal } from 'antd';
|
||||||
|
import './Index.scss';
|
||||||
|
|
||||||
|
function Modals({title,children,btn,onCancel,visible}) {
|
||||||
|
return(
|
||||||
|
<Modal
|
||||||
|
visible={visible}
|
||||||
|
onCancel={onCancel}
|
||||||
|
title={title}
|
||||||
|
width={"520px"}
|
||||||
|
footer={btn}
|
||||||
|
centered={true}
|
||||||
|
wrapClassName={"deleteBox"}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</Modal>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default Modals;
|
|
@ -0,0 +1,75 @@
|
||||||
|
.deleteBox{
|
||||||
|
z-index: 1033;
|
||||||
|
.ant-modal-close-x{
|
||||||
|
font-size: 17px!important;
|
||||||
|
}
|
||||||
|
.ant-modal-header{
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
padding:10px 30px;
|
||||||
|
.ant-modal-title{
|
||||||
|
text-align: left;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-modal-close{
|
||||||
|
top:0px !important;
|
||||||
|
font-size: 24px !important;
|
||||||
|
}
|
||||||
|
.ant-modal-body{
|
||||||
|
padding:30px 50px;
|
||||||
|
p{
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 26px;
|
||||||
|
color:#666;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
.desc{
|
||||||
|
.descMain{
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
i.red{
|
||||||
|
color:#DF0002;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-modal-footer{
|
||||||
|
border-top: none;
|
||||||
|
text-align: center;
|
||||||
|
padding-bottom: 40px;
|
||||||
|
button,a{
|
||||||
|
width: 96px;
|
||||||
|
height: 32px;
|
||||||
|
margin:0px 20px;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 14px;
|
||||||
|
&.ant-btn{
|
||||||
|
border-color: #D0D0D0;
|
||||||
|
color: #666;
|
||||||
|
&:hover,&:active,&:focus{
|
||||||
|
background: #f3f4f6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.ant-btn-danger{
|
||||||
|
background-color: #fff;
|
||||||
|
color: #DF0002;
|
||||||
|
border-color: #D0D0D0;
|
||||||
|
&:hover,&:active,&:focus{
|
||||||
|
border-color: #DF0002;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.ant-btn.ant-btn-primary{
|
||||||
|
background-color: #466AFF;
|
||||||
|
color: #fff;
|
||||||
|
border-color: #466AFF;
|
||||||
|
&:hover,&:focus,&:active{
|
||||||
|
background-color: rgba(70,106,255,0.85);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,38 +1,35 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { AlignCenter , AlignTop , FlexAJ } from '../Component/layout';
|
import { AlignTop } from '../Component/layout';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
function Releases({owner,projectsId,releaseVersions}){
|
function Releases({ owner, projectsId, releaseVersions, distribution }) {
|
||||||
|
|
||||||
return(
|
return(
|
||||||
<div>
|
<div>
|
||||||
<FlexAJ>
|
<Link to={`/${owner}/${projectsId}/releases`} className="font-16 color-ooo hoverA">
|
||||||
<AlignCenter><span className="font-16 color-grey-6">发行版</span>
|
<span>发行版</span>
|
||||||
{ releaseVersions && releaseVersions.total_count > 0 && <span className="infoCount">{releaseVersions.total_count}</span>}
|
{ releaseVersions && releaseVersions.total_count > 0 && <span className="infoCount">{releaseVersions.total_count}</span>}
|
||||||
</AlignCenter>
|
</Link>
|
||||||
{ releaseVersions && releaseVersions.total_count > 0 ?
|
|
||||||
<Link className="font-12 color-grey-9" to={`/projects/${owner}/${projectsId}/releases`}>全部</Link>
|
|
||||||
:
|
|
||||||
<Link className="font-12 color-blue" to={`/projects/${owner}/${projectsId}/releases/new`}>新建</Link>
|
|
||||||
}
|
|
||||||
</FlexAJ>
|
|
||||||
{
|
{
|
||||||
releaseVersions && releaseVersions.total_count>0 ?
|
releaseVersions && releaseVersions.total_count>0 ?
|
||||||
releaseVersions.list.map((item,key)=>{
|
releaseVersions.list.map((item,key)=>{
|
||||||
return(
|
return(
|
||||||
key === 0 &&<AlignTop className="mt10">
|
key === 0 &&<AlignTop className="mt10">
|
||||||
<i className="iconfont icon-biaoqian3 color-grey-6 font-18 mr10"></i>
|
|
||||||
<div>
|
<div>
|
||||||
<p className="font-16 color-grey-6">
|
<p className="font-16 color-grey-6" style={{display:'flex',alignItems:'center'}}>
|
||||||
<Link to={`/projects/${owner}/${projectsId}/releases`}>{item.name}</Link>
|
{/* 如果是点击最新则发行版列表页只展示最新的一个 */}
|
||||||
|
<Link to={{pathname:`/${owner}/${projectsId}/releases`,query:{turnFromNew:true}}} style={{maxWidth:'200px',overflow: 'hidden',whiteSpace: 'nowrap',textOverflow:'ellipsis'}}>{item.name}</Link>
|
||||||
<span className="font-12 laterest ml5">最新</span>
|
<span className="font-12 laterest ml5">最新</span>
|
||||||
</p>
|
</p>
|
||||||
<p className="color-grey-9 font-13">{item.created_at}</p>
|
<p className="color-grey-3 font-12">{item.created_at}</p>
|
||||||
</div>
|
</div>
|
||||||
</AlignTop>
|
</AlignTop>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
:""
|
:
|
||||||
|
<div className="mt8">
|
||||||
|
您暂未发布任何版本
|
||||||
|
{distribution && <Link className="color-blue ml20" to={{pathname:`/${owner}/${projectsId}/releases/new`,state:{stable:true}}}>创建新版本</Link>}
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,120 @@
|
||||||
|
import React, { useEffect, useState } from 'react';
|
||||||
|
import { Popover , Tooltip } from 'antd';
|
||||||
|
import './Component.scss';
|
||||||
|
import axios from 'axios';
|
||||||
|
import ShareModal from './SiderBarShareModal';
|
||||||
|
|
||||||
|
const $ = window.$;
|
||||||
|
|
||||||
|
$(window).scroll(function () {
|
||||||
|
if ($(".gotop").length > 0) {
|
||||||
|
if ($(document).scrollTop() > 0) {
|
||||||
|
$(".-task-sidebar .gotop").show();
|
||||||
|
$(".gotop").click(function () {
|
||||||
|
$("html,body").scrollTop(0);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if ($(document).scrollTop() === 0) {
|
||||||
|
$(".-task-sidebar .gotop").hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function SiderBar() {
|
||||||
|
const [ data , setData ] = useState([]);
|
||||||
|
const [ visible , setVisible ] = useState(false);
|
||||||
|
const [ login , setLogin ]= useState(false);
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
getFAQ();
|
||||||
|
getCurrentUser();
|
||||||
|
//页面加载完成之后隐藏回到顶点
|
||||||
|
$(".-task-sidebar .gotop").hide();
|
||||||
|
},[])
|
||||||
|
|
||||||
|
function getFAQ(){
|
||||||
|
const url = `/faqs.json`;
|
||||||
|
axios.get(url).then(result=>{
|
||||||
|
if(result && result.data){
|
||||||
|
setData(result.data);
|
||||||
|
}
|
||||||
|
}).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>
|
||||||
|
<ul className="faqUl">
|
||||||
|
{
|
||||||
|
list && list.map((i,k)=>{
|
||||||
|
return(
|
||||||
|
<li key={i.question+k}><a href={`${i.url}`} title={i.question} target="_blank">{i.question}</a></li>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
function shareContent(){
|
||||||
|
return <div>
|
||||||
|
<ul className="shareUl">
|
||||||
|
<p className="titlecontent">分享到</p>
|
||||||
|
<li onClick={()=>setVisible(true)}><i className="iconfont icon-weixin2" style={{color:"#62b900"}}></i></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={"-task-sidebar"} >
|
||||||
|
{/* 平台反馈 */}
|
||||||
|
<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 title="帮助" content={content(data)} overlayClassName="helpBox" placement={"left"}>
|
||||||
|
<div className="feedback">
|
||||||
|
<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-fenxiang"></i>
|
||||||
|
</div>
|
||||||
|
</Popover>
|
||||||
|
|
||||||
|
{/* 返回顶部 */}
|
||||||
|
<Tooltip title="返回顶部" placement={"left"} overlayClassName="tooltipBox">
|
||||||
|
<div className="gotop">
|
||||||
|
<a><i className="iconfont icon-huidaodingbu1"></i></a>
|
||||||
|
</div>
|
||||||
|
</Tooltip>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default SiderBar;
|
|
@ -0,0 +1,27 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { Modal } from 'antd';
|
||||||
|
import QRCode from 'qrcode.react';
|
||||||
|
|
||||||
|
function SiderBarShareModal({visible,urlValue,onCancel}) {
|
||||||
|
return(
|
||||||
|
<Modal
|
||||||
|
title={"分享到微信"}
|
||||||
|
visible={visible}
|
||||||
|
width="500px"
|
||||||
|
closable={true}
|
||||||
|
footer={false}
|
||||||
|
onCancel={onCancel}
|
||||||
|
>
|
||||||
|
<div style={{textAlign:"center"}}>
|
||||||
|
{urlValue &&<QRCode
|
||||||
|
value={urlValue}
|
||||||
|
size={200}
|
||||||
|
fgColor="#000000"
|
||||||
|
style={{margin:"0 20px 20px"}}
|
||||||
|
/>}
|
||||||
|
<p>打开微信“扫一扫”,点击右上角菜单,即可将网页分享至朋友圈</p>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default SiderBarShareModal;
|
|
@ -2,9 +2,9 @@ import React from 'react';
|
||||||
import {Popover} from 'antd';
|
import {Popover} from 'antd';
|
||||||
import './Component.scss';
|
import './Component.scss';
|
||||||
|
|
||||||
export default (({menu , children})=>{
|
export default (({menu , children, overlayClassName})=>{
|
||||||
return(
|
return(
|
||||||
<Popover content={menu} trigger={['click']} placement='bottom'>
|
<Popover content={menu} trigger={['click']} placement='bottom' overlayClassName={overlayClassName}>
|
||||||
{children}
|
{children}
|
||||||
</Popover>
|
</Popover>
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,7 +5,7 @@ const Nav = styled.div`{
|
||||||
background-color:#fff;
|
background-color:#fff;
|
||||||
padding:20px 30px;
|
padding:20px 30px;
|
||||||
border-bottom:1px solid #eee;
|
border-bottom:1px solid #eee;
|
||||||
font-size:16px;
|
font-size:18px;
|
||||||
color:#333;
|
color:#333;
|
||||||
display:flex;
|
display:flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { Link } from 'react-router-dom';
|
||||||
export default ({ url , name , column , id , login })=>{
|
export default ({ url , name , column , id , login })=>{
|
||||||
const Img = styled.span`
|
const Img = styled.span`
|
||||||
display:flex;
|
display:flex;
|
||||||
|
font-weight: bold;
|
||||||
${column && "flex-direction: column;text-align:center;"}
|
${column && "flex-direction: column;text-align:center;"}
|
||||||
align-items: center;
|
align-items: center;
|
||||||
& img{
|
& img{
|
||||||
|
@ -20,7 +21,7 @@ export default ({ url , name , column , id , login })=>{
|
||||||
`;
|
`;
|
||||||
return(
|
return(
|
||||||
id?
|
id?
|
||||||
<Link to={`/users/${login}`}>
|
<Link to={`/${login}`}>
|
||||||
<Img>
|
<Img>
|
||||||
{ url && <img src={url} alt=""/> }
|
{ url && <img src={url} alt=""/> }
|
||||||
<span>{name}</span>
|
<span>{name}</span>
|
||||||
|
|
|
@ -7,6 +7,8 @@ export const Banner = styled.div`{
|
||||||
border-bottom:1px solid #eee;
|
border-bottom:1px solid #eee;
|
||||||
background-color:#fff;
|
background-color:#fff;
|
||||||
border-radius:5px 5px 0px 0px;
|
border-radius:5px 5px 0px 0px;
|
||||||
|
justify-content: space-between;
|
||||||
|
display: flex;
|
||||||
}`
|
}`
|
||||||
export const AlignCenterBetween = styled.div`{
|
export const AlignCenterBetween = styled.div`{
|
||||||
display:flex;
|
display:flex;
|
||||||
|
@ -28,6 +30,11 @@ export const AlignTop = styled.div`{
|
||||||
display:flex;
|
display:flex;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}`
|
}`
|
||||||
|
export const AlignAJBottom = styled.div`{
|
||||||
|
display:flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-end;
|
||||||
|
}`
|
||||||
// 左右结构
|
// 左右结构
|
||||||
export const Box = styled.div`{
|
export const Box = styled.div`{
|
||||||
display:flex;
|
display:flex;
|
||||||
|
|
|
@ -36,15 +36,15 @@ function About(props, ref) {
|
||||||
const [ disabled, setDisabled ] = useState(false);
|
const [ disabled, setDisabled ] = useState(false);
|
||||||
const [ typeFlag, setTypeFlag] = 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;
|
const CurrentLogin = props.current_user && props.current_user.login;
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
if(CurrentLogin === AuthorLogin){
|
if(isPermission){
|
||||||
auth('get');
|
auth('get');
|
||||||
}else{
|
}else{
|
||||||
setIsSpining(false);
|
setIsSpining(false);
|
||||||
}
|
}
|
||||||
},[AuthorLogin,CurrentLogin])
|
},[isPermission,CurrentLogin])
|
||||||
|
|
||||||
function auth(type){
|
function auth(type){
|
||||||
const url = `/${owner}/${projectsId}/ci_authorize.json`;
|
const url = `/${owner}/${projectsId}/ci_authorize.json`;
|
||||||
|
@ -149,7 +149,7 @@ function About(props, ref) {
|
||||||
axios.post(url).then(result=>{
|
axios.post(url).then(result=>{
|
||||||
setIsSpining(false);
|
setIsSpining(false);
|
||||||
if(result && result.data.status === 0){
|
if(result && result.data.status === 0){
|
||||||
props.history.push(`/projects/${owner}/${projectsId}/devops/dispose`);
|
props.history.push(`/${owner}/${projectsId}/devops`);
|
||||||
// 需要将顶部的open_devops修改
|
// 需要将顶部的open_devops修改
|
||||||
let { changeOpenDevops } = props;
|
let { changeOpenDevops } = props;
|
||||||
changeOpenDevops && changeOpenDevops(true);
|
changeOpenDevops && changeOpenDevops(true);
|
||||||
|
@ -167,17 +167,17 @@ function About(props, ref) {
|
||||||
<img src={activate} alt="" width="250px" />
|
<img src={activate} alt="" width="250px" />
|
||||||
<P>定义DevOps工作流,帮助您检测bug、发布代码…</P>
|
<P>定义DevOps工作流,帮助您检测bug、发布代码…</P>
|
||||||
{
|
{
|
||||||
CurrentLogin !== AuthorLogin ?
|
!isPermission ?
|
||||||
<div className="noOperation">DevOps开启功能暂未对项目创建者以外的角色开放,可以联系项目创建者进行开启,开启后便可查看构建信息。</div>:""
|
<div className="noOperation">DevOps开启功能暂未对项目创建者以外的角色开放,可以联系项目创建者进行开启,开启后便可查看构建信息。</div>:""
|
||||||
}
|
}
|
||||||
<a href={"https://forum.trustie.net/forums/3110/detail"} target="_blank" style={{ color: "#5091FF"}}>
|
<a href={"https://forum.trustie.net/forums/3110/detail"} target="_blank" style={{ color: "#5091FF"}}>
|
||||||
了解什么是DevOps?
|
了解什么是DevOps?
|
||||||
</a>
|
</a>
|
||||||
<a href={"https://forum.trustie.net/forums/3080/detail"} target="_blank" style={{ color: "#5091FF"}}>
|
<a href={"https://forum.trustie.net/forums/3080/detail"} target="_blank" style={{ color: "#5091FF"}}>
|
||||||
如何使用DevOps?
|
如何使用引擎(Engine)功能?
|
||||||
</a>
|
</a>
|
||||||
{
|
{
|
||||||
AuthorLogin === CurrentLogin ?
|
isPermission ?
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
{
|
{
|
||||||
step === 0 && !typeFlag ?
|
step === 0 && !typeFlag ?
|
||||||
|
|
|
@ -96,7 +96,7 @@ function Dispose(props){
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
if(result && result.data){
|
if(result && result.data){
|
||||||
props.showNotification("流水线新增成功,请进行工作流配置!");
|
props.showNotification("流水线新增成功,请进行工作流配置!");
|
||||||
props.history.push(`/projects/${owner}/${projectsId}/devops/dispose/${result.data.id}`);
|
props.history.push(`/${owner}/${projectsId}/devops/${result.data.id}`);
|
||||||
}else{
|
}else{
|
||||||
props.showNotification("流水线新增失败,请稍后再试!");
|
props.showNotification("流水线新增失败,请稍后再试!");
|
||||||
}
|
}
|
||||||
|
@ -134,12 +134,12 @@ function Dispose(props){
|
||||||
|
|
||||||
// 模板管理
|
// 模板管理
|
||||||
function toModalManage(){
|
function toModalManage(){
|
||||||
props.history.push(`/projects/${owner}/${projectsId}/devops/mould`);
|
props.history.push(`/${owner}/${projectsId}/devops/mould`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 参数管理
|
// 参数管理
|
||||||
function toparameter(){
|
function toparameter(){
|
||||||
props.history.push(`/projects/${owner}/${projectsId}/devops/params`);
|
props.history.push(`/${owner}/${projectsId}/devops/params`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const operate = current_user && (permission && permission !== "Reporter");
|
const operate = current_user && (permission && permission !== "Reporter");
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Table , Popconfirm } from 'antd';
|
import { Table , Popconfirm } from 'antd';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
import { turnbar } from "educoder";
|
||||||
|
|
||||||
// const STATUS = {
|
// const STATUS = {
|
||||||
// running:"运行中",
|
// running:"运行中",
|
||||||
|
@ -65,8 +66,9 @@ function List({ list, operate , projectsId , owner , showModal , deleteFunc }){
|
||||||
width:"15%",
|
width:"15%",
|
||||||
ellipsis:true,
|
ellipsis:true,
|
||||||
render:(value,item)=>{
|
render:(value,item)=>{
|
||||||
|
let v = turnbar(item.branch);
|
||||||
return(
|
return(
|
||||||
<Link to={`/projects/${owner}/${projectsId}/tree/${item.branch}/${value}`} className="color-blue">{value}</Link>
|
<Link to={`/${owner}/${projectsId}/tree/${v}/${value}`} className="color-blue">{value}</Link>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -110,7 +112,7 @@ function List({ list, operate , projectsId , owner , showModal , deleteFunc }){
|
||||||
return(
|
return(
|
||||||
<span>
|
<span>
|
||||||
{ operate ?
|
{ operate ?
|
||||||
<Link to={`/projects/${owner}/${projectsId}/devops/dispose/${item.id}`} className="mr10 color-grey-6">
|
<Link to={`/${owner}/${projectsId}/devops/${item.id}`} className="mr10 color-grey-6">
|
||||||
<i className="iconfont icon-zaibianji font-13 mr3"></i>编辑</Link> :""
|
<i className="iconfont icon-zaibianji font-13 mr3"></i>编辑</Link> :""
|
||||||
}
|
}
|
||||||
{ operate ?
|
{ operate ?
|
||||||
|
@ -118,7 +120,7 @@ function List({ list, operate , projectsId , owner , showModal , deleteFunc }){
|
||||||
<a className="mr10 color-grey-6"><i className="iconfont icon-lajitong font-13 mr3"></i>删除</a>
|
<a className="mr10 color-grey-6"><i className="iconfont icon-lajitong font-13 mr3"></i>删除</a>
|
||||||
</Popconfirm>:""
|
</Popconfirm>:""
|
||||||
}
|
}
|
||||||
<Link to={`/projects/${owner}/${projectsId}/devops/list/${item.branch}`} className="color-grey-6"><i className="iconfont icon-yunhang font-13 mr3"></i>查看运行记录</Link>
|
<Link to={`/${owner}/${projectsId}/devops/list/${item.branch}`} className="color-grey-6"><i className="iconfont icon-yunhang font-13 mr3"></i>查看运行记录</Link>
|
||||||
</span>
|
</span>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ function PipelineName({visible,onCancel,onOk,value ,branchList}){
|
||||||
</div>
|
</div>
|
||||||
<div className="choosenList mt20">
|
<div className="choosenList mt20">
|
||||||
<span>触发条件:</span>
|
<span>触发条件:</span>
|
||||||
<Select value={branchValue} style={{width:"150px"}} onChange={(e)=>setBranchValue(e)}>
|
<Select value={branchValue} style={{width:"150px"}} dropdownClassName="chooseCon" onChange={(e)=>setBranchValue(e)}>
|
||||||
{
|
{
|
||||||
branchList && branchList.length>0 && branchList.map((item,key)=>{
|
branchList && branchList.length>0 && branchList.map((item,key)=>{
|
||||||
return(
|
return(
|
||||||
|
@ -51,7 +51,7 @@ function PipelineName({visible,onCancel,onOk,value ,branchList}){
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
</Select>
|
</Select>
|
||||||
<Select mode="multiple" allowClear value={eventValue} style={{width:"180px",marginLeft:"10px"}} onChange={(e)=>{console.log(e);setEventValue(e)}}>
|
<Select mode="multiple" allowClear value={eventValue} dropdownClassName="chooseCon" style={{width:"180px",marginLeft:"10px"}} onChange={(e)=>{setEventValue(e)}}>
|
||||||
{
|
{
|
||||||
EVENT.map((item,key)=>{
|
EVENT.map((item,key)=>{
|
||||||
return(
|
return(
|
||||||
|
|
|
@ -17,7 +17,7 @@ function Sure({datas , name , saveFunc , sureSubmit , loading}){
|
||||||
return(
|
return(
|
||||||
<div>
|
<div>
|
||||||
<div style={{padding:"0px 15px 15px 15px"}}>
|
<div style={{padding:"0px 15px 15px 15px"}}>
|
||||||
工作流名称:{name}
|
流水线名称:{name}
|
||||||
</div>
|
</div>
|
||||||
<div className="editorBody" style={{marginTop:"0px"}}>
|
<div className="editorBody" style={{marginTop:"0px"}}>
|
||||||
<Editors value={value} theme={"vs-grey"} height={"600px"} visible/>
|
<Editors value={value} theme={"vs-grey"} height={"600px"} visible/>
|
||||||
|
|
|
@ -5,7 +5,7 @@ import { AlignCenterBetween , Blueline , FlexAJ } from '../../Component/layout';
|
||||||
function head({manager , parameter}){
|
function head({manager , parameter}){
|
||||||
return(
|
return(
|
||||||
<AlignCenterBetween>
|
<AlignCenterBetween>
|
||||||
<span className="font-20">工作流配置</span>
|
<span className="font-20">引擎配置</span>
|
||||||
<FlexAJ>
|
<FlexAJ>
|
||||||
{
|
{
|
||||||
parameter && <Blueline onClick={parameter}>参数管理</Blueline>
|
parameter && <Blueline onClick={parameter}>参数管理</Blueline>
|
||||||
|
|
|
@ -36,39 +36,37 @@ export default ((props)=>{
|
||||||
return(
|
return(
|
||||||
<WhiteBack className="opsPanel">
|
<WhiteBack className="opsPanel">
|
||||||
<Switch {...props}>
|
<Switch {...props}>
|
||||||
<Route path="/projects/:owner/:projectsId/devops/dispose/:disposeId"
|
|
||||||
render={
|
<Route path="/:owner/:projectsId/devops/params"
|
||||||
(p) => (<New {...props} {...p}/>)
|
|
||||||
}
|
|
||||||
></Route>
|
|
||||||
<Route path="/projects/:owner/:projectsId/devops/params"
|
|
||||||
render={
|
render={
|
||||||
(p) => (<Params {...props} {...p}/>)
|
(p) => (<Params {...props} {...p}/>)
|
||||||
}
|
}
|
||||||
></Route>
|
></Route>
|
||||||
<Route path="/projects/:owner/:projectsId/devops/mould"
|
<Route path="/:owner/:projectsId/devops/mould"
|
||||||
render={
|
render={
|
||||||
(p) => (<Mould {...props} {...p}/>)
|
(p) => (<Mould {...props} {...p}/>)
|
||||||
}
|
}
|
||||||
></Route>
|
></Route>
|
||||||
<Route path="/projects/:owner/:projectsId/devops/dispose/new"
|
<Route path="/:owner/:projectsId/devops/new"
|
||||||
render={
|
render={
|
||||||
(p) => (<New {...props} {...p}/>)
|
(p) => (<New {...props} {...p}/>)
|
||||||
}
|
}
|
||||||
></Route>
|
></Route>
|
||||||
<Route path="/projects/:owner/:projectsId/devops/dispose"
|
|
||||||
render={
|
<Route path="/:owner/:projectsId/devops/list/:branch"
|
||||||
(p) => (<Dispose {...props} {...p}/>)
|
|
||||||
}
|
|
||||||
></Route>
|
|
||||||
<Route path="/projects/:owner/:projectsId/devops/list/:branch"
|
|
||||||
render={
|
render={
|
||||||
(p) => (<Stucture {...props} {...p}/>)
|
(p) => (<Stucture {...props} {...p}/>)
|
||||||
}
|
}
|
||||||
></Route>
|
></Route>
|
||||||
<Route path="/projects/:owner/:projectsId/devops"
|
<Route path="/:owner/:projectsId/devops/:disposeId"
|
||||||
render={
|
render={
|
||||||
(p) => (<About {...props} {...p}/>)
|
(p) => (<New {...props} {...p}/>)
|
||||||
|
}
|
||||||
|
></Route>
|
||||||
|
{/* 原本的两种合为一个 */}
|
||||||
|
<Route path="/:owner/:projectsId/devops"
|
||||||
|
render={
|
||||||
|
(p) =>{return( p.location && p.location.state && p.location.state.open_devops?<Dispose {...props} {...p}/>:<About {...props} {...p}/>)}
|
||||||
}
|
}
|
||||||
></Route>
|
></Route>
|
||||||
</Switch>
|
</Switch>
|
||||||
|
|