• (项目)在线教育平台(七)


    九、机构首页功能

    1、机构首页页面

    1.1 前端页面配置

      将机构首页页面org-detail-homepage.html拷贝到templates下。

      机构首页、机构描述、机构教师、机构课程四个页面的结构大体相同,可以创建一个母版,这个个页面继承这个母版即可,在templates下新建org_base.html,将org-detail-homepage.html的内容拷贝到org_base.html,找出需要block的地方和修改静态文件路径:

      然后将需要继承的部分拷贝到org-detail-homepage.html下:

    1.2 机构首页接口

      我们需要获取机构有哪些课程,需要在课程的model中添加一个机构的外键,course/models.py:

     1 class Course(models.Model):
     2     """课程"""
     3     DEGREE_CHOICES = (
     4         ('cj', '初级'),
     5         ('zj', '中级'),
     6         ('gj', '高级')
     7     )
     8 
     9     name = models.CharField('课程名', max_length=50)
    10     desc = models.CharField('课程描述', max_length=300)
    11     detail = models.TextField('课程详情')
    12     degree = models.CharField('课程难度', choices=DEGREE_CHOICES, max_length=2)
    13     learn_times = models.IntegerField('学习时长(分钟数)', default=0)
    14     students = models.IntegerField('学习人数', default=0)
    15     fav_nums = models.IntegerField('收藏人数', default=0)
    16     click_nums = models.IntegerField('点击数', default=0)
    17     image = models.ImageField('封面图', upload_to='courses/%Y/%m', max_length=100)
    18     course_org = models.ForeignKey(CourseOrg, verbose_name='所属机构', on_delete=models.CASCADE, null=True, blank=True)
    19     add_time = models.DateTimeField('添加时间', default=datetime.now)
    20 
    21     class Meta:
    22         verbose_name = '课程'
    23         verbose_name_plural = verbose_name
    24 
    25     def __str__(self):
    26         return self.name

      必须迁移数据库。

      然后开始编写机构首页的接口:

     1 class OrgHomeView(View):
     2     """机构主页"""
     3     def get(self, request, org_id):
     4         # 根据前端的id找机构
     5         org = CourseOrg.objects.get(id=int(org_id))
     6 
     7         # 反向查询机构所有的课程和教师
     8         all_courses = org.course_set.all()
     9         all_teachers =org.teacher_set.all()
    10 
    11         return render(request, 'org-detail-homepage.html', {
    12             'org': org,
    13             'all_courses': all_courses,
    14             'all_teachers': all_teachers
    15         })

      在organization/urls.py中添加机构首页的url:

    from .views import OrgHomeView
    
    urlpatterns = [
        re_path('home/(?P<org_id>d+)/', OrgHomeView.as_view(), name="org_home"),  # 机构主页
    ]

      修改前端机构首页页面显示机构课程的代码:

      然后修改机构列表页点击机构之后进入机构首页的url,修改org-list.html:

     

      然后修改org-base.html中的几个图片显示的问题:

      现在修改机构首页显示教师的前端页面的代码,不过在这之前需要在机构的model中的Teacher中加入image字段:

     1 class Teacher(models.Model):
     2     """机构老师"""
     3     org = models.ForeignKey(CourseOrg, verbose_name='所属机构', on_delete=models.CASCADE)
     4     name = models.CharField('老师名', max_length=50)
     5     work_years =models.IntegerField('工作年限', default=0)
     6     work_company = models.CharField('就职公司', max_length=50)
     7     work_position = models.CharField('工作职位', max_length=50)
     8     points = models.CharField('教学特点', max_length=50)
     9     click_nums = models.IntegerField('点击数', default=0)
    10     fav_nums = models.IntegerField('收藏数', default=0)
    11     image = models.ImageField('头像', upload_to='teacher/%Y/%m', max_length=100, default='')
    12     add_time = models.DateTimeField('添加时间', default=datetime.now)
    13 
    14     class Meta:
    15         verbose_name = '教师'
    16         verbose_name_plural = verbose_name
    17 
    18     def __str__(self):
    19         return '[{}]机构的教师:{}'.format(self.org.name, self.name)

      迁移数据库。

      然后修改前端代码:

      最后修改就够首页显示机构描述的代码:

      然后在后台添加课程和教师数据。刷新机构首页即可看到数据。

    2、机构课程页面

    2.1 前端页面配置

      将机构课程的页面org-detail-course.html拷贝到templates下。

      该页面继承org_base.html页面,重写需要block的地方:

    2.2 机构课程接口

     1 class OrgCourseView(View):
     2     """机构课程页面"""
     3     def get(self, request, org_id):
     4         # 根据前端的id找机构
     5         org = CourseOrg.objects.get(id=int(org_id))
     6 
     7         # 在该机构中反向查询到该机构的所有课程
     8         all_courses = org.course_set.all()
     9 
    10         return render(request, 'org-detail-course.html', {
    11             'org': org,
    12             'all_courses': all_courses
    13         })

      然后配置url:

    1 from .views import OrgCourseView
    2 
    3 urlpatterns = [
    4     re_path('course/(?P<org_id>d+)/', OrgCourseView.as_view(), name='org_course'),  # 机构课程
    5 ]

      修改org_base.html中跳转机构首页和机构课程的url:

      然后修改机构课程页面显示的代码:

      现在刷新之后就可以看到全部课程,但是有一个问题是左侧的导航栏没有选中状态,需要在各自的接口中向前端传递一个参数来记录当前是那个页面,让前端判断:

      机构首页接口添加标记:

     1 class OrgHomeView(View):
     2     """机构首页页面"""
     3     def get(self, request, org_id):
     4         # 根据前端的id找机构
     5         org = CourseOrg.objects.get(id=int(org_id))
     6 
     7         # 反向查询机构所有的课程和教师
     8         all_courses = org.course_set.all()
     9         all_teachers =org.teacher_set.all()
    10 
    11         # 标记
    12         current_page = 'home'
    13 
    14         return render(request, 'org-detail-homepage.html', {
    15             'org': org,
    16             'all_courses': all_courses,
    17             'all_teachers': all_teachers,
    18             'current_page': current_page
    19         })

      机构课程结构添加标记:

      

     1 class OrgCourseView(View):
     2     """机构课程页面"""
     3     def get(self, request, org_id):
     4         # 根据前端的id找机构
     5         org = CourseOrg.objects.get(id=int(org_id))
     6 
     7         # 在该机构中反向查询到该机构的所有课程
     8         all_courses = org.course_set.all()
     9 
    10         # 标记
    11         current_page = 'course'
    12 
    13         return render(request, 'org-detail-course.html', {
    14             'org': org,
    15             'all_courses': all_courses,
    16             'current_page': current_page
    17         })

      然后在前端org_base.html的页面进行状态判断选定:

    3、机构介绍页面

    3.1 前端页面配置

      将机构介绍的页面org-detail-desc.html拷贝到templates下。

      该页面继承org_base.html页面,重写需要block的地方:

    3.2 机构介绍接口

     1 class OrgDescView(View):
     2     """机构介绍页面"""
     3     def get(self, request, org_id):
     4         # 根据前端的id找到机构
     5         org = CourseOrg.objects.get(id=int(org_id))
     6 
     7         # 标记
     8         current_page = 'desc'
     9 
    10         return render(request, 'org-detail-desc.html', {
    11             'org': org,
    12             'current_page': current_page
    13         })

      配置url:

    1 from .views import OrgDescView
    2 
    3 
    4 urlpatterns = [
    5     re_path('desc/(?P<org_id>d+)/', OrgDescView.as_view(), name='org_desc'),  # 机构介绍
    6 ]

      然后修改机构介绍前端的显示代码:

      最后修改org_base.html中跳转机构介绍页面的url:

      刷新页面即可看到机构介绍的内容。

    4、机构讲师页面

    4.1 前端页面配置

      将机构讲师的页面org-detail-teachers.html拷贝到templates下。

      该页面继承org_base.html页面,重写需要block的地方:

    4.2 机构讲师接口

     1 class OrgTeacherView(View):
     2     """机构讲师页面"""
     3     def get(self, request, org_id):
     4         # 根据前端id找对机构
     5         org = CourseOrg.objects.get(id=int(org_id))
     6 
     7         # 在机构表中反向查询所有的讲师
     8         all_teachers = org.teacher_set.all()
     9 
    10         # 标记
    11         current_page = 'teacher'
    12 
    13         return render(request, 'org-detail-teachers.html', {
    14             'org': org,
    15             'all_teachers': all_teachers,
    16             'current_page': current_page
    17         })

      配置url:

    1 from .views import OrgTeacherView
    2 
    3 urlpatterns = [
    4     re_path('teacher/(?P<org_id>d+)/', OrgTeacherView.as_view(), name='org_teacher'),  # 机构讲师
    5 ]

      然后修改机构讲师页面前端的代码:

      最后修改org_base.html中跳转到机构讲师的url:

    5、机构收藏功能

    5.1 收藏接口

     1 class OrgFavView(View):
     2     """机构收藏"""
     3     def post(self, request):
     4         # 从request中获取收藏的机构id和类型
     5         id = request.POST.get('fav_id', 0)
     6         type = request.POST.get('fav_type', 0)
     7 
     8         # 未登录返回json数据到前端,由前端进行登录页面的跳转
     9         if not request.user.is_authenticated:
    10             return HttpResponse('{"status": "fail", "msg": "用户未登录"}', content_type='application/json')
    11 
    12         # 在数据库中查找是否有过收藏记录:
    13         exist_record = UserFavorite.objects.filter(user=request.user, fav_id=int(id), fav_type=int(type))
    14         if exist_record:
    15             # 记录存在,取消收藏
    16             exist_record.delete()
    17             return HttpResponse('{"status": "success", "msg": "收藏"}', content_type='application/json')
    18         else:
    19             # 记录不存在,收藏
    20             user_fav = UserFavorite()
    21             if int(id)>0 and int(type)>0:
    22                 user_fav.user = request.user
    23                 user_fav.fav_id = int(id)
    24                 user_fav.fav_type = int(type)
    25                 user_fav.save()
    26                 return HttpResponse('{"status": "success", "msg": "已收藏"}', content_type='application/json')
    27             else:
    28                 return HttpResponse('{"status": "fail", "msg": "收藏出错"}', content_type='application/json')

      配置url:

    1 from .views import OrgFavView
    2 
    3 urlpatterns = [
    4     path('add_fav/', OrgFavView.as_view(), name='add_fav'),  # 收藏
    5 ]

      收藏是通过ajax异步操作的,用户点击收藏,通过post方法后端进行添加收藏,取消收藏的操作,然后返回相应的json数据到前端,由前端进行显示,前端的script代码在org_base。html中,修改如下地方:

      现在点击收藏(取消收藏),查看数据库中状态已经改变了,但是还有个问题就是刷新页面之后,即使是已收藏还是显示收藏,这是因为在显示的时候没有添加判断,需要在四个页面的接口中都要添加判断条件:

      1 class OrgHomeView(View):
      2     """机构首页页面"""
      3     def get(self, request, org_id):
      4         # 根据前端的id找机构
      5         org = CourseOrg.objects.get(id=int(org_id))
      6 
      7         # 反向查询机构所有的课程和教师
      8         all_courses = org.course_set.all()
      9         all_teachers =org.teacher_set.all()
     10 
     11         # 标记
     12         current_page = 'home'
     13 
     14         # 判断收藏状态
     15         has_fav = False
     16         if request.user.is_authenticated:
     17             if UserFavorite.objects.filter(user=request.user, fav_id=org.id, fav_type=2):
     18                 has_fav = True
     19 
     20         return render(request, 'org-detail-homepage.html', {
     21             'org': org,
     22             'all_courses': all_courses,
     23             'all_teachers': all_teachers,
     24             'current_page': current_page,
     25             'has_fav': has_fav
     26         })
     27 
     28 
     29 class OrgCourseView(View):
     30     """机构课程页面"""
     31     def get(self, request, org_id):
     32         # 根据前端的id找机构
     33         org = CourseOrg.objects.get(id=int(org_id))
     34 
     35         # 在该机构中反向查询到该机构的所有课程
     36         all_courses = org.course_set.all()
     37 
     38         # 标记
     39         current_page = 'course'
     40 
     41         # 判断收藏状态
     42         has_fav = False
     43         if request.user.is_authenticated:
     44             if UserFavorite.objects.filter(user=request.user, fav_id=org.id, fav_type=2):
     45                 has_fav = True
     46 
     47         return render(request, 'org-detail-course.html', {
     48             'org': org,
     49             'all_courses': all_courses,
     50             'current_page': current_page,
     51             'has_fav': has_fav
     52         })
     53 
     54 
     55 class OrgDescView(View):
     56     """机构介绍页面"""
     57     def get(self, request, org_id):
     58         # 根据前端的id找到机构
     59         org = CourseOrg.objects.get(id=int(org_id))
     60 
     61         # 标记
     62         current_page = 'desc'
     63 
     64         # 判断收藏状态
     65         has_fav = False
     66         if request.user.is_authenticated:
     67             if UserFavorite.objects.filter(user=request.user, fav_id=org.id, fav_type=2):
     68                 has_fav = True
     69 
     70         return render(request, 'org-detail-desc.html', {
     71             'org': org,
     72             'current_page': current_page,
     73             'has_fav': has_fav
     74         })
     75 
     76 
     77 class OrgTeacherView(View):
     78     """机构讲师页面"""
     79     def get(self, request, org_id):
     80         # 根据前端id找对机构
     81         org = CourseOrg.objects.get(id=int(org_id))
     82 
     83         # 在机构表中反向查询所有的讲师
     84         all_teachers = org.teacher_set.all()
     85 
     86         # 标记
     87         current_page = 'teacher'
     88 
     89         # 判断收藏状态
     90         has_fav = False
     91         if request.user.is_authenticated:
     92             if UserFavorite.objects.filter(user=request.user, fav_id=org.id, fav_type=2):
     93                 has_fav = True
     94 
     95         return render(request, 'org-detail-teachers.html', {
     96             'org': org,
     97             'all_teachers': all_teachers,
     98             'current_page': current_page,
     99             'has_fav': has_fav
    100         })
    View Code

      然后修改org_base.html中收藏状态显示的问题:

  • 相关阅读:
    select 1 from ... sql语句中的1代表什么意思?
    装饰者模式
    Dao层抽取BaseDao公共方法
    DBUtils工具类
    java Page分页显示
    QTP
    Gym 100513F Ilya Muromets(前缀和)
    AcWing1165 单词环(01分数规划)
    AcWing904 虫洞(spfa判负环)
    AcWing1148 秘密的奶牛运输(次小生成树)
  • 原文地址:https://www.cnblogs.com/Sweltering/p/9974833.html
Copyright © 2020-2023  润新知