#coding=utf-8 module Mobile module Apis class Courses < Grape::API resource :courses do def self.get_service CoursesService.new end desc "获取所有课程" params do optional :school_id, type: Integer, desc: '传入学校id,返回该学校课程列表' requires :per_page_count, type: Integer, desc: '每页总数' requires :page, type: Integer, desc: '当前页码' optional :token, type: String end get do authenticate! cs = CoursesService.new courses = cs.user_courses_list(current_user) present :data, courses, with: Mobile::Entities::Course,user: current_user present :status, 0 end desc "新建课程" #current_user当前用户对象(不是id) # params[:course][:name]:课程名称 #params[:course][:password]:密码 #params[:course][:description]:描述 #params[:course][:is_public]:是否公开1公开,0私有 #params[:course][:open_student]:是否公开学生列表1公开,0不公开,不公开时非课程成员无法看到学生列表 #params[:course][:course_type]:暂时默认给1值。 #params[:term]:学期(秋季学期或春季学期) #params[:time]: 年份(例:2014) #params[:setup_time]:暂不传(貌似已经没用了) #params[:endup_time]: 暂不传(貌似已经没用了) #params[:class_period]:学时总数 params do requires :token, type: String requires :name, type: String, desc: '课程名称' requires :password, type: String, desc: '密码' requires :description, type: String, desc: '描述' requires :is_public, type: Integer, desc: '是否公开 1公开 0私有' requires :open_student, type: Integer, desc: '是否公开学生列表1公开,0不公开,不公开时非课程成员无法看到学生列表' requires :course_type, type:Integer, desc: '暂时传1' requires :term, type: String, desc: '学期(秋季学期或春季学期)' requires :time, type: String, desc: '年份' requires :class_period, type: String, desc: '学时总数' end post do authenticate! cs = CoursesService.new cs_params = { course: params.reject{|k,v| [:term,:time,:class_period].include?(k)}, term: params[:term], time: params[:time], class_period: params[:class_period] } courses = cs.create_course(cs_params, current_user) present :data, courses, with: Mobile::Entities::Course,user: current_user present :status, 0 end desc "编辑课程" params do requires :token, type: String requires :course_id, type: Integer, desc: '课程id' requires :name, type: String, desc: '课程名称' requires :password, type: String, desc: '密码' requires :description, type: String, desc: '描述' requires :is_public, type: Integer, desc: '是否公开 1公开 0私有' requires :open_student, type: Integer, desc: '是否公开学生列表1公开,0不公开,不公开时非课程成员无法看到学生列表' requires :course_type, type:Integer, desc: '暂时传1' requires :term, type: String, desc: '学期(秋季学期或春季学期)' requires :time, type: String, desc: '年份' requires :class_period, type: String, desc: '学时总数' end put do authenticate! cs = CoursesService.new cs_params = { course: params.reject{|k,v| [:term,:time,:class_period].include?(k)}, term: params[:term], time: params[:time], class_period: params[:class_period] } course = ::Course.find(params[:course_id]) # 如果没有传密码过来,那就把原来的密码给上,不然会不更新 if params[:password].nil? || params[:password].blank? cs_params[:course][:password] = course[:password] end cs.edit_course_authorize(current_user,course) course = cs.edit_course(cs_params, course,current_user) present :data, course, with: Mobile::Entities::Course,user: current_user present :status, 0 end post do end desc "加入课程" params do requires :token, type: String requires :invite_code, type: String, desc: '邀请码' requires :teacher_flag, type: Boolean requires :assistant_flag, type: Boolean requires :student_flag, type: Boolean end post "join_class" do authenticate! roles_ids = [] if params[:teacher_flag] roles_ids << "9" elsif params[:assistant_flag] roles_ids << "7" end if params[:student_flag] roles_ids << "10" end go_course_group = 0 if roles_ids.length <= 0 {status:-1,message:"请至少选择一个角色"} else cs = CoursesService.new status = cs.join_course_roles({role: roles_ids, openid: params[:openid], invite_code: params[:invite_code]}, current_user) { status: status[:state], message:CoursesService::JoinCourseError.message(status[:state]), go_coursegroup_flag:status[:go_coursegroup_flag], course_id:status[:course_id] } end end desc "退出课程" params do requires :token, type: String end delete ":id" do authenticate! cs = CoursesService.new status = cs.exit_course({:object_id => params[:id]}, current_user) out = {status: status} message = case status when 0; "退出成功" when 1; "您不在课程中" when 2; "您还未登录" else; "未知错误,请稍后再试" end out.merge(message: message) end desc "搜索课程" params do requires :name, type: String, desc: "课程名" optional :token, type: String end get 'search' do cs = CoursesService.new courses = cs.search_course(params,current_user.nil? ? User.find(2):current_user) present :data, courses, with: Mobile::Entities::Course,user: current_user present :status, 0 end desc "课程老师列表" params do requires :token, type: String 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 desc "课程学生列表" params do requires :token, type: String requires :course_id, type: Integer, desc: "课程id" end get 'students' do cs = CoursesService.new students = cs.course_teacher_or_student_list({role: '2'}, params[:course_id],current_user) present :data, students, with: Mobile::Entities::User present :status, 0 end desc "课程未审核列表" params do requires :token, type: String requires :course_id, type: Integer, desc: "课程id" end get 'reviewers' do authenticate! cs = CoursesService.new reviewers = cs.reviewers_list(params[:course_id]) present :data, reviewers, with: Mobile::Entities::User present :status, 0 end desc "课程单个未审核用户信息" params do requires :token, type: String requires :course_id, type: Integer, desc: "课程id" requires :user_id, type: Integer, desc: "用户id" end post 'review_member_info' do authenticate! cs = CoursesService.new result = cs.get_reviewer_info(params) present :data, result[:reviewer], with: Mobile::Entities::User present :status,result[:status] end desc "处理教师或助教的身份申请" params do requires :token, type: String requires :course_id, type: Integer, desc: "课程id" requires :user_id, type: Integer, desc: "用户id" requires :type, type: Integer, desc: "同意或拒绝" end post 'deal_join_apply' do authenticate! cs = CoursesService.new result = cs.deal_join_apply(params,current_user) present :status, result[:status] present :message, result[:message] end desc "设置助教" params do requires :token,type:String requires :user_id,type:Integer,desc: '用户id' requires :course_id,type:Integer,desc:'课程id' end get 'set_user_as_assitant' do cs = CoursesService.new cs.set_as_assitant_teacher params present :status, 0 end desc "删除助教" params do requires :token,type:String requires :user_id,type:Integer,desc: '用户id' requires :course_id,type:Integer,desc:'课程id' end get 'del_user_as_assitant' do cs = CoursesService.new cs.del_assitant_teacher params present :status, 0 end desc "返回单个课程" params do requires :id, type: Integer requires :token,type:String end route_param :id do get do # course = Course.find(params[:id]) cs = CoursesService.new course = cs.show_course(params,current_user) if course[:course][:is_delete] == 1 {status:-1, message: '该班级不存在或已被删除啦' } else present :data, course, with: Mobile::Entities::Course,user: current_user present :status, 0 end end end desc "获取课程动态" params do requires :id, type: Integer requires :token, type: String end post 'activities' do authenticate! user = current_user course_types = "('Message','News','HomeworkCommon','Poll','Course')" activities = UserActivity.where("(container_type = 'Course' and container_id = #{params[:id]} and act_type in #{course_types})").order('updated_at desc') page = params[:page] ? params[:page] : 0 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 end desc "课程作业列表" params do requires :token, type: String end get "homeworks/:id" do cs = CoursesService.new homeworks = cs.homework_list params,current_user present :data, homeworks, with: Mobile::Entities::Homework,user: current_user present :status, 0 end desc "课程通知列表" params do optional :token, type: String end get ":course_id/news" do cs = CoursesService.new news = cs.course_news_list params,current_user.nil? ? User.find(2):current_user present :data, news, with: Mobile::Entities::News present :status, 0 end desc "显示课程通知" params do optional :token, type: String end get "news/:id" do cs = CoursesService.new cs.show_course_news_authorize(current_user.nil? ? User.find(2):current_user) news = cs.show_course_news params,current_user.nil? ? User.find(2):current_user present :data, news, with: Mobile::Entities::News present :status, 0 end desc '用户课程动态' params do requires :token, type: String end get "course_dynamic/:id" do cs = CoursesService.new count = cs.all_course_dynamics(params,current_user) present :data, count, with: Mobile::Entities::CourseDynamic present :status, 0 end desc '课程课件' params do requires :token, type: String requires :course_id,type: Integer,desc: '课程id' optional :name,type:String,desc:'课件名称可能包含的字符' end post ":course_id/attachments" do cs = CoursesService.new count = cs.course_attachments params present :data, count, with: Mobile::Entities::Attachment,user: current_user present :status, 0 end desc '课程学生' params do requires :token,type:String requires :course_id,type:Integer,desc: '课程id' optional :name,type:String,desc:'学生的姓名或者登录名或者学号可能包含的字符' end get ":course_id/members" do cs = CoursesService.new count = cs.course_members params # 我如果在学生当中,那么我将放在第一位 count.each do |m| if m.user.id == current_user.id count.delete m count.unshift m end end present :data, count, with: Mobile::Entities::Member present :status, 0 end desc '查看用户历次作业成绩' params do requires :token,type:String requires :member_id,type:Integer,desc:'课程member_id' optional :homeworkName,type:String,desc:'作业名称以及作业名称可能包含的字符' end get '/show_member_score/:member_id' do cs = CoursesService.new homeworkscore = cs.show_member_score params present :data,homeworkscore,with: Mobile::Entities::Homeworkscore present :status,0 end desc '发布课程通知' params do requires :token,type:String requires :course_id,type:Integer,desc:'课程id' requires :title,type:String,desc:'通知标题' requires :desc,type:String,desc:'通知描述' end post ':course_id/create_course_notice' do cs = CoursesService.new news = cs.create_course_notice params,current_user present :data,news,with:Mobile::Entities::News present :status,0 end desc '总成绩 or 活跃度列表' params do requires :token,type:String requires :course_id,type:Integer,desc:'课程id' optional :page,type:Integer,desc:'页码' optional :type,type:Integer,desc:'0是活跃度,1是成绩' end get ':course_id/students_score_list' do cs = CoursesService.new news = cs.students_score_list params,current_user present :data,news[:user_list],with:Mobile::Entities::User present :maxSize,news[:max_size] present :status,0 end desc '课程某次作业提交列表 并显示成绩' params do requires :token,type:String requires :course_id,type:Integer,desc:'课程id' requires :homework_id,type:Integer,desc:'作业id' optional :page,type:Integer,desc:'页码' end get ':course_id/student_works_list' do cs = CoursesService.new student_works = cs.student_work_list params,current_user present :data,student_works,with:Mobile::Entities::StudentWork present :status,0 end desc '讨论区信息' params do requires :token,type:String requires :course_id,type:Integer,desc:'课程id' optional :page,type:Integer,desc:'页码' end get ':course_id/board_message_list' do cs = CoursesService.new board_messages_list = cs.board_message_list params,current_user present :data,board_messages_list.all,with:Mobile::Entities::Message present :status,0 end desc '讨论区某主题的回复列表' params do requires :token,type:String requires :board_id,type:Integer,desc:'讨论区id' requires :msg_id,type:Integer,desc:'讨论主题id' optional :page,type:Integer,desc:'页码' end get ':board_id/board_message_reply_list' do cs = Courses.get_service board_messages_list = cs.board_message_reply_list params,current_user present :data,board_messages_list.all,with:Mobile::Entities::Message present :status,0 end desc '讨论区回复' params do requires :token,type:String requires :board_id,type:Integer,desc:'讨论区id' requires :parent_id,type:Integer,desc:'本回复父id' requires :subject,type:String,desc:'本回复主题' requires :content,type:String,desc:'本回复内容' requires :root_id,type:Integer,desc:'本回复根id' requires :quote,type:String,desc:'本回复引用内容' end post ':board_id/board_message_reply' do cs = Courses.get_service board_messages = cs.board_message_reply params,current_user present :data,board_messages,with:Mobile::Entities::Message present :status,0 end desc '获取测验列表' params do requires :token, type:String end get ':course_id/exercises' do authenticate! course = Course.find(params[:course_id]) exercises = course.exercises.where("exercise_status <> 1").reorder("created_at desc") present :data,exercises,with:Mobile::Entities::Exercise,user: current_user present :status,0 end desc '删除课程' params do requires :token, type: String end post ':course_id/del' do authenticate! c = Course.find(params[:course_id]) # if c.members.count > 1 # {status: -1, message: '已经有成员加入,不能删除'} # else c.delete! present :status,0 # end end desc "获取班级某成员角色信息" params do requires :id, type: Integer requires :token, type: String requires :user_id, type: Integer end post 'get_member_info' do authenticate! c = Course.find("#{params[:id]}") my_member = c.member_principals.where("users.id=#{params[:user_id]}").first if my_member && my_member.roles[0] present :course_id,params[:id] present :user_id,params[:user_id] present :member_info,my_member, with: Mobile::Entities::ProjectMember present :course_group_id,my_member.course_group_id present :status, 0 else present :status, -1 present :message, "该用户已不在班级中" end end desc "修改班级某成员角色信息" params do requires :id, type: Integer requires :token, type: String requires :user_id, type: Integer requires :teacher_flag, type: Boolean requires :assistant_flag, type: Boolean requires :student_flag, type: Boolean end post 'edit_member_role' do authenticate! roles_id = [] if params[:teacher_flag] roles_id << 9 elsif params[:assistant_flag] roles_id << 7 end if params[:student_flag] roles_id << 10 end c = Course.find("#{params[:id]}") my_member = c.member_principals.where("users.id=#{current_user.id}").first rolesids = [] my_member.roles.each do |role| rolesids << role.id end #7教辅 9教师 10学生 if c.tea_id == params[:user_id] || roles_id.length <= 0 present :status, -1 present :message,"修改失败" elsif rolesids.include?(3) || rolesids.include?(7) || rolesids.include?(9) cs = CoursesService.new status = cs.modify_user_course_role params,roles_id present :status, status else present :status, -1 present :message,"修改失败" end end desc "发布班级通知" params do requires :id, type: Integer requires :token, type: String requires :text, type: String requires :title, type: String end post ':id/publishnotice' do authenticate! #老师或教辅才能发通知 c = Course.find("#{params[:id]}") my_member = c.member_principals.where("users.id=#{current_user.id}").first roles_ids = [] my_member.roles.each do |role| roles_ids << role.id end if my_member && (roles_ids.include?(7)|| roles_ids.include?(9) || roles_ids.include?(3)) tmpparams = {} tmpparams['title'] = params[:title] tmpparams['description'] = params[:text] tmpparams['sticky'] = 0 news = News.new(:course => c, :author => current_user) #render :layout => 'base_courses' news.safe_attributes = tmpparams news.save! present :status, 0 else present :status, -1 present :message,"学生不能发布通知" end end desc "发布班级问题" params do requires :id, type: Integer requires :token, type: String requires :text, type: String end post ':id/publishissue' do authenticate! c = Course.find("#{params[:id]}") boards = c.boards.includes(:last_message => :author).all if c.boards.empty? board = c.boards.build board.name = "班级问答区" board.description = c.name.to_s board.project_id = -1 if board.save boards = c.boards.includes(:last_message => :author).all end end board = boards.first message = Message.new message.author = current_user message.board = board tmpparams = {} tmpparams['subject'] = params[:title] tmpparams['content'] = params[:text] message.safe_attributes = tmpparams message.save! present :status, 0 end desc "删除班级成员" params do requires :id, type: Integer requires :token, type: String requires :user_id, type: Integer end post ':id/deletemember' do authenticate! status = -1 if(current_user.id != params[:user_id].to_i) #权限 c = Course.find("#{params[:id]}") if c.tea_id != params[:user_id].to_i my_member = c.member_principals.where("users.id=#{current_user.id}").first roles_ids = [] my_member.roles.each do |role| roles_ids << role.id end if my_member && (roles_ids.include?(3) || roles_ids.include?(7) || roles_ids.include?(9) ) #删除该成员 cs = CoursesService.new status = cs.delete_course_member(c,params[:user_id].to_i,current_user) else status = -2 end else status = -3 end else status = -4 end out = {status: status} message = case status when 0; "删除成功" when -1; "您还未登录" when -2; "对不起您没有权限" when -3; "不能删除班级管理员" when -4; "不能删除自己" when 1; "该用户不在该班级中" else; "未知错误,请稍后再试" end out.merge(message: message) end desc "退出班级" params do requires :id, type: Integer requires :token, type: String end post ':id/quit' do authenticate! #管理员不能退 cs = CoursesService.new c = Course.find("#{params[:id]}") user = current_user if c.tea_id != user.id status = cs.exit_course({:object_id => params[:id]}, user) else status = 3 end out = {status: status} message = case status when 0; "退出班级成功" when 1; "您不是该班级成员" when 2; "您还未登录" when 3; "管理员不能退出班级" else; "未知错误,请稍后再试" end out.merge(message: message) end desc '获取分班列表' params do requires :id, type: Integer requires :token, type:String end get 'course_groups/:id' do begin authenticate! course = Course.find(params[:id]) groups = [] groups = course.course_groups if course.course_groups present :data,groups present :status,0 rescue present :status,-1 end end desc "加入分班" params do requires :id, type: Integer requires :token, type: String requires :course_group_id, type: Integer end post 'user_join_coursegroup' do begin authenticate! member = Member.where(:course_id => params[:id], :user_id => current_user.id).first raise "你还不是该班级的学生!" unless member member.course_group_id = params[:course_group_id].to_i member.save present :status,0 rescue Exception=>e present :message,e.message present :status,-1 end end desc "修改分班" params do requires :id, type: Integer requires :token, type: String requires :course_group_id, type: Integer requires :user_id, type: Integer end post 'user_edit_coursegroup' do begin authenticate! member = Member.where(:course_id => params[:id], :user_id => params[:user_id]).first raise "不是该班级的学生!" unless member member.course_group_id = params[:course_group_id].to_i member.save present :status,0 rescue Exception=>e present :message,e.message present :status,-1 end end desc '获取分班列表带上学生' params do requires :id, type: Integer requires :token, type:String end get 'course_groups_withstudent/:id' do begin authenticate! course = Course.find(params[:id]) groups = [] groups = course.course_groups if course.course_groups present :data,groups, with: Mobile::Entities::CourseGroup present :status,0 rescue present :status,-1 end end desc "删除分班" params do requires :id, type: Integer requires :token, type: String requires :course_group_id, type: Integer end post 'delete_coursegroup' do begin authenticate! c = Course.find("#{params[:id]}") my_member = c.member_principals.where("users.id=#{current_user.id}").first roles_ids = [] my_member.roles.each do |role| roles_ids << role.id end if my_member && (roles_ids.include?(3) || roles_ids.include?(7) || roles_ids.include?(9) ) else raise "您没有该权限!" end CourseGroup.delete(params[:course_group_id]) present :status,0 rescue Exception=>e present :message,e.message present :status,-1 end end desc "编辑分班" params do requires :id, type: Integer requires :token, type: String end post 'edit_coursegroup' do begin authenticate! c = Course.find("#{params[:id]}") my_member = c.member_principals.where("users.id=#{current_user.id}").first roles_ids = [] my_member.roles.each do |role| roles_ids << role.id end if my_member && (roles_ids.include?(3) || roles_ids.include?(7) || roles_ids.include?(9) ) else raise "您没有该权限!" end #增加分班和修改分班名 modify_groups = params[:modify_groups] modify_groups.each do |g| group = CourseGroup.find(g.id) group.name = g.id.to_s + Time.now.to_i.to_s #只能先另取个名了不然原有的两个互换的话修改不了 group.save end modify_groups.each do |g| group = CourseGroup.find(g.id) group.name = g.name group.save end #增加分班和修改分班名 add_groups = params[:add_groups] add_groups.each do |name| group = CourseGroup.new group.name = name group.course_id = params[:id] group.save end present :status,0 rescue Exception=>e present :message,e.message present :status,-1 end end end end end end