Compare commits

...

683 Commits

Author SHA1 Message Date
caishi ea737f5b61 合并之后影响的样式、功能等 2022-01-19 16:50:51 +08:00
caishi a05700ed5d update 2022-01-18 10:18:21 +08:00
caishi 7e71b5f036 Merge branch 'JKDevelop' of https://git.trustie.net/Gitlink/forgeplus-react into JKDevelop 2022-01-18 09:21:02 +08:00
何童崇 5f9c463b22 修复无法跑起来的问题 2022-01-17 22:14:57 +08:00
caishi a40694f9c7 INDEX 2022-01-17 17:46:18 +08:00
caishi 8ef0c9d497 DEL 2022-01-17 17:45:49 +08:00
caishi 55a0d71391 DEL 2022-01-17 17:45:39 +08:00
caishi b9de31421e del 2022-01-17 17:44:33 +08:00
caishi 633b4fb8fd update 2022-01-17 17:43:06 +08:00
caishi e7b6f6fc35 merge codes 2022-01-17 16:47:34 +08:00
caishi 2f3d914fdf Merge branch 'gitlink_server' into JKDevelop
# Conflicts:
#	package-lock.json
#	package.json
#	public/css/edu-purge.css
#	public/css/iconfont.css
#	public/css/iconfont.js
#	public/css/iconfont.json
#	public/css/iconfont.ttf
#	public/css/iconfont.woff
#	public/css/iconfont.woff2
#	public/favicon.ico
#	src/App.js
#	src/AppConfig.js
#	src/common/DateUtil.js
#	src/common/TextUtil.js
#	src/common/UrlTool.js
#	src/common/educoder.js
#	src/forge/Branch/CloneAddress.js
#	src/forge/Main/CoderRootCommit.js
#	src/forge/Main/CoderRootDirectory.js
#	src/forge/Main/Detail.js
#	src/forge/Main/Index.js
#	src/forge/Main/Index.scss
#	src/forge/Main/IndexItem.js
#	src/forge/Main/list.scss
#	src/forge/Merge/Files.jsx
#	src/forge/New/Index.js
#	src/forge/Settings/CollaboratorMember.jsx
#	src/forge/Settings/Setting.js
#	src/forge/Upload/Index.js
#	src/forge/css/index.scss
#	src/forge/users/Index.jsx
#	src/forge/users/Infos.js
#	src/modules/404/Shixunnopage.js
#	src/modules/login/LoginDialog.js
#	src/modules/tpm/NewHeader.js
#	src/modules/tpm/TPMIndex.css
#	src/modules/tpm/TPMIndexHOC.js
2022-01-17 16:13:15 +08:00
caishi 7e27014dde install 2022-01-17 10:05:24 +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
xiaoxiaoqiong 10c237498e 使用手册地址更换 2021-12-17 14:02:18 +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
xxq250 070f869aa6 Merge pull request '修复推荐创客的状态控制' (#321) from tongChong/forgeplus-react:feature_jk_homepage into pre_dev_military 2021-12-16 15:59:58 +08:00
何童崇 c14ee5c359 修复推荐创客的状态控制 2021-12-16 14:03:32 +08:00
xxq250 7ee151e652 Merge pull request '红山开源新版首页' (#319) from tongChong/forgeplus-react:feature_jk_homepage into pre_dev_military 2021-12-16 10:15:27 +08:00
何童崇 7e3e35784e 修改全局指向生产的路径 2021-12-16 09:29:10 +08:00
何童崇 90f8e04e93 修改样式,兼容大屏和手机端 2021-12-16 09:27:14 +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
何童崇 0dc7a1f582 兼容大屏 2021-12-14 13:02:29 +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
何童崇 b6f2eb107c 微调各种配置 2021-12-10 09:31:21 +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
何童崇 3f6165585d 对接后端数据 2021-12-08 16:18:45 +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
何童崇 e4005a03b3 Merge branch 'dev_military' of https://code.gitlink.org.cn/Gitlink/forgeplus-react into feature_jk_homepage 2021-12-08 13:48:58 +08:00
baladiwei 846a24aef4 Merge pull request 'merge after release' (#309) from pre_dev_military into dev_military 2021-12-08 13:48:40 +08:00
baladiwei 955eed9232 Merge pull request '修改创客删除与恢复' (#308) from tongChong/forgeplus-react:dev-jk-maker into pre_dev_military 2021-12-08 13:47:48 +08:00
何童崇 fee2aec384 Merge branch 'dev_military' of https://code.gitlink.org.cn/Gitlink/forgeplus-react into feature_jk_homepage 2021-12-08 13:40:45 +08:00
何童崇 97f3fa75c1 增加调用后台数据 2021-12-08 13:35:23 +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
何童崇 eb180d3570 优化样式 2021-11-29 14:30:32 +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
何童崇 9276136bfe 优化首页样式代码 2021-11-26 10:41:21 +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
何童崇 1bad39e83a 修改创客删除与恢复 2021-11-25 15:59:04 +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
何童崇 c9e7da7df3 优化调用地址引用 2021-11-25 11:40:57 +08:00
何童崇 7f0b770dca 修改创客,优化创客调用Java发送请求的接口 2021-11-25 11:26:59 +08:00
xxq250 801c544f65 Merge pull request '前端页面优化' (#282) from hc1913847458/forgeplus-react:testdev into develop 2021-11-25 09:43:19 +08:00
baladiwei 70536036e1 Merge pull request 'merge after release' (#283) from pre_dev_military into dev_military 2021-11-25 09:33:40 +08:00
何童崇 2d8c3c5853 修改首页动效果,图片名字 2021-11-25 09:24:29 +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
baladiwei 0f92ff94a0 Merge pull request '修改公告页面bug' (#280) from tongChong/forgeplus-react:hotfix_api_address into pre_dev_military 2021-11-23 14:46:40 +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
何童崇 6507c87bc8 Merge branch 'dev_military' of https://git.trustie.net/Gitlink/forgeplus-react into hotfix_api_address 2021-11-22 15:13:36 +08:00
何童崇 b423e4b7e7 修改公告页面bug 2021-11-22 14:58:34 +08:00
何童崇 76b4cf0d9b 修改轮播图 2021-11-22 14:43:09 +08:00
何童崇 6d2a50ef5e 根据客户要求修改静态页面细节 2021-11-22 14:25:17 +08:00
baladiwei 938be1da55 Merge pull request 'merge after release' (#278) from pre_dev_military into dev_military 2021-11-22 11:28:48 +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
何童崇 954cf38074 修改首页动效 2021-11-19 17:09:46 +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
何童崇 bdcc7a4699 修改第五个动画 2021-11-17 14:39:10 +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
何童崇 e4d4375102 上传动画修改 2021-11-17 11:46:40 +08:00
hucong 2617831a9f 文案调整 2021-11-16 18:29:55 +08:00
hucong f0747eab05 文案调整 2021-11-16 18:28:30 +08:00
何童崇 54bffb41da 增加2个动画 2021-11-16 17:16:51 +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
何童崇 4097ebb69b 新增第一个特效的各种图片 2021-11-12 11:29:43 +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
何童崇 162fd200a5 修改创客管理员发布的问题 2021-11-11 10:40:57 +08:00
何童崇 cc9cf251fe 修改波浪的样式 2021-11-11 09:33:08 +08:00
谢思 cc2dd35ff4 编辑合并请求最后一行@弹框被遮挡 2021-11-10 20:45:23 +08:00
何童崇 c6bc26c5ae 修改首页头部及第一部分 2021-11-10 16:55:17 +08:00
谢思 f003a99779 @我功能。 2021-11-10 16:47:22 +08:00
何童崇 6e7da0ef5b Merge branch 'pre_dev_military' of https://git.trustie.net/Gitlink/forgeplus-react into feature_jk_homepage 2021-11-10 15:16:08 +08:00
caishi b4e2c6148a logo and issues 2021-11-10 15:07:39 +08:00
baladiwei d9bd0387db Merge pull request '修改API调用指向路径及发布任务时的判断逻辑' (#254) from tongChong/forgeplus-react:hotfix_api_address into pre_dev_military 2021-11-10 15:04:28 +08:00
何童崇 c0cfe12db4 修改发布任务判断逻辑 2021-11-10 14:57:42 +08:00
何童崇 dc6cfc342e 为首页定制化改造头部 2021-11-10 14:30:48 +08:00
何童崇 c3ecbe1f97 修改调用路径后未加跨域参数的问题 2021-11-10 10:39:08 +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
何童崇 a59a8c3693 修改指向路径 2021-11-10 09:33:12 +08:00
何童崇 14e4dc7d9e 修改首页 2021-11-09 16:53:59 +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
baladiwei 97f62a5684 Merge pull request 'pre-release merge' (#104) from pre_dev_military into dev_military 2021-09-30 17:46:56 +08:00
baladiwei e74a3b6a95 Merge pull request '解决合并时未先pull源代码合并记录的问题' (#103) from tongChong/forgeplus-react:dev-jk-maker into pre_dev_military 2021-09-30 17:46:00 +08:00
何童崇 38878183d5 Merge branch 'dev_military' of https://git.trustie.net/Gitlink/forgeplus-react into dev-jk-maker 2021-09-30 17:40:05 +08:00
baladiwei 0e0c13f1a4 Merge pull request '修改创客延期和项目侧边栏' (#100) from tongChong/forgeplus-react:dev-jk-maker into pre_dev_military 2021-09-30 17:35:59 +08:00
何童崇 a667a32de0 修改任务状态展示问题 2021-09-30 17:06:33 +08:00
何童崇 230e597787 修改延期的问题 2021-09-30 16:50:19 +08:00
何童崇 f0ea3a53c4 修改延期的问题 2021-09-30 16:08:48 +08:00
caishi 3da9306ed6 style 2021-09-30 15:42:37 +08:00
何童崇 51a4680481 优化延期、侧边导航 2021-09-30 11:49:44 +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
baladiwei 61a4882e58 Merge pull request '修改创客的调用' (#81) from tongChong/forgeplus-react:dev-jk-maker into pre_dev_military 2021-09-27 11:04:38 +08:00
何童崇 148e8f91eb 上传佐证材料查询参数修改 2021-09-27 10:53:05 +08:00
baladiwei 8f52a091fa Merge pull request '查看加密公告-电话验证错误提示语句' (#80) from tongChong/forgeplus-react:dev_military_notice into pre_dev_military 2021-09-27 10:45:43 +08:00
tongChong 62eabdf7c0 Merge pull request '修改加密公告电话验证的var' (#31) from durian/forgeplus-react:dev_military_notice_xiesi into dev_military_notice 2021-09-27 10:42:01 +08:00
谢思 d5490d5e71 修改加密公告电话验证的var 2021-09-27 10:28:47 +08:00
baladiwei cef374c52d Merge pull request '查看加密公告-电话验证错误提示语句' (#79) from tongChong/forgeplus-react:dev_military_notice into dev_military 2021-09-27 10:26:32 +08:00
谢思 7be60d3140 Merge branch 'dev_military' of https://git.trustie.net/Gitlink/forgeplus-react into dev_military_notice_xiesi 2021-09-27 10:18:29 +08:00
durian feafa5b6f3 Merge pull request '查看加密公告-电话验证错误提示语句' (#30) from durian/forgeplus-react:dev_military_notice_xiesi into dev_military_notice 2021-09-27 10:14:06 +08:00
谢思 2dd6ed108f 查看加密公告-电话验证错误提示语句 2021-09-27 10:11:59 +08:00
baladiwei 969323fdde Merge pull request '修改跳转的小bug' (#78) from tongChong/forgeplus-react:dev-jk-maker into pre_dev_military 2021-09-27 09:38:34 +08:00
何童崇 a73b4ff79a 修改跳转的小bug 2021-09-26 20:39:46 +08:00
baladiwei 16ca2a359e Merge pull request 'pre-release merge' (#77) from pre_dev_military into dev_military 2021-09-26 18:42:07 +08:00
baladiwei 444d954e72 Merge pull request '新增创客空间功能' (#76) from tongChong/forgeplus-react:dev-jk-maker into pre_dev_military 2021-09-26 18:41:08 +08:00
何童崇 6fc31c0bb8 拆分,不同功能调用不同的API,暂时用个简易版后续优化 2021-09-26 18:31:01 +08:00
何童崇 cf73f72e19 Merge branch 'pre_dev_military' of https://git.trustie.net/Gitlink/forgeplus-react into dev-jk-maker 2021-09-26 15:11:39 +08:00
baladiwei 745a25a003 Merge pull request '查看加密公告--电话验证' (#75) from tongChong/forgeplus-react:dev_military_notice into pre_dev_military 2021-09-26 15:11:01 +08:00
tongChong b080df1449 Merge pull request '查看加密信息-电话验证' (#28) from durian/forgeplus-react:dev_military_notice_xiesi into dev_military_notice 2021-09-26 14:28:59 +08:00
何童崇 0aa2a4aec3 允许跨域传cookie 2021-09-26 14:23:26 +08:00
何童崇 4dc1c4c814 合并公告的修改 2021-09-26 10:53:20 +08:00
何童崇 ddc576b054 上传创客issue修改 2021-09-26 10:25:06 +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
谢思 caef7a0ab3 查看加密公告--电话验证 2021-09-22 14:59:09 +08:00
谢思 85f0578302 查看加密公告--电话验证 2021-09-22 14:55:02 +08:00
caishi d4690cc8b5 拉取测试版分支代码,且更新gitlink首页 2021-09-22 09:23:20 +08:00
baladiwei bff55b6810 Merge pull request '修改指向路径' (#69) from tongChong/forgeplus-react:dev_military_notice into dev_military 2021-09-17 16:33:19 +08:00
baladiwei 01f71bca87 Merge pull request '修改指向路径' (#70) from tongChong/forgeplus-react:dev_military_notice into pre_dev_military 2021-09-17 16:33:06 +08:00
何童崇 d3cea0ff3b 修改指向路径 2021-09-17 16:22:35 +08:00
baladiwei be6e3d273b Merge pull request '公告加密前端代码' (#68) from tongChong/forgeplus-react:dev_military_notice into pre_dev_military 2021-09-17 16:02:25 +08:00
何童崇 6b8f1e3749 修改导航条高亮 2021-09-17 15:13:54 +08:00
tongChong b5e145b4b5 Merge pull request '公告优化' (#25) from durian/forgeplus-react:hotfix-hot-xiesi into dev_military_notice 2021-09-17 14:14:46 +08:00
何童崇 15b63be594 上传公告修改 2021-09-17 14:13:59 +08:00
谢思 032127bef6 公告优化 2021-09-17 13:26:06 +08:00
谢思 f4f843a7b9 通知中心优化 2021-09-17 10:27: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
何童崇 4cf8357463 修改调用路径 2021-09-16 16:57:53 +08:00
何童崇 0ff1367ad8 上传公告修改 2021-09-16 16:51:31 +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
何童崇 0e44cbbcdd 修改因后端返回结构带来的数据判定问题 2021-09-15 09:37:05 +08:00
tongChong e736591a4f Merge pull request '将对左侧导航栏的修改提交至公告' (#16) from hotfix-tab into dev_military_notice 2021-09-14 17:33:11 +08:00
tongChong d15900fc7c Merge pull request '公告页面banner图' (#13) from durian/forgeplus-react:hotfix-hot-xiesi into hotfix-tab 2021-09-14 09:40:38 +08:00
谢思 4f87542f1f 公告页面banner图 2021-09-13 14:50:51 +08:00
何童崇 94ee3601c9 修改多个issue,修改管理页路由组件引入方式 2021-09-09 16:35:19 +08:00
tongChong 19d09c7901 Merge pull request '红山开源的公告页面再改版' (#10) from durian/forgeplus-react:hotfix-hot-xiesi into hotfix-tab 2021-09-09 09:46:10 +08:00
谢思 3b29605321 公告二次改版 2021-09-07 09:09:35 +08:00
何童崇 6e82862307 修改创客空间微调及代理功能 2021-09-01 09:08:19 +08:00
tongChong 700ac5862e Merge pull request '修改创客空间' (#7) from durian/forgeplus-react:dev-jk-maker-xiesi into dev-jk-maker 2021-08-31 15:59:47 +08:00
谢思 4ccab2ed4f issues非按钮复杂判断修改 2021-08-31 15:51:58 +08:00
何童崇 3f3299a3b8 合并公告修改代码 2021-08-26 15:31:32 +08:00
baladiwei b73a38351b Merge pull request 'pre-release merge' (#26) from pre_dev_military into dev_military 2021-08-26 14:55:37 +08:00
baladiwei 586c5d6d1d Merge pull request '优化未查询到无数据时公告的展示' (#25) from tongChong/forgeplus-react:dev_military_notice into pre_dev_military 2021-08-26 14:53:24 +08:00
tongChong 819772d180 Merge pull request '红山开源的公告页面' (#6) from durian/forgeplus-react:dev_military_notice_xiesi into dev_military_notice 2021-08-26 13:32:24 +08:00
谢思 e733f1886e 红山开源公告页面暂无数据(居中样式) 2021-08-26 13:28:35 +08:00
tongChong 86d2442958 Merge pull request '红山开源的公告页面' (#5) from durian/forgeplus-react:dev_military_notice_xiesi into dev_military_notice 2021-08-26 11:50:51 +08:00
谢思 b7fc83edf9 公告数据展示 2021-08-26 10:28:15 +08:00
tongChong 74325b5dc7 Merge pull request '红山开源的公告页面' (#4) from durian/forgeplus-react:dev_military_notice_xiesi into dev_military_notice 2021-08-25 09:48:08 +08:00
xiesi a25959bfa0 修改红山开源公告页面无数据展示效果 2021-08-25 09:33:06 +08:00
baladiwei fe72be2f30 Merge pull request 'pre-release' (#23) from pre_dev_military into dev_military 2021-08-24 17:34:03 +08:00
baladiwei 4d41f44100 Merge pull request '公告新增2个类型' (#22) from tongChong/forgeplus-react:dev_military_notice into pre_dev_military 2021-08-24 17:14:00 +08:00
tongChong afa839e0b1 Merge pull request '红山开源的公告页面' (#3) from durian/forgeplus-react:dev_military_notice_xiesi into dev_military_notice 2021-08-24 13:59:21 +08:00
xiesi 83d59a2e64 修改公告详情页面的公告类型 2021-08-24 13:46:00 +08:00
tongChong 758f4267ed Merge pull request '红山开源的公告页面' (#2) from durian/forgeplus-react:dev_military_notice_xiesi into dev_military_notice 2021-08-24 13:29:17 +08:00
xiesi 38948a84cd 修改红山开源公告数据展示部分 2021-08-24 13:05:29 +08:00
xiesi 51d739f4a0 修改公告导航菜单 2021-08-24 11:51:31 +08:00
tongChong 706830928e 修改公告页面左侧导航栏-谢思
修改公告页面左侧导航栏-谢思
2021-08-23 14:40:16 +08:00
xiesi 8dc08c3992 红山开源的公告页面 2021-08-23 14:18:11 +08:00
何童崇 70ec86569f 修改延期的搜索 2021-08-11 09:24:22 +08:00
何童崇 00b41844bb 修改搜索回到第一页的问题 2021-08-10 17:32:31 +08:00
何童崇 81c93d2580 修改延期代码 2021-08-10 16:44:24 +08:00
何童崇 a87e55103c 修改跳转路由 2021-08-10 14:36:39 +08:00
何童崇 05101c5e32 上传延期列表及操作 2021-08-10 14:17:33 +08:00
何童崇 e72b3e687f 修改路由bug 2021-08-06 16:23:14 +08:00
何童崇 f25a52622d 上传issue修改 2021-08-05 17:46:48 +08:00
何童崇 f5fa216b23 修改issue 2021-08-04 21:48:21 +08:00
何童崇 a57b96a1b8 修改时间bug 2021-08-04 15:59:14 +08:00
何童崇 8efbea44ab 修改延期时间显示 2021-08-04 13:52:41 +08:00
何童崇 fa80b5d1df 解决因为热更新导致的table警告问题 2021-07-27 09:22:10 +08:00
何童崇 6c95ff98f4 修改bug,优化代码 2021-07-26 16:15:55 +08:00
何童崇 cb7170a87c 合并代码 2021-07-19 14:01:05 +08:00
何童崇 7757e4b6b7 修改bug 2021-07-19 13:43:58 +08:00
何童崇 cad9a4fc3a 修改bug 2021-07-16 11:11:20 +08:00
何童崇 dc20d3e270 修改bug,新增管理路由 2021-07-16 11:11:17 +08:00
何童崇 4503e1b176 上传修改bug 2021-07-16 11:10:54 +08:00
何童崇 91fe328eaf 增加管理员统筹所有任务的列表 2021-07-16 11:09:46 +08:00
何童崇 8d9d5c3ce3 修改bug 2021-07-16 11:09:06 +08:00
何童崇 a2aa344e31 修改bug 2021-07-16 11:08:28 +08:00
何童崇 981e199273 修改bug 2021-07-16 11:08:26 +08:00
何童崇 b6d6309c3c 增加上传支付凭证,修改bug 2021-07-16 11:07:42 +08:00
何童崇 16aac3b835 修改bug 2021-07-16 11:07:16 +08:00
何童崇 bdf3a8e72a 修改bug 2021-07-16 11:06:28 +08:00
何童崇 507976bf10 修改bug 2021-07-16 11:05:50 +08:00
何童崇 b6c2c66321 上传协议部分及bug修改 2021-07-16 11:04:41 +08:00
何童崇 0b7fbe564c 对接上传协议及确认支付 2021-07-16 11:04:41 +08:00
何童崇 ce958f3369 修改bug 2021-07-16 11:04:41 +08:00
何童崇 0e176d9334 修改bug 2021-07-16 11:04:41 +08:00
何童崇 3608b7b712 修改bug 2021-07-16 11:04:35 +08:00
何童崇 b9888a81f6 修改bug 2021-07-16 11:03:28 +08:00
何童崇 0bb6ec51c2 上传申诉材料审核bug 2021-07-16 11:03:16 +08:00
何童崇 7d2c90dfd1 上传申诉材料审核及修改成果对接代码样式 2021-07-16 11:02:57 +08:00
何童崇 66c5f09813 上传申诉材料审核及修改成果对接代码 2021-07-16 11:02:55 +08:00
何童崇 a4d38f8c86 新增佐证上传与审核 2021-07-16 11:02:37 +08:00
何童崇 21a3c54754 修改BUG增加审核 2021-07-16 11:02:00 +08:00
何童崇 4493711521 增加成果审核页面 2021-07-16 11:00:37 +08:00
何童崇 76b23f88db 修复成果提交时的bug,联调我是创客 2021-07-16 11:00:18 +08:00
何童崇 bca9499844 上传成果修改 2021-07-16 10:59:24 +08:00
何童崇 3137048aed 添加成果内容 2021-07-16 10:58:42 +08:00
何童崇 62b5d86082 修改需求的部分bug及对接成果 2021-07-16 10:58:16 +08:00
何童崇 7a472651f1 修改了需求部分bug 2021-07-16 10:57:24 +08:00
何童崇 99c90295c0 上传我的成果静态页面 2021-07-16 10:57:22 +08:00
何童崇 d7fd642f7f 上传我的需求及 2021-07-16 10:56:55 +08:00
何童崇 97bc41e771 上传创客新增任务及列表代码 2021-07-16 10:56:13 +08:00
何童崇 6156d98af2 新增创客空间 2021-07-16 10:54:47 +08:00
caishi 6facc3e65f title 2021-07-16 10:40:44 +08:00
何童崇 c8f6891239 修改bug 2021-07-16 10:13:27 +08:00
何童崇 11b5c87888 修改bug,新增管理路由 2021-07-16 09:13:05 +08:00
caishi 2f538ff394 keywords desc 2021-07-15 16:35:59 +08:00
何童崇 48a153d434 上传修改bug 2021-07-15 14:33:14 +08:00
何童崇 9c3ecabf47 增加管理员统筹所有任务的列表 2021-07-14 20:19:43 +08:00
何童崇 f18070da47 修改bug 2021-07-14 14:42:05 +08:00
何童崇 1e87e0c8ec 修改bug 2021-07-14 10:45:58 +08:00
何童崇 bec68aa090 修改bug 2021-07-14 10:35:05 +08:00
何童崇 aed83337fa 增加上传支付凭证,修改bug 2021-07-14 09:09:30 +08:00
何童崇 e5b7110090 修改bug 2021-07-13 16:29:56 +08:00
何童崇 716916b7b6 修改bug 2021-07-13 11:38:08 +08:00
何童崇 b5ccdbfcd6 修改bug 2021-07-13 10:53:19 +08:00
何童崇 1e7df569e6 上传协议部分及bug修改 2021-07-12 14:11:55 +08:00
何童崇 701d9dfc99 对接上传协议及确认支付 2021-07-10 21:56:04 +08:00
何童崇 e7b3a01c47 修改bug 2021-07-10 11:23:30 +08:00
何童崇 b19c084ac8 修改bug 2021-07-10 10:40:10 +08:00
何童崇 1d4bb3f4fc 修改bug 2021-07-10 10:00:19 +08:00
何童崇 e0b267bd6c 修改bug 2021-07-09 14:35:14 +08:00
何童崇 4bf4aa7c78 上传申诉材料审核bug 2021-07-08 17:33:51 +08:00
何童崇 e3643be01b 上传申诉材料审核及修改成果对接代码样式 2021-07-08 16:07:52 +08:00
何童崇 9c8add0152 上传申诉材料审核及修改成果对接代码 2021-07-08 15:49:38 +08:00
何童崇 edb7099131 新增佐证上传与审核 2021-07-06 21:28:38 +08:00
何童崇 cce818d4e0 修改BUG增加审核 2021-07-06 14:46:19 +08:00
caishi 909663bc47 新增招标公告 2021-07-02 13:58:22 +08:00
caishi 9ea9da9672 nav没有显示,被清空 2021-07-02 11:54:49 +08:00
何童崇 97bd7673e1 新增招标公告类型 2021-07-02 10:57:35 +08:00
何童崇 2aa89426ad 增加成果审核页面 2021-07-01 17:09:41 +08:00
何童崇 5131dacf05 修复成果提交时的bug,联调我是创客 2021-07-01 10:58:03 +08:00
何童崇 6b63cd25aa 上传成果修改 2021-06-28 17:35:05 +08:00
caishi 8162b8b908 修改头部选中样式 2021-06-28 16:02:25 +08:00
何童崇 7a59d43eec 修改头部选中样式 2021-06-28 15:56:48 +08:00
caishi 008ba8d1de 修改富文本样式及文件下载路径 2021-06-28 14:07:33 +08:00
何童崇 98a9344b02 修改样式 2021-06-28 14:05:12 +08:00
何童崇 b8342288dd 修改富文本样式 2021-06-28 13:56:23 +08:00
何童崇 09e81b9e78 添加成果内容 2021-06-28 11:53:37 +08:00
caishi 7cf5e23cb9 修改指向后台的url及优化代码结构 2021-06-25 14:11:30 +08:00
何童崇 8594168d33 修改指向后台的url及优化代码结构 2021-06-25 13:15:35 +08:00
caishi 2d7c6cb82d 合并公告模块 2021-06-24 17:11:12 +08:00
何童崇 c36925c136 新增公告模块代码 2021-06-24 17:01:05 +08:00
何童崇 6ec6ab2308 修改需求的部分bug及对接成果 2021-06-23 08:54:04 +08:00
何童崇 4109e4b07e 修改了需求部分bug 2021-06-21 13:43:31 +08:00
何童崇 216e984740 上传我的成果静态页面 2021-06-19 16:37:35 +08:00
何童崇 92f3934d5e 上传我的需求及 2021-06-18 17:07:10 +08:00
何童崇 2ed7e0d4c4 上传创客新增任务及列表代码 2021-06-17 15:28:13 +08:00
caishi 6cfe81aea3 meta keywords 2021-06-16 17:15:51 +08:00
何童崇 4dcbd51482 新增创客空间 2021-06-15 15:56:44 +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 c32b333bc2 Merge branch 'dev_m_copy' into dev_military
# Conflicts:
#	src/forge/DevOps/Index.jsx
#	src/forge/Index.js
#	src/forge/Main/Detail.js
#	src/forge/Merge/MessageCount.js
#	src/forge/Settings/Collaborator.js
#	src/forge/Settings/CollaboratorMember.jsx
#	src/forge/users/watch_users.js
#	src/modules/tpm/NewHeader.js
2021-04-12 15:57:30 +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 c965da7dd5 默认 2021-03-22 09:47:34 +08:00
caishi b44399968f 协作者分页 2021-03-22 09:46:30 +08:00
caishi 2591f28ccc bug 2021-03-22 09:37:37 +08:00
caishi 5530e8c723 diff-查看文件 2021-03-10 10:48:08 +08:00
caishi fa26dc9fa5 diff-查看文件 2021-03-10 10:47:23 +08:00
caishi 4cf40f9dfc update 2021-03-09 15:33:18 +08:00
caishi 2c034f5dff 修改资料-url 2021-03-09 14:09:06 +08:00
caishi d68d8318c1 account 2021-03-09 13:59:02 +08:00
caishi 41ae6b1f8d 修改资料练级 2021-03-09 13:55:02 +08:00
caishi a6e2171fca filedetail 2021-03-09 11:49:48 +08:00
caishi 916cc293ac url 2021-03-08 11:15:05 +08:00
caishi 5565eac601 nodata 2021-03-08 09:55:12 +08:00
caishi 860b71c7c6 外围贡献者 2021-03-04 17:02:20 +08:00
caishi f1c2841fe0 logo 2021-03-03 16:46:45 +08:00
caishi c6d5078d42 Merge branch 'develop' into dev_m_copy 2021-03-02 11:43:58 +08:00
caishi ebe2d625fa Merge branch 'dev_military' of https://git.trustie.net/jasder/forgeplus-react into dev_military 2021-03-02 11:43:26 +08:00
caishi b5e1a91af5 style 2021-03-02 11:43:19 +08:00
caishi 4b8d72a6eb Merge branch 'develop' into dev_m_copy 2021-03-02 10:52:09 +08:00
caishi f0e1858cd4 update 2021-03-01 16:01:26 +08:00
caishi a92468953a style 2021-03-01 11:11:30 +08:00
caishi fdab967b6a Merge branch 'develop' into dev_m_copy
# Conflicts:
#	src/AppConfig.js
#	src/forge/DevOps/Index.jsx
#	src/forge/Index.js
#	src/forge/Main/Detail.js
#	src/forge/Main/IndexItem.js
#	src/forge/Merge/MessageCount.js
#	src/forge/Settings/Collaborator.js
#	src/forge/users/watch_users.js
#	src/modules/tpm/NewHeader.js
2021-03-01 10:21:14 +08:00
caishi 7e8929f166 appconfig 2021-03-01 10:17:38 +08:00
caishi 0a39ed80da Merge branch 'dev_m_copy' into dev_military
# Conflicts:
#	src/forge/Merge/MessageCount.js
2021-03-01 10:11:48 +08:00
caishi 5ed44f1d63 特殊项目审核 2021-02-26 16:58:31 +08:00
caishi 64e639ebea update 2021-02-26 11:53:08 +08:00
caishi 3fb9eb40f3 watch_users 2021-02-25 17:07:35 +08:00
caishi efc2443bb8 列表查询 2021-02-25 16:58:59 +08:00
caishi 2c3d917bd4 mygetHelmetapi2 2021-02-09 10:44:41 +08:00
caishi 617f139f52 fault 2021-02-04 15:13:08 +08:00
caishi de550d5f42 remove 2021-02-04 15:05:37 +08:00
caishi f12230dc91 url 2021-02-04 15:02:26 +08:00
caishi 1df2639cd5 pulls权限 2021-01-13 15:47:10 +08:00
caishi c746e9e634 pulls 2021-01-13 14:21:12 +08:00
caishi d8d464a332 pullrequest 2021-01-12 17:45:54 +08:00
caishi 83e337b2e9 pullrequest 2021-01-12 17:44:46 +08:00
caishi 5a6b7bd717 update 2021-01-12 09:30:30 +08:00
caishi c68a3dbd6f 项目成员访问特殊开源许可证项目不用上传文件 2021-01-11 18:14:59 +08:00
caishi 350f9426ea 工作流 2021-01-05 10:33:58 +08:00
caishi 5bda100e32 update 2021-01-05 09:23:58 +08:00
caishi dde7fa730a 同上-update 2021-01-04 16:43:15 +08:00
caishi 3f8f1b8083 特殊项目申请列表 2021-01-04 16:28:19 +08:00
caishi 6eef4bd09e 信息 2020-12-31 15:16:26 +08:00
caishi 0dcaea3db4 检测是否上传了文件 2020-12-31 14:13:31 +08:00
caishi 033134fa83 json 2020-12-29 16:28:08 +08:00
caishi 1bab0b01f7 debug 2020-12-29 16:18:20 +08:00
caishi 7b2f233cae 隐藏devops 2020-12-29 11:38:08 +08:00
caishi 2ecdd73c7f 外围贡献者 2020-12-28 20:42:12 +08:00
caishi 4e7a2fa3d7 Merge branch 'develop' into dev_m_copy
# Conflicts:
#	public/css/edu-purge.css
#	public/css/iconfont.css
#	src/AppConfig.js
#	src/forge/Main/CoderRootDirectory.js
#	src/forge/Main/Index.js
#	src/forge/Main/list.css
#	src/forge/Newfile/m_editor.js
#	src/forge/css/index.scss
#	src/modules/tpm/NewHeader.js
#	src/modules/tpm/TPMIndex.css
2020-12-24 17:50:26 +08:00
caishi 91662e2e3e back 2020-12-24 15:37:40 +08:00
caishi a7c3dee7e3 2020-11-26 10:55:03 +08:00
sylor_huang@126.com c2129c994a change Header5 2020-09-16 15:14:46 +08:00
sylor_huang@126.com e968ece34c Change Header4 2020-09-16 15:08:54 +08:00
sylor_huang@126.com 70d407963e Change Header2 2020-09-16 14:58:37 +08:00
sylor_huang@126.com 00ccba74a1 Change Header1 2020-09-16 14:48:58 +08:00
sylor_huang@126.com 0790abb6f9 Change Header 2020-09-16 14:39:13 +08:00
caishi 6c4c161a1b Merge branch 'dev_military' of https://git.trustie.net/jasder/forgeplus-react into dev_military
# Conflicts:
#	src/AppConfig.js
2020-09-15 17:21:42 +08:00
caishi 65a2bd43cf route 2020-09-15 17:21:10 +08:00
sylor_huang@126.com 10f813a443 Change banner 2020-09-15 09:38:57 +08:00
sylor_huang@126.com e79ec30c81 Change Index Category8 2020-09-14 14:53:09 +08:00
sylor_huang@126.com 2a7fea3612 Change Index Category6 2020-09-14 14:44:41 +08:00
sylor_huang@126.com cc46a3ac30 Change Index Category5 2020-09-14 14:08:03 +08:00
sylor_huang@126.com cca5f98c9b Change Index Category4 2020-09-14 11:50:45 +08:00
sylor_huang@126.com d4535005c8 Change Index Category3 2020-09-14 11:28:20 +08:00
sylor_huang@126.com 73d128e0c9 Change Resume 2020-09-14 09:26:46 +08:00
sylor_huang@126.com f09457a0ac Change Index Category 2020-09-11 18:49:41 +08:00
sylor_huang@126.com 78c218b12b Change Index Category 2020-09-11 18:45:34 +08:00
sylor_huang@126.com d9f87fdd18 Change Index Page 2020-09-11 18:31:31 +08:00
caishi 33c3395221 getpath 2020-08-27 10:14:07 +08:00
sylor_huang@126.com 74d26a40d3 Change Edit Url 2020-08-24 11:37:51 +08:00
sylor_huang@126.com 3f78ed249c Fix:Issues 2020-08-21 11:29:05 +08:00
caishi 07e1525f09 router 2020-08-20 18:10:40 +08:00
sylor_huang@126.com a9161b86a2 Change 2020-08-20 15:01:01 +08:00
sylor_huang@126.com e0e6cdcc79 Fix: Issues 2020-08-20 11:57:36 +08:00
sylor_huang@126.com 3b0c708d82 Fix: Issues 2020-08-20 11:44:27 +08:00
sylor_huang@126.com 0922df3875 Hide LoginDialog 2020-08-19 18:18:03 +08:00
sylor_huang@126.com ad3fe09cfb Merge branch 'newVersion_forge' into dev_military 2020-08-18 17:43:24 +08:00
sylor_huang@126.com 91f4327eb4 Change 2020-08-18 17:43:04 +08:00
sylor_huang@126.com f2f910b5e4 Add Dun Check For Project 2020-08-18 10:36:33 +08:00
sylor_huang@126.com 85d924db70 Fix: Add New File Language Api Wrong6 2020-08-13 11:56:39 +08:00
Jasder f1614a4b62 Delete url 2020-08-10 11:27:41 +08:00
Jasder 2fa71241db FIX 更改header的背景色 2020-08-09 23:24:12 +08:00
Jasder 13c6556574 FIX 更改logo导航链接 2020-08-09 23:20:08 +08:00
caishi 5601b71937 junke 2020-08-09 23:08:11 +08:00
Jasder 1a024f8011 FIX 去掉使用手册 2020-08-09 22:20:51 +08:00
426 changed files with 30862 additions and 8925 deletions

3
.gitignore vendored
View File

@ -86,3 +86,6 @@ typings/
.DS_Store
.idea/*
package.json
package-lock.json

1179
.idea/workspace.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
<h3>前端react环境安装</h3>
<p>1、 安装node v6.9.x此安装包含了node和npm。</p>
<p>1、 安装node v12.10.x此安装包含了node和npm。</p>
<p>2、 安装cnpm命令行 npm install -g cnpm --registry=https://registry.npm.taobao.org</p>
<p>3、 安装依赖的js库public/react目录下<即项目package.json所在目录>,开启命令行): cnpm install</p>
<p>4、 如果你的ruby服务使用的是3000端口则需要在package.json中修改"port"参数的值</p>

34
add.txt
View File

@ -1,34 +0,0 @@
新版tpi改动的文件
Index.js
contex/TPIContextProvider.js
page/main/LeftViewContainer.js
taskList/TaskList.js
TPMIndexHOC.js
App.js
CodeRepositoryViewContainer.js
Index.js
choose={context.chooses}
TPIContextProvider.js
LeftViewContainer.js
TaskList.js
TPMIndexHOC.js
MainContentContainer
rep_content返回值多了一层 {content: '...'}
TODO
待同步
1、timer图标样式更换
index.html
WebSSHTimer.css
WebSSHTimer.js

View File

@ -101,9 +101,13 @@ module.exports = {
extensions: [".web.js", ".mjs", ".js", ".json", ".web.jsx", ".jsx"],
alias: {
educoder: __dirname + "/../src/common/educoder.js",
src: path.join(paths.appSrc), // 整个源代码目录
forge: path.join(paths.appSrc, 'forge'),
military: path.join(paths.appSrc, 'military'),
// Support React Native Web
// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
"react-native": "react-native-web",
'react-dom': '@hot-loader/react-dom',
},
plugins: [
// Prevents users from importing files from outside of src/ (or node_modules/).

View File

@ -19,8 +19,7 @@ const getClientEnvironment = require("./env");
let publicPath = "/react/build/";
const publicUrl = publicPath.slice(0, -1);
// const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
const shouldUseSourceMap = process.env.NODE_ENV !== "production";
const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
const env = getClientEnvironment(publicPath);
// This is the production configuration.
@ -55,8 +54,7 @@ module.exports = {
},
bail: true,
mode: "production",
// devtool: false, //测试版
devtool: shouldUseSourceMap?'source-map':false,
devtool: false, //测试版
entry: [require.resolve("./polyfills"), paths.appIndexJs],
output: {
path: paths.appBuild,
@ -89,6 +87,9 @@ module.exports = {
extensions: [".web.js", ".mjs", ".js", ".json", ".web.jsx", ".jsx"],
alias: {
educoder: __dirname + "/../src/common/educoder.js",
src: path.join(paths.appSrc),
forge: path.join(paths.appSrc, 'forge'),
military: path.join(paths.appSrc, 'military'),
// Support React Native Web
// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
"react-native": "react-native-web",

14
jsconfig.json Normal file
View File

@ -0,0 +1,14 @@
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"educoder": ["./src/common/educoder.js"],
"forge":["./src/forge"],
"military":["./src/military"],
}
},
"exclude": [
"node_modules",
"build"
]
}

12062
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@
"antd": "^3.26.15",
"array-flatten": "^2.1.2",
"autoprefixer": "7.1.6",
"axios": "^0.18.1",
"axios": "^0.24.0",
"babel-eslint": "7.2.3",
"babel-jest": "20.0.3",
"babel-loader": "7.1.2",
@ -24,11 +24,10 @@
"classnames": "^2.2.5",
"clipboard": "^2.0.8",
"code-prettify": "^0.1.0",
"codemirror": "^5.53.0",
"codemirror": "^5.64.0",
"connected-react-router": "4.4.1",
"cross-env": "^7.0.3",
"css-loader": "^3.5.2",
"dompurify": "^2.0.15",
"dompurify": "^2.3.3",
"dotenv": "4.0.0",
"dotenv-expand": "4.2.0",
"echarts": "^4.9.0",
@ -51,7 +50,7 @@
"js-base64": "^2.5.2",
"js2wordcloud": "^1.1.12",
"katex": "^0.11.1",
"lodash": "^4.17.15",
"lodash": "^4.17.21",
"loglevel": "^1.6.8",
"marked": "^1.0.0",
"material-ui": "^1.0.0-beta.40",
@ -84,6 +83,8 @@
"react-color": "^2.18.0",
"react-content-loader": "^3.1.1",
"react-cookies": "^0.1.1",
"react-countup": "^6.1.0",
"react-cropper": "^2.1.8",
"react-datepicker": "^2.14.1",
"react-dev-utils": "^9.2.0-next.80",
"react-dom": "^16.13.1",
@ -114,6 +115,7 @@
"styled-components": "^4.4.1",
"sw-precache-webpack-plugin": "0.11.4",
"url-loader": "0.6.2",
"wangeditor-for-react": "^1.4.0",
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3",
"webpack-manifest-plugin": "^2.2.0",
@ -191,6 +193,7 @@
"port": "3007",
"devDependencies": {
"@babel/runtime": "7.0.0-beta.51",
"@hot-loader/react-dom": "^16.14.0",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.0",
"babel-plugin-import": "^1.13.0",
@ -201,6 +204,7 @@
"babel-preset-stage-2": "^6.24.1",
"compression-webpack-plugin": "^1.1.12",
"concat": "^1.0.3",
"cross-env": "^7.0.3",
"happypack": "^5.0.1",
"mockjs": "^1.1.0",
"node-sass": "^4.12.0",

View File

@ -1,6 +1,5 @@
/*头部导航条样式---2018-03-19--by-cs*/
.newHeader {
background: #24292D !important;
width: 100%;
height: 60px !important;
min-width: 1200px;

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 {
font-size: 14px;
line-height: 2.0;
background: #fafafa;
font-family: "Microsoft YaHei", "SimSun";
font-family: "iconfont";
color: #05101a;
height: 100%;
position: relative;
@ -3939,9 +3945,13 @@ html>body #ajax-indicator {
margin-left: 10px;
color: #2FC25B;
}
.privateTag.red{
color: #FF6832;
border:1px solid #FF6832;
}
.head-nav {
text-align: center;
height: 70px;
height: 58px;
box-sizing: border-box;
overflow: hidden;
text-overflow: ellipsis;
@ -3953,25 +3963,28 @@ html>body #ajax-indicator {
position: absolute;
top: 0px;
z-index: 3;
height: 70px;
height: 58px;
box-sizing: border-box;
}
.head-nav ul#header-nav li {
float: left;
height: 70px;
line-height: 70px;
height: 58px;
line-height: 58px;
cursor: pointer;
position: relative;
font-size: 16px;
padding-right:40px;
margin-right: 40px;
}
.head-nav ul#header-nav li:first-child{
margin-left: 20px;
}
.head-nav ul#header-nav li a {
display: block;
height: 100%;
width: 100%;
color: #333;
color: #fff;
font-size: 16px;
}
@ -3983,10 +3996,6 @@ html>body #ajax-indicator {
margin-right: 0px
}
.head-nav ul#header-nav li.active{
/* background-color: #3B3B3B; */
}
.head-nav ul#header-nav li p:hover {
color: #cccccc;

View File

@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 2340181 */
src: url('iconfont.woff2?t=1634881729644') format('woff2'),
url('iconfont.woff?t=1634881729644') format('woff'),
url('iconfont.ttf?t=1634881729644') format('truetype');
src: url('iconfont.woff2?t=1640585290619') format('woff2'),
url('iconfont.woff?t=1640585290619') format('woff'),
url('iconfont.ttf?t=1640585290619') format('truetype');
}
.iconfont {
@ -13,6 +13,166 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-shengming:before {
content: "\e90b";
}
.icon-chenggong1:before {
content: "\e907";
}
.icon-a-bitian2x1:before {
content: "\e908";
}
.icon-xiala1:before {
content: "\e909";
}
.icon-xiala2:before {
content: "\e90a";
}
.icon-jiantou1:before {
content: "\e905";
}
.icon-zhangjieicon:before {
content: "\e8fe";
}
.icon-chengyuan1:before {
content: "\e903";
}
.icon-a-shangchuan2x:before {
content: "\e8f9";
}
.icon-shanchu7:before {
content: "\e8fa";
}
.icon-zuohuabeifen:before {
content: "\e8fb";
}
.icon-a-bianji11:before {
content: "\e8f4";
}
.icon-a-bitian2x:before {
content: "\e8f5";
}
.icon-a-zuohua2x:before {
content: "\e8f7";
}
.icon-lianjie3:before {
content: "\e8f8";
}
.icon-zhishitupu:before {
content: "\e8fc";
}
.icon-jisuanji1:before {
content: "\e8fd";
}
.icon-dianzi1:before {
content: "\e8ff";
}
.icon-junshililun1:before {
content: "\e900";
}
.icon-ruanjiangongcheng1:before {
content: "\e901";
}
.icon-yixue1:before {
content: "\e902";
}
.icon-tongxin1:before {
content: "\e904";
}
.icon-zhengcefagui1:before {
content: "\e906";
}
.icon-dashuju:before {
content: "\e8f3";
}
.icon-rengongzhineng:before {
content: "\e8f6";
}
.icon-a-shuangyinhao12x:before {
content: "\e8f2";
}
.icon-dingbu:before {
content: "\e8ee";
}
.icon-bangzhu1:before {
content: "\e8ef";
}
.icon-yijianfankui2:before {
content: "\e8f0";
}
.icon-fenxiang:before {
content: "\e8f1";
}
.icon-dizhi:before {
content: "\e8eb";
}
.icon-youxiang1:before {
content: "\e8ec";
}
.icon-dianhuaicon:before {
content: "\e8ed";
}
.icon-tianjiaicon:before {
content: "\e8e8";
}
.icon-lingshengicon:before {
content: "\e8ea";
}
.icon-gengduoicon:before {
content: "\e8e5";
}
.icon-shijianicon:before {
content: "\e8e7";
}
.icon-mimaicon:before {
content: "\e8e1";
}
.icon-gouicon:before {
content: "\e8e2";
}
.icon-zhankaiicon:before {
content: "\e8e3";
}
.icon-wenjian7:before {
content: "\e8e0";
}

File diff suppressed because one or more lines are too long

View File

@ -5,6 +5,286 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "12505154",
"name": "声明",
"font_class": "shengming",
"unicode": "e90b",
"unicode_decimal": 59659
},
{
"icon_id": "26470597",
"name": "成功",
"font_class": "chenggong1",
"unicode": "e907",
"unicode_decimal": 59655
},
{
"icon_id": "26470599",
"name": "必填@2x",
"font_class": "a-bitian2x1",
"unicode": "e908",
"unicode_decimal": 59656
},
{
"icon_id": "26470600",
"name": "下拉",
"font_class": "xiala1",
"unicode": "e909",
"unicode_decimal": 59657
},
{
"icon_id": "26470601",
"name": "下拉2",
"font_class": "xiala2",
"unicode": "e90a",
"unicode_decimal": 59658
},
{
"icon_id": "26363219",
"name": "箭头",
"font_class": "jiantou1",
"unicode": "e905",
"unicode_decimal": 59653
},
{
"icon_id": "26359564",
"name": "章节icon ",
"font_class": "zhangjieicon",
"unicode": "e8fe",
"unicode_decimal": 59646
},
{
"icon_id": "26359565",
"name": "成员",
"font_class": "chengyuan1",
"unicode": "e903",
"unicode_decimal": 59651
},
{
"icon_id": "26325702",
"name": "上传@2x",
"font_class": "a-shangchuan2x",
"unicode": "e8f9",
"unicode_decimal": 59641
},
{
"icon_id": "26325703",
"name": "删除 ",
"font_class": "shanchu7",
"unicode": "e8fa",
"unicode_decimal": 59642
},
{
"icon_id": "26325704",
"name": "左滑备份",
"font_class": "zuohuabeifen",
"unicode": "e8fb",
"unicode_decimal": 59643
},
{
"icon_id": "26325698",
"name": "编辑 (1)",
"font_class": "a-bianji11",
"unicode": "e8f4",
"unicode_decimal": 59636
},
{
"icon_id": "26325699",
"name": "必填@2x",
"font_class": "a-bitian2x",
"unicode": "e8f5",
"unicode_decimal": 59637
},
{
"icon_id": "26325700",
"name": "左滑@2x",
"font_class": "a-zuohua2x",
"unicode": "e8f7",
"unicode_decimal": 59639
},
{
"icon_id": "26325701",
"name": "链接",
"font_class": "lianjie3",
"unicode": "e8f8",
"unicode_decimal": 59640
},
{
"icon_id": "25748537",
"name": "知识图谱",
"font_class": "zhishitupu",
"unicode": "e8fc",
"unicode_decimal": 59644
},
{
"icon_id": "25748551",
"name": "计算机",
"font_class": "jisuanji1",
"unicode": "e8fd",
"unicode_decimal": 59645
},
{
"icon_id": "25748553",
"name": "电子",
"font_class": "dianzi1",
"unicode": "e8ff",
"unicode_decimal": 59647
},
{
"icon_id": "25748554",
"name": "军事理论",
"font_class": "junshililun1",
"unicode": "e900",
"unicode_decimal": 59648
},
{
"icon_id": "25748555",
"name": "软件工程",
"font_class": "ruanjiangongcheng1",
"unicode": "e901",
"unicode_decimal": 59649
},
{
"icon_id": "25748556",
"name": "医学",
"font_class": "yixue1",
"unicode": "e902",
"unicode_decimal": 59650
},
{
"icon_id": "25748558",
"name": "通信",
"font_class": "tongxin1",
"unicode": "e904",
"unicode_decimal": 59652
},
{
"icon_id": "25748560",
"name": "政策法规",
"font_class": "zhengcefagui1",
"unicode": "e906",
"unicode_decimal": 59654
},
{
"icon_id": "25748528",
"name": "大数据",
"font_class": "dashuju",
"unicode": "e8f3",
"unicode_decimal": 59635
},
{
"icon_id": "25748531",
"name": "人工智能",
"font_class": "rengongzhineng",
"unicode": "e8f6",
"unicode_decimal": 59638
},
{
"icon_id": "25733167",
"name": "双引号(1)@2x",
"font_class": "a-shuangyinhao12x",
"unicode": "e8f2",
"unicode_decimal": 59634
},
{
"icon_id": "25701947",
"name": "顶部",
"font_class": "dingbu",
"unicode": "e8ee",
"unicode_decimal": 59630
},
{
"icon_id": "25701948",
"name": "帮助",
"font_class": "bangzhu1",
"unicode": "e8ef",
"unicode_decimal": 59631
},
{
"icon_id": "25701949",
"name": "意见反馈",
"font_class": "yijianfankui2",
"unicode": "e8f0",
"unicode_decimal": 59632
},
{
"icon_id": "25701950",
"name": "分享",
"font_class": "fenxiang",
"unicode": "e8f1",
"unicode_decimal": 59633
},
{
"icon_id": "25580217",
"name": "地址",
"font_class": "dizhi",
"unicode": "e8eb",
"unicode_decimal": 59627
},
{
"icon_id": "25580218",
"name": "邮箱",
"font_class": "youxiang1",
"unicode": "e8ec",
"unicode_decimal": 59628
},
{
"icon_id": "25580219",
"name": "电话icon",
"font_class": "dianhuaicon",
"unicode": "e8ed",
"unicode_decimal": 59629
},
{
"icon_id": "25284174",
"name": "添加icon",
"font_class": "tianjiaicon",
"unicode": "e8e8",
"unicode_decimal": 59624
},
{
"icon_id": "25284175",
"name": "铃声icon",
"font_class": "lingshengicon",
"unicode": "e8ea",
"unicode_decimal": 59626
},
{
"icon_id": "25204490",
"name": "更多icon",
"font_class": "gengduoicon",
"unicode": "e8e5",
"unicode_decimal": 59621
},
{
"icon_id": "25204491",
"name": "时间icon",
"font_class": "shijianicon",
"unicode": "e8e7",
"unicode_decimal": 59623
},
{
"icon_id": "25188228",
"name": "密码icon",
"font_class": "mimaicon",
"unicode": "e8e1",
"unicode_decimal": 59617
},
{
"icon_id": "25188229",
"name": "钩icon",
"font_class": "gouicon",
"unicode": "e8e2",
"unicode_decimal": 59618
},
{
"icon_id": "25188230",
"name": "展开icon",
"font_class": "zhankaiicon",
"unicode": "e8e3",
"unicode_decimal": 59619
},
{
"icon_id": "24656750",
"name": "文件",

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

BIN
public/favicon.back.ico Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

@ -2,10 +2,11 @@
<html lang="zh-CN" class="notranslate translated-ltr" translate="no">
<head>
<meta charset="utf-8">
<meta name=”Keywords” Content=”trustie,trustieforge,forge,确实让创建更美好,协同开发平台″>
<meta name=”Keywords” Content=”TrustieOpenSourceProject″>
<meta name=”Keywords” Content=”issue,bug,tracker,软件工程,课程实践″>
<meta name=”Description” Content=”持续构建协同、共享、可信的软件创建生态开源创作与软件生产相结合,支持大规模群体开展软件协同创新活动”>
<title>红山开源社区</title>
<meta name="keywords" content="红山开源,创客空间,群智共享">
<meta name="keywords" content="红山开源社区,开源开放,众创,论坛">
<meta name="keywords" content="issue,bug,tracker">
<meta name="description" content="红山开源是一个依托互联网群体智慧实现世界范围内资源深度融合、开放共享和协同创新的开源社区" />
<meta name="theme-color" content="#000000">
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">

View File

@ -1,172 +0,0 @@
其他的文档位置:
/educoder/public/react/public/js/readme.txt 关于js_min_all
/educoder/educoder/public/react/scripts/readme-cdn.txt 关于CDN
/educoder/public/react/src/modules/page/readme.txt 关于TPI
/educoder/public/editormd/lib/readme-marked.txt 关于md编辑器 marked.js
1、 安装node v6.9.x此安装包含了node和npm。
2、 安装cnpm命令行 npm install -g cnpm --registry=https://registry.npm.taobao.org
3、 安装依赖的js库public/react目录下<即项目package.json所在目录>,开启命令行): cnpm install
4、 如果你的ruby服务使用的是3000端口则需要在package.json中修改"port"参数的值
5、 启动服务(命令行-目录同3 npm start
6、 build初始化 npm run build
注意:
1、cnpm install 之前先需要修改下ruby mine的一个settings防止ruby mine对node_modules目录里的内容建索引详情见线上文档-react开发环境搭建
线上文档-react开发环境搭建 地址: https://www.trustie.net/boards/6862/topics/46425
2、package.json中配置
"proxy": "http://localhost:3000",
"port": "3007"
目前暂时必须写为和上面的一样ruby服务端口为3000node服务端口为3007当当前端口为3007时程序会将axios发出的请求转到localhost:3000上进行跨域请求。
3、静态js加载问题
editormd源码改动注释掉了564行 加载codemirror/codemirror.min的js代码。因为codemirror 已经加载了codemirror对象会带有插件重复加载会覆盖全局codemirror对象使得之前加载的插件失效
----------------------------------------------------------------------------------------------
React开发相关知识点
需要了解的ES6的知识 https://www.trustie.net/boards/6862/topics/46427
----------------------------------------------------------------------------------------------
新加入的lib有 axios、material-ui、lodash、classnames、moment、immutability-helper
rc-tree、rc-form 、rc-rate、rc-pagination、rc-select 、showdown
考虑替代删除确认弹出框的组件http://react-component.github.io/tooltip/examples/onVisibleChange.html
----------------------------------------------------------------------------------------------
TPI State整理 START
----------------------------------------------------------------------------------------------
TPIContextProvider 详情接口的所有state
Index.js
taskListLoading
challenges
challengesDrawerOpen
MainContentContainer.js
repositoryCode: '',
currentPath: '', // 当前所选的path可能是一个只读的path只读path的话challenge.athIndex为-1
isEditablePath // 是否是可以编辑的path
open: false, // 繁忙等级等提示用Dialog TODO 考虑重构封装到根组件
gameBuilding: false, // 评测中标志
codeStatus: 2, // 0 已修改 1 保存中 2 已保存 3 保存失败
codeLoading: false, // code加载中
resetCodeDialogOpen: false, // TODO考虑重构封装到根组件
resetPassedCodeDialogOpen: false, // TODO考虑重构封装到根组件
LeftViewContainer.js
tabIndex: 0, 页签index
dialogOpen: false,
gameAnswer: '', 答案
snackbarOpen: false,
comments: [], 评论
comment_count_without_reply: 0, 评论数量 TODO 和详情接口字段重复
// 默认pageSize为10
currentPage: 1, 评论分页
loadingComments: true, 评论加载中
gotNewReply: false, 新的回复
CodeRepositoryViewContainer.js
drawerOpen: false,
loadingFirstRepoFiles: false, drawer里的loading状态
fileTreeData: "", 文件树
codeRepositoryViewExpanded: false, 展开状态
CodeEvaluateView.js
testSetsInitedArray: testSetsExpandedArrayInitVal.slice(0), 测试集是否初始化标志
evaluateViewExpanded: false,
tabIndex: 1, 页签index
----------------------------------------------------------------------------------------------
TPI State整理 END
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
重要TPI实现时修改的js库的记录 START
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
重要TPI实现时修改的js库的记录 END
----------------------------------------------------------------------------------------------
create_kindeditor.js __isR 表示是react环境react环境下采用事件通知react组件来处理
if (window['__isR'] === true) {
$(document).trigger("onReply", { commentContent:tContents, id:id, editor:params.editor } );
} else {
params.form.submit();
}
editormd.min.js 直接注释掉了codemirror.min的加载应该改成有codeMirror了则不加载
// codemirror 已经加载了codemirror会有插件重复加载会使得之前加载的插件失效
// editormd.loadScript(loadPath + "codemirror/codemirror.min", function() {
对应提交项
Revision: 73d95ce266d5d7e55a3a88d08d1247b3a08c7caf
Date: 2018/4/2 16:12:21
Message: 切下一题时更新左侧editormd里的内容更新右侧codemirror内容。
js_min_all.js 最后面手动加入了若干js代码还没做分离、再合并处理 date:180507
is_cdn_link tpi_html_show方法
----------------------------------------------------------------------------------------------
TPM使用react实现的利弊 START
----------------------------------------------------------------------------------------------
1、全部使用react重写
做法第一屏使用新接口之前的js脚本还是继续使用有必要的话需要局部刷新的将部分jquery实现改为react实现
利:
tpi中评论组件、文件树组件方便复用
js、css库管理方便
暂时不依赖于react的状态管理
之前的ajax请求还是可以暂时复用
弊:
接口评估?
rails模板要改成jsx语法
头部功能区域、底部静态链接区域会存在重复代码 react版和非react版
codemirror等组件的使用会不会有问题
学习成本
目前决定新页面或者评论组件所在页面使用react实现
----------------------------------------------------------------------------------------------
TPM使用react实现的利弊 END
----------------------------------------------------------------------------------------------
其他方式comments组件build到新入口后将代码copy到rails页面
----------------------------------------------------------------------------------------------
不错的库 START
----------------------------------------------------------------------------------------------
https://livicons.com/icons-original -- 收费 动画icon
https://github.com/maxwellito/vivus -- 让SVG标签动起来
http://ianlunn.github.io/Hover/ -- hover 动画
https://github.com/legomushroom/mojs
https://github.com/juliangarnier/anime --js动画
https://codepen.io/juliangarnier/pen/gmOwJX
https://github.com/daneden/animate.css
A responsive tour snippet, with a step-by-step guide(onboarding) to help users understand how to use your website.
https://github.com/sorich87/bootstrap-tour
https://github.com/linkedin/hopscotch
https://github.com/Robophil/Product-Tour
code editor
https://microsoft.github.io/monaco-editor/

View File

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

View File

@ -4,10 +4,10 @@ import { broadcastChannelOnmessage, isDev, queryString } from 'educoder';
import { notification } from 'antd';
import './index.css';
let message501 = false;
broadcastChannelOnmessage('refreshPage', () => {
window.location.reload();
window.location.reload()
})
function locationurl(list) {
@ -32,11 +32,11 @@ export function initAxiosInterceptors(props) {
// 判断网络是否连接
initOnlineOfflineListener();
var proxy = "https://testforgeplus.trustie.net";
var proxy = "http://192.168.1.40:3000";
//响应前的设置
axios.interceptors.request.use(
config => {
if(config.url.indexOf("http") !== -1) {
if(config.url.substr(0, 4) === "http") {
return config
}
requestProxy(config);
@ -68,6 +68,8 @@ export function initAxiosInterceptors(props) {
if (response.data.status === -1) {
if (window.location.pathname.startsWith('/tasks/')) {
props.showSnackbar(response.data.message || '服务器异常,请联系管理员。')
} else if(window.location.pathname.startsWith('/login') || window.location.pathname.startsWith('/register') || window.location.pathname.startsWith('/resetPassword')) {
return response;
} else {
notification.open({
message: "提示",

View File

@ -13,7 +13,7 @@ export function handleDateString(dateString) {
if (miniute < 30 || miniute == 60) {
return [ar[0], '30'].join(':')
}
if (miniute < 60) {
if (miniute < 60) {
// 加一个小时
const tempStr = [ar[0], '00'].join(':');
const format = "YYYY-MM-DD HH:mm";
@ -21,7 +21,7 @@ export function handleDateString(dateString) {
_moment.add(1, 'hours')
return _moment.format(format)
}
return dateString
}
@ -39,64 +39,59 @@ export function getNextHalfHourOfMoment(moment) {
return moment
}
 export function formatSeconds(value) {
export function formatSeconds(value) {
        var theTime = parseInt(value);// 秒
        var middle= 0;// 分
        var hour= 0;// 小时
    
        if(theTime > 60) {
            middle= parseInt(theTime/60);
            theTime = parseInt(theTime%60);
            if(middle> 60) {
                hour= parseInt(middle/60);
                middle= parseInt(middle%60);
            }
        }
        var result = ""+parseInt(theTime)+"秒";
        if(middle > 0) {
if(hour>0){
result = ""+parseInt(middle)+"分";
}else{
result = ""+parseInt(middle)+"分"+result;
}
            
        }
        if(hour> 0) {
            result = ""+parseInt(hour)+"小时"+result;
        }
        return result;
    }
var theTime = parseInt(value);// 秒
var middle = 0;// 分
var hour = 0;// 小时
export function formatDuring(mss){
var days = parseInt(mss / (1000 * 60 * 60 * 24));
var hours = parseInt((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = parseInt((mss % (1000 * 60 * 60)) / (1000 * 60));
// console.log("formatDuringformatDuring");
// console.log(days);
// console.log(hours);
// console.log(minutes);
// console.log(Math.abs(days));
// console.log(Math.abs(hours));
// console.log(Math.abs(minutes));
if (theTime > 60) {
middle = parseInt(theTime / 60);
theTime = parseInt(theTime % 60);
if (middle > 60) {
hour = parseInt(middle / 60);
middle = parseInt(middle % 60);
}
}
var result = "" + parseInt(theTime) + "秒";
if (middle > 0) {
if (hour > 0) {
result = "" + parseInt(middle) + "分";
} else {
result = "" + parseInt(middle) + "分" + result;
}
try {
days = Math.abs(days);
} catch (e) {
}
if (hour > 0) {
result = "" + parseInt(hour) + "小时" + result;
}
return result;
}
}
try {
hours = Math.abs(hours);
} catch (e) {
}
try {
minutes = Math.abs(minutes);
} catch (e) {
export function formatDuring(s) {
s = Math.abs(s);
let days = Math.floor(s / (60 * 60 * 24));
let hours = Math.floor((s % (60 * 60 * 24)) / (60 * 60));
let minutes = Math.floor((s % (60 * 60)) / (60));
let second = Math.floor(s % 60);
}
return days + "天" + hours + "小时" + minutes + "分";
if (days) {
if(hours){
return days + "天" + hours + "小时";
}
return days + "天";
}
if (hours) {
if(minutes){
return hours + "小时" + minutes + "分";
}
return hours + "小时" ;
}
if (minutes) {
return minutes + "分";
}
return second + "秒";
}
/*

View File

@ -3,6 +3,6 @@ export function isDev() {
}
// const isMobile
export const isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
export const isMobile = (/android|webos|iphone|ipad|ipod|blackberry|honor|huawei|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
// const isWeiXin = (/MicroMessenger/i.test(navigator.userAgent.toLowerCase()));

View File

@ -6,12 +6,10 @@ const { Search } = Input;
const $ = window.$;
const isDev = window.location.port == 3007;
const isdev2= window.location.hostname ==='www.educoder.net'
export const TEST_HOST = "https://testforgeplus.trustie.net/"
export const TEST_HOST = "http://192.168.1.40:3000"
export function getImageUrl(path) {
// https://www.educoder.net
// https://testbdweb.trustie.net
// const local = 'http://localhost:3000'
const local = 'https://testforgeplus.trustie.net';
const local = TEST_HOST;
if (isDev) {
return `${local}/${path}`
}
@ -39,7 +37,7 @@ export function getImage(path) {
// https://www.educoder.net
// https://testbdweb.trustie.net
// const local = 'http://localhost:3000'
const local = 'https://testforgeplus.trustie.net/';
const local = TEST_HOST;
if(path.indexOf("http://")===-1){
if (isDev) {
return `${local}/images/${path}`
@ -50,6 +48,27 @@ export function getImage(path) {
}
}
export function getTestImage(path) {
const local = 'http://117.50.100.12:49999';
if(path && path.indexOf("http://")===-1){
if (isDev) {
return `${local}${path}`
}
return `${path}`;
}else{
return path;
}
}
export function getLogoImageUrl(path) {
const local = 'http://117.50.100.12:49999';
if (isDev) {
return `${local}/${path}`
}
return `/${path}`;
}
export function getcdnImageUrl(path) {
// https://www.educoder.net
// https://testbdweb.trustie.net
@ -110,7 +129,7 @@ export function setImagesUrl(path){
}
export function getUrl(path, goTest) {
const local = 'https://testforgeplus.trustie.net'
const local = TEST_HOST;
if (isDev) {
return `${local}${path?path:''}`
}
@ -250,3 +269,40 @@ export function publicSearchs(Placeholder,onSearch,onInputs,onChanges,loadings)
allowClear={true}
></Search>)
}
export function getUrlToken(name, str) {
const reg = new RegExp(`(^|&)${ name}=([^&]*)(&|$)`);
const r = str.substr(1).match(reg);
if (r != null) return decodeURIComponent(r[2]); return null;
}
export function turnbar(str){
let s = str;
if(s && s.length>0){
if(s.indexOf("%")>-1){
s = s.replaceAll('%','_25');
}
if(s.indexOf("#")>-1){
s = s.replaceAll('#','%23');
}
if(s.indexOf("/")>-1){
s = s.replaceAll('/','%2F');
}
}
return s;
}
export function returnbar(str){
let s = str;
if(s && s.length>0){
if(str.indexOf("_25")>-1){
s = s.replaceAll('_25','%');
}
if(s.indexOf("%23")>-1){
s = s.replaceAll('%23','#');
}
if(s.indexOf("%2F")>-1){
s = s.replaceAll('%2F','/');
}
}
return s;
}

View File

@ -6,7 +6,8 @@ export {
getUploadLogoActionUrl as getUploadLogoActionUrl,numFormat as numFormat,
getImageUrl as getImageUrl,getImage as getImage, getmyUrl as getmyUrl, getRandomNumber as getRandomNumber, getUrl as getUrl, publicSearchs as publicSearchs, getRandomcode as getRandomcode, getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl
, getUploadActionUrl as getUploadActionUrl, getUploadActionUrltwo as getUploadActionUrltwo, getUploadActionUrlthree as getUploadActionUrlthree, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth
, getTaskUrlById as getTaskUrlById, TEST_HOST, htmlEncode as htmlEncode, getupload_git_file as getupload_git_file, getcdnImageUrl as getcdnImageUrl
, getTaskUrlById as getTaskUrlById, TEST_HOST, htmlEncode as htmlEncode, getupload_git_file as getupload_git_file, getcdnImageUrl as getcdnImageUrl,getTestImage as getTestImage,
turnbar,returnbar,getUrlToken as getUrlToken
} from './UrlTool';
export { setmiyah as setmiyah } from './Component';

View File

@ -30,7 +30,7 @@ export default ({
cleanToc()
}
rs = rs.replace(/(__special_katext_id_\d+__)/g, (_match, capture) => {
const { type, expression } = math_expressions[capture]
const { type, expression } = math_expressions[capture];
return renderToString(_unescape(expression) || '', { displayMode: type === 'block', throwOnError: false, output: 'html' })
})
rs = rs.replace(/▁/g, "▁▁▁")

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

View File

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

View File

@ -107,6 +107,10 @@
color: black;
cursor: pointer;
}
.change.active{
color: #466AFF !important;
}
.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");
return (
<div className="downMenu">
<div style={{borderBottom:"1px solid #eee"}}>
<div>
<Menu className="urlMenu" selectedKeys={[key]} mode={"horizontal"}>
<Menu.Item key="HTTP" onClick={(e)=>{setKey(e.key)}}>HTTP</Menu.Item>
<Menu.Item key="SSH" onClick={(e)=>{setKey(e.key)}}>SSH</Menu.Item>
{ssh_url && <Menu.Item key="SSH" onClick={(e)=>{setKey(e.key)}}>SSH</Menu.Item>}
</Menu>
<div className="gitAddressClone">
<input type="text" id="copy_rep_content" value={key==="HTTP" ? http_url:ssh_url} />
@ -18,8 +18,8 @@ function CloneAddress({http_url , ssh_url , zip_url , tar_url}) {
</div>
</div>
<Menu className="edu-txt-center">
<Menu.Item><a href={zip_url}>下载 ZIP</a></Menu.Item>
<Menu.Item><a href={tar_url}>下载 TAR.GZ</a></Menu.Item>
{zip_url && <Menu.Item style={{borderTop:"1px solid #eee"}}><a href={zip_url}>下载 ZIP</a></Menu.Item>}
{tar_url && <Menu.Item><a href={tar_url}>下载 TAR.GZ</a></Menu.Item>}
</Menu>
</div>
)

View File

@ -3,6 +3,7 @@ import { Dropdown} from 'antd';
import './branch.scss';
import SelectOverlay from './SelectOverlay';
import { findDOMNode } from 'react-dom';
import { turnbar } from 'educoder';
export default (({ projectsId , branch , owner , changeBranch , branchList , tagflag = true })=>{
const [ showValue , setShowValue ] = useState(branch);
@ -35,7 +36,8 @@ export default (({ projectsId , branch , owner , changeBranch , branchList , tag
function ChangeB(params) {
setVisible(false);
changeBranch(params);
let en = turnbar(params);
changeBranch(en);
}
const menu = (

View File

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

View File

@ -313,17 +313,17 @@ li.ant-menu-item{
}
}
.-task-sidebar>div {
height: 40px;
line-height: 40px;
height: 48px;
line-height: 48px;
box-sizing: border-box;
width: 40px;
width: 48px;
color: #999;
font-size: 20px;
text-align: center;
margin-bottom: 20px;
border-radius: 50%;
background: #FFFFFF;
box-shadow: 0px 0px 10px 1px #F1F1F1;
box-shadow: 0px 0px 12px 5px rgba(208, 208, 208, 0.2);
}
.-task-sidebar>div i {
@ -334,36 +334,40 @@ li.ant-menu-item{
color: #fff !important;
}
.-task-sidebar>div:hover{
background: #1890FF;
background: #466AFF;
box-shadow: 0px 0px 10px 2px #B6D0FC;
}
.helpBox{
width: 260px;
z-index: 103;
&.shareContent{
width: 200px;
width: 160px;
}
.ant-popover-title{
font-size: 16px;
}
.ant-popover-inner-content{
padding:0px;
}
p.titlecontent{
font-size: 18px;
font-size: 16px;
color: #333;
line-height: 20px;
padding:15px 20px;
}
.faqUl{
padding:0px 20px 10px;
padding:10px 15px;
max-height: 230px;
overflow-y: auto;
font-size: 13px;
li{
background: #F5F5F5;
border-radius: 20px;
padding:0px 20px;
padding:0px 15px;
color: #333;
height: 34px;
line-height: 34px;
margin-bottom: 10px;
height: 30px;
line-height: 30px;
margin-bottom: 3px !important;
a{
display: block;
overflow: hidden;
@ -379,19 +383,18 @@ li.ant-menu-item{
}
}
.shareUl{
padding:10px 0px;
display: flex;
align-items: center;
.titlecontent{
margin-right: 20px;
}
li > i{
font-size: 32px!important;
}
}
}
// tooltip样式
.tooltipBox .ant-tooltip-inner{
padding: 8px 12px;
font-size: 15px;
}
.-task-desc {
background: #494949;
@ -439,3 +442,21 @@ li.ant-menu-item{
border-left: 5px solid #494949;
border-bottom: 6px solid transparent
}
//头部输入框样式
.headSerach{
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
padding-left: 20px;
//修改antd输入框默认样式
.ant-input,.ant-input:focus{
border: none !important;
background-color: rgba(255, 255, 255, 0) !important;
}
&:hover{
padding: 2px 20px 2px 20px;
background: #FFF;
& i{
color: #333;
}
}
}

View File

@ -7,7 +7,7 @@ import './Component.scss';
import { getUser } from '../GetData/getData';
import axios from 'axios';
function Contributors({contributors,owner,projectsId,currentLogin}){
function Contributors({owner,projectsId,currentLogin}){
const [ menuList ,setMenuList ]= useState([]);
const [ list , setList ]= useState(undefined);
const [ total , setTotal ]= useState(0);
@ -16,11 +16,18 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
const [ isSpin , setIsSpin ] = useState(false);
useEffect(()=>{
if(contributors && contributors.total_count>0){
setTotal(contributors.total_count);
setList(contributors.list);
}
},[contributors])
getData();
},[])
function getData(){
const url = `/${owner}/${projectsId}/contributors.json`;
axios.get(url).then(result=>{
if(result){
setTotal(result.data.total_count);
setList(result.data.list);
}
}).catch(error=>{})
}
useEffect(()=>{
if(login){
@ -148,15 +155,15 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
}
return(
total > 0 ?
<div className="halfs">
<Link to={`/${owner}/${projectsId}/contribute`} className="font-16 color-ooo hoverA">
<span>贡献者</span>
{ contributors && contributors.total_count > 0 && <span className="infoCount">{contributors.total_count}</span>}
{ total > 0 && <span className="infoCount">{total}</span>}
</Link>
<div className="attrPerson" onMouseLeave={()=>setVisibleFunc(false)}>
{
total > 0 ?
list.map((item,key)=>{
list && list.length>0 && list.map((item,key)=>{
return(
<Popover content={menu} visible={item.visible} overlayClassName="menuPanels" placement="top">
<Link key={key} to={`/${item.login}`}>
@ -165,10 +172,9 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
</Popover>
)
})
:""
}
</div>
</div>
</div>:""
)
}
export default Contributors;

View File

@ -1,15 +1,10 @@
import React, { useEffect, useState } from 'react';
import { Drawer , Tree , Spin } from 'antd';
import { turnbar} from 'educoder';
import './Component.scss';
import axios from 'axios';
const { TreeNode , DirectoryTree } = Tree;
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
function DrawerPanel({visible,onClose,branch,owner,projectsId,history, name , list}){
const [ treeData , setTreeData ] = useState(undefined);
const [ isSpin , setIsSpin ] = useState(true);

View File

@ -1,3 +1,5 @@
import React , { useState , useEffect } from 'react';
import { Select } from 'antd';
import axios from 'axios';
@ -57,7 +59,6 @@ const LANGUAGE = [
export default (({ language , select_language })=>{
const [ languages , setLanguage ] = useState(undefined);
// useEffect(()=>{
// const url = '/dev_ops/languages.json';
// axios.get(url).then(result=>{

View File

@ -5,7 +5,7 @@ import './Component.scss';
export default (()=>{
return(
<div className="handleBox">
<a href="https://forum.trustie.net/forums/3075/detail" target="_blank" >
<a href="https://www.osredm.com/forums/594/detail" target="_blank" >
<img src={Handbook} alt=""/>
</a>
</div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -5,7 +5,7 @@ const Nav = styled.div`{
background-color:#fff;
padding:20px 30px;
border-bottom:1px solid #eee;
font-size:16px;
font-size:18px;
color:#333;
display:flex;
justify-content: space-between;

View File

@ -7,6 +7,8 @@ export const Banner = styled.div`{
border-bottom:1px solid #eee;
background-color:#fff;
border-radius:5px 5px 0px 0px;
justify-content: space-between;
display: flex;
}`
export const AlignCenterBetween = styled.div`{
display:flex;

View File

@ -174,7 +174,7 @@ function About(props, ref) {
了解什么是DevOps
</a>
<a href={"https://forum.trustie.net/forums/3080/detail"} target="_blank" style={{ color: "#5091FF"}}>
如何使用DevOps
如何使用引擎Engine功能
</a>
{
AuthorLogin === CurrentLogin ?

View File

@ -1,6 +1,7 @@
import React from 'react';
import { Table , Popconfirm } from 'antd';
import { Link } from 'react-router-dom';
import { turnbar } from "educoder";
// const STATUS = {
// running:"",
@ -10,12 +11,6 @@ import { Link } from 'react-router-dom';
// killed:"",
// pending:""
// }
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
function renderTableStatus(status) {
switch (status) {
case "running":

View File

@ -17,7 +17,7 @@ function Sure({datas , name , saveFunc , sureSubmit , loading}){
return(
<div>
<div style={{padding:"0px 15px 15px 15px"}}>
工作流名称{name}
水线名称{name}
</div>
<div className="editorBody" style={{marginTop:"0px"}}>
<Editors value={value} theme={"vs-grey"} height={"600px"} visible/>

View File

@ -5,7 +5,7 @@ import { AlignCenterBetween , Blueline , FlexAJ } from '../../Component/layout';
function head({manager , parameter}){
return(
<AlignCenterBetween>
<span className="font-20">工作流配置</span>
<span className="font-20">引擎配置</span>
<FlexAJ>
{
parameter && <Blueline onClick={parameter}>参数管理</Blueline>

View File

@ -66,7 +66,7 @@ export default ((props)=>{
{/* 原本的两种合为一个 */}
<Route path="/:owner/:projectsId/devops"
render={
(p) =>{return( p.location.state.open_devops?<Dispose {...props} {...p}/>:<About {...props} {...p}/>)}
(p) =>{return( p.location && p.location.state && p.location.state.open_devops?<Dispose {...props} {...p}/>:<About {...props} {...p}/>)}
}
></Route>
</Switch>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -77,6 +77,7 @@
min-width: 1200px;
z-index: 8;
left: 0px;
padding-bottom: 15px;
p {
margin-top: 0;
margin-bottom:0px !important;
@ -127,6 +128,9 @@
width: 110px;
text-align: right;
}
.ant-form-explain{
position: absolute;
}
}
// 右上角小铃铛单独样式
@ -262,4 +266,101 @@
.text-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: 2.6 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -22,11 +22,10 @@ const ProjectIndex = Loadable({
loading: Loading,
});
// 项目详情放在用户和组织下作为二级菜单存在
// const ProjectDetail = Loadable({
// loader: () => import("./Main/Detail"),
// loading: Loading,
// });
const ProjectHome = Loadable({
loader: () => import("./Main/projecthome/Index"),
loading: Loading,
});
class Index extends Component {
@ -60,23 +59,17 @@ class Index extends Component {
<ProjectNew {...this.props} {...props} />
)}
></Route>
{/* <Route
path="/:owner/:projectsId"
render={(props) => (
<ProjectDetail {...this.props} {...props} />
)}
></Route> */}
<Route
path="/explore"
path="/explore/all"
render={(props) => (
<ProjectIndex {...this.props} {...props} />
)}
></Route>
<Route
path="/"
path="/explore"
render={(props) => (
<ProjectIndex {...this.props} {...props} />
<ProjectHome {...this.props} {...props} />
)}
></Route>
</Switch>
@ -90,10 +83,3 @@ export default withRouter(
parentSelector: ".newMain",
})(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 { WhiteBack , Box , LongWidth , ShortWidth , Gap , AlignCenter , FlexAJ } from '../Component/layout';
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 { truncateCommitId } from "../common/util";
import CloneAddress from '../Branch/CloneAddress';
@ -26,20 +26,6 @@ import RenderHtml from '../../components/render-html';
/**
* 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){
const [ projectDetail , setProjectDetail ]= useState(undefined);
const [ inviteCode , setInviteCode ] = useState(undefined);
@ -122,13 +108,10 @@ function CoderDepot(props){
setTreeValue(url);
getFileInfo(url,branchName);
setType("file");
// getReadmeInfo(url,branchName);
// setReadme(undefined);
}else{
setTreeValue(undefined);
getDirInfo(branchName || defaultBranch);
setType("dir");
// getReadmeInfo('', branchName || defaultBranch);
}
}
},[projectsId,owner,pathname,defaultBranch])
@ -138,7 +121,7 @@ function CoderDepot(props){
if(result && result.data){
const release = {
"list":result.data.releases,
"total_count":result.data.releases.length
"total_count":result.data.releases && result.data.releases.length
}
setReleaseVersions(release);
}
@ -169,7 +152,7 @@ function CoderDepot(props){
const url = `/${owner}/${projectsId}/entries.json`;
axios.get(url, {
params: { ref: branch }
params: { ref:branch}
}).then((result) => {
if (result) {
setCommitCount(result.data.commits_count);
@ -197,7 +180,7 @@ function CoderDepot(props){
let ele = document.getElementById("ptxt");
if(ele){
let h = ele.offsetHeight;
if( h > 35 ) setHideBtn(true);
if( h > 36 ) setHideBtn(true);
}
}
},[projectDetail,lastCommit])
@ -239,9 +222,9 @@ function CoderDepot(props){
//
function changeBranch(value){
let checkvalue = turnbar(value);
let url = `/${owner}/${projectsId}${value && `/tree/${checkvalue}`}${treeValue ? `/${treeValue}`:""}`;
props.history.push(url);
let checkvalue = value;
let u = `/${owner}/${projectsId}${checkvalue && `/tree/${checkvalue}`}${treeValue ? `/${treeValue}`:""}`;
props.history.push(u);
}
//
@ -279,6 +262,7 @@ function CoderDepot(props){
//
function returnUlr(url){
let enBranch = turnbar(branchName);
setType('dir');
props.history.push(`/${owner}/${projectsId}/tree${enBranch?`/${enBranch}`:""}/${url}`);
}
//
@ -319,16 +303,16 @@ function CoderDepot(props){
const downloadMenu = (
<CloneAddress
http_url={projectDetail && projectDetail.clone_url}
ssh_url = {projectDetail && projectDetail.ssh_url}
zip_url={zip_url}
tar_url={tar_url}
ssh_url = {(projectDetail && props && props.platform) && projectDetail.ssh_url}
zip_url={(props && props.platform) && zip_url}
tar_url={(props && props.platform) && tar_url}
showNotification={props.showNotification}/>
)
// website
function okUpdate(d,w,l){
const url = `/${owner}/${projectsId}.json`;
axios.put(url,{
description:d,website:w,lesson_url:l
description:d,website:w || "",lesson_url:l||""
}).then(result=>{
if(result && result.data && result.data.id){
setDesc(result.data.description);
@ -337,12 +321,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;
const mdFlag = n && n.substring(n.length-3,n.length) === ".md";
const { current_user } = props;
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));
return(
@ -392,7 +385,7 @@ function CoderDepot(props){
<span>分支<span className="color-grey-6">{branchName || defaultBranch}</span></span>
}
</div>
{
{
treeValuePath && treeValuePath.length > 0 ?
<Path
identifier={projectDetail && projectDetail.identifier}
@ -404,34 +397,51 @@ function CoderDepot(props){
:
<React.Fragment>
<AlignCenter className="mr20">
<Link to={`/${owner}/${projectsId}/branches`} className="iconBtn">
<i className="iconfont icon-master_icon font-16"></i>
<span>分支</span>
<span>{projectDetail && projectDetail.branches_count}</span>
</Link>
{
props.platform ?
<Link to={`/${owner}/${projectsId}/branches`} className="iconBtn">
<i className="iconfont icon-master_icon font-16"></i>
<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 className="mr20">
{
props.platform ?
<Link to={`/${owner}/${projectsId}/tags`} className="iconBtn">
<i className="iconfont icon-biaoqianicon font-16"></i>
<span>标签</span>
<span>{projectDetail && projectDetail.tags_count}</span>
</Link>
<i className="iconfont icon-biaoqianicon font-16"></i>
<span>标签</span>
<span>{projectDetail && projectDetail.tags_count}</span>
</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>
</React.Fragment>
}
</AlignCenter>
<AlignCenter className="depotBtn">
{
(baseOperate || baseOper) &&
<div className="addOptionBtn">
{
baseOperate &&
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/compare/master...${branchName || defaultBranch}`)} >+ 合并请求</CheckProfile>
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/compare/master...${turnbar(branchName || defaultBranch)}`)} >+ 合并请求</CheckProfile>
}
{
<a onClick={createIssue}>+ 疑修</a>
{/* {
baseOper &&
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/issues/new`)} >+ </CheckProfile>
}
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/issues/new`)} >+ </CheckProfile>
} */}
</div>
}
{ fileOperate &&
@ -454,12 +464,18 @@ function CoderDepot(props){
(dirInfo && dirInfo.length>0) || fileInfo ?
<div className="listtable">
{
lastCommit &&
((lastCommit && lastCommit.message) || lastCommitAuthor) &&
<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"}>
<pre id="ptxt"><Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(lastCommit.sha)}`}><RenderHtml value={lastCommit.message}/></Link></pre>
</div>
{
lastCommitAuthor &&
<User url={getImageUrl(`/${lastCommitAuthor.image_url}`)} name={lastCommitAuthor.name} id={lastCommitAuthor.id} login={lastCommitAuthor.login}/>
}
{
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> }
<span className="ml20 color-grey-6 font-12 mt3">{lastCommit.time_from_now}</span>
@ -481,6 +497,7 @@ function CoderDepot(props){
item={item}
projectsId={projectsId}
goToSubRoot={goToSubRoot}
platform={props.platform}
/>
)
})
@ -519,7 +536,7 @@ function CoderDepot(props){
<i onClick={()=>setOpenModal(true)} className="iconfont icon-a-shezhi color-grey-9 font-15"></i>
}
</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 &&
<div className="color-grey-6 df pinfos mb5">
@ -539,7 +556,7 @@ function CoderDepot(props){
projectDetail && projectDetail.license_name &&
<div className="pinfos">
<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>
@ -560,7 +577,7 @@ function CoderDepot(props){
}
{/* 发布 */}
{
releaseVersions &&
releaseVersions && props.platform &&
<React.Fragment>
<Divider />
<Releases
@ -573,17 +590,9 @@ function CoderDepot(props){
</React.Fragment>
}
{/* 贡献者 */}
{
projectDetail && projectDetail.contributors && projectDetail.contributors.total_count >0 &&
<Contributors contributors={projectDetail.contributors} owner={owner} projectsId={projectsId} />
}
<Contributors owner={owner} projectsId={projectsId} />
{/* 语言 */}
{ projectDetail && projectDetail.languages &&
<React.Fragment>
<Divider />
<LanguagePower languages={projectDetail.languages}/>
</React.Fragment>
}
<LanguagePower owner={owner} projectsId={projectsId}/>
</Gap>
</ShortWidth>
}

View File

@ -8,13 +8,18 @@ const typeIco = {
"dir":"icon-wenjianjia4 font-15 color-blue_4C"
}
function CoderDepotCatalogue({item , goToSubRoot , owner , projectsId }){
function CoderDepotCatalogue({item , goToSubRoot , owner , projectsId , platform }){
return(
<li>
<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>
{
(!platform && item.image_type) ?
<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 title="init project">
<Link to={`/${owner}/${projectsId}/commits/${truncateCommitId(`${item.commit && item.commit.sha}`)}`} title={item.commit && item.commit.message}>

View File

@ -41,7 +41,7 @@ function CoderDepotReadme({ operate , history , readme , ChangeFile }){
return(
<div className="commonBox readBox" id="readme">
<Anchor offsetTop={70} targetOffset={160}>
<Anchor offsetTop={58}>
<div className="commonBox-title boxTitle">
<AlignCenter>
<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 { truncateCommitId } from '../common/util';
import { getBranch } from '../GetData/getData';
import { turnbar } from "educoder";
import Nodata from '../Nodata';
import './list.scss';
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
export default ((props)=>{
const [ data , setData ] =useState(undefined);
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>
)
return(
<React.Fragment>
<div className="main">

View File

@ -1,6 +1,6 @@
import React , { Component } from 'react';
import { Spin , Pagination, Timeline } from 'antd';
import { getImageUrl } from 'educoder';
import { getImageUrl , returnbar } from 'educoder';
import { truncateCommitId ,timeFormat } from '../common/util';
import { AlignTop } from '../Component/layout';
import SelectBranch from '../Branch/Select';
@ -15,12 +15,6 @@ import CopyTool from '../Component/CopyTool';
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{
@ -79,7 +73,7 @@ class CoderRootCommit extends Component{
isSpining:true,
page:realPage
})
this.getCommitList( branchName , realPage , limit );
this.getCommitList( returnbar(branchName) , realPage , limit );
}
getCommitList=(branch , page , limit)=>{
@ -133,7 +127,7 @@ class CoderRootCommit extends Component{
render(){
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;
let branch = returnbar(branchName || defaultBranch);
return(
@ -159,7 +153,16 @@ class CoderRootCommit extends Component{
<div className="commitList-item f-wrap-between">
<div>
<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>
<p className="f-wrap-alignCenter mt15 pb5">
<User
@ -176,7 +179,12 @@ class CoderRootCommit extends Component{
<div>
<span className="treecopy-cont shadow">
<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}`)}`}/>
</span>
<CopyTool beforeText="复制commit id" afterText="复制成功" inputId={`value${k}`}/>

View File

@ -0,0 +1,517 @@
import React, { Component } from "react";
import { Menu, Spin } from "antd";
import { getImageUrl } from "educoder";
import { Link } from "react-router-dom";
import './list.css';
import SelectBranch from '../Branch/Select';
import CloneAddress from '../Branch/CloneAddress';
import RootTable from './RootTable';
import CoderRootFileDetail from './CoderRootFileDetail';
import { truncateCommitId } from '../common/util';
import RenderHtml from '../../components/render-html';
import Nodata from '../Nodata';
import { getBranch } from '../GetData/getData';
import axios from "axios";
/**
* address:http和SSHhttp_url(对应git地址)
* filePath:点击目录时当前目录的路径
* subfileType:保存当前点击目录的文件类型显示目录列表时才显示新建文件如果点击的是文件就不显示新建文件按钮
* readMeContent:根目录下面的readme文件内容
*/
function getPathUrl(array,index){
if(array && array.length>0 && index){
let str = "";
for(let i=0;i<index;i++){
str += `/${array[i]}`;
}
return str.substr(1);
}
}
class CoderRootDirectory extends Component {
constructor(props) {
super(props);
this.state = {
address: "http",
filePath: undefined,
subFileType: undefined,
readMeContent: undefined,
readMeFile: undefined,
isSpin: true,
branchList: undefined,
fileDetail: undefined,
branchLastCommit: undefined,
lastCommitAuthor: undefined,
rootList: undefined,
readOnly: true,
zip_url:undefined,
tar_url:undefined,
chooseType:undefined,
md:false,
treeValue:undefined
}
}
changeAddress = (address) => {
this.setState({
address,
});
};
componentDidMount = () => {
this.Init();
this.getBranchs();
};
// 获取分支列表
getBranchs=()=>{
const { projectsId , owner } = this.props.match.params;
axios.get(`/${owner}/${projectsId}/branches.json`).then(result=>{
this.setState({
branchList:result.data
})
}).catch((error)=>{})
}
componentDidUpdate = (prevState) => {
const { location } = this.props;
const prevlocation = prevState && prevState.location;
if (location !== prevlocation) {
this.setState({
isSpin: true,
});
this.Init();
}
};
Init = () => {
let { pathname } = this.props.history.location;
const { branchName , owner , projectsId } = this.props.match.params;
const { defaultBranch } = this.props;
let branch = branchName || defaultBranch;
if (pathname && (pathname.indexOf(`/projects/${owner}/${projectsId}`) > -1 && pathname.indexOf(`/tree/${branchName}/`) > -1)) {
let url = pathname.split(`/tree/${branchName}/`)[1];
this.setState({treeValue:url})
this.getFileDetail(decodeURI(url),branch);
} else {
this.getProjectRoot(branch);
}
};
// 页面地址返回到主目录
returnMain = (branch) => {
const { projectsId , owner , branchName } = this.props.match.params;
this.setState({
readOnly:true,
treeValue:undefined
})
this.props.history.push(`/projects/${owner}/${projectsId}${branchName?`/tree/${branchName}`:""}`);
this.getProjectRoot(branch);
};
// 获取根目录
getProjectRoot = (branch) => {
const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/entries.json`;
axios.get(url, { params: { ref: branch } })
.then((result) => {
if (result) {
let last_commit = result.data && result.data.last_commit;
let entries = result.data && result.data.entries;
this.setState({
filePath: undefined,
fileDetail: [],
isSpin: false,
branchLastCommit: last_commit && last_commit.commit,
lastCommitAuthor:
last_commit && (last_commit.author || (last_commit.commit && last_commit.commit.author)),
zip_url: result.data.zip_url,
tar_url: result.data.tar_url
});
if (entries && entries.length > 0) {
this.renderData(entries);
}
this.setState({
rootList: entries,
subFileType: true,
});
}
}).catch((error) => {});
};
ChangeFile = (arr, readOnly) => {
const { projectsId , owner } = this.props.match.params;
//点击直接跳转页面 加载一次路由
this.props.history.push(`/projects/${owner}/${projectsId}/tree/${arr.path}`);
this.setState({
readOnly: readOnly,
chooseType:"file"
});
};
// 获取子目录
getFileDetail = (path, ref) => {
this.setState({
filePath: decodeURI(path),
});
const { projectsId , owner , branchName } = this.props.match.params;
const { chooseType } = this.state;
const url = `/${owner}/${projectsId}/sub_entries.json`;
axios.get(url,{
params:{
filepath:path,
ref:ref || branchName,
type:chooseType
}
}).then((result)=>{
let entries = result.data && result.data.entries;
this.setState({
isSpin:false
})
if(result){
if(entries){
// 返回对象entries.type则是文件类型否则是文件夹
if(entries.type){
this.setState({
fileDetail:[entries],
rootList:[],
subFileType:false
})
}else{
this.setState({
fileDetail:[],
rootList:entries,
branchLastCommit:result.data.last_commit && result.data.last_commit.commit,
lastCommitAuthor:result.data.last_commit && (result.data.last_commit.author || (result.data.last_commit.commit && result.data.last_commit.commit.author))
})
this.renderData(entries);
}
}else{
this.setState({
fileDetail:[],
rootList:[],
isSpin:false,
subFileType:false
})
}
}
})
.catch((error) => {
this.setState({
isSpin:false
})
console.log(error);
});
};
renderData = (data) => {
const rootList = [];
const readMeContent = [];
const readMeFile = [];
data && data.map((item, key) => {
rootList.push({
key,
message: item.commit && item.commit.message,
...item,
});
if (item.is_readme_file) {
readMeContent.push({ ...item });
readMeFile.push({ ...item });
}
});
this.setState({
rootList: rootList,
readMeContent,
readMeFile,
});
};
// 点击跳转到子目录
goToSubRoot=(path,type,filename)=>{
this.setState({
chooseType:type
})
const { projectsId, owner , branchName } = this.props.match.params;
const { defaultBranch } = this.props;
this.props.history.push(`/projects/${owner}/${projectsId}${`/tree/${branchName || defaultBranch}`}${path?`/${path}`:""}`);
if(filename.substring(filename.length - 3) === ".md"){
this.setState({
md:true
})
}else{
this.setState({
md:false
})
}
};
// readme文件内容
renderReadMeContent = (readMeContent, permission) => {
const { fileDetail, readMeFile } = this.state;
if (fileDetail && fileDetail.length !== 0) {
return;
}
if (readMeContent && readMeContent.length > 0) {
return (
<div className="commonBox">
<div className="commonBox-title">
<span className="mr10">
<i className="iconfont icon-wenjian1 font-16 color-grey-9 fl mt3"></i>
</span>
<span className="commonBox-title-read">
{readMeContent[0].name}
</span>
{permission ?
<a
onClick={() => this.ChangeFile(readMeFile[0], false)}
className="ml20 pull-right"
>
<i className="iconfont icon-bianji6 font-16 color-blue"></i>
</a>
:
""
}
</div>
<div className="commonBox-info">
{readMeContent[0].content ?
<RenderHtml className="break_word_comments imageLayerParent" value={readMeContent[0].content} url={this.props.history.location}/>
:
<span>暂无~</span>
}
</div>
</div>
);
}
};
// 选择分支
changeBranch = (value) => {
const { projectsId , owner } = this.props.match.params;
const { treeValue } = this.state;
let url = `/projects/${owner}/${projectsId}${value && `/tree/${value}`}${treeValue ? `/${treeValue}`:""}`;
this.props.history.push(url);
}
// 子目录路径返回链接
returnUlr=(url)=>{
this.setState({
chooseType:"dir",
readOnly:true,
treeValue:url
})
const { projectsId , owner , branchName } = this.props.match.params;
this.props.history.push(`/projects/${owner}/${projectsId}${branchName?`/branch/${branchName}`:""}/tree/${url}`);
}
onEdit=(readOnly)=>{
this.setState({
readOnly
})
}
downloadUrl = (zip_url,tar_url) => {
return(
<Menu>
{zip_url && (
<Menu.Item>
<a href={zip_url}>ZIP</a>
</Menu.Item>
)}
{tar_url && (
<Menu.Item>
<a href={tar_url}>TAR.GZ</a>
</Menu.Item>
)}
</Menu>
)
}
title = (branchLastCommit,lastCommitAuthor) => {
if (branchLastCommit) {
const { projectsId , owner } = this.props.match.params;
return (
<div className="f-wrap-alignCenter">
{lastCommitAuthor ? (
<React.Fragment>
{lastCommitAuthor.login ? (
<Link
to={`/users/${lastCommitAuthor.login}/projects`}
className="show-user-link"
>
<img
src={getImageUrl(`images/${lastCommitAuthor.image_url}`)}
className="radius mr10"
width="32"
height="32"
alt=""
/>
<span className="mr15">{lastCommitAuthor.name}</span>
</Link>
) : (
<span className="mr15">{lastCommitAuthor.name}</span>
)}
</React.Fragment>
) : (
""
)}
<Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${branchLastCommit.sha}`)}`} className="color-blue flex-1 hide-1">
{branchLastCommit.message}
</Link>
<span>{branchLastCommit.time_from_now}</span>
<Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${branchLastCommit.sha}`)}`} className="commitKey">
{truncateCommitId(branchLastCommit.sha)}
</Link>
</div>
);
}else{
return false;
}
}
render(){
const { branchLastCommit , lastCommitAuthor , rootList ,filePath , fileDetail , subFileType , readMeContent, isSpin , zip_url , tar_url , branchList} = this.state;
const { isManager , isDeveloper , projectDetail , platform , defaultBranch } = this.props;
const { projectsId , owner , branchName } = this.props.match.params;
let branch = branchName || defaultBranch;
const columns = [
{
key:"name",
dataIndex: 'name',
width:"30%",
render: (text,item) => (
<a onClick={()=>this.goToSubRoot(item.path,item.type,text)} className="ml12 task-hide" style={{ display: "block", maxWidth: "345px" }}>
<i className={ item.type === "file" ? "iconfont icon-wenjia font-15 color-green-file mr5" : "iconfont icon-wenjianjia1 color-green-file font-15 mr5"}></i>{text}
</a>
),
},
{
key:"message",
dataIndex: "message",
width: "60%",
render: (text, item) =>
item.commit && item.commit.message ?
<Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.commit.sha}`)}`} title={item.commit.message} className="task-hide" style={{ display: "block", maxWidth: "670px" }} >
{item.commit.message}
</Link>
: ""
},
{
key:"time_from_now",
dataIndex: "time_from_now",
width: "10%",
className: "edu-txt-right",
render: (text, item) =>
item.commit && item.commit.time_from_now ?
<a title={item.commit.created_at} className="mr12" style={{ cursor: "default", color: "#888" }} >
{item.commit.time_from_now}
</a>
:""
},
];
const urlRoot = filePath === undefined ? "" : `/${filePath}`;
let array = filePath && filePath.split("/");
return (
<Spin spinning={isSpin}>
<div className="main" style={{minHeight:'400px'}}>
<div className="f-wrap-between mb20">
<div className="f-wrap-alignCenter">
{
platform ?
<SelectBranch
repo_id={projectDetail && projectDetail.repo_id}
projectsId={projectsId}
branch={branch}
changeBranch={this.changeBranch}
owner={owner}
history={this.props.history}
branchList={branchList}
></SelectBranch>
:
<span>分支<span className="color-grey-6">master</span></span>
}
{filePath && (
<span className="ml20 font-16">
<a
onClick={() => this.returnMain(branch)}
className="color-blue"
>
{projectDetail && projectDetail.identifier}
</a>
{array &&
array.map((item, key) => {
return (
<React.Fragment>
{
key === array.length-1 ?
<span className="color-grey-6 subFileName" key={key}>{item}</span>
:
<a onClick={()=>this.returnUlr(`${getPathUrl(array,key+1)}`)} className="color-blue subFileName">{item}</a>
}
</React.Fragment>
);
})}
</span>
)}
</div>
<div className="f-wrap-alignCenter">
{subFileType && (projectDetail && parseInt(projectDetail.type)) !== 2 && (isManager || isDeveloper) && platform && (
<div>
<span>
<Link to={`/projects/${owner}/${projectsId}/${branch}/uploadfile${urlRoot}`} >
<span className="color-green mr30">上传文件</span>
</Link>
</span>
<span className="mr30">
<Link
to={`/projects/${owner}/${projectsId}/${branch}/newfile${urlRoot}`}
>
<span className="color-blue">新建文件</span>
</Link>
</span>
</div>
)}
{projectDetail && projectDetail.clone_url && (
<CloneAddress
http_url={projectDetail.clone_url}
downloadUrl={this.downloadUrl(zip_url,tar_url)}
showNotification={this.props.showNotification}
></CloneAddress>
)}
</div>
</div>
{/* 主目录列表 */}
{rootList && rootList.length > 0 && (
<RootTable
columns={columns}
data={rootList}
title={() => this.title(branchLastCommit,lastCommitAuthor)}
></RootTable>
)}
{/* 子目录列表、文件 */}
{fileDetail && fileDetail.length > 0 && (
<CoderRootFileDetail
detail={fileDetail[0]}
{...this.props}
{...this.state}
readOnly={this.state.readOnly}
onEdit={this.onEdit}
currentBranch={branch}
></CoderRootFileDetail>
)}
{
(rootList && rootList.length === 0) && (fileDetail && fileDetail.length === 0) && <Nodata _html="暂未发现文件!"/>
}
{ rootList && this.renderReadMeContent(readMeContent, isManager || isDeveloper)}
</div>
</Spin>
);
}
}
export default CoderRootDirectory;

View File

@ -215,7 +215,7 @@ class CoderRootFileDetail extends Component {
const Option = Select.Option;
return (
<React.Fragment>
<Anchor className="griditemAnchor" offsetTop={70}>
<Anchor className="griditemAnchor" offsetTop={58}>
<div className="griditemCate">
{
md && readOnly &&

View File

@ -29,14 +29,6 @@ const CoderRootVersion = Loadable({
loader: () => import('./version/Index'),
loading: Loading,
})
// const CoderRootVersionNew = Loadable({
// loader: () => import('./version/New'),
// loading: Loading,
// })
// const CoderRootVersionUpdate = Loadable({
// loader: () => import('./version/New'),
// loading: Loading,
// })
const Diff = Loadable({
loader: () => import('./Diff'),
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(){
return(
<div className="coderSubPage">

View File

@ -3,10 +3,10 @@ import { Spin, Tooltip } from 'antd';
import { Link, Route, Switch } from 'react-router-dom';
import { Content, AlignTop } from '../Component/layout';
import DetailBanner from './sub/DetailBanner';
import { numFormat } from 'educoder';
import cookie from 'react-cookies';
import '../css/index.scss'
import './list.scss';
import SpecialModal from './SpecialModal';
import { ImageLayerOfCommentHOC } from "../../modules/page/layers/ImageLayerOfCommentHOC";
@ -55,7 +55,8 @@ const OrderupdateMilepost = Loadable({
})
const OrderupdateDetail = Loadable({
loader: () => import('../Order/UpdateDetail'),
// loader: () => import('../Order/UpdateDetail'),
loader: () => import('../Order/order_form'),
loading: Loading,
})
@ -197,12 +198,16 @@ class Detail extends Component {
defaultBranch: undefined,
// 非本平台项目
platform: false
platform:false,
visible:false,
user_apply_signatures:[]
}
}
componentDidMount = () => {
this.getProject();
let history = this.props.location;
this.clearIssueCookies(history);
}
componentDidUpdate = (prevState) => {
@ -211,9 +216,28 @@ class Detail extends Component {
if (prevState && this.props && (prevParam.projectsId !== propsParam.projectsId || prevParam.owner !== propsParam.owner)) {
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) => {
const { user } = this.props;
const { projectsId, owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/simple.json`;
axios.get(url).then((result) => {
@ -223,6 +247,24 @@ class Detail extends Component {
open_devops: result.data.open_devops,
platform: result.data.platform && result.data.platform !== 'educoder'
})
let signa = result.data.user_apply_signatures && result.data.user_apply_signatures[0];
if(result.data.is_secret && !result.data.is_member && (!signa || (signa && signa.status !== "passed")) && user.login !== owner){
this.setState({
visible:true,
is_secret:result.data.is_secret,
user_apply_signatures:signa
})
}
// 工作流:两种状态进入的链接不同
const pathname = this.props.history.location.pathname;
if(pathname===`/projects/${owner}/${projectsId}/devops`){
if(result.data.open_devops && pathname === `/projects/${owner}/${projectsId}/devops`){
this.props.history.push(`/projects/${owner}/${projectsId}/devops/list`);
}else if(result.data.open_devops===false && pathname !== `/projects/${owner}/${projectsId}/devops`){
this.props.history.push(`/projects/${owner}/${projectsId}/devops`);
}
}
if (result.data.type !== 0 && result.data.mirror_status === 1) {
console.log("--------start channel --------");
@ -242,6 +284,7 @@ class Detail extends Component {
} else if (result.data.mirror_status === 2) {
this.deleteProjectBack();
} else {
this.getBanner();
this.getDetail();
this.setState({
firstSync: false,
@ -274,7 +317,9 @@ class Detail extends Component {
connected: () => {
console.log("###### channel connected! ######");
},
disconnected: () => { },
disconnected: () => {
console.log("###### cannot connected! ######");
},
received: data => {
console.log(`###### ---received data--- ######`);
console.log(data);
@ -287,6 +332,7 @@ class Detail extends Component {
this.deleteProjectBack();
}
this.getDetail();
this.getBanner();
}
this.setState({
firstSync: false,
@ -294,10 +340,22 @@ class Detail extends Component {
});
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 = () => {
const { history } = this.props;
const { projectsId, owner } = this.props.match.params;
@ -317,7 +375,6 @@ class Detail extends Component {
getDetail = () => {
const { projectsId, owner } = this.props.match.params;
this.getBanner();
const url = `/${owner}/${projectsId}/detail.json`;
axios.get(url).then((result) => {
if (result && result.data) {
@ -422,6 +479,10 @@ class Detail extends Component {
const url = `/${owner}/${projectsId}/forks.json`;
axios.post(url).then(result => {
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.showNotification(result.data.message);
}
@ -468,10 +529,10 @@ class Detail extends Component {
render() {
const { projectDetail, watchers_count, praises_count,
forked_count, firstSync, secondSync,
isManager, watched, praised,
project, open_devops, platform, defaultBranch, bannerList, forkSpin } = this.state;
const { projectDetail, watchers_count, praises_count,
forked_count, firstSync , secondSync ,
isManager, watched, praised, forkSpin,bannerList,
project , open_devops , platform , defaultBranch , project_id , user_apply_signatures , visible } = this.state;
const url = this.props.history.location.pathname;
const urlArr = url.split("/");
const urlFlag = (urlArr.length === 3);
@ -489,6 +550,7 @@ class Detail extends Component {
}
return (
<div>
<SpecialModal {...this.props} visible={visible} hideModal={this.sureModal} user_apply_signatures={user_apply_signatures} project_id={project_id} sureModal={this.sureModal}></SpecialModal>
<div className="detailHeader-wrapper">
<div className="normal">
<AlignTop style={{ padding: "18px 0px 10px", justifyContent: "space-between" }}>
@ -502,6 +564,7 @@ class Detail extends Component {
<Link to={`/${owner}/${projectsId}`} className="projectN mt6">{projectDetail && projectDetail.name}</Link>
</div>
{projectDetail && projectDetail.private && <span className="privateTag mt6">私有</span>}
{ !platform && <span className="privateTag red mt6">只读</span> }
</AlignTop>
<div className="mt8">
{
@ -509,11 +572,6 @@ class Detail extends Component {
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>
@ -699,16 +757,16 @@ class Detail extends Component {
(props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 修改详情 updatedetail*/}
<Route path="/:owner/:projectsId/issues/:orderId/:operateName"
{/* 修改详情 edit*/}
<Route path="/:owner/:projectsId/issues/:orderId/edit"
render={
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} />)
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} form_type={"edit"}/>)
}
></Route>
{/* 复制详情 copyetail*/}
<Route path="/:owner/:projectsId/issues/:orderId/copyetail"
render={
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} />)
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} form_type={"copy"}/>)
}
></Route>

View File

@ -36,8 +36,9 @@ const Infos = styled.div`
}
& > .f-wrap-between {
padding: 14px 20px 14px 16px;
border-radius: 3px 3px 0px 0px;
border-radius: 0px 0px 3px 3px;
border: 1px solid #D0D0D0;
border-top: none;
.df{
align-items: center;
& .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) => {
const {match , history } = props;

View File

@ -1,7 +1,6 @@
import React, { Component } from 'react';
import { Menu, Input , Spin, Pagination , Popover , Select } from 'antd';
import Slider from "react-slick";
import { getImageUrl } from 'educoder';
import { Menu, Input , Spin, Pagination , Popover , Affix } from 'antd';
import "slick-carousel/slick/slick.css";
import "slick-carousel/slick/slick-theme.css";
import '../css/index.scss'
@ -11,7 +10,6 @@ import ListItem from './IndexItem'
import axios from 'axios';
import img_new from '../Images/new.png';
import img_array from '../Images/array.png';
import banner from '../Images/banner_list.jpg';
import CheckProfile from '../Component/ProfileModal/Profile';
const Search = Input.Search;
@ -27,7 +25,6 @@ class Index extends Component {
sort: undefined,
total: 0,
isSpin: true,
project_type: undefined,
category_id: undefined,
typeList: undefined,
@ -37,20 +34,23 @@ class Index extends Component {
recommendOriList:undefined,
languageList:undefined,
languageId:undefined
languageId:undefined,
CategoryList:undefined
}
}
componentDidMount = () => {
const { page, limit, search, sort, project_type, category_id , languageId } = this.state;
this.getListData(page, limit, search, sort, project_type, category_id , languageId);
const { page,search, sort,category_id , languageId } = this.state;
this.getListData(page,search, sort,category_id , languageId);
this.getType();
this.getCategory();
this.getRecommand();
// this.getRecommand();
this.getLanguage();
@ -92,19 +92,24 @@ class Index extends Component {
}
// 获取列表
getListData = (page, limit, search, sort, project_type, category_id,languageId) => {
getListData = (page,search, sort,category_id,language_id) => {
const { current_user } = this.props;
const url = `/projects.json`;
if(category_id==0){
category_id=undefined;
}
if(language_id==0){
language_id=undefined;
}
axios.get(url, {
params: {
user_id: current_user && current_user.user_id,
page,
limit,
limit:15,
search,
sort_by: sort,
project_type,
category_id,
language_id:languageId
language_id
}
}).then((result) => {
if (result) {
@ -122,7 +127,11 @@ class Index extends Component {
const url = `/projects/group_type_list.json`;
axios.get(url).then((result) => {
if (result && result.data) {
this.setTypeList(result.data, undefined)
result.data.unshift({
name:'全部语言',
id:0,
});
this.setTypeList(result.data, 0)
}
}).catch((error) => { })
}
@ -131,7 +140,7 @@ class Index extends Component {
this.setState({
typeList: list.map((item, key) => {
return (
<li key={key} className={active_type && active_type === item.project_type ? 'active' : ''} onClick={() => this.changeType(`${item.project_type}`, list)}>
<li key={key} className={ parseInt(active_type) === item.id ? 'active' : ''} onClick={() => this.changeType(`${item.id}`, list)}>
<p>
<span className="font-16">{item.name}</span>
<span className="color-blue">{item.projects_count}</span>
@ -142,16 +151,17 @@ class Index extends Component {
})
}
// 切换类型
changeType = (type, list) => {
// 切换语言类型
changeType = (id, list) => {
this.setState({
isSpin: true,
project_type: type,
search: undefined
search: undefined,
category_id: undefined,
},()=>{
this.setTypeList(list, id)
const { page , sort , languageId } = this.state;
this.getListData(page , undefined, sort, id , 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 +170,18 @@ class Index extends Component {
axios.get(url).then((result) => {
if (result && result.data) {
this.setCategoryList(result.data, undefined);
result.data.unshift({
name:'全部类别',
id:0,
});
// this.setCategoryList(result.data, 0);
}
}).catch((error) => { })
}
setCategoryList = (list, active_id) => {
setCategoryList = (list) => {
this.setState({
categoryList: list.map((item, key) => {
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>
)
})
CategoryList: list
})
}
@ -184,10 +189,10 @@ class Index extends Component {
this.setState({
category_id: id,
page: 1
},()=>{
const { sort, project_type , languageId } = this.state;
this.getListData(1 , 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);
}
// 排序
@ -198,8 +203,8 @@ class Index extends Component {
search: undefined,
isSpin: true
})
const { limit, project_type, category_id , languageId } = this.state;
this.getListData(1, limit, undefined, e.key, project_type, category_id , languageId);
const {category_id , languageId } = this.state;
this.getListData(1,undefined, e.key,category_id , languageId);
}
// 搜索
@ -211,8 +216,8 @@ class Index extends Component {
project_type: undefined,
sort: "updated_on"
})
const { limit, sort, category_id , languageId } = this.state;
this.getListData(1, limit, value, sort, undefined, category_id , languageId);
const {sort, category_id , languageId } = this.state;
this.getListData(1,value, sort,category_id , languageId);
}
changeSearchValue = (e) => {
this.setState({
@ -224,23 +229,14 @@ class Index extends Component {
this.setState({
page
})
const { limit, search, sort, project_type, category_id , languageId } = this.state;
this.getListData(page, limit, search, sort, project_type, category_id , languageId);
const {search, sort,category_id , languageId } = this.state;
this.getListData(page,search, sort, category_id , languageId);
}
getoDetail=(login,identifier)=>{
this.props.history.push(`/${login}/${identifier}`);
}
// 选择语言类别
changeLanguage=(e)=>{
this.setState({
isSpin:true,
languageId:e === 0 ?undefined:e
})
const { page, limit, sort , project_type , category_id } = this.state;
this.getListData(page, limit, undefined, sort, project_type, category_id ,e === 0 ?undefined:e);
}
menu =()=> {
return(
@ -279,34 +275,35 @@ class Index extends Component {
const { current_user } = this.props;
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={
dots: true,
infinite: true,
speed: 500,
slidesToShow: 5,
slidesToScroll: 5,
autoplay:false,
arrows:false,
adaptiveHeight:true
}
const settings={
dots: true,
infinite: true,
speed: 500,
slidesToShow: 6,
slidesToScroll: 6,
autoplay:false,
arrows:false,
adaptiveHeight:true
}
// const setting={
// dots: true,
// infinite: true,
// speed: 500,
// slidesToShow: 5,
// slidesToScroll: 5,
// autoplay:false,
// arrows:false,
// adaptiveHeight:true
// }
// const settings={
// dots: true,
// infinite: true,
// speed: 500,
// slidesToShow: 6,
// slidesToScroll: 6,
// autoplay:false,
// arrows:false,
// adaptiveHeight:true
// }
return (
<div>
<p className="t_project_banner">
{/* <p className="t_project_banner">
<img src={banner} width="100%" alt=""/>
</p>
</p> */}
{/* {
recommendOriList && recommendOriList.length>0?
<Slider {...settings} className="recommandOri">
@ -320,7 +317,7 @@ class Index extends Component {
</Slider>
:""
} */}
{
{/* {
recommendList && recommendList.length>0 &&
<Slider {...setting} className={recommendList.length>5 ? "recommandProjects":"recommandProjects mb20"}>
{
@ -341,44 +338,40 @@ class Index extends Component {
})
}
</Slider>
}
} */}
<div className="ProjectListIndex">
<div className="list-left">
<Affix className="affix-list-left" offsetTop={90}>
<div className="affix-list-content">
<ul className="list-l-Menu">
<li className="MenuTitle"><i className="iconfont icon-xiangmuleixing color-grey-9 font-15 mr5"></i></li>
{typeList}
<li className="MenuTitle" onClick={() => {this.getType();this.changeType(undefined, this.state.typeList);}}>
<span><i className="iconfont icon-bianchengyuyan color-grey-9 font-15 mr5"></i>
语言</span></li>
<div className="list-affix">{typeList}</div>
</ul>
<ul className="list-l-Menu">
<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>
</div>
</Affix>
<div className="list-right boxShandow radius-2" style={{padding:0}}>
<Spin spinning={isSpin}>
<div className="list-r-operation">
<div>
<Select
showSearch
placeholder="请选择语言"
style={{width:"150px",marginRight:"20px"}}
size={"large"}
onChange={this.changeLanguage}
value={languageId}
allowClear={true}
optionFilterProp="children"
filterOption={(input,option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
>
<Select.Option key={0} value={0}>请选择语言</Select.Option>
{
languageList && languageList.length>0 && languageList.map((item,key)=>{
return(
<Select.Option key={item.id} value={item.id}>
{item.name}
</Select.Option>
)
})
}
</Select>
<Search
placeholder="输入项目名称关键字进行搜索"
enterButton="搜索"
@ -412,7 +405,7 @@ class Index extends Component {
</Popover>
</div>
</div>
<ListItem {...this.props} {...this.state} projects={projectsList}></ListItem>
<ListItem {...this.props} {...this.state} projects={projectsList} getListData={this.getListData}></ListItem>
{this.pagination(total,limit,page)}
</Spin>
</div>

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