Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun

issues25489
杨树林 5 years ago
commit 4b84d37825

4
.gitignore vendored

@ -7,6 +7,10 @@
# Ignore bundler config. # Ignore bundler config.
/.bundle /.bundle
# Ignore lock config file
*.lock
*.log
# mac # mac
*.DS_Store *.DS_Store

@ -78,12 +78,12 @@ class AccountsController < ApplicationController
return normal_status(-2, "违反平台使用规范,账号已被锁定") if @user.locked? return normal_status(-2, "违反平台使用规范,账号已被锁定") if @user.locked?
login_control = LimitForbidControl::UserLogin.new(@user) login_control = LimitForbidControl::UserLogin.new(@user)
return normal_status(-2, "登录密码出错已达上限,将锁定密码1小时") if login_control.forbid? return normal_status(-2, "登录密码出错已达上限,账号已被锁定, 请#{login_control.forbid_expires/60}分钟后重新登录或找回登录密码,") if login_control.forbid?
password_ok = @user.check_password?(params[:password].to_s) password_ok = @user.check_password?(params[:password].to_s)
unless password_ok unless password_ok
login_control.increment! login_control.increment!
return normal_status(-2, "误的账号或密码") return normal_status(-2, "你已经输错密码#{login_control.error_times}次,还剩余#{login_control.remain_times}次机会")
end end
successful_authentication(@user) successful_authentication(@user)
@ -111,9 +111,11 @@ class AccountsController < ApplicationController
return normal_status(-2, "验证码已失效") if !verifi_code&.effective? return normal_status(-2, "验证码已失效") if !verifi_code&.effective?
user.password, user.password_confirmation = params[:new_password], params[:new_password_confirmation] user.password, user.password_confirmation = params[:new_password], params[:new_password_confirmation]
if user.save! ActiveRecord::Base.transaction do
sucess_status user.save!
LimitForbidControl::UserLogin.new(user).clear
end end
sucess_status
rescue Exception => e rescue Exception => e
uid_logger_error(e.message) uid_logger_error(e.message)
tip_exception("密码重置失败") tip_exception("密码重置失败")

@ -8,8 +8,13 @@ class TrustieHacksController < ApplicationController
## 分页参数 ## 分页参数
page = params[:page] || 1 page = params[:page] || 1
limit = params[:limit] || 16 limit = params[:limit] || 16
search = params[:search]
hacks = @hackathon.trustie_hacks hacks = @hackathon.trustie_hacks
if search
hacks = hacks.where("name like ?", "%#{search}%")
end
@hackathon_users_count = hacks ? 0 : hacks.sum(:hack_users_count) @hackathon_users_count = hacks ? 0 : hacks.sum(:hack_users_count)
@hacks = hacks.page(page).per(limit) @hacks = hacks.page(page).per(limit)
@ -28,6 +33,11 @@ class TrustieHacksController < ApplicationController
render_ok render_ok
end end
def destroy
@hack.destroy
render_ok
end
def edit_hackathon def edit_hackathon
end end
@ -36,6 +46,16 @@ class TrustieHacksController < ApplicationController
render_ok render_ok
end end
# 报名入口
def entry
if @hack.hack_users.exists?(user_id: current_user)
render_error('已经报名,请勿重复操作')
else
@hack.hack_users.create(user_id: current_user)
render_ok
end
end
private private

@ -40,6 +40,14 @@ class LimitForbidControl::Base
end end
end end
def error_times
Rails.cache.read(cache_key).to_i
end
def remain_times
allow_times - error_times
end
def clear def clear
Rails.logger.info("[LimitForbidControl] Clear #{cache_key}") Rails.logger.info("[LimitForbidControl] Clear #{cache_key}")
Rails.cache.delete(forbid_cache_key) Rails.cache.delete(forbid_cache_key)

@ -12,7 +12,7 @@ class LimitForbidControl::UserLogin < LimitForbidControl::Base
def forbid_expires def forbid_expires
num = EduSetting.get('daily_error_password_forbid_time').presence.to_i num = EduSetting.get('daily_error_password_forbid_time').presence.to_i
num.zero? ? 1.hours : num.to_i.hours num.zero? ? 1.hours : num.to_i.minutes
end end
def cumulative_expires def cumulative_expires

@ -1,4 +1,9 @@
class TrustieHack < ApplicationRecord class TrustieHack < ApplicationRecord
has_many :hack_users, :dependent => :destroy has_many :hack_users, :dependent => :destroy
belongs_to :trustie_hackathon, counter_cache: true belongs_to :trustie_hackathon, counter_cache: true
def entry_info(user_id)
hack_users.exists?(user_id: user_id)
end
end end

