diff --git a/app/controllers/concerns/login_helper.rb b/app/controllers/concerns/login_helper.rb index b85b17a22..e3ef0480c 100644 --- a/app/controllers/concerns/login_helper.rb +++ b/app/controllers/concerns/login_helper.rb @@ -35,6 +35,7 @@ module LoginHelper UserAction.create(action_id: user&.id, action_type: 'Login', user_id: user&.id, ip: request.remote_ip) user.update_column(:last_login_on, Time.now) + # 注册完成后有一天的试用申请(先去掉) # UserDayCertification.create(user_id: user.id, status: 1) end @@ -44,6 +45,8 @@ module LoginHelper if autologin = cookies.delete(autologin_cookie_name) User.current.delete_autologin_token(autologin) end + + UserOnline.logout(User.current.id) User.current.delete_session_token(session[:tk]) self.logged_user = nil end @@ -52,6 +55,7 @@ module LoginHelper default_yun_session = "#{laboratory.try(:identifier).split('.').first}_user_id" # end session[:"#{default_yun_session}"] = nil + session[:request_user_id] = nil end # Sets the logged in user @@ -78,6 +82,8 @@ module LoginHelper # # end # session[:user_id] = user.id + UserOnline.login(user.id) + session[:request_user_id] = user.id session[:"#{default_yun_session}"] = user.id session[:ctime] = Time.now.utc.to_i session[:atime] = Time.now.utc.to_i diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb index 69323bf49..3d2383573 100644 --- a/app/controllers/main_controller.rb +++ b/app/controllers/main_controller.rb @@ -4,6 +4,7 @@ class MainController < ApplicationController skip_before_action :setup_laboratory def first_stamp + UserOnline.login(session[:request_user_id]) if session[:request_user_id] render :json => { status: 0, message: Time.now.to_i } end diff --git a/app/libs/user_online.rb b/app/libs/user_online.rb new file mode 100644 index 000000000..8db5754f3 --- /dev/null +++ b/app/libs/user_online.rb @@ -0,0 +1,41 @@ +module UserOnline + class << self + def login(user_id) + set_bit(user_id, 1) + end + + def logout(user_id) + set_bit(user_id, 0) + end + + def set_bit(user_id, flag) + if !Rails.cache.data.exists(cache_key) + Rails.cache.data.setbit(cache_key, user_id, flag) + Rails.cache.data.expire(cache_key, 20 * 60 + 10) + else + Rails.cache.data.setbit(cache_key, user_id, flag) + end + end + + def count + if Rails.cache.is_a?(ActiveSupport::Cache::RedisStore) + Rails.cache.data.bitcount(cache_key) + else + 0 + end + end + + def cache_key + if Rails.cache.is_a?(ActiveSupport::Cache::RedisStore) + # 10分钟为一段记录用户在线, 统计范围为20分钟内的线用户 + # TODO 更精确时长 + begin_hour = Time.now.beginning_of_hour + minutes_piece = (Time.now - begin_hour) / 600 + time = begin_hour.since((minutes_piece.to_i - 1) * 600).strftime("%H-%M") + "online_user_#{time}" + else + raise '请配置config.cache_store = redis_store' + end + end + end +end diff --git a/app/views/admins/dashboards/index.html.erb b/app/views/admins/dashboards/index.html.erb index d182bba8a..896b12a2f 100644 --- a/app/views/admins/dashboards/index.html.erb +++ b/app/views/admins/dashboards/index.html.erb @@ -72,7 +72,7 @@
当前在线用户数
- <%= @online_users %> + <%= UserOnline.count %>