forked from Gitlink/forgeplus
Compare commits
56 Commits
hh_educode
...
master
| Author | SHA1 | Date |
|---|---|---|
|
|
8c71a72fce | |
|
|
ee7acaaa82 | |
|
|
c1d4df6e06 | |
|
|
55f7beb22d | |
|
|
aa314c141c | |
|
|
37e1704897 | |
|
|
ddacf2a733 | |
|
|
d07543111a | |
|
|
908cda56f3 | |
|
|
841778900c | |
|
|
6a3d297b30 | |
|
|
002c773746 | |
|
|
45f05c9fc4 | |
|
|
84e48d25c1 | |
|
|
37d8a5426f | |
|
|
df3bf621ce | |
|
|
da98efe04f | |
|
|
2976742b29 | |
|
|
55e081ba2b | |
|
|
a3c49b3d5f | |
|
|
5a9f29c25f | |
|
|
f75827bcf0 | |
|
|
f0c4d1226b | |
|
|
3a47c61010 | |
|
|
1f0388c1a1 | |
|
|
de6ae5b720 | |
|
|
8a55e84372 | |
|
|
f055fed7d0 | |
|
|
21befb6486 | |
|
|
b6e8a135f0 | |
|
|
9cddda7fd4 | |
|
|
002ae9f327 | |
|
|
8055ae2c07 | |
|
|
01f32ae2d7 | |
|
|
1c6982d15b | |
|
|
9300483c1a | |
|
|
1920cb5ce3 | |
|
|
5a20842edb | |
|
|
506ab1722d | |
|
|
07d11737e9 | |
|
|
1fe9ea126a | |
|
|
dcd4457cf5 | |
|
|
0bd6621821 | |
|
|
04a1376820 | |
|
|
c3a1fb78ea | |
|
|
cf224bc9fe | |
|
|
d6c3bcfaf1 | |
|
|
a66e5b876d | |
|
|
b11fd350da | |
|
|
c417fa7369 | |
|
|
e9a4370adc | |
|
|
e6b8435037 | |
|
|
c175fa1339 | |
|
|
6ce4b26047 | |
|
|
e022e429d4 | |
|
|
50fb8d3983 |
|
|
@ -36,6 +36,7 @@ public/react/yarn.lock
|
|||
/.idea/*
|
||||
|
||||
# Ignore react node_modules
|
||||
public/system/*
|
||||
public/react/*
|
||||
/public/react/.cache
|
||||
/public/react/node_modules/
|
||||
|
|
@ -82,4 +83,5 @@ docker/
|
|||
educoder.sql
|
||||
redis_data/
|
||||
Dockerfile
|
||||
dump.rdb
|
||||
dump.rdb
|
||||
.tags*
|
||||
|
|
|
|||
27
CHANGELOG.md
27
CHANGELOG.md
|
|
@ -1,5 +1,32 @@
|
|||
# Changelog
|
||||
|
||||
## [v3.0.2](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-04-23
|
||||
|
||||
* BUGFIXES
|
||||
* Fix 解决部分用户头像不显示问题
|
||||
* Fix 解决代码库模块中最左侧目录中的文件定位加载不准确的问题
|
||||
* FIX 解决团队管理页面中项目链接错误问题
|
||||
* Fix 解决markdown格式文件显示问题
|
||||
* Fix 解决组织名下创建项目报错的问题
|
||||
* Fix 解决组织名下的项目,创建issue报错的问题
|
||||
* Fix 解决组织名下创建团队提示信息信息显示错误问题
|
||||
* Fix 解决点击组织图片时,链接加载错误问题
|
||||
* Fix 修复查询版本库信息安全漏洞
|
||||
* Fix 解决修复团队成员操作访问组织仓库报403错误的问题
|
||||
* Fix 解决owners团队成员对仓库添加成功失败的问题
|
||||
|
||||
* ENHANCEMENTS
|
||||
* ADD 自动生产用户头像功能
|
||||
* ADD 创建组织支持中文名称
|
||||
* ADD 创建团建支持中文名称
|
||||
* ADD 组织名称统一显示中文名
|
||||
* ADD 团队名称统一显示中文名
|
||||
* ADD 用户头像悬浮时展示相关信息
|
||||
* ADD 项目详情页添加实践课程链接入口
|
||||
* ADD README文件页面添加添加目录导航功能
|
||||
* UPDATE 升级改版底部footer信息
|
||||
* UPDATE 升级用户操作版本库权限
|
||||
|
||||
## [v3.0.1](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-03-19
|
||||
|
||||
* BUGFIXES
|
||||
|
|
|
|||
2
Gemfile
2
Gemfile
|
|
@ -126,3 +126,5 @@ gem 'request_store'
|
|||
gem 'harmonious_dictionary', '~> 0.0.1'
|
||||
|
||||
gem 'parallel', '~> 1.19', '>= 1.19.1'
|
||||
|
||||
gem 'letter_avatar'
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -456,6 +457,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
|
||||
|
|
|
|||
36
README.md
36
README.md
|
|
@ -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(此处已mac系统为例)
|
||||
```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. 其他说明
|
||||
通过页面注册都第一个用户为平台管理员用户
|
||||
|
||||
## 页面展示
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -770,6 +770,11 @@ class ApplicationController < ActionController::Base
|
|||
@repository ||= load_project&.repository
|
||||
end
|
||||
|
||||
def base_url
|
||||
request.base_url
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
def object_not_found
|
||||
uid_logger("Missing template or cant't find record, responding with 404")
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ class MembersController < ApplicationController
|
|||
end
|
||||
|
||||
def member_exists?
|
||||
@project.member?(params[:user_id])
|
||||
@project.members.exists?(params[:user_id])
|
||||
end
|
||||
|
||||
def operate!
|
||||
|
|
@ -59,6 +59,6 @@ class MembersController < ApplicationController
|
|||
end
|
||||
|
||||
def check_member_not_exists!
|
||||
return render_result(1, "user_id为#{params[:user_id]}的用户还不是项目成员") unless member_exists?
|
||||
return render_result(1, "user_id为#{params[:user_id]}的用户还不是项目成员") unless @project.member?(params[:user_id])
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ class Organizations::BaseController < ApplicationController
|
|||
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 +31,4 @@ class Organizations::BaseController < ApplicationController
|
|||
def project_mark
|
||||
params[:repo_name] || params[:id]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ class Organizations::OrganizationsController < Organizations::BaseController
|
|||
|
||||
def create
|
||||
ActiveRecord::Base.transaction do
|
||||
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
|
||||
|
|
@ -36,8 +37,10 @@ class Organizations::OrganizationsController < Organizations::BaseController
|
|||
def update
|
||||
ActiveRecord::Base.transaction do
|
||||
login = @organization.login
|
||||
@organization.update!(login: organization_params[:name]) if organization_params[:name].present?
|
||||
@organization.organization_extension.update_attributes!(organization_params.except(:name))
|
||||
@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))
|
||||
Gitea::Organization::UpdateService.call(@organization.gitea_token, login, @organization.reload)
|
||||
Util.write_file(@image, avatar_path(@organization)) if params[:image].present?
|
||||
end
|
||||
|
|
@ -82,7 +85,7 @@ class Organizations::OrganizationsController < Organizations::BaseController
|
|||
def organization_params
|
||||
params.permit(:name, :description, :website, :location,
|
||||
:repo_admin_change_team_access, :visibility,
|
||||
:max_repo_creation)
|
||||
:max_repo_creation, :nickname)
|
||||
end
|
||||
|
||||
def password
|
||||
|
|
|
|||
|
|
@ -33,7 +33,10 @@ 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)
|
||||
|
|
@ -60,7 +63,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
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ class ProjectsController < ApplicationController
|
|||
menu.append(menu_hash_by_name("pulls")) if @project.has_menu_permission("pulls")
|
||||
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)
|
||||
|
||||
|
|
@ -182,7 +183,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,
|
||||
:project_category_id, :project_language_id, :license_id, :ignore_id, :private)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ class PullRequestsController < ApplicationController
|
|||
end
|
||||
|
||||
def pr_merge
|
||||
return render_forbidden("你没有权限操作.") if @project.reporter?(current_user)
|
||||
return render_forbidden("你没有权限操作.") unless current_user.project_manager?(@project)
|
||||
|
||||
if params[:do].blank?
|
||||
normal_status(-1, "请选择合并方式")
|
||||
|
|
|
|||
|
|
@ -2,9 +2,9 @@ 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 :require_login, only: %i[me list]
|
||||
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]
|
||||
skip_before_action :check_sign, only: [:attachment_show]
|
||||
|
||||
|
|
@ -56,6 +56,9 @@ class UsersController < ApplicationController
|
|||
@watchers = paginate(watchers)
|
||||
end
|
||||
|
||||
def hovercard
|
||||
end
|
||||
|
||||
def update
|
||||
@user = User.find params[:id]
|
||||
@user.update!(user_params)
|
||||
|
|
@ -233,6 +236,26 @@ class UsersController < ApplicationController
|
|||
render_ok
|
||||
end
|
||||
|
||||
def sync_user_info
|
||||
user = User.find_by_login params[:login]
|
||||
return render_forbidden unless user === current_user
|
||||
|
||||
sync_params = {
|
||||
email: params[:email],
|
||||
password: params[:password]
|
||||
}
|
||||
|
||||
Users::UpdateInfoForm.new(sync_params.merge(login: params[:login])).validate!
|
||||
|
||||
interactor = Gitea::User::UpdateInteractor.call(user.login, sync_params)
|
||||
if interactor.success?
|
||||
user.update!(password: params[:password], mail: params[:email], status: User::STATUS_EDIT_INFO)
|
||||
render_ok
|
||||
else
|
||||
render_error(interactor.error)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def load_user
|
||||
@user = User.find_by_login(params[:id]) || User.find_by(id: params[:id])
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ class VersionReleasesController < ApplicationController
|
|||
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)
|
||||
@forge_releases = @repository.version_releases.select(:id,:version_gid, :created_at).includes(:attachments)
|
||||
end
|
||||
|
||||
def new
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
class Organizations::CreateForm < BaseForm
|
||||
NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾
|
||||
attr_accessor :name, :description, :website, :location, :repo_admin_change_team_access, :visibility, :max_repo_creation, :nickname
|
||||
|
||||
validates :name, :nickname, :visibility, presence: true
|
||||
validates :name, format: { with: NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" }
|
||||
|
||||
end
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
class Organizations::CreateTeamForm < BaseForm
|
||||
NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾
|
||||
attr_accessor :name, :nickname, :description, :authorize, :includes_all_project, :can_create_org_project, :unit_types
|
||||
|
||||
validates :name, :nickname, :authorize, presence: true
|
||||
validates :name, format: { with: NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" }
|
||||
|
||||
end
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
class Users::UpdateInfoForm
|
||||
include ActiveModel::Model
|
||||
|
||||
attr_accessor :email, :password, :login
|
||||
|
||||
validates :email, presence: true, format: { with: CustomRegexp::EMAIL }
|
||||
validates :password, presence: true
|
||||
validates :login, presence: true
|
||||
end
|
||||
|
|
@ -35,12 +35,6 @@ module ApplicationHelper
|
|||
course.course_modules.find_by(module_type: "graduation").try(:id)
|
||||
end
|
||||
|
||||
# 是否关注
|
||||
# from_user_id为被关注的用户
|
||||
def follow?(from_user_id, user_id)
|
||||
Watcher.where(watchable_type: 'Principal', watchable_id: from_user_id, user_id: user_id).exists?
|
||||
end
|
||||
|
||||
# git用户
|
||||
# git用户命名规则:login+"@educoder.net"
|
||||
def git_username(email)
|
||||
|
|
@ -144,17 +138,12 @@ module ApplicationHelper
|
|||
if File.exist?(disk_filename(source&.class, source&.id))
|
||||
ctime = File.ctime(disk_filename(source.class, source.id)).to_i
|
||||
if %w(User Organization).include?(source.class.to_s)
|
||||
File.join(relative_path, ["#{source.class}", "#{source.id}"]) + "?t=#{ctime}"
|
||||
File.join("images", relative_path, ["#{source.class}", "#{source.id}"]) + "?t=#{ctime}"
|
||||
else
|
||||
File.join("images/avatars", ["#{source.class}", "#{source.id}"]) + "?t=#{ctime}"
|
||||
end
|
||||
elsif source.class.to_s == 'User'
|
||||
str = source.user_extension.try(:gender).to_i == 0 ? "b" : "g"
|
||||
File.join(relative_path, "#{source.class}", str)
|
||||
elsif source.class.to_s == 'Subject'
|
||||
File.join("images","educoder", "index", "subject", "subject#{rand(17)}.jpg")
|
||||
elsif source.class.to_s == 'Shixun'
|
||||
File.join("images","educoder", "index", "shixun", "shixun#{rand(23)}.jpg")
|
||||
source.get_letter_avatar_url
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -90,8 +90,4 @@ module ProjectsHelper
|
|||
def render_educoder_avatar_url(project_educoder)
|
||||
[Rails.application.config_for(:configuration)['educoder']['cdn_url'], project_educoder&.image_url].join('/')
|
||||
end
|
||||
|
||||
def render_avatar_url(owner)
|
||||
['images', url_to_avatar(owner)].join('/')
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
module RepositoriesHelper
|
||||
def render_permission(user, project)
|
||||
return "Admin" if user&.admin?
|
||||
return "Owner" if user === project.owner
|
||||
project.get_premission(user)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
# disk_directory :string(255)
|
||||
# attachtype :integer default("1")
|
||||
# is_public :integer default("1")
|
||||
# copy_from :integer
|
||||
# copy_from :string(255)
|
||||
# quotes :integer default("0")
|
||||
# is_publish :integer default("1")
|
||||
# publish_time :datetime
|
||||
|
|
@ -26,15 +26,15 @@
|
|||
# cloud_url :string(255) default("")
|
||||
# course_second_category_id :integer default("0")
|
||||
# delay_publish :boolean default("0")
|
||||
# link :string(255)
|
||||
# clone_id :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_attachments_on_author_id (author_id)
|
||||
# index_attachments_on_clone_id (clone_id)
|
||||
# index_attachments_on_container_id_and_container_type (container_id,container_type)
|
||||
# index_attachments_on_course_second_category_id (course_second_category_id)
|
||||
# index_attachments_on_created_on (created_on)
|
||||
# index_attachments_on_is_public (is_public)
|
||||
# index_attachments_on_quotes (quotes)
|
||||
#
|
||||
|
||||
class Attachment < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -1,3 +1,21 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: chart_rules
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# rule_type :string(255)
|
||||
# content :text(65535)
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# competition_id :integer
|
||||
# competition_stage_id :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_chart_rules_on_competition_id (competition_id)
|
||||
# index_chart_rules_on_competition_stage_id (competition_stage_id)
|
||||
#
|
||||
|
||||
class ChartRule < ApplicationRecord
|
||||
|
||||
validates :content, length: { maximum: 1000, too_long: "不能超过1000个字符" }
|
||||
|
|
|
|||
|
|
@ -1,3 +1,22 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: stages
|
||||
#
|
||||
# id :integer not null
|
||||
# subject_id :integer
|
||||
# name :string(255)
|
||||
# description :text(65535)
|
||||
# user_id :integer
|
||||
# position :integer
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# shixuns_count :integer default("0")
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_stages_on_subject_id (subject_id)
|
||||
#
|
||||
|
||||
class Ci::Stage < Ci::RemoteBase
|
||||
self.primary_key = 'stage_id'
|
||||
|
||||
|
|
|
|||
|
|
@ -39,13 +39,14 @@
|
|||
# business :boolean default("0")
|
||||
# profile_completed :boolean default("0")
|
||||
# laboratory_id :integer
|
||||
# platform :string(255) default("0")
|
||||
# gitea_token :string(255)
|
||||
# gitea_uid :integer
|
||||
# is_shixun_marker :boolean default("0")
|
||||
# admin_visitable :boolean default("0")
|
||||
# collaborator :boolean default("0")
|
||||
# gitea_uid :integer
|
||||
# is_sync_pwd :boolean default("1")
|
||||
# watchers_count :integer default("0")
|
||||
# devops_step :integer default("0")
|
||||
# gitea_token :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
@ -53,8 +54,9 @@
|
|||
# index_users_on_homepage_engineer (homepage_engineer)
|
||||
# index_users_on_homepage_teacher (homepage_teacher)
|
||||
# index_users_on_laboratory_id (laboratory_id)
|
||||
# index_users_on_login (login)
|
||||
# index_users_on_mail (mail)
|
||||
# index_users_on_login (login) UNIQUE
|
||||
# index_users_on_mail (mail) UNIQUE
|
||||
# index_users_on_phone (phone) UNIQUE
|
||||
# index_users_on_type (type)
|
||||
#
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ module Watchable
|
|||
has_many :watcher_users, through: :watchers, source: :user, validate: false
|
||||
|
||||
scope :watched_by, -> (user_id) { includes(:watchers).where(watchers: { user_id: user_id }) }
|
||||
scope :following, -> (user_id) { watched_by(user_id) }
|
||||
end
|
||||
|
||||
def watched?(watchable)
|
||||
|
|
@ -21,6 +22,24 @@ module Watchable
|
|||
obj.destroy! if obj.present?
|
||||
end
|
||||
|
||||
# 我正在关注的、我追随的
|
||||
def following
|
||||
User.following(self.id)
|
||||
end
|
||||
|
||||
def following_count
|
||||
following.size
|
||||
end
|
||||
|
||||
# 关注我的、我的粉丝、我的追随者
|
||||
def followers
|
||||
watcher_users
|
||||
end
|
||||
|
||||
def followers_count
|
||||
followers.size
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,38 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: discusses
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# user_id :integer
|
||||
# dis_type :string(255)
|
||||
# dis_id :integer
|
||||
# content :text(65535)
|
||||
# parent_id :integer
|
||||
# root_id :integer
|
||||
# praise_count :integer
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# challenge_id :integer
|
||||
# reward :integer
|
||||
# hidden :boolean default("0")
|
||||
# last_reply_id :integer
|
||||
# position :integer
|
||||
# praises_count :integer default("0")
|
||||
# sticky :boolean default("0")
|
||||
# course_sticky :boolean default("0")
|
||||
# course_hidden :boolean default("0")
|
||||
# copy_message_id :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_discusses_on_challenge_id (challenge_id)
|
||||
# index_discusses_on_copy_message_id (copy_message_id)
|
||||
# index_discusses_on_course_hidden (course_hidden)
|
||||
# index_discusses_on_course_sticky (course_sticky)
|
||||
# index_discusses_on_dis_id_and_dis_type (dis_id,dis_type)
|
||||
# index_discusses_on_user_id (user_id)
|
||||
#
|
||||
|
||||
class Discuss < ApplicationRecord
|
||||
default_scope { order(created_at: :desc) }
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,24 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: forge_activities
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# user_id :integer
|
||||
# project_id :integer
|
||||
# forge_act_id :integer
|
||||
# forge_act_type :string(255)
|
||||
# org_id :integer
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# forge_act_index (project_id,forge_act_id,created_at,forge_act_type)
|
||||
# index_forge_activities_on_forge_act_id (forge_act_id)
|
||||
#
|
||||
|
||||
class ForgeActivity < ApplicationRecord
|
||||
belongs_to :user
|
||||
belongs_to :project
|
||||
belongs_to :forge_act, polymorphic: true
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,17 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: helps
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# about_us :text(65535)
|
||||
# agreement :text(65535)
|
||||
# status :text(65535)
|
||||
# help_center :text(65535)
|
||||
# join_us :text(65535)
|
||||
#
|
||||
|
||||
class Help < ApplicationRecord
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -10,6 +10,12 @@
|
|||
# sync_course :boolean default("0")
|
||||
# sync_subject :boolean default("0")
|
||||
# sync_shixun :boolean default("0")
|
||||
# is_local :boolean default("0")
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_laboratories_on_identifier (identifier) UNIQUE
|
||||
# index_laboratories_on_school_id (school_id)
|
||||
#
|
||||
|
||||
class Laboratory < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -6,6 +6,10 @@
|
|||
# laboratory_id :integer
|
||||
# config :text(65535)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_laboratory_settings_on_laboratory_id (laboratory_id)
|
||||
#
|
||||
|
||||
class LaboratorySetting < ApplicationRecord
|
||||
belongs_to :laboratory
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
# content :text(65535)
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# is_secret :boolean default("0")
|
||||
#
|
||||
|
||||
class License < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -1,3 +1,27 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: live_links
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# course_id :integer
|
||||
# user_id :integer
|
||||
# url :string(255)
|
||||
# description :text(65535)
|
||||
# on_status :boolean default("0")
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# course_name :string(255)
|
||||
# platform :string(255)
|
||||
# live_time :datetime
|
||||
# duration :integer
|
||||
# position :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_live_links_on_course_id (course_id)
|
||||
# index_live_links_on_user_id (user_id)
|
||||
#
|
||||
|
||||
class LiveLink < ApplicationRecord
|
||||
# belongs_to :course
|
||||
belongs_to :user
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
# course_group_id :integer default("0")
|
||||
# is_collect :integer default("1")
|
||||
# graduation_group_id :integer default("0")
|
||||
# is_apply_signature :boolean default("0")
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
|
|||
|
|
@ -1,3 +1,18 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: message_details
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# content :text(4294967295)
|
||||
# message_id :integer
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_message_details_on_message_id (message_id)
|
||||
#
|
||||
|
||||
class MessageDetail < ApplicationRecord
|
||||
# belongs_to :message, :touch => true
|
||||
validates :content, length: { maximum: 10000, too_long: "内容不能超过10000个字符" }
|
||||
|
|
|
|||
|
|
@ -39,13 +39,14 @@
|
|||
# business :boolean default("0")
|
||||
# profile_completed :boolean default("0")
|
||||
# laboratory_id :integer
|
||||
# platform :string(255) default("0")
|
||||
# gitea_token :string(255)
|
||||
# gitea_uid :integer
|
||||
# is_shixun_marker :boolean default("0")
|
||||
# admin_visitable :boolean default("0")
|
||||
# collaborator :boolean default("0")
|
||||
# gitea_uid :integer
|
||||
# is_sync_pwd :boolean default("1")
|
||||
# watchers_count :integer default("0")
|
||||
# devops_step :integer default("0")
|
||||
# gitea_token :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
@ -53,8 +54,9 @@
|
|||
# index_users_on_homepage_engineer (homepage_engineer)
|
||||
# index_users_on_homepage_teacher (homepage_teacher)
|
||||
# index_users_on_laboratory_id (laboratory_id)
|
||||
# index_users_on_login (login)
|
||||
# index_users_on_mail (mail)
|
||||
# index_users_on_login (login) UNIQUE
|
||||
# index_users_on_mail (mail) UNIQUE
|
||||
# index_users_on_phone (phone) UNIQUE
|
||||
# index_users_on_type (type)
|
||||
#
|
||||
|
||||
|
|
@ -78,8 +80,8 @@ class Organization < Owner
|
|||
|
||||
scope :with_visibility, ->(visibility) { joins(:organization_extension).where(organization_extensions: {visibility: visibility}) if visibility.present? }
|
||||
|
||||
def self.build(name, gitea_token=nil)
|
||||
self.create!(login: name, gitea_token: gitea_token)
|
||||
def self.build(name, nickname, gitea_token=nil)
|
||||
self.create!(login: name, nickname: nickname, gitea_token: gitea_token)
|
||||
end
|
||||
|
||||
def can_create_project?(user_id)
|
||||
|
|
@ -113,7 +115,9 @@ class Organization < Owner
|
|||
end
|
||||
|
||||
def real_name
|
||||
login
|
||||
name = lastname + firstname
|
||||
name = name.blank? ? (nickname.blank? ? login : nickname) : name
|
||||
name.gsub(/\s+/, '').strip #6.11 -hs
|
||||
end
|
||||
|
||||
def show_real_name
|
||||
|
|
|
|||
|
|
@ -1,78 +1,75 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: projects
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# name :string(255) default(""), not null
|
||||
# description :text(4294967295)
|
||||
# homepage :string(255) default("")
|
||||
# is_public :boolean default("1"), not null
|
||||
# parent_id :integer
|
||||
# created_on :datetime
|
||||
# updated_on :datetime
|
||||
# identifier :string(255)
|
||||
# status :integer default("1"), not null
|
||||
# lft :integer
|
||||
# rgt :integer
|
||||
# inherit_members :boolean default("0"), not null
|
||||
# project_type :integer default("0")
|
||||
# hidden_repo :boolean default("0"), not null
|
||||
# attachmenttype :integer default("1")
|
||||
# user_id :integer
|
||||
# dts_test :integer default("0")
|
||||
# enterprise_name :string(255)
|
||||
# organization_id :integer
|
||||
# project_new_type :integer
|
||||
# gpid :integer
|
||||
# forked_from_project_id :integer
|
||||
# forked_count :integer default("0")
|
||||
# publish_resource :integer default("0")
|
||||
# visits :integer default("0")
|
||||
# hot :integer default("0")
|
||||
# invite_code :string(255)
|
||||
# qrcode :string(255)
|
||||
# qrcode_expiretime :integer default("0")
|
||||
# script :text(65535)
|
||||
# training_status :integer default("0")
|
||||
# rep_identifier :string(255)
|
||||
# project_category_id :integer
|
||||
# project_language_id :integer
|
||||
# license_id :integer
|
||||
# ignore_id :integer
|
||||
# praises_count :integer default("0")
|
||||
# watchers_count :integer default("0")
|
||||
# issues_count :integer default("0")
|
||||
# pull_requests_count :integer default("0")
|
||||
# language :string(255)
|
||||
# versions_count :integer default("0")
|
||||
# issue_tags_count :integer default("0")
|
||||
# closed_issues_count :integer default("0")
|
||||
# open_devops :boolean default("0")
|
||||
# gitea_webhook_id :integer
|
||||
# open_devops_count :integer default("0")
|
||||
# recommend :boolean default("0")
|
||||
# platform :integer default("0")
|
||||
# default_branch :string(255) default("master")
|
||||
# website :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_projects_on_forked_from_project_id (forked_from_project_id)
|
||||
# index_projects_on_identifier (identifier)
|
||||
# index_projects_on_is_public (is_public)
|
||||
# index_projects_on_lft (lft)
|
||||
# index_projects_on_name (name)
|
||||
# index_projects_on_platform (platform)
|
||||
# index_projects_on_project_type (project_type)
|
||||
# index_projects_on_recommend (recommend)
|
||||
# index_projects_on_rgt (rgt)
|
||||
# index_projects_on_status (status)
|
||||
# index_projects_on_updated_on (updated_on)
|
||||
#
|
||||
|
||||
|
||||
|
||||
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: projects
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# name :string(255) default(""), not null
|
||||
# description :text(4294967295)
|
||||
# homepage :string(255) default("")
|
||||
# is_public :boolean default("1"), not null
|
||||
# parent_id :integer
|
||||
# created_on :datetime
|
||||
# updated_on :datetime
|
||||
# identifier :string(255)
|
||||
# status :integer default("1"), not null
|
||||
# lft :integer
|
||||
# rgt :integer
|
||||
# inherit_members :boolean default("0"), not null
|
||||
# project_type :integer default("0")
|
||||
# hidden_repo :boolean default("0"), not null
|
||||
# attachmenttype :integer default("1")
|
||||
# user_id :integer
|
||||
# dts_test :integer default("0")
|
||||
# enterprise_name :string(255)
|
||||
# organization_id :integer
|
||||
# project_new_type :integer
|
||||
# gpid :integer
|
||||
# forked_from_project_id :integer
|
||||
# forked_count :integer default("0")
|
||||
# publish_resource :integer default("0")
|
||||
# visits :integer default("0")
|
||||
# hot :integer default("0")
|
||||
# invite_code :string(255)
|
||||
# qrcode :string(255)
|
||||
# qrcode_expiretime :integer default("0")
|
||||
# script :text(65535)
|
||||
# training_status :integer default("0")
|
||||
# rep_identifier :string(255)
|
||||
# project_category_id :integer
|
||||
# project_language_id :integer
|
||||
# praises_count :integer default("0")
|
||||
# watchers_count :integer default("0")
|
||||
# issues_count :integer default("0")
|
||||
# pull_requests_count :integer default("0")
|
||||
# language :string(255)
|
||||
# versions_count :integer default("0")
|
||||
# issue_tags_count :integer default("0")
|
||||
# closed_issues_count :integer default("0")
|
||||
# open_devops :boolean default("0")
|
||||
# gitea_webhook_id :integer
|
||||
# open_devops_count :integer default("0")
|
||||
# recommend :boolean default("0")
|
||||
# platform :integer default("0")
|
||||
# license_id :integer
|
||||
# ignore_id :integer
|
||||
# default_branch :string(255) default("master")
|
||||
# website :string(255)
|
||||
# lesson_url :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_projects_on_forked_from_project_id (forked_from_project_id)
|
||||
# index_projects_on_identifier (identifier)
|
||||
# index_projects_on_is_public (is_public)
|
||||
# index_projects_on_lft (lft)
|
||||
# index_projects_on_name (name)
|
||||
# index_projects_on_platform (platform)
|
||||
# index_projects_on_project_type (project_type)
|
||||
# index_projects_on_recommend (recommend)
|
||||
# index_projects_on_rgt (rgt)
|
||||
# index_projects_on_status (status)
|
||||
# index_projects_on_updated_on (updated_on)
|
||||
#
|
||||
|
||||
class Project < ApplicationRecord
|
||||
include Matchable
|
||||
|
|
@ -161,6 +158,7 @@ class Project < ApplicationRecord
|
|||
|
||||
#创建项目管理员
|
||||
def check_project_members
|
||||
return if owner.is_a?(Organization)
|
||||
unless members.present? && members.exists?(user_id: self.user_id)
|
||||
member_params = {
|
||||
user_id: self.user_id,
|
||||
|
|
@ -242,10 +240,12 @@ class Project < ApplicationRecord
|
|||
end
|
||||
|
||||
def get_premission user
|
||||
permission = "Reporter"
|
||||
member = members.find_by(user: user)
|
||||
return "Owner" if owner?(user)
|
||||
return "Manager" if manager?(user)
|
||||
return "Developer" if develper?(user)
|
||||
return "Reporter" if reporter?(user)
|
||||
|
||||
member&.roles&.last&.name || permission
|
||||
return ""
|
||||
end
|
||||
|
||||
def fork_project
|
||||
|
|
|
|||
|
|
@ -8,11 +8,6 @@
|
|||
# projects_count :integer default("0")
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# ancestry :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_project_categories_on_ancestry (ancestry)
|
||||
#
|
||||
|
||||
class ProjectCategory < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
class ProjectUnit < ApplicationRecord
|
||||
belongs_to :project
|
||||
|
||||
enum unit_type: {code: 1, issues: 2, pulls: 3, devops: 4, versions: 5}
|
||||
enum unit_type: {code: 1, issues: 2, pulls: 3, devops: 4, versions: 5, resources: 6}
|
||||
|
||||
validates :unit_type, uniqueness: { scope: :project_id}
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@
|
|||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_repositories_on_identifier (identifier)
|
||||
# index_repositories_on_project_id (project_id)
|
||||
# index_repositories_on_user_id (user_id)
|
||||
#
|
||||
|
|
|
|||
|
|
@ -1,3 +1,39 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: schools
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# name :string(255)
|
||||
# province :string(255)
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# logo_link :string(255)
|
||||
# pinyin :string(255)
|
||||
# school_type :integer default("0")
|
||||
# city :string(255)
|
||||
# address :string(255)
|
||||
# auto_users_trial :boolean default("0")
|
||||
# shool_code :string(255)
|
||||
# authorization_time :datetime
|
||||
# ec_auth :integer default("0")
|
||||
# identifier :string(255)
|
||||
# is_online :boolean default("0")
|
||||
# video_name :string(255)
|
||||
# video_desc :string(255)
|
||||
# course_link :string(255)
|
||||
# course_name :string(255)
|
||||
# partner_id :integer
|
||||
# customer_id :integer
|
||||
# school_property_id :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_schools_on_customer_id (customer_id)
|
||||
# index_schools_on_identifier (identifier)
|
||||
# index_schools_on_partner_id (partner_id)
|
||||
# index_schools_on_school_property_id (school_property_id)
|
||||
#
|
||||
|
||||
class School < ApplicationRecord
|
||||
has_many :departments, dependent: :destroy
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
# gtid :integer
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# nickname :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
|
|||
|
|
@ -1,4 +1,87 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: courses
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# tea_id :integer
|
||||
# name :string(255)
|
||||
# state :integer
|
||||
# code :string(255)
|
||||
# time :integer
|
||||
# extra :string(255)
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# location :string(255)
|
||||
# term :string(255)
|
||||
# string :string(255)
|
||||
# password :string(255)
|
||||
# setup_time :string(255)
|
||||
# endup_time :string(255)
|
||||
# class_period :integer default("0")
|
||||
# school_id :integer
|
||||
# description :text(65535)
|
||||
# status :integer default("1")
|
||||
# attachmenttype :integer default("2")
|
||||
# lft :integer
|
||||
# rgt :integer
|
||||
# is_public :integer default("1")
|
||||
# inherit_members :integer default("1")
|
||||
# open_student :integer default("0")
|
||||
# outline :integer default("0")
|
||||
# publish_resource :integer default("0")
|
||||
# is_delete :integer default("0")
|
||||
# end_time :integer
|
||||
# end_term :string(255)
|
||||
# is_excellent :integer default("0")
|
||||
# excellent_option :integer default("0")
|
||||
# is_copy :integer default("0")
|
||||
# visits :integer default("0")
|
||||
# syllabus_id :integer
|
||||
# invite_code :string(255)
|
||||
# qrcode :string(255)
|
||||
# qrcode_expiretime :integer default("0")
|
||||
# invite_code_halt :integer default("0")
|
||||
# os_allow :integer default("0")
|
||||
# credit :float(24)
|
||||
# is_end :boolean default("0")
|
||||
# end_date :date
|
||||
# choose_group_allow :boolean default("0")
|
||||
# homepage_show :boolean default("0")
|
||||
# course_list_id :integer
|
||||
# members_count :integer default("0")
|
||||
# homework_commons_count :integer default("0")
|
||||
# show_unit :boolean default("0")
|
||||
# teacher_list :string(255) default("老师")
|
||||
# student_list :string(255) default("学生")
|
||||
# is_hidden :boolean default("0")
|
||||
# course_members_count :integer default("0")
|
||||
# course_groups_count :integer default("0")
|
||||
# authentication :boolean default("0")
|
||||
# professional_certification :boolean default("0")
|
||||
# graduation_topics_count :integer default("0")
|
||||
# graduation_tasks_count :integer default("0")
|
||||
# polls_count :integer default("0")
|
||||
# exercises_count :integer default("0")
|
||||
# start_date :date
|
||||
# subject_id :integer default("0")
|
||||
# excellent :boolean default("0")
|
||||
# email_notify :boolean default("0")
|
||||
# sticky :boolean default("0")
|
||||
# sticky_time :datetime
|
||||
# laboratory_id :integer
|
||||
# mooc_course_id :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_courses_on_invite_code (invite_code) UNIQUE
|
||||
# index_courses_on_laboratory_id (laboratory_id)
|
||||
# index_courses_on_mooc_course_id (mooc_course_id)
|
||||
# index_courses_on_school_id_and_is_delete (school_id,is_delete)
|
||||
# index_courses_on_subject_id (subject_id)
|
||||
# index_courses_on_tea_id (tea_id)
|
||||
#
|
||||
|
||||
class Trustie::Course < Trustie::Database
|
||||
has_many :course_groups, class_name: "Trustie::CourseGroup"
|
||||
has_many :homework_commons, class_name: "Trustie::HomeworkCommon"
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,25 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: course_groups
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# name :string(255)
|
||||
# course_id :integer
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# members_count :integer
|
||||
# invite_code :string(255)
|
||||
# position :integer default("0")
|
||||
# course_members_count :integer default("0")
|
||||
# invite_code_halt :boolean default("0")
|
||||
# invite_code_set :integer default("0")
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_course_groups_on_course_id (course_id)
|
||||
# index_course_groups_on_invite_code (invite_code) UNIQUE
|
||||
#
|
||||
|
||||
class Trustie::CourseGroup < Trustie::Database
|
||||
belongs_to :course, class_name: "Trustie::Course"
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,54 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: homework_commons
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# name :string(255)
|
||||
# user_id :integer
|
||||
# description :text(65535)
|
||||
# publish_time :datetime
|
||||
# end_time :datetime
|
||||
# homework_type :integer default("1")
|
||||
# late_penalty :string(255) default("0")
|
||||
# course_id :integer
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# teacher_priority :integer default("1")
|
||||
# anonymous_comment :boolean default("0")
|
||||
# quotes :integer default("0")
|
||||
# is_open :integer default("0")
|
||||
# simi_time :datetime
|
||||
# score_open :boolean default("0")
|
||||
# anonymous_appeal :boolean default("0")
|
||||
# homework_bank_id :integer
|
||||
# is_update :boolean default("0")
|
||||
# is_public :boolean default("0")
|
||||
# reference_answer :text(65535)
|
||||
# answer_public :boolean default("0")
|
||||
# archive_time :datetime
|
||||
# allow_late :boolean default("0")
|
||||
# late_time :datetime
|
||||
# work_public :boolean default("0")
|
||||
# explanation :text(65535)
|
||||
# unified_setting :boolean default("1")
|
||||
# comment_public :boolean default("1")
|
||||
# course_homework_category_id :integer
|
||||
# work_efficiency :boolean default("0")
|
||||
# eff_score :float(24) default("0")
|
||||
# max_efficiency :float(24) default("0")
|
||||
# course_second_category_id :integer default("0")
|
||||
# calculation_time :datetime
|
||||
# position :integer default("0")
|
||||
# total_score :float(24) default("100")
|
||||
# category_position :integer default("0")
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_homework_commons_on_course_id_and_id (course_id,id)
|
||||
# index_homework_commons_on_course_second_category_id (course_second_category_id)
|
||||
# index_homework_commons_on_homework_bank_id (homework_bank_id)
|
||||
#
|
||||
|
||||
class Trustie::HomeworkCommon < Trustie::Database
|
||||
belongs_to :course, class_name: "Trustie::Course"
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -39,13 +39,14 @@
|
|||
# business :boolean default("0")
|
||||
# profile_completed :boolean default("0")
|
||||
# laboratory_id :integer
|
||||
# platform :string(255) default("0")
|
||||
# gitea_token :string(255)
|
||||
# gitea_uid :integer
|
||||
# is_shixun_marker :boolean default("0")
|
||||
# admin_visitable :boolean default("0")
|
||||
# collaborator :boolean default("0")
|
||||
# gitea_uid :integer
|
||||
# is_sync_pwd :boolean default("1")
|
||||
# watchers_count :integer default("0")
|
||||
# devops_step :integer default("0")
|
||||
# gitea_token :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
@ -53,8 +54,9 @@
|
|||
# index_users_on_homepage_engineer (homepage_engineer)
|
||||
# index_users_on_homepage_teacher (homepage_teacher)
|
||||
# index_users_on_laboratory_id (laboratory_id)
|
||||
# index_users_on_login (login)
|
||||
# index_users_on_mail (mail)
|
||||
# index_users_on_login (login) UNIQUE
|
||||
# index_users_on_mail (mail) UNIQUE
|
||||
# index_users_on_phone (phone) UNIQUE
|
||||
# index_users_on_type (type)
|
||||
#
|
||||
|
||||
|
|
@ -66,6 +68,7 @@ class User < Owner
|
|||
include Likeable
|
||||
include BaseModel
|
||||
include Droneable
|
||||
include User::Avatar
|
||||
# include Searchable::Dependents::User
|
||||
|
||||
# devops step
|
||||
|
|
@ -134,10 +137,6 @@ class User < Owner
|
|||
|
||||
has_many :attachments,foreign_key: :author_id, :dependent => :destroy
|
||||
|
||||
# 关注
|
||||
# has_many :be_watchers, foreign_key: :user_id, dependent: :destroy # 我的关注
|
||||
# has_many :be_watcher_users, through: :be_watchers, dependent: :destroy # 我关注的用户
|
||||
|
||||
has_one :ci_cloud_account, class_name: 'Ci::CloudAccount', dependent: :destroy
|
||||
|
||||
# 认证
|
||||
|
|
@ -189,6 +188,10 @@ class User < Owner
|
|||
validate :validate_sensitive_string
|
||||
validate :validate_password_length
|
||||
|
||||
def name
|
||||
login
|
||||
end
|
||||
|
||||
# 删除自动登录的token,一旦退出下次会提示需要登录
|
||||
def delete_autologin_token(value)
|
||||
Token.where(:user_id => id, :action => 'autologin', :value => value).delete_all
|
||||
|
|
@ -203,7 +206,7 @@ class User < Owner
|
|||
end
|
||||
|
||||
def project_manager?(project)
|
||||
project.managers.exists?(user: self) || self.admin?
|
||||
project.manager?(self) || self.admin?
|
||||
end
|
||||
|
||||
# 学号
|
||||
|
|
|
|||
|
|
@ -0,0 +1,43 @@
|
|||
require 'letter_avatar/has_avatar'
|
||||
require 'chinese_pinyin'
|
||||
|
||||
class User
|
||||
module Avatar
|
||||
extend ActiveSupport::Concern
|
||||
include LetterAvatar::HasAvatar
|
||||
|
||||
def username
|
||||
self.lastname.blank? ? self.login : Pinyin.t(self.lastname)
|
||||
end
|
||||
|
||||
def get_letter_avatar_url(size = :lg)
|
||||
avatar_path(self.username, size).split('public/')&.last
|
||||
end
|
||||
|
||||
def self.get_letter_avatar_url(name)
|
||||
return "" if name.blank?
|
||||
avatar = LetterAvatar.generate Pinyin.t(name), 120
|
||||
avatar.split('public/')&.last
|
||||
end
|
||||
|
||||
def avatar_path(username, size)
|
||||
LetterAvatar.generate username, avatar_size(size)
|
||||
end
|
||||
|
||||
# 返回头像尺寸
|
||||
# xs: 22px
|
||||
# sm: 32px
|
||||
# md: 48px
|
||||
# lg: 120px
|
||||
def avatar_size(size)
|
||||
case size
|
||||
when :xs then 22
|
||||
when :sm then 32
|
||||
when :md then 48
|
||||
when :lg then 120
|
||||
else size
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
@ -12,7 +12,9 @@
|
|||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_user_actions_on_ip (ip)
|
||||
# index_user_actions_on_ip (ip)
|
||||
# index_user_actions_on_user_id (user_id)
|
||||
# index_user_actions_on_user_id_and_action_type (user_id,action_type)
|
||||
#
|
||||
|
||||
class UserAction < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -10,10 +10,13 @@
|
|||
# updated_at :datetime not null
|
||||
# register_status :integer default("0")
|
||||
# action_status :integer default("0")
|
||||
# is_delete :boolean default("0")
|
||||
# user_id :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_user_agents_on_ip (ip) UNIQUE
|
||||
# index_user_agents_on_ip (ip)
|
||||
# index_user_agents_on_user_id (user_id)
|
||||
#
|
||||
|
||||
class UserAgent < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -22,6 +22,9 @@
|
|||
# school_id :integer
|
||||
# description :string(255) default("")
|
||||
# department_id :integer
|
||||
# honor :text(65535)
|
||||
# edu_background :integer
|
||||
# edu_entry_year :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ class Organizations::CreateService < ApplicationService
|
|||
end
|
||||
|
||||
def create_org_and_extension
|
||||
@organization = Organization.build(params[:name], user.gitea_token)
|
||||
@organization = Organization.build(params[:name], params[:nickname], user.gitea_token)
|
||||
org_extension = OrganizationExtension.build(organization.id, description, website,
|
||||
location, repo_admin_change_team_access,
|
||||
visibility, max_repo_creation)
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ class Organizations::Teams::UpdateService < ApplicationService
|
|||
if team.authorize == "owner"
|
||||
update_params = params.slice(:description)
|
||||
else
|
||||
update_params = params.slice(:name, :description, :authorize, :includes_all_project, :can_create_org_project)
|
||||
update_params = params.slice(:name, :nickname, :description, :authorize, :includes_all_project, :can_create_org_project)
|
||||
end
|
||||
update_params
|
||||
end
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ class Projects::ForkService < ApplicationService
|
|||
new_repository.identifier = @project.identifier
|
||||
new_repository.save!
|
||||
|
||||
ProjectUnit.init_types(clone_project.id)
|
||||
|
||||
result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization).call
|
||||
|
||||
@project.update_column('forked_count', @project&.forked_count.to_i + 1)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
json.id organization.id
|
||||
json.name organization.login
|
||||
json.nickname organization.nickname.blank? ? organization.name : organization.nickname
|
||||
json.description organization.description
|
||||
json.website organization.website
|
||||
json.location organization.location
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
json.id team_project.id
|
||||
json.project do
|
||||
json.owner_name team_project&.project&.owner&.login
|
||||
json.owner_login team_project&.project&.owner&.login
|
||||
json.owner_name team_project&.project&.owner&.real_name
|
||||
json.owner_image_url url_to_avatar(team_project&.project&.owner)
|
||||
json.name team_project&.project&.name
|
||||
json.identifier team_project&.project&.identifier
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
json.id team.id
|
||||
json.name team.name
|
||||
json.nickname team.nickname.blank? ? team.name : team.nickname
|
||||
json.description team.description
|
||||
json.authorize team.authorize
|
||||
json.includes_all_project team.includes_all_project
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ json.author do
|
|||
json.name user.try(:show_real_name)
|
||||
json.type user&.type
|
||||
json.login user.login
|
||||
json.image_url render_avatar_url(user)
|
||||
json.image_url url_to_avatar(user)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -25,9 +25,10 @@ json.projects @projects do |project|
|
|||
json.image_url render_educoder_avatar_url(project.project_educoder)
|
||||
else
|
||||
user = project.owner
|
||||
json.type user.type
|
||||
json.name user.try(:show_real_name)
|
||||
json.login user.login
|
||||
json.image_url render_avatar_url(user)
|
||||
json.image_url url_to_avatar(user)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -5,4 +5,5 @@ json.description @project.description
|
|||
json.project_category_id @project.project_category_id
|
||||
json.project_language_id @project.project_language_id
|
||||
json.is_public @project.is_public
|
||||
json.website @project.website
|
||||
json.website @project.website
|
||||
json.lesson_url @project.lesson_url
|
||||
|
|
@ -1,11 +1,11 @@
|
|||
json.author do
|
||||
author = User.find_by(login: commit['Author']['Name'])
|
||||
json.partial! 'repositories/commit_author', locals: { user: author }
|
||||
author = User.find_by(mail: commit['Author']['Email'])
|
||||
json.partial! 'repositories/commit_author', locals: { user: author, name: commit['Committer']['Name'] }
|
||||
end
|
||||
|
||||
json.committer do
|
||||
author = User.find_by(login: commit['Committer']['Name'])
|
||||
json.partial! 'repositories/commit_author', locals: { user: author }
|
||||
author = User.find_by(mail: commit['Committer']['Email'])
|
||||
json.partial! 'repositories/commit_author', locals: { user: author, name: commit['Committer']['Name'] }
|
||||
end
|
||||
json.timestamp render_unix_time(commit['Committer']['When'])
|
||||
json.time_from_now time_from_now(commit['Committer']['When'])
|
||||
|
|
|
|||
|
|
@ -7,5 +7,5 @@ else
|
|||
json.id nil
|
||||
json.login name
|
||||
json.name name
|
||||
json.image_url File.join("avatars/User","b")
|
||||
json.image_url User::Avatar.get_letter_avatar_url(name)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -5,12 +5,15 @@ else
|
|||
json.total_count @hash_commit[:total_count]
|
||||
json.commits do
|
||||
json.array! @hash_commit[:body] do |commit|
|
||||
json.commit1 commit
|
||||
commiter = commit['committer']
|
||||
if commiter.present?
|
||||
commit_user_id = commiter['id']
|
||||
forge_user = User.simple_select.find_by(gitea_uid: commit_user_id)
|
||||
end
|
||||
|
||||
forge_user =
|
||||
if commiter.present?
|
||||
User.simple_select.find_by(mail: commiter['email'])
|
||||
else
|
||||
User.simple_select.find_by(mail: commit['commit']['committer']['email'])
|
||||
end
|
||||
|
||||
json.sha commit['sha']
|
||||
json.message commit['commit']['message']
|
||||
json.timestamp render_unix_time(commit['commit']['author']['date'])
|
||||
|
|
@ -23,7 +26,7 @@ else
|
|||
json.login commit['commit']['author']['name']
|
||||
json.type nil
|
||||
json.name commit['commit']['author']['name']
|
||||
json.image_url File.join("avatars/User","b")
|
||||
json.image_url User::Avatar.get_letter_avatar_url(commit['commit']['author']['name'])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
json.content @project.content
|
||||
json.website @project.website
|
||||
json.lesson_url @project.lesson_url
|
||||
if @result[:readme].blank?
|
||||
json.readme nil
|
||||
else
|
||||
|
|
|
|||
|
|
@ -6,4 +6,5 @@ json.project_category_id @project.project_category_id
|
|||
json.project_language_id @project.project_language_id
|
||||
json.private !@project.is_public
|
||||
json.website @project.website
|
||||
json.project_units @project.project_units.pluck(:unit_type)
|
||||
json.project_units @project.project_units.pluck(:unit_type)
|
||||
json.lesson_url @project.lesson_url
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
|
||||
json.count @count
|
||||
json.courses @courses, partial: 'users/courses/shared/course', as: :course
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
json.id course.id
|
||||
json.name course.name
|
||||
# json.members_count course.members_count
|
||||
json.members_count course.course_members_count
|
||||
# json.homework_commons_count course.homework_commons_count
|
||||
json.homework_commons_count get_tasks_count course
|
||||
json.attachments_count course.attachments.count
|
||||
json.visits course.visits
|
||||
json.school course.school&.name
|
||||
|
||||
json.first_category_url module_url(course.course_modules.where(hidden: 0).order(position: :desc).first, course)
|
||||
|
||||
json.is_public course.is_public
|
||||
json.can_visited observed_logged_user? || course.can_visited?
|
||||
|
||||
json.teacher do
|
||||
json.partial! 'users/shared/real_user', user: course.teacher
|
||||
end
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
json.id @user.id
|
||||
json.login @user.login
|
||||
json.name @user.full_name
|
||||
json.location @user.location
|
||||
json.image_url url_to_avatar(@user)
|
||||
json.url "#{request.base_url }/users/#{@user.login}"
|
||||
json.followers_count @user.followers_count
|
||||
json.followers_url "#{base_url}/users/#{@user.login}/fan_users"
|
||||
json.following_count @user.following_count
|
||||
json.following_url "#{base_url}/users/#{@user.login}/watchers"
|
||||
json.projects_count @user.projects_count
|
||||
json.projects_url "#{base_url}/users/#{@user.login}"
|
||||
json.projects_count @user.projects_count
|
||||
json.is_watch current_user&.watched?(@user)
|
||||
json.organizations @user.organizations do |organization|
|
||||
json.login organization.login
|
||||
json.name organization.real_name
|
||||
json.image_url url_to_avatar(organization)
|
||||
json.url "#{base_url}/organize/#{organization.login}"
|
||||
end
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
|
||||
json.count @count
|
||||
json.shixuns @shixuns, partial: 'users/shixuns/shared/shixun', as: :shixun, locals: { user: observed_user }
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
json.id shixun.id
|
||||
json.identifier shixun.identifier
|
||||
json.tag shixun.first_tag_repertoire&.name
|
||||
json.image_url url_to_avatar(shixun)
|
||||
json.name shixun.name
|
||||
json.status shixun.status
|
||||
json.human_status shixun.human_status
|
||||
json.challenges_count shixun.challenges_count
|
||||
json.finished_challenges_count @finished_challenges_count_map&.fetch(shixun.id, 0) || shixun.finished_challenges_count(user)
|
||||
json.is_jupyter shixun.is_jupyter
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
json.extract! video, :id, :title, :cover_url, :file_url, :play_url, :vv, :user_id
|
||||
|
||||
json.play_duration video.video_play_duration
|
||||
json.published_at video.display_published_at
|
||||
json.created_at video.display_created_at
|
||||
json.updated_at video.display_updated_at
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
json.count @count
|
||||
json.videos @videos, partial: 'video', as: :video
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
json.count @count
|
||||
json.videos do
|
||||
json.array! @videos.each do |video|
|
||||
json.partial! 'video', video: video
|
||||
json.file_url nil
|
||||
end
|
||||
end
|
||||
|
|
@ -1 +0,0 @@
|
|||
json.partial! 'video', video: current_video
|
||||
|
|
@ -17,8 +17,8 @@ json.releases do
|
|||
json.tarball_url re["tarball_url"]
|
||||
json.zipball_url re["zipball_url"]
|
||||
json.draft re["draft"] ? "草稿" : (re["prerelease"] ? "预发行" : "稳定")
|
||||
json.created_at format_time(re["created_at"].to_s.to_time)
|
||||
json.published_at format_time(re["published_at"].to_s.to_time)
|
||||
json.created_at format_time(version.created_at.to_s.to_time)
|
||||
json.published_at format_time(version.created_at.to_s.to_time)
|
||||
json.user_name user.present? ? user.try(:show_real_name) : ""
|
||||
json.image_url user.present? ? url_to_avatar(user) : ""
|
||||
else
|
||||
|
|
@ -33,8 +33,8 @@ json.releases do
|
|||
json.tarball_url re["tarball_url"]
|
||||
json.zipball_url re["zipball_url"]
|
||||
json.draft re["draft"] ? "草稿" : (re["prerelease"] ? "预发行" : "稳定")
|
||||
json.created_at format_time(re["created_at"].to_s.to_time)
|
||||
json.published_at format_time(re["published_at"].to_s.to_time)
|
||||
json.created_at format_time(version.created_at.to_s.to_time)
|
||||
json.published_at format_time(version.created_at.to_s.to_time)
|
||||
json.user_name user.present? ? user.try(:show_real_name) : ""
|
||||
json.image_url user.present? ? url_to_avatar(user) : ""
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
json.user do
|
||||
json.partial! 'weapps/shared/user', locals: { user: current_user }
|
||||
end
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
json.course do
|
||||
json.(@course, :id, :name)
|
||||
json.code_halt @course.invite_code_halt == 1
|
||||
json.invite_code @course.invite_code_halt == 0 ? @course.generate_invite_code : ""
|
||||
json.teacher_name @course.teacher.real_name
|
||||
json.teacher_img url_to_avatar(@course.teacher)
|
||||
json.teacher_school @course.school.try(:name)
|
||||
end
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
json.activities @activities do |activity|
|
||||
json.(activity, :course_act_id, :course_act_type)
|
||||
json.author do
|
||||
user = activity.user
|
||||
json.name user.real_name
|
||||
json.login user.login
|
||||
json.img url_to_avatar(user)
|
||||
end
|
||||
json.created_at activity.created_at.strftime('%m-%d %H:%M:')
|
||||
json.container_name activity.container_name
|
||||
json.container_type activity.course_act_type == "HomeworkCommon" ? activity.course_act&.homework_type : ""
|
||||
end
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
json.(@course, :id, :name, :credit, :end_date)
|
||||
json.course_list_name @course.course_list&.name
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
json.categories @categories.each do |category|
|
||||
json.(category, :id, :name)
|
||||
end
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
json.(@course, :id, :name, :course_members_count, :credit, :invite_code_halt)
|
||||
json.teachers_count @course.teachers.count
|
||||
json.students_count @course.students.count
|
||||
json.course_identity @current_user.course_identity(@course)
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
json.students student_list @students, @course.excellent, @user_course_identity
|
||||
json.students_count @students_count
|
||||
if @course_group
|
||||
json.course_group do
|
||||
json.(@course_group, :id, :name, :invite_code, :course_members_count)
|
||||
end
|
||||
end
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
json.teacher_list teacher_list(@teacher_list, @user_course_identity)
|
||||
json.teacher_list_size @teacher_list_size
|
||||
json.apply_size @applications_size
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
json.carousels do
|
||||
json.array! @carousels do |carousel|
|
||||
json.extract! carousel, :id, :link, :position
|
||||
|
||||
json.path carousel.link
|
||||
json.image_url Util::FileManage.source_disk_file_url(carousel)
|
||||
end
|
||||
end
|
||||
|
||||
if @advert.present?
|
||||
json.advert do
|
||||
json.extract! @advert, :id, :link
|
||||
json.image_url Util::FileManage.source_disk_file_url(@advert)
|
||||
end
|
||||
else
|
||||
json.advert nil
|
||||
end
|
||||
|
||||
json.course_count @course_count
|
||||
json.courses @courses.each do |course|
|
||||
json.(course, :id, :name, :visits, :course_members_count, :is_end, :invite_code_halt)
|
||||
json.creator course.teacher.real_name
|
||||
json.avatar_url url_to_avatar(course.teacher)
|
||||
json.invite_code course.invite_code_halt == 0 ? course.generate_invite_code : ""
|
||||
json.school course.school&.name
|
||||
course_member = @category == "study" ? course.students.where(user_id: @user.id).first : course.teachers.where(user_id: @user.id).first
|
||||
json.sticky course_member.sticky
|
||||
json.course_identity current_user.course_identity(course)
|
||||
end
|
||||
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
json.status 0
|
||||
json.user do
|
||||
json.partial! 'weapps/shared/user', locals: { user: @user }
|
||||
end
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
json.count @results.total_count
|
||||
json.results do
|
||||
json.array! @results.with_highlights(multiple: true) do |obj, highlights|
|
||||
json.merge! obj.to_searchable_json
|
||||
json.type obj.class.name.downcase
|
||||
|
||||
json.title highlights.delete(:name)&.join('...') || obj.searchable_title
|
||||
json.cover url_to_avatar(obj)
|
||||
|
||||
if obj.is_a?(Course)
|
||||
json.author_avatar_url url_to_avatar(obj.teacher)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
json.user do
|
||||
json.partial! 'weapps/shared/user', locals: { user: current_user }
|
||||
end
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
json.username user.full_name
|
||||
json.real_name user.real_name
|
||||
json.login user.login
|
||||
json.user_id user.id
|
||||
json.image_url url_to_avatar(user)
|
||||
json.admin user.admin?
|
||||
json.business user.business?
|
||||
json.is_teacher user.user_extension&.teacher?
|
||||
json.user_identity user.identity
|
||||
json.identity user.user_extension&.identity
|
||||
json.tidding_count 0
|
||||
json.user_phone_binded user.phone.present?
|
||||
json.phone user.phone
|
||||
json.profile_completed user.profile_completed?
|
||||
json.professional_certification user.professional_certification
|
||||
|
|
@ -1 +0,0 @@
|
|||
json.user_account @user.phone.present? ? @user.phone : (@user.mail.present? ? @user.mail : @user.login)
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
LetterAvatar.setup do |config|
|
||||
config.fill_color = 'rgba(255, 255, 255, 1)' # default is 'rgba(255, 255, 255, 0.65)'
|
||||
config.cache_base_path = 'public/system/lets' # default is 'public/system'
|
||||
config.colors_palette = :iwanthue # default is :google
|
||||
# config.weight = 500 # default is 300
|
||||
config.annotate_position = '-0+10' # default is -0+5
|
||||
# config.letters_count = 2 # default is 1
|
||||
config.pointsize = 300
|
||||
end
|
||||
|
|
@ -72,12 +72,12 @@ Rails.application.routes.draw do
|
|||
end
|
||||
|
||||
resources :statistic, only: [:index] do
|
||||
collection do
|
||||
collection do
|
||||
get :platform_profile
|
||||
get :platform_code
|
||||
get :active_project_rank
|
||||
get :active_developer_rank
|
||||
end
|
||||
end
|
||||
end
|
||||
resources :sync_forge, only: [:create] do
|
||||
collection do
|
||||
|
|
@ -198,6 +198,7 @@ Rails.application.routes.draw do
|
|||
get :projects
|
||||
get :watch_users
|
||||
get :fan_users
|
||||
get :hovercard
|
||||
end
|
||||
collection do
|
||||
post :following
|
||||
|
|
@ -218,6 +219,7 @@ Rails.application.routes.draw do
|
|||
post :sync_salt
|
||||
get :trustie_projects
|
||||
get :trustie_related_projects
|
||||
post :sync_user_info
|
||||
|
||||
scope '/ci', module: :ci do
|
||||
scope do
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
class AddLessonUrlToProjects < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
add_column :projects, :lesson_url, :string
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
class AddNicknameToTeams < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
add_column :teams, :nickname, :string
|
||||
end
|
||||
end
|
||||
Loading…
Reference in New Issue