一個基于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.pswp.cn/web/76101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76101.shtml
英文地址,請注明出處:http://en.pswp.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大元素最小堆父節點…