创建专属的实验室应用
创建一个专门的 lab应用#进入你的 Django 项目根目录python manage.py startapp lab配置 settings.py打开项目根目录下的 settings.py在INSTALLED_APPS里添加lab应用INSTALLED_APPS [ polls.apps.PollsConfig, django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, lab, # 新增这一行 ]替换 lab/models.py 代码from django.db import models from django.utils import timezone from datetime import datetime # 实验室模型 class Laboratory(models.Model): # 安全等级选项 SAFETY_LEVELS [ (1, 一级), (2, 二级), (3, 三级), ] name models.CharField(max_length100, verbose_name实验室名称) lab_id models.CharField(max_length20, uniqueTrue, verbose_name实验室编号) room_number models.CharField(max_length20, verbose_name房间号) created_date models.DateField(auto_now_addTrue, verbose_name创建年月) updated_date models.DateField(auto_nowTrue, verbose_name最近更新年月) manager models.ForeignKey(LabTechnician, on_deletemodels.SET_NULL, nullTrue, related_namemanaged_labs, verbose_name管理员) area models.FloatField(verbose_name面积) seats models.IntegerField(verbose_name座位数) safety_level models.CharField(max_length1, choicesSAFETY_LEVELS, verbose_name安全等级) computers models.IntegerField(verbose_name电脑数) other_equipment models.TextField(blankTrue, verbose_name其他主要设备) notes models.TextField(blankTrue, verbose_name备注) def __str__(self): return f{self.name} ({self.room_number}) # 学期模型 class Semester(models.Model): name models.CharField(max_length20, verbose_name学期名称) start_date models.DateField(verbose_name起始日期) is_active models.BooleanField(defaultTrue, verbose_name是否激活) def __str__(self): return self.name # 教师模型 class Teacher(models.Model): # 专业选项 MAJORS [ (CS, 计算机), (SE, 软件工程), (BD, 大数据), (EC, 电商), ] name models.CharField(max_length100, verbose_name姓名) phone models.CharField(max_length20, verbose_name联系电话) major models.CharField(max_length2, choicesMAJORS, verbose_name所属专业) is_external models.BooleanField(defaultFalse, verbose_name是否校外) def __str__(self): return self.name # 实验员模型 class LabTechnician(models.Model): name models.CharField(max_length100, verbose_name姓名) phone models.CharField(max_length20, verbose_name联系电话) def __str__(self): return self.name # 实验员值班安排模型 class LabDuty(models.Model): # 星期选项 DAYS [(i, day) for i, day in enumerate([周一, 周二, 周三, 周四, 周五], 1)] # 班次选项 SHIFTS [(morning, 早8点前), (evening, 晚5点后)] technician models.ForeignKey(LabTechnician, on_deletemodels.CASCADE, related_nameduties, verbose_name实验员) day models.IntegerField(choicesDAYS, verbose_name星期) shift models.CharField(max_length10, choicesSHIFTS, verbose_name班次) class Meta: unique_together (technician, day, shift) # 避免同一实验员同一天同一班次重复安排 def __str__(self): return f{self.technician.name} - {self.get_day_display()} {self.get_shift_display()} # 课程模型 class Course(models.Model): MAJORS [ (CS, 计算机), (SE, 软件工程), (BD, 大数据), (EC, 电商), (IC, 集成电路微专业), (OS, 开源微专业), ] name models.CharField(max_length100, verbose_name课程名称) majors models.JSONField(defaultlist, verbose_name所属专业) # 支持多个专业 def __str__(self): return self.name # 软件模型 class Software(models.Model): LICENSE_TYPES [ (free, 免费), (paid, 收费), (cracked, 收费破解), ] name models.CharField(max_length100, verbose_name软件名称) version models.CharField(max_length20, verbose_name软件版本) license models.CharField(max_length10, choicesLICENSE_TYPES, verbose_name收费状态) def __str__(self): return f{self.name} {self.version} # 实验室使用登记模型 class LabUsageRecord(models.Model): date models.DateField(defaulttimezone.now, verbose_name使用日期) semester models.ForeignKey(Semester, on_deletemodels.CASCADE, verbose_name学期) course models.ForeignKey(Course, on_deletemodels.CASCADE, verbose_name课程) labs models.ManyToManyField(Laboratory, verbose_name使用实验室) software models.ManyToManyField(Software, verbose_name使用软件) user_type models.CharField(max_length10, choices[(teacher, 教师), (technician, 实验员)], verbose_name使用者类型) teacher models.ForeignKey(Teacher, on_deletemodels.SET_NULL, nullTrue, blankTrue, verbose_name教师) technician models.ForeignKey(LabTechnician, on_deletemodels.SET_NULL, nullTrue, blankTrue, verbose_name实验员) major models.CharField(max_length2, choicesTeacher.MAJORS, verbose_name所属专业) # 自动填充学期和专业的逻辑 def save(self, *args, **kwargs): # 自动关联当前日期对应的学期 if not self.semester_id: today self.date or timezone.now().date() semester Semester.objects.filter(start_date__ltetoday).order_by(-start_date).first() if semester: self.semester semester # 自动填充专业 if self.teacher and not self.major: self.major self.teacher.major super().save(*args, **kwargs) def __str__(self): return f{self.course.name} - {self.date} # 实验室运维日志模型 class LabMaintenance(models.Model): lab models.ForeignKey(Laboratory, on_deletemodels.CASCADE, verbose_name实验室) issue models.TextField(verbose_name故障/维护情况) discovered_date models.DateField(defaulttimezone.now, verbose_name发现/处理日期) solved models.BooleanField(defaultFalse, verbose_name是否解决) def __str__(self): return f{self.lab.name} - {self.discovered_date}注册模型到 Admin 后台打开lab/admin.py输入代码from django.contrib import admin from .models import ( Laboratory, Semester, Teacher, LabTechnician, LabDuty, Course, Software, LabUsageRecord, LabMaintenance ) # 注册所有模型到后台 admin.site.register(Laboratory) admin.site.register(Semester) admin.site.register(Teacher) admin.site.register(LabTechnician) admin.site.register(LabDuty) admin.site.register(Course) admin.site.register(Software) admin.site.register(LabUsageRecord) admin.site.register(LabMaintenance)执行数据库迁移在终端运行以下命令创建实验室相关的数据库表python manage.py makemigrations lab python manage.py migrate重启服务器并验证python manage.py runserver分配人员权限访问http://127.0.0.1:8000/admin你会看到左侧菜单里出现了所有实验室相关的模型Laboratory、Semester 等同时回到用户组权限分配页面输入lab就能看到对应的中文权限项了。进入了 Lab_Technician 用户组的权限配置页面接下来可以这样操作权限分配建议按角色Lab_Technician实验员推荐权限Can add lab duty、Can change lab duty、Can view laboratory、Can view lab usage record、Can add lab maintenance、Can change lab maintenance。不建议给Can delete类权限避免误删重要数据。Teacher教师推荐权限Can view course、Can view laboratory、Can add lab usage record、Can change own lab usage record。Lab_Admin管理员可以直接勾选所有lab应用的权限进行全面管理登录teacher_zhang的账号密码这个界面说明你的权限分配完全成功了从TEACHER_ZHANG的后台首页可以看到他只能看到LAB应用下的三个模块Courses查看、Lab usage records可添加、Laboratories查看。其他模块如Lab dutys、Lab maintenances等都被隐藏了这正好符合教师角色的权限需求可以查看课程和实验室信息可以提交实验室使用记录不能管理值班、维护等其他功能这说明你之前的权限分配完全符合预期系统已经可以正常使用了。实验室管理系统的人员权限分配配置好了admin_li属于Lab Admin组拥有对lab应用的全部管理权限。tech_li属于Lab Technician组负责值班和维护管理。teacher_zhang属于Teacher组负责提交使用记录和查看信息。niuke超级管理员账号拥有系统最高权限。现在录入所有人员的用户权限录入基础数据用admin_li或超级用户登录按以下顺序录入避免关联字段为空Semesters学期如 “2026 年春季学期”。Teachers教师录入姓名、专业、联系方式关联teacher_zhang等用户。Lab technicians实验员录入姓名、工号关联tech_li等用户。Laboratories实验室录入房间号、座位数、安全等级、负责人关联实验员。Softwares软件录入实验室安装的软件名称、版本。Courses课程关联教师、对应实验室、所属学期。验证所有角色的完整操作流程并运行教师teacher_zhang提交实验室使用申请→保存成功。实验员tech_li查看/审核使用申请→添加值班安排/维护记录→保存成功。管理员admin_li修改/删除数据→权限无异常。只要各角色能完成对应操作且无报错就说明系统核心功能正常。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2433838.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!