@ -20,7 +20,7 @@
<td><%= myshixun.identifier %></td> <td><%= myshixun.identifier %></td>
<td class="text-left"> <td class="text-left">
<% current_task = myshixun.last_executable_task || myshixun.last_task %> <% current_task = myshixun.last_executable_task || myshixun.last_task %>
<%= link_to "/myshixuns/#{myshixun.identifier}/stages/#{current_task.identifier}", target: '_blank' do %> <%= link_to "/tasks/#{current_task.identifier}", target: '_blank' do %>
<%= overflow_hidden_span myshixun.shixun.name, width: 280 %> <%= overflow_hidden_span myshixun.shixun.name, width: 280 %>
<% end %> <% end %>
</td> </td>

@ -5,5 +5,6 @@ end
json.hacks @hacks do |hack| json.hacks @hacks do |hack|
json.(hack, :id, :name, :description, :hack_users_count) json.(hack, :id, :name, :description, :hack_users_count)
json.entry_info hack.entry_info(current_user.id)
end end

@ -880,7 +880,9 @@ Rails.application.routes.draw do
get :edit_hackathon get :edit_hackathon
post :update_hackathon post :update_hackathon
end end
member do
post :entry
end
end end
end end

@ -0,0 +1,5 @@
class AddUniqIndexForHackUsers < ActiveRecord::Migration[5.2]
def change
add_index :hack_users, [:user_id, :trustie_hack_id], unique: true
end
end

