diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 27a6f564..7be3e8e3 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -436,7 +436,15 @@ class AccountController < ApplicationController # 注册完/绑定邮箱 后完善资料 def user_info @user = User.current + + #是否是Oschina过来的 + @is_ecoder_user = @user.ecoder_user_id.to_i>0 + + #是否没设置过密码 + @is_set_password = @user.hashed_password.present? + if request.get? + # 如果是登录的请求进来,则需要判断登录名是否合法 if (@user.login =~ /(^(?=.*?[a-zA-Z]).*$)/).nil? || !(@user.login =~ /[@#\$%\^&\*\.]+/).nil? @login_error = true @@ -454,6 +462,22 @@ class AccountController < ApplicationController apply_user.update_all(:status => 2) unless apply_user.blank? end + + if @is_ecoder_user && !@is_set_password + @user.password = params[:new_password] + @user.password_confirmation = params[:new_password_confirmation] + + if @user.password.size<8 + @password_len_error = true + render :user_info and return + end + + if @user.password != @user.password_confirmation + @password_match_error = true + render :user_info and return + end + end + @user.lastname = params[:lastname] @user.firstname = "" @user.show_realname = params[:hide_realname] ? 0 : 1 @@ -525,6 +549,7 @@ class AccountController < ApplicationController return else @user.login = lg + logger.info "save user: #{@user.errors}" end end end diff --git a/app/controllers/ecloud_controller.rb b/app/controllers/ecloud_controller.rb index 216df8df..deff445c 100644 --- a/app/controllers/ecloud_controller.rb +++ b/app/controllers/ecloud_controller.rb @@ -38,8 +38,6 @@ class EcloudController < ApplicationController ROOT_URl = 'http://localhost:3000' SERVER_URL = "https://221.176.54.92:9081/restful/services/" - - ## 签名 def sign(timestamp) Digest::MD5.hexdigest("client_id=#{CLIENT_ID}client_key=#{CLIENT_SECRET}timestamp=#{timestamp}").upcase @@ -50,61 +48,87 @@ class EcloudController < ApplicationController # applyno 申请单号,唯一 # ecordercode 唯一标志一个企业的订购关系 # params['opttype']:操作类型。0开通;1变更;2试用转商用;4再次开通 + # 业务列表opttype: 0新增;1注销;2修改 + # serviceparas: 但是由于企业版是按成员收费的,所以serviceparas里面会传成员数;个人版是包月计费的,serviceparas不会传成员数 def bs_new ActiveRecord::Base.transaction do begin - ecloud_id = 0 if params['opttype'] == 0 # 开通企业/个人业务 ecloud = Ecloud.create!(eloud_params) - ecloud_id = ecloud.try(:id) + create_service(params['services'], ecloud.try(:id)) + create_product_params(params['productparas'], ecloud.try(:id)) if params['productparas'].present? + # 为管理员添加一条记录 + # 开通的时候都是用户的opttype也是0 + 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']) elsif params['opttype'] == 2 # 试用转商用 # 变更企业/个人业务 - ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode']).first - ecloud.update_attributes!(eloud_params) - ecloud.ecloud_productparas.destroy - ecloud.ecloud_services.destroy - ecloud_id = ecloud.try(:id) - elsif params['opttype'] == 1 # 业务变更 - 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) + # 业务列表:注销业务(注销试用的套餐),另一个业务项的操作代码是:新增业务(开通商用的套餐) + # 需要通过产品服务编号和业务编码来区分哪个产品 + 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'], productcode: params['productcode']).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'] == 4 # 再次重复开通 - REDO - ecloud = Ecloud.where(bossorderid: params['bossorderid']).first - end - - # 业务列表 - services = params['services'] - if services.present? - services.each do |service| - es = EcloudService.create(opttype: service['opttype'], code: service['code'], begintime: service['begintime'], - endtime: service['endtime'], ecloud_id: ecloud_id) - if service['serviceparas'].present? - service['serviceparas'].each do |servicepara| - EcloudServieceServicepara.create!(ecloud_service_id: es.id, key: servicepara['key'], value: servicepara['value']) - end + elsif params['opttype'] == 1 # 业务变更 + ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode']).first + # 套餐变更 + # 新增业务 + 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| + 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 - end - # 应用开通参数 - productparas = params['productparas'] - if productparas.present? - productparas.each do |productpara| - EcloudProductpara.create!(key: productpara['key'], value: productpara['value'], ecloud_id: ecloud_id) + # 变更业务 + 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']) + create_serviceparas es['serviceparas'].first, ese.id + end end - 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']) + + # 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) @@ -115,17 +139,31 @@ class EcloudController < ApplicationController end # 企业/个人业务变更、注销 + # 处理业务平台退订、暂停(欠费暂停,信控暂停等)、暂停后恢复应用业务 + # 这个接口是不会新增业务的 + # 试用退订的时候bossorderid传空字符 def bs_update ActiveRecord::Base.transaction do begin - ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode']).first - ecloud.update_attributes!(applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'], - custid: params['custid'], custcode: params['custcode'], productcode: params['productcode'], - operatime: params['operatime'], effecttime: params['effecttime']) - services = params['services'].first - ecloud.ecloud_service.update_attributes!(packagecode: services['packagecode'], bossorderid: services['bossorderid']) + 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}"} @@ -136,37 +174,55 @@ class EcloudController < ApplicationController # 用户业务开通与变更接口 # 授权statu为1,取消授权status为0 + # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; + def ps_new - begin - user_params = params['users'] - user_params.each do |user_param| - 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, status: 1) + 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 - render :json => {success: true, errmsg: ""} - # end - rescue Exception => e - logger.error(e.message) - render :json => {code: 500, msg: "#{e.message}"} end end # 用户业务状态变更 - # 授权statu为1,取消授权status为0 + # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; def ps_update begin user_params = params['users'] user_params.each do |user_param| - ecloud_user = EcloudUser.where(userid: user_param['userid'], status: 1).first - ecloud_user.update_attributes(opttype: user_param['opttype'], userid: user_param['userid'], status: 0) + 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: ""} - # else - # render :json => {code: 404, msg: "企业ID不存在"} - # end rescue Exception => e logger.error(e.message) render :json => {code: 500, msg: "#{e.message}"} @@ -174,39 +230,53 @@ class EcloudController < ApplicationController end def ecloud_login_callback - #获取code - logger.info "oauth2 login_callback: #{params}" - raise "没有code" unless params[:code] + 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]}" + 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}" + 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) - #{"access_token":"21a80f20ff736b54aecd002b60210943","token_type":"bearer","expires_in":86400,"refresh_token":"be92e2c137a8c6dd22f0d8c4a622b3aeceb054087a95d293130f04ec60fd3e3f","scope":"user_info","created_at":1542684088} + body = decode(res) - raise '登录失败' unless body["access_token"] + 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 - # res = get("https://gitee.com/api/v5/user?access_token=#{body["access_token"]}") - res = get("#{SERVER_URL}/user/info?access_token=#{body['access_token']}&userid=#{body['uid']}") - logger.info "oauth2 get user info: #{res}" # 同步用户 - # info = decode(res) - # - # user = User.find_by_oschina_user_id(info["id"]) - # unless user - # user = User.create_with_oschina!(info) - # end - # - # @current_user = user - - render :index + 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 = UserExtensions.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 + end @@ -257,6 +327,28 @@ class EcloudController < ApplicationController 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 sign = sign(params['timestamp']) @@ -267,7 +359,8 @@ class EcloudController < ApplicationController end def save_para - EcloudLog.create(url: request.url, para_value: params, applyno: params['applyno'], custid: params['custid'], custcode: params['custcode']) + 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/my_controller.rb b/app/controllers/my_controller.rb index ecb62c18..54cd15d6 100644 --- a/app/controllers/my_controller.rb +++ b/app/controllers/my_controller.rb @@ -141,6 +141,10 @@ class MyController < ApplicationController # Edit user's account def account @user = params[:user_id].nil? ? User.current : User.find(params[:user_id]) + + + + ue = @user.user_extensions if @user.lastname.blank? || ue.try(:identity).nil? || (ue.try(:identity) == 1 && ue.try(:student_id).blank?) || (ue.try(:identity) != 1 && ue.try(:technical_title).blank?) || ue.try(:gender).blank? || ue.try(:school_id).blank? redirect_to user_info_path @@ -152,7 +156,8 @@ class MyController < ApplicationController applied_message = AppliedMessage.where(:id => params[:applied_message_id]).first applied_message.update_attribute(:viewed, true) end - # @user = User.current + + # 认证 @trail_authentication = ApplyAction.where(:user_id => User.current.id, :container_type => "TrialAuthorization").order("created_at desc").first if @trail_authentication && (@trail_authentication.status == 1 || @trail_authentication.status == 2) && !@trail_authentication.noticed diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index e44a170b..2a4402b7 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -2592,6 +2592,7 @@ class UsersController < ApplicationController def user_info + end # 连续签到六天则每天累加10个金币 diff --git a/app/models/ecloud_log.rb b/app/models/ecloud_log.rb index 4e187aa5..a1ac3636 100644 --- a/app/models/ecloud_log.rb +++ b/app/models/ecloud_log.rb @@ -1,3 +1,3 @@ class EcloudLog < ActiveRecord::Base - attr_accessible :para_value, :url, :applyno, :custid, :custcode + end diff --git a/app/models/ecloud_user.rb b/app/models/ecloud_user.rb index dd4a5584..fad6f470 100644 --- a/app/models/ecloud_user.rb +++ b/app/models/ecloud_user.rb @@ -1,3 +1,3 @@ class EcloudUser < ActiveRecord::Base - attr_accessible :begintime, :email, :endtime, :mobile, :opttype, :paras, :useralias, :userid, :username, :custid, :status, :ecloud_id + 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 00000000..3f4ddc5c --- /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/user.rb b/app/models/user.rb index af689317..fdb9566a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1692,6 +1692,36 @@ class User < Principal end end + def self.create_with_ecoder!(info) + user = User.new + user.admin = false + user.login = "ecoder_" + info["mobile"] + + user.phone = info["mobile"] + + unless User.find_by_mail(info["email"]) + user.mail = info["email"] + end + user.nickname = info["username"] + + + user.activate + user.last_login_on = Time.now + + user.ecoder_user_id = info["userid"] + + user.save!(:validate => false) + + + UserStatus.create!(:user_id => user.id, :changsets_count => 0, :watchers_count => 0) + + ue = user.user_extensions ||= UserExtensions.new + ue.user_id = user.id + ue.save! + + user + end + end class AnonymousUser < User diff --git a/app/services/games_service.rb b/app/services/games_service.rb index 039d90c8..e1d81137 100644 --- a/app/services/games_service.rb +++ b/app/services/games_service.rb @@ -88,15 +88,28 @@ class GamesService # tpm_script_modified = (shixun.reset_time > myshixun.reset_time ? true : false) # 新结构脚本是实时传送的,所以不会影响 # 区分评测过未评测过,未评测过按需求取数据 - if max_query_index > 0 - qurey_test_sets = TestSet.find_by_sql("SELECT o.actual_output, o.out_put, o.result, o.test_set_position, o.query_index,t.is_public,t.input, t.output, g.id as game_id, c.id as challenge_id FROM outputs o,games g ,challenges c,test_sets t where - g.id=#{game.id} and o.query_index=#{max_query_index} and g.id = o.game_id and c.id= g.challenge_id and t.challenge_id = c.id and t.position =o.test_set_position order by o.query_index - ") - else - qurey_test_sets = TestSet.find_by_sql("SELECT t.is_public,t.input, t.output,t.position FROM games g ,challenges c,test_sets t where - g.id=#{game.id} and c.id= g.challenge_id and t.challenge_id = c.id - ") - end + sql = + if max_query_index > 0 + "SELECT + b.actual_output, b.out_put, b.result, a.is_public, a.input, a.output + FROM + (SELECT position, input, output, challenge_id, is_public FROM test_sets where challenge_id=6000) a + LEFT JOIN + (SELECT + result, test_set_position, g.challenge_id, o.actual_output, o.out_put + FROM + outputs o left join games g on g.id=o.game_id + WHERE + game_id=#{game.id} and query_index = #{max_query_index} + ) b + ON + b.challenge_id = a.challenge_id and b.test_set_position = a.position" + else + "SELECT t.is_public, t.input, t.output, t.position + FROM games g ,challenges c,test_sets t + WHERE g.id=#{game.id} and c.id= g.challenge_id and t.challenge_id = c.id" + end + qurey_test_sets = TestSet.find_by_sql(sql) # 测试集统计及处理 unless qurey_test_sets.blank? diff --git a/app/views/account/user_info.html.erb b/app/views/account/user_info.html.erb index 5bc5fa6b..0987f8c3 100644 --- a/app/views/account/user_info.html.erb +++ b/app/views/account/user_info.html.erb @@ -39,6 +39,20 @@ <% end %> + + <% if @is_ecoder_user && !@is_set_password %> +
密码最小长度为8位
+两次密码不匹配
+\\u8fd9\\u662f\\u4e00\\u4e2a\\u6bb5\\u843d
\\r\\n