在开始搭建前,你需要准备一台运行Linux的服务器,配置不低于2核4G。我们将使用Nginx、MySQL和Python作为核心技术栈。
通过SSH连接到你的服务器。执行以下命令更新系统并安装基础工具:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget vim git unzip
我们选择MySQL 8.0作为数据库。安装命令如下:
sudo apt install -y mysql-server mysql-client
安装完成后,运行安全配置脚本:
sudo mysql_secure_installation
按照提示设置root密码,并选择默认的安全选项。接着登录MySQL,创建专用数据库和用户:
sudo mysql -u root -p
在MySQL命令行中执行:
CREATE DATABASE cpa_archive CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'cpa_admin'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
GRANT ALL PRIVILEGES ON cpa_archive. TO 'cpa_admin'@'localhost';
FLUSH PRIVILEGES;
EXIT;
注意:请务必将'YourStrongPassword123!'替换为你自己的高强度密码。
我们使用Django框架开发后端,因为它能快速构建安全、可维护的管理系统。
安装Python 3.9和虚拟环境工具:
sudo apt install -y python3.9 python3.9-venv python3-pip
创建项目目录并初始化虚拟环境:
mkdir -p ~/cpa_project && cd ~/cpa_project
python3.9 -m venv venv
source venv/bin/activate
安装必要的Python包:
pip install django==4.2 pillow mysqlclient django-cors-headers
创建Django项目和应用:
django-admin startproject cpa_backend .
python manage.py startapp archive
编辑cpa_backend/settings.py文件,找到DATABASES部分,修改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cpa_archive',
'USER': 'cpa_admin',
'PASSWORD': 'YourStrongPassword123!',
'HOST': 'localhost',
'PORT': '3306',
}
}
在INSTALLED_APPS列表中添加'archive'和'corsheaders'。在MIDDLEWARE列表的开头添加'corsheaders.middleware.CorsMiddleware'。接着设置允许的域名和文件存储路径:
ALLOWED_HOSTS = ['your_server_ip', 'localhost']
CORS_ALLOW_ALL_ORIGINS = True
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 CertificateArchive(models.Model):
CERT_STATUS = (
('valid', '有效'),
('expired', '已过期'),
('suspended', '暂停'),
)
holder_name = models.CharField(max_length=100, verbose_name='持证人姓名')
certificate_number = models.CharField(max_length=50, unique=True, verbose_name='证书编号')
issue_date = models.DateField(verbose_name='发证日期')
expiry_date = models.DateField(verbose_name='到期日期')
status = models.CharField(max_length=20, choices=CERT_STATUS, default='valid', verbose_name='状态')
digital_copy = models.FileField(upload_to='certificates/', verbose_name='数字副本', null=True, blank=True)
remarks = models.TextField(verbose_name='备注', blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'certificate_archive'
ordering = ['-created_at']
def __str__(self):
return f"{self.holder_name} - {self.certificate_number}"
生成并执行数据库迁移:
python manage.py makemigrations archive
python manage.py migrate
编辑archive/admin.py,注册模型到管理后台:
from django.contrib import admin
from .models import CertificateArchive
@admin.register(CertificateArchive)
class CertificateArchiveAdmin(admin.ModelAdmin):
list_display = ('holder_name', 'certificate_number', 'issue_date', 'expiry_date', 'status')
search_fields = ('holder_name', 'certificate_number')
list_filter = ('status', 'issue_date')
date_hierarchy = 'issue_date'
创建超级用户以访问管理后台:
python manage.py createsuperuser按照提示输入用户名、邮箱和密码。
接下来,为前端提供数据接口。编辑archive/views.py:
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import CertificateArchive
from .serializers import CertificateArchiveSerializer
from rest_framework import status
@api_view(['GET'])
def certificate_list(request):
certificates = CertificateArchive.objects.all()
serializer = CertificateArchiveSerializer(certificates, many=True)
return Response(serializer.data)
创建archive/serializers.py文件:

from rest_framework import serializers
from .models import CertificateArchive
class CertificateArchiveSerializer(serializers.ModelSerializer):
class Meta:
model = CertificateArchive
fields = '__all__'
配置URL路由。编辑archive/urls.py(如不存在则创建):
from django.urls import path
from . import views
urlpatterns = [
path('api/certificates/', views.certificate_list, name='certificate_list'),
]
在项目主cpa_backend/urls.py中包含此路由:
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('archive/', include('archive.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我们使用一个轻量级的前端模板来快速构建管理界面。
在Django设置文件中,确保STATIC配置正确:
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
运行命令收集静态文件:
python manage.py collectstatic所有静态文件将被收集到staticfiles目录。
安装Nginx:
sudo apt install -y nginx
创建Nginx配置文件:
sudo vim /etc/nginx/sites-available/cpa_archive将以下配置完整复制进去,注意将your_server_ip替换为你的实际服务器IP:
server {
listen 80;
server_name your_server_ip;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static/ {
alias /home/your_username/cpa_project/staticfiles/;
expires 30d;
}
location /media/ {
alias /home/your_username/cpa_project/media/;
expires 30d;
}
}
启用该配置并重启Nginx:
sudo ln -s /etc/nginx/sites-available/cpa_archive /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
使用Gunicorn作为生产环境的WSGI服务器。首先在虚拟环境中安装:
pip install gunicorn
创建一个Gunicorn服务文件:
sudo vim /etc/systemd/system/gunicorn_cpa.service写入以下内容,注意将your_username替换为你的系统用户名:
[Unit]
Description=Gunicorn service for CPA Archive
After=network.target
[Service]
User=your_username
Group=www-data
WorkingDirectory=/home/your_username/cpa_project
Environment="PATH=/home/your_username/cpa_project/venv/bin"
ExecStart=/home/your_username/cpa_project/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 cpa_backend.wsgi:application
[Install]
WantedBy=multi-user.target
启动并启用Gunicorn服务:
sudo systemctl start gunicorn_cpa
sudo systemctl enable gunicorn_cpa
配置防火墙,仅开放必要端口:
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw enable
为Django设置更强的密钥。编辑settings.py,找到SECRET_KEY,使用以下命令生成一个新的密钥并替换:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
在管理后台添加操作日志功能。编辑archive/models.py,添加一个简单的日志模型:
class OperationLog(models.Model):
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
action = models.CharField(max_length=200, verbose_name='操作内容')
timestamp = models.DateTimeField(auto_now_add=True)
ip_address = models.GenericIPAddressField(null=True, blank=True)
执行迁移以创建日志表:
python manage.py makemigrations && python manage.py migrate现在,你的系统已经部署完成。在浏览器中访问以下地址:
登录管理后台后,你可以:
至此,一个具备基础增删改查、文件上传和API接口的注册会计师证档案管理软件已部署完毕。后续可根据需要进一步开发证书到期自动提醒、批量导入导出等高级功能。