diff --git a/backend/shop/migrations/0037_wechatuser_has_web_badge.py b/backend/shop/migrations/0037_wechatuser_has_web_badge.py
new file mode 100644
index 0000000..48c5f98
--- /dev/null
+++ b/backend/shop/migrations/0037_wechatuser_has_web_badge.py
@@ -0,0 +1,18 @@
+# Generated by Django 6.0.1 on 2026-02-26 10:54
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('shop', '0036_alter_wechatuser_options_wechatuser_order'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='wechatuser',
+ name='has_web_badge',
+ field=models.BooleanField(default=False, verbose_name='是否拥有Web徽章'),
+ ),
+ ]
diff --git a/backend/shop/models.py b/backend/shop/models.py
index 1c507ef..1f30c0b 100644
--- a/backend/shop/models.py
+++ b/backend/shop/models.py
@@ -27,6 +27,9 @@ class WeChatUser(models.Model):
skills = models.JSONField(default=list, verbose_name="专家技能", blank=True, help_text="格式: [{'icon': 'url', 'text': 'React'}, ...]")
order = models.IntegerField(default=0, verbose_name="排序权重", help_text="数字越小越靠前")
+ # 徽章标识
+ has_web_badge = models.BooleanField(default=False, verbose_name="是否拥有Web徽章")
+
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
diff --git a/backend/shop/serializers.py b/backend/shop/serializers.py
index 924343c..382f80a 100644
--- a/backend/shop/serializers.py
+++ b/backend/shop/serializers.py
@@ -25,8 +25,8 @@ class WeChatUserSerializer(serializers.ModelSerializer):
class Meta:
model = WeChatUser
- fields = ['id', 'openid', 'nickname', 'avatar_url', 'gender', 'country', 'province', 'city', 'phone_number', 'is_star', 'title', 'skills', 'is_admin', 'has_web_account']
- read_only_fields = ['id', 'openid', 'phone_number', 'is_star', 'title', 'skills', 'is_admin', 'has_web_account']
+ fields = ['id', 'openid', 'nickname', 'avatar_url', 'gender', 'country', 'province', 'city', 'phone_number', 'is_star', 'title', 'skills', 'is_admin', 'has_web_account', 'has_web_badge']
+ read_only_fields = ['id', 'openid', 'phone_number', 'is_star', 'title', 'skills', 'is_admin', 'has_web_account', 'has_web_badge']
def get_is_admin(self, obj):
# 检查是否关联了系统用户且具有管理员权限
diff --git a/backend/shop/views.py b/backend/shop/views.py
index 1b853f8..a360039 100644
--- a/backend/shop/views.py
+++ b/backend/shop/views.py
@@ -1109,6 +1109,9 @@ def wechat_login(request):
mp_user.avatar_url = phone_user.avatar_url
if mp_user.gender == 0 and phone_user.gender != 0:
mp_user.gender = phone_user.gender
+
+ # 标记拥有Web徽章
+ mp_user.has_web_badge = True
mp_user.save()
# 删除旧用户
diff --git a/miniprogram/src/pages/user/index.tsx b/miniprogram/src/pages/user/index.tsx
index 306acbc..4178e4c 100644
--- a/miniprogram/src/pages/user/index.tsx
+++ b/miniprogram/src/pages/user/index.tsx
@@ -331,11 +331,13 @@ export default function UserIndex() {
)}
- {/* 网页用户 */}
-
- 🌐
- 网页用户
-
+ {/* 网页用户徽章 - 仅在 has_web_badge 为 true 时显示 */}
+ {userInfo.has_web_badge && (
+
+ 🌐
+ 网页用户
+
+ )}
)}