一、 核心需求分析与技术选型
在动手开发前,必须明确软件的核心功能需求。一个基础的房产证档案管理软件应包含以下模块:档案录入、档案查询、档案借阅/归还、权限控制、数据备份与恢复。基于这些需求,我们选择以下技术栈,这套组合稳定、高效且易于部署。
1.1 技术栈确定
- 后端:Python + Django。Django自带强大的Admin后台、ORM和用户认证系统,能极大缩短开发周期。
- 前端:HTML5 + Bootstrap 5 + 少量JavaScript。Bootstrap能快速构建响应式、美观的界面,无需复杂的前端框架。
- 数据库:SQLite(开发/小型部署)或 PostgreSQL(生产环境)。本文以SQLite为例,无需额外安装。
- 部署:Gunicorn + Nginx(Linux服务器)。
二、 开发环境搭建与项目初始化
请确保你的操作系统已安装Python 3.8或更高版本。
2.1 创建虚拟环境与安装依赖
打开终端(Linux/macOS)或命令提示符/PowerShell(Windows),执行以下命令:
```
创建项目目录并进入
mkdir property_deed_manager && cd property_deed_manager
创建Python虚拟环境
python -m venv venv
激活虚拟环境
Windows:
venv\Scripts\activate
Linux/macOS:
source venv/bin/activate
安装核心依赖
pip install django==4.2
pip install pillow 用于处理图片上传
```
安装完成后,虚拟环境命令行前会出现(venv)标识。
2.2 创建Django项目与应用
```
创建Django项目,项目名为'core'
django-admin startproject core .
创建应用,应用名为'archive'
python manage.py startapp archive
```
接着,需要将新创建的应用和必要的中间件注册到项目中。编辑core/settings.py文件:
```
在 INSTALLED_APPS 列表中添加
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'archive', 新增
]
配置静态文件目录(在文件末尾添加)
import os
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 用于生产环境收集静态文件
MEDIA_URL = '/media/' 用户上传文件(如扫描件)的访问路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 用户上传文件的存储路径
```
三、 数据模型设计
数据模型是整个软件的基石。在archive/models.py中定义房产证档案的核心模型。
```
from django.db import models
from django.contrib.auth.models import User
class PropertyDeed(models.Model):
"""房产证档案主表"""
deed_number = models.CharField(max_length=50, unique=True, verbose_name='房产证号')
owner_name = models.CharField(max_length=100, verbose_name='产权人姓名')
id_number = models.CharField(max_length=30, verbose_name='证件号码')
property_address = models.TextField(verbose_name='房产坐落')
area = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='建筑面积(㎡)')
scan_file = models.FileField(upload_to='deed_scans/', blank=True, null=True, verbose_name='证照扫描件')
remarks = models.TextField(blank=True, verbose_name='备注')
created_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='created_deeds', verbose_name='录入员')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='录入时间')
last_modified = models.DateTimeField(auto_now=True, verbose_name='最后修改时间')
class Meta:
verbose_name = '房产证档案'
verbose_name_plural = verbose_name
ordering = ['-created_at']
def __str__(self):
return f'{self.deed_number} - {self.owner_name}'
class LendRecord(models.Model):
"""档案借阅记录表"""
STATUS_CHOICES = (
('out', '借出'),
('returned', '已归还'),
)
deed = models.ForeignKey(PropertyDeed, on_delete=models.CASCADE, related_name='lend_records', verbose_name='所借档案')
borrower = models.CharField(max_length=100, verbose_name='借阅人')
borrow_department = models.CharField(max_length=100, verbose_name='借阅部门')
borrow_date = models.DateField(verbose_name='借出日期')
expected_return_date = models.DateField(verbose_name='应还日期')
actual_return_date = models.DateField(blank=True, null=True, verbose_name='实际归还日期')
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='out', verbose_name='状态')
operator = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='操作员')
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = '档案借阅记录'
verbose_name_plural = verbose_name
```
定义好模型后,需要生成数据库迁移文件并应用:
```
生成迁移文件
python manage.py makemigrations archive
将迁移应用到数据库(SQLite)
python manage.py migrate
```
四、 后台管理界面快速配置
Django Admin可以让我们不写前端代码就拥有一个功能强大的管理后台。编辑archive/admin.py:
```
from django.contrib import admin
from .models import PropertyDeed, LendRecord
class LendRecordInline(admin.TabularInline): 在房产证页面内嵌显示其借阅记录
model = LendRecord
extra = 0
readonly_fields = ('operator', 'created_at')
can_delete = False
def save_model(self, request, obj, form, change):
if not obj.pk: 新建时自动设置操作员
obj.operator = request.user
super().save_model(request, obj, form, change)
@admin.register(PropertyDeed)
class PropertyDeedAdmin(admin.ModelAdmin):
list_display = ('deed_number', 'owner_name', 'property_address', 'area', 'created_by', 'created_at')
list_filter = ('created_at', 'created_by')
search_fields = ('deed_number', 'owner_name', 'id_number', 'property_address')
inlines = [LendRecordInline]
readonly_fields = ('created_by', 'created_at', 'last_modified')
def save_model(self, request, obj, form, change):
if not obj.pk: 新建时自动设置录入员
obj.created_by = request.user
super().save_model(request, obj, form, change)
@admin.register(LendRecord)
class LendRecordAdmin(admin.ModelAdmin):
list_display = ('deed', 'borrower', 'borrow_date', 'expected_return_date', 'status', 'operator')
list_filter = ('status', 'borrow_date', 'operator')
search_fields = ('deed__deed_number', 'borrower', 'borrow_department')
actions = ['mark_as_returned']
@admin.action(description='标记选中记录为已归还')
def mark_as_returned(self, request, queryset):
from datetime import date
updated = queryset.filter(status='out').update(status='returned', actual_return_date=date.today())
self.message_user(request, f'{updated}条记录已标记为归还。')
```
然后创建一个超级用户来登录后台:
```
python manage.py createsuperuser
```
根据提示输入用户名、邮箱和密码。完成后,运行开发服务器:
```
python manage.py runserver
```
在浏览器中访问 http://127.0.0.1:8000/admin,使用刚创建的超级用户登录,即可对房产证档案和借阅记录进行增删改查。后台已自动配置了录入员、操作员的自动填充,以及借阅记录的批量归还操作。
五、 构建简单的前端查询页面
后台仅供管理员使用,我们还需要一个给普通职员查询档案的简单页面。
5.1 创建视图
编辑archive/views.py:
```
from django.shortcuts import render
from django.db.models import Q
from .models import PropertyDeed
def deed_search(request):
"""房产证档案查询视图"""
query = request.GET.get('q', '')
results = []
if query:
支持按房产证号、产权人姓名、证件号码、地址进行模糊搜索
results = PropertyDeed.objects.filter(
Q(deed_number__icontains=query) |
Q(owner_name__icontains=query) |
Q(id_number__icontains=query) |
Q(property_address__icontains=query)
)[:50] 限制最多返回50条结果
return render(request, 'archive/search.html', {'results': results, 'query': query})
```
5.2 创建模板
首先在archive应用目录下创建templates/archive文件夹。然后在其中创建search.html文件:
```
房产证档案查询
房产证档案查询
{% if query %}

找到 {{ results|length }} 条相关记录。
{% if results %}
| 房产证号 |
产权人 |
证件号码 |
房产坐落 |
面积(㎡) |
录入时间 |
{% for deed in results %}
| {{ deed.deed_number }} |
{{ deed.owner_name }} |
{{ deed.id_number }} |
{{ deed.property_address|truncatechars:30 }} |
{{ deed.area }} |
{{ deed.created_at|date:"Y-m-d H:i" }} |
{% endfor %}
{% endif %}
{% endif %}
```
5.3 配置URL路由
首先在archive目录下创建urls.py文件:
```
from django.urls import path
from . import views
urlpatterns = [
path('search/', views.deed_search, name='deed_search'),
]
```
然后修改项目根core/urls.py,包含应用的URL:
```
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('archive.urls')), 将应用的路由包含进来
]
开发环境下提供媒体文件访问
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
现在重新运行python manage.py runserver,访问 http://127.0.0.1:8000/search/ 即可使用查询页面。
六、 生产环境部署
开发完成后,需要部署到Linux服务器(以Ubuntu 22.04为例)供内网使用。
6.1 服务器准备
通过SSH连接到你的服务器,执行以下命令:
```
更新系统
sudo apt update && sudo apt upgrade -y
安装必要的软件
sudo apt install -y python3-pip python3-venv nginx
安装数据库(如需使用PostgreSQL)
sudo apt install -y postgresql postgresql-contrib libpq-dev
```
6.2 上传代码与配置
使用FTP或Git将项目代码上传到服务器,例如/opt/property_deed_manager目录。在服务器上进入该目录,创建虚拟环境并安装依赖(同2.1节)。
6.3 配置生产环境设置
编辑core/settings.py,进行关键修改:
```
设置DEBUG为False
DEBUG = False
设置允许访问的域名/IP,替换为你服务器的IP或域名
ALLOWED_HOSTS = ['your-server-ip', 'localhost']
配置数据库(如需使用PostgreSQL)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'property_deed_db',
'USER': 'your_db_user',
'PASSWORD': 'your_strong_password',
'HOST': 'localhost',
'PORT': '5432',
}
}
收集静态文件
python manage.py collectstatic
```
6.4 使用Gunicorn作为应用服务器
在虚拟环境中安装Gunicorn:pip install gunicorn。创建一个系统服务来管理它:
```
sudo nano /etc/systemd/system/gunicorn.service
```
将以下内容粘贴进去,注意修改User, WorkingDirectory和ExecStart中的路径:
```
[Unit]
Description=gunicorn daemon for property deed manager
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/opt/property_deed_manager
ExecStart=/opt/property_deed_manager/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/opt/property_deed_manager/core.sock core.wsgi:application
[Install]
WantedBy=multi-user.target
```
保存退出后,启动并启用服务:
```
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
```
6.5 配置Nginx作为反向代理
编辑Nginx默认站点配置文件:
```
sudo nano /etc/nginx/sites-available/property_deed
```
粘贴以下配置,将server_name替换为你的IP:
```
server {
listen 80;
server_name your-server-ip;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /opt/property_deed_manager;
}
location /media/ {
root /opt/property_deed_manager;
}
location / {
include proxy_params;
proxy_pass http://unix:/opt/property_deed_manager/core.sock;
}
}
```
创建符号链接并重启Nginx:
```
sudo ln -s /etc/nginx/sites-available/property_deed /etc/nginx/sites-enabled/
sudo nginx -t 测试配置语法
sudo systemctl restart nginx
```
在服务器防火墙中开放80端口:sudo ufw allow 'Nginx HTTP'。现在,通过浏览器访问你的服务器IP,即可看到查询页面;访问http://your-server-ip/admin可登录管理后台。