一個全面的銷售點(POS)與庫存管理系統,支持暗黑模式/亮色模式及英語/中文語系。前端使用 Nuxt3 結合 TailwindCSS、Element-Plus 和 Tabulator-table 構建,後端採用 Python Django REST 框架配合 Maria DB 和 Django ORM。確保資料庫交易遵循 ACID 屬性。
專案框架決策:最初考慮使用 Nitro(Nuxt3 的默認伺服器端伺服器),但基於先前專案經驗決定不使用。之前使用 Nitro 搭配 Prisma 時,由於 Prisma 無法進行多表聯接,難以滿足銷售摘要和庫存日誌的需求。最後選擇 Django ORM,因其提供優秀的多表聯接和交易處理能力。
靈活欄位處理:不同的行業可能會在產品庫存中使用不同的欄位。例如,珠寶行業的庫存可能包含 CTS 和 karat,而時尚行業可能包括 size、color 和 material。類似地,電子行業可能會有 warranty_period、voltage 和 brand 等欄位。為了避免每次遷移數據庫結構的麻煩,我設計了使用 JSON 來存儲數據,同時仍然需要適配關係型數據庫。首先,我會提取所有必需的欄位以及一個可為空的 JSON 欄位作為產品主表。接著,我會創建一個新表,用於存儲額外欄位的名稱、類型、是否可為空等信息。然後,我會使用序列化工具從產品主表中提取 JSON 欄位,並根據額外欄位表的數據將其轉換為結構化的 JSON 格式。
class ProductMain(models.Model):
# ...
extraData = models.JSONField(null=True, blank=True)
class ProductExtraDetails(models.Model):
field_name = models.CharField(max_length=255, unique=True)
field_label = models.CharField(max_length=255)
field_type = models.CharField(max_length=255) # Type : string , int, float, date
field_required = models.BooleanField(default=False)
class Meta:
db_table = "product_extra_details"
class ProductListSerializer(serializers.Serializer):
# ...
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
extra_fields = ProductExtraDetails.objects.all()
field_type_mapping = {
'char': serializers.CharField,
'float': serializers.FloatField,
'integer': serializers.IntegerField,
'boolean': serializers.BooleanField,
}
# Dynamically add the extra fields to the serializer
for extra_field in extra_fields:
field_class = field_type_mapping.get(
extra_field.field_type, serializers.CharField)
field_kwargs = {
'required': False,
'allow_null': True,
'allow_blank': True if extra_field.field_type == 'char' else None,
'max_length': 255 if extra_field.field_type == 'char' else None
}
self.fields[extra_field.field_name] = field_class(**field_kwargs)
def to_representation(self, instance):
representation = super().to_representation(instance)
extra_data = instance.extraData or {}
for key, value in extra_data.items():
if key in self.fields:
representation[key] = value
return representation
中介軟體與代理處理:將伺服器分離到 Django 時,需創建中介軟體來處理代理。發現 Nuxt3 在生產環境構建後使用反向代理效果不佳。
暗黑主題穩定性:在 Nuxt3 中未遇到暗黑主題閃爍問題。發現 Nuxt3 在這方面有優化,因為色彩數據也包含在 Cookies 中,確保主題在伺服器端正確渲染。
Windows IIS 上的部署挑戰:在 Windows IIS 伺服器上部署此類新技術遇到重大困難。
遇到的問題:
npx nuxi build --preset=iis_node 時,某些必要的 Node 模組缺失。通過手動將開發環境的 node_modules 複製到伺服器上解決。結論:雖然 Vue3 的組件通信(emit / ref)非常出色,但 Nuxt3 在部署和支持方面相比 Next.js 存在挑戰。