我们将使用Python + Django + SQLite技术栈,这套组合对初学者友好,且能快速部署。
首先确保你的系统已安装Python 3.8或更高版本。打开终端执行以下命令:
```bash 检查Python版本 python --version 安装Django pip install django==4.2.7 安装额外依赖 pip install django-filter==23.3 pillow==10.0.0 reportlab==4.0.4 ```
在合适目录下执行:
```bash 创建Django项目 django-admin startproject archive_catalog 进入项目目录 cd archive_catalog 创建档案管理应用 python manage.py startapp archive ```
此时你的目录结构应该是:
```bash archive_catalog/ ├── manage.py ├── archive_catalog/ │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── archive/ ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── tests.py └── views.py ```
编辑archive/models.py文件,这是整个系统的核心数据结构。
```python from django.db import models from django.utils import timezone class ArchiveCategory(models.Model): """档案分类""" code = models.CharField(max_length=20, unique=True, verbose_name="分类代码") name = models.CharField(max_length=100, verbose_name="分类名称") parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, verbose_name="上级分类") class Meta: verbose_name = "档案分类" verbose_name_plural = verbose_name def __str__(self): return f"{self.code} - {self.name}" class ArchiveItem(models.Model): """档案条目""" STATUS_CHOICES = [ ('active', '在库'), ('borrowed', '借出'), ('archived', '已归档'), ('destroyed', '已销毁'), ] archive_number = models.CharField(max_length=50, unique=True, verbose_name="档案编号") title = models.CharField(max_length=200, verbose_name="档案标题") category = models.ForeignKey(ArchiveCategory, on_delete=models.PROTECT, verbose_name="所属分类") keywords = models.CharField(max_length=300, blank=True, verbose_name="关键词") description = models.TextField(blank=True, verbose_name="档案描述") create_date = models.DateField(default=timezone.now, verbose_name="建档日期") storage_location = models.CharField(max_length=100, verbose_name="存放位置") status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active', verbose_name="状态") file_path = models.FileField(upload_to='archives/%Y/%m/', blank=True, verbose_name="电子文件") class Meta: verbose_name = "档案条目" verbose_name_plural = verbose_name ordering = ['-create_date'] def __str__(self): return f"{self.archive_number} - {self.title}" ```
编辑archive_catalog/settings.py文件,在INSTALLED_APPS列表中添加'archive':
```python INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'archive', 添加这一行 ] ```
然后执行数据库迁移:
```bash 生成迁移文件 python manage.py makemigrations archive 应用迁移 python manage.py migrate ```
Django自带强大的后台管理功能,我们只需简单配置即可使用。
编辑archive/admin.py文件:
```python from django.contrib import admin from .models import ArchiveCategory, ArchiveItem class ArchiveCategoryAdmin(admin.ModelAdmin): list_display = ['code', 'name', 'parent'] search_fields = ['code', 'name'] list_filter = ['parent'] class ArchiveItemAdmin(admin.ModelAdmin): list_display = ['archive_number', 'title', 'category', 'status', 'create_date'] search_fields = ['archive_number', 'title', 'keywords'] list_filter = ['status', 'category', 'create_date'] readonly_fields = ['create_date'] fieldsets = ( ('基本信息', { 'fields': ('archive_number', 'title', 'category', 'keywords') }), ('详细信息', { 'fields': ('description', 'storage_location', 'status', 'file_path') }), ) admin.site.register(ArchiveCategory, ArchiveCategoryAdmin) admin.site.register(ArchiveItem, ArchiveItemAdmin) ```
```bash python manage.py createsuperuser ```
按照提示输入用户名、邮箱和密码。
编辑archive/views.py:
```python from django.shortcuts import render from django.views.generic import ListView, DetailView from django.db.models import Q from .models import ArchiveItem class ArchiveListView(ListView): model = ArchiveItem template_name = 'archive/list.html' context_object_name = 'archives' paginate_by = 20 def get_queryset(self): queryset = super().get_queryset() search_query = self.request.GET.get('q') if search_query: queryset = queryset.filter( Q(archive_number__icontains=search_query) | Q(title__icontains=search_query) | Q(keywords__icontains=search_query) ) return queryset class ArchiveDetailView(DetailView): model = ArchiveItem template_name = 'archive/detail.html' context_object_name = 'archive' ```
首先在archive目录下创建urls.py文件:
```python
from django.urls import path
from . import views
urlpatterns = [
path('', views.ArchiveListView.as_view(), name='archive_list'),
path('

然后修改项目根目录的archive_catalog/urls.py:
```python 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) ```
在archive目录下创建templates/archive/base.html:
```html
创建templates/archive/list.html:
```html {% extends 'archive/base.html' %} {% block content %}
分类: {{ archive.category.name }} | 状态: {{ archive.get_status_display }}
建档日期: {{ archive.create_date }} | 存放位置: {{ archive.storage_location }}
{% if archive.keywords %}关键词: {{ archive.keywords }}
{% endif %}暂无档案记录
{% endfor %} {% if is_paginated %}创建templates/archive/detail.html:
```html {% extends 'archive/base.html' %} {% block title %}{{ archive.title }} - 档案详情{% endblock %} {% block content %}
| 档案编号: | {{ archive.archive_number }} |
|---|---|
| 所属分类: | {{ archive.category.name }} |
| 建档日期: | {{ archive.create_date }} |
| 存放位置: | {{ archive.storage_location }} |
| 当前状态: | {{ archive.get_status_display }} |
| 关键词: | {{ archive.keywords }} |
{{ archive.description }}
{% endif %} {% if archive.file_path %}在archive_catalog/settings.py末尾添加:
```python import os 静态文件配置 STATIC_URL = 'static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] 媒体文件配置 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 创建必要的目录 os.makedirs(MEDIA_ROOT, exist_ok=True) os.makedirs(os.path.join(BASE_DIR, 'static'), exist_ok=True) ```
```bash 启动开发服务器 python manage.py runserver ```
打开浏览器访问http://127.0.0.1:8000/查看档案列表,访问http://127.0.0.1:8000/admin/进入管理后台。
编辑archive_catalog/settings.py,修改以下配置:
```python 关闭调试模式 DEBUG = False 设置允许的主机 ALLOWED_HOSTS = ['your-domain.com', 'www.your-domain.com'] 使用PostgreSQL数据库(推荐) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'archive_db', 'USER': 'your_username', 'PASSWORD': 'your_password', 'HOST': 'localhost', 'PORT': '5432', } } 静态文件收集目录 STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') ```
执行以下命令准备部署:
```bash 收集静态文件 python manage.py collectstatic 安装生产环境依赖 pip install gunicorn psycopg2-binary ```
```bash 启动Gunicorn gunicorn archive_catalog.wsgi:application --bind 0.0.0.0:8000 --workers 3 ```