一個基于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
總結
這個實現方案包含以下核心功能:
-
完整的RBAC權限管理系統
-
樓宇信息CRUD操作
-
視頻文件上傳和管理
-
用戶角色區分(管理員/員工/租戶)
-
本地化中文支持
-
響應式Bootstrap界面
-
文件上傳和媒體管理
-
Django Admin后臺管理
可根據實際需求通過以下方式擴展:
-
添加合同管理模塊
-
集成報表生成功能
-
添加消息通知系統
-
實現API接口
-
集成第三方存儲(如阿里云OSS)
-
添加工作流審批功能