Compare commits

...

695 Commits

Author SHA1 Message Date
starlee 8bfe421eaa fix a typo in README 2021-11-12 09:06:15 +08:00
jasder f2bee32eec Merge pull request 'ADD hompage' (#219) from jasder/forgeplus:standalone into standalone 2021-10-22 14:55:08 +08:00
jasder 21de628c11 FIX 集成平台首页功能 2021-10-22 14:53:09 +08:00
jasder 0fc00da95f Merge pull request 'fix css、icon bug' (#218) from jasder/forgeplus:standalone into standalone 2021-10-22 14:19:45 +08:00
jasder 41022950a5 FIX 解决icon样式问题 2021-10-22 14:17:36 +08:00
jasder a7caca7210 Merge pull request 'FIX 提交前端页面代码' (#217) from jasder/forgeplus:standalone into standalone 2021-10-22 11:56:14 +08:00
jasder d9e4f26819 ADD 前端页面打包文件 2021-10-22 11:52:01 +08:00
jasder 6782380ff7 Merge pull request 'fix merge remote standalone branch' (#216) from jasder/forgeplus:standalone into standalone 2021-10-22 11:19:57 +08:00
jasder 683c00a73e Merge branch 'trustie_server' into standalone 2021-10-22 11:16:30 +08:00
jasder 74a7bc62ea FIX 合并develop分支代码并处理冲突 2021-10-22 11:16:22 +08:00
jasder a5e5dbb6bf Merge branch 'trustie_server' of https://git.trustie.net/Gitlink/forgeplus into trustie_server 2021-10-22 10:52:42 +08:00
jasder da30ba189c Merge pull request '主干分支代码并入生产分支' (#215) from dev_trustie_server into trustie_server 2021-10-21 15:06:40 +08:00
jasder b5047392a6 Merge pull request '合并主干分支代码' (#214) from jasder/forgeplus:dev_trustie_server into dev_trustie_server 2021-10-21 14:45:58 +08:00
jasder 5b19a333ef Merge branch 'develop' into dev_trustie_server 2021-10-21 14:41:43 +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
yystopf 62e8cf76b9 Merge pull request 'ADD 通知公告以及修复bug' (#207) from dev_trustie_server into trustie_server 2021-10-18 18:27:06 +08:00
jasder 33a5b7f4f9 FIX 合并主干分支代码并解决代码冲突 2021-10-18 18:16:12 +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 4567c32b97 Merge pull request 'FIX edit project identifier’s bug' (#201) from dev_trustie_server into trustie_server 2021-10-15 16:57:20 +08:00
jasder 9899a8aab6 Merge pull request 'FIX edit project identifier’s bug' (#200) from develop into dev_trustie_server 2021-10-15 16:56:43 +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 da3625a0a8 Merge pull request 'FIX 项目动态数据修复以及 Pr项目链接错误的bug' (#198) from dev_trustie_server into trustie_server 2021-10-15 16:32:49 +08:00
jasder 6f5f42c23a Merge pull request 'FIX dev_trustie_server 远程仓库pr' (#197) from jasder/forgeplus:dev_trustie_server into dev_trustie_server 2021-10-15 16:22:02 +08:00
jasder 3c44ffe7df Merge remote-tracking branch 'gitlink/dev_trustie_server' into dev_trustie_server 2021-10-15 16:13:45 +08:00
jasder 4ebb6a5e74 Merge branch 'develop' into dev_trustie_server 2021-10-15 16:09:48 +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
jasder 5cbe83f9d4 Merge pull request 'FIX WIP' (#192) from dev_trustie_server into trustie_server 2021-10-14 18:13:26 +08:00
jasder 7030e0b5bc Merge pull request 'FIX some bug' (#191) from develop into dev_trustie_server 2021-10-14 18:12:36 +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 01377bc20a Merge pull request 'FIX 修复pr链接问题' (#189) from dev_trustie_server into trustie_server 2021-10-14 15:41:46 +08:00
jasder 976c4b26c3 Merge pull request 'FIX 修复Pr链接错误问题' (#188) from develop into dev_trustie_server 2021-10-14 15:41:06 +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 d5e9005253 Merge branch 'trustie_server' of https://git.trustie.net/Gitlink/forgeplus into trustie_server 2021-10-12 18:40:05 +08:00
jasder f01bfe6435 Merge pull request 'Merge' (#181) from dev_trustie_server into trustie_server 2021-10-12 18:39:48 +08:00
jasder 1f451779de Merge pull request 'FIX' (#180) from develop into dev_trustie_server 2021-10-12 18:38:58 +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 c4c3a451c8 Merge branch 'trustie_server' of https://git.trustie.net/jasder/forgeplus into trustie_server 2021-10-12 14:18:19 +08:00
jasder ac6aa7559d Merge pull request 'FIX 合并测试版分支的代码' (#177) from dev_trustie_server into trustie_server 2021-10-12 14:12:33 +08:00
jasder 829e36cfce Merge pull request 'FIX remote pr' (#176) from jasder/forgeplus:dev_trustie_server into dev_trustie_server 2021-10-12 14:09:05 +08:00
jasder fb73fa458c Merge pull request 'FIX 解决合并请求中链接地址错误的问题' (#2) from dev_trustie_server into trustie_server 2021-10-12 14:06:20 +08:00
jasder 7c8843fda7 Merge branch 'develop' into dev_trustie_server 2021-10-12 14:02:33 +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 40654061ce Merge pull request 'FiX 发布生产版本' (#173) from dev_trustie_server into trustie_server 2021-10-09 16:17:27 +08:00
jasder 3325ec842d Merge pull request 'FIX 代码库二级页面改版以及其他bug' (#172) from develop into dev_trustie_server 2021-10-09 16:15:12 +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
jasder 194a2f4e36 Merge pull request 'FIX user info bug' (#166) from dev_trustie_server into trustie_server 2021-09-29 11:43:29 +08:00
yystopf 520b0ef1be fix: release creator token 2021-09-29 11:43:04 +08:00
jasder bd1cd7ee13 Merge pull request 'FIX user complete bug' (#165) from develop into dev_trustie_server 2021-09-29 11:42:48 +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 fdbc657846 Merge pull request 'add 通知系统模块功能' (#163) from dev_trustie_server into trustie_server 2021-09-28 16:44:29 +08:00
jasder 317205d185 Merge branch 'develop' into dev_trustie_server 2021-09-28 15:59:51 +08:00
jasder a825271a36 FIX code bug 2021-09-28 15:59:36 +08:00
jasder 14949c0bfd ADD 通知系统模块代码 2021-09-28 15:59:06 +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 0cbfc895ca Merge pull request 'FIX 修复修改组织信息后导致不能创建项目的bug' (#152) from dev_trustie_server into trustie_server 2021-09-10 22:52:12 +08:00
jasder 2fab120118 Merge pull request 'FIX 修复修改组织信息后导致不能创建项目的bug' (#151) from develop into dev_trustie_server 2021-09-10 22:51:18 +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 629729436c Merge pull request 'FIX 优化创建项目流程' (#149) from dev_trustie_server into trustie_server 2021-09-10 19:03:26 +08:00
jasder 00ed177089 Merge pull request 'FIX bug' (#148) from develop into dev_trustie_server 2021-09-10 18:32:08 +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 26c0d36227 Merge pull request 'FIX 优化项目流程' (#146) from develop into dev_trustie_server 2021-09-10 18:28:36 +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 86c98a1716 Merge pull request '发布V3.1.0版本' (#139) from dev_trustie_server into trustie_server 2021-09-03 18:16:51 +08:00
jasder 143e88593f Merge pull request 'FIX 路由优化' (#138) from develop into dev_trustie_server 2021-09-03 17:55:43 +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 99e3aaf780 Merge pull request 'merge dev_trustie_server' (#134) from dev_trustie_server into trustie_server 2021-09-01 19:02:51 +08:00
jasder 7d12a25088 Merge pull request 'FIX commit user info' (#133) from develop into dev_trustie_server 2021-09-01 19:01:22 +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 85d1aa3a85 Merge pull request 'fix release v3.2.0' (#129) from dev_trustie_server into trustie_server 2021-08-27 15:28:22 +08:00
jasder 0f57844106 Merge pull request 'FIX some bug' (#128) from develop into dev_trustie_server 2021-08-27 15:12:27 +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 c3b9d2e0b5 ADD wiki模块功能 2021-08-24 18:17:34 +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 299e8534d1 Merge branch 'develop' into dev_trustie_server 2021-08-19 17:48:31 +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 d7362925f2 Merge branch 'dev_trustie_server' into trustie_server 2021-08-06 17:24:02 +08:00
jasder 43945b00b8 Merge branch 'dev_trustie_server' of https://git.trustie.net/jasder/forgeplus into dev_trustie_server 2021-08-06 17:20:44 +08:00
jasder b11d515ec6 Merge branch 'develop' into dev_trustie_server 2021-08-06 17:20:30 +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 07a38ac3f7 Merge branch 'develop' into dev_trustie_server 2021-07-30 18:12:19 +08:00
yystopf 18227c232b Merge branch 'develop' into trustie_server 2021-07-30 18:10:31 +08:00
yystopf eb56c34c41 fix: fork repo gpid is nil 2021-07-30 18:08:59 +08:00
jasder f1d79e4d9f Merge branch 'trustie_server' of https://git.trustie.net/jasder/forgeplus into trustie_server 2021-07-30 17:08:42 +08:00
jasder 20e2e22be5 Merge branch 'dev_trustie_server' into trustie_server 2021-07-30 17:08:23 +08:00
jasder 27e5febef2 Merge branch 'develop' into dev_trustie_server 2021-07-30 17:04:21 +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 fb23e733d6 Merge branch 'develop' into dev_trustie_server 2021-07-23 17:23:45 +08:00
yystopf 512bff426d Merge branch 'develop' into trustie_server 2021-07-23 17:23:29 +08:00
yystopf 8905f60265 fix: gitea url contain chinese 2021-07-23 17:23:01 +08:00
yystopf 671c2c2257 Merge branch 'develop' into trustie_server 2021-07-23 14:53:18 +08:00
yystopf c6f2021017 Merge branch 'develop' into dev_trustie_server 2021-07-23 14:53:06 +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
jasder 581b147b3c Merge branch 'dev_trustie_server' of https://git.trustie.net/jasder/forgeplus into dev_trustie_server 2021-07-23 14:16:43 +08:00
jasder deebfc3292 fix merge develop branch 2021-07-23 14:16:29 +08:00
yystopf 6c4d17bed8 Merge branch 'develop' into trustie_server 2021-07-22 18:31:44 +08:00
yystopf e68c13f1a2 Merge branch 'develop' into dev_trustie_server 2021-07-22 18:30:59 +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 15eb1f4a17 Merge branch 'develop' into dev_trustie_server 2021-07-21 21:32:38 +08:00
yystopf a1cb9a11d6 Merge branch 'develop' into trustie_server 2021-07-21 21:32:18 +08:00
yystopf e4fda9243b fix: create project add login 2021-07-21 09:43:35 +08:00
yystopf 0884a0de1b Merge branch 'develop' into dev_trustie_server 2021-07-16 16:46:28 +08:00
yystopf 900fdd2691 Merge branch 'develop' into trustie_server 2021-07-16 16:46:08 +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 4520055de2 Merge branch 'dev_trustie_server' into trustie_server 2021-07-12 18:38:03 +08:00
viletyy 193d1b21df Merge branch 'develop' into dev_trustie_server 2021-07-12 18:10:50 +08:00
viletyy de2b54c39e add: compare code return can merge status 2021-07-12 18:10:26 +08:00
viletyy ed8e079595 Merge branch 'develop' into dev_trustie_server 2021-07-12 17:57:51 +08:00
viletyy 4929734a1a fix 2021-07-12 17:57:42 +08:00
viletyy 55a0bcfb82 fix 2021-07-12 17:33:10 +08:00
viletyy 8f1aa3f4b1 fix: merge from develop 2021-07-12 17:28:47 +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 b054094798 FIX conflicts 2021-07-12 16:20:14 +08:00
jasder 2d648e516e FIX merge develop branch 2021-07-12 16:19:03 +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
yystopf 7c23b40661 易修权限、用户更改昵称、fork项目修改项目私有性 2021-07-09 13:55:22 +08:00
viletyy ff21916f18 fix: merge from develop 2021-07-09 13:48:48 +08:00
viletyy d9162cb3bf fix: merge from develop 2021-07-09 13:47:21 +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
jasder ca1fd3cd4f FIX 解决标签列表和发行版列表中下周zip包、tar包导致的404问题 2021-07-01 16:57:52 +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 913bc45a9f Merge branch 'dev_trustie_server' of https://git.trustie.net/jasder/forgeplus into dev_trustie_server 2021-07-01 10:09:28 +08:00
jasder 8131d8cd48 Merge branch 'sync_develop' into dev_trustie_server 2021-07-01 10:08:58 +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
viletyy b45ab12279 Merge branch 'dev_trustie_server' into trustie_server 2021-06-28 21:11:13 +08:00
viletyy 259090b8e3 fix 2021-06-28 21:07:10 +08:00
jasder c3bc4166d9 FIX pr bug
ADD conflict files list
2021-06-28 10:09:40 +08:00
jasder 7e474cab70 Merge branch 'feature/pull_conflict_files' into dev_trustie_server 2021-06-28 10:06:54 +08:00
jasder 01341d4389 FIX pull、 gitea pull model relation bug 2021-06-28 10:04:48 +08:00
jasder 3a475a4674 FIX get conflict files bug with create pr api 2021-06-28 09:59:47 +08:00
jasder 7b27ed71ca FIX 易修详情返回用户操作权限 2021-06-25 18:47:36 +08:00
jasder 83b7b8cd9c Merge branch 'develop' into dev_trustie_server 2021-06-25 18:03:28 +08:00
jasder c298ff02b8 ADD pr冲突文件展示 2021-06-25 18:03:07 +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
jasder 16ea03dcc8 fix 修复一些bug
* 解决获取平台base url导致的https的问题
* FIX 处理版本库zip、gzip包链接为无效的问题
2021-06-22 16:49:20 +08:00
vilet.yy 4126ea7b4e fix: some bug from security 2021-06-22 15:54:42 +08:00
jasder 7bb4cf7391 Merge branch 'develop' into dev_trustie_server 2021-06-22 15:15:51 +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 23f7439a8c Merge branch 'develop' into dev_trustie_server 2021-06-22 09:51:46 +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 6f19093dc2 FIX merge develop flick 2021-06-18 17:23:48 +08:00
jasder fa8f1155f5 V3.1.0
* 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:03:27 +08:00
jasder 484f8a854a Merge branch 'develop' into dev_trustie_server 2021-06-18 16:45:12 +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 7bedac263d Merge branch 'develop' into dev_trustie_server 2021-06-18 16:21:21 +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 f0b1c9e80b Merge branch 'develop' into dev_trustie_server 2021-06-18 11:03:41 +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 dc23be9001 Merge branch 'develop' into dev_trustie_server 2021-06-18 10:54:29 +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 e24269c2a7 Merge branch 'develop' into dev_trustie_server 2021-06-17 18:14:19 +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 e31176c696 ADD 项目邀请码功能 2021-06-11 18:13:33 +08:00
jasder bf390c8366 Merge branch 'develop' into dev_trustie_server 2021-06-11 18:03:35 +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
jasder fc60278f9a FIX * ENHANCEMENTS
* ADD 用户活动统计图表功能
  * ADD 用户精选项目功能
  * ADD 用户贡献度统计图表功能
  * ADD 用户开发能力数据统计工
  * ADD 用户角色定位展示功能
  * ADD 用户专业定位标签展示功能
  * ADD 修改用户基本资料功能
  * ADD 更改密码功能
  * ADD 用户个人主页基本现在展示可配置功能

* BUGFIXES
  * Fix 解决一些bug
  * Fix 优化美化页面change license
2021-06-09 17:52:57 +08:00
jasder b59376d3e3 Merge branch 'master' into standalone 2021-06-09 17:49:52 +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 632a06e575 Merge branch 'develop' into dev_trustie_server 2021-06-08 18:13:16 +08:00
jasder 8831345fd2 搜索无法匹配昵称用户、用户画像开发能力缓存数据 2021-06-08 18:11:41 +08:00
jasder 04c7887319 Merge branch 'sync_develop' into dev_trustie_server 2021-06-08 14:34:29 +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 b012740195 ADD 升级改版个人中心模块功能 2021-06-04 19:10:07 +08:00
jasder d75b79670d Merge branch 'develop' into dev_trustie_server 2021-06-04 18:51:47 +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 0f79238f0e 解决镜像加速器失效问题 2021-06-03 17:29:37 +08:00
jasder 2c5fa8492f Merge branch 'develop' into dev_trustie_server 2021-06-03 17:26:35 +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 fdfbf505ed ADD issue、pull、milestone钩子,自动触发项目的更新时间 2021-05-26 17:52:30 +08:00
jasder 6d845eeb3b Merge branch 'develop' into dev_trustie_server 2021-05-26 17:39:54 +08:00
jasder 77076c60a6 ADD issue、pull、milestone钩子,自动触发项目的更新时间 2021-05-26 17:37:13 +08:00
jasder a7695b16a4 FIX query project members api bug 2021-05-24 17:08:03 +08:00
jasder 83e666a387 Merge branch 'develop' into dev_trustie_server 2021-05-24 17:06:54 +08:00
jasder e716dba249 FIX query project members api bug 2021-05-24 17:05:06 +08:00
jasder 1a0fd38d15 发布v3.0.4版本 2021-05-24 10:18:57 +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 5eaaf0070f FIX update CHANGELOG.md 2021-05-24 10:13:14 +08:00
jasder aeeaedbd7a Merge branch 'develop' into standalone 2021-05-24 10:11:02 +08:00
jasder 6d1bcabd51 Merge branch 'master' of https://git.trustie.net/jasder/forgeplus 2021-05-24 10:10:24 +08:00
jasder 72b89d4b2b Merge branch 'develop' into dev_trustie_server 2021-05-21 19:26:47 +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 b0b224fe76 Merge branch 'trustie_server' of https://git.trustie.net/jasder/forgeplus into trustie_server 2021-05-15 10:21:03 +08:00
jasder 38f6254edc Merge branch 'develop' into dev_trustie_server 2021-05-15 10:20:14 +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 57d9da002e ADD 页面置顶等功能 2021-05-14 17:57:48 +08:00
jasder 8a4b0ba966 Merge branch 'develop' into dev_trustie_server 2021-05-14 17:34:36 +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 84927c2361 FIX 解决大赛中点击项目跳转到forge平台,保持自动登陆的bug 2021-05-13 11:47:47 +08:00
jasder b568ac4e97 ADD title 2021-05-12 17:48:05 +08:00
jasder 91bbb58d4f FIX delete input readonly 2021-05-12 17:44:45 +08:00
jasder f278b38e6c Merge branch 'trustie_server' into dev_trustie_server 2021-05-12 17:01:59 +08:00
jasder 4023b8980e FIX 完善通过大赛点击项目链接自动注册关联Educoder平台账号的功能 2021-05-12 17:01:30 +08:00
jasder 1c1be18151 Merge branch 'dev_trustie_server' into trustie_server 2021-05-10 14:39:14 +08:00
jasder e5f591e509 Merge branch 'develop' into dev_trustie_server 2021-05-10 14:38:58 +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 60b22b3912 Merge develop 2021-05-08 18:16:45 +08:00
jasder 86f03ffafc Merge OK 2021-05-08 17:46:22 +08:00
yystopf 27ee32054b 发布v3.0.3版本 2021-05-08 17:45:23 +08:00
jasder 3e3fd46cad Merge branch 'develop' into dev_trustie_server 2021-05-08 17:02:56 +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 7a752b177d Merge branch 'develop' into dev_trustie_server 2021-05-08 14:23:34 +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 abbabfdefd Merge branch 'dev_trustie_server' into trustie_server 2021-04-30 17:13:33 +08:00
jasder edd76b9286 Merge branch 'develop' into dev_trustie_server 2021-04-30 17:13:18 +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 a3ca94d433 Merge branch 'dev_trustie_server' into trustie_server 2021-04-29 23:23:55 +08:00
jasder 91a804caf7 Merge branch 'develop' into dev_trustie_server 2021-04-29 23:23:42 +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 663deae21b Merge branch 'dev_trustie_server' into trustie_server 2021-04-29 23:19:34 +08:00
jasder dae5c9690f Merge branch 'develop' into dev_trustie_server 2021-04-29 23:19:17 +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 e65df07d79 Merge branch 'dev_trustie_server' into trustie_server 2021-04-29 19:27:55 +08:00
jasder 246b6b52ec Merge branch 'develop' into dev_trustie_server 2021-04-29 19:27:36 +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 b9789183e3 Merge branch 'dev_trustie_server' into trustie_server 2021-04-29 19:17:03 +08:00
jasder 7cf2c6021f Merge branch 'develop' into dev_trustie_server 2021-04-29 19:13:12 +08:00
jasder e87413f8a0 FIX migrate repo api bug 2021-04-29 19:12:48 +08:00
jasder e0f9a3d43d Merge branch 'develop' into dev_trustie_server 2021-04-29 18:50:11 +08:00
jasder 0133ec24ca FIX pr merge bug 2021-04-29 18:48:54 +08:00
jasder c1ef39b262 Merge branch 'develop' into dev_trustie_server 2021-04-29 18:37:35 +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 51643dc02c Merge branch 'dev_trustie_server' into trustie_server 2021-04-29 10:42:12 +08:00
jasder a078c07b59 Merge branch 'develop' into dev_trustie_server 2021-04-29 10:41:59 +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 b984790d5c Merge branch 'develop' into trustie_server 2021-04-28 21:17:43 +08:00
jasder 876591100e Merge branch 'develop' into dev_trustie_server 2021-04-28 21:17:36 +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 ba9848ebe7 Merge branch 'develop' into dev_trustie_server 2021-04-27 18:24:41 +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 41c621cf55 Merge branch 'develop' into dev_trustie_server 2021-04-26 16:53:05 +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 09ac49dda5 Merge branch 'develop' into dev_trustie_server 2021-04-26 16:46:24 +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 b161b66d79 Merge branch 'develop' into standalone 2021-04-23 17:55:42 +08:00
jasder 341a810afc Merge branch 'develop' into dev_trustie_server 2021-04-23 17:54:13 +08:00
jasder 8c71a72fce FIX code bug 2021-04-23 17:53:59 +08:00
jasder 2282c52efb FIX update README.md 2021-04-23 17:33:19 +08:00
jasder ee7acaaa82 FIX update README.md 2021-04-23 17:32:45 +08:00
jasder 34edd78ae7 Merge branch 'develop' into dev_trustie_server 2021-04-23 17:21:34 +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 8a536e83af FIX update CHANGELOG.md 2021-04-23 17:08:04 +08:00
jasder 016cf648da FIX merge develop 2021-04-23 17:07:46 +08:00
jasder 713e0bba18 Merge branch 'develop' into standalone 2021-04-23 16:18:31 +08:00
jasder 36fb5a118c Merge branch 'develop' into dev_trustie_server 2021-04-23 14:40:41 +08:00
jasder aa314c141c ADD some url with in hovercoard api 2021-04-23 14:40:26 +08:00
jasder b756be1d6a Merge branch 'develop' into dev_trustie_server 2021-04-22 18:10:32 +08:00
jasder 37e1704897 ADD location column for user hovercard api 2021-04-22 18:10:20 +08:00
jasder 348c2244f7 Merge branch 'develop' into dev_trustie_server 2021-04-22 16:45:40 +08:00
jasder ddacf2a733 FIX get organzition's name bug 2021-04-22 16:45:26 +08:00
jasder 31738fc227 Merge branch 'develop' into dev_trustie_server 2021-04-22 16:43:04 +08:00
jasder d07543111a FIX code bug 2021-04-22 16:42:50 +08:00
jasder a93c98fb7c Merge branch 'trustie_server' into dev_trustie_server 2021-04-22 16:39:03 +08:00
jasder 39193324e9 Merge branch 'develop' into dev_trustie_server 2021-04-22 16:38:58 +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 81743ce3bc Merge branch 'develop' into trustie_server 2021-04-20 19:07:56 +08:00
jasder 6a3d297b30 FIX code bug 2021-04-20 19:07:48 +08:00
jasder e9ae536f04 Merge branch 'develop' into trustie_server 2021-04-20 19:06:40 +08:00
jasder 002c773746 FIX code bug 2021-04-20 19:06:31 +08:00
jasder 186955fe4a Merge branch 'develop' into trustie_server 2021-04-20 18:58:24 +08:00
jasder 45f05c9fc4 FIX render commmiter and author avatar bug 2021-04-20 18:58:14 +08:00
jasder 8ce7fd95cb Merge branch 'develop' into trustie_server 2021-04-20 18:37:55 +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 0867e5130f Merge branch 'dev_trustie_server' into trustie_server 2021-04-20 11:37:25 +08:00
jasder db476a1a9b Merge branch 'develop' into dev_trustie_server 2021-04-20 11:37:08 +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
jasder fa1fd8a4ba Merge branch 'develop' into trustie_server 2021-04-19 20:39:29 +08:00
jasder 0d7a11f3ab Merge branch 'develop' into dev_trustie_server 2021-04-19 18:41:18 +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 879e45e106 Merge branch 'develop' into trustie_server 2021-04-13 16:40:23 +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 b3b0f75e9b Merge branch 'develop' into trustie_server 2021-04-13 10:18:52 +08:00
jasder 3af75e1a1c FIX merge develop branch 2021-04-13 10:18:35 +08:00
jasder dcd4457cf5 FIX 开放平台管理员可以访问所有团队信息 2021-04-13 10:16:18 +08:00
jasder 5c8e561bd8 Merge branch 'develop' into trustie_server 2021-04-08 18:36:27 +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 0852d0ac61 Merge branch 'standalone' of https://git.trustie.net/jasder/forgeplus into standalone 2021-04-01 20:33:42 +08:00
jasder ee5090de96 Merge branch 'develop' into standalone 2021-04-01 20:33:26 +08:00
jasder 37005342ab ADD friste register user set admin role 2021-03-31 15:28:23 +08:00
jasder 9591c0a82a Merge branch 'develop' into standalone 2021-03-31 15:02:26 +08:00
jasder ffee782591 Merge branch 'develop' into standalone 2021-03-31 13:35:59 +08:00
jasder c55c04b137 Merge branch 'standalone' of https://git.trustie.net/jasder/forgeplus into standalone 2021-03-31 12:45:09 +08:00
jasder 049e5a6d5f Merge branch 'develop' into standalone 2021-03-31 12:44:52 +08:00
jasder be6bb690d2 FIX models schema 2021-03-31 11:21:36 +08:00
jasder 7c2aa2209d delete helps sidebar 2021-03-31 11:21:09 +08:00
jasder a56ee23224 update db structrue 2021-03-31 11:20:42 +08:00
jasder fc95fe9b82 Merge branch 'develop' into standalone 2021-03-31 10:30:57 +08:00
jasder 838fd8b4c9 Merge branch 'develop' into standalone 2021-03-31 10:08:53 +08:00
jasder 8ca1311626 FIX delete generate api doc 2021-03-30 15:20:23 +08:00
jasder 869750e774 FIX delete readme for create gitea repo 2021-03-30 14:19:42 +08:00
1490 changed files with 134623 additions and 22968 deletions

8
.gitignore vendored
View File

@ -36,13 +36,12 @@ public/react/yarn.lock
/.idea/*
# Ignore react node_modules
public/react/*
public/system/*
/public/react/.cache
/public/react/node_modules/
/public/react/config/stats.json
/public/react/stats.json
/public/react/.idea/*
/public/react/build/*
/public/h5build
/public/npm-debug.log
@ -73,6 +72,7 @@ vendor/bundle/
/log
/public/admin
/mysql_data
/public/repo/
.generators
@ -82,4 +82,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);

View File

@ -1,4 +1,107 @@
# 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

View File

@ -126,3 +126,5 @@ gem 'request_store'
gem 'harmonious_dictionary', '~> 0.0.1'
gem 'parallel', '~> 1.19', '>= 1.19.1'
gem 'letter_avatar'

View File

@ -162,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)
@ -175,7 +176,9 @@ GEM
mimemagic (~> 0.3.2)
maruku (0.7.3)
method_source (0.9.2)
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)
@ -456,6 +459,7 @@ DEPENDENCIES
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

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.

View File

@ -21,7 +21,7 @@ Trustie (确实)是一个以大众化协同开发、开放式资源共享、
* Redis 5+
* NodeJS > 13.0.0
* imagemagick
### Steps
@ -65,7 +65,7 @@ default: &default
**因目前gitea平台api受限暂时推荐从forge平台获取gitea部署文件进行部署https://forgeplus.trustie.net/projects/Trustie/gitea-binary**
#### 配置gitea服务步骤
**配置gitea服务步骤**
1. 部署gitea服务并注册root账户
2. 修改forge平台的 config/configuration.yml中的gitea服务指向地址
@ -80,60 +80,64 @@ gitea:
#### 6. 安装redis环境
**请自行搜索各平台如何安装部署redis环境**
#### 7. 安装imagemagick插件
- Mac OS X
```bash
brew install imagemagick ghostscript
```
#### 7. 创建数据库
- Linux
```bash
sudo apt-get install -y imagemagick
```
#### 8. 创建数据库
**开发环境为development 生成环境为production**
```bash
rails db:create RAILS_ENV=development
```
#### 8. 导入数据表结构
#### 9. 导入数据表结构
```bash
bundle exec rake sync_table_structure:import_csv
```
#### 9. 执行migrate迁移文件
#### 10. 执行migrate迁移文件
**开发环境为development 生成环境为production**
```bash
rails db:migrate RAILS_ENV=development
```
#### 10. clone前端代码
#### 11. clone前端代码
**将前端代码克隆到public/react目录下目录结构应该是: public/react/build**
```bash
git clone -b standalone https://git.trustie.net/jasder/build.git
```
#### 11. 启动redis(此处已mac系统为例)
#### 12. 启动redis(此处以macOS系统为例)
```bash
redis-server&
```
#### 12. 启动sidekiq
#### 13. 启动sidekiq
**开发环境为development 生成环境为production**
```bash
bundle exec sidekiq -C config/sidekiq.yml -e production -d
```
#### 13. 启动rails服务
#### 14. 启动rails服务
```bash
rails s
```
#### 14. 浏览器访问
在浏览器中输入如下地址访问:
```bash
http://localhost:3000/
```
#### 15. 浏览器访问
在浏览器中输入如下地址访问:
```bash
http://localhost:3000/
```
#### 15. 其他说明
#### 16. 其他说明
通过页面注册都第一个用户为平台管理员用户
## 页面展示

View File

@ -338,10 +338,10 @@ http://localhost:3000/api/projects/ | jq
|-|-|-|-|
|user_id |是|int |用户id或者组织id |
|name |是|string |项目名称 |
|description ||string |项目描述 |
|description ||string |项目描述 |
|repository_name |是|string |仓库名称, 只含有数字、字母、下划线不能以下划线开头和结尾,且唯一 |
|project_category_id||int |项目类别id |
|project_language_id||int |项目语言id |
|project_category_id||int |项目类别id |
|project_language_id||int |项目语言id |
|ignore_id |否|int |gitignore相关id |
|license_id |否|int |开源许可证id |
|private |否|boolean|项目是否私有, true为私有false: 公开,默认为公开 |
@ -374,9 +374,7 @@ curl -X POST \
-d "user_id=36408" \
-d "clone_addr=https://gitea.com/mx8090alex/golden.git" \
-d "name=golden_mirror1" \
-d "description=golden_mirror" \
-d "project_category_id=1" \
-d "project_language_id=2" \
-d "repository_name=golden_mirror1" \
http://localhost:3000/api/projects/migrate.json | jq
```
*请求参数说明:*
@ -388,8 +386,8 @@ http://localhost:3000/api/projects/migrate.json | jq
|clone_addr |是|string |镜像项目clone地址 |
|description |否|string |项目描述 |
|repository_name |是|string |仓库名称, 只含有数字、字母、下划线不能以下划线开头和结尾,且唯一 |
|project_category_id||int |项目类别id |
|project_language_id||int |项目语言id |
|project_category_id||int |项目类别id |
|project_language_id||int |项目语言id |
|is_mirror |否|boolean|是否设置为镜像, true false默认为否 |
|auth_username |否|string|镜像源仓库的登录用户名 |
|auth_password |否|string|镜像源仓库的登录秘密 |

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

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

@ -9,6 +9,7 @@ class AccountsController < ApplicationController
# 其他平台同步注册的用户
def remote_register
username = params[:username]&.gsub(/\s+/, "")
tip_exception("无法使用以下关键词:#{username},请重新命名") if ReversedKeyword.is_reversed(username).present?
email = params[:email]&.gsub(/\s+/, "")
password = params[:password]
platform = (params[:platform] || 'forge')&.gsub(/\s+/, "")
@ -141,7 +142,9 @@ class AccountsController < ApplicationController
code = generate_identifier User, 8, pre
login = pre + code
@user = User.new(admin: false, login: login, mail: email, phone: phone, type: "User")
is_admin = !User.exists?(type: 'User')
@user = User.new(admin: is_admin, login: login, mail: email, phone: phone, type: "User")
@user.password = params[:password]
# 现在因为是验证码,所以在注册的时候就可以激活
@user.activate
@ -154,6 +157,11 @@ class AccountsController < ApplicationController
@user.gitea_token = result['sha1']
@user.gitea_uid = gitea_user[:body]['id']
if @user.save!
# set user for admin role
if @user.admin?
sync_params = { email: @user.mail, admin: true }
Gitea::User::UpdateInteractor.call(@user.login, sync_params)
end
UserExtension.create!(user_id: @user.id)
successful_authentication(@user)
normal_status("注册成功")
@ -169,6 +177,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?
@ -195,6 +204,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
@ -345,4 +373,7 @@ class AccountsController < ApplicationController
params.require(:user).permit(:login, :email, :phone)
end
def account_params
params.require(:account).permit(:login, :password)
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

@ -33,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
@ -48,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

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

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,9 +1,8 @@
class Admins::ProjectsController < Admins::BaseController
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)

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

@ -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
@ -246,6 +246,14 @@ 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)
@ -272,7 +280,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
@ -614,8 +622,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"
@ -753,10 +761,10 @@ class ApplicationController < ActionController::Base
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
@ -769,6 +777,31 @@ class ApplicationController < ActionController::Base
@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")

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

@ -32,8 +32,17 @@ class AttachmentsController < ApplicationController
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

View File

@ -6,26 +6,48 @@ class CompareController < ApplicationController
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
base, head = compare_params
# TODO: 处理fork的项目向源项目发送PR的base、head参数问题
@compare_result ||=
head.include?(":") ? gitea_compare(base, head) : gitea_compare(head, base)
@head.include?(":") ? gitea_compare(@base, @head) : gitea_compare(@head, @base)
end
def compare_params
base = Addressable::URI.unescape(params[:base])
head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head]
def load_compare_params
@base = Addressable::URI.unescape(params[:base])
@head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head]
[base, head]
end
def gitea_compare(base, head)
Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, 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

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

@ -31,7 +31,7 @@ module RegisterHelper
result
end
def autosync_register_trustie(username, password, email)
def autosync_register_trustie(username, password, email, lastname="")
config = Rails.application.config_for(:configuration).symbolize_keys!
api_host = config[:sync_url]
@ -42,8 +42,9 @@ module RegisterHelper
sync_json = {
"mail": email,
"password": password,
"login": username
}
"login": username,
"lastname": lastname
}.compact
uri = URI.parse(url)
if api_host

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

@ -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,8 +1,11 @@
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]
@ -12,16 +15,19 @@ class IssuesController < ApplicationController
include TagChosenHelper
def index
return render_not_found unless @project.has_menu_permission("issues")
@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)
@ -101,51 +107,48 @@ class IssuesController < ApplicationController
end
def create
if params[:subject].blank?
normal_status(-1, "标题不能为空")
elsif params[:subject].to_s.size > 255
normal_status(-1, "标题不能超过255个字符")
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
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
attachment.author_id = current_user.id
attachment.description = ""
attachment.save
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[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create!(issue_id: @issue.id, issue_tag_id: tag)
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")
render json: {status: 0, message: "创建成", id: @issue.id}
else
normal_status(-1, "创建失败")
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
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")
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
@ -157,6 +160,7 @@ class IssuesController < ApplicationController
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|
@ -199,8 +203,28 @@ class IssuesController < ApplicationController
normal_status(-1, "不允许修改为关闭状态")
else
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!
@ -219,16 +243,19 @@ class IssuesController < ApplicationController
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)
@issue.create_journal_detail(change_files, issue_files, issue_file_ids, current_user&.id) if @issue.previous_changes.present?
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
@ -249,6 +276,7 @@ class IssuesController < ApplicationController
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)
@ -268,8 +296,12 @@ class IssuesController < ApplicationController
def clean
#批量删除,暂时只能删除未悬赏的
issue_ids = params[:ids]
if issue_ids.present?
if Issue.where(id: issue_ids, issue_type: "1").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, "删除失败")
@ -299,9 +331,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, "批量更新失败")
@ -313,7 +364,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|
@ -391,25 +445,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 = []
@ -489,4 +547,8 @@ class IssuesController < ApplicationController
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, only: [:create]
before_action :set_issue
before_action :check_issue_permission
before_action :set_journal, only: [:destroy, :edit, :update]

View File

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

@ -61,6 +61,7 @@ class OauthController < ApplicationController
login = params[:login]
email = params[:mail]
password = params[:password]
lastname = params[:lastname]
callback_url = params[:callback_url]
platform = params[:plathform] || 'educoder'
@ -72,8 +73,11 @@ class OauthController < ApplicationController
if result[:message].blank?
logger.info "[Oauth educoer] ====auto_register success"
user = User.find result[:user][:id]
successful_authentication(user)
user.update_column(:lastname, params[:lastname])
autosync_register_trustie(login, password, email, lastname)
OpenUsers::Educoder.create!(user: user, uid: user.login)
successful_authentication(user)
render json: { callback_url: callback_url }
# redirect_to callback_url

View File

@ -17,11 +17,12 @@ class Organizations::BaseController < ApplicationController
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
@team.team_users.where(user_id: current_user.id).blank? && !@organization.is_owner?(current_user.id)
!current_user&.admin? && @team.team_users.where(user_id: current_user.id).blank? && !@organization.is_owner?(current_user.id)
end
def user_mark
@ -31,4 +32,4 @@ class Organizations::BaseController < ApplicationController
def project_mark
params[:repo_name] || params[:id]
end
end
end

View File

@ -5,7 +5,7 @@ class Organizations::OrganizationUsersController < Organizations::BaseController
def index
@organization_users = @organization.organization_users.includes(:user)
search = params[:search].to_s.downcase
@organization_users = @organization_users.joins(:user).where("LOWER(CONCAT_WS(users.lastname, users.firstname, users.login, users.mail)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present?
@organization_users = @organization_users.joins(:user).merge(User.like(search))
@organization_users = kaminari_paginate(@organization_users)
end

View File

@ -1,5 +1,6 @@
class Organizations::OrganizationsController < Organizations::BaseController
before_action :require_login, except: [:index, :show]
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]
@ -25,6 +26,8 @@ class Organizations::OrganizationsController < Organizations::BaseController
def create
ActiveRecord::Base.transaction do
tip_exception("无法使用以下关键词:#{organization_params[:name]},请重新命名") if ReversedKeyword.is_reversed(organization_params[:name]).present?
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
@ -35,11 +38,13 @@ class Organizations::OrganizationsController < Organizations::BaseController
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!
@organization.organization_extension.update_attributes!(organization_params.except(:name, :nickname))
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
@ -60,26 +65,14 @@ class Organizations::OrganizationsController < Organizations::BaseController
tip_exception(e.message)
end
private
def convert_image!
return unless params[:image].present?
max_size = EduSetting.get('upload_avatar_max_size') || 2 * 1024 * 1024 # 2M
if params[:image].class == ActionDispatch::Http::UploadedFile
@image = params[:image]
render_error('请上传文件') if @image.size.zero?
render_error('文件大小超过限制') if @image.size > max_size.to_i
else
image = params[: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)
def recommend
recommend = %W(xuos Huawei_Technology openatom_foundation pkecosystem TensorLayer)
@organizations = Organization.with_visibility(%w(common))
.where(login: recommend).select(:id, :login, :firstname, :lastname, :nickname)
end
def avatar_path(organization)
ApplicationController.helpers.disk_filename(organization.class, organization.id)
end
private
def organization_params
params.permit(:name, :description, :website, :location,
@ -98,11 +91,25 @@ class Organizations::OrganizationsController < Organizations::BaseController
end
def sort_by
params.fetch(:sort_by, "created_at")
OrganizationExtension.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
end
def sort_direction
params.fetch(:sort_direction, "desc")
%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

@ -36,10 +36,10 @@ class Organizations::ProjectsController < Organizations::BaseController
end
def sort
params.fetch(:sort_by, "updated_on")
Project.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'updated_on'
end
def sort_direction
params.fetch(:sort_direction, "desc")
%w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
end
end

View File

@ -1,6 +1,7 @@
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]
@ -8,7 +9,7 @@ class Organizations::TeamUsersController < Organizations::BaseController
@team_users = @team.team_users.includes(:user)
search = params[:search].to_s.downcase
@team_users = @team_users.joins(:user).where("LOWER(CONCAT_WS(users.lastname, users.firstname, users.login, users.mail, users.nickname)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present?
@team_users = @team_users.joins(:user).merge(User.like(search))
@team_users = kaminari_paginate(@team_users)
end
@ -17,6 +18,7 @@ class Organizations::TeamUsersController < Organizations::BaseController
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
@ -29,6 +31,11 @@ class Organizations::TeamUsersController < Organizations::BaseController
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
@ -43,6 +50,11 @@ class Organizations::TeamUsersController < Organizations::BaseController
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
@ -73,4 +85,8 @@ class Organizations::TeamUsersController < Organizations::BaseController
tip_exception("组织团队成员不存在") if @team_user.nil?
end
def check_user_profile_completed
require_user_profile_completed(@operate_user)
end
end

View File

@ -33,13 +33,17 @@ class Organizations::TeamsController < Organizations::BaseController
end
def create
@team = Organizations::Teams::CreateService.call(current_user, @organization, team_params)
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)
@ -60,7 +64,7 @@ class Organizations::TeamsController < Organizations::BaseController
private
def team_params
params.permit(:name, :description, :authorize, :includes_all_project, :can_create_org_project, :unit_types => [])
params.permit(:name, :nickname, :description, :authorize, :includes_all_project, :can_create_org_project, :unit_types => [])
end
def load_organization

View File

@ -1,5 +1,5 @@
class OwnersController < ApplicationController
before_action :require_login
before_action :require_login, only: [:index]
def index
@owners = []
@ -9,4 +9,53 @@ class OwnersController < ApplicationController
teams: {can_create_org_project: true})
.distinct
end
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

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

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

@ -6,7 +6,8 @@ class Projects::ProjectUnitsController < Projects::BaseController
def create
if current_user.admin? || @project.manager?(current_user)
ActiveRecord::Base.transaction do
ProjectUnit.update_by_unit_types!(@project, unit_types)
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

View File

@ -14,7 +14,7 @@ class Projects::TeamsController < Projects::BaseController
def create
ActiveRecord::Base.transaction do
@team_project = TeamProject.build(@owner.id, @operate_team.id, @project.id)
Gitea::Organization::TeamProject::CreateService.call(@owner.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
Gitea::Organization::TeamProject::CreateService.call(current_user.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
render_ok
end
rescue Exception => e
@ -25,7 +25,7 @@ class Projects::TeamsController < Projects::BaseController
def destroy
ActiveRecord::Base.transaction do
@team_project.destroy!
Gitea::Organization::TeamProject::DeleteService.call(@owner.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
Gitea::Organization::TeamProject::DeleteService.call(current_user.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
render_ok
end
rescue Exception => e

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,8 +2,11 @@ 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 menu_list]
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 about menu_list]
before_action :require_profile_completed, only: [:create, :migrate]
before_action :load_repository, except: %i[index group_type_list migrate create recommend]
before_action :authorizate_user_can_edit_project!, only: %i[update]
before_action :project_public?, only: %i[fork_users praise_users watch_users]
@ -14,17 +17,18 @@ class ProjectsController < ApplicationController
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("setting")) if current_user.admin? || @project.manager?(current_user)
menu.append(menu_hash_by_name("settings")) if current_user.admin? || @project.manager?(current_user)
render json: menu
end
def index
scope = Projects::ListQuery.call(params)
scope = current_user.logged? ? Projects::ListQuery.call(params, current_user.id) : Projects::ListQuery.call(params)
# @projects = kaminari_paginate(scope)
@projects = paginate scope.includes(:project_category, :project_language, :repository, :project_educoder, :owner, :project_units)
@ -53,7 +57,23 @@ 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)
@ -66,6 +86,13 @@ class ProjectsController < ApplicationController
@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
project_statics = ProjectStatistic.first
@ -88,20 +115,37 @@ class ProjectsController < ApplicationController
def update
ActiveRecord::Base.transaction do
# Projects::CreateForm.new(project_params).validate!
private = params[:private] || false
new_project_params = project_params.except(:private).merge(is_public: !private)
@project.update_attributes!(new_project_params)
gitea_params = {
private: private,
default_branch: @project.default_branch,
website: @project.website
}
if [true, false].include? 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)
@project.repository.update_column(:hidden, private)
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
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)
@ -116,6 +160,7 @@ class ProjectsController < ApplicationController
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
@ -149,7 +194,7 @@ class ProjectsController < ApplicationController
end
def recommend
@projects = Project.recommend.includes(:repository, :project_category, :owner).limit(5)
@projects = Project.recommend.includes(:repository, :project_category, :owner).order(visits: :desc)
end
def about
@ -183,7 +228,7 @@ class ProjectsController < ApplicationController
private
def project_params
params.permit(:user_id, :name, :description, :repository_name, :website,
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

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,6 +1,8 @@
class PullRequestsController < ApplicationController
before_action :require_login, except: [:index, :show, :files, :commits]
before_action :require_profile_completed, only: [:create]
before_action :load_repository
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]
include TagChosenHelper
@ -8,15 +10,17 @@ class PullRequestsController < ApplicationController
def index
return render_not_found unless @project.has_menu_permission("pulls")
# @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
@ -54,8 +58,9 @@ class PullRequestsController < ApplicationController
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"])
render_ok
@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?
else
render_error("create pull request error: #{@gitea_pull_request[:status]}")
raise ActiveRecord::Rollback
@ -64,21 +69,22 @@ class PullRequestsController < ApplicationController
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|
@ -89,7 +95,7 @@ class PullRequestsController < ApplicationController
if @issue.update_attributes(@issue_params)
if @pull_request.update_attributes(@local_params.compact)
gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier,
@pull_request.gpid, @requests_params, current_user.gitea_token)
@pull_request.gitea_number, @requests_params, current_user.gitea_token)
if gitea_pull[:status] === :success
if params[:issue_tag_ids].present?
@ -112,6 +118,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
@ -121,7 +129,13 @@ class PullRequestsController < ApplicationController
ActiveRecord::Base.transaction do
begin
colsed = PullRequests::CloseService.call(@owner, @repository, @pull_request, current_user)
colsed === true ? normal_status(1, "已拒绝") : normal_status(-1, '合并失败')
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
@ -136,25 +150,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
result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params)
@gitea_pull = Gitea::PullRequest::GetService.call(@owner.login, @repository.identifier, @pull_request.gitea_number, current_user&.gitea_token)
if result && @pull_request.merge!
@pull_request.project_trend_status!
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)
@ -178,7 +202,7 @@ class PullRequestsController < ApplicationController
if can_merge.present?
render json: {
status: -2,
message: "在这些分支之间的合并请求已存在:<a href='/projects/#{@owner.login}/#{@project.identifier}/pulls/#{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, "可以合并")
@ -188,12 +212,12 @@ class PullRequestsController < ApplicationController
def files
@files_result = Gitea::PullRequest::FilesService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token)
@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.gpid, current_user&.gitea_token)
@commits_result = Gitea::PullRequest::CommitsService.call(@owner.login, @project.identifier, @pull_request.gitea_number, current_user&.gitea_token)
# render json: @commits_result
end
@ -215,7 +239,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
@ -249,4 +273,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,13 +1,15 @@
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 file]
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]
@ -62,6 +64,7 @@ class RepositoriesController < ApplicationController
def sub_entries
file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip))
@path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
if @project.educoder?
if params[:type] === 'file'
@ -92,10 +95,21 @@ class RepositoriesController < ApplicationController
end
def commits
@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
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
@sha = params[:sha]
@commit = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token)
@ -109,7 +123,11 @@ class RepositoriesController < ApplicationController
end
def contributors
@contributors = Gitea::Repository::Contributors::GetService.call(@owner, @repository.identifier)
if params[:filepath].present?
@contributors = []
else
@contributors = Gitea::Repository::Contributors::GetService.call(@owner, @repository.identifier)
end
end
def edit
@ -172,16 +190,46 @@ class RepositoriesController < ApplicationController
end
def readme
result = Gitea::Repository::Readme::GetService.call(@owner.login, @repository.identifier, params[:ref], current_user&.gitea_token)
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
render json: @readme
@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
@ -202,8 +250,14 @@ 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
@ -256,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 = {
@ -293,7 +347,7 @@ class RepositoriesController < ApplicationController
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), @owner.login, @project.try(:identifier), requests_params).call
if gitea_request[:status] == :success && local_requests.update_attributes(gpid: gitea_request["body"]["number"])
if gitea_request[:status] == :success && local_requests.update_attributes(gitea_number: 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

@ -5,6 +5,7 @@ class SettingsController < ApplicationController
get_common_menu
get_personal_menu
get_third_party
get_top_system_notification
end
private
@ -47,6 +48,10 @@ class SettingsController < ApplicationController
url: EducoderOauth.oauth_url
}
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)

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,18 @@
class Users::AppliedMessagesController < Users::BaseController
before_action :check_auth
after_action :view_messages, only: [:index]
def index
@applied_messages = @_observed_user.applied_messages.order(viewed: :asc, created_at: :desc)
@applied_messages = paginate @applied_messages
end
private
def check_auth
return render_forbidden unless current_user.admin? || observed_logged_user?
end
def view_messages
@applied_messages.update_all(viewed: 'viewed')
end
end

View File

@ -0,0 +1,39 @@
class Users::AppliedProjectsController < Users::BaseController
before_action :check_auth
before_action :find_applied_project, except: [:index]
before_action :find_project, except: [:index]
def index
@applied_projects = AppliedProject.where(project_id: observed_user.full_admin_projects)
@applied_projects = paginate @applied_projects.order("created_at desc")
end
# 接受申请
def accept
@applied_project = Projects::AcceptJoinService.call(current_user, @applied_project)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
# 拒绝申请
def refuse
@applied_project = Projects::RefuseJoinService.call(current_user, @applied_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? || observed_logged_user?
end
def find_applied_project
@applied_project = AppliedProject.find_by_id params[:id]
end
def find_project
@project = @applied_project.project
end
end

View File

@ -0,0 +1,41 @@
class Users::AppliedTransferProjectsController < Users::BaseController
before_action :check_auth
before_action :find_applied_transfer_project, except: [:index]
before_action :find_project, except: [:index]
def index
user_collection_sql = AppliedTransferProject.where(owner_id: @_observed_user.id).to_sql
org_collection_sql = AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @_observed_user.id}, teams: {authorize: %w(admin owner)} )).to_sql
@applied_transfer_projects = AppliedTransferProject.from("( #{ user_collection_sql } UNION #{ org_collection_sql } ) AS applied_transfer_projects")
@applied_transfer_projects = paginate @applied_transfer_projects.order("created_at desc")
end
# 接受迁移
def accept
@applied_transfer_project = Projects::AcceptTransferService.call(current_user, @project)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
# 拒绝迁移
def refuse
@applied_transfer_project = Projects::RefuseTransferService.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? || observed_logged_user?
end
def find_applied_transfer_project
@applied_transfer_project = AppliedTransferProject.find_by_id params[:id]
end
def find_project
@project = @applied_transfer_project.project
end
end

View File

@ -1,8 +1,8 @@
class Users::BanksController < Users::BaseController
before_action :params_filter
def index
order = params[:order] || "updated_at"
sort = params[:sort] || "desc"
order = CourseList.column_names.include?(params[:order]) ? params[:order] : "updated_at"
sort = %w(desc asc).includes?(params[:sort]) ? params[:sort] : "desc"
@banks = @object_type.classify.constantize.where(@object_filter)
@course_lists = CourseList.where(id: @banks.pluck(:course_list_id))
@banks = @banks.where(course_list_id: params[:tag_id]) unless params[:tag_id].blank?

View File

@ -5,7 +5,7 @@ class Users::BaseController < ApplicationController
helper_method :observed_logged_user?, :observed_user
def observed_user
@_observed_user ||= (User.find_by_id(params[:user_id]) || User.find_by_login(params[:user_id]))
@_observed_user ||= (User.find_by_login(params[:user_id]) || User.find_by_id(params[:user_id]))
end
def observed_logged_user?

View File

@ -0,0 +1,26 @@
class Users::HeadmapsController < Users::BaseController
def index
result = Gitea::User::HeadmapService.call(observed_user.login, start_stamp, end_stamp)
@headmaps = result[2].blank? ? [] : result[2]
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def start_stamp
if params[:year].present?
Date.new(params[:year], 1).to_time.to_i
else
Date.today.to_time.to_i - 365*24*60*60
end
end
def end_stamp
if params[:year].present?
Date.new(params[:year], 1).to_time.to_i + 365*24*60*60
else
Date.today.to_time.to_i
end
end
end

View File

@ -0,0 +1,45 @@
class Users::IsPinnedProjectsController < Users::BaseController
before_action :private_user_resources!, only: [:pin]
def index
@is_pinned_projects = observed_user.pinned_projects.order(position: :desc, created_at: :asc).includes(project: [:project_category, :project_language, :repository]).order(position: :desc)
@is_pinned_projects = kaminari_paginate(@is_pinned_projects)
end
def pin
observed_user.is_pinned_project_ids = is_pinned_project_ids
render_ok
rescue ActiveRecord::RecordNotFound => e
render_not_found
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def update
@pinned_project = PinnedProject.find_by_id(params[:id])
@pinned_project.attributes = pinned_project_params
if @pinned_project.save
render_ok
else
render_error
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def is_pinned_project_ids
if params[:is_pinned_project_ids].present?
return params[:is_pinned_project_ids].select{|id| observed_user.full_member_projects.visible.pluck(:id).include?(id.to_i) }
end
if params[:is_pinned_project_id].present?
return observed_user.is_pinned_project_ids unless observed_user.full_member_projects.visible.pluck(:id).include?(params[:is_pinned_project_id].to_i)
return observed_user.is_pinned_project_ids.include?(params[:is_pinned_project_id].to_i) ? observed_user.is_pinned_project_ids : observed_user.is_pinned_project_ids.push(params[:is_pinned_project_id].to_i)
end
end
def pinned_project_params
params.require(:pinned_project).permit(:position)
end
end

View File

@ -0,0 +1,96 @@
class Users::MessagesController < Users::BaseController
before_action :private_user_resources!
before_action :find_receivers, only: [:create]
def index
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
result = Notice::Read::ListService.call(observed_user.id, message_type, message_status, page, limit)
return render_error if result.nil?
@data = result[2]
end
def create
return render_forbidden unless %w(atme).include?(params[:type])
case params[:type]
when 'atme'
Notice::Write::CreateAtmeForm.new(atme_params).validate!
case atme_params[:atmeable_type]
when 'Issue'
SendTemplateMessageJob.perform_now('IssueAtme', @receivers, current_user.id, atme_params[:atmeable_id]) if Site.has_notice_menu?
when 'PullRequest'
SendTemplateMessageJob.perform_now('PullRequestAtme', @receivers, current_user.id, atme_params[:atmeable_id]) if Site.has_notice_menu?
when 'Journal'
journal = Journal.find_by_id(atme_params[:atmeable_id])
if journal.present?
if journal&.issue&.pull_request.present?
SendTemplateMessageJob.perform_now('PullRequestAtme', @receivers, current_user.id, atme_params[:atmeable_id]) if Site.has_notice_menu?
else
SendTemplateMessageJob.perform_now('IssueAtme', @receivers, current_user.id, atme_params[:atmeable_id]) if Site.has_notice_menu?
end
end
end
end
render_ok
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def delete
return render_forbidden unless %w(atme).include?(params[:type])
result = Notice::Write::DeleteService.call(params[:ids], observed_user.id, message_type)
return render_error if result.nil?
render_ok
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def read
return render_forbidden unless %w(notification atme).include?(params[:type])
result = Notice::Write::ChangeStatusService.call(params[:ids], observed_user.id, message_type)
if result.nil?
render_error
else
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def message_type
@message_type = begin
case params[:type]
when "notification" then 1
when "atme" then 2
else
-1
end
end
end
def message_status
@message_status = begin
case params[:status]
when "1" then 1
when "2" then 2
else
-1
end
end
end
def atme_params
params.permit(:atmeable_type, :atmeable_id, receivers_login: [])
end
def find_receivers
@receivers = User.where(login: params[:receivers_login])
return render_not_found if @receivers.size == 0
end
end

View File

@ -16,10 +16,10 @@ class Users::OrganizationsController < Users::BaseController
private
def sort_by
params.fetch(:sort_by, "created_at")
OrganizationExtension.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
end
def sort_direction
params.fetch(:sort_direction, "desc")
%w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
end
end

View File

@ -0,0 +1,11 @@
class Users::ProjectTrendsController < Users::BaseController
def index
if params[:date].present?
@project_trends = observed_user.project_trends.where("DATE(created_at) = ?", params[:date])
else
@project_trends = observed_user.project_trends
end
@project_trends = kaminari_paginate(@project_trends.includes(:trend, :project).order(created_at: :desc))
end
end

View File

@ -0,0 +1,217 @@
class Users::StatisticsController < Users::BaseController
before_action :preload_develop_data, only: [:develop]
# 近期活动统计
def activity
date_range = (1.week.ago.to_date..Date.today).to_a
commit_request = Gitea::User::HeadmapService.call(observed_user.login, 1.week.ago.to_date.to_time.to_i, Date.today.to_time.to_i)
commit_data = commit_request[2]
@date_data = []
@issue_data = []
@pull_request_data = []
@commit_data = []
date_range.each do |date|
@date_data << date.strftime("%Y.%m.%d")
@issue_data << observed_user.issues.where("DATE(created_on) = ?", date).size
@pull_request_data << observed_user.pull_requests.where("DATE(created_at) = ?", date).size
date_commit_data = commit_data.blank? ? nil : commit_data.select{|item| item["timestamp"] == date.to_time.to_i}
@commit_data << (date_commit_data.blank? ? 0 : date_commit_data[0]["contributions"].to_i)
end
render :json => {dates: @date_data, issues_count: @issue_data, pull_requests_count: @pull_request_data, commits_count: @commit_data}
end
# 开发能力
def develop
if params[:start_time].present? && params[:end_time].present?
# 影响力
@influence = (60.0 + @follow_count / (@follow_count + 10.0) * 40.0).to_i
@platform_influence = (60.0 + @platform_follow_count / (@platform_follow_count + 10.0) * 40.0).to_i
# 贡献度
@contribution = (60.0 + @pullrequest_count / (@pullrequest_count + 10.0) * 40.0).to_i
@platform_contribution = (60.0 + @platform_pullrequest_count / (@platform_pullrequest_count + 10.0) * 40.0).to_i
# 活跃度
@activity = (60.0 + @issues_count / (@issues_count + 10.0) * 40.0).to_i
@platform_activity = (60.0 + @platform_issues_count / (@platform_issues_count + 10.0) * 40.0).to_i
# 项目经验
@experience = 10 * @project_count + 5 * @fork_count + @project_watchers_count + @project_praises_count
@experience = (60.0 + @experience / (@experience + 100.0) * 40.0).to_i
@platform_experience = 10 * @platform_project_count + 5 * @platform_fork_count + @platform_project_watchers_count + @platform_project_praises_count
@platform_experience = (60.0 + @platform_experience / (@platform_experience + 100.0) * 40.0).to_i
# 语言能力
@language = (60.0 + @project_languages_count.length / (@project_languages_count.length + 5.0) * 40.0).to_i
@platform_language = (60.0 + @platform_project_languages_count.length / (@platform_project_languages_count.length + 5.0) * 40.0).to_i
# 语言百分比
@languages_percent = Hash.new
for key in @project_languages_count.keys do
@languages_percent[key] = (@project_languages_count[key].to_f / @project_languages_count.values.sum).round(2)
end
@platform_languages_percent = Hash.new
for key in @platform_project_languages_count.keys do
@platform_languages_percent[key] = (@platform_project_languages_count[key].to_f / @platform_project_languages_count.values.sum).round(2)
end
# 各门语言分数
@each_language_score = Hash.new
for key in @project_languages_count.keys do
@each_language_score[key] = (60.0 + @project_languages_count[key] / (@project_languages_count[key] + 5.0) * 40.0).to_i
end
@platform_each_language_score = Hash.new
for key in @platform_project_languages_count.keys do
@platform_each_language_score[key] = (60.0 + @platform_project_languages_count[key] / (@platform_project_languages_count[key] + 5.0) * 40.0).to_i
end
else
# 影响力
@influence = (60.0 + @follow_count / (@follow_count + 20.0) * 40.0).to_i
@platform_influence = (60.0 + @platform_follow_count / (@platform_follow_count + 20.0) * 40.0).to_i
# 贡献度
@contribution = (60.0 + @pullrequest_count / (@pullrequest_count + 20.0) * 40.0).to_i
@platform_contribution = (60.0 + @platform_pullrequest_count / (@platform_pullrequest_count + 20.0) * 40.0).to_i
# 活跃度
@activity = (60.0 + @issues_count / (@issues_count + 80.0) * 40.0).to_i
@platform_activity = (60.0 + @platform_issues_count / (@platform_issues_count + 80.0) * 40.0).to_i
# 项目经验
@experience = 10 * @project_count + 5 * @fork_count + @project_watchers_count + @project_praises_count
@experience = (60.0 + @experience / (@experience + 100.0) * 40.0).to_i
@platform_experience = 10 * @platform_project_count + 5 * @platform_fork_count + @platform_project_watchers_count + @platform_project_praises_count
@platform_experience = (60.0 + @platform_experience / (@platform_experience + 100.0) * 40.0).to_i
# 语言能力
@language = (60.0 + @project_languages_count.length / (@project_languages_count.length + 5.0) * 40.0).to_i
@platform_language = (60.0 + @platform_project_languages_count.length / (@platform_project_languages_count.length + 5.0) * 40.0).to_i
# 语言百分比
@languages_percent = Hash.new
for key in @project_languages_count.keys do
@languages_percent[key] = (@project_languages_count[key].to_f / @project_languages_count.values.sum).round(2)
end
# @platform_languages_percent = Hash.new
# for key in @platform_project_languages_count.keys do
# @platform_languages_percent[key] = (@platform_project_languages_count[key].to_f / @platform_project_languages_count.values.sum).round(2)
# end
# 各门语言分数
@each_language_score = Hash.new
for key in @project_languages_count.keys do
@each_language_score[key] = (60.0 + @project_languages_count[key] / (@project_languages_count[key] + 5.0) * 40.0).to_i
end
# @platform_each_language_score = Hash.new
# for key in @platform_project_languages_count.keys do
# @platform_each_language_score[key] = (60.0 + @platform_project_languages_count[key] / (@platform_project_languages_count[key] + 5.0) * 40.0).to_i
# end
end
end
# 角色定位
def role
full_member_projects = observed_user.full_member_projects
owner_projects = filter_member_projects_by_role("Owner")
manager_projects = filter_member_projects_by_role("Manager").where.not(id: owner_projects.ids)
developer_projects = filter_member_projects_by_role("Developer").where.not(id: owner_projects.ids + manager_projects.ids)
reporter_projects = filter_member_projects_by_role("Reporter").where.not(id: owner_projects.ids + manager_projects.ids + developer_projects.ids)
@full_member_projects_count = full_member_projects.size
@owner_projects_count = owner_projects.size
@manager_projects_count = manager_projects.size
@developer_projects_count = developer_projects.size
@reporter_projects_count = reporter_projects.size
end
# 专业定位
def major
# 参与项目
join_normal_projects_sql = Project.members_projects(observed_user.id).to_sql
join_org_projects_sql = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: observed_user.id}).to_sql
# 关注项目
star_projects_sql = Project.joins(:watchers).where(watchers: {watchable_type: "Project", user_id: observed_user.id}).to_sql
# fork项目
fork_projects_sql = Project.where(id: observed_user.fork_users.select(:id, :fork_project_id).pluck(:fork_project_id)).to_sql
major_projects = Project.from("( #{ join_normal_projects_sql} UNION #{ join_org_projects_sql } UNION #{ star_projects_sql } UNION #{fork_projects_sql}) AS projects").distinct
categories = ProjectCategory.joins(:projects).merge(Project.where(id: time_filter(major_projects, 'created_on'))).distinct.pluck(:name)
render :json => {categories: categories}
end
private
def time_filter(collection, time_field)
if params[:start_time].present? && params[:end_time].present?
return collection.where("#{time_field} > ? AND #{time_field} < ?", Time.at(params[:start_time].to_i).beginning_of_day, Time.at(params[:end_time].to_i).end_of_day)
else
return collection
end
rescue
return collection
end
def filter_member_projects_by_role(role)
case role
when 'Owner'
normal_projects_sql = Project.joins(members: :roles).where(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Manager'}).to_sql
org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "owner"}, team_users: {user_id: observed_user.id}).to_sql
when "Manager"
normal_projects_sql = Project.joins(members: :roles).where.not(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Manager'}).to_sql
org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "admin"}, team_users: {user_id: observed_user.id}).to_sql
when "Developer"
normal_projects_sql = Project.joins(members: :roles).where.not(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Developer'}).to_sql
org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "write"}, team_users: {user_id: observed_user.id}).to_sql
when "Reporter"
normal_projects_sql = Project.joins(members: :roles).where.not(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Reporter'}).to_sql
org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "read"}, team_users: {user_id: observed_user.id}).to_sql
end
return time_filter(Project.from("( #{normal_projects_sql} UNION #{org_projects_sql} ) AS projects").distinct, 'created_on')
end
def preload_develop_data
if params[:start_time].present? && params[:end_time].present?
# 用户被follow数量
@follow_count = time_filter(Watcher.where(watchable: observed_user), 'created_at').count
@platform_follow_count = time_filter(Watcher.where(watchable_type: 'User'), 'created_at').count
# 用户pr数量
@pullrequest_count = time_filter(PullRequest.where(user_id: observed_user.id), 'created_at').count
@platform_pullrequest_count = time_filter(PullRequest, 'created_at').count
# 用户issue数量
@issues_count = time_filter(Issue.where(author_id: observed_user.id), 'created_on').count
@platform_issues_count = time_filter(Issue, 'created_on').count
# 用户总项目数
@project_count = time_filter(Project.where(user_id:observed_user.id), 'created_on').count
@platform_project_count = time_filter(Project, 'created_on').count
# 用户项目被fork数量
@fork_count = time_filter(Project.where(user_id:observed_user.id), 'created_on').sum("forked_count")
@platform_fork_count = time_filter(Project, 'created_on').sum("forked_count")
# 用户项目关注数
@project_watchers_count = time_filter(Project.where(user_id: observed_user.id), 'created_on').sum("watchers_count")
@platform_project_watchers_count = time_filter(Project, 'created_on').sum("watchers_count")
# 用户项目点赞数
@project_praises_count = time_filter(Project.where(user_id: observed_user.id), 'created_on').sum("praises_count")
@platform_project_praises_count = time_filter(Project, 'created_on').sum("praises_count")
# 用户不同语言项目数量
@project_languages_count = time_filter(Project.where(user_id: observed_user.id), 'created_on').joins(:project_language).group("project_languages.name").count
@platform_project_languages_count = time_filter(Project, 'created_on').joins(:project_language).group("project_languages.name").count
else
# 用户被follow数量
@follow_count = Cache::UserFollowCountService.call(observed_user)
@platform_follow_count = Cache::PlatformFollowCountService.call
# 用户pr数量
@pullrequest_count = Cache::UserPullrequestCountService.call(observed_user)
@platform_pullrequest_count = Cache::PlatformPullrequestCountService.call
# 用户issue数量
@issues_count = Cache::UserIssueCountService.call(observed_user)
@platform_issues_count = Cache::PlatformIssueCountService.call
# 用户总项目数
@project_count = Cache::UserProjectCountService.call(observed_user)
@platform_project_count = Cache::PlatformProjectCountService.call
# 用户项目被fork数量
@fork_count = Cache::UserProjectForkCountService.call(observed_user)
@platform_fork_count = Cache::PlatformProjectForkCountService.call
# 用户项目关注数
@project_watchers_count = Cache::UserProjectWatchersCountService.call(observed_user)
@platform_project_watchers_count = Cache::PlatformProjectWatchersCountService.call
# 用户项目点赞数
@project_praises_count = Cache::UserProjectPraisesCountService.call(observed_user)
@platform_project_praises_count = Cache::PlatformProjectPraisesCountService.call
# 用户不同语言项目数量
@project_languages_count = Cache::UserProjectLanguagesCountService.call(observed_user)
@platform_project_languages_count = Cache::PlatformProjectLanguagesCountService.call
end
end
end

View File

@ -0,0 +1,36 @@
class Users::TemplateMessageSettingsController < Users::BaseController
before_action :check_auth
before_action :get_current_setting
def current_setting
end
def update_setting
Rails.logger.info setting_params[:notification_body]
Rails.logger.info setting_params[:email_body]
@current_setting.notification_body = setting_params[:notification_body].to_hash
@current_setting.email_body = setting_params[:email_body].to_hash
return render_error("保存失败") unless @current_setting.save!
end
private
def check_auth
return render_forbidden unless current_user.admin? || observed_logged_user?
end
def get_current_setting
@current_setting = @_observed_user.user_template_message_setting
@current_setting = UserTemplateMessageSetting.build(@_observed_user.id) if @current_setting.nil?
end
def setting_params
params.require(:setting).permit(notification_body: {}, email_body: {})
end
def valid_setting_params
setting_params[:notification_body].keys.equal?(UserTemplateMessageSetting.init_notification_body.keys) && setting_params[:email_body].keys.equal?(UserTemplateMessageSetting.init_email_body)
end
end

View File

@ -2,10 +2,11 @@ class UsersController < ApplicationController
include ApplicationHelper
include Ci::DbConnectable
before_action :load_user, only: [:show, :homepage_info, :sync_token, :sync_gitea_pwd, :projects, :watch_users, :fan_users]
before_action :check_user_exist, only: [:show, :homepage_info,:projects, :watch_users, :fan_users]
before_action :load_user, only: [:show, :homepage_info, :sync_token, :sync_gitea_pwd, :projects, :watch_users, :fan_users, :hovercard]
before_action :check_user_exist, only: [:show, :homepage_info,:projects, :watch_users, :fan_users, :hovercard]
before_action :require_login, only: %i[me list sync_user_info]
before_action :connect_to_ci_db, only: [:get_user_info]
before_action :convert_image!, only: [:update]
skip_before_action :check_sign, only: [:attachment_show]
def connect_to_ci_db(options={})
@ -27,12 +28,26 @@ class UsersController < ApplicationController
def show
#待办事项,现在未做
@undo_events = 0
if User.current.admin? || User.current.login == @user.login
@waiting_applied_messages = @user.applied_messages.waiting
@common_applied_transfer_projects = AppliedTransferProject.where(owner_id: @user.id).common + AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @user.id}, teams: {authorize: %w(admin owner)} )).common
@common_applied_projects = AppliedProject.where(project_id: @user.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_org_count = User.current.logged? ? @user.organizations.with_visibility(%w(common limited)).size + @user.organizations.with_visibility("privacy").joins(:organization_users).where(organization_users: {user_id: current_user.id}).size : @user.organizations.with_visibility("common").size
user_projects = User.current.logged? && (User.current.admin? || User.current.login == @user.login) ? @user.projects : @user.projects.visible
user_organizations = User.current.logged? ? @user.organizations.with_visibility(%w(common limited)) + @user.organizations.with_visibility("privacy").joins(:team_users).where(team_users: {user_id: current_user.id}) : @user.organizations.with_visibility("common")
@user_org_count = user_organizations.size
normal_projects = Project.members_projects(@user.id).to_sql
org_projects = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: @user.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 == @user.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
@ -50,16 +65,22 @@ class UsersController < ApplicationController
def fan_users
watchers = @user.watchers.includes(:user).order("watchers.created_at desc")
watchers = watchers.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login)) LIKE ?", "%#{params[:search].split(" ").join('|')}%") if params[:search].present?
watchers = watchers.joins(:user).merge(User.like(params[:search]))
@watchers_count = watchers.size
@watchers = paginate(watchers)
end
def hovercard
end
def update
@user = User.find params[:id]
@user.update!(user_params)
render_ok
return render_not_found unless @user = User.find_by(login: params[:id]) || User.find_by_id(params[:id])
return render_forbidden unless User.current.logged? && (current_user&.admin? || current_user.id == @user.id)
Util.write_file(@image, avatar_path(@user)) if user_params[:image].present?
@user.attributes = user_params.except(:image)
unless @user.save
render_error(@user.errors.full_messages.join(", "))
end
end
def me
@ -70,6 +91,12 @@ class UsersController < ApplicationController
def get_user_info
begin
@user = current_user
begin
result = Notice::Read::CountService.call(current_user.id)
@message_unread_total = result.nil? ? 0 : result[2]["unread_notification"]
rescue
@message_unread_total = 0
end
# TODO 等消息上线再打开注释
#@tidding_count = unviewed_tiddings(current_user) if current_user.present?
rescue Exception => e
@ -259,11 +286,13 @@ class UsersController < ApplicationController
end
def user_params
params.require(:user).permit(:nickname, :lastname, :show_realname,:login,:mail,
params.require(:user).permit(:nickname, :image,
user_extension_attributes: [
:gender, :location, :location_city,
:occupation, :technical_title,
:school_id, :department_id,:identity, :student_id, :description]
:school_id, :department_id, :province, :city,
:custom_department, :identity, :student_id, :description,
:show_email, :show_location, :show_department]
)
end

View File

@ -11,7 +11,7 @@ class UsersForPrivateMessagesController < ApplicationController
return
end
users = users.where('LOWER(concat(lastname, firstname, nickname)) LIKE ?', "%#{keyword}%")
users = users.like(keyword)
@users = users.limit(10).includes(:user_extension)
end

View File

@ -1,14 +1,14 @@
class VersionReleasesController < ApplicationController
before_action :load_repository
before_action :set_user
before_action :require_login, except: [:index]
before_action :find_version , only: [:edit, :update, :destroy]
before_action :require_login, except: [:index, :show]
before_action :check_release_authorize, except: [:index, :show]
before_action :find_version , only: [:show, :edit, :update, :destroy]
def index
version_releases = Gitea::Versions::ListService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier)).call
@version_releases = version_releases
@user_permission = current_user.present? && (current_user == @user || current_user.admin?)
@forge_releases = @repository.version_releases.select(:id,:version_gid).includes(:attachments)
@version_releases = kaminari_paginate(@repository.version_releases.order(created_at: :desc))
@user_permission = current_user.present? && (@repository.project.all_developers.include?(current_user) || current_user.admin?)
@user_admin_permission = current_user.present? && (@repository.project.all_managers.include?(current_user) || current_user.admin?)
end
def new
@ -22,6 +22,10 @@ class VersionReleasesController < ApplicationController
end
end
def show
# @release = Gitea::Versions::GetService.call(current_user.gitea_token, @user&.login, @repository&.identifier, @version&.version_gid)
end
def create
if params[:name].nil?
normal_status(-1, "名称不能为空")
@ -37,13 +41,14 @@ class VersionReleasesController < ApplicationController
version_params = releases_params
version_release = VersionRelease.new(version_params.merge(user_id: current_user.id, repository_id: @repository.id))
if version_release.save!
git_version_release = Gitea::Versions::CreateService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier), version_params).call
git_version_release = Gitea::Versions::CreateService.new(current_user.gitea_token, @user.try(:login), @repository.try(:identifier), version_params).call
if git_version_release
update_params = {
tarball_url: git_version_release["tarball_url"],
zipball_url: git_version_release["zipball_url"],
url: git_version_release["url"],
version_gid: git_version_release["id"],
sha: git_version_release["sha"]
}
version_release.update_attributes!(update_params)
version_release.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
@ -81,7 +86,7 @@ class VersionReleasesController < ApplicationController
if @version.update_attributes!(version_params)
create_attachments(params[:attachment_ids], @version) if params[:attachment_ids].present?
git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call
git_version_release = Gitea::Versions::UpdateService.new(current_user.gitea_token, @user.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call
unless git_version_release
raise Error, "更新失败"
end
@ -102,7 +107,7 @@ class VersionReleasesController < ApplicationController
ActiveRecord::Base.transaction do
begin
if @version.destroy
git_version_release = Gitea::Versions::DeleteService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier), @version.try(:version_gid)).call
git_version_release = Gitea::Versions::DeleteService.new(current_user.gitea_token, @user.try(:login), @repository.try(:identifier), @version.try(:version_gid)).call
if git_version_release.status == 204
normal_status(0, "删除成功")
@ -157,4 +162,8 @@ class VersionReleasesController < ApplicationController
end
end
def check_release_authorize
return render_forbidden("您没有权限进行此操作.") unless current_user.admin? || @project.manager?(current_user)
end
end

View File

@ -1,14 +1,13 @@
class VersionsController < ApplicationController
before_action :require_login, except: [:index, :show]
before_action :require_profile_completed, only: [:create]
before_action :load_repository
before_action :check_menu_authorize
before_action :check_issue_permission, except: [:show, :index]
before_action :set_version, only: [:edit, :update, :destroy, :show,:update_status]
def index
return render_not_found unless @project.has_menu_permission("versions")
@user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user))
order_name = params[:order_name] || "created_on"
order_type = params[:order_type] || "desc"
status = params[:status]
versions = @project.versions.version_includes
@open_versions_size = versions.where(status: "open")&.size
@ -27,20 +26,13 @@ class VersionsController < ApplicationController
end
def show
order_name = params[:order_name] || "created_on"
order_type = params[:order_type] || "desc"
version_issues = @version.issues.issue_includes
version_issues = @version.issues.issue_issue.issue_includes
status_type = params[:status_type] || "1"
# @close_issues_size = version_issues.where(status_id: 5).size
# @open_issues_size = version_issues.size - @close_issues_size
if status_type.to_s == "1" #表示开启中的
version_issues = version_issues.where.not(status_id: 5)
else
version_issues = version_issues.where(status_id: 5)
end
version_issues = version_issues.where(author_id: params[:author_id]) if params[:author_id].present? && params[:author_id].to_s != "all"
version_issues = version_issues.where(assigned_to_id: params[:assigned_to_id]) if params[:assigned_to_id].present? && params[:assigned_to_id].to_s != "all"
version_issues = version_issues.where(tracker_id: params[:tracker_id]) if params[:tracker_id].present? && params[:tracker_id].to_s != "all"
@ -52,10 +44,26 @@ class VersionsController < ApplicationController
version_issues = version_issues.joins(:issue_tags).where(issue_tags: {id: params[:issue_tag_id].to_i}) if params[:issue_tag_id].present? && params[:issue_tag_id].to_s != "all"
version_issues = version_issues.reorder("#{order_name} #{order_type}")
has_filter_params = (params[:author_id].present? && params[:author_id].to_s != "all") ||
(params[:assigned_to_id].present? && params[:assigned_to_id].to_s != "all") ||
(params[:tracker_id].present? && params[:tracker_id].to_s != "all") ||
(params[:status_id].present? && params[:status_id].to_s != "all") ||
(params[:priority_id].present? && params[:priority_id].to_s != "all") ||
(params[:fixed_version_id].present? && params[:fixed_version_id].to_s != "all") ||
(params[:done_ratio].present? && params[:done_ratio].to_s != "all") ||
(params[:issue_type].present? && params[:issue_type].to_s != "all") ||
(params[:issue_tag_id].present? && params[:issue_tag_id].to_s != "all")
@version_close_issues_size = has_filter_params ? version_issues.closed.size : @version.issues.issue_issue.issue_includes.closed.size
@version_issues_size = has_filter_params ? version_issues.size : @version.issues.issue_issue.issue_includes.size
if status_type.to_s == "1" #表示开启中的
version_issues = version_issues.where.not(status_id: 5)
else
version_issues = version_issues.where(status_id: 5)
end
@page = params[:page] || 1
@limit = params[:limit] || 15
@version_issues_size = version_issues.size
# @version_issues_size = version_issues.size
@version_issues = version_issues.page(@page).per(@limit)
end
@ -167,4 +175,16 @@ class VersionsController < ApplicationController
end
end
def order_name
Version.column_names.include?(params[:order_name]) ? params[:order_name] : 'created_on'
end
def order_type
%w(desc asc).include?(params[:order_type]) ? params[:order_type] : 'desc'
end
def check_menu_authorize
return render_not_found unless @project.has_menu_permission("versions")
end
end

View File

@ -1,5 +1,6 @@
class WatchersController < ApplicationController
before_action :require_login, except: %i[index]
before_action :require_profile_completed, only: [:follow]
# before_action :find_project_with_id
before_action :get_target

View File

@ -86,7 +86,7 @@ class Weapps::CoursesController < Weapps::BaseController
end
if search.present?
@teacher_list = @teacher_list.joins(:user).where("LOWER(CONCAT(users.lastname, users.firstname)) like ?", "%#{search}%")
@teacher_list = @teacher_list.joins(:user).where("LOWER(CONCAT(users.lastname, users.firstname)) like ? OR users.nickname like ?", "%#{search}%", "%#{search}%")
end
@teacher_list_size = @teacher_list.size
@ -127,8 +127,8 @@ class Weapps::CoursesController < Weapps::BaseController
@students = CourseMember.students(@course)
if search.present?
@students = @students.joins(user: :user_extension).where("LOWER(CONCAT(users.lastname, users.firstname)) like ? or
user_extensions.student_id like ?", "%#{search}%", "%#{search}%")
@students = @students.joins(user: :user_extension).where("LOWER(CONCAT(users.lastname, users.firstname)) like ? or users.nickname like ? or
user_extensions.student_id like ?", "%#{search}%", "%#{search}%", "%#{search}%")
end
if course_group_id.present?

View File

@ -86,7 +86,7 @@ class ZipsController < ApplicationController
#搜索
if params[:search].present?
@ex_users = @ex_users.joins(user: :user_extension).where("CONCAT(lastname, firstname) like ? OR student_id like ?", "%#{params[:search]}%", "%#{params[:search]}%")
@ex_users = @ex_users.joins(user: :user_extension).where("CONCAT(lastname, firstname) like ? OR nickname like ? OR student_id like ?", "%#{params[:search]}%", "%#{params[:search]}%", "%#{params[:search]}%")
end
default_ex_users_size = @ex_users&.size
@ -130,8 +130,8 @@ class ZipsController < ApplicationController
end
unless params[:search].blank?
@all_student_works = @all_student_works.joins(user: :user_extension).where("concat(lastname, firstname) like ?
or student_id like ?", "%#{params[:search]}%", "%#{params[:search]}%")
@all_student_works = @all_student_works.joins(user: :user_extension).where("CONCAT(lastname, firstname) like ? or nickname like ?
or student_id like ?", "%#{params[:search]}%", "%#{params[:search]}%", "%#{params[:search]}%")
end
student_work_sizes = @all_student_works&.size

View File

@ -1,2 +0,0 @@
build/
.github/

View File

@ -1,18 +0,0 @@
# EditorConfig is awesome: https://EditorConfig.org
# Top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
[*.rb]
charset = utf-8
[*.md]
trim_trailing_whitespace = false

View File

@ -1 +0,0 @@
source/javascripts/lib/* linguist-vendored

View File

@ -1,22 +0,0 @@
---
name: Report a Bug
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Bug Description**
A clear and concise description of what the bug is and how to reproduce it.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Browser (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Last upstream Slate commit (run `git log --author="Robert Lord" | head -n 1`):**
Put the commit hash here

View File

@ -1,5 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: Questions, Ideas, Discussions
url: https://github.com/slatedocs/slate/discussions
about: Ask and answer questions, and propose new features.

View File

@ -1,5 +0,0 @@
<!--
⚠️ 🚨 ⚠️ STOP AND READ THIS ⚠️ 🚨 ⚠️
👆👆 see that 'base fork' dropdown above? You should change it! The default value of "slatedocs/slate" submits your change to ALL USERS OF SLATE, not just your company. This is PROBABLY NOT WHAT YOU WANT.
-->

View File

@ -1,42 +0,0 @@
name: Build
on:
push:
branches: [ '*' ]
pull_request:
branches: [ '*' ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
ruby-version: [2.3, 2.4, 2.5, 2.6, 2.7]
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby-version }}
- uses: actions/cache@v2
with:
path: vendor/bundle
key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
gems-${{ runner.os }}-${{ matrix.ruby-version }}-
gems-${{ runner.os }}-
# necessary to get ruby 2.3 to work nicely with bundler vendor/bundle cache
# can remove once ruby 2.3 is no longer supported
- run: gem update --system
- run: bundle config set deployment 'true'
- name: bundle install
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- run: bundle exec middleman build

View File

@ -1,41 +0,0 @@
name: Deploy
on:
push:
branches: [ 'main' ]
jobs:
deploy:
runs-on: ubuntu-latest
env:
ruby-version: 2.5
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ env.ruby-version }}
- uses: actions/cache@v2
with:
path: vendor/bundle
key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
gems-${{ runner.os }}-${{ matrix.ruby-version }}-
gems-${{ runner.os }}-
- run: bundle config set deployment 'true'
- name: bundle install
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- run: bundle exec middleman build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./build
keep_files: true

View File

@ -1,50 +0,0 @@
name: Dev Deploy
on:
push:
branches: [ 'dev' ]
jobs:
deploy:
runs-on: ubuntu-latest
env:
ruby-version: 2.5
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ env.ruby-version }}
- uses: actions/cache@v2
with:
path: vendor/bundle
key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
gems-${{ runner.os }}-${{ matrix.ruby-version }}-
gems-${{ runner.os }}-
- run: bundle config set deployment 'true'
- name: bundle install
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- run: bundle exec middleman build
- name: Push to Docker Hub
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_KEY }}
repository: slatedocs/slate
tag_with_ref: true
- name: Deploy
uses: peaceiris/actions-gh-pages@v3.7.0-8
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
destination_dir: dev
publish_dir: ./build
keep_files: true

View File

@ -1,22 +0,0 @@
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Push to Docker Hub
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_KEY }}
repository: slatedocs/slate
tag_with_ref: true
tags: latest

View File

@ -1,27 +0,0 @@
*.gem
*.rbc
.bundle
.config
coverage
InstalledFiles
lib/bundler/man
pkg
rdoc
spec/reports
test/tmp
test/version_tmp
tmp
*.DS_STORE
build/
.cache
.vagrant
.sass-cache
# YARD artifacts
.yardoc
_yardoc
doc/
.idea/
# Vagrant artifacts
ubuntu-*-console.log

View File

@ -1,254 +0,0 @@
# Changelog
## Version 2.8.0
*October 27, 2020*
* Remove last trailing newline when using the copy code button
* Rework docker image and make available at slatedocs/slate
* Improve Dockerfile layout to improve caching (thanks @micvbang)
* Bump rouge from 3.20 to 3.24
* Bump nokogiri from 1.10.9 to 1.10.10
* Bump middleman from 4.3.8 to 4.3.11
* Bump lunr.js from 2.3.8 to 2.3.9
## Version 2.7.1
*August 13, 2020*
* __[security]__ Bumped middleman from 4.3.7 to 4.3.8
_Note_: Slate uses redcarpet, not kramdown, for rendering markdown to HTML, and so was unaffected by the security vulnerability in middleman.
If you have changed slate to use kramdown, and with GFM, you may need to install the `kramdown-parser-gfm` gem.
## Version 2.7.0
*June 21, 2020*
* __[security]__ Bumped rack in Gemfile.lock from 2.2.2 to 2.2.3
* Bumped bundled jQuery from 3.2.1 to 3.5.1
* Bumped bundled lunr from 0.5.7 to 2.3.8
* Bumped imagesloaded from 3.1.8 to 4.1.4
* Bumped rouge from 3.17.0 to 3.20.0
* Bumped redcarpet from 3.4.0 to 3.5.0
* Fix color of highlighted code being unreadable when printing page
* Add clipboard icon for "Copy to Clipboard" functionality to code boxes (see note below)
* Fix handling of ToC selectors that contain punctutation (thanks @gruis)
* Fix language bar truncating languages that overflow screen width
* Strip HTML tags from ToC title before displaying it in title bar in JS (backup to stripping done in Ruby code) (thanks @atic)
To enable the new clipboard icon, you need to add `code_clipboard: true` to the frontmatter of source/index.html.md.
See [this line](https://github.com/slatedocs/slate/blame/main/source/index.html.md#L19) for an example of usage.
## Version 2.6.1
*May 30, 2020*
* __[security]__ update child dependency activesupport in Gemfile.lock to 5.4.2.3
* Update Middleman in Gemfile.lock to 4.3.7
* Replace Travis-CI with GitHub actions for continuous integration
* Replace Spectrum with GitHub discussions
## Version 2.6.0
*May 18, 2020*
__Note__: 2.5.0 was "pulled" due to a breaking bug discovered after release. It is recommended to skip it, and move straight to 2.6.0.
* Fix large whitespace gap in middle column for sections with codeblocks
* Fix highlighted code elements having a different background than rest of code block
* Change JSON keys to have a different font color than their values
* Disable asset hashing for woff and woff2 elements due to middleman bug breaking woff2 asset hashing in general
* Move Dockerfile to Debian from Alpine
* Converted repo to a [GitHub template](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)
* Update sassc to 2.3.0 in Gemfile.lock
## Version 2.5.0
*May 8, 2020*
* __[security]__ update nokogiri to ~> 1.10.8
* Update links in example docs to https://github.com/slatedocs/slate from https://github.com/lord/slate
* Update LICENSE to include full Apache 2.0 text
* Test slate against Ruby 2.5 and 2.6 on Travis-CI
* Update Vagrantfile to use Ubuntu 18.04 (thanks @bradthurber)
* Parse arguments and flags for deploy.sh on script start, instead of potentially after building source files
* Install nodejs inside Vagrantfile (thanks @fernandoaguilar)
* Add Dockerfile for running slate (thanks @redhatxl)
* update middleman-syntax and rouge to ~>3.2
* update middleman to 4.3.6
## Version 2.4.0
*October 19, 2019*
- Move repository from lord/slate to slatedocs/slate
- Fix documentation to point at new repo link, thanks to [Arun](https://github.com/slash-arun), [Gustavo Gawryszewski](https://github.com/gawry), and [Daniel Korbit](https://github.com/danielkorbit)
- Update `nokogiri` to 1.10.4
- Update `ffi` in `Gemfile.lock` to fix security warnings, thanks to [Grey Baker](https://github.com/greysteil) and [jakemack](https://github.com/jakemack)
- Update `rack` to 2.0.7 in `Gemfile.lock` to fix security warnings, thanks to [Grey Baker](https://github.com/greysteil) and [jakemack](https://github.com/jakemack)
- Update middleman to `4.3` and relax constraints on middleman related gems, thanks to [jakemack](https://github.com/jakemack)
- Add sass gem, thanks to [jakemack](https://github.com/jakemack)
- Activate `asset_cache` in middleman to improve cacheability of static files, thanks to [Sam Gilman](https://github.com/thenengah)
- Update to using bundler 2 for `Gemfile.lock`, thanks to [jakemack](https://github.com/jakemack)
## Version 2.3.1
*July 5, 2018*
- Update `sprockets` in `Gemfile.lock` to fix security warnings
## Version 2.3
*July 5, 2018*
- Allows strikethrough in markdown by default.
- Upgrades jQuery to 3.2.1, thanks to [Tomi Takussaari](https://github.com/TomiTakussaari)
- Fixes invalid HTML in `layout.erb`, thanks to [Eric Scouten](https://github.com/scouten) for pointing out
- Hopefully fixes Vagrant memory issues, thanks to [Petter Blomberg](https://github.com/p-blomberg) for the suggestion
- Cleans HTML in headers before setting `document.title`, thanks to [Dan Levy](https://github.com/justsml)
- Allows trailing whitespace in markdown files, thanks to [Samuel Cousin](https://github.com/kuzyn)
- Fixes pushState/replaceState problems with scrolling not changing the document hash, thanks to [Andrey Fedorov](https://github.com/anfedorov)
- Removes some outdated examples, thanks [@al-tr](https://github.com/al-tr), [Jerome Dahdah](https://github.com/jdahdah), and [Ricardo Castro](https://github.com/mccricardo)
- Fixes `nav-padding` bug, thanks [Jerome Dahdah](https://github.com/jdahdah)
- Code style fixes thanks to [Sebastian Zaremba](https://github.com/vassyz)
- Nokogiri version bump thanks to [Grey Baker](https://github.com/greysteil)
- Fix to default `index.md` text thanks to [Nick Busey](https://github.com/NickBusey)
Thanks to everyone who contributed to this release!
## Version 2.2
*January 19, 2018*
- Fixes bugs with some non-roman languages not generating unique headers
- Adds editorconfig, thanks to [Jay Thomas](https://github.com/jaythomas)
- Adds optional `NestingUniqueHeadCounter`, thanks to [Vladimir Morozov](https://github.com/greenhost87)
- Small fixes to typos and language, thx [Emir Ribić](https://github.com/ribice), [Gregor Martynus](https://github.com/gr2m), and [Martius](https://github.com/martiuslim)!
- Adds links to Spectrum chat for questions in README and ISSUE_TEMPLATE
## Version 2.1
*October 30, 2017*
- Right-to-left text stylesheet option, thanks to [Mohammad Hossein Rabiee](https://github.com/mhrabiee)
- Fix for HTML5 history state bug, thanks to [Zach Toolson](https://github.com/ztoolson)
- Small styling changes, typo fixes, small bug fixes from [Marian Friedmann](https://github.com/rnarian), [Ben Wilhelm](https://github.com/benwilhelm), [Fouad Matin](https://github.com/fouad), [Nicolas Bonduel](https://github.com/NicolasBonduel), [Christian Oliff](https://github.com/coliff)
Thanks to everyone who submitted PRs for this version!
## Version 2.0
*July 17, 2017*
- All-new statically generated table of contents
- Should be much faster loading and scrolling for large pages
- Smaller Javascript file sizes
- Avoids the problem with the last link in the ToC not ever highlighting if the section was shorter than the page
- Fixes control-click not opening in a new page
- Automatically updates the HTML title as you scroll
- Updated design
- New default colors!
- New spacings and sizes!
- System-default typefaces, just like GitHub
- Added search input delay on large corpuses to reduce lag
- We even bumped the major version cause hey, why not?
- Various small bug fixes
Thanks to everyone who helped debug or wrote code for this version! It was a serious community effort, and I couldn't have done it alone.
## Version 1.5
*February 23, 2017*
- Add [multiple tabs per programming language](https://github.com/lord/slate/wiki/Multiple-language-tabs-per-programming-language) feature
- Upgrade Middleman to add Ruby 1.4.0 compatibility
- Switch default code highlighting color scheme to better highlight JSON
- Various small typo and bug fixes
## Version 1.4
*November 24, 2016*
- Upgrade Middleman and Rouge gems, should hopefully solve a number of bugs
- Update some links in README
- Fix broken Vagrant startup script
- Fix some problems with deploy.sh help message
- Fix bug with language tabs not hiding properly if no error
- Add `!default` to SASS variables
- Fix bug with logo margin
- Bump tested Ruby versions in .travis.yml
## Version 1.3.3
*June 11, 2016*
Documentation and example changes.
## Version 1.3.2
*February 3, 2016*
A small bugfix for slightly incorrect background colors on code samples in some cases.
## Version 1.3.1
*January 31, 2016*
A small bugfix for incorrect whitespace in code blocks.
## Version 1.3
*January 27, 2016*
We've upgraded Middleman and a number of other dependencies, which should fix quite a few bugs.
Instead of `rake build` and `rake deploy`, you should now run `bundle exec middleman build --clean` to build your server, and `./deploy.sh` to deploy it to Github Pages.
## Version 1.2
*June 20, 2015*
**Fixes:**
- Remove crash on invalid languages
- Update Tocify to scroll to the highlighted header in the Table of Contents
- Fix variable leak and update search algorithms
- Update Python examples to be valid Python
- Update gems
- More misc. bugfixes of Javascript errors
- Add Dockerfile
- Remove unused gems
- Optimize images, fonts, and generated asset files
- Add chinese font support
- Remove RedCarpet header ID patch
- Update language tabs to not disturb existing query strings
## Version 1.1
*July 27, 2014*
**Fixes:**
- Finally, a fix for the redcarpet upgrade bug
## Version 1.0
*July 2, 2014*
[View Issues](https://github.com/tripit/slate/issues?milestone=1&state=closed)
**Features:**
- Responsive designs for phones and tablets
- Started tagging versions
**Fixes:**
- Fixed 'unrecognized expression' error
- Fixed #undefined hash bug
- Fixed bug where the current language tab would be unselected
- Fixed bug where tocify wouldn't highlight the current section while searching
- Fixed bug where ids of header tags would have special characters that caused problems
- Updated layout so that pages with disabled search wouldn't load search.js
- Cleaned up Javascript

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