From b9ae0d3720d9e3b038f4a00a273cc63fdba10983 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com>
Date: Wed, 16 Oct 2019 10:35:23 +0800
Subject: [PATCH 01/10] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=B5=84=E6=BA=90?=
=?UTF-8?q?=E5=BC=B9=E7=AA=97=E7=AD=9B=E9=80=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/modules/courses/Resource/index.js | 94 ++++++++++++-------
1 file changed, 61 insertions(+), 33 deletions(-)
diff --git a/public/react/src/modules/courses/Resource/index.js b/public/react/src/modules/courses/Resource/index.js
index 3bcc9c6b8..d5b3b5ad2 100644
--- a/public/react/src/modules/courses/Resource/index.js
+++ b/public/react/src/modules/courses/Resource/index.js
@@ -28,7 +28,7 @@ class Fileslists extends Component{
pagesize: 15,
tagname:undefined,
search:undefined,
- sort:undefined,
+ sort:"desc",
sorttype:"created_on",
coursesecondcategoryid:undefined,
filesId:undefined,
@@ -49,16 +49,19 @@ class Fileslists extends Component{
checkBoxValues:[],
checkAllValue:false
})
+
if(this.props.match.params.main_id){
- this.seactall();
this.setState({
child:false,
+ sort:"desc"
})
+ this.seactall(undefined,"desc");
}else if(this.props.match.params.Id){
- this.seactall(parseInt(this.props.match.params.Id),1)
this.setState({
child:true,
+ sort:"desc"
})
+ this.seactall(parseInt(this.props.match.params.Id),"desc")
}
this.updadatalist();
on('updateNavSuccess', this.updateNavSuccess)
@@ -66,13 +69,14 @@ class Fileslists extends Component{
}
updateNavSuccess=()=>{
+ let{sort}=this.state;
this.setState({
isSpin:true
})
if(this.props.match.params.main_id){
- this.seactall();
+ this.seactall(undefined,sort);
}else if(this.props.match.params.Id){
- this.seactall(parseInt(this.props.match.params.Id),1)
+ this.seactall(parseInt(this.props.match.params.Id),sort)
}
}
componentDidUpdate = (prevProps) => {
@@ -85,8 +89,9 @@ class Fileslists extends Component{
if(this.props.match.params.main_id!=undefined){
this.setState({
child:false,
+ sort:"desc"
})
- this.seactall();
+ this.seactall(undefined,"desc");
}
}
if(prevProps.match.params.Id != this.props.match.params.Id){
@@ -98,8 +103,9 @@ class Fileslists extends Component{
if(this.props.match.params.Id!=undefined){
this.setState({
child:true,
+ sort:"desc"
})
- this.seactall(parseInt(this.props.match.params.Id),1)
+ this.seactall(parseInt(this.props.match.params.Id),"desc")
}
}
}
@@ -138,29 +144,42 @@ class Fileslists extends Component{
}
updatafiled=()=>{
+ let{sort}=this.state;
if(this.props.match.params.main_id){
- this.seactall();
+ this.seactall(undefined,sort);
}else if(this.props.match.params.Id){
- this.seactall(parseInt(this.props.match.params.Id),1)
+ this.seactall(parseInt(this.props.match.params.Id),sort)
}
}
- seactall=(coursesecondcategoryid,type)=>{
+ seactall=(coursesecondcategoryid,sort)=>{
this.setState({
coursesecondcategoryid:coursesecondcategoryid,
isSpin:true
})
- let{pagesize,page,tagname,searchValue,sort,sorttype}=this.state;
+ let{pagesize,page,tagname,searchValue,sorttype}=this.state;
this.getfileslist(pagesize,page,tagname,searchValue,sort,sorttype,coursesecondcategoryid);
}
onSortTypeChange=(sorttype)=>{
- let{pagesize,page,tagname,searchValue,sort,coursesecondcategoryid}=this.state;
- this.setState({
- sorttype:sorttype
- })
- this.getfileslist(pagesize,page,tagname,searchValue,sort,sorttype,coursesecondcategoryid);
+ let{pagesize,page,tagname,searchValue,sort,coursesecondcategoryid,}=this.state;
+ let newsort="desc";
+ if(sort==="desc"){
+ this.setState({
+ sorttype:sorttype,
+ sort:"asc"
+ })
+ newsort="asc"
+ }else{
+ this.setState({
+ sorttype:sorttype,
+ sort:"desc"
+ })
+ newsort="desc"
+ }
+
+ this.getfileslist(pagesize,page,tagname,searchValue,newsort,sorttype,coursesecondcategoryid);
}
getfileslist=(pagesize,page,tagname,searchValue,sort,sorttype,coursesecondcategoryid)=>{
@@ -176,7 +195,7 @@ class Fileslists extends Component{
page:page,
tag_name:tagname,
search:searchValue,
- sort:sort,
+ sort:sort==="desc"?0:1,
sort_type:sorttype,
course_second_category_id:id
}
@@ -353,7 +372,7 @@ class Fileslists extends Component{
Modalstype:false,
})
- let {checkBoxValues} = this.state;
+ let {checkBoxValues,sort} = this.state;
const cid = this.props.match.params.coursesId;
let url="/files/bulk_public.json";
@@ -363,7 +382,7 @@ class Fileslists extends Component{
})
.then((response) => {
if (response.data.status == 0) {
- this.seactall();
+ this.updatafiled()
//:response.data.message
this.props.showNotification("更新成功");
this.setState({
@@ -680,7 +699,8 @@ class Fileslists extends Component{
shixunmodal,
course_is_public,
filesId,
- child
+ child,
+ sort
} = this.state;
let category_id= this.props.match.params.category_id;
@@ -753,7 +773,7 @@ class Fileslists extends Component{
patheditarry={this.state.patheditarry}
coursesecondcategoryid={this.state.coursesecondcategoryid}
hidecouseShixunModal={this.hidecouseShixunModal}
- setupdate={(id)=>this.seactall(id)}
+ setupdate={(id)=>this.seactall(id,sort)}
attachmentId={this.state.coursesecondcategoryid}
/>:""}
@@ -768,7 +788,7 @@ class Fileslists extends Component{
Savesname={"确认"}
Cancel={this.Cancelvisible}
categoryid={category_id}
- setupdate={(id)=>this.seactall(id)}
+ setupdate={(id)=>this.seactall(id,sort)}
has_course_groups={this.state.has_course_groups}
attachmentId={this.state.coursesecondcategoryid}
/>:""}
@@ -779,7 +799,7 @@ class Fileslists extends Component{
Settingtype={Settingtype}
discussMessageid={discussMessageid}
course_id={this.props.match.params.coursesId}
- setupdate={(id)=>this.seactall(id)}
+ setupdate={(id)=>this.seactall(id,sort)}
Cancel={this.Cancelvisible}
has_course_groups={this.state.has_course_groups}
attachmentId={this.state.coursesecondcategoryid}
@@ -896,16 +916,24 @@ class Fileslists extends Component{
:""}
-
- {this.props.isAdmin()||this.props.isStudent()?
- {sorttype === 'created_on' ? '更新时间排序':sorttype === 'downloads' ?'下载次数排序':'引用次数排序'}
-
-
- {/*className={sorttype === 'created_on'?"none":""} className={sorttype === 'quotes'?"none":""} className={sorttype === 'downloads'?"none":""} */}
- - this.onSortTypeChange('created_on')}>更新时间排序
- - this.onSortTypeChange('downloads')}>下载次数排序
- {/*- this.onSortTypeChange('quotes')}>引用次数排序
*/}
-
+
+ {this.props.isAdmin()||this.props.isStudent()? this.onSortTypeChange('created_on')}>
+ 更新时间
+
+
+
+
:""}
From 7125e71563179bfd416496f0fa99a1e851a5eeae Mon Sep 17 00:00:00 2001
From: p31729568
Date: Wed, 16 Oct 2019 10:53:37 +0800
Subject: [PATCH 02/10] weapp api
---
app/controllers/weapps/base_controller.rb | 34 ++++++++++
.../weapps/code_sessions_controller.rb | 24 +++++++
.../weapps/registers_controller.rb | 63 +++++++++++++++++++
app/controllers/weapps/sessions_controller.rb | 24 +++++++
app/controllers/weapps/verifies_controller.rb | 8 +++
app/libs/wechat/weapp.rb | 38 ++++++++++-
config/configuration.yml.example | 3 +
config/initializers/wechat_init.rb | 8 +++
config/routes.rb | 7 +++
9 files changed, 208 insertions(+), 1 deletion(-)
create mode 100644 app/controllers/weapps/base_controller.rb
create mode 100644 app/controllers/weapps/code_sessions_controller.rb
create mode 100644 app/controllers/weapps/registers_controller.rb
create mode 100644 app/controllers/weapps/sessions_controller.rb
create mode 100644 app/controllers/weapps/verifies_controller.rb
diff --git a/app/controllers/weapps/base_controller.rb b/app/controllers/weapps/base_controller.rb
new file mode 100644
index 000000000..fadf10fb6
--- /dev/null
+++ b/app/controllers/weapps/base_controller.rb
@@ -0,0 +1,34 @@
+class Weapps::BaseController < ApplicationController
+
+ private
+
+ def require_wechat_login!
+ return if session_unionid.present?
+
+ render_error('请先进行微信授权')
+ end
+
+ def weapp_session_key
+ Wechat::Weapp.session_key(session_openid)
+ end
+
+ def set_weapp_session_key(session_key)
+ Wechat::Weapp.write_session_key(session_openid, session_key)
+ end
+
+ def session_openid
+ session[:openid]
+ end
+
+ def set_session_openid(openid)
+ session[:openid] = openid
+ end
+
+ def session_unionid
+ session[:unionid]
+ end
+
+ def set_session_unionid(unionid)
+ session[:unionid] = unionid
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/weapps/code_sessions_controller.rb b/app/controllers/weapps/code_sessions_controller.rb
new file mode 100644
index 000000000..7c1978e5f
--- /dev/null
+++ b/app/controllers/weapps/code_sessions_controller.rb
@@ -0,0 +1,24 @@
+class Weapps::CodeSessionsController < Weapps::BaseController
+ def create
+ return render_error('code不能为空') if params[:code].blank?
+
+ result = Wechat::Weapp.jscode2session(params[:code])
+
+ set_session_openid(result['openid'])
+ set_weapp_session_key(result['session_key']) # weapp session_key写入缓存 后续解密需要
+
+ # 已授权,绑定过账号
+ open_user = OpenUser::Wechat.find_by(uid: result['unionid'])
+ if open_user.present? && open_user.user
+ set_session_unionid(result['unionid'])
+ successful_authentication(open_user.user)
+ else
+ # 新用户
+ user_info = Wechat::Weapp.decrypt(result['session_key'], params[:encrypted_data], params[:iv])
+
+ set_session_unionid(user_info['unionId'])
+ end
+
+ render_ok(openid: result['openid'])
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/weapps/registers_controller.rb b/app/controllers/weapps/registers_controller.rb
new file mode 100644
index 000000000..0cbab7fd4
--- /dev/null
+++ b/app/controllers/weapps/registers_controller.rb
@@ -0,0 +1,63 @@
+class Weapps::RegistersController < Weapps::BaseController
+ before_action :require_wechat_login!
+
+ def create
+ # 查询验证码是否正确;type只可能是1或者8
+ type = phone_mail_type(params[:login].strip)
+ code = params[:code].strip
+
+ if type == 1
+ uid_logger("start register by phone: type is #{type}")
+ pre = 'p'
+ email = nil
+ phone = params[:login]
+ verifi_code = VerificationCode.where(phone: phone, code: code, code_type: 1).last
+ else
+ uid_logger("start register by email: type is #{type}")
+ pre = 'm'
+ email = params[:login]
+ phone = nil
+ verifi_code = VerificationCode.where(email: email, code: code, code_type: 8).last
+ end
+ uid_logger("start register: verifi_code is #{verifi_code}, code is #{code}, time is #{Time.now.to_i - verifi_code.try(:created_at).to_i}")
+ # check_code = (verifi_code.try(:code) == code.strip && (Time.now.to_i - verifi_code.created_at.to_i) <= 10*60)
+ # todo 上线前请删除万能验证码"513231"
+ unless code == "513231" && request.subdomain == "test-newweb"
+ return render_error('验证码不正确') if verifi_code.try(:code) != code.strip
+ return render_error('验证码已失效') if !verifi_code&.effective?
+ end
+
+ login = User.generate_login(pre)
+ @user = User.new(admin: false, login: login, mail: email, phone: phone, type: 'User')
+ @user.password = params[:password]
+ # 现在因为是验证码,所以在注册的时候就可以激活
+ @user.activate
+ # 必须要用save操作,密码的保存是在users中
+ ActiveRecord::Base.transaction do
+ @user.save!
+ UserExtension.create!(user_id: @user.id)
+ # 绑定微信号
+ OpenUsers::Wechat.create!(user: @user, uid: session_unionid)
+
+ # 注册完成,手机号或邮箱想可以奖励500金币
+ RewardGradeService.call(
+ @user,
+ container_id: @user.id,
+ container_type: pre == 'p' ? 'Phone' : 'Mail',
+ score: 500
+ )
+ end
+ successful_authentication(@user)
+ session[:user_id] = @user.id
+
+ render_ok
+ end
+
+ private
+
+ # 1 手机类型;0 邮箱类型
+ # 注意新版的login是自动名生成的
+ def phone_mail_type value
+ value =~ /^1\d{10}$/ ? 1 : 0
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/weapps/sessions_controller.rb b/app/controllers/weapps/sessions_controller.rb
new file mode 100644
index 000000000..f65111399
--- /dev/null
+++ b/app/controllers/weapps/sessions_controller.rb
@@ -0,0 +1,24 @@
+class Weapps::SessionsController < Weapps::BaseController
+ before_action :require_wechat_login!
+
+ def create
+ return render_error('重复登录') if current_user.present? && current_user.logged?
+
+ user = User.try_to_login(params[:login], params[:password])
+
+ return render_error('错误的账号或密码') if user.blank?
+ return render_error('违反平台使用规范,账号已被锁定') if user.locked?
+ return render_error('错误的账号或密码') unless user.check_password?(params[:password].to_s)
+
+ if user.wechat_open_user && user.wechat_open_user.uid != session_unionid
+ render_error('该账号已被其它微信号绑定')
+ return
+ end
+
+ # 绑定微信号
+ OpenUsers::Wechat.create!(user: user, uid: session_unionid) if user.wechat_open_user.blank?
+
+ successful_authentication(user)
+ render_ok
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/weapps/verifies_controller.rb b/app/controllers/weapps/verifies_controller.rb
new file mode 100644
index 000000000..5d8f4056e
--- /dev/null
+++ b/app/controllers/weapps/verifies_controller.rb
@@ -0,0 +1,8 @@
+class Weapps::VerifiesController < Weapps::BaseController
+ before_action :require_wechat_login!
+
+ def create
+ valid = Wechat::Weapp.verify?(session_openid, params[:verify_string], params[:signature])
+ render_ok(valid: valid)
+ end
+end
\ No newline at end of file
diff --git a/app/libs/wechat/weapp.rb b/app/libs/wechat/weapp.rb
index 54f60fa2a..755c9351a 100644
--- a/app/libs/wechat/weapp.rb
+++ b/app/libs/wechat/weapp.rb
@@ -1,4 +1,4 @@
-class Wechat::App
+class Wechat::Weapp
class << self
attr_accessor :appid, :secret
@@ -7,5 +7,41 @@ class Wechat::App
def client
@_client ||= Wechat::Client.new(appid, secret)
end
+
+ def session_key(openid)
+ Rails.cache.read(session_key_cache_key(openid))
+ end
+
+ def write_session_key(openid, session_key)
+ Rails.cache.write(session_key_cache_key(openid), session_key)
+ end
+
+ def verify?(openid, str, signature)
+ session_key = session_key(openid)
+ Digest::SHA1.hexdigest("#{str}#{session_key}") == signature
+ end
+
+ def decrypt(session_key, encrypted_data, iv)
+ session_key = Base64.decode64(session_key)
+ encrypted_data = Base64.decode64(encrypted_data)
+ iv = Base64.decode64(iv)
+
+ cipher = OpenSSL::Cipher::AES.new(128, :CBC)
+ cipher.decrypt
+ cipher.padding = 0
+ cipher.key = session_key
+ cipher.iv = iv
+ data = cipher.update(encrypted_data) << cipher.final
+ result = JSON.parse(data[0...-data.last.ord])
+
+ raise Wechat::Error, '解密错误' if result.dig('watermark', 'appid') != appid
+ result
+ end
+
+ private
+
+ def session_key_cache_key(openid)
+ "weapp:#{appid}:#{openid}:session_key"
+ end
end
end
\ No newline at end of file
diff --git a/config/configuration.yml.example b/config/configuration.yml.example
index 612011a7f..6ead04a54 100644
--- a/config/configuration.yml.example
+++ b/config/configuration.yml.example
@@ -18,6 +18,9 @@ defaults: &defaults
wechat:
appid: 'test'
secret: 'test'
+ weapp:
+ appid: 'test'
+ secret: 'test'
development:
<<: *defaults
diff --git a/config/initializers/wechat_init.rb b/config/initializers/wechat_init.rb
index 946e5f638..3fd8f9485 100644
--- a/config/initializers/wechat_init.rb
+++ b/config/initializers/wechat_init.rb
@@ -1,9 +1,12 @@
wechat_config = {}
+weapp_config = {}
begin
config = Rails.application.config_for(:configuration)
wechat_config = config['wechat']
+ weapp_config = config['weapp']
raise 'wechat config missing' if wechat_config.blank?
+ raise 'weapp config missing' if weapp_config.blank?
rescue => ex
raise ex if Rails.env.production?
@@ -12,5 +15,10 @@ rescue => ex
wechat_config = {}
end
+# 网站应用
Wechat::OfficialAccount.appid = wechat_config['appid']
Wechat::OfficialAccount.secret = wechat_config['secret']
+
+# 小程序
+Wechat::Weapp.appid = weapp_config['appid']
+Wechat::Weapp.secret = weapp_config['secret']
diff --git a/config/routes.rb b/config/routes.rb
index 605ae4194..1ef62c0e6 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -829,6 +829,13 @@ Rails.application.routes.draw do
get '/auth/qq/callback', to: 'oauth/qq#create'
get '/auth/wechat/callback', to: 'oauth/wechat#create'
resource :bind_user, only: [:create]
+
+ namespace :weapps do
+ resource :session, only: [:create]
+ resource :register, only: [:create]
+ resource :code_session, only: [:create]
+ resource :verify, only: [:create]
+ end
end
namespace :admins do
From e7723a600318836bb3c28458ce2397fb98480974 Mon Sep 17 00:00:00 2001
From: p31729568
Date: Wed, 16 Oct 2019 11:32:54 +0800
Subject: [PATCH 03/10] weapp: home api
---
app/controllers/weapps/homes_controller.rb | 12 ++++++++++++
app/views/weapps/homes/show.json.jbuilder | 14 ++++++++++++++
config/routes.rb | 1 +
3 files changed, 27 insertions(+)
create mode 100644 app/controllers/weapps/homes_controller.rb
create mode 100644 app/views/weapps/homes/show.json.jbuilder
diff --git a/app/controllers/weapps/homes_controller.rb b/app/controllers/weapps/homes_controller.rb
new file mode 100644
index 000000000..efb80b898
--- /dev/null
+++ b/app/controllers/weapps/homes_controller.rb
@@ -0,0 +1,12 @@
+class Weapps::HomesController < Weapps::BaseController
+ def show
+ # banner图
+ @images = PortalImage.where(status: true).order(position: :asc)
+
+ # 热门实训
+ @shixuns = Shixun.where(homepage_show: true).includes(:tag_repertoires, :challenges).limit(4)
+
+ # 热门实践课程
+ @subjects = Subject.where(homepage_show: true).includes(:shixuns, :repertoire).limit(4)
+ end
+end
\ No newline at end of file
diff --git a/app/views/weapps/homes/show.json.jbuilder b/app/views/weapps/homes/show.json.jbuilder
new file mode 100644
index 000000000..d2a451030
--- /dev/null
+++ b/app/views/weapps/homes/show.json.jbuilder
@@ -0,0 +1,14 @@
+json.images do
+ json.array! @images do |image|
+ json.path image.link
+ json.image_url Util::FileManage.source_disk_file_url(image)
+ end
+end
+
+json.shixuns do
+ json.partial! 'shixuns/shixun', locals: { shixuns: @shixuns }
+end
+
+json.subjects do
+ json.partial! 'subjects/subject', locals: { subjects: @subjects }
+end
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index 1ef62c0e6..4445278de 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -831,6 +831,7 @@ Rails.application.routes.draw do
resource :bind_user, only: [:create]
namespace :weapps do
+ resource :home, only: [:show]
resource :session, only: [:create]
resource :register, only: [:create]
resource :code_session, only: [:create]
From bd75a26ed270269f765653d5aa24a2d076c0c77e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com>
Date: Wed, 16 Oct 2019 11:50:18 +0800
Subject: [PATCH 04/10] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=AF=95=E5=8D=B7?=
=?UTF-8?q?=E5=92=8C=E4=BD=9C=E4=B8=9A=E8=AE=BE=E7=BD=AE=E8=A7=84=E5=88=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../courses/busyWork/CommonWorkSetting.js | 4 +-
.../courses/exercise/Exercisesetting.js | 6 ++-
.../exercise/Testpapersettinghomepage.js | 9 ++++
.../modules/courses/poll/PollDetailIndex.js | 21 +++++++-
.../courses/poll/PollDetailTabForth.js | 7 +++
.../courses/poll/PollDetailTabForthRules.js | 51 +++++++++++--------
.../shixunHomework/Trainingjobsetting.js | 2 +
public/react/src/modules/tpm/NewHeader.js | 2 +-
8 files changed, 76 insertions(+), 26 deletions(-)
diff --git a/public/react/src/modules/courses/busyWork/CommonWorkSetting.js b/public/react/src/modules/courses/busyWork/CommonWorkSetting.js
index ad25f553f..9aa31acb1 100644
--- a/public/react/src/modules/courses/busyWork/CommonWorkSetting.js
+++ b/public/react/src/modules/courses/busyWork/CommonWorkSetting.js
@@ -1128,7 +1128,9 @@ class CommonWorkSetting extends Component{
{{publicTimeTip}
}
:
- adaptered_group_settings && !!adaptered_group_settings.length && {
+ console.log(result)
if(result.status==200){
this.props.showNotification(`${result.data.message}`);
this.getSettingInfo();
@@ -369,6 +370,7 @@ class Exercisesetting extends Component{
}
this.commitSetting((result)=>{
+ console.log(result)
if(result.status==200){
this.props.showNotification(`${result.data.message}`);
this.cancelEdit();
@@ -702,7 +704,9 @@ class Exercisesetting extends Component{
:
{
console.log(error);
})
+
+ let{tab}=this.state;
+ try {
+ if(tab[0]==="0"){
+ this.child.Teacherliststudentlist();
+ }
+ if(tab[0]==="1"){
+ this.child.Teacherliststudentlist();
+ }
+ if(tab[0]==="2"){
+ this.child.Teacherliststudentlist();
+ }
+ if(tab[0]==="3"){
+ this.child.getSettingInfo();
+ }
+ }catch (e) {
+
+ }
}
componentDidMount(){
@@ -110,6 +128,7 @@ class PollDetailIndex extends Component{
DownloadMessageval:undefined
})
}
+ bindRef = ref => { this.child = ref };
render(){
let {tab,pollDetail,user_permission,polls_status}=this.state;
const { current_user } = this.props;
@@ -235,7 +254,7 @@ class PollDetailIndex extends Component{
}
{
//设置
- parseInt(tab[0])==3 &&
+ parseInt(tab[0])==3 &&
}
diff --git a/public/react/src/modules/courses/poll/PollDetailTabForth.js b/public/react/src/modules/courses/poll/PollDetailTabForth.js
index 98598a445..4a8a6f44c 100644
--- a/public/react/src/modules/courses/poll/PollDetailTabForth.js
+++ b/public/react/src/modules/courses/poll/PollDetailTabForth.js
@@ -90,6 +90,11 @@ class PollDetailTabForth extends Component{
if(this.props.isAdmin() === false){
this.cancelEdit()
}
+ try {
+ this.props.triggerRef(this);
+ }catch (e) {
+
+ }
}
componentDidUpdate = (prevProps) => {
if(prevProps.pollDetail!= this.props.pollDetail){
@@ -610,6 +615,8 @@ class PollDetailTabForth extends Component{
:
@@ -386,25 +386,30 @@ class PollDetailTabForthRules extends Component{
}`
}
-
+
+
+
{
rule.class_flag && rule.class_flag!=""?{rule.class_flag}:""
@@ -413,7 +418,9 @@ class PollDetailTabForthRules extends Component{
-
+
diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js
index b3b79ae28..2556a910b 100644
--- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js
+++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js
@@ -2261,6 +2261,8 @@ class Trainingjobsetting extends Component {
className="ml40"
>
{
strbool=false
}
}
- console.log(item.hidden);
+ // console.log(item.hidden);
return(
this.headtypesonClick(item.link,true)} className={`${headtypes===undefined?'pr':headtypes===item.link?'pr active':'pr'}`} style={item.hidden==false?{display: 'block'}:{display: 'none'}}>
{
From c12682323f8841758781a7cb4d76c9a7ae7c783b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com>
Date: Wed, 16 Oct 2019 12:17:00 +0800
Subject: [PATCH 05/10] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=93=8D=E4=BD=9C?=
=?UTF-8?q?=E6=8F=90=E7=A4=BA=E8=AF=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../react/src/modules/courses/coursesDetail/CoursesBanner.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/public/react/src/modules/courses/coursesDetail/CoursesBanner.js b/public/react/src/modules/courses/coursesDetail/CoursesBanner.js
index 8cd56e413..8173b226a 100644
--- a/public/react/src/modules/courses/coursesDetail/CoursesBanner.js
+++ b/public/react/src/modules/courses/coursesDetail/CoursesBanner.js
@@ -248,8 +248,8 @@ class CoursesBanner extends Component {
}
}
if (i ===5) {
- s = "复制将在后台执行,作业、资源、试卷都将复制到新课堂平台";
- ss = "将为你创建一个新的同名课堂,请问是否继续?";
+ s = "复制”功能将会为您创建一个新的课堂旧课堂的作业、资源、试卷";
+ ss = "都将被复制到新的课堂里面请问是否继续??";
this.showActionPoll(i,s,ss)
}
From 3337b86f5864a5ae3ca81ed3bc1a47dea2bfc7ee Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Wed, 16 Oct 2019 13:46:25 +0800
Subject: [PATCH 06/10] title={title}
---
.../modules/courses/common/titleSearch/TitleSearchSection.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/public/react/src/modules/courses/common/titleSearch/TitleSearchSection.js b/public/react/src/modules/courses/common/titleSearch/TitleSearchSection.js
index aa7a54cce..c71ef38ea 100644
--- a/public/react/src/modules/courses/common/titleSearch/TitleSearchSection.js
+++ b/public/react/src/modules/courses/common/titleSearch/TitleSearchSection.js
@@ -61,7 +61,8 @@ class Titlesearchsection extends Component{
- {title}
+ {/* title={title} */}
+ {title}
{ firstRowRight }
From 8466f8ef3b7b83bd00dd4c9538025244296e3051 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Wed, 16 Oct 2019 13:47:34 +0800
Subject: [PATCH 07/10] =?UTF-8?q?=E8=BF=94=E5=9B=9E=E8=87=B3=E5=88=86?=
=?UTF-8?q?=E7=8F=AD=E5=88=97=E8=A1=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
public/react/src/modules/courses/members/studentsList.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js
index a63509c59..8a223ce91 100644
--- a/public/react/src/modules/courses/members/studentsList.js
+++ b/public/react/src/modules/courses/members/studentsList.js
@@ -710,7 +710,7 @@ class studentsList extends Component{
title={isParent ? (pageType == TYPE_STUDENTS ? "全部学生" : "学生列表"):
-
+
{ this.props.history.push(`/courses/${courseId}/course_groups`)}}
style={{color: '#212121', verticalAlign: 'initial', marginRight: '14px' }}
>
From dea0ff8819f6420faac5d4d3b2cbef6bf5e3aa98 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Wed, 16 Oct 2019 13:54:19 +0800
Subject: [PATCH 08/10] =?UTF-8?q?item=E5=AE=BD=E5=BA=A6=E8=B6=85=E9=95=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/modules/courses/poll/PollDetailTabForthRules.js | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/public/react/src/modules/courses/poll/PollDetailTabForthRules.js b/public/react/src/modules/courses/poll/PollDetailTabForthRules.js
index cfcdfae4d..2a2ff218b 100644
--- a/public/react/src/modules/courses/poll/PollDetailTabForthRules.js
+++ b/public/react/src/modules/courses/poll/PollDetailTabForthRules.js
@@ -350,6 +350,12 @@ class PollDetailTabForthRules extends Component{
(学生收到{this.props.moduleName || (this.props.type==="Exercise"?"试卷":"问卷")}的时间)
({this.props.moduleName == '作业' ? '学生“按时”提交作品的时间截点' : '学生可以答题的时间截点'})
+ {/* item宽度超长 */}
+
{
rules && rules.length > 0 && rules.map((rule,r)=>{
@@ -383,7 +389,8 @@ class PollDetailTabForthRules extends Component{
`.ant-select{
min-width:200px,
min-heigth:200px
- }`
+ }
+ `
}
Date: Wed, 16 Oct 2019 14:19:01 +0800
Subject: [PATCH 09/10] wechat login: modify error tip when account binded
---
app/libs/hot_search_keyword.rb | 22 ++++++++++++++++++++++
app/services/create_bind_user_service.rb | 2 +-
2 files changed, 23 insertions(+), 1 deletion(-)
create mode 100644 app/libs/hot_search_keyword.rb
diff --git a/app/libs/hot_search_keyword.rb b/app/libs/hot_search_keyword.rb
new file mode 100644
index 000000000..e222bf3a7
--- /dev/null
+++ b/app/libs/hot_search_keyword.rb
@@ -0,0 +1,22 @@
+class HotSearchKeyword
+ class << self
+ def add(keyword)
+ return if keyword.blank?
+ Rails.cache.data.zincrby(redis_key, 1, keyword)
+ end
+
+ def hot(limit = 5)
+ Rails.cache.data.zrevrange(redis_key, 0, limit - 1)
+ end
+
+ def available?
+ Rails.cache.is_a?(ActiveSupport::Cache::RedisStore)
+ end
+
+ private
+
+ def redis_key
+ 'educoder:es:hot_keyword'
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/services/create_bind_user_service.rb b/app/services/create_bind_user_service.rb
index 93d9d87ca..f7fc5b6f6 100644
--- a/app/services/create_bind_user_service.rb
+++ b/app/services/create_bind_user_service.rb
@@ -17,7 +17,7 @@ class CreateBindUserService < ApplicationService
bind_user = User.try_to_login(params[:username], params[:password])
raise Error, '用户名或者密码错误' if bind_user.blank?
- raise Error, '该账号已被绑定' if bind_user.bind_open_user?(params[:type].to_s)
+ raise Error, '该账号已被其他微信号绑定,请更换其他账号进行绑定' if bind_user.bind_open_user?(params[:type].to_s)
ActiveRecord::Base.transaction do
open_user.user_id = bind_user.id
From 7ff2cb9d3fc0f4f686a00213a2d85021dce55bd3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com>
Date: Wed, 16 Oct 2019 14:19:18 +0800
Subject: [PATCH 10/10] =?UTF-8?q?=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/modules/courses/poll/PollDetailTabForthRules.js | 5 -----
public/react/src/modules/login/LoginDialog.css | 2 +-
2 files changed, 1 insertion(+), 6 deletions(-)
diff --git a/public/react/src/modules/courses/poll/PollDetailTabForthRules.js b/public/react/src/modules/courses/poll/PollDetailTabForthRules.js
index cfcdfae4d..ce1ee843e 100644
--- a/public/react/src/modules/courses/poll/PollDetailTabForthRules.js
+++ b/public/react/src/modules/courses/poll/PollDetailTabForthRules.js
@@ -386,10 +386,6 @@ class PollDetailTabForthRules extends Component{
}`
}
-
{
rule.class_flag && rule.class_flag!=""?{rule.class_flag}:""
diff --git a/public/react/src/modules/login/LoginDialog.css b/public/react/src/modules/login/LoginDialog.css
index 1b534c790..c791e04b3 100644
--- a/public/react/src/modules/login/LoginDialog.css
+++ b/public/react/src/modules/login/LoginDialog.css
@@ -109,7 +109,7 @@
right: -27px;
z-index: 100000;
}
-#logincloseIcon{
+.logincloseIcon{
position: absolute;
top: -100px;
right: -27px;