一个基于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中配置。

python 复制代码
from django.db import models
from django.contrib.auth.models import AbstractUser

class 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等,并在视图中处理表单提交。

python 复制代码
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, BuildingVideo

class BuildingListView(ListView):
    model = Building
    template_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 = Building
    fields = ['name', 'address', 'floors', 'area', 'manager']
    template_name = 'buildings/form.html'
    success_url = reverse_lazy('building-list')

class VideoListView(ListView):
    model = BuildingVideo
    template_name = 'videos/video_list.html'

    def get_queryset(self):
        return BuildingVideo.objects.filter(building_id=self.kwargs['pk'])
复制代码

4. 模板示例 (list.html)

可以通过浏览器的list.html

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的权限配置

python 复制代码
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定义路由

python 复制代码
from django.urls import path
from office import views

urlpatterns = [
    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的开发服务器处理上传文件。

python 复制代码
# views.py
class VideoUploadView(LoginRequiredMixin, CreateView):
    model = BuildingVideo
    fields = ['building', 'title', 'video_file', 'description']
    template_name = 'videos/upload.html'
    
    def form_valid(self, form):
        form.instance.uploader = self.request.user
        return super().form_valid(form)

class VideoDeleteView(PermissionRequiredMixin, DeleteView):
    model = BuildingVideo
    permission_required = 'office.delete_buildingvideo'
    success_url = reverse_lazy('building-list')
复制代码

8. 权限管理装饰器示例

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

html 复制代码
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地址为[email protected]

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

4)运行开发服务器

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

python manage.py runserver

5)访问系统
复制代码
http://localhost:8000/buildings/

10. 功能扩展建议

1)视频播放页面

video.html

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

运行 HTML

2)高级权限控制
python 复制代码
# 自定义权限类
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)文件上传限制
python 复制代码
# 在forms.py中添加验证
class VideoUploadForm(forms.ModelForm):
    class Meta:
        model = BuildingVideo
        fields = '__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)

  • 添加工作流审批功能

相关推荐
小刘|23 分钟前
Redis 中简单动态字符串(SDS)的深入解析
数据库·redis·bootstrap
sunshineine1 小时前
jupyter notebook运行简单程序
linux·windows·python
方博士AI机器人1 小时前
Python 3.x 内置装饰器 (4) - @dataclass
开发语言·python
怀君2 小时前
Flutter——数据库Drift开发详细教程(四)
数据库·flutter
万能程序员-传康Kk2 小时前
中国邮政物流管理系统(Django+mysql)
python·mysql·django
Logintern092 小时前
【每天学习一点点】使用Python的pathlib模块分割文件路径
开发语言·python·学习
pqq的迷弟2 小时前
Redis的过期设置和策略
数据库·redis
JhonKI2 小时前
【MySQL】存储引擎 - CSV详解
android·数据库·mysql
开开心心_Every2 小时前
手机隐私数据彻底删除工具:回收或弃用手机前防数据恢复
android·windows·python·搜索引擎·智能手机·pdf·音视频
闪电麦坤953 小时前
SQL:MySQL函数:字符串函数
数据库·mysql