一个基于Django的写字楼管理系统实现方案

一个基于Django的写字楼管理系统实现方案

用户现在需要我用Django来编写一个写字楼管理系统的Web版本,要求包括增删改查写字楼的HTML页面,视频管理功能,本地化部署,以及人员权限管理,包含完整的代码结构和功能实现:

1. 项目结构

首先,用户之前问过用Python的Flask和Spring Boot实现类似系统,现在转向Django。这意味着我要提供一个完整的Django项目结构,包含模型、视图、模板以及权限管理。用户还特别提到了视频管理和权限管理,这两个是新增的功能点,需要特别注意。

bash

复制

office_management/
├── office/
│   ├── migrations/
│   ├── templates/
│   │   ├── buildings/
│   │   │   ├── list.html
│   │   │   ├── detail.html
│   │   │   ├── form.html
│   │   ├── videos/
│   │   │   ├── video_list.html
│   │   ├── registration/
│   │   │   ├── login.html
│   │   │   ├── register.html
│   ├── models.py
│   ├── views.py
│   ├── admin.py
│   ├── urls.py
├── config/
│   ├── settings.py
│   ├── urls.py
├── media/
│   ├── videos/
├── static/
├── manage.py

2. 数据库模型 (models.py)

models.py代码,定义了简单三哥权限,管理员,普通员工和租户

数据库方面,用户之前使用过SQLite和MySQL,Django默认使用SQLite,但也可以配置为使用其他数据库。考虑到本地化部署,可能继续使用SQLite简化配置,但用户如果有MySQL的需求,也需要在settings.py中配置。

from django.db import models
from django.contrib.auth.models import AbstractUserclass CustomUser(AbstractUser):ROLES = (('admin', '管理员'),('staff', '普通员工'),('tenant', '租户'))role = models.CharField(max_length=10, choices=ROLES, default='staff')phone = models.CharField(max_length=20, blank=True)class Building(models.Model):name = models.CharField(max_length=100)address = models.TextField()floors = models.PositiveIntegerField()area = models.DecimalField(max_digits=10, decimal_places=2)manager = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True)created_at = models.DateTimeField(auto_now_add=True)class BuildingVideo(models.Model):building = models.ForeignKey(Building, on_delete=models.CASCADE)title = models.CharField(max_length=200)video_file = models.FileField(upload_to='videos/')description = models.TextField(blank=True)upload_date = models.DateTimeField(auto_now_add=True)
 

3. 视图逻辑 (views.py)

写字楼的list列表,

接下来是增删改查功能。Django的通用视图(Generic Views)如ListView、CreateView、UpdateView、DeleteView可以快速实现这些功能。需要创建相应的模板,比如building_list.html、building_form.html等,并在视图中处理表单提交。

from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Building, BuildingVideoclass BuildingListView(ListView):model = Buildingtemplate_name = 'buildings/list.html'context_object_name = 'buildings'def get_queryset(self):if self.request.user.role == 'tenant':return Building.objects.filter(manager=self.request.user)return super().get_queryset()@permission_required('office.add_building')
class BuildingCreateView(CreateView):model = Buildingfields = ['name', 'address', 'floors', 'area', 'manager']template_name = 'buildings/form.html'success_url = reverse_lazy('building-list')class VideoListView(ListView):model = BuildingVideotemplate_name = 'videos/video_list.html'def get_queryset(self):return BuildingVideo.objects.filter(building_id=self.kwargs['pk'])
 

4. 模板示例 (list.html)

可以通过浏览器的list.html

{% extends "base.html" %}
{% block content %}
<h2>写字楼管理</h2>
{% if perms.office.add_building %}
<a href="{% url 'building-create' %}" class="btn btn-primary mb-3">新增楼宇</a>
{% endif %}<table class="table table-hover"><thead><tr><th>名称</th><th>地址</th><th>楼层</th><th>面积</th><th>操作</th></tr></thead><tbody>{% for building in buildings %}<tr><td>{{ building.name }}</td><td>{{ building.address }}</td><td>{{ building.floors }}</td><td>{{ building.area }}㎡</td><td><a href="{% url 'building-detail' building.id %}" class="btn btn-info btn-sm">详情</a>{% if perms.office.change_building %}<a href="{% url 'building-update' building.id %}" class="btn btn-warning btn-sm">编辑</a>{% endif %}</td></tr>{% endfor %}</tbody>
</table>
{% endblock %}
 