@ -18,7 +18,18 @@ class CompetitionContentspdfdownload extends Component{
componentDidMount(){ componentDidMount(){
window.document.title = '竞赛'; window.document.title = '竞赛';
let url=`/competitions/${this.props.match.params.identifier}/prize.json`; let url=`/competitions/${this.props.match.params.identifier}/prize.json`;
axios.get(url).then((response) => { let query=this.props.location&&this.props.location.search;
const types = query.split('user_id=')
let userid;
if(types[1]===undefined){
userid=this.props.user&&this.props.user.user_id;
}else{
userid=types[1];
}
axios.get(url,{params:{
user_id:userid,
}
}).then((response) => {
if(response.status===200){ if(response.status===200){
let datas=response.data.teams; let datas=response.data.teams;
@ -33,7 +44,6 @@ class CompetitionContentspdfdownload extends Component{
} }
}) })
} }
this.setState({ this.setState({
data:response.data, data:response.data,
teams:datas, teams:datas,

@ -39,7 +39,18 @@ class CompetitionContentspdfpeopledata extends Component {
GetawardinformationAPI = () => { GetawardinformationAPI = () => {
let url = `/competitions/${this.props.match.params.identifier}/prize.json`; let url = `/competitions/${this.props.match.params.identifier}/prize.json`;
axios.get(url).then((result) => { let query=this.props.location&&this.props.location.search;
const types = query.split('user_id=')
let userid;
if(types[1]===undefined){
userid=this.props.user&&this.props.user.user_id;
}else{
userid=types[1];
}
axios.get(url,{params:{
user_id:userid,
}
}).then((result) => {
if (result.data) { if (result.data) {
this.setState({ this.setState({
formationdata: result.data.formationdata, formationdata: result.data.formationdata,

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip,Spin, Pagination} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip,Spin, Pagination} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import axios from 'axios'; import axios from 'axios';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
export default function LeaderIcon(props = {}) { export default function LeaderIcon(props = {}) {
let icon = null; let icon = null;

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import { WordsBtn, MarkdownToHtml } from 'educoder'; import { WordsBtn, MarkdownToHtml } from 'educoder';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,DatePicker} from "antd"; import { Form, Select, Input, Button,Checkbox,DatePicker} from "antd";
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Spin,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Spin,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';

@ -1,4 +1,5 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Tooltip,Spin} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Tooltip,Spin} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import { WordsBtn,markdownToHTML } from 'educoder'; import { WordsBtn,markdownToHTML } from 'educoder';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';

@ -1,4 +1,4 @@
import React, {Component} from "React"; import React, {Component} from "react";
import {Form, Select, Input, Button, Checkbox, Upload, Icon, message, Modal} from "antd"; import {Form, Select, Input, Button, Checkbox, Upload, Icon, message, Modal} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Pagination, Table, Divider, Tag,Tooltip} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Pagination, Table, Divider, Tag,Tooltip} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import {getImageUrl, NoneData, sortDirections} from 'educoder'; import {getImageUrl, NoneData, sortDirections} from 'educoder';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag} from "antd";
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import { WordsBtn,markdownToHTML,AttachmentList} from 'educoder'; import { WordsBtn,markdownToHTML,AttachmentList} from 'educoder';

@ -26,7 +26,7 @@ const buildColumns = (that,isParent) => {
let showSorter = isParent==true let showSorter = isParent==true
const courseId = that.props.match.params.coursesId const courseId = that.props.match.params.coursesId
const columns=[{ const columns=[{
title: '序号1', title: '序号',
dataIndex: 'id', dataIndex: 'id',
key: 'id', key: 'id',
align:'center', align:'center',
@ -106,8 +106,9 @@ const buildColumns = (that,isParent) => {
} }
} }
]; ];
if (course_groups && course_groups.length) { if (course_groups && course_groups.length) {
this.isStudentPage && columns.push({ that.isStudentPage && columns.push({
title: '分班', title: '分班',
dataIndex: 'course_group_name', dataIndex: 'course_group_name',
key: 'course_group_name', key: 'course_group_name',

@ -1,4 +1,4 @@
import React, {Component} from "React"; import React, {Component} from "react";
import {Form, Select, Input, Button, Checkbox, DatePicker,Spin,Icon,AutoComplete,InputNumber,Breadcrumb} from "antd"; import {Form, Select, Input, Button, Checkbox, DatePicker,Spin,Icon,AutoComplete,InputNumber,Breadcrumb} from "antd";
import ApplyForAddOrgModal from '../../user/modal/ApplyForAddOrgModal'; import ApplyForAddOrgModal from '../../user/modal/ApplyForAddOrgModal';
import axios from 'axios'; import axios from 'axios';

@ -1,4 +1,4 @@
import React, {Component} from "React"; import React, {Component} from "react";
import {Form, Select, Input, Button, Checkbox, DatePicker,Spin,Icon,AutoComplete,InputNumber,Breadcrumb} from "antd"; import {Form, Select, Input, Button, Checkbox, DatePicker,Spin,Icon,AutoComplete,InputNumber,Breadcrumb} from "antd";
import ApplyForAddOrgModal from '../../user/modal/ApplyForAddOrgModal'; import ApplyForAddOrgModal from '../../user/modal/ApplyForAddOrgModal';
import axios from 'axios'; import axios from 'axios';

@ -1,4 +1,4 @@
import React,{Component} from "React"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,DatePicker} from "antd"; import { Form, Select, Input, Button,Checkbox,DatePicker} from "antd";
import locale from 'antd/lib/date-picker/locale/zh_CN'; import locale from 'antd/lib/date-picker/locale/zh_CN';

@ -2,7 +2,7 @@ import React, { Component } from "react";
import { message, Icon, Input, Form, Upload,Radio ,Tooltip} from "antd"; import { message, Icon, Input, Form, Upload,Radio ,Tooltip} from "antd";
import axios from 'axios' import axios from 'axios'
import ModalWrapper from "../../courses/common/ModalWrapper" import ModalWrapper from "../../courses/common/ModalWrapper"
import { City, getUploadActionUrl, getImageUrl, ImageLayer2, getUploadActionUrlOfAuth ,ConditionToolTip } from 'educoder' import { getUploadActionUrl, ImageLayer2 ,ConditionToolTip } from 'educoder'
import '../account/common.css' import '../account/common.css'
import AccountBasicEditItem from '../account/AccountBasicEditItem' import AccountBasicEditItem from '../account/AccountBasicEditItem'
import ApplyForAddOrgModal from './ApplyForAddOrgModal' import ApplyForAddOrgModal from './ApplyForAddOrgModal'
@ -469,12 +469,12 @@ class RealNameCertificationModal extends Component{
showApplyForAddChildOrgModal:this.showApplyForAddChildOrgModal showApplyForAddChildOrgModal:this.showApplyForAddChildOrgModal
} }
const uploadProps2 = { const uploadProps2 = {
name: 'image', // name: 'image',
data: {type: certification == 1 ? "real_name" : "professional"}, data: {type: certification == 1 ? "real_name" : "professional"},
multiple: true, multiple: true,
showUploadList: false, showUploadList: false,
// https://newweb.educoder.net // https://newweb.educoder.net
action: this.props.current_user ? `${getUploadActionUrlOfAuth(this.props.current_user.login)}` : '', action: this.props.current_user ? `${getUploadActionUrl()}` : '',
className: 'idPic-uploader', className: 'idPic-uploader',
onChange: this.handleChange2, onChange: this.handleChange2,
}; };

Loading…
Cancel
Save