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.
200 lines
8.8 KiB
200 lines
8.8 KiB
6 years ago
|
# encoding=utf-8
|
||
|
class DiscussesService
|
||
|
include ApplicationHelper
|
||
|
include GamesHelper
|
||
|
|
||
|
# “讨论区”的所有评论
|
||
|
def self.index params, current_user
|
||
|
page = params[:page].to_i
|
||
|
offset = page * 15
|
||
|
search = params[:search]
|
||
|
tag = params[:tag_repertoire_id]
|
||
|
sql, sql1, sq2 = '', '', ''
|
||
|
tidding_count = unviewed_tiddings(current_user) if current_user.present?
|
||
|
sql1 =
|
||
|
if search
|
||
|
"and d.content like '%#{search}%'"
|
||
|
end
|
||
|
sql2 =
|
||
|
if tag
|
||
|
shixun_ids = ShixunTagRepertoire.where(:tag_repertoire_id => tag).pluck(:shixun_id)
|
||
|
"and d.dis_id in(#{shixun_ids.join(",")})"
|
||
|
end
|
||
|
sql = "select d.id from discusses d join shixuns s on d.dis_id = s.id where s.status = 2 and s.hidden = false and d.root_id is null
|
||
|
and d.hidden = false #{sql1} #{sql2}"
|
||
|
|
||
|
memo_ids = Discuss.find_by_sql(sql).map(&:id)
|
||
|
Rails.logger.info("############memo_ids: #{memo_ids}")
|
||
|
memos = Discuss.field_for_list.where(:id => memo_ids).order("created_at desc")
|
||
|
memo_count = memos.count
|
||
|
memos = memos.offset(offset).limit(15)
|
||
|
# 实训标签使用最多的9个
|
||
|
hot_tags = TagRepertoire.find_by_sql("select distinct(a.name), a.id from
|
||
|
(select tr.id, tr.name, count(d.dis_id) cnt
|
||
|
from tag_repertoires tr join (shixun_tag_repertoires str
|
||
|
left join (shixuns s join discusses d on d.dis_id = s.id)
|
||
|
on s.id = str.shixun_id) on tr.id = str.tag_repertoire_id
|
||
|
group by d.dis_id order by cnt desc) a limit 9").map{|ht| ht.attributes.dup}
|
||
|
memos = memo_list memos
|
||
|
user_info = format_for_current_user current_user
|
||
|
hot_memos = Memo.field_for_recommend.posts.hot.limit(4)
|
||
|
hot_memos =
|
||
|
hot_memos.map do |hm|
|
||
|
replies_count = Memo.where(:root_id => hm.id).count
|
||
|
hm.attributes.dup.merge({replies_count: replies_count})
|
||
|
end
|
||
|
|
||
|
my_memos_count = Memo.user_posts(current_user.id).count
|
||
|
{memo_list: memos, memo_count: memo_count, hot_memos: hot_memos, hot_tags: hot_tags,
|
||
|
my_memos_count: my_memos_count, tidding_count: tidding_count, current_user: user_info,
|
||
|
recommend_shixuns: recommends}
|
||
|
end
|
||
|
|
||
|
# 添加评论
|
||
|
def create(params, current_user)
|
||
|
begin
|
||
|
Discuss.create!(
|
||
|
dis_id: params[:shixun_id], dis_type: 'Shixun', content: params[:content].gsub(' \;', '').strip, user_id: current_user.id,
|
||
|
praise_count: 0, position: params[:position], challenge_id: params[:challenge_id], hidden: !current_user.admin?
|
||
|
)
|
||
|
# 发送手机通知
|
||
|
Trustie::Sms.send(mobile:'18173242757', send_type:'discuss', name:'管理员')
|
||
|
rescue Exception => e
|
||
|
raise(e.message)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# 回复评论
|
||
|
def reply(params, current_user)
|
||
|
begin
|
||
|
base_dicuss params[:id]
|
||
|
Discuss.create!(
|
||
|
content: params[:content].gsub(' \;', '').strip, user_id: current_user.id, parent_id: params[:id],
|
||
|
root_id: @discuss.root_id || params[:id], praise_count: 0, challenge_id: @discuss.challenge_id,
|
||
|
dis_id: @discuss.dis_id, dis_type: @discuss.dis_type, position: @discuss.position, hidden: !current_user.admin?
|
||
|
)
|
||
|
rescue Exception => e
|
||
|
raise(e.message)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# 隐藏评论功能
|
||
|
def hidden(params, current_user)
|
||
|
discuss = Discuss.select([:id, :hidden, :dis_id]).find(params[:id])
|
||
|
shixun = Shixun.find(discuss.try(:dis_id))
|
||
|
if current_user.manager_of_shixun?(shixun)
|
||
|
if params[:hidden] == "1"
|
||
|
discuss.update_attribute(:hidden, true)
|
||
|
elsif params[:hidden] == "0"
|
||
|
discuss.update_column("hidden", false)
|
||
|
end
|
||
|
else
|
||
|
raise("你没有权限")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# 点/取消赞
|
||
|
# 一个用户只能一次
|
||
|
def plus params, current_user
|
||
|
pt = PraiseTread.where(:praise_tread_object_id => params[:id], :praise_tread_object_type => params[:container_type],
|
||
|
:user_id => current_user, :praise_or_tread => 1).first
|
||
|
# 如果当前用户已赞过,则不能重复赞
|
||
|
if params[:type] == 1 && pt.blank?
|
||
|
PraiseTread.create!(:praise_tread_object_id => params[:id], :praise_tread_object_type => params[:container_type],
|
||
|
:user_id => current_user.id, :praise_or_tread => 1) if pt.blank?
|
||
|
else
|
||
|
pt.destroy if pt.present? # 如果已赞过,则删掉这条赞(取消);如果没赞过,则为非法请求不处理
|
||
|
end
|
||
|
|
||
|
return {:praise_count => PraiseTread.where(:praise_tread_object_id => params[:id], :praise_tread_object_type => params[:container_type],
|
||
|
:praise_or_tread => 1).count}
|
||
|
end
|
||
|
|
||
|
# 奖励金币
|
||
|
def reward_code params, current_user
|
||
|
# 仅admin操作
|
||
|
unless current_user.admin?
|
||
|
raise("403")
|
||
|
end
|
||
|
|
||
|
ActiveRecord::Base.transaction do
|
||
|
container_id = params[:id]
|
||
|
container_type = params[:container_type]
|
||
|
score = params[:score]
|
||
|
user_id = params[:user_id]
|
||
|
user = User.select([:id, :login, :grade]).find(user_id)
|
||
|
|
||
|
# 金币来源记录
|
||
|
Grade.create(:user_id => user_id, :container_id => container_id, :container_type => container_type, :score => score)
|
||
|
# 更新用户总金币数
|
||
|
user.update_column(:grade, (score.to_i + user.grade.to_i))
|
||
|
# 多种类型都可以奖励金币
|
||
|
case container_type
|
||
|
when 'Memo', 'Post'
|
||
|
container = Memo.find(container_id)
|
||
|
score = score.to_i + container.reward.to_i
|
||
|
container.update_attribute(:reward, score)
|
||
|
when 'Discusses'
|
||
|
container = Discuss.select([:id, :reward]).find(params[:id])
|
||
|
score = score.to_i + container.reward.to_i
|
||
|
container.update_attribute(:reward, score)
|
||
|
end
|
||
|
return {:code => score}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# 基本查询
|
||
|
def base_dicuss id
|
||
|
@discuss = Discuss.select([:id, :hidden, :reward, :dis_type, :dis_id, :position, :challenge_id, :root_id]).find(id)
|
||
|
end
|
||
|
|
||
|
protected
|
||
|
def memo_list memos
|
||
|
memos.map do |m|
|
||
|
user = User.find(m.user_id)
|
||
|
praise_count = m.praise_tread.where(:praise_or_tread => 1).count
|
||
|
replies_count = Discuss.where(:root_id => m.id).count
|
||
|
shixun_tag = m.dis.tag_repertoires.map(&:name)
|
||
|
m.attributes.dup.except("user_id", "dis_id", "dis_type", "root_id").merge({
|
||
|
subject: (message_content m.content),
|
||
|
username: user.show_name,
|
||
|
login: user.login,
|
||
|
praise_count: praise_count,
|
||
|
replies_count: replies_count,
|
||
|
image_url: url_to_avatar(user),
|
||
|
shixun_tag: shixun_tag,
|
||
|
tpm_url: "/shixuns/#{m.dis.identifier}/shixun_discuss"
|
||
|
})
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def format_for_current_user current_user
|
||
|
{username: current_user.show_name, login: current_user.login, user_id: current_user.id, image_url: url_to_avatar(current_user), admin: current_user.admin?}
|
||
|
end
|
||
|
|
||
|
def recommends
|
||
|
hot_shixuns = Shixun.field_for_recommend.published.order("myshixuns_count desc").limit(2)
|
||
|
newest_shixuns = Shixun.field_for_recommend.published.order("created_at desc").limit(2)
|
||
|
recommend_shixuns = []
|
||
|
hot_shixuns.each do |hs|
|
||
|
recommend_shixuns << {:id => hs.id, :name => hs.name, :identifier => hs.identifier, :myshixuns_count => hs.myshixuns_count, :image_url => url_to_avatar(hs)}
|
||
|
end
|
||
|
newest_shixuns.each do |ns|
|
||
|
recommend_shixuns << {:id => ns.id, :name => ns.name, :identifier => ns.identifier, :myshixuns_count => ns.myshixuns_count, :image_url => url_to_avatar(ns)}
|
||
|
end
|
||
|
return recommend_shixuns
|
||
|
end
|
||
|
|
||
|
# 将数据库对象转换成哈希对象
|
||
|
def object_to_hash objects
|
||
|
objects.map{|o| o.attributes.dup}
|
||
|
end
|
||
|
|
||
|
def unviewed_tiddings current_user
|
||
|
new_tidings_count = current_user.tidings.where("created_at > '#{current_user.onclick_time.onclick_time}'").count
|
||
|
new_pri_message_count = current_user.private_messages.where("created_at > '#{current_user.onclick_time.onclick_time}'").count
|
||
|
count = new_tidings_count + new_pri_message_count
|
||
|
return count
|
||
|
end
|
||
|
|
||
|
end
|