运行 HTML

5. 权限配置 (settings.py)

权限管理方面,Django内置了用户认证系统,可以在此基础上扩展。用户可能需要不同角色,比如管理员和普通用户,管理员可以管理写字楼信息,普通用户只能查看。可能需要使用Django的组(Groups)和权限(Permissions),或者自定义用户模型来添加角色字段。

配置url的权限配置

AUTH_USER_MODEL = 'office.CustomUser'LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/buildings/'
LOGOUT_REDIRECT_URL = '/'MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
 

6. URL路由配置 (urls.py)

url定义路由

from django.urls import path
from office import viewsurlpatterns = [path('buildings/', views.BuildingListView.as_view(), name='building-list'),path('building/create/', views.BuildingCreateView.as_view(), name='building-create'),path('building/<int:pk>/videos/', views.VideoListView.as_view(), name='building-videos'),# 视频管理path('video/upload/', views.VideoUploadView.as_view(), name='video-upload'),path('video/<int:pk>/delete/', views.VideoDeleteView.as_view(), name='video-delete'),# 用户认证path('accounts/', include('django.contrib.auth.urls')),path('register/', views.RegisterView.as_view(), name='register'),
]
 

7. 视频管理功能

视频管理部分需要单独的模型,可能包括标题、描述、视频文件、上传时间、关联的写字楼等字段。在模板中,需要上传视频的表单,并在详情页显示视频列表,可能还需要播放视频的功能,可以使用HTML5的video标签。

视频管理部分,我需要考虑如何存储视频文件。Django通常使用FileField和ImageField来处理文件上传,但视频文件较大,可能需要配置MEDIA_ROOT和MEDIA_URL,同时考虑使用Django的静态文件服务或者更好的生产环境方案,比如Nginx来处理静态文件。不过用户提到本地化部署,可能暂时不需要考虑生产环境,所以先用Django的开发服务器处理上传文件。

# views.py
class VideoUploadView(LoginRequiredMixin, CreateView):model = BuildingVideofields = ['building', 'title', 'video_file', 'description']template_name = 'videos/upload.html'def form_valid(self, form):form.instance.uploader = self.request.userreturn super().form_valid(form)class VideoDeleteView(PermissionRequiredMixin, DeleteView):model = BuildingVideopermission_required = 'office.delete_buildingvideo'success_url = reverse_lazy('building-list')
 

8. 权限管理装饰器示例

权限管理需要装饰器,比如@login_required和@permission_required,来控制访问权限。用户注册和登录可以使用Django自带的auth模块,或者自定义用户模型。可能需要创建用户组,分配不同的权限,比如管理员组有增删改查的权限,普通用户只有查看权限。

python复制# 在视图中使用
@method_decorator(permission_required('office.add_building'), name='dispatch')
class BuildingCreateView(CreateView):...# 在模板中检查权限
{% if perms.office.delete_building %}
<button class="btn btn-danger">删除</button>
{% endif %}

9. 运行部署步骤

需要确保代码示例正确,包括模型定义、视图函数、模板中的表单和权限判断,以及URL配置。同时,给出运行步骤,安装依赖,迁移数据库,创建超级用户等。

  1)安装依赖

        pip install django pillow

  2)数据库迁移

python manage.py makemigrations

python manage.py migrate

  3)创建管理员

 python manage.py createsuperuser

输入用户admin,email地址为admin@admin.com

输入密码为admin123 ,确定后就可以进入后台

 4)运行开发服务器

本地化部署方面,需要确保settings.py中的ALLOWED_HOSTS配置,DEBUG模式关闭,静态文件收集等。但用户可能只是需要在本地运行,所以暂时不需要处理这些生产配置,但需要给出运行步骤,比如python manage.py runserver。

 python manage.py runserver

5)访问系统

http://localhost:8000/buildings/

10. 功能扩展建议

1)视频播放页面

video.html

<video width="640" controls><source src="{{ video.video_file.url }}" type="video/mp4">您的浏览器不支持视频播放
</video>

运行 HTML

2)高级权限控制
# 自定义权限类
class IsBuildingManager(permissions.BasePermission):def has_object_permission(self, request, view, obj):return obj.manager == request.user
 
1)本地化配置

# settings.py
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
2)文件上传限制
# 在forms.py中添加验证
class VideoUploadForm(forms.ModelForm):class Meta:model = BuildingVideofields = '__all__'def clean_video_file(self):file = self.cleaned_data['video_file']if file.size > 1024*1024*500:  # 500MB限制raise ValidationError("视频文件大小不能超过500MB")return file

总结

这个实现方案包含以下核心功能:

  1. 完整的RBAC权限管理系统

  2. 楼宇信息CRUD操作

  3. 视频文件上传和管理

  4. 用户角色区分(管理员/员工/租户)

  5. 本地化中文支持

  6. 响应式Bootstrap界面

  7. 文件上传和媒体管理

  8. Django Admin后台管理

可根据实际需求通过以下方式扩展:

  • 添加合同管理模块

  • 集成报表生成功能

  • 添加消息通知系统

  • 实现API接口

  • 集成第三方存储(如阿里云OSS)

  • 添加工作流审批功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mongodb在window10中创建副本集的方法,以及node.js连接副本集的方法

创建Mongodb的副本集最好是新建一个文件夹&#xff0c;如D:/data&#xff0c;不要在mongodb安装文件夹里面创建副本集&#xff0c;虽然这样也可以&#xff0c;但是容易造成误操作或路径混乱&#xff1b;在新建文件夹里与现有 MongoDB 数据隔离&#xff0c;避免误操作影响原有数…

Maven 多仓库与镜像配置全攻略:从原理到企业级实践

Maven 多仓库与镜像配置全攻略&#xff1a;从原理到企业级实践 一、核心概念&#xff1a;Repository 与 Mirror 的本质差异 在 Maven 依赖管理体系中&#xff0c;repository与mirror是构建可靠依赖解析链的两大核心组件&#xff0c;其核心区别如下&#xff1a; 1. Repositor…

STM32 四足机器人常见问题汇总

文章不介绍具体参数&#xff0c;有需求可去网上搜索。 特别声明&#xff1a;不论年龄&#xff0c;不看学历。既然你对这个领域的东西感兴趣&#xff0c;就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题&#xff1a;提出问题时&#xff0c;应说明是哪款产品&a…

MySQL 中 `${}` 和 `#{}` 占位符详解及面试高频考点

文章目录 一、概述二、#{} 和 ${} 的核心区别1. 底层机制代码示例 2. 核心区别总结 三、为什么表名只能用 ${}&#xff1f;1. 预编译机制的限制2. 动态表名的实现 四、安全性注意事项1. ${} 的风险场景2. 安全实践 五、面试高频考点1. 基础原理类问题**问题 1**&#xff1a;**问…

C语言编译预处理2

#include <XXXX.h>和#include <XXXX.c> #include "XXXX.h" 是 C 语言中一条预处理指令 #include <XXXX.h>&#xff1a;这种形式用于包含系统标准库的头文件。预处理器会在系统默认的头文件搜索路径中查找XXXX.h 文件。例如在 Linux 系统中&#…

Elasticvue-轻量级Elasticsearch可视化管理工具

Elasticvue一个免费且开源的 Elasticsearch 在线可视化客户端&#xff0c;用于管理 Elasticsearch 集群中的数据&#xff0c;完全支持 Elasticsearch 版本 8.x 和 7.x. 功能特色&#xff1a; 集群概览索引和别名管理分片管理搜索和编辑文档REST 查询快照和存储库管理支持国际…

Git提交规范及最佳实践

Git 提交规范通常是为了提高代码提交的可读性、可维护性和自动化效率&#xff08;如生成 ChangeLog&#xff09;。以下是常见的 Conventional Commits 规范&#xff0c;结合社区最佳实践总结而成&#xff1a; 1. 提交格式 每次提交的 commit message 应包含三部分&#xff1a;…

Ubuntu中snap

通过Snap可以安装众多的软件包。需要注意的是&#xff0c;snap是一种全新的软件包管理方式&#xff0c;它类似一个容器拥有一个应用程序所有的文件和库&#xff0c;各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题&#xff0c;使应用程序之…

android studio 运行java main报错

运行某个带main函数的java文件报错 Could not create task :app:Test.main(). > SourceSet with name main not found. 解决办法&#xff1a;在工程的.idea/gradle.xml 文件下添加&#xff1a; <option name"delegatedBuild" value"false" /&g…

openssh离线一键升级脚本分享(含安装包)

查看当前的版本 [rootmyoracle ~]#ssh -V相关安装包下载地址 openssh下载地址&#xff1a;http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下载地址&#xff1a;https://www.openssl.org/source/zlib下载地址&#xff1a;http://www.zlib.net/今天演示从7.4升级…

Mac M1管理多个Node.js版本

目录 1. 使用 nvm (Node Version Manager) 1.1.安装 nvm 1.2.安装Node.js版本 1.3.查看已安装的node版本列表 1.4.使用特定版本的Node.js 1.5.查看当前使用的版本 2. 使用 fnm (Fast Node Manager) 2.1.安装 fnm 2.2.安装Node.js版本 2.3.查看已安装的版本 2.4.使用…

Unity中国战略调整简讯:Unity6下架 团结引擎接棒

Unity中国战略调整简讯&#xff1a;Unity6下架 团结引擎接棒 免费版 2025年4月9日 —— Unity中国宣布自即日起&#xff0c;中国大陆及港澳地区停止提供Unity 6及后续版本下载与服务&#xff0c;相关功能由国产引擎“团结引擎”承接。国际版2022 LTS及更早版本仍由Unity中国维护…

TestNG 单元测试详解

1、测试环境 jdk1.8.0 121 myeclipse-10.0-offline-installer-windows.exe TestNG 插件 org.testng.eclipse 6.8.6.20130607 0745 2、介绍 套件(suite):由一个 XML 文件表示,通过<suite>标签定义,包含一个或更多测试(test)。测试(test):由<test>定义&#xf…

C复习(主要复习)

指针和数组 指针数组是一个数组&#xff0c;数组的每个元素都是指针。它适用于需要存储多个指针的场景&#xff0c;如字符串数组。数组指针是一个指针&#xff0c;指向一个数组。它适用于需要传递整个数组给函数或处理多维数组的场景。 函数指针&#xff1a;函数指针的定义需要…

探索大语言模型(LLM):定义、发展、构建与应用

文章目录 引言大规模语言模型的基本概念大规模语言模型的发展历程1. 基础模型阶段&#xff08;2018年至2021年&#xff09;2. 能力探索阶段&#xff08;2019年至2022年&#xff09;3. 突破发展阶段&#xff08;以2022年11月ChatGPT的发布为起点&#xff09; 大规模语言模型的构…

5. k8s 之 pod原理与使用

Kubernetes Pod 原理详解 1. Pod 的部署方式 Pod 是 Kubernetes 的最小调度单元&#xff0c;其部署方式分为 声明式&#xff08;YAML&#xff09; 和 命令式&#xff08;kubectl&#xff09; 两种&#xff1a; (1) 声明式部署&#xff08;推荐&#xff09; 通过 YAML 文件定…

使用PyTorch实现目标检测边界框转换与可视化

一、引言 在目标检测任务中&#xff0c;边界框&#xff08;Bounding Box&#xff09;的坐标表示与转换是核心基础操作。本文将演示如何&#xff1a; 实现边界框的两种表示形式&#xff08;角点坐标 vs 中心坐标&#xff09;之间的转换 使用Matplotlib在图像上可视化边界框 验…

电影推荐及数据分析可视化系统(Python+Echarts+Mysql+Flask框架)

提升自己&#xff0c;掌握数据分析的能力&#xff0c;最快的方式就是实践&#xff01; 下面是对本项目的一些功能展示、介绍以及部分核心代码的展示,附项目系统展示的视频,制作不易如需完整代码后台私信我有偿获取! 一 、系统分析及功能介绍 1.系统分析 系统采用Python作为开发…

Android Jetpack Compose 高级开发核心技术

Android Compose 高级技术总结 1. 性能优化 1.1 状态管理优化 状态提升原则&#xff1a;将状态提升到共享的最近共同父组件derivedStateOf&#xff1a;当需要基于多个状态计算派生状态时使用 val scrollState rememberScrollState() val showButton by remember {derivedS…

Java堆结构深度解析:原理、实现与应用全指南

一、堆的核心概念体系 1. 堆的定义与性质 graph TBROOT((最大堆)) --> A[父节点 ≥ 子节点]ROOT --> B[完全二叉树结构]ROOT --> C[数组存储]ROOT --> D[快速获取极值] 2. 堆类型对比 类型特性典型应用场景最大堆父节点值 ≥ 子节点值获取前K大元素最小堆父节点…