diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb index c7fcb4423..103c33aab 100644 --- a/app/controllers/challenges_controller.rb +++ b/app/controllers/challenges_controller.rb @@ -230,7 +230,7 @@ class ChallengesController < ApplicationController logger.info("############shixun_publiced:#{@shixun.public == 0}") if @shixun.public == 0 script = modify_shixun_script @shixun, @shixun.evaluate_script - @shixun.shixun_info.update_column(:evaluate_script, script) + @shixun.shixun_info.update_column(:evaluate_script, script) if script.present? end # TODO: # if path != params[:challenge][:path] diff --git a/app/controllers/ecloud_controller.rb b/app/controllers/ecloud_controller.rb new file mode 100644 index 000000000..8e29e5409 --- /dev/null +++ b/app/controllers/ecloud_controller.rb @@ -0,0 +1,375 @@ +#encoding=utf-8 +# 云启训练场(EduCoder)个人版 产品编码(appId) 9200108 +# 产品名称 计费类型 套餐编码 +# 云启训练场(EduCoder)个人版 固定包月 9200108001 +# 固定包月 9200108002 +# 固定包月 9200108003 +# --------------------------------------------------- +# 产品名称 计费类型 套餐编码 +# 云启训练场(EduCoder))院校版 包月+按license 9200109001 +# 包月+按license 9200109002 + +# 云启训练场(EduCoder))院校版 产品编码(appId) 9200109 + +require 'net/http' +require 'digest' + +class EcloudController < ApplicationController + + before_filter :save_para + before_filter :check_sign_key, only: [:ps_new, :ps_update, :bs_new, :bs_update] + + + def index + render file: 'public/react-oschina/build/index.html', :layout => false + end + + def trustie_login + end + + # 测试环境 + # CLIENT_ID = '1022' + # CLIENT_SECRET = '2112037a-6d7a-432b-9081-feb1153d8668' + # SERVER_URL = "https://221.176.54.92:9081/restful/services/" + # + + # 正式环境 + CLIENT_ID = '1056' + CLIENT_SECRET = '2e84256a-3de4-4713-9e02-10ee88a14592' + SERVER_URL = "https://221.176.53.130:44390/services/" + + + ## 签名 + def sign(timestamp) + Digest::MD5.hexdigest("client_id=#{CLIENT_ID}client_key=#{CLIENT_SECRET}timestamp=#{timestamp}").upcase + end + + + # 企业/个人业务开通 + # applyno 申请单号,唯一 + # ecordercode 唯一标志一个企业的订购关系 + # params['opttype']:操作类型。0开通;1变更;2试用转商用;4再次开通 + # 业务列表opttype: 0新增;1注销;2修改 + # serviceparas: 但是由于企业版是按成员收费的,所以serviceparas里面会传成员数;个人版是包月计费的,serviceparas不会传成员数 + def bs_new + ActiveRecord::Base.transaction do + begin + if params['opttype'] == 0 # 开通企业/个人业务 + ecloud = Ecloud.create!(eloud_params) + create_service(params['services'], ecloud.try(:id)) if params['services'].present? + create_product_params(params['productparas'], ecloud.try(:id)) if params['productparas'].present? + # 为管理员添加一条记录 + # 开通的时候都是用户的opttype也是0 + # 如果管理员已经存在,则不用重复开通 + euser = EcloudUser.where(userid: params['userid'], custid: params['custid']).first + unless euser + EcloudUser.create!(custid: params['custid'], opttype: params['opttype'], userid: params['userid'], + username: params['username'], useralias: params['useralias'], + mobile: params['mobile'], email: params['email'], begintime: params['begintime'], + endtime: params['endtime']) + end + elsif params['opttype'] == 2 # 试用转商用 # 变更企业/个人业务 + # 业务列表:注销业务(注销试用的套餐),另一个业务项的操作代码是:新增业务(开通商用的套餐) + # 需要通过产品服务编号和业务编码来区分哪个产品 + ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode'], trial: true).first + + # 注销试用的套餐 + ## 需要注销的套餐; 试用转商用是不会有批量操作的,所以可以使用first + des_service = params['services'].select{|s| s['opttype'] == 1}.first + esd = EcloudService.where(ecloud_id: ecloud.try(:id), code: des_service['code']).first + ecloud.update_attribute(:trial, params['trial']) + esd.update_attributes!(opttype: des_service['opttype'], begintime: des_service['begintime'], endtime: des_service['endtime']) + + # 试用转商用是不会有批量操作的 + # 新增业务 + add_service = params['services'].select{|s| s['opttype'] == 0} + create_service(add_service, ecloud.try(:id)) + # + + elsif params['opttype'] == 1 # 业务变更 + ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode']).first + # 套餐变更 + # 操作代码 0:新增业务,1:注销业务2:修改业务 + # # 新增服务 + add_service = params['services'].select{|s| s['opttype'] == 0} + create_service(add_service, ecloud.try(:id)) if add_service.present? + + # 如果有注销业务,注销业务 + des_services = params['services'].select{|s| s['opttype'] == 1} + if des_services.present? + des_services.each do |ds| + + logger.info("666666#{ecloud.try(:id)}, 55555555#{ds['code']}") + esd = EcloudService.where(ecloud_id: ecloud.try(:id), code: ds['code']).first + esd.update_attributes!(opttype: ds['opttype'], begintime: ds['begintime'], endtime: ds['endtime']) + end + end + + # 变更业务 + edt_services = params['services'].select{|s| s['opttype'] == 2} + if edt_services.present? + edt_services.each do |es| + ese = EcloudService.where(ecloud_id: ecloud.try(:id), code: es['code']).first + ese.update_attributes!(opttype: es['opttype'], begintime: es['begintime'], endtime: es['endtime']) if ese.present? + create_serviceparas(es['serviceparas'].first, ese.id) if ese.present? + end + end + + + # ecloud = Ecloud.where(bossorderid: params['bossorderid']).first + # ecloud.update_attributes!(eloud_params) + # ecloud.ecloud_productparas.destroy + # ecloud.ecloud_services.destroy + # + # ecloud_id = ecloud.try(:id) + + elsif params['opttype'] == 4 # 再次重复开通 + # 再次申请开通,这种情况就是累加时间 + ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode']).first + create_service(params['services'], ecloud.try(:id)) + create_product_params(params['productparas'], ecloud.try(:id)) if params['productparas'].present? + end + + # + # # 非试用情况下,为管理员单独创建一条账号,企业账号 + # unless params['trial'] + # EcloudUser.create!(ecloud_id: ecloud.try(:id), opttype: params['opttype'], userid: params['userid'], + # username: params['username'], useralias: params['useralias'], + # mobile: params['mobile'], email: params['email']) + # end + + render :json => {result: true, errmsg: ""} + # rescue Exception => e + # logger.error(e.message) + # render :json => {code: 500, msg: "#{e.message}"} + # raise ActiveRecord::Rollback + end + end + end + + # 企业/个人业务变更、注销 + # 处理业务平台退订、暂停(欠费暂停,信控暂停等)、暂停后恢复应用业务 + # 这个接口是不会新增业务的 + # 试用退订的时候bossorderid传空字符 + def bs_update + ActiveRecord::Base.transaction do + begin + case params['opttype'] + when 0 # 退订 + opttype = 6 + when 1 # 暂停 + opttype = 7 + when 2 # 恢复 + opttype = 8 + end + if params['bossorderid'].present? + ecloud = Ecloud.where(bossorderid: params['bossorderid']).first + ecloud.update_attribute(:opttype, opttype) + else + # 试用退订 + params['services'].each do |service| + ecloud_id = EcloudService.where(code: service['packagecode']).first.try(:ecloud_id) + Ecloud.find(ecloud_id).update_attribute(:opttype, opttype) + end + end + render :json => {result: true, errmsg: ""} + rescue Exception => e + logger.error(e.message) + render :json => {code: 500, msg: "#{e.message}"} + raise ActiveRecord::Rollback + end + end + end + + # 用户业务开通与变更接口 + # 授权statu为1,取消授权status为0 + # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; + + def ps_new + ActiveRecord::Base.transaction do + begin + user_params = params['users'] + user_params.each do |user_param| + if user_param['opttype'] == 0 # 开通 + EcloudUser.create!(custid: params['custid'], opttype: user_param['opttype'], userid: user_param['userid'], + username: user_param['username'], useralias: user_param['useralias'], + mobile: user_param['mobile'], email: user_param['email'], begintime: user_param['begintime'].to_s, + endtime: user_param['endtime'].to_s) + elsif user_param['opttype'] == 1 # 变更 + ecloud_user = EcloudUser.where(custid: params['custid'], userid: user_param['userid']).first + ecloud_user.update_attributes!(opttype: user_param['opttype'], username: user_param['username'], + useralias: user_param['useralias'], mobile: user_param['mobile'], email: user_param['email'], + begintime: user_param['begintime'].to_s, endtime: user_param['endtime'].to_s) + end + end + + render :json => {success: true, errmsg: ""} + # end + rescue Exception => e + logger.error(e.message) + render :json => {code: 500, msg: "#{e.message}"} + raise ActiveRecord::Rollback + end + end + end + + # 用户业务状态变更 + # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; + def ps_update + begin + user_params = params['users'] + user_params.each do |user_param| + case user_param['opttype'] + when 0 # 取消授权 + opttype = 3 + when 1 # 暂停 + opttype = 4 + when 2 # 恢复 + opttype = 5 + end + ecloud_user = EcloudUser.where(custid: params['custid'], userid: user_param['userid']).first + ecloud_user.update_attributes!(opttype: opttype, operatime: params['operatime'], effecttime: params['effecttime']) + end + + render :json => {success: true, errmsg: ""} + rescue Exception => e + logger.error(e.message) + render :json => {code: 500, msg: "#{e.message}"} + end + end + + def ecloud_login_callback + + unless params["test"] == 'true' + #获取code + logger.info "oauth2 login_callback: #{params}" + + raise "没有code" unless params[:code] + + url = "#{SERVER_URL}/oauth2/authorization?grant_type=authorization_code" + + "&client_id=#{CLIENT_ID}&scope=&redirect_uri=&code=#{params[:code]}" + + res = post(url) + logger.info "oauth2 authorization resp: #{res}" + # {"access_token":"ae673b2d-88b4-46cc-aa74-0b031f24b76f","expires":6,"refresh_token":"7380cc67-a59c-4c21-9000-70e12a58d175","username":"15111030087@QW_er","uid":2147} + + body = decode(res) + + raise '登录失败' unless body["access_token"] + + #获取此用户信息 + res = get("#{SERVER_URL}/user/info?access_token=#{body['access_token']}&userid=#{body['uid']}") + logger.info "oauth2 get user info: #{res}" + # {"userid":2147,"custid":2104,"custcode":"E0002018042810010054","custtype":2,"status":2,"username":"15111030087@QW_er","useralias":"15111030087","isadmin":true,"entprise":"04**004","departments":"","departmentnames":"","mobile":"15365386520","email":"15111030087@139.com"} + else + res = '{"userid":2147,"custid":2104,"custcode":"E0002018042810010054","custtype":2,"status":2,"username":"15111030087@QW_er","useralias":"15111030087","isadmin":true,"entprise":"04**004","departments":"","departmentnames":"","mobile":"15365386520","email":"15111030087@139.com"}' + end + + + # 同步用户 + info = decode(res) + + user = User.find_by_ecoder_user_id(info["userid"]) + unless user + #新建用户 + user = User.create_with_ecoder!(info) + end + + self.logged_user = user + + user = UserExtension.where(:user_id => User.current.id).first + # if user.gender.nil? || user.school_id.nil? || User.current.lastname.nil? + # redirect_to my_account_path + # elsif user.identity == 3 && user.school_id.nil? + # redirect_to my_account_path + # else + # redirect_to User.current + # end + redirect_to User.current + end + + + private + def get(url) + uri = URI(url) + + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = url.start_with?('https') + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Get.new(uri.request_uri) + request['Content-Type'] = 'application/json' + request['Accept'] = 'application/json' + response = http.request(request) + + response.body + end + + def post(url) + uri = URI(url) + + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = url.start_with?('https') + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Post.new(uri.request_uri) + request['Content-Type'] = 'application/json' + request['Accept'] = 'application/json' + response = http.request(request) + + response.body + end + + def decode(s) + begin + obj = ActiveSupport::JSON.decode(s) + rescue ActiveSupport::JSON.parse_error + logger.error("Attempted to decode invalid JSON: #{s}") + end + end + + private + def eloud_params + return {applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'], + trial: params['trial'], bossorderid: params['bossorderid'], custid: params['custid'], custtype: params['custtype'], + custcode: params['custcode'], registersource: params['registersource'], custname: params['custname'], + userid: params['userid'], username: params['username'], useralias: params['useralias'], mobile: params['mobile'], + email: params['email'], productcode: params['productcode'], begintime: params['begintime'], + endtime: params['endtime']} + end + + # 新增套餐 + def create_service services, ecloud_id + services.each do |service| + ese = EcloudService.create!(opttype: service['opttype'], code: service['code'], begintime: service['begintime'], + endtime: service['endtime'], ecloud_id: ecloud_id) + if service['serviceparas'].present? + create_serviceparas(service['serviceparas'].first, ese.id) + end + end + end + + def create_serviceparas params_serviceparas, ese_id + if params_serviceparas.present? + EcloudServieceServicepara.create(key: params_serviceparas['key'], value: params_serviceparas['value'], ecloud_service_id: ese_id) + end + end + + def create_product_params params, ecloud_id + params.each do |p| + EcloudProductpara.create(key: p['key'], value: p['value'], ecloud_id: ecloud_id) + end + end + + def check_sign_key + sign = sign(params['timestamp']) + if sign != params['sign'] + render :json => {code: 501, msg: "sign的值错误"} + return + end + end + + def save_para + EcloudLog.create(url: request.url, para_value: params, applyno: params['applyno'], custid: params['custid'], + custcode: params['custcode'], userid: params['userid'], username: params['username']) + end + +end diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index c40010be2..a5cc27967 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -86,11 +86,11 @@ class ShixunsController < ApplicationController @shixuns = @shixuns.includes(:tag_repertoires, :challenges).page(page).per(limit) - @tag_name_map = TagRepertoire.joins(:shixun_tag_repertoires) - .where(shixun_tag_repertoires: { shixun_id: @shixuns.map(&:id) }) - .group('shixun_tag_repertoires.shixun_id') - .select('shixun_id, tag_repertoires.name') - .each_with_object({}) { |r, obj| obj[r.shixun_id] = r.name } + #@tag_name_map = TagRepertoire.joins(:shixun_tag_repertoires) + # .where(shixun_tag_repertoires: { shixun_id: @shixuns.map(&:id) }) + # .group('shixun_tag_repertoires.shixun_id') + # .select('shixun_id, tag_repertoires.name') + # .each_with_object({}) { |r, obj| obj[r.shixun_id] = r.name } end def shixun_list diff --git a/app/controllers/subjects_controller.rb b/app/controllers/subjects_controller.rb index da88e3258..c78eff35a 100644 --- a/app/controllers/subjects_controller.rb +++ b/app/controllers/subjects_controller.rb @@ -17,76 +17,9 @@ class SubjectsController < ApplicationController include CustomSortable def index - @tech_system = current_laboratory.subject_repertoires - select = params[:select] # 路径导航类型 - reorder = params[:order] || "publish_time" - search = params[:search] - - ## 分页参数 - page = params[:page] || 1 - limit = params[:limit] || 16 - offset = (page.to_i-1) * limit - - # 最热排序 - if reorder == "myshixun_count" - subject_ids = current_laboratory.subjects.pluck(:id) - subject_ids = subject_ids.length > 0 ? "(" + subject_ids.join(",") + ")" : "(-1)" - laboratory_join = " AND subjects.id in #{subject_ids} " - - if select - @subjects = Subject.find_by_sql("SELECT subjects.id, subjects.user_id, subjects.name, subjects.stages_count, subjects.repertoire_id, subjects.status, subjects.public, - subjects.shixuns_count, subjects.excellent, sum(shixuns.myshixuns_count) AS myshixun_member_count FROM subjects join stage_shixuns - on stage_shixuns.subject_id = subjects.id join shixuns on shixuns.id = stage_shixuns.shixun_id where - subjects.hidden = 0 AND subjects.public = 2 AND subjects.name like '%#{search}%' #{laboratory_join} - AND subjects.repertoire_id = #{select} GROUP BY subjects.id ORDER BY myshixun_member_count DESC") - else - @subjects = Subject.find_by_sql("SELECT subjects.id, subjects.user_id, subjects.name, subjects.stages_count, subjects.repertoire_id, subjects.status, subjects.public, - subjects.shixuns_count, subjects.excellent, sum(shixuns.myshixuns_count) AS myshixun_member_count FROM subjects join stage_shixuns - on stage_shixuns.subject_id = subjects.id join shixuns on shixuns.id = stage_shixuns.shixun_id where - subjects.hidden = 0 AND subjects.public = 2 AND subjects.name like '%#{search}%' #{laboratory_join} - GROUP BY subjects.id ORDER BY myshixun_member_count DESC") - end - else - @subjects = current_laboratory.subjects - # 我的路径 - if reorder == "mine" - tip_exception(401, "..") unless current_user.logged? - - mine_subject_id = StageShixun.find_by_sql("select DISTINCT(subject_id) from stage_shixuns where shixun_id in - (select distinct(shixun_id) from myshixuns where user_id=#{current_user.id})").map(&:subject_id) - manage_subject_id = SubjectMember.where(user_id: current_user.id).pluck(:subject_id) - total_subject_id = (mine_subject_id + manage_subject_id).uniq - @subjects = @subjects.where(id: total_subject_id) - elsif reorder == "publish_time" - @subjects = @subjects.unhidden - else - @subjects = @subjects.publiced.unhidden - end - - # 类型 - if select - @subjects = @subjects.where(repertoire_id: select) - end - - if search.present? - @subjects = @subjects.where("name like ?", "%#{search}%") - end - - # 排序 - order_str = (reorder == "publish_time" ? "homepage_show desc, excellent desc, public = 2 desc, publish_time asc" : "homepage_show desc, excellent desc, updated_at desc") - @subjects = @subjects.reorder(order_str) - end - - @total_count = @subjects.size - - if reorder != "myshixun_count" - @subjects = @subjects.page(page).per(limit).includes(:shixuns, :repertoire) - else - @subjects = @subjects[offset, limit] - subject_ids = @subjects.pluck(:id) - order_ids = subject_ids.size > 0 ? subject_ids.join(',') : -1 - @subjects = Subject.where(id: subject_ids).order("field(id,#{order_ids})").includes(:shixuns, :repertoire) - end + subjects = Weapps::SubjectQuery.call(current_laboratory, params) + @subject_count = subjects.map(&:id).size + @subjects = paginate subjects.includes(:shixuns, :repertoire) end def show diff --git a/app/models/ecloud.rb b/app/models/ecloud.rb new file mode 100644 index 000000000..293948f3d --- /dev/null +++ b/app/models/ecloud.rb @@ -0,0 +1,11 @@ +#encoding=utf-8 +class Ecloud < ActiveRecord::Base + attr_accessible :applyno, :begintime, :bossorderid, :custcode, :custid, :custname, :custtype, :ecordercode, :endtime, + :mobile, :opttype, :productcode, :registersource, :string, :trial, :useralias, :userid, :username, :email, + :effecttime, :operatime + + has_many :ecloud_services, :dependent => :destroy # 业务列表 + has_many :ecloud_productparas, :dependent => :destroy # 开通参数列表 + + has_one :ecloud_user +end diff --git a/app/models/ecloud_log.rb b/app/models/ecloud_log.rb new file mode 100644 index 000000000..a1ac3636b --- /dev/null +++ b/app/models/ecloud_log.rb @@ -0,0 +1,3 @@ +class EcloudLog < ActiveRecord::Base + +end diff --git a/app/models/ecloud_productpara.rb b/app/models/ecloud_productpara.rb new file mode 100644 index 000000000..ec1b94bc5 --- /dev/null +++ b/app/models/ecloud_productpara.rb @@ -0,0 +1,4 @@ +class EcloudProductpara < ActiveRecord::Base + attr_accessible :key, :value, :ecloud_id + belongs_to :ecloud +end diff --git a/app/models/ecloud_service.rb b/app/models/ecloud_service.rb new file mode 100644 index 000000000..dba4a7b20 --- /dev/null +++ b/app/models/ecloud_service.rb @@ -0,0 +1,6 @@ +# 操作代码 0:新增业务,1:注销业务2:修改业务 +class EcloudService < ActiveRecord::Base + attr_accessible :begintime, :code, :endtime, :opttype, :ecloud_id, :packagecode, :bossorderid + belongs_to :ecloud + has_many :ecloud_serviece_serviceparas +end diff --git a/app/models/ecloud_serviece_servicepara.rb b/app/models/ecloud_serviece_servicepara.rb new file mode 100644 index 000000000..5dbff71f5 --- /dev/null +++ b/app/models/ecloud_serviece_servicepara.rb @@ -0,0 +1,5 @@ +# ket值,license表示人数,对应企业版;duration表示月数,对应个人版; +class EcloudServieceServicepara < ActiveRecord::Base + attr_accessible :key, :value, :ecloud_service_id + belongs_to :ecloud_service +end diff --git a/app/models/ecloud_user.rb b/app/models/ecloud_user.rb new file mode 100644 index 000000000..fad6f4702 --- /dev/null +++ b/app/models/ecloud_user.rb @@ -0,0 +1,3 @@ +class EcloudUser < ActiveRecord::Base + has_many :ecloud_user_paras +end diff --git a/app/models/ecloud_user_para.rb b/app/models/ecloud_user_para.rb new file mode 100644 index 000000000..3f4ddc5c2 --- /dev/null +++ b/app/models/ecloud_user_para.rb @@ -0,0 +1,3 @@ +class EcloudUserPara < ActiveRecord::Base + belongs_to :ecloud_user +end diff --git a/app/models/ecloud_users.rb b/app/models/ecloud_users.rb new file mode 100644 index 000000000..99da0df24 --- /dev/null +++ b/app/models/ecloud_users.rb @@ -0,0 +1,4 @@ +class EcloudUser < ActiveRecord::Base + # opttype: # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; + attr_accessible :begintime, :email, :endtime, :mobile, :opttype, :paras, :useralias, :userid, :username, :custid +end diff --git a/app/models/shixun_info.rb b/app/models/shixun_info.rb index c2498067f..3d3f40c92 100644 --- a/app/models/shixun_info.rb +++ b/app/models/shixun_info.rb @@ -2,10 +2,12 @@ class ShixunInfo < ApplicationRecord belongs_to :shixun validates_uniqueness_of :shixun_id validates_length_of :fork_reason, maximum: 60, message: "不能超过60个字符" + validates_presence_of :evaluate_script, message: "实训脚本不能为空" after_commit :create_diff_record validates :description, length: { maximum: 5000, too_long: "不能超过5000个字符" } + private def create_diff_record diff --git a/app/queries/weapps/subject_query.rb b/app/queries/weapps/subject_query.rb index e2f5625e1..b50c2a104 100644 --- a/app/queries/weapps/subject_query.rb +++ b/app/queries/weapps/subject_query.rb @@ -8,7 +8,7 @@ class Weapps::SubjectQuery < ApplicationQuery end def call - subjects = @current_laboratory.subjects.unhidden.publiced.show_moblied + subjects = @current_laboratory.subjects.unhidden.publiced # 课程体系的过滤 if params[:sub_discipline_id].present? @@ -19,8 +19,8 @@ class Weapps::SubjectQuery < ApplicationQuery subjects = subjects.joins(:sub_discipline_containers).where(sub_discipline_containers: {container_type: "Subject"}) end - subjects = subjects.left_joins(:shixuns).select('subjects.id, subjects.name, subjects.excellent, subjects.stages_count, subjects.status, subjects.homepage_show, - subjects.shixuns_count, subjects.updated_at, IFNULL(sum(shixuns.myshixuns_count), 0) myshixuns_count') + subjects = subjects.left_joins(:shixuns, :repertoire).select('subjects.id, subjects.name, subjects.excellent, subjects.stages_count, subjects.status, subjects.homepage_show, + subjects.shixuns_count, subjects.repertoire_id, subjects.updated_at, IFNULL(sum(shixuns.myshixuns_count), 0) myshixuns_count') .group('subjects.id').order("subjects.homepage_show #{sort_type}, #{order_type} #{sort_type}") subjects end diff --git a/app/views/admins/myshixuns/shared/_list.html.erb b/app/views/admins/myshixuns/shared/_list.html.erb index af43c3c22..2eb3024ee 100644 --- a/app/views/admins/myshixuns/shared/_list.html.erb +++ b/app/views/admins/myshixuns/shared/_list.html.erb @@ -23,13 +23,13 @@ <% if myshixun.shixun.is_jupyter? %> <%= link_to "/tasks/#{myshixun.identifier}/jupyter", target: '_blank' do %> - <%= overflow_hidden_span myshixun.shixun.name, width: 280 %> + <%= overflow_hidden_span myshixun.shixun.name, width: 200 %> <% end %> <% else %> <% current_task = myshixun.last_executable_task || myshixun.last_task %> <% if current_task %> <%= link_to "/tasks/#{current_task.identifier}", target: '_blank' do %> - <%= overflow_hidden_span myshixun.shixun.name, width: 280 %> + <%= overflow_hidden_span myshixun.shixun.name, width: 200 %> <% end %> <% end %> <% end %> diff --git a/app/views/shixuns/_shixun.json.jbuilder b/app/views/shixuns/_shixun.json.jbuilder index 89e8d3c62..2994a8a75 100644 --- a/app/views/shixuns/_shixun.json.jbuilder +++ b/app/views/shixuns/_shixun.json.jbuilder @@ -16,7 +16,7 @@ json.array! shixuns do |shixun| json.is_jupyter shixun.is_jupyter? json.power (current_user.shixun_permission(shixun)) # 现在首页只显示已发布的实训 # REDO: 局部缓存 - json.tag_name @tag_name_map&.fetch(shixun.id, nil) || shixun.tag_repertoires.first.try(:name) + json.tag_name nil # @tag_name_map&.fetch(shixun.id, nil) || shixun.tag_repertoires.first.try(:name) json.myshixuns_count shixun.myshixuns_count json.stu_num shixun.myshixuns_count json.score_info shixun.averge_star diff --git a/app/views/subjects/index.json.jbuilder b/app/views/subjects/index.json.jbuilder index 8cf7898c7..6c5434850 100644 --- a/app/views/subjects/index.json.jbuilder +++ b/app/views/subjects/index.json.jbuilder @@ -1,10 +1,5 @@ -json.tags @tech_system do |tag| - json.tag_id tag.id - json.tag_name tag.name -end - json.subjects do json.partial! 'subject', locals: {subjects: @subjects} end -json.total_count @total_count +json.total_count @subject_count diff --git a/config/harmonious_dictionary/chinese_dictionary.txt b/config/harmonious_dictionary/chinese_dictionary.txt index 65f4397ce..2bd91e8d2 100644 --- a/config/harmonious_dictionary/chinese_dictionary.txt +++ b/config/harmonious_dictionary/chinese_dictionary.txt @@ -1370,4 +1370,13 @@ B样 江猪媳 酱猪媳 枪支 -毒品 \ No newline at end of file +毒品 +报警 +杀人 +垃圾 +垃 圾 +傻 逼 +真蠢 +蠢猪 + + diff --git a/public/react/src/modules/paths/ShixunPathSearch.js b/public/react/src/modules/paths/ShixunPathSearch.js index f45098f8e..a7e944826 100644 --- a/public/react/src/modules/paths/ShixunPathSearch.js +++ b/public/react/src/modules/paths/ShixunPathSearch.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import axios from 'axios'; -import {Input} from 'antd'; +import {Dropdown,Menu} from 'antd'; import {getImageUrl} from 'educoder'; import PathCard from "./ShixunPathCard"; import UpgradeModals from '../modals/UpgradeModals'; @@ -18,59 +18,49 @@ class ShixunPathSearch extends Component{ page:1, pathList:null, sortList:'', - total_count:0 + total_count:0, + sort:"desc", + limit:16, + discipline_id:undefined, + sub_discipline_id:undefined } } + + //切换列表状态 changeStatus=(value)=>{ - this.setState( - { - pathList:null - } - ) - let {select,search}=this.state; + + let {discipline_id,sub_discipline_id }=this.state; this.setState({ order:value, page:1 }) - this.getList(value,select,search,1); - } - //搜索输入 - inputSearchValue=(e)=>{ - this.setState({ - search:e.target.value, - page:1 - }) - } - //搜索 - searchValue=(e)=>{ - let {order,select,search}=this.state; - this.setState({ - page:1 - }) - this.getList(order,select,search,1 ); + this.getList(value,discipline_id,sub_discipline_id,1); } + + //选择页数 onChange=(pageNumber)=> { - let {order,select,search}=this.state; + + let { order,discipline_id,sub_discipline_id }=this.state; this.setState({ page:pageNumber }) - this.getList(order,select,search,pageNumber); + this.getList(order,discipline_id,sub_discipline_id,pageNumber); } //顶部分类 - changeSelect=(tag_id)=>{ - this.setState( - { - pathList:null - } - ) - let { order,search }=this.state; + changeSelect=(e,tag_id,sum)=>{ + this.setState({ - select:tag_id + order:"updated_at", + discipline_id:tag_id, + page:1, + sub_discipline_id:undefined }) - this.getList( order,tag_id,search,1 ); + let { order }=this.state; + this.getList(order,tag_id,undefined,1 ); + e.stopPropagation(); } @@ -85,31 +75,41 @@ class ShixunPathSearch extends Component{ }).catch((error)=>{ console.log(error); }) + this.getdisciplines() + let { order,discipline_id,sub_discipline_id,page }=this.state; + this.getList(order,discipline_id,sub_discipline_id,page ); - let { order,select,search,page }=this.state; - this.getList(order,select,search,page ); } + getdisciplines=()=>{ + let url='/disciplines.json'; + axios.get(url,{params:{ + source:"subject" + }}).then((result)=>{ + if(result.status==200){ + // console.log(result.data.disciplines) + this.setState({ + sortList:result.data.disciplines + }) + } + }).catch((error)=>{ + console.log(error); + }) + } - getList=(order,select,search,page )=>{ + getList=(order,discipline_id,sub_discipline_id,page )=>{ let url='/paths.json'; - // '?order='+order+'&page='+page; - // if(select!=""){ - // url+='&select='+select; - // } - // if(search!=""){ - // url+='&search='+search; - // } axios.get(url,{params:{ - order:order, + sort:"desc", + limit:16, + order:order, page:page, - select:select, - // search:search + discipline_id:discipline_id, + sub_discipline_id:sub_discipline_id }}).then((result)=>{ if(result.status==200){ this.setState({ - sortList:result.data.tags, pathList:result.data.subjects, total_count:result.data.total_count }) @@ -119,11 +119,6 @@ class ShixunPathSearch extends Component{ }) } - - setHistoryFun=(url)=>{ - this.props.history.push(url) - } - //头部获取是否已经登录了 getUser=(url,type)=>{ if(this.props.checkIfLogin()===false){ @@ -140,9 +135,41 @@ class ShixunPathSearch extends Component{ } + } + + getshixunchildValues=(e,id,item)=>{ + + this.setState({ + discipline_id:item.id, + sub_discipline_id:id, + }) + let { order,page }=this.state; + this.getList(order,item.id,id,page ); + e.stopPropagation(); + } + + getmenu=(list,item)=>{ + return( + + +
+
+ { + list.map((tag,e)=>{ + return( + this.getshixunchildValues(e,tag.id,item)}>{tag.name} + ) + }) + } +
+
+
+
+ ) } render() { - let { order,sortList,search,page,total_count,select }=this.state; + let { order,sortList,search,page,total_count,discipline_id }=this.state; let pathstype=false; if(this.props&&this.props.mygetHelmetapi!=null){ let paths="/paths"; @@ -156,8 +183,8 @@ class ShixunPathSearch extends Component{ }) } - // console.log(this.props) - return ( + + return (
{this.state.updata===undefined?"": @@ -185,11 +223,15 @@ class ShixunPathSearch extends Component{
    -
  • 0 ? "" : "active"}>this.changeSelect(null)}>全部
  • +
  • 0 ? "" : "active"}>this.changeSelect(e,undefined)}>全部
  • { sortList && sortList.map((item,key)=>{ return( -
  • this.changeSelect(`${item.tag_id}`)}>{item.tag_name}
  • +
  • this.changeSelect(e,`${item.id}`,item.sub_disciplines.length)} key={key}> + this.getmenu(item.sub_disciplines,item)} placement="bottomCenter"> + {item.name} + +
  • ) }) } @@ -200,7 +242,7 @@ class ShixunPathSearch extends Component{ {/* this.changeStatus("publish_time")}>全部*/} {/* this.changeStatus("mine")}>我的*/} this.changeStatus("updated_at")}>最新 - this.changeStatus("myshixun_count")}>最热 + this.changeStatus("myshixuns_count")}>最热 {this.props.user&&this.props.user.main_site===false?"":this.props.Headertop===undefined?"":this.getUser("/paths/new")}>+新建实践课程} {this.props.user&&this.props.user.main_site===true?"":this.props.Headertop===undefined?"": pathstype===true?"":this.props.user&&this.props.user.admin===true||this.props.user&&this.props.user.is_teacher===true||this.props.user&&this.props.user.business===true?this.getUser("/paths/new")}>+新建实践课程:"" @@ -229,6 +271,3 @@ class ShixunPathSearch extends Component{ } } export default ShixunPathSearch; - - -// diff --git a/public/react/src/modules/tpm/shixuns/ShixunCardList.js b/public/react/src/modules/tpm/shixuns/ShixunCardList.js index 235b11323..a0c021980 100644 --- a/public/react/src/modules/tpm/shixuns/ShixunCardList.js +++ b/public/react/src/modules/tpm/shixuns/ShixunCardList.js @@ -211,7 +211,7 @@ class ShixunCardList extends Component { }) } - console.log(this.props.middleshixundata.search_tags) + return (
    diff --git a/public/react/src/modules/tpm/shixuns/ShixunSearchBar.js b/public/react/src/modules/tpm/shixuns/ShixunSearchBar.js index b884d7bf0..782a55b54 100644 --- a/public/react/src/modules/tpm/shixuns/ShixunSearchBar.js +++ b/public/react/src/modules/tpm/shixuns/ShixunSearchBar.js @@ -237,7 +237,7 @@ render() { { shixunhoverData.map((item,key)=>{ return( - =8?"bottomLeft":"bottomCenter"}> + =8?"bottomLeft":"bottomCenter"}>
  • {item.name}