本系统采用B/S架构,前端负责用户交互,后端处理业务逻辑与数据,数据库存储所有档案信息。这种架构便于药店各门店通过浏览器访问,无需单独安装客户端。
后端使用Python 3.9 + Django 4.2,数据库使用PostgreSQL 14,前端使用Vue 3 + Element Plus。以下是具体安装命令:
在Ubuntu 22.04系统上执行:
``` sudo apt update sudo apt install python3.9 python3.9-venv postgresql postgresql-contrib sudo -u postgres psql -c "CREATE DATABASE pharmacy_archive;" sudo -u postgres psql -c "CREATE USER archive_user WITH PASSWORD 'YourSecurePassword123!';" sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE pharmacy_archive TO archive_user;" ```创建项目目录并设置虚拟环境:
``` mkdir pharmacy_archive_system cd pharmacy_archive_system python3.9 -m venv venv source venv/bin/activate pip install django==4.2 psycopg2-binary django-rest-framework django-admin startproject archive_core . ```药店档案的核心是药品信息、供应商档案、员工档案和顾客健康档案。需要设计符合GSP规范的数据结构。
执行以下命令创建应用:
``` python manage.py startapp archive ```编辑archive/models.py文件,创建核心模型:
``` from django.db import models from django.contrib.auth.models import User class DrugArchive(models.Model): drug_code = models.CharField(max_length=50, unique=True) 药品编码 common_name = models.CharField(max_length=200) 通用名 trade_name = models.CharField(max_length=200, blank=True) 商品名 specification = models.CharField(max_length=100) 规格 manufacturer = models.CharField(max_length=200) 生产企业 approval_number = models.CharField(max_length=100) 批准文号 production_batch = models.CharField(max_length=50) 生产批号 production_date = models.DateField() 生产日期 expiry_date = models.DateField() 有效期至 storage_condition = models.CharField(max_length=100) 贮藏条件 purchase_price = models.DecimalField(max_digits=10, decimal_places=2) 购进价 retail_price = models.DecimalField(max_digits=10, decimal_places=2) 零售价 supplier = models.ForeignKey('Supplier', on_delete=models.PROTECT) 供应商 quality_documents = models.FileField(upload_to='quality_docs/', blank=True) 质量文件 created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: indexes = [ models.Index(fields=['drug_code']), models.Index(fields=['expiry_date']), ] class Supplier(models.Model): name = models.CharField(max_length=200) license_number = models.CharField(max_length=100) 许可证号 business_license = models.FileField(upload_to='supplier_licenses/') 营业执照 gmp_certificate = models.FileField(upload_to='gmp_certs/', blank=True) GMP证书 contact_person = models.CharField(max_length=100) contact_phone = models.CharField(max_length=20) qualification_valid_until = models.DateField() 资质有效期至 class CustomerHealthArchive(models.Model): customer_id = models.CharField(max_length=50, unique=True) full_name = models.CharField(max_length=100) id_number = models.CharField(max_length=18) 身份证号 date_of_birth = models.DateField() contact_phone = models.CharField(max_length=20) drug_allergies = models.TextField(blank=True) 药物过敏史 chronic_diseases = models.TextField(blank=True) 慢性病史 prescription_records = models.JSONField(default=dict) 处方记录 created_at = models.DateTimeField(auto_now_add=True) class Meta: indexes = [ models.Index(fields=['customer_id']), models.Index(fields=['id_number']), ] ```执行以下命令完成数据库迁移:
``` python manage.py makemigrations archive python manage.py migrate python manage.py createsuperuser ```按照提示输入管理员用户名、邮箱和密码。

使用Django REST Framework创建RESTful API,供前端调用。
创建archive/serializers.py文件:
``` from rest_framework import serializers from .models import DrugArchive, Supplier, CustomerHealthArchive class SupplierSerializer(serializers.ModelSerializer): class Meta: model = Supplier fields = '__all__' class DrugArchiveSerializer(serializers.ModelSerializer): supplier_info = SupplierSerializer(source='supplier', read_only=True) class Meta: model = DrugArchive fields = '__all__' read_only_fields = ['created_at', 'updated_at'] class CustomerHealthArchiveSerializer(serializers.ModelSerializer): class Meta: model = CustomerHealthArchive fields = '__all__' read_only_fields = ['created_at'] ```创建archive/views.py文件:
``` from rest_framework import viewsets, filters from django_filters.rest_framework import DjangoFilterBackend from .models import DrugArchive, Supplier, CustomerHealthArchive from .serializers import DrugArchiveSerializer, SupplierSerializer, CustomerHealthArchiveSerializer class SupplierViewSet(viewsets.ModelViewSet): queryset = Supplier.objects.all() serializer_class = SupplierSerializer filter_backends = [DjangoFilterBackend, filters.SearchFilter] filterset_fields = ['name', 'license_number'] search_fields = ['name', 'contact_person'] class DrugArchiveViewSet(viewsets.ModelViewSet): queryset = DrugArchive.objects.all().select_related('supplier') serializer_class = DrugArchiveSerializer filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter] filterset_fields = ['manufacturer', 'supplier'] search_fields = ['drug_code', 'common_name', 'trade_name', 'approval_number'] ordering_fields = ['expiry_date', 'created_at', 'retail_price'] class CustomerHealthArchiveViewSet(viewsets.ModelViewSet): queryset = CustomerHealthArchive.objects.all() serializer_class = CustomerHealthArchiveSerializer filter_backends = [DjangoFilterBackend, filters.SearchFilter] filterset_fields = ['drug_allergies'] search_fields = ['customer_id', 'full_name', 'id_number', 'contact_phone'] ```创建archive/urls.py文件:
``` from django.urls import path, include from rest_framework.routers import DefaultRouter from . import views router = DefaultRouter() router.register(r'suppliers', views.SupplierViewSet) router.register(r'drugs', views.DrugArchiveViewSet) router.register(r'customers', views.CustomerHealthArchiveViewSet) urlpatterns = [ path('', include(router.urls)), ] ```在项目主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('api/', include('archive.urls')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ```使用Vue 3和Element Plus快速构建管理界面。
在前端目录中执行:
``` npm init vue@latest pharmacy-archive-frontend cd pharmacy-archive-frontend npm install npm install element-plus axios vue-router npm install --save-dev sass ```创建src/components/DrugArchive.vue文件:
```将现有Excel格式的药品数据导入到新系统中。
创建import_drugs.py脚本:
``` import pandas as pd import sys import os import django sys.path.append('/path/to/your/project') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'archive_core.settings') django.setup() from archive.models import DrugArchive, Supplier def import_from_excel(file_path): 读取Excel文件 df = pd.read_excel(file_path, dtype=str) 确保必要的列存在 required_columns = ['药品编码', '通用名', '规格', '生产企业', '批准文号'] for col in required_columns: if col not in df.columns: print(f"错误:缺少必要列 {col}") return success_count = 0 error_count = 0 for index, row in df.iterrows(): try: 处理供应商信息 supplier_name = row.get('供应商名称', '默认供应商') supplier, created = Supplier.objects.get_or_create( name=supplier_name, defaults={ 'license_number': row.get('供应商许可证号', ''), 'contact_person': row.get('供应商联系人', ''), 'contact_phone': row.get('供应商电话', '
档案整理行业认证,这玩意儿到底是不是你的职场“硬通货”?