更新admin 和 swagger

This commit is contained in:
jeremygan2021
2026-02-02 14:32:24 +08:00
parent 6af90017d5
commit c93bf9ef11
26 changed files with 407 additions and 53 deletions

View File

@@ -1,6 +1,8 @@
from django.contrib import admin
from django.utils.html import format_html
from django.db.models import Sum
from unfold.admin import ModelAdmin, TabularInline
from unfold.decorators import display
from .models import ESP32Config, Order, Salesperson, WeChatPayConfig, Service, ARService, ProductFeature
import qrcode
from io import BytesIO
@@ -11,13 +13,13 @@ admin.site.site_header = "量迹AI硬件销售管理后台"
admin.site.site_title = "量迹AI后台"
admin.site.index_title = "欢迎使用量迹AI管理系统"
class ProductFeatureInline(admin.TabularInline):
class ProductFeatureInline(TabularInline):
model = ProductFeature
extra = 1
fields = ('title', 'description', 'icon_name', 'icon_image', 'icon_url', 'order')
@admin.register(WeChatPayConfig)
class WeChatPayConfigAdmin(admin.ModelAdmin):
class WeChatPayConfigAdmin(ModelAdmin):
list_display = ('app_id', 'mch_id', 'is_active', 'notify_url')
list_filter = ('is_active',)
search_fields = ('app_id', 'mch_id')
@@ -34,7 +36,7 @@ class WeChatPayConfigAdmin(admin.ModelAdmin):
)
@admin.register(ESP32Config)
class ESP32ConfigAdmin(admin.ModelAdmin):
class ESP32ConfigAdmin(ModelAdmin):
list_display = ('name', 'chip_type', 'price', 'has_camera', 'has_microphone')
list_filter = ('chip_type', 'has_camera')
search_fields = ('name', 'description')
@@ -53,13 +55,16 @@ class ESP32ConfigAdmin(admin.ModelAdmin):
)
@admin.register(Service)
class ServiceAdmin(admin.ModelAdmin):
class ServiceAdmin(ModelAdmin):
list_display = ('title', 'created_at')
search_fields = ('title', 'description')
fieldsets = (
('基本信息', {
'fields': ('title', 'description', 'color')
}),
('价格与交付', {
'fields': ('price', 'unit', 'delivery_time', 'delivery_content')
}),
('图标', {
'fields': ('icon', 'icon_url'),
'description': '图标上传和URL二选一优先使用URL'
@@ -74,7 +79,7 @@ class ServiceAdmin(admin.ModelAdmin):
)
@admin.register(ARService)
class ARServiceAdmin(admin.ModelAdmin):
class ARServiceAdmin(ModelAdmin):
list_display = ('title', 'created_at')
search_fields = ('title', 'description')
fieldsets = (
@@ -88,7 +93,7 @@ class ARServiceAdmin(admin.ModelAdmin):
)
@admin.register(Salesperson)
class SalespersonAdmin(admin.ModelAdmin):
class SalespersonAdmin(ModelAdmin):
list_display = ('name', 'code', 'total_sales', 'view_promotion_url')
search_fields = ('name', 'code')
readonly_fields = ('promotion_qr_code', 'promotion_url_display', 'total_sales_display')
@@ -100,12 +105,11 @@ class SalespersonAdmin(admin.ModelAdmin):
)
return queryset
@display(description="累计销售额 (已支付)", ordering='_total_sales')
def total_sales(self, obj):
# 仅计算已支付的订单
paid_sales = obj.orders.filter(status='paid').aggregate(total=Sum('total_price'))['total']
return f"¥{paid_sales or 0:.2f}"
total_sales.short_description = "累计销售额 (已支付)"
total_sales.admin_order_field = '_total_sales'
def total_sales_display(self, obj):
return self.total_sales(obj)
@@ -116,15 +120,16 @@ class SalespersonAdmin(admin.ModelAdmin):
base_url = "http://localhost:5173"
return f"{base_url}/?ref={obj.code}"
@display(description="推广链接")
def view_promotion_url(self, obj):
url = self.promotion_url(obj)
return format_html('<a href="{}" target="_blank">打开推广链接</a>', url)
view_promotion_url.short_description = "推广链接"
return format_html('<a href="{}" target="_blank" class="button">打开推广链接</a>', url)
def promotion_url_display(self, obj):
return self.promotion_url(obj)
promotion_url_display.short_description = "完整推广链接"
@display(description="推广二维码")
def promotion_qr_code(self, obj):
if not obj.code:
return "请先保存以生成二维码"
@@ -144,9 +149,7 @@ class SalespersonAdmin(admin.ModelAdmin):
img.save(buffer, format="PNG")
img_str = base64.b64encode(buffer.getvalue()).decode()
return format_html('<img src="data:image/png;base64,{}" width="200" height="200" />', img_str)
promotion_qr_code.short_description = "推广二维码"
return format_html('<img src="data:image/png;base64,{}" width="200" height="200" class="qr-code" />', img_str)
fieldsets = (
('基本信息', {
@@ -161,7 +164,7 @@ class SalespersonAdmin(admin.ModelAdmin):
)
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
class OrderAdmin(ModelAdmin):
list_display = ('id', 'customer_name', 'config', 'total_price', 'status', 'salesperson', 'created_at')
list_filter = ('status', 'salesperson', 'created_at')
search_fields = ('id', 'customer_name', 'phone_number', 'wechat_trade_no')