专家
All checks were successful
Deploy to Server / deploy (push) Successful in 35s

This commit is contained in:
jeremygan2021
2026-02-24 17:52:12 +08:00
parent aac110ba1e
commit 46cf1727e1
12 changed files with 775 additions and 91 deletions

View File

@@ -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):

View 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='专家技能'),
),
]

View File

@@ -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='排序权重'),
),
]

View File

@@ -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):

View File

@@ -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)

View File

@@ -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)