Skip to main content

获取当前用户状态查看网盘信息

本节课主要介绍如何在用户登录状态下,判断用户是否购买会员卡以及显示网盘地址信息的功能实现。

1. 获取用户状态

首先,我们需要判断当前用户是否已登录。如果用户已登录,我们需要查看用户是否已经购买升级。

在profile表中有一个字段is_upgrade, 如果购买会员,则字段是为1,此外,还可以根据expire_time判断会员是否过期。如下图所示。

图62-查看用户是否升级

接下来,我们可以使用djoser接口,发送一个GET请求到/users/me接口来获取用户信息。

使用postman测试该接口,示例如下:

图62-获取用户信息

但是这个接口只有用户名和邮箱2个字段值,所以,我们需要重写它。

重写获取用户信息接口

在dx_movie/dx_movie/settings.py中配置下信息:

dx_movie/dx_movie/settings.py
# Djoser配置
DJOSER = {
'USER_ID_FIELD': 'username',
'LOGIN_FIELD': 'email',
'SEND_ACTIVATION_EMAIL': True,
'ACTIVATION_URL': 'activate/{uid}/{token}',
'SEND_CONFIRMATION_EMAIL': True,
'PASSWORD_RESET_CONFIRM_URL': 'password_reset/{uid}/{token}',
'PASSWORD_RESET_CONFIRM_RETYPE': True,
'PASSWORD_RESET_SHOW_EMAIL_NOT_FOUND': True,
'SET_PASSWORD_RETYPE': True,
'SERIALIZERS': {
"user_create": "account.serializers.CustomUserCreateSerializer",
# 新增代码
"current_user": "account.serializers.CustomUserSerializer",
}
}

接下来,在account/serializers.py中创建CustomUserSerializer类,代码如下:

dx_movie/account/serializers.py
from djoser.serializers import UserCreateSerializer, UserSerializer

class ProfileSerializer(serializers.ModelSerializer):

class Meta:
model = Profile
fields = "__all__"

class CustomUserSerializer(UserSerializer):
profile = ProfileSerializer(read_only=True)

class Meta(UserSerializer.Meta):
fields = (*UserSerializer.Meta.fields , 'profile')
代码解析

这段Django REST Framework (DRF) 代码展示了如何使用Djoser库中的序列化器(Serializers)来扩展用户模型的序列化器,并将用户的个人资料信息嵌入到用户序列化器中。以下是详细的解析:

引入Djoser序列化器

  • from djoser.serializers import UserCreateSerializer, UserSerializer:这行代码从Djoser库中导入了两个序列化器类:UserCreateSerializer(用于创建用户)和UserSerializer(用于用户的序列化)。Djoser是一个为Django设计的RESTful API框架,它简化了用户管理的许多常见任务,例如注册、登录、密码重置等。

ProfileSerializer类

  • class ProfileSerializer(serializers.ModelSerializer):定义了一个名为ProfileSerializer的类,该类继承自DRF的ModelSerializer。这是一个模型序列化器,用于将Profile模型实例转换为JSON格式,以及将JSON格式的数据转换回模型实例。

  • model = Profile:指定了序列化器使用的模型是Profile。这意味着ProfileSerializer将处理Profile模型的实例。

  • fields = "__all__":指定序列化器包含的字段。"__all__"表示序列化器将包含Profile模型中定义的所有字段。

CustomUserSerializer类

  • class CustomUserSerializer(UserSerializer):定义了一个名为CustomUserSerializer的类,继承自Djoser的UserSerializer。这个自定义序列化器的目的是扩展默认的用户序列化器,添加额外的字段或逻辑。

  • profile = ProfileSerializer(read_only=True):在CustomUserSerializer中添加了一个名为profile的字段,使用上面定义的ProfileSerializer来序列化。read_only=True参数表示这个字段仅用于序列化输出(即转换为JSON),不用于反序列化(即从JSON转换回模型实例)。这通常用于嵌入关联模型的信息。

  • fields = (*UserSerializer.Meta.fields , 'profile'):在Meta类中,通过扩展UserSerializer.Meta.fields列表来指定序列化器应包含的字段。*UserSerializer.Meta.fields表示包含父类UserSerializer中定义的所有字段,'profile'是我们新添加的字段,表示除了用户模型的默认字段外,还包括用户的Profile信息。

这段代码的核心是通过自定义用户序列化器来扩展用户模型的API表示,包含用户的个人资料信息。这种做法在构建需要返回用户相关额外信息的API时非常有用。

再次请求接口,运行效果如下图所示。 图62-获取profile信息

info

如果指向获取profile表中指定字段,那么,在ProfileSerializer的filelds中设置即可。

2. 判断是否购买会员卡

接下来,我们需要在电影详情页面判断用户是否购买了会员卡。在check_member_status()函数时,使用axios发送一个GET请求到/users/me接口来获取用户信息。 具体判断逻辑如下:

frontend/src/views/MovieDetail.vue
export default {
name: "MovieDetail",
data() {
return {
movie: {},
collectStatus: false,
collectMessage: "",
downloadInfo: false,
userInfo: "",
};
},

// 判断用户状态
check_member_status() {
if (!this.$store.state.isLogin) {
showMessage("请先登录!");
return;
}
axios
.get('/api/users/me')
.then(response => {
this.userInfo = response.data
if (this.userInfo.profile.is_upgrade) {
this.downloadInfo = true
}
})
}

如果用户已购买会员卡,我们显示网盘地址信息。可以将downloadInfo字段设置为true来显示网盘地址,否则不显示。

this.downloadInfo = true;

通过以上步骤,我们可以实现在用户登录状态下根据用户购买会员卡状态来显示网盘地址或提示购买会员卡的功能。

目前我们还没有购买会员卡功能,为了测试可以手动将profile表中的is_upgreade字段的值修改为1。如下图所示。

图62-查看用户升级状态

接下来,再次点击"网盘地址信息", 就会显示网盘信息了。 图62-显示网盘信息

如果用户还没有购买会员卡,需要跳转到会员卡页面。

下节课我们将继续讲解会员卡购买页面的实现。