在用户登录/注册成功后,展示会员信息,更新会员信息。
主要实现两部分业务:
会员中心页,替换掉原本的练习代码。
// src/pages/my/my.vue
黑马程序员
更新头像昵称
未登录
点击登录账号
设置
我的订单
查看全部订单
{{ item.text }}
封装猜你喜欢组合式函数
// src/composables/index.ts
import type { XtxGuessInstance } from '@/types/components'
import { ref } from 'vue'
/**
* 猜你喜欢组合式函数
*/
export const useGuessList = () => {
// 获取猜你喜欢组件实例
const guessRef = ref()
// 滚动触底事件
const onScrolltolower = () => {
guessRef.value?.getMore()
}
// 返回 ref 和事件处理函数
return { guessRef, onScrolltolower }
}
会员中心页(我的):渲染用户头像,昵称,完善猜你喜欢分页加载。
// src/pages/my/my.vue
{{ memberStore.profile.nickname || memberStore.profile.account }}
更新头像昵称
...省略
会员模块的二级页面,按模块处理成分包页面,有以下好处:
::: tip 温馨提示
通过 VS Code 插件 uni-create-view 可以快速新建分包页面,自动配置分包路由。
:::
当用户进入【我的】页面时,由框架自动预下载【会员模块】的分包,提升进入后续分包页面时的启动速度。
// src/pages.json
{
// ...省略
// 分包加载规则
"subPackages": [
{
// 子包的根目录
"root": "pagesMember",
// 页面路径和窗口表现
"pages": [
{
"path": "settings/settings",
"style": {
"navigationBarTitleText": "设置"
}
}
]
}
],
// 分包预下载规则
"preloadRule": {
// [!code ++]
"pages/my/my": {
// [!code ++]
"network": "all", // [!code ++]
"packages": ["pagesMember"] // [!code ++]
} // [!code ++]
} // [!code ++]
}
设置页:src/pagesMember/settings/settings.vue
我的收货地址
关于小兔鲜儿
退出登录
设置页需实现以下业务:
参考效果
参考代码
// src/pagesMember/settings/settings.vue
我的收货地址
关于小兔鲜儿
退出登录
用户可以对会员信息进行更新操作,涉及到表单数据提交、图片读取、文件上传等知识点。
会员信息页,处理成分包页面:src/pagesMember/profile/profile.vue
个人信息
点击修改头像
账号
账号名
昵称
性别
生日
2000-01-01
请选择日期
城市
广东省广州市天河区
请选择城市
职业
需要登录后才能获取用户个人信息,在 项目起步 模块已封装请求拦截器,拦截器中自动添加 token
,无需再手动添加。
接口调用
接口地址:/member/profile
请求方式:GET
登录权限: 是
请求参数:无
接口封装
src/services/profile.ts
import type { ProfileDetail } from '@/types/member'
import { http } from '@/utils/http'
/**
* 获取个人信息
*/
export const getMemberProfileAPI = () => {
return http({
method: 'GET',
url: '/member/profile',
})
}
类型声明
src/types/member.d.ts
/** 个人信息 用户详情信息 */
export type ProfileDetail = {
/** 用户ID */
id: number
/** 头像 */
avatar: string
/** 账户名 */
account: string
/** 昵称 */
nickname?: string
/** 性别 */
gender?: Gender
/** 生日 */
birthday?: string
/** 省市区 */
fullLocation?: string
/** 职业 */
profession?: string
}
/** 性别 */
export type Gender = '女' | '男'
类型声明封装升级(可选),提取用户信息通用部分,再复用类型。
/** 封装通用信息 */
type BaseProfile = {
/** 用户ID */
id: number
/** 头像 */
avatar: string
/** 账户名 */
account: string
/** 昵称 */
nickname?: string
}
/** 小程序登录 登录用户信息 */
export type LoginResult = BaseProfile & {
/** 用户ID */
id: number
/** 头像 */
avatar: string
/** 账户名 */
account: string
/** 昵称 */
nickname?: string
/** 手机号 */
mobile: string
/** 登录凭证 */
token: string
}
/** 个人信息 用户详情信息 */
export type ProfileDetail = BaseProfile & {
/** 性别 */
gender?: Gender
/** 生日 */
birthday?: string
/** 省市区 */
fullLocation?: string
/** 职业 */
profession?: string
}
/** 性别 */
export type Gender = '女' | '男'
会员信息页
个人信息
点击修改头像
账号
{{ profile?.account }}
昵称
性别
出生日期
{{ profile?.birthday }}
请选择日期
城市
{{ profile.fullLocation }}
请选择城市
职业
uni.chooseMedia()
读取用户相册的照片或者拍照。uni.uploadFile()
上传用户图片。接口信息
接口地址:/member/profile/avatar
请求方式:POST
登录权限: 是
请求参数:
Body
字段名称 |
是否必须 |
默认值 |
备注 |
name |
是 |
无 |
后端数据字段名 |
filePath |
是 |
无 |
新头像 |
参考代码
更新会员头像
Axios + FormData
wx.uploadFile()
uni.uploadFile()
能自动多端兼容。涉及到 、
、
表单组件的数据收集。
接口信息
接口地址:/member/profile
请求方式:PUT
登录权限: 是
请求参数:
Body
字段名称 |
是否必须 |
默认值 |
备注 |
nickname |
是 |
无 |
用户昵称 |
gender |
是 |
无 |
用户性别 |
birthday |
是 |
无 |
用户生日 |
profession |
是 |
无 |
用户职业 |
接口封装
/**
* 修改个人信息
* @param data 请求体参数
*/
export const putMemberProfileAPI = (data: ProfileParams) => {
return http({
method: 'PUT',
url: '/member/profile',
data,
})
}
类型声明
/** 个人信息 修改请求体参数 */
export type ProfileParams = Pick<
ProfileDetail,
'nickname' | 'gender' | 'birthday' | 'profession'
> & {
/** 省份编码 */
provinceCode?: string
/** 城市编码 */
cityCode?: string
/** 区/县编码 */
countyCode?: string
}
参考代码
组件使用
v-model
收集数据,
组件使用 @change
事件收集数据。
账号
{{ profile.account }}
昵称
性别
...省略
职业
组件使用 @change
事件收集数据。
生日
{{ profile.birthday }}
请选择日期
城市
{{ profile.fullLocation }}
请选择城市
提交表单,更新会员信息,Store 昵称记得修改,用于会员中心页展示。