Compare commits

...

586 Commits

Author SHA1 Message Date
何童崇 b789fc50be 回归wiki、issue列表issue 2022-06-15 17:09:57 +08:00
何童崇 999441165a Merge branch 'gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into hotfix_gitlink 2022-06-15 09:15:41 +08:00
xxq250 dd595fcb9c Merge pull request '修改glcc,每个项目对应一个路由及其它issue' (#397) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-06-14 19:34:44 +08:00
何童崇 70a118061c Merge branch 'gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into feature_GLCC 2022-06-14 19:19:43 +08:00
何童崇 88ee244e96 修改glcc,每个项目对应一个路由 2022-06-14 19:19:12 +08:00
何童崇 26ef1057ba 回归issue分页、Wiki路由的issue 2022-06-13 17:27:44 +08:00
yystopf ce66f507a6 Merge pull request '新增glcc赞助商页' (#396) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-06-10 17:17:24 +08:00
何童崇 5505142eb7 修改赞助商专题页 2022-06-10 16:48:01 +08:00
何童崇 790504a2f4 Merge branch 'feature_GLCC2' of http://106.75.45.236:3000/durian/forgeplus-react into feature_GLCC 2022-06-10 16:40:57 +08:00
何童崇 08135585ea 压缩图片 2022-06-10 16:25:58 +08:00
何童崇 c9841cd2fa 修改issue 2022-06-10 16:23:39 +08:00
谢思 62f265f56e 优化 2022-06-10 16:15:35 +08:00
何童崇 33609e087e 调整专题页样式 2022-06-10 15:53:36 +08:00
何童崇 e325181ef4 修改样式 2022-06-10 15:09:48 +08:00
何童崇 790fef4899 Merge branch 'feature_GLCC2' of http://106.75.45.236:3000/durian/forgeplus-react into feature_GLCC 2022-06-10 14:53:39 +08:00
何童崇 ebcb1d6163 修改glcc专题页 2022-06-10 14:52:37 +08:00
谢思 30740c59aa 导师一栏页面以及入口页面 2022-06-10 14:42:12 +08:00
何童崇 65795f1f02 修改glcc专题页 2022-06-10 09:05:31 +08:00
何童崇 8130fcbff9 glcc赞助商页 2022-06-09 14:02:16 +08:00
xxq250 fcb86bd2a1 Merge pull request 'openmmlab初始化' (#394) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-06-08 15:12:39 +08:00
何童崇 7ab24b7ffb openmmlab专题页初版 2022-06-08 15:01:34 +08:00
xxq250 e605d5e5b5 Merge pull request '新增导师审核页面' (#393) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-06-08 14:17:29 +08:00
何童崇 53f78ab0f8 glcc导师审核页修改 2022-06-08 14:10:16 +08:00
何童崇 02e189741c 新增导师审核页面 2022-06-07 10:35:09 +08:00
xxq250 b649f7a18c Merge pull request 'glcc二期报名修改' (#391) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-06-02 16:46:23 +08:00
何童崇 bb1b8e6b36 修改glcc样式 2022-06-02 16:12:30 +08:00
何童崇 56f74c747b glcc报名修改 2022-06-02 11:19:43 +08:00
何童崇 af75705d03 Merge branch 'gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into feature_GLCC 2022-06-01 10:07:05 +08:00
何童崇 d839e4aa26 调整报名逻辑 2022-06-01 10:06:42 +08:00
caishi 3d8a910820 组织项目列表增加私有标示 2022-05-30 14:55:02 +08:00
caishi ba283d7c13 devlop是否激活 两个页面部根据state的字段来判断 2022-05-30 14:01:55 +08:00
xxq250 90bb5297f3 Merge pull request '修改赞助商' (#388) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-27 17:42:55 +08:00
何童崇 597768d252 Merge branch 'gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into feature_GLCC 2022-05-27 17:29:45 +08:00
何童崇 93d0356598 修改赞助商 2022-05-27 17:29:20 +08:00
caishi 77754288f0 上传头像透明背景变成了黑色背景 2022-05-27 17:24:01 +08:00
caishi 2be33ed9d1 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2022-05-27 16:04:52 +08:00
caishi 20171244fc devops返回到引擎配置页面需要加state 2022-05-27 16:04:47 +08:00
xxq250 e87fb6080c Merge pull request '调整glcc样式' (#387) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-27 15:56:23 +08:00
何童崇 d264627af7 调整glcc样式 2022-05-27 15:50:42 +08:00
caishi fb10468c08 update content to replace_content 2022-05-27 14:26:48 +08:00
caishi 8b8484a683 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2022-05-27 14:17:19 +08:00
xxq250 cffd70a897 Merge pull request '修改赞助商logo' (#386) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-27 11:50:47 +08:00
何童崇 50fa57188f 修改glcc首页 2022-05-27 11:43:16 +08:00
何童崇 e8f48434a8 修改赞助商logo 2022-05-27 10:42:34 +08:00
xxq250 2d40d393cf Merge pull request '修改赞助商链接' (#385) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-26 16:48:45 +08:00
何童崇 0f1b1dcf8c Merge branch 'gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into feature_GLCC 2022-05-26 16:42:27 +08:00
何童崇 c1ce16bce7 修改赞助商链接 2022-05-26 16:41:07 +08:00
caishi 5b69d12802 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2022-05-26 16:30:24 +08:00
caishi f053b25744 退出仓库 2022-05-26 16:30:19 +08:00
xxq250 2403b8a420 Merge pull request '适配logo' (#384) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-26 16:26:00 +08:00
何童崇 714e204b1b 适配logo 2022-05-26 16:18:36 +08:00
xxq250 c906a50e48 Merge pull request 'glcc二期' (#383) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-26 16:01:11 +08:00
何童崇 3f16be965b 修改登录框样式 2022-05-26 15:54:18 +08:00
何童崇 0d6a12d5a6 修改glcc2期 2022-05-26 15:42:56 +08:00
何童崇 d353f2a21e 修改项目及课题路由 2022-05-26 14:57:55 +08:00
caishi dbcf0bb1b9 服务新建成功提示语+激 活devops后未跳转到引擎配置 2022-05-26 14:51:48 +08:00
何童崇 84f51cd3ad glcc赞助商 2022-05-26 14:47:01 +08:00
何童崇 bd43f3d841 Merge branch 'gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into feature_GLCC 2022-05-26 14:46:01 +08:00
何童崇 9a043175da Merge branch 'pre_gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into feature_GLCC 2022-05-26 14:45:40 +08:00
xiaoxiaoqiong 96cca430b9 Merge branch 'gitlink_server' into pre_gitlink_server 2022-05-27 18:12:34 +08:00
xiaoxiaoqiong 04fbddc58d Merge branch 'gitlink_server' into pre_gitlink_server 2022-05-27 17:44:52 +08:00
谢思 2d75cb85dc issue 2022-05-25 20:12:46 +08:00
谢思 756d88b13f issue 2022-05-25 20:03:23 +08:00
谢思 7e186bf765 issue 2022-05-25 15:53:43 +08:00
谢思 4b89f85874 Merge branch 'feature_GLCC' of http://106.75.45.236:3000/tongChong/forgeplus-react into feature_GLCC2 2022-05-28 14:17:54 +08:00
谢思 2676d6f54e glcc二期 新增课题详情页 2022-05-28 14:17:34 +08:00
caishi e1582102aa 文件列表message只显示第一行的内容 2022-05-23 18:30:03 +08:00
caishi 36e2f03946 文件夹、文件名字含有特殊字符 2022-05-23 17:25:14 +08:00
caishi d906b6c391 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2022-05-23 14:37:14 +08:00
caishi b1edabfa0f 个人主页-头部 2022-05-23 14:36:51 +08:00
xxq250 461442f275 Merge pull request '修改文案' (#380) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-20 18:11:13 +08:00
何童崇 3b820fb65c Merge branch 'gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into feature_GLCC 2022-05-20 18:08:56 +08:00
何童崇 2349dca261 修改文案 2022-05-20 18:07:20 +08:00
caishi 654e1af7eb merge 2022-05-20 17:27:08 +08:00
caishi f9149e0606 readme 接口返回编辑、显示数据的字段不一致 2022-05-20 17:26:07 +08:00
xxq250 6b987f980b Merge pull request 'glcc issue' (#379) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-20 17:18:25 +08:00
何童崇 a4b4f69bb4 上传时间修改 2022-05-20 17:16:11 +08:00
谢思 aadd44c30e Merge branch 'feature_GLCC' of http://106.75.45.236:3000/tongChong/forgeplus-react into feature_GLCC2 2022-05-20 16:49:06 +08:00
谢思 424742665b 学生报名通道关闭 2022-05-20 16:48:08 +08:00
xxq250 a07ca37bab Merge pull request '开源夏令营二期issue' (#378) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-20 14:43:16 +08:00
何童崇 99d85dbdad 修改报名时间及报名样式控制 2022-05-20 14:31:45 +08:00
何童崇 d088e1a2e1 Merge branch 'gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into feature_GLCC 2022-05-20 14:26:56 +08:00
何童崇 6cabd38d87 修改issue 2022-05-20 14:25:45 +08:00
谢思 50d92c2bdd issue 2022-05-20 14:23:36 +08:00
caishi aa539facee 暂时隐藏服务入口 2022-05-20 14:17:10 +08:00
谢思 cf361ad002 开源夏令营二期issue 2022-05-20 13:34:29 +08:00
谢思 ea12d924d5 开源夏令营二期issue 2022-05-27 10:29:33 +08:00
谢思 9eda6cc082 开源夏令营二期issue 2022-05-20 09:08:37 +08:00
caishi 10895a26f8 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlinkSource 2022-05-19 18:30:32 +08:00
xxq250 2089c7a28f Merge pull request 'glcc issue回归' (#377) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-19 18:28:54 +08:00
何童崇 f5af389098 合并谢思修改代码 2022-05-19 18:10:59 +08:00
何童崇 1a09f82960 修改glcc issue 2022-05-19 18:06:41 +08:00
caishi f8a9c0785f update issue 2022-05-19 17:56:42 +08:00
谢思 4a3b68430b 合并代码 2022-05-19 17:36:09 +08:00
谢思 b3c390df16 样式优化 2022-05-19 17:26:26 +08:00
何童崇 b81610f7d3 修改glcc issue 2022-05-19 17:13:42 +08:00
谢思 258b6d651f 开源夏令营2期issue 2022-05-19 17:06:34 +08:00
caishi 24bb69cc22 pull 何 代码-glcc 2022-05-19 10:40:10 +08:00
xxq250 c3536864c7 Merge pull request 'glcc2期初版' (#376) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-05-19 10:32:41 +08:00
何童崇 38a9155769 优化样式 2022-05-19 10:29:05 +08:00
谢思 a884146577 项目及课题列表优化 2022-05-19 10:24:24 +08:00
caishi 6a73e98701 update 2022-05-19 10:23:52 +08:00
谢思 ed18f7afcf 完整流程联调 2022-05-18 19:21:43 +08:00
何童崇 85d81c2553 修改取消所有报名后的问题 2022-05-18 18:57:50 +08:00
何童崇 da0caba73b 修改文件服务地址 2022-05-18 16:44:20 +08:00
何童崇 299fb1358d 修改报名信息 2022-05-18 16:06:38 +08:00
何童崇 c859b6a439 新增学生报名静态页面 2022-05-17 17:31:26 +08:00
谢思 96f047a252 课题项目列表 2022-05-17 17:21:35 +08:00
caishi 4b4197e459 merge gitlink_server 2022-05-16 09:42:58 +08:00
caishi 2f37586a1b 服务‘ 2022-05-16 09:42:01 +08:00
caishi d29eaa5d30 服务-save 2022-05-12 09:11:59 +08:00
xxq250 c170a5e6fe Merge pull request '开源夏令营报名跳转到https://wj.qq.com/s2/10175205/e8df/' (#374) from durian/forgeplus-react:gitlink_server into gitlink_server 2022-05-10 17:50:47 +08:00
谢思 147e538e6f 开源夏令营报名跳转到另一个链接 2022-05-10 17:42:00 +08:00
caishi 76a2231fe7 merge 2022-05-10 09:23:47 +08:00
caishi 35c32aed9c 新建合并请求-提交部分增加分页功能 2022-05-10 09:21:38 +08:00
xxq250 b6033a7262 Merge pull request '开源夏令营报名页面 报名时间显示错误' (#373) from durian/forgeplus-react:gitlink_server into gitlink_server 2022-05-09 15:34:11 +08:00
谢思 68f60d2a51 报名页面展示报名时间错误 2022-05-09 15:27:48 +08:00
xxq250 575c98260a Merge pull request '开源夏令营优化' (#372) from durian/forgeplus-react:gitlink_server into gitlink_server 2022-05-09 14:48:49 +08:00
谢思 c96da86078 glcc优化 2022-05-09 14:36:41 +08:00
caishi 0b959c4a9b 新建合并请求-底部提交没有显示isFirstLoading控制 2022-05-07 14:55:49 +08:00
yystopf 92ea4faa3e Merge pull request '修复合并请求调两次接口' (#371) from gitlink_server into pre_gitlink_server 2022-05-07 14:41:56 +08:00
caishi 9f58eb1a5a 合并请求需请求两次获取分支的接口 2022-05-07 14:38:49 +08:00
yystopf 62f4a0417f Merge pull request '20220507周里程碑内容' (#370) from gitlink_server into pre_gitlink_server 2022-05-07 13:55:25 +08:00
caishi dbadc3f1a0 markdown 左右宽度 2022-05-07 11:30:45 +08:00
caishi 41d24b341c pull 2022-05-07 10:37:54 +08:00
caishi 102f0bc04a 新建issue时报错不清空issue内容 2022-05-07 10:37:10 +08:00
xxq250 7690843ff8 Merge pull request '开源夏令营帮助中心图片限制最大宽度' (#366) from durian/forgeplus-react:gitlink_server into gitlink_server 2022-05-06 10:59:05 +08:00
caishi 284d230821 merge 2022-05-06 10:21:07 +08:00
xxq250 f9773a7e42 Merge pull request '修改Wiki校验样式' (#368) from tongChong/forgeplus-react:hotfix_gitlink into gitlink_server 2022-05-06 10:20:37 +08:00
caishi e4a95602cc 合并请求分支下拉接口以及搜索 2022-05-06 10:19:52 +08:00
何童崇 6a6f8d292f 修改Wiki校验样式 2022-05-06 10:05:22 +08:00
xxq250 4f40755af1 Merge pull request '修改Wiki和视频路径' (#367) from tongChong/forgeplus-react:hotfix_gitlink into gitlink_server 2022-05-05 18:04:26 +08:00
何童崇 70838266ad Merge branch 'gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into hotfix_gitlink 2022-05-05 17:35:20 +08:00
何童崇 7fd94060db 修改Wiki高度及视频等路径 2022-05-05 17:34:49 +08:00
谢思 872ca88ae8 开源夏令营帮助中心图片限制最大宽度 2022-05-05 15:50:17 +08:00
xxq250 b5d65e5311 Merge pull request '修改开源夏令营帮助中心对应的wiki仓库' (#365) from durian/forgeplus-react:gitlink_server into gitlink_server 2022-05-05 15:01:20 +08:00
谢思 68f209272c 修改开源夏令营帮助中心wiki仓库 2022-05-05 14:47:03 +08:00
何童崇 ea079eb475 Merge branch 'pre_gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into hotfix_gitlink 2022-05-05 09:36:47 +08:00
caishi 51d028336f 新建合并请求-分支下拉搜索 2022-04-29 09:24:05 +08:00
caishi 4cd25cffc7 issue/pr各下拉列表增加搜索功能 2022-04-26 17:48:21 +08:00
caishi b59409e2fc 从各新建合并请求点击时跳转的链接要是默认分支 2022-04-25 14:38:33 +08:00
yystopf 6ac8a9863d Merge pull request '四月第四周里程碑内容' (#361) from gitlink_server into pre_gitlink_server 2022-04-21 17:58:43 +08:00
caishi feb6ad6d89 上传文件 2022-04-21 16:45:17 +08:00
caishi a3c6ad78ee 拖拽上传文件夹 2022-04-20 17:14:14 +08:00
caishi 04e10722e3 install 2022-04-19 11:15:00 +08:00
xxq250 5007377c57 Merge pull request '开源夏令营修改' (#357) from durian/forgeplus-react:feature_GLCC into gitlink_server 2022-04-15 17:28:58 +08:00
谢思 3bf38174b3 修改开源夏令营文件上传服务以及banner图压缩以及新闻公告代码优化 2022-04-15 17:11:20 +08:00
xxq250 eec4fa4204 Merge pull request '新增glcc,开源夏令营' (#356) from tongChong/forgeplus-react:feature_GLCC into gitlink_server 2022-04-15 15:35:41 +08:00
谢思 bce4543ab4 更新正式环境帮助中心wiki仓库 2022-04-15 14:55:53 +08:00
谢思 41c0a29bef Merge branch 'gitlink_server' of http://106.75.45.236:3000/Gitlink/forgeplus-react into feature_GLCC 2022-04-15 14:15:50 +08:00
谢思 3482c17d1f 参与高校更新 2022-04-15 14:14:17 +08:00
谢思 13a54a3e29 提交报名信息二级确认框 2022-04-13 17:21:59 +08:00
谢思 cbf0f827dd 修改文案 2022-04-13 17:00:43 +08:00
谢思 3c358c8175 开源夏令营优化 2022-04-13 16:28:39 +08:00
谢思 ad7f878357 报名提交确认框 2022-04-13 15:16:50 +08:00
谢思 fc6b6dbede 报名截至时间 2022-04-13 10:35:36 +08:00
谢思 e7a23064a8 限制开源夏令营报名时间 2022-04-13 09:59:48 +08:00
谢思 947b7a4be6 Merge branch 'feature_GLCC' of http://106.75.45.236:3000/tongChong/forgeplus-react into feature_GLCC 2022-04-12 17:31:38 +08:00
谢思 c601d6681b 开源xia夏令营issue 2022-04-12 17:30:50 +08:00
何童崇 6649db21b1 样式bug 2022-04-12 17:25:50 +08:00
谢思 aac55ea94f 开源夏令营issue 2022-04-12 16:18:59 +08:00
谢思 baf69efac8 开源夏令营issue 2022-04-12 14:46:50 +08:00
谢思 d49659deb3 引入组件 2022-04-12 14:05:34 +08:00
谢思 a6ed2ca451 合并代码+报名页添加banner图 2022-04-12 13:57:57 +08:00
谢思 83c2517824 开源夏令营报名页+帮助页+首页-组织方、联系我们 2022-04-12 13:48:47 +08:00
何童崇 27b6732ac4 修改glcc首页 2022-04-11 17:54:41 +08:00
谢思 60c01d8682 首页-合作伙伴 2022-04-08 17:34:37 +08:00
caishi 5daada4b98 issue按钮显示 2022-04-08 16:37:35 +08:00
何童崇 5156441c2a 首页静态页面完成75% 2022-04-08 15:34:10 +08:00
谢思 de206759bd Merge branch 'feature_GLCC' of http://106.75.45.236:3000/tongChong/forgeplus-react into feature_GLCC 2022-04-08 15:33:55 +08:00
谢思 d375ed8b02 帮助中心 2022-04-08 15:32:34 +08:00
谢思 5edf45988e 开源夏令营报名页面 2022-04-08 13:47:44 +08:00
caishi 4c0f3497a9 新建发行版 2022-04-07 18:10:00 +08:00
caishi d4a59e9a94 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2022-04-07 17:58:34 +08:00
何童崇 d91446dc12 初始化glcc 2022-04-07 09:47:38 +08:00
xxq250 87f26db26d Merge pull request '登录后如果打开首页,第一次默认进入个人详情页' (#355) from tongChong/forgeplus-react:hotfix_gitlink into gitlink_server 2022-04-06 14:36:49 +08:00
何童崇 4a4d767710 登录后如果打开首页,第一次默认进入个人详情页 2022-04-06 14:28:55 +08:00
caishi 4f71cd1c0a ignore 2022-04-03 13:21:27 +08:00
caishi 1f7dda2526 仓库设置 2022-04-01 19:19:15 +08:00
yystopf e8a74dc780 Merge pull request '合并最新代码' (#354) from gitlink_server into pre_gitlink_server 2022-04-01 19:18:33 +08:00
caishi fc3a1e4088 issue详情-word 2022-03-31 14:51:10 +08:00
caishi 335e484167 style 2022-03-30 16:13:42 +08:00
caishi 4d613fd07f 同上 2022-03-29 09:51:20 +08:00
caishi cb87a9d075 403,404 2022-03-29 09:47:38 +08:00
caishi 25a3e10c27 issues 2022-03-23 16:14:00 +08:00
xxq250 60327188eb Merge pull request '关于我们职位招聘显示不全' (#349) from gitlink_server into pre_gitlink_server 2022-03-17 17:13:09 +08:00
xxq250 4b3e62b907 Merge pull request '修复issue' (#348) from durian/forgeplus-react:gitlink_server into gitlink_server 2022-03-17 17:11:10 +08:00
谢思 714b90581b 关于我们职位招聘显示不全 2022-03-16 16:29:16 +08:00
xxq250 ff1e063979 Merge pull request '数据统计->专业定位不显示数据问题修复' (#344) from durian/forgeplus-react:gitlink_server into gitlink_server 2022-03-03 11:43:53 +08:00
unknown 4264c127d9 数据统计->专业定位不显示数据问题修复 2022-03-03 09:53:27 +08:00
xxq250 400bd28801 Merge pull request '0304-issue代码修改' (#343) from tongChong/forgeplus-react:gitlink_server into gitlink_server 2022-03-02 15:57:06 +08:00
何童崇 15b2ce6ea9 修改组织图片issue 2022-03-02 15:10:18 +08:00
何童崇 3ae9284494 0304-issue 2022-03-02 14:10:23 +08:00
caishi fb63377996 login页面logo更新 2022-03-02 10:27:22 +08:00
caishi 9527f69486 组织成员-每页条数 2022-02-24 14:22:09 +08:00
caishi b82e7d9d69 组织成员-接口参数page、limit 2022-02-22 11:39:53 +08:00
caishi 9db4f1b18c 0216-issue 2022-02-16 10:37:24 +08:00
caishi c13c7025dd webhook-新建 2022-02-11 09:56:06 +08:00
caishi d8384ab4bd 引擎-权限-非报告者即可 2022-02-10 16:00:54 +08:00
xxq250 882f0760e8 Merge pull request 'issue列表筛选bug以及新增按钮' (#337) from caishi/forgeplus-react:gitlink_server into gitlink_server 2022-01-26 13:47:05 +08:00
caishi 5e337cb94f issue列表排序时其它筛选条件不起作用 2022-01-26 11:35:36 +08:00
caishi 569bc39e1e cursor 2022-01-24 15:57:11 +08:00
caishi 0e643287f9 issue列表:筛选清除按钮、切换时清除分页 2022-01-21 15:29:14 +08:00
xxq250 3d9b43a784 Merge pull request 'issue列表筛选保存、项目名含http报错等问题' (#336) from caishi/forgeplus-react:gitlink_server into gitlink_server 2022-01-14 17:37:28 +08:00
caishi ed2c16661a issue-筛选保存 2022-01-14 17:33:25 +08:00
xxq250 8e4819217c Merge pull request '贡献者返回字段改为list' (#334) from caishi/forgeplus-react:gitlink_server into gitlink_server 2022-01-10 18:03:00 +08:00
caishi d03182cbd4 贡献者返回字段改为list 2022-01-10 18:00:01 +08:00
xxq250 7416d9bcb6 Merge pull request '修改头像、组织添加成员等功能' (#333) from caishi/forgeplus-react:gitlink_server into gitlink_server 2022-01-07 16:57:21 +08:00
caishi 3bfbba2303 同上-update 2022-01-07 16:32:01 +08:00
caishi fa47ae9b5e 设置页面增加修改功能 2022-01-07 11:00:52 +08:00
caishi ac93cfbc8a 截取头像-正方形 2022-01-06 14:03:41 +08:00
caishi bb7732c666 修改后更新 2022-01-06 09:31:59 +08:00
caishi 81d8a866f0 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2022-01-05 11:48:37 +08:00
caishi 0a334abede 修改头像组件 2022-01-05 11:48:31 +08:00
xxq250 1ada91917e Merge pull request 'issue-项目首页和个人主页、点击新开页' (#332) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-31 16:52:36 +08:00
caishi 25f193a1d3 点击新开页 2021-12-30 17:21:18 +08:00
caishi e8bcebbf71 notice-show 2021-12-29 11:41:34 +08:00
xxq250 afaef5f0d0 Merge pull request 'issue-以及分支含特殊字符的处理' (#330) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-28 15:52:54 +08:00
caishi e096e1aa50 branch 转义 2021-12-28 15:50:25 +08:00
caishi ec2d51e0d3 基本资料-性别、单位非必填 2021-12-24 14:35:07 +08:00
xxq250 4ab36af1a9 Merge pull request 'fix issue' (#329) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-24 09:47:40 +08:00
caishi b0088a24ae 分支-特殊字符 2021-12-23 14:07:12 +08:00
caishi 2f25643fcc issue-2021-12-22 2021-12-22 18:29:23 +08:00
caishi 91338c863c explore/all 筛选 2021-12-21 14:17:14 +08:00
xxq250 9786aaa4fe Merge pull request '密码管理+issue' (#327) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-20 17:50:23 +08:00
caishi 34f108118b 文案更新’ 2021-12-20 17:37:02 +08:00
caishi 61abecde53 密码管理 2021-12-20 17:25:25 +08:00
xxq250 326aede507 Merge pull request 'issue' (#324) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-17 16:24:06 +08:00
caishi c3cc105468 易修改为疑修 2021-12-17 15:49:52 +08:00
caishi 80e20a9cca 热门开发者-无项目情况 2021-12-17 10:13:00 +08:00
xxq250 bb8e671c20 Merge pull request 'issue' (#322) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-16 16:11:43 +08:00
caishi 1954a4f8d3 个人主页-组织-sort 2021-12-16 16:08:13 +08:00
caishi b3dec1ee8e Merge branches 'gitlink_server' and 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-12-15 09:46:44 +08:00
caishi 278cdba352 commit clear 2021-12-15 09:46:39 +08:00
caishi e25de315f8 clear 2021-12-15 09:31:43 +08:00
xxq250 6bbdb3d7a8 Merge pull request '教学实践页面' (#318) from durian/forgeplus-react:gitlink_server into gitlink_server 2021-12-14 14:11:27 +08:00
谢思 eb254de9fd 教学实践页面顶部增加跳转 2021-12-14 13:52:27 +08:00
xxq250 c9279b274e Merge pull request '修改issue详情路由及websocket定时请求' (#316) from tongChong/forgeplus-react:gitlink_server into gitlink_server 2021-12-13 16:58:29 +08:00
何童崇 ce477020de Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-12-13 16:18:34 +08:00
xxq250 21078af26f Merge pull request 'issue修改' (#314) from durian/forgeplus-react:gitlink_server into gitlink_server 2021-12-13 16:08:30 +08:00
何童崇 bc5ec6103e 兼容特定情况下的报错 2021-12-13 16:04:36 +08:00
何童崇 fcc53f5278 上传websocket修改 2021-12-13 15:48:31 +08:00
谢思 da69213b8e Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-12-13 15:34:26 +08:00
xxq250 365ff99785 Merge pull request '教学实践' (#315) from durian/forgeplus-react:feature_teaching into gitlink_server 2021-12-13 15:25:02 +08:00
谢思 e206de9f1f Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into feature_teaching 2021-12-13 15:09:17 +08:00
何童崇 358880bfd2 修改issue详情路由 2021-12-13 15:01:03 +08:00
谢思 63971edc44 教学实践优化 2021-12-13 13:19:26 +08:00
谢思 020a976135 易修修改 2021-12-13 11:04:17 +08:00
谢思 29d74526d1 教学实践页面 2021-12-10 15:42:50 +08:00
xxq250 2e1cf5ad82 Merge pull request '针对educoder项目做限制' (#313) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-09 18:23:02 +08:00
caishi 56c8f7fa82 educoder项目添加只读标识 2021-12-09 17:31:34 +08:00
caishi 4db125545f educoder项目-图片不能点击 2021-12-09 14:04:54 +08:00
caishi ecd1a8444e Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-12-09 11:03:57 +08:00
caishi 0a0705d42c educoder项目无提交记录信息 2021-12-09 11:03:52 +08:00
xxq250 be0e0134f3 Merge pull request 'issue' (#312) from hc1913847458/forgeplus-react:gitlink_server into gitlink_server 2021-12-09 10:43:40 +08:00
hucong 6904116a3a Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-12-09 10:15:35 +08:00
hucong 421218ef77 issue 2021-12-09 10:15:30 +08:00
xxq250 5f89356679 Merge pull request 'issue以及需求更改' (#311) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-09 09:54:14 +08:00
hucong cab540b812 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-12-09 09:50:35 +08:00
caishi 2ffa835b84 代码库-贡献者和语言使用单独接口,detail.json接口不返回这两个数组 2021-12-09 09:48:47 +08:00
caishi e93778b004 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-12-08 15:21:25 +08:00
caishi 232e09c04f clear 2021-12-08 15:20:55 +08:00
xxq250 459e05f465 Merge pull request '易修声明功能' (#310) from starlee/forgeplus-react:lzx-claim-2.0 into gitlink_server 2021-12-08 15:15:36 +08:00
caishi 5ee3519c21 项目首页增加搜索功能 2021-12-08 10:11:13 +08:00
caishi 4270d1d8eb @我列表头像链接错误 2021-12-07 17:28:25 +08:00
hucong dd298380a7 相关文案修改 2021-12-07 16:31:51 +08:00
caishi 255ae11012 项目首页-educoder平台头像处理 2021-12-07 16:03:37 +08:00
caishi ec4e70d7f0 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-12-06 16:20:09 +08:00
caishi 758600e4d0 搜索页翻页距离底部的距离 2021-12-03 10:47:47 +08:00
xxq250 7d4def6056 Merge pull request '项目首页-精选项目-固定八个组织的logo信息' (#307) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-02 17:30:42 +08:00
caishi a1cc59e89b 项目首页-精选项目-固定八个组织 2021-12-02 16:27:11 +08:00
xxq250 9e4ca503df Merge pull request 'issue-优化' (#306) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-02 14:16:09 +08:00
caishi 472ea69e29 上线后-update 2021-12-01 18:04:49 +08:00
xxq250 3c5e10fa58 Merge pull request '新建文件不能包含特殊字符:!@\/:"<>|?%' (#305) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-12-01 11:10:48 +08:00
caishi 915bf69e6f 文件名特殊字符判断 2021-12-01 11:06:10 +08:00
xxq250 a00452b960 Merge pull request 'issue' (#304) from hc1913847458/forgeplus-react:gitlink_server into gitlink_server 2021-12-01 09:01:48 +08:00
hucong 3eeed4620c issue 2021-12-01 08:51:17 +08:00
xxq250 54858bcd39 Merge pull request 'issue' (#303) from hc1913847458/forgeplus-react:gitlink_server into gitlink_server 2021-11-30 18:37:23 +08:00
hucong 6820fed5b5 issue 2021-11-30 18:34:41 +08:00
xxq250 82ac32d84f Merge pull request 'issue修改-merge 解决冲突' (#302) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-11-30 18:07:33 +08:00
xxq250 fe6f8a9349 Merge pull request 'issue' (#301) from hc1913847458/forgeplus-react:gitlink_server into gitlink_server 2021-11-30 18:04:42 +08:00
caishi d4f0d21608 添加成员-删了后不能重复添加成员 2021-11-30 17:55:29 +08:00
hucong 56c867a4a3 issue 2021-11-30 17:51:50 +08:00
hucong bd219c0b41 issue 2021-11-30 17:11:56 +08:00
caishi 1292019aac merge-conflicts 2021-11-30 17:00:58 +08:00
caishi 33e1b7e400 合并请求-权限 2021-11-30 16:58:48 +08:00
xxq250 9af269061d Merge pull request '优化复制issue' (#300) from durian/forgeplus-react:gitlink_server into gitlink_server 2021-11-30 16:58:18 +08:00
谢思 2557b36cea Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-11-30 16:54:09 +08:00
谢思 f6c84e4fad 复制issue 2021-11-30 16:52:12 +08:00
xxq250 161866aaaf Merge pull request 'issue' (#299) from hc1913847458/forgeplus-react:gitlink_server into gitlink_server 2021-11-30 16:52:02 +08:00
hucong 3151314529 易修 2021-11-30 16:27:13 +08:00
hucong 775434d856 易修 2021-11-30 15:44:43 +08:00
caishi b802fd2fbd merge+update 2021-11-30 15:37:28 +08:00
caishi cee82314da merge 2021-11-30 15:29:32 +08:00
caishi 7295a71bc5 标记显示宽度 2021-11-30 15:27:11 +08:00
xxq250 4971dc0a3d Merge pull request 'issue' (#298) from durian/forgeplus-react:gitlink_server into gitlink_server 2021-11-30 15:26:36 +08:00
caishi e591de00fd 加入项目申请按钮 2021-11-30 15:22:23 +08:00
谢思 c331dbb445 优化复制issue@列表 2021-11-30 15:05:40 +08:00
caishi 36a58c0fe3 合并请求-字段 2021-11-30 14:16:42 +08:00
caishi 0e949110fd 后端新增字段-非成员不能修改编辑易修 2021-11-30 14:07:22 +08:00
caishi 4ffb2acc9c 编辑标记-长度 2021-11-30 13:57:05 +08:00
xxq250 0991ba4698 Merge pull request 'issue修改' (#297) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-11-30 11:37:41 +08:00
caishi f82a51fd83 merge 2021-11-30 11:28:43 +08:00
caishi 98ed1794cf 代码库 2021-11-30 11:28:02 +08:00
baladiwei 6e756826f7 Merge pull request 'issue' (#296) from durian/forgeplus-react:gitlink_server into gitlink_server 2021-11-30 11:27:09 +08:00
谢思 684f9dbfe1 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-11-30 11:20:20 +08:00
谢思 9577478e97 issue 2021-11-30 11:19:55 +08:00
caishi ff9beb0949 issue-修改‘ 2021-11-30 11:11:25 +08:00
caishi f4055e50e2 个人中心devops-立即激活跳转报错 2021-11-30 09:48:35 +08:00
caishi af8a5058b8 devops 2021-11-30 09:15:33 +08:00
xxq250 efb918e21d Merge pull request 'issue-优化' (#295) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-11-29 17:42:15 +08:00
caishi a9a3f9c977 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-11-29 16:26:35 +08:00
caishi d6b0eee067 update 2021-11-29 16:25:55 +08:00
xxq250 ca409857bb Merge pull request '修改wiki调用' (#294) from tongChong/forgeplus-react:gitlink_server into gitlink_server 2021-11-29 16:20:39 +08:00
何童崇 219590a0cd 修改wiki调用 2021-11-29 16:07:51 +08:00
caishi 2f88227388 devops-name update 2021-11-29 14:35:05 +08:00
caishi a3b943f744 同上-代码编辑器选中高亮 2021-11-29 14:17:33 +08:00
caishi 8b4fc88b1d merge 编辑器滚动问题‘
2021-11-29 14:16:58 +08:00
caishi 131d8fa81c 加入项目错误提示 2021-11-29 14:01:23 +08:00
xxq250 3c2e899a20 Merge pull request 'issue-优化' (#291) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-11-29 11:02:21 +08:00
caishi 07511efbd6 issue-优化 2021-11-29 10:55:50 +08:00
caishi 3eaf1dc214 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-11-29 09:56:05 +08:00
caishi 9608f204e8 优化 2021-11-29 09:54:54 +08:00
xxq250 534a6bdeab Merge pull request '优化' (#290) from durian/forgeplus-react:gitlink_server into gitlink_server 2021-11-29 09:52:58 +08:00
谢思 ca5c279ac0 修改意见反馈的指派成员 2021-11-29 09:34:45 +08:00
谢思 ce3b460717 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-11-29 09:03:29 +08:00
xxq250 1c87cf6b98 Merge pull request '解决冲突以及issue' (#289) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-11-26 15:17:00 +08:00
caishi 614f0ea436 add aboutus-update 2021-11-26 14:29:36 +08:00
xiaoxiaoqiong a3ae80aa22 Merge branch 'feature_aboutus' into gitlink_server 2021-11-26 14:27:34 +08:00
baladiwei 70f9cd0997 Merge pull request '优化代码' (#288) from durian/forgeplus-react:about_us into feature_aboutus 2021-11-26 14:15:08 +08:00
谢思 fa247e39bf 优化代码 2021-11-26 14:11:09 +08:00
caishi 97a81572a9 package 2021-11-26 14:09:15 +08:00
caishi e084b015cf Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2021-11-26 14:08:11 +08:00
xiaoxiaoqiong cbe427a114 解决merge关于我们冲突 2021-11-26 14:02:47 +08:00
xiaoxiaoqiong f842f75065 mrege develop 2021-11-26 13:40:27 +08:00
caishi c8eed99f5d 个人主页-贡献度无数据时只显示x/y轴的内容 2021-11-26 10:59:33 +08:00
xxq250 fbd4273603 Merge pull request '列表样式,合并请求路由值根据接口改为number或者id' (#286) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-11-26 10:19:02 +08:00
caishi 9299a1667e gitlink首页style 2021-11-26 10:15:53 +08:00
baladiwei 10c9891b7b Merge pull request '关于我们' (#285) from durian/forgeplus-react:about_us into feature_aboutus 2021-11-25 16:53:39 +08:00
谢思 e5f8eac497 【关于我们】页面 2021-11-25 16:50:05 +08:00
caishi 633dee9655 合并请求列表跳转链接改为number或者id 2021-11-25 15:29:52 +08:00
starlee e7b7d20f94 add claim mechanism 2021-11-25 14:05:13 +08:00
xxq250 801c544f65 Merge pull request '前端页面优化' (#282) from hc1913847458/forgeplus-react:testdev into develop 2021-11-25 09:43:19 +08:00
hucong 5a1fcb1443 403,404登录验证 2021-11-24 18:31:46 +08:00
谢思 cf1d2dd5ba 修改招聘岗位要求 2021-11-24 17:43:42 +08:00
谢思 121b1aaab1 关于我们0.8版 2021-11-24 17:16:59 +08:00
谢思 3e42a620d9 关于我们0.5版 2021-11-23 21:47:52 +08:00
hucong 33297226ea 页面优化 2021-11-23 18:00:05 +08:00
谢思 982536b547 关于我们0.1版 2021-11-23 17:30:05 +08:00
hucong fd4046af04 issue 2021-11-23 15:04:34 +08:00
hucong 36683ad69b 团队介绍根据不同团队权限显示不同内容 2021-11-23 15:00:06 +08:00
hucong 2262508777 前端403,404,500页面优化 2021-11-23 14:39:44 +08:00
谢思 4f64b840b0 修改 fork项目失败原因为已经复刻过则跳转到复刻仓库,合并请求【仓库:分支】显示统一样式 2021-11-23 14:39:23 +08:00
谢思 a04b8de39e 刷新合并请求页面之后新建合并请求报错(恢复2.0版) 2021-11-23 10:13:11 +08:00
谢思 4d99c97370 刷新新建合并请求页面之后新建合并请求报错3.0 2021-11-23 09:48:36 +08:00
谢思 58f7c984a2 处理页面刷新之后创建合并请求报错2.0 2021-11-22 17:12:20 +08:00
hucong 9db8455de8 项目导航菜单悬停优化 2021-11-22 15:40:59 +08:00
谢思 4b1bccd1cd 处理页面刷新之后创建合并请求报错问题 2021-11-22 15:25:24 +08:00
jasder eff12234fa Merge pull request '意见反馈' (#277) from durian/forgeplus-react:gitlink_server into gitlink_server 2021-11-22 11:03:47 +08:00
谢思 77fdafd58b 解决css文件冲突 2021-11-22 10:15:41 +08:00
谢思 5fea412ca8 解决css文件冲突 2021-11-22 09:36:54 +08:00
yystopf 5f15b03462 Merge pull request 'merge issue上线' (#273) from caishi/forgeplus-react:gitservers into gitlink_server 2021-11-19 14:34:13 +08:00
caishi a2f63732cf build 2021-11-19 14:26:41 +08:00
caishi abf9b25651 iconfont 2021-11-19 14:21:39 +08:00
谢思 bf4ef7023d 意见反馈仓库信息更换成/Gitlink/forgeplus,issue指派成员更换成36480 2021-11-19 14:18:45 +08:00
谢思 f463b20de7 Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-11-19 11:13:57 +08:00
谢思 7934f07cea 代码库、易修页面未登录状态创建修改跳登录框代码层面优化,之后可实现复用 2021-11-19 11:11:14 +08:00
caishi f19a9f6ceb clear 2021-11-19 09:19:48 +08:00
caishi 8b5e159cac Merge branch 'develop' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-11-19 09:18:50 +08:00
caishi 16dff252c0 issue 2021-11-18 17:36:03 +08:00
谢思 fe0fab7b61 顶部导航栏搜索框还原 2021-11-18 17:08:03 +08:00
谢思 4e18d13b6b 注册和找回密码优化 2021-11-18 15:37:06 +08:00
谢思 d81d456d76 顶部搜索优化 2021-11-18 10:55:10 +08:00
jasder 8c66d817b5 Merge pull request 'fix 合并主干开发分支' (#267) from develop into gitlink_server 2021-11-18 10:53:15 +08:00
jasder 7579dc8a59 Merge pull request 'ADD @功能' (#266) from feature_notification_v2 into develop 2021-11-18 10:51:43 +08:00
谢思 3087e5471a 顶部搜索栏为空处理 2021-11-18 10:40:53 +08:00
谢思 4e8f304262 顶部输入框样式调整 2021-11-18 10:28:15 +08:00
谢思 48e9ca6706 意见反馈跳转调试 2021-11-17 15:06:55 +08:00
谢思 fc8a476aa3 修改意见反馈新建issue仓库和指派成员 2021-11-17 14:41:17 +08:00
jasder 89773b5036 Merge pull request '文案调整' (#264) from hc1913847458/forgeplus-react:testdev into develop 2021-11-17 14:31:12 +08:00
谢思 387387108a 意见反馈功能+未登录状态显示创建issue按钮 2021-11-17 14:03:10 +08:00
hucong 2617831a9f 文案调整 2021-11-16 18:29:55 +08:00
hucong f0747eab05 文案调整 2021-11-16 18:28:30 +08:00
caishi 789e84211c 小屏内容宽度调整 2021-11-16 15:54:45 +08:00
谢思 12ce0aa4f5 意见反馈功能 2021-11-16 13:18:03 +08:00
jasder 4a322d1e2e Merge pull request '登陆注册功能' (#262) from durian/forgeplus-react:gitlink_server into gitlink_server 2021-11-16 10:16:59 +08:00
谢思 a38b4af8bc 意见反馈功能 2021-11-16 09:21:13 +08:00
jasder d1743b350d Merge pull request '项目tab栏wiki添加中文' (#258) from hc1913847458/forgeplus-react:testdev into develop 2021-11-15 11:01:37 +08:00
baladiwei 7fd790fe7d Merge pull request '@我功能' (#261) from durian/forgeplus-react:feature_notification_v2 into feature_notification_v2 2021-11-12 14:21:39 +08:00
谢思 c48e3584c3 删除之前atwo.js的引入 2021-11-12 14:17:06 +08:00
谢思 d0ca09e780 Merge branch 'feature_notification_v2' of https://git.trustie.net/Gitlink/forgeplus-react into feature_notification_v2 2021-11-12 14:08:56 +08:00
baladiwei ed3bf55f90 Merge pull request 'merge old version' (#260) from feature_noti_v2 into feature_notification_v2 2021-11-12 14:07:07 +08:00
谢思 7ff29fec70 未及时更新评论内容 2021-11-12 13:50:35 +08:00
谢思 79331db271 登陆注册bug修复 2021-11-12 12:33:46 +08:00
hucong fbfd5f175d 项目tab栏合并请求增加英文 2021-11-12 10:34:56 +08:00
hucong 07101f5770 项目tab栏wiki增加中文 2021-11-12 10:29:53 +08:00
yystopf 652de9b441 Merge pull request '查看源代码的浏览器logo以及页面添加的监听事件的移除' (#257) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-11-11 16:38:14 +08:00
caishi f2a660d595 ico + 移除滚动事件 2021-11-11 16:35:37 +08:00
jasder 711c2e57da Merge pull request '首页相关需求、issues修改' (#256) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-11-11 13:44:38 +08:00
caishi 6fc441d7c5 issues 2021-11-11 13:41:55 +08:00
谢思 a94d02bb8a atwo markdown渲染 2021-11-11 11:31:42 +08:00
谢思 cc2dd35ff4 编辑合并请求最后一行@弹框被遮挡 2021-11-10 20:45:23 +08:00
谢思 f003a99779 @我功能。 2021-11-10 16:47:22 +08:00
caishi b4e2c6148a logo and issues 2021-11-10 15:07:39 +08:00
谢思 b1ead191a6 Merge branch 'pre_develop' of https://git.trustie.net/Gitlink/forgeplus-react into feature_notification_v2 2021-11-10 10:28:23 +08:00
caishi 0735968e73 图片压缩替换 2021-11-10 10:21:01 +08:00
caishi 37f5bce087 pr/Anchor等问题 2021-11-09 16:38:53 +08:00
caishi 951792dc11 style update 2021-11-09 11:20:36 +08:00
caishi 7d7f265ffb Merge branch 'gitlink_server' of https://git.trustie.net/Gitlink/forgeplus-react into gitlink_server 2021-11-09 09:49:54 +08:00
jasder 7495c54f8d Merge pull request 'fix 发布gitlink server 版本' (#252) from jasder/forgeplus-react:gitlink_server into gitlink_server 2021-11-09 09:49:30 +08:00
jasder 631f8ceeea FIX 合并登陆注册功能分支代码 2021-11-09 09:45:36 +08:00
jasder d70ddfb2f7 Merge remote-tracking branch 'gitlink/gitlink_server' into gitlink_server 2021-11-09 09:31:23 +08:00
jasder 54741a6d8a Merge branch 'develop' into gitlink_server 2021-11-09 09:31:05 +08:00
jasder 116c3e531f Merge pull request '登陆注册功能' (#250) from durian/forgeplus-react:featrue_login_and_register into featrue_login_and_register 2021-11-09 09:19:36 +08:00
谢思 990cfe2781 代码优化 2021-11-08 16:44:38 +08:00
谢思 66e1235c3b 找回密码次数上限+找回密码确认密码优化 2021-11-08 16:39:37 +08:00
谢思 76fdff6737 背景图片过大加载慢 2021-11-08 16:15:04 +08:00
谢思 55a6f93fe3 atwho 2021-11-08 16:04:19 +08:00
谢思 4bc79b5153 添加第三方登录 2021-11-08 15:43:55 +08:00
谢思 ac4488a907 atwho 2021-11-08 15:14:04 +08:00
caishi 3085e40426 hide 2021-11-08 15:12:12 +08:00
jasder ea979b78ee Merge pull request '目录跳转问题' (#248) from hc1913847458/forgeplus-react:testdev into develop 2021-11-08 14:34:11 +08:00
hucong b1775e5158 目录跳转问题 2021-11-08 14:05:39 +08:00
hucong 3678b8eb72 issue 2021-11-08 13:58:46 +08:00
谢思 12d8f5bf5d 登陆注册功能 2021-11-08 13:29:12 +08:00
hucong e04fb11194 目录跳转问题 2021-11-05 19:03:24 +08:00
hucong 010edf3cb2 目录跳转问题 2021-11-05 18:31:14 +08:00
jasder ab26a528b6 Merge pull request 'gitlink首页数据绑定以及需求更改、文案修改等' (#246) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-11-04 14:18:37 +08:00
jasder 6d39e25667 Merge pull request 'pr中的用户名称显示问题' (#244) from hc1913847458/forgeplus-react:testdev into develop 2021-11-03 18:46:12 +08:00
caishi a2ea832208 gitlink首页-数据绑定 2021-11-03 18:43:41 +08:00
caishi d1bc3680b9 gitlink首页 2021-11-02 14:15:19 +08:00
caishi 08416390e5 update 2021-11-02 10:23:04 +08:00
hucong 190200d1e6 Merge branch 'pre_develop_dev' of https://git.trustie.net/Gitlink/forgeplus-react into testdev 2021-11-01 14:41:27 +08:00
hucong b124364203 pr中用户名称显示问题 2021-11-01 14:40:41 +08:00
谢思 2078a044b6 at我列表 2021-11-01 09:31:08 +08:00
caishi 35c2f63c55 update 2021-10-29 18:22:45 +08:00
caishi 30c61f0a7d 上线update 2021-10-29 17:01:55 +08:00
caishi 743dabd553 需求+设计+bug修改 2021-10-29 14:18:30 +08:00
caishi 015296e065 merge gitlink首页、项目首页,update 2021-10-29 09:39:59 +08:00
jasder 48c21ac245 Merge pull request 'merge' (#241) from caishi/forgeplus-react:gitlink_server into gitlink_server 2021-10-28 18:26:10 +08:00
caishi a93b8a08c9 register 2021-10-28 18:23:22 +08:00
jasder 1c48ffb130 合并平台首页、项目首页功能分支,并处理代码冲突 2021-10-28 18:11:07 +08:00
jasder 0ee9280bb1 Merge pull request 'fix 开发主干分支并入gitlink服务分支' (#239) from develop into gitlink_server 2021-10-28 17:54:22 +08:00
jasder e785e9a358 Merge pull request 'ADD 项目首页功能并入开发分支' (#238) from featrue_project_homepage into develop 2021-10-28 17:53:05 +08:00
jasder b3b95e9856 Merge pull request 'merge' (#237) from caishi/forgeplus-react:featrue_project_homepage into featrue_project_homepage 2021-10-28 17:51:56 +08:00
caishi 5be8ead356 Merge branch 'develop' of https://git.trustie.net/Gitlink/forgeplus-react into featrue_project_homepage 2021-10-28 17:48:56 +08:00
jasder 7d78919c4a Merge pull request 'FIX 解决冲突' (#236) from pre_develop into develop 2021-10-28 17:48:45 +08:00
jasder d5b4c5425f Merge pull request 'wip' (#235) from pre_develop_dev into pre_develop 2021-10-28 17:48:03 +08:00
caishi f259f05cdc Merge branch 'develop' of https://git.trustie.net/Gitlink/forgeplus-react into featrue_project_homepage 2021-10-28 17:46:55 +08:00
jasder 95cd289373 Merge pull request '项目首页改版更新' (#232) from caishi/forgeplus-react:featrue_project_homepage into featrue_project_homepage 2021-10-28 17:43:43 +08:00
jasder e739f5b786 Merge pull request 'fix 更改注册页面备案号等相关信息' (#231) from jasder/forgeplus-react:gitlink_server into gitlink_server 2021-10-28 17:43:16 +08:00
caishi c79be9a597 Merge branch 'pre_develop_dev' of https://git.trustie.net/Gitlink/forgeplus-react into featrue_project_homepage 2021-10-28 17:41:54 +08:00
jasder fb03565a25 Merge pull request '并入开发分支' (#230) from pre_develop_dev into develop 2021-10-28 17:39:40 +08:00
jasder 7ec53a246c Merge pull request 'logo 从接口获取 nav_logo_url' (#226) from caishi/forgeplus-react:feature_homepage into feature_homepage 2021-10-28 17:30:39 +08:00
jasder 56946f94e8 更改域名相关信息 2021-10-28 17:29:35 +08:00
caishi 61ee3fe36f 注册页面相关信息修改 2021-10-28 17:25:50 +08:00
caishi d5f989bbe2 update 2021-10-28 17:08:36 +08:00
caishi f5817e5150 Merge branch 'pre_develop_dev' of https://git.trustie.net/Gitlink/forgeplus-react into feature_homepage 2021-10-28 09:31:35 +08:00
caishi 1c24baf3b9 数据绑定 2021-10-28 09:31:08 +08:00
caishi 3d3ef19d4a 项目首页 banner 2021-10-26 09:40:35 +08:00
jasder 7b77c46915 Merge pull request '导入仓库链接和项目issue优化更改' (#228) from hc1913847458/forgeplus-react:testdev into pre_develop_dev 2021-10-25 17:33:48 +08:00
hucong 746f552a21 issue 2021-10-25 16:37:50 +08:00
hucong 7872d5ecab 导入链接优化 2021-10-25 15:56:06 +08:00
hucong 60da6bd110 导入链接优化 2021-10-25 15:46:57 +08:00
caishi a3bbf6b1c1 头部logo 2021-10-25 11:29:21 +08:00
caishi d37709b1a5 首页文件夹 2021-10-25 11:24:21 +08:00
hucong aeff357660 项目页icon更改 2021-10-25 11:09:41 +08:00
hucong 0e6cb3954a 项目页icon更改 2021-10-25 11:09:13 +08:00
hucong ae12618c0c 导入链接显示优化 2021-10-25 10:45:40 +08:00
谢思 1c46617144 Merge branch 'pre_develop' of https://git.trustie.net/Gitlink/forgeplus-react into feature_notification_v2 2021-10-23 19:52:58 +08:00
谢思 ec133a6880 添加todo 2021-10-23 19:50:17 +08:00
谢思 bcdb631c20 删除引入的js文件 2021-10-23 19:43:58 +08:00
谢思 8021d96cd8 atwho列表 2021-10-23 19:39:54 +08:00
caishi 914966bd39 detail 2021-10-22 16:42:43 +08:00
caishi f89f4b6628 Merge branch 'standalone_develop' of https://git.trustie.net/Gitlink/forgeplus-react into feature_homepage 2021-10-22 14:33:40 +08:00
jasder 7407545d1f Merge pull request '冲突引起iconfont丢失' (#215) from caishi/forgeplus-react:standalone into standalone 2021-10-22 14:05:27 +08:00
caishi f0ffc9a29c iconfont + style 2021-10-22 13:56:34 +08:00
jasder 987eb39681 Merge pull request 'standalone merge problem' (#214) from caishi/forgeplus-react:standalone into standalone 2021-10-22 11:44:51 +08:00
caishi 848109afe8 settings 2021-10-22 11:40:41 +08:00
caishi d7bdb35bb7 merge bug 2021-10-22 11:28:22 +08:00
caishi 254b3173d1 merge 2021-10-22 11:25:44 +08:00
caishi 44f06b7305 Merge branch 'pre_develop_dev' of https://git.trustie.net/Gitlink/forgeplus-react into feature_homepage
# Conflicts:
#	public/css/iconfont.css
#	public/css/iconfont.js
#	public/css/iconfont.json
#	public/css/iconfont.ttf
#	public/css/iconfont.woff
#	public/css/iconfont.woff2
#	src/App.js
#	src/forge/Head/Footer.jsx
#	src/modules/tpm/TPMIndexHOC.js
2021-10-22 10:33:18 +08:00
jasder b16e95923a Merge pull request 'FIX bug' (#211) from jasder/forgeplus-react:standalone into standalone 2021-10-22 10:11:03 +08:00
jasder 98a7f73c04 Merge branch 'master' into standalone 2021-10-22 10:09:53 +08:00
jasder b6a450a482 FIX 项目路由改造的bug 2021-10-22 10:04:39 +08:00
jasder 66c495d6b5 Merge pull request '合并代码后,变量重复引发错误' (#203) from caishi/forgeplus-react:standalone into standalone 2021-10-21 18:32:37 +08:00
caishi 42139ef998 settings多次声明 2021-10-21 18:30:28 +08:00
jasder 925d5ea356 Merge pull request '并入独立版本' (#202) from jasder/forgeplus-react:standalone into standalone 2021-10-21 18:28:15 +08:00
jasder ad1f0e29e7 FIX 合并主干分支代码并解决冲突 2021-10-21 18:24:06 +08:00
谢思 3498390974 at 2021-10-21 14:12:15 +08:00
谢思 4f3e385f78 at谁列表(缺弹框的上下,enter键监听) 2021-10-21 10:51:40 +08:00
谢思 18b289b84c @who(缺优化) 2021-10-21 09:41:17 +08:00
谢思 e3f49db5c0 at谁列表 2021-10-18 14:19:32 +08:00
谢思 4add266047 at谁列表 2021-10-15 11:36:51 +08:00
谢思 4a6012bfa9 at谁列表 2021-10-14 15:04:17 +08:00
谢思 7fe88aa4d9 at列表 2021-10-14 09:11:37 +08:00
谢思 bc6ef583fb atwho 2021-10-13 16:01:38 +08:00
谢思 b268b540d8 @我列表 2021-10-13 14:53:13 +08:00
谢思 7e69c64c9c @who列表 2021-10-13 11:52:54 +08:00
谢思 85ef26f70e @who 2021-10-13 10:07:38 +08:00
谢思 8c7865d2c1 Merge branch 'pre_develop' of https://git.trustie.net/Gitlink/forgeplus-react into feature_notification_v2 2021-10-13 09:54:04 +08:00
谢思 999a15761d md@谁列表 2021-10-12 14:24:18 +08:00
谢思 5c2330512e @我:在markdown编辑器中输入@我弹出列表需要引入的js 2021-10-11 13:48:50 +08:00
caishi 3da9306ed6 style 2021-09-30 15:42:37 +08:00
caishi 568a632d65 Merge branch 'pre_develop_dev' of https://git.trustie.net/Gitlink/forgeplus-react into feature_homepage
# Conflicts:
#	src/forge/Head/header.scss
2021-09-29 19:34:03 +08:00
caishi 5982c0df96 首页需求更改 2021-09-29 19:31:55 +08:00
jasder 21046bbcb7 Merge pull request 'gitlink首页需求更新' (#86) from caishi/forgeplus-react:feature_homepage into feature_homepage 2021-09-29 08:24:44 +08:00
caishi 0c816805fb gitlink 首页:合作单位的image以及需求更新 2021-09-28 16:08:25 +08:00
caishi 28f8b6b54c Merge branch 'feature_homepage' of https://git.trustie.net/Gitlink/forgeplus-react into feature_homepage 2021-09-24 18:19:27 +08:00
caishi 7d087ec1f2 gitlink首页-第一版 2021-09-24 18:18:55 +08:00
jasder beba8975ca Merge pull request 'fix merge pro develop dev' (#73) from pre_develop_dev into feature_homepage 2021-09-24 18:18:42 +08:00
caishi d4690cc8b5 拉取测试版分支代码,且更新gitlink首页 2021-09-22 09:23:20 +08:00
caishi 38021c2e4b Merge branch 'pre_develop_dev' of https://git.trustie.net/Gitlink/forgeplus-react into feature_homepage 2021-09-17 09:50:03 +08:00
caishi 4233811ae3 Merge branch 'pre_develop_dev' of https://git.trustie.net/Gitlink/forgeplus-react into feature_homepage 2021-09-16 17:26:00 +08:00
caishi 8273acd195 Merge branch 'pre_develop_dev' of https://git.trustie.net/Gitlink/forgeplus-react into feature_homepage 2021-09-16 15:57:24 +08:00
caishi cacb8c84ae 合并develop分支的个人中心改版-全部 2021-06-10 09:36:03 +08:00
caishi fb8ae3fcdf 小修 2021-06-09 18:08:49 +08:00
caishi a257d832cb issue 2021-06-09 18:08:01 +08:00
caishi ff7d191011 merge 2021-06-09 18:07:39 +08:00
caishi 9a2c3f1754 merge 2021-06-09 18:06:54 +08:00
caishi bcdf506e6c 数据统计三个时间筛选参数值必须是时间戳 2021-06-09 18:06:14 +08:00
caishi ccc6cb5d26 merge 2021-06-09 18:03:52 +08:00
caishi 0661c6b932 添加成员后要清除选中的成员 2021-06-09 18:03:24 +08:00
caishi 99947c0c87 merge 2021-06-09 17:56:51 +08:00
caishi 03cff6ec2e merge 2021-06-09 17:56:02 +08:00
caishi f86acfebdf merge冲突 2021-06-09 17:55:12 +08:00
caishi 9a62d7806e 同上-修改细节 2021-06-09 17:54:06 +08:00
caishi a7df6da5f0 merge 个人中心部分 冲突 2021-06-09 17:53:57 +08:00
caishi eab68ac270 概览页数据绑定完成,只差数据统计页 2021-06-09 17:52:43 +08:00
caishi a9e3513706 year 2021-06-09 17:52:31 +08:00
caishi 6b20391c72 merge 个人中心改版 2021-06-09 17:40:05 +08:00
caishi 3135300fe6 merge d029840874 2021-05-14 11:32:01 +08:00
caishi ecc6387113 no message 2021-05-08 17:22:44 +08:00
caishi 990c4e22b0 编辑合并请求-url地址错误 2021-05-08 14:35:51 +08:00
caishi 7eea9316dd detail+同步镜像type=2的才不需要合并请求 2021-05-07 17:41:01 +08:00
caishi 6a546c79e4 merge 2021-05-07 16:36:22 +08:00
caishi 4c48b6c77a merge 2021-05-07 16:35:17 +08:00
caishi 4d5430c3ed 统一项目简介、项目概览 2021-05-07 16:33:57 +08:00
caishi d49af735f1 merge 2021-05-06 17:21:19 +08:00
caishi 03370e8a07 merge 2021-05-06 17:19:09 +08:00
caishi 0b43fa8952 merge develop 2021-05-06 17:18:30 +08:00
caishi 465c4cc8c7 04-28休假期修改issue --需合并至其它分支(合并请求相关) 2021-04-28 20:23:57 +08:00
caishi 37668ddcd4 组织团队-无数据显示错误 2021-04-27 09:47:10 +08:00
caishi 7102594444 代码库编辑文件-切换到其它目录后要重新将编辑状态改为显示状态 2021-04-25 17:48:58 +08:00
caishi b2f2df65bb 样式覆盖 2021-04-23 18:07:15 +08:00
caishi 8a577fb263 资源库 2021-04-23 17:16:50 +08:00
caishi 5c491071b6 +上 关注后不需要提示 2021-04-23 16:37:16 +08:00
caishi c554237076 +上 贡献者悬浮框里增加的跳转链接不要新开页 2021-04-23 16:37:06 +08:00
caishi d22a741bf7 贡献者-悬浮内容增加跳转链接 2021-04-23 16:36:56 +08:00
caishi 383b3f5d74 imageUrl + / 2021-04-23 16:36:41 +08:00
caishi 63da7adcf9 个人中心关注-关注或者取消关注未更新状态 2021-04-23 16:36:31 +08:00
caishi 3243aeebc6 贡献者-悬浮卡片-测试版1 2021-04-23 16:36:22 +08:00
caishi 1a86a75345 发布评论者头像路径错误 2021-04-23 16:36:11 +08:00
caishi 3b6cc99d49 merge 2021-04-23 16:35:49 +08:00
caishi d872ffc606 merge 2021-04-23 16:31:15 +08:00
caishi 3b69c01ead merge 2021-04-23 16:30:45 +08:00
caishi 1e0608aa14 合并请求-提出申请者头像显示问题 2021-04-23 16:30:07 +08:00
caishi 9b6816e346 团队项目-团队项目管理-显示的name和跳转的login 2021-04-23 16:29:57 +08:00
caishi 6ee257231d 切换左侧目录,选择不同的文件时,文件详情没有更新 2021-04-23 16:29:46 +08:00
caishi 70edb73f6c all-默认头像(首字母加背景颜色) 2021-04-23 16:29:35 +08:00
caishi 5c7553d4aa merge 2021-04-23 16:29:16 +08:00
caishi 278701f24b 上线后的getImageURL也不用在前面加/ + 一些小样式修改 2021-04-23 16:27:56 +08:00
caishi 97ab819bf9 merge 2021-04-23 16:27:37 +08:00
caishi d870f17b85 readme-文件增加一个目录下拉icon 2021-04-23 16:26:02 +08:00
caishi 91ac6c2357 组织团队-新增一个团队标识 2021-04-23 16:25:47 +08:00
caishi 3702d1c1a5 merge 2021-04-23 16:25:35 +08:00
caishi 93d48c359e merge 2021-04-23 16:25:03 +08:00
caishi 80dace18e9 资源库不需要按引用次数排序 2021-04-23 16:24:23 +08:00
caishi 375cbb37df merge 2021-04-23 16:24:02 +08:00
caishi 10d933e037 merge develop 2021-04-23 16:23:29 +08:00
caishi 4fdd3f6f80 组织-团队列表的头像login为undefined 2021-04-23 16:22:36 +08:00
caishi 458b56e33b 去掉悬浮手册按钮 2021-04-23 16:22:22 +08:00
caishi c256887132 注册成功后跳转到首页 2021-03-31 15:13:32 +08:00
caishi 6a588db7f6 清理代码 2021-03-31 15:03:16 +08:00
caishi 6c4e1c6665 Merge branch 'standalone' into dev_local 2021-03-31 14:42:24 +08:00
caishi c554d2c00d 重置settings为undefined 2021-03-31 14:35:23 +08:00
caishi b69bf5974a remove 2021-03-31 14:28:22 +08:00
caishi ecb1691b4d Trustie 2021-03-31 14:17:48 +08:00
caishi 6a9f2b31a6 注册页面logo和底部信息 2021-03-31 14:04:09 +08:00
caishi 4947cd8456 浏览器ico要用trustie的logo 2021-03-31 12:07:11 +08:00
caishi 8429effe16 没logo时会将setting重置为空 2021-03-31 12:02:38 +08:00
caishi 49ebe450be 合并测试版分支 2021-03-31 11:21:07 +08:00
caishi e3c926da77 注册 2021-03-29 17:37:16 +08:00
caishi af48da2eb3 href 2021-03-29 17:14:56 +08:00
caishi 6630309466 Merge branch 'develop' into dev_local 2021-03-29 16:58:48 +08:00
caishi a7c3dee7e3 2020-11-26 10:55:03 +08:00
525 changed files with 20680 additions and 4243 deletions

2
.gitignore vendored
View File

@ -37,7 +37,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/

1179
.idea/workspace.xml Normal file

File diff suppressed because it is too large Load Diff

15
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,15 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "pwa-chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}"
}
]
}

3278
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@
"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",
@ -24,11 +24,11 @@
"classnames": "^2.2.5", "classnames": "^2.2.5",
"clipboard": "^2.0.8", "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", "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.9.0", "echarts": "^4.9.0",
@ -51,7 +51,7 @@
"js-base64": "^2.5.2", "js-base64": "^2.5.2",
"js2wordcloud": "^1.1.12", "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",
@ -84,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",

View File

@ -1268,11 +1268,17 @@ a.shixun-task-btn {
/*-----------实训配置、评测脚本-------------*/ /*-----------实训配置、评测脚本-------------*/
@font-face {
font-family: "iconfont"; /* Project id 2340181 */
src: url('iconfont.woff2?t=1631773579834') format('woff2'),
url('iconfont.woff?t=1631773579834') format('woff'),
url('iconfont.ttf?t=1631773579834') format('truetype');
}
html body { html body {
font-size: 14px; font-size: 14px;
line-height: 2.0; line-height: 2.0;
background: #fafafa; background: #fafafa;
font-family: "Microsoft YaHei", "SimSun"; font-family: "iconfont";
color: #05101a; color: #05101a;
height: 100%; height: 100%;
position: relative; position: relative;
@ -3939,9 +3945,13 @@ html>body #ajax-indicator {
margin-left: 10px; margin-left: 10px;
color: #2FC25B; 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;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
@ -3953,14 +3963,14 @@ 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;
@ -3971,7 +3981,7 @@ html>body #ajax-indicator {
display: block; display: block;
height: 100%; height: 100%;
width: 100%; width: 100%;
color: #333; color: #fff;
font-size: 16px; font-size: 16px;
} }
@ -3983,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;

View File

@ -1,8 +1,8 @@
@font-face { @font-face {
font-family: "iconfont"; /* Project id 2340181 */ font-family: "iconfont"; /* Project id 2340181 */
src: url('iconfont.woff2?t=1634881729644') format('woff2'), src: url('iconfont.woff2?t=1653550272457') format('woff2'),
url('iconfont.woff?t=1634881729644') format('woff'), url('iconfont.woff?t=1653550272457') format('woff'),
url('iconfont.ttf?t=1634881729644') format('truetype'); url('iconfont.ttf?t=1653550272457') format('truetype');
} }
.iconfont { .iconfont {
@ -13,6 +13,338 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.icon-tuichuicon:before {
content: "\e936";
}
.icon-bangzhuzhongxinicon1:before {
content: "\e935";
}
.icon-ketixiangqingicon:before {
content: "\e92b";
}
.icon-bianjiicon:before {
content: "\e92c";
}
.icon-baomingxiangqingicon:before {
content: "\e92d";
}
.icon-sousuo4:before {
content: "\e92e";
}
.icon-quxiaoshenqingicon:before {
content: "\e92f";
}
.icon-xiala3:before {
content: "\e930";
}
.icon-tianjia_tianchong:before {
content: "\e931";
}
.icon-a-shanchu2:before {
content: "\e932";
}
.icon-shanchuicon3:before {
content: "\e933";
}
.icon-shenqingketiicon:before {
content: "\e934";
}
.icon-weixin:before {
content: "\e92a";
}
.icon-zanwushuju:before {
content: "\e928";
}
.icon-fuwuicon:before {
content: "\e929";
}
.icon-personal-center:before {
content: "\e927";
}
.icon-bangzhuzhongxinicon:before {
content: "\e926";
}
.icon-kaiyuanxiangmu:before {
content: "\e91d";
}
.icon-luntanjiaoliu:before {
content: "\e91e";
}
.icon-wangzhanpeizhi:before {
content: "\e91f";
}
.icon-weixuanze-chuangkekongjian:before {
content: "\e920";
}
.icon-tubiao:before {
content: "\e921";
}
.icon-gonggaofabu:before {
content: "\e922";
}
.icon-jingsaihuodong:before {
content: "\e923";
}
.icon-yonghuguanli:before {
content: "\e924";
}
.icon-shenpi:before {
content: "\e925";
}
.icon-zhuanli1:before {
content: "\e918";
}
.icon-daimaicon:before {
content: "\e91c";
}
.icon-jiangxiangicon:before {
content: "\e916";
}
.icon-shuju:before {
content: "\e917";
}
.icon-wendang:before {
content: "\e919";
}
.icon-lunwen:before {
content: "\e91a";
}
.icon-zhuanli:before {
content: "\e91b";
}
.icon-gailan1:before {
content: "\e914";
}
.icon-tuandui:before {
content: "\e915";
}
.icon-icon2:before {
content: "\e912";
}
.icon-a-21:before {
content: "\e913";
}
.icon-a-2:before {
content: "\e90f";
}
.icon-a-3:before {
content: "\e910";
}
.icon-icon1:before {
content: "\e911";
}
.icon-ioon:before {
content: "\e90e";
}
.icon-shanchu_tc_icon1:before {
content: "\e90c";
}
.icon-zhuanjiaicon:before {
content: "\e90d";
}
.icon-shengming:before {
content: "\e90b";
}
.icon-chenggong1:before {
content: "\e907";
}
.icon-a-bitian2x1:before {
content: "\e908";
}
.icon-xiala1:before {
content: "\e909";
}
.icon-xiala2:before {
content: "\e90a";
}
.icon-jiantou1:before {
content: "\e905";
}
.icon-zhangjieicon:before {
content: "\e8fe";
}
.icon-chengyuan1:before {
content: "\e903";
}
.icon-a-shangchuan2x:before {
content: "\e8f9";
}
.icon-shanchu7:before {
content: "\e8fa";
}
.icon-zuohuabeifen:before {
content: "\e8fb";
}
.icon-a-bianji11:before {
content: "\e8f4";
}
.icon-a-bitian2x:before {
content: "\e8f5";
}
.icon-a-zuohua2x:before {
content: "\e8f7";
}
.icon-lianjie3:before {
content: "\e8f8";
}
.icon-zhishitupu:before {
content: "\e8fc";
}
.icon-jisuanji1:before {
content: "\e8fd";
}
.icon-dianzi1:before {
content: "\e8ff";
}
.icon-junshililun1:before {
content: "\e900";
}
.icon-ruanjiangongcheng1:before {
content: "\e901";
}
.icon-yixue1:before {
content: "\e902";
}
.icon-tongxin1:before {
content: "\e904";
}
.icon-zhengcefagui1:before {
content: "\e906";
}
.icon-dashuju:before {
content: "\e8f3";
}
.icon-rengongzhineng:before {
content: "\e8f6";
}
.icon-a-shuangyinhao12x:before {
content: "\e8f2";
}
.icon-dingbu:before {
content: "\e8ee";
}
.icon-bangzhu1:before {
content: "\e8ef";
}
.icon-yijianfankui2:before {
content: "\e8f0";
}
.icon-fenxiang:before {
content: "\e8f1";
}
.icon-dizhi:before {
content: "\e8eb";
}
.icon-youxiang1:before {
content: "\e8ec";
}
.icon-dianhuaicon:before {
content: "\e8ed";
}
.icon-tianjiaicon:before {
content: "\e8e8";
}
.icon-lingshengicon:before {
content: "\e8ea";
}
.icon-gengduoicon:before {
content: "\e8e5";
}
.icon-shijianicon:before {
content: "\e8e7";
}
.icon-mimaicon:before {
content: "\e8e1";
}
.icon-gouicon:before {
content: "\e8e2";
}
.icon-zhankaiicon:before {
content: "\e8e3";
}
.icon-wenjian7:before { .icon-wenjian7:before {
content: "\e8e0"; content: "\e8e0";
} }

File diff suppressed because one or more lines are too long

View File

@ -5,6 +5,587 @@
"css_prefix_text": "icon-", "css_prefix_text": "icon-",
"description": "", "description": "",
"glyphs": [ "glyphs": [
{
"icon_id": "29934961",
"name": "退出icon",
"font_class": "tuichuicon",
"unicode": "e936",
"unicode_decimal": 59702
},
{
"icon_id": "29811507",
"name": "帮助中心icon",
"font_class": "bangzhuzhongxinicon1",
"unicode": "e935",
"unicode_decimal": 59701
},
{
"icon_id": "29701613",
"name": "课题详情icon",
"font_class": "ketixiangqingicon",
"unicode": "e92b",
"unicode_decimal": 59691
},
{
"icon_id": "29701614",
"name": "编辑icon",
"font_class": "bianjiicon",
"unicode": "e92c",
"unicode_decimal": 59692
},
{
"icon_id": "29701615",
"name": "报名详情icon",
"font_class": "baomingxiangqingicon",
"unicode": "e92d",
"unicode_decimal": 59693
},
{
"icon_id": "29701616",
"name": "搜索",
"font_class": "sousuo4",
"unicode": "e92e",
"unicode_decimal": 59694
},
{
"icon_id": "29701617",
"name": "取消申请icon",
"font_class": "quxiaoshenqingicon",
"unicode": "e92f",
"unicode_decimal": 59695
},
{
"icon_id": "29701618",
"name": "下拉",
"font_class": "xiala3",
"unicode": "e930",
"unicode_decimal": 59696
},
{
"icon_id": "29701619",
"name": "添加_填充",
"font_class": "tianjia_tianchong",
"unicode": "e931",
"unicode_decimal": 59697
},
{
"icon_id": "29701620",
"name": "删除 (2)",
"font_class": "a-shanchu2",
"unicode": "e932",
"unicode_decimal": 59698
},
{
"icon_id": "29701621",
"name": "删除icon",
"font_class": "shanchuicon3",
"unicode": "e933",
"unicode_decimal": 59699
},
{
"icon_id": "29701622",
"name": "申请课题icon",
"font_class": "shenqingketiicon",
"unicode": "e934",
"unicode_decimal": 59700
},
{
"icon_id": "29665762",
"name": "微信",
"font_class": "weixin",
"unicode": "e92a",
"unicode_decimal": 59690
},
{
"icon_id": "29467269",
"name": "暂无数据",
"font_class": "zanwushuju",
"unicode": "e928",
"unicode_decimal": 59688
},
{
"icon_id": "29467272",
"name": "服务icon",
"font_class": "fuwuicon",
"unicode": "e929",
"unicode_decimal": 59689
},
{
"icon_id": "29206429",
"name": "personal-center",
"font_class": "personal-center",
"unicode": "e927",
"unicode_decimal": 59687
},
{
"icon_id": "28888753",
"name": "帮助中心icon",
"font_class": "bangzhuzhongxinicon",
"unicode": "e926",
"unicode_decimal": 59686
},
{
"icon_id": "28163416",
"name": "开源项目",
"font_class": "kaiyuanxiangmu",
"unicode": "e91d",
"unicode_decimal": 59677
},
{
"icon_id": "28163417",
"name": "论坛交流",
"font_class": "luntanjiaoliu",
"unicode": "e91e",
"unicode_decimal": 59678
},
{
"icon_id": "28163418",
"name": "网站配置",
"font_class": "wangzhanpeizhi",
"unicode": "e91f",
"unicode_decimal": 59679
},
{
"icon_id": "28163419",
"name": "未选择-创客空间",
"font_class": "weixuanze-chuangkekongjian",
"unicode": "e920",
"unicode_decimal": 59680
},
{
"icon_id": "28163420",
"name": "图标",
"font_class": "tubiao",
"unicode": "e921",
"unicode_decimal": 59681
},
{
"icon_id": "28163421",
"name": "公告发布",
"font_class": "gonggaofabu",
"unicode": "e922",
"unicode_decimal": 59682
},
{
"icon_id": "28163422",
"name": "竞赛活动",
"font_class": "jingsaihuodong",
"unicode": "e923",
"unicode_decimal": 59683
},
{
"icon_id": "28163423",
"name": "用户管理",
"font_class": "yonghuguanli",
"unicode": "e924",
"unicode_decimal": 59684
},
{
"icon_id": "28163424",
"name": "审批",
"font_class": "shenpi",
"unicode": "e925",
"unicode_decimal": 59685
},
{
"icon_id": "22773568",
"name": "专利",
"font_class": "zhuanli1",
"unicode": "e918",
"unicode_decimal": 59672
},
{
"icon_id": "27680124",
"name": "代码icon",
"font_class": "daimaicon",
"unicode": "e91c",
"unicode_decimal": 59676
},
{
"icon_id": "27664463",
"name": "奖项icon",
"font_class": "jiangxiangicon",
"unicode": "e916",
"unicode_decimal": 59670
},
{
"icon_id": "27664464",
"name": "数据",
"font_class": "shuju",
"unicode": "e917",
"unicode_decimal": 59671
},
{
"icon_id": "27664466",
"name": "文档",
"font_class": "wendang",
"unicode": "e919",
"unicode_decimal": 59673
},
{
"icon_id": "27664467",
"name": "论文",
"font_class": "lunwen",
"unicode": "e91a",
"unicode_decimal": 59674
},
{
"icon_id": "27664468",
"name": "专利",
"font_class": "zhuanli",
"unicode": "e91b",
"unicode_decimal": 59675
},
{
"icon_id": "27664392",
"name": "概览",
"font_class": "gailan1",
"unicode": "e914",
"unicode_decimal": 59668
},
{
"icon_id": "27664393",
"name": "团队",
"font_class": "tuandui",
"unicode": "e915",
"unicode_decimal": 59669
},
{
"icon_id": "27299393",
"name": "icon",
"font_class": "icon2",
"unicode": "e912",
"unicode_decimal": 59666
},
{
"icon_id": "27299394",
"name": "2",
"font_class": "a-21",
"unicode": "e913",
"unicode_decimal": 59667
},
{
"icon_id": "27200759",
"name": "2",
"font_class": "a-2",
"unicode": "e90f",
"unicode_decimal": 59663
},
{
"icon_id": "27200760",
"name": "3",
"font_class": "a-3",
"unicode": "e910",
"unicode_decimal": 59664
},
{
"icon_id": "27200761",
"name": "icon",
"font_class": "icon1",
"unicode": "e911",
"unicode_decimal": 59665
},
{
"icon_id": "27041503",
"name": "ioon",
"font_class": "ioon",
"unicode": "e90e",
"unicode_decimal": 59662
},
{
"icon_id": "26470602",
"name": "shanchu_tc_icon",
"font_class": "shanchu_tc_icon1",
"unicode": "e90c",
"unicode_decimal": 59660
},
{
"icon_id": "26470603",
"name": "专家icon",
"font_class": "zhuanjiaicon",
"unicode": "e90d",
"unicode_decimal": 59661
},
{
"icon_id": "12505154",
"name": "声明",
"font_class": "shengming",
"unicode": "e90b",
"unicode_decimal": 59659
},
{
"icon_id": "26470597",
"name": "成功",
"font_class": "chenggong1",
"unicode": "e907",
"unicode_decimal": 59655
},
{
"icon_id": "26470599",
"name": "必填@2x",
"font_class": "a-bitian2x1",
"unicode": "e908",
"unicode_decimal": 59656
},
{
"icon_id": "26470600",
"name": "下拉",
"font_class": "xiala1",
"unicode": "e909",
"unicode_decimal": 59657
},
{
"icon_id": "26470601",
"name": "下拉2",
"font_class": "xiala2",
"unicode": "e90a",
"unicode_decimal": 59658
},
{
"icon_id": "26363219",
"name": "箭头",
"font_class": "jiantou1",
"unicode": "e905",
"unicode_decimal": 59653
},
{
"icon_id": "26359564",
"name": "章节icon ",
"font_class": "zhangjieicon",
"unicode": "e8fe",
"unicode_decimal": 59646
},
{
"icon_id": "26359565",
"name": "成员",
"font_class": "chengyuan1",
"unicode": "e903",
"unicode_decimal": 59651
},
{
"icon_id": "26325702",
"name": "上传@2x",
"font_class": "a-shangchuan2x",
"unicode": "e8f9",
"unicode_decimal": 59641
},
{
"icon_id": "26325703",
"name": "删除 ",
"font_class": "shanchu7",
"unicode": "e8fa",
"unicode_decimal": 59642
},
{
"icon_id": "26325704",
"name": "左滑备份",
"font_class": "zuohuabeifen",
"unicode": "e8fb",
"unicode_decimal": 59643
},
{
"icon_id": "26325698",
"name": "编辑 (1)",
"font_class": "a-bianji11",
"unicode": "e8f4",
"unicode_decimal": 59636
},
{
"icon_id": "26325699",
"name": "必填@2x",
"font_class": "a-bitian2x",
"unicode": "e8f5",
"unicode_decimal": 59637
},
{
"icon_id": "26325700",
"name": "左滑@2x",
"font_class": "a-zuohua2x",
"unicode": "e8f7",
"unicode_decimal": 59639
},
{
"icon_id": "26325701",
"name": "链接",
"font_class": "lianjie3",
"unicode": "e8f8",
"unicode_decimal": 59640
},
{
"icon_id": "25748537",
"name": "知识图谱",
"font_class": "zhishitupu",
"unicode": "e8fc",
"unicode_decimal": 59644
},
{
"icon_id": "25748551",
"name": "计算机",
"font_class": "jisuanji1",
"unicode": "e8fd",
"unicode_decimal": 59645
},
{
"icon_id": "25748553",
"name": "电子",
"font_class": "dianzi1",
"unicode": "e8ff",
"unicode_decimal": 59647
},
{
"icon_id": "25748554",
"name": "军事理论",
"font_class": "junshililun1",
"unicode": "e900",
"unicode_decimal": 59648
},
{
"icon_id": "25748555",
"name": "软件工程",
"font_class": "ruanjiangongcheng1",
"unicode": "e901",
"unicode_decimal": 59649
},
{
"icon_id": "25748556",
"name": "医学",
"font_class": "yixue1",
"unicode": "e902",
"unicode_decimal": 59650
},
{
"icon_id": "25748558",
"name": "通信",
"font_class": "tongxin1",
"unicode": "e904",
"unicode_decimal": 59652
},
{
"icon_id": "25748560",
"name": "政策法规",
"font_class": "zhengcefagui1",
"unicode": "e906",
"unicode_decimal": 59654
},
{
"icon_id": "25748528",
"name": "大数据",
"font_class": "dashuju",
"unicode": "e8f3",
"unicode_decimal": 59635
},
{
"icon_id": "25748531",
"name": "人工智能",
"font_class": "rengongzhineng",
"unicode": "e8f6",
"unicode_decimal": 59638
},
{
"icon_id": "25733167",
"name": "双引号(1)@2x",
"font_class": "a-shuangyinhao12x",
"unicode": "e8f2",
"unicode_decimal": 59634
},
{
"icon_id": "25701947",
"name": "顶部",
"font_class": "dingbu",
"unicode": "e8ee",
"unicode_decimal": 59630
},
{
"icon_id": "25701948",
"name": "帮助",
"font_class": "bangzhu1",
"unicode": "e8ef",
"unicode_decimal": 59631
},
{
"icon_id": "25701949",
"name": "意见反馈",
"font_class": "yijianfankui2",
"unicode": "e8f0",
"unicode_decimal": 59632
},
{
"icon_id": "25701950",
"name": "分享",
"font_class": "fenxiang",
"unicode": "e8f1",
"unicode_decimal": 59633
},
{
"icon_id": "25580217",
"name": "地址",
"font_class": "dizhi",
"unicode": "e8eb",
"unicode_decimal": 59627
},
{
"icon_id": "25580218",
"name": "邮箱",
"font_class": "youxiang1",
"unicode": "e8ec",
"unicode_decimal": 59628
},
{
"icon_id": "25580219",
"name": "电话icon",
"font_class": "dianhuaicon",
"unicode": "e8ed",
"unicode_decimal": 59629
},
{
"icon_id": "25284174",
"name": "添加icon",
"font_class": "tianjiaicon",
"unicode": "e8e8",
"unicode_decimal": 59624
},
{
"icon_id": "25284175",
"name": "铃声icon",
"font_class": "lingshengicon",
"unicode": "e8ea",
"unicode_decimal": 59626
},
{
"icon_id": "25204490",
"name": "更多icon",
"font_class": "gengduoicon",
"unicode": "e8e5",
"unicode_decimal": 59621
},
{
"icon_id": "25204491",
"name": "时间icon",
"font_class": "shijianicon",
"unicode": "e8e7",
"unicode_decimal": 59623
},
{
"icon_id": "25188228",
"name": "密码icon",
"font_class": "mimaicon",
"unicode": "e8e1",
"unicode_decimal": 59617
},
{
"icon_id": "25188229",
"name": "钩icon",
"font_class": "gouicon",
"unicode": "e8e2",
"unicode_decimal": 59618
},
{
"icon_id": "25188230",
"name": "展开icon",
"font_class": "zhankaiicon",
"unicode": "e8e3",
"unicode_decimal": 59619
},
{ {
"icon_id": "24656750", "icon_id": "24656750",
"name": "文件", "name": "文件",

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
public/favicon-.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -7,6 +7,7 @@
<meta name=”Keywords” Content=”issue,bug,tracker,软件工程,课程实践″> <meta name=”Keywords” Content=”issue,bug,tracker,软件工程,课程实践″>
<meta name=”Description” Content=”持续构建协同、共享、可信的软件创建生态开源创作与软件生产相结合,支持大规模群体开展软件协同创新活动”> <meta name=”Description” Content=”持续构建协同、共享、可信的软件创建生态开源创作与软件生产相结合,支持大规模群体开展软件协同创新活动”>
<meta name="theme-color" content="#000000"> <meta name="theme-color" content="#000000">
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json"> <link rel="manifest" href="%PUBLIC_URL%/manifest.json">
<link rel="stylesheet" type="text/css" href="%PUBLIC_URL%css/iconfont.css"> <link rel="stylesheet" type="text/css" href="%PUBLIC_URL%css/iconfont.css">

View File

@ -93,6 +93,9 @@ body {
.editormd-preview .markdown-body{ .editormd-preview .markdown-body{
padding:0px !important; padding:0px !important;
} }
.editormd-preview{
width: 50%!important;
}
/* 图片点击放大的场景,隐藏图片链接 */ /* 图片点击放大的场景,隐藏图片链接 */
.editormd-image-click-expand .editormd-image-dialog { .editormd-image-click-expand .editormd-image-dialog {

View File

@ -3,21 +3,21 @@ 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 SiderBar from './forge/Component/SiderBar';
import SiderBarHelp from './glcc/siderBarHelp';
import { SnackbarHOC } from 'educoder'; import { SnackbarHOC } from 'educoder';
import { initAxiosInterceptors } from './AppConfig' import { initAxiosInterceptors } from './AppConfig'
@ -26,18 +26,18 @@ import configureStore from './redux/stores/configureStore';
const store = configureStore(); const store = configureStore();
window.marked = marked; window.marked = marked;
const theme = createMuiTheme({ const theme = createMuiTheme({
palette: { palette: {
primary: { primary: {
main: '#4CACFF', main: '#4CACFF',
contrastText: 'rgba(255, 255, 255, 0.87)' contrastText: 'rgba(255, 255, 255, 0.87)'
}, },
secondary: { main: '#4CACFF' }, // #11cb5f This is just green.A700 as hex. secondary: { main: '#4CACFF' }, // #11cb5f This is just green.A700 as hex.
}, },
}); });
//forge项目 //forge项目
const Projects = Loadable({ const Projects = Loadable({
loader: () => import('./forge/Index'), loader: () => import('./forge/Index'),
loading: Loading, loading: Loading,
}) })
// forge项目详情 // forge项目详情
const ProjectDetail = Loadable({ const ProjectDetail = Loadable({
@ -46,470 +46,522 @@ const ProjectDetail = Loadable({
}); });
//forge安全设置 //forge安全设置
const Security = Loadable({ const Security = Loadable({
loader: () => import('./forge/SecuritySetting/Index'), loader: () => import('./forge/SecuritySetting/Index'),
loading: Loading, loading: Loading,
}) })
//forge项目-devOps详情 //forge项目-devOps详情
const OpsDetail = Loadable({ const OpsDetail = Loadable({
loader: () => import('./forge/DevOps/opsDetail'), loader: () => import('./forge/DevOps/opsDetail'),
loading: Loading, loading: Loading,
}) })
//403页面 //403页面
const Shixunauthority = Loadable({ const Shixunauthority = Loadable({
loader: () => import('./modules/403/Shixunauthority'), loader: () => import('./modules/403/Shixunauthority'),
loading: Loading, loading: Loading,
}) })
//404页面 //404页面
const Shixunnopage = Loadable({ const Shixunnopage = Loadable({
loader: () => import('./modules/404/Shixunnopage'), loader: () => import('./modules/404/Shixunnopage'),
loading: Loading, loading: Loading,
}) })
//500页面 //500页面
const http500 = Loadable({ const http500 = Loadable({
loader: () => import('./modules/500/http500'), loader: () => import('./modules/500/http500'),
loading: Loading, loading: Loading,
}) })
const InfosIndex = Loadable({ const InfosIndex = Loadable({
loader: () => import('./forge/users/Index'), loader: () => import('./forge/users/Index'),
loading: Loading, loading: Loading,
}) })
// 组织 // 组织
const OrganizeIndex = Loadable({ 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'),
loading: Loading,
}) })
const Search = Loadable({ const Search = Loadable({
loader: () => import('./modules/search/'), loader: () => import('./modules/search/'),
loading: Loading, loading: Loading,
}) })
const WikiPreview = Loadable({ const WikiPreview = Loadable({
loader: () => import('./forge/Wiki/Preview'), loader: () => import('./forge/Wiki/Preview'),
loading: Loading, loading: Loading,
}) })
const ProjectIndex = Loadable({ const ProjectIndex = Loadable({
loader: () => import("./forge/Index"), loader: () => import("./forge/Index"),
loading: Loading, 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({ // const CreateMerge = Loadable({
// loader: () => import('./forge/Merge/NewMerge'), // loader: () => import('./forge/Merge/NewMerge'),
// loading: Loading, // loading: Loading,
// }) // })
// 此处仅维护前端可能的一级路由,不用进行项目或者组织判断的字段。 // 此处仅维护前端可能的一级路由,不用进行项目或者组织判断的字段。
const keyWord = ["explore", "settings", "setting", "mulan", "wiki", "issues", "setting", "trending", "code", "projects", "pulls", "mine", "login", "register", "email", "export", "nopage", "404", "403", "500", "501", "search", "organize"]; 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", "glcc"];
class App extends Component { class App extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.state = { this.state = {
Addcoursestype: false, Addcoursestype: false,
Addcoursestypes: false, Addcoursestypes: false,
mydisplay: false, mydisplay: false,
occupation: 0, occupation: 0,
mygetHelmetapi: null, mygetHelmetapi: null,
pathType: null, pathType: null,
pathName: null, pathName: null,
} }
} }
UNSAFE_componentWillMount() { UNSAFE_componentWillMount() {
initAxiosInterceptors(this.props); initAxiosInterceptors(this.props);
let pathname = window.location.pathname ? window.location.pathname.split('/')[1] : ''; let pathname = window.location.pathname ? window.location.pathname.split('/')[1] : '';
pathname && this.getPathnameType(pathname); pathname && this.getPathnameType(pathname);
// 添加路由监听,决定组织还是个人 // 添加路由监听,决定组织还是个人
this.unlisten = this.props.history.listen((location) => { this.unlisten = this.props.history.listen((location,history) => {
let newPathname = location.pathname.split('/')[1]; let newPathname = location.pathname.split('/')[1];
if (this.state.pathName !== newPathname) { if (this.state.pathName !== newPathname) {
// this.setState({ pathType: '' }); // this.setState({ pathType: '' });
newPathname && this.getPathnameType(newPathname); newPathname && this.getPathnameType(newPathname);
} }
}); });
} }
shouldComponentUpdate(nextProps, nextState) { shouldComponentUpdate(nextProps, nextState) {
// (!keyWord.includes(this.props.location.pathname.split('/')[1])) && if(!nextProps.location.pathname==='/'){
if (nextProps.location.pathname.split('/')[1] !== this.props.location.pathname.split('/')[1] && nextState.pathType === this.state.pathType) { return true;
return false; }
} else { // 阻止个人与组织切换时组件渲染请求导致的404
return true; if (nextProps.location.pathname.split('/')[1] !== this.props.location.pathname.split('/')[1] && nextState.pathType === this.state.pathType) {
} return false;
} } else {
return true;
}
}
getPathnameType = (pathname) => { getPathnameType = (pathname) => {
if (!keyWord.includes(pathname)) { if (!keyWord.includes(pathname)) {
let url = `/owners/${pathname}.json`; let url = `/owners/${pathname}.json`;
axios.get(url).then((response) => { axios.get(url).then((response) => {
if (response && response.status === 200) { if (response && response.status === 200) {
this.setState({ this.setState({
pathType: response.data.type || '404', pathType: response.data.type || '404',
pathName: pathname, pathName: pathname,
}) })
} }
}); });
}else{ }else{
this.setState({ this.setState({
pathType: pathname, pathType: pathname,
pathName: pathname, pathName: pathname,
}); });
} }
} }
HideAddcoursestypess = (i) => { HideAddcoursestypess = (i) => {
this.setState({ this.setState({
Addcoursestype: false, Addcoursestype: false,
Addcoursestypes: false, Addcoursestypes: false,
mydisplay: true, mydisplay: true,
occupation: i, occupation: i,
}) })
}; };
hideAddcoursestypes = () => { hideAddcoursestypes = () => {
this.setState({ this.setState({
Addcoursestypes: false Addcoursestypes: false
}) })
}; };
componentDidMount() { componentDidMount() {
document.title = "loading..."; document.title = "loading...";
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() { componentWillUnmount() {
this.unlisten && this.unlisten(); // 执行解绑 this.unlisten && this.unlisten(); // 执行解绑
} }
//修改登录方法 //修改登录方法
Modifyloginvalue = () => { Modifyloginvalue = () => {
this.setState({ this.setState({
isRender: false, isRender: false,
}) })
}; };
//获取数据为空的时候 //获取数据为空的时候
gettablogourlnull = () => { gettablogourlnull = () => {
this.setState({ this.setState({
mygetHelmetapi: undefined mygetHelmetapi: undefined
}); });
document.title = "Forge"; document.title = "Forge";
var link = document.createElement('link'), var link = document.createElement('link'),
oldLink = document.getElementById('dynamic-favicon'); oldLink = document.getElementById('dynamic-favicon');
link.id = 'dynamic-favicon'; link.id = 'dynamic-favicon';
link.rel = 'shortcut icon'; link.rel = 'shortcut icon';
link.href = "/react/build/./favicon.ico"; link.href = "/react/build/./favicon.ico";
if (oldLink) { if (oldLink) {
document.head.removeChild(oldLink); document.head.removeChild(oldLink);
} }
document.head.appendChild(link); document.head.appendChild(link);
}; };
//获取数据的时候 //获取数据的时候
gettablogourldata = (response) => { gettablogourldata = (response) => {
document.title = response.data.setting.name; document.title = response.data.setting.name;
var link = document.createElement('link'), var link = document.createElement('link'),
oldLink = document.getElementById('dynamic-favicon'); oldLink = document.getElementById('dynamic-favicon');
link.id = 'dynamic-favicon'; link.id = 'dynamic-favicon';
link.rel = 'shortcut icon'; link.rel = 'shortcut icon';
link.href = '/' + response.data.setting.tab_logo_url; link.href = '/' + response.data.setting.tab_logo_url;
if (oldLink) { if (oldLink) {
document.head.removeChild(oldLink); document.head.removeChild(oldLink);
} }
document.head.appendChild(link); document.head.appendChild(link);
} }
//获取当前定制信息 //获取当前定制信息
getAppdata = () => { getAppdata = () => {
let url = "/setting.json"; let url = "/setting.json";
axios.get(url).then((response) => { axios.get(url).then((response) => {
if (response) { if (response) {
if (response.data) { if (response.data) {
this.setState({ this.setState({
mygetHelmetapi: response.data.setting mygetHelmetapi: response.data.setting
}); });
//存储配置到游览器 //存储配置到游览器
localStorage.setItem('chromesetting', JSON.stringify(response.data.setting)); localStorage.setItem('chromesetting', JSON.stringify(response.data.setting));
localStorage.setItem('chromesettingresponse', JSON.stringify(response)); localStorage.setItem('chromesettingresponse', JSON.stringify(response));
try { try {
if (response.data.setting.tab_logo_url) { if (response.data.setting.tab_logo_url) {
this.gettablogourldata(response); this.gettablogourldata(response);
} else { } else {
this.gettablogourlnull(); this.gettablogourlnull();
} }
} catch (e) { } catch (e) {
this.gettablogourlnull(); this.gettablogourlnull();
} }
} else { } else {
this.gettablogourlnull(); this.gettablogourlnull();
} }
} else { } else {
this.gettablogourlnull(); this.gettablogourlnull();
} }
}).catch((error) => { }).catch((error) => {
this.gettablogourlnull(); this.gettablogourlnull();
}); });
}; };
render() { render() {
const { mygetHelmetapi, pathType} = this.state; const { pathType, pathName } = this.state;
let personal = mygetHelmetapi && mygetHelmetapi.personal; return (
return ( <Provider store={store}>
<Provider store={store}> <ConfigProvider locale={zhCN}>
<ConfigProvider locale={zhCN}> <MuiThemeProvider theme={theme}>
<MuiThemeProvider theme={theme}> <LoginDialog {...this.props} {...this.state} Modifyloginvalue={() => this.Modifyloginvalue()}></LoginDialog>
<LoginDialog {...this.props} {...this.state} Modifyloginvalue={() => this.Modifyloginvalue()}></LoginDialog> {!pathName || (pathName && pathName.indexOf("glcc") === -1) ? <SiderBar /> : <SiderBarHelp/>}
<SiderBar /> {/* <Router> */}
{/* <Router> */} <Switch>
<Switch> {/* wiki预览 */}
{/* wiki预览 */} <Route path="/:owner/:projectsId/wiki/preview/:projectName/:projectId" render={
<Route path="/:owner/:projectsId/wiki/preview/:projectName/:projectId" render={ (props) => {
(props) => { return (<WikiPreview {...this.props} {...props} {...this.state} />)
return (<WikiPreview {...this.props} {...props} {...this.state} />) }
} } />
} />
{/* 项目PR */} {/* 项目PR */}
<Route path="/:owner/:projectsId/compare" <Route path="/:owner/:projectsId/compare"
render={ render={
(props) => (<ProjectDetail {...this.props} {...props} {...this.state} />) (props) => (<ProjectDetail {...this.props} {...props} {...this.state} />)
} }
></Route> ></Route>
{/*项目*/} {/*项目*/}
<Route <Route
path={"/: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 <Route
path={"/settings"} path={"/settings"}
render={ render={
(props) => { (props) => {
return (<Security {...this.props} {...props} {...this.state} />) return (<Security {...this.props} {...props} {...this.state} />)
} }
}> }>
</Route> </Route>
{/*403*/}
<Route path="/403" component={Shixunauthority} />
<Route <Route path="/500" component={http500} />
path="/register"
render={
(props) => {
return (<EducoderLogin {...this.props} {...props} {...this.state} />)
}
}
/>
{/*403*/}
<Route path="/403" component={Shixunauthority} />
<Route path="/500" component={http500} /> {/*404*/}
<Route path="/nopage" component={Shixunnopage} />
{/*404*/} {/* 查询 */}
<Route path="/nopage" component={Shixunnopage} /> <Route path="/search" component={Search} />
{/* 查询 */} <Route exact path="/explore/all"
<Route path="/search" component={Search} /> render={
(props) => (
<ProjectIndex {...this.props} {...props} />
)
}
/>
<Route exact path="/explore"
render={
(props) => (
<ProjectIndex {...this.props} {...props} />
)
}
/>
<Route exact path="/explore" {/* 登录 */}
render={ <Route
(props) => ( path="/login"
<ProjectIndex {...this.props} {...props} /> render={(props) =><LoginRegisterPage {...this.props} {...props}/>}
) ></Route>
}
/>
{/* 组织 */}
<Route path={"/organize"}
render={
(props) => {
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
}
}>
</Route>
{/*新建项目等*/} {/* 注册 */}
<Route <Route
path={"/projects"} path="/register"
render={ render={(props) =><LoginRegisterPage {...this.props} {...props}/>}
(props) => { ></Route>
return (<Projects {...this.props} {...props} {...this.state} />)
}
}>
</Route>
{/* 判断为用户/组织,并进入对应页面 */} {/* 忘记密码 */}
{ <Route
pathType === 'User' ? path="/resetPassword"
<Route exact path="/:username" render={(props) =><LoginRegisterPage {...this.props} {...props}/>}
render={ ></Route>
(props) => {
return (<InfosIndex {...this.props} {...this.state} />) {/* 关于我们 */}
} <Route
} path = "/aboutus"
/> : pathType === 'Organization' ? <Route path={"/:OIdentifier"} render = {(props)=><AboutUs {...this.props} {...props}/>}
render={ ></Route>
(props) => {
return (<OrganizeIndex {...props} {...this.props} {...this.state} />) {/* 教学实践 */}
} <Route
}> path="/educoder"
</Route> : pathType === '404' ? <Route component={Shixunnopage} />: render={(props) => <Teaching {...this.props} {...props} />}
<Route exact path="/" ></Route>
render={
(props) => ( {/*glcc */}
personal && personal.length > 0 ? <Route
<InfosIndex {...this.props} {...props} /> path="/glcc"
: render={(props) => <Glcc {...this.props} {...props} />}
<ProjectIndex {...this.props} {...props} /> ></Route>
)
} {/* 组织 */}
/> <Route path={"/organize"}
// <Route path="/" component={Loading} /> render={
// <Route path="/" component={Shixunnopage} /> (props) => {
} return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
}
}>
</Route>
{/*新建项目等*/}
<Route
path={"/projects"}
render={
(props) => {
return (<Projects {...this.props} {...props} {...this.state} />)
}
}>
</Route>
{/* 判断为用户/组织,并进入对应页面 */}
{
pathType === 'User' ?
<Route exact path="/:username"
render={
(props) => {
return (<InfosIndex {...this.props} {...this.state} />)
}
}
/> : pathType === 'Organization' ? <Route path={"/:OIdentifier"}
render={
(props) => {
return (<OrganizeIndex {...props} {...this.props} {...this.state} />)
}
}>
</Route> : pathType === '404' ? <Route component={Shixunnopage} />:
""
}
<Route exact path="/"
render={
(props) => (
<Home {...props} {...this.props} {...this.state}/>
)
}
/>
{/* 个人主页 */}
<Route path="/:username"
render={
(props) => {
return (<InfosIndex {...this.props} {...this.state} />)
}
}></Route>
<Route component={Shixunnopage} />
{/* 个人主页 */} </Switch>
<Route path="/:username" </MuiThemeProvider>
render={ </ConfigProvider>
(props) => { </Provider>
return (<InfosIndex {...this.props} {...this.state} />) );
} }
}></Route>
<Route component={Shixunnopage} />
</Switch>
{/* </Router> */}
</MuiThemeProvider>
</ConfigProvider>
</Provider>
);
}
} }
// moment国际化设置为中文 // moment国际化设置为中文
moment.defineLocale('zh-cn', { moment.defineLocale('zh-cn', {
months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'), weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
weekdaysMin: '日_一_二_三_四_五_六'.split('_'), weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
longDateFormat: { longDateFormat: {
LT: 'Ah点mm分', LT: 'Ah点mm分',
LTS: 'Ah点m分s秒', LTS: 'Ah点m分s秒',
L: 'YYYY-MM-DD', L: 'YYYY-MM-DD',
LL: 'YYYY年MMMD日', LL: 'YYYY年MMMD日',
LLL: 'YYYY年MMMD日Ah点mm分', LLL: 'YYYY年MMMD日Ah点mm分',
LLLL: 'YYYY年MMMD日ddddAh点mm分', LLLL: 'YYYY年MMMD日ddddAh点mm分',
l: 'YYYY-MM-DD', l: 'YYYY-MM-DD',
ll: 'YYYY年MMMD日', ll: 'YYYY年MMMD日',
lll: 'YYYY年MMMD日Ah点mm分', lll: 'YYYY年MMMD日Ah点mm分',
llll: 'YYYY年MMMD日ddddAh点mm分' llll: 'YYYY年MMMD日ddddAh点mm分'
}, },
meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
meridiemHour: function (hour, meridiem) { meridiemHour: function (hour, meridiem) {
if (hour === 12) { if (hour === 12) {
hour = 0; hour = 0;
} }
if (meridiem === '凌晨' || meridiem === '早上' || if (meridiem === '凌晨' || meridiem === '早上' ||
meridiem === '上午') { meridiem === '上午') {
return hour; return hour;
} else if (meridiem === '下午' || meridiem === '晚上') { } else if (meridiem === '下午' || meridiem === '晚上') {
return hour + 12; return hour + 12;
} else { } else {
// '中午' // '中午'
return hour >= 11 ? hour : hour + 12; return hour >= 11 ? hour : hour + 12;
} }
}, },
meridiem: function (hour, minute, isLower) { meridiem: function (hour, minute, isLower) {
var hm = hour * 100 + minute; var hm = hour * 100 + minute;
if (hm < 600) { if (hm < 600) {
return '凌晨'; return '凌晨';
} else if (hm < 900) { } else if (hm < 900) {
return '早上'; return '早上';
} else if (hm < 1130) { } else if (hm < 1130) {
return '上午'; return '上午';
} else if (hm < 1230) { } else if (hm < 1230) {
return '中午'; return '中午';
} else if (hm < 1800) { } else if (hm < 1800) {
return '下午'; return '下午';
} else { } else {
return '晚上'; return '晚上';
} }
}, },
calendar: { calendar: {
sameDay: function () { sameDay: function () {
return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT'; return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
}, },
nextDay: function () { nextDay: function () {
return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT'; return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
}, },
lastDay: function () { lastDay: function () {
return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT'; return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
}, },
nextWeek: function () { nextWeek: function () {
var startOfWeek, prefix; var startOfWeek, prefix;
startOfWeek = moment().startOf('week'); startOfWeek = moment().startOf('week');
prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
}, },
lastWeek: function () { lastWeek: function () {
var startOfWeek, prefix; var startOfWeek, prefix;
startOfWeek = moment().startOf('week'); startOfWeek = moment().startOf('week');
prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm'; return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
}, },
sameElse: 'LL' sameElse: 'LL'
}, },
ordinalParse: /\d{1,2}(日|月|周)/, ordinalParse: /\d{1,2}(日|月|周)/,
ordinal: function (number, period) { ordinal: function (number, period) {
switch (period) { switch (period) {
case 'd': case 'd':
case 'D': case 'D':
case 'DDD': case 'DDD':
return number + '日'; return number + '日';
case 'M': case 'M':
return number + '月'; return number + '月';
case 'w': case 'w':
case 'W': case 'W':
return number + '周'; return number + '周';
default: default:
return number; return number;
} }
}, },
relativeTime: { relativeTime: {
future: '%s内', future: '%s内',
past: '%s前', past: '%s前',
s: '几秒', s: '几秒',
m: '1分钟', m: '1分钟',
mm: '%d分钟', mm: '%d分钟',
h: '1小时', h: '1小时',
hh: '%d小时', hh: '%d小时',
d: '1天', d: '1天',
dd: '%d天', dd: '%d天',
M: '1个月', M: '1个月',
MM: '%d个月', MM: '%d个月',
y: '1年', y: '1年',
yy: '%d年' yy: '%d年'
}, },
week: { week: {
// GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
dow: 1, // Monday is the first day of the week. dow: 1, // Monday is the first day of the week.
doy: 4 // The week that contains Jan 4th is the first week of the year. doy: 4 // The week that contains Jan 4th is the first week of the year.
} }
}); });
export default SnackbarHOC()(App); export default SnackbarHOC()(App);

View File

@ -33,10 +33,11 @@ export function initAxiosInterceptors(props) {
initOnlineOfflineListener(); initOnlineOfflineListener();
var proxy = "https://testforgeplus.trustie.net"; var proxy = "https://testforgeplus.trustie.net";
//响应前的设置 //响应前的设置
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: "提示",

View File

@ -250,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;
}

View File

@ -6,7 +6,8 @@ export {
getUploadLogoActionUrl as getUploadLogoActionUrl,numFormat as numFormat, 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';

View File

@ -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, "▁▁▁")

View File

@ -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">确实开源&nbsp;&nbsp;一脉传承</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">特色功能&nbsp;&nbsp;确实给力</p>
<table><tr>
<td>
<div className="feat_func_cont">
<div className="feat_fun_img"><img src={fun1} /></div>
<div>
<p>分布式协作开发</p>
<div>支持在线文件编辑&nbsp;&nbsp;<br />分支管理贡献统计<br />仓库复刻合并请求&nbsp;&nbsp;&nbsp;</div>
</div>
</div>
</td>
<td>
<div className="feat_func_cont">
<div className="feat_fun_img"><img src={fun2} /></div>
<div>
<p>一站式过程管理</p>
<div>支持疑修里程碑&nbsp;&nbsp;&nbsp;<br />通知提醒标签归档Wiki文档组织管理&nbsp;&nbsp;&nbsp;</div>
</div>
</div>
</td>
<td>
<div className="feat_func_cont">
<div className="feat_fun_img"><img src={fun3} /></div>
<div>
<p>高效流水线运维</p>
<div>提供轻量级工作流引擎<br />并支持自定义配置&nbsp;&nbsp;&nbsp;<br/>静态扫描制品构建&nbsp;&nbsp;&nbsp;</div>
</div>
</div>
</td>
<td>
<div className="feat_func_cont">
<div className="feat_fun_img"><img src={fun4} /></div>
<div>
<p>多层次代码分析</p>
<div>支持代码溯源分析&nbsp;&nbsp;&nbsp;<br />许可证风险分析开源漏洞检测和加固建议&nbsp;&nbsp;&nbsp;</div>
</div>
</div>
</td>
<td>
<div className="feat_func_cont">
<div className="feat_fun_img"><img src={fun5} /></div>
<div>
<p>多维度用户画像</p>
<div>支持开发活动统计&nbsp;&nbsp;&nbsp;<br />贡献日历能力建模<br />角色与专业定位分析&nbsp;&nbsp;&nbsp;</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">成果作用&nbsp;&nbsp;确实有效</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前端开发经验熟练使用GulpWebpack等构建工具<br />
2熟练掌握VUE或React编程有前端模块化组件化自动化开发经验者优先<br />
3精通jQueryAjaxJson等技术对VUENodeJs等技术有所涉及<br />
4熟悉前端开发技术(HTML5JSJSONXHTMLCSS3ES6)了解各项技术的相关标准并严格按照标准进行开发<br />
</div>
</div>
<div className="position right">
<p className="df"><img src={position} /><span className="ml10">后端开发工程师</span></p>
<div>
1全日制本科及以上学历计算机软件工程相关专业者优先<br />
23年以上Java开发相关经验扎实的Java编程基础参与过1个以上大/中型高并发高性能系统架构设计开发和调优<br />
3熟练掌握SpringSpringBootSpring MVCMyBatis等开源框架掌握MVC框架模式及BS架构<br />
4精通SQL熟练使用MySQLOracle等数据库并具有一定的SQL优化能力熟悉RedisMongoDB等常用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熟悉性能测试自动化测试安全测试其中一种或多种测试工具LoadRunnerJmeterSeleniumQTPRobotFirebugAppScanPyCharm等熟练运用工具从事过相关测试工作<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);

View File

@ -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;}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 859 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

View File

@ -124,7 +124,9 @@ class Activity extends Component{
</Menu> </Menu>
) )
render(){ render(){
const { time , data , page , project_trends , isSpin , pr_count , new_pr_count , close_issues_count , open_issues_count , pr_all_count ,issues_count } = this.state; const { time , data , page , project_trends , isSpin ,
pr_count , new_pr_count , close_issues_count , open_issues_count , pr_all_count ,issues_count,
type,status } = this.state;
let name = time ? ARRAY.filter(item=>item.id === parseInt(time)) :[{name:"全部"}]; 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 first_per = pr_all_count > 0 ? `${parseFloat(pr_count/pr_all_count).toFixed(2)*100}%` :"50%";
@ -150,25 +152,25 @@ class Activity extends Component{
<p className="percent_red" style={{width:`${third_per}`}}></p> <p className="percent_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","delay")}>已处理的合并请求</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","not_delay")}>未处理的合并请求</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","delay")}>已关闭的</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","not_delay")}>未处理的</span> <span className={type==="Issue"&& status==="not_delay" ?`change active`:"change"} onClick={()=>this.changeTrends("Issue","not_delay")}>未处理的</span>
</li> </li>
</ul> </ul>
</div> </div>

View File

@ -14,20 +14,20 @@ class ActivityItem extends Component {
{/* 如果是版本发布 */} {/* 如果是版本发布 */}
{item.trend_type === "VersionRelease" ? {item.trend_type === "VersionRelease" ?
<p className="itemLine"> <p className="itemLine">
<Link to={`/${owner}/${projectsId}/releases`} className="color-blue font-16">{item.name}</Link> <Link to={`/${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={`/${owner}/${projectsId}/issues/${item.trend_id}`} className="color-blue font-16">{item.name}</Link> <Link to={`/${owner}/${projectsId}/issues/${item.trend_id}`} className="font-16">{item.name}</Link>
<span className="activity_type">{item.trend_type}</span> <span className="activity_type">{item.trend_type}</span>
</p > </p >
: :
// 如果是合并请求 // 如果是合并请求
<p className="itemLine"> <p className="itemLine">
<Link to={`/${owner}/${projectsId}/pulls/${item.trend_id}`} className="color-blue font-16">{item.name}</Link> <Link to={`/${owner}/${projectsId}/pulls/${item.trend_id}`} className="font-16">{item.name}</Link>
<span className="activity_type">{item.trend_type}</span> <span className="activity_type">{item.trend_type}</span>
</p > </p >
} }

View File

@ -107,6 +107,10 @@
color: black; color: black;
cursor: pointer; cursor: pointer;
} }
.change.active{
color: #466AFF !important;
}
.change:hover{ .change:hover{
color: #4183c4; color: #466AFF;
} }

View File

@ -7,10 +7,10 @@ function CloneAddress({http_url , ssh_url , zip_url , tar_url}) {
const [ key , setKey ] = useState("HTTP"); const [ key , setKey ] = useState("HTTP");
return ( return (
<div className="downMenu"> <div className="downMenu">
<div style={{borderBottom:"1px solid #eee"}}> <div>
<Menu className="urlMenu" selectedKeys={[key]} mode={"horizontal"}> <Menu className="urlMenu" selectedKeys={[key]} mode={"horizontal"}>
<Menu.Item key="HTTP" onClick={(e)=>{setKey(e.key)}}>HTTP</Menu.Item> <Menu.Item key="HTTP" onClick={(e)=>{setKey(e.key)}}>HTTP</Menu.Item>
<Menu.Item key="SSH" onClick={(e)=>{setKey(e.key)}}>SSH</Menu.Item> {ssh_url && <Menu.Item key="SSH" onClick={(e)=>{setKey(e.key)}}>SSH</Menu.Item>}
</Menu> </Menu>
<div className="gitAddressClone"> <div className="gitAddressClone">
<input type="text" id="copy_rep_content" value={key==="HTTP" ? http_url:ssh_url} /> <input type="text" id="copy_rep_content" value={key==="HTTP" ? http_url:ssh_url} />
@ -18,8 +18,8 @@ function CloneAddress({http_url , ssh_url , zip_url , tar_url}) {
</div> </div>
</div> </div>
<Menu className="edu-txt-center"> <Menu className="edu-txt-center">
<Menu.Item><a href={zip_url}>下载 ZIP</a></Menu.Item> {zip_url && <Menu.Item style={{borderTop:"1px solid #eee"}}><a href={zip_url}>下载 ZIP</a></Menu.Item>}
<Menu.Item><a href={tar_url}>下载 TAR.GZ</a></Menu.Item> {tar_url && <Menu.Item><a href={tar_url}>下载 TAR.GZ</a></Menu.Item>}
</Menu> </Menu>
</div> </div>
) )

View File

@ -3,6 +3,7 @@ import { Dropdown} from 'antd';
import './branch.scss'; import './branch.scss';
import SelectOverlay from './SelectOverlay'; import SelectOverlay from './SelectOverlay';
import { findDOMNode } from 'react-dom'; 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);
@ -35,7 +36,8 @@ export default (({ projectsId , branch , owner , changeBranch , branchList , tag
function ChangeB(params) { function ChangeB(params) {
setVisible(false); setVisible(false);
changeBranch(params); let en = turnbar(params);
changeBranch(en);
} }
const menu = ( const menu = (

View File

@ -66,9 +66,10 @@ function AddMember({getID,login,showNotification}){
}; };
function addCollaborator(){ function addCollaborator(){
if(source && source.length>0){ if(source && source.length>0&&searchKey){
getID && getID(id); getID && getID(id);
setSearchKey(undefined); setSearchKey(undefined);
setID(undefined)
}else{ }else{
showNotification("请选择存在的用户!"); showNotification("请选择存在的用户!");
} }

View File

@ -276,36 +276,36 @@ li.ant-menu-item{
.-task-sidebar { .-task-sidebar {
position: fixed; position: fixed;
width: 40px; width: 40px;
right: 0; right: 30px;
bottom: 80px; bottom: 80px;
z-index: 10; z-index: 10;
} }
@media screen and (max-width: 1920px){ // @media screen and (max-width: 1920px){
.-task-sidebar{ // .-task-sidebar{
right:220px; // right:220px;
} // }
} // }
@media screen and (max-width: 1750px){ // @media screen and (max-width: 1750px){
.-task-sidebar{ // .-task-sidebar{
right:160px; // right:160px;
} // }
} // }
@media screen and (max-width: 1650px){ // @media screen and (max-width: 1650px){
.-task-sidebar{ // .-task-sidebar{
right:115px; // right:115px;
} // }
} // }
@media screen and (max-width: 1550px){ // @media screen and (max-width: 1550px){
.-task-sidebar{ // .-task-sidebar{
right:90px; // right:90px;
} // }
} // }
@media screen and (max-width: 1450px){ // @media screen and (max-width: 1450px){
.-task-sidebar{ // .-task-sidebar{
right:45px; // right:45px;
} // }
} // }
@media screen and (max-width: 1200px){ @media screen and (max-width: 1200px){
.-task-sidebar{ .-task-sidebar{
right:0px; right:0px;
@ -313,17 +313,17 @@ li.ant-menu-item{
} }
} }
.-task-sidebar>div { .-task-sidebar>div {
height: 40px; height: 48px;
line-height: 40px; line-height: 48px;
box-sizing: border-box; box-sizing: border-box;
width: 40px; width: 48px;
color: #999; color: #999;
font-size: 20px; font-size: 20px;
text-align: center; text-align: center;
margin-bottom: 20px; margin-bottom: 20px;
border-radius: 50%; border-radius: 50%;
background: #FFFFFF; background: #FFFFFF;
box-shadow: 0px 0px 10px 1px #F1F1F1; box-shadow: 0px 0px 12px 5px rgba(208, 208, 208, 0.2);
} }
.-task-sidebar>div i { .-task-sidebar>div i {
@ -334,36 +334,40 @@ li.ant-menu-item{
color: #fff !important; color: #fff !important;
} }
.-task-sidebar>div:hover{ .-task-sidebar>div:hover{
background: #1890FF; background: #466AFF;
box-shadow: 0px 0px 10px 2px #B6D0FC; box-shadow: 0px 0px 10px 2px #B6D0FC;
} }
.helpBox{ .helpBox{
width: 260px; width: 260px;
z-index: 103; z-index: 103;
&.shareContent{ &.shareContent{
width: 200px; width: 160px;
}
.ant-popover-title{
font-size: 16px;
} }
.ant-popover-inner-content{ .ant-popover-inner-content{
padding:0px; padding:0px;
} }
p.titlecontent{ p.titlecontent{
font-size: 18px; font-size: 16px;
color: #333; color: #333;
line-height: 20px; line-height: 20px;
padding:15px 20px; padding:15px 20px;
} }
.faqUl{ .faqUl{
padding:0px 20px 10px; padding:10px 15px;
max-height: 230px; max-height: 230px;
overflow-y: auto; overflow-y: auto;
font-size: 13px;
li{ li{
background: #F5F5F5; background: #F5F5F5;
border-radius: 20px; border-radius: 20px;
padding:0px 20px; padding:0px 15px;
color: #333; color: #333;
height: 34px; height: 30px;
line-height: 34px; line-height: 30px;
margin-bottom: 10px; margin-bottom: 3px !important;
a{ a{
display: block; display: block;
overflow: hidden; overflow: hidden;
@ -379,19 +383,18 @@ li.ant-menu-item{
} }
} }
.shareUl{ .shareUl{
padding:10px 0px;
display: flex; display: flex;
align-items: center; align-items: center;
.titlecontent{
margin-right: 20px;
}
li > i{ li > i{
font-size: 32px!important; font-size: 32px!important;
} }
} }
} }
// tooltip样式
.tooltipBox .ant-tooltip-inner{
padding: 8px 12px;
font-size: 15px;
}
.-task-desc { .-task-desc {
background: #494949; background: #494949;
@ -439,3 +442,21 @@ li.ant-menu-item{
border-left: 5px solid #494949; border-left: 5px solid #494949;
border-bottom: 6px solid transparent 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;
}
}
}

View File

@ -7,7 +7,7 @@ import './Component.scss';
import { getUser } from '../GetData/getData'; import { getUser } from '../GetData/getData';
import axios from 'axios'; import axios from 'axios';
function Contributors({contributors,owner,projectsId,currentLogin}){ function Contributors({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,currentLogin}){
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(){
},[contributors]) const url = `/${owner}/${projectsId}/contributors.json`;
axios.get(url).then(result=>{
if(result){
setTotal(result.data.total_count);
setList(result.data.list);
}
}).catch(error=>{})
}
useEffect(()=>{ useEffect(()=>{
if(login){ if(login){
@ -148,15 +155,15 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
} }
return( return(
total > 0 ?
<div className="halfs"> <div className="halfs">
<Link to={`/${owner}/${projectsId}/contribute`} className="font-16 color-ooo hoverA"> <Link to={`/${owner}/${projectsId}/contribute`} className="font-16 color-ooo hoverA">
<span>贡献者</span> <span>贡献者</span>
{ contributors && contributors.total_count > 0 && <span className="infoCount">{contributors.total_count}</span>} { total > 0 && <span className="infoCount">{total}</span>}
</Link> </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={`/${item.login}`}> <Link key={key} to={`/${item.login}`}>
@ -165,10 +172,9 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
</Popover> </Popover>
) )
}) })
:""
} }
</div> </div>
</div> </div>:""
) )
} }
export default Contributors; export default Contributors;

View File

@ -25,7 +25,7 @@ function DeleteBox({
> >
<div className="desc"> <div className="desc">
<AlignCenter className="descMain"><i className="iconfont icon-shanchu_tc_icon mr10"></i>{content}</AlignCenter> <AlignCenter className="descMain"><i className="iconfont icon-shanchu_tc_icon mr10"></i>{content}</AlignCenter>
<p>{subTitle}</p> <p className="task-hide-2" style={{WebkitLineClamp:5}}>删除后未来事件将不会推送至此Webhook地址<span title={subTitle}>{subTitle}</span></p>
</div> </div>
</Modals> </Modals>
) )

View File

@ -1,15 +1,10 @@
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;
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
function DrawerPanel({visible,onClose,branch,owner,projectsId,history, name , list}){ function DrawerPanel({visible,onClose,branch,owner,projectsId,history, name , list}){
const [ treeData , setTreeData ] = useState(undefined); const [ treeData , setTreeData ] = useState(undefined);
const [ isSpin , setIsSpin ] = useState(true); const [ isSpin , setIsSpin ] = useState(true);

View File

@ -32,7 +32,7 @@ export default ({history}) => {
/> />
</div> </div>
: :
<i className="iconfont icon-sousuo font-18 color-grey-6 ml30" onClick={() => { <i className="iconfont icon-sousuo font-18 ml30" style={{color:"#a5a5a5"}} onClick={() => {
setOpenSearch(true) setOpenSearch(true)
}} /> }} />
} }

View File

@ -1,18 +1,41 @@
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(()=>{
if(languages){ getData();
let arr = []; },[])
Object.keys(languages).map((item,key)=>{
arr.push({name:item,percent:languages[item],color:getColor()}); function getData(){
}) const url = `/${owner}/${projectsId}/languages.json`;
setArray(arr); axios.get(url).then(result=>{
} if(result){
},[languages]) let languages = result.data;
if(languages){
let arr = [];
Object.keys(languages).map((item,key)=>{
arr.push({name:item,percent:languages[item],color:getColor()});
})
setArray(arr);
}
}
}).catch(error=>{})
}
// useEffect(()=>{
// if(languages){
// let arr = [];
// Object.keys(languages).map((item,key)=>{
// arr.push({name:item,percent:languages[item],color:getColor()});
// })
// setArray(arr);
// }
// },[languages])
 function getColor(){  function getColor(){
let str = "#"; let str = "#";
@ -24,7 +47,9 @@ function LanguagePower({languages}){
return str; return str;
} }
return( return(
(array && array.length > 0) ?
<div> <div>
<Divider />
<p className="font-16 color-ooo aboutSubTitle">开发语言</p> <p className="font-16 color-ooo aboutSubTitle">开发语言</p>
<div className="progress"> <div className="progress">
{ {
@ -47,8 +72,7 @@ function LanguagePower({languages}){
} }
</FlexAJ> </FlexAJ>
} }
</div>:""
</div>
) )
} }
export default LanguagePower; export default LanguagePower;

View File

@ -29,12 +29,12 @@
font-weight: 500; font-weight: 500;
color: #FFFFFF; color: #FFFFFF;
margin-top: 60px; margin-top: 60px;
padding-left: 20px;
} }
.markdown-body{ .markdown-body{
box-shadow: 0px 0px 17px rgba(0,0,0,0.2); box-shadow: 0px 0px 17px rgba(0,0,0,0.2);
border-radius: 4px; border-radius: 4px;
margin-top: 17px!important; margin-top: 17px!important;
color: white;
} }
.nContent{ .nContent{
padding:20px 34px; padding:20px 34px;

View File

@ -3,25 +3,42 @@ import { Modal , Button } from 'antd';
import './Index.scss'; import './Index.scss';
import '../../css/index.scss'; import '../../css/index.scss';
import RenderHtml from '../../../components/render-html'; import RenderHtml from '../../../components/render-html';
import cookie from 'react-cookies'; // import cookie from 'react-cookies';
import axios from 'axios';
function SystemNotice({system_notification,history}){ function SystemNotice({showNotice,system_notification,history,login,hideSystemNotice}){
const [ visible , setVisible ] = useState(false); const [ visible , setVisible ] = useState(false);
useEffect(()=>{ useEffect(()=>{
if(system_notification && !cookie.load('notice_stage')){
if((system_notification && !system_notification.is_read) && showNotice && login){
setVisible(true); setVisible(true);
} }
},[system_notification,history.location]) },[system_notification,login])
function sureContinue() { function sureContinue() {
cookie.remove('notice_stage'); 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=>{
setVisible(false);
hideSystemNotice();
}).catch(error=>{
setVisible(false);
hideSystemNotice();
})
}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() + 24 * 3600 * 1000);//
// let inFifteenMinutes = new Date(new Date().getTime() + 60 * 1000);// // // let inFifteenMinutes = new Date(new Date().getTime() + 60 * 1000);//
cookie.save('notice_stage', true,{ expires: inFifteenMinutes,path:"/" }); // cookie.save('notice_stage', true,{ expires: inFifteenMinutes,path:"/" });
setVisible(false); // setVisible(false);
} }
return ( return (

View File

@ -23,9 +23,13 @@ $(window).scroll(function () {
function SiderBar() { function SiderBar() {
const [ data , setData ] = useState([]); const [ data , setData ] = useState([]);
const [ visible , setVisible ] = useState(false); const [ visible , setVisible ] = useState(false);
const [ login , setLogin ]= useState(false);
useEffect(()=>{ useEffect(()=>{
getFAQ(); getFAQ();
getCurrentUser();
//页面加载完成之后隐藏回到顶点
$(".-task-sidebar .gotop").hide();
},[]) },[])
function getFAQ(){ function getFAQ(){
@ -36,9 +40,19 @@ function SiderBar() {
} }
}).catch(error=>{}) }).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){ function content(list){
return <div> return <div>
<p className="titlecontent">帮助</p>
<ul className="faqUl"> <ul className="faqUl">
{ {
list && list.map((i,k)=>{ list && list.map((i,k)=>{
@ -59,31 +73,46 @@ function SiderBar() {
</ul> </ul>
</div> </div>
} }
return ( return (
<div className={"-task-sidebar"} > <div className={"-task-sidebar"} >
<ShareModal visible={visible} urlValue={window.location.href} onCancel={()=>setVisible(false)}/> {/* 平台反馈 */}
<Tooltip title="意见反馈" placement={"left"} overlayClassName="tooltipBox">
<div className="consult">
<a href={login ? `/Gitlink/forgeplus/issues/new?type=feedback`:`/login?go_page=/Gitlink/forgeplus/issues/new?type=feedback`}>
<i className="iconfont icon-yijianfankui2"></i>
</a>
</div>
</Tooltip>
{/* 帮助 */}
{ {
data && data.length > 0 && (data[0] && data[0].question) ? data && data.length > 0 && (data[0] && data[0].question) ?
<Popover content={content(data)} overlayClassName="helpBox" placement={"left"}> <Popover title="帮助" content={content(data)} overlayClassName="helpBox" placement={"left"}>
<div className="feedback"> <div className="feedback">
<i className="iconfont icon-bangzhu font-22"></i> <i className="iconfont icon-bangzhu1 font-22"></i>
</div> </div>
</Popover> </Popover>
:"" :""
} }
{/* 分享 */}
{/* <div className="scan pr" title=""> {/* <div className="scan pr" title="">
<span className="inline erweima"><i className="iconfont icon-erweima color-white font-22 fl"></i></span> <span className="inline erweima"><i className="iconfont icon-erweima color-white font-22 fl"></i></span>
</div>*/} </div>*/}
<ShareModal visible={visible} urlValue={window.location.href} onCancel={()=>setVisible(false)}/>
<Popover content={shareContent()} overlayClassName="helpBox shareContent" placement={"left"}> <Popover content={shareContent()} overlayClassName="helpBox shareContent" placement={"left"}>
<div className="consult"> <div className="consult">
<i className="iconfont icon-fenxiang1"></i> <i className="iconfont icon-fenxiang"></i>
</div> </div>
</Popover> </Popover>
<div className="gotop">
<Tooltip title="返回顶部" placement={"right"}> {/* 返回顶部 */}
<Tooltip title="返回顶部" placement={"left"} overlayClassName="tooltipBox">
<div className="gotop">
<a><i className="iconfont icon-huidaodingbu1"></i></a> <a><i className="iconfont icon-huidaodingbu1"></i></a>
</Tooltip> </div>
</div> </Tooltip>
</div> </div>
) )
} }

View File

@ -17,9 +17,9 @@ function SiderBarShareModal({visible,urlValue,onCancel}) {
value={urlValue} value={urlValue}
size={200} size={200}
fgColor="#000000" fgColor="#000000"
style={{margin:"20px"}} style={{margin:"0 20px 20px"}}
/>} />}
<p>打开微信扫一扫,点击右上角菜单即可将网页分享至朋友圈</p> <p>打开微信扫一扫点击右上角菜单即可将网页分享至朋友圈</p>
</div> </div>
</Modal> </Modal>
) )

View File

@ -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;

View File

@ -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;

View File

@ -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`;
@ -136,7 +136,7 @@ function About(props, ref) {
params:{password:authorityVal} params:{password:authorityVal}
}).then(result=>{ }).then(result=>{
setIsSpining(false); setIsSpining(false);
if(result){ if(result && result.data.status === 0){
setStep(result.data.step); setStep(result.data.step);
} }
}).catch(error=>{setIsSpining(false)}); }).catch(error=>{setIsSpining(false)});
@ -149,7 +149,10 @@ function About(props, ref) {
axios.post(url).then(result=>{ axios.post(url).then(result=>{
setIsSpining(false); setIsSpining(false);
if(result && result.data.status === 0){ if(result && result.data.status === 0){
props.history.push(`/${owner}/${projectsId}/devops`); props.history.push({
pathname: `/${owner}/${projectsId}/devops`,
state:{open_devops:true}
});
// open_devops // open_devops
let { changeOpenDevops } = props; let { changeOpenDevops } = props;
changeOpenDevops && changeOpenDevops(true); changeOpenDevops && changeOpenDevops(true);
@ -167,17 +170,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 ?

View File

@ -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:"",
@ -10,12 +11,6 @@ import { Link } from 'react-router-dom';
// killed:"", // killed:"",
// pending:"" // pending:""
// } // }
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
function renderTableStatus(status) { function renderTableStatus(status) {
switch (status) { switch (status) {
case "running": case "running":

View File

@ -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/>

View File

@ -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>

View File

@ -1,4 +1,4 @@
import React , { useEffect } from 'react'; import React from 'react';
import { WhiteBack } from '../Component/layout'; import { WhiteBack } from '../Component/layout';
import './ops.scss'; import './ops.scss';
@ -7,7 +7,7 @@ import Loadable from 'react-loadable';
import Loading from '../../Loading'; import Loading from '../../Loading';
const About = Loadable({ const About = Loadable({
loader: () => import('./About'), loader: () => import('./subIndex'),
loading: Loading, loading: Loading,
}) })
const New = Loadable({ const New = Loadable({
@ -66,7 +66,8 @@ export default ((props)=>{
{/* 原本的两种合为一个 */} {/* 原本的两种合为一个 */}
<Route path="/:owner/:projectsId/devops" <Route path="/:owner/:projectsId/devops"
render={ render={
(p) =>{return( p.location.state.open_devops?<Dispose {...props} {...p}/>:<About {...props} {...p}/>)} // (p) =>{return( p.location && p.location.state && p.location.state.open_devops?<Dispose {...props} {...p}/>:<About {...props} {...p}/>)}
(p) =>{return(<About {...props} {...p}/>)}
} }
></Route> ></Route>
</Switch> </Switch>

View File

@ -103,8 +103,8 @@ function Params(props){
<New visble={visible} successFunc={successFunc} CancelFunc={CancelFunc} editList={editList}/> <New visble={visible} successFunc={successFunc} CancelFunc={CancelFunc} editList={editList}/>
<Banner> <Banner>
<FlexAJ> <FlexAJ>
<span className="font-18">工作流 - 参数管理</span> <span className="font-18">引擎 - 参数管理</span>
<Link to={`/${owner}/${projectsId}/devops`} className="font-14 color-grey-9 ml20">返回</Link> <Link to={{pathname:`/${owner}/${projectsId}/devops`,state:{open_devops:true}}} className="font-14 color-grey-9 ml20">返回</Link>
</FlexAJ> </FlexAJ>
</Banner> </Banner>
<Div className="disposeList"> <Div className="disposeList">

View File

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

View File

@ -5,7 +5,7 @@ import { Menu, Popconfirm } from "antd";
import { TagsLine } from "../Component/OpsStatus"; import { TagsLine } from "../Component/OpsStatus";
import { Time } from "../Utils/Time"; import { Time } from "../Utils/Time";
import { truncateCommitId } from "../common/util"; import { truncateCommitId } from "../common/util";
import { getUrl } from 'educoder'; import { getImageUrl } from 'educoder';
const SubMenu = Menu.SubMenu; const SubMenu = Menu.SubMenu;
const Img = styled.img` const Img = styled.img`
@ -70,7 +70,7 @@ export default ({ data, repeatSet , chooseSteps }) => {
<div> <div>
<FlexAJ className="leftheader"> <FlexAJ className="leftheader">
<AlignCenter> <AlignCenter>
<Img src={getUrl(`/images/${data && data.author && data.author.image_url}`)} /> <Img src={getImageUrl(`/${data && data.author && data.author.image_url}`)} />
{data && data.started && {data && data.started &&
<span className="nest"> <span className="nest">
开始时间<span> {data.started}</span> 开始时间<span> {data.started}</span>

View File

@ -12,7 +12,7 @@ function ServiceModal({sureModal}){
<div className="mt30" style={{textAlign:"center"}}> <div className="mt30" style={{textAlign:"center"}}>
<Radio.Group value={type} onChange={changeType}> <Radio.Group value={type} onChange={changeType}>
<Radio value={1}>自有服务器</Radio> <Radio value={1}>自有服务器</Radio>
<Radio value={2}>Trustie服务器</Radio> <Radio value={2}>GitLink服务器</Radio>
</Radio.Group> </Radio.Group>
<p className="mt30"><Button type="primary" onClick={()=>sureModal(type)}>下一步</Button></p> <p className="mt30"><Button type="primary" onClick={()=>sureModal(type)}>下一步</Button></p>
</div> </div>

View File

@ -290,7 +290,7 @@ function Structure(props,ref){
<Banner> <Banner>
<FlexAJ> <FlexAJ>
<span>构建列表</span> <span>构建列表</span>
<Link to={`/${owner}/${projectsId}/devops`} className="font-15 color-grey-9">返回</Link> <Link to={{pathname:`/${owner}/${projectsId}/devops`,state:{open_devops:true}}} className="font-15 color-grey-9">返回</Link>
</FlexAJ> </FlexAJ>
</Banner> </Banner>
<Div> <Div>

View File

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

View File

@ -0,0 +1,13 @@
import React from 'react';
import About from './About';
import Dispose from './Dispose';
function SubIndex(props) {
return(
props && props.open_devops ?
<Dispose {...props} />
:
<About {...props} />
)
}
export default SubIndex;

View File

@ -2,84 +2,84 @@ import React, { useState , forwardRef, useEffect } from 'react';
import { Form , Modal , Input , Radio } from 'antd'; import { Form , Modal , Input , Radio } from 'antd';
import Axios from 'axios'; import Axios from 'axios';
import CheckProfile from '../Component/ProfileModal/Profile'; import CheckProfile from '../Component/ProfileModal/Profile';
function AddProjectModal(props){
const { getFieldDecorator, validateFields , setFieldsValue } = props && props.form;
const [ visible , setVisible ] = useState(false);
export default Form.create()( useEffect(()=>{
forwardRef((props)=>{ if(!visible){
const { getFieldDecorator, validateFields , setFieldsValue } = props && props.form; setFieldsValue({
const [ visible , setVisible ] = useState(false); code:undefined,
role:"developer"
useEffect(()=>{
if(!visible){
setFieldsValue({
code:undefined,
role:"developer"
})
}
},[visible])
function onOk() {
validateFields((error,values)=>{
if(!error){
const url = `/applied_projects.json`;
Axios.post(url,{
applied_project:{
...values
}
}).then(result=>{
if(result && result.data){
setVisible(false);
props.showNotification("申请加入项目成功,等待审核!");
}
}).catch(error=>{})
}
}) })
} }
function checkValue(rule, value, callback){ },[visible])
if(!value){
callback(); function onOk() {
validateFields((error,values)=>{
console.log(error)
if(!error){
const url = `/applied_projects.json`;
Axios.post(url,{
applied_project:{
...values
}
}).then(result=>{
if(result && result.data){
setVisible(false);
props.showNotification("申请加入项目成功,等待审核!");
}
}).catch(error=>{})
} }
})
}
function checkValue(rule, value, callback){
if(!value){
callback("请输入6位数的邀请码");
}else{
if(value.length < 6 || value.length > 6){ if(value.length < 6 || value.length > 6){
callback("请输入6位数的邀请码"); callback("请输入6位数的邀请码");
} }
callback(); }
} callback();
}
return( return(
<React.Fragment> <React.Fragment>
<Modal <Modal
title="加入项目" title="加入项目"
width="480px" width="480px"
visible={visible} visible={visible}
centered={true} centered={true}
onOk={onOk} onOk={onOk}
onCancel={()=>setVisible(false)} onCancel={()=>setVisible(false)}
> >
<Form layout={'inline'} className="inviteForm"> <Form layout={'inline'} className="inviteForm">
<Form.Item label="项目邀请码"> <Form.Item label="项目邀请码">
{getFieldDecorator("code",{ {getFieldDecorator("code",{
rules:[ rules:[
{required:true,message:"请输入6位项目邀请码"}, {required:true,message:" "},
{validator:checkValue} {validator:checkValue}
] ]
})( })(
<Input placeholder="请输入6位项目邀请码" autoComplete={"off"} maxLength="6" style={{width:"300px"}}/> <Input placeholder="请输入6位项目邀请码" autoComplete={"off"} maxLength={6} style={{width:"300px"}}/>
)} )}
</Form.Item> </Form.Item>
<Form.Item label="选择角色"> <Form.Item label="选择角色">
{getFieldDecorator("role",{ {getFieldDecorator("role",{
rules:[{required:true,message:"请选择角色"}] rules:[{required:true,message:"请选择角色"}]
})( })(
<Radio.Group defaultValue={"developer"}> <Radio.Group>
<Radio value="manager">管理员</Radio> <Radio value="manager">管理员</Radio>
<Radio value="developer">开发者</Radio> <Radio value="developer">开发者</Radio>
<Radio value="reporter">报告者</Radio> <Radio value="reporter">报告者</Radio>
</Radio.Group> </Radio.Group>
)} )}
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>
<CheckProfile {...props} sureFunc={()=>setVisible(true)}>加入项目</CheckProfile> <CheckProfile {...props} sureFunc={()=>setVisible(true)}>加入项目</CheckProfile>
</React.Fragment> </React.Fragment>
) )
}) }
) export default Form.create()(forwardRef(AddProjectModal));

View File

@ -19,48 +19,44 @@ function Footer(){
return( return(
<div> <div>
<div style={{height:"543px"}}></div> {value && showhtml(value)}
<div className="newFooter edu-txt-center">
{value && showhtml(value)}
{/* <div className="footerInfos">
<ul>
<li>社区</li>
<li><a href={`/`} target="_blank">网站首页</a></li>
<li><a href={`https://www.trustie.net/agreement`} target="_blank">服务协议</a></li>
<li><a href={`https://forum.trustie.net/forums/1168/detail`} target="_blank">帮助中心</a></li>
<li><a href={`https://forum.trustie.net/`} target="_blank">问吧交流</a></li>
<li><a href={`https://www.trustie.net/cooperation`} target="_blank">合作伙伴</a></li>
</ul>
<ul>
<li>支持与服务</li>
<li><a href={`https://forgeplus.trustie.net/docs/api`} target="_blank">API文档</a></li>
<li><a href={`https://forum.trustie.net/forums/1168/detail`} target="_blank">帮助中心</a></li>
<li><a href={`https://git-scm.com`} target="_blank">Git常用命令</a></li>
<li><a href={`https://forum.trustie.net/forums/3080/detail`} target="_blank">DevOps使用文档</a></li>
<li><a href={`https://forgeplus.trustie.net/projects/jasder/forgeplus/tree/master/CHANGELOG.md`} target="_blank">日志更新</a></li>
</ul>
<ul>
<li>合作伙伴</li>
<li><a href={`http://www.sei.pku.edu.cn`} target="_blank">北京大学</a></li>
<li><a href={`http://scse.buaa.edu.cn`} target="_blank">北京航空航天大学</a></li>
<li><a href={`https://www.nju.edu.cn`} target="_blank">南京大学</a></li>
<li><a href={`https://www.xtu.edu.cn`} target="_blank">湘潭大学</a></li>
<li><a href={`http://www.iscas.ac.cn`} target="_blank">ISCAS</a></li>
<li><a href={`https://www.ucloud.cn`} target="_blank">UCloud优刻得</a></li>
<li><a href={`http://www.inforbus.com`} target="_blank">中创软件</a></li>
<li><a href={`https://www.inspur.com`} target="_blank">浪潮集团</a></li>
<li><a href={`http://www.copu.org.cn`} target="_blank">中国开源软件推进联盟</a></li>
<li><a href={`https://www.sjtu.edu.cn`} target="_blank">上海交通大学</a></li>
</ul>
<ul>
<li>合作伙伴</li>
<li><span>热线</span></li>
<li><span>QQ群1071514693</span></li>
</ul>
</div>
<p className="footerCopy">© Copyright 2007~2021 国防科技大学Trustie团队 & IntelliDE <a href="https://beian.miit.gov.cn">湘ICP备 17009477</a></p> */}
</div>
</div> </div>
// {/* <div className="footEdition">
// <div className="footContent">
// <ul className="center">
// <img src={""} alt="Gitlink" height="29px"/>
// <p></p>
// </ul>
// <ul>
// <li className="thehead"></li>
// <li><a href="/"></a></li>
// <li><a href="https://forum.trustie.net/forums/1168/detail"></a></li>
// <li><a href="https://forum.trustie.net/"></a></li>
// <li><a href="https://www.trustie.net/cooperation"></a></li>
// </ul>
// <ul>
// <li className="thehead"></li>
// <li><a href="https://forgeplus.trustie.net/docs/api">API</a></li>
// <li><a href="https://git-scm.com">Git</a></li>
// <li><a href="https://forum.trustie.net/forums/3080/detail">DevOps使</a></li>
// <li><a href='https://www.trustie.net/agreement'></a></li>
// </ul>
// <ul>
// <li className="thehead"></li>
// <li className="theline">
// <div className="mr50">
// <li></li>
// <img src={"Img"} alt=""/>
// </div>
// <div>
// <li>QQ</li>
// <img src={"qqImg"} alt="QQ"/>
// </div>
// </li>
// </ul>
// </div>
// <p className="copyrightDesc">©Copyright 20072021 Gitlink & IntelliDE <br/>ICP 17009477</p>
// </div> */}
) )
} }
export default Footer; export default Footer;

View File

@ -2,7 +2,8 @@ import React, { Component } from 'react';
import AccountProfile from "../../modules/user/AccountProfile"; import AccountProfile from "../../modules/user/AccountProfile";
import { getImageUrl } from 'educoder' import { getImageUrl } from 'educoder'
import axios from 'axios'; import axios from 'axios';
import { Input , notification , Dropdown ,Popover, Menu,Badge, Button } from 'antd'; import cookie from 'react-cookies';
import { notification , Dropdown ,Popover, Menu,Badge } from 'antd';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import LoginDialog from '../../modules/login/LoginDialog'; import LoginDialog from '../../modules/login/LoginDialog';
@ -14,10 +15,8 @@ import CheckProfile from '../Component/ProfileModal/Profile';
import './header.scss'; import './header.scss';
import NoticeContent from './NoticeContent'; import NoticeContent from './NoticeContent';
const $ = window.$ import MainLogo from './img/logo.png';
// TODO 这部分脚本从公共脚本中直接调用 // TODO 这部分脚本从公共脚本中直接调用
const { Search } = Input;
let old_url;
window._header_componentHandler = null; window._header_componentHandler = null;
// 非trustie链接则新开页跳转 // 非trustie链接则新开页跳转
@ -43,8 +42,8 @@ class NewHeader extends Component {
setevaluatinghides: false, setevaluatinghides: false,
occupation: 0, occupation: 0,
mydisplay: false, mydisplay: false,
headtypesonClickbool: false, // headtypesonClickbool: false,
headtypess: "/", // headtypess: "/",
settings: null, settings: null,
visiblemyss: false, visiblemyss: false,
openSearch:false, openSearch:false,
@ -55,28 +54,6 @@ class NewHeader extends Component {
this.geturlsdata(); this.geturlsdata();
window._header_componentHandler = this; window._header_componentHandler = this;
//下拉框的显示隐藏
var hoverTimeout;
var hoveredPanel;
$(".edu-menu-panel").hover(function () {
if (hoverTimeout) { // 一次只显示一个panel
if (hoveredPanel && hoveredPanel !== this) {
$(hoveredPanel).find(".edu-menu-list").hide()
}
clearTimeout(hoverTimeout);
hoverTimeout = null;
}
hoveredPanel = this;
$(this).find(".edu-menu-list").show();
}, function () {
var that = this;
// 延迟hide
hoverTimeout = setTimeout(function () {
$(that).find(".edu-menu-list").hide();
}, 800)
});
//获取游览器地址
try { try {
window.sessionStorage.setItem("yslgeturls", JSON.stringify(window.location.href)) window.sessionStorage.setItem("yslgeturls", JSON.stringify(window.location.href))
} catch (e) {} } catch (e) {}
@ -98,11 +75,17 @@ class NewHeader extends Component {
educoderlogin = () => { educoderlogin = () => {
//登录账号 //登录账号
this.setState({ if(window.location.pathname === "/"){
isRender: true window.location.href="/login";
}) }else{
this.setState({
isRender: true
})
}
} }
educoderloginysl = () => { educoderloginysl = () => {
//退出账号时清除登录页面的下次自动登录(用户再次打开登录页面时下次自动登录框不勾选)
cookie.remove("autologin");
//退出账号 //退出账号
var url = `/accounts/logout.json`; var url = `/accounts/logout.json`;
axios.get((url)).then((result) => { axios.get((url)).then((result) => {
@ -154,12 +137,12 @@ class NewHeader extends Component {
AccountProfiletype: false AccountProfiletype: false
}) })
}; };
headtypesonClick = (url, bool) => { // headtypesonClick = (url, bool) => {
this.setState({ // this.setState({
headtypess: url, // headtypess: url,
headtypesonClickbool: bool, // headtypesonClickbool: bool,
}) // })
} // }
//获取数据为空的时候 //获取数据为空的时候
gettablogourlnull = () => { gettablogourlnull = () => {
this.setState({ this.setState({
@ -213,12 +196,18 @@ class NewHeader extends Component {
matchpaths = (url) => { matchpaths = (url) => {
const { match } = this.props; const { match } = this.props;
if(url){ const isDev = window.location.port == 3007;
if (match.path.indexOf(url) > -1) { const isdev2= isDev ?'https://testforgeplus.trustie.net':`https://${window.location.hostname}`;
return true let str = "";
}else { if(url.indexOf("http")>-1){
return false str = isdev2+match.url;
} }else{
str = match.path;
}
if (url && (str === url || (str === url+'/'))) {
return true
}else {
return false
} }
} }
@ -279,96 +268,18 @@ class NewHeader extends Component {
}; };
render() { render() {
const { match ,resetUserInfo ,showNotification} = this.props; const { resetUserInfo ,showNotification,publicNav} = this.props;
let current_user = this.props.user; let current_user = this.props.user;
let { let {
AccountProfiletype, AccountProfiletype,
user, user,
isRender, isRender,
headtypesonClickbool,
headtypess,
settings, settings,
visible, visible,
} = this.state; } = this.state;
/*用户名称 用户头像url*/
let activeIndex = false;
let activeForums = false;
let activeShixuns = false;
let activePaths = false;
let coursestype = false;
let activePackages = false;
let activeMoopCases = false;
let activeCompetitions = false;
if (match.path === '/forums') {
activeForums = true;
} else if (match.path.startsWith('/shixuns')) {
activeShixuns = true;
} else if (match.path.startsWith('/paths')) {
activePaths = true;
} else if (match.path.startsWith('/courses')) {
coursestype = true;
} else if (match.path.startsWith('/crowdsourcing')) {
activePackages = true;
} else if (match.path.startsWith('/moop_cases')) {
activeMoopCases = true;
} else if (match.path.startsWith('/competitions')) {
activeCompetitions = true;
} else {
activeIndex = true;
}
let headtypes = '/';
if (settings) {
if (settings.navbar) {
if (settings.navbar.length > 0) {
if (match.path === '/') {
if (headtypesonClickbool === false) {
headtypes = undefined;
} else {
headtypes = headtypess;
}
} else {
for (var i = 0; i < settings.navbar.length; i++) {
if (match.path === settings.navbar[i].link) {
headtypes = settings.navbar[i].link;
break;
}
}
}
}
}
}
let shixuntype = false;
let pathstype = false;
let coursestypes = false;
if (this.props && this.props.mygetHelmetapi != null) {
let shixun = "/shixuns";
let paths = "/paths";
let courses = "/courses";
this.props.mygetHelmetapi && this.props.mygetHelmetapi.navbar && this.props.mygetHelmetapi.navbar.map((item, key) => {
var reg = RegExp(item.link);
if (shixun.match(reg)) {
if (item.hidden === true) {
shixuntype = true
}
}
if (paths.match(reg)) {
if (item.hidden === true) {
pathstype = true
}
}
if (courses.match(reg)) {
if (item.hidden === true) {
coursestypes = true
}
}
})
}
let search_url = settings && settings.common && settings.common.search; let search_url = settings && settings.common && settings.common.search;
return ( return (
<div className="newHeaders" id="nHeader"> <div className={publicNav ? `newHeaders publicNav`:`newHeaders`} id="nHeader">
<div className="headerContent"> <div className="headerContent">
{isRender === true ? {isRender === true ?
<LoginDialog <LoginDialog
@ -383,10 +294,18 @@ class NewHeader extends Component {
{...this.props} {...this.props}
{...this.state} {...this.state}
/> : ""} /> : ""}
<div style={{width:"78px"}}>
{
publicNav &&
<a href={'https://www.ccf.org.cn/'} className={"fl"}>
<img src={MainLogo} alt="ccf" width="63px"/>
</a>
}
</div>
{ {
settings && settings.nav_logo_url ? settings && settings.nav_logo_url ?
<a href={settings && settings.new_course.default_url} className={"fl mr50"} style={{minWidth:"45px"}}> <a href={settings && settings.new_course.default_url} className={"fl mr50"}>
<img alt="可控开源社区" className="logoimg" style={{ heigth: "40px" }} src={getImageUrl(`/${settings.nav_logo_url}`)}></img> <img alt="可控开源社区" className="logoimg" src={getImageUrl(`/${settings.nav_logo_url}`)}></img>
</a> </a>
: :
"" ""
@ -398,27 +317,26 @@ class NewHeader extends Component {
{ {
settings.navbar && settings.navbar.map((item, key) => { settings.navbar && settings.navbar.map((item, key) => {
var new_link = item.link; var new_link = item.link;
var user_login = current_user && current_user.login; // var user_login = current_user && current_user.login;
var is_hidden = item.hidden var is_hidden = item.hidden;
if (new_link && (new_link.indexOf("courses") > -1 || new_link.indexOf("contests") > -1)) { // if (new_link && (new_link.indexOf("courses") > -1 || new_link.indexOf("contests") > -1)) {
if (user_login) { // if (user_login) {
if (new_link.indexOf("courses") > -1) { // if (new_link.indexOf("courses") > -1) {
new_link = new_link.replace(/courses/g, user_login + "/courses") // new_link = new_link.replace(/courses/g, user_login + "/courses")
} else if (new_link.indexOf("contests") > -1) { // } else if (new_link.indexOf("contests") > -1) {
new_link = new_link.replace(/contests/g, user_login + "/contests") // new_link = new_link.replace(/contests/g, user_login + "/contests")
} // }
} else { // } else {
is_hidden = true // is_hidden = true
} // }
} // }
if (user_login && (new_link && new_link.indexOf("homes") > -1)) { // if (user_login && (new_link && new_link.indexOf("homes") > -1)) {
new_link = new_link.replace(/homes/g, user_login + "/user_activities") // new_link = new_link.replace(/homes/g, user_login + "/user_activities")
} // }
var waiLian = (new_link && str.filter(item=>new_link.indexOf(item)>-1) ); var waiLian = (new_link && str.filter(item=>new_link.indexOf(item)>-1) );
var wl = waiLian && waiLian.length>0; var wl = waiLian && waiLian.length>0;
return ( return (
<li key={key} onClick={() => this.headtypesonClick(item.link, true)} className={`${this.matchpaths(item.link) === true ? 'pr active' : 'pr'}`} style={!is_hidden ? { display: 'flex' } : { display: 'none' }}> <li key={key} className={`${this.matchpaths(new_link) === true ? 'pr active' : 'pr'}`} style={{display:!is_hidden ? 'flex' : 'none'} }>
<a href={new_link} target={wl ? "_self":"_blank"}>{item.name}</a> <a href={new_link} target={wl ? "_self":"_blank"}>{item.name}</a>
</li> </li>
) )
@ -433,7 +351,7 @@ class NewHeader extends Component {
{ {
current_user && (current_user.main_site || current_user.login) && (settings && settings.add && settings.add.length>0)? current_user && (current_user.main_site || current_user.login) && (settings && settings.add && settings.add.length>0)?
<Dropdown overlay={this.addMenu(settings && settings.add)} placement="bottomRight"> <Dropdown overlay={this.addMenu(settings && settings.add)} placement="bottomRight">
<i className="iconfont icon-tianjiafangda color-grey-6 ml30 mr15"></i> <img src={require(`./img/add.png`)} alt="" width="16px" className="mr15 ml30"/>
</Dropdown>:"" </Dropdown>:""
} }
@ -448,7 +366,7 @@ class NewHeader extends Component {
> >
<Link to={"/settings/notice"} className="message-icon"> <Link to={"/settings/notice"} className="message-icon">
{current_user && <Badge count={current_user.message_unread_total}> {current_user && <Badge count={current_user.message_unread_total}>
<i className="iconfont icon-xiaoxilingdang color-grey-6 ml15 mr15"></i> <img src={require(`./img/ring.png`)} alt="" width="16px" className="ml15 mr15"/>
</Badge>} </Badge>}
</Link> </Link>
</Popover> </Popover>
@ -457,10 +375,14 @@ class NewHeader extends Component {
</div> </div>
{!user || (user && !user.login) ? {!user || (user && !user.login) ?
<span className="font-15 ml30"> <span className="font-15 ml30">
<a onClick={() => this.educoderlogin()} className="mr5 color-grey-6">登录</a> <a onClick={() => this.educoderlogin()} className="mr5 color-white">登录</a>
{ {
settings && settings.common && settings.common.register && (settings && settings.common && settings.common.register) ?
<span><em className="vertical-line"></em><a className="ml5 color-grey-6" href={`${settings.common.register}`} target="_blank"></a></span> publicNav ?
<a href='/register' className="regBtn">立即注册</a>
:
<span><em className="vertical-line"></em><a className="ml5 color-white" href='/register'></a></span>
:""
} }
</span> </span>
: :

View File

@ -23,6 +23,9 @@ function NoticeContent({ visible, showNotification, resetUserInfo, current_user:
const [atPage, setAtPage] = useState(0); const [atPage, setAtPage] = useState(0);
const [atUnreadList, setAtUnreadList] = useState([]);//@ const [atUnreadList, setAtUnreadList] = useState([]);//@
//
const [clickItem, setClickItem] = useState(undefined);
useEffect(() => { useEffect(() => {
resetUserInfo(); resetUserInfo();
}, [noticeUnreadCount,atUnreadCount]); }, [noticeUnreadCount,atUnreadCount]);
@ -150,23 +153,26 @@ function NoticeContent({ visible, showNotification, resetUserInfo, current_user:
function changeReadMark(item) { function changeReadMark(item) {
if (item.type === "notification") { if (!clickItem || clickItem.id !== item.id){
let list = noticeUnreadList.slice(); if (item.type === "notification") {
let index = noticeUnreadList.indexOf(item); let list = noticeUnreadList.slice();
list[index].status = 2; let index = noticeUnreadList.indexOf(item);
setNoticeUnreadList(list); if (list[index].status === 1 && noticeUnreadCount > 0) {
if (noticeUnreadCount > 0) { setNoticeUnreadCount(noticeUnreadCount - 1);
setNoticeUnreadCount(noticeUnreadCount - 1); }
} list[index].status = 2;
} else if (item.type === "atme") { setNoticeUnreadList(list);
let list = atUnreadList.slice(); } else if (item.type === "atme") {
let index = atUnreadList.indexOf(item); let list = atUnreadList.slice();
list[index].status = 2; let index = atUnreadList.indexOf(item);
setAtUnreadList(list); if (list[index].status === 1 && atUnreadCount > 0) {
if (atUnreadCount > 0) { setAtUnreadCount(atUnreadCount - 1);
setAtUnreadCount(atUnreadCount - 1); }
list[index].status = 2;
setAtUnreadList(list);
} }
} }
setClickItem(item);
} }
return ( return (
@ -219,12 +225,12 @@ function NoticeContent({ visible, showNotification, resetUserInfo, current_user:
{atUnreadList.map(item => { {atUnreadList.map(item => {
return ( return (
<div key={item.id + Math.random()} className="noticeCont-back" onClick={() => { readItem(item) }}> <div key={item.id + Math.random()} className="noticeCont-back" onClick={() => { readItem(item) }}>
<div className="noticeCont"> <div className={`noticeCont ${item.notification_url ? 'pointer' : ''}`}>
<span style={{ visibility: item.status === 1 ? 'visible' : 'hidden' }}> <span style={{ visibility: item.status === 1 ? 'visible' : 'hidden' }}>
<Badge color="#FA2020" /> <Badge color="#FA2020" />
</span> </span>
<div className="noticeCont-text"> <div className="noticeCont-text">
<span className="content-span atme-cont-span" dangerouslySetInnerHTML={{ __html: "<b>" + (item.sender ? item.sender.name : '') + "</b>&nbsp;&nbsp;&nbsp;" + item.content + " 中@我" }}></span> <span className="content-span atme-cont-span" dangerouslySetInnerHTML={{ __html: item.content }}></span>
<span className="timeSpan">{item.time_ago}</span> <span className="timeSpan">{item.time_ago}</span>
</div> </div>
</div> </div>

View File

@ -27,7 +27,7 @@
margin-left: 15px; margin-left: 15px;
} }
.currentMenu{ .ant-dropdown-menu.currentMenu{
width: 120px; width: 120px;
text-align: center; text-align: center;
padding:0px; padding:0px;
@ -127,6 +127,9 @@
width: 110px; width: 110px;
text-align: right; text-align: right;
} }
.ant-form-explain{
position: absolute;
}
} }
// 右上角小铃铛单独样式 // 右上角小铃铛单独样式
@ -262,4 +265,101 @@
.text-center{ .text-center{
text-align: center; text-align: center;
}
.footEdition{
background-color: #171B23;
.footContent{
display: flex;
align-items: flex-start;
padding:86px 0px;
justify-content: space-around;
width: 1200px;
margin:0px auto;
ul{
min-width: 120px;
text-align: left;
margin-right: 80px;
&.center{
text-align: center;
}
&>p{
height: 22px;
font-size: 16px;
font-weight: 400;
color: #FFFFFF;
line-height: 22px;
}
&>img{
width: 100px;
height: 100%;
margin-bottom: 30px;
margin-top: 25px;
border-radius: 10px;
}
li{
height: 20px;
font-size: 14px;
font-weight: 400;
line-height: 20px;
color: #BDC2D1;
margin-bottom: 15px!important;
a{
color: #BDC2D1!important;
&:hover{
text-decoration: underline;
}
}
&.thehead{
height: 25px;
font-size: 18px;
font-weight: 600;
color: #FFFFFF;
line-height: 25px;
margin-bottom: 20px!important;
}
}
.theline{
.imgCon{
width: 90px;
height: 90px;
padding:5px;
border-radius: 4px;
background-color: #fff;
img{
width: 100%;
border-radius: 3px;
}
}
}
}
}
}
.copyrightDesc{
font-size: 12px;
font-weight: 400;
color: #BDC2D1;
line-height: 28px;
padding:15px 0px;
text-align: center;
background-color: #1B212C;
a{
color: #BDC2D1!important;
}
}
.regBtn{
height: 40px;
background: #466AFF;
border-radius: 2px;
display: inline-block;
padding:0px 18px;
margin-left: 20px;
font-size: 14px;
font-weight: 400;
color: #FFFFFF!important;
line-height: 40px;
&:hover{
color: #FFFFFF!important;
background-color: #355CFF;
}
} }

BIN
src/forge/Head/img/add.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 B

BIN
src/forge/Head/img/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
src/forge/Head/img/ring.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -22,11 +22,10 @@ const ProjectIndex = Loadable({
loading: Loading, loading: Loading,
}); });
// 项目详情放在用户和组织下作为二级菜单存在 const ProjectHome = Loadable({
// const ProjectDetail = Loadable({ loader: () => import("./Main/projecthome/Index"),
// loader: () => import("./Main/Detail"), loading: Loading,
// loading: Loading, });
// });
class Index extends Component { class Index extends Component {
@ -60,23 +59,17 @@ class Index extends Component {
<ProjectNew {...this.props} {...props} /> <ProjectNew {...this.props} {...props} />
)} )}
></Route> ></Route>
{/* <Route
path="/:owner/:projectsId"
render={(props) => (
<ProjectDetail {...this.props} {...props} />
)}
></Route> */}
<Route <Route
path="/explore" path="/explore/all"
render={(props) => ( render={(props) => (
<ProjectIndex {...this.props} {...props} /> <ProjectIndex {...this.props} {...props} />
)} )}
></Route> ></Route>
<Route <Route
path="/" path="/explore"
render={(props) => ( render={(props) => (
<ProjectIndex {...this.props} {...props} /> <ProjectHome {...this.props} {...props} />
)} )}
></Route> ></Route>
</Switch> </Switch>
@ -90,10 +83,3 @@ export default withRouter(
parentSelector: ".newMain", parentSelector: ".newMain",
})(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(Index)))) })(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC(Index))))
); );
// export default withRouter(
// ImageLayerOfCommentHOC({
// imgSelector: ".imageLayerParent img, .imageLayerParent .imageTarget",
// parentSelector: ".newMain",
// })(Index)
// );

View File

@ -1,7 +1,7 @@
import React , { useEffect , useState } from 'react'; import React , { useEffect , useState } from 'react';
import { WhiteBack , Box , LongWidth , ShortWidth , Gap , AlignCenter , FlexAJ } from '../Component/layout'; import { WhiteBack , Box , LongWidth , ShortWidth , Gap , AlignCenter , FlexAJ } from '../Component/layout';
import { Dropdown , Menu , Divider , Spin, Button , Typography } from 'antd'; import { Dropdown , Menu , Divider , Spin, Button , Typography } from 'antd';
import { getImageUrl } from "educoder"; import { getImageUrl , turnbar , returnbar } from "educoder";
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { truncateCommitId } from "../common/util"; import { truncateCommitId } from "../common/util";
import CloneAddress from '../Branch/CloneAddress'; import CloneAddress from '../Branch/CloneAddress';
@ -26,20 +26,6 @@ import RenderHtml from '../../components/render-html';
/** /**
* projectDetail.type:0是托管项目1是镜像项目2是同步镜像项目(为2时不支持在线创建在线上传在线修改在线删除创建合并请求等功能) * projectDetail.type:0是托管项目1是镜像项目2是同步镜像项目(为2时不支持在线创建在线上传在线修改在线删除创建合并请求等功能)
*/ */
const { Paragraph } = Typography;
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
function returnbar(str){
if(str && str.length>0 && str.indexOf("%2F")>-1){
return str.replaceAll('%2F','/');
}
return str;
}
function CoderDepot(props){ function CoderDepot(props){
const [ projectDetail , setProjectDetail ]= useState(undefined); const [ projectDetail , setProjectDetail ]= useState(undefined);
const [ inviteCode , setInviteCode ] = useState(undefined); const [ inviteCode , setInviteCode ] = useState(undefined);
@ -89,6 +75,8 @@ function CoderDepot(props){
} }
if(i && i.length === 0){ if(i && i.length === 0){
setIssuesFlag(false); setIssuesFlag(false);
console.log(bannerList);
} }
} }
},[bannerList]) },[bannerList])
@ -122,13 +110,10 @@ function CoderDepot(props){
setTreeValue(url); setTreeValue(url);
getFileInfo(url,branchName); getFileInfo(url,branchName);
setType("file"); setType("file");
// getReadmeInfo(url,branchName);
// setReadme(undefined);
}else{ }else{
setTreeValue(undefined); setTreeValue(undefined);
getDirInfo(branchName || defaultBranch); getDirInfo(branchName || defaultBranch);
setType("dir"); setType("dir");
// getReadmeInfo('', branchName || defaultBranch);
} }
} }
},[projectsId,owner,pathname,defaultBranch]) },[projectsId,owner,pathname,defaultBranch])
@ -138,7 +123,7 @@ function CoderDepot(props){
if(result && result.data){ if(result && result.data){
const release = { const release = {
"list":result.data.releases, "list":result.data.releases,
"total_count":result.data.releases.length "total_count":result.data.releases && result.data.releases.length
} }
setReleaseVersions(release); setReleaseVersions(release);
} }
@ -169,7 +154,7 @@ function CoderDepot(props){
const url = `/${owner}/${projectsId}/entries.json`; const url = `/${owner}/${projectsId}/entries.json`;
axios.get(url, { axios.get(url, {
params: { ref: branch } params: { ref:branch}
}).then((result) => { }).then((result) => {
if (result) { if (result) {
setCommitCount(result.data.commits_count); setCommitCount(result.data.commits_count);
@ -197,7 +182,7 @@ function CoderDepot(props){
let ele = document.getElementById("ptxt"); let ele = document.getElementById("ptxt");
if(ele){ if(ele){
let h = ele.offsetHeight; let h = ele.offsetHeight;
if( h > 35 ) setHideBtn(true); if( h > 36 ) setHideBtn(true);
} }
} }
},[projectDetail,lastCommit]) },[projectDetail,lastCommit])
@ -207,7 +192,7 @@ function CoderDepot(props){
const url = `/${owner}/${projectsId}/sub_entries.json`; const url = `/${owner}/${projectsId}/sub_entries.json`;
axios.get(url, { axios.get(url, {
params:{ params:{
filepath:path, filepath:returnbar(path),
ref:ref || branchName, ref:ref || branchName,
type type
} }
@ -239,9 +224,9 @@ function CoderDepot(props){
// //
function changeBranch(value){ function changeBranch(value){
let checkvalue = turnbar(value); let checkvalue = value;
let url = `/${owner}/${projectsId}${value && `/tree/${checkvalue}`}${treeValue ? `/${treeValue}`:""}`; let u = `/${owner}/${projectsId}${checkvalue && `/tree/${checkvalue}`}${treeValue ? `/${treeValue}`:""}`;
props.history.push(url); props.history.push(u);
} }
// //
@ -279,6 +264,7 @@ function CoderDepot(props){
// //
function returnUlr(url){ function returnUlr(url){
let enBranch = turnbar(branchName); let enBranch = turnbar(branchName);
setType('dir');
props.history.push(`/${owner}/${projectsId}/tree${enBranch?`/${enBranch}`:""}/${url}`); props.history.push(`/${owner}/${projectsId}/tree${enBranch?`/${enBranch}`:""}/${url}`);
} }
// //
@ -286,8 +272,9 @@ function CoderDepot(props){
if(type!=="submodule"){ if(type!=="submodule"){
let enBranch = branchName || defaultBranch; let enBranch = branchName || defaultBranch;
let checkvalue = turnbar(enBranch); let checkvalue = turnbar(enBranch);
let enPath = turnbar(path);
setType(type); setType(type);
props.history.push(`/${owner}/${projectsId}${`/tree/${checkvalue}`}${path?`/${path}`:""}`); props.history.push(`/${owner}/${projectsId}${`/tree/${checkvalue}`}${enPath?`/${enPath}`:""}`);
} }
} }
@ -319,16 +306,16 @@ function CoderDepot(props){
const downloadMenu = ( const downloadMenu = (
<CloneAddress <CloneAddress
http_url={projectDetail && projectDetail.clone_url} http_url={projectDetail && projectDetail.clone_url}
ssh_url = {projectDetail && projectDetail.ssh_url} ssh_url = {(projectDetail && props && props.platform) && projectDetail.ssh_url}
zip_url={zip_url} zip_url={(props && props.platform) && zip_url}
tar_url={tar_url} tar_url={(props && props.platform) && tar_url}
showNotification={props.showNotification}/> showNotification={props.showNotification}/>
) )
// website // website
function okUpdate(d,w,l){ function okUpdate(d,w,l){
const url = `/${owner}/${projectsId}.json`; const url = `/${owner}/${projectsId}.json`;
axios.put(url,{ axios.put(url,{
description:d,website:w,lesson_url:l description:d,website:w || "",lesson_url:l||""
}).then(result=>{ }).then(result=>{
if(result && result.data && result.data.id){ if(result && result.data && result.data.id){
setDesc(result.data.description); setDesc(result.data.description);
@ -337,12 +324,21 @@ function CoderDepot(props){
} }
}) })
} }
function createIssue(){
if(baseOper){
props.history.push(`/${owner}/${projectsId}/issues/new`);
}else{
props.showLoginDialog(`/${owner}/${projectsId}/issues/new`);
}
}
let n = fileInfo && fileInfo.name; let n = fileInfo && fileInfo.name;
const mdFlag = n && n.substring(n.length-3,n.length) === ".md"; const mdFlag = n && n.substring(n.length-3,n.length) === ".md";
const { current_user } = props; const { current_user } = props;
const baseOper = current_user && current_user.login && issuesFlag; const baseOper = current_user && current_user.login && issuesFlag;
const baseOperate = projectDetail && projectDetail.permission && projectDetail.permission !=="Reporter" && projectDetail.type !== 2 && pullsFlag; const baseOperate = projectDetail && projectDetail.permission && projectDetail.permission !=="Reporter" && projectDetail.type !== 2 && pullsFlag && props.platform;
const fileOperate = type === "dir" && projectDetail && projectDetail.type !== 2 && ((projectDetail.permission && projectDetail.permission !=="Reporter") || (current_user && current_user.admin)); const fileOperate = type === "dir" && projectDetail && projectDetail.type !== 2 && ((projectDetail.permission && projectDetail.permission !=="Reporter") || (current_user && current_user.admin));
return( return(
@ -392,7 +388,7 @@ function CoderDepot(props){
<span>分支<span className="color-grey-6">{branchName || defaultBranch}</span></span> <span>分支<span className="color-grey-6">{branchName || defaultBranch}</span></span>
} }
</div> </div>
{ {
treeValuePath && treeValuePath.length > 0 ? treeValuePath && treeValuePath.length > 0 ?
<Path <Path
identifier={projectDetail && projectDetail.identifier} identifier={projectDetail && projectDetail.identifier}
@ -404,36 +400,50 @@ function CoderDepot(props){
: :
<React.Fragment> <React.Fragment>
<AlignCenter className="mr20"> <AlignCenter className="mr20">
<Link to={`/${owner}/${projectsId}/branches`} className="iconBtn"> {
<i className="iconfont icon-master_icon font-16"></i> props.platform ?
<span>分支</span> <Link to={`/${owner}/${projectsId}/branches`} className="iconBtn">
<span>{projectDetail && projectDetail.branches_count}</span> <i className="iconfont icon-master_icon font-16"></i>
</Link> <span>分支</span>
<span>{projectDetail && projectDetail.branches_count}</span>
</Link>
:
<span>
<i className="iconfont icon-master_icon font-16 color-grey-6"></i>
<span className="ml3 color-grey-6">分支</span>
<span className="ml3">{projectDetail && projectDetail.branches_count}</span>
</span>
}
</AlignCenter> </AlignCenter>
<AlignCenter className="mr20"> <AlignCenter className="mr20">
{
props.platform ?
<Link to={`/${owner}/${projectsId}/tags`} className="iconBtn"> <Link to={`/${owner}/${projectsId}/tags`} className="iconBtn">
<i className="iconfont icon-biaoqianicon font-16"></i> <i className="iconfont icon-biaoqianicon font-16"></i>
<span>标签</span> <span>标签</span>
<span>{projectDetail && projectDetail.tags_count}</span> <span>{projectDetail && projectDetail.tags_count}</span>
</Link> </Link>:
<span>
<i className="iconfont icon-biaoqianicon font-16 color-grey-6"></i>
<span className="ml3 color-grey-6">标签</span>
<span className="ml3">{projectDetail && projectDetail.tags_count}</span>
</span>
}
</AlignCenter> </AlignCenter>
</React.Fragment> </React.Fragment>
} }
</AlignCenter> </AlignCenter>
<AlignCenter className="depotBtn"> <AlignCenter className="depotBtn">
{ <div className="addOptionBtn">
(baseOperate || baseOper) && {
<div className="addOptionBtn"> baseOperate &&
{ <CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/compare/${turnbar(branchName || defaultBranch)}...${turnbar(branchName || defaultBranch)}`)} >+ 合并请求</CheckProfile>
baseOperate && }
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/compare/master...${branchName || defaultBranch}`)} >+ 合并请求</CheckProfile> {
} issuesFlag &&
{ <a onClick={createIssue}>+ 疑修</a>
baseOper && }
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/issues/new`)} >+ 易修</CheckProfile> </div>
}
</div>
}
{ fileOperate && { fileOperate &&
<Dropdown <Dropdown
overlay={fileMenu()} overlay={fileMenu()}
@ -454,12 +464,18 @@ function CoderDepot(props){
(dirInfo && dirInfo.length>0) || fileInfo ? (dirInfo && dirInfo.length>0) || fileInfo ?
<div className="listtable"> <div className="listtable">
{ {
lastCommit && ((lastCommit && lastCommit.message) || lastCommitAuthor) &&
<div className="listtablehead"> <div className="listtablehead">
<User url={getImageUrl(`/${lastCommitAuthor && lastCommitAuthor.image_url}`)} name={lastCommitAuthor && lastCommitAuthor.name} id={lastCommitAuthor && lastCommitAuthor.id} login={lastCommitAuthor && lastCommitAuthor.login}/> {
<div className={hideBtn && hide ? "ellipsistxt hidetxt" :"ellipsistxt"}> lastCommitAuthor &&
<pre id="ptxt"><Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(lastCommit.sha)}`}><RenderHtml value={lastCommit.message}/></Link></pre> <User url={getImageUrl(`/${lastCommitAuthor.image_url}`)} name={lastCommitAuthor.name} id={lastCommitAuthor.id} login={lastCommitAuthor.login}/>
</div> }
{
lastCommit.message &&
<div className={hideBtn && hide ? "ellipsistxt hidetxt" :"ellipsistxt"}>
<pre id="ptxt"><Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(lastCommit.sha)}`}><RenderHtml value={lastCommit.message}/></Link></pre>
</div>
}
{ hideBtn && <span className="ellipsis" onClick={()=>changeHide(hide)}><i className="iconfont icon-shenglvehao"></i></span> } { hideBtn && <span className="ellipsis" onClick={()=>changeHide(hide)}><i className="iconfont icon-shenglvehao"></i></span> }
<span className="ml20 color-grey-6 font-12 mt3">{lastCommit.time_from_now}</span> <span className="ml20 color-grey-6 font-12 mt3">{lastCommit.time_from_now}</span>
@ -481,6 +497,7 @@ function CoderDepot(props){
item={item} item={item}
projectsId={projectsId} projectsId={projectsId}
goToSubRoot={goToSubRoot} goToSubRoot={goToSubRoot}
platform={props.platform}
/> />
) )
}) })
@ -505,7 +522,7 @@ function CoderDepot(props){
(dirInfo && dirInfo.length === 0) && !fileInfo ? <Nodata _html="暂未发现文件"/> :"" (dirInfo && dirInfo.length === 0) && !fileInfo ? <Nodata _html="暂未发现文件"/> :""
} }
{/* readme文件显示(显示文件详情时不显示readme文件) */} {/* readme文件显示(显示文件详情时不显示readme文件) */}
{ (readme && readme.content) ? <ReadMe ChangeFile={ChangeFile} readme={readme} operate={props && (props.isManager || props.isDeveloper) && projectDetail.type !==2 } history={props.history} /> :"" } { (readme && readme.replace_content) ? <ReadMe ChangeFile={ChangeFile} readme={readme} operate={props && (props.isManager || props.isDeveloper) && projectDetail.type !==2 } history={props.history} /> :"" }
</div> </div>
</LongWidth> </LongWidth>
{ {
@ -516,10 +533,10 @@ function CoderDepot(props){
<FlexAJ className="font-18 color-ooo mb20" style={{lineHeight:"28px"}}>关于 <FlexAJ className="font-18 color-ooo mb20" style={{lineHeight:"28px"}}>关于
{ {
projectDetail.permission && (projectDetail.permission==="Admin" || projectDetail.permission==="Owner" || projectDetail.permission==="Manager") && projectDetail.permission && (projectDetail.permission==="Admin" || projectDetail.permission==="Owner" || projectDetail.permission==="Manager") &&
<i onClick={()=>setOpenModal(true)} className="iconfont icon-a-shezhi color-grey-9 font-15"></i> <i onClick={()=>setOpenModal(true)} className="iconfont icon-a-shezhi color-grey-9 font-15 pointer"></i>
} }
</FlexAJ> </FlexAJ>
{desc && <p className="font-14 color-grey-3 mb15 task-hide-2" style={{lineHeight:"24px",WebkitLineClamp:"4",textAlign:"justify",wordBreak:"break-all"}}>{desc}</p>} {desc && <p className="font-14 color-grey-3 mb15 task-hide-2" style={{lineHeight:"24px",WebkitLineClamp:"4",textAlign:"justify",wordBreak:"break-all"}} title={desc}>{desc}</p>}
{ {
website && website &&
<div className="color-grey-6 df pinfos mb5"> <div className="color-grey-6 df pinfos mb5">
@ -539,7 +556,7 @@ function CoderDepot(props){
projectDetail && projectDetail.license_name && projectDetail && projectDetail.license_name &&
<div className="pinfos"> <div className="pinfos">
<i className="iconfont icon-xieyiicon font-16 mr10"></i> <i className="iconfont icon-xieyiicon font-16 mr10"></i>
<Link to={`/${owner}/${projectsId}/tree/${branchName || defaultBranch}/LICENSE`} className="color-grey-6">{projectDetail.license_name}</Link> <Link to={`/${owner}/${projectsId}/tree/${turnbar(branchName || defaultBranch)}/LICENSE`} className="color-grey-6">{projectDetail.license_name}</Link>
</div> </div>
} }
</div> </div>
@ -560,7 +577,7 @@ function CoderDepot(props){
} }
{/* 发布 */} {/* 发布 */}
{ {
releaseVersions && releaseVersions && props.platform &&
<React.Fragment> <React.Fragment>
<Divider /> <Divider />
<Releases <Releases
@ -573,17 +590,9 @@ function CoderDepot(props){
</React.Fragment> </React.Fragment>
} }
{/* 贡献者 */} {/* 贡献者 */}
{ <Contributors owner={owner} projectsId={projectsId} />
projectDetail && projectDetail.contributors && projectDetail.contributors.total_count >0 &&
<Contributors contributors={projectDetail.contributors} owner={owner} projectsId={projectsId} />
}
{/* 语言 */} {/* 语言 */}
{ projectDetail && projectDetail.languages && <LanguagePower owner={owner} projectsId={projectsId}/>
<React.Fragment>
<Divider />
<LanguagePower languages={projectDetail.languages}/>
</React.Fragment>
}
</Gap> </Gap>
</ShortWidth> </ShortWidth>
} }

View File

@ -8,17 +8,27 @@ const typeIco = {
"dir":"icon-wenjianjia4 font-15 color-blue_4C" "dir":"icon-wenjianjia4 font-15 color-blue_4C"
} }
function CoderDepotCatalogue({item , goToSubRoot , owner , projectsId }){ function CoderDepotCatalogue({item , goToSubRoot , owner , projectsId , platform }){
//
function getMessage(value){
let str = value.indexOf('\n') > 0 && value.split('\n');
return str[0];
}
return( return(
<li> <li>
<span> <span>
<a onClick={()=>goToSubRoot(item.path,item.type,item.name)} className={item.type === "submodule" && "submoduleStyle"}> {
<i className={`iconfont ${typeIco[`${item.type}`]} mr8`}></i>{item.name} (!platform && item.image_type) ?
</a> <span><i className={`iconfont ${typeIco[`${item.type}`]} mr8`}></i>{item.name}</span>
:
<a onClick={()=>goToSubRoot(item.path,item.type,item.name)} className={item.type === "submodule" && "submoduleStyle"}>
<i className={`iconfont ${typeIco[`${item.type}`]} mr8`}></i>{item.name}
</a>
}
</span> </span>
<span title="init project"> <span title="init project">
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.commit && item.commit.sha}`)}`} title={item.commit && item.commit.message}> <Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.commit && item.commit.sha}`)}`} title={item.commit && item.commit.message}>
{item.commit && item.commit.message} {getMessage(item.commit && item.commit.message)}
</Link> </Link>
</span> </span>
<span title={item.commit && item.commit.created_at}>{item.commit && item.commit.time_from_now}</span> <span title={item.commit && item.commit.created_at}>{item.commit && item.commit.time_from_now}</span>

View File

@ -1,5 +1,5 @@
import { result } from 'lodash';
import React from 'react'; import React from 'react';
import { returnbar } from 'educoder';
function CoderDepotPath({treeValuePath , returnUlr , returnMain , getPathUrl , identifier}){ function CoderDepotPath({treeValuePath , returnUlr , returnMain , getPathUrl , identifier}){
@ -17,9 +17,9 @@ function CoderDepotPath({treeValuePath , returnUlr , returnMain , getPathUrl , i
<React.Fragment> <React.Fragment>
{ {
key === treeValuePath.length-1 ? key === treeValuePath.length-1 ?
<span className="color-grey-6 subFileName" key={key}>{item}</span> <span className="color-grey-6 subFileName" key={key}>{returnbar(item)}</span>
: :
<a onClick={()=>returnUlr(`${getPathUrl(treeValuePath,key+1)}`)} className="color-blue subFileName">{item}</a> <a onClick={()=>returnUlr(`${getPathUrl(treeValuePath,key+1)}`)} className="color-blue subFileName">{returnbar(item)}</a>
} }
</React.Fragment> </React.Fragment>
); );

View File

@ -11,8 +11,8 @@ function CoderDepotReadme({ operate , history , readme , ChangeFile }){
const [ content ,setContent ] = useState(undefined); const [ content ,setContent ] = useState(undefined);
useEffect(()=>{ useEffect(()=>{
if(readme && readme.content){ if(readme && readme.replace_content){
setContent(readme.content); setContent(readme.replace_content);
}else{ }else{
setContent(undefined); setContent(undefined);
} }
@ -41,7 +41,7 @@ function CoderDepotReadme({ operate , history , readme , ChangeFile }){
return( return(
<div className="commonBox readBox" id="readme"> <div className="commonBox readBox" id="readme">
<Anchor offsetTop={70} targetOffset={160}> <Anchor offsetTop={58}>
<div className="commonBox-title boxTitle"> <div className="commonBox-title boxTitle">
<AlignCenter> <AlignCenter>
<Dropdown overlay={menu()} trigger={['hover']} overlayClassName="menuslist"> <Dropdown overlay={menu()} trigger={['hover']} overlayClassName="menuslist">

View File

@ -3,15 +3,10 @@ import { Link } from "react-router-dom";
import { Dropdown , Menu , Icon , Tooltip , Spin } from 'antd'; import { Dropdown , Menu , Icon , Tooltip , Spin } from 'antd';
import { truncateCommitId } from '../common/util'; import { truncateCommitId } from '../common/util';
import { getBranch } from '../GetData/getData'; import { getBranch } from '../GetData/getData';
import { turnbar } from "educoder";
import Nodata from '../Nodata'; import Nodata from '../Nodata';
import './list.scss'; import './list.scss';
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
export default ((props)=>{ export default ((props)=>{
const [ data , setData ] =useState(undefined); const [ data , setData ] =useState(undefined);
const [ isSpin , setIsSpin ] =useState(true); const [ isSpin , setIsSpin ] =useState(true);
@ -73,7 +68,6 @@ export default ((props)=>{
<Menu.Item key={'1'}><a href={tar_url}>TAR.GZ</a></Menu.Item> <Menu.Item key={'1'}><a href={tar_url}>TAR.GZ</a></Menu.Item>
</Menu> </Menu>
) )
return( return(
<React.Fragment> <React.Fragment>
<div className="main"> <div className="main">

View File

@ -1,6 +1,6 @@
import React , { Component } from 'react'; import React , { Component } from 'react';
import { Spin , Pagination, Timeline } from 'antd'; import { Spin , Pagination, Timeline } from 'antd';
import { getImageUrl } from 'educoder'; import { getImageUrl , returnbar } from 'educoder';
import { truncateCommitId ,timeFormat } from '../common/util'; import { truncateCommitId ,timeFormat } from '../common/util';
import { AlignTop } from '../Component/layout'; import { AlignTop } from '../Component/layout';
import SelectBranch from '../Branch/Select'; import SelectBranch from '../Branch/Select';
@ -15,12 +15,6 @@ import CopyTool from '../Component/CopyTool';
import './tree/Index.scss' import './tree/Index.scss'
function returnbar(str){
if(str && str.length>0 && str.indexOf("%2F")>-1){
return str.replaceAll('%2F','/');
}
return str;
}
//代码库--提交页面 //代码库--提交页面
class CoderRootCommit extends Component{ class CoderRootCommit extends Component{
@ -79,7 +73,7 @@ class CoderRootCommit extends Component{
isSpining:true, isSpining:true,
page:realPage page:realPage
}) })
this.getCommitList( branchName , realPage , limit ); this.getCommitList( returnbar(branchName) , realPage , limit );
} }
getCommitList=(branch , page , limit)=>{ getCommitList=(branch , page , limit)=>{
@ -133,7 +127,7 @@ class CoderRootCommit extends Component{
render(){ render(){
const { commitDatas , dataCount , limit , page , isSpining , branchList } = this.state; const { commitDatas , dataCount , limit , page , isSpining , branchList } = this.state;
const { projectDetail, commit_class , defaultBranch } = this.props; const { projectDetail, commit_class , defaultBranch , platform } = this.props;
const { projectsId , owner , branchName } = this.props.match.params; const { projectsId , owner , branchName } = this.props.match.params;
let branch = returnbar(branchName || defaultBranch); let branch = returnbar(branchName || defaultBranch);
return( return(
@ -159,7 +153,16 @@ class CoderRootCommit extends Component{
<div className="commitList-item f-wrap-between"> <div className="commitList-item f-wrap-between">
<div> <div>
<AlignTop> <AlignTop>
<div className="commitDesc"><Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="font-14 color-grey-3 font-bd"><RenderHtml value={item.message}/></Link></div> <div className="commitDesc">
{
platform ?
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="font-14 color-grey-3 font-bd">
<RenderHtml value={item.message}/>
</Link>
:
<RenderHtml value={item.message}/>
}
</div>
</AlignTop> </AlignTop>
<p className="f-wrap-alignCenter mt15 pb5"> <p className="f-wrap-alignCenter mt15 pb5">
<User <User
@ -176,7 +179,12 @@ class CoderRootCommit extends Component{
<div> <div>
<span className="treecopy-cont shadow"> <span className="treecopy-cont shadow">
<img src={Tree} alt="sha" width={"16px"}/> <img src={Tree} alt="sha" width={"16px"}/>
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`}>{truncateCommitId(`${item.sha}`)}</Link> {
platform ?
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`}>{truncateCommitId(`${item.sha}`)}</Link>
:
<span style={{color:"#466AFF",cursor:"default"}}>{truncateCommitId(`${item.sha}`)}</span>
}
<input type="text" id={`value${k}`} value={`${truncateCommitId(`${item.sha}`)}`}/> <input type="text" id={`value${k}`} value={`${truncateCommitId(`${item.sha}`)}`}/>
</span> </span>
<CopyTool beforeText="复制commit id" afterText="复制成功" inputId={`value${k}`}/> <CopyTool beforeText="复制commit id" afterText="复制成功" inputId={`value${k}`}/>

View File

@ -21,7 +21,7 @@ class CoderRootFileDetail extends Component {
value: undefined, value: undefined,
language: undefined, language: undefined,
languages: undefined, languages: undefined,
description: props.detail.content, description: props.detail.replace_content,
menuList:undefined menuList:undefined
}; };
} }
@ -36,12 +36,12 @@ class CoderRootFileDetail extends Component {
}; };
componentDidUpdate=(prevProps)=>{ componentDidUpdate=(prevProps)=>{
const { content } = this.props && this.props.detail; const { replace_content } = this.props && this.props.detail;
const prevcontent = prevProps.detail && prevProps.detail.content; const prevcontent = prevProps.detail && prevProps.detail.replace_content;
if (content && prevcontent) { if (replace_content && prevcontent) {
if (prevcontent !== content){ if (prevcontent !== replace_content){
this.setState({ this.setState({
description: content description: replace_content
}); });
} }
} }
@ -215,7 +215,7 @@ class CoderRootFileDetail extends Component {
const Option = Select.Option; const Option = Select.Option;
return ( return (
<React.Fragment> <React.Fragment>
<Anchor className="griditemAnchor" offsetTop={70}> <Anchor className="griditemAnchor" offsetTop={58}>
<div className="griditemCate"> <div className="griditemCate">
{ {
md && readOnly && md && readOnly &&
@ -319,7 +319,7 @@ class CoderRootFileDetail extends Component {
{...this.state} {...this.state}
language={language ? language : "javascript"} language={language ? language : "javascript"}
filepath={`/${detail.path}`} filepath={`/${detail.path}`}
content={description} content={detail.content}
readOnly={readOnly} readOnly={readOnly}
editorType="update" editorType="update"
currentBranch={currentBranch} currentBranch={currentBranch}

View File

@ -29,14 +29,6 @@ const CoderRootVersion = Loadable({
loader: () => import('./version/Index'), loader: () => import('./version/Index'),
loading: Loading, loading: Loading,
}) })
// const CoderRootVersionNew = Loadable({
// loader: () => import('./version/New'),
// loading: Loading,
// })
// const CoderRootVersionUpdate = Loadable({
// loader: () => import('./version/New'),
// loading: Loading,
// })
const Diff = Loadable({ const Diff = Loadable({
loader: () => import('./Diff'), loader: () => import('./Diff'),
loading: Loading, loading: Loading,
@ -50,37 +42,6 @@ class CoderRootIndex extends Component{
} }
} }
// componentDidMount=()=>{
// this.Init();
// }
// componentDidUpdate=(prevProps)=>{
// const { location } = this.props;
// const prevlocation = prevProps && prevProps.location;
// if (location !== prevlocation) {
// this.Init();
// }
// }
// Init=()=>{
// const { branchName } = this.props.match.params;
// const { defaultBranch } = this.props;
// this.getTopCount(branchName || defaultBranch);
// }
// 获取<Top />组件里要显示的数据
// getTopCount=(branch)=>{
// const { projectsId , owner } = this.props.match.params;
// const url = `/${owner}/${projectsId}/top_counts.json`;
// axios.get(url,{params:{
// ref:branch
// }}).then(result=>{
// if(result){
// this.setState({
// coderCount:result.data
// })
// }
// }).catch(error=>{console.log(error);})
// }
render(){ render(){
return( return(
<div className="coderSubPage"> <div className="coderSubPage">

View File

@ -3,7 +3,7 @@ import { Spin, Tooltip } from 'antd';
import { Link, Route, Switch } from 'react-router-dom'; import { Link, Route, Switch } from 'react-router-dom';
import { Content, AlignTop } from '../Component/layout'; import { Content, AlignTop } from '../Component/layout';
import DetailBanner from './sub/DetailBanner'; import DetailBanner from './sub/DetailBanner';
import { numFormat } from 'educoder'; import cookie from 'react-cookies';
import '../css/index.scss' import '../css/index.scss'
import './list.scss'; import './list.scss';
@ -55,7 +55,8 @@ const OrderupdateMilepost = Loadable({
}) })
const OrderupdateDetail = Loadable({ const OrderupdateDetail = Loadable({
loader: () => import('../Order/UpdateDetail'), // loader: () => import('../Order/UpdateDetail'),
loader: () => import('../Order/order_form'),
loading: Loading, loading: Loading,
}) })
@ -128,6 +129,10 @@ const Source = Loadable({
loader: () => import('../Source/Index'), loader: () => import('../Source/Index'),
loading: Loading, loading: Loading,
}) })
const Server = Loadable({
loader: () => import('../Server/Index'),
loading: Loading,
})
const DevIndex = Loadable({ const DevIndex = Loadable({
loader: () => import('../DevOps/Index'), loader: () => import('../DevOps/Index'),
loading: Loading, loading: Loading,
@ -167,6 +172,8 @@ function checkPathname(projectsId, owner, pathname) {
name = "source" name = "source"
} else if (url.indexOf(`/wiki`) > -1) { } else if (url.indexOf(`/wiki`) > -1) {
name = "wiki" name = "wiki"
} else if (url.indexOf(`/server`) > -1) {
name = "server"
} }
} }
return name; return name;
@ -203,6 +210,8 @@ class Detail extends Component {
componentDidMount = () => { componentDidMount = () => {
this.getProject(); this.getProject();
let history = this.props.location;
this.clearIssueCookies(history);
} }
componentDidUpdate = (prevState) => { componentDidUpdate = (prevState) => {
@ -211,6 +220,24 @@ class Detail extends Component {
if (prevState && this.props && (prevParam.projectsId !== propsParam.projectsId || prevParam.owner !== propsParam.owner)) { if (prevState && this.props && (prevParam.projectsId !== propsParam.projectsId || prevParam.owner !== propsParam.owner)) {
this.getProject(); this.getProject();
} }
this.props.history.listen((history) => {
// 非issue链接地址清除cookie states具体保存和操作在order.js页面
this.clearIssueCookies(history);
})
}
clearIssueCookies=(history)=>{
const { pathname } = history;
const { projectsId , owner } = this.props.match.params;
let currentIssue = pathname.indexOf(`/${owner}/${projectsId}/issues`) === -1;
if (currentIssue) {
cookie.save('states', undefined,{ expires: 0,path:`/` });
}
}
componentWillUnmount() {
this.timerChannel && clearTimeout(this.timerChannel);
} }
getProject = (num) => { getProject = (num) => {
@ -242,6 +269,7 @@ class Detail extends Component {
} else if (result.data.mirror_status === 2) { } else if (result.data.mirror_status === 2) {
this.deleteProjectBack(); this.deleteProjectBack();
} else { } else {
this.getBanner();
this.getDetail(); this.getDetail();
this.setState({ this.setState({
firstSync: false, firstSync: false,
@ -274,7 +302,9 @@ class Detail extends Component {
connected: () => { connected: () => {
console.log("###### channel connected! ######"); console.log("###### channel connected! ######");
}, },
disconnected: () => { }, disconnected: () => {
console.log("###### cannot connected! ######");
},
received: data => { received: data => {
console.log(`###### ---received data--- ######`); console.log(`###### ---received data--- ######`);
console.log(data); console.log(data);
@ -287,6 +317,7 @@ class Detail extends Component {
this.deleteProjectBack(); this.deleteProjectBack();
} }
this.getDetail(); this.getDetail();
this.getBanner();
} }
this.setState({ this.setState({
firstSync: false, firstSync: false,
@ -294,10 +325,22 @@ class Detail extends Component {
}); });
cable.subscriptions.consumer.disconnect(); cable.subscriptions.consumer.disconnect();
} }
},
onerror:()=>{
console.log("###### cannot connected! ######");
} }
}) });
this.timerChannel = setTimeout(this.reloadDetail,5000);
} }
reloadDetail=()=>{
if(this.state.firstSync||this.state.secondSync){
window.location.reload();
}
}
deleteProjectBack = () => { deleteProjectBack = () => {
const { history } = this.props; const { history } = this.props;
const { projectsId, owner } = this.props.match.params; const { projectsId, owner } = this.props.match.params;
@ -317,7 +360,6 @@ class Detail extends Component {
getDetail = () => { getDetail = () => {
const { projectsId, owner } = this.props.match.params; const { projectsId, owner } = this.props.match.params;
this.getBanner();
const url = `/${owner}/${projectsId}/detail.json`; const url = `/${owner}/${projectsId}/detail.json`;
axios.get(url).then((result) => { axios.get(url).then((result) => {
if (result && result.data) { if (result && result.data) {
@ -422,6 +464,10 @@ class Detail extends Component {
const url = `/${owner}/${projectsId}/forks.json`; const url = `/${owner}/${projectsId}/forks.json`;
axios.post(url).then(result => { axios.post(url).then(result => {
if (result && result.data.status === 0) { if (result && result.data.status === 0) {
if(result.data.message === "fork失败你已拥有了这个项目"){
this.props.history.push(`/${current_user && current_user.login}/${projectsId}`);
return;
}
this.props.history.push(`/${current_user && current_user.login}/${result.data.identifier}`); this.props.history.push(`/${current_user && current_user.login}/${result.data.identifier}`);
this.props.showNotification(result.data.message); this.props.showNotification(result.data.message);
} }
@ -484,6 +530,7 @@ class Detail extends Component {
const common = { const common = {
getDetail: this.getDetail, getDetail: this.getDetail,
getBanner:this.getBanner,
changeOpenDevops: this.changeOpenDevops, changeOpenDevops: this.changeOpenDevops,
defaultBranch defaultBranch
} }
@ -502,6 +549,7 @@ class Detail extends Component {
<Link to={`/${owner}/${projectsId}`} className="projectN mt6">{projectDetail && projectDetail.name}</Link> <Link to={`/${owner}/${projectsId}`} className="projectN mt6">{projectDetail && projectDetail.name}</Link>
</div> </div>
{projectDetail && projectDetail.private && <span className="privateTag mt6">私有</span>} {projectDetail && projectDetail.private && <span className="privateTag mt6">私有</span>}
{ !platform && <span className="privateTag red mt6">只读</span> }
</AlignTop> </AlignTop>
<div className="mt8"> <div className="mt8">
{ {
@ -509,11 +557,6 @@ class Detail extends Component {
this.textFunc(projectDetail.forked_from_project_id, projectDetail.fork_info) this.textFunc(projectDetail.forked_from_project_id, projectDetail.fork_info)
: "" : ""
} }
{
projectDetail && projectDetail.type && projectDetail.type !== 0 ?
<span className="color-grey-9">导入于 <a className="color-grey-6" target="_blank" href={projectDetail.mirror_url}>{projectDetail.mirror_url}</a></span>
: ""
}
</div> </div>
</div> </div>
<div> <div>
@ -601,7 +644,8 @@ class Detail extends Component {
open_devops={open_devops} open_devops={open_devops}
platform={platform} platform={platform}
urlFlag={urlFlag} urlFlag={urlFlag}
isManager={isManager} showNotification={this.props.showNotification}
current_user={current_user}
/> />
} }
</div> </div>
@ -614,6 +658,12 @@ class Detail extends Component {
: :
<Spin spinning={secondSync} className="spinstyle" tip="正在同步镜像" size="large"> <Spin spinning={secondSync} className="spinstyle" tip="正在同步镜像" size="large">
<Switch {...this.props}> <Switch {...this.props}>
{/* 服务 */}
<Route path="/:owner/:projectsId/server"
render={
() => (<Server {...this.props} {...this.state} {...common} />)
}
></Route>
{/* 资源 */} {/* 资源 */}
<Route path="/:owner/:projectsId/source" <Route path="/:owner/:projectsId/source"
render={ render={
@ -638,6 +688,12 @@ class Detail extends Component {
() => (<WikiEdit {...this.props} {...this.state} {...common} />) () => (<WikiEdit {...this.props} {...this.state} {...common} />)
} }
></Route> ></Route>
{/* wiki具体某一个地址 */}
<Route path="/:owner/:projectsId/wiki/:wikiName"
render={
(props) => (<Wiki {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* wiki */} {/* wiki */}
<Route path="/:owner/:projectsId/wiki" <Route path="/:owner/:projectsId/wiki"
render={ render={
@ -699,16 +755,16 @@ class Detail extends Component {
(props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />) (props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />)
} }
></Route> ></Route>
{/* 修改详情 updatedetail*/} {/* 修改详情 edit*/}
<Route path="/:owner/:projectsId/issues/:orderId/:operateName" <Route path="/:owner/:projectsId/issues/:orderId/edit"
render={ render={
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} />) (props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} form_type={"edit"}/>)
} }
></Route> ></Route>
{/* 复制详情 copyetail*/} {/* 复制详情 copyetail*/}
<Route path="/:owner/:projectsId/issues/:orderId/copyetail" <Route path="/:owner/:projectsId/issues/:orderId/copyetail"
render={ render={
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} />) (props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} form_type={"copy"}/>)
} }
></Route> ></Route>

View File

@ -36,8 +36,9 @@ const Infos = styled.div`
} }
& > .f-wrap-between { & > .f-wrap-between {
padding: 14px 20px 14px 16px; padding: 14px 20px 14px 16px;
border-radius: 3px 3px 0px 0px; border-radius: 0px 0px 3px 3px;
border: 1px solid #D0D0D0; border: 1px solid #D0D0D0;
border-top: none;
.df{ .df{
align-items: center; align-items: center;
& .underline:hover{ & .underline:hover{
@ -46,12 +47,6 @@ const Infos = styled.div`
} }
} }
`; `;
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
// //
export default (props) => { export default (props) => {
const {match , history } = props; const {match , history } = props;

View File

@ -37,7 +37,10 @@ class Index extends Component {
recommendOriList:undefined, recommendOriList:undefined,
languageList:undefined, languageList:undefined,
languageId:undefined languageId:undefined,
CategoryList:undefined
} }
} }
@ -50,7 +53,7 @@ class Index extends Component {
this.getCategory(); this.getCategory();
this.getRecommand(); // this.getRecommand();
this.getLanguage(); this.getLanguage();
@ -147,11 +150,13 @@ class Index extends Component {
this.setState({ this.setState({
isSpin: true, isSpin: true,
project_type: type, project_type: type,
search: undefined search: undefined,
category_id: undefined,
},()=>{
this.setTypeList(list, type)
const { page, limit, sort , languageId } = this.state;
this.getListData(page, limit, undefined, sort, type, undefined , languageId);
}) })
this.setTypeList(list, type)
const { page, limit, sort, category_id , languageId } = this.state;
this.getListData(page, limit, undefined, sort, type, category_id , languageId);
} }
// 获取类型 // 获取类型
@ -160,23 +165,15 @@ class Index extends Component {
axios.get(url).then((result) => { axios.get(url).then((result) => {
if (result && result.data) { if (result && result.data) {
this.setCategoryList(result.data, undefined); this.setCategoryList(result.data, undefined);
} }
}).catch((error) => { }) }).catch((error) => { })
} }
setCategoryList = (list, active_id) => { setCategoryList = (list) => {
this.setState({ this.setState({
categoryList: list.map((item, key) => { CategoryList: list
return (
<li key={key} className={active_id && parseInt(active_id) === item.id ? 'active' : ''} onClick={() => this.changeCategory(`${item.id}`, list)}>
<p>
<span className="font-16">{item.name}</span>
<span className="color-blue">{item.projects_count}</span>
</p>
</li>
)
})
}) })
} }
@ -184,10 +181,10 @@ class Index extends Component {
this.setState({ this.setState({
category_id: id, category_id: id,
page: 1 page: 1
},()=>{
const { limit, sort, project_type , languageId } = this.state;
this.getListData(1, limit, undefined, sort, project_type, id , languageId);
}); });
this.setCategoryList(list, id)
const { limit, sort, project_type , languageId } = this.state;
this.getListData(1, limit, undefined, sort, project_type, id , languageId);
} }
// 排序 // 排序
@ -247,7 +244,7 @@ class Index extends Component {
<Menu onClick={this.ChangeSoryBy}> <Menu onClick={this.ChangeSoryBy}>
<Menu.Item key="updated_on">更新时间排序</Menu.Item> <Menu.Item key="updated_on">更新时间排序</Menu.Item>
<Menu.Item key="created_on">创建时间排序</Menu.Item> <Menu.Item key="created_on">创建时间排序</Menu.Item>
<Menu.Item key="forked_count">fork数排序</Menu.Item> <Menu.Item key="forked_count">fork数排序</Menu.Item>
<Menu.Item key="praises_count">点赞数量排序</Menu.Item> <Menu.Item key="praises_count">点赞数量排序</Menu.Item>
</Menu> </Menu>
) )
@ -279,34 +276,35 @@ class Index extends Component {
const { current_user } = this.props; const { current_user } = this.props;
const { projectsList , recommendList , languageList , languageId , const { projectsList , recommendList , languageList , languageId ,
isSpin, total, search, limit, page, typeList, categoryList , recommendOriList } = this.state; isSpin, total, search, limit, page, typeList, categoryList ,
recommendOriList , CategoryList , category_id } = this.state;
const setting={ // const setting={
dots: true, // dots: true,
infinite: true, // infinite: true,
speed: 500, // speed: 500,
slidesToShow: 5, // slidesToShow: 5,
slidesToScroll: 5, // slidesToScroll: 5,
autoplay:false, // autoplay:false,
arrows:false, // arrows:false,
adaptiveHeight:true // adaptiveHeight:true
} // }
const settings={ // const settings={
dots: true, // dots: true,
infinite: true, // infinite: true,
speed: 500, // speed: 500,
slidesToShow: 6, // slidesToShow: 6,
slidesToScroll: 6, // slidesToScroll: 6,
autoplay:false, // autoplay:false,
arrows:false, // arrows:false,
adaptiveHeight:true // adaptiveHeight:true
} // }
return ( return (
<div> <div>
<p className="t_project_banner"> {/* <p className="t_project_banner">
<img src={banner} width="100%" alt=""/> <img src={banner} width="100%" alt=""/>
</p> </p> */}
{/* { {/* {
recommendOriList && recommendOriList.length>0? recommendOriList && recommendOriList.length>0?
<Slider {...settings} className="recommandOri"> <Slider {...settings} className="recommandOri">
@ -320,7 +318,7 @@ class Index extends Component {
</Slider> </Slider>
:"" :""
} */} } */}
{ {/* {
recommendList && recommendList.length>0 && recommendList && recommendList.length>0 &&
<Slider {...setting} className={recommendList.length>5 ? "recommandProjects":"recommandProjects mb20"}> <Slider {...setting} className={recommendList.length>5 ? "recommandProjects":"recommandProjects mb20"}>
{ {
@ -341,7 +339,7 @@ class Index extends Component {
}) })
} }
</Slider> </Slider>
} } */}
<div className="ProjectListIndex"> <div className="ProjectListIndex">
<div className="list-left"> <div className="list-left">
<ul className="list-l-Menu"> <ul className="list-l-Menu">
@ -350,7 +348,19 @@ class Index extends Component {
</ul> </ul>
<ul className="list-l-Menu"> <ul className="list-l-Menu">
<li className="MenuTitle"><i className="iconfont icon-xiangmuleibie color-grey-9 font-15 mr5"></i></li> <li className="MenuTitle"><i className="iconfont icon-xiangmuleibie color-grey-9 font-15 mr5"></i></li>
{categoryList} {
CategoryList && CategoryList.length > 0 ? CategoryList.map((item,key)=>{
return(
<li key={key} className={category_id && parseInt(category_id) === item.id ? 'active' : ''} onClick={() => this.changeCategory(`${item.id}`)}>
<p>
<span className="font-16">{item.name}</span>
<span className="color-blue">{item.projects_count}</span>
</p>
</li>
)
})
:""
}
</ul> </ul>
</div> </div>
<div className="list-right boxShandow radius-2" style={{padding:0}}> <div className="list-right boxShandow radius-2" style={{padding:0}}>

View File

@ -246,11 +246,14 @@
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: flex-start; align-items: flex-start;
border-bottom: 1px solid #d9d9d9;
padding:12px 20px 11px; padding:12px 20px 11px;
border-radius: 4px 4px 0px 0px; border-radius: 4px 4px 0px 0px;
border: 1px solid rgba(42, 97, 255, 0.23); border: 1px solid rgba(42, 97, 255, 0.23);
border-bottom: none;
background-color: #FAFCFF; background-color: #FAFCFF;
&+.listtablebody{
border-top-color: rgba(42, 97, 255, 0.23);
}
.ellipsistxt{ .ellipsistxt{
&:hover .markdown-body{ &:hover .markdown-body{
color: #466AFF; color: #466AFF;
@ -331,7 +334,6 @@
.listtablebody{ .listtablebody{
border-radius:0px 0px 4px 4px ; border-radius:0px 0px 4px 4px ;
border: 1px solid #D0D0D0; border: 1px solid #D0D0D0;
border-top: none;
li.listtablepath{ li.listtablepath{
a{color: #40a9ff;} a{color: #40a9ff;}
p{ p{

View File

@ -35,7 +35,7 @@ class IndexItem extends Component {
<div className="p-r-Infos"> <div className="p-r-Infos">
<div className="p-r-name"> <div className="p-r-name">
<AlignCenter> <AlignCenter>
<Link to={`/${item.author.login}/${item.identifier}`} title={`${item.author.name}/${item.name}`} className="color-grey-3 font-18 task-hide " style={{maxWidth: 470 }}> <Link to={`/${item.author.login}/${item.identifier}`} target="_blank" title={`${item.author.name}/${item.name}`} className="color-grey-3 font-18 task-hide " style={{maxWidth: 470 }}>
{item.author.name}/{item.name} {item.author.name}/{item.name}
</Link> </Link>
{ !item.is_public && <span className="privateTag">私有</span> } { !item.is_public && <span className="privateTag">私有</span> }
@ -52,12 +52,6 @@ class IndexItem extends Component {
<i className="iconfont icon-banbenku font-18 color-green" /> <i className="iconfont icon-banbenku font-18 color-green" />
</Tooltip>:"" </Tooltip>:""
} }
{
item.type && item.type === 1 ?
<Tooltip title="该项目是一个导入于其他网站的仓库" className="ml5">
<i className="iconfont icon-jingxiang font-18 color-green" />
</Tooltip>:""
}
</AlignCenter> </AlignCenter>
<span className="p-r-tags"> <span className="p-r-tags">
{ {

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 969 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

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