You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pgfqe6ch8/app/services/users_service.rb

474 lines
16 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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 1female 0male 其他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, course_members m WHERE m.course_id = c.id AND
m.role in (1,2,3,4) 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
Rails.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