This commit is contained in:
@@ -401,8 +401,8 @@ class OrderAdmin(ModelAdmin):
|
||||
)
|
||||
|
||||
@admin.register(WeChatUser)
|
||||
class WeChatUserAdmin(ModelAdmin):
|
||||
list_display = ('nickname', 'phone_number', 'is_star', 'title', 'avatar_display', 'gender_display', 'province', 'city', 'created_at')
|
||||
class WeChatUserAdmin(OrderableAdminMixin, ModelAdmin):
|
||||
list_display = ('nickname', 'phone_number', 'is_star', 'title', 'avatar_display', 'gender_display', 'province', 'city', 'created_at', 'order_actions')
|
||||
search_fields = ('nickname', 'openid', 'phone_number')
|
||||
list_filter = ('is_star', 'gender', 'province', 'city', 'created_at')
|
||||
readonly_fields = ('openid', 'unionid', 'session_key', 'created_at', 'updated_at')
|
||||
@@ -418,25 +418,38 @@ class WeChatUserAdmin(ModelAdmin):
|
||||
return choices.get(obj.gender, '未知')
|
||||
gender_display.short_description = "性别"
|
||||
|
||||
fieldsets = (
|
||||
('基本信息', {
|
||||
'fields': ('user', 'nickname', 'phone_number', 'avatar_url', 'gender')
|
||||
}),
|
||||
('专家认证', {
|
||||
'fields': ('is_star', 'title'),
|
||||
'description': '标记为明星技术用户/专家,将在社区中展示'
|
||||
}),
|
||||
('位置信息', {
|
||||
def get_fieldsets(self, request, obj=None):
|
||||
fieldsets = [
|
||||
('基本信息', {
|
||||
'fields': ('user', 'nickname', 'phone_number', 'avatar_url', 'gender')
|
||||
}),
|
||||
]
|
||||
|
||||
if obj and obj.is_star:
|
||||
fieldsets.append(('专家认证', {
|
||||
'fields': ('is_star', 'title', 'skills', 'order'),
|
||||
'description': '标记为明星技术用户/专家,将在社区中展示'
|
||||
}))
|
||||
else:
|
||||
fieldsets.append(('专家认证', {
|
||||
'fields': ('is_star',),
|
||||
'description': '标记为明星技术用户/专家,将在社区中展示。保存后若为专家用户,可进一步编辑专家信息。'
|
||||
}))
|
||||
|
||||
fieldsets.append(('位置信息', {
|
||||
'fields': ('country', 'province', 'city')
|
||||
}),
|
||||
('认证信息', {
|
||||
}))
|
||||
|
||||
fieldsets.append(('认证信息', {
|
||||
'fields': ('openid', 'unionid', 'session_key'),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
('时间信息', {
|
||||
}))
|
||||
|
||||
fieldsets.append(('时间信息', {
|
||||
'fields': ('created_at', 'updated_at')
|
||||
}),
|
||||
)
|
||||
}))
|
||||
|
||||
return fieldsets
|
||||
|
||||
@admin.register(Distributor)
|
||||
class DistributorAdmin(ModelAdmin):
|
||||
|
||||
18
backend/shop/migrations/0035_wechatuser_skills.py
Normal file
18
backend/shop/migrations/0035_wechatuser_skills.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 6.0.1 on 2026-02-24 09:21
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shop', '0034_remove_vccourse_schedule_time_vccourse_end_time_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='wechatuser',
|
||||
name='skills',
|
||||
field=models.JSONField(blank=True, default=list, help_text="格式: [{'icon': 'url', 'text': 'React'}, ...]", verbose_name='专家技能'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 6.0.1 on 2026-02-24 09:33
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shop', '0035_wechatuser_skills'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='wechatuser',
|
||||
options={'ordering': ['order', '-created_at'], 'verbose_name': '微信用户', 'verbose_name_plural': '微信用户管理'},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='wechatuser',
|
||||
name='order',
|
||||
field=models.IntegerField(default=0, help_text='数字越小越靠前', verbose_name='排序权重'),
|
||||
),
|
||||
]
|
||||
@@ -24,6 +24,8 @@ class WeChatUser(models.Model):
|
||||
# 明星技术用户/专家标识
|
||||
is_star = models.BooleanField(default=False, verbose_name="是否明星技术用户")
|
||||
title = models.CharField(max_length=50, default="技术专家", verbose_name="专家头衔", blank=True)
|
||||
skills = models.JSONField(default=list, verbose_name="专家技能", blank=True, help_text="格式: [{'icon': 'url', 'text': 'React'}, ...]")
|
||||
order = models.IntegerField(default=0, verbose_name="排序权重", help_text="数字越小越靠前")
|
||||
|
||||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||
@@ -34,6 +36,7 @@ class WeChatUser(models.Model):
|
||||
class Meta:
|
||||
verbose_name = "微信用户"
|
||||
verbose_name_plural = "微信用户管理"
|
||||
ordering = ['order', '-created_at']
|
||||
|
||||
|
||||
class Distributor(models.Model):
|
||||
|
||||
@@ -22,8 +22,8 @@ class CommissionLogSerializer(serializers.ModelSerializer):
|
||||
class WeChatUserSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = WeChatUser
|
||||
fields = ['id', 'openid', 'nickname', 'avatar_url', 'gender', 'country', 'province', 'city', 'phone_number', 'is_star', 'title']
|
||||
read_only_fields = ['id', 'openid', 'phone_number', 'is_star', 'title']
|
||||
fields = ['id', 'openid', 'nickname', 'avatar_url', 'gender', 'country', 'province', 'city', 'phone_number', 'is_star', 'title', 'skills']
|
||||
read_only_fields = ['id', 'openid', 'phone_number', 'is_star', 'title', 'skills']
|
||||
|
||||
class DistributorSerializer(serializers.ModelSerializer):
|
||||
user_info = WeChatUserSerializer(source='user', read_only=True)
|
||||
|
||||
@@ -1573,7 +1573,7 @@ class WeChatUserViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
"""
|
||||
获取明星技术用户列表
|
||||
"""
|
||||
stars = WeChatUser.objects.filter(is_star=True).order_by('-created_at')
|
||||
stars = WeChatUser.objects.filter(is_star=True).order_by('order', '-created_at')
|
||||
serializer = self.get_serializer(stars, many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user