#coding=utf-8 class UsersService include ApplicationHelper include AccountHelper include AvatarHelper include CoursesHelper include ApiHelper include WordsHelper #将用户注册的功能函数写这里 #参数约定 #成功返回注册后的User实例,失败直接抛异常 # return: # status: 1 表示成功, -1 表示金币不足 def consume_score params, current_user user_score = current_user.grade consume_score = parmas[:score] record = Grade.where(:container_id => params[:container_id], :container_type => params[:container_type], :user_id => current_user.id).first return {status: 1, message: "查看成功!"} if record if user_score < consume_score {status: -1, message: "本操作需要扣除#{ consume_score }金币,您的金币不够了"} else current_user.update_column(:grade, current_user.grade - consume_score) Grade.create(:container_id => params[:container_id], :container_type => params[:container_type], :score => -params[:score], :user_id => current_user.id) {status: 1, message: "查看成功!"} end end ## 获取最新的消息 def get_tidings(params,current_user) current_user.tidings.course_tiding.order('id desc').page(params[:page]||1).per(20) end def login params, current_user login = params[:username].strip password = params[:password] # 验证用户名密码是否正确 user, last_login_on = User.try_to_login(login, password) if user.blank? return {:status => -2, :message => "无效的用户名或密码"} else Rails.logger.info("successful_authentication, user is #{user.try(:login)}") # 登录重置session;重新开启session有效时间等 if user && user.is_a?(User) User.current = user # session[:user_id] = user.id # session[:ctime] = Time.now.utc.to_i # session[:atime] = Time.now.utc.to_i else User.current = User.anonymous end # self.logged_user = user # generate a key and set cookie if autologin if params[:autologin] && Setting.autologin? # set_autologin_cookie(user) end # 记录用户登录行为 UserActions.create(:action_id => User.current.id, :action_type => "PhoneLogin", :user_id => User.current.id) return user end end # 生成邀请码 CODES = %W(0 1 2 3 4 5 6 7 8 9) def generate_user_login type code = CODES.sample(8).join code = type + code.to_s return generate_user_login(type) if User.where(login: code).present? code end # 关注 def watch params, current_user s = WatchesService.new s.watch params.merge(:current_user_id => current_user.id) return {:status => 1, :message => "success"} end # 取消关注 def unwatch params, current_user s = WatchesService.new s.unwatch params.merge(:current_user_id => current_user.id) return {:status => 1, :message => "success"} end def register(params) @user = User.new @user.admin = false @user.register if params[:phone] =~ /^[a-zA-Z0-9]+([._\\]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/ login_pre = 'm' @user.mail = params[:phone] elsif params[:phone] =~ /^1\d{10}$/ login_pre = 'p' @user.phone = params[:phone] else login_pre = 'w' end @user.login = generate_user_login login_pre password = params[:password] || params[:mail_password] password_confirmation = params[:password] || params[:mail_password] should_confirmation_password = params[:should_confirmation_password] if !password.blank? && !password_confirmation.blank? && should_confirmation_password @user.password, @user.password_confirmation = password, password_confirmation elsif !password.blank? && !should_confirmation_password @user.password = password else @user.password = "" end =begin if params[:mail] case Setting.self_registration when '1' @user = email_activation_register(@user) when '3' @user = automatically_register(@user) else @user = administrator_manually__register(@user) end else @user = automatically_register(@user) end =end @user = automatically_register(@user) if @user.id != nil ue = @user.user_extensions ||= UserExtensions.new ue.user_id = @user.id ue.save end @user #img_url = url_to_avatar(@user) #gender = @user.user_extensions.gender.nil? ? 0 : @user.user_extensions.gender #work_unit = get_user_work_unit @user #location = get_user_location @user #{:id => @user.id, :img_url => img_url, :nickname => @user.login, :gender => gender, :work_unit => work_unit, :mail => @user.mail, :location => location, :brief_introduction => @user.user_extensions.brief_introduction} end # 自动注册功能 FOR:邮件邀请 def register_auto(login, mail, password, first_name, last_name, gender) mail_notification = "day" @user = User.new @user.admin = false @user.register @user.login = login @user.mail = mail @user.firstname = first_name @user.lastname = last_name @user.mail_notification = mail_notification password_confirmation = password should_confirmation_password = true if !password.blank? && !password_confirmation.blank? && should_confirmation_password @user.password, @user.password_confirmation = password, password_confirmation elsif !password.blank? && !should_confirmation_password @user.password = password else @user.password = "" end @user = automatically_register_lock(@user) if @user.id != nil ue = @user.user_extensions ||= UserExtensions.new ue.gender = gender ue.user_id = @user.id ue.save end @user end #显示用户 #id用户id def show_user(params) if params[:id].present? User.find(params[:id]) elsif params[:login].present? User.find_by_login(params[:login]) end end #忘记密码 def lost_password params user = ::User.find_by_mail(params[:mail].to_s) # user not found or not active unless user && user.active? raise l(:notice_account_unknown_email,:locale => 'zh') end # user cannot change its password unless user.change_password_allowed? raise l(:notice_can_t_change_password,:locale => user.language) return end # create a new token for password recovery token = Token.new(:user => user, :action => "recovery") if token.save Mailer.run.lost_password(token) return l(:notice_account_lost_email_sent,:locale => user.language) end end #编辑用户 #gender 1:female 0:male 其他:male def edit_user params @user = User.find(params[:id]) fileio = params[:file] # @se = @user.extensions # if @user.user_extensions.identity == 0 || @user.user_extensions.identity == 1 # @se.school_id = params[:occupation] # elsif @user.user_extensions.identity == 3 # @se.occupation = params[:occupation] # elsif @user.user_extensions.identity == 2 # @user.firstname = params[:occupation] # end # @se.brief_introduction = params[:brief_introduction] # @se.gender = params[:gender] # @se.location = params[:province] if params[:province] # @se.location_city = params[:city] if params[:city] # raise @se.errors.full_message unless @se.save unless fileio.nil? file = fileio[:tempfile] diskfile=disk_filename(@user.class.to_s, @user.id) @image_file = fileio[:name] @urlfile='/' << File.join("images", "avatars", avatar_directory(@user.class.to_s), avatar_filename(@user.id, @image_file)) path = File.dirname(diskfile) unless File.directory?(path) FileUtils.mkdir_p(path) end File.rename(file.path, @urlfile) begin f = Magick::ImageList.new(diskfile) # gif格式不再做大小处理 if f.format != 'GIF' width = 300.0 proportion = (width/f[0].columns) height = (f[0].rows*proportion) f.resize_to_fill!(width, height) f.write(diskfile) end rescue Exception => e logger.error "[Error] avatar : users_service#edit_user ===> #{e}" end end #img_url = url_to_avatar(@user) #gender = @user.user_extensions.gender.nil? ? 0 : @user.user_extensions.gender #work_unit = get_user_work_unit @user #location = get_user_location @user #{:id => @user.id, :img_url => img_url, :nickname => @user.login, :gender => gender, :work_unit => work_unit, :mail => @user.mail, :location => location, :brief_introduction => @user.user_extensions.brief_introduction} @user end # 获取某个用户的所有留言信息 def get_all_messages params user = User.find(params[:user_id]) jours = user.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC').page(params[:page] || 1).per(10) jours.update_all(:is_readed => true, :status => false) jours.each do |journal| fetch_user_leaveWord_reply(journal).update_all(:is_readed => true, :status => false) end jours end # 回复用户 def reply_user_messages params,current_user user = User.find(params[:user_id]) m_parent_id = params[:parent_id] author_id = current_user.id reply_id = params[:ref_user_id] ref_message_id = params[:ref_message_id] content = params[:content] options = {:user_id => author_id, # 作者id :status => true, :m_parent_id => m_parent_id,# 父留言id :m_reply_id => ref_message_id, # 子留言 id :reply_id => reply_id, # 被留言用户id :notes => content, :is_readed => false} if(params[:type] == 1) user.add_jour(nil, nil,nil,options) elsif(params[:type] == 2) Course.find(params[:course_id]).journals_for_messages.build(options).save! unless params[:course_id].nil? else end end # 给用户留言 def leave_message params,current_user obj = User.find(params[:user_id]).add_jour(current_user, params[:content], 0) obj end #关注列表 def user_watcher params @user = User.find(params[:id]) User.watched_by(@user.id) end #用户课程列表 def current_courses params, current_user limit = params[:limit]||5 page = params[:page].to_i offset = (page-1) * limit courses = Course.find_by_sql("SELECT c.* FROM courses c, members m, member_roles mr WHERE m.course_id = c.id AND m.id=mr.member_id AND mr.role_id in (3,7,9,10) AND m.user_id=#{current_user.id} AND c.is_delete = 0 order by id desc limit #{limit} offset #{offset} ") # 如果还没有课程则显示示例课堂 courses = Course.where(:id => 1309) if courses.count == 0 course_list = [] courses.each do |course| teacher_ids = Member.find_by_sql("SELECT m.user_id FROM `member_roles` mr, users, `members` m where m.course_id=#{course.id} and m.user_id = users.id and users.status = 1 and m.id=mr.member_id and mr.role_id in ('3','7','9')").map(&:user_id) is_teacher = current_user.admin? || teacher_ids.include?(current_user.id) course_list << {:course => course, :is_teacher => is_teacher } end return course_list end #修改密码 def change_password params ActiveRecord::Base.transaction do @current_user = User.find(params[:current_user_id]) if @current_user.check_password?(params[:password]) @current_user.password, @current_user.password_confirmation = params[:new_password], params[:new_password_confirmation] @current_user.save # 修改密码同步gitlab密码修改 unless @current_user.gid.nil? begin g = Gitlab.client g.edit_user(@current_user.gid, :password => params[:new_password]) rescue Exception => e Rails.logger.error "change users password failed! ===> #{e.message}" end end #raise @current_user.errors.full_message #return @current_user else if params[:password].present? raise l(:notice_account_wrong_password,:locale => 'zh') else if params[:new_password].strip != "" && params[:new_password_confirmation].strip != "" @current_user.password, @current_user.password_confirmation = params[:new_password], params[:new_password_confirmation] @current_user.save unless @current_user.gid.nil? begin g = Gitlab.client g.edit_user(@current_user.gid, :password => params[:new_password]) rescue Exception => e logger.error "change users password failed! ===> #{e}" end end end end end @current_user end end #搜索用户 def search_user params status = params[:status] || 1 has = { "show_changesets" => true } scope = User.logged.status(status) search_by = params[:search_by] ? params[:search_by] : "0" if params[:is_search_assitant].nil? #modify by yutao 2015/5/18 没有params[:user_id]参数时去掉"id not in (?)"条件(bug:#2270) start #say by yutao: params[:user_id]这个是指谁发起的搜索么? 如果是 这个值貌似应该从session获取 怪怪的赶脚-_-! if params[:name].present? if !params[:user_id].nil? watcher = User.watched_by(params[:user_id]) watcher.push(params[:user_id]) scope = scope.where("id not in (?)",watcher) end #scope = scope.like(params[:name],search_by) scope = scope.where("( LOWER(login) LIKE ? or LOWER(concat(lastname, firstname)) LIKE ? or LOWER(mail) LIKE ? )", "%#{params[:name]}%","%#{params[:name]}%","%#{params[:name]}%") end #modify by yutao 2015/5/18 没有params[:user_id]参数时去掉"id not in (?)"条件 end else teachers = searchTeacherAndAssistant(Course.find(params[:course_id])) scope = scope.where("id not in (?)",teachers.map{|t| t.user_id}).like(params[:name],search_by) if params[:name].present? end scope end # 课程留言中与我相关的回复 def my_course_messages params,current_user #找到我所有的课程 @user = current_user if !current_user.admin? && !@user.active? raise '404' return end if current_user == @user || current_user.admin? membership = @user.coursememberships.all end # membership.sort! {|older, newer| newer.created_on <=> older.created_on } message_list = [] membership.each do |mp| #课程轮询找到与我相关的回复 message_list << mp.course.journals_for_messages.where("reply_id = ?",current_user.id) end message_list end # 获取与我相关的留言:我的留言,回复我的留言 def my_personal_messages params,current_user jours = current_user.journals_for_messages.where('m_parent_id is null or reply_id = ?',current_user.id) jours.update_all(:is_readed => true, :status => false) jours end # 所有的与我相关 def reply_my_messages params,current_user jours = my_personal_messages params,current_user jours1 = my_course_messages params,current_user my_jours = [] my_jours << jours << jours1 my_jours.flatten!.sort! {|older, newer| newer.created_on <=> older.created_on } my_jours_arr = Kaminari.paginate_array(my_jours, total_count: my_jours.count).page(params[:page] || 1).per(10) my_jours_arr end def wechat_unbind uw user = uw.user #发重新绑定的微信模版消息 type = "login" title = "尊敬的用户,您已解除绑定。" key1 = "个人原因" remark = "点击进入重新绑定。" ws = WechatService.new ws.rebind_notice user.id, type, user.id, title, key1,format_time(Time.now), remark uw.user_id = nil uw.delete end private def set_autologin_cookie(user) token = Token.get_or_create_permanent_login_token(user) cookie_options = { :value => token.value, :expires => 1.month.from_now, :path => (Redmine::Configuration['autologin_cookie_path'] || '/'), :secure => (Redmine::Configuration['autologin_cookie_secure'] ? true : false), :httponly => true } if Redmine::Configuration['cookie_domain'].present? cookie_options = cookie_options.merge(domain: Redmine::Configuration['cookie_domain']) end cookies[autologin_cookie_name] = cookie_options end end