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' ?'下载次数排序':'引用次数排序'} - - + + {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{ }` } -