• 基于Django的健身房管理系统


    目 录
    摘 要 I
    Abstract II
    1 引言 1
    1.1选题背景及意义 1
    1.2发展现状 1
    1.3研究主要内容 2
    2 关键技术介绍 4
    2.1相关技术简介 4
    2.1.1 B/S体系相关介绍 4
    2.1.2 Python语言介绍 4
    2.1.3 Djang框架介绍 5
    2.2技术方案选择 6
    2.3开发环境的确定 7
    3 系统分析 8
    3.1可行性分析 8
    3.2 系统需求分析 9
    3.2.1 开发设计思想 9
    3.2.2 开发项目的功能需求 9
    3.3处理流程设计 10
    3.3.1系统操作流程图 10
    3.3.2数据增加流程 10
    3.3.3数据修改流程图 11
    3.3.4数据删除流程图 11
    3.4输入输出设计 12
    3.4.1输入设计 12
    3.4.2输出设计 12
    4 系统设计 13
    4.1系统功能模块设计 13
    4.1.1系统功能总体模块设计 13
    4.1.2子功能模块设计 13
    4.2数据库设计 15
    4.2.1数据字典 15
    4.2.2系统实体图 16
    4.2.3流程图 18
    4.2.4数据表设计 19
    5 系统实现 22
    5.1系统用户管理功能模块的设计 22
    5.1.1系统用户管理功能模块的设计 22
    5.3会员卡类别模块的设计 23
    5.4器材管理的实现 23
    5.5健身教练管理的实现 24
    5.6系统用户修改密码的实现 25
    5.6.1 前端页面 25
    5.6.2 web层 26
    5.6.3 service层 27
    5.6.4 dao层以及mapper 27
    6 系统测试 29
    6.1测试用例 29
    6.1.1 以健身会员信息的添加、修改、删除为例进行测试 29
    6.1.2 测试用例之登录管理 29
    6.1.3 以该系统设计的菜单中会员管理菜单项为例进行测试 30
    7 总结与展望 31
    7.1 总结 31
    7.2系统的不足与改进方案 31
    7.2.1 系统的不足 31
    7.2.2 系统的改进方案 31
    参考文献 32
    致 谢 34
    3 系统分析
    3.1可行性分析
    该系统主要是对会员的信息和会员卡进行管理,同时可以对工作人员,设备器材,和健身教练信息进行管理,方便快捷操作,精简人员,节约开支;并且还可以使健身房的工作方式更加简洁明了,也大大提高了工作人员的办事效率,更重要的是使管理人员能够更快速、方便的对每一位健身房会员的信息有一个清楚了解,管理起来非常简单,同时也减少了信息管理的漏洞和因为工作的冗余出现的错误,并且操作非常方便,可以减少许多不必要的人员。所以该系统是可行的。
    健身房管理系统的开发的总设计目标是实现会员管理以及相关东西管理的系统化、规范化和自动化实现对会员的集中地统一的管理。我根据管理上的可行性、技术上的可行性、经济上的可行性进行分析。
    管理上的可行性
    由于原有的管理系统不能满足日趋发展的健身房管理系统工作的需要,所以建立新的健身房管理系统是必须的,因此开发更为系统科学规范的健身会员信息系统以便为会员提供更好、更便捷的服务,同时也为健身房相关东西的管理提供更好的保障。流程比较清晰,规章制度齐全,健身会员信息原始数据精确。
    技术上的可行性
    目前整个社会的健身房都是为了用户和健身房本身所设计,一个健身房管理系统更是得到许多健身房拥有者的支持,再加上现在计算机技术的发展,这些为我们设计健身房管理系统提供了软件和硬件的双重保障。
    经济上的可行性
    该系统的开发只需计算机和相应开发软件就可以,开发成本较低。随着该系统的投入使用,科学管理工作效率会大大提高,工作流程更加合理流畅,查询统计更加方便快捷,因此该系统的社会效益十分明显。综上所述,此系统的开发条件基本具备,可以进行开发。我用电话访问的方式访问了许多健身房拥有者,大多数的受访者都表达了对此健身房管理系统的兴趣并有兴趣采用。
    3.2 系统需求分析
    下面主要围绕两个核心问题开展需求分析:(1)开发设计思想(2)开发项目的功能需求:
    3.2.1 开发设计思想
    ①尽量采用健身房现有的软硬件环境,以及先进的管理系统开发方案,从而达到充分利用健身房现有资源,提高系统开发水平和应用效果的目的。
    ②系统应对健身会员的基本信息进行添加、修改、删除、保存以及实现对健身会员资料的查询。
    ③健身房系统应符合器材管理、会员卡管理以及人员管理系统的规定,达到理想的效果。
    ④该系统应该具备数据库维护功能,及时根据健身房需求进行数据的添加、删除、修改等操作。本文转载自http://www.biyezuopin.vip/onews.asp?id=14116能够对数据库表进行备份和恢复。
    3.2.2 开发项目的功能需求
    ①具有对健身房会员的基本信息的管理
    ②具有对健身房会员的会员卡的管理功能
    ③具有健身房会员的资料查询、会员卡查询功能
    ④具有对建身器材信息管理功能
    ⑤具有健身教练管理功能
    该系统主要是对建身房会员信息、会员会员卡信息、会员的健身信息以及健身器材信息的管理。

    import json
    
    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.core.paginator import PageNotAnInteger, Paginator
    from django.http import HttpResponse, HttpResponseRedirect
    from django.shortcuts import render, redirect
    
    # Create your views here.
    from django.urls import reverse
    from django.views.generic.base import View
    
    from bbs.models import Post
    from course.models import Course, CourseList
    from teachers.models import Teacher
    from users.forms import UserInfoForm
    from users.models import UserMessage, UserFavorite
    
    
    class TeacherinfoView(LoginRequiredMixin, View):
        """
        用户个人信息
        """
    
        def get(self, request):
            tea_obj = Teacher.objects.get(user=request.user)
            return render(request, 'teacher-info.html', {"tea_obj":tea_obj})
    
        def post(self, request):
            user_info_form = UserInfoForm(request.POST, instance=request.user)
            if user_info_form.is_valid():
                user_info_form.save()
                return HttpResponse('{"status":"success"}', content_type='application/json')
            else:
                return HttpResponse(json.dumps(user_info_form.errors), content_type='application/json')
    
    
    class TeacherListView(View):
        def get(self, request):
            sort=request.GET.get("sort","")
            all_teacher = Teacher.objects.all()
            count=Teacher.objects.count()
            all_teacher.order_by("-fav_nums")
            if sort=="hot":
                all_teacher=all_teacher.order_by("fav_nums")
            paginator=Paginator(all_teacher,8)
            page_num=request.GET.get('page',1)
            page_of_teacher = paginator.get_page(page_num)
            return render(request, 'teachers-list.html',
                          {"all_teacher": page_of_teacher,"count":count}, )
    
    
    class TeacherDetailView(View):
        def get(self, request, teacher_id):
            has_teacher_faved = False
    
            if UserFavorite.objects.filter(user_id=request.user.id, fav_type=3, fav_id=int(teacher_id)):
                has_teacher_faved = True
    
    
            teacher = Teacher.objects.get(user_id=int(teacher_id))
            all_couse=Course.objects.filter(usermessage_id=int(teacher_id))
    
            return render(request, "teacher-detail.html", {
                "teacher": teacher,
                "all_courses":all_couse,
                "has_teacher_faved": has_teacher_faved,
            })
    
    
    class ReleaseCourse(LoginRequiredMixin, View):
        def get(self, request):
            all_course=Course.objects.filter(usermessage=request.user)
            # return render(request, 'rel_course.html', {})
            return render(request, 'couse-teacher.html', {"all_course":all_course})
    
        def post(self, request):
    
            name = request.POST.get("name")
            detail = request.POST.get("detail")
            heat = request.POST.get("heat")
            learm_times = request.POST.get("learn_times")
            degree = request.POST.get("degree")
            image = request.FILES.get("image")
            is_m = request.POST.get("is_m")
            c_obj = Course()
            c_obj.name = name
            c_obj.detail = detail
            c_obj.heat = heat
            c_obj.learm_times = learm_times
            c_obj.degree = degree
            c_obj.image = image
            c_obj.usermessage = request.user
            if is_m == '1':
                c_obj.is_member = True
            else:
                c_obj.is_member = False
            c_obj.save()
    
            return HttpResponseRedirect(reverse("teacher:relcou"))
    
    
    class AddCouListView(View):
        def get(self, request):
            all_course=Course.objects.filter(usermessage=request.user)
            all_coustlist=CourseList.objects.filter(user_id=request.user.id)
            return render(request, 'add_course.html', {'all_course':all_course,"all_coustlist":all_coustlist})
    
        def post(self, request):
            course = request.POST.get("course")
            sta_time = request.POST.get("sta_time")
            end_time = request.POST.get("end_time")
            cl_obj=CourseList(user_id=request.user.id,course_id=course,sta_time=sta_time,end_time=end_time)
            cl_obj.save()
            return HttpResponseRedirect(reverse("teacher:addclist"))
    
    class UpCouListView(View):
    
        def post(self, request):
            coulist_id = request.POST.get("couid")
            course = request.POST.get("course")
            sta_time = request.POST.get("sta_time")
            end_time = request.POST.get("end_time")
            cl_obj = CourseList.objects.get(id=int(coulist_id))
            cl_obj.course_id = int(course)
            cl_obj.sta_time = sta_time
            cl_obj.end_time = end_time
            cl_obj.save()
            return HttpResponseRedirect(reverse("teacher:addclist"))
    class DeCouListView(View):
    
        def post(self, request):
            coulist_id=request.POST.get("_id")
            if coulist_id:
                cl_obj=CourseList.objects.get(id=int(coulist_id)).delete()
            all_course = Course.objects.filter(usermessage=request.user)
            return HttpResponse('{"status":"ok"}', content_type='application/json')
    
    class AddFavView(View):
    
        def post(self, request):
            fav_id = request.POST.get('fav_id', 0)
            fav_type = request.POST.get('fav_type', 0)
    
            # if not request.user.is_authenticated():
            #     #判断用户登录状态
            #     return HttpResponse('{"status":"fail", "msg":"用户未登录"}', content_type='application/json')
    
            exist_records = UserFavorite.objects.filter(user=request.user, fav_id=int(fav_id), fav_type=int(fav_type))
            if exist_records:
                #如果记录已经存在, 则表示用户取消收藏
                exist_records.delete()
                if int(fav_type) == 1:
                    course = Course.objects.filter(id=int(fav_id))
                    course.fav_nums -= 1
                    if course.fav_nums < 0:
                        course.fav_nums = 0
                    course.save()
    
                elif int(fav_type) == 3:
                    teacher = Teacher.objects.get(user_id=int(fav_id))
                    teacher.fav_nums -= 1
                    if teacher.fav_nums < 0:
                        teacher.fav_nums = 0
                    teacher.save()
                return HttpResponse('{"status":"success", "msg":"收藏"}', content_type='application/json')
            else:
                user_fav = UserFavorite()
                if int(fav_id) > 0 and int(fav_type) > 0:
                    user_fav.user = request.user
                    user_fav.fav_id = int(fav_id)
                    user_fav.fav_type = int(fav_type)
                    user_fav.save()
    
                    if int(fav_type) == 1:
                        course = Course.objects.get(id=int(fav_id))
                        course.fav_nums += 1
                        course.save()
    
                    elif int(fav_type) == 3:
                        teacher = Teacher.objects.get(user_id=int(fav_id))
                        if teacher:
                            teacher.fav_nums += 1
    
                        else:
                            teacher=Teacher(user=request.user,fav_nums=1)
                        teacher.save()
                    return HttpResponse('{"status":"success", "msg":"已收藏"}', content_type='application/json')
                else:
                    return HttpResponse('{"status":"fail", "msg":"收藏出错"}', content_type='application/json')
    
    class SelStuView(View):
        def get(self, request):
            all_c=Course.objects.filter(usermessage=request.user)
            all_c=[_obj.id for _obj in all_c]
    
            fav_courses = UserFavorite.objects.filter(fav_type=1,fav_id__in=all_c)
    
            students = []
            for fav_course in fav_courses:
                students.append(fav_course.user)
    
            students = set(students)
            return render(request, 'mystu.html', {
                "students":students
            })
    
    class MyFanView(View):
    
        def get(self, request):
            teacher_list = []
            fav_teachers = UserFavorite.objects.filter(fav_type=3,fav_id=request.user.id)
    
            return render(request, 'myfan.html', {
                "teacher_list":fav_teachers
            })
    class UpCourse(View):
    
    
        def post(self, request):
            couid=request.POST.get("couid")
    
            name = request.POST.get("name")
            detail = request.POST.get("detail")
            heat = request.POST.get("heat")
            learm_times = request.POST.get("learn_times")
            degree = request.POST.get("degree")
            image = request.FILES.get("image")
            is_m = request.POST.get("is_m")
            if couid:
                c_obj = Course.objects.get(id=couid)
                c_obj.name = name
                c_obj.detail = detail
                c_obj.heat = heat
                c_obj.learm_times = learm_times
                c_obj.degree = degree
                if image:
                    c_obj.image = image
                c_obj.usermessage = request.user
                if is_m == '1':
                    c_obj.is_member = True
                else:
                    c_obj.is_member = False
                c_obj.save()
    
            return redirect(reverse('teacher:relcou'))
    
    class CourseDe(View):
    
    
        def post(self, request):
            couid=request.POST.get("_id")
    
    
            if couid:
                c_obj = Course.objects.get(id=couid).delete()
            all_course = Course.objects.filter(usermessage=request.user)
            return redirect(reverse('teacher:relcou'))
    
    
    class DeleteBbs(View):
        def get(self,request):
            post_all=Post.objects.filter(author_id=request.user.id)
            return render(request, 'deletebbs.html', {"post_all": post_all})
    
        def post(self,request):
            bbsid=request.POST.get("bbsid")
            if bbsid:
                post_obj = Post.objects.get(id=int(bbsid))
                post_obj.delete()
                return HttpResponse('{"status":"success", "msg":"删除成功"}', content_type='application/json')
            else:
                return HttpResponse('{"status":"fa", "msg":"删除失败"}', content_type='application/json')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    网络协议--RARP:逆地址解析协议
    MFC 解决Enter回车键和Esc取消键默认关闭窗口的三种方法
    java毕业生设计校园一卡通服务平台计算机源码+系统+mysql+调试部署+lw
    Android ijkplayer播放rtsp直播流
    mysql 常见操作指令
    Flink_CDC搭建及简单使用
    计算物理专题----随机游走实战
    递归方法实现字符串反转函数
    JMeter的详细使用及相关问题
    大数据培训技术Kylin核心算法逐层构建算法
  • 原文地址:https://blog.csdn.net/sheziqiong/article/details/126780203