mirror of
https://gitlink.org.cn/Gitlink/forgeplus.git
synced 2026-05-03 03:40:49 +08:00
init project
This commit is contained in:
37
app/controllers/weapps/base_controller.rb
Normal file
37
app/controllers/weapps/base_controller.rb
Normal file
@@ -0,0 +1,37 @@
|
||||
class Weapps::BaseController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def require_wechat_login!
|
||||
Rails.logger.info("[Weapp] unionid: #{session_unionid}, openid: #{session_openid}")
|
||||
return if session_unionid.present?
|
||||
|
||||
render_error('请先进行微信授权')
|
||||
end
|
||||
|
||||
def weapp_session_key
|
||||
Wechat::Weapp.session_key(session_openid)
|
||||
end
|
||||
|
||||
def set_weapp_session_key(session_key)
|
||||
Wechat::Weapp.write_session_key(session_openid, session_key)
|
||||
end
|
||||
|
||||
def session_openid
|
||||
session[:openid]
|
||||
end
|
||||
|
||||
def set_session_openid(openid)
|
||||
Rails.logger.info("[Weapp] set session openid: #{openid}")
|
||||
session[:openid] = openid
|
||||
end
|
||||
|
||||
def session_unionid
|
||||
session[:unionid]
|
||||
end
|
||||
|
||||
def set_session_unionid(unionid)
|
||||
Rails.logger.info("[Weapp] set session unionid: #{unionid}")
|
||||
session[:unionid] = unionid
|
||||
end
|
||||
end
|
||||
26
app/controllers/weapps/challenges_controller.rb
Normal file
26
app/controllers/weapps/challenges_controller.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
class Weapps::ChallengesController < Weapps::BaseController
|
||||
before_action :require_login
|
||||
before_action :set_challenge
|
||||
|
||||
def is_play
|
||||
# 关卡有展示效果 || 选择题 || jupyter实训 || vnc || 隐藏代码窗口 || html+css实训
|
||||
# @challenge.show_type != -1 || @challenge.st == 1 || @shixun.is_jupyter? || @shixun.vnc ||
|
||||
# @shixun.hide_code? || (@shixun.small_mirror_name & ["Css", "Html", "Web"]).present?
|
||||
play = @shixun.is_jupyter? || @shixun.vnc ||
|
||||
@shixun.hide_code? || (@shixun.small_mirror_name & ["Css", "Html", "Web"]).present?
|
||||
|
||||
if play
|
||||
normal_status(-5, "该关卡暂不支持小程序")
|
||||
else
|
||||
render_ok
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
def set_challenge
|
||||
@challenge = Challenge.find_by!(id: params[:id])
|
||||
@shixun = @challenge.shixun
|
||||
end
|
||||
|
||||
end
|
||||
38
app/controllers/weapps/check_accounts_controller.rb
Normal file
38
app/controllers/weapps/check_accounts_controller.rb
Normal file
@@ -0,0 +1,38 @@
|
||||
class Weapps::CheckAccountsController < Weapps::BaseController
|
||||
def create
|
||||
params[:type] == 'register' ? check_can_register : check_can_bind
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def check_can_bind
|
||||
if params[:login] =~ /^[a-zA-Z0-9]+([._\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
|
||||
user = User.find_by(mail: params[:login])
|
||||
return render_error('该邮箱尚未注册') if user.blank?
|
||||
elsif params[:login] =~ /^1\d{10}$/
|
||||
user = User.find_by(phone: params[:login])
|
||||
return render_error('该手机号尚未注册') if user.blank?
|
||||
else
|
||||
user = User.find_by(login: params[:login])
|
||||
return render_error('该账号尚未注册') if user.blank?
|
||||
end
|
||||
|
||||
return render_error('该账号已经绑定') if user.wechat_open_user.present?
|
||||
|
||||
render_ok
|
||||
end
|
||||
|
||||
def check_can_register
|
||||
if params[:login] =~ /^[a-zA-Z0-9]+([._\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
|
||||
user = User.find_by(mail: params[:login])
|
||||
return render_error('该邮箱已注册') if user.present?
|
||||
elsif params[:login] =~ /^1\d{10}$/
|
||||
user = User.find_by(phone: params[:login])
|
||||
return render_error('该手机号已注册') if user.present?
|
||||
else
|
||||
return render_error('请输入正确的邮箱或手机号')
|
||||
end
|
||||
|
||||
render_ok
|
||||
end
|
||||
end
|
||||
45
app/controllers/weapps/code_sessions_controller.rb
Normal file
45
app/controllers/weapps/code_sessions_controller.rb
Normal file
@@ -0,0 +1,45 @@
|
||||
class Weapps::CodeSessionsController < Weapps::BaseController
|
||||
def create
|
||||
return render_error('code不能为空') if params[:code].blank?
|
||||
|
||||
reset_session
|
||||
logged = false
|
||||
|
||||
result = Wechat::Weapp.jscode2session(params[:code])
|
||||
Rails.logger.info("###########result: #{result}")
|
||||
Rails.logger.info("###########result: #{result['session_key']}")
|
||||
Rails.logger.info("###########result: #{result['unionid']}")
|
||||
# 能根据 code 拿到 unionid
|
||||
open_user = OpenUsers::Wechat.find_by(uid: result['unionid'])
|
||||
if open_user.present? && open_user.user
|
||||
successful_authentication(open_user.user)
|
||||
set_session_unionid(result['unionid'])
|
||||
logged = true
|
||||
else
|
||||
# 根据 code没拿到 unionid
|
||||
Rails.logger.info("[Weapp] session_key: #{result['session_key']}")
|
||||
Rails.logger.info("[Weapp] code: #{params[:code]}")
|
||||
user_info = Wechat::Weapp.decrypt(result['session_key'], params[:encrypted_data], params[:iv])
|
||||
|
||||
# user_info.delete(:nickName)
|
||||
|
||||
# 老用户,已绑定
|
||||
open_user = OpenUsers::Wechat.find_by(uid: user_info['unionId'])
|
||||
if open_user.present? && open_user.user
|
||||
successful_authentication(open_user.user)
|
||||
logged = true
|
||||
end
|
||||
|
||||
set_session_unionid(user_info['unionId'])
|
||||
# user_info['nickname'] = user_info['nickName']
|
||||
session[:wechat_user_extra] = user_info
|
||||
end
|
||||
|
||||
set_session_openid(result['openid'])
|
||||
set_weapp_session_key(result['session_key']) # weapp session_key写入缓存 后续解密需要
|
||||
|
||||
render_ok(openid: result['openid'], logged: logged) unless logged
|
||||
rescue Wechat::Error => ex
|
||||
render_error(ex.message)
|
||||
end
|
||||
end
|
||||
29
app/controllers/weapps/course_stickies_controller.rb
Normal file
29
app/controllers/weapps/course_stickies_controller.rb
Normal file
@@ -0,0 +1,29 @@
|
||||
class Weapps::CourseStickiesController < Weapps::BaseController
|
||||
# before_action :require_wechat_login!
|
||||
|
||||
def create
|
||||
courses = params[:category] == "study" ? current_user.as_student_courses.started : current_user.manage_courses
|
||||
courses = courses.order("course_members.sticky=1 desc, course_members.sticky_time desc, courses.created_at desc").first
|
||||
|
||||
return render_error("该课堂已置顶,请勿重复操作") if course_member.sticky && courses&.id.to_i == current_course.id
|
||||
course_member.update!(sticky: 1, sticky_time: Time.now)
|
||||
render_ok
|
||||
end
|
||||
|
||||
def cancel_sticky
|
||||
return render_error("该课堂未置顶,无法取消") unless course_member.sticky
|
||||
course_member.update!(sticky: 0, sticky_time: nil)
|
||||
render_ok
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def current_course
|
||||
@_current_course = Course.find params[:course_id]
|
||||
end
|
||||
|
||||
def course_member
|
||||
@_course_member = params[:category] == "study" ? current_course.students.find_by!(user_id: current_user.id) :
|
||||
current_course.teachers.find_by!(user_id: current_user.id)
|
||||
end
|
||||
end
|
||||
247
app/controllers/weapps/courses_controller.rb
Normal file
247
app/controllers/weapps/courses_controller.rb
Normal file
@@ -0,0 +1,247 @@
|
||||
class Weapps::CoursesController < Weapps::BaseController
|
||||
before_action :require_login
|
||||
before_action :set_course, except: [:create, :check_invite_code]
|
||||
before_action :user_course_identity, except: [:basic_info, :create, :check_invite_code]
|
||||
before_action :check_account, only: [:create, :check_invite_code]
|
||||
before_action :teacher_allowed, only: [:edit, :update]
|
||||
before_action :teacher_or_admin_allowed, only: [:change_member_roles, :delete_course_teachers]
|
||||
|
||||
def course_activities
|
||||
@course = current_course
|
||||
homework_commons = @course.homework_commons.where(homework_type: ["practice", "normal"]).homework_published
|
||||
member = @course.course_members.find_by(user_id: current_user.id, is_active: 1)
|
||||
if (@user_course_identity == Course::STUDENT && member.try(:course_group_id).to_i == 0) || @user_course_identity > Course::STUDENT
|
||||
homework_commons = homework_commons.unified_setting
|
||||
elsif @user_course_identity == Course::STUDENT
|
||||
not_homework_ids = @course.homework_group_settings.none_published.where("course_group_id = #{member.try(:course_group_id)}").pluck(:homework_common_id)
|
||||
homework_commons = homework_commons.where.not(id: not_homework_ids)
|
||||
end
|
||||
homework_ids = homework_commons.blank? ? "(-1)" : "(" + homework_commons.pluck(:id).join(",") + ")"
|
||||
|
||||
activities = @course.course_activities.where("course_act_type in ('Course', 'CourseMessage') or
|
||||
(course_act_type = 'HomeworkCommon' and course_act_id in #{homework_ids})").order("id desc")
|
||||
@activities = paginate activities.includes(:course_act, user: :user_extension)
|
||||
end
|
||||
|
||||
def create
|
||||
# return render_error("只有老师身份才能创建课堂") unless current_user.is_teacher?
|
||||
course = Course.new(tea_id: current_user.id)
|
||||
Weapps::CreateCourseService.call(course, course_params)
|
||||
render_ok(id: course.id)
|
||||
|
||||
rescue ApplicationService::Error => ex
|
||||
render_error(ex.message)
|
||||
end
|
||||
|
||||
def basic_info
|
||||
@course = current_course
|
||||
end
|
||||
|
||||
def edit
|
||||
@course = current_course
|
||||
end
|
||||
|
||||
def update
|
||||
course = Weapps::UpdateCourseService.call(current_course, update_course_params)
|
||||
render_ok(id: course.id)
|
||||
end
|
||||
|
||||
def show
|
||||
@course = current_course
|
||||
@current_user = current_user
|
||||
end
|
||||
|
||||
def shixun_homework_category
|
||||
@categories = current_course.shixun_course_modules.first&.course_second_categories
|
||||
end
|
||||
|
||||
def check_invite_code
|
||||
tip_exception(-1, "邀请码不能为空") if params[:invite_code].blank?
|
||||
invite_code = params[:invite_code]
|
||||
course = Course.find_by(invite_code: invite_code, is_delete: 0, invite_code_halt: 0)
|
||||
course_group = CourseGroup.find_by(invite_code: invite_code, invite_code_halt: 0)
|
||||
if course.blank?
|
||||
tip_exception(-1, "邀请码无效") if course_group.blank?
|
||||
|
||||
course = Course.find_by(id: course_group.course_id, is_delete: 0)
|
||||
tip_exception(-1, "邀请码无效") if course.blank?
|
||||
end
|
||||
|
||||
tip_exception(-1, "课堂已结束,无法加入") if course.is_end
|
||||
|
||||
render_ok
|
||||
end
|
||||
|
||||
# 教师列表
|
||||
def teachers
|
||||
@course = current_course
|
||||
@page = (params[:page] || 1).to_i
|
||||
@limit = (params[:limit] || 20).to_i
|
||||
search = params[:search].present? ? params[:search].strip : ""
|
||||
if @course.try(:id) != 1309 || current_user.admin_or_business? || current_user.try(:id) == 15582
|
||||
@teacher_list = @course.course_members.joins(:user).where("course_members.role in (1, 2, 3)")
|
||||
else
|
||||
@teacher_list = @course.course_members.joins(:user).where("(course_members.role in (1, 3) or (course_members.user_id = #{current_user.id}
|
||||
and course_members.role = 2))")
|
||||
end
|
||||
|
||||
if search.present?
|
||||
@teacher_list = @teacher_list.joins(:user).where("LOWER(CONCAT(users.lastname, users.firstname)) like ?", "%#{search}%")
|
||||
end
|
||||
|
||||
@teacher_list_size = @teacher_list.size
|
||||
|
||||
@applications_size = CourseMessage.unhandled_join_course_requests_by_course(@course).size
|
||||
|
||||
@teacher_list = @teacher_list.includes(user: [user_extension: :school])
|
||||
# 中英文混合排序(忽略大小写)
|
||||
@teacher_list = @teacher_list.sort {|x, y| Pinyin.t(x.user&.real_name, splitter: '').upcase <=> Pinyin.t(y.user&.real_name, splitter: '').upcase}
|
||||
@teacher_list = @teacher_list[(@page-1)*@limit ... @page*@limit]
|
||||
end
|
||||
|
||||
# 批量删除教师或助教
|
||||
def delete_course_teachers
|
||||
begin
|
||||
@course = current_course
|
||||
@page = (params[:page] || 1).to_i
|
||||
@limit = (params[:limit] || 20).to_i
|
||||
course_members = @course.course_members.where(id: params[:course_member_ids], role: %i[PROFESSOR ASSISTANT_PROFESSOR])
|
||||
user_ids = course_members.pluck(:user_id)
|
||||
course_members.destroy_all
|
||||
CourseDeleteStudentNotifyJob.perform_later(@course.id, user_ids, current_user.id)
|
||||
@course.students.where(user_id: user_ids).update_all(is_active: 1)
|
||||
normal_status(0, "删除成功")
|
||||
rescue => e
|
||||
uid_logger_error(e.message)
|
||||
tip_exception("删除失败")
|
||||
end
|
||||
end
|
||||
|
||||
def students
|
||||
@course = current_course
|
||||
@page = (params[:page] || 1).to_i
|
||||
@limit = (params[:limit] || 20).to_i
|
||||
search = params[:search].present? ? params[:search].strip : nil
|
||||
course_group_id = params[:course_group_id].present? ? params[:course_group_id].to_i : nil
|
||||
|
||||
@students = CourseMember.students(@course)
|
||||
|
||||
if search.present?
|
||||
@students = @students.joins(user: :user_extension).where("LOWER(CONCAT(users.lastname, users.firstname)) like ? or
|
||||
user_extensions.student_id like ?", "%#{search}%", "%#{search}%")
|
||||
end
|
||||
|
||||
if course_group_id.present?
|
||||
@course_group = CourseGroup.find(course_group_id) if course_group_id != 0
|
||||
@students = @students.where(course_group_id: @course_group&.id.to_i)
|
||||
end
|
||||
|
||||
@students_count = @students.size
|
||||
@students = @students.includes(user: :user_extension)
|
||||
# 中英文混合排序(忽略大小写)
|
||||
@students = @students.sort {|x, y| Pinyin.t(x.user&.real_name, splitter: '').upcase <=> Pinyin.t(y.user&.real_name, splitter: '').upcase}
|
||||
@students = @students[(@page-1)*@limit ... @page*@limit]
|
||||
end
|
||||
|
||||
# 批量修改角色
|
||||
def change_member_roles
|
||||
@course = current_course
|
||||
tip_exception("请至少选择一个角色") if params[:roles].reject(&:blank?).blank?
|
||||
tip_exception("教师、助教角色只能二选一") if params[:roles].include?("PROFESSOR") && params[:roles].include?("ASSISTANT_PROFESSOR")
|
||||
|
||||
params[:user_ids].each do |user_id|
|
||||
course_members = @course.course_members.where(user_id: user_id)
|
||||
tip_exception("非课堂成员不能修改角色") if course_members.blank?
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
# 第一次修改为教师或助教身份时直接创建数据
|
||||
if params[:roles].include?("CREATOR")
|
||||
teacher_member = course_members.where(role: %i[CREATOR]).take
|
||||
elsif (params[:roles].include?("PROFESSOR") || params[:roles].include?("ASSISTANT_PROFESSOR")) && !course_members.exists?(role: %i[CREATOR PROFESSOR ASSISTANT_PROFESSOR])
|
||||
teacher_member = CourseMember.create!(course_id: @course.id, user_id: user_id, role: params[:roles].include?("PROFESSOR") ? 2 : 3)
|
||||
# 如果有未审批的申请教师/助教的记录,则修改状态为已审批
|
||||
apply_teacher = CourseMessage.where(course_id: @course.id, course_message_id: user_id, status: 0).last
|
||||
apply_teacher.update!(status: 1, apply_user_id: current_user.id) if apply_teacher
|
||||
elsif course_members.exists?(role: %i[PROFESSOR ASSISTANT_PROFESSOR])
|
||||
teacher_member = course_members.where(role: %i[PROFESSOR ASSISTANT_PROFESSOR]).take
|
||||
if params[:roles].include?("PROFESSOR") || params[:roles].include?("ASSISTANT_PROFESSOR")
|
||||
# 如果之前有老师身份且老师身份要调整时,只需要修改role字段
|
||||
if !params[:roles].include?(teacher_member.role) && params[:roles].include?("PROFESSOR")
|
||||
teacher_member.PROFESSOR!
|
||||
elsif !params[:roles].include?(teacher_member.role) && params[:roles].include?("ASSISTANT_PROFESSOR")
|
||||
teacher_member.ASSISTANT_PROFESSOR!
|
||||
end
|
||||
teacher_member.save!
|
||||
else
|
||||
# 不含教师的参数时删除记录
|
||||
teacher_member.destroy!
|
||||
# CourseDeleteStudentNotifyJob.perform_later(@course.id, [teacher_member.user_id], current_user.id)
|
||||
end
|
||||
end
|
||||
|
||||
# 学生身份的处理
|
||||
student_member = course_members.where(role: %i[STUDENT]).take
|
||||
|
||||
# 不存在则创建学生身份
|
||||
if params[:roles].include?("STUDENT") && student_member.blank?
|
||||
correspond_teacher_exist = CourseMember.exists?(user_id: user_id, is_active: 1, course_id: @course.id, role: %i[CREATOR PROFESSOR ASSISTANT_PROFESSOR])
|
||||
new_student = CourseMember.new(user_id: user_id, course_id: @course.id, role: 4)
|
||||
new_student.is_active = 0 if correspond_teacher_exist
|
||||
new_student.save!
|
||||
|
||||
CourseAddStudentCreateWorksJob.perform_later(@course.id, [user_id])
|
||||
# StudentJoinCourseNotifyJob.perform_later(current_user.id, course.id)
|
||||
elsif !params[:roles].include?("STUDENT") && student_member.present?
|
||||
# 删除学生身份时激活老师身份
|
||||
teacher_member.update_attributes!(is_active: 1) if student_member.is_active && teacher_member.present?
|
||||
student_member.destroy!
|
||||
CourseDeleteStudentDeleteWorksJob.perform_later(@course.id, [user_id])
|
||||
# CourseDeleteStudentNotifyJob.perform_later(@course.id, [params[:user_id]], current_user.id)
|
||||
elsif params[:roles].include?("STUDENT") && student_member.present? && !params[:roles].include?("PROFESSOR") && !params[:roles].include?("ASSISTANT_PROFESSOR")
|
||||
# 学生身份存在且学生没有教师身份时更新is_active
|
||||
student_member.update_attributes!(is_active: 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
normal_status(0, "修改成功")
|
||||
end
|
||||
|
||||
# 分班列表
|
||||
def course_groups
|
||||
@course_groups = @course.course_groups
|
||||
@course_groups = @course_groups.where("name like ?", "%#{params[:search]}%") unless params[:search].blank?
|
||||
@all_group_count = @course_groups.size
|
||||
@teachers = @course.teachers.includes(:user, :teacher_course_groups) if @user_course_identity < Course::NORMAL
|
||||
@current_group_id = @course.students.where(user_id: current_user.id).take&.course_group_id if @user_course_identity == Course::STUDENT
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def course_params
|
||||
params.permit(:name, :course_list_name, :credit, :end_date, course_module_types: [])
|
||||
end
|
||||
|
||||
def update_course_params
|
||||
params.permit(:name, :course_list_name, :credit, :end_date)
|
||||
end
|
||||
|
||||
def current_course
|
||||
@_current_course = Course.find params[:id]
|
||||
end
|
||||
|
||||
def teacher_allowed
|
||||
return render_forbidden unless @user_course_identity < Course::STUDENT
|
||||
end
|
||||
|
||||
# 课堂教师,课堂管理员以及超级管理员的权限判断
|
||||
def teacher_or_admin_allowed
|
||||
unless @user_course_identity < Course::ASSISTANT_PROFESSOR
|
||||
tip_exception(403, "..")
|
||||
end
|
||||
end
|
||||
|
||||
def set_course
|
||||
@course = Course.find_by!(id: params[:id])
|
||||
tip_exception(404, "") if @course.is_delete == 1 && !current_user.admin_or_business?
|
||||
end
|
||||
end
|
||||
25
app/controllers/weapps/homes_controller.rb
Normal file
25
app/controllers/weapps/homes_controller.rb
Normal file
@@ -0,0 +1,25 @@
|
||||
class Weapps::HomesController < Weapps::BaseController
|
||||
before_action :require_login
|
||||
|
||||
def show
|
||||
# banner
|
||||
@carousels = WeappSettings::Carousel.only_online
|
||||
# 广告
|
||||
@advert = WeappSettings::Advert.only_online.first
|
||||
|
||||
# 我的课堂
|
||||
@category = params[:category] && ["manage", "study"].include?(params[:category]) ? params[:category] : (current_user.is_teacher? ? "manage" : "study")
|
||||
@courses = case @category
|
||||
when 'study' then
|
||||
current_user.as_student_courses.started
|
||||
when 'manage' then
|
||||
current_user.manage_courses
|
||||
end
|
||||
@courses = @courses.not_deleted.not_excellent
|
||||
@courses = @courses.where(id: current_laboratory.all_courses)
|
||||
@course_count = @courses.count
|
||||
order_str = "course_members.sticky=1 desc, course_members.sticky_time desc, courses.created_at desc"
|
||||
@courses = paginate(@courses.order(order_str).includes(:teacher, :school))
|
||||
@user = current_user
|
||||
end
|
||||
end
|
||||
38
app/controllers/weapps/homework_commons_controller.rb
Normal file
38
app/controllers/weapps/homework_commons_controller.rb
Normal file
@@ -0,0 +1,38 @@
|
||||
class Weapps::HomeworkCommonsController < Weapps::BaseController
|
||||
before_action :require_login
|
||||
before_action :find_homework, :user_course_identity
|
||||
before_action :teacher_allowed
|
||||
|
||||
def update_settings
|
||||
begin
|
||||
# 课堂结束后不能再更新
|
||||
unless @course.is_end
|
||||
UpdateHomeworkPublishSettingService.call(@homework, publish_params)
|
||||
render_ok
|
||||
else
|
||||
tip_exception("课堂已结束不能再更新")
|
||||
end
|
||||
rescue Exception => e
|
||||
uid_logger(e.backtrace)
|
||||
tip_exception(e.message)
|
||||
raise ActiveRecord::Rollback
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def teacher_allowed
|
||||
return render_forbidden unless @user_course_identity < Course::STUDENT
|
||||
end
|
||||
|
||||
def find_homework
|
||||
@homework = HomeworkCommon.find_by!(id: params[:id])
|
||||
@course = @homework.course
|
||||
@homework_detail_manual = @homework.homework_detail_manual
|
||||
end
|
||||
|
||||
def publish_params
|
||||
params.permit(:unified_setting, :publish_time, :end_time, group_settings: [:publish_time, :end_time, group_id: []])
|
||||
end
|
||||
|
||||
end
|
||||
64
app/controllers/weapps/registers_controller.rb
Normal file
64
app/controllers/weapps/registers_controller.rb
Normal file
@@ -0,0 +1,64 @@
|
||||
class Weapps::RegistersController < Weapps::BaseController
|
||||
before_action :require_wechat_login!
|
||||
|
||||
def create
|
||||
# 查询验证码是否正确;type只可能是1或者8
|
||||
type = phone_mail_type(params[:login].strip)
|
||||
code = params[:code].strip
|
||||
|
||||
if type == 1
|
||||
uid_logger("start register by phone: type is #{type}")
|
||||
pre = 'p'
|
||||
email = nil
|
||||
phone = params[:login]
|
||||
verifi_code = VerificationCode.where(phone: phone, code: code, code_type: 1).last
|
||||
else
|
||||
uid_logger("start register by email: type is #{type}")
|
||||
pre = 'm'
|
||||
email = params[:login]
|
||||
phone = nil
|
||||
verifi_code = VerificationCode.where(email: email, code: code, code_type: 8).last
|
||||
end
|
||||
uid_logger("start register: verifi_code is #{verifi_code}, code is #{code}, time is #{Time.now.to_i - verifi_code.try(:created_at).to_i}")
|
||||
# check_code = (verifi_code.try(:code) == code.strip && (Time.now.to_i - verifi_code.created_at.to_i) <= 10*60)
|
||||
# todo 上线前请删除万能验证码"513231"
|
||||
unless code == "513231" && request.subdomain == "test-newweb"
|
||||
return render_error('验证码不正确') if verifi_code.try(:code) != code.strip
|
||||
return render_error('验证码已失效') if !verifi_code&.effective?
|
||||
end
|
||||
|
||||
login = User.generate_login(pre)
|
||||
@user = User.new(admin: false, login: login, mail: email, phone: phone, type: 'User')
|
||||
@user.password = params[:password]
|
||||
# 现在因为是验证码,所以在注册的时候就可以激活
|
||||
@user.activate
|
||||
# 必须要用save操作,密码的保存是在users中
|
||||
ActiveRecord::Base.transaction do
|
||||
@user.save!
|
||||
UserExtension.create!(user_id: @user.id)
|
||||
# 绑定微信号
|
||||
OpenUsers::Wechat.create!(user: @user, uid: session_unionid)
|
||||
|
||||
# 注册完成,手机号或邮箱想可以奖励500金币
|
||||
RewardGradeService.call(
|
||||
@user,
|
||||
container_id: @user.id,
|
||||
container_type: pre == 'p' ? 'Phone' : 'Mail',
|
||||
score: 500
|
||||
)
|
||||
end
|
||||
successful_authentication(@user)
|
||||
# session[:user_id] = @user.id
|
||||
session[:"#{default_yun_session}"] = @user.id
|
||||
|
||||
# render_ok(user_id: @user.id)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# 1 手机类型;0 邮箱类型
|
||||
# 注意新版的login是自动名生成的
|
||||
def phone_mail_type value
|
||||
value =~ /^1\d{10}$/ ? 1 : 0
|
||||
end
|
||||
end
|
||||
13
app/controllers/weapps/searchs_controller.rb
Normal file
13
app/controllers/weapps/searchs_controller.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
class Weapps::SearchsController < Weapps::BaseController
|
||||
after_action :record_search_keyword, only: [:index]
|
||||
|
||||
def index
|
||||
@results = Weapps::SearchQuery.call(search_params)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def search_params
|
||||
params.permit(:keyword, :type, :page, :per_page)
|
||||
end
|
||||
end
|
||||
30
app/controllers/weapps/sessions_controller.rb
Normal file
30
app/controllers/weapps/sessions_controller.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
class Weapps::SessionsController < Weapps::BaseController
|
||||
before_action :require_wechat_login!
|
||||
|
||||
def create
|
||||
return render_error('重复登录') if current_user.present? && current_user.logged?
|
||||
|
||||
user = User.try_to_login(params[:login], params[:password])
|
||||
|
||||
return render_error('错误的账号或密码') if user.blank?
|
||||
return render_error('违反平台使用规范,账号已被锁定') if user.locked?
|
||||
return render_error('错误的账号或密码') unless user.check_password?(params[:password].to_s)
|
||||
|
||||
if user.wechat_open_user && user.wechat_open_user.uid != session_unionid
|
||||
render_error('该账号已被其它微信号绑定')
|
||||
return
|
||||
end
|
||||
|
||||
# session[:wechat_user_extra].delete(:nickName)
|
||||
# 绑定微信号
|
||||
# open_user = OpenUsers::Wechat.find_by(uid: session_unionid)
|
||||
# if open_user.present? && open_user.user_id.nil?
|
||||
# open_user.update!(user_id: user.id)
|
||||
# els
|
||||
if user.wechat_open_user.blank?
|
||||
OpenUsers::Wechat.create!(user: user, uid: session_unionid)
|
||||
end
|
||||
|
||||
successful_authentication(user)
|
||||
end
|
||||
end
|
||||
14
app/controllers/weapps/shixun_lists_controller.rb
Normal file
14
app/controllers/weapps/shixun_lists_controller.rb
Normal file
@@ -0,0 +1,14 @@
|
||||
class Weapps::ShixunListsController < ApplicationController
|
||||
|
||||
def index
|
||||
results = Weapps::ShixunSearchService.call(search_params, current_laboratory)
|
||||
@total_count = results.size
|
||||
@results = paginate results
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def search_params
|
||||
params.permit(:keyword, :type, :page, :limit, :order, :status, :diff, :sort, :no_jupyter)
|
||||
end
|
||||
end
|
||||
28
app/controllers/weapps/subjects_controller.rb
Normal file
28
app/controllers/weapps/subjects_controller.rb
Normal file
@@ -0,0 +1,28 @@
|
||||
class Weapps::SubjectsController < Weapps::BaseController
|
||||
before_action :require_login, except: [:index, :show]
|
||||
before_action :find_subject, except: [:index]
|
||||
|
||||
# 首页
|
||||
def index
|
||||
subjects = Weapps::SubjectQuery.call(current_laboratory, params)
|
||||
@subject_count = subjects.map(&:id).size
|
||||
@subjects = paginate subjects
|
||||
end
|
||||
|
||||
# 详情
|
||||
def show
|
||||
# 合作团队
|
||||
Rails.logger.info("##########subject: #{@subject.id}")
|
||||
@members = @subject.subject_members.includes(:user)
|
||||
shixuns = @subject.shixuns.published.pluck(:id)
|
||||
challenge_ids = Challenge.where(shixun_id: shixuns).pluck(:id)
|
||||
# 实训路径中的所有实训标签
|
||||
@tags = ChallengeTag.where(challenge_id: challenge_ids).pluck(:name).uniq
|
||||
end
|
||||
|
||||
private
|
||||
def find_subject
|
||||
@subject = Subject.find(params[:id])
|
||||
end
|
||||
|
||||
end
|
||||
16
app/controllers/weapps/unbind_accounts_controller.rb
Normal file
16
app/controllers/weapps/unbind_accounts_controller.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
class Weapps::UnbindAccountsController < Weapps::BaseController
|
||||
before_action :require_login
|
||||
|
||||
def show
|
||||
@user = current_user
|
||||
end
|
||||
|
||||
def destroy
|
||||
open_user = OpenUsers::Wechat.find_by!(user_id: current_user.id)
|
||||
session[:unionid] = open_user.uid
|
||||
open_user.destroy!
|
||||
UserAction.create(action_id: current_user.id, action_type: "UnbindWechat", user_id: current_user.id, :ip => request.remote_ip)
|
||||
logout_user
|
||||
render_ok
|
||||
end
|
||||
end
|
||||
59
app/controllers/weapps/verification_codes_controller.rb
Normal file
59
app/controllers/weapps/verification_codes_controller.rb
Normal file
@@ -0,0 +1,59 @@
|
||||
class Weapps::VerificationCodesController < Weapps::BaseController
|
||||
before_action :require_wechat_login!
|
||||
|
||||
def create
|
||||
params[:type] == 'register' ? check_can_register : check_can_reset_password
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def check_can_register
|
||||
login = params[:login].to_s.strip
|
||||
if login =~ /^[a-zA-Z0-9]+([._\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
|
||||
user = User.find_by(mail: login)
|
||||
return render_error('该邮箱已注册') if user.present?
|
||||
elsif login =~ /^1\d{10}$/
|
||||
user = User.find_by(phone: params[:login])
|
||||
return render_error('该手机号已注册') if user.present?
|
||||
else
|
||||
return render_error('请输入正确的邮箱或手机号')
|
||||
end
|
||||
|
||||
send_type = login =~ /^1\d{10}$/ ? 1 : 8
|
||||
|
||||
# 发送验证码
|
||||
send_code(send_type, login)
|
||||
|
||||
render_ok
|
||||
end
|
||||
|
||||
def check_can_reset_password
|
||||
login = params[:login].to_s.strip
|
||||
if login =~ /^[a-zA-Z0-9]+([._\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
|
||||
user = User.find_by(mail: login)
|
||||
return render_error('该邮箱尚未注册') if user.blank?
|
||||
elsif login =~ /^1\d{10}$/
|
||||
user = User.find_by(phone: login)
|
||||
return render_error('该手机号尚未注册') if user.blank?
|
||||
else
|
||||
return render_error('请输入正确的邮箱或手机号')
|
||||
end
|
||||
|
||||
send_type = login =~ /^1\d{10}$/ ? 2 : 3
|
||||
|
||||
# 发送验证码
|
||||
send_code(send_type, login)
|
||||
|
||||
render_ok
|
||||
end
|
||||
|
||||
def send_code send_type, login
|
||||
code = %W(0 1 2 3 4 5 6 7 8 9)
|
||||
verification_code = code.sample(6).join
|
||||
# 记录验证码
|
||||
sign = Digest::MD5.hexdigest("#{OPENKEY}#{login}")
|
||||
tip_exception(501, "请求不合理") if sign != params[:smscode]
|
||||
|
||||
check_verification_code(verification_code, send_type, login)
|
||||
end
|
||||
end
|
||||
8
app/controllers/weapps/verifies_controller.rb
Normal file
8
app/controllers/weapps/verifies_controller.rb
Normal file
@@ -0,0 +1,8 @@
|
||||
class Weapps::VerifiesController < Weapps::BaseController
|
||||
before_action :require_wechat_login!
|
||||
|
||||
def create
|
||||
valid = Wechat::Weapp.verify?(session_openid, params[:verify_string], params[:signature])
|
||||
render_ok(valid: valid)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user