diff --git a/Gemfile b/Gemfile index 80c0e1c2a..39a181d05 100644 --- a/Gemfile +++ b/Gemfile @@ -50,16 +50,16 @@ gem 'elasticsearch-model' gem 'elasticsearch-rails' #rails 3.2.22.2 bug - gem "test-unit", "~>3.0" + # gem "test-unit", "~>3.0" ### profile - gem 'oneapm_rpm' + # gem 'oneapm_rpm' group :development do gem 'grape-swagger' gem 'better_errors', '~> 1.1.0' # gem "query_reviewer" - gem 'rack-mini-profiler', '~> 0.9.3' + # gem 'rack-mini-profiler', '~> 0.9.3' if RUBY_PLATFORM =~ /w32/ gem 'win32console' end diff --git a/app/api/mobile/apis/activities.rb b/app/api/mobile/apis/activities.rb index b4fb90ea7..4d07c23f8 100644 --- a/app/api/mobile/apis/activities.rb +++ b/app/api/mobile/apis/activities.rb @@ -13,50 +13,55 @@ module Mobile requires :container_type, type: String end post do - authenticate! + begin + authenticate! - user = current_user + user = current_user - container_type = params[:container_type] ? params[:container_type] : "All" + container_type = params[:container_type] ? params[:container_type] : "All" - if container_type == "All" || container_type == "Project" - shield_project_ids = ShieldActivity.select("shield_id").where("container_type='User' and container_id=#{user.id} and shield_type='Project'").map(&:shield_id) - user_project_ids = (user.projects.where("status = 1").map{|project| project.id}-shield_project_ids).empty? ? "(-1)" : "(" + (user.projects.where("status = 1").map{|project| project.id}-shield_project_ids).join(",") + ")" - project_types = "('Message','Issue','Project')" + if container_type == "All" || container_type == "Project" + shield_project_ids = ShieldActivity.select("shield_id").where("container_type='User' and container_id=#{user.id} and shield_type='Project'").map(&:shield_id) + user_project_ids = (user.projects.where("status = 1").map{|project| project.id}-shield_project_ids).empty? ? "(-1)" : "(" + (user.projects.where("status = 1").map{|project| project.id}-shield_project_ids).join(",") + ")" + project_types = "('Message','Issue','Project')" + end + + if container_type == "All" || container_type == "Course" + shield_course_ids = ShieldActivity.select("shield_id").where("container_type='User' and container_id=#{user.id} and shield_type='Course'").map(&:shield_id) + user_course_ids = (user.courses.where("is_delete = 0").map{|course| course.id}-shield_course_ids).empty? ? "(-1)" : "(" + (user.courses.where("is_delete = 0").map{|course| course.id}-shield_course_ids).join(",") + ")" + course_types = "('Message','News','HomeworkCommon','Poll','Course')" + end + + page = params[:page] ? params[:page] : 0 + principal_types = "JournalsForMessage" + watched_user_ids = User.watched_by(user.id).count == 0 ? " " : ("," + User.watched_by(user.id).map{|u| u.id.to_s }.join(',')) + user_ids = "(" + user.id.to_s + watched_user_ids + ")" + watched_user_blog_ids = Blog.select("id").where("author_id in #{user_ids}").count == 0 ? " " :Blog.select("id").where("author_id in #{user_ids}").map { |blog| blog.id}.join(",") + blog_ids = "(" + watched_user_blog_ids + ")" + + if container_type == "Course" + activities = UserActivity.where("(container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types})").order('updated_at desc') + elsif container_type == "Project" + activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types})").order('updated_at desc') + else + activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types})" + + "or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}) "+ + "or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{user.id}) " + + "or (container_type = 'Blog' and act_type= 'BlogComment' and container_id in #{blog_ids})").order('updated_at desc') + end + all_count = activities.count + activities = activities.limit(10).offset(page * 10) + count = activities.count + present :data, activities, with: Mobile::Entities::Activity,user: user + present :all_count, all_count + present :count, count + present :page, page + present :status, 0 + present :container_type, container_type + rescue Exception=>e + present :status, -1 + present :message, e.message end - - if container_type == "All" || container_type == "Course" - shield_course_ids = ShieldActivity.select("shield_id").where("container_type='User' and container_id=#{user.id} and shield_type='Course'").map(&:shield_id) - user_course_ids = (user.courses.where("is_delete = 0").map{|course| course.id}-shield_course_ids).empty? ? "(-1)" : "(" + (user.courses.where("is_delete = 0").map{|course| course.id}-shield_course_ids).join(",") + ")" - course_types = "('Message','News','HomeworkCommon','Poll','Course')" - end - - page = params[:page] ? params[:page] : 0 - principal_types = "JournalsForMessage" - watched_user_ids = User.watched_by(user.id).count == 0 ? " " : ("," + User.watched_by(user.id).map{|u| u.id.to_s }.join(',')) - user_ids = "(" + user.id.to_s + watched_user_ids + ")" - watched_user_blog_ids = Blog.select("id").where("author_id in #{user_ids}").count == 0 ? " " :Blog.select("id").where("author_id in #{user_ids}").map { |blog| blog.id}.join(",") - blog_ids = "(" + watched_user_blog_ids + ")" - - if container_type == "Course" - activities = UserActivity.where("(container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types})").order('updated_at desc') - elsif container_type == "Project" - activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types})").order('updated_at desc') - else - activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types})" + - "or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}) "+ - "or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{user.id}) " + - "or (container_type = 'Blog' and act_type= 'BlogComment' and container_id in #{blog_ids})").order('updated_at desc') - end - all_count = activities.count - activities = activities.limit(10).offset(page * 10) - count = activities.count - present :data, activities, with: Mobile::Entities::Activity,user: user - present :all_count, all_count - present :count, count - present :page, page - present :status, 0 - present :container_type, container_type end end end diff --git a/app/api/mobile/apis/blog_comments.rb b/app/api/mobile/apis/blog_comments.rb index 39b6a486a..ddfd65524 100644 --- a/app/api/mobile/apis/blog_comments.rb +++ b/app/api/mobile/apis/blog_comments.rb @@ -7,17 +7,22 @@ module Mobile desc "get special topic" post ':id' do - user = current_user + begin + user = current_user - #0一级回复的更多 1 二级回复的更多 - type = params[:type] || 0 - page = params[:page] || 0 + #0一级回复的更多 1 二级回复的更多 + type = params[:type] || 0 + page = params[:page] || 0 - blog = BlogComment.find params[:id] - present :data, blog, with: Mobile::Entities::BlogComment,user: user,type: type,page: page - present :type, type - present :page, page - present :status, 0 + blog = BlogComment.find params[:id] + present :data, blog, with: Mobile::Entities::BlogComment,user: user,type: type,page: page + present :type, type + present :page, page + present :status, 0 + rescue Exception=>e + present :status, -1 + present :message, e.message + end end end end diff --git a/app/api/mobile/apis/courses.rb b/app/api/mobile/apis/courses.rb index 575048211..369185ca2 100644 --- a/app/api/mobile/apis/courses.rb +++ b/app/api/mobile/apis/courses.rb @@ -167,8 +167,20 @@ module Mobile requires :course_id, type: Integer, desc: "课程id" end get 'teachers' do + + course = Course.find(params[:course_id]) + cs = CoursesService.new teachers = cs.course_teacher_or_student_list({role: '1'}, params[:course_id],current_user) + + teachers.each do |m| + if m[:id] == course.tea_id + teachers.delete(m) + teachers.insert(0,m) + break + end + end + present :data, teachers, with: Mobile::Entities::User present :status, 0 end diff --git a/app/api/mobile/apis/issues.rb b/app/api/mobile/apis/issues.rb index 36b558652..dfd5a3335 100644 --- a/app/api/mobile/apis/issues.rb +++ b/app/api/mobile/apis/issues.rb @@ -8,17 +8,25 @@ module Mobile desc "get special issuse" post ':id' do - authenticate! - user = current_user + begin + # authenticate! + user = current_user - #0一级回复的更多 1 二级回复的更多 - type = params[:type] || 0 - page = params[:page] || 0 - issue = Issue.find params[:id] - present :data, issue, with: Mobile::Entities::Issue,user: user,type: type,page: page - present :type, type - present :page, page - present :status, 0 + #is_public true 公开 false 私有 1公开 0私有 + + #0一级回复的更多 1 二级回复的更多 + type = params[:type] || 0 + page = params[:page] || 0 + issue = Issue.find params[:id] + present :data, issue, with: Mobile::Entities::Issue,user: user,type: type,page: page + present :type, type + present :page, page + present :is_public, issue.project.is_public + present :status, 0 + rescue Exception=>e + present :status, -1 + present :message, e.message + end end end end diff --git a/app/api/mobile/apis/journal_for_messages.rb b/app/api/mobile/apis/journal_for_messages.rb index 6ac484513..0ef875780 100644 --- a/app/api/mobile/apis/journal_for_messages.rb +++ b/app/api/mobile/apis/journal_for_messages.rb @@ -7,18 +7,33 @@ module Mobile desc "get special journal" post ':id' do - authenticate! - user = current_user + begin + # authenticate! + user = current_user - #0一级回复的更多 1 二级回复的更多 - type = params[:type] || 0 - page = params[:page] || 0 + #0一级回复的更多 1 二级回复的更多 + type = params[:type] || 0 + page = params[:page] || 0 - jour = JournalsForMessage.find params[:id] - present :data, jour, with: Mobile::Entities::Jours,user: user,type: type,page: page - present :type, type - present :page, page - present :status, 0 + jour = JournalsForMessage.find params[:id] + + is_public = 1 + + if jour.jour_type == "Project" + is_public = jour.project.is_public + elsif jour.jour_type == "Course" + is_public = jour.course.is_public + end + + present :data, jour, with: Mobile::Entities::Jours,user: user,type: type,page: page + present :type, type + present :page, page + present :is_public, is_public + present :status, 0 + rescue Exception=>e + present :status, -1 + present :message, e.message + end end end end diff --git a/app/api/mobile/apis/messages.rb b/app/api/mobile/apis/messages.rb index ceda5058f..963d2f4ab 100644 --- a/app/api/mobile/apis/messages.rb +++ b/app/api/mobile/apis/messages.rb @@ -7,17 +7,36 @@ module Mobile desc "get special topic" post ':id' do - authenticate! - user = current_user + begin + # authenticate! + user = current_user - #0一级回复的更多 1 二级回复的更多 - type = params[:type] || 0 - page = params[:page] || 0 - message = Message.find params[:id] - present :data, message, with: Mobile::Entities::Message,user: user,type: type,page: page - present :type, type - present :page, page - present :status, 0 + #0一级回复的更多 1 二级回复的更多 + type = params[:type] || 0 + page = params[:page] || 0 + message = Message.find params[:id] + + is_public = 1 + type_name = "" + + if message.project + is_public = message.project.is_public + type_name = "project" + elsif message.course + is_public = message.course.is_public + type_name = "course" + end + + present :data, message, with: Mobile::Entities::Message,user: user,type: type,page: page + present :type, type + present :page, page + present :is_public, is_public + present :type_name, type_name + present :status, 0 + rescue Exception=>e + present :status, -1 + present :message, e.message + end end end end diff --git a/app/api/mobile/apis/new_comment.rb b/app/api/mobile/apis/new_comment.rb index 5b7159301..e5e42e624 100644 --- a/app/api/mobile/apis/new_comment.rb +++ b/app/api/mobile/apis/new_comment.rb @@ -11,69 +11,187 @@ module Mobile params do requires :type, type: String requires :content, type: String - requires :token, type: String end post ':id' do + unless current_user + #如果当前用户不存在 则需要根据微信昵称注册一个帐号 + openid = session[:wechat_openid] + raise "无法获取到openid,请在微信中打开本页面" unless openid + us = UsersService.new + + access_token = session[:access_token] + refresh_token = session[:refresh_token] + + if access_token.present? && refresh_token.present? + refreshinfo = Wechat.api.web_refresh_access_token(refresh_token) + + access_token = refreshinfo["access_token"] + refresh_token = refreshinfo["refresh_token"] + session[:access_token] = access_token + session[:refresh_token] = refresh_token + + #获取用户信息 + userinfo = Wechat.api.web_userinfo(access_token,openid) + Rails.logger.info "userinfo!!!!!!!!!" + Rails.logger.info userinfo + name = userinfo["nickname"] + else + name = openid[0..3]+"***"+openid.last + end + + user = us.register ({:login=>openid, :mail=>"#{openid}@163.com", + :password=>"12345678", :password_confirmation=>"12345678", + :should_confirmation_password => true}) + user.update_attributes(:lastname=>name) + + raise user.errors.full_messages.first if user.new_record? + UserWechat.create!( + openid: openid, + user: user, + bindtype: 1 + ) + end + authenticate! + + subscribe = 0 #默认未关注 + + #-------------------获取用户是否关注此公众号----------------------------- + openid = session[:wechat_openid] + raise "无法获取到openid,请在微信中打开本页面" unless openid + user_info = Wechat.api.user(openid) + Rails.logger.info "user_info!!!!!!!!!" + Rails.logger.info user_info + subscribe = user_info["subscribe"] + + status = 0 + tip = 0 #0班级1项目 type = params[:type] result = 1 if params[:content]!="" && current_user case type when "HomeworkCommon" homework_common = HomeworkCommon.find(params[:id]) + + #如果是私有的 并且不是成员则不能回复 + # is_public = homework_common.course.is_public + # if is_public == 0 && !current_user.member_of_course?(homework_common.course) + # status = -1 + # tip = 0 + # else + # feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], params[:id]) + # if (feedback.errors.empty?) + # homework_common.update_column(:updated_at, Time.now) + # result = 2 + # end + # end feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], params[:id]) if (feedback.errors.empty?) homework_common.update_column(:updated_at, Time.now) result = 2 end + when "News" news = News.find(params[:id]) - comment = Comment.new - comment.comments = params[:content] - comment.author = current_user - if news.comments << comment - result = 2 + + # if news.project + # if news.project.is_public == false && !current_user.member_of?(news.project) + # status = -1 + # tip = 1 + # end + # elsif news.course + # if news.course.is_public == 0 && !current_user.member_of_course?(news.course) + # status = -1 + # tip = 0 + # end + # end + + if status == 0 + comment = Comment.new + comment.comments = params[:content] + comment.author = current_user + if news.comments << comment + result = 2 + end end when "Message" message = Message.find(params[:id]) board = Board.find(message.board_id) - topic = message.root - reply = Message.new - reply.author = current_user - reply.board = board - reply.content = params[:content] - reply.parent_id = params[:id] - reply.subject = "RE: #{topic.subject}" - if topic.children << reply - result = 2 + + # if message.project + # if message.project.is_public == false && !current_user.member_of?(message.project) + # status = -1 + # tip = 1 + # end + # elsif message.course + # if message.course.is_public == 0 && !current_user.member_of_course?(message.course) + # status = -1 + # tip = 0 + # end + # end + + if status == 0 + topic = message.root + reply = Message.new + reply.author = current_user + reply.board = board + reply.content = params[:content] + reply.parent_id = params[:id] + reply.subject = "RE: #{topic.subject}" + if topic.children << reply + result = 2 + end end when "JournalsForMessage" jour = JournalsForMessage.find params[:id] - parent_id = params[:id] - author_id = current_user.id - reply_user_id = jour.user_id - reply_id = params[:id] - content = params[:content] - options = {:user_id => author_id, - :status => true, - :m_parent_id => parent_id, - :m_reply_id => reply_id, - :reply_id => reply_user_id, - :notes => content, - :is_readed => false} - jfm = jour.user.add_jour(nil, nil, nil, options) - if jfm.errors.empty? - (JournalsForMessage.find parent_id).update_attribute(:updated_on,Time.now) - result = 2 + + # if jour.jour_type == "Project" + # if jour.project.is_public == false && !current_user.member_of?(jour.project) + # status = -1 + # tip = 1 + # end + # elsif jour.jour_type == "Course" + # if jour.course.is_public == 0 && !current_user.member_of_course?(jour.course) + # status = -1 + # tip = 0 + # end + # end + + if status == 0 + parent_id = params[:id] + author_id = current_user.id + reply_user_id = jour.user_id + reply_id = params[:id] + content = params[:content] + options = {:user_id => author_id, + :status => true, + :m_parent_id => parent_id, + :m_reply_id => reply_id, + :reply_id => reply_user_id, + :notes => content, + :is_readed => false} + jfm = jour.user.add_jour(nil, nil, nil, options) + if jfm.errors.empty? + (JournalsForMessage.find parent_id).update_attribute(:updated_on,Time.now) + result = 2 + end end when 'Issue' issue = Issue.find params[:id] - is_jour = Journal.new - is_jour.user_id = current_user.id - is_jour.notes = params[:content] - is_jour.journalized = issue - if is_jour.save - result = 2 + + # if issue.project.is_public == false && !current_user.member_of?(issue.project) + # status = -1 + # tip = 1 + # end + + if status == 0 + is_jour = Journal.new + is_jour.user_id = current_user.id + is_jour.notes = params[:content] + is_jour.journalized = issue + if is_jour.save + result = 2 + end end when 'BlogComment' blog = BlogComment.find(params[:id]).root @@ -97,7 +215,9 @@ module Mobile result = 3 end present :result, result - present :status, 0 + present :status, status + present :tip, tip + present :subscribe,subscribe end end end diff --git a/app/api/mobile/apis/newss.rb b/app/api/mobile/apis/newss.rb index 6e012ca4b..c2e2fcb5c 100644 --- a/app/api/mobile/apis/newss.rb +++ b/app/api/mobile/apis/newss.rb @@ -7,17 +7,32 @@ module Mobile desc "get special news" post ':id' do - authenticate! - user = current_user + begin + # authenticate! + user = current_user - #0一级回复的更多 1 二级回复的更多 - type = params[:type] || 0 - page = params[:page] || 0 - news = News.find params[:id] - present :data, news, with: Mobile::Entities::News,user: user,type: type,page: page - present :type, type - present :page, page - present :status, 0 + #0一级回复的更多 1 二级回复的更多 + type = params[:type] || 0 + page = params[:page] || 0 + news = News.find params[:id] + + is_public = 1 + + if news.project + is_public = news.project.is_public + elsif news.course + is_public = news.course.is_public + end + + present :data, news, with: Mobile::Entities::News,user: user,type: type,page: page + present :type, type + present :page, page + present :is_public, is_public + present :status, 0 + rescue Exception=>e + present :status, -1 + present :message, e.message + end end end end diff --git a/app/api/mobile/apis/syllabuses.rb b/app/api/mobile/apis/syllabuses.rb index 8538fae99..100760f8e 100644 --- a/app/api/mobile/apis/syllabuses.rb +++ b/app/api/mobile/apis/syllabuses.rb @@ -28,9 +28,10 @@ module Mobile ss = SyllabusesService.new sy = ::Syllabus.find(params[:id]) - sy.courses = sy.courses.not_deleted - present :data, sy, with: Mobile::Entities::Syllabus,user: current_user + result = {:title=>sy.title, :id=>sy.id , :user_id=>sy.user_id,:courses=>sy.courses.not_deleted} + + present :data, result, with: Mobile::Entities::Syllabus,user: current_user present :status, 0 end diff --git a/app/api/mobile/apis/users.rb b/app/api/mobile/apis/users.rb index 9b1be37c3..62376dc6e 100644 --- a/app/api/mobile/apis/users.rb +++ b/app/api/mobile/apis/users.rb @@ -29,7 +29,7 @@ module Mobile logger.debug "openid ============== #{openid}" raise "无法获取到openid,请在微信中打开本页面" unless openid uw = UserWechat.where(openid: openid).first - raise "此微信号已绑定用户(#{uw.user.login}), 不能重复绑定" if uw + raise "此微信号已绑定用户(#{uw.user.login}), 不能重复绑定" if uw && uw.real? user, last_login_on = User.try_to_login(params[:login], params[:password]) raise "用户名或密码错误,请重新输入" unless user @@ -37,12 +37,17 @@ module Mobile raise "此用户已经绑定过公众号, 请换一个帐户试试" if user.user_wechat - UserWechat.create!( + if uw && !uw.real? + uw.migrate_user(user) + else + UserWechat.create!( openid: openid, user: user - ) + ) + end + ws = WechatService.new - ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台。", user.login, Time.now.strftime("%Y-%m-%d")) + ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台。", user.login+"("+user.show_name+")", Time.now.strftime("%Y-%m-%d")) present status: 0, message: '您已成功绑定Trustie平台' end @@ -53,22 +58,29 @@ module Mobile requires :password, type: String, desc: 'password' end post do - openid = session[:wechat_openid] logger.debug "openid ============== #{openid}" raise "无法获取到openid,请在微信中打开本页面" unless openid - + uw = UserWechat.where(openid: openid).first + raise "此微信号已绑定用户(#{uw.user.login}), 不能重复绑定" if uw && uw.real? us = UsersService.new user = us.register params.merge(:password_confirmation => params[:password], :should_confirmation_password => true) raise user.errors.full_messages.first if user.new_record? - UserWechat.create!( + + if uw && !uw.real? + user.update_attributes(:lastname=>uw.user[:lastname]) + uw.migrate_user(user) + else + UserWechat.create!( openid: openid, user: user - ) + ) + end + ws = WechatService.new - ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台。", user.login, Time.now.strftime("%Y-%m-%d")) + ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台。", user.login+"("+user.show_name+")", Time.now.strftime("%Y-%m-%d")) present :data, user, with: Mobile::Entities::User present :status, 0 end diff --git a/app/api/mobile/apis/whomeworks.rb b/app/api/mobile/apis/whomeworks.rb index 9d03eed9f..572ce5e0b 100644 --- a/app/api/mobile/apis/whomeworks.rb +++ b/app/api/mobile/apis/whomeworks.rb @@ -7,23 +7,32 @@ module Mobile desc "get one homework" post ':id' do - authenticate! - user = current_user + begin + # authenticate! + user = current_user - #0一级回复的更多 1 二级回复的更多 - type = params[:type] || 0 - page = params[:page] || 0 + #0一级回复的更多 1 二级回复的更多 + type = params[:type] || 0 + page = params[:page] || 0 - if type == 0 - homework = HomeworkCommon.find params[:id] - present :data, homework, with: Mobile::Entities::Whomework,user: user,type: type,page: page,comment_type: "homework" - else - jour = JournalsForMessage.find params[:id] - present :data, jour, with: Mobile::Entities::Jours,user: user,type: type,page: page,comment_type: "homework" + is_public = 1 + + if type == 0 + homework = HomeworkCommon.find params[:id] + is_public = homework.course.is_public + present :data, homework, with: Mobile::Entities::Whomework,user: user,type: type,page: page,comment_type: "homework" + else + jour = JournalsForMessage.find params[:id] + present :data, jour, with: Mobile::Entities::Jours,user: user,type: type,page: page,comment_type: "homework" + end + present :type, type + present :page, page + present :is_public, is_public + present :status, 0 + rescue Exception=>e + present :status, -1 + present :message, e.message end - present :type, type - present :page, page - present :status, 0 end end end diff --git a/app/api/mobile/entities/course.rb b/app/api/mobile/entities/course.rb index aaf5dd78b..fc78cc14e 100644 --- a/app/api/mobile/entities/course.rb +++ b/app/api/mobile/entities/course.rb @@ -65,9 +65,9 @@ module Mobile end member = course.members.where("user_id=#{current_user.id} and course_id=#{course.id}")[0] - roleName = member.roles[0].name if member + role_ids = member.role_ids if member - if roleName && (roleName == "TeachingAsistant" || roleName == "Teacher" ) + if role_ids && (role_ids.include?(7) || role_ids.include?(9) ) can_setting = true end @@ -76,6 +76,15 @@ module Mobile end can_setting end + expose :is_member, if: lambda { |instance, options| options[:user] } do |instance, options| + current_user = options[:user] + if instance[:course] + course = instance[:course] + else + course = instance + end + current_user.member_of_course?(course) + end expose :teacher, using: Mobile::Entities::User do |c, opt| if c.is_a? ::Course c.teacher diff --git a/app/api/mobile/entities/project.rb b/app/api/mobile/entities/project.rb index 073f7cd0f..8da151b42 100644 --- a/app/api/mobile/entities/project.rb +++ b/app/api/mobile/entities/project.rb @@ -23,6 +23,16 @@ module Mobile current_user.id == instance.user_id end + expose :is_member, if: lambda { |instance, options| options[:user] } do |instance, options| + current_user = options[:user] + if instance[:project] + project = instance[:project] + else + project = instance + end + current_user.member_of?(project) + end + expose :member_count, if: lambda { |instance, options| options[:user] } do |instance, options| instance.members.count diff --git a/app/api/mobile/entities/syllabus.rb b/app/api/mobile/entities/syllabus.rb index e4dd2e07a..4e9f858c8 100644 --- a/app/api/mobile/entities/syllabus.rb +++ b/app/api/mobile/entities/syllabus.rb @@ -5,8 +5,8 @@ module Mobile expose :id expose :can_setting, if: lambda { |instance, options| options[:user] } do |instance, options| current_user = options[:user] - can_setting = instance.user_id == current_user.id ? true : false - can_setting = false if instance.id.nil? + can_setting = instance[:user_id] == current_user.id ? true : false + can_setting = false if instance[:id].nil? can_setting end expose :courses, using: Mobile::Entities::Course diff --git a/app/controllers/applied_project_controller.rb b/app/controllers/applied_project_controller.rb index 6bcffddf8..30978367c 100644 --- a/app/controllers/applied_project_controller.rb +++ b/app/controllers/applied_project_controller.rb @@ -75,6 +75,8 @@ class AppliedProjectController < ApplicationController @project.project_infos << project_info @project.user_grades << user_grades unless user_grades.first.user_id.nil? + ps = ProjectsService.new + ps.send_wechat_join_project_notice User.current,@project,5,0 else @flag = 4 role = params[:member] == "member_manager" ? 3 : (params[:member] == "member_developer" ? 4 :5) diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index f14416442..d661350c6 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -84,7 +84,8 @@ class MembersController < ApplicationController # 添加成功后,申请人收到消息 AppliedMessage.create(:user_id => @applied_message.applied_user_id, :applied_type => "AppliedProject", :applied_id => applied_project.id , :status => 6, :viewed => false, :applied_user_id => @applied_message.user_id, :role => applied_project.role, :project_id => applied_project.project_id) - + ps = ProjectsService.new + ps.send_wechat_join_project_notice user,project,ap_role,0 # 添加成功后,批准人收到消息 # AppliedMessage.create(:user_id => @applied_message.user_id, :applied_type => "AppliedProject", :applied_id => applied_project.id , # :status => 7, :viewed => true, :applied_user_id => @applied_message.applied_user_id, :role => applied_project.role, :project_id => applied_project.project_id) @@ -114,6 +115,11 @@ class MembersController < ApplicationController @applied_message = AppliedMessage.find(params[:applied_message_id]) # AppliedMessage.create(:user_id => @applied_message.user_id, :applied_type => "AppliedProject", :applied_id => applied_project.id ,:status => 5, # :viewed => true, :applied_user_id => @applied_message.applied_user_id, :role => applied_project.role, :project_id => applied_project.project_id) + ps = ProjectsService.new + user = User.find(@applied_message.applied_user_id) + ap_role = applied_project.try(:role) + ps.send_wechat_join_project_notice user,project,ap_role,1 + applied_project.delete end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 1c2b1a50e..e929153ad 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -353,14 +353,14 @@ class UsersController < ApplicationController def dealwith_apply_request @msg = CourseMessage.find(params[:msg_id]) #CourseMessage content存的是role 7教辅 9 教师 + apply_user = User.find(@msg.course_message_id) + ids = @msg.content.split(",") # [@msg.content] msg content保存的是申请的职位角色 + integer_ids = [] + ids.each do |role_id| + integer_ids << role_id.to_i + end case params[:agree] when 'Y' - apply_user = User.find(@msg.course_message_id) - ids = @msg.content.split(",") # [@msg.content] msg content保存的是申请的职位角色 - integer_ids = [] - ids.each do |role_id| - integer_ids << role_id.to_i - end if apply_user.member_of_course?(Course.find(@msg.course_id)) #将角色改为老师或者教辅 member = Course.find(@msg.course_id).members.where(:user_id=>apply_user.id).all[0] @@ -383,11 +383,32 @@ class UsersController < ApplicationController Course.find(@msg.course_id).members << members CourseMessage.create(:user_id => @msg.course_message_id, :course_id => @msg.course_id, :viewed => false,:content=> @msg.content,:course_message_id=>User.current.id,:content=>@msg.content,:course_message_type=>'CourseRequestDealResult',:status=>1) @msg.update_attributes(:status=>1,:viewed=>1) + + if integer_ids.include?(9) + cs = CoursesService.new + c = Course.find(@msg.course_id) + cs.send_wechat_join_class_notice apply_user,c,9,0 + else + cs = CoursesService.new + c = Course.find(@msg.course_id) + cs.send_wechat_join_class_notice apply_user,c,7,0 + end end when 'N' CourseMessage.create(:user_id => @msg.course_message_id, :course_id => @msg.course_id, :viewed => false,:content=> @msg.content,:course_message_id=>User.current.id,:content=>@msg.content,:course_message_type=>'CourseRequestDealResult',:status=>2) @msg.update_attributes(:status=>2,:viewed=>1) + + if integer_ids.include?(9) + cs = CoursesService.new + c = Course.find(@msg.course_id) + cs.send_wechat_join_class_notice apply_user,c,9,1 + else + cs = CoursesService.new + c = Course.find(@msg.course_id) + cs.send_wechat_join_class_notice apply_user,c,7,1 + end + end respond_to do |format| format.js diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index c5ef8c24e..ced8854d9 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -137,7 +137,7 @@ class WechatsController < ActionController::Base on :fallback, respond: 'fallback message' on :click, with: 'FEEDBACK' do |request, key| - request.reply.text "如有反馈问题,请直接切换至输入框,发微信给我们即可" + request.reply.text "如有问题反馈,请您:\n1、直接切换至输入框,发微信给我们。\n2、加入QQ群:173184401,我们直接互动。\n欢迎大家积极反馈,谢谢啦!" end on :click, with: 'MY_NEWS' do |request, key| @@ -252,13 +252,16 @@ class WechatsController < ActionController::Base end def sendBind(request) + tmpurl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities'}&response_type=code&scope=snsapi_base&state=login&connect_redirect=1#wechat_redirect" + logger.info "tmpurl!!!!!!!!!!!!!!" + logger.info tmpurl news = (1..1).each_with_object([]) { |n, memo| memo << { title: '绑定登录', content: "欢迎使用Trustie创新实践服务平台! 在这里您可以随时了解您的课程和项目动态,随时点赞和回复。 我们将会与微信不断结合,为您提供更有价值的服务。 您还未绑定确实的用户,请先绑定,谢谢!" } } request.reply.news(news) do |article, n, index| # article is return object - url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities'}&response_type=code&scope=snsapi_base&state=login#wechat_redirect" + url = tmpurl pic_url = "#{ROOT_URL}/images/weixin_pic.jpg" article.item title: "#{n[:title]}", description: n[:content], @@ -284,7 +287,7 @@ class WechatsController < ActionController::Base end news = (1..1).each_with_object([]) { |n, memo| memo << { title: '恭喜您成功加入班级,开始学习吧!', - content: "课程名称:#{course.name}\n班级名称:#{course.name}\n任课老师:#{course.teacher.show_name}\n进入班级,和小伙伴愉快的学习吧!"} } + content: "课程名称:#{course.syllabus.title}\n班级名称:#{course.name}\n任课老师:#{course.teacher.show_name}\n进入班级,和小伙伴愉快的学习吧!"} } return request.reply.news(news) do |article, n, index| # article is return object url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities#/class?id='+course.id.to_s}&response_type=code&scope=snsapi_base&state=myclass#wechat_redirect" pic_url = "#{ROOT_URL}/images/wechat/class.jpg" @@ -314,7 +317,7 @@ class WechatsController < ActionController::Base creator = User.find(project.user_id) news = (1..1).each_with_object([]) { |n, memo| memo << { title: '恭喜您成功加入项目,开始研发吧!', - content: "项目名称:#{project.name}\n发起人:#{creator.name}\n进入项目,和小伙伴轻松的研发吧!"} } + content: "项目名称:#{project.name}\n发起人:#{creator.show_name}\n进入项目,和小伙伴轻松的研发吧!"} } return request.reply.news(news) do |article, n, index| # article is return object url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities#/project?id='+project.id.to_s}&response_type=code&scope=snsapi_base&state=myproject#wechat_redirect" pic_url = "#{ROOT_URL}/images/wechat/project.jpg" @@ -333,10 +336,12 @@ class WechatsController < ActionController::Base code = params[:code] || session[:wechat_code] openid = get_openid_from_code(code) - raise "无法获取到微信openid" unless openid + # raise "无法获取到微信openid" unless openid + + raise "请在微信中关注Trustie创新实践平台后再打开本页面" unless openid uw = UserWechat.where(openid: openid).first - raise "还未绑定trustie帐户" unless uw + raise "还未绑定trustie帐户" unless (uw && uw.bindtype == 0) logger.debug "get_bind ============= #{uw}" user = uw.user @@ -349,13 +354,25 @@ class WechatsController < ActionController::Base end end + def is_bind + begin + code = params[:code] || session[:wechat_code] + open_id = get_openid_from_code(code) + raise "还未绑定trustie帐户" unless user_binded?(open_id) + render :json => {status: 0} + rescue Exception=>e + render :json => {status: -1, message: e.message} + end + end + def bind begin code = params[:code] || session[:wechat_code] openid = get_openid_from_code(code) - raise "无法获取到openid,请在微信中打开本页面" unless openid + # raise "无法获取到openid,请在微信中打开本页面" unless openid + raise "请在微信中关注Trustie创新实践平台后再打开本页面" unless openid raise "此微信号已绑定用户,不能重复绑定" if user_binded?(openid) user, last_login_on = User.try_to_login(params[:username], params[:password]) @@ -369,7 +386,7 @@ class WechatsController < ActionController::Base user: user ) ws = WechatService.new - ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台!", user.login, format_time(Time.now)) + ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台!", user.login+"("+user.show_name+")", format_time(Time.now)) render :json => {status:0, msg: "绑定成功"} rescue Exception=>e render :json => {status: -1, msg: e.message} @@ -399,9 +416,9 @@ class WechatsController < ActionController::Base render 'wechats/open_wechat', layout: nil and return end - unless user_binded?(open_id) - @path = '/login' - else + # unless user_binded?(open_id) + # @path = '/login' + # else if params[:state] == 'myclass' @course_id = params[:id]; elsif params[:state] == 'myproject' @@ -410,9 +427,16 @@ class WechatsController < ActionController::Base session[:wechat_openid] = open_id if params[:code] - redirect_to "/wechat/user_activities##{@path}?id=#{params[:id]}" and return + if params[:userid] + redirect_to "/wechat/user_activities##{@path}?id=#{params[:id]}&userid=#{params[:userid]}" and return + elsif params[:id] + redirect_to "/wechat/user_activities##{@path}?id=#{params[:id]}" and return + else + redirect_to "/wechat/user_activities##{@path}" and return + end + # redirect_to "/wechat/user_activities##{@path}?id=#{params[:id]}" and return end - end + # end render 'wechats/user_activities', layout: nil end @@ -421,10 +445,19 @@ class WechatsController < ActionController::Base def get_openid_from_code(code) return 'oCnvgvz8R7QheXE-R9Kkr39j8Ndg' if code =='only-for-test' openid = session[:wechat_openid] - unless openid if code - openid = wechat.web_access_token(code)["openid"] + #不能联系调两次web_access_token 否则会提示请在微信客户端打开次链接 + info = wechat.web_access_token(code) + openid =info["openid"] + access_token =info["access_token"] + if access_token + session[:access_token] = access_token + end + refresh_token = info["refresh_token"] + if refresh_token + session[:refresh_token] = refresh_token + end end end @@ -437,6 +470,7 @@ class WechatsController < ActionController::Base def user_binded?(openid) uw = UserWechat.where(openid: openid).first + uw && uw.bindtype == 0 end def current_url diff --git a/app/models/homework_common.rb b/app/models/homework_common.rb index 86aab8260..a901e6338 100644 --- a/app/models/homework_common.rb +++ b/app/models/homework_common.rb @@ -77,7 +77,7 @@ class HomeworkCommon < ActiveRecord::Base count = ShieldWechatMessage.where("container_type='User' and container_id=#{m.user_id} and shield_type='Course' and shield_id=#{self.course_id}").count if count == 0 ws = WechatService.new - ws.homework_message_notice(m.user_id, "homework", self.id, "#{m.user.show_name},#{l(:label_new_homework_template)}:", self.course.name, "新作业:"+ self.name.html_safe, "作业内容请点击“详情”查看。") + ws.homework_message_notice(m.user_id, "homework", self.id, "#{m.user.show_name},#{l(:label_new_homework_template)}", self.course.name, "新作业:"+ self.name.html_safe, "作业内容请点击“详情”查看。") end # end end diff --git a/app/models/news.rb b/app/models/news.rb index 54f6fce08..cd7156cca 100644 --- a/app/models/news.rb +++ b/app/models/news.rb @@ -173,7 +173,7 @@ class News < ActiveRecord::Base count = ShieldWechatMessage.where("container_type='User' and container_id=#{m.user_id} and shield_type='Course' and shield_id=#{self.course_id}").count if count == 0 ws = WechatService.new - content = strip_html self.author.try(:realname) + " 发布了通知:" + self.title.html_safe, 200 + content = self.title ws.class_notice m.user_id, "course_notice", self.id, "#{l(:label_new_notice_template)}", self.course.name, self.author.show_name, format_time(self.created_on), content, "点击查看通知详情" end end diff --git a/app/models/user.rb b/app/models/user.rb index 57663f3eb..b863c1f70 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -228,7 +228,7 @@ class User < Principal # Prevents unauthorized assignments attr_protected :login, :admin, :password, :password_confirmation, :hashed_password - LOGIN_LENGTH_LIMIT = 25 + LOGIN_LENGTH_LIMIT = 30 MAIL_LENGTH_LIMIT = 60 validates_presence_of :login, :mail, :if => Proc.new { |user| !user.is_a?(AnonymousUser) } diff --git a/app/models/user_wechat.rb b/app/models/user_wechat.rb index 49053dbf0..8328a47df 100644 --- a/app/models/user_wechat.rb +++ b/app/models/user_wechat.rb @@ -1,6 +1,26 @@ class UserWechat < ActiveRecord::Base attr_accessible :subscribe, :openid, :nickname, :sex, :language, :city, :province, :country, - :headimgurl, :subscribe_time, :unionid, :remark, :groupid, :user, :user_id + :headimgurl, :subscribe_time, :unionid, :remark, :groupid, :user, :user_id, :bindtype belongs_to :user + + def real? + bindtype == 0 + end + + def migrate_user(u) + self.bindtype = 0 + old_user = user.id + self.user = u + self.save + + ## 主要是将comment 迁移 + User.delete(old_user) + + JournalsForMessage.where(user_id: old_user).update_all(user_id: u.id) + Journal.where(user_id: old_user).update_all(user_id: u.id) + Comment.where(author_id: old_user).update_all(author_id: u.id) + Message.where(author_id: old_user).update_all(author_id: u.id) + BlogComment.where(author_id: old_user).update_all(author_id: u.id) + end end diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb index c6854f3dd..7d574bada 100644 --- a/app/services/courses_service.rb +++ b/app/services/courses_service.rb @@ -97,7 +97,7 @@ class CoursesService end users = [] @members.each do |m| - img_url = url_to_avatar(m.user) + img_url = "/images/"+url_to_avatar(m.user) gender = m.user.user_extensions.gender.nil? ? 0 : m.user.user_extensions.gender work_unit = get_user_work_unit m.user location = get_user_location m.user @@ -108,14 +108,14 @@ class CoursesService end #双重身份 学生列表中不显示 - unless (params[:role] == '2' && role_ids.length >= 2) + # unless (params[:role] == '2' && role_ids.length >= 2) users << {:id => m.user.id, :img_url => img_url, :nickname => m.user.login, :gender => gender, :work_unit => work_unit, :mail => m.user.mail, :location => location, role_name: m.roles.first.name, name: m.user.show_name, roles_id: role_ids.include?(7) ? 7 : (role_ids.include?(9) ? 9 : 10 ), :brief_introduction => m.user.user_extensions.brief_introduction,:realname=>m.user.realname} - end + # end end users @@ -223,16 +223,20 @@ class CoursesService end if integer_ids.include?(9) message = "您已同意教师"+apply_user.show_name+",加入班级" + send_wechat_join_class_notice apply_user,c,9,0 else message = "您已同意助教"+apply_user.show_name+",加入班级" + send_wechat_join_class_notice apply_user,c,7,0 end else CourseMessage.create(:user_id => apply_user.id, :course_id => c.id, :viewed => false,:content=> messages.content,:course_message_id=>current_user.id,:course_message_type=>'CourseRequestDealResult',:status=>2) messages.update_attributes(:status=>2,:viewed=>1) if integer_ids.include?(9) message = "您已拒绝教师"+apply_user.show_name+",加入班级" + send_wechat_join_class_notice apply_user,c,9,1 else message = "您已拒绝助教"+apply_user.show_name+",加入班级" + send_wechat_join_class_notice apply_user,c,7,1 end end status = 0 @@ -528,6 +532,33 @@ class CoursesService {:state => @state,:course => course} end + #加入班级结果 + def send_wechat_join_class_notice user,course,role_id,result + count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Course' and shield_id=#{course.id}").count + if count == 0 + ws = WechatService.new + + role_name = role_id == 7 ? "助教" : role_id == 9 ? "教师" : "学生" + result_name = result == 0 ? "通过" : "被拒绝" + content = "您以"+role_name+"身份加入班级的申请已"+result_name+"。" + + if result == 0 + title = "恭喜您加入班级成功。" + remark = "点击查看班级详情。" + uid = 0 + type = "class" + else + title = "很遗憾您未能成功加入班级。" + remark = "点击查看申请详情。" + uid = user.id + type = "review_class_member" + end + ws = WechatService.new + ws.class_notice user.id, type, course.id, title, course.name, user.show_name, format_time(Time.now), content, remark,uid + + end + end + #多个角色加入课程 def join_course_roles params,current_user course = Course.find_by_invite_code(params[:invite_code]) if params[:invite_code] @@ -587,6 +618,7 @@ class CoursesService course.members << members StudentsForCourse.create(:student_id => current_user.id, :course_id => course.id) @state = 0 + send_wechat_join_class_notice current_user,course,10,0 else is_stu = false if role_ids.include?("10") @@ -595,6 +627,7 @@ class CoursesService course.members << members StudentsForCourse.create(:student_id => current_user.id, :course_id =>course.id) is_stu = true + send_wechat_join_class_notice current_user,course,10,0 end #如果已经发送过消息了,那么就要给个提示 if CourseMessage.where("course_message_type = 'JoinCourseRequest' and user_id = #{course.tea_id} and content = '#{role_str}' and course_message_id = #{current_user.id} and course_id = #{course.id} and status = 0").count != 0 diff --git a/app/services/homework_service.rb b/app/services/homework_service.rb index dd42795b1..04680f76f 100644 --- a/app/services/homework_service.rb +++ b/app/services/homework_service.rb @@ -256,7 +256,7 @@ class HomeworkService jours = @homework.journals_for_messages.where("is_comprehensive_evaluation = 3 or is_comprehensive_evaluation is null").order("created_on DESC") jours.each do |jour| user = jour.user - img_url = url_to_avatar(jour.user) + img_url = "/images/"+url_to_avatar(jour.user) datetime = jour.created_on content = jour.notes end diff --git a/app/services/projects_service.rb b/app/services/projects_service.rb index 1b342c122..56dfaceff 100644 --- a/app/services/projects_service.rb +++ b/app/services/projects_service.rb @@ -117,6 +117,27 @@ class ProjectsService ] end + #加入项目结果 + def send_wechat_join_project_notice user,project,role_id,result + count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Project' and shield_id=#{project.id}").count + if count == 0 + result_name = result == 0 ? "已同意" : "已拒绝" + if result == 0 + title = "恭喜您加入项目成功。" + remark = "点击查看项目详情。" + uid = 0 + type = "project" + else + title = "很遗憾您未能成功加入项目。" + remark = "点击查看申请详情。" + uid = user.id + type = "review_project_member" + end + ws = WechatService.new + ws.join_project_notice user.id, "project", project.id,title, project.name,result_name, remark,uid + end + end + def join_project params,current_user status = -1 project = Project.find_by_invite_code(params[:invite_code]) if params[:invite_code] @@ -128,6 +149,10 @@ class ProjectsService if current_user.member_of?(project) #如果已经是成员 member = project.member_principals.includes(:roles, :principal).where("user_id=?",current_user.id).first status = member.member_roles[0].role_id + + #将之前的申请都改为已拒绝 + applied_messages = AppliedMessage.where(:project_id => project.id, :status => true, :applied_user_id=>current_user.id,:applied_type => "AppliedProject") + applied_messages.update_all(:status=>5) else if params[:invite_code].present? @@ -146,6 +171,11 @@ class ProjectsService project.project_infos << project_info status = 0 + send_wechat_join_project_notice current_user,project,5,0 + + #将之前的申请都改为已拒绝 + applied_messages = AppliedMessage.where(:project_id => project.id, :status => true, :applied_user_id=>current_user.id,:applied_type => "AppliedProject") + applied_messages.update_all(:status=>5) else if !AppliedProject.where(:project_id => project.id, :user_id => current_user.id).first.nil? status = 8 @@ -181,7 +211,7 @@ class ProjectsService user = User.find(m.applied_user_id) if user - img_url = url_to_avatar(user) + img_url = "/images/"+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 @@ -210,7 +240,7 @@ class ProjectsService status = applied_message.status user = User.find(params[:user_id]) if user - img_url = url_to_avatar(user) + img_url = "/images/"+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 @@ -239,7 +269,12 @@ class ProjectsService if apply_message if user.member_of?(project) message = "已经是该项目的成员了" - applied_messages.update_all(:status=>7) + u_member = project.member_principals.includes(:roles, :principal).where("user_id=?",params[:user_id]).first + if u_member.member_roles[0].role_id == 5 + applied_messages.update_all(:status=>5) + else + applied_messages.update_all(:status=>7) + end else applied_project = apply_message.applied ap_role = applied_project.try(:role) @@ -266,6 +301,8 @@ class ProjectsService message = "您已同意"+rolename+user.show_name+",加入项目" + send_wechat_join_project_notice user,project,ap_role,0 + else #拒绝 AppliedMessage.create(:user_id => user.id, :applied_type => "AppliedProject", :applied_id => applied_project.id ,:status => 4, @@ -275,6 +312,8 @@ class ProjectsService applied_project.delete message = "您已拒绝"+rolename+user.show_name+",加入项目" + + send_wechat_join_project_notice user,project,ap_role,1 end status = 0 diff --git a/app/services/syllabuses_service.rb b/app/services/syllabuses_service.rb index fcb70653b..f12ae67cc 100644 --- a/app/services/syllabuses_service.rb +++ b/app/services/syllabuses_service.rb @@ -36,24 +36,21 @@ class SyllabusesService # courses.each do |c| # other.courses << c[:course] unless c[:course].syllabus # end + result = [] + i = 0 courses = user.courses.not_deleted syllabus_ids = courses.empty? ? '(-1)' : "(" + courses.map{|course| !course.syllabus_id.nil? && course.syllabus_id}.join(",") + ")" syllabuses = Syllabus.where("id in #{syllabus_ids} or user_id = #{user.id}").order("updated_at desc") syllabuses.each do |syllabus| - syllabus.courses = courses.where("syllabus_id = #{syllabus.id}").select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS updatetime").order("time desc") + tmp_courses = courses.where("syllabus_id = #{syllabus.id}").select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS updatetime").order("updatetime desc") + result[i] = {:title=>syllabus.title, :id=>syllabus.id , :user_id=>syllabus.user_id,:courses=>tmp_courses } + i = i + 1 end - - # syllabuses.to_a << other - - syllabuses.to_a - #管理权限 can_setting - # syllabuses.each do |s| - # s = judge_can_setting(s,user) - # end - - syllabuses + # syllabuses.to_a + # syllabuses + result end def after_create_course(course, user) @@ -72,7 +69,7 @@ class SyllabusesService if count == 0 ws = WechatService.new title = "恭喜您创建班级成功。" - ws.create_class_notice user.id, "create_course_notice", course.id,title, course.name, user.show_name, 0, "点击查看班级详情。" + ws.create_class_notice user.id, "create_course_notice", course.id,title, course.name, user.show_name, 1, "点击查看班级详情。" end end diff --git a/app/services/users_service.rb b/app/services/users_service.rb index ab1bb2ec4..5789befe5 100644 --- a/app/services/users_service.rb +++ b/app/services/users_service.rb @@ -80,7 +80,7 @@ class UsersService #id用户id def show_user(params) @user = User.find(params[:id]) - img_url = url_to_avatar(@user) + img_url = "/images/"+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 @@ -224,7 +224,7 @@ class UsersService membership.sort! {|older, newer| newer.created_on <=> older.created_on } course_list = [] membership.each do |mp| - course_list << {:course => mp.course,:img_url => url_to_avatar(mp.course),:current_user_is_member => current_user.member_of_course?(mp.course),:current_user_is_teacher => is_course_teacher(current_user,mp.course)} + course_list << {:course => mp.course,:img_url => "/images/"+url_to_avatar(mp.course),:current_user_is_member => current_user.member_of_course?(mp.course),:current_user_is_teacher => is_course_teacher(current_user,mp.course)} end course_list end diff --git a/app/services/wechat_service.rb b/app/services/wechat_service.rb index 9a6351391..3b6cfe930 100644 --- a/app/services/wechat_service.rb +++ b/app/services/wechat_service.rb @@ -111,11 +111,17 @@ class WechatService end end - def two_keys_template(openid, template_id, type, id, first, key1, key2, remark="") + def two_keys_template(openid, template_id, type, id, first, key1, key2, remark="",uid) + # tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}?id=#{id}" + tmpurl = Wechat.config.auto_openid_url_1+"?id="+id.to_s+Wechat.config.auto_openid_url_2+type+Wechat.config.auto_openid_url_3 + if uid && uid != 0 + tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}?id=#{id}"+ "&user_id="+uid.to_s + # tmpurl = Wechat.config.auto_openid_url_1+"?id="+id.to_s+ "&user_id="+uid.to_s+Wechat.config.auto_openid_url_2+type+Wechat.config.auto_openid_url_3 + end data = { touser:openid, template_id:template_id, - url:"#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}/#{id}",#/assets/wechat/app.html#/#{type}/#{id} + url:tmpurl,#/assets/wechat/app.html#/#{type}/#{id} topcolor:"#FF0000", data:{ first: { @@ -140,9 +146,11 @@ class WechatService end def three_keys_template(openid, template_id, type, id, first, key1, key2, key3, remark="",uid) - tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}/#{id}" + # tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}?id=#{id}" + tmpurl = Wechat.config.auto_openid_url_1+"?id="+id.to_s+Wechat.config.auto_openid_url_2+type+Wechat.config.auto_openid_url_3 if uid && uid != 0 tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}?id=#{id}"+ "&user_id="+uid.to_s + # tmpurl = Wechat.config.auto_openid_url_1+"?id="+id.to_s+ "&user_id="+uid.to_s+Wechat.config.auto_openid_url_2+type+Wechat.config.auto_openid_url_3 end data = { @@ -177,9 +185,11 @@ class WechatService end def four_keys_template(openid, template_id, type, id, first, key1, key2, key3, key4, remark="",uid) - tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}/#{id}" + # tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}?id=#{id}" + tmpurl = Wechat.config.auto_openid_url_1+"?id="+id.to_s+Wechat.config.auto_openid_url_2+type+Wechat.config.auto_openid_url_3 if uid && uid != 0 tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}?id=#{id}"+ "&user_id="+uid.to_s + # tmpurl = Wechat.config.auto_openid_url_1+"?id="+id.to_s+ "&user_id="+uid.to_s+Wechat.config.auto_openid_url_2+type+Wechat.config.auto_openid_url_3 end data = { @@ -223,7 +233,7 @@ class WechatService data = { touser:uw.openid, template_id:Wechat.config.binding_succ_notice, - url:"#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities", + url:Wechat.config.auto_openid_url_1+Wechat.config.auto_openid_url_2+"activites"+Wechat.config.auto_openid_url_3, topcolor:"#FF0000", data:{ first: { @@ -292,13 +302,26 @@ class WechatService end end + # def join_class_notice(user_id, type, id, first, key1, key2, key3,remark="") + # uw = UserWechat.where(user_id: user_id).first + # unless uw.nil? + # data = three_keys_template uw.openid,Wechat.config.join_class_notice, type, id, first, key1, key2, key3, remark + # begin + # req = Wechat.api.template_message_send Wechat::Message.to(uw.openid).template(data) + # rescue Exception => e + # Rails.logger.error "[join_class__notice] ===> #{e}" + # end + # Rails.logger.info "send over. #{req}" + # end + # end + def create_class_notice(user_id, type, id, first, key1, key2, key3, remark="") uw = UserWechat.where(user_id: user_id).first unless uw.nil? data = { touser:uw.openid, template_id:Wechat.config.create_class_notice, - url:"#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/class?id="+id.to_s, + url:Wechat.config.auto_openid_url_1+"?id="+id.to_s+Wechat.config.auto_openid_url_2+"class"+Wechat.config.auto_openid_url_3, topcolor:"#FF0000", data:{ first: { @@ -339,7 +362,7 @@ class WechatService data = { touser:uw.openid, template_id:Wechat.config.create_project_notice, - url:"#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/project?id="+id.to_s, + url:Wechat.config.auto_openid_url_1+"?id="+id.to_s+Wechat.config.auto_openid_url_2+"project"+Wechat.config.auto_openid_url_3, topcolor:"#FF0000", data:{ first: { @@ -383,4 +406,19 @@ class WechatService end end + def join_project_notice(user_id, type, id, first, key1, key2,remark="",uid=0) + uw = UserWechat.where(user_id: user_id).first + unless uw.nil? + data = two_keys_template uw.openid,Wechat.config.join_project_notice, type, id, first, key1, key2,remark,uid + begin + req = Wechat.api.template_message_send Wechat::Message.to(uw.openid).template(data) + rescue Exception => e + Rails.logger.error "[join_project_notice] ===> #{e}" + end + Rails.logger.info "send over. #{req}" + end + + + end + end \ No newline at end of file diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index 8c31c2106..7175f0a1e 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -17,7 +17,8 @@ window.g_debug = false; //调试标志,如果在本地请置为true window.apiUrl = '/api/v1/'; window.g_redirect_path = '<%= @path %>'; - window.g_localhost = "<%= Setting.protocol%>://"+"<%= Setting.host_name%>"; + window.g_localhost = "<%= Setting.protocol %>"+ "://"+"<%= Setting.host_name%>"; + window.g_appid = "<%= @appid %>"; <% if @course_id %> window.g_courseid = <%= @course_id %>; <% elsif @project_id %> diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 1340e7aa6..59aca719b 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -2156,6 +2156,6 @@ zh: label_blog_comment_template: 您的博客有新回复了。 label_new_blog_template: 有新博客了。 label_new_issue_template: 有新的问题动态了。 - label_new_notice_template: 您的课程有新通知了。 + label_new_notice_template: 您的班级有新通知了。 #edit yk label_code_work_tests: 代码测试列表 diff --git a/config/routes.rb b/config/routes.rb index 861aba437..6cbc0812d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1343,6 +1343,7 @@ RedmineApp::Application.routes.draw do get :user_activities post :bind post :get_bind + post :is_bind end end diff --git a/config/wechat.yml.template b/config/wechat.yml.template index 68e6ed62e..e6b942f09 100644 --- a/config/wechat.yml.template +++ b/config/wechat.yml.template @@ -23,6 +23,11 @@ default: &default create_class_notice: "2GtJJGzzNlNy2i0UrsjEDlvfSVIUXQfSo47stpcQAVw" create_project_notice: "jYu0iimbDpgWYZaTLXioZe2lvqoWTdKnUPyphTJ1mxs" project_review_notice: "kdb-8UlMjTc3z51Qcf8g2vY4i_nE4OGKZAucdQma_2E" + join_project_notice: "TtXvy0XMIQyCgpnXHhoB8t-x0QIfy-78gAJXsGf9afg" + + auto_openid_url_1: "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8e1ab05163a28e37&redirect_uri=https://www.trustie.net/wechat/user_activities" + auto_openid_url_2: "&response_type=code&scope=snsapi_base&state=" + auto_openid_url_3: "&connect_redirect=1#wechat_redirect" production: <<: *default diff --git a/config/wechat.yml.test b/config/wechat.yml.test index 8dbd9850f..c0676cc26 100644 --- a/config/wechat.yml.test +++ b/config/wechat.yml.test @@ -23,6 +23,11 @@ default: &default create_class_notice: "9CDIvHIKiGwPEQWRw_-wieec1o50tMXQPPZIfECKu0I" create_project_notice: "R2ZaQKJfDJgujPcHWPzadKHIRkIyj2CjX2o_qIuRqig" project_review_notice: "ip192wVXTav3qchgUn9_7B6lFfTlCZjwL7A1tncTOuc" + join_project_notice: "3KnMQEMUCmQWkB5JvzrpmguEwnN8bvUHUdpOTudxv_M" + + auto_openid_url_1: "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxc09454f171153c2d&redirect_uri=https://test.forge.trustie.net/wechat/user_activities" + auto_openid_url_2: "&response_type=code&scope=snsapi_base&state=" + auto_openid_url_3: "&connect_redirect=1#wechat_redirect" production: <<: *default diff --git a/db/migrate/20160811084401_add_bindtype_to_user_wechats.rb b/db/migrate/20160811084401_add_bindtype_to_user_wechats.rb new file mode 100644 index 000000000..6cba9e675 --- /dev/null +++ b/db/migrate/20160811084401_add_bindtype_to_user_wechats.rb @@ -0,0 +1,5 @@ +class AddBindtypeToUserWechats < ActiveRecord::Migration + def change + add_column :user_wechats, :bindtype, :integer, :default => 0 + end +end diff --git a/lib/wechat/lib/wechat/api.rb b/lib/wechat/lib/wechat/api.rb index 5cb457b9f..f267f8b69 100644 --- a/lib/wechat/lib/wechat/api.rb +++ b/lib/wechat/lib/wechat/api.rb @@ -7,6 +7,7 @@ module Wechat class Api < ApiBase API_BASE = 'https://api.weixin.qq.com/cgi-bin/' OAUTH2_BASE = 'https://api.weixin.qq.com/sns/oauth2/' + OAUTH2_USERINFO = 'https://api.weixin.qq.com/sns/' def initialize(appid, secret, token_file, timeout, skip_verify_ssl, jsapi_ticket_file) @client = Client.new(API_BASE, timeout, skip_verify_ssl) @@ -120,5 +121,23 @@ module Wechat } get 'access_token', params: params, base: OAUTH2_BASE end + + def web_auth_access_token(web_access_token, openid) + get 'auth', params: { access_token: web_access_token, openid: openid }, base: OAUTH2_BASE + end + + def web_refresh_access_token(user_refresh_token) + params = { + appid: access_token.appid, + grant_type: 'refresh_token', + refresh_token: user_refresh_token + } + get 'refresh_token', params: params, base: OAUTH2_BASE + end + + def web_userinfo(web_access_token, openid, lang = 'zh_CN') + get 'userinfo', params: { access_token: web_access_token, openid: openid, lang: lang }, base: OAUTH2_USERINFO + end + end end diff --git a/lib/wechat/lib/wechat/api_base.rb b/lib/wechat/lib/wechat/api_base.rb index b873251f7..1fa3c4f7b 100644 --- a/lib/wechat/lib/wechat/api_base.rb +++ b/lib/wechat/lib/wechat/api_base.rb @@ -1,6 +1,6 @@ module Wechat class ApiBase - attr_reader :access_token, :client, :jsapi_ticket + attr_reader :access_token, :client, :jsapi_ticket, :auth_access_token MP_BASE = 'https://mp.weixin.qq.com/cgi-bin/' @@ -42,7 +42,7 @@ module Wechat def with_access_token(params = {}, tries = 2) params ||= {} - yield(params.merge(access_token: access_token.token)) + yield(params.reverse_merge(access_token: access_token.token)) rescue AccessTokenExpiredError access_token.refresh retry unless (tries -= 1).zero? diff --git a/lib/wechat/lib/wechat/token/auth_access_token.rb b/lib/wechat/lib/wechat/token/auth_access_token.rb new file mode 100644 index 000000000..5b58e261c --- /dev/null +++ b/lib/wechat/lib/wechat/token/auth_access_token.rb @@ -0,0 +1,21 @@ +require 'wechat/token/access_token_base' + +module Wechat + module Token + class AuthAccessToken < AccessTokenBase + + # def refresh + # params = { + # appid: access_token.appid, + # grant_type: 'refresh_token', + # refresh_token: user_refresh_token + # } + # data = client.get 'oauth2/refresh_token', params: params, base: OAUTH2_BASE + # write_token_to_file(data) + # read_token_from_file + # end + + end + end +end + diff --git a/public/assets/wechat/activities.html b/public/assets/wechat/activities.html index fbdfb1152..a4aa9a4c7 100644 --- a/public/assets/wechat/activities.html +++ b/public/assets/wechat/activities.html @@ -26,8 +26,7 @@