diff --git a/app/controllers/admins/base_controller.rb b/app/controllers/admins/base_controller.rb
index f90c8a1ed..9a4a25013 100644
--- a/app/controllers/admins/base_controller.rb
+++ b/app/controllers/admins/base_controller.rb
@@ -10,6 +10,7 @@ class Admins::BaseController < ApplicationController
before_action :require_login, :require_admin!
after_action :rebind_event_if_ajax_render_partial
+ skip_before_action :check_sign
private
diff --git a/app/controllers/admins/users_controller.rb b/app/controllers/admins/users_controller.rb
index 9630394b4..b9a07ba1e 100644
--- a/app/controllers/admins/users_controller.rb
+++ b/app/controllers/admins/users_controller.rb
@@ -61,7 +61,7 @@ class Admins::UsersController < Admins::BaseController
private
def update_params
- params.require(:user).permit(%i[lastname nickname gender identity technical_title student_id
+ params.require(:user).permit(%i[lastname nickname gender identity technical_title student_id is_shixun_marker
mail phone location location_city school_id department_id admin business is_test
password professional_certification authentication])
end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 634209570..4faa42107 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -23,17 +23,21 @@ class ApplicationController < ActionController::Base
# 所有请求必须合法签名
def check_sign
- Rails.logger.info("66666 #{params}")
- if params[:client_key].present?
- Rails.logger.info("111111 #{params[:client_key]}")
- Rails.logger.info("00000 #{params[:timestamp]}")
- timestamp = params[:timestamp]
- sign = Digest::MD5.hexdigest("#{OPENKEY}#{timestamp}")
- Rails.logger.info("2222 #{sign}")
- tip_exception(501, "请求不合理") if sign != params[:client_key]
- else
- tip_exception(501, "请求不合理")
- end
+ # Rails.logger.info("66666 #{params}")
+ # suffix = request.url.split(".").last
+ # suffix_arr = ["xls", "xlsx"] # excel文件先注释
+ # unless suffix_arr.include?(suffix)
+ # if params[:client_key].present?
+ # randomcode = params[:randomcode]
+ # tip_exception(501, "请求不合理") unless (Time.now.to_i - randomcode.to_i).between?(0,5)
+ #
+ # sign = Digest::MD5.hexdigest("#{OPENKEY}#{randomcode}")
+ # Rails.logger.info("2222 #{sign}")
+ # tip_exception(501, "请求不合理") if sign != params[:client_key]
+ # else
+ # tip_exception(501, "请求不合理")
+ # end
+ # end
end
# 全局配置参数
@@ -42,6 +46,12 @@ class ApplicationController < ActionController::Base
EduSetting.get(name)
end
+ def shixun_marker
+ unless current_user.is_shixun_marker? || current_user.admin_or_business?
+ tip_exception(403, "..")
+ end
+ end
+
# 实训的访问权限
def shixun_access_allowed
if !current_user.shixun_permission(@shixun)
diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb
index 5fc81c5d5..e0dd71467 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -5,6 +5,7 @@ class AttachmentsController < ApplicationController
before_action :require_login, :check_auth, except: [:show]
before_action :find_file, only: %i[show destroy]
before_action :attachment_candown, only: [:show]
+ skip_before_action :check_sign, only: [:show, :create]
include ApplicationHelper
diff --git a/app/controllers/departments_controller.rb b/app/controllers/departments_controller.rb
index 5e82b2c51..73cb19156 100644
--- a/app/controllers/departments_controller.rb
+++ b/app/controllers/departments_controller.rb
@@ -1,4 +1,6 @@
class DepartmentsController < ApplicationController
+ skip_before_action :check_sign
+
def for_option
render_ok(departments: current_school.departments.without_deleted.select(:id, :name).as_json)
end
diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb
index 395e536f4..e8554300c 100644
--- a/app/controllers/main_controller.rb
+++ b/app/controllers/main_controller.rb
@@ -1,6 +1,10 @@
class MainController < ApplicationController
skip_before_action :check_sign
+ def first_stamp
+ render :json => { status: 0, message: Time.now.to_i }
+ end
+
def index
render file: 'public/react/build/index.html', :layout => false
end
diff --git a/app/controllers/schools_controller.rb b/app/controllers/schools_controller.rb
index 99ca62b4c..dc9f6c091 100644
--- a/app/controllers/schools_controller.rb
+++ b/app/controllers/schools_controller.rb
@@ -1,4 +1,5 @@
class SchoolsController < ApplicationController
+ skip_before_action :check_sign
def school_list
schools = School.all
diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb
index 8a752106c..4f2a19536 100644
--- a/app/controllers/shixuns_controller.rb
+++ b/app/controllers/shixuns_controller.rb
@@ -24,6 +24,7 @@ class ShixunsController < ApplicationController
before_action :portion_allowed, only: [:copy]
before_action :special_allowed, only: [:send_to_course, :search_user_courses]
+ before_action :shixun_marker, only: [:new, :create]
## 获取课程列表
def index
@@ -1151,4 +1152,5 @@ private
end
md5.hexdigest
end
+
end
diff --git a/app/controllers/subjects_controller.rb b/app/controllers/subjects_controller.rb
index 2c1b5a810..7df9aae89 100644
--- a/app/controllers/subjects_controller.rb
+++ b/app/controllers/subjects_controller.rb
@@ -7,6 +7,8 @@ class SubjectsController < ApplicationController
:search_members, :add_subject_members, :statistics, :shixun_report, :school_report,
:up_member_position, :down_member_position, :update_team_title]
before_action :require_admin, only: [:copy_subject]
+ before_action :shixun_marker, only: [:new, :create, :add_shixun_to_stage]
+
include ApplicationHelper
include SubjectsHelper
diff --git a/app/services/admins/identity_auths/agree_apply_service.rb b/app/services/admins/identity_auths/agree_apply_service.rb
index d75a6d7db..4528debb4 100644
--- a/app/services/admins/identity_auths/agree_apply_service.rb
+++ b/app/services/admins/identity_auths/agree_apply_service.rb
@@ -10,7 +10,6 @@ class Admins::IdentityAuths::AgreeApplyService < ApplicationService
ActiveRecord::Base.transaction do
apply.update!(status: 1)
user.update!(authentication: true)
-
RewardGradeService.call(user, container_id: user.id, container_type: 'Authentication', score: 500)
deal_tiding!
diff --git a/app/services/admins/professional_auths/agree_apply_service.rb b/app/services/admins/professional_auths/agree_apply_service.rb
index 1ca2da2fc..3d723412b 100644
--- a/app/services/admins/professional_auths/agree_apply_service.rb
+++ b/app/services/admins/professional_auths/agree_apply_service.rb
@@ -10,7 +10,7 @@ class Admins::ProfessionalAuths::AgreeApplyService < ApplicationService
ActiveRecord::Base.transaction do
apply.update!(status: 1)
user.update!(professional_certification: true)
-
+ user.update!(is_shixun_marker: true) if user.is_teacher?
RewardGradeService.call(user, container_id: user.id, container_type: 'Professional', score: 500)
deal_tiding!
diff --git a/app/services/admins/update_user_service.rb b/app/services/admins/update_user_service.rb
index 41b5065d0..6b1c0c857 100644
--- a/app/services/admins/update_user_service.rb
+++ b/app/services/admins/update_user_service.rb
@@ -25,6 +25,7 @@ class Admins::UpdateUserService < ApplicationService
ActiveRecord::Base.transaction do
user.save!
user.user_extension.save!
+ user.update!(is_shixun_marker: true) if user.is_certification_teacher
update_gitlab_password if params[:password].present?
end
@@ -36,7 +37,7 @@ class Admins::UpdateUserService < ApplicationService
def user_attributes
params.slice(*%i[lastname nickname mail phone admin business is_test
- professional_certification authentication])
+ professional_certification authentication is_shixun_marker])
end
def user_extension_attributes
diff --git a/app/views/admins/users/edit.html.erb b/app/views/admins/users/edit.html.erb
index abb003cbc..b1a8cbba1 100644
--- a/app/views/admins/users/edit.html.erb
+++ b/app/views/admins/users/edit.html.erb
@@ -120,6 +120,7 @@
<%= f.input :professional_certification, as: :boolean, label: '职业认证', checked_value: 1, unchecked_value: 0 %>
<%= f.input :authentication, as: :boolean, label: '实名认证', wrapper_html: { class: 'ml-3' }, checked_value: 1, unchecked_value: 0 %>
+ <%= f.input :is_shixun_marker, as: :boolean, label: '实训制作', wrapper_html: { class: 'ml-3' }, checked_value: 1, unchecked_value: 0 %>
diff --git a/app/views/users/get_user_info.json.jbuilder b/app/views/users/get_user_info.json.jbuilder
index e80c8c215..eeb66f6eb 100644
--- a/app/views/users/get_user_info.json.jbuilder
+++ b/app/views/users/get_user_info.json.jbuilder
@@ -14,6 +14,7 @@ json.email @user.mail
json.profile_completed @user.profile_completed?
json.professional_certification @user.professional_certification
json.main_site current_laboratory.main_site?
+json.is_shixun_marker current_user.is_shixun_marker? || current_user.admin_or_business?
if @course
json.course_identity @course_identity
json.course_name @course.name
diff --git a/config/routes.rb b/config/routes.rb
index f9ed12dbe..c9da309d2 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -15,6 +15,7 @@ Rails.application.routes.draw do
scope '/api' do
get 'home/index'
get 'home/search'
+ get 'main/first_stamp'
get 'search', to: 'searchs#index'
@@ -1336,6 +1337,7 @@ Rails.application.routes.draw do
root 'main#index'
+
## react用
get '*path', to: 'main#index', constraints: ReactConstraint.new
end
diff --git a/db/migrate/20191230094544_add_is_shixun_marker_for_users.rb b/db/migrate/20191230094544_add_is_shixun_marker_for_users.rb
new file mode 100644
index 000000000..5a1eee4b1
--- /dev/null
+++ b/db/migrate/20191230094544_add_is_shixun_marker_for_users.rb
@@ -0,0 +1,9 @@
+class AddIsShixunMarkerForUsers < ActiveRecord::Migration[5.2]
+ def change
+ add_column :users, :is_shixun_marker, :boolean, :default => false
+
+ User.joins(:user_extension)
+ .where(users: {professional_certification: 1}, user_extensions: {identity: 0})
+ .update_all(is_shixun_marker: 1)
+ end
+end
diff --git a/public/images/educoder/qqqun20191230.png b/public/images/educoder/qqqun20191230.png
new file mode 100644
index 000000000..e831b7d7b
Binary files /dev/null and b/public/images/educoder/qqqun20191230.png differ
diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js
index 29e7461ec..6759fc334 100644
--- a/public/react/src/AppConfig.js
+++ b/public/react/src/AppConfig.js
@@ -6,9 +6,10 @@ import { requestProxy } from "./indexEduplus2RequestProxy";
import { broadcastChannelOnmessage ,SetAppModel, isDev, queryString } from 'educoder';
import { notification } from 'antd';
import './index.css';
+const $ = window.$;
const opens ="79e33abd4b6588941ab7622aed1e67e8";
-let timestamp = Date.parse(new Date());
-const newopens=md5(opens+timestamp)
+let timestamp;
+let checkSubmitFlg = false;
broadcastChannelOnmessage('refreshPage', () => {
window.location.reload()
})
@@ -20,7 +21,7 @@ function locationurl(list){
window.location.href=list
}
}
-let hashTimeout
+
// TODO 开发期多个身份切换
let debugType =""
@@ -40,7 +41,29 @@ if (isDev) {
//ebugType="teacher";
// 学生
//debugType="student";
-
+ function railsgettimes(proxy) {
+ if(timestamp&&checkSubmitFlg===false){
+ $.ajax({url:proxy,async:false,success:function(data){
+ if(data.status===0){
+ timestamp=data.message;
+ }
+ }})
+ checkSubmitFlg=true
+ window.setTimeout(function () {
+ checkSubmitFlg=false;
+ }, 3500);
+ }else if(checkSubmitFlg===false){
+ $.ajax({url:proxy,async:false,success:function(data){
+ if(data.status===0){
+ timestamp=data.message;
+ }
+ }})
+ checkSubmitFlg=true
+ window.setTimeout(function () {
+ checkSubmitFlg=false;
+ }, 3500);
+ }
+}
window._debugType = debugType;
export function initAxiosInterceptors(props) {
initOnlineOfflineListener()
@@ -66,6 +89,7 @@ export function initAxiosInterceptors(props) {
window.setfalseInRequestMap = function(keyName) {
requestMap[keyName] = false;
}
+
axios.interceptors.request.use(
config => {
@@ -95,19 +119,23 @@ export function initAxiosInterceptors(props) {
}
if(`${config[0]}`!=`true`){
if (window.location.port === "3007") {
+ railsgettimes(`${proxy}/api/main/first_stamp.json`);
+ let newopens=md5(opens+timestamp)
config.url = `${proxy}${url}`;
if (config.url.indexOf('?') == -1) {
- config.url = `${config.url}?debug=${debugType}×tamp=${timestamp}&client_key=${newopens}`;
+ config.url = `${config.url}?debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`;
} else {
- config.url = `${config.url}&debug=${debugType}×tamp=${timestamp}&client_key=${newopens}`;
+ config.url = `${config.url}&debug=${debugType}&randomcode=${timestamp}&client_key=${newopens}`;
}
} else {
// 加api前缀
+ railsgettimes(`/api/main/first_stamp.json`);
+ let newopens=md5(opens+timestamp)
config.url = url;
if (config.url.indexOf('?') == -1) {
- config.url = `${config.url}?×tamp=${timestamp}&client_key=${newopens}`;
+ config.url = `${config.url}?&randomcode=${timestamp}&client_key=${newopens}`;
} else {
- config.url = `${config.url}×tamp=${timestamp}&client_key=${newopens}`;
+ config.url = `${config.url}&randomcode=${timestamp}&client_key=${newopens}`;
}
}
}
diff --git a/public/react/src/modal/GotoQQgroup.js b/public/react/src/modal/GotoQQgroup.js
new file mode 100644
index 000000000..0ac34da65
--- /dev/null
+++ b/public/react/src/modal/GotoQQgroup.js
@@ -0,0 +1,62 @@
+import React, { Component } from 'react';
+import {getImageUrl} from 'educoder';
+import { Modal} from 'antd';
+import axios from 'axios';
+import '../modules/user/account/common.css';
+import './gotoqqgroup.css'
+class GotoQQgroup extends Component {
+
+ constructor(props) {
+ super(props);
+ this.state={
+
+ }
+ }
+
+ modalCancel=()=>{
+ try {
+ this.props.setgoshowqqgtounp(false);
+ }catch (e) {
+
+ }
+ }
+
+ setDownload=()=>{
+ //立即联系
+ try {
+ this.props.setgoshowqqgtounp(false);
+ }catch (e) {
+
+ }
+ }
+
+
+ render() {
+
+ return(
+
+
+
您可以在QQ服务群向管理员申请,获得继续操作的权限
+
![]({getImageUrl("images/educoder/qqqun20191230.png")}/)
+
+
+
+
+
+ )
+ }
+}
+
+export default GotoQQgroup;
diff --git a/public/react/src/modal/gotoqqgroup.css b/public/react/src/modal/gotoqqgroup.css
new file mode 100644
index 000000000..777b7992f
--- /dev/null
+++ b/public/react/src/modal/gotoqqgroup.css
@@ -0,0 +1,61 @@
+/* 中间居中 */
+.intermediatecenter{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+/* 简单居中 */
+.intermediatecenterysls{
+ display: flex;
+ align-items: center;
+}
+.spacearound{
+ display: flex;
+ justify-content: space-around;
+
+}
+.spacebetween{
+ display: flex;
+ justify-content: space-between;
+}
+/* 头顶部居中 */
+.topcenter{
+ display: -webkit-flex;
+ flex-direction: column;
+ align-items: center;
+
+}
+
+
+/* x轴正方向排序 */
+/* 一 二 三 四 五 六 七 八 */
+.sortinxdirection{
+ display: flex;
+ flex-direction:row;
+}
+/* x轴反方向排序 */
+/* 八 七 六 五 四 三 二 一 */
+.xaxisreverseorder{
+ display: flex;
+ flex-direction:row-reverse;
+}
+/* 垂直布局 正方向*/
+/* 一
+ 二
+ 三
+ 四
+ 五
+ 六
+ 七
+ 八 */
+.verticallayout{
+ display: flex;
+ flex-direction:column;
+}
+/* 垂直布局 反方向*/
+.reversedirection{
+ display: flex;
+ flex-direction:column-reverse;
+}
+
diff --git a/public/react/src/modules/home/shixunsHome.js b/public/react/src/modules/home/shixunsHome.js
index a495a97c3..3e295344c 100644
--- a/public/react/src/modules/home/shixunsHome.js
+++ b/public/react/src/modules/home/shixunsHome.js
@@ -31,13 +31,15 @@ class ShixunsHome extends Component {
}
}
componentDidMount(){
- configShareForIndex()
+ configShareForIndex()
const upsystem=`/users/system_update.json`;
axios.get(upsystem).then((response)=>{
- let updata=response.data;
- this.setState({
- updata:updata
- })
+ if(response.data){
+ let updata=response.data;
+ this.setState({
+ updata:updata
+ })
+ }
}).catch((error)=>{
console.log(error);
})
@@ -50,7 +52,7 @@ class ShixunsHome extends Component {
})
}
}).catch((error)=>{
- console.log(error)
+ // console.log(error)
});
}
diff --git a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js
index c296899f2..cd78ceaa2 100644
--- a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js
+++ b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js
@@ -7,6 +7,8 @@ import Addshixuns from './Addshixuns';
import '../ShixunPaths.css';
import axios from 'axios';
import NewShixunModel from '../../courses/coursesPublic/NewShixunModel';
+import GotoQQgroup from "../../../modal/GotoQQgroup";
+
const $ = window.$;
const Search = Input.Search;
@@ -54,8 +56,10 @@ class DetailCardsEditAndAdd extends Component{
ChooseShixunListshixun_list:undefined,
stage_nametype:false,
descriptiontype:false,
- Addshixunstype:false
- }
+ Addshixunstype:false,
+ goshowqqgtounp:false,
+
+ }
this.onDragEnd = this.onDragEnd.bind(this);
}
//选择实训弹框
@@ -315,6 +319,12 @@ class DetailCardsEditAndAdd extends Component{
}
Addshixuns=()=>{
+ // debugger
+ // console.log("点击了新建实训Addshixuns");
+ if(this.props&&this.props.current_user&&this.props.current_user.is_shixun_marker===false){
+ this.setgoshowqqgtounp(true);
+ return;
+ }
this.setState({
Addshixunstype:true,
})
@@ -349,7 +359,12 @@ class DetailCardsEditAndAdd extends Component{
console.log(error)
});
}
-
+ // 处理弹框
+ setgoshowqqgtounp=(bool)=>{
+ this.setState({
+ goshowqqgtounp:bool
+ })
+ }
render(){
let {selectShixun,
@@ -368,11 +383,19 @@ class DetailCardsEditAndAdd extends Component{
Modalsbottomval,
ChooseShixunListshixun_list,
stage_nametype,
- descriptiontype} = this.state
+ descriptiontype,
+ goshowqqgtounp
+ } = this.state
return(
+ {
+ goshowqqgtounp===true?
+
this.setgoshowqqgtounp(bool)}>
+ :
+ ""
+ }
{
+ if(this.props&&this.props.current_user&&this.props.current_user.is_shixun_marker===false){
+ this.setgoshowqqgtounp(true);
+ return;
+ }
this.setState({
Addshixunstype:true,
})
@@ -349,7 +356,12 @@ class DetailCardsEditAndEdit extends Component{
console.log(error)
});
}
-
+ // 处理弹框
+ setgoshowqqgtounp=(bool)=>{
+ this.setState({
+ goshowqqgtounp:bool
+ })
+ }
render(){
let {selectShixun,
@@ -369,11 +381,18 @@ class DetailCardsEditAndEdit extends Component{
delectfunvalue,
ChooseShixunListshixun_list,
stage_nametype,
- descriptiontype
+ descriptiontype,
+ goshowqqgtounp
} = this.state
return(
+ {
+ goshowqqgtounp===true?
+ this.setgoshowqqgtounp(bool)}>
+ :
+ ""
+ }
{
return;
}
+
+
+ if(this.props&&this.props.current_user&&this.props.current_user.is_shixun_marker===false){
+ this.setgoshowqqgtounp(true);
+ return;
+ }
+
+
+
+
+
+
if(url !== undefined || url!==""){
window.location.href = url;
}
@@ -790,6 +807,14 @@ submittojoinclass=(value)=>{
return false
}
}
+
+
+ // 处理弹框
+ setgoshowqqgtounp=(bool)=>{
+ this.setState({
+ goshowqqgtounp:bool
+ })
+ }
render() {
const isLogin = true; // 这里不会出现未登录的情况,服务端在服务端路由时发现如果是未登录,则跳转到登录页了。
const {match} = this.props;
@@ -808,6 +833,7 @@ submittojoinclass=(value)=>{
headtypesonClickbool,
headtypess,
mygetHelmetapi2,
+ goshowqqgtounp,
}=this.state;
/*
用户名称 用户头像url
@@ -898,7 +924,9 @@ submittojoinclass=(value)=>{
})
}
-
+ // console.log("newHeadersnewHeaders");
+ // console.log(this.props);
+ // this.props.current_user.is_shixun_marker
return (