Compare commits

...

1429 Commits

Author SHA1 Message Date
jasder 4fa10a3683 Merge pull request 'fix mege develop' (#248) from develop into master 2021-11-14 20:39:31 +08:00
jasder f13b8009ad Merge pull request 'fix code review' (#246) from jasder/forgeplus:develop into develop 2021-11-11 18:21:51 +08:00
jasder e216d7da70 Merge branch 'develop' of https://git.trustie.net/Gitlink/forgeplus into develop 2021-11-11 18:09:26 +08:00
jasder 0106f2d5dd Merge pull request '存在问题修复' (#244) from yystopf/forgeplus:hh_hotfix into develop 2021-11-11 18:09:08 +08:00
jasder 4f33e1194c Merge branch 'featrue_codereview' into develop 2021-11-11 18:06:08 +08:00
jasder 03beee6cae FIX code review 2021-11-11 18:03:30 +08:00
yystopf 49c7827f87 fix 2021-11-10 16:40:11 +08:00
yystopf 222e5c1050 fix: atme sender info 2021-11-10 11:32:59 +08:00
yystopf 1298fedcbb fix: user rank 2021-11-10 10:47:03 +08:00
yystopf 937603d0f2 fix: change params is blank not sent email 2021-11-10 10:05:35 +08:00
yystopf 685d2b80f2 fix 2021-11-10 09:43:22 +08:00
yystopf 2e35fb92a9 fix: change message template email title 2021-11-09 17:04:45 +08:00
yystopf c4e88ad690 fix 2021-11-09 16:56:49 +08:00
yystopf e316a60433 fix: pullrequest fork_project_user_name 2021-11-09 16:56:49 +08:00
jasder f1f4867b8c Merge pull request 'FIX sync user info' (#243) from jasder/forgeplus:develop into develop 2021-11-08 16:31:01 +08:00
jasder 6fe3507a16 Merge remote-tracking branch 'gitlink/develop' into develop 2021-11-08 14:22:57 +08:00
jasder 6b0f9a689a Merge pull request '@我功能' (#239) from yystopf/forgeplus:hh_notification_v2_2 into develop 2021-11-08 14:21:00 +08:00
yystopf eb18a1e7aa add: project members api and update forks api 2021-11-08 11:35:14 +08:00
yystopf 1a449d1dc6 add: atme service 2021-11-08 11:35:14 +08:00
jasder c19c83d505 Merge branch 'develop' of https://git.trustie.net/Gitlink/forgeplus into develop 2021-11-05 11:36:51 +08:00
jasder 5cd7104fbb Merge pull request '缓存逻辑修改以及消息模板修改' (#233) from yystopf/forgeplus:hh_fix_cache into develop 2021-11-05 09:23:22 +08:00
jasder 9f31dc02f4 FIX 后台管理修改用户信息时同步git用户 2021-11-04 17:58:45 +08:00
yystopf e27ba76f33 fix: project identifier regex 2021-11-03 14:43:17 +08:00
yystopf 6adcb89829 fix 2021-11-02 14:34:02 +08:00
yystopf e2411b350f fix 2021-11-02 14:31:33 +08:00
yystopf 26f6738d29 fix: email template html 2021-11-02 13:52:57 +08:00
jasder 1008f17849 FIX 调整注册接口 2021-11-02 13:39:45 +08:00
yystopf 43c683e83f fix: contributor load cache data 2021-11-02 11:27:17 +08:00
yystopf 282d3d0122 fix 2021-11-02 10:15:35 +08:00
yystopf 1b47f51550 fix 2021-11-02 10:03:13 +08:00
yystopf 890fe7d629 fix 2021-11-02 09:59:21 +08:00
yystopf 7193323be9 fix: field upper but 2021-11-02 09:59:21 +08:00
yystopf 28c3b4dda4 add: repo commit user use cache data 2021-11-02 09:59:21 +08:00
yystopf 46405e704a add: rank not include deleted project 2021-11-02 09:59:21 +08:00
yystopf 2273b4817e Merge pull request '用户排行榜数据缺失报错问题' (#231) from yystopf/forgeplus:hh_project_rank into develop 2021-11-02 09:59:05 +08:00
jasder 6c67b92bb1 FIX revert system_notification_histories 2021-11-01 11:06:18 +08:00
jasder ab2e1ffa0e FIX revert system_notification_histories[bug] 2021-11-01 11:06:08 +08:00
jasder 97ed641c63 FIX 增加gitea接口的响应时间(timeout设置为100s) 2021-11-01 11:05:31 +08:00
jasder 84ad7130d3 Revert "FIX 增加gitea接口的响应时间(timeout设置为100s)"
This reverts commit 0e9699885d.
2021-11-01 11:04:37 +08:00
jasder 83661dcf71 FIX update query projects api 2021-11-01 11:03:14 +08:00
jasder 0e9699885d FIX 增加gitea接口的响应时间(timeout设置为100s) 2021-11-01 11:03:00 +08:00
jasder 1533f40890 Merge branch 'develop' of https://git.trustie.net/Gitlink/forgeplus into develop 2021-11-01 11:00:01 +08:00
yystopf de2399a0a1 fix: project category load slowly 2021-10-29 19:54:58 +08:00
yystopf eba672f39a fix: user popular project nil 2021-10-29 19:39:08 +08:00
jasder c0df55c20f Merge pull request 'ADD 合并项目首页改版功能' (#227) from feature_project_detail into develop 2021-10-29 11:21:27 +08:00
yystopf a983ce5e8a Merge pull request '项目首页api以及后台推荐精选功能' (#226) from yystopf/forgeplus:hh_project_detail into feature_project_detail 2021-10-29 10:57:28 +08:00
yystopf 6efe9e7ec0 Merge pull request '修改排行榜的数量' (#225) from yystopf/forgeplus:hh_project_rank into feature_project_detail 2021-10-29 10:56:17 +08:00
yystopf 4f53994470 fix: rank count 2021-10-28 16:33:30 +08:00
yystopf 11d102f240 fix 2021-10-28 15:32:49 +08:00
yystopf 8698829678 fix: organization recommend api 2021-10-28 15:28:33 +08:00
yystopf 81ab0b01c0 fix: banner recommend remove login require 2021-10-28 14:21:42 +08:00
yystopf 3f690fd9a0 add: pinned projects size 2021-10-28 11:00:32 +08:00
yystopf 2b6d5e694e fix 2021-10-28 10:56:30 +08:00
yystopf 9aff90c03a fix 2021-10-28 10:52:44 +08:00
yystopf 43dc966cf9 add: project category upload logo 2021-10-27 18:02:21 +08:00
jasder cbf8f1fa67 FIX code review 2021-10-27 17:19:39 +08:00
yystopf 274e5090ce fix 2021-10-27 17:07:48 +08:00
yystopf cc0e01cc47 fix 2021-10-27 17:06:35 +08:00
jasder 4676b756e8 FIX 完善邮箱注册发送邮件功能 2021-10-27 17:01:16 +08:00
yystopf f0580720e3 fix 2021-10-27 16:58:31 +08:00
yystopf 91852d7957 add: project explore management 2021-10-27 16:50:18 +08:00
jasder 2719e60248 ADD 邮箱、登录名、手机号验证api 2021-10-27 15:15:06 +08:00
yystopf 0970a402c8 fix 2021-10-27 14:38:30 +08:00
yystopf a43f6714de add: project explore api 2021-10-27 14:20:27 +08:00
yystopf e5eb0d3d47 Merge pull request '项目排行榜以及用户排行榜' (#224) from yystopf/forgeplus:hh_project_rank into feature_project_detail 2021-10-27 11:24:35 +08:00
yystopf 01f99a2f12 fix 2021-10-27 11:03:34 +08:00
yystopf c019766df2 fix 2021-10-27 10:48:45 +08:00
yystopf 9232a284d8 fix 2021-10-27 10:46:09 +08:00
yystopf e6c6e544fe fix 2021-10-27 10:00:06 +08:00
yystopf d0791ee653 fix: privacy project not use cache 2021-10-27 09:48:23 +08:00
yystopf e1b0abbf31 fix 2021-10-27 09:20:46 +08:00
yystopf 21fa609e05 add: project rank and user rank api 2021-10-26 18:42:35 +08:00
yystopf 69c87fd5a4 add: callback cache 2021-10-26 15:22:42 +08:00
yystopf 91f1f4090f fix: old cache 2021-10-25 18:03:56 +08:00
jasder 31676df86e Merge pull request 'FIX 解决老版本trustie项目链接错误的问题' (#223) from jasder/forgeplus:develop into develop 2021-10-25 17:27:07 +08:00
jasder 9cd54b0ccb FIX 解决老版本trustie项目链接错误的问题 2021-10-25 17:24:28 +08:00
yystopf fa476732e5 add: user common info cache service 2021-10-25 17:23:17 +08:00
yystopf f9bb74aba4 add: cache service 2021-10-25 16:57:11 +08:00
jasder 401798ebdd Merge pull request '通知系统自定义发送规则功能' (#205) from yystopf/forgeplus:hh_notification_v2_1 into develop 2021-10-21 14:25:58 +08:00
jasder cd9a454a80 Merge pull request 'FIX 优化接口数据' (#211) from featrue_api_performance into develop 2021-10-21 13:50:09 +08:00
yystopf 24ec039895 fix 2021-10-21 11:23:12 +08:00
yystopf 43d125100d fix 2021-10-21 11:19:12 +08:00
yystopf fdcf450eab fix 2021-10-21 11:17:11 +08:00
jasder 94d5565f56 FIX 调整detail接口数据[bug] 2021-10-21 10:52:58 +08:00
jasder 9ffe10bd5b FIX 调整detail接口数据 2021-10-21 10:48:14 +08:00
yystopf 748e8cc92a add: send template message email supplement 2021-10-20 14:34:15 +08:00
yystopf c52f40adbd fix 2021-10-19 16:21:34 +08:00
yystopf 3ce8723de2 fix 2021-10-19 14:49:35 +08:00
yystopf dbe47dbddf fix: change template message setting default value 2021-10-19 14:40:47 +08:00
yystopf bd9759a3ed fix: user template message setting init data 2021-10-19 14:40:47 +08:00
yystopf 7d98bd0bbe fix: template message settinng type order by order index 2021-10-19 14:40:47 +08:00
yystopf 9157bc3eb9 fix: api doc 2021-10-19 14:40:47 +08:00
yystopf 88a7456300 add: template message control by setting 2021-10-19 14:40:47 +08:00
yystopf dbdd2e2dd3 add: user template message setting 2021-10-19 14:40:45 +08:00
yystopf d54dcb6b67 add: template message settings api 2021-10-19 14:40:21 +08:00
yystopf 8252cb7e71 add: template setting model 2021-10-19 14:40:20 +08:00
jasder d58d4136ad Merge pull request '系统通知弹窗功能' (#204) from yystopf/forgeplus:hh_notification_v2 into develop 2021-10-18 17:43:53 +08:00
jasder fddd466907 Merge pull request '修改易修标题验证规则' (#203) from yystopf/forgeplus:hh_fix_bug into develop 2021-10-18 17:41:51 +08:00
yystopf ff97daac54 fix 2021-10-18 13:52:52 +08:00
yystopf 2d4f083164 fix 2021-10-18 13:51:32 +08:00
yystopf 0885b7d75d fix 2021-10-18 13:51:32 +08:00
yystopf 1dcc38f617 fix: remove system_notification_history 2021-10-18 13:51:32 +08:00
yystopf 0d60e58304 fix: system notification edit error 2021-10-18 13:51:32 +08:00
yystopf 1b87a7a733 fix: send message job need open notice menu 2021-10-18 13:51:25 +08:00
yystopf 21af31f23c add: system notification history api 2021-10-18 13:49:58 +08:00
yystopf 490ce7a234 add: setting of system notification 2021-10-18 13:49:58 +08:00
yystopf d176508010 add: system notification management 2021-10-18 13:49:58 +08:00
yystopf 73f558d7c3 fix: issue subject validate 2021-10-18 13:42:55 +08:00
jasder 37e5e6d547 Merge pull request '项目标识可以选择不修改' (#199) from yystopf/forgeplus:hh_fix_bug into develop 2021-10-15 16:54:33 +08:00
yystopf a4ee529216 fix: allow update repository identifier origin 2021-10-15 16:47:01 +08:00
jasder c5a0d025cc Merge pull request '项目动态正确显示以及数据修复' (#194) from yystopf/forgeplus:hh_project_trends into develop 2021-10-15 16:06:12 +08:00
jasder a8972276ec Merge pull request '项目设置可更改项目标识' (#193) from yystopf/forgeplus:hh_fix_bug into develop 2021-10-15 16:05:32 +08:00
yystopf 2a09fadf71 fix: change projec trend rule and fix data 2021-10-15 14:36:50 +08:00
yystopf ffa0715374 fix 2021-10-14 18:34:37 +08:00
yystopf 79b394d291 fix: projecttrend show rule 2021-10-14 18:34:27 +08:00
baladiwei 94a6cd96c6 Merge pull request '合并请求数据缺失修复' (#190) from yystopf/forgeplus:hh_pr_count into develop 2021-10-14 18:11:09 +08:00
yystopf 98a45eb05c fix: update repository identifier valid 2021-10-14 17:03:36 +08:00
yystopf 00100e59c4 add: project permit change identifier 2021-10-14 17:03:36 +08:00
yystopf 018745c062 add: project permit change identifier 2021-10-14 17:03:36 +08:00
yystopf 1198830422 add: project permit change identifier 2021-10-14 17:03:36 +08:00
yystopf 3d8b19fa73 fix: edit pr fork project info 2021-10-14 16:59:43 +08:00
yystopf 8ba1198b4a fix: pr files commits count 2021-10-14 16:38:12 +08:00
jasder da960a916e Merge pull request '合并请求已存在修改跳转地址' (#187) from yystopf/forgeplus:hh_pr_redirect into develop 2021-10-14 15:35:10 +08:00
yystopf 2587ccea28 add: pr compare exist pr 2021-10-14 15:32:56 +08:00
jasder fb25eb87d7 Merge pull request 'FIX' (#179) from jasder/forgeplus:develop into develop 2021-10-12 18:37:40 +08:00
jasder 1fa44535bb FIX 更新pulls的api文档 2021-10-12 18:36:14 +08:00
jasder a1cbd8aa30 Merge pull request '更改合并请求跳转地址' (#174) from yystopf/forgeplus:hh_fix_bug into develop 2021-10-12 13:46:48 +08:00
yystopf 0bdbc09ec0 fix: check pr can merge change redirect url 2021-10-11 18:15:10 +08:00
yystopf 301f82f84d fix: check pr can merge change redirect url 2021-10-11 18:13:42 +08:00
yystopf 48b5117062 fix: check pr can merge change redirect url 2021-10-11 18:10:28 +08:00
yystopf 350502b499 fix: pullrequest create info 2021-10-11 10:07:35 +08:00
jasder ad3e1c706b Merge pull request '代码库二级页面改版' (#171) from yystopf/forgeplus:hh_project_detail into develop 2021-10-09 14:38:53 +08:00
yystopf a22327d0df fix: add comments_total_count 2021-10-09 14:19:02 +08:00
yystopf 6e653f768a fix: pullrequest comments_count 2021-10-09 10:45:13 +08:00
yystopf 46ab55d50f fix: issue change operate permission and repository detail remove garbage 2021-10-09 09:50:56 +08:00
yystopf f957b6f95e fix: commits filter by filepath 2021-10-08 14:58:29 +08:00
yystopf 9d5503f09f fix: lastcommit 2021-10-08 14:43:46 +08:00
yystopf 76183344bc fix: main content_type 2021-10-08 14:04:13 +08:00
yystopf 588850440e fix: decode error 2021-09-30 19:49:17 +08:00
yystopf 9685c97177 fix: add user login and release authorize 2021-09-30 17:40:18 +08:00
yystopf 689f265858 fix 2021-09-30 14:59:46 +08:00
yystopf f7ba082944 fix: readme return decode data 2021-09-30 14:59:37 +08:00
yystopf 59fe010fdb add: page totalcount 2021-09-30 11:15:11 +08:00
yystopf aabfaad458 add: release use database data 2021-09-30 11:09:13 +08:00
yystopf b07781a514 fix: some issues 2021-09-29 18:50:51 +08:00
yystopf c1db02171a add: release admin permission field 2021-09-29 17:16:21 +08:00
yystopf 69b8e0710c add: organization info 2021-09-29 17:09:30 +08:00
yystopf 520b0ef1be fix: release creator token 2021-09-29 11:43:04 +08:00
yystopf d1f5c32f68 fix 2021-09-29 11:34:21 +08:00
yystopf c9bd81af4e fix: lastcommit author and committer 2021-09-29 11:34:21 +08:00
yystopf c39990fff3 fix: doc 2021-09-29 11:34:21 +08:00
yystopf cae59383b4 add: commit show committer 2021-09-29 11:34:21 +08:00
yystopf 1d0255440a add: release list sha 2021-09-29 11:34:21 +08:00
yystopf f013ddcb72 fix 2021-09-29 11:34:21 +08:00
yystopf 24e77300ad fix: relase attachments 2021-09-29 11:34:21 +08:00
yystopf 46a083239b add: release show api 2021-09-29 11:34:21 +08:00
yystopf 133713ae7f add: tag created at unix 2021-09-29 11:34:21 +08:00
yystopf ab6b597d7b fix 2021-09-29 11:34:21 +08:00
yystopf 33473eecc2 fix: tag addition message 2021-09-29 11:34:21 +08:00
yystopf bbcca413c6 add: tags commiter message 2021-09-29 11:34:21 +08:00
yystopf 206bba1c49 add: contributors by filepath 2021-09-29 11:34:21 +08:00
yystopf ec22124004 add: readme by filepath 2021-09-29 11:34:21 +08:00
yystopf 6466ef523b fix 2021-09-29 11:34:21 +08:00
yystopf 333d6a8ea4 add: branch commiter user info 2021-09-29 11:34:21 +08:00
yystopf af7488505d add: project commit_slice 2021-09-29 11:34:21 +08:00
yystopf 91feb8cf89 add: project branch_slice 2021-09-29 11:34:21 +08:00
jasder 1c3ca34efc Merge pull request '用户完善资料问题' (#164) from yystopf/forgeplus:hh_profile_completed into develop 2021-09-29 10:59:09 +08:00
yystopf 4841943419 fix 2021-09-29 10:49:39 +08:00
yystopf 60720c309f fix: profile completed 2021-09-29 10:39:50 +08:00
jasder a825271a36 FIX code bug 2021-09-28 15:59:36 +08:00
jasder 4f3dc2b627 Merge pull request '同步镜像项目增加重试机制,更新项目去掉一些验证,易修访问权限修复' (#160) from yystopf/forgeplus:hh_fix_bug into develop 2021-09-28 15:27:11 +08:00
jasder 88d29ebe33 Merge pull request '通知系统发送邮件部分' (#159) from yystopf/forgeplus:hh_notice_system_1 into develop 2021-09-28 15:27:04 +08:00
yystopf be5b3864cd fix: remove repeat message 2021-09-27 11:25:12 +08:00
jasder fae1df9e65 Merge pull request '修复database.example gitea adapter' (#158) from gua2048/forgeplus:fix_database_yml into develop 2021-09-27 10:09:35 +08:00
chenjing c9a902d416 fix database.yml.example gitea adapter 2021-09-27 10:03:27 +08:00
yystopf 3a22ece871 fix: orgainization left receiver email 2021-09-26 15:00:17 +08:00
yystopf 04207595d8 fix: template fix 2021-09-24 15:40:07 +08:00
yystopf 6b68ea998d add: email message sended by html 2021-09-24 15:37:55 +08:00
yystopf 1c27e9ccd8 fix: textarea md editor 2021-09-23 17:08:53 +08:00
jasder 5b16138c5a Merge pull request '通知系统功能模块' (#153) from yystopf/forgeplus:hh_notice_system into develop 2021-09-22 14:43:04 +08:00
yystopf e5199425ee add: template email message 2021-09-22 14:25:56 +08:00
yystopf 53212975f1 add: init data button 2021-09-22 09:53:43 +08:00
yystopf 0581c59a84 fix: message template simple type 2021-09-18 18:50:45 +08:00
yystopf d957e0544f add: message template management 2021-09-18 18:41:03 +08:00
yystopf a910b11860 fix: 项目列表删除组织筛选 2021-09-18 10:38:07 +08:00
yystopf d13006ca09 更改完善资料判断资料,删除回调 2021-09-18 10:29:13 +08:00
yystopf a2ae8f1630 fix: profile completed 2021-09-18 10:24:16 +08:00
yystopf 74a4b499a9 fix 2021-09-18 10:16:37 +08:00
yystopf 12681b0842 fix: issue visit permission 2021-09-17 14:56:34 +08:00
yystopf 9a7a5ca3a1 fix: message content add space 2021-09-17 14:48:00 +08:00
yystopf 18b0c76082 fix 2021-09-17 14:15:38 +08:00
yystopf 228becfe07 fix: some content for messages 2021-09-17 10:37:49 +08:00
yystopf 76268c4952 fix 2021-09-17 10:02:42 +08:00
yystopf 08de4819d7 fix: bold messsage some content 2021-09-17 09:44:17 +08:00
yystopf a5861ce1d6 fix: 项目修改简介、语言、分类可以为空 2021-09-17 09:38:31 +08:00
yystopf 41d04e9e99 fix: 标签改为标记 2021-09-16 18:39:19 +08:00
yystopf a1679cfc53 fix some template and add copy issue message 2021-09-16 17:29:07 +08:00
yystopf dbcbc01251 fix and add some message feature 2021-09-16 16:54:49 +08:00
yystopf b8a52107a5 add: expire issue send message 2021-09-16 10:10:05 +08:00
yystopf cb76a946ef fix 2021-09-16 09:21:35 +08:00
yystopf 88bc5f29ff add: message touch condition 2021-09-15 18:55:58 +08:00
yystopf 91e6e0384e fix 2021-09-15 11:32:58 +08:00
yystopf 8a02981a2e fix: mirror broadcast error and retry 2021-09-15 11:28:38 +08:00
yystopf fa0021b504 fix 2021-09-15 11:10:09 +08:00
yystopf 65af40c29b add: join message content be necessary 2021-09-14 23:04:33 +08:00
yystopf ca4f416f0a add: message template content 2021-09-14 17:39:58 +08:00
yystopf 91676492ab fix: some detail for messages 2021-09-14 13:59:23 +08:00
yystopf a8c75f3b20 fix: messages list status select 2021-09-14 11:21:58 +08:00
yystopf a0b6041394 add: get user info unread total 2021-09-13 18:17:09 +08:00
yystopf 8ad087820e fix: message api doc 2021-09-13 18:03:57 +08:00
yystopf 465a3a67a5 add: notice system api 2021-09-13 17:51:34 +08:00
yystopf 877a20350d fix: notice messages status value 2021-09-13 10:34:28 +08:00
yystopf 86d634d94f add: notice message skeletal code 2021-09-13 10:34:28 +08:00
jasder 39806c7811 Merge pull request 'FIX 修复修改组织信息后导致不能创建项目的bug' (#150) from jasder/forgeplus:develop into develop 2021-09-10 22:50:11 +08:00
jasder 8c60ce1d76 FIX 处理修改组织后导致不能创建项目的bug 2021-09-10 22:46:48 +08:00
jasder e594c72c43 Merge pull request '一些bug修复' (#147) from yystopf/forgeplus:hh_fix_bug into develop 2021-09-10 18:30:40 +08:00
jasder ac30cfd7b8 Merge pull request 'FIX 创建项目流程改版' (#145) from jasder/forgeplus:develop into develop 2021-09-10 18:20:21 +08:00
jasder 29ec3bed09 Merge branch 'feature_optimize_project_creation_process' into develop 2021-09-10 18:01:29 +08:00
jasder c82635f6c3 FIX 组织名称创建项目时,去掉readme的初始化文件 2021-09-10 17:57:49 +08:00
yystopf cd569f4b8a fix: download url redirect delay 2021-09-10 15:53:38 +08:00
jasder 96c79ffade FIX 耿直创建项目提示信息 2021-09-10 15:35:57 +08:00
jasder 4c41d50506 ADD 后台系统配置管理功能 2021-09-10 15:29:08 +08:00
yystopf 02f8e453f1 fix: remove watcher when project change is_public 2021-09-10 11:26:01 +08:00
jasder 6d581de018 FIX migrate project api bug 2021-09-10 11:13:49 +08:00
yystopf 90ace8b753 fix: download file need authorize 2021-09-10 10:52:21 +08:00
jasder 7549557a62 FIX 更改hovercard接口中相关路由 2021-09-09 18:40:53 +08:00
jasder 36adfcf016 FIX 整理后台管理相关功能 2021-09-09 17:34:09 +08:00
jasder f5ffd978ac FIX delete some file 2021-09-09 14:35:26 +08:00
jasder e38539445d FIX delete some mandatory field with migrate repo api 2021-09-09 14:34:29 +08:00
jasder 67d4544d6b FIX delete some mandatory field with projects list api 2021-09-09 13:50:31 +08:00
yystopf d5de6aa66b fix: transfer repository owner complete not include organization 2021-09-08 18:16:02 +08:00
jasder 3e8df9316c Merge pull request 'FIX some bug' (#143) from jasder/forgeplus:develop into develop 2021-09-08 17:43:50 +08:00
jasder b0d22b3053 FIX 解决个人主页因用户信息缺陷导致接口报错的问题 2021-09-08 15:34:53 +08:00
yystopf 84aed0391a fix: project list query 2021-09-07 17:19:38 +08:00
yystopf 74a9743bcc fix: annoymous user visit project 2021-09-07 15:17:52 +08:00
yystopf 30e4ab98db fix: owner team can change nickname 2021-09-06 16:42:48 +08:00
jasder cb1d77ee6d Merge pull request '系统保留关键词模块' (#137) from yystopf/forgeplus:hh_reversed_keyword into develop 2021-09-03 17:52:48 +08:00
jasder 468c1a31ab Merge pull request '菜单控制、仓库创建重名修复' (#136) from yystopf/forgeplus:hh_menu_control into develop 2021-09-03 17:49:51 +08:00
yystopf 7c86779c37 fix: create project repeat name 2021-09-03 17:31:26 +08:00
yystopf 9926bff60d add: reversed keyword tip_exception 2021-09-03 17:30:44 +08:00
yystopf 0672a714a0 fix: createfile need profile completed 2021-09-03 13:56:48 +08:00
yystopf e9915cb654 add: change project menu authorize 2021-09-03 09:37:30 +08:00
jasder 784521e58a Merge pull request '个人信息完善提醒处理和组织、用户详情接口合并处理' (#135) from yystopf/forgeplus:hh_url_change into develop 2021-09-02 17:49:25 +08:00
yystopf e93873c3d4 fix 2021-09-02 14:48:33 +08:00
yystopf 635f572907 fix 2021-09-02 13:59:09 +08:00
yystopf a422aa638d fix: update user profile completed rule 2021-09-02 11:48:53 +08:00
yystopf c52458a7e3 add: require profile completed 2021-09-02 10:55:31 +08:00
yystopf 5b7f8e8da6 fix: project releases permission 2021-09-02 10:55:31 +08:00
yystopf 39dbadeec9 fix: view authorize 2021-09-02 10:55:31 +08:00
yystopf 48f66f345c fix 2021-09-02 10:55:31 +08:00
yystopf 039779339a add: user and organization merge show api 2021-09-02 10:55:31 +08:00
jasder 40c6425aee Merge pull request '代码提交信息通过gitea_uid来匹配平台用户' (#132) from yystopf/forgeplus:hotfix_comiter into develop 2021-09-01 18:59:36 +08:00
yystopf c50f9ef28d fix: first commit show real commiter 2021-09-01 14:53:41 +08:00
yystopf 7e8e3e1b39 fix: commiter email is blank 2021-09-01 10:28:11 +08:00
yystopf f1586c320b add: rake assets precompile 2021-08-31 14:51:18 +08:00
yystopf 4cb71179fd add: reversed keyword management 2021-08-31 14:22:49 +08:00
yystopf fe7dfcea52 add: reversed keyword and api forbidden 2021-08-31 10:18:00 +08:00
baladiwei d1246b8e30 Merge pull request '初始化数据结构和数据、另含测试环境100个测试账号' (#131) from yystopf/forgeplus:hh_structure into develop 2021-08-27 18:16:25 +08:00
yystopf 8832114805 fix: import structure and data 2021-08-27 18:12:06 +08:00
jasder b9bf3fb5ff Merge pull request '组织权限修复,以及一些错误数据修复脚本' (#127) from yystopf/forgeplus:hh_team_unit into develop 2021-08-27 15:10:36 +08:00
yystopf c9e265f95c fix: transfer repository user id 2021-08-27 10:54:20 +08:00
yystopf cf8278ee5e fix: owners add login 2021-08-27 10:20:36 +08:00
yystopf ccd477e519 fix: observed user can not correct find 2021-08-26 18:36:54 +08:00
yystopf 7d26fba3c0 add: pullrequest admin or developer 2021-08-26 17:56:19 +08:00
yystopf 5637001b16 add: fix some data task 2021-08-26 17:51:46 +08:00
yystopf 8c11759b6c fix: team unit default change 2021-08-26 14:28:11 +08:00
yystopf 65e5420246 fix: trasfer project need remove exsit team user 2021-08-26 14:20:06 +08:00
yystopf 598beedc7b fix: remove team_user with organization_user 2021-08-26 11:08:11 +08:00
yystopf fbede59261 fix: tarnsfer project authorize 2021-08-25 17:15:40 +08:00
yystopf f03182c771 fix 2021-08-25 15:28:21 +08:00
yystopf 68712f9b4c add: project team can add authorize 2021-08-25 15:25:08 +08:00
yystopf 43add36d29 add: team unit add type wiki 2021-08-24 18:30:58 +08:00
jasder 4d7d587419 项目协作者更改创建规则、镜像项目同步密码解密
FIX 项目协作者更改创建规则
FIX 镜像项目同步密码解密
2021-08-24 18:16:56 +08:00
yystopf c8b21f818d fix: migrate project password decode 2021-08-24 18:04:17 +08:00
yystopf 23b8342283 fix: project member authorize 2021-08-24 17:48:51 +08:00
jasder 3caa751d4d FIX some bug 2021-08-19 17:47:34 +08:00
yystopf eafc8ea527 add: return failed mirror repository field 2021-08-18 15:40:57 +08:00
yystopf f996525e8e fix: version issues percent 2021-08-17 15:33:03 +08:00
yystopf 486ed960ca fix: issue series update 2021-08-17 15:33:03 +08:00
yystopf 8a90162ac6 fix 2021-08-17 15:33:03 +08:00
yystopf 258272d439 fix: generate username type 2021-08-17 15:33:03 +08:00
yystopf 8b809fb813 add: generate ceshi users 2021-08-17 15:33:03 +08:00
yystopf e8496e77dc fix 2021-08-17 15:33:03 +08:00
yystopf 155f288c81 add: project unit add wiki 2021-08-17 15:33:03 +08:00
yystopf 0f45e8f44b fix 2021-08-17 15:33:03 +08:00
jasder 495d7773fe 发布 v3.0.5版本 2021-08-06 17:11:06 +08:00
yystopf 9425d2e59d add: issue chosen assign_user permission 2021-08-04 14:45:54 +08:00
yystopf 0654f81565 fix: new issue branch select 2021-08-04 14:36:01 +08:00
yystopf ede2f7199a fix: not edit issue create journal 2021-08-03 17:24:23 +08:00
yystopf ea98528100 fix: reset project issue tags order 2021-08-03 15:57:00 +08:00
yystopf 6f010d992d fix: change project member tip 2021-08-03 14:27:17 +08:00
yystopf ffb58b788a fix: migrate project return owner login 2021-08-03 14:15:00 +08:00
yystopf a53367b7eb fix: set project default branch to gitea 2021-08-03 14:14:06 +08:00
yystopf 63fccd03f8 fix: update project default branch 2021-08-02 18:16:07 +08:00
yystopf eb56c34c41 fix: fork repo gpid is nil 2021-07-30 18:08:59 +08:00
jasder c748f4eaed add webhook 2021-07-30 17:03:03 +08:00
yystopf bfef459b75 fix: hook tasks use is delivered data 2021-07-30 16:24:34 +08:00
yystopf eeb69daff1 fix: some user admin but not have gitea authorize 2021-07-30 09:39:54 +08:00
yystopf 4b8bb8a65f fix: pullrequest name 2021-07-29 16:17:30 +08:00
yystopf 4d6ec8088a fix: webhookparams include secret 2021-07-28 17:30:32 +08:00
yystopf 264a831a1c add: webhook tasks and test 2021-07-28 14:27:11 +08:00
yystopf 8b53aac8a6 add: repository update destroy webhook 2021-07-27 16:44:58 +08:00
yystopf cb1a4d8c8c add: repository create webhook 2021-07-27 11:11:23 +08:00
yystopf ebc4305ca8 add: repository webhooks 2021-07-26 17:25:06 +08:00
yystopf 8905f60265 fix: gitea url contain chinese 2021-07-23 17:23:01 +08:00
yystopf f334864f1b fix: get file extname 2021-07-23 14:50:01 +08:00
yystopf f5e07ab3ec add: remove public key from api 2021-07-23 14:49:54 +08:00
yystopf fcc7736c34 fix some bug pick 2ea0c6e3 add: remove public key from api 2021-07-23 14:49:31 +08:00
yystopf 0db334217e fix 2021-07-22 15:19:53 +08:00
yystopf 32fe6958df fix: create public key return error 2021-07-22 14:53:57 +08:00
yystopf e4fda9243b fix: create project add login 2021-07-21 09:43:35 +08:00
yystopf aeaa5d4366 完成public_keys模块、修复pr查看比较的时候传token,修复无法正确读取仓库图片 2021-07-16 16:45:46 +08:00
yystopf d4b9881f2d fix 2021-07-16 16:42:30 +08:00
yystopf a543c3e08f fix: write image filepath error 2021-07-16 16:10:20 +08:00
viletyy 998381585a add: user public keys controller 2021-07-14 15:38:14 +08:00
viletyy 2ddf1dbd01 add: gitea user keys api 2021-07-14 11:48:52 +08:00
viletyy fd3fab99ae fix: compare code need token 2021-07-14 09:55:12 +08:00
viletyy de2b54c39e add: compare code return can merge status 2021-07-12 18:10:26 +08:00
viletyy 4929734a1a fix 2021-07-12 17:57:42 +08:00
yystopf 1c6d8fc2f3 创建合并请求比较代码时返回是否可以创建的信息 2021-07-12 17:27:53 +08:00
viletyy d271a684fa add: compare code return can merge message 2021-07-12 17:24:35 +08:00
jasder 34c3a83df4 fix some bug
FIX 解决私有版本库库不能访问、下载图片的问题
FIX show realname for create project
FIX 解决标签列表和发行版列表中下周zip包、tar包导致的404问题
ADD conflicts file for pull api
2021-07-12 16:16:44 +08:00
jasder 71e039efb8 FIX merge develop branch 2021-07-12 16:14:51 +08:00
jasder 9ac21938e6 pr合并问题 2021-07-12 12:10:06 +08:00
viletyy fa8594d2ab add: merge pr check status 2021-07-12 12:02:34 +08:00
jasder 3614f3e15b FIX 解决私有版本库库不能访问、下载图片的问题 2021-07-09 16:57:11 +08:00
jasder e76d475fef FIX show realname for create project 2021-07-06 11:04:00 +08:00
jasder 1392024657 FIX migrate data 2021-07-02 16:08:55 +08:00
viletyy 312fca7e2b fix: update shell simple 2021-07-01 17:55:48 +08:00
vilet.yy d1939116a3 fix: authorize 2021-07-01 13:58:36 +08:00
vilet.yy 2a72fc56a4 fix: copy issue author id 2021-07-01 13:56:15 +08:00
jasder 87049b74ef Merge branch 'develop' into sync_develop 2021-07-01 10:06:00 +08:00
jasder f19219a467 FIX 解决标签列表和发行版列表中下周zip包、tar包导致的404问题 2021-06-30 14:30:01 +08:00
vilet.yy 4cc46f4cb4 fix 2021-06-29 18:05:37 +08:00
vilet.yy 8331d849d5 fix: forked projects private set 2021-06-29 17:36:15 +08:00
vilet.yy 0e7f3a8905 fix: project permission and update user lastname 2021-06-29 10:36:58 +08:00
jasder 7b27ed71ca FIX 易修详情返回用户操作权限 2021-06-25 18:47:36 +08:00
vilet.yy 6c3c1ce093 fix: issue show permission 2021-06-25 17:54:22 +08:00
jasder 62d1a2378c FIX [更改字段名称]conflicts file for pull api 2021-06-25 17:31:23 +08:00
jasder e111f40c69 fix 修复bug 2021-06-25 16:13:23 +08:00
jasder 8d300e11f9 FIX [bug]conflicts file for pull api 2021-06-24 16:18:34 +08:00
jasder b7dd12927b ADD conflicts file for pull api 2021-06-24 16:08:32 +08:00
vilet.yy 4126ea7b4e fix: some bug from security 2021-06-22 15:54:42 +08:00
jasder 539b832af6 FIX 解决获取平台base url导致的https的问题 2021-06-22 15:15:27 +08:00
jasder 0bfed83bc0 FIX 解决获取平台base url导致的https的问题 2021-06-22 15:05:10 +08:00
jasder ce8527359c FIX 处理版本库zip、gzip包链接为无效的问题 2021-06-22 09:51:17 +08:00
jasder fff21a1bc8 FIX 处理版本库zip、gzip包链接为无效的问题 2021-06-22 09:39:44 +08:00
vilet.yy 526920f564 fix: version issues count except pull requests count 2021-06-21 18:50:45 +08:00
vilet.yy 2d37df1c00 fix: set cache user nil 2021-06-21 17:12:13 +08:00
vilet.yy 0af08bc967 fix: projects load by project language slowly 2021-06-21 17:05:51 +08:00
vilet.yy ea82a52b7b fix: version issues count 2021-06-21 14:45:41 +08:00
jasder cb11a5c8e9 发布v3.1.1版本
* FIX 修复pulls、issues 搜索数量统计问题
* FIX 解决在线创建文件错误提示信息不准确的问题
* FIX table name bug
* FIX 解决applied_projects相关表操作的问题
* FIX 解决排序参数的判断预防SQL注入
* FIX 项目导航栏数量改为开启中的数量
* FIX 解决项目邀请码的索引查询问题
* FIX FIX get readme file bug
* FIX sql attack
* FIX projects load by invite code slowly
2021-06-18 17:09:57 +08:00
jasder 62bd331876 Merge branch 'sync_develop' into develop 2021-06-18 16:44:57 +08:00
jasder 91e142ba82 FIX code bug 2021-06-18 16:44:37 +08:00
jasder a82b13ecdf Merge branch 'sync_develop' into develop 2021-06-18 16:21:10 +08:00
jasder 855c51a470 FIX 解决在线创建文件错误提示信息不准确的问题 2021-06-18 16:20:50 +08:00
jasder 1fd514186c Merge branch 'sync_develop' into develop 2021-06-18 11:03:18 +08:00
jasder aff088a444 ADD issues all count for issues api 2021-06-18 11:02:58 +08:00
jasder 4223100180 "FIX 修复pulls、issues 搜索数量统计问题 2021-06-18 10:54:05 +08:00
jasder fd9cc46fc0 Merge branch 'develop' into sync_develop 2021-06-18 10:52:47 +08:00
jasder 67e49a4f56 FIX 修复pulls、issues 搜索数量统计问题 2021-06-18 10:52:14 +08:00
jasder c4f701607c fix table name bug 2021-06-17 17:31:08 +08:00
jasder 80a6ad6712 fix meger develop branch 2021-06-17 17:30:11 +08:00
jasder 9e01bb4f24 FIX change table name 2021-06-17 17:28:15 +08:00
jasder bf0bf0e23b 解决applied_projects相关表操作的问题 2021-06-17 17:05:32 +08:00
jasder b38e7dce2d 增加排序参数的判断预防SQL注入、项目导航栏数量改为开启中的数量、项目邀请码增加索引、搜索用户sql优化 2021-06-17 17:03:56 +08:00
jasder ffc14da311 FIX get readme file bug 2021-06-17 17:01:23 +08:00
vilet.yy 2682d60717 fix: repeat table name 2021-06-17 16:37:48 +08:00
vilet.yy bdb8154a55 add: fork user type 2021-06-17 16:25:48 +08:00
vilet.yy 09dfd504c2 fix: sql attack 2021-06-17 16:13:40 +08:00
jasder 155fafff9a FIX code bug 2021-06-17 14:42:32 +08:00
vilet.yy 880f09a94a fix: change pulls navbar count 2021-06-16 11:10:26 +08:00
vilet.yy 80c1573aea fix: change issue navbar count 2021-06-16 10:42:04 +08:00
vilet.yy be63beb78b fix: update openning count navbar 2021-06-16 09:49:08 +08:00
vilet.yy 7fccd2aed2 fix: nickname search alone 2021-06-15 16:14:15 +08:00
vilet.yy 818317c292 fix: projects load by invite code slowly 2021-06-15 15:33:23 +08:00
jasder 7c43f2d8fc ADD 邀请码功能 2021-06-11 17:43:14 +08:00
jasder d5ad96c7d2 ADD 数据统计功能 2021-06-11 17:41:59 +08:00
vilet.yy 1501b21f8c fix: update doc 2021-06-11 16:29:25 +08:00
vilet.yy bdec369ec2 back: change navbar count 2021-06-11 16:19:43 +08:00
vilet.yy 1376e004f2 fix 2021-06-11 14:54:24 +08:00
vilet.yy 672f37fe48 add: project detail show open task count 2021-06-11 14:11:44 +08:00
vilet.yy 7c1725ebe2 fix: invite code error 2021-06-11 11:54:00 +08:00
jasder a99fb69b30 Merge branch 'develop' into sync_develop 2021-06-11 11:22:12 +08:00
jasder d2340e30cb ADD admim statistics url 2021-06-11 11:21:44 +08:00
jasder a695600b52 FIX update CHANGELOG.md 2021-06-11 11:20:39 +08:00
vilet.yy d077f18590 fix: update invite_code error 2021-06-11 09:30:22 +08:00
vilet.yy 44cbb537ca add: role field 2021-06-10 11:44:48 +08:00
vilet.yy 9d07181733 fix: undo_events 2021-06-10 10:57:06 +08:00
vilet.yy 77c1b1e188 add: undo_join_projects 2021-06-10 10:49:26 +08:00
vilet.yy 5489ea9fbc add: applied join project 2021-06-09 16:53:09 +08:00
vilet.yy d4b8b3e24f add: invite code 2021-06-09 13:36:57 +08:00
jasder c5d73b7cf8 v3.1.0
* 改版升级个人主页
* 修复bug
* 更改license
2021-06-09 09:52:57 +08:00
jasder 5ef9549b6b change license 2021-06-09 09:48:51 +08:00
jasder 1fca089949 FIX change license 2021-06-09 09:43:34 +08:00
jasder 8831345fd2 搜索无法匹配昵称用户、用户画像开发能力缓存数据 2021-06-08 18:11:41 +08:00
jasder 39acaa7f21 FIX 解决头歌版本库无法访问的问题 2021-06-08 14:34:03 +08:00
vilet.yy 02fe8a8966 add: user and platform cache 2021-06-08 11:51:46 +08:00
jasder 5ca897dc43 Merge branch 'develop' into sync_develop 2021-06-08 09:39:14 +08:00
vilet.yy a5b98bcad4 fix: concat nickname 2021-06-07 14:56:23 +08:00
vilet.yy d5a65112ca fix: statistics develop load slowly 2021-06-07 14:17:12 +08:00
jasder 4754993e2a ADD 个人中心模块
用户开发能力
用户近期活动统计
用户贡献度
用户动态
用户开发能力
用户角色定位
用户专业定位
用户精选模块
修改个人资料
修改账号密码
调整导入初始数据的顺序
mimemagic安装不上
2021-06-04 18:51:09 +08:00
vilet.yy e8f4b3f17c fix 2021-06-04 18:43:12 +08:00
vilet.yy c211c38d87 fix 2021-06-04 18:41:19 +08:00
vilet.yy 12c252ea10 fix: merge from hh_develop 2021-06-04 18:36:33 +08:00
vilet.yy 2ea9fcd4d7 add: projects filter choosed 2021-06-04 18:35:35 +08:00
jasder 8133fcd37a FIX 更改推荐项目排序方式 2021-06-04 11:33:21 +08:00
jasder c5c67afacc 解决一些bug
* FIX 解决镜像项目手动同步镜像不成功的问题
* FIX新建易修api中 更新相关cache key
2021-06-03 17:26:19 +08:00
viletyy ed8d646d47 add: user update password 2021-06-03 17:12:27 +08:00
jasder fcf8033fbf FIX 解决镜像项目手动同步镜像不成功的问题 2021-06-03 17:04:22 +08:00
jasder 2b82b2c4f5 FIX [bug]新建易修api中 更新相关cache key 2021-06-03 16:56:54 +08:00
viletyy 93169f8c96 fix: user update return info 2021-06-03 15:43:36 +08:00
viletyy 6b436acfaf add: user info add gender 2021-06-03 15:22:08 +08:00
viletyy 317c211de9 add: user info add show field 2021-06-03 11:56:32 +08:00
viletyy c58b074173 fix: init project 2021-06-03 11:27:13 +08:00
vilet.yy 7dc21ff388 add: update user more info 2021-06-03 11:27:13 +08:00
vilet.yy 0368c0321f fix: org transfer bug 2021-06-03 11:27:13 +08:00
vilet.yy fff790bb19 add: pinned projects project_id 2021-06-03 11:27:13 +08:00
vilet.yy 16c293562a add: pinned projects order by position 2021-06-03 11:27:12 +08:00
vilet.yy 7ba45bc866 fix: some bug 2021-06-03 11:27:12 +08:00
vilet.yy 21d4751327 add: update user image 2021-06-03 11:27:12 +08:00
vilet.yy dc91cd4346 fix 2021-06-03 11:27:12 +08:00
vilet.yy 86f0f2051d add: update user_info 2021-06-03 11:27:12 +08:00
vilet.yy dc4c99c305 fix: psimple issue field 2021-06-03 11:27:12 +08:00
vilet.yy 7fa1cdf73e add: user created time 2021-06-03 11:27:12 +08:00
vilet.yy cdce7049ad fix 2021-06-03 11:27:12 +08:00
vilet.yy 1872ad00d5 uupdate: api docs 2021-06-03 11:27:12 +08:00
vilet.yy 2410f5bbc0 add: user statistics 2021-06-03 11:27:12 +08:00
vilet.yy ca8fa20c2c add: user project trends 2021-06-03 11:27:12 +08:00
vilet.yy ea79772bd2 add: user pinned projects 2021-06-03 11:27:12 +08:00
vilet.yy 422fd35f1e add: user headmap 2021-06-03 11:27:12 +08:00
vilet.yy 496867cac7 add: update user more info 2021-06-03 10:19:33 +08:00
vilet.yy e4a40fb382 fix: org transfer bug 2021-06-03 09:48:58 +08:00
jasder a0ca4d3acb FIX 新建易修api中 更新相关cache key 2021-06-02 17:35:06 +08:00
vilet.yy c727ccf3e6 add: pinned projects project_id 2021-06-02 17:29:11 +08:00
vilet.yy 96a8da5d26 add: pinned projects order by position 2021-06-02 16:40:40 +08:00
vilet.yy df6da37b95 fix: some bug 2021-06-02 15:29:00 +08:00
vilet.yy 2ad963cdf1 add: update user image 2021-06-01 10:07:01 +08:00
vilet.yy 4a1b857655 fix 2021-05-31 18:46:39 +08:00
vilet.yy 0b450c0c5f add: update user_info 2021-05-31 18:39:49 +08:00
vilet.yy a0f0b5e3f1 fix: psimple issue field 2021-05-28 18:00:53 +08:00
vilet.yy 9a2b067bc1 add: user created time 2021-05-28 16:53:37 +08:00
vilet.yy 5431349d46 fix 2021-05-28 16:08:49 +08:00
vilet.yy 61b19c1745 uupdate: api docs 2021-05-28 16:04:52 +08:00
vilet.yy 1df95eab4d add: user statistics 2021-05-28 15:36:05 +08:00
vilet.yy ff1c80d1de add: user project trends 2021-05-27 16:40:15 +08:00
vilet.yy c2449d59af add: user pinned projects 2021-05-27 14:23:59 +08:00
vilet.yy cacc807978 add: user headmap 2021-05-27 10:30:34 +08:00
jasder 77076c60a6 ADD issue、pull、milestone钩子,自动触发项目的更新时间 2021-05-26 17:37:13 +08:00
jasder e716dba249 FIX query project members api bug 2021-05-24 17:05:06 +08:00
jasder 8a10a183e0 Merge branch 'develop' 2021-05-24 10:18:03 +08:00
jasder 554925eacd FIX update CHANGELOG.md 2021-05-24 10:17:20 +08:00
jasder 6d1bcabd51 Merge branch 'master' of https://git.trustie.net/jasder/forgeplus 2021-05-24 10:10:24 +08:00
jasder 203624a615 Merge branch 'sync_develop' into develop 2021-05-21 19:26:31 +08:00
jasder e0eae66ab4 FIX [用户查询方式]临时处理获取readme文件问题 2021-05-21 19:26:17 +08:00
jasder a8e53d4e5c FIX [code bug]临时处理获取readme文件问题 2021-05-21 18:51:46 +08:00
jasder 1c8d0686ee FIX [base64解码操作]临时处理获取readme文件问题 2021-05-21 18:41:29 +08:00
jasder 5b2d6a8063 FIX [bug]临时处理获取readme文件问题 2021-05-21 18:34:33 +08:00
jasder ffa74e92a3 FIX 临时处理获取readme文件问题 2021-05-21 18:29:14 +08:00
jasder 00f5a7f916 ADD issue pull 支持内容搜索 2021-05-21 16:42:53 +08:00
jasder 8a47761afb ADD mergeable column for get pull api 2021-05-21 11:39:50 +08:00
jasder c627ea6c19 FIX migration project accelerator's bug 2021-05-17 17:14:55 +08:00
jasder 2f9d583fac FIX add nickname lastname query conditions for list users api 2021-05-17 16:57:46 +08:00
jasder acc4282c8e Merge branch 'sync_develop' into develop 2021-05-15 10:19:57 +08:00
jasder 27d9d806ce FIX update project bug 2021-05-15 10:19:25 +08:00
jasder 5d91b6b3be ADD 页面置顶功能等功能
* ADD 页面置顶功能
* ADD FAQ快速入口
* 修复bug
2021-05-14 17:34:07 +08:00
jasder 8ee0acae85 set default desc sort for faqs api 2021-05-14 16:39:32 +08:00
jasder dac07bcae0 ADD 页面置顶功能、帮助文档快速入口 2021-05-14 16:23:19 +08:00
jasder b1abac201f FIX query columns bug with query recommend organization api 2021-05-13 15:06:41 +08:00
jasder e304dd0c98 FIX query recommend organization bug 2021-05-13 15:02:28 +08:00
jasder fe9201d9f6 FIX code bug 2021-05-13 14:56:58 +08:00
jasder c2d7d8289e FIX dismiss num for recommend projects api 2021-05-13 14:53:46 +08:00
jasder 2cca2c756e ADD recommend organizations api 2021-05-13 14:52:07 +08:00
jasder 3c61848a77 Merge branch 'sync_develop' into develop 2021-05-10 14:38:46 +08:00
jasder 23704dbae3 FIX get mirror url bug with get detail repo api 2021-05-10 14:38:39 +08:00
jasder 86f03ffafc Merge OK 2021-05-08 17:46:22 +08:00
jasder 9f837c62fb Update CHANGELOG.md 2021-05-08 17:01:50 +08:00
jasder d768e81afd Update CHANGELOG.md 2021-05-08 16:48:56 +08:00
jasder 8341c177b6 FIX craete team bug 2021-05-08 16:44:51 +08:00
vilet.yy 5c9702b308 fix: build owner team need nickname 2021-05-08 15:12:48 +08:00
jasder f470807225 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-05-08 14:23:05 +08:00
jasder 51597335a4 FIX 修复易修标题过长导致排版问题 2021-05-08 14:13:16 +08:00
jasder eba8a3553d ADD valiate
* ADD 项目验证信息
* ADD 组织验证信息
* ADD 团队验证信息
* FIX 处理找不到贡献者的bug
* FIX 处理同步镜像项目导航设置功能的bug
2021-05-08 14:11:37 +08:00
vilet.yy e490ddb1f5 add: sync mirror project remove pulls module 2021-05-07 17:27:37 +08:00
guotao c96dacbf88 修复编号:45283 易修标题过长导致排版问题 去掉多余的属性 2021-05-07 16:26:56 +08:00
jasder b162b3357a FIX get mirror url bug 2021-05-07 14:06:40 +08:00
jasder c67686bdf5 FIX code review 2021-05-07 11:10:03 +08:00
guotao 1021731d2b 修复编号:45283 易修标题过长导致排版问题 2021-05-07 10:45:31 +08:00
vilet.yy fc5876fc32 add: team valid 2021-05-06 18:22:30 +08:00
vilet.yy 411c10e8f3 add: project update valid and user login valid 2021-05-06 17:37:30 +08:00
vilet.yy d867823f01 add: organization validate 2021-05-06 17:04:08 +08:00
vilet.yy 604c2595d3 add: projects create validate length 2021-05-06 15:10:02 +08:00
vilet.yy 1c111e83b3 fix: project controbutor nil 2021-05-06 14:48:59 +08:00
jasder 4643d2387c ADD 创建合并请求错误提示
创建合并请求错误提示
2021-04-30 16:55:06 +08:00
vilet.yy 3ca629d47d fix:create repo error 2021-04-30 16:45:09 +08:00
vilet.yy a9c0d18a5f add: gitea response process 2021-04-30 16:28:29 +08:00
jasder b22330d146 Merge branch 'sync_develop' into develop 2021-04-29 23:23:25 +08:00
jasder b2e338732d FIX 解决合并请求的权限问题 2021-04-29 23:23:16 +08:00
jasder d71272146f Merge branch 'sync_develop' into develop 2021-04-29 23:18:56 +08:00
jasder c56f0ca7fc FIX 解决合并请求的权限问题 2021-04-29 23:17:55 +08:00
jasder 744f857f20 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-29 19:24:49 +08:00
jasder f222cc6e4f FIX bug
个人名下所有仓库加载接口调整
2021-04-29 19:18:58 +08:00
jasder e87413f8a0 FIX migrate repo api bug 2021-04-29 19:12:48 +08:00
jasder 0133ec24ca FIX pr merge bug 2021-04-29 18:48:54 +08:00
jasder 03e54f9b3d Merge branch 'sync_develop' into develop 2021-04-29 18:37:09 +08:00
jasder 1277e717ff ADD github gitlab镜像加速器 2021-04-29 18:35:57 +08:00
vilet.yy 1a7b323120 fix: user info projects count 2021-04-29 18:09:39 +08:00
vilet.yy fffe57a211 fix: mirror project permission error 2021-04-29 18:09:39 +08:00
vilet.yy b673747475 fix: personal projects 2021-04-29 18:09:38 +08:00
jasder a4555e2d10 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-29 10:41:40 +08:00
jasder c920994274 FIX bug
* 解决合并请求允许指派给开发者
* 开发者可以合并请求
* 更新仓库信息自动删除代码库模块
2021-04-29 10:41:30 +08:00
vilet.yy c14c92ac11 fix: pull_request permit develop create pr 2021-04-29 10:32:49 +08:00
jasder 8bf02b1ee5 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-28 21:16:52 +08:00
jasder 9876e84c17 FIX bug 2021-04-28 21:15:58 +08:00
vilet.yy ea42b0d6ed fix: pull_request can not select reporter and compare userinfo lose 2021-04-28 20:10:21 +08:00
jasder 660a48b257 FIX 易修、合并请求选择成员增加组织成员 2021-04-28 16:57:12 +08:00
vilet.yy 65d51e8578 add: project operate add organization team users 2021-04-28 15:15:45 +08:00
jasder c3d9e38e05 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-27 18:24:25 +08:00
jasder 7d612ea6b3 ADD 转移仓库功能以及待办事项 2021-04-27 18:24:10 +08:00
vilet.yy 120a33bc8a add: undo count 2021-04-27 15:43:37 +08:00
vilet.yy b68c9945e5 add: project edit transfer 2021-04-27 14:40:18 +08:00
vilet.yy 01360de423 fix: acceptor must exist 2021-04-27 13:56:12 +08:00
jasder 5bd33c033c FIX bug 2021-04-26 16:52:48 +08:00
vilet.yy 0d828ead1f fix:some bug 2021-04-26 16:50:50 +08:00
jasder 1a22491e36 ADD admin role to org api 2021-04-26 16:45:58 +08:00
jasder 95a355b87c FIX admin projects api bug 2021-04-26 16:45:26 +08:00
vilet.yy 13768f9778 add: same repo condition 2021-04-26 15:28:49 +08:00
vilet.yy 220ca96669 fix 2021-04-26 15:17:51 +08:00
vilet.yy 28c8761f32 fix 2021-04-26 15:11:08 +08:00
vilet.yy 1d81548eb6 fix 2021-04-26 11:32:59 +08:00
vilet.yy 96238c2e13 fix 2021-04-26 11:04:10 +08:00
vilet.yy d532dc7cf5 fix: some bug and users api doc 2021-04-26 10:57:57 +08:00
vilet.yy 8b7b1b7a4e add: api doc about projects 2021-04-26 10:07:22 +08:00
vilet.yy 1e081b5a3e add: transfer project 2021-04-25 18:41:13 +08:00
jasder 8c71a72fce FIX code bug 2021-04-23 17:53:59 +08:00
jasder ee7acaaa82 FIX update README.md 2021-04-23 17:32:45 +08:00
jasder c1d4df6e06 FIX release show time bug 2021-04-23 17:21:17 +08:00
jasder 55f7beb22d FIX update CHANGELOG.md 2021-04-23 17:19:28 +08:00
jasder aa314c141c ADD some url with in hovercoard api 2021-04-23 14:40:26 +08:00
jasder 37e1704897 ADD location column for user hovercard api 2021-04-22 18:10:20 +08:00
jasder ddacf2a733 FIX get organzition's name bug 2021-04-22 16:45:26 +08:00
jasder d07543111a FIX code bug 2021-04-22 16:42:50 +08:00
jasder 908cda56f3 ADD users/hovercard api 2021-04-22 16:36:40 +08:00
jasder 841778900c FIX code review 2021-04-22 16:35:54 +08:00
jasder 6a3d297b30 FIX code bug 2021-04-20 19:07:48 +08:00
jasder 002c773746 FIX code bug 2021-04-20 19:06:31 +08:00
jasder 45f05c9fc4 FIX render commmiter and author avatar bug 2021-04-20 18:58:14 +08:00
jasder 84e48d25c1 FIX render user bug with pull‘s commits and repo's commits api 2021-04-20 18:35:41 +08:00
jasder 37d8a5426f Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-20 11:14:03 +08:00
jasder df3bf621ce FIX 团队中的项目名称显示问题 2021-04-20 11:08:18 +08:00
vilet.yy da98efe04f add: org project field 2021-04-20 10:50:06 +08:00
vilet.yy 2976742b29 fix: org team nickname change error 2021-04-19 18:37:30 +08:00
vilet.yy 55e081ba2b fix 2021-04-19 18:37:30 +08:00
vilet.yy a3c49b3d5f add: org valid 2021-04-19 18:37:30 +08:00
vilet.yy 5a9f29c25f fix 2021-04-19 18:37:30 +08:00
vilet.yy f75827bcf0 fix: org not need create member 2021-04-19 18:37:30 +08:00
vilet.yy f0c4d1226b fix: org not need create member 2021-04-19 18:37:30 +08:00
vilet.yy 3a47c61010 add: team nickname 2021-04-19 18:37:30 +08:00
jasder 1f0388c1a1 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-19 18:36:07 +08:00
jasder de6ae5b720 Upate models Schema Information 2021-04-19 18:36:02 +08:00
jasder 8a55e84372 FIX 调整自动生成头像中字母大小 2021-04-19 18:34:18 +08:00
jasder f055fed7d0 ADD 创建团队支持中文名称
创建组织团队使用中文名称报错、组织项目下创建issue报错
2021-04-19 18:10:31 +08:00
jasder 21befb6486 FIX auto generate avatar bug 2021-04-19 17:28:57 +08:00
jasder b6e8a135f0 FIX url_to_avatar bug 2021-04-19 15:42:54 +08:00
jasder 9cddda7fd4 Update render user avatar url in projects api 2021-04-19 15:38:51 +08:00
jasder 002ae9f327 ADD auto generate user avatar 2021-04-19 15:06:56 +08:00
vilet.yy 8055ae2c07 fix: org team nickname change error 2021-04-19 12:14:11 +08:00
vilet.yy 01f32ae2d7 fix 2021-04-19 12:09:38 +08:00
vilet.yy 1c6982d15b add: org valid 2021-04-19 12:07:12 +08:00
vilet.yy 9300483c1a fix 2021-04-19 11:40:38 +08:00
vilet.yy 1920cb5ce3 fix: org not need create member 2021-04-19 11:35:12 +08:00
vilet.yy 5a20842edb fix: org not need create member 2021-04-19 11:26:30 +08:00
vilet.yy 506ab1722d add: team nickname 2021-04-19 10:54:36 +08:00
jasder 07d11737e9 组织权限问题
组织权限问题
2021-04-13 16:39:50 +08:00
vilet.yy 1fe9ea126a fix: permission with organization 2021-04-13 11:53:06 +08:00
jasder dcd4457cf5 FIX 开放平台管理员可以访问所有团队信息 2021-04-13 10:16:18 +08:00
jasder 0bd6621821 项目增加课程链接 2021-04-08 18:35:49 +08:00
vilet.yy 04a1376820 add: project's lesson_url 2021-04-08 15:20:34 +08:00
jasder c3a1fb78ea 组织支持中文名称 2021-04-07 11:34:37 +08:00
vilet.yy cf224bc9fe add: project menulist resources 2021-04-07 11:29:44 +08:00
vilet.yy d6c3bcfaf1 add: org add nickname 2021-04-07 11:29:44 +08:00
vilet.yy a66e5b876d fix 2021-04-07 11:29:44 +08:00
vilet.yy b11fd350da fix: project permission 2021-04-07 11:29:44 +08:00
vilet.yy c417fa7369 add: project list author type 2021-04-07 11:29:44 +08:00
jasder e9a4370adc pull bug 2021-04-02 18:57:49 +08:00
jasder e6b8435037 FIX gug 2021-04-02 18:57:13 +08:00
vilet.yy c175fa1339 fix: commit author and fork create units 2021-04-02 18:53:53 +08:00
jasder 6ce4b26047 FIX api bug 2021-04-02 18:40:26 +08:00
jasder e022e429d4 FIX code bug 2021-04-02 18:22:21 +08:00
jasder 50fb8d3983 ADD sync user info api 2021-04-02 18:18:52 +08:00
jasder 02d26df172 FIX query builds api bug 2021-04-02 15:53:17 +08:00
jasder 254718e390 Update db/structure.sql 2021-04-01 20:33:05 +08:00
jasder 0b6ebb7b36 FIX get site url bug with setting api 2021-04-01 15:04:17 +08:00
jasder e638dccfa5 update readme 2021-03-31 16:08:00 +08:00
jasder b89501822f FIX code bug 2021-03-31 14:53:50 +08:00
jasder 5f5b380514 FIX conflict 2021-03-31 13:35:40 +08:00
jasder d2293a2778 FIX setting api bug 2021-03-31 12:44:40 +08:00
jasder 7d0b05f975 update readme 2021-03-31 12:43:06 +08:00
jasder 9393ceb8b7 Update readme and deploy 2021-03-31 10:30:39 +08:00
jasder 860b46685a fix bug 2021-03-31 10:24:37 +08:00
jasder 62b99c517e Update deploy doc 2021-03-31 10:08:20 +08:00
jasder 3869529620 Update setting api 2021-03-31 09:49:05 +08:00
vilet.yy 9394d15752 fix: menu manager allow visit 2021-03-30 17:27:50 +08:00
vilet.yy 8952f6a944 fix: menu manager allow visit 2021-03-30 17:13:58 +08:00
vilet.yy ffa2782637 fix: detail release version limit 2021-03-30 16:34:31 +08:00
vilet.yy d0a65775aa fix: not show commiter avatar 2021-03-30 16:34:12 +08:00
vilet.yy d7a459bad2 add: dir md 2021-03-30 16:33:21 +08:00
jasder fc522be5ea Merge branch 'trustie_server' into develop 2021-03-30 15:25:59 +08:00
jasder 9195d43a34 Update readme and deply doc 2021-03-30 15:15:17 +08:00
jasder a866415990 Merge branch 'master' into develop 2021-03-30 14:20:47 +08:00
jasder 69bf30d482 Merge branch 'develop' into trustie_server 2021-03-28 20:05:34 +08:00
jasder c4560ebb66 FIX tags api bug 2021-03-28 20:05:13 +08:00
jasder 0211d6152e fix conflict 2021-03-28 20:00:28 +08:00
jasder 12f1aba07e Merge branch 'develop' into trustie_server 2021-03-28 19:44:36 +08:00
jasder 63d91919ae FIX repo detail api bug 2021-03-28 19:44:23 +08:00
jasder 06c851d22f Merge branch 'develop' into trustie_server 2021-03-27 23:54:32 +08:00
jasder ad4617288d FIX repositories detail api bug 2021-03-27 23:54:14 +08:00
jasder 7c0a2aa89e Merge branch 'develop' into trustie_server 2021-03-25 14:31:45 +08:00
jasder e1d7b0b881 FIX readme decoder bug
safe
2021-03-25 14:30:26 +08:00
vilet.yy 7f28f07665 fix: readme error 2021-03-25 11:31:43 +08:00
jasder 3be5c013a8 fix bug 2021-03-24 18:36:05 +08:00
vilet.yy 70c7b1da0c add: auto counter rake 2021-03-24 15:42:57 +08:00
vilet.yy 66608b3baa add: detail project description 2021-03-24 13:59:24 +08:00
vilet.yy 9ee42e805b fix: update error 2021-03-24 13:50:17 +08:00
vilet.yy 15f9004f63 add: edit permit website 2021-03-24 10:50:47 +08:00
jasder 0f67944911 FIX code bug 2021-03-23 15:58:12 +08:00
jasder 8b656fd409 FIX bug 2021-03-23 15:47:01 +08:00
jasder 815b364428 ADD common url with setting api 2021-03-23 15:42:56 +08:00
jasder 18ae3853d7 FIX update setting api 2021-03-23 11:42:22 +08:00
jasder ce18cc380a Merge branch 'develop' into trustie_server 2021-03-22 21:02:17 +08:00
jasder cbc6f4e7d1 fix bug 2021-03-22 20:53:39 +08:00
jasder aa23762b2f FIX update setting api for nav bar url 2021-03-22 18:02:12 +08:00
vilet.yy 5c864acb64 fix: create repo not use website 2021-03-22 15:50:08 +08:00
vilet.yy 8bbfea2079 fix 2021-03-22 11:18:04 +08:00
vilet.yy 8c2a543e61 fix: project code change to default 2021-03-22 11:16:35 +08:00
jasder 2932866198 Merge branch 'master' of https://git.trustie.net/jasder/forgeplus 2021-03-22 09:50:35 +08:00
jasder 0d8ddc34cc FIX update Changelog 2021-03-22 09:50:24 +08:00
jasder 0909223867 FIX get readme api method 2021-03-21 11:24:34 +08:00
jasder c07c570061 动态导航权限控制,没有勾选模块不能进入页面,语言过滤0.0%
动态导航权限控制,没有勾选模块不能进入页面,语言过滤0.0%
2021-03-19 18:40:23 +08:00
vilet.yy 223755a965 fix: languages filter 0.0% 2021-03-19 18:36:55 +08:00
vilet.yy f1ed61c687 add: menu permission control 2021-03-19 18:01:29 +08:00
vilet.yy 553a584121 fix: migrate create unit
fix
2021-03-19 17:38:14 +08:00
jasder 04288a734e 木兰项目同步脚本以及动态导航简化 2021-03-19 15:07:07 +08:00
vilet.yy db2ba95e24 fadd: repo edit unit 2021-03-19 15:05:09 +08:00
vilet.yy 39f0811f0a fix:simple unit 2021-03-19 14:58:25 +08:00
vilet.yy 495de925dd add: sync mulan repo 2021-03-19 11:29:31 +08:00
jasder f18c56129e FIX 改版项目详情页面 2021-03-18 18:08:38 +08:00
vilet.yy 6a7ef2a1a7 add: repo contributors 2021-03-18 16:35:46 +08:00
vilet.yy 25186b4e81 fix 2021-03-18 09:55:58 +08:00
vilet.yy a627ab4d82 fix 2021-03-18 09:51:56 +08:00
vilet.yy 187ad1d263 fix 2021-03-17 13:51:08 +08:00
vilet.yy 8f98a83379 add: project unit list 2021-03-17 13:50:26 +08:00
vilet.yy a14459da50 add: project menu list 2021-03-17 11:52:36 +08:00
vilet.yy f17e436d62 add: doc 2021-03-16 11:10:58 +08:00
vilet.yy 34d95451b5 add: get project all files 2021-03-16 10:25:37 +08:00
vilet.yy b43926f69f add: new project detail 2021-03-15 19:01:35 +08:00
jasder bd46d2dcc7 fix 2021-03-11 14:59:21 +08:00
jasder 6063c7c414 fix 更新api文档 2021-03-11 14:58:44 +08:00
jasder af289d1f5e Update changelog 2021-03-05 15:52:50 +08:00
jasder 899e7ccab8 FIX CI 修复参数设置的bug 2021-03-05 15:48:08 +08:00
victor d3df04fb97 参数管理修改 2021-03-05 15:43:42 +08:00
jasder 50928f82c0 FIX valid user before register action 2021-03-05 15:36:26 +08:00
victor 33984e16d0 参数管理修改 2021-03-05 15:26:29 +08:00
jasder 8942c694c4 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-03-05 11:38:45 +08:00
jasder d3a3c645c8 集成CI/CD参数管理功能 2021-03-05 10:48:38 +08:00
victor 3b5d971964 参数删除接口文档 2021-03-04 17:00:29 +08:00
victor 61e5b9132a 参数删除接口修改 2021-03-04 16:52:00 +08:00
victor d7bc309d49 参数管理删除 2021-03-04 09:33:04 +08:00
victor cb90dc1f51 参数管理 2021-03-03 15:36:59 +08:00
jasder 347af1a8ad Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-03-02 15:21:50 +08:00
jasder 41118f6d12 解决pull创建和更新操作的bug 2021-03-02 10:07:13 +08:00
vilet.yy ccbaa8efe5 [FIX]pull_request create and update error 2021-03-01 16:43:09 +08:00
jasder 11350bb76f Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-03-01 10:02:35 +08:00
jasder b6b3cb0825 fix bug 2021-02-26 17:51:42 +08:00
jasder fc680b5372 fix notice api 2021-02-26 14:38:32 +08:00
vilet.yy c299c9fa69 [FIX]repository setting entry error 2021-02-26 13:49:29 +08:00
vilet.yy 70922b81db [FIX]watcher type error 2021-02-25 11:52:24 +08:00
vilet.yy 93fa02bd7b [FIX]
[FIX]

[FIX]
2021-02-22 10:53:01 +08:00
vilet.yy ef0c44f29c [ADD]fix error script 2021-02-22 10:10:22 +08:00
vilet.yy 9681a1a491 [FIX]sync mirror project 2021-02-21 17:14:51 +08:00
vilet.yy f7b7122d60 [FIX]join projects add org projects and update project private bug 2021-02-21 15:20:04 +08:00
Gitea 11471b1520 [FIX]transfer need to save clone_url 2021-02-21 10:02:47 +08:00
jasder 50d81b2490 FIX schema 2021-02-09 11:49:47 +08:00
jasder 9f4c2bd673 FIX repo setting api for forbidden 2021-02-09 11:48:05 +08:00
viletyy 2b898b0d1f [FIX]remove description 2021-02-06 16:43:41 +08:00
jasder 8e4d6c7064 合并组织模块功能 2021-02-06 16:21:47 +08:00
viletyy f06a1f63dd [ADD]project transfer
[FIX]

[FIX]
2021-02-06 15:49:59 +08:00
viletyy d85075f951 [FIX]org sync gitea_uid
[FIX]
2021-02-06 15:49:56 +08:00
viletyy ec1acde99a [FIX]show teams, org name valid message 2021-02-06 15:49:56 +08:00
viletyy 55528950f1 [FIX]owner text 2021-02-06 15:49:56 +08:00
viletyy 54204d4db8 [ADD]org team search, project teams add\remove, org can create field
[FIX]
2021-02-06 15:49:55 +08:00
viletyy 4f6f257b37 [FIX]concat change to concat_ws, org render 403, normal team leave 2021-02-06 15:49:54 +08:00
viletyy 629f3fbbe1 [FIX]little vliad about team_user 2021-02-06 15:49:54 +08:00
viletyy ddaca5bafc [ADD]organization add num_teams 2021-02-06 15:49:54 +08:00
viletyy 1e70764d63 [FIX]teams add user info 2021-02-06 15:49:54 +08:00
viletyy 152e301bf3 [ADD]search is_member is_admin 2021-02-06 15:49:54 +08:00
viletyy c6269f44ee [FIX]add user organization count 2021-02-06 15:49:54 +08:00
viletyy 3d495797c0 [FIX]organization add created_at and total_count 2021-02-06 15:49:54 +08:00
viletyy ce4c71c6a0 [FIX]组织可以不上传头像 2021-02-06 15:49:54 +08:00
viletyy dab57e9af3 [FIX]一些筛选以及创建最大项目数量验证 2021-02-06 15:49:53 +08:00
viletyy fef43caf4c [ADD]组织项目相关 2021-02-06 15:49:53 +08:00
viletyy 289d1877d6 [ADD]组织、组织团队 2021-02-06 15:49:53 +08:00
viletyy 0c58447afb [FIX]组织上传头像支持多种格式、项目详情返回拥有者类型
[FIX]

[FIX]
2021-02-06 15:49:52 +08:00
viletyy 3f73484596 [FIX]一些筛选以及创建最大项目数量验证
[FIX]
2021-02-06 15:49:49 +08:00
viletyy f094fe1799 [ADD]组织项目相关 2021-02-06 14:27:47 +08:00
viletyy 1dc43a23b7 [FIX]为组织创建项目做准备 2021-02-06 14:27:47 +08:00
viletyy 31858a79e3 [FIX]成员细节修改 2021-02-06 14:27:47 +08:00
viletyy 7f309edc91 [ADD]组织、组织团队 2021-02-06 14:27:47 +08:00
viletyy c278ed1863 [FIX] 2021-02-06 14:27:47 +08:00
viletyy 2434ca9681 [ADD]组织模块相关代码 2021-02-06 14:27:47 +08:00
jasder 178991b245 平台数据统计功能
1. 新增平台数据统计相关API
2.新增平台数据统计邮件消息系统
2021-02-06 11:27:28 +08:00
viletyy c00336e7b5 [ADD]统计平台概况
[FIX]更改请求参数

[FIX]

[ADD]rank statistic

[FIX]
2021-02-06 11:15:25 +08:00
Jasder 713b249fa5 ADD requierd nodejs version for deploy document 2021-02-03 11:50:31 +08:00
Jasder 5875c625ab FIX set login column value ro ci_templates table 2021-02-02 18:08:27 +08:00
Jasder be57c75166 ADD schema for pipeline model 2021-02-02 16:42:48 +08:00
Jasder 440cedc109 Merge branch 'develop' of http://git.trustie.net/jasder/forgeplus into develop 2021-02-02 16:40:33 +08:00
jasder bbcb515e24 模板管理功能
新增功能:
1. 支持多条流水线
2. 完善CI/CD模板管理功能
2021-02-02 16:39:31 +08:00
victor b18fbd698f Merge branch 'develop' into trustie-pipeline
# Conflicts:
#	app/models/ci/pipeline.rb
2021-02-02 14:41:23 +08:00
Jasder 6053907828 fix change stoage file derictory 2021-02-02 14:32:16 +08:00
Jasder 9f7c9d6ec7 FIX CORS problem for develop 2021-02-02 14:32:13 +08:00
Jasder 9121033a10 ADD upload avatar api with support multiple image formats 2021-02-02 14:32:08 +08:00
victor 8d3838614f FIX pipeline model schma
# Conflicts:
#	app/models/ci/pipeline.rb
2021-02-02 14:32:02 +08:00
Jasder 165f8108f7 ADD api document on line 2021-02-02 14:07:46 +08:00
victor 4816ee04d3 流水线列表查询 2021-02-02 13:10:53 +08:00
victor d2209619f0 流水线增加owner选项 2021-02-02 11:48:09 +08:00
victor 155fc35cfa 获取代码库文件sha 2021-02-01 16:19:42 +08:00
victor ce31875c19 根据阶段查询模板接口 2021-02-01 15:17:03 +08:00
victor d214b1ddae 流水线初始化模板名称修改 2021-02-01 13:40:15 +08:00
victor 22d7478349 content接口返回分支 2021-02-01 10:36:30 +08:00
Jasder 458fca9992 fix change stoage file derictory 2021-01-28 15:11:47 +08:00
victor c3f69a48d6 流水线sha查询 2021-01-28 15:04:51 +08:00
victor c3136fc1a8 流水线查询接口修改 2021-01-28 14:14:22 +08:00
Jasder a93baa908f FIX CORS problem for develop 2021-01-27 17:22:16 +08:00
victor 2c648b7941 流水线创建修改 2021-01-27 16:27:56 +08:00
victor e1ddad5040 新增流水线接口修改 2021-01-27 10:22:53 +08:00
victor 24d5f16302 接口文档修改 2021-01-27 09:35:41 +08:00
victor 6c77b73ec6 创建多条流水线、模板管理 2021-01-26 17:15:53 +08:00
Jasder 3b7d425198 ADD upload avatar api with support multiple image formats 2021-01-26 14:49:02 +08:00
moshenglv 131ccc36c7 Merge branch 'master' into trustie-pipeline 2021-01-21 16:15:18 +08:00
Jasder dcda8671b3 FIX pipeline model schma 2021-01-20 17:00:19 +08:00
jasder 122667c67c Merge pull request '【devops】可视化创建流水线' (#13) from trustie-pipeline into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/13
2021-01-20 16:01:21 +08:00
Jasder 6d51657ecf FIX get latest commit bug
(cherry picked from commit b7e23a62d0)
2021-01-20 14:30:49 +08:00
Jasder 67a7df085c ADD sync repo time print log
(cherry picked from commit f3d4f437cb)
2021-01-20 14:30:44 +08:00
Jasder 0adcbaa19f ADD repository languages percentage api
(cherry picked from commit efa99e0f06)
2021-01-20 14:30:41 +08:00
Jasder 1c59832abf FIX get assignees bug in issues
(cherry picked from commit e9223c53de)
2021-01-20 14:30:39 +08:00
Jasder 814a1d9e6a FIX deal with gitea api response body bug
(cherry picked from commit e7662b66ce)
2021-01-20 14:30:36 +08:00
Jasder 18c989bb6f Update api document
(cherry picked from commit 0f338ede7d)
2021-01-20 14:30:32 +08:00
Jasder ffeb076086 FIX pull api bug
(cherry picked from commit 36a3e36edb)
2021-01-20 14:30:29 +08:00
Jasder 06a7cb7558 FIX get readme file bug
(cherry picked from commit 30138cc1fa)
2021-01-20 14:30:26 +08:00
Jasder 6fa4ee6c14 ADD get readme api
(cherry picked from commit 232f26ea3b)
2021-01-20 14:30:24 +08:00
Jasder 4b34822fe2 FIX sidekiq cron config yml bug
(cherry picked from commit 2253dce4d7)
2021-01-20 14:30:21 +08:00
Jasder 536e78ffd6 FIX code bug
(cherry picked from commit 0e8d475de7)
2021-01-20 14:30:19 +08:00
Jasder e796776f1e FIX updage sidekiq cron
(cherry picked from commit 1e9bd451e5)
2021-01-20 14:30:16 +08:00
Jasder 10883bf05a FIX update cron
(cherry picked from commit f959b38a89)
2021-01-20 14:30:13 +08:00
Jasder 5667c0854c FIX [api] get pull bug
(cherry picked from commit fa01194d3c)
2021-01-20 14:30:10 +08:00
Jasder b6aa0fd76c FIX render json builder partil performance for pull some api
(cherry picked from commit f084b72e3a)
2021-01-20 14:30:06 +08:00
Jasder f212c5213d FIX base and head params problem for compare api
(cherry picked from commit 4c2c3d17e2)
2021-01-20 14:30:01 +08:00
Jasder d2e2793d29 FIX pull request bug
(cherry picked from commit 2b140d6f7c)
2021-01-20 14:29:52 +08:00
Jasder 20b06473be ADD gem 'sidekiq-cron'
(cherry picked from commit 8f24f65820)
2021-01-20 14:29:48 +08:00
Jasder 8c8d9f64c4 ADD sync repo updated at time
(cherry picked from commit 8c6df359a5)
2021-01-20 14:28:56 +08:00
Jasder b7e23a62d0 FIX get latest commit bug 2021-01-20 14:25:07 +08:00
moshenglv f4dc82f7d5 初始化模板脚本 2021-01-20 14:21:16 +08:00
moshenglv f2efed0f1f 初始化数据脚本 2021-01-20 14:03:08 +08:00
moshenglv ab4af170fb 连接ci数据库名修改,根据repo 2021-01-20 13:52:30 +08:00
moshenglv ab3242569d 流水线查询 2021-01-20 11:54:10 +08:00
Jasder f3d4f437cb ADD sync repo time print log 2021-01-20 09:38:11 +08:00
moshenglv 69c6e2ac3f cotent接口修改 2021-01-19 18:39:57 +08:00
moshenglv efdbc6fd4e 创建流水线文件新增接口返回内容修改 2021-01-19 18:23:28 +08:00
moshenglv 3946c7116b 创建pipeline文件接口 2021-01-19 18:11:00 +08:00
moshenglv 0d6ddad013 查询steps接口修改 2021-01-19 16:23:19 +08:00
Jasder efa99e0f06 ADD repository languages percentage api 2021-01-19 16:21:31 +08:00
moshenglv 7e9acd1850 返回流水线文件sha 2021-01-19 14:19:06 +08:00
moshenglv 1001d10017 流水线字段校验 2021-01-19 14:00:22 +08:00
moshenglv 703be3f9a1 返回流水线内容同步状态 2021-01-19 13:59:55 +08:00
moshenglv f90bc0897b 流水线关联项目 2021-01-19 11:52:29 +08:00
moshenglv 05416339e5 流水线查询返回字段修改 2021-01-19 11:10:47 +08:00
moshenglv 5e0cdba1f9 流水线与项目关联 2021-01-19 11:03:27 +08:00
Jasder 5fd5bf32d8 Merge branch 'develop' 2021-01-18 15:28:38 +08:00
Jasder e9223c53de FIX get assignees bug in issues 2021-01-18 15:28:20 +08:00
Jasder e7662b66ce FIX deal with gitea api response body bug 2021-01-18 11:22:31 +08:00
moshenglv c6aeecb33c 查询阶段返回流水线名称 2021-01-18 09:58:33 +08:00
Jasder 0f338ede7d Update api document 2021-01-18 09:51:07 +08:00
moshenglv 2d99713cd0 流水线增加用户字段 2021-01-18 09:32:23 +08:00
Jasder 36a3e36edb FIX pull api bug 2021-01-15 18:38:53 +08:00
Jasder 30138cc1fa FIX get readme file bug 2021-01-15 18:36:19 +08:00
Jasder 232f26ea3b ADD get readme api 2021-01-15 15:38:49 +08:00
moshenglv 9af0ff4a71 步骤查询接口返回模板信息修改 2021-01-15 11:05:38 +08:00
Jasder 2253dce4d7 FIX sidekiq cron config yml bug 2021-01-14 18:39:12 +08:00
Jasder 0e8d475de7 FIX code bug 2021-01-14 18:25:49 +08:00
Jasder 1e9bd451e5 FIX updage sidekiq cron 2021-01-14 18:22:01 +08:00
Jasder f959b38a89 FIX update cron 2021-01-14 17:04:58 +08:00
moshenglv ac6858a205 阶段步骤修改接口 2021-01-14 15:36:22 +08:00
moshenglv a71f0b0550 阶段步骤新增接口 2021-01-14 15:34:35 +08:00
moshenglv 4ac7634031 流水线步骤新增、更新 2021-01-14 15:32:49 +08:00
moshenglv da1a992670 流水线查询返回时间格式化 2021-01-13 15:10:24 +08:00
moshenglv cb6c4b1e3f 阶段新增、删除、查询步骤接口修改 2021-01-12 17:40:42 +08:00
Jasder fa01194d3c FIX [api] get pull bug 2021-01-12 17:34:07 +08:00
Jasder f084b72e3a FIX render json builder partil performance for pull some api 2021-01-12 15:55:11 +08:00
Jasder 4c2c3d17e2 FIX base and head params problem for compare api 2021-01-12 15:47:04 +08:00
Jasder 2b140d6f7c FIX pull request bug 2021-01-12 15:45:18 +08:00
moshenglv bcb4e78829 修改模板查询相关接口 2021-01-12 13:54:11 +08:00
moshenglv 77529319a1 可视化创建流水线后端代码 2021-01-12 10:23:26 +08:00
Jasder 8c6df359a5 ADD sync repo updated at time 2021-01-08 18:07:48 +08:00
Jasder 8f24f65820 ADD gem 'sidekiq-cron' 2021-01-08 18:03:51 +08:00
jasder 2f140d13f0 Merge pull request '用户可以查看其他用户的构建列表' (#10) from trustie_server into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/10
2021-01-06 18:50:31 +08:00
moshenglv 9a66b48726 用户可以查看其他用户的构建列表 2021-01-06 18:47:39 +08:00
jasder 5cdfc4ba62 Merge pull request '解绑流程修改' (#9) from trustie_server into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/9
2021-01-06 16:53:22 +08:00
moshenglv 06b8aab455 解绑时先判断是否是trustie提供服务器的场景 2021-01-06 16:45:18 +08:00
jasder 2abf1f0665 Merge pull request '【devops】trustie提供服务器后台代码' (#8) from trustie_server into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/8
2021-01-06 15:38:29 +08:00
moshenglv cbe5b3afde 解绑时取消激活该用户的所有项目 2021-01-06 14:45:34 +08:00
Jasder 8f846ae29b FIX gitea user register service 2021-01-06 14:00:15 +08:00
moshenglv f7a5157788 使用trustie提供的服务器,需要多增加一条授权信息 2021-01-06 12:59:34 +08:00
moshenglv 910425ddb3 修改授权接口,当选择trustie服务器时,clientId使用创建drone的clientId 2021-01-05 16:40:09 +08:00
moshenglv e412b97003 修改授权接口 2021-01-05 15:04:01 +08:00
moshenglv 387a565fe3 自有服务器进行判断是否已经绑定云账号 2021-01-04 16:18:49 +08:00
moshenglv bab9174966 选trustie服务器解绑时删除drone用户 2021-01-04 14:57:28 +08:00
moshenglv 4aae60f3d8 打印调用drone创建用户接口日志 2021-01-04 09:49:42 +08:00
moshenglv 1108b298f0 绑定调用gitea接口,,错误,抛出异常 2021-01-04 09:41:04 +08:00
moshenglv 47093ffcb9 调用drone创建用户接口 2020-12-31 19:39:20 +08:00
moshenglv 3d332c75d6 连接ci数据库方法 2020-12-31 17:13:41 +08:00
moshenglv a84af1d743 根据用户选择的服务器类型创建不同的CI数据库连接 2020-12-31 17:07:10 +08:00
moshenglv 2b86c7eb95 修改turstie提供服务器,认证时调用drone url 2020-12-31 16:47:16 +08:00
Jasder 0476246585 Merge branch 'develop' 2020-12-30 15:05:24 +08:00
Jasder d62df0f087 ADD MuLan licenses 2020-12-30 15:05:07 +08:00
Jasder a80037ae8a FIX init db structrue and add records of roles 2020-12-30 15:00:15 +08:00
Jasder ad129db4e6 Merge branch 'develop' 2020-12-30 14:02:32 +08:00
Jasder fa98636eb9 FIX migrate bug 2020-12-30 14:02:21 +08:00
Jasder e127d12390 Merge branch 'develop' 2020-12-30 13:47:26 +08:00
Jasder 56965910a5 ADD column to cloud table 2020-12-30 13:47:00 +08:00
jasder 584ed2e852 NICE 2020-12-30 09:37:02 +08:00
Jasder 6b244b7b80 Merge branch 'develop' 2020-12-29 18:18:44 +08:00
Jasder 50021a278b FIX generate token bug for regitster api 2020-12-29 18:18:17 +08:00
Jasder 1420a47a5c FIX bug 2020-12-28 13:44:03 +08:00
Jasder 72d8af8d7b FIX update deploy file 2020-12-28 13:42:59 +08:00
moshenglv b5ab230a5c 删除调用drone创建用户接口 2020-12-24 10:40:42 +08:00
moshenglv 2666a95176 Merge branch 'master' of https://git.trustie.net/moshenglv/forgeplus into master 2020-12-24 10:38:16 +08:00
moshenglv a3724e80b9 增加trustie提供服务器流程。
1、增加接口trustie_bind
2、根据server_type字段判断使用哪个数据库连接
2020-12-24 10:35:38 +08:00
jasder e370c4df1b Update deploy file 2020-12-24 10:07:36 +08:00
jasder 9e5cf6c2f6 Update README.md 2020-12-24 10:00:39 +08:00
Jasder 32a52a5c7a Update model schemas 2020-12-23 15:48:07 +08:00
Jasder 01f79c81cc FIX code review for create pull request 2020-12-23 15:47:08 +08:00
Jasder ffb71512fc FIX code review for create pull request 2020-12-23 15:46:06 +08:00
moshenglv d70168d255 增加trustie提供服务器流程。
1、增加接口trustie_bind
2、根据server_type字段判断使用哪个数据库连接
2020-12-18 13:14:30 +08:00
Jasder 6cbaf410b2 FIX Grammatical errors 2020-12-10 18:05:33 +08:00
Jasder 5a25ffe101 FIX get repository protected branches bug 2020-12-08 16:48:28 +08:00
Jasder 61c8e41136 FIX log writing failed. xE6 from ASCII-8BIT to UTF-8 2020-12-07 16:04:13 +08:00
Jasder 087ad08303 Merge branch 'develop' 2020-12-07 10:29:37 +08:00
Jasder a4a315ea32 FIX bug 2020-12-07 10:29:18 +08:00
Jasder 0c98d13dbe Merge branch 'develop' 2020-12-07 10:12:49 +08:00
Jasder 07caa77f97 FIX code review 2020-12-07 10:06:08 +08:00
Jasder a357ea3ecd Merge branch 'develop' 2020-12-06 21:48:47 +08:00
Jasder 4c980b5774 FIX create protected branch params 2020-12-04 18:15:48 +08:00
Jasder 539b4a10a0 Upate README.md 2020-12-04 18:15:19 +08:00
Jasder aaf3661fd6 FIX Forces conversion str to boolean 2020-12-04 17:13:58 +08:00
Jasder 7c0c90b9bf Update api document 2020-12-04 16:31:52 +08:00
Jasder 3f60dd3f83 ADD edit protected branch api 2020-12-04 16:18:27 +08:00
Jasder b3649f03e7 ADD get protected branch api 2020-12-04 11:06:12 +08:00
Jasder 23a28cd1a9 FIX delete route regx 2020-12-03 16:06:15 +08:00
Jasder 6a8ae5234b ADD protected branch Features 2020-12-03 15:24:40 +08:00
jasder e8b5811151 test 2020-11-30 18:37:52 +08:00
jasder 6743f9c74c test 2020-11-30 18:27:21 +08:00
jasder c27ff02168 更新 'README.md' 2020-11-30 17:59:36 +08:00
jasder 1f804ceee7 更新 'README.md' 2020-11-30 17:46:06 +08:00
jasder bb93fde1f7 更新 'README.md' 2020-11-30 17:29:13 +08:00
jasder 6bc9ca50ee 更新 '.trustie-pipeline.yml' 2020-11-30 17:23:19 +08:00
jasder d6f57786ba 更新 '.trustie-pipeline.yml' 2020-11-30 17:20:03 +08:00
jasder 38873b25f7 Update '.trustie-pipeline.yml' 2020-11-30 17:19:21 +08:00
jasder ec3c64dc04 Update '.trustie-pipeline.yml' 2020-11-30 17:17:12 +08:00
jasder 0e8467987f Update '.trustie-pipeline.yml' 2020-11-30 17:12:17 +08:00
jasder 4305842a7d Update '.trustie-pipeline.yml' 2020-11-30 16:59:22 +08:00
jasder e40eeaef35 test the ci 2020-11-30 16:50:46 +08:00
jasder c4651fd578 Update '.trustie-pipeline.yml' 2020-11-30 13:47:27 +08:00
Jasder a24f0f8b45 FIX . 2020-11-30 11:50:41 +08:00
jasder e6e616a037 FIX update bunlder version 2020-11-30 11:47:48 +08:00
Jasder 5ab6d0db04 Merge branch 'master' of http://git.trustie.net/jasder/forgeplus 2020-11-30 11:39:35 +08:00
Jasder 8ee5bdbb5b Update deploy file 2020-11-30 11:39:28 +08:00
jasder 40cb8d7e68 Update ruby 2020-11-30 11:21:21 +08:00
Jasder 0089c1b8ba Update ruby version to 2.4.5
* delete ruby 2.3.7 version in Gemfile
* delete .ruby-version for local file with development
2020-11-30 10:27:49 +08:00
Jasder 44572d9b5c Merge branch 'master' of http://git.trustie.net/jasder/forgeplus 2020-11-27 18:09:34 +08:00
Jasder a74dd6605b FIX connection ci db when find repo 2020-11-27 18:09:12 +08:00
jasder c634f7dfeb Update '.trustie-pipeline.yml' 2020-11-27 17:56:33 +08:00
jasder 5cfff14cf1 Update '.trustie-pipeline.yml' 2020-11-27 17:34:52 +08:00
Jasder d3a088e5b6 Update ci yml 2020-11-27 16:50:00 +08:00
Jasder eb730e5d91 Merge branch 'master' of http://git.trustie.net/jasder/forgeplus 2020-11-27 16:46:41 +08:00
Jasder 60b74664e9 Merge branch 'develop' 2020-11-27 16:46:26 +08:00
Jasder a0cd50ffe6 Delete create pr when create or update repo file 2020-11-27 16:46:12 +08:00
jasder c865c948e7 Update '.trustie-pipeline.yml' 2020-11-27 15:46:51 +08:00
jasder 1f35d8ba53 Update '.trustie-pipeline.yml' 2020-11-27 15:22:11 +08:00
jasder dfeb053b30 Update '.trustie-pipeline.yml' 2020-11-27 14:58:45 +08:00
jasder dc8e44b553 Update '.trustie-pipeline.yml' 2020-11-27 13:48:17 +08:00
jasder c2f71c35c2 Update '.trustie-pipeline.yml' 2020-11-27 13:45:57 +08:00
jasder 7805e8d471 Update '.trustie-pipeline.yml' 2020-11-27 11:51:02 +08:00
jasder 2cf1b2b744 Update '.trustie-pipeline.yml' 2020-11-27 11:47:33 +08:00
jasder fbd189d610 Update '.trustie-pipeline.yml' 2020-11-27 11:02:58 +08:00
Jasder 8facfc96e4 FIX merge develop branch 2020-11-27 11:00:37 +08:00
Jasder ba14fce0bd ADD string to strip when crate ci cloud account 2020-11-27 10:19:11 +08:00
Jasder 1daf8591ca FIX Adjust call gitea api for security 2020-11-27 10:18:31 +08:00
Jasder a8cbe566cb FIX delete Chain job when create repo 2020-11-27 09:39:46 +08:00
Jasder 21169b4523 ADD api document 2020-11-26 15:16:23 +08:00
Jasder 0f81caefdf FIX register api for platform default forge 2020-11-26 15:15:51 +08:00
Jasder 9a27b26cef FIX local bug 2020-11-26 15:15:15 +08:00
Jasder 58a80af929 FIX bug 2020-11-24 17:56:30 +08:00
Jasder 17e182788f FIX bug 2020-11-24 17:55:12 +08:00
Jasder 225bb9f7b7 Update table structure's rake task 2020-11-24 17:00:42 +08:00
Jasder d7e0431606 Upate database.yml.example 2020-11-24 16:58:39 +08:00
Jasder 146c21648b FIX . 2020-11-24 11:33:23 +08:00
Jasder 75202b1fc3 FIX code bug 2020-11-24 11:32:03 +08:00
Jasder 5d5f0f42c0 FIX local register bug 2020-11-24 11:30:01 +08:00
Jasder 8f9e12a5e0 Update local register method 2020-11-24 11:22:32 +08:00
Jasder 69f2fd2fbb FIX code review 2020-11-23 15:52:00 +08:00
Jasder 60ac66ebe3 ADD db schema in models 2020-11-23 15:35:03 +08:00
Jasder ba1115f1f3 ADD annotate for models and migration with auto generate 2020-11-23 10:53:59 +08:00
Jasder 558abb71bb Update repository with default branch params 2020-11-19 10:30:18 +08:00
Jasder a54613752e FIX code bug when user register 2020-11-18 10:35:56 +08:00
Jasder f1e3e935af FIX check email exists for register 2020-11-18 10:25:44 +08:00
Jasder 66407eefe1 FIX only email register 2020-11-18 10:17:40 +08:00
Jasder fa6b25a22d FIX render commit bug for sub entries api 2020-11-16 16:03:41 +08:00
Jasder 7449351270 FIX sub entries api return hash object when entries is file 2020-11-16 15:34:16 +08:00
Jasder 0ca699cc49 FIX find educoder project's bug 2020-11-11 10:14:41 +08:00
Jasder b5d3f32d68 FIX code review 2020-11-10 18:18:08 +08:00
Jasder cc19783651 FIX code bug 2020-11-10 18:17:46 +08:00
jasder 3e25089066 Delete 'test_pr.rb' 2020-11-10 16:23:30 +08:00
jasder 1fa878f119 add 2020-11-10 15:40:56 +08:00
jasder 793c616a3b Update '.trustie-pipeline.yml' 2020-11-10 15:40:31 +08:00
jasder 228585c8f0 add 2020-11-10 15:20:36 +08:00
jasder 36e6f7cea0 Add '.trustie-pipeline.yml' 2020-11-10 15:19:42 +08:00
Jasder 1c386e0ab3 FIX coder review 2020-11-10 10:03:30 +08:00
Jasder 939f33a8a2 FIX sha value bug 2020-11-09 17:23:19 +08:00
Jasder 97973b95bf ADD sha column ro pull request's files compare api 2020-11-06 22:03:12 +08:00
Jasder 6b505a34cb Update README.md 2020-11-06 17:29:44 +08:00
Jasder a8c3328bd6 ADD get a commit api 2020-11-06 17:23:14 +08:00
Jasder 181bb05d4a FIX check pr can merge 2020-11-06 15:21:27 +08:00
Jasder 9438bf5cd1 FIX routes bug 2020-11-06 11:01:29 +08:00
Jasder c85ad6444d FIX code bug 2020-11-04 15:03:21 +08:00
Jasder 0fe0f8a38b ADD some fileds for pull api 2020-11-04 14:08:34 +08:00
Jasder 5d84df064a ADD some columns for pull 2020-11-04 14:07:53 +08:00
Jasder 58d8c911a8 ADD format time method 2020-11-04 11:21:51 +08:00
Jasder cfb794c94f FIX bug 2020-11-04 10:09:49 +08:00
Jasder 2347697e93 ADD some api
* api/v1/repos/{owner}/{repo}/pulls/{number}/commits
* api/v1/repos/{owner}/{repo}/pulls/{number}/files
* api/v1/repos/{owner}/{repo}/compare/{base}...{head}
2020-11-03 18:37:47 +08:00
Jasder 70f7b59349 Update search projects api 2020-10-30 17:20:06 +08:00
Jasder 1bc935ffd5 FIX code review and user cache 2020-10-30 15:47:09 +08:00
Jasder ece6cba4a4 FIX skip some action 2020-10-28 17:39:00 +08:00
Jasder b784bb97fd FIX delet some index with projects table 2020-10-23 12:25:08 +08:00
Jasder abcff440e7 ADD index for project_educodes table 2020-10-23 00:50:02 +08:00
Jasder af6c8efb2b FIX 更改 educoder用户头像链接 2020-10-23 00:16:41 +08:00
Jasder bf056a1531 FIX projects page count 2020-10-23 00:07:26 +08:00
Jasder 3f29c09b1b FIX project category order positoin 2020-10-22 22:45:05 +08:00
Jasder bfbe1fdce5 FIX bug 2020-10-22 22:16:55 +08:00
Jasder 91c9423c72 add platform column for projects api 2020-10-22 20:12:28 +08:00
Jasder 58f8d60646 FIX 版本库兼容euducoder平台数据 2020-10-22 18:00:31 +08:00
Jasder 1feb238e80 ADD educode repo api 2020-10-22 17:59:07 +08:00
Jasder 0192fa9f85 FIX bug 2020-10-21 18:14:06 +08:00
Jasder 84854e5c0c FIX code bug 2020-10-21 18:12:58 +08:00
Jasder 0c92b571c5 FIX perfect devops languages formate 2020-10-21 18:07:18 +08:00
Jasder f6937d96f4 ADD some index 2020-10-21 16:46:23 +08:00
Jasder 6cedf3b530 ADD some index to projects table 2020-10-21 15:13:30 +08:00
Jasder e0826da950 ADD index for updated_on column with projects table 2020-10-21 12:13:53 +08:00
Jasder 9477555ebd FIX merge dev_devops branch 2020-10-21 11:56:30 +08:00
Jasder a713e61437 FIX query branches bug 2020-10-21 11:55:03 +08:00
Jasder 99f67cf3a7 FIX merge 2020-10-21 11:54:22 +08:00
Jasder 495dc0d2e1 FIX query project 2020-10-21 11:53:52 +08:00
Jasder e3d9dae8fd Update projects sime api with statics 2020-10-21 11:45:55 +08:00
Jasder ca3b5f4284 ADD index for project_type column in projects table 2020-10-21 11:43:11 +08:00
Jasder f5eecdffdc ADD some columns for project_educoders table 2020-10-20 17:43:03 +08:00
Jasder 2eca095608 Merge branch 'dev_devops' into dev_sync_project_educoder 2020-10-20 16:45:04 +08:00
Jasder cb7d49506c FIX change description 'longtext' type with projects table 2020-10-20 15:19:26 +08:00
Jasder 831aea8b73 FIX bug 2020-10-20 00:10:29 +08:00
Jasder 46ccbbe699 ADD console info 2020-10-20 00:05:43 +08:00
Jasder 2f7b6c9b75 FIX bug 2020-10-19 23:41:05 +08:00
Jasder a63d675a92 FIX 同步educoder平台实训项目放入job中执行 2020-10-19 23:39:44 +08:00
Jasder 7f685e4119 FIX 完善同步educoder平台实训 2020-10-19 23:08:17 +08:00
Jasder 2eef143251 ADD 同步educoder平台实训项目 2020-10-19 22:59:41 +08:00
Jasder 1ac606a8aa FIX 去掉区块链相关的token值 2020-10-19 15:20:30 +08:00
Jasder 913f4b26a4 FIX 解决issue不能更改为 ‘关闭’状态的bug 2020-10-19 11:05:30 +08:00
Jasder 47f8197841 FIX ci connect database before fiter 2020-10-19 09:27:59 +08:00
Jasder 9332750aa7 FIX 2020-10-16 19:09:43 +08:00
Jasder 77de74fd4b FIX unbind account bug 2020-10-16 19:08:39 +08:00
Jasder 232bb054ce Merge branch 'dev_trustie' into dev_devops 2020-10-16 16:48:26 +08:00
sylor_huang@126.com 32bc3fe9f5 FIX merge 2020-10-16 16:48:11 +08:00
Jasder 1bff81bb66 Merge branch 'dev_trustie' into dev_devops 2020-10-16 16:44:44 +08:00
sylor_huang@126.com 248eadb918 Add Setting button 2020-10-16 16:43:59 +08:00
Jasder 7372911fea FIX 重构项目管理权限 2020-10-16 16:02:26 +08:00
Jasder 5156450eac ADD 更改工作流的权限 2020-10-16 11:57:20 +08:00
Jasder 6df01dead1 FIX unbind devops bug 2020-10-16 11:07:28 +08:00
Jasder 9a9540ad50 Fix forge connection ci databases bug 2020-10-16 09:50:30 +08:00
Jasder edcb9f863c FIX ci certification bug 2020-10-16 09:47:36 +08:00
Jasder e430645304 FIX ci connection database bug 2020-10-16 09:42:08 +08:00
Jasder a0c80d8d25 FIX code bug 2020-10-15 19:49:43 +08:00
Jasder d8910e3dbf FIX unbind ci cloud account bug 2020-10-15 19:46:56 +08:00
Jasder 7b0f219a82 FIX pwd bug 2020-10-15 19:40:50 +08:00
Jasder cfd285cbcd FIX delete drone database with undind cloud account 2020-10-15 17:40:39 +08:00
Jasder e0db7067ca FIX piple value 2020-10-15 17:20:09 +08:00
Jasder 6456a0f90c FIX code bug 2020-10-15 17:04:42 +08:00
Jasder 0c2c917c7f FIX 纠正drone授权流程 2020-10-15 17:00:02 +08:00
Jasder 38ca183bcd FIX code review 2020-10-15 16:04:32 +08:00
Jasder 8628891582 FIX gitea oauth grant url bug 2020-10-15 15:17:52 +08:00
Jasder 4ea033df23 FIX unbind ci user bug 2020-10-15 15:02:48 +08:00
Jasder 64a3ab24e2 FIX devops pwd auth bug 2020-10-15 14:37:24 +08:00
whystar 516b254aa3 smaller size of fig issue_assign 2020-10-14 10:35:33 +08:00
Jasder 28d6aa2dda ADD drone user oauth 2020-10-13 19:49:52 +08:00
whystar 774bcdd8b1 use high-quality figs in readme 2020-10-13 16:42:20 +08:00
whystar a9358552c0 upate readme 2020-10-13 16:29:49 +08:00
Jasder 9af3b5b757 Merge branch 'dev_trustie' into dev_devops 2020-10-09 11:40:34 +08:00
Jasder fbae5a36d0 Merge branch 'dev_trustie' into dev_devops 2020-10-05 17:41:54 +08:00
Jasder c7f141c468 Merge branch 'dev_trustie' into dev_devops 2020-10-05 17:30:21 +08:00
Jasder b8cace558b Merge branch 'dev_trustie' into dev_devops 2020-10-04 17:33:21 +08:00
Jasder 705ae1020b FIX merge dev_trustie branch 2020-10-04 12:05:53 +08:00
Jasder e2daffc826 Merge branch 'dev_trustie' into dev_devops 2020-09-29 13:51:32 +08:00
Jasder 2636923c9b FIX merge 2020-09-29 11:53:41 +08:00
Jasder 74a19bd2ce FIX code bug 2020-09-28 11:30:49 +08:00
Jasder fc6a05fe12 FIX code bug 2020-09-28 11:26:37 +08:00
Jasder 7f9674baf3 FIX bug 2020-09-27 16:35:38 +08:00
Jasder d9ed3baa02 Update readme.md 2020-09-27 15:37:02 +08:00
Jasder 3621f4ff48 ADD gitea databse config 2020-09-27 15:30:44 +08:00
Jasder a308862567 FIX 优化ci流程,并配置gitea相关database 2020-09-27 11:30:37 +08:00
Jasder 6cbb22acaf ADD open_devops_count column fro projects tables 2020-09-27 10:56:08 +08:00
Jasder f116e3347d FIX build detail render user bug 2020-09-24 11:14:16 +08:00
Jasder 7435d96eed ADD check cloud account 2020-09-23 16:22:18 +08:00
Jasder 27da6d9904 FIX ci create cloud account bug 2020-09-23 15:38:47 +08:00
Jasder 53224881ba ADD devops中限制每台服务器只能绑定一个用户 2020-09-23 11:40:13 +08:00
Jasder aa89103669 FIX connection ci database add condition 2020-09-23 11:15:14 +08:00
Jasder 135bdfd69f FIX code bug 2020-09-23 11:12:15 +08:00
Jasder 0f22110870 FIX ci author 2020-09-23 11:10:30 +08:00
Jasder 76b9031fc8 FIX bug 2020-09-23 11:06:54 +08:00
Jasder a97bbb6ddb Update ci db schema 2020-09-23 09:17:30 +08:00
Jasder a4c5db95bb FIX get user info api's bug 2020-09-22 18:12:13 +08:00
Jasder 1b1801319a FIX code bug 2020-09-22 17:40:21 +08:00
Jasder 4b3359108f FIX ci drone server cmd bug 2020-09-22 17:40:01 +08:00
Jasder 7e851fe5af FIX delete nil or empty string from sqls arrary 2020-09-22 16:22:55 +08:00
Jasder 9ebc0aa1dc ADD rails log 2020-09-22 16:15:30 +08:00
Jasder 88b2dd1208 FIX perfect ci init datbase 2020-09-22 15:50:16 +08:00
Jasder 7750ed18d7 FIX ci db init 2020-09-22 11:59:33 +08:00
Jasder a904adaaa0 FIX test ci init tables structure 2020-09-22 10:43:34 +08:00
Jasder 8f279753cc FIX code bug 2020-09-18 16:50:35 +08:00
Jasder 7789c30e5b FIX ci db bug 2020-09-18 16:44:38 +08:00
Jasder 467f278de5 ADD ci datbase config 2020-09-18 16:40:54 +08:00
Jasder 0467119605 FIX ci db bug 2020-09-18 15:46:36 +08:00
Jasder b74d43083e FIX 解决ci 数据库安全性问题 2020-09-18 15:26:14 +08:00
Jasder 12bef27260 Merge branch 'dev_trustie' into dev_devops 2020-09-11 23:24:50 +08:00
Jasder 1e823aef97 FIX ci log data with null bug 2020-09-11 17:08:40 +08:00
Jasder 5b8b74b808 ADD ci authorue column for get user info api 2020-09-11 16:35:08 +08:00
Jasder fae4907fd1 FIX set ci repo default value 2020-09-11 16:34:19 +08:00
Jasder 868ffbabac FIX ci query log with 404 bug 2020-09-11 15:05:03 +08:00
Jasder f9ec41f9bc FIX ci repo asstassion 2020-09-11 10:41:27 +08:00
Jasder 2e0d76575c FIX repo instance method's bug 2020-09-11 10:13:54 +08:00
Jasder 9568523286 FIX user bug 2020-09-11 10:00:29 +08:00
Jasder f3d6244fee FIX ci certification bug 2020-09-11 09:55:21 +08:00
Jasder ad43c6975b ADD 解决ci端用户授权后,项目同步失败的问题 2020-09-10 18:00:37 +08:00
Jasder 6419453fca FIX ci code review 2020-09-10 16:01:24 +08:00
Jasder 9b1f95bf08 ADD builds authorization 2020-09-10 11:52:54 +08:00
Jasder 217dfc03b2 ADD ci namespace modle associations 2020-09-10 10:53:12 +08:00
Jasder d802b8aba4 Merge branch 'dev_trustie' into dev_devops 2020-09-09 10:35:11 +08:00
Jasder be6ff6a043 FIX update query ci user and ci repo method 2020-09-09 09:57:44 +08:00
Jasder 0edac45e82 FIX 解决自动触发构建失败的问题 2020-09-09 09:17:11 +08:00
Jasder 5dfc6504a0 ADD sync ci user repos api 2020-09-08 15:29:38 +08:00
Jasder 3290609bbc FIX request devops languages api authoure 2020-09-08 15:29:19 +08:00
Jasder e877c2cde6 FIX code review 2020-09-07 16:25:06 +08:00
Jasder 2b470eed50 Delete some log info 2020-09-07 16:05:03 +08:00
Jasder 4a20caed0e FIX gitea webhook bug 2020-09-07 15:11:43 +08:00
Jasder 6985699989 Upage ci certifacate 2020-09-07 14:44:26 +08:00
Jasder c875451ac1 Merge branch 'dev_trustie' into dev_devops 2020-09-07 13:50:46 +08:00
Jasder a8821de85f Update gitea hooks api 2020-09-07 11:23:09 +08:00
Jasder 5cc5404915 FIX . 2020-09-04 18:20:50 +08:00
Jasder 401efd7c9b FIX code bug 2020-09-04 18:16:38 +08:00
Jasder 9613f4c485 FIX test gitea create webhook 2020-09-04 17:51:39 +08:00
Jasder e77475e26a ADD ci cloud account authenticate url 2020-09-04 17:35:29 +08:00
Jasder 81ec264483 Update destroy ci_user attassion 2020-09-04 17:26:37 +08:00
Jasder 0777db4ab4 FIX 2020-09-04 17:11:02 +08:00
Jasder 5c2bb71e57 FIX ci activate repo's bug 2020-09-04 16:57:23 +08:00
Jasder e0dac72114 FIX ci repos dependent destroy bug 2020-09-04 16:45:38 +08:00
Jasder 48350dc6f2 FIX delete webhook for bind ci service 2020-09-04 16:26:00 +08:00
Jasder 930f8195b7 FIX project search wrong 2020-09-04 16:24:20 +08:00
Jasder 15c92597a9 FIX code bug 2020-09-04 16:21:06 +08:00
Jasder f7d83acafe ADD webhook manager 2020-09-04 16:17:18 +08:00
Jasder eb2f1f46e0 ADD create gitea webhook api 2020-09-04 15:46:07 +08:00
Jasder 8c908a35ac FIX bug 2020-09-04 10:28:41 +08:00
Jasder 32ec60bbe3 FIX 完善ci服务的解绑流程 2020-09-04 10:17:44 +08:00
Jasder 74b2a5b021 FIX rename ucloud view dir 2020-09-03 17:10:23 +08:00
Jasder b31a11302c FIX devops admin bug 2020-09-03 17:05:38 +08:00
Jasder 562d0b7b07 ADD 个人中心添加devops管理功能 2020-09-03 15:52:54 +08:00
Jasder 731c06185b Merge branch 'dev_trustie' into dev_devops 2020-09-03 15:34:05 +08:00
Jasder 57ee5c5397 Merge branch 'dev_trustie' into dev_devops 2020-09-01 15:23:37 +08:00
Jasder d674fad604 Update readme.md 2020-09-01 15:16:00 +08:00
Jasder 003db1405d Merge branch 'dev_trustie' into dev_devops 2020-08-29 12:07:37 +08:00
Jasder 26f03badbc FIX change routes 2020-08-29 10:35:22 +08:00
Jasder 1290b3446f FIX update_column bug 2020-08-28 11:50:14 +08:00
Jasder 903103ec5d FIX ci active repo bug 2020-08-28 11:40:29 +08:00
Jasder b9a57be67d FIX code bug 2020-08-28 10:56:04 +08:00
Jasder f47eae3aeb FIX app/views/projects/ci_authorize.json.jbuilder 2020-08-28 10:46:23 +08:00
Jasder 27b6a251af FIX . 2020-08-28 10:43:32 +08:00
Jasder 30ff51f93b FIX devops author url 2020-08-28 10:38:39 +08:00
Jasder b75896821f FIX 优化ci初始化流程 2020-08-28 10:25:08 +08:00
Jasder b26c2f273f FIX build time bug 2020-08-27 16:01:10 +08:00
Jasder 0461c2735b Merge branch 'dev_trustie' into dev_devops 2020-08-27 15:10:25 +08:00
Jasder f09a9bdedc Merge branch 'dev_trustie' into dev_devops 2020-08-27 15:05:24 +08:00
Jasder 43a8576089 Merge branch 'dev_trustie' into dev_devops 2020-08-27 14:44:26 +08:00
Jasder 016971287c ADD open_devops for repositores show api 2020-08-27 11:50:17 +08:00
Jasder 82c4f4f38a ADD build error status 2020-08-27 11:39:11 +08:00
Jasder 2866c060c7 FIx code review 2020-08-26 16:24:51 +08:00
Jasder 518e966a87 FIX update trustie-pileline 2020-08-26 16:23:59 +08:00
Jasder 8c9c085259 ADD cloud account id 2020-08-26 15:14:00 +08:00
Jasder 72cacb72a6 FIX devops author api 2020-08-26 15:02:02 +08:00
Jasder 1e99e87228 FIX delete 'docker rm -f' command 2020-08-26 14:34:32 +08:00
Jasder 21fa22ed21 FIX 2020-08-26 12:02:51 +08:00
Jasder fc7b714d4c FIX delete project_id with create cloud_account 2020-08-26 11:57:47 +08:00
Jasder aac6df8790 FIX time count bug 2020-08-26 10:46:54 +08:00
Jasder 7e9d5a9acb FIX code bug 2020-08-26 10:45:21 +08:00
Jasder d16713e611 FIX buid time bug 2020-08-26 10:43:47 +08:00
Jasder 087f81a6aa ADD duration time for stage and step 2020-08-25 17:59:32 +08:00
Jasder c54723a6c6 FIX step bug 2020-08-25 17:14:55 +08:00
Jasder 21192d70b6 FIX stage bug 2020-08-25 17:09:44 +08:00
Jasder 5375c3ec71 ADD build status with killed 2020-08-25 17:01:03 +08:00
Jasder 66efdcc1b6 FIX build's number params 2020-08-25 16:39:31 +08:00
Jasder ec7becc26e FIX user search cloud account's bug 2020-08-25 16:34:13 +08:00
Jasder 1617a541fe FIX code review 2020-08-25 15:59:53 +08:00
Jasder 3e25a7b28c FIX code review 2020-08-25 15:49:47 +08:00
Jasder 41f876a714 FIX build finished time bug 2020-08-25 15:48:41 +08:00
Jasder 1ea9e420be ADD paginate for builds api 2020-08-25 15:43:30 +08:00
Jasder 4932eae285 ADD branch and sha for builds api 2020-08-25 14:25:42 +08:00
Jasder 405e5b5d3d FIX bug 2020-08-25 11:05:46 +08:00
sylor_huang@126.com e23ce05b1b Fixed: Issues2 2020-08-24 15:09:16 +08:00
sylor_huang@126.com 200cb70f4b Fixed: Issues 2020-08-24 15:06:05 +08:00
sylor_huang@126.com 46801284aa Test Project Validate Failed15 2020-08-24 14:28:30 +08:00
sylor_huang@126.com 7e7ab71231 Test Project Validate Failed14 2020-08-24 14:20:48 +08:00
sylor_huang@126.com 79bc2655b7 Test Project Validate Failed13 2020-08-24 14:19:32 +08:00
sylor_huang@126.com 5a065d83b7 Test Project Validate Failed12 2020-08-24 14:17:23 +08:00
sylor_huang@126.com 3586952a89 Test Project Validate Failed1 2020-08-24 14:16:11 +08:00
sylor_huang@126.com 72feacecbb Test Project Validate Failed 2020-08-24 14:12:59 +08:00
Jasder 8abf748778 FIX bug 2020-08-21 16:25:13 +08:00
Jasder 8758ec3197 Update trustie pipeline api 2020-08-21 16:06:47 +08:00
Jasder c1e6792f29 FIX cloud account bug 2020-08-21 15:26:42 +08:00
Jasder ae9d857d7f FIX ci server 2020-08-21 14:53:48 +08:00
Jasder e7a0bc7e0f FIX code bug 2020-08-21 10:46:37 +08:00
Jasder 137e780db4 FIX . 2020-08-21 10:15:26 +08:00
Jasder 3aa0cb70fe Merge branch 'dev_devops' of http://git.trustie.net/jasder/forgeplus into dev_devops 2020-08-20 18:38:05 +08:00
Jasder 7c1ab2cddf FIX 重构ci流程 2020-08-20 18:37:53 +08:00
sylor_huang@126.com 957df36fb1 Merge branch 'dev_trustie' into dev_devops 2020-08-20 18:04:53 +08:00
Jasder 89b2e263ae FIX devops builds api bug 2020-08-19 18:19:27 +08:00
Jasder ac2d2b842d Merge branch 'dev_trustie' into dev_devops 2020-08-19 17:13:48 +08:00
Jasder 1159a47b3e Update readme 2020-08-19 15:51:53 +08:00
Jasder 70e6c1395d FIX readme 2020-08-18 16:42:17 +08:00
Jasder 9b25b7a9e6 FIX ci drone server database 2020-08-18 16:40:39 +08:00
Jasder 5ac6133aef FIX ci drone server connect database 2020-08-18 09:23:23 +08:00
Jasder 3a18772de0 Merge branch 'dev_trustie' into dev_devops 2020-08-18 09:07:59 +08:00
Jasder a9012b4c53 Merge branch 'dev_trustie' into dev_devops 2020-08-17 18:08:41 +08:00
Jasder 90693d4745 Merge branch 'dev_trustie' into dev_devops 2020-08-17 17:48:07 +08:00
Jasder ad229081f0 Merge branch 'dev_trustie' into dev_devops 2020-08-17 17:41:39 +08:00
Jasder a4d8338cb5 ADD ci database port 2020-08-17 14:29:09 +08:00
Jasder af220cfffc FIX config drone database 2020-08-17 14:22:26 +08:00
Jasder 7bb43700b4 ADD namespace ci for model 2020-08-17 11:22:53 +08:00
Jasder 7b8bb996a6 Merge branch 'dev_trustie' into dev_devops 2020-08-17 11:14:35 +08:00
Jasder 480cfb66b1 Merge branch 'dev_devops' of http://git.trustie.net/jasder/forgeplus into dev_devops 2020-08-15 19:57:35 +08:00
Jasder b233586779 FIX merge 2020-08-15 19:57:20 +08:00
sylor_huang@126.com 8fd167b578 Merge branch 'dev_trustie' into dev_devops 2020-08-15 15:04:24 +08:00
sylor_huang@126.com 09802819b8 Merge branch 'dev_trustie' into dev_devops 2020-08-15 14:50:12 +08:00
sylor_huang@126.com 2979eaaeb4 Merge branch 'dev_trustie' into dev_devops 2020-08-15 14:48:42 +08:00
sylor_huang@126.com bc8240b772 Merge branch 'dev_trustie' into dev_devops 2020-08-15 14:35:52 +08:00
sylor_huang@126.com 372687e509 Merge branch 'dev_trustie' into dev_devops 2020-08-15 13:49:52 +08:00
sylor_huang@126.com a7b096d00e Merge branch 'dev_trustie' into dev_devops 2020-08-15 13:36:03 +08:00
sylor_huang@126.com 2267872076 Chnage 2020-08-15 13:30:44 +08:00
sylor_huang@126.com 929b56629c Change 2020-08-15 13:28:22 +08:00
sylor_huang@126.com 2154892a0b Merge branch 'dev_trustie' into dev_devops 2020-08-15 13:27:32 +08:00
sylor_huang@126.com 0af359ec0c Change 2020-08-15 13:21:33 +08:00
sylor_huang@126.com a0d287b1df Change 2020-08-15 12:50:04 +08:00
sylor_huang@126.com 466bdedfcd Change 2020-08-15 12:40:31 +08:00
sylor_huang@126.com e1c49c0ba8 Change 2020-08-15 12:38:25 +08:00
sylor_huang@126.com aa0f7ff873 Change 2020-08-15 12:37:26 +08:00
Jasder fb733722d6 Merge branch 'dev_change_route' into dev_devops 2020-08-15 11:06:04 +08:00
Jasder ef285f54c6 Merge branch 'dev_change_route' into dev_devops 2020-08-15 10:59:42 +08:00
Jasder 90f14d2051 FIX projects fork users bug 2020-08-15 10:58:56 +08:00
Jasder bd9f32cfaa Merge branch 'dev_change_route' into dev_devops 2020-08-15 10:26:47 +08:00
Jasder dac91f9a0c Merge branch 'dev_change_route' into dev_devops 2020-08-14 23:25:10 +08:00
Jasder 0c64b36fab FIX merge 2020-08-14 22:17:09 +08:00
Jasder 775c27a45b FIX login bug 2020-08-14 22:14:59 +08:00
Jasder 10adc42257 Merge branch 'dev_change_route' into dev_devops 2020-08-14 22:05:35 +08:00
Jasder 58d0044764 Merge branch 'dev_change_route' into dev_devops 2020-08-14 22:00:52 +08:00
Jasder 652654e606 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:57:10 +08:00
Jasder f7db9c0892 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:53:25 +08:00
Jasder 07edd5f8b4 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:49:47 +08:00
Jasder 94bf6f99cc Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:43:53 +08:00
Jasder 840e048d77 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:32:09 +08:00
Jasder 9317e21dd5 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:17:50 +08:00
Jasder 39424ec8da Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:09:12 +08:00
Jasder b2a6630e15 Merge branch 'dev_change_route' into dev_devops 2020-08-14 19:47:19 +08:00
Jasder 06d0065173 Merge branch 'dev_change_route' into dev_devops 2020-08-14 18:40:32 +08:00
Jasder 63148c339c Merge branch 'dev_change_route' into dev_devops 2020-08-14 18:21:04 +08:00
Jasder cf43a64ada FIX rewrite devops with ci 2020-08-13 23:38:32 +08:00
Jasder 8e7c25b5ed FIX code bug 2020-08-13 21:11:33 +08:00
Jasder 7a2d7f50fd Merge branch 'dev_change_route' into dev_devops 2020-08-13 20:49:33 +08:00
Jasder 78b091ddd3 FIX merge bug 2020-08-13 09:44:38 +08:00
Jasder 69ea60dfd5 FIX update devops process 2020-08-06 14:26:19 +08:00
Jasder 0b9a69ec56 ADD sha for get trsitie-pileline.yml file api 2020-07-24 15:35:43 +08:00
Jasder 3f92d99136 Merge branch 'dev_trustie' into dev_devops 2020-07-23 09:32:35 +08:00
sylor_huang@126.com 9694074b01 Fix trustie projects projectscore 2020-07-22 16:48:31 +08:00
sylor_huang@126.com c45b8184c6 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-22 16:43:09 +08:00
sylor_huang@126.com 5d7458bede Add trustie projects projectscore 2020-07-22 16:42:55 +08:00
Jasder b7b3751d43 ADD devops authorize 2020-07-22 15:16:01 +08:00
Jasder 3c7b257462 FIX devops 所有仓库相关的请求参数repo_id 改为project_id 2020-07-22 14:28:54 +08:00
Jasder 3d99dee31b Update devops redirect_url 2020-07-22 11:44:42 +08:00
Jasder 8b5c3797e9 FIX devops ucloud account 2020-07-22 11:27:30 +08:00
Jasder 1c2264f721 ADD get .trustie-pipeline.yml file api with devops 2020-07-22 11:18:02 +08:00
Jasder a22bd280bc Update api document 2020-07-21 17:34:47 +08:00
Jasder 07dfc06c9f FIX code review 2020-07-21 17:27:57 +08:00
Jasder 77b55daf04 Update README.md 2020-07-21 17:24:30 +08:00
Jasder cf244390ef FIX git drone logs api params's bug 2020-07-21 17:13:15 +08:00
Jasder 794f281787 FIX bug 2020-07-21 17:11:28 +08:00
Jasder 0f92aa7981 FIX test devops 2020-07-21 17:08:07 +08:00
Jasder 20d8f21ebb FIX bug 2020-07-21 15:19:43 +08:00
Jasder 236782eca8 FIX drone server command's bug 2020-07-21 15:07:42 +08:00
Jasder 5d34ac68d5 FIX create oauth bug 2020-07-21 14:17:19 +08:00
Jasder 15fc5de3de FIX 测试giteawebhook 2020-07-21 12:35:26 +08:00
Jasder 5fcb4a5500 FIX drone sever request params 2020-07-20 16:52:26 +08:00
Jasder 1f54e02ace ADD devops .trustie-pipeline.ym file 2020-07-20 16:12:37 +08:00
Jasder 9cc2e80e98 FIX bug 2020-07-20 15:47:58 +08:00
Jasder 2633e65a6c Update README.md 2020-07-20 15:39:12 +08:00
Jasder 3b26434c78 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-20 15:38:20 +08:00
Jasder e414960153 Update drone request server 2020-07-20 15:38:12 +08:00
sylor_huang@126.com 0fddf09e47 Merge branch 'dev_trustie' into dev_devops 2020-07-20 11:40:05 +08:00
sylor_huang@126.com b89598d452 Merge branch 'dev_trustie' into dev_devops 2020-07-20 09:58:21 +08:00
sylor_huang@126.com b07f84a3a0 Merge branch 'dev_trustie' into dev_devops 2020-07-20 09:53:12 +08:00
sylor_huang@126.com 1f86ad6349 Merge branch 'dev_trustie' into dev_devops 2020-07-20 09:45:53 +08:00
sylor_huang@126.com b47f38137b Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-17 18:30:09 +08:00
sylor_huang@126.com 8a7464cf6c change 2020-07-17 18:29:56 +08:00
Jasder 97b5193e2b Merge branch 'dev_trustie' into dev_devops 2020-07-17 18:18:31 +08:00
sylor_huang@126.com 26e1592d93 Merge branch 'dev_trustie' into dev_devops 2020-07-17 17:55:00 +08:00
sylor_huang@126.com 1223a8c2a1 Merge branch 'dev_trustie' into dev_devops 2020-07-17 17:04:27 +08:00
sylor_huang@126.com 0fd97e31a5 Merge branch 'dev_trustie' into dev_devops 2020-07-17 16:58:13 +08:00
sylor_huang@126.com 69d319ef3b Merge branch 'dev_trustie' into dev_devops 2020-07-17 16:18:51 +08:00
sylor_huang@126.com b73dc77a4b Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-17 16:16:44 +08:00
sylor_huang@126.com d4220efc00 Merge branch 'dev_trustie' into dev_devops 2020-07-17 16:16:23 +08:00
Jasder 69425d6d0a FIX . 2020-07-17 16:02:54 +08:00
sylor_huang@126.com bb9c79537d Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:59:06 +08:00
Jasder 2defd123b3 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-17 15:38:28 +08:00
Jasder e9af85cd16 Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:38:10 +08:00
sylor_huang@126.com bc10e0cfe5 Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:37:58 +08:00
sylor_huang@126.com 46e8920f25 Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:31:34 +08:00
sylor_huang@126.com 5439078427 Merge branch 'dev_trustie' into dev_devops 2020-07-17 14:33:41 +08:00
sylor_huang@126.com 6b725acbff Merge branch 'dev_trustie' into dev_devops 2020-07-17 14:24:48 +08:00
sylor_huang@126.com 4ab24c581b Merge branch 'dev_trustie' into dev_devops 2020-07-17 11:55:04 +08:00
sylor_huang@126.com 11ff3b8b12 Merge branch 'dev_trustie' into dev_devops 2020-07-17 11:28:04 +08:00
sylor_huang@126.com 6357bf91cd change versions_count and check mirrors 2020-07-17 11:25:13 +08:00
sylor_huang@126.com 4be353e239 Merge branch 'dev_trustie' into dev_devops 2020-07-16 14:26:00 +08:00
sylor_huang@126.com a10a3768c9 Merge branch 'dev_trustie' into dev_devops 2020-07-16 13:55:48 +08:00
sylor_huang@126.com 780480bc0b Merge branch 'dev_trustie' into dev_devops 2020-07-16 12:01:15 +08:00
sylor_huang@126.com 5100c352fe Merge branch 'dev_trustie' into dev_devops 2020-07-16 11:57:39 +08:00
sylor_huang@126.com f4a54dbb38 Merge branch 'dev_trustie' into dev_devops 2020-07-16 11:02:10 +08:00
sylor_huang@126.com 0c624f3503 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 23:48:52 +08:00
sylor_huang@126.com 02a16748ec Merge branch 'dev_trustie' into dev_devops 2020-07-15 23:48:39 +08:00
Jasder 98469f3e0a FIX merge 2020-07-15 23:32:35 +08:00
Jasder cdbca5c845 FIX merge 2020-07-15 23:31:48 +08:00
sylor_huang@126.com 1e96ecd440 chang 2020-07-15 23:28:24 +08:00
sylor_huang@126.com d08ebb3012 change 2020-07-15 22:56:36 +08:00
sylor_huang@126.com b077d0c361 change 2020-07-15 22:38:58 +08:00
sylor_huang@126.com 2ed819af39 Merge branch 'dev_trustie' into dev_devops 2020-07-15 22:02:47 +08:00
sylor_huang@126.com 289f4495b6 chang issues 2020-07-15 22:01:12 +08:00
sylor_huang@126.com 4411f469b0 Merge branch 'dev_trustie' into dev_devops 2020-07-15 21:31:18 +08:00
sylor_huang@126.com fb54d57561 change 2020-07-15 21:29:59 +08:00
sylor_huang@126.com 02e6ecae9e Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 21:17:44 +08:00
sylor_huang@126.com c2f702eacd add users 2020-07-15 21:17:30 +08:00
Jasder 7098692f08 Merge branch 'dev_trustie' into dev_devops 2020-07-15 20:35:15 +08:00
Jasder 00c0fa0eb4 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 20:34:38 +08:00
Jasder 8d5a373c6b Update readme.md ducument 2020-07-15 20:34:25 +08:00
Jasder 006ff7fd62 ADD devops builds's api 2020-07-15 20:34:01 +08:00
sylor_huang@126.com 4f0b10a3da Merge branch 'dev_trustie' into dev_devops 2020-07-15 20:31:39 +08:00
sylor_huang@126.com f2df2e84cc Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:33:36 +08:00
sylor_huang@126.com a7f80a5dde Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:28:16 +08:00
sylor_huang@126.com d8ace90037 Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:17:45 +08:00
sylor_huang@126.com 90d5fb7276 Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:04:29 +08:00
sylor_huang@126.com bc82451fcc Change 2020-07-15 18:02:43 +08:00
sylor_huang@126.com df0fcdb5ce Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 17:35:21 +08:00
sylor_huang@126.com d2ef7ec5e4 Merge branch 'dev_trustie' into dev_devops 2020-07-15 17:34:55 +08:00
Jasder 8f96341679 FIX merge dev_trustie conflict 2020-07-15 17:16:41 +08:00
Jasder b9abd6a152 FIX 插销掉dev_chain分支的合并 2020-07-15 17:13:16 +08:00
Jasder c181abce81 FIX 完善devops流程 2020-07-15 16:53:38 +08:00
sylor_huang@126.com 57fb06a1b3 Merge branch 'dev_trustie' into dev_devops 2020-07-15 16:25:54 +08:00
sylor_huang@126.com 86fc1efb67 Merge branch 'dev_chain' into dev_devops 2020-07-15 16:06:31 +08:00
sylor_huang@126.com f71e65f600 change bugs 2020-07-15 16:06:06 +08:00
sylor_huang@126.com 2db35b6d40 Merge branch 'dev_chain' into dev_devops 2020-07-15 16:00:58 +08:00
sylor_huang@126.com bacfc5299b Merge branch 'dev_trustie' into dev_chain 2020-07-15 15:43:28 +08:00
Jasder 123e8d7659 FIX ucloud account bug 2020-07-15 10:22:41 +08:00
Jasder f358361b89 FIX bug 2020-07-15 09:59:12 +08:00
Jasder e0ae7b2aec Merge branch 'dev_trustie' into dev_devops 2020-07-15 09:44:55 +08:00
Jasder da0e45a3c6 ADD devops 2020-07-15 09:43:30 +08:00
sylor_huang@126.com 14628af4a5 Merge branch 'dev_trustie' into dev_chain 2020-07-14 22:45:27 +08:00
sylor_huang@126.com d09e0fd5fa Change bugs 2020-07-14 22:07:10 +08:00
sylor_huang@126.com eedaba9bed change 2020-07-14 20:19:16 +08:00
sylor_huang@126.com b8e1e7540a Merge branch 'dev_trustie' into dev_chain 2020-07-14 19:28:05 +08:00
Jasder 4518a3ea87 FIX simple api with open_devops columen 2020-07-14 15:34:01 +08:00
Jasder 4d9b8738d8 ADD a column 2020-07-14 15:33:32 +08:00
Jasder 2b6fe8f9a8 FIX merge 2020-07-14 15:15:50 +08:00
Jasder 6527603e24 FIX 完善devops流程 2020-07-14 15:06:09 +08:00
sylor_huang@126.com 944e5de8c6 Merge branch 'dev_trustie' into dev_chain 2020-07-14 14:25:26 +08:00
sylor_huang@126.com afd49eabdc Merge branch 'dev_trustie' into dev_chain 2020-07-14 14:15:49 +08:00
sylor_huang@126.com b0e6646c8e Merge branch 'dev_trustie' into dev_chain 2020-07-14 13:57:02 +08:00
sylor_huang@126.com dd2c70fcee Merge branch 'dev_trustie' into dev_chain 2020-07-14 13:46:28 +08:00
sylor_huang@126.com 0eb1abf850 Merge branch 'dev_trustie' into dev_chain 2020-07-14 11:27:59 +08:00
sylor_huang@126.com eb46496fb1 Merge branch 'dev_trustie' into dev_chain 2020-07-13 21:01:33 +08:00
sylor_huang@126.com d12fc65da5 chang 2020-07-13 20:58:48 +08:00
sylor_huang@126.com 4417f8c070 Merge branch 'dev_trustie' into dev_chain 2020-07-13 13:54:48 +08:00
sylor_huang@126.com 224b7c7cd4 Merge branch 'dev_trustie' into dev_chain 2020-07-13 11:49:25 +08:00
sylor_huang@126.com 86c63e39a0 Merge branch 'dev_trustie' into dev_chain 2020-07-13 11:08:37 +08:00
sylor_huang@126.com 27ee469d24 Merge branch 'dev_trustie' into dev_chain 2020-07-13 10:58:53 +08:00
sylor_huang@126.com 0180ec93bf Merge branch 'dev_trustie' into dev_chain 2020-07-13 10:09:05 +08:00
sylor_huang@126.com 2ccf667f20 change bugs 2020-07-13 10:08:20 +08:00
sylor_huang@126.com 2632cbb010 Merge branch 'dev_trustie' into dev_chain 2020-07-13 09:50:52 +08:00
sylor_huang@126.com 2941652375 Merge branch 'dev_trustie' into dev_chain 2020-07-10 21:13:44 +08:00
sylor_huang@126.com 94cd6202a9 Merge branch 'dev_trustie' into dev_chain 2020-07-10 21:09:25 +08:00
sylor_huang@126.com 3fe0c4752f Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:43:12 +08:00
sylor_huang@126.com 9a1db03dca Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:20:43 +08:00
sylor_huang@126.com ab2fe592ec Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:10:48 +08:00
sylor_huang@126.com bb97f33732 Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:04:03 +08:00
sylor_huang@126.com bfb437ae3e Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:56:24 +08:00
sylor_huang@126.com 3c66b92e90 Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:50:20 +08:00
sylor_huang@126.com 9e310f992e Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:44:21 +08:00
sylor_huang@126.com ce11dbba2e Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:37:54 +08:00
sylor_huang@126.com 6db500c0a6 Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:25:39 +08:00
sylor_huang@126.com 569a68e199 Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:20:57 +08:00
sylor_huang@126.com ed80de25f3 Merge branch 'dev_trustie' into dev_chain 2020-07-10 18:44:25 +08:00
sylor_huang@126.com 2e2b4a9469 Merge branch 'dev_trustie' into dev_chain 2020-07-10 18:12:28 +08:00
sylor_huang@126.com 4b8563db5d Merge branch 'dev_trustie' into dev_chain 2020-07-10 18:03:29 +08:00
sylor_huang@126.com b936e0a3e8 Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:47:30 +08:00
sylor_huang@126.com ee95464033 Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:36:36 +08:00
sylor_huang@126.com 7415fa2b3c Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:20:44 +08:00
sylor_huang@126.com f4e1414f2a Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:05:16 +08:00
sylor_huang@126.com 3746db7fde Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:00:17 +08:00
sylor_huang@126.com 06e914f398 Merge branch 'dev_trustie' into dev_chain 2020-07-10 16:51:51 +08:00
sylor_huang@126.com 7d76c6c85f Merge branch 'dev_trustie' into dev_chain 2020-07-10 16:32:33 +08:00
sylor_huang@126.com 1c482761cf Merge branch 'dev_trustie' into dev_chain 2020-07-10 16:25:27 +08:00
sylor_huang@126.com 4893edd6c1 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:56:16 +08:00
sylor_huang@126.com 61d8753b89 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:45:12 +08:00
sylor_huang@126.com 47c18cb218 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:36:13 +08:00
sylor_huang@126.com ad14aa758e Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:24:40 +08:00
sylor_huang@126.com 90aa97c444 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:12:19 +08:00
sylor_huang@126.com 4fdb2c2221 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:11:00 +08:00
sylor_huang@126.com 93b2872ad9 Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:53:46 +08:00
sylor_huang@126.com 0323166499 Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:45:10 +08:00
sylor_huang@126.com 962a92eeca Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:24:43 +08:00
sylor_huang@126.com 50b79ee3cf Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:10:06 +08:00
Jasder e74bba9092 ADD test devops 2020-07-10 14:08:16 +08:00
sylor_huang@126.com 05615500e6 change bugs 2020-07-10 14:06:26 +08:00
sylor_huang@126.com 66beab3457 s 2020-07-10 11:54:30 +08:00
sylor_huang@126.com a20cb9eb5b Merge branch 'dev_trustie' into dev_chain 2020-07-10 11:53:49 +08:00
sylor_huang@126.com 0db202585b change bugs 2020-07-10 11:15:04 +08:00
sylor_huang@126.com 8860a584ca change bugs 2020-07-10 11:13:27 +08:00
sylor_huang@126.com 28f777f5eb Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:58:58 +08:00
sylor_huang@126.com 066a720525 Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:53:15 +08:00
sylor_huang@126.com a6a65eb4c8 Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:21:02 +08:00
sylor_huang@126.com 2664be17f9 Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:10:36 +08:00
sylor_huang@126.com cd32b7e300 Merge branch 'dev_trustie' into dev_chain 2020-07-10 09:53:33 +08:00
sylor_huang@126.com ac2b8c9f65 Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:58:11 +08:00
sylor_huang@126.com dcbbf66e61 Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:40:59 +08:00
sylor_huang@126.com c6c7f0968b change bugs 2020-07-09 20:37:43 +08:00
sylor_huang@126.com 97844c47d7 Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:36:49 +08:00
sylor_huang@126.com 265562a260 change bugs 2020-07-09 20:33:18 +08:00
sylor_huang@126.com 7724c1bcce Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:24:53 +08:00
sylor_huang@126.com 946a5cc44a Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:18:44 +08:00
sylor_huang@126.com a78ba32923 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:57:50 +08:00
sylor_huang@126.com 704dda3a1c Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:47:03 +08:00
sylor_huang@126.com 7fdc61040c Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:43:39 +08:00
sylor_huang@126.com 7df67ebca6 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:33:27 +08:00
sylor_huang@126.com bf85203a25 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:30:43 +08:00
sylor_huang@126.com 62ab4805a2 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:27:55 +08:00
sylor_huang@126.com 9e2181392b Merge branch 'dev_trustie' into dev_chain 2020-07-09 17:52:09 +08:00
sylor_huang@126.com bcd6ffdfda Merge branch 'dev_trustie' into dev_chain 2020-07-09 16:47:55 +08:00
sylor_huang@126.com b9a596bb2c Merge branch 'dev_trustie' into dev_chain 2020-07-07 13:55:17 +08:00
sylor_huang@126.com 8a1abaed8a change 2020-07-06 16:35:03 +08:00
sylor_huang@126.com b189d16f58 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-07-03 17:37:45 +08:00
sylor_huang@126.com 153496c089 Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:37:33 +08:00
Jasder e35f8515ee Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:36:36 +08:00
sylor_huang@126.com c96dcb14e7 Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:15:15 +08:00
sylor_huang@126.com d812929152 Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:01:16 +08:00
sylor_huang@126.com 943d14ebfe change errors 2020-07-03 16:23:04 +08:00
sylor_huang@126.com 73d3715cca change 2020-07-03 16:17:06 +08:00
sylor_huang@126.com 21417ad300 Merge branch 'dev_trustie' into dev_chain 2020-07-03 16:13:24 +08:00
sylor_huang@126.com 8eb3b149d7 Merge branch 'dev_trustie' into dev_chain 2020-07-03 15:26:46 +08:00
Jasder 1541cb4fc3 Merge branch 'dev_trustie' into dev_chain 2020-07-02 15:52:15 +08:00
sylor_huang@126.com 2e3438d75b Merge branch 'dev_trustie' into dev_chain 2020-07-02 15:00:43 +08:00
sylor_huang@126.com d5849976a3 Merge branch 'dev_trustie' into dev_chain 2020-07-02 10:13:17 +08:00
sylor_huang@126.com 2efb212751 Merge branch 'dev_trustie' into dev_chain 2020-07-01 10:07:16 +08:00
sylor_huang@126.com 964e015588 Merge branch 'dev_trustie' into dev_chain 2020-06-30 18:49:37 +08:00
sylor_huang@126.com 784ce1aea0 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-30 16:23:25 +08:00
sylor_huang@126.com 25efc96d0d Merge branch 'dev_trustie' into dev_chain 2020-06-30 16:23:09 +08:00
Jasder b6c51f7dcf Merge branch 'dev_trustie' into dev_chain 2020-06-30 15:54:30 +08:00
Jasder c00cb33799 Merge branch 'dev_trustie' into dev_chain 2020-06-30 15:02:01 +08:00
sylor_huang@126.com da81e7ae73 Merge branch 'dev_trustie' into dev_chain 2020-06-30 13:50:40 +08:00
sylor_huang@126.com ec6e962248 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:53:38 +08:00
sylor_huang@126.com 26dc737ee3 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:47:56 +08:00
sylor_huang@126.com b0afa38258 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:43:51 +08:00
sylor_huang@126.com d59b30e6e2 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:39:53 +08:00
sylor_huang@126.com 12019f554c Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:27:51 +08:00
sylor_huang@126.com 88d658dde4 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-30 11:22:43 +08:00
sylor_huang@126.com f6739a9502 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:22:30 +08:00
Jasder e0e09d90d8 FIX merge bug 2020-06-30 11:16:56 +08:00
Jasder c6f4d7157f ADD mirror_url to simpe project api 2020-06-30 11:15:03 +08:00
Jasder 0aa6521fae Merge branch 'dev_trustie' into dev_chain 2020-06-30 10:45:47 +08:00
sylor_huang@126.com e75b84544a Merge branch 'dev_trustie' into dev_chain 2020-06-30 10:44:42 +08:00
sylor_huang@126.com aa19747dd6 Merge branch 'dev_trustie' into dev_chain 2020-06-30 10:07:47 +08:00
sylor_huang@126.com 45eb65ce88 change pr 2020-06-30 09:45:26 +08:00
sylor_huang@126.com 1e7826a298 Merge branch 'dev_trustie' into dev_chain 2020-06-30 09:44:49 +08:00
Jasder d806c4cc09 Merge branch 'dev_trustie' into dev_chain 2020-06-29 18:29:07 +08:00
sylor_huang@126.com 94227b104c Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-29 17:07:53 +08:00
sylor_huang@126.com 86c6a7bbdd Merge branch 'dev_trustie' into dev_chain 2020-06-29 17:07:38 +08:00
Jasder 750094f68f Merge branch 'dev_trustie' into dev_chain 2020-06-29 16:06:48 +08:00
sylor_huang@126.com 6b9c424b07 Merge branch 'dev_trustie' into dev_chain 2020-06-24 16:16:33 +08:00
sylor_huang@126.com 40347aaa66 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-24 15:34:03 +08:00
sylor_huang@126.com cfae67c3c9 Merge branch 'dev_trustie' into dev_chain 2020-06-24 15:33:48 +08:00
Jasder 7f9af73fdd Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-23 15:10:24 +08:00
Jasder 0a7ab3469d Merge branch 'dev_trustie' into dev_chain 2020-06-23 15:10:04 +08:00
sylor_huang@126.com d09e7b3439 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-23 15:00:57 +08:00
sylor_huang@126.com b7c86fd83c Merge branch 'dev_trustie' into dev_chain 2020-06-23 15:00:33 +08:00
Jasder faaa165684 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-23 11:59:51 +08:00
sylor_huang@126.com 8ffbfdd7e8 Merge branch 'dev_trustie' into dev_chain 2020-06-18 16:29:14 +08:00
sylor_huang@126.com e469629106 Merge branch 'dev_trustie' into dev_chain 2020-06-18 16:00:42 +08:00
sylor_huang@126.com 8af997bf9f change 2020-06-18 15:59:37 +08:00
sylor_huang@126.com b90bc0aed2 change bug 2020-06-18 15:47:43 +08:00
sylor_huang@126.com 7ffe33858b change 2020-06-12 18:48:32 +08:00
sylor_huang@126.com 9d7e7b2eb7 change 2020-06-12 18:28:20 +08:00
sylor_huang@126.com 459d836154 merge 2020-06-12 18:24:10 +08:00
sylor_huang@126.com 77b995e958 remove dump.mb 2020-06-11 11:46:58 +08:00
sylor_huang@126.com 851f0de0a7 change 2020-06-10 18:47:03 +08:00
sylor_huang@126.com 6b29621485 change token issue bug 2020-06-10 18:33:23 +08:00
sylor_huang@126.com 4b4bb0ab14 change check_token 2020-06-10 18:24:03 +08:00
sylor_huang@126.com 844699dd1b change 2020-06-10 16:34:34 +08:00
sylor_huang@126.com fc820238c4 修改chain相关的 2020-06-10 16:04:14 +08:00
sylor_huang@126.com 79641e859c change chain 2020-06-09 18:55:09 +08:00
jasder 0bd6952567 Update 'README.md' 2020-05-07 18:12:36 +08:00
Jasder b2274aae0c Merge branch 'master' of http://gitea.trustie.net/jasder/forgeplus 2020-04-26 10:15:08 +08:00
Jasder 3be16db2a8 FIX merge 2020-04-26 10:14:54 +08:00
jasder b1493bd081 Update 'README.md' 2020-04-26 09:55:00 +08:00
1407 changed files with 74769 additions and 19262 deletions

7
.gitignore vendored
View File

@ -36,6 +36,8 @@ public/react/yarn.lock
/.idea/*
# Ignore react node_modules
public/system/*
public/react/*
/public/react/.cache
/public/react/node_modules/
/public/react/config/stats.json
@ -72,6 +74,7 @@ vendor/bundle/
/log
/public/admin
/mysql_data
/public/repo/
.generators
@ -81,4 +84,6 @@ docker/
educoder.sql
redis_data/
Dockerfile
dump.rdb
dump.rdb
.tags*
ceshi_user.xlsx

View File

@ -1,529 +0,0 @@
import React, {Component} from 'react';
import logo from './logo.svg';
import './App.css';
import {LocaleProvider} from 'antd'
import zhCN from 'antd/lib/locale-provider/zh_CN';
import {
BrowserRouter as Router,
Route,
Switch
} from 'react-router-dom';
import axios from 'axios';
import '@icedesign/base/dist/ICEDesignBase.css';
import '@icedesign/base/index.scss';
import LoginDialog from './modules/login/LoginDialog';
import Notcompletedysl from './modules/user/Notcompletedysl';
import Trialapplicationysl from './modules/login/Trialapplicationysl';
import Trialapplicationreview from './modules/user/Trialapplicationreview';
import Addcourses from "./modules/courses/coursesPublic/Addcourses";
import AccountProfile from"./modules/user/AccountProfile";
import Trialapplication from './modules/login/Trialapplication'
import NotFoundPage from './NotFoundPage'
import Loading from './Loading'
import Loadable from 'react-loadable';
import moment from 'moment'
import {MuiThemeProvider, createMuiTheme} from 'material-ui/styles';
// import './AppConfig'
import history from './history';
import {SnackbarHOC} from 'educoder'
import {initAxiosInterceptors} from './AppConfig'
// tpi需要这个来加载css
import {TPMIndexHOC} from './modules/tpm/TPMIndexHOC';
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.
},
});
//
// const Trialapplication= Loadable({
// loader: () =>import('./modules/login/Trialapplication'),
// loading:Loading,
// })
//登入
const EducoderLogin = Loadable({
loader: () => import('./modules/login/EducoderLogin'),
loading: Loading,
})
const TestIndex = Loadable({
loader: () => import('./modules/test'),
loading: Loading,
})
const IndexWrapperComponent = Loadable({
loader: () => import('./modules/page/IndexWrapper'),
loading: Loading,
})
const CommentComponent = Loadable({
loader: () => import('./modules/comment/CommentContainer'),
loading: Loading,
})
const TestMaterialDesignComponent = Loadable({
loader: () => import('./modules/test/md/TestMaterialDesign'),
loading: Loading,
})
const TestCodeMirrorComponent = Loadable({
loader: () => import('./modules/test/codemirror/TestCodeMirror'),
loading: Loading,
})
const TestComponent = Loadable({
loader: () => import('./modules/test/TestRC'),
loading: Loading,
})
const TestUrlQueryComponent = Loadable({
loader: () => import('./modules/test/urlquery/TestUrlQuery'),
loading: Loading,
})
const TPMIndexComponent = Loadable({
loader: () => import('./modules/tpm/TPMIndex'),
loading: Loading,
})
const TPMShixunsIndexComponent = Loadable({
loader: () => import('./modules/tpm/shixuns/ShixunsIndex'),
loading: Loading,
})
//实训课程(原实训路径)
const ShixunPaths = Loadable({
loader: () => import('./modules/paths/Index'),
loading: Loading,
})
//在线课堂
const CoursesIndex = Loadable({
loader: () => import('./modules/courses/Index'),
loading: Loading,
})
const SearchPage = Loadable({
loader: () => import('./search/SearchPage'),
loading: Loading,
})
//教学案例
const MoopCases = Loadable({
loader: () => import('./modules/moop_cases/index'),
loading: Loading,
})
// 课堂讨论
// const BoardIndex = Loadable({
// loader: () => import('./modules/courses/boards/BoardIndex'),
// loading:Loading,
// })
// //课堂普通作业&分组作业
// const CoursesWorkIndex = Loadable({
// loader: () => import('./modules/courses/busyWork/Index'),
// loading:Loading,
// })
//
// const TPMShixunchildIndexComponent = Loadable({
// loader: () => import('./modules/tpm/shixunchild/ShixunChildIndex'),
// loading: Loading,
// })
// const TPMshixunfork_listIndexComponent = Loadable({
// loader: () => import('./modules/tpm/shixunchild/Shixunfork_list'),
// loading: Loading,
// })
const ForumsIndexComponent = Loadable({
loader: () => import('./modules/forums/ForumsIndex'),
loading: Loading,
})
// trustie plus forum
// const TPForumsIndexComponent = Loadable({
// loader: () => import('./modules/tp-forums/TPForumsIndex'),
// loading: Loading,
// })
// const TestPageComponent = Loadable({
// loader: () => import('./modules/page/Index'),
// loading: Loading,
// })
//新建实训
const Newshixuns = Loadable({
loader: () => import('./modules/tpm/newshixuns/Newshixuns'),
loading: Loading,
})
//实训首页
const ShixunsHome = Loadable({
loader: () => import('./modules/home/shixunsHome'),
loading: Loading,
})
const CompatibilityPageLoadable = Loadable({
loader: () => import('./modules/common/CompatibilityPage'),
loading: Loading,
})
//403页面
const Shixunauthority = Loadable({
loader: () => import('./modules/403/Shixunauthority'),
loading: Loading,
})
//404页面
const Shixunnopage = Loadable({
loader: () => import('./modules/404/Shixunnopage'),
loading: Loading,
})
//500页面
const http500 = Loadable({
loader: () => import('./modules/500/http500'),
loading: Loading,
})
// 登录注册
const LoginRegisterPage = Loadable({
loader: () => import('./modules/user/LoginRegisterPage'),
loading: Loading,
})
const AccountPage = Loadable({
loader: () => import('./modules/user/AccountPage'),
loading: Loading,
})
// 个人主页
const UsersInfo = Loadable({
loader: () => import('./modules/user/usersInfo/Infos'),
loading: Loading,
})
// 兴趣页面
const Interestpage = Loadable({
loader: () => import('./modules/login/EducoderInteresse'),
loading: Loading,
})
//众包创新
const ProjectPackages=Loadable({
loader: () => import('./modules/projectPackages/ProjectPackageIndex'),
loading: Loading,
})
class App extends Component {
constructor(props) {
super(props)
// this.state = {
// isRenders:false,
// }
}
componentDidMount() {
// force an update if the URL changes
history.listen(() => {
this.forceUpdate()
const $ = window.$
// https://www.trustie.net/issues/21919 可能会有问题
$("html").animate({ scrollTop: $('html').scrollTop() - 0 })
});
initAxiosInterceptors(this.props)
//
// axios.interceptors.response.use((response) => {
// // console.log("response"+response);
// if(response!=undefined)
// // console.log("response"+response.data.statu);
// if (response&&response.data.status === 407) {
// this.setState({
// isRenders: true,
// })
// }
// return response;
// }, (error) => {
// //TODO 这里如果样式变了会出现css不加载的情况
// });
}
//修改登录方法
Modifyloginvalue=()=>{
this.setState({
isRender:false,
})
}
render() {
return (
<LocaleProvider locale={zhCN}>
<MuiThemeProvider theme={theme}>
<LoginDialog {...this.props} {...this.state} Modifyloginvalue={()=>this.Modifyloginvalue()}></LoginDialog>
<Notcompletedysl {...this.props} {...this.state}></Notcompletedysl>
<Trialapplicationysl {...this.props} {...this.state}></Trialapplicationysl>
<Trialapplicationreview {...this.props} {...this.state}></Trialapplicationreview>
<Addcourses {...this.props} {...this.state}/>
<AccountProfile {...this.props} {...this.state}/>
{/*{*/}
{/* isRender === true?*/}
{/* <LoginDialog></LoginDialog> : ""*/}
{/*}*/}
{/*{*/}
{/* isRenders === true?*/}
{/*<Trialapplication></Trialapplication>*/}
{/*:""*/}
{/*}*/}
<Router>
<Switch>
{/*<Route path="/login" component={LoginRegisterPage}/>*/}
{/*众包创新*/}
<Route path={"/crowdsourcings"} component={ProjectPackages}/>
{/*认证*/}
<Route path="/account" component={AccountPage}/>
{/*403*/}
<Route path="/403" component={Shixunauthority}/>
<Route path="/500" component={http500}/>
{/*404*/}
<Route path="/nopage" component={Shixunnopage}/>
<Route path="/compatibility" component={CompatibilityPageLoadable}/>
<Route
path="/login" component={EducoderLogin}
/>
<Route
path="/register" component={EducoderLogin}
/>
<Route path="/users/:username"
render={
(props) => (<UsersInfo {...this.props} {...props} {...this.state} />)
}></Route>
{/*<Route*/}
{/* path="/trialapplication" component={Trialapplication}*/}
{/*/>*/}
<Route
path="/changepassword" component={EducoderLogin}
/>
<Route
path="/interesse" component={Interestpage}
/>
<Route path="/shixuns/new" component={Newshixuns}>
</Route>
<Route path="/tasks/:stageId" component={IndexWrapperComponent}/>
<Route path="/shixuns/:shixunId" component={TPMIndexComponent}>
</Route>
{/*列表页*/}
<Route path="/shixuns" component={TPMShixunsIndexComponent}/>
{/* <Route path="/shixunchild" component={TPMShixunchildIndexComponent}>
</Route>
<Route path="/fork_list" component={TPMshixunfork_listIndexComponent}>
</Route> */}
{/*<Route path="/forums" component={ForumsIndexComponent}>*/}
{/*</Route>*/}
{/*实训课程(原实训路径)*/}
<Route path="/paths" component={ShixunPaths}></Route>
<Route path="/search"
render={
(props)=>(<SearchPage {...this.props} {...props} {...this.state}></SearchPage>)
}
></Route>
{/*课堂*/}
<Route path="/courses" component={CoursesIndex} {...this.props}></Route>
{/* 课堂讨论 */}
{/* <Route path="/board" component = {BoardIndex} {...this.props}></Route> */}
{/* <Route path="/tpforums" component={TPForumsIndexComponent}>
</Route> */}
{/* <Route path="/myshixuns/:shixunId/stages/:stageId" component={Index}/> */}
{/* 兴趣页面*/}
{/*<Route path="/interest" component={Interestpage}/>*/}
<Route path="/comment" component={CommentComponent}/>
<Route path="/testMaterial" component={TestMaterialDesignComponent}/>
<Route path="/test" component={TestIndex}/>
<Route path="/testCodeMirror" component={TestCodeMirrorComponent}/>
<Route path="/testRCComponent" component={TestComponent}/>
<Route path="/testUrlQuery" component={TestUrlQueryComponent}/>
{/* 教学案例 */}
<Route path="/moop_cases"render={
(props) => (<MoopCases {...this.props} {...props} {...this.state} />)
}/>
{/* <Route component={NotFoundPage}/> */}
{/*列表页*/}
{/*<Route component={TPMShixunsIndexComponent}/>*/}
{/*首页*/}
<Route exact path="/" component={ShixunsHome}/>
<Route component={Shixunnopage}/>
{/*<Route component={ShixunsHome}/>*/}
</Switch>
</Router>
</MuiThemeProvider>
</LocaleProvider>
);
}
}
// 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.
}
});
export default SnackbarHOC()(App);

22
.trustie-pipeline.yml Normal file
View File

@ -0,0 +1,22 @@
kind: pipeline
name: default
platform:
os: linux
arch: arm64
steps:
- name: install
image: ruby:2.4.5
commands:
- gem install bundler
- bundle -v
- bundle install --jobs=1 --retry=1
- name: test
image: ruby:2.4.5
volumes:
- name: bundle
path: /usr/local/bundle
commands:
- rake

129
CHANGELOG.md Normal file
View File

@ -0,0 +1,129 @@
# Changelog
## [v3.2.0](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-06-09
### ENHANCEMENTS
* ADD 集成邮件和平台站内信等通知系统
* Fix 代码库二级页面-优化文件子目录浏览功能(#50388)
* Fix 代码库二级页面-优化commit提交详情页页面排版及数据显示(#50372)
* Fix 代码库二级页面-优化commit提交信息列表页加载方式和数据排序功能(#50348)
* Fix 代码库二级页面-优化创建发行版功能(#50346)
* Fix 代码库二级页面-优化标签列表页功能(#50344)
* Fix 代码库二级页面-优化发行版本列表页功能(#50345)
* Fix 代码库二级页面-优化分支列表页功能(#50343)
* Fix 其他问题优化(#51581) (#51343) (#51108)
---
### BUGFIXES
* Fix 发行版—标签跳转链接错误(#51666)
* Fix 文件预览报错(#51660)
* Fix 标签创建时间显示错误(#51658)
* Fix 分支列表中头像显示问题(#51656)
* Fix 文本信息过长(#51630) (#51626)
* Fix 版本库中附件下载400(#51625)
* Fix loading页面优化(#51588)
* Fix 提交详情页面优化(#51577)
* Fix 修复易修复制功能(#51569)
* Fix 修复新建发行版用户信息显示错误的问题(#51665)
* Fix 修复查看文件详细信息报错的问题(#51561)
* Fix 修复提交记录中时间显示格式问题(#51526)
* Fix 组织下项目更加更新时间倒序排序(#50833)
## [v3.1.0](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-06-09
* ENHANCEMENTS
* ADD 用户活动统计图表功能
* ADD 用户精选项目功能
* ADD 用户贡献度统计图表功能
* ADD 用户开发能力数据统计工
* ADD 用户角色定位展示功能
* ADD 用户专业定位标签展示功能
* ADD 修改用户基本资料功能
* ADD 更改密码功能
* ADD 用户个人主页基本现在展示可配置功能
* BUGFIXES
* Fix 解决一些bug
* Fix 优化美化页面
* BUGFIXES
* Fix 在线修改文件,页面文件显不及时的问题(46049)
* Fix Fork项目接口多次调用问题(45052)
* FIX 页面置顶功能区域排版问题(45825)
* Fix 其他样式显示问题
* ENHANCEMENTS
* ADD 合并请求页面显示有冲突文件状态(46016)
* ADD 创建组织各属性添加规则匹配功能(45707)
* ADD 微信分享功能(45707)
## [v3.0.3](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-05-08
* BUGFIXES
* Fix 解决易修标题过长导致的排版问题(45469)
* Fix 解决合并请求详情页面排版错误的问题(45457)
* FIX 解决转移仓库界面专有名词描述错误的问题(45455)
* Fix 解决markdown格式文件自动生成数字排序的问题(45454)
* Fix 解决镜像项目源地址不显示的问题(45403)
* Fix 解决镜像项目导航显示错误问题(45398)
* Fix 解决其他相关bug
* ENHANCEMENTS
* UPDATE 用户注册时,账号和密码正则匹配调整(45336) (45318) (45290)
* ADD 创建组织各属性添加规则匹配功能(45313) (45289)
* ADD 创建团建各属性添加规则匹配功能(45334) (45325) (45287)
* ADD 仓库转移功能(45017) (45015)
## [v3.0.2](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-04-23
* BUGFIXES
* Fix 解决部分用户头像不显示问题
* Fix 解决代码库模块中最左侧目录中的文件定位加载不准确的问题
* FIX 解决团队管理页面中项目链接错误问题
* Fix 解决markdown格式文件显示问题
* Fix 解决组织名下创建项目报错的问题
* Fix 解决组织名下的项目创建issue报错的问题
* Fix 解决组织名下创建团队提示信息信息显示错误问题
* Fix 解决点击组织图片时,链接加载错误问题
* Fix 修复查询版本库信息安全漏洞
* Fix 解决修复团队成员操作访问组织仓库报403错误的问题
* Fix 解决owners团队成员对仓库添加成功失败的问题
* ENHANCEMENTS
* ADD 自动生产用户头像功能
* ADD 创建组织支持中文名称
* ADD 创建团建支持中文名称
* ADD 组织名称统一显示中文名
* ADD 团队名称统一显示中文名
* ADD 用户头像悬浮时展示相关信息
* ADD 项目详情页添加实践课程链接入口
* ADD README文件页面添加添加目录导航功能
* UPDATE 升级改版底部footer信息
* UPDATE 升级用户操作版本库权限
## [v3.0.1](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-03-19
* BUGFIXES
* Fix pull reqeust模块中用户头像显示问题
* Fix 解决issue模块中指派用户的问题
* Fix 解决合并请求失败的后显示message信息不正确
* Fix 代码目录页面readme文件提供单独的api
* ENHANCEMENTS
* 重构项目详情页面
## [v3.0.0](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2020-12-29
* BUGFIXES
* Fix pull reqeust的访问权限问题 (#14156) (#14171)
* Fix 部分页面访问403的问题
* Fix 合并请求失败的问题
* Fix 代码目录页面,文件夹和文件图片不显示的问题
* Fix Issue列表中按负责人过滤筛选时部分项目成员不在搜索范围没的问题
* Fix 项目更新时间不同步的问题, 添加了定时任务
* ENHANCEMENTS
* 提升获取版本库目录代码查询速度 (#43296)
* tag 列表慢查询速度问题 (#43332)
* API builder 模版中 render partial builder的性能问题

View File

@ -1,8 +1,6 @@
source 'https://gems.ruby-china.com'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.3.7'
gem 'rails', '~> 5.2.0'
gem 'mysql2', '>= 0.4.4', '< 0.6.0'
gem 'puma', '~> 3.11'
@ -19,8 +17,6 @@ gem 'kaminari', '~> 1.1', '>= 1.1.1'
gem 'bootsnap', '>= 1.1.0', require: false
gem 'gitlab', path: 'lib/gitlab-cli'
gem 'chinese_pinyin'
gem 'rack-cors'
@ -74,6 +70,7 @@ group :development do
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
gem "annotate", "~> 2.6.0"
end
group :test do
@ -103,6 +100,7 @@ gem 'rails-i18n', '~> 5.1'
# job
gem 'sidekiq'
gem 'sinatra'
gem "sidekiq-cron", "~> 1.1"
# batch insert
gem 'bulk_insert'
@ -128,3 +126,5 @@ gem 'request_store'
gem 'harmonious_dictionary', '~> 0.0.1'
gem 'parallel', '~> 1.19', '>= 1.19.1'
gem 'letter_avatar'

View File

@ -1,10 +1,3 @@
PATH
remote: lib/gitlab-cli
specs:
gitlab (3.2.0)
httparty
terminal-table
GEM
remote: https://gems.ruby-china.com/
specs:
@ -61,6 +54,9 @@ GEM
public_suffix (>= 2.0.2, < 5.0)
ancestry (3.0.7)
activerecord (>= 3.2.0)
annotate (2.6.5)
activerecord (>= 2.3.0)
rake (>= 0.8.7)
archive-zip (0.12.0)
io-like (~> 0.3.0)
arel (9.0.0)
@ -122,12 +118,17 @@ GEM
enumerize (2.3.1)
activesupport (>= 3.2)
erubi (1.9.0)
et-orbi (1.2.4)
tzinfo
execjs (2.7.0)
faraday (0.15.4)
multipart-post (>= 1.2, < 3)
ffi (1.12.2)
font-awesome-sass (4.7.0)
sass (>= 3.2)
fugit (1.4.1)
et-orbi (~> 1.1, >= 1.1.8)
raabro (~> 1.4)
globalid (0.4.2)
activesupport (>= 4.2.0)
grape-entity (0.7.1)
@ -138,9 +139,6 @@ GEM
harmonious_dictionary (0.0.1)
hashie (3.6.0)
htmlentities (4.3.4)
httparty (0.18.0)
mime-types (~> 3.0)
multi_xml (>= 0.5.2)
i18n (1.8.2)
concurrent-ruby (~> 1.0)
io-like (0.3.1)
@ -164,6 +162,7 @@ GEM
activerecord
kaminari-core (= 1.2.0)
kaminari-core (1.2.0)
letter_avatar (0.3.8)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
@ -177,10 +176,9 @@ GEM
mimemagic (~> 0.3.2)
maruku (0.7.3)
method_source (0.9.2)
mime-types (3.3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2019.1009)
mimemagic (0.3.4)
mimemagic (0.3.10)
nokogiri (~> 1)
rake
mini_mime (1.0.2)
mini_portile2 (2.4.0)
minitest (5.14.0)
@ -221,6 +219,7 @@ GEM
prettier (0.18.2)
public_suffix (4.0.3)
puma (3.12.2)
raabro (1.4.0)
rack (2.0.9)
rack-cors (1.1.1)
rack (>= 2.0.0)
@ -363,6 +362,9 @@ GEM
rack (< 2.1.0)
rack-protection (>= 1.5.0)
redis (>= 3.3.5, < 5)
sidekiq-cron (1.2.0)
fugit (~> 1.1)
sidekiq (>= 4.2.1)
simple_form (5.0.2)
actionpack (>= 5.0)
activemodel (>= 5.0)
@ -402,8 +404,6 @@ GEM
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
thor (1.0.1)
thread_safe (0.3.6)
tilt (2.0.10)
@ -437,6 +437,7 @@ DEPENDENCIES
acts-as-taggable-on (~> 6.0)
acts_as_list
ancestry
annotate (~> 2.6.0)
awesome_print
axlsx (~> 3.0.0.pre)
axlsx_rails (~> 0.5.2)
@ -452,13 +453,13 @@ DEPENDENCIES
enumerize
faraday (~> 0.15.4)
font-awesome-sass (= 4.7.0)
gitlab!
grape-entity (~> 0.7.1)
groupdate (~> 4.1.0)
harmonious_dictionary (~> 0.0.1)
jbuilder (~> 2.5)
jquery-rails
kaminari (~> 1.1, >= 1.1.1)
letter_avatar
listen (>= 3.0.5, < 3.2)
mysql2 (>= 0.4.4, < 0.6.0)
oauth2
@ -489,6 +490,7 @@ DEPENDENCIES
searchkick
selenium-webdriver
sidekiq
sidekiq-cron (~> 1.1)
simple_form
simple_xlsx_reader
sinatra
@ -502,8 +504,5 @@ DEPENDENCIES
web-console (>= 3.3.0)
wkhtmltopdf-binary
RUBY VERSION
ruby 2.3.7p456
BUNDLED WITH
2.1.4

137
LICENSE
View File

@ -1,21 +1,124 @@
MIT License
木兰宽松许可证, 第2版
Copyright (c) [year] [fullname]
2020年1月 http://license.coscl.org.cn/MulanPSL2
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
您对“软件”的复制、使用、修改及分发受木兰宽松许可证第2版“本许可证”的如下条款的约束
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
0. 定义
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。
“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。
“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。
“法人实体” 是指提交贡献的机构及其“关联实体”。
“关联实体” 是指对“本许可证”下的行为方而言控制、受控制或与其共同受控制的机构此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。
1. 授予版权许可
每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。
2. 授予专利许可
每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。
3. 无商标许可
“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可但您为满足第4条规定的声明义务而必须使用除外。
4. 分发限制
您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。
5. 免责声明与责任限制
“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。
6. 语言
“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。
条款结束
如何将木兰宽松许可证第2版应用到您的软件
如果您希望将木兰宽松许可证第2版应用到您的新软件为了方便接收者查阅建议您完成如下三步
1 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字;
2 请您在软件包的一级目录下创建以“LICENSE”为名的文件将整个许可证文本放入该文件中
3 请将如下声明文本放入每个源文件的头部注释中。
Copyright (c) [Year] [name of copyright holder]
[Software Name] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
Mulan Permissive Software LicenseVersion 2
Mulan Permissive Software LicenseVersion 2 (Mulan PSL v2)
January 2020 http://license.coscl.org.cn/MulanPSL2
Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions:
0. Definition
Software means the program and related documents which are licensed under this License and comprise all Contribution(s).
Contribution means the copyrightable work licensed by a particular Contributor under this License.
Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License.
Legal Entity means the entity making a Contribution and all its Affiliates.
Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, control means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity.
1. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not.
2. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken.
3. No Trademark License
No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in section 4.
4. Distribution Restriction
You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software.
5. Disclaimer of Warranty and Limitation of Liability
THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW ITS CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
6. Language
THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL.
END OF THE TERMS AND CONDITIONS
How to Apply the Mulan Permissive Software LicenseVersion 2 (Mulan PSL v2) to Your Software
To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps:
Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner;
Create a file named "LICENSE" which contains the whole context of this License in the first directory of your software package;
Attach the statement to the appropriate annotated syntax at the beginning of each source file.
Copyright (c) [Year] [name of copyright holder]
[Software Name] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.

5169
README.md

File diff suppressed because it is too large Load Diff

5105
api_document.md Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -99,3 +99,38 @@ $(document).on("turbolinks:before-cache", function () {
$(function () {
});
$(document).on('turbolinks:load', function() {
$('.logo-item-left').on("change", 'input[type="file"]', function () {
var $fileInput = $(this);
var file = this.files[0];
var imageType = /image.*/;
if (file && file.type.match(imageType)) {
var reader = new FileReader();
reader.onload = function () {
var $box = $fileInput.parent();
$box.find('img').attr('src', reader.result).css('display', 'block');
$box.addClass('has-img');
};
reader.readAsDataURL(file);
} else {
}
});
$('.attachment-item-left').on("change", 'input[type="file"]', function () {
var $fileInput = $(this);
var file = this.files[0];
var imageType = /image.*/;
if (file && file.type.match(imageType)) {
var reader = new FileReader();
reader.onload = function () {
var $box = $fileInput.parent();
$box.find('img').attr('src', reader.result).css('display', 'block');
$box.addClass('has-img');
};
reader.readAsDataURL(file);
} else {
}
});
})

View File

@ -1,7 +1,7 @@
$(document).on('turbolinks:load', function() {
if ($('body.admins-courses-index-page').length > 0) {
let searchContainer = $(".course-list-form");
let searchForm = $("form.search-form",searchContainer);
var searchContainer = $(".course-list-form");
var searchForm = $("form.search-form",searchContainer);
searchContainer.on('change', '.course-homepage-show', function(){
searchForm.find('input[type="submit"]').trigger('click');

View File

@ -0,0 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

View File

@ -0,0 +1,141 @@
/*
* @Description: Do not edit
* @Date: 2021-08-31 11:16:45
* @LastEditors: viletyy
* @Author: viletyy
* @LastEditTime: 2021-08-31 14:19:46
* @FilePath: /forgeplus/app/assets/javascripts/admins/system_notifications/index.js
*/
$(document).on('turbolinks:load', function(){
var showSuccessNotify = function() {
$.notify({
message: '操作成功'
},{
type: 'success'
});
}
// close user
$('.project-list-container').on('click', '.recommend-action', function(){
var $closeAction = $(this);
var $uncloseAction = $closeAction.siblings('.unrecommend-action');
var $editAction = $closeAction.siblings('.edit-recommend-action');
var keywordID = $closeAction.data('id');
customConfirm({
content: '确认将该项目设置为推荐项目吗?',
ok: function(){
$.ajax({
url: '/admins/projects/' + keywordID,
method: 'PUT',
dataType: 'json',
data: {
project: {
recommend: true,
recommend_index: 1
}
},
success: function() {
showSuccessNotify();
$closeAction.hide();
$uncloseAction.show();
$editAction.show();
$(".project-item-"+keywordID).children('td').eq(5).text("√")
}
});
}
});
});
// unclose user
$('.project-list-container').on('click', '.unrecommend-action', function(){
var $uncloseAction = $(this);
var $closeAction = $uncloseAction.siblings('.recommend-action');
var $editAction = $closeAction.siblings('.edit-recommend-action');
var keywordID = $uncloseAction.data('id');
customConfirm({
content: '确认取消该推荐项目吗?',
ok: function () {
$.ajax({
url: '/admins/projects/' + keywordID,
method: 'PUT',
dataType: 'json',
data: {
project: {
recommend: false,
recommend_index: 0
}
},
success: function() {
showSuccessNotify();
$closeAction.show();
$uncloseAction.hide();
$editAction.hide();
$(".project-item-"+keywordID).children('td').eq(5).text("")
}
});
}
})
});
// close user
$('.project-list-container').on('click', '.pinned-action', function(){
var $closeAction = $(this);
var $uncloseAction = $closeAction.siblings('.unpinned-action');
var keywordID = $closeAction.data('id');
customConfirm({
content: '确认将该项目设置为精选项目吗?',
ok: function(){
$.ajax({
url: '/admins/projects/' + keywordID,
method: 'PUT',
dataType: 'json',
data: {
project: {
is_pinned: true,
}
},
success: function() {
showSuccessNotify();
$closeAction.hide();
$uncloseAction.show();
$(".project-item-"+keywordID).children('td').eq(4).text("√")
}
});
}
});
});
// unclose user
$('.project-list-container').on('click', '.unpinned-action', function(){
var $uncloseAction = $(this);
var $closeAction = $uncloseAction.siblings('.pinned-action');
var keywordID = $uncloseAction.data('id');
customConfirm({
content: '确认取消该精选项目吗?',
ok: function () {
$.ajax({
url: '/admins/projects/' + keywordID,
method: 'PUT',
dataType: 'json',
data: {
project: {
is_pinned: false,
}
},
success: function() {
showSuccessNotify();
$closeAction.show();
$uncloseAction.hide();
$(".project-item-"+keywordID).children('td').eq(4).text("")
}
});
}
})
});
})

View File

@ -0,0 +1,76 @@
/*
* @Description: Do not edit
* @Date: 2021-08-31 11:16:45
* @LastEditors: viletyy
* @Author: viletyy
* @LastEditTime: 2021-08-31 14:19:46
* @FilePath: /forgeplus/app/assets/javascripts/admins/reversed_keywords/index.js
*/
$(document).on('turbolinks:load', function(){
var showSuccessNotify = function() {
$.notify({
message: '操作成功'
},{
type: 'success'
});
}
// close user
$('.reversed-keyword-list-container').on('click', '.close-action', function(){
var $closeAction = $(this);
var $uncloseAction = $closeAction.siblings('.unclose-action');
var keywordID = $closeAction.data('id');
customConfirm({
content: '确认关闭限制吗?',
ok: function(){
$.ajax({
url: '/admins/reversed_keywords/' + keywordID,
method: 'PUT',
dataType: 'json',
data: {
reversed_keyword: {
closed: true
}
},
success: function() {
showSuccessNotify();
$closeAction.hide();
$uncloseAction.show();
$(".reversed-keyword-item-"+keywordID).children('td').eq(3).text("")
}
});
}
});
});
// unclose user
$('.reversed-keyword-list-container').on('click', '.unclose-action', function(){
var $uncloseAction = $(this);
var $closeAction = $uncloseAction.siblings('.close-action');
var keywordID = $uncloseAction.data('id');
customConfirm({
content: '确认开启限制吗?',
ok: function () {
$.ajax({
url: '/admins/reversed_keywords/' + keywordID,
method: 'PUT',
dataType: 'json',
data: {
reversed_keyword: {
closed: false
}
},
success: function() {
showSuccessNotify();
$closeAction.show();
$uncloseAction.hide();
$(".reversed-keyword-item-"+keywordID).children('td').eq(3).text("√")
}
});
}
})
});
})

View File

@ -1,7 +1,15 @@
/*
* @Description: Do not edit
* @Date: 2021-07-16 11:58:16
* @LastEditors: viletyy
* @Author: viletyy
* @LastEditTime: 2021-08-31 14:48:59
* @FilePath: /forgeplus/app/assets/javascripts/admins/shixun_settings/index.js
*/
$(document).on('turbolinks:load', function() {
if ($('body.admins-shixun-settings-index-page').length > 0) {
let searchContainer = $(".shixun-settings-list-form");
let searchForm = $("form.search-form",searchContainer);
var searchContainer = $(".shixun-settings-list-form");
var searchForm = $("form.search-form",searchContainer);
searchContainer.on('change', '.shixun-settings-select', function(){
searchForm.find('input[type="submit"]').trigger('click');

View File

@ -0,0 +1,76 @@
/*
* @Description: Do not edit
* @Date: 2021-08-31 11:16:45
* @LastEditors: viletyy
* @Author: viletyy
* @LastEditTime: 2021-08-31 14:19:46
* @FilePath: /forgeplus/app/assets/javascripts/admins/system_notifications/index.js
*/
$(document).on('turbolinks:load', function(){
var showSuccessNotify = function() {
$.notify({
message: '操作成功'
},{
type: 'success'
});
}
// close user
$('.system-notification-list-container').on('click', '.close-action', function(){
var $closeAction = $(this);
var $uncloseAction = $closeAction.siblings('.unclose-action');
var keywordID = $closeAction.data('id');
customConfirm({
content: '确认取消置顶吗?',
ok: function(){
$.ajax({
url: '/admins/system_notifications/' + keywordID,
method: 'PUT',
dataType: 'json',
data: {
system_notification: {
is_top: false
}
},
success: function() {
showSuccessNotify();
$closeAction.hide();
$uncloseAction.show();
$(".system-notification-item-"+keywordID).children('td').eq(3).text("")
}
});
}
});
});
// unclose user
$('.system-notification-list-container').on('click', '.unclose-action', function(){
var $uncloseAction = $(this);
var $closeAction = $uncloseAction.siblings('.close-action');
var keywordID = $uncloseAction.data('id');
customConfirm({
content: '确认置顶吗?',
ok: function () {
$.ajax({
url: '/admins/system_notifications/' + keywordID,
method: 'PUT',
dataType: 'json',
data: {
system_notification: {
is_top: true
}
},
success: function() {
showSuccessNotify();
$closeAction.show();
$uncloseAction.hide();
$(".system-notification-item-"+keywordID).children('td').eq(3).text("√")
}
});
}
})
});
})

View File

@ -0,0 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

View File

@ -58,3 +58,149 @@ input.form-control {
position: absolute;
}
.logo-item {
display: flex;
&-img {
display: block;
width: 80px;
height: 80px;
background: #e9ecef;
}
&-upload {
cursor: pointer;
position: absolute;
top: 0;
width: 80px;
height: 80px;
background: #e9ecef;
border: 1px solid #ced4da;
&::before {
content: '';
position: absolute;
top: 27px;
left: 39px;
width: 2px;
height: 26px;
background: #495057;
}
&::after {
content: '';
position: absolute;
top: 39px;
left: 27px;
width: 26px;
height: 2px;
background: #495057;
}
}
&-left {
position: relative;
width: 80px;
height: 80px;
&.has-img {
.logo-item-upload {
display: none;
}
&:hover {
.logo-item-upload {
display: block;
background: rgba(145, 145, 145, 0.8);
}
}
}
}
&-right {
display: flex;
flex-direction: column;
justify-content: space-between;
color: #777777;
font-size: 0.8rem;
}
&-title {
color: #23272B;
font-size: 1rem;
}
}
.attachment-item {
display: flex;
&-img {
display: block;
width: 160px;
height: 160px;
background: #e9ecef;
}
&-upload {
cursor: pointer;
position: absolute;
top: 0;
width: 160px;
height: 160px;
background: #e9ecef;
border: 1px solid #ced4da;
&::before {
content: '';
position: absolute;
top: 54px;
left: 78px;
width: 2px;
height: 52px;
background: #495057;
}
&::after {
content: '';
position: absolute;
top: 78px;
left: 54px;
width: 52px;
height: 2px;
background: #495057;
}
}
&-left {
position: relative;
width: 160px;
height: 160px;
&.has-img {
.attachment-item-upload {
display: none;
}
&:hover {
.attachment-item-upload {
display: block;
background: rgba(145, 145, 145, 0.8);
}
}
}
}
&-right {
padding-top: 100px;
display: flex;
flex-direction: column;
justify-content: space-between;
color: #777777;
font-size: 0.8rem;
}
&-title {
color: #23272B;
font-size: 1rem;
}
}

View File

@ -0,0 +1,3 @@
// Place all the styles related to the admins/faqs controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -0,0 +1,3 @@
// Place all the styles related to the helps/faqs controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -1,4 +1,5 @@
class AccountsController < ApplicationController
include ApplicationHelper
#skip_before_action :check_account, :only => [:logout]
@ -9,6 +10,7 @@ class AccountsController < ApplicationController
# 其他平台同步注册的用户
def remote_register
username = params[:username]&.gsub(/\s+/, "")
tip_exception("无法使用以下关键词:#{username},请重新命名") if ReversedKeyword.check_exists?(username)
email = params[:email]&.gsub(/\s+/, "")
password = params[:password]
platform = (params[:platform] || 'forge')&.gsub(/\s+/, "")
@ -108,63 +110,46 @@ class AccountsController < ApplicationController
# 用户注册
# 注意:用户注册需要兼顾本地版,本地版是不需要验证码及激活码以及使用授权的,注册完成即可使用
# params[:login] 邮箱或者手机号
# params[:namespace] 登录名
# params[:code] 验证码
# code_type 1注册手机验证码 8邮箱注册验证码
# 本地forge注册入口需要重新更改逻辑
def register
# type只可能是1或者8
user = nil
begin
# 查询验证码是否正确;type只可能是1或者8
type = phone_mail_type(params[:login].strip)
code = params[:code].strip
Register::Form.new(register_params).validate!
if type == 1
uid_logger("start register by phone: type is #{type}")
pre = 'p'
email = nil
phone = params[:login]
verifi_code = VerificationCode.where(phone: phone, code: code, code_type: 1).last
user = Users::RegisterService.call(register_params)
password = register_params[:password].strip
# gitea用户注册, email, username, password
interactor = Gitea::RegisterInteractor.call({username: user.login, email: user.mail, password: password})
if interactor.success?
gitea_user = interactor.result
result = Gitea::User::GenerateTokenService.call(user.login, password)
user.gitea_token = result['sha1']
user.gitea_uid = gitea_user[:body]['id']
if user.save!
UserExtension.create!(user_id: user.id)
successful_authentication(user)
render_ok
end
else
uid_logger("start register by email: type is #{type}")
pre = 'm'
email = params[:login]
phone = nil
verifi_code = VerificationCode.where(email: email, code: code, code_type: 8).last
end
uid_logger("start register: verifi_code is #{verifi_code}, code is #{code}, time is #{Time.now.to_i - verifi_code.try(:created_at).to_i}")
# check_code = (verifi_code.try(:code) == code.strip && (Time.now.to_i - verifi_code.created_at.to_i) <= 10*60)
# todo 上线前请删除万能验证码"513231"
unless code == "513231" && request.subdomain == "test-newweb"
return normal_status(-2, "验证码不正确") if verifi_code.try(:code) != code.strip
return normal_status(-2, "验证码已失效") if !verifi_code&.effective?
end
return normal_status(-1, "8~16位密码支持字母数字和符号") unless params[:password] =~ CustomRegexp::PASSWORD
code = generate_identifier User, 8, pre
login = pre + code
@user = User.new(admin: false, login: login, mail: email, phone: phone, type: "User")
@user.password = params[:password]
# 现在因为是验证码,所以在注册的时候就可以激活
@user.activate
# 必须要用save操作密码的保存是在users中
if @user.save!
# todo user_extension
UserExtension.create!(user_id: @user.id)
# 注册完成手机号或邮箱想可以奖励500金币
# RewardGradeService.call(
# @user,
# container_id: @user.id,
# container_type: pre == 'p' ? 'Phone' : 'Mail',
# score: 500
# )
# 注册时,记录是否是引流用户
ip = request.remote_ip
ua = UserAgent.find_by_ip(ip)
ua.update_column(:agent_type, UserAgent::USER_REGISTER) if ua
successful_authentication(@user)
# session[:user_id] = @user.id
normal_status("注册成功")
tip_exception(-1, interactor.error)
end
rescue Register::BaseForm::EmailError => e
render_error(-2, e.message)
rescue Register::BaseForm::LoginError => e
render_error(-3, e.message)
rescue Register::BaseForm::PhoneError => e
render_error(-4, e.message)
rescue Register::BaseForm::PasswordFormatError => e
render_error(-5, e.message)
rescue Register::BaseForm::VerifiCodeError => e
render_error(-6, e.message)
rescue Exception => e
Gitea::User::DeleteService.call(user.login) unless user.nil?
uid_logger_error(e.message)
tip_exception(-1, e.message)
end
@ -172,6 +157,7 @@ class AccountsController < ApplicationController
# 用户登录
def login
Users::LoginForm.new(account_params).validate!
@user = User.try_to_login(params[:login], params[:password])
return normal_status(-2, "错误的账号或密码") if @user.blank?
@ -198,6 +184,25 @@ class AccountsController < ApplicationController
# session[:user_id] = @user.id
end
def change_password
@user = User.find_by(login: params[:login])
return render_error("未找到相关用户!") if @user.blank?
return render_error("旧密码不正确") unless @user.check_password?(params[:old_password])
sync_params = {
password: params[:password].to_s,
email: @user.mail
}
interactor = Gitea::User::UpdateInteractor.call(@user.login, sync_params)
if interactor.success?
@user.update_attribute(:password, params[:password])
render_ok
else
render_error(interactor.error)
end
end
# 忘记密码
def reset_password
begin
@ -279,7 +284,7 @@ class AccountsController < ApplicationController
# 发送验证码
# params[:login] 手机号或者邮箱号
# params[:type]为事件通知类型 1用户注册注册 2忘记密码 3: 绑定手机 4: 绑定邮箱, 5: 验收手机号有效 # 如果有新的继续后面加
# params[:type]为事件通知类型 1用户注册 2忘记密码 3: 绑定手机 4: 绑定邮箱, 5: 验收手机号有效 # 如果有新的继续后面加
# 发送验证码send_type 1注册手机验证码 2找回密码手机验证码 3找回密码邮箱验证码 4绑定手机 5绑定邮箱
# 6手机验证码登录 7邮箱验证码登录 8邮箱注册验证码 9: 验收手机号有效
def get_verification_code
@ -293,19 +298,22 @@ class AccountsController < ApplicationController
sign = Digest::MD5.hexdigest("#{OPENKEY}#{value}")
tip_exception(501, "请求不合理") if sign != params[:smscode]
logger.info "########### 验证码:#{verification_code}"
logger.info("########get_verification_code: login_type #{login_type} send_type#{send_type}, ")
# 记录验证码
check_verification_code(verification_code, send_type, value)
sucess_status
render_ok
end
# 1 手机类型0 邮箱类型
# 注意新版的login是自动名生成的
def phone_mail_type value
value =~ /^1\d{10}$/ ? 1 : 0
# check user's login or email or phone is used
# params[:value] 手机号或者邮箱号或者登录名
# params[:type] 为事件类型 1登录名(login) 2email(邮箱) 3phone(手机号)
def check
Register::CheckColumnsForm.new(check_params).validate!
render_ok
end
private
# type 事件类型 1用户注册 2忘记密码 3: 绑定手机 4: 绑定邮箱, 5: 验证手机号是否有效 # 如果有新的继续后面加
@ -348,4 +356,16 @@ class AccountsController < ApplicationController
params.require(:user).permit(:login, :email, :phone)
end
def account_params
params.require(:account).permit(:login, :password)
end
def check_params
params.permit(:type, :value)
end
def register_params
params.permit(:login, :namespace, :password, :code)
end
end

View File

@ -32,7 +32,7 @@ class Admins::AuthSchoolsController < Admins::BaseController
def search_manager
school = School.find_by(id: params[:school_id])
user_ids = school&.ec_school_users&.pluck(:user_id)
@users = User.where.not(id: user_ids).where("concat(lastname, firstname) like ?", "%#{params[:name].strip.to_s}%").limit(10)
@users = User.where.not(id: user_ids).where("CONCAT(lastname, firstname) like ? OR nickname like ?", "%#{params[:name].strip.to_s}%", "%#{params[:name].strip.to_s}%").limit(10)
end
# 添加认证学校管理员

View File

@ -0,0 +1,55 @@
class Admins::EduSettingsController < Admins::BaseController
before_action :find_setting, only: [:edit,:update, :destroy]
def index
default_sort('id', 'desc')
edu_settings = Admins::EduSettingQuery.call(params)
@edu_settings = paginate edu_settings
end
def new
@edu_setting = EduSetting.new
end
def edit
end
def create
@edu_setting = EduSetting.new(edu_setting_params)
if @edu_setting.save
redirect_to admins_edu_settings_path
flash[:success] = '创建成功'
else
redirect_to admins_edu_settings_path
flash[:danger] = @edu_setting.errors.full_messages.join(",")
end
end
def update
if @edu_setting.update!(edu_setting_params)
flash[:success] = '更新成功'
else
flash[:danger] = @edu_setting.errors.full_messages.join(",")
end
redirect_to admins_edu_settings_path
end
def destroy
if @edu_setting.destroy!
flash[:success] = '删除成功'
else
lash[:danger] = '删除失败'
end
redirect_to admins_edu_settings_path
end
private
def find_setting
@edu_setting ||= EduSetting.find(params[:id])
end
def edu_setting_params
params.require(:edu_setting).permit(:name, :value, :description)
end
end

View File

@ -0,0 +1,58 @@
class Admins::FaqsController < Admins::BaseController
before_action :find_faq, only: [:edit,:update, :destroy]
def index
sort_by = Faq.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'updated_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
keyword = params[:keyword].to_s.strip
collection = Faq.search_question(keyword).order("#{sort_by} #{sort_direction}")
@faqs = paginate collection
end
def new
@faq = Faq.new
end
def edit
end
def update
begin
@faq.update!(faq_params)
flash[:success] = '修改成功'
rescue Exception
flash[:danger] = @faq.errors.full_messages.to_sentence
end
redirect_to admins_faqs_path
end
def destroy
@faq.destroy
redirect_to admins_faqs_path
flash[:success] = "删除成功"
end
def create
@faq = Faq.new(faq_params)
begin
@faq.save!
flash[:success] = '创建成功'
rescue Exception
flash[:danger] = @faq.errors.full_messages.to_sentence
end
redirect_to admins_faqs_path
end
private
def find_faq
@faq = Faq.find params[:id]
end
def faq_params
params.require(:faq).permit(:question, :url)
end
end

View File

@ -6,6 +6,12 @@ class Admins::LaboratoriesController < Admins::BaseController
@laboratories = paginate laboratories.preload(:laboratory_users)
end
def new
respond_to do |format|
format.js
end
end
def create
Admins::CreateLaboratoryService.call(create_params)
render_ok
@ -27,7 +33,7 @@ class Admins::LaboratoriesController < Admins::BaseController
keyword = params[:keyword].to_s.strip
if keyword.present?
like_sql = 'shixuns.name LIKE :keyword OR CONCAT(users.lastname, users.firstname) LIKE :keyword '\
'OR mirror_repositories.name LIKE :keyword'
'users.nickname LIKE :keyword OR mirror_repositories.name LIKE :keyword'
shixuns = shixuns.joins(:user, :mirror_repositories).where(like_sql, keyword: "%#{keyword}%")
end
@ -42,7 +48,7 @@ class Admins::LaboratoriesController < Admins::BaseController
keyword = params[:keyword].to_s.strip
if keyword.present?
like_sql = 'subjects.name LIKE :keyword OR CONCAT(users.lastname, users.firstname) LIKE :keyword'
like_sql = 'subjects.name LIKE :keyword OR CONCAT(users.lastname, users.firstname) LIKE :keyword OR users.nickname LIKE :keyword'
subjects = subjects.joins(:user).where(like_sql, keyword: "%#{keyword}%")
end

View File

@ -1,4 +1,11 @@
class Admins::LaboratorySettingsController < Admins::BaseController
def new
respond_to do |format|
format.js
end
end
def show
@laboratory = current_laboratory
end

View File

@ -0,0 +1,44 @@
class Admins::MessageTemplatesController < Admins::BaseController
before_action :get_template, only: [:edit, :update, :destroy]
def index
message_templates = MessageTemplate.group(:type).count.keys
@message_templates = kaminari_array_paginate(message_templates)
end
def edit
end
def update
if @message_template.update_attributes(message_template_params)
redirect_to admins_message_templates_path
flash[:success] = '消息模版更新成功'
else
redirect_to admins_message_templates_path
flash[:danger] = @message_template.errors.full_messages.join(",")
end
end
def init_data
if MessageTemplate.build_init_data
redirect_to admins_message_templates_path
flash[:success] = '消息模版初始化成功'
else
redirect_to admins_message_templates_path
flash[:danger] = '消息模版初始化失败'
end
end
private
def message_template_params
params.require(@message_template.type.split("::").join("_").underscore.to_sym).permit!
end
def get_template
@message_template = MessageTemplate.find_by(id: params[:id])
unless @message_template.present?
redirect_to admins_message_templates_path
flash[:danger] = "消息模版不存在"
end
end
end

View File

@ -3,8 +3,8 @@ class Admins::ProjectCategoriesController < Admins::BaseController
before_action :validate_names, only: [:create, :update]
def index
sort_by = params[:sort_by] ||= 'created_at'
sort_direction = params[:sort_direction] ||= 'desc'
sort_by = ProjectCategory.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
q = ProjectCategory.ransack(name_cont: params[:name])
project_categories = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
@project_categories = paginate(project_categories)
@ -22,7 +22,7 @@ class Admins::ProjectCategoriesController < Admins::BaseController
max_position_items = ProjectCategory.select(:id, :position).pluck(:position).reject!(&:blank?)
max_position = max_position_items.present? ? max_position_items.max.to_i : 0
@project_category = ProjectCategory.new(name: @name,position: max_position)
@project_category = ProjectCategory.new(name: @name,position: max_position, pinned_index: params[:project_category][:pinned_index].to_i)
if @project_category.save
redirect_to admins_project_categories_path
flash[:success] = '创建成功'
@ -33,17 +33,18 @@ class Admins::ProjectCategoriesController < Admins::BaseController
end
def update
if @project_category.update_attribute(:name, @name)
if @project_category.update_attributes({name: @name, pinned_index: params[:project_category][:pinned_index].to_i})
save_image_file(params[:logo], 'logo')
redirect_to admins_project_categories_path
flash[:success] = '更新成功'
else
redirect_to admins_project_categories_path
flash[:success] = '更新失败'
flash[:danger] = '更新失败'
end
end
def destroy
if @project_language.destroy
if @project_category.destroy
redirect_to admins_project_categories_path
flash[:success] = "删除成功"
else
@ -80,4 +81,12 @@ class Admins::ProjectCategoriesController < Admins::BaseController
flash[:danger] = '分类已存在'
end
end
def save_image_file(file, type)
return unless file.present? && file.is_a?(ActionDispatch::Http::UploadedFile)
file_path = Util::FileManage.source_disk_filename(@project_category, type)
File.delete(file_path) if File.exist?(file_path) # 删除之前的文件
Util.write_file(file, file_path)
end
end

View File

@ -3,8 +3,8 @@ class Admins::ProjectIgnoresController < Admins::BaseController
before_action :validate_params, only: [:create, :update]
def index
sort_by = params[:sort_by] ||= 'created_at'
sort_direction = params[:sort_direction] ||= 'desc'
sort_by = Ignore.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
q = Ignore.ransack(name_cont: params[:search])
project_ignores = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
@project_ignores = paginate(project_ignores)

View File

@ -3,8 +3,8 @@ class Admins::ProjectLanguagesController < Admins::BaseController
before_action :validate_names, only: [:create, :update]
def index
sort_by = params[:sort_by] ||= 'created_at'
sort_direction = params[:sort_direction] ||= 'desc'
sort_by = ProjectLanguage.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
q = ProjectLanguage.ransack(name_cont: params[:search])
project_languages = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
@project_languages = paginate(project_languages)

View File

@ -3,8 +3,8 @@ class Admins::ProjectLicensesController < Admins::BaseController
before_action :validate_params, only: [:create, :update]
def index
sort_by = params[:sort_by] ||= 'created_at'
sort_direction = params[:sort_direction] ||= 'desc'
sort_by = License.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
q = License.ransack(name_cont: params[:search])
project_licenses = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
@project_licenses = paginate(project_licenses)

View File

@ -1,14 +1,34 @@
class Admins::ProjectsController < Admins::BaseController
before_action :find_project, only: [:edit, :update]
def index
sort_by = params[:sort_by] ||= 'created_on'
sort_direction = params[:sort_direction] ||= 'desc'
sort_by = Project.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_on'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
search = params[:search].to_s.strip
projects = Project.where("name like ?", "%#{search}%").order("#{sort_by} #{sort_direction}")
@projects = paginate projects.includes(:owner, :members, :issues, :versions, :attachments, :project_score)
end
def edit ;end
def update
respond_to do |format|
if @project.update_attributes(project_update_params)
format.html do
redirect_to admins_projects_path
flash[:sucess] = "更新成功"
end
format.js {render_ok}
else
format.html do
redirect_to admins_projects_path
flash[:danger] = "更新失败"
end
format.js {render_js_error}
end
end
end
def destroy
project = Project.find_by!(id: params[:id])
ActiveRecord::Base.transaction do
@ -22,4 +42,13 @@ class Admins::ProjectsController < Admins::BaseController
redirect_to admins_projects_path
flash[:danger] = "删除失败"
end
private
def find_project
@project = Project.find_by_id(params[:id])
end
def project_update_params
params.require(:project).permit(:is_pinned, :recommend, :recommend_index)
end
end

View File

@ -0,0 +1,84 @@
class Admins::ReversedKeywordsController < Admins::BaseController
before_action :get_keyword, only: [:edit,:update, :destroy]
# before_action :validate_identifer, only: [:create, :update]
def index
sort_by = ReversedKeyword.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
q = ReversedKeyword.ransack(identifier_cont: params[:search])
keywords = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
@keywords = paginate(keywords)
end
def new
@keyword = ReversedKeyword.new
end
def edit
end
def create
@keyword = ReversedKeyword.new(keyword_params)
if @keyword.save
redirect_to admins_reversed_keywords_path
flash[:success] = '系统保留关键词创建成功'
else
redirect_to admins_reversed_keywords_path
flash[:danger] = @keyword.errors.full_messages.join(",")
end
end
def update
respond_to do |format|
if @keyword.update_attributes(keyword_params)
format.html do
redirect_to admins_reversed_keywords_path
flash[:success] = '系统保留关键词更新成功'
end
format.js {render_ok}
else
format.html do
redirect_to admins_reversed_keywords_path
flash[:danger] = @keyword.errors.full_messages.join(",")
end
format.js {render_js_error}
end
end
end
def destroy
if @keyword.destroy
redirect_to admins_reversed_keywords_path
flash[:success] = "系统保留关键词删除成功"
else
redirect_to admins_reversed_keywords_path
flash[:danger] = "系统保留关键词删除失败"
end
end
private
def keyword_params
params.require(:reversed_keyword).permit!
end
def get_keyword
@keyword = ReversedKeyword.find_by(id: params[:id])
unless @keyword.present?
redirect_to admins_reversed_keywords_path
flash[:danger] = "系统保留关键词不存在"
end
end
def validate_identifer
identifer = keyword_params[:identifier].to_s.downcase
if identifer.blank?
redirect_to admins_reversed_keywords_path
flash[:danger] = '系统保留关键词标识不能为空'
elsif ProjectLanguage.exists?(name: identifer)
redirect_to admins_reversed_keywords_path
flash[:danger] = '系统保留关键词已存在'
end
end
end

View File

@ -0,0 +1,56 @@
class Admins::SitesController < Admins::BaseController
before_action :find_site, only: [:edit,:update, :destroy]
def index
default_sort('id', 'desc')
sites = Admins::SiteQuery.call(params)
@sites = paginate sites
end
def new
@site = Site.new
end
def edit
end
def create
@site = Site.new(site_params)
if @site.save
redirect_to admins_sites_path
flash[:success] = '创建成功'
else
redirect_to admins_sites_path
flash[:danger] = @site.errors.full_messages.join(",")
end
end
def update
if @site.update!(site_params)
flash[:success] = '更新成功'
else
flash[:danger] = @site.errors.full_messages.join(",")
end
redirect_to admins_sites_path
end
def destroy
if @site.destroy!
flash[:success] = '删除成功'
else
lash[:danger] = '删除失败'
end
redirect_to admins_sites_path
end
private
def find_site
@site ||= Site.find(params[:id])
end
def site_params
params.require(:site).permit(:name, :url, :key, :site_type)
end
end

View File

@ -0,0 +1,75 @@
class Admins::SystemNotificationsController < Admins::BaseController
before_action :get_notification, only: [:history, :edit,:update, :destroy]
# before_action :validate_identifer, only: [:create, :update]
def index
sort_by = SystemNotification.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
q = SystemNotification.ransack(subject_cont: params[:search])
notifications = q.result(distinct: true).reorder("#{sort_by} #{sort_direction},created_at desc")
@notifications = paginate(notifications)
end
def history
@users = @notification.users
end
def new
@notification = SystemNotification.new
end
def edit
end
def create
@notification = SystemNotification.new(notification_params)
if @notification.save
redirect_to admins_system_notifications_path
flash[:success] = '系统消息创建成功'
else
redirect_to admins_system_notifications_path
flash[:danger] = @notification.errors.full_messages.join(",")
end
end
def update
respond_to do |format|
if @notification.update_attributes(notification_params)
format.html do
redirect_to admins_system_notifications_path
flash[:success] = '系统消息更新成功'
end
format.js {render_ok}
else
format.html do
redirect_to admins_system_notifications_path
flash[:danger] = @notification.errors.full_messages.join(",")
end
format.js {render_js_error}
end
end
end
def destroy
if @notification.destroy
redirect_to admins_system_notifications_path
flash[:success] = "系统消息删除成功"
else
redirect_to admins_system_notifications_path
flash[:danger] = "系统消息删除失败"
end
end
private
def notification_params
params.require(:system_notification).permit!
end
def get_notification
@notification = SystemNotification.find_by(id: params[:id])
unless @notification.present?
redirect_to admins_system_notifications_path
flash[:danger] = "系统消息不存在"
end
end
end

View File

@ -1,4 +1,6 @@
class Admins::UsersController < Admins::BaseController
before_action :finder_user, except: [:index]
def index
params[:sort_by] = params[:sort_by].presence || 'created_on'
params[:sort_direction] = params[:sort_direction].presence || 'desc'
@ -8,12 +10,9 @@ class Admins::UsersController < Admins::BaseController
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
Admins::UpdateUserService.call(@user, update_params)
flash[:success] = '保存成功'
redirect_to edit_admins_user_path(@user)
@ -26,43 +25,47 @@ class Admins::UsersController < Admins::BaseController
end
def destroy
User.find(params[:id]).destroy!
@user.destroy!
Gitea::User::DeleteService.call(@user.login)
render_delete_success
end
def lock
User.find(params[:id]).lock!
@user.lock!
render_ok
end
def unlock
User.find(params[:id]).activate!
@user.activate!
render_ok
end
def reward_grade
user = User.find(params[:user_id])
return render_unprocessable_entity('金币数量必须大于0') if params[:grade].to_i <= 0
RewardGradeService.call(user, container_id: user.id, container_type: 'Feedback', score: params[:grade].to_i, not_unique: true)
RewardGradeService.call(@user, container_id: @user.id, container_type: 'Feedback', score: params[:grade].to_i, not_unique: true)
render_ok(grade: user.grade)
render_ok(grade: @user.grade)
end
def reset_login_times
User.find(params[:id]).reset_login_times!
@user.reset_login_times!
render_ok
end
private
def finder_user
@user = User.find(params[:id])
end
def update_params
params.require(:user).permit(%i[lastname nickname gender identity technical_title student_id is_shixun_marker
mail phone location location_city school_id department_id admin business is_test
password professional_certification authentication])
password professional_certification authentication login])
end
end

View File

@ -28,7 +28,7 @@ class ApplicationController < ActionController::Base
DCODES = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z)
OPENKEY = "79e33abd4b6588941ab7622aed1e67e8"
helper_method :current_user
helper_method :current_user, :base_url
# 所有请求必须合法签名
def check_sign
@ -70,49 +70,11 @@ class ApplicationController < ActionController::Base
(current_user.professional_certification && (ue.teacher? || ue.professional?))
end
def shixun_marker
unless current_user.is_shixun_marker? || current_user.admin_or_business?
tip_exception(403, "..")
end
end
# 实训的访问权限
def shixun_access_allowed
if !current_user.shixun_permission(@shixun)
tip_exception(403, "..")
end
end
def admin_or_business?
User.current.admin? || User.current.business?
end
# 访问课堂时没权限直接弹加入课堂的弹框 409
def user_course_identity
@user_course_identity = current_user.course_identity(@course)
if @user_course_identity > Course::STUDENT && @course.is_public == 0
tip_exception(401, "..") unless User.current.logged?
check_account
tip_exception(@course.excellent ? 410 : 409, "您没有权限进入")
end
if @user_course_identity > Course::CREATOR && @user_course_identity <= Course::STUDENT && @course.tea_id != current_user.id
# 实名认证和职业认证的身份判断
tip_exception(411, "你的实名认证和职业认证审核未通过") if @course.authentication &&
@course.professional_certification && (!current_user.authentication && !current_user.professional_certification)
tip_exception(411, "你的实名认证审核未通过") if @course.authentication && !current_user.authentication
tip_exception(411, "你的职业认证审核未通过") if @course.professional_certification && !current_user.professional_certification
end
uid_logger("###############user_course_identity:#{@user_course_identity}")
end
# 题库的访问权限
def bank_visit_auth
tip_exception(-2,"未通过职业认证") if current_user.is_teacher? && !current_user.certification_teacher? && !current_user.admin_or_business? && @bank.user_id != current_user.id && @bank.is_public
tip_exception(403, "无权限") unless @bank.user_id == current_user.id || current_user.admin_or_business? ||
(current_user.certification_teacher? && @bank.is_public)
end
# 判断用户的邮箱或者手机是否可用
# params[:type] 1: 注册2忘记密码3绑定
def check_mail_and_phone_valid login, type
@ -120,16 +82,16 @@ class ApplicationController < ActionController::Base
login =~ /^[a-zA-Z0-9]+([._\\]*[a-zA-Z0-9])$/
tip_exception(-2, "请输入正确的手机号或邮箱")
end
# 考虑到安全参数问题多一次查询去掉Union
user = User.where(phone: login).first || User.where(mail: login).first
if type.to_i == 1 && !user.nil?
user_exist = Owner.exists?(phone: login) || Owner.exists?(mail: login)
if user_exist && type.to_i == 1
tip_exception(-2, "该手机号码或邮箱已被注册")
elsif type.to_i == 2 && user.nil?
elsif type.to_i == 2 && !user_exist
tip_exception(-2, "该手机号码或邮箱未注册")
elsif type.to_i == 3 && user.present?
elsif type.to_i == 3 && user_exist
tip_exception(-2, "该手机号码或邮箱已绑定")
end
sucess_status
render_ok
end
# 发送及记录激活码
@ -140,7 +102,7 @@ class ApplicationController < ActionController::Base
when 1, 2, 4, 9
# 手机类型的发送
sigle_para = {phone: value}
status = Educoder::Sms.send(mobile: value, code: code)
status = Gitlink::Sms.send(mobile: value, code: code)
tip_exception(-2, code_msg(status)) if status != 0
when 8, 3, 5
# 邮箱类型的发送
@ -186,26 +148,6 @@ class ApplicationController < ActionController::Base
end
end
def find_course
return normal_status(2, '缺少course_id参数') if params[:course_id].blank?
@course = Course.find(params[:course_id])
tip_exception(404, "") if @course.is_delete == 1 && !current_user.admin_or_business?
rescue Exception => e
tip_exception(e.message)
end
def course_manager
return normal_status(403, '只有课堂管理员才有权限') if @user_course_identity > Course::CREATOR
end
def find_board
return normal_status(2, "缺少board_id参数") if params[:board_id].blank?
@board = Board.find(params[:board_id])
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def validate_type(object_type)
normal_status(2, "参数") if params.has_key?(:sort_type) && !SORT_TYPE.include?(params[:sort_type].strip)
end
@ -215,21 +157,6 @@ class ApplicationController < ActionController::Base
@page_size = params[:page_size] || 15
end
# 课堂教师权限
def teacher_allowed
logger.info("#####identity: #{current_user.course_identity(@course)}")
unless current_user.course_identity(@course) < Course::STUDENT
normal_status(403, "")
end
end
# 课堂教师、课堂管理员、超级管理员的权限(不包含助教)
def teacher_or_admin_allowed
unless current_user.course_identity(@course) < Course::ASSISTANT_PROFESSOR
normal_status(403, "")
end
end
def require_admin
normal_status(403, "") unless User.current.admin?
end
@ -246,9 +173,17 @@ class ApplicationController < ActionController::Base
tip_exception(401, "请登录后再操作") unless User.current.logged?
end
def require_profile_completed
tip_exception(411, "请完善资料后再操作") unless User.current.profile_is_completed?
end
def require_user_profile_completed(user)
tip_exception(412, "请用户完善资料后再操作") unless user.profile_is_completed?
end
# 异常提醒
def tip_exception(status = -1, message)
raise Educoder::TipException.new(status, message)
raise Gitlink::TipException.new(status, message)
end
def missing_template
@ -257,7 +192,7 @@ class ApplicationController < ActionController::Base
# 弹框提醒
def tip_show_exception(status = -2, message)
raise Educoder::TipException.new(status, message)
raise Gitlink::TipException.new(status, message)
end
def normal_status(status = 0, message)
@ -272,7 +207,7 @@ class ApplicationController < ActionController::Base
# 资料是否完善
def check_account
if !current_user.profile_completed?
if !current_user. profile_is_completed?
#info_url = '/account/profile'
tip_exception(402, nil)
end
@ -337,17 +272,18 @@ class ApplicationController < ActionController::Base
# 测试版前端需求
logger.info("subdomain:#{request.subdomain}")
if request.subdomain != "www"
if params[:debug] == 'teacher' #todo 为了测试,记得讲debug删除
User.current = User.find 81403
elsif params[:debug] == 'student'
User.current = User.find 8686
elsif params[:debug] == 'admin'
user = User.find 1
User.current = user
cookies.signed[:user_id] = user.id
end
end
# if request.subdomain != "www"
# if params[:debug] == 'teacher' #todo 为了测试,记得讲debug删除
# User.current = User.find 81403
# elsif params[:debug] == 'student'
# User.current = User.find 8686
# elsif params[:debug] == 'admin'
# logger.info "@@@@@@@@@@@@@@@@@@@@@@ debug mode....."
# user = User.find 36480
# User.current = user
# cookies.signed[:user_id] = user.id
# end
# end
# User.current = User.find 81403
end
@ -384,11 +320,7 @@ class ApplicationController < ActionController::Base
end
def current_user
if Rails.env.development?
User.current = User.find 1
else
User.current
end
User.current
end
## 默认输出json
@ -441,7 +373,7 @@ class ApplicationController < ActionController::Base
JSON.parse(res)
rescue Exception => e
uid_logger_error("--uri_exec: exception #{e.message}")
raise Educoder::TipException.new("实训平台繁忙繁忙等级84")
raise Gitlink::TipException.new("实训平台繁忙繁忙等级84")
end
end
@ -460,7 +392,7 @@ class ApplicationController < ActionController::Base
end
rescue Exception => e
uid_logger("--uri_exec: exception #{e.message}")
raise Educoder::TipException.new(message)
raise Gitlink::TipException.new(message)
end
end
@ -484,7 +416,7 @@ class ApplicationController < ActionController::Base
end
rescue Exception => e
uid_logger("--uri_exec: exception #{e.message}")
raise Educoder::TipException.new("服务器繁忙")
raise Gitlink::TipException.new("服务器繁忙")
end
end
@ -618,8 +550,8 @@ class ApplicationController < ActionController::Base
end
# 排序
rorder = option[:order] || "updated_at"
b_order = option[:b_order] || "desc"
rorder = UserExtension.column_names.include?(option[:order]) ? option[:order] : "updated_at"
b_order = %w(desc asc).include?(option[:b_order]) ? option[:b_order] : "desc"
if rorder == "created_at" || rorder == "work_score"
work_list = work_list.order("graduation_works.#{rorder} #{b_order}")
elsif rorder == "student_id"
@ -656,8 +588,8 @@ class ApplicationController < ActionController::Base
# 获取Oauth Client
def get_client(site)
client_id = Rails.configuration.educoder['client_id']
client_secret = Rails.configuration.educoder['client_secret']
client_id = Rails.configuration.Gitlink['client_id']
client_secret = Rails.configuration.Gitlink['client_secret']
OAuth2::Client.new(client_id, client_secret, site: site)
end
@ -683,6 +615,14 @@ class ApplicationController < ActionController::Base
relation.page(page).per(limit)
end
def kaminari_array_paginate(relation)
limit = params[:limit] || params[:per_page]
limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
page = params[:page].to_i.zero? ? 1 : params[:page].to_i
Kaminari.paginate_array(relation).page(page).per(limit)
end
def strf_time(time)
time.blank? ? '' : time.strftime("%Y-%m-%d %H:%M:%S")
end
@ -744,15 +684,15 @@ class ApplicationController < ActionController::Base
namespace = params[:owner]
id = params[:repo] || params[:id]
@project = Project.find_with_namespace(namespace, id)
@project, @owner = Project.find_with_namespace(namespace, id)
if @project and current_user.can_read_project?(@project)
logger.info "########### has project and can read project"
@project
elsif @project && current_user.is_a?(AnonymousUser)
logger.info "###########This is AnonymousUser"
@project = nil if !@project.is_public?
render_forbidden and return
# elsif @project && current_user.is_a?(AnonymousUser)
# logger.info "###########This is AnonymousUser"
# @project = nil if !@project.is_public?
# render_forbidden and return
else
logger.info "###########project not found"
@project = nil
@ -762,9 +702,34 @@ class ApplicationController < ActionController::Base
end
def load_repository
@repository ||= load_project.repository
@repository ||= load_project&.repository
end
def base_url
Rails.application.config_for(:configuration)['platform_url'] || request.base_url
end
def convert_image!
@image = params[:image]
@image = @image.nil? && params[:user].present? ? params[:user][:image] : @image
return unless @image.present?
max_size = EduSetting.get('upload_avatar_max_size') || 2 * 1024 * 1024 # 2M
if @image.class == ActionDispatch::Http::UploadedFile
render_error('请上传文件') if @image.size.zero?
render_error('文件大小超过限制') if @image.size > max_size.to_i
else
image = @image.to_s.strip
return render_error('请上传正确的图片') if image.blank?
@image = Util.convert_base64_image(image, max_size: max_size.to_i)
end
rescue Base64ImageConverter::Error => ex
render_error(ex.message)
end
def avatar_path(object)
ApplicationController.helpers.disk_filename(object.class, object.id)
end
private
def object_not_found
uid_logger("Missing template or cant't find record, responding with 404")
@ -817,4 +782,8 @@ class ApplicationController < ActionController::Base
HotSearchKeyword.add(keyword)
end
def find_atme_receivers
@atme_receivers = User.where(login: params[:receivers_login])
end
end

View File

@ -0,0 +1,13 @@
class AppliedProjectsController < ApplicationController
before_action :require_login
def create
@applied_project = Projects::ApplyJoinService.call(current_user, applied_params)
rescue Projects::ApplyJoinService::Error => ex
render_error(ex.message)
end
private
def applied_params
params.require(:applied_project).permit(:code, :role)
end
end

View File

@ -28,12 +28,21 @@ class AttachmentsController < ApplicationController
update_downloads(@file)
end
def get_file
def get_file
normal_status(-1, "参数缺失") if params[:download_url].blank?
url = URI.encode(params[:download_url].to_s.gsub("http:", "https:"))
response = Faraday.get(url)
filename = params[:download_url].to_s.split("/").pop()
if url.starts_with?(base_url)
domain = Gitea.gitea_config[:domain]
api_url = Gitea.gitea_config[:base_url]
url = url.split(base_url)[1].gsub("api", "repos").gsub('?filepath=', '/').gsub('&', '?')
request_url = [domain, api_url, url, "?ref=#{params[:ref]}&access_token=#{current_user&.gitea_token}"].join
response = Faraday.get(request_url)
filename = url.to_s.split("/").pop()
else
response = Faraday.get(url)
filename = params[:download_url].to_s.split("/").pop()
end
send_data(response.body.force_encoding("UTF-8"), filename: filename, type: "application/octet-stream", disposition: 'attachment')
end
@ -45,7 +54,7 @@ class AttachmentsController < ApplicationController
uid_logger("#########################file_params####{params["#{params[:file_param_name]}"]}")
raise "未上传文件" unless upload_file
folder = edu_setting('attachment_folder')
folder = file_storage_directory
raise "存储目录未定义" unless folder.present?
month_folder = current_month_folder
@ -108,7 +117,7 @@ class AttachmentsController < ApplicationController
end
# 附件为视频时,点击播放
def preview_attachment
def preview_attachment
attachment = Attachment.find_by(id: params[:id])
dir_path = "#{Rails.root}/public/preview"
Dir.mkdir(dir_path) unless Dir.exist?(dir_path)
@ -118,10 +127,10 @@ class AttachmentsController < ApplicationController
else
normal_status(-1, "出现错误,请稍后重试")
end
else
else
if system("rm -rf #{dir_path}/#{attachment.disk_filename}")
normal_status(1, "操作成功")
else
else
normal_status(-1, "出现错误,请稍后重试")
end
end
@ -187,7 +196,7 @@ class AttachmentsController < ApplicationController
end
def file_save_to_ucloud(path, file, content_type)
ufile = Educoder::Ufile.new(
ufile = Gitlink::Ufile.new(
ucloud_public_key: edu_setting('public_key'),
ucloud_private_key: edu_setting('private_key'),
ucloud_public_read: true,

View File

@ -0,0 +1,76 @@
class Ci::BaseController < ApplicationController
include Ci::DbConnectable
before_action :require_login
before_action :connect_to_ci_db
def load_repo
namespace = params[:owner]
id = params[:repo] || params[:id]
@ci_user, @repo = Ci::Repo.find_with_namespace(namespace, id)
end
def load_all_repo
namespace = current_user.login
@repos = Ci::Repo.find_all_with_namespace(namespace)
end
def load_repo_by_repo_slug(slug)
@repo_slug = Ci::Repo.load_repo_by_repo_slug(slug)
end
private
def authorize_access_project!
unless @project.manager?(current_user)
return render_forbidden
end
end
def authenticate_manager!
unless @project.manager?(current_user)
return render_forbidden
end
end
def authenticate_admin!
return render_forbidden unless current_user.admin?
end
def authorize_owner!
unless @project.owner?(current_user)
return render_forbidden
end
end
def find_cloud_account
@cloud_account ||= current_user.ci_cloud_account
@cloud_account.blank? ? nil : @cloud_account
end
def load_ci_user
@ci_user ||= Ci::User.find_by(user_login: params[:owner])
@ci_user.blank? ? raise("未找到相关的记录") : @ci_user
end
def connect_to_ci_db(options={})
current = current_user
owner = params[:owner]
if owner
current = User.find_by(login: owner)
end
if !(current && !current.is_a?(AnonymousUser) && !current.devops_uninit?)
return
end
if current.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
connect_to_trustie_ci_database(options)
else
options = options.merge(db_name: current.login)
connect_to_ci_database(options)
end
end
end

View File

@ -0,0 +1,53 @@
class Ci::BuildsController < Ci::BaseController
include RepositoriesHelper
before_action :load_project
before_action :authorize_owner!, only: [:restart, :stop]
before_action :load_repo
before_action :find_cloud_account, except: [:index, :show]
def index
@user = current_user
scope = Ci::Builds::ListQuery.call(@repo, params)
@total_count = scope.map(&:build_id).size
@builds = paginate scope
end
def show
@build = @repo.builds.includes(stages: [:steps]).find_by(build_number: params[:build])
end
def restart
result = Ci::Drone::API.new(@ci_user.user_hash, @cloud_account.drone_url, @repo.repo_namespace, @repo.repo_name, number: params[:build]).restart
render json: result
end
def stop
result = Ci::Drone::API.new(@ci_user.user_hash, @cloud_account.drone_url, @repo.repo_namespace, @repo.repo_name, number: params[:build]).stop
render json: result
end
def logs
# TODO **待优化**
# 因直接操作ci库如下查询待优化可直接根据log id查询即可
build = @repo.builds.find_by(build_number: params[:build])
return render_not_found("Couldn't found build with 'number'= #{params[:build]}") if build.blank?
stage = build.stages.includes(steps: [:log]).find_by(stage_number: params[:stage])
return render_not_found("Couldn't found build with 'number'= #{params[:stage]}") if stage.blank?
step = stage.steps.find_by(step_number: params[:step])
return render_not_found("Couldn't found build with 'number'= #{params[:step]}") if step.blank?
log = step.log
result = log.blank? ? nil : (log.log_data[0..5].include?('null') ? nil : JSON.parse(log.log_data))
# result = Ci::Drone::API.new(@user.user_hash, @cloud_account.drone_url, @repo.repo_namespace, @repo.repo_name, build: params[:build], stage: params[:stage], step: params[:step]).logs
render json: result
end
end

View File

@ -0,0 +1,129 @@
class Ci::CloudAccountsController < Ci::BaseController
include Ci::CloudAccountManageable
skip_before_action :connect_to_ci_db, only: %i[create bind trustie_bind]
before_action :load_project, only: %i[create activate]
before_action :authorize_owner!, only: %i[create activate]
before_action :load_repo, only: %i[activate]
before_action :load_all_repo, only: %i[unbind]
before_action :find_cloud_account, only: %i[show oauth_grant]
before_action :validate_params!, only: %i[create bind]
before_action only: %i[create bind] do
connect_to_ci_database(master_db: true)
end
def create
flag, msg = check_bind_cloud_account!
return render_error(msg) if flag === true
ActiveRecord::Base.transaction do
@cloud_account = bind_account!
if @cloud_account.blank?
render_error('激活失败, 请检查你的云服务器信息是否正确.')
raise ActiveRecord::Rollback
else
current_user.set_drone_step!(User::DEVOPS_UNVERIFIED)
render_ok(redirect_url: @cloud_account.authenticate_url)
end
end
rescue Exception => ex
render_error(ex.message)
end
def activate
return render_error('请先认证') unless current_user.ci_certification?
begin
@cloud_account = Ci::CloudAccount.find params[:id]
ActiveRecord::Base.transaction do
if @repo
return render_error('该项目已经激活') if @repo.repo_active?
@repo.activate!(@project)
else
@repo = Ci::Repo.auto_create!(@ci_user, @project)
@user.update_column(:user_syncing, false)
end
result = bind_hook!(current_user, @cloud_account, @repo)
@project.update_columns(open_devops: true, gitea_webhook_id: result['id'])
@cloud_account.update_column(:ci_user_id, @ci_user.user_id)
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
end
def show
end
def bind
flag, msg = check_bind_cloud_account!
return render_error(msg) if flag === true
ActiveRecord::Base.transaction do
@cloud_account = bind_account!
if @cloud_account.blank?
render_error('激活失败, 请检查你的云服务器信息是否正确.')
raise ActiveRecord::Rollback
else
current_user.set_drone_step!(User::DEVOPS_UNVERIFIED)
end
end
rescue Exception => ex
render_error(ex.message)
end
def trustie_bind
account = params[:account].to_s
return render_error("account不能为空.") if account.blank?
flag, msg = check_trustie_bind_cloud_account!
return render_error(msg) if flag === true
ActiveRecord::Base.transaction do
@cloud_account = trustie_bind_account!
if @cloud_account.blank?
render_error('激活失败, 请检查你的云服务器信息是否正确.')
raise ActiveRecord::Rollback
else
current_user.set_drone_step!(User::DEVOPS_UNVERIFIED)
end
end
rescue Exception => ex
render_error(ex.message)
end
def unbind
ActiveRecord::Base.transaction do
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
if @repos
@repos.each do |repo|
repo.deactivate!
end
end
end
unbind_account!
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def oauth_grant
password = params[:password].to_s
return render_error('你输入的密码不正确.') unless current_user.check_password?(password)
oauth = current_user.oauths.last
return render_error("服务器出小差了.") if oauth.blank?
result = gitea_oauth_grant!(password, oauth)
return render_error('授权失败.') unless result === true
current_user.set_drone_step!(User::DEVOPS_CERTIFICATION)
end
private
def validate_params!
Ci::CreateCloudAccountForm.new(devops_params).validate!
end
end

View File

@ -0,0 +1,20 @@
class Ci::LanguagesController < Ci::BaseController
# TODO 需要开启权限认证只有该项目devops初始化成功后才能获取语言列表
before_action :find_langugae, only: :show
def index
@languages = Ci::Language.by_usage_amount_desc
end
def show
end
def common
@languages = Ci::Language.six_common
end
private
def find_langugae
@language = Ci::Language.find params[:id]
end
end

View File

@ -0,0 +1,294 @@
class Ci::PipelinesController < Ci::BaseController
before_action :require_login, only: %i[list create content]
skip_before_action :connect_to_ci_db, except: %i[list create destroy content]
before_action :load_project, only: %i[create content]
before_action :load_repo, only: %i[create content]
# ======流水线相关接口========== #
def list
@result = Array.new
list = Ci::Pipeline.where('identifier=? and owner=?', params[:identifier], params[:owner])
# 查询build状态
list.collect do |pipeline|
pipeline.last_build_time = nil
repo = load_repo_by_repo_slug("#{pipeline.owner}/#{pipeline.identifier}")
if repo
build = repo.builds.order("build_created desc").find_by(build_target: pipeline.branch)
if build
pipeline.pipeline_status = build.build_status
pipeline.last_build_time = Time.at(build.build_created)
end
end
@result.push(pipeline)
end
@total_count = @result.size
@pipelines = paginate @result
end
def create
ActiveRecord::Base.transaction do
size = Ci::Pipeline.where('branch=? and identifier=? and owner=?', params[:branch], params[:repo], params[:owner]).size
if size > 0
render_error("#{params[:branch]}分支已经存在流水线!")
return
end
pipeline = Ci::Pipeline.new(pipeline_name: params[:pipeline_name], file_name: params[:file_name],owner: params[:owner],
login: current_user.login, identifier: params[:repo], branch: params[:branch], event: params[:event])
pipeline.save!
# 默认创建四个初始阶段
init_stages = Ci::PipelineStage::INIT_STAGES
index = 1
init_stages.each do |type, name|
pipeline.pipeline_stages.build(
stage_name: name,
stage_type: type,
show_index: index
).save!
index += 1
end
create_pipeline_file(pipeline)
create_ci_repo(pipeline)
render_ok({id: pipeline.id})
end
rescue Exception => ex
render_error(ex.message)
end
# 在代码库创建文件
def create_pipeline_file(pipeline)
sha = get_pipeline_file_sha(pipeline.file_name, pipeline.branch)
if sha
logger.info "#{pipeline.file_name}已存在"
else
interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @owner.login, content_params)
if interactor.success?
logger.info "#{pipeline.file_name}创建成功"
end
end
end
# 在drone数据库repo表新增一条repo记录
def create_ci_repo(pipeline)
if pipeline.branch != 'master'
create_params = {
repo_user_id: @ci_user.user_id,
repo_namespace: @project.owner.login,
repo_name: @project.identifier,
repo_slug: "#{@project.owner.login}/#{@project.identifier}-" + pipeline.id.to_s,
repo_clone_url: @project.repository.url,
repo_branch: pipeline.branch,
repo_config: pipeline.file_name
}
repo = Ci::Repo.create_repo(create_params)
repo
end
nil
end
def get_pipeline_file_sha(file_name, branch)
file_path_uri = URI.parse(file_name)
interactor = Repositories::EntriesInteractor.call(@project.owner, @project.identifier, file_path_uri, ref: branch || 'master')
if interactor.success?
file = interactor.result
file['sha']
end
end
def content_params
{
filepath: params[:file_name],
branch: params[:branch],
new_branch: params[:new_branch],
content: "#pipeline \n",
message: 'create pipeline',
committer: {
email: current_user.mail,
name: current_user.login
},
identifier: params[:repo]
}
end
def update
pipeline = Ci::Pipeline.find(params[:id])
if pipeline
pipeline.update!(pipeline_name: params[:pipeline_name],branch: params[:branch], event: params[:event])
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def destroy
pipeline = Ci::Pipeline.find(params[:id])
if pipeline
repo = load_repo_by_repo_slug("#{pipeline.login}/#{pipeline.identifier}-" + pipeline.id.to_s)
if repo
repo.destroy!
end
pipeline.destroy!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def content
@yaml = "\n"
pipeline = Ci::Pipeline.find(params[:id])
stages = pipeline.pipeline_stages
if stages && !stages.empty?
init_step = stages.first.pipeline_stage_steps.first
@yaml += init_step.content + "\n" + "steps:\n"
stages = stages.slice(1, stages.size - 1)
unless stages.empty?
stages.each do |stage|
steps = stage.pipeline_stage_steps
next unless steps && !steps.empty?
steps.each do |step|
@yaml += step.content + "\n"
end
end
end
end
@sha = get_pipeline_file_sha(pipeline.file_name, pipeline.branch)
trigger = ''
trigger += " branch:\r\n - #{pipeline.branch}\r\n" unless pipeline.branch.blank?
unless pipeline.event.blank?
trigger += " event:\r\n"
pipeline.event.split(',').each { |event| trigger += " - #{event}\r\n"}
end
@yaml += "trigger:\r\n" + trigger unless trigger.blank?
@branch = pipeline.branch
end
# =========阶段相关接口========= #
def stages
pipeline_id = params[:id]
@pipeline_name = Ci::Pipeline.find(pipeline_id).pipeline_name
@pipeline_stages = Ci::PipelineStage.where('pipeline_id=?', pipeline_id).order('show_index asc')
end
def create_stage
ActiveRecord::Base.transaction do
# 修改stage排序
update_stage_index(params[:id], params[:show_index], 1)
pipeline_stage = Ci::PipelineStage.new(stage_name: params[:stage_name],
stage_type: params[:stage_type].blank? ? 'customize' : params[:stage_type],
pipeline_id: params[:id], show_index: params[:show_index])
pipeline_stage.save!
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def update_stage
pipeline_stage = Ci::PipelineStage.find(params[:stage_id])
if pipeline_stage
pipeline_stage.update!(stage_name: params[:stage_name])
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def delete_stage
ActiveRecord::Base.transaction do
update_stage_index(params[:id], params[:show_index].to_i, -1)
pipeline_stage = Ci::PipelineStage.find(params[:stage_id])
if pipeline_stage
pipeline_stage.destroy!
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def update_stage_index(pipeline_id, show_index, diff)
stages = Ci::Pipeline.find(pipeline_id).pipeline_stages
stages.each do |stage|
if stage.show_index >= show_index
stage.update!(show_index: stage.show_index + diff)
end
end
end
# ========步骤相关接口========= #
def steps
@stage_type = Ci::PipelineStage.find(params[:stage_id]).stage_type
@pipeline_stage_steps = Ci::PipelineStageStep.where('stage_id=?', params[:stage_id]).order('show_index asc')
end
def stage_step
ActiveRecord::Base.transaction do
steps = params[:steps]
unless steps.empty?
steps.each do |step|
unless step[:template_id]
render_error('请选择模板!')
return
end
if !step[:id]
step = Ci::PipelineStageStep.new(step_name: step[:step_name], stage_id: params[:stage_id],
template_id: step[:template_id], content: step[:content], show_index: step[:show_index])
step.save!
else
pipeline_stage_step = Ci::PipelineStageStep.find(step[:id])
pipeline_stage_step.update(step_name: step[:step_name], content: step[:content],
show_index: step[:show_index], template_id: step[:template_id])
end
end
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def create_stage_step
ActiveRecord::Base.transaction do
steps = params[:steps]
unless steps.empty?
steps.each do |step|
step = Ci::PipelineStageStep.new(step_name: step[:step_name], stage_id: params[:stage_id],
template_id: step[:template_id], content: step[:content], show_index: step[:show_index])
step.save!
end
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def update_stage_step
ActiveRecord::Base.transaction do
steps = params[:steps]
unless steps.empty?
steps.each do |step|
pipeline_stage_step = Ci::PipelineStageStep.find(step[:id])
if pipeline_stage_step
pipeline_stage_step.update(step_name: step[:step_name], content: step[:content], template_id: step[:template_id])
end
end
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def delete_stage_step
pipeline_stage_step = Ci::PipelineStageStep.find(params[:step_id])
if pipeline_stage_step
pipeline_stage_step.destroy!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
end

View File

@ -0,0 +1,70 @@
class Ci::ProjectsController < Ci::BaseController
include RepositoriesHelper
include Ci::CloudAccountManageable
before_action :load_project
before_action :load_repo, only: [:update_trustie_pipeline, :activate, :deactivate]
before_action :authorize_owner!, only: [:authorize]
before_action :find_cloud_account, only: [:authorize, :activate, :deactivate]
def authorize
@user = current_user
end
# get .trustie-pipeline.yml file
def get_trustie_pipeline
file_path_uri = URI.parse('.trustie-pipeline.yml')
interactor = Repositories::EntriesInteractor.call(@project.owner, @project.identifier, file_path_uri, ref: params[:ref] || "master")
if interactor.success?
file = interactor.result
return render json: {} if file[:status]
json = {name: file['name'], path: file['path'], sha: file['sha'], content: render_decode64_content(file['content'])}
render json: json
end
end
def update_trustie_pipeline
interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, params[:owner], params.merge(identifier: @project.identifier))
if interactor.success?
@file = interactor.result
render_result(1, "更新成功")
else
render_error(interactor.error)
end
end
def activate
return render_error('你还未认证') unless current_user.ci_certification?
begin
ActiveRecord::Base.transaction do
if @repo
return render_error('该项目已经激活') if @repo.repo_active?
@repo.activate!(@project)
return render_ok
else
@repo = Ci::Repo.auto_create!(@ci_user, @project)
@ci_user.update_column(:user_syncing, false)
end
result = bind_hook!(current_user, @cloud_account, @repo)
@project.update_columns(open_devops: true, gitea_webhook_id: result['id'])
@project.increment!(:open_devops_count)
@cloud_account.update_column(:ci_user_id, @ci_user.user_id)
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
end
def deactivate
return render_error('该项目已经取消激活') if !@repo.repo_active?
@project.update_column(:open_devops, false)
@repo.deactivate_repos!
render_ok
end
end

View File

@ -0,0 +1,53 @@
class Ci::SecretsController < Ci::BaseController
before_action :load_repo
# 参数列表
def index
result = Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], nil).secrets
@secrets = result
end
#新增、更新参数
def create
options = {
name: params[:name],
data: params[:data]
}
id = params[:id]
if id
result = Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], options).update_secret
if result["id"]
render_ok
else
render_error(result["message"])
end
else
result = Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], options).create_secret
if result["id"]
render_ok
else
render_error(result["message"])
end
end
end
#删除参数
def destroy
name = params[:name]
if !name.blank?
Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], {name: name}).delete_secret
render_ok
else
render_error("参数名不能为空")
end
rescue Exception => ex
render_ok
end
def ci_drone_url
user = User.find_by(login: params[:owner])
user&.ci_cloud_account.drone_url
end
end

View File

@ -0,0 +1,104 @@
class Ci::TemplatesController < Ci::BaseController
before_action :require_login, only: %i[list create]
skip_before_action :connect_to_ci_db
#======模板管理======#
def list
stage_type = params[:stage_type]
template_name = params[:name]
templates = template_name.blank? ? Ci::Template.all : Ci::Template.where("template_name like ?", "%#{template_name}%")
templates = templates.select{ |template| template.login == current_user.login} unless current_user.admin?
if !stage_type.blank? && stage_type != 'all'
templates = templates.select{ |template| template.stage_type == stage_type}
end
@total_count = templates.map(&:id).count
@templates = paginate templates
end
def show
@template = Ci::Template.find(params[:id])
end
def create
stage_type = params[:stage_type]
category = params[:category]
if category.blank?
category = Ci::Template::STAGE_TYPES[:"#{stage_type}"]
end
if params[:id]
template = Ci::Template.find(params[:id])
if template
template.update!(template_name: params[:template_name],
stage_type: stage_type,
category: category,
parent_category: Ci::Template::STAGE_TYPES[:"#{stage_type}"],
content: params[:content],
login: current_user.admin? ? 'admin' : current_user.login
)
end
else
template = Ci::Template.new(template_name: params[:template_name],
stage_type: stage_type,
category: category,
parent_category: Ci::Template::STAGE_TYPES[:"#{stage_type}"],
content: params[:content],
login: current_user.admin? ? 'admin' : current_user.login
)
template.save!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def update
template = Ci::Template.find(params[:id])
template.update!(template_name: params[:template_name],
stage_type: params[:stage_type],
category: params[:category],
parent_category: params[:parent_category],
content: params[:content]
)
render_ok
rescue Exception => ex
render_error(ex.message)
end
def destroy
template = Ci::Template.find(params[:id])
if template
template.destroy!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
#======流水线模板查询=====#
def templates_by_stage
stage_type = params[:stage_type]
if stage_type != Ci::PipelineStage::CUSTOMIZE_STAGE_TYPE
@templates = Ci::Template.where("stage_type = ?", stage_type)
@templates = @templates.select{ |template| template.login == current_user.login || template.login == 'admin'} unless current_user.admin?
if stage_type == Ci::PipelineStage::INIT_STAGE_TYPE && !@templates.nil?
@templates.each do |template|
content = template.content
unless content.blank?
pipeline = Ci::Pipeline.find(params[:id])
template.content = content.gsub(/{name}/, pipeline.pipeline_name) unless pipeline.nil?
end
end
end
# 根据模板类别分组
@category_templates = @templates.group_by{ |template| template.category }
else
# 自定义阶段,按阶段分类分类返回模板列表
@templates = Ci::Template.where("stage_type != ?", Ci::PipelineStage::INIT_STAGE_TYPE)
@templates = @templates.select{ |template| template.login == current_user.login || template.login == 'admin'} unless current_user.admin?
@category_templates = @templates.group_by{ |template| template.parent_category }
end
end
end

View File

@ -0,0 +1,53 @@
class CompareController < ApplicationController
# skip_before_action :require_login
before_action :load_repository
def index
end
def show
load_compare_params
compare
@merge_status, @merge_message = get_merge_message
end
private
def get_merge_message
if @base.blank? || @head.blank?
return -2, "请选择分支"
else
if @head.include?(":")
fork_project = @project.forked_projects.joins(:owner).where(users: {login: @head.to_s.split("/")[0]}).take
return -2, "请选择正确的仓库" unless fork_project.present?
@exist_pullrequest = @project.pull_requests.where(is_original: true, head: @head.to_s.split(":")[1], base: @base, status: 0, fork_project_id: fork_project.id).take
else
@exist_pullrequest = @project.pull_requests.where(is_original: false, head: @base, base: @head, status: 0).take
end
if @exist_pullrequest.present?
return -2, "在这些分支之间的合并请求已存在:<a href='/#{@owner.login}/#{@project.identifier}/pulls/#{@exist_pullrequest.id}'>#{@exist_pullrequest.try(:title)}</a>"
else
if @compare_result["Commits"].blank? && @compare_result["Diff"].blank?
return -2, "分支内容相同,无需创建合并请求"
end
end
end
return 0, "可以合并"
end
def compare
# TODO: 处理fork的项目向源项目发送PR的base、head参数问题
@compare_result ||=
@head.include?(":") ? gitea_compare(@base, @head) : gitea_compare(@head, @base)
end
def load_compare_params
@base = Addressable::URI.unescape(params[:base])
@head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head]
end
def gitea_compare(base, head)
Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head, current_user.gitea_token)
end
end

View File

@ -3,13 +3,12 @@ class ComposesController < ApplicationController
before_action :find_compose, except: [:index, :new,:create]
def index
@order_type = params[:order] || "created_at"
@search_name = params[:search]
composes = Compose.compose_includes
if @search_name.present?
composes = composes.where("title like ?", "%#{@search_name}%")
end
composes = composes.order("#{@order_type} desc")
composes = composes.order("#{order_type} desc")
@page = params[:page] || 1
@limit = params[:limit] || 15
@composes_size = composes.size
@ -96,4 +95,8 @@ class ComposesController < ApplicationController
end
end
def order_type
Compose.column_names.include?(params[:order_type]) ? params[:order_type] : 'created_at'
end
end

View File

@ -0,0 +1,36 @@
module Acceleratorable
extend ActiveSupport::Concern
def enable_accelerator?(clone_addr)
is_foreign_url?(clone_addr) && config_accelerator?
end
def accelerator_url(repo_name)
[accelerator_domain, accelerator_username, "#{repo_name}.git"].join('/')
end
def github_domain
'github.com'
end
def gitlab_domain
'gitlab.com'
end
def accelerator_domain
Gitea.gitea_config[:accelerator]["domain"]
end
def accelerator_username
Gitea.gitea_config[:accelerator]["access_key_id"]
end
def config_accelerator?
Gitea.gitea_config[:accelerator].present?
end
def is_foreign_url?(clone_addr)
clone_addr.include?(github_domain) || clone_addr.include?(gitlab_domain)
end
end

View File

@ -0,0 +1,209 @@
module Ci::CloudAccountManageable
extend ActiveSupport::Concern
included do
end
# 自有服务器绑定流程
def bind_account!
# 1. 保存华为云服务器帐号
create_params = devops_params.merge(ip_num: IPAddr.new(devops_params[:ip_num].strip).to_i, secret: Ci::CloudAccount.encrypted_secret(devops_params[:secret]), server_type: Ci::CloudAccount::SERVER_TYPE_SELF)
cloud_account = Ci::CloudAccount.new(create_params)
cloud_account.user = current_user
cloud_account.save!
# 2. 生成oauth2应用程序的client_id和client_secrete
gitea_oauth = Gitea::Oauth2::CreateService.call(current_user.gitea_token, {name: "pipeline-#{SecureRandom.hex(8)}", redirect_uris: ["#{cloud_account.drone_url}/login"]})
logger.info "######### gitea_oauth: #{gitea_oauth}"
raise 'Gitea接口异常' if gitea_oauth['client_id'].blank?
oauth = Oauth.new(client_id: gitea_oauth['client_id'],
client_secret: gitea_oauth['client_secret'],
redirect_uri: gitea_oauth['redirect_uris'],
gitea_oauth_id: gitea_oauth['id'],
user_id: current_user.id)
oauth.save!
# 创建数据ci端数据库
database_result = auto_create_database!(@connection, "#{current_user.login}_drone")
logger.info "[CI::DbConnectable] auto_create_database's result: #{database_result}"
# 初始化表结构
sub_connection = connect_to_ci_database
auto_create_table_structure!(sub_connection)
rpc_secret = SecureRandom.hex 16
logger.info "######### rpc_secret: #{rpc_secret}"
# 3. 创建drone server
drone_server_cmd = Ci::Drone::Server.new(current_user.login, oauth.client_id, oauth.client_secret, cloud_account.drone_host, rpc_secret).generate_cmd
logger.info "######### drone_server_cmd: #{drone_server_cmd}"
# 4. 创建drone client
drone_client_cmd = Ci::Drone::Client.new(oauth.client_id, cloud_account.drone_ip, rpc_secret).generate_cmd
logger.info "######### drone_client_cmd: #{drone_client_cmd}"
# 5. 登录远程服务器启动drone服务
result = Ci::Drone::Start.new(cloud_account.account, cloud_account.visible_secret, cloud_account.drone_ip, drone_server_cmd, drone_client_cmd).run
logger.info "######### result: #{result}"
redirect_url = "#{cloud_account.drone_url}/login"
logger.info "######### redirect_url: #{redirect_url}"
return nil unless result.present?
result && !result.blank? ? cloud_account : nil
end
def trustie_drone_server_config
# 读取drone配置信息
config = Rails.application.config_for(:configuration).symbolize_keys!
trustie_drone_config = config[:trustie_drone].symbolize_keys!
return trustie_drone_config
end
# trustie提供服务器,绑定流程
def trustie_bind_account!
trustie_drone_config = trustie_drone_server_config
raise 'trustie_drone config missing' if trustie_drone_config.blank?
# 创建云账号
create_params = devops_params.merge(ip_num: IPAddr.new(trustie_drone_config[:ip_num].strip).to_i, secret: Ci::CloudAccount.encrypted_secret(trustie_drone_config[:secret]), server_type: Ci::CloudAccount::SERVER_TYPE_TRUSTIE)
cloud_account = Ci::CloudAccount.new(create_params)
cloud_account.user = current_user
cloud_account.save!
#生成oauth2应用程序的client_id和client_secrete
gitea_oauth = Gitea::Oauth2::CreateService.call(current_user.gitea_token, {name: "pipeline-#{SecureRandom.hex(8)}", redirect_uris: ["#{cloud_account.drone_url}/login"]})
logger.info "######### gitea_oauth: #{gitea_oauth}"
raise 'Gitea接口异常' if gitea_oauth['client_id'].blank?
oauth = Oauth.new(client_id: gitea_oauth['client_id'],
client_secret: gitea_oauth['client_secret'],
redirect_uri: gitea_oauth['redirect_uris'],
gitea_oauth_id: gitea_oauth['id'],
user_id: current_user.id)
result = oauth.save!
redirect_url = "#{cloud_account.drone_url}/login"
logger.info "######### redirect_url: #{redirect_url}"
return nil unless result.present?
result ? cloud_account : nil
end
def unbind_account!
cloud_account = current_user.ci_cloud_account
return render_error('你未绑定CI服务器') if current_user.devops_step == User::DEVOPS_UNINIT || cloud_account.blank?
if cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_SELF
@connection.execute("DROP DATABASE IF EXISTS #{current_user.login}_drone") # TOTO drop drone database
end
cloud_account.destroy! unless cloud_account.blank?
current_user.unbind_account!
end
def bind_hook!(user, cloud_account, repo)
hook_params = {
active: true,
config: {
content_type: "json",
url: cloud_account.drone_url + "/hook?secret=#{repo.repo_signer}"
},
type: "gitea"
}
result = Gitea::Hooks::CreateService.call(user.gitea_token, user.login, repo.repo_name, hook_params)
result[:status].present? ? nil : result
end
def check_bind_cloud_account!
return [true, "你已经绑定了云帐号."] unless current_user.ci_cloud_account.blank?
ip_num = IPAddr.new(devops_params[:ip_num]).to_i
#自有服务器进行判断
cloud_account = current_user.ci_cloud_account
if cloud_account && cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_SELF
Ci::CloudAccount.exists?(ip_num: ip_num) ? [true, "#{devops_params[:ip_num]}服务器已被使用."] : [false, nil]
end
end
def check_trustie_bind_cloud_account!
return [true, "你已经绑定了云帐号."] unless current_user.ci_cloud_account.blank?
end
def gitea_auto_create_auth_grant!(gitea_oauth_id)
connection = Gitea::Database.set_connection.connection
unix_time = Time.now.to_i
# 目前直接操作db可以建立对应的model进行操作
sql = "REPLACE INTO oauth2_grant ( user_id, application_id, counter, created_unix, updated_unix ) VALUES ( #{current_user.gitea_uid}, #{gitea_oauth_id}, 0, #{unix_time}, #{unix_time} );"
connection.execute(sql)
#如果使用trustie提供的服务器需要多增加一条授权信息
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
trustie_drone_config = trustie_drone_server_config
admin_application_id = trustie_drone_config[:admin_application_id]
sql = "REPLACE INTO oauth2_grant ( user_id, application_id, counter, created_unix, updated_unix ) VALUES ( #{current_user.gitea_uid}, #{admin_application_id}, 0, #{unix_time}, #{unix_time} );"
connection.execute(sql)
end
end
def gitea_oauth_grant!(password, oauth)
gitea_auto_create_auth_grant!(oauth&.gitea_oauth_id)
state = SecureRandom.hex(8)
# redirect_uri eg:
# https://localhost:3000/login/oauth/authorize?client_id=94976481-ad0e-4ed4-9247-7eef106007a2&redirect_uri=http%3A%2F%2F121.69.81.11%3A80%2Flogin&response_type=code&state=9cab990b9cfb1805
redirect_uri = CGI.escape("#{@cloud_account.drone_url}/login")
clientId = client_id(oauth)
grant_url = "#{Gitea.gitea_config[:domain]}/login/oauth/authorize?client_id=#{clientId}&redirect_uri=#{redirect_uri}&response_type=code&state=#{state}"
logger.info "[gitea] grant_url: #{grant_url}"
conn = Faraday.new(url: grant_url) do |req|
req.request :url_encoded
req.adapter Faraday.default_adapter
req.basic_auth(current_user.login, password)
end
response = conn.get
logger.info "[gitea] response headers: #{response.headers}"
drone_oauth_user!(response.headers.to_h['location'], state)
end
def drone_oauth_user!(url, state)
logger.info "[drone] drone_oauth_user url: #{url}"
conn = Faraday.new(url: url) do |req|
req.request :url_encoded
req.adapter Faraday.default_adapter
req.headers["cookie"] = "_session_=#{SecureRandom.hex(28)}; _oauth_state_=#{state}"
end
response = conn.get
logger.info "[drone] response headers: #{response.headers}"
response.headers['location'].include?('error') ? false : true
end
private
def devops_params
params.permit(:account, :secret, :ip_num)
end
def client_id(oauth)
#如果是使用trustie服务器使用管理员用户的clientId
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
trustie_drone_config = trustie_drone_server_config
return trustie_drone_config[:client_id]
else
return oauth&.client_id
end
end
end

View File

@ -0,0 +1,59 @@
module Ci::DbConnectable
extend ActiveSupport::Concern
included do
end
# Dynamically sets the database connection.
def connect_to_ci_database(options={})
master_db = options[:master_db] || false
config = Rails.application.config_for(:configuration).symbolize_keys!
db_config = config[:ci_db_server].symbolize_keys!
raise 'ci database config missing' if db_config.blank?
req_params = {
host: db_config[:host],
username: db_config[:username],
password: db_config[:password],
port: db_config[:port]
}
db_name = options[:db_name].blank? ? current_user.login : options[:db_name]
req_params = req_params.merge(database: "#{db_name}_#{db_config[:database]}") unless master_db === true
db_params = Ci::Database.get_connection_params(req_params)
@connection = Ci::Database.set_connection(db_params).connection
end
def connect_to_trustie_ci_database(options={})
master_db = options[:master_db] || false
config = Rails.application.config_for(:configuration).symbolize_keys!
db_config = config[:ci_db_server_trustie].symbolize_keys!
raise 'ci database config missing' if db_config.blank?
req_params = {
host: db_config[:host],
username: db_config[:username],
password: db_config[:password],
port: db_config[:port]
}
req_params = req_params.merge(database: "#{db_config[:database]}") unless master_db === true
db_params = Ci::Database.get_connection_params(req_params)
@trustie_db_connection = Ci::Database.set_connection(db_params).connection
end
def auto_create_database!(connection, database)
Rails.logger.info "[CI::DbConnectable] auto_create_database's connection: #{connection}"
connection.execute("CREATE DATABASE IF NOT EXISTS #{database}")
end
def auto_create_table_structure!(connection)
Rails.logger.info "[CI::DbConnectable] auto_create_table_structure's connection: #{connection}"
sqls = Ci::Schema.statement.split(';').map(&:strip).reject { |e| e.to_s.empty? }
sqls.each do |sql|
con_result = connection.execute(sql)
Rails.logger.info "=============> ci create tabels result: #{con_result}"
end
end
end

View File

@ -20,7 +20,7 @@ module ControllerRescueHandler
end
# rescue_from ActionView::MissingTemplate, with: :object_not_found
# rescue_from ActiveRecord::RecordNotFound, with: :object_not_found
rescue_from Educoder::TipException, with: :tip_show
rescue_from Gitlink::TipException, with: :tip_show
rescue_from ::ActionView::MissingTemplate, with: :missing_template
rescue_from ActiveRecord::RecordNotFound, with: :object_not_found
rescue_from ActionController::ParameterMissing, with: :render_parameter_missing

View File

@ -36,10 +36,10 @@ module GitCommon
begin
@commits = GitService.commits(repo_path: @repo_path)
logger.info("git first commit is #{@commits.try(:first)}")
raise Educoder::TipException.new("请先创建版本库") if @commits.nil?
raise Gitlink::TipException.new("请先创建版本库") if @commits.nil?
rescue Exception => e
uid_logger_error(e.message)
raise Educoder::TipException.new("提交记录异常")
raise Gitlink::TipException.new("提交记录异常")
end
end

View File

@ -34,7 +34,7 @@ module GitHelper
rescue Exception => e
Rails.logger.error(e.message)
raise Educoder::TipException.new("文档内容获取异常")
raise Gitlink::TipException.new("文档内容获取异常")
end
end
@ -64,7 +64,7 @@ module GitHelper
# 版本库Fork功能
def project_fork(container, original_rep_path, username)
raise Educoder::TipException.new("fork源路径为空,fork失败!") if original_rep_path.blank?
raise Gitlink::TipException.new("fork源路径为空,fork失败!") if original_rep_path.blank?
# 将要生成的仓库名字
new_repo_name = "#{username.try(:strip)}/#{container.try(:identifier)}#{ Time.now.strftime("%Y%m%d%H%M%S")}"
# uid_logger("start fork container: repo_name is #{new_repo_name}")

View File

@ -41,7 +41,7 @@ module LaboratoryHelper
my_courses: "https://www.trustie.net/users/#{current_user.try(:login)}/user_courselist",
my_projects: "/users/#{current_user.try(:login)}/projects",
my_organ: "https://www.trustie.net/users/#{current_user.try(:login)}/user_organizations",
default_url: "https://www.trustie.net/",
default_url: Rails.application.config_for(:configuration)['platform_url'],
tiding_url: "https://www.trustie.net/users/#{current_user.try(:login)}/user_messages",
register_url: "https://www.trustie.net/login?login=false"
}

View File

@ -127,6 +127,8 @@ module LoginHelper
token = config[:sync_token]
api_host = config[:sync_url]
return if api_host.blank?
url = "#{api_host}/api/v1/users/sync_user_token"
sync_json = {
"token": token,

View File

@ -1,12 +1,14 @@
module PaginateHelper
def paginate(objs, **opts)
page = params[:page].to_i <= 0 ? 1 : params[:page].to_i
per_page = params[:per_page].to_i > 0 && params[:per_page].to_i < 50 ? params[:per_page].to_i : opts[:per_page] || 20
if objs.is_a?(Array)
Kaminari.paginate_array(objs).page(page).per(per_page)
def paginate(relation)
limit = params[:limit] || params[:per_page]
limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
page = params[:page].to_i.zero? ? 1 : params[:page].to_i
if relation.is_a?(Array)
Kaminari.paginate_array(relation).page(page).per(limit)
else
objs.page(page).per(per_page)
relation.page(page).per(limit)
end
end
end

View File

@ -1,20 +1,22 @@
module RegisterHelper
extend ActiveSupport::Concern
def autologin_register(username, email, password, platform= '')
def autologin_register(username, email, password, platform= 'forge')
result = {message: nil, user: nil}
user = User.new(admin: false, login: username, mail: email, type: "User")
user.password = password
user.platform = platform
user.activate
return unless user.valid?
interactor = Gitea::RegisterInteractor.call({username: username, email: email, password: password})
if interactor.success?
gitea_user = interactor.result
result = Gitea::User::GenerateTokenService.new(username, password).call
result = Gitea::User::GenerateTokenService.call(username, password)
user.gitea_token = result['sha1']
user.gitea_uid = gitea_user['id']
user.gitea_uid = gitea_user[:body]['id']
if user.save!
UserExtension.create!(user_id: user.id)
result[:user] = {id: user.id, token: user.gitea_token}

View File

@ -3,8 +3,8 @@ module RenderHelper
render json: { status: 0, message: 'success' }.merge(data)
end
def render_error(message = '')
render json: { status: -1, message: message }
def render_error(status = -1, message = '')
render json: { status: status, message: message }
end
def render_not_acceptable(message = '请求已拒绝')

View File

@ -0,0 +1,19 @@
module Repository::LanguagesPercentagable
extend ActiveSupport::Concern
def languages_precentagable
result = Gitea::Repository::Languages::ListService.call(@owner.login,
@repository.identifier, current_user&.gitea_token)
result[:status] === :success ? hash_transform_precentagable(result[:body]) : nil
end
# hash eq:{"JavaScript": 301681522,"Ruby": 1444004,"Roff": 578781}
def hash_transform_precentagable(hash)
total_byte_size = hash.values.sum
hash.transform_values { |v|
ActionController::Base.helpers
.number_to_percentage((v * 100.0 / total_byte_size), precision: 1)
}.select{|k,v| v != "0.0%"}
end
end

View File

@ -29,10 +29,8 @@ class EduSettingsController < ApplicationController
respond_to do |format|
if @edu_setting.save
format.html { redirect_to @edu_setting, notice: 'Edu setting was successfully created.' }
format.json { render :show, status: :created, location: @edu_setting }
else
format.html { render :new }
format.json { render json: @edu_setting.errors, status: :unprocessable_entity }
end
end
@ -43,10 +41,8 @@ class EduSettingsController < ApplicationController
def update
respond_to do |format|
if @edu_setting.update(edu_setting_params)
format.html { redirect_to @edu_setting, notice: 'Edu setting was successfully updated.' }
format.json { render :show, status: :ok, location: @edu_setting }
else
format.html { render :edit }
format.json { render json: @edu_setting.errors, status: :unprocessable_entity }
end
end
@ -57,7 +53,6 @@ class EduSettingsController < ApplicationController
def destroy
@edu_setting.destroy
respond_to do |format|
format.html { redirect_to edu_settings_url, notice: 'Edu setting was successfully destroyed.' }
format.json { head :no_content }
end
end

View File

@ -1,5 +1,6 @@
class ForksController < ApplicationController
before_action :require_login
before_action :require_profile_completed, only: [:create]
before_action :load_project
before_action :authenticate_project!, :authenticate_user!

View File

@ -0,0 +1,8 @@
class Helps::FaqsController < ApplicationController
skip_before_action :check_sign, :user_setup
def index
faqs = Faq.select_without_id.order(updated_at: :desc)
render json: faqs.as_json(:except => [:id])
end
end

View File

@ -4,18 +4,18 @@ class HooksController < ApplicationController
before_action :check_user
before_action :set_repository
def index
hooks_response = Gitea::Hooks::ListService.new(@user, @repository.try(:identifier)).call
if hooks_response.status == 200
def index
hooks_response = Gitea::Hooks::ListService.new(@user.gitea_token, @user.login, @repository.try(:identifier)).call
if hooks_response.status == 200
lists = JSON.parse(hooks_response.body)
@hooks_size = lists.size
@hooks = paginate(lists)
else
else
normal_status(-1, "出现错误")
end
end
def create
def create
#根据gitea的api
# hook_params = {
# active: true,
@ -36,17 +36,17 @@ class HooksController < ApplicationController
# content_type: params[:content_type].to_i,
# secret: params[:secret],
# events: {
# push_only: params[:push_only] || false, # 是否为推送事件
# send_everything: params[:send_everything] || false, #是否为所有事件
# push_only: params[:push_only] || false, # 是否为推送事件
# send_everything: params[:send_everything] || false, #是否为所有事件
# choose_events: params[:choose_events] || false, #是否为自定义事件
# branch_filter: params[:branch_filter] || "*",
# events: {
# create: params[:create] || false, #创建分支/标签
# delete: params[:delete] || false, #删除分支/标签
# fork: params[:fork] || false, #仓库被派生
# delete: params[:delete] || false, #删除分支/标签
# fork: params[:fork] || false, #仓库被派生
# issues: params[:issues] || false, #工单
# issue_comment: params[:issue_comment] || false, #评论
# push: params[:push] || false # 推送
# issue_comment: params[:issue_comment] || false, #评论
# push: params[:push] || false # 推送
# pull_request: params[:pull_request] || false #合并请求
# repository: params[:repository] || false #仓库
# release: params[:release] || false #版本发布
@ -58,28 +58,28 @@ class HooksController < ApplicationController
Gitea::Hooks::CreateService.new(@user, @repository.try(:identifier), hook_params).call #创建gitea的hook功能
Gitea::Hooks::CreateService.new(user, p.try(:identifier), hook_params).call #创建gitea的hook功能
end
end
def update
def update
hook_params = params[:hook_params]
response = Gitea::Hooks::UpdateService.new(@user, @repository.try(:identifier), hook_params, params[:id]).call
if response.status == 200
if response.status == 200
normal_status(1, "更新成功")
else
else
normal_status(-1, "更新失败")
end
end
end
def destroy
def destroy
response = Gitea::Hooks::DestroyService.new(@user, @repository.try(:identifier), params[:id]).call
if response.status == 204
normal_status(1, "删除成功")
else
else
normal_status(-1, "删除失败")
end
end
end
private
private
def set_repository
@repository = @project.repository
@ -88,9 +88,9 @@ class HooksController < ApplicationController
normal_status(-1, "用户不存在") unless @user.present?
end
def check_user
unless @project.user_id == current_user.id
tip_exception(403, "您没有权限进入")
def check_user
unless @project.user_id == current_user.id
tip_exception(403, "您没有权限进入")
end
end
end

View File

@ -7,10 +7,7 @@ class IssueTagsController < ApplicationController
def index
order_name = params[:order_name] || "created_at"
order_type = params[:order_type] || "desc"
issue_tags = @project.issue_tags.order("#{order_name} #{order_type}")
issue_tags = @project.issue_tags.reorder("#{order_name} #{order_type}")
@user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user))
@page = params[:page] || 1
@limit = params[:limit] || 15
@ -138,4 +135,14 @@ class IssueTagsController < ApplicationController
end
end
private
def order_name
IssueTag.column_names.include?(params[:order_name]) ? params[:order_name] : 'created_at'
end
def order_type
%w(desc asc).include?(params[:order_type]) ? params[:order_type] : 'desc'
end
end

View File

@ -1,26 +1,33 @@
class IssuesController < ApplicationController
before_action :require_login, except: [:index, :show, :index_chosen]
before_action :require_profile_completed, only: [:create]
before_action :load_project
before_action :set_user
before_action :check_menu_authorize, except: [:index_chosen]
before_action :check_issue_permission
before_action :operate_issue_permission, only:[:create, :update, :destroy, :clean, :series_update, :copy]
before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue]
before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :close_issue, :lock_issue]
before_action :get_branches, only: [:new, :edit]
before_action :check_token_enough, :find_atme_receivers, only: [:create, :update]
include ApplicationHelper
include TagChosenHelper
def index
@user_admin_or_member = current_user.present? && current_user.logged? && (current_user.admin || @project.member?(current_user))
@user_admin_or_member = current_user.present? && current_user.logged? && (current_user.admin || @project.member?(current_user) || @project.is_public?)
issues = @project.issues.issue_issue.issue_index_includes
issues = issues.where(is_private: false) unless @user_admin_or_member
@all_issues_size = issues.size
@open_issues_size = issues.where.not(status_id: 5).size
@close_issues_size = issues.where(status_id: 5).size
@assign_to_me_size = issues.where(assigned_to_id: current_user&.id).size
@my_published_size = issues.where(author_id: current_user&.id).size
@all_issues = issues
@filter_issues = @all_issues
@filter_issues = @filter_issues.where.not(status_id: IssueStatus::CLOSED) if params[:status_type].to_i == IssueStatus::ADD
@filter_issues = @filter_issues.where(status_id: IssueStatus::CLOSED) if params[:status_type].to_i == IssueStatus::SOLVING
@filter_issues = @filter_issues.where("subject LIKE ? OR description LIKE ? ", "%#{params[:search]}%", "%#{params[:search]}%") if params[:search].present?
@open_issues = @all_issues.where.not(status_id: IssueStatus::CLOSED)
@close_issues = @all_issues.where(status_id: IssueStatus::CLOSED)
@assign_to_me = @filter_issues.where(assigned_to_id: current_user&.id)
@my_published = @filter_issues.where(author_id: current_user&.id)
scopes = Issues::ListQueryService.call(issues,params.delete_if{|k,v| v.blank?}, "Issue")
@issues_size = scopes.size
@issues = paginate(scopes)
@ -96,80 +103,18 @@ class IssuesController < ApplicationController
end
def new
@all_branches = get_branches
@issue_chosen = issue_left_chosen(@project, nil)
@issue_chosen = get_associated_data(@project)
end
def create
if params[:subject].blank?
normal_status(-1, "标题不能为空")
elsif params[:subject].to_s.size > 255
normal_status(-1, "标题不能超过255个字符")
elsif (params[:issue_type].to_s == "2")
return normal_status(-1, "悬赏的奖金必须大于0") if params[:token].to_i == 0
else
issue_params = issue_send_params(params)
@issue = Issue.new(issue_params)
if @issue.save!
if params[:attachment_ids].present?
params[:attachment_ids].each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
attachment.author_id = current_user.id
attachment.description = ""
attachment.save
end
end
end
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create!(issue_id: @issue.id, issue_tag_id: tag)
end
end
if params[:assigned_to_id].present?
Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
container_id: @issue.id, container_type: 'Issue',
parent_container_id: @project.id, parent_container_type: "Project",
tiding_type: 'issue', status: 0)
end
@issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
# normal_status(0, "创建成功",)
render :json => { status: 0, message: "创建成功", id: @issue.id}
else
normal_status(-1, "创建失败")
end
end
end
def edit
# @all_branches = get_branches
# @issue_chosen = issue_left_chosen(@project, @issue.id)
@issue_attachments = @issue.attachments
end
def update
issue_params = issue_send_params(params).except(:issue_classify, :author_id, :project_id)
return normal_status(-1, "您没有权限修改token") if @issue.will_save_change_to_token? && @issue.user_id != current_user&.id
if params[:issue_tag_ids].present? && !@issue&.issue_tags_relates.where(issue_tag_id: params[:issue_tag_ids]).exists?
@issue&.issue_tags_relates&.destroy_all
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create(issue_id: @issue.id, issue_tag_id: tag)
end
end
if @issue.update_attributes(issue_params)
issue_files = params[:attachment_ids]
change_files = false
issue_file_ids = []
if issue_files.present?
change_files = true
issue_files.each do |id|
issue_params = issue_send_params(params)
Issues::CreateForm.new({subject:issue_params[:subject]}).validate!
@issue = Issue.new(issue_params)
if @issue.save!
SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, @issue&.id) if Site.has_notice_menu?
SendTemplateMessageJob.perform_later('ProjectIssue', current_user.id, @issue&.id) if Site.has_notice_menu?
if params[:attachment_ids].present?
params[:attachment_ids].each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
@ -179,6 +124,70 @@ class IssuesController < ApplicationController
end
end
end
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create!(issue_id: @issue.id, issue_tag_id: tag)
end
end
if params[:assigned_to_id].present?
Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
container_id: @issue.id, container_type: 'Issue',
parent_container_id: @project.id, parent_container_type: "Project",
tiding_type: 'issue', status: 0)
end
#为悬赏任务时, 扣除当前用户的积分
if params[:issue_type].to_s == "2"
post_to_chain("minus", params[:token].to_i, current_user.try(:login))
end
@issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
Rails.logger.info "[ATME] maybe to at such users: #{@atme_receivers.pluck(:login)}"
AtmeService.call(current_user, @atme_receivers, @issue) if @atme_receivers.size > 0
render json: {status: 0, message: "创建成", id: @issue.id}
else
normal_status(-1, "创建失败")
end
rescue Exception => exception
puts exception.message
normal_status(-1, exception.message)
end
def edit
# @issue_chosen = issue_left_chosen(@project, @issue.id)
@cannot_edit_tags = @issue.issue_type=="2" && @issue.status_id == 5 #悬赏任务已解决且关闭的状态下,不能修改
@issue_attachments = @issue.attachments
end
def update
last_token = @issue.token
last_status_id = @issue.status_id
@issue&.issue_tags_relates&.destroy_all if params[:issue_tag_ids].blank?
if params[:issue_tag_ids].present? && !@issue&.issue_tags_relates.where(issue_tag_id: params[:issue_tag_ids]).exists?
@issue&.issue_tags_relates&.destroy_all
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create(issue_id: @issue.id, issue_tag_id: tag)
end
end
issue_files = params[:attachment_ids]
change_files = false
issue_file_ids = []
if issue_files.present?
change_files = true
issue_files.each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
attachment.author_id = current_user.id
attachment.description = ""
attachment.save
end
end
end
# if params[:issue_tag_ids].present?
# issue_current_tags = @issue&.issue_tags&.select(:id)&.pluck(:id)
@ -194,21 +203,67 @@ class IssuesController < ApplicationController
# end
# end
if params[:status_id].to_i == 5
@issue.issue_times.update_all(end_time: Time.now)
# @issue.update_closed_issues_count_in_project! #已经有after_update方法了这里就不需要了
end
@issue.create_journal_detail(change_files, issue_files, issue_file_ids, current_user&.id)
normal_status(0, "更新成功")
if @issue.issue_type.to_s == "2" && params[:status_id].to_i == 5 && @issue.author_id != current_user.try(:id)
normal_status(-1, "不允许修改为关闭状态")
else
normal_status(-1, "更新失败")
end
issue_params = issue_send_params(params).except(:issue_classify, :author_id, :project_id)
Issues::UpdateForm.new({subject:issue_params[:subject]}).validate!
if @issue.update_attributes(issue_params)
if @issue&.pull_request.present?
SendTemplateMessageJob.perform_later('PullRequestChanged', current_user.id, @issue&.pull_request&.id, @issue.previous_changes.slice(:assigned_to_id, :priority_id, :fixed_version_id, :issue_tags_value)) if Site.has_notice_menu?
SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @issue&.pull_request&.id ) if @issue.previous_changes[:assigned_to_id].present? && Site.has_notice_menu?
else
previous_changes = @issue.previous_changes.slice(:status_id, :assigned_to_id, :tracker_id, :priority_id, :fixed_version_id, :done_ratio, :issue_tags_value, :branch_name)
if @issue.previous_changes[:start_date].present?
previous_changes.merge!(start_date: [@issue.previous_changes[:start_date][0].to_s, @issue.previous_changes[:start_date][1].to_s])
end
if @issue.previous_changes[:due_date].present?
previous_changes.merge!(due_date: [@issue.previous_changes[:due_date][0].to_s, @issue.previous_changes[:due_date][1].to_s])
end
if @issue.previous_changes[:status_id].present? && @issue.previous_changes[:status_id][1] == 5
@issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: ProjectTrend::CLOSE)
end
if @issue.previous_changes[:status_id].present? && @issue.previous_changes[:status_id][0] == 5
@issue.project_trends.where(action_type: ProjectTrend::CLOSE).destroy_all
end
SendTemplateMessageJob.perform_later('IssueChanged', current_user.id, @issue&.id, previous_changes) if Site.has_notice_menu?
SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, @issue&.id) if @issue.previous_changes[:assigned_to_id].present? && Site.has_notice_menu?
end
if params[:status_id].to_i == 5 #任务由非关闭状态到关闭状态时
@issue.issue_times.update_all(end_time: Time.now)
@issue.update_closed_issues_count_in_project!
if @issue.issue_type.to_s == "2" && last_status_id != 5
if @issue.assigned_to_id.present? && last_status_id == 3 #只有当用户完成100%时才给token
post_to_chain("add", @issue.token, @issue.get_assign_user.try(:login))
else
post_to_chain("add", @issue.token, @issue.user.try(:login))
end
end
end
if @issue.issue_type.to_s == "2" && @issue.status_id != 5 && @issue.saved_change_to_attribute("token")
#表示修改token值
change_token = last_token - @issue.token
change_type = change_token > 0 ? "add" : "minus"
post_to_chain(change_type, change_token.abs, current_user.try(:login))
end
@issue.create_journal_detail(change_files, issue_files, issue_file_ids, current_user&.id) if @issue.previous_changes.present?
Rails.logger.info "[ATME] maybe to at such users: #{@atme_receivers.pluck(:login)}"
AtmeService.call(current_user, @atme_receivers, @issue) if @atme_receivers.size > 0
normal_status(0, "更新成功")
else
normal_status(-1, "更新失败")
end
end
rescue Exception => exception
puts exception.message
normal_status(-1, exception.message)
end
def show
@user_permission = current_user.present? && current_user.logged? && (!@issue.is_lock || @project.member?(current_user) || current_user.admin? || @issue.user == current_user)
@user_permission = current_user.present? && current_user.logged? && (@project.member?(current_user) || current_user.admin? || @issue.user == current_user)
@issue_attachments = @issue.attachments
@issue_user = @issue.user
@issue_assign_to = @issue.get_assign_user
@ -224,17 +279,37 @@ class IssuesController < ApplicationController
end
def destroy
if @issue.destroy
normal_status(0, "删除成功")
else
begin
issue_type = @issue.issue_type
status_id = @issue.status_id
token = @issue.token
login = @issue.user.try(:login)
SendTemplateMessageJob.perform_later('IssueDeleted', current_user.id, @issue&.subject, @issue.assigned_to_id, @issue.author_id) if Site.has_notice_menu?
if @issue.destroy
if issue_type == "2" && status_id != 5
post_to_chain("add", token, login)
end
normal_status(0, "删除成功")
else
normal_status(-1, "删除失败")
end
rescue => exception
Rails.logger.info("#########_______exception.message_________##########{exception.message}")
normal_status(-1, "删除失败")
else
end
end
def clean
#批量删除,暂时只能删除未悬赏的
issue_ids = params[:ids]
if issue_ids.present?
if Issue.where(id: issue_ids).destroy_all
issues = Issue.where(id: issue_ids, issue_type: "1")
if issues.present?
issues.find_each do |i|
SendTemplateMessageJob.perform_later('IssueDeleted', current_user.id, i&.subject, i.assigned_to_id, i.author_id) if Site.has_notice_menu?
end
if issues.destroy_all
normal_status(0, "删除成功")
else
normal_status(-1, "删除失败")
@ -264,9 +339,28 @@ class IssuesController < ApplicationController
# update_hash = params[:issue]
issue_ids = params[:ids]
if issue_ids.present?
issues = Issue.where(id: issue_ids)
if update_hash.blank?
normal_status(-1, "请选择批量更新内容")
elsif Issue.where(id: issue_ids).update_all(update_hash)
elsif issues&.update(update_hash)
issues.each do |i|
i.create_journal_detail(false, [], [], current_user&.id) if i.previous_changes.present?
previous_changes = i.previous_changes.slice(:status_id, :assigned_to_id, :tracker_id, :priority_id, :fixed_version_id, :done_ratio, :issue_tags_value, :branch_name)
if i.previous_changes[:start_date].present?
previous_changes.merge!(start_date: [i.previous_changes[:start_date][0].to_s, i.previous_changes[:start_date][1].to_s])
end
if i.previous_changes[:due_date].present?
previous_changes.merge!(due_date: [i.previous_changes[:due_date][0].to_s, i.previous_changes[:due_date][1].to_s])
end
if i.previous_changes[:status_id].present? && i.previous_changes[:status_id][1] == 5
i.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: ProjectTrend::CLOSE)
end
if i.previous_changes[:status_id].present? && i.previous_changes[:status_id][0] == 5
i.project_trends.where(action_type: ProjectTrend::CLOSE).destroy_all
end
SendTemplateMessageJob.perform_later('IssueChanged', current_user.id, i&.id, previous_changes) if Site.has_notice_menu?
SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, i&.id) if i.previous_changes[:assigned_to_id].present? && Site.has_notice_menu?
end
normal_status(0, "批量更新成功")
else
normal_status(-1, "批量更新失败")
@ -278,7 +372,10 @@ class IssuesController < ApplicationController
def copy
@new_issue = @issue.dup
@new_issue.author_id = current_user.id
if @new_issue.save
SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, @new_issue&.id) if Site.has_notice_menu?
SendTemplateMessageJob.perform_later('ProjectIssue', current_user.id, @new_issue&.id) if Site.has_notice_menu?
issue_tags = @issue.issue_tags.pluck(:id)
if issue_tags.present?
issue_tags.each do |tag|
@ -306,6 +403,9 @@ class IssuesController < ApplicationController
if type == 5
@issue&.project_trends&.update_all(action_type: "close")
@issue.issue_times.update_all(end_time: Time.now)
if @issue.issue_type.to_s == "2"
post_to_chain("add", @issue.token, @issue.get_assign_user.try(:login))
end
if @issue.issue_classify.to_s == "pull_request"
@issue&.pull_request&.update_attribute(:status, 2)
end
@ -353,25 +453,29 @@ class IssuesController < ApplicationController
def check_project_public
unless @project.is_public || @project.member?(current_user) || current_user.admin? || (@project.user_id == current_user.id)
normal_status(-1, "您没有权限")
return render_forbidden
end
end
def set_issue
@issue = Issue.find_by_id(params[:id])
if @issue.blank?
normal_status(-1, "标签不存在")
elsif @issue.is_lock &&!(@project.member?(current_user) || current_user.admin?)
normal_status(-1, "您没有权限")
return render_not_found
elsif !(@project.is_public || (current_user.present? && (@project.member?(current_user) || current_user&.admin? || (@project.user_id == current_user&.id))))
return render_forbidden
end
end
def check_issue_permission
unless @project.is_public || (current_user.present? && (@project.member?(current_user) || current_user&.admin? || (@project.user_id == current_user&.id)))
normal_status(-1, "您没有权限")
return render_forbidden
end
end
def operate_issue_permission
return render_forbidden("您没有权限进行此操作.") unless current_user.present? && current_user.logged? && (current_user.admin? || @project.member?(current_user) || @project.is_public?)
end
def export_issues(issues)
@table_columns = %w(ID 类型 标题 描述 状态 指派给 优先级 标签 发布人 创建时间 里程碑 开始时间 截止时间 完成度 分类 金额 属于)
@export_issues = []
@ -399,17 +503,6 @@ class IssuesController < ApplicationController
tracker_array
end
def get_branches
all_branches = []
get_all_branches = Gitea::Repository::Branches::ListService.new(@user, @project&.repository.try(:identifier)).call
if get_all_branches && get_all_branches.size > 0
get_all_branches.each do |b|
all_branches.push(b["name"])
end
end
all_branches
end
def issue_send_params(params)
{
subject: params[:subject],
@ -434,4 +527,36 @@ class IssuesController < ApplicationController
project_id: @project.id
}
end
def post_to_chain(type, amount,login)
change_params = {
type: type,
chain_params: {
amount: amount,
reponame: @project.try(:identifier),
username: login
}
}
PostChainJob.perform_later(change_params)
end
def check_token_enough
if params[:issue_type].to_s == "2" && (@issue.blank? || (@issue.present? && @issue.author_id == current_user.try(:id)))
return normal_status(-1, "悬赏的奖金必须大于0") if params[:token].to_i == 0
query_params = {
type: "query",
chain_params: {
reponame: @project.try(:identifier),
username: current_user.try(:login)
}
}
response = Gitea::Chain::ChainGetService.new(query_params).call
return normal_status(-1, "获取token失败请稍后重试") if response.status != 200
return normal_status(-1, "您的token值不足") if JSON.parse(response.body)["balance"].to_i < params[:token].to_i
end
end
def check_menu_authorize
return render_not_found unless @project.has_menu_permission("issues")
end
end

View File

@ -1,5 +1,6 @@
class JournalsController < ApplicationController
before_action :require_login, except: [:index, :get_children_journals]
before_action :require_profile_completed, :find_atme_receivers, only: [:create]
before_action :set_issue
before_action :check_issue_permission
before_action :set_journal, only: [:destroy, :edit, :update]
@ -21,32 +22,35 @@ class JournalsController < ApplicationController
if notes.blank?
normal_status(-1, "评论内容不能为空")
else
journal_params = {
journalized_id: @issue.id ,
journalized_type: "Issue",
user_id: current_user.id ,
notes: notes.to_s.strip,
parent_id: params[:parent_id]
}
journal = Journal.new journal_params
if journal.save
if params[:attachment_ids].present?
params[:attachment_ids].each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = journal
attachment.author_id = current_user.id
attachment.description = ""
attachment.save
ActiveRecord::Base.transaction do
journal_params = {
journalized_id: @issue.id ,
journalized_type: "Issue",
user_id: current_user.id ,
notes: notes.to_s.strip,
parent_id: params[:parent_id]
}
journal = Journal.new journal_params
if journal.save
if params[:attachment_ids].present?
params[:attachment_ids].each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = journal
attachment.author_id = current_user.id
attachment.description = ""
attachment.save
end
end
end
Rails.logger.info "[ATME] maybe to at such users: #{@atme_receivers.pluck(:login)}"
AtmeService.call(current_user, @atme_receivers, journal) if @atme_receivers.size > 0
# @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "journal")
render :json => { status: 0, message: "评论成功", id: journal.id}
# normal_status(0, "评论成功")
else
normal_status(-1, "评论失败")
end
# @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "journal")
render :json => { status: 0, message: "评论成功", id: journal.id}
# normal_status(0, "评论成功")
else
normal_status(-1, "评论失败")
end
end
end

View File

@ -2,7 +2,7 @@ class MainController < ApplicationController
protect_from_forgery except: :index
skip_before_action :check_sign
skip_before_action :user_setup
# skip_before_action :setup_laboratory
skip_before_action :setup_laboratory
def first_stamp
render :json => { status: 0, message: Time.now.to_i }
@ -23,9 +23,9 @@ class MainController < ApplicationController
# TODO: 这块之后需要整合者架构重新变化统一跳转到index后再路由分发
if params[:path] && params[:path]&.include?("h5educoderbuild") && params[:path].split("/").first == "h5educoderbuild"
render file: 'public/h5educoderbuild/index.html', :layout => false
render file: 'public/h5educoderbuild/index.html', :layout => false, :content_type=> 'text/html'
else
render file: 'public/react/build/index.html', :layout => false
render file: 'public/react/build/index.html', :layout => false, :content_type=> 'text/html'
end
end

View File

@ -2,12 +2,15 @@ class MembersController < ApplicationController
before_action :require_login
before_action :load_project
before_action :find_user_with_id, only: %i[create remove change_role]
before_action :check_user_profile_completed, only: [:create]
before_action :operate!, except: %i[index]
before_action :check_member_exists!, only: %i[create]
before_action :check_member_not_exists!, only: %i[remove change_role]
def create
interactor = Projects::AddMemberInteractor.call(@project.owner, @project, @user)
SendTemplateMessageJob.perform_later('ProjectJoined', current_user.id, @user.id, @project.id) if Site.has_notice_menu?
SendTemplateMessageJob.perform_later('ProjectMemberJoined', current_user.id, @user.id, @project.id) if Site.has_notice_menu?
render_response(interactor)
rescue Exception => e
uid_logger_error(e.message)
@ -18,7 +21,7 @@ class MembersController < ApplicationController
scope = @project.members.includes(:roles, user: :user_extension)
search = params[:search].to_s.downcase
role = params[:role].to_s
scope = scope.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login, users.mail)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present?
scope = scope.joins(:user).merge(User.like(search))
scope = scope.joins(:roles).where("roles.name LIKE ?", "%#{role}%") if role.present?
@total_count = scope.size
@ -27,6 +30,8 @@ class MembersController < ApplicationController
def remove
interactor = Projects::DeleteMemberInteractor.call(@project.owner, @project, @user)
SendTemplateMessageJob.perform_later('ProjectLeft', current_user.id, @user.id, @project.id) if Site.has_notice_menu?
SendTemplateMessageJob.perform_later('ProjectMemberLeft', current_user.id, @user.id, @project.id) if Site.has_notice_menu?
render_response(interactor)
rescue Exception => e
uid_logger_error(e.message)
@ -35,6 +40,7 @@ class MembersController < ApplicationController
def change_role
interactor = Projects::ChangeMemberRoleInteractor.call(@project.owner, @project, @user, params[:role])
SendTemplateMessageJob.perform_later('ProjectRole', current_user.id, @user.id, @project.id, message_role_name) if Site.has_notice_menu?
render_response(interactor)
rescue Exception => e
uid_logger_error(e.message)
@ -47,7 +53,7 @@ class MembersController < ApplicationController
end
def member_exists?
@project.member?(params[:user_id])
@project.members.exists?(user_id: params[:user_id])
end
def operate!
@ -55,10 +61,24 @@ class MembersController < ApplicationController
end
def check_member_exists!
return render_result(1, "user_id为#{params[:user_id]}的用户已经是项目成员") if member_exists?
return render_error("user_id为#{params[:user_id]}的用户已经是项目成员") if member_exists?
end
def check_member_not_exists!
return render_result(1, "user_id为#{params[:user_id]}的用户还不是项目成员") unless member_exists?
return render_error("user_id为#{params[:user_id]}的用户还不是项目成员") unless member_exists?
end
def check_user_profile_completed
require_user_profile_completed(@user)
end
def message_role_name
case params[:role]
when 'Manager' then '管理员'
when 'Developer' then '开发者'
when 'Reporter' then '报告者'
else
''
end
end
end

View File

@ -0,0 +1,35 @@
class Organizations::BaseController < ApplicationController
include ApplicationHelper
include PaginateHelper
protected
def can_edit_org?
current_user.admin? || @organization.is_owner?(current_user.id)
end
def check_user_can_edit_org
tip_exception("您没有权限进行该操作") unless can_edit_org?
end
def org_limited_condition
@organization.organization_extension.limited? && !current_user.logged?
end
def org_privacy_condition
return false if current_user.admin?
@organization.organization_extension.privacy? && @organization.organization_users.where(user_id: current_user.id).blank?
end
def team_not_found_condition
!current_user&.admin? && @team.team_users.where(user_id: current_user.id).blank? && !@organization.is_owner?(current_user.id)
end
def user_mark
params[:username] || params[:id]
end
def project_mark
params[:repo_name] || params[:id]
end
end

View File

@ -0,0 +1,57 @@
class Organizations::OrganizationUsersController < Organizations::BaseController
before_action :load_organization
before_action :load_operate_user, :load_organization_user, :check_user_can_edit_org, only: [:destroy]
def index
@organization_users = @organization.organization_users.includes(:user)
search = params[:search].to_s.downcase
@organization_users = @organization_users.joins(:user).merge(User.like(search))
@organization_users = kaminari_paginate(@organization_users)
end
def destroy
tip_exception("您不能从所有者团队中删除最后一个用户") if @organization.is_owner_team_last_one?(@operate_user.id)
ActiveRecord::Base.transaction do
@organization_user.destroy!
TeamUser.where(organization_id: @organization.id, user_id: @operate_user.id).map{|u| u.destroy!}
Gitea::Organization::OrganizationUser::DeleteService.call(@organization.gitea_token, @organization.login, @operate_user.login)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def quit
@organization_user = @organization.organization_users.find_by(user_id: current_user.id)
tip_exception("您不在该组织中") if @organization_user.nil?
tip_exception("您不能从所有者团队中删除最后一个用户") if @organization.is_owner_team_last_one?(current_user.id)
ActiveRecord::Base.transaction do
@organization_user.destroy!
TeamUser.where(organization_id: @organization.id, user_id: current_user.id).map{|u| u.destroy!}
Gitea::Organization::OrganizationUser::DeleteService.call(@organization.gitea_token, @organization.login, current_user.login)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_operate_user
@operate_user = User.find_by(login: user_mark) if user_mark.present?
tip_exception("平台用户不存在") if @operate_user.nil?
end
def load_organization_user
@organization_user = OrganizationUser.find_by(organization_id: @organization.id, user_id: @operate_user.id)
tip_exception("组织成员不存在") if @organization_user.nil?
end
end

View File

@ -0,0 +1,119 @@
class Organizations::OrganizationsController < Organizations::BaseController
before_action :require_login, except: [:index, :show, :recommend]
before_action :require_profile_completed, only: [:create]
before_action :convert_image!, only: [:create, :update]
before_action :load_organization, only: [:show, :update, :destroy]
before_action :check_user_can_edit_org, only: [:update, :destroy]
def index
if current_user.logged?
logged_organizations_sql = Organization.with_visibility(%w(common limited)).to_sql
privacy_organizations_sql = Organization.with_visibility("privacy").joins(:organization_users).where(organization_users: {user_id: current_user.id}).to_sql
@organizations = Organization.from("( #{ logged_organizations_sql } UNION #{ privacy_organizations_sql } ) AS users")
else
@organizations = Organization.with_visibility("common")
end
@organizations = @organizations.ransack(login_cont: params[:search]).result if params[:search].present?
@organizations = @organizations.includes(:organization_extension).order("organization_extensions.#{sort_by} #{sort_direction}")
@organizations = kaminari_paginate(@organizations)
end
def show
@can_create_project = @organization.can_create_project?(current_user.id)
@is_admin = can_edit_org?
@is_member = @organization.is_member?(current_user.id)
Cache::V2::OwnerCommonService.new(@organization.id).read
end
def create
ActiveRecord::Base.transaction do
tip_exception("无法使用以下关键词:#{organization_params[:name]},请重新命名") if ReversedKeyword.check_exists?(organization_params[:name])
Organizations::CreateForm.new(organization_params).validate!
@organization = Organizations::CreateService.call(current_user, organization_params)
Util.write_file(@image, avatar_path(@organization)) if params[:image].present?
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def update
ActiveRecord::Base.transaction do
Organizations::CreateForm.new(organization_params).validate!
login = @organization.login
@organization.login = organization_params[:name] if organization_params[:name].present?
@organization.nickname = organization_params[:nickname] if organization_params[:nickname].present?
@organization.save!
sync_organization_extension!
Gitea::Organization::UpdateService.call(@organization.gitea_token, login, @organization.reload)
Util.write_file(@image, avatar_path(@organization)) if params[:image].present?
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("密码不正确") unless current_user.check_password?(password)
ActiveRecord::Base.transaction do
Gitea::Organization::DeleteService.call(@organization.gitea_token, @organization.login)
@organization.destroy!
end
render_ok
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def recommend
recommend = %W(xuos Huawei_Technology openatom_foundation pkecosystem TensorLayer)
@organizations = Organization.includes(:organization_extension).where(organization_extensions: {recommend: true}).to_a.each_slice(group_size).to_a
end
private
def organization_params
params.permit(:name, :description, :website, :location,
:repo_admin_change_team_access, :visibility,
:max_repo_creation, :nickname)
end
def group_size
params.fetch(:group_size, 4).to_i
end
def password
params.fetch(:password, "")
end
def load_organization
@organization = Organization.find_by(login: params[:id]) || Organization.find_by(id: params[:id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def sort_by
OrganizationExtension.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
end
def sort_direction
%w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
end
def set_max_repo_creation
organization_params[:max_repo_creation].blank? ? -1 : organization_params[:max_repo_creation]
end
def organization_extension_params
organization_params
.except(:name, :nickname)
.merge(max_repo_creation: set_max_repo_creation)
end
def sync_organization_extension!
@organization.organization_extension.update_attributes!(organization_extension_params)
end
end

View File

@ -0,0 +1,45 @@
class Organizations::ProjectsController < Organizations::BaseController
before_action :load_organization
def index
public_projects_sql = @organization.projects.where(is_public: true).to_sql
private_projects_sql = @organization.projects
.where(is_public: false)
.joins(team_projects: {team: :team_users})
.where(team_users: {user_id: current_user.id}).to_sql
@projects = Project.from("( #{ public_projects_sql} UNION #{ private_projects_sql } ) AS projects")
@projects = @projects.ransack(name_or_identifier_cont: params[:search]).result if params[:search].present?
@projects = @projects.includes(:owner).order("projects.#{sort} #{sort_direction}")
@projects = paginate(@projects)
end
def search
tip_exception("请输入搜索关键词") if params[:search].nil?
public_projects_sql = @organization.projects.where(is_public: true).to_sql
private_projects_sql = @organization.projects
.where(is_public: false)
.joins(team_projects: {team: :team_users})
.where(team_users: {user_id: current_user.id}).to_sql
@projects = Project.from("( #{ public_projects_sql} UNION #{ private_projects_sql } ) AS projects")
@projects = @projects.ransack(name_or_identifier_cont: params[:search]).result
@projects = @projects.includes(:owner).order("projects.#{sort} #{sort_direction}")
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def sort
Project.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'updated_on'
end
def sort_direction
%w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
end
end

View File

@ -0,0 +1,58 @@
class Organizations::TeamProjectsController < Organizations::BaseController
before_action :load_organization
before_action :load_team
before_action :load_operate_project, :check_user_can_edit_org, only: [:create, :destroy]
before_action :load_team_project, only: [:destroy]
def index
@team_projects = @team.team_projects
@team_projects = paginate(@team_projects)
end
def create
tip_exception("该组织团队项目包括组织所有项目,不允许更改") if @team.includes_all_project
ActiveRecord::Base.transaction do
@team_project = TeamProject.build(@organization.id, @team.id, @operate_project.id)
Gitea::Organization::TeamProject::CreateService.call(@organization.gitea_token, @team.gtid, @organization.login, @operate_project.identifier)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("该组织团队项目包括组织所有项目,不允许更改") if @team.includes_all_project
ActiveRecord::Base.transaction do
@team_project.destroy!
Gitea::Organization::TeamProject::DeleteService.call(@organization.gitea_token, @team.gtid, @organization.login, @operate_project.identifier)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_team
@team = Team.find_by_id(params[:team_id])
return render_not_found("组织团队不存在") if @team.nil?
return render_forbidden("没有查看组织团队的权限") if team_not_found_condition
end
def load_operate_project
@operate_project = Project.find_by(id: project_mark) || Project.find_by(identifier: project_mark)
tip_exception("项目不存在") if @operate_project.nil?
end
def load_team_project
@team_project = TeamProject.find_by(organization_id: @organization.id, team_id: @team.id, project_id: @operate_project.id)
tip_exception("组织团队项目不存在") if @team_project.nil?
end
end

View File

@ -0,0 +1,92 @@
class Organizations::TeamUsersController < Organizations::BaseController
before_action :load_organization, :load_team
before_action :load_operate_user, only: [:create, :destroy]
before_action :check_user_profile_completed, only: [:create]
before_action :load_team_user, only: [:destroy]
before_action :check_user_can_edit_org, only: [:create, :destroy]
def index
@team_users = @team.team_users.includes(:user)
search = params[:search].to_s.downcase
@team_users = @team_users.joins(:user).merge(User.like(search))
@team_users = kaminari_paginate(@team_users)
end
def create
ActiveRecord::Base.transaction do
@team_user = TeamUser.build(@organization.id, @operate_user.id, @team.id)
@organization_user = OrganizationUser.build(@organization.id, @operate_user.id)
SendTemplateMessageJob.perform_later('OrganizationRole', @operate_user.id, @organization.id, @team.authorize_name) if Site.has_notice_menu?
Gitea::Organization::TeamUser::CreateService.call(@organization.gitea_token, @team.gtid, @operate_user.login)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("您不能从所有者团队中删除最后一个用户") if @team.owner? && @organization.is_owner_team_last_one?(@operate_user.id)
ActiveRecord::Base.transaction do
@team_user.destroy!
Gitea::Organization::TeamUser::DeleteService.call(@organization.gitea_token, @team.gtid, @operate_user.login)
org_team_users = @organization.team_users.where(user_id: @operate_user.id)
unless org_team_users.present?
@organization.organization_users.find_by(user_id: @operate_user.id).destroy!
Gitea::Organization::OrganizationUser::DeleteService.call(@organization.gitea_token, @organization.login, @operate_user.login)
end
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def quit
@team_user = @team.team_users.find_by(user_id: current_user.id)
tip_exception("您不在该组织团队中") if @team_user.nil?
tip_exception("您不能从所有者团队中删除最后一个用户") if @team.owner? && @organization.is_owner_team_last_one?(current_user.id)
ActiveRecord::Base.transaction do
@team_user.destroy!
Gitea::Organization::TeamUser::DeleteService.call(@organization.gitea_token, @team.gtid, current_user.login)
org_team_users = @organization.team_users.where(user_id: current_user.id)
unless org_team_users.present?
@organization.organization_users.find_by(user_id: current_user.id).destroy!
Gitea::Organization::OrganizationUser::DeleteService.call(@organization.gitea_token, @organization.login, current_user.login)
end
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_team
@team = Team.find_by_id(params[:team_id])
return render_not_found("组织团队不存在") if @team.nil?
return render_forbidden("没有查看组织团队的权限") if team_not_found_condition
end
def load_operate_user
@operate_user = User.find_by(login: user_mark) if user_mark.present?
tip_exception("平台用户不存在") if @operate_user.nil?
end
def load_team_user
@team_user = TeamUser.find_by(team_id: @team.id, user_id: @operate_user.id)
tip_exception("组织团队成员不存在") if @team_user.nil?
end
def check_user_profile_completed
require_user_profile_completed(@operate_user)
end
end

View File

@ -0,0 +1,81 @@
class Organizations::TeamsController < Organizations::BaseController
before_action :load_organization
before_action :load_team, only: [:show, :update, :destroy]
before_action :check_user_can_edit_org, only: [:create, :update, :destroy]
def index
#if @organization.is_owner?(current_user) || current_user.admin?
@teams = @organization.teams
#else
# @teams = @organization.teams.joins(:team_users).where(team_users: {user_id: current_user.id})
#end
@is_admin = can_edit_org?
@teams = @teams.includes(:team_units, :team_users)
@teams = kaminari_paginate(@teams)
end
def search
tip_exception("请输入搜索关键词") if params[:search].nil?
if @organization.is_owner?(current_user) || current_user.admin?
@teams = @organization.teams
else
@teams = @organization.teams.joins(:team_users).where(team_users: {user_id: current_user.id})
end
@is_admin = can_edit_org?
@teams = @teams.ransack(name_cont: params[:search]).result if params[:search].present?
@teams = @teams.includes(:team_units, :team_users)
end
def show
@is_admin = can_edit_org?
@is_member = @team.is_member?(current_user.id)
end
def create
ActiveRecord::Base.transaction do
Organizations::CreateTeamForm.new(team_params).validate!
@team = Organizations::Teams::CreateService.call(current_user, @organization, team_params)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def update
Organizations::CreateTeamForm.new(team_params).validate!
@team = Organizations::Teams::UpdateService.call(current_user, @team, team_params)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("组织团队不允许被删除") if @team.owner?
ActiveRecord::Base.transaction do
Gitea::Organization::Team::DeleteService.call(@organization.gitea_token, @team.gtid)
@team.destroy!
end
render_ok
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def team_params
params.permit(:name, :nickname, :description, :authorize, :includes_all_project, :can_create_org_project, :unit_types => [])
end
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_team
@team = Team.find_by_id(params[:id])
return render_not_found("组织团队不存在") if @team.nil?
return render_forbidden("没有查看组织团队的权限") if team_not_found_condition
end
end

View File

@ -0,0 +1,61 @@
class OwnersController < ApplicationController
before_action :require_login, only: [:index]
def index
@owners = []
@owners += [current_user]
@owners += Organization.joins(team_users: :team)
.where(team_users: {user_id: current_user.id},
teams: {can_create_org_project: true})
.distinct
end
def show
@owner = Owner.find_by(login: params[:id]) || Owner.find_by(id: params[:id])
return render_not_found unless @owner.present?
# 组织
if @owner.is_a?(Organization)
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
@can_create_project = @owner.can_create_project?(current_user.id)
@is_admin = current_user.admin? || @owner.is_owner?(current_user.id)
@is_member = @owner.is_member?(current_user.id)
# 用户
else
#待办事项,现在未做
if User.current.admin? || User.current.login == @owner.login
@waiting_applied_messages = @owner.applied_messages.waiting
@common_applied_transfer_projects = AppliedTransferProject.where(owner_id: @owner.id).common + AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @owner.id}, teams: {authorize: %w(admin owner)} )).common
@common_applied_projects = AppliedProject.where(project_id: @owner.full_admin_projects).common
@undo_events = @waiting_applied_messages.size + @common_applied_transfer_projects.size + @common_applied_projects.size
else
@waiting_applied_messages = AppliedMessage.none
@common_applied_transfer_projects = AppliedTransferProject.none
@common_applied_projects = AppliedProject.none
@undo_events = 0
end
#用户的组织数量
# @user_composes_count = @user.composes.size
@user_composes_count = 0
user_organizations = User.current.logged? ? @owner.organizations.with_visibility(%w(common limited)) + @owner.organizations.with_visibility("privacy").joins(:team_users).where(team_users: {user_id: current_user.id}) : @owner.organizations.with_visibility("common")
@user_org_count = user_organizations.size
normal_projects = Project.members_projects(@owner.id).to_sql
org_projects = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: @owner.id}).to_sql
projects = Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct
user_projects = User.current.logged? && (User.current.admin? || User.current.login == @owner.login) ? projects : projects.visible
@projects_common_count = user_projects.common.size
@projects_mirrior_count = user_projects.mirror.size
@projects_sync_mirrior_count = user_projects.sync_mirror.size
puts @owner.as_json
end
end
private
def org_limited_condition
@owner.organization_extension.limited? && !current_user.logged?
end
def org_privacy_condition
return false if current_user.admin?
@owner.organization_extension.privacy? && @owner.organization_users.where(user_id: current_user.id).blank?
end
end

View File

@ -1,5 +1,6 @@
class PraiseTreadController < ApplicationController
before_action :require_login, except: %i[index]
before_action :require_profile_completed, only: [:like]
before_action :find_project_with_id
def index
@ -40,8 +41,5 @@ class PraiseTreadController < ApplicationController
end
private
def render_result
end
end

View File

@ -5,13 +5,13 @@ class ProjectCategoriesController < ApplicationController
@project_categories = q.result(distinct: true)
end
def pinned_index
@project_categories = ProjectCategory.where.not(pinned_index: 0).order(pinned_index: :desc)
end
def group_list
# if current_user&.logged?
# projects = Project.list_user_projects(current_user.id)
# else
# projects = Project.visible
# end
projects = Project.no_anomory_projects.visible
@category_group_list = projects.joins(:project_category).group("project_categories.id", "project_categories.name").size
@project_categories = ProjectCategory.where('projects_count > 0').order(projects_count: :desc)
# projects = Project.no_anomory_projects.visible
# @category_group_list = projects.joins(:project_category).group("project_categories.id", "project_categories.name").size
end
end

View File

@ -0,0 +1,26 @@
class ProjectRankController < ApplicationController
# 根据时间获取热门项目
def index
$redis_cache.zunionstore("recent-days-project-rank", get_timeable_key_names)
deleted_data = $redis_cache.smembers("v2-project-rank-deleted")
$redis_cache.zrem("recent-days-project-rank", deleted_data) unless deleted_data.blank?
@project_rank = $redis_cache.zrevrange("recent-days-project-rank", 0, 4, withscores: true)
rescue Exception => e
@project_rank = []
end
private
# 默认显示7天的
def time
params.fetch(:time, 7).to_i
end
def get_timeable_key_names
names_array = []
(0...time).to_a.each do |i|
date_time_string = (Date.today - i.days).to_s
names_array << "v2-project-rank-#{date_time_string}"
end
names_array
end
end

View File

@ -3,7 +3,7 @@ class ProjectTrendsController < ApplicationController
before_action :check_project_public
def index
project_trends = @project.project_trends.includes(:user, trend: :user)
project_trends = @project.project_trends.preload(:user, trend: :user)
check_time = params[:time] #时间的筛选
check_type = params[:type] #动态类型的筛选,目前已知的有 Issue, PullRequest, Version
@ -14,20 +14,25 @@ class ProjectTrendsController < ApplicationController
project_trends = project_trends.where("created_at between ? and ?",(Time.now.beginning_of_day - check_time.days), Time.now.end_of_day)
end
@project_open_issues_count = project_trends.where(trend_type: "Issue", action_type: "create").size
@project_close_issues_count = project_trends.where(trend_type: "Issue", action_type: "close").size
@project_issues_count = @project_open_issues_count + @project_close_issues_count
@project_pr_count = project_trends.where(trend_type: "PullRequest", action_type: "close").size
@project_new_pr_count = project_trends.where(trend_type: "PullRequest", action_type: "create").size
@project_pr_all_count = @project_pr_count + @project_new_pr_count
@project_issues_count = project_trends.where(trend_type: "Issue", action_type: "create").size
@project_open_issues_count = @project_issues_count - @project_close_issues_count
@project_pr_count = project_trends.where(trend_type: "PullRequest", action_type: ["close", "merge"]).size
@project_pr_all_count = project_trends.where(trend_type: "PullRequest", action_type: "create").size
@project_new_pr_count = @project_pr_all_count - @project_pr_count
if check_type.present?
project_trends = project_trends.where(trend_type: check_type.to_s.strip)
end
if check_status.present?
project_trends = project_trends.where(action_type: check_status.to_s.strip)
if check_status == "delay" || check_status == "close"
project_trends = project_trends.where(action_type: ["close", "merge"])
else
project_trends = project_trends.where(action_type: ["create"]).where.not(trend_id: project_trends.where(action_type: ["close", "merge"]).pluck(:trend_id))
end
else
project_trends = project_trends.where(action_type: "create")
end
project_trends = project_trends.order("created_at desc")

View File

@ -0,0 +1,33 @@
class Projects::AppliedTransferProjectsController < Projects::BaseController
before_action :check_auth
before_action :check_user_profile_completed, only: [:create]
def organizations
@organizations = Organization.includes(:organization_extension).joins(team_users: :team).where(team_users: {user_id: current_user.id}, teams: {authorize: %w(admin owner)})
end
def create
@applied_transfer_project = Projects::ApplyTransferService.call(current_user, @project, params)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def cancel
@applied_transfer_project = Projects::CancelTransferService.call(current_user, @project)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def check_auth
return render_forbidden unless current_user.admin? ||@project.owner?(current_user)
end
def check_user_profile_completed
@owner = Owner.find_by(login: params[:owner_name])
return if @owner.is_a?(Organization)
require_user_profile_completed(@owner)
end
end

View File

@ -4,4 +4,7 @@ class Projects::BaseController < ApplicationController
before_action :load_project
before_action :load_repository
def require_manager!
return render_forbidden('你没有权限操作') unless current_user.admin? || @project.manager?(current_user)
end
end

View File

@ -0,0 +1,6 @@
class Projects::MembersController < Projects::BaseController
def index
users = @project.all_collaborators.like(params[:search]).includes(:user_extension)
@users = kaminari_paginate(users)
end
end

View File

@ -1,4 +1,5 @@
class Projects::ProjectAppliesController < Projects::BaseController
before_action :require_profile_completed, only: [:create]
def create
project = Projects::ApplyJoinService.call(current_user, create_params)
render_ok(project_id: project.id)

View File

@ -0,0 +1,25 @@
class Projects::ProjectUnitsController < Projects::BaseController
def index
@project_units = @project.project_units
end
def create
if current_user.admin? || @project.manager?(current_user)
ActiveRecord::Base.transaction do
before_units, after_units = ProjectUnit.update_by_unit_types!(@project, unit_types)
SendTemplateMessageJob.perform_later('ProjectSettingChanged', current_user.id, @project&.id, {navbar: true}) unless before_units.eql?(after_units) if Site.has_notice_menu?
render_ok
end
else
render_forbidden('你没有权限操作')
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def unit_types
params.fetch(:unit_types, [])
end
end

View File

@ -0,0 +1,47 @@
class Projects::TeamsController < Projects::BaseController
before_action :load_operate_team, only: [:create, :destroy]
before_action :load_team_project, only: :destroy
def index
if @project.owner.is_a?(Organization)
@teams = Team.joins(:team_projects).where(team_projects: {project_id: @project.id})
else
@teams = Team.none
end
@teams = paginate(@teams)
end
def create
ActiveRecord::Base.transaction do
@team_project = TeamProject.build(@owner.id, @operate_team.id, @project.id)
Gitea::Organization::TeamProject::CreateService.call(current_user.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
ActiveRecord::Base.transaction do
@team_project.destroy!
Gitea::Organization::TeamProject::DeleteService.call(current_user.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_operate_team
@operate_team = Team.find_by(id: params[:team_id]) || Team.find_by(id: params[:id])
tip_exception("项目不存在") if @operate_team.nil?
tip_exception("该组织团队拥有组织所有项目,无法进行操作") if @operate_team.includes_all_project
end
def load_team_project
@team_project = TeamProject.find_by(organization_id: @owner.id, team_id: @operate_team.id, project_id: @project.id)
tip_exception("组织团队项目不存在") if @team_project.nil?
end
end

View File

@ -0,0 +1,116 @@
class Projects::WebhooksController < Projects::BaseController
before_action :require_manager!
before_action :find_webhook, only:[:edit, :update, :destroy, :tasks, :test]
def index
@webhooks = @project.webhooks
@webhooks = kaminari_paginate(@webhooks)
end
def create
ActiveRecord::Base.transaction do
return render_error("webhooks数量已到上限请删除暂不使用的webhooks以进行添加操作") if @project.webhooks.size > 19
return render_error("参数错误.") unless webhook_params.present?
form = Projects::Webhooks::CreateForm.new(webhook_params)
return render json: {status: -1, message: form.errors} unless form.validate!
response = Gitea::Repository::Webhooks::CreateService.new(operating_token, @project&.owner&.login, @project&.identifier, gitea_webhooks_params).call
if response[0] == 201
@webhook = response[2]
else
render_error("创建失败.")
end
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def edit
end
def update
return render_error("参数错误.") unless webhook_params.present?
form = Projects::Webhooks::CreateForm.new(webhook_params)
return render json: {status: -1, message: form.errors} unless form.validate!
response = Gitea::Repository::Webhooks::UpdateService.call(operating_token, @project&.owner&.login, @project&.identifier, @webhook.id, gitea_webhooks_params)
if response[0] == 200
@webhook = response[2]
render_ok
else
render_error("更新失败.")
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
response = Gitea::Repository::Webhooks::DeleteService.call(operating_token, @project&.owner&.login, @project&.identifier, @webhook.id)
if response[0] == 204
@webhook = response[2]
render_ok
else
render_error("删除失败.")
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def tasks
@tasks = @webhook.tasks.where(is_delivered: true).order("delivered desc")
@tasks = kaminari_paginate(@tasks)
end
def test
ActiveRecord::Base.transaction do
response = Gitea::Repository::Webhooks::TestService.call(operating_token, @project&.owner&.login, @project&.identifier, @webhook.id)
if response[0] == 204
render_ok
else
render_error("测试推送失败.")
end
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def find_webhook
@webhook = @project.webhooks.find_by_id(params[:id])
return render_not_found if @webhook.nil?
end
def webhook_params
params.require(:webhook).permit(:url, :type, :http_method, :content_type, :secret, :active, :branch_filter, events: [])
end
def webhook_type
webhook_params.fetch(:type, "gitea")
end
def webhook_branch_filter
webhook_params.fetch(:branch_filter, "*")
end
def gitea_webhooks_params
{
active: webhook_params[:active],
branch_filter: webhook_branch_filter,
config: {
content_type: webhook_params[:content_type],
url: webhook_params[:url],
http_method: webhook_params[:http_method],
secret: webhook_params[:secret]
},
events: webhook_params[:events],
type: webhook_type,
}
end
def operating_token
@project.member?(current_user) ? current_user.gitea_token : @project&.owner&.gitea_token
end
end

View File

@ -2,16 +2,46 @@ class ProjectsController < ApplicationController
include ApplicationHelper
include OperateProjectAbilityAble
include ProjectsHelper
before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about]
before_action :load_project, except: %i[index group_type_list migrate create recommend]
include Acceleratorable
before_action :require_login, except: %i[index branches branches_slice group_type_list simple show fork_users praise_users watch_users recommend banner_recommend about menu_list]
before_action :require_profile_completed, only: [:create, :migrate]
before_action :load_repository, except: %i[index group_type_list migrate create recommend banner_recommend]
before_action :authorizate_user_can_edit_project!, only: %i[update]
before_action :project_public?, only: %i[fork_users praise_users watch_users]
def index
scope = Projects::ListQuery.call(params)
def menu_list
menu = []
@projects = kaminari_paginate(scope)
@total_count = @projects.total_count
menu.append(menu_hash_by_name("home"))
menu.append(menu_hash_by_name("code")) if @project.has_menu_permission("code")
menu.append(menu_hash_by_name("issues")) if @project.has_menu_permission("issues")
menu.append(menu_hash_by_name("pulls")) if @project.has_menu_permission("pulls")
menu.append(menu_hash_by_name("wiki")) if @project.has_menu_permission("wiki")
menu.append(menu_hash_by_name("devops")) if @project.has_menu_permission("devops")
menu.append(menu_hash_by_name("versions")) if @project.has_menu_permission("versions")
menu.append(menu_hash_by_name("resources")) if @project.has_menu_permission("resources")
menu.append(menu_hash_by_name("activity"))
menu.append(menu_hash_by_name("settings")) if current_user.admin? || @project.manager?(current_user)
render json: menu
end
def index
scope = current_user.logged? ? Projects::ListQuery.call(params, current_user.id) : Projects::ListQuery.call(params)
@projects = kaminari_paginate(scope.includes(:project_category, :project_language, :repository, :project_educoder, :owner, :project_units))
# @projects = paginate scope.includes(:project_category, :project_language, :repository, :project_educoder, :owner, :project_units)
category_id = params[:category_id]
@total_count =
if category_id.blank?
ps = ProjectStatistic.first
ps.common_projects_count + ps.mirror_projects_count unless ps.blank?
else
cate = ProjectCategory.find_by(id: category_id)
cate&.projects_count || 0
end
end
def create
@ -27,36 +57,95 @@ class ProjectsController < ApplicationController
def migrate
Projects::MigrateForm.new(mirror_params).validate!
@project = Projects::MigrateService.new(current_user, mirror_params).call
@project =
if enable_accelerator?(mirror_params[:clone_addr])
source_clone_url = mirror_params[:clone_addr]
uid_logger("########## 已动加速器 ##########")
result = Gitea::Accelerator::MigrateService.call(mirror_params)
if result[:status] == :success
Rails.logger.info "########## 加速镜像成功 ########## "
Projects::MigrateService.call(current_user,
mirror_params.merge(source_clone_url: source_clone_url,
clone_addr: accelerator_url(mirror_params[:repository_name])))
else
Projects::MigrateService.call(current_user, mirror_params)
end
else
Projects::MigrateService.call(current_user, mirror_params)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def branches
@branches = Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call
return @branches = [] unless @project.forge?
result = Gitea::Repository::Branches::ListService.call(@owner, @project.identifier)
@branches = result.is_a?(Hash) && result.key?(:status) ? [] : result
end
def branches_slice
return @branches = [] unless @project.forge?
slice_result = Gitea::Repository::Branches::ListSliceService.call(@owner, @project.identifier)
@branches_slice = slice_result.is_a?(Hash) && slice_result.key?(:status) ? [] : slice_result
end
def group_type_list
# if current_user&.logged?
# projects = Project.list_user_projects(current_user.id)
# else
# projects = Project.visible
# end
projects = Project.no_anomory_projects.visible
@project_group_list = projects.group(:project_type).size
project_statics = ProjectStatistic.first
@project_statics_list = [
{
project_type: 'common',
name: '开源托管项目',
projects_count: project_statics&.common_projects_count || 0
},
{
project_type: 'mirror',
name: '开源镜像项目',
projects_count: project_statics&.mirror_projects_count || 0
}
]
# projects = Project.no_anomory_projects.visible
# @project_group_list = projects.group(:project_type).size
end
def update
ActiveRecord::Base.transaction do
# Projects::CreateForm.new(project_params).validate!
private = params[:private]
if [true, false].include? private
new_project_params = project_params.merge(is_public: !private)
Gitea::Repository::UpdateService.new(@project.owner, @project.repository.identifier, {private: private}).call
@project.repository.update_column(:hidden, private)
# TODO:
# 临时特殊处理修改website、lesson_url操作方法
if project_params.has_key?("website")
@project.update(project_params)
elsif project_params.has_key?("default_branch")
@project.update(project_params)
gitea_params = {
default_branch: @project.default_branch
}
Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params)
else
validate_params = project_params.slice(:name, :description,
:project_category_id, :project_language_id, :private, :identifier)
Projects::UpdateForm.new(validate_params.merge(user_id: @project.user_id, project_identifier: @project.identifier)).validate!
private = @project.forked_from_project.present? ? !@project.forked_from_project.is_public : params[:private] || false
new_project_params = project_params.except(:private).merge(is_public: !private)
@project.update_attributes!(new_project_params)
@project.forked_projects.update_all(is_public: @project.is_public)
gitea_params = {
private: private,
default_branch: @project.default_branch,
website: @project.website,
name: @project.identifier
}
gitea_repo = Gitea::Repository::UpdateService.call(@owner, @project&.repository&.identifier, gitea_params)
@project.repository.update_attributes({hidden: gitea_repo["private"], identifier: gitea_repo["name"]})
end
@project.update_attributes!(new_project_params)
SendTemplateMessageJob.perform_later('ProjectSettingChanged', current_user.id, @project&.id, @project.previous_changes.slice(:name, :description, :project_category_id, :project_language_id, :is_public, :identifier)) if Site.has_notice_menu?
end
rescue Exception => e
uid_logger_error(e.message)
@ -67,10 +156,11 @@ class ProjectsController < ApplicationController
end
def destroy
if current_user.admin? || @project.owner?(current_user)
if current_user.admin? || @project.manager?(current_user)
ActiveRecord::Base.transaction do
Gitea::Repository::DeleteService.new(@project.owner, @project.identifier).call
@project.destroy!
@project.forked_projects.update_all(forked_from_project_id: nil)
render_ok
end
else
@ -100,11 +190,17 @@ class ProjectsController < ApplicationController
end
def simple
json_response(@project)
# 为了缓存活跃项目的基本信息,后续删除
Cache::V2::ProjectCommonService.new(@project.id).read
json_response(@project, current_user)
end
def recommend
@projects = Project.recommend.includes(:repository, :project_category, owner: :user_extension).limit(5)
@projects = Project.recommend.includes(:repository, :project_category, :owner).order(visits: :desc)
end
def banner_recommend
@projects = Project.recommend.where.not(recommend_index: 0).includes(:project_category, :owner, :project_language).order(recommend_index: :desc)
end
def about
@ -138,8 +234,8 @@ class ProjectsController < ApplicationController
private
def project_params
params.permit(:user_id, :name, :description, :repository_name,
:project_category_id, :project_language_id, :license_id, :ignore_id)
params.permit(:user_id, :name, :description, :repository_name, :website, :lesson_url, :default_branch, :identifier,
:project_category_id, :project_language_id, :license_id, :ignore_id, :private)
end
def mirror_params

View File

@ -0,0 +1,43 @@
class ProtectedBranchesController < ApplicationController
include OperateProjectAbilityAble
before_action :require_login
before_action :load_repository
before_action :authorizate_user_can_edit_project!
def index
scope = @repository.protected_branches
@total_count = scope.size
@protected_branches = paginate(scope)
end
def create
@protected_branch = ProtectedBranches::CreateService.call(@repository, @owner, params)
render_protected_branch_json
end
def update
@protected_branch = ProtectedBranches::UpdateService.call(@repository, @owner, params)
end
def destroy
ProtectedBranches::DestroyService.call(@repository, @owner, params[:branch_name])
render_ok
end
def show
@protected_branch = ProtectedBranches::GetService.call(@repository, @owner, params)
end
def edit
@branch, @protected_branch = ProtectedBranches::EditService.call(@repository, @owner, params[:branch_name])
end
private
def render_protected_branch_json
@protected_branch.persisted? ? @protected_branch : render_error('创建失败!')
end
end

View File

@ -0,0 +1,64 @@
class PublicKeysController < ApplicationController
before_action :require_login
before_action :find_public_key, only: [:destroy]
def index
@public_keys = current_user.public_keys
@public_keys = kaminari_paginate(@public_keys)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def create
return render_error("参数错误") if public_key_params.blank?
return render_ok({status: 10002, message: "请输入密钥"}) if public_key_params[:key].blank?
return render_ok({status: 10001, message: "请输入标题"}) if public_key_params[:title].blank?
@gitea_response = Gitea::User::Keys::CreateService.call(current_user.gitea_token, public_key_params)
if @gitea_response[0] == 201
@public_key = @gitea_response[2]
else
return render_error("创建ssh key失败") if @gitea_response[2].blank?
return render_ok({status: 10002, message: "密钥格式不正确"}) if @gitea_response[2]["message"].starts_with?("Invalid key content")
exist_public_key = Gitea::PublicKey.find_by(content: public_key_params[:key])
return render_ok({status: 10002, message: "密钥已被占用"}) if @gitea_response[2]["message"].starts_with?("Key content has been used as non-deploy key") && exist_public_key.present? && exist_public_key&.owner_id != current_user.gitea_uid
return render_ok({status: 10002, message: "密钥已存在,请勿重复添加"}) if @gitea_response[2]["message"].starts_with?("Key content has been used as non-deploy key")
@public_key = nil
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
return render_not_found unless @public_key.present?
result = Gitea::User::Keys::DeleteService.call(current_user.gitea_token, @public_key.id)
if result[0] == 204
render_ok
else
render_error
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def page
params[:page].to_i.zero? ? 1 : params[:page].to_i
end
def limit
limit = params[:limit] || params[:per_page]
limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
end
def public_key_params
params.require(:public_key).permit(:key, :title)
end
def find_public_key
@public_key = current_user.public_keys.find_by_id(params[:id])
end
end

View File

@ -1,9 +1,11 @@
class PullRequestsController < ApplicationController
before_action :require_login, except: [:index, :show]
before_action :require_login, except: [:index, :show, :files, :commits]
before_action :require_profile_completed, only: [:create]
before_action :load_repository
before_action :set_user, only: [:new, :get_branches]
before_action :find_pull_request, except: [:index, :new, :create, :check_can_merge,:get_branches,:create_merge_infos]
# before_action :get_relatived, only: [:edit]
before_action :check_menu_authorize
before_action :find_pull_request, except: [:index, :new, :create, :check_can_merge,:get_branches,:create_merge_infos, :files, :commits]
before_action :load_pull_request, only: [:files, :commits]
before_action :find_atme_receivers, only: [:create, :update]
include TagChosenHelper
include ApplicationHelper
@ -12,11 +14,14 @@ class PullRequestsController < ApplicationController
# @issues = Gitea::PullRequest::ListService.new(@user,@repository.try(:identifier)).call #通过gitea获取
issues = @project.issues.issue_pull_request.issue_index_includes.includes(pull_request: :user)
issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user))
@all_issues_size = issues.size
@open_issues_size = issues.joins(:pull_request).where(pull_requests: {status: 0}).size
@close_issues_size = issues.joins(:pull_request).where(pull_requests: {status: 2}).size
@merged_issues_size = issues.joins(:pull_request).where(pull_requests: {status: 1}).size
@all_issues = issues.distinct
@filter_issues = @all_issues
@filter_issues = @filter_issues.where("subject LIKE ? OR description LIKE ? ", "%#{params[:search]}%", "%#{params[:search]}%") if params[:search].present?
@open_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::OPEN})
@close_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::CLOSED})
@merged_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::MERGED})
@user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user))
@user_admin_or_developer = current_user.present? && (current_user.admin || @project.all_developers.include?(current_user))
scopes = Issues::ListQueryService.call(issues,params.delete_if{|k,v| v.blank?}, "PullRequest")
@issues_size = scopes.size
@ -24,11 +29,11 @@ class PullRequestsController < ApplicationController
end
def new
@all_branches = PullRequests::BranchesService.new(@user, @project).call
@all_branches = Branches::ListService.call(@owner, @project)
@is_fork = @project.forked_from_project_id.present?
@projects_names = [{
project_user_login: @user.try(:login),
project_name: "#{@user.try(:show_real_name)}/#{@repository.try(:identifier)}",
project_user_login: @owner.try(:login),
project_name: "#{@owner.try(:show_real_name)}/#{@repository.try(:identifier)}",
project_id: @project.identifier,
id: @project.id
}]
@ -45,84 +50,44 @@ class PullRequestsController < ApplicationController
end
def get_branches
branch_result = PullRequests::BranchesService.new(@user, @project).call
branch_result = Branches::ListService.call(@owner, @project)
render json: branch_result
# return json: branch_result
end
def create
if params[:title].nil?
normal_status(-1, "名称不能为空")
elsif params[:issue_tag_ids].nil?
normal_status(-1, "标签不能为空")
else
ActiveRecord::Base.transaction do
begin
merge_params
pull_issue = Issue.new(@issue_params)
if pull_issue.save!
pr_params = {
user_id: current_user.try(:id),
project_id: @project.id,
issue_id: pull_issue.id,
fork_project_id: params[:fork_project_id],
is_original: params[:is_original]
}
local_requests = PullRequest.new(@local_params.merge(pr_params))
if local_requests.save
remote_pr_params = @local_params
remote_pr_params = remote_pr_params.merge(head: "#{params[:merge_user_login]}:#{params[:head]}").compact if local_requests.is_original && params[:merge_user_login]
gitea_request = Gitea::PullRequest::CreateService.call(current_user.try(:gitea_token), @project.owner, @repository.try(:identifier), remote_pr_params.except(:milestone))
if gitea_request && local_requests.update_attributes(gpid: gitea_request["number"])
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create!(issue_id: pull_issue.id, issue_tag_id: tag)
end
end
if params[:assigned_to_id].present?
Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
container_id: local_requests.id, container_type: 'PullRequest',
parent_container_id: @project.id, parent_container_type: "Project",
tiding_type: 'pull_request', status: 0)
end
local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
if params[:title].to_s.include?("WIP:")
pull_issue.custom_journal_detail("WIP", "", "这个合并请求被标记为尚未完成的工作。完成后请从标题中移除WIP:前缀。", current_user&.id)
end
# render :json => { status: 0, message: "PullRequest创建成功", id: pull_issue.id}
normal_status(0, "PullRequest创建成功")
else
normal_status(-1, "PullRequest创建失败")
end
else
normal_status(-1, "PullRequest创建失败")
end
end
rescue => e
normal_status(-1, e.message)
raise ActiveRecord::Rollback
end
ActiveRecord::Base.transaction do
@pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params)
if @gitea_pull_request[:status] == :success
@pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"], @gitea_pull_request[:body]["id"])
SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @pull_request&.id) if Site.has_notice_menu?
SendTemplateMessageJob.perform_later('ProjectPullRequest', current_user.id, @pull_request&.id) if Site.has_notice_menu?
Rails.logger.info "[ATME] maybe to at such users: #{@atme_receivers.pluck(:login)}"
AtmeService.call(current_user, @atme_receivers, @pull_request) if @atme_receivers.size > 0
else
render_error("create pull request error: #{@gitea_pull_request[:status]}")
raise ActiveRecord::Rollback
end
end
end
def edit
@fork_project_user_name = @project&.fork_project&.owner.try(:show_real_name)
@fork_project_user = @project&.fork_project&.owner.try(:login)
@fork_project_identifier = @project&.fork_project&.repository.try(:identifier)
@fork_project_user_name = @pull_request&.fork_project&.owner.try(:show_real_name)
@fork_project_user = @pull_request&.fork_project&.owner.try(:login)
@fork_project_identifier = @pull_request&.fork_project&.repository.try(:identifier)
end
def update
if params[:title].nil?
normal_status(-1, "名称不能为空")
elsif params[:issue_tag_ids].nil?
normal_status(-1, "不能为空")
normal_status(-1, "标记不能为空")
else
ActiveRecord::Base.transaction do
begin
merge_params
@issue&.issue_tags_relates&.destroy_all if params[:issue_tag_ids].blank?
if params[:issue_tag_ids].present? && !@issue&.issue_tags_relates.where(issue_tag_id: params[:issue_tag_ids]).exists?
@issue&.issue_tags_relates&.destroy_all
params[:issue_tag_ids].each do |tag|
@ -132,8 +97,10 @@ class PullRequestsController < ApplicationController
if @issue.update_attributes(@issue_params)
if @pull_request.update_attributes(@local_params.compact)
gitea_request = Gitea::PullRequest::UpdateService.new(@project.owner, @repository.try(:identifier), @requests_params, @pull_request.try(:gpid)).call
if gitea_request
gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier,
@pull_request.gitea_number, @requests_params, current_user.gitea_token)
if gitea_pull[:status] === :success
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create(issue_id: @issue.id, issue_tag_id: tag)
@ -142,6 +109,8 @@ class PullRequestsController < ApplicationController
if params[:status_id].to_i == 5
@issue.issue_times.update_all(end_time: Time.now)
end
Rails.logger.info "[ATME] maybe to at such users: #{@atme_receivers.pluck(:login)}"
AtmeService.call(current_user, @atme_receivers, @pull_request) if @atme_receivers.size > 0
normal_status(0, "PullRequest更新成功")
else
normal_status(-1, "PullRequest更新失败")
@ -154,6 +123,8 @@ class PullRequestsController < ApplicationController
normal_status(-1, e.message)
raise ActiveRecord::Rollback
end
SendTemplateMessageJob.perform_later('PullRequestChanged', current_user.id, @pull_request&.id, @issue.previous_changes.slice(:assigned_to_id, :priority_id, :fixed_version_id, :issue_tags_value)) if Site.has_notice_menu?
SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @pull_request&.id ) if @issue.previous_changes[:assigned_to_id].present? && Site.has_notice_menu?
end
end
@ -162,9 +133,14 @@ class PullRequestsController < ApplicationController
def refuse_merge
ActiveRecord::Base.transaction do
begin
@pull_request.update(status: 2)
@pull_request.issue.update(status_id: 5)
normal_status(1, "已拒绝")
colsed = PullRequests::CloseService.call(@owner, @repository, @pull_request, current_user)
if colsed === true
@pull_request.project_trends.create!(user: current_user, project: @project,action_type: ProjectTrend::CLOSE)
SendTemplateMessageJob.perform_later('PullRequestClosed', current_user.id, @pull_request.id) if Site.has_notice_menu?
normal_status(1, "已拒绝")
else
normal_status(-1, '合并失败')
end
rescue => e
normal_status(-1, e.message)
raise ActiveRecord::Rollback
@ -179,30 +155,35 @@ class PullRequestsController < ApplicationController
def show
@issue_user = @issue.user
@issue_assign_to = @issue.get_assign_user
@gitea_pull = Gitea::PullRequest::GetService.call(@owner.login,
@repository.identifier, @pull_request.gitea_number, current_user&.gitea_token)
end
def pr_merge
return render_forbidden("你没有权限操作.") if @project.reporter?(current_user)
return render_forbidden("你没有权限操作.") unless @project.operator?(current_user)
if params[:do].blank?
normal_status(-1, "请选择合并方式")
else
ActiveRecord::Base.transaction do
begin
requests_params = {
Do: params[:do],
MergeMessageField: params[:body],
MergeTitleField: params[:title]
}
merge_pr = Gitea::PullRequest::MergeService.call(current_user.gitea_token, @project.owner.login,
@repository.try(:identifier), @pull_request.try(:gpid), requests_params)
if @pull_request.update_attribute(:status, 1) && merge_pr[:status].to_i == 200
@pull_request&.project_trends&.update_all(action_type: "close")
@gitea_pull = Gitea::PullRequest::GetService.call(@owner.login, @repository.identifier, @pull_request.gitea_number, current_user&.gitea_token)
if @gitea_pull["merged_by"].present?
success_condition = true
else
result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params)
success_condition = result.status == 200
end
if success_condition && @pull_request.merge!
# @pull_request.project_trend_status!
@pull_request.project_trends.create!(user: current_user, project: @project,action_type: ProjectTrend::MERGE)
@issue&.custom_journal_detail("merge", "", "该合并请求已被合并", current_user&.id)
SendTemplateMessageJob.perform_later('PullRequestMerged', current_user.id, @pull_request.id) if Site.has_notice_menu?
normal_status(1, "合并成功")
else
normal_status(-1, "合并失败")
normal_status(-1, result.message)
end
rescue => e
normal_status(-1, e.message)
@ -222,11 +203,11 @@ class PullRequestsController < ApplicationController
elsif target_head === target_base && !is_original
normal_status(-2, "分支内容相同,无需创建合并请求")
else
can_merge = @project&.pull_requests.where(user_id: current_user&.id, head: target_head, base: target_base, status: 0, is_original: is_original, fork_project_id: params[:fork_project_id])
can_merge = @project&.pull_requests.where(head: target_head, base: target_base, status: 0, is_original: is_original, fork_project_id: params[:fork_project_id])
if can_merge.present?
render json: {
status: -2,
message: "在这些分支之间的合并请求已存在:<a href='/projects/#{@project.id}/merge/#{can_merge.first.id}/Messagecount''>#{can_merge.first.try(:title)}</a>",
message: "在这些分支之间的合并请求已存在:<a href='/#{@owner.login}/#{@project.identifier}/pulls/#{can_merge.first.id}''>#{can_merge.first.try(:title)}</a>",
}
else
normal_status(0, "可以合并")
@ -235,9 +216,19 @@ class PullRequestsController < ApplicationController
end
def files
@files_result = Gitea::PullRequest::FilesService.call(@owner.login, @project.identifier, @pull_request.gitea_number, current_user&.gitea_token)
# render json: @files_result
end
def commits
@commits_result = Gitea::PullRequest::CommitsService.call(@owner.login, @project.identifier, @pull_request.gitea_number, current_user&.gitea_token)
# render json: @commits_result
end
private
def set_user
@user = @project.owner
def load_pull_request
@pull_request = PullRequest.find params[:id]
end
def find_pull_request
@ -253,7 +244,7 @@ class PullRequestsController < ApplicationController
def get_relatived
@project_tags = @project.issue_tags&.select(:id,:name, :color).as_json
@project_versions = @project.versions&.select(:id,:name, :status).as_json
@project_members = @project.members_user_infos
@project_members = @project.all_developers
@project_priories = IssuePriority&.select(:id,:name, :position).as_json
end
@ -267,7 +258,8 @@ class PullRequestsController < ApplicationController
}
@requests_params = @local_params.merge({
assignee: current_user.try(:login),
assignees: ["#{params[:assigned_login].to_s}"],
# assignees: ["#{params[:assigned_login].to_s}"],
assignees: ["#{current_user.try(:login).to_s}"],
labels: params[:issue_tag_ids],
due_date: Time.now
})
@ -286,4 +278,8 @@ class PullRequestsController < ApplicationController
status_id: 1,
}
end
def check_menu_authorize
return render_not_found unless @project.has_menu_permission("pulls")
end
end

View File

@ -1,19 +1,41 @@
class RepositoriesController < ApplicationController
include RepositoriesHelper
include ApplicationHelper
include OperateProjectAbilityAble
include Repository::LanguagesPercentagable
before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror]
before_action :require_profile_completed, only: [:create_file]
before_action :load_repository
before_action :authorizate!, except: [:sync_mirror, :tags, :commit]
before_action :authorizate!, except: [:sync_mirror, :tags, :commit, :archive]
before_action :authorizate_user_can_edit_repo!, only: %i[sync_mirror]
before_action :get_ref, only: %i[entries sub_entries top_counts]
before_action :get_ref, only: %i[entries sub_entries top_counts file archive]
before_action :get_latest_commit, only: %i[entries sub_entries top_counts]
before_action :get_statistics, only: %i[top_counts]
def files
result = @project.educoder? ? nil : Gitea::Repository::Files::GetService.call(@owner, @project.identifier, @ref, params[:search], @owner.gitea_token)
render json: result
end
# 新版项目详情
def detail
@user = current_user
@result = Repositories::DetailService.call(@owner, @repository, @user)
@project_fork_id = @project.try(:forked_from_project_id)
if @project_fork_id.present?
@fork_project = Project.find_by(id: @project_fork_id)
@fork_project_user = @fork_project.owner
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def show
@user = current_user
@repo = @project.repository
@result = Gitea::Repository::GetService.new(@project.owner, @project.identifier).call
@result = @project.forge? ? Gitea::Repository::GetService.new(@owner, @project.identifier).call : nil
@project_fork_id = @project.try(:forked_from_project_id)
if @project_fork_id.present?
@fork_project = Project.find_by(id: @project_fork_id)
@ -26,62 +48,119 @@ class RepositoriesController < ApplicationController
def entries
@project.increment!(:visits)
@project_owner = @project.owner
@entries = Gitea::Repository::Entries::ListService.new(@project_owner, @project.identifier, ref: @ref).call
@entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : []
@path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
CacheAsyncSetJob.perform_later("project_common_service", {visits: 1}, @project.id)
if @project.educoder?
@entries = Educoder::Repository::Entries::ListService.call(@project&.project_educoder.repo_name)
else
@entries = Gitea::Repository::Entries::ListService.new(@owner, @project.identifier, ref: @ref).call
@entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : []
@path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
end
end
def top_counts
@result = Gitea::Repository::GetService.new(@project.owner, @project.identifier).call
@result = @project.educoder? ? nil : Gitea::Repository::GetService.new(@project.owner, @project.identifier).call
end
def sub_entries
file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip))
interactor = Repositories::EntriesInteractor.call(@project.owner, @project.identifier, file_path_uri, ref: @ref)
if interactor.success?
result = interactor.result
return @sub_entries = [] if result.is_a?(Hash) && result[:status] == -1
@path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
@sub_entries = result.is_a?(Array) ? result : [result]
@sub_entries = @sub_entries.sort_by{ |hash| hash['type'] }
if @project.educoder?
if params[:type] === 'file'
@sub_entries = Educoder::Repository::Entries::GetService.call(@project&.project_educoder&.repo_name, file_path_uri)
logger.info "######### sub_entries: #{@sub_entries}"
return render_error('该文件暂未开放,敬请期待.') if @sub_entries['status'].to_i === -1
tmp_entries = [{
"content" => @sub_entries['data']['content'],
"type" => "blob"
}]
@sub_entries = {
"trees"=>tmp_entries,
"commits" => [{}]
}
else
@sub_entries = Educoder::Repository::Entries::ListService.call(@project&.project_educoder&.repo_name, {path: file_path_uri})
end
else
render_error(interactor.error)
interactor = Repositories::EntriesInteractor.call(@owner, @project.identifier, file_path_uri, ref: @ref)
if interactor.success?
result = interactor.result
@sub_entries = result.is_a?(Array) ? result.sort_by{ |hash| hash['type'] } : result
else
render_error(interactor.error)
end
end
end
def commits
@project_owner = @project.owner
@hash_commit = Gitea::Repository::Commits::ListService.new(@project_owner.login, @project.identifier,
sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token).call
if params[:filepath].present?
file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip))
@hash_commit = Gitea::Repository::Commits::FileListService.new(@owner.login, @project.identifier, file_path_uri,
sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token).call
else
@hash_commit = Gitea::Repository::Commits::ListService.new(@owner.login, @project.identifier,
sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token).call
end
end
def commits_slice
@hash_commit = Gitea::Repository::Commits::ListSliceService.call(@owner.login, @project.identifier,
sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token)
end
def commit
@commit = Gitea::Repository::Commits::GetService.new(@repository.user.login, @repository.identifier, params[:sha], current_user.gitea_token).call
@sha = params[:sha]
@commit = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token)
@commit_diff = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token, {diff: true})
end
def tags
@tags = Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier, {page: params[:page], limit: params[:limit]}).call
result = Gitea::Repository::Tags::ListService.call(current_user&.gitea_token, @owner.login, @project.identifier, {page: params[:page], limit: params[:limit]})
@tags = result.is_a?(Hash) && result.key?(:status) ? [] : result
end
def contributors
if params[:filepath].present?
@contributors = []
else
@contributors = Gitea::Repository::Contributors::GetService.call(@owner, @repository.identifier)
end
end
def edit
return render_forbidden if !@project.manager?(current_user) && !current_user.admin?
end
def create_file
interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @project.owner.login, content_params)
interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @owner.login, content_params)
if interactor.success?
@file = interactor.result
create_new_pr(params)
# create_new_pr(params)
#如果是更新流水线文件
if params[:pipeline_id]
update_pipeline(params[:pipeline_id])
end
else
render_error(interactor.error)
end
end
def update_pipeline(pipeline_id)
pipeline = Ci::Pipeline.find(pipeline_id)
if pipeline
pipeline.update!(sync: 1)
end
end
def update_file
interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, @project.owner.login, params.merge(identifier: @project.identifier))
interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, @owner.login, params.merge(identifier: @project.identifier))
if interactor.success?
@file = interactor.result
create_new_pr(params)
# TODO: 是否创建pr
# create_new_pr(params)
render_result(1, "更新成功")
else
render_error(interactor.error)
@ -89,7 +168,7 @@ class RepositoriesController < ApplicationController
end
def delete_file
interactor = Gitea::DeleteFileInteractor.call(current_user.gitea_token, @project.owner.login, params.merge(identifier: @project.identifier))
interactor = Gitea::DeleteFileInteractor.call(current_user.gitea_token, @owner.login, params.merge(identifier: @project.identifier))
if interactor.success?
@file = interactor.result
render_result(1, "文件删除成功")
@ -110,6 +189,47 @@ class RepositoriesController < ApplicationController
render_ok
end
def readme
if params[:filepath].present?
result = Gitea::Repository::Readme::DirService.call(@owner.login, @repository.identifier, params[:filepath], params[:ref], current_user&.gitea_token)
else
result = Gitea::Repository::Readme::GetService.call(@owner.login, @repository.identifier, params[:ref], current_user&.gitea_token)
end
@readme = result[:status] === :success ? result[:body] : nil
@readme['content'] = decode64_content(@readme, @owner, @repository, params[:ref])
render json: @readme.slice("type", "encoding", "size", "name", "path", "content", "sha")
rescue
render json: nil
end
def languages
render json: languages_precentagable
end
def archive
domain = Gitea.gitea_config[:domain]
api_url = Gitea.gitea_config[:base_url]
archive_url = "/repos/#{@owner.login}/#{@repository.identifier}/archive/#{params[:archive]}"
file_path = [domain, api_url, archive_url].join
file_path = [file_path, "access_token=#{current_user&.gitea_token}"].join("?") if @repository.hidden?
return render_not_found if !request.format.zip? && !request.format.gzip?
redirect_to file_path
end
def raw
domain = Gitea.gitea_config[:domain]
api_url = Gitea.gitea_config[:base_url]
url = "/repos/#{@owner.login}/#{@repository.identifier}/raw/#{params[:filepath]}?ref=#{params[:ref]}"
file_path = [domain, api_url, url].join
file_path = [file_path, "access_token=#{current_user&.gitea_token}"].join("&") if @repository.hidden?
redirect_to URI.escape(file_path)
end
private
def find_project
@ -130,23 +250,29 @@ class RepositoriesController < ApplicationController
# TODO 获取最新commit信息
def project_commits
Gitea::Repository::Commits::ListService.new(@project.owner.login, @project.identifier,
sha: get_ref, page: 1, limit: 1, token: current_user&.gitea_token).call
if params[:filepath].present?
file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip))
Gitea::Repository::Commits::FileListService.new(@project.owner.login, @project.identifier, file_path_uri,
sha: get_ref, page: 1, limit: 1, token: current_user&.gitea_token).call
else
Gitea::Repository::Commits::ListService.new(@project.owner.login, @project.identifier,
sha: get_ref, page: 1, limit: 1, token: current_user&.gitea_token).call
end
end
def get_statistics
@branches_count = Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call&.size
@tags_count = Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier).call&.size
@branches_count = @project.educoder? ? 0 : Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call&.size
@tags_count = @project.educoder? ? 0 : Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier).call&.size
end
def get_ref
@ref = params[:ref] || "master"
@ref = params[:ref] || @project&.default_branch
end
def get_latest_commit
latest_commit = project_commits
@latest_commit = latest_commit[:body][0] if latest_commit.present?
@commits_count = latest_commit[:total_count] if latest_commit.present?
latest_commit = @project.educoder? ? nil : project_commits
@latest_commit = latest_commit.present? ? latest_commit[:body][0] : nil
@commits_count = latest_commit.present? ? latest_commit[:total_count] : 0
end
def content_params
@ -184,7 +310,7 @@ class RepositoriesController < ApplicationController
# uploadPushInfo
end
def create_new_pr(params)
if params[:new_branch].present? && params[:new_branch] != params[:branch]
local_params = {
@ -214,14 +340,14 @@ class RepositoriesController < ApplicationController
issue_type: "1",
tracker_id: 2,
status_id: 1,
priority_id: 1
priority_id: params[:priority_id] || "2"
}
@pull_issue = Issue.new(issue_params)
if @pull_issue.save!
local_requests = PullRequest.new(local_params.merge(user_id: current_user.try(:id), project_id: @project.id, issue_id: @pull_issue.id))
if local_requests.save
gitea_request = Gitea::PullRequest::CreateService.new(current_user.try(:gitea_token), @project.owner, @project.try(:identifier), requests_params).call
if gitea_request && local_requests.update_attributes(gpid: gitea_request["number"])
gitea_request = Gitea::PullRequest::CreateService.new(current_user.try(:gitea_token), @owner.login, @project.try(:identifier), requests_params).call
if gitea_request[:status] == :success && local_requests.update_attributes(gpid: gitea_request["body"]["number"])
local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
end
end

View File

@ -1,6 +1,61 @@
class SettingsController < ApplicationController
def show
@old_projects_url = nil
@old_projects_url = "https://www.trustie.net/users/#{current_user.try(:login)}/projects" if User.current.logged?
@old_projects_url = nil
get_add_menu
get_common_menu
get_personal_menu
get_top_system_notification
end
private
def get_add_menu
@add = []
Site.add.select(:id, :name, :url, :key).to_a.map(&:serializable_hash).each do |site|
hash = {}
site.each {|k, v|
hash.merge!("#{k}": get_site_url(k, v))
}
@add << hash
end
end
def get_common_menu
@common = {}
Site.common.select(:url, :key).each do |site|
next if site["url"].to_s.include?("current_user") && !User.current.logged?
@common.merge!("#{site["key"]}": append_http(reset_site_url(site["url"])))
end
end
def get_personal_menu
@personal = []
if User.current.logged?
Site.personal.select(:id, :name, :url, :key).to_a.map(&:serializable_hash).each do |site|
hash = {}
site.each {|k, v|
hash.merge!("#{k}": get_site_url(k, v))
}
@personal << hash
end
end
end
def get_top_system_notification
@top_system_notification = SystemNotification.is_top.first
end
def get_site_url(key, value)
key.to_s === "url" ? append_http(reset_site_url(value)) : reset_site_url(value)
end
def reset_site_url(url)
return url unless url.to_s.include?("current_user")
split_arr = url.split('current_user')
split_arr.length > 1 ? split_arr.join(current_user&.login) : (split_arr << current_user&.login).join('')
end
def append_http(url)
url.to_s.start_with?("http") ? url : [request.protocol, request.host_with_port, url].join('')
end
end

View File

@ -0,0 +1,25 @@
class StatisticController < ApplicationController
# 平台概况
def platform_profile
@platform_user_query = Statistic::PlatformUserQuery.new(params).call
@platform_project_query = Statistic::PlatformProjectQuery.new(params).call
@platform_course_query = Statistic::PlatformCourseQuery.new(params).call
end
# 平台代码提交数据
def platform_code
@platform_pull_request_query = Statistic::PlatformPullRequestQuery.new(params).call
@platform_commit_query = Statistic::PlatformCommitQuery.new(params,current_user).call
end
# 项目案例活跃度排行榜
def active_project_rank
@active_project_rank_query = Statistic::ActiveProjectRankQuery.new(params, current_user).call
end
# 开发者活跃度排行榜
def active_developer_rank
@active_developer_rank_query = Statistic::ActiveDeveloperRankQuery.new(params, current_user).call
end
end

View File

@ -12,11 +12,11 @@ class SyncForgeController < ApplicationController
end
end
# def create
# def create
# ActiveRecord::Base.transaction do
# params.permit!
# sync_params = params[:sync_params]
# project_user = User.where(login: sync_params[:owner_login])&.first
# project_user = User.where(login: sync_params[:owner_login])&.first
# #以前已同步的项目,那么肯定存在仓库
# SyncLog.sync_log("=================begin_to_sync_forge: project_identifier: #{sync_params[:identifier]}========")
# user_projects = Project.where(user_id: project_user.id)
@ -38,7 +38,7 @@ class SyncForgeController < ApplicationController
# check_sync_project(project, sync_params)
# else #新建项目
# SyncLog.sync_log("=================begin_to_create_new_project========")
# project_params = {
# repository_name: sync_params[:identifier],
# user_id: project_user.id,
@ -53,7 +53,7 @@ class SyncForgeController < ApplicationController
# new_project_score = ProjectScore.create(score_params)
# SyncLog.sync_log("=================new_project_score:#{new_project_score.try(:id)}========")
# end
# SyncRepositoryJob.perform_later(sync_params[:owner_login], sync_params[:identifier], sync_params[:repository], get_sudomain) if sync_params[:repository].present?
# check_new_project(project, sync_params)
# else
@ -115,7 +115,7 @@ class SyncForgeController < ApplicationController
# SyncLog.sync_log("=================sync_user_failed====#{e}")
# end
# private
# private
# def check_sync_project(project,sync_params)
# begin
@ -125,8 +125,8 @@ class SyncForgeController < ApplicationController
# # end
# SyncLog.sync_log("----begin_to_check_sync_project----project_id:#{project.id}---------------")
# change_project_score(project, sync_params[:project_score], sync_params[:repository]) if sync_params[:repository].present? #更新project_score
# change_project_issues(project, sync_params[:issues],project.id, gitea_main)
# change_project_score(project, sync_params[:project_score], sync_params[:repository]) if sync_params[:repository].present? #更新project_score
# change_project_issues(project, sync_params[:issues],project.id, gitea_main)
# change_project_members(project, sync_params[:members],gitea_main)
# change_project_versions(project, sync_params[:project_versions],gitea_main)
# change_project_watchers(project, sync_params[:project_watchers],gitea_main)
@ -134,7 +134,7 @@ class SyncForgeController < ApplicationController
# rescue => e
# SyncLog.sync_log("=========check_sync_project_errors:#{e}===================")
# end
# end
# def check_new_project(project,sync_params)
@ -167,7 +167,7 @@ class SyncForgeController < ApplicationController
# parent_id: project.id
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# SyncLog.sync_log("***6. end_to_sync_parises---------------")
# end
# end
@ -189,7 +189,7 @@ class SyncForgeController < ApplicationController
# end
# end
# pre_project_score.save! if change_num > 0 #如果 project_score有变化则更新
# else
# else
# ProjectScore.create!(project_scores.merge(project_id: project.id))
# end
# SyncLog.sync_log("***1. end_to_sync_project_score---------------")
@ -206,7 +206,7 @@ class SyncForgeController < ApplicationController
# SyncLog.sync_log("***2--01. forge_issue_ids-#{forge_issue_ids.size.to_i}--------------")
# if forge_issue_ids.size.to_i <= old_issues_params[:count].to_i
# diff_issue_ids = old_issues_params[:ids] - forge_issue_ids
# if diff_issue_ids.size == 0 #issue数量一样判断评论是否有增减
# forge_journal_ids = Journal.select([:id, :journalized_id, :journalized_type]).where(journalized_id: forge_issue_ids).pluck(:id)
# diff_journal_ids = old_issues_params[:journals][:ids] - forge_journal_ids
@ -241,10 +241,10 @@ class SyncForgeController < ApplicationController
# # }
# # SyncLog.sync_log("***2--03. sync_projects_params_groups-#{sync_projects_params}--------------")
# # SyncProjectsJob.perform_later(sync_projects_params, gitea_main)
# end
# end
# # SyncProjectsJob.perform_later(sync_projects_params, gitea_main) if sync_projects_params.present?
# SyncLog.sync_log("***2. end_to_syncissues---------------")
# rescue Exception => e
@ -265,7 +265,7 @@ class SyncForgeController < ApplicationController
# parent_id: project.id
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# end
# end
# SyncLog.sync_log("***5. begin_to_sync_watchers---------------")
@ -285,7 +285,7 @@ class SyncForgeController < ApplicationController
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# end
# SyncLog.sync_log("***4. end_to_sync_versions---------------")
# end
# end
@ -304,12 +304,12 @@ class SyncForgeController < ApplicationController
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# end
# SyncLog.sync_log("***3. end_to_sync_members---------------")
# end
# end
# def check_token
# def check_token
# sync_params = params[:sync_params]
# unless sync_params[:token] && sync_params[:token] == get_token
# render json: {message: "token_errors"}
@ -331,4 +331,4 @@ class SyncForgeController < ApplicationController
# return gitea_main
# end
end
end

View File

@ -0,0 +1,8 @@
class TemplateMessageSettingsController < ApplicationController
before_action :require_login
def index
@group_settings = TemplateMessageSetting.group(:type).count
end
end

View File

@ -0,0 +1,24 @@
class UserRankController < ApplicationController
# 根据时间获取热门开发者
def index
$redis_cache.zunionstore("recent-days-user-rank", get_timeable_key_names)
@user_rank = $redis_cache.zrevrange("recent-days-user-rank", 0, 3, withscores: true)
rescue Exception => e
@user_rank = []
end
private
# 默认显示7天的
def time
params.fetch(:time, 7).to_i
end
def get_timeable_key_names
names_array = []
(0...time).to_a.each do |i|
date_time_string = (Date.today - i.days).to_s
names_array << "v2-user-rank-#{date_time_string}"
end
names_array
end
end

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