热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【愚公系列】2022年11月uniapp专题优购电商个人中心页面

文章目录前言一、个人中心页面前言个人中心的信息复杂度与产品本身有关。体系越庞大的产品,对应个人中心页面需要承载的内容越多,结构势必复杂。一般平台型电

文章目录

  • 前言
  • 一、个人中心页面




前言

个人中心的信息复杂度与产品本身有关。体系越庞大的产品,对应个人中心页面需要承载的内容越多,结构势必复杂。

一般平台型电商的个人中心页面必须涵盖:用户基础信息、全局性操作(设置)、关键数据记录、购买激励(会员、红包)、核心业务(订单信息)、工具集合(工具箱)等。

一、个人中心页面

<template><view class&#61;"my-container"><my-login v-if&#61;"!token"></my-login><my-userinfo v-else></my-userinfo></view>
</template><script>import badgeMix from &#39;&#64;/mixins/tabbar-badge.js&#39;import { mapState } from &#39;vuex&#39;export default {mixins: [badgeMix],data() {return {};},computed: {...mapState(&#39;m_user&#39;, [&#39;token&#39;])}}
</script><style lang&#61;"scss">page,.my-container {height: 100%;}
</style>

<template><view class&#61;"login-container"><uni-icons type&#61;"contact-filled" size&#61;"100" color&#61;"#AFAFAF"></uni-icons><button type&#61;"primary" class&#61;"btn-login" open-type&#61;"getUserInfo" &#64;getuserinfo&#61;"getUserInfo">一键登录</button><text class&#61;"tips-text">登录后尽享更多权益</text></view>
</template><script>import { mapMutations, mapState } from &#39;vuex&#39;export default {data() {return {};},computed: {...mapState(&#39;m_user&#39;, [&#39;redirectInfo&#39;])},methods: {...mapMutations(&#39;m_user&#39;, [&#39;updateUserInfo&#39;, &#39;updateToken&#39;, &#39;updateRedirectInfo&#39;]),// 用户授权之后&#xff0c;获取用户的基本信息getUserInfo(e) {console.log(e)if (e.detail.errMsg &#61;&#61;&#61; &#39;getUserInfo:fail auth deny&#39;) return uni.$showMsg(&#39;您取消了登录授权&#xff01;&#39;)console.log(e.detail.userInfo)this.updateUserInfo(e.detail.userInfo)this.getToken(e.detail)},async getToken(info) {// 获取 code 对应的值const [err, res] &#61; await uni.login().catch(err &#61;> err)if (err || res.errMsg !&#61;&#61; &#39;login:ok&#39;) return uni.$showMsg(&#39;登录失败&#xff01;&#39;)// 准备参数const query &#61; {code: res.code,encryptedData: info.encryptedData,iv: info.iv,rawData: info.rawData,signature: info.signature}const { data: loginResult } &#61; await uni.$http.post(&#39;/api/public/v1/users/wxlogin&#39;, query)if (loginResult.meta.status !&#61;&#61; 200) return uni.$showMsg(&#39;登录失败&#xff01;&#39;)// 直接把 token 保存到 vuex 中this.updateToken(loginResult.message.token)this.navigateBack()},navigateBack() {if (this.redirectInfo && this.redirectInfo.openType &#61;&#61;&#61; &#39;switchTab&#39;) {uni.switchTab({url: this.redirectInfo.from,complete: () &#61;> {this.updateRedirectInfo(null)}})}}}}
</script><style lang&#61;"scss">.login-container {height: 750rpx;background-color: #F8F8F8;display: flex;flex-direction: column;justify-content: center;align-items: center;position: relative;overflow: hidden;&::after {content: &#39; &#39;;display: block;width: 100%;height: 40px;background-color: white;position: absolute;bottom: 0;left: 0;border-radius: 100%;transform: translateY(50%);}.btn-login {width: 90%;border-radius: 100px;margin: 15px 0;background-color: #C00000;}.tips-text {font-size: 12px;color: gray;}}
</style>

<template><view class&#61;"my-userinfo-container"><!-- 头像和昵称区域 --><view class&#61;"top-box"><image :src&#61;"userinfo.avatarUrl" class&#61;"avatar"></image><view class&#61;"nickname">{{userinfo.nickName}}</view></view><!-- 面板区域 --><view class&#61;"panel-list"><!--1个面板 --><view class&#61;"panel"><view class&#61;"panel-body"><view class&#61;"panel-item"><text>8</text><text>收藏的店铺</text></view><view class&#61;"panel-item"><text>14</text><text>收藏的商品</text></view><view class&#61;"panel-item"><text>18</text><text>关注的商品</text></view><view class&#61;"panel-item"><text>84</text><text>足迹</text></view></view></view><!--2个面板 --><view class&#61;"panel"><view class&#61;"panel-title">我的订单</view><view class&#61;"panel-body"><view class&#61;"panel-item"><image src&#61;"/static/my-icons/icon1.png" class&#61;"icon"></image><text>待付款</text></view><view class&#61;"panel-item"><image src&#61;"/static/my-icons/icon2.png" class&#61;"icon"></image><text>待收货</text></view><view class&#61;"panel-item"><image src&#61;"/static/my-icons/icon3.png" class&#61;"icon"></image><text>退款/退货</text></view><view class&#61;"panel-item"><image src&#61;"/static/my-icons/icon4.png" class&#61;"icon"></image><text>全部订单</text></view></view></view><!--3个面板 --><view class&#61;"panel"><view class&#61;"panel-list-item"><text>收货地址</text><uni-icons type&#61;"arrowright" size&#61;"15"></uni-icons></view><view class&#61;"panel-list-item"><text>联系客服</text><uni-icons type&#61;"arrowright" size&#61;"15"></uni-icons></view><view class&#61;"panel-list-item" &#64;click&#61;"logout"><text>退出登录</text><uni-icons type&#61;"arrowright" size&#61;"15"></uni-icons></view></view></view></view>
</template><script>import { mapState, mapMutations } from &#39;vuex&#39;export default {data() {return {};},computed: {...mapState(&#39;m_user&#39;, [&#39;userinfo&#39;])},methods: {...mapMutations(&#39;m_user&#39;, [&#39;updateAddress&#39;, &#39;updateUserInfo&#39;, &#39;updateToken&#39;]),async logout() {const [err, succ] &#61; await uni.showModal({title: &#39;提示&#39;,content: &#39;确认退出登录吗&#xff1f;&#39;}).catch(err &#61;> err)if (succ && succ.confirm) {this.updateAddress({})this.updateUserInfo({})this.updateToken(&#39;&#39;)}}}}
</script><style lang&#61;"scss">.my-userinfo-container {height: 100%;background-color: #F4F4F4;.top-box {height: 400rpx;background-color: #C00000;display: flex;justify-content: center;align-items: center;flex-direction: column;.avatar {width: 90px;height: 90px;border-radius: 45px;border: 2px solid #FFF;box-shadow: 0 1px 5px black;}.nickname {font-size: 16px;color: #FFF;font-weight: bold;margin-top: 10px;}}}.panel-list {padding: 0 10px;position: relative;top: -10px;.panel {background-color: white;border-radius: 3px;margin-bottom: 8px;.panel-title {line-height: 45px;padding-left: 10px;font-size: 15px;border-bottom: 1px solid #F4F4F4;}.panel-body {display: flex;justify-content: space-around;.panel-item {display: flex;flex-direction: column;align-items: center;justify-content: space-around;padding: 10px 0;font-size: 13px;.icon {width: 35px;height: 35px;}}}}}.panel-list-item {display: flex;justify-content: space-between;align-items: center;font-size: 15px;padding: 0 10px;line-height: 45px;}
</style>

在这里插入图片描述


推荐阅读
  • 基于 Vue 和 Element UI 实现的简洁登录界面设计
    本文介绍了一种利用 Vue.js 和 Element UI 框架构建的简洁登录界面设计。该设计不仅注重用户体验,还确保了界面的美观性和易用性。通过合理的布局和组件配置,实现了高效、响应式的登录功能,适用于多种前端应用场景。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 使用 Vuex 管理表单状态:当输入框失去焦点时自动恢复初始值 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • Vue 开发技巧:实现数据过滤与排序功能详解
    Vue 开发技巧:实现数据过滤与排序功能详解 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 优化Vite 1.0至2.0升级过程中遇到的某些代码块过大问题解决方案
    本文详细探讨了在将项目从 Vite 1.0 升级到 2.0 的过程中,如何解决某些代码块过大的问题。通过具体的编码示例,文章提供了全面的解决方案,帮助开发者有效优化打包性能。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
author-avatar
女人放聪明点碧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有