(十一)、用户中心页面【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

news2024/9/20 18:42:37

1,个人中心页面

1.1 新建个人中心页面

在这里插入图片描述

1.2 纯净版个人中心页面代码:
<template>
  <view class="user">
    <view class="top">
      <view class="group">
        <view class="userinfo">
          <!-- 顶部 左侧 头像 -->
          <view class="pic">
            <image src="../../static/images/user-default.jpg" mode="aspectFill"></image>
          </view>
          <!-- 顶部 左侧 昵称和时间 已登录 -->
          <view class="text" v-if="true">
            <view class="nickname">匿名</view>
            <view class="year">
              <uni-dateformat :date="new Date() - 360000" :threshold="[3600,99*365*24*60*60*1000]"></uni-dateformat>
              注册
            </view>
          </view>
          <!-- 顶部 左侧 昵称和时间 未登录 -->
          <view class="text" v-else>
            <view class="nickname">点击登录</view>
          </view>

        </view>
        <!-- 顶部 右侧右箭头 -->
        <view class="more">
          <text class="iconfont icon-a-10-you"></text>
        </view>
      </view>
      <!-- 顶部 背景图 -->
      <view class="bg">
        <image src="../../static/images/user-default.jpg" mode="aspectFill"></image>
      </view>
    </view>



    <view class="main">
      <view class="info">
        <view class="item"><text>33</text>获赞</view>
        <view class="item"><text>11</text>评论</view>
        <view class="item"><text>5</text>发文</view>
      </view>

      <view class="list">
        <view class="group">
          <view class="item">
            <view class="left"><text class="iconfont icon-a-24-bianji"></text><text class="text">我的长文</text></view>
            <view class="right"><text class="iconfont icon-a-10-you"></text></view>
          </view>
          <view class="item">
            <view class="left"><text class="iconfont icon-a-106-xihuan"></text><text class="text">我的点赞</text></view>
            <view class="right"><text class="iconfont icon-a-10-you"></text></view>
          </view>
          <view class="item">
            <view class="left"><text class="iconfont icon-a-21-xiugai"></text><text class="text">评论过的</text></view>
            <view class="right"><text class="iconfont icon-a-10-you"></text></view>
          </view>
        </view>

        <view class="group">
          <view class="item">
            <view class="left"><text class="iconfont icon-a-32-wenjian"></text><text class="text">关于</text></view>
            <view class="right"><text class="iconfont icon-a-10-you"></text></view>
          </view>
          <view class="item">
            <view class="left"><text class="iconfont icon-a-5-xinxi"></text><text class="text">意见反馈</text></view>
            <view class="right"><text class="iconfont icon-a-10-you"></text></view>
          </view>
        </view>

        <view class="group">
          <view class="item">
            <view class="left"><text class="iconfont icon-a-73-tuichu"></text><text class="text">退出登录</text></view>
            <view class="right"><text class="iconfont icon-a-10-you"></text></view>
          </view>
        </view>
      </view>
    </view>


  </view>
</template>

<script>
  export default {
    data() {
      return {

      };
    }
  }
</script>

<style lang="scss">
  .user {

    .top {
      height: 300rpx;
      background: #bbb;
      padding: 0 30rpx;
      padding-top: var(--status-bar-height);
      position: relative;
      display: flex;
      align-items: center;

      .group {
        position: relative;
        z-index: 10;
        display: flex;
        align-items: center;
        justify-content: space-between;
        width: 100%;
        color: #fff;

        .userinfo {
          display: flex;
          width: 100%;
          align-items: center;

          .pic {
            width: 120rpx;
            height: 120rpx;
            border-radius: 50%;
            overflow: hidden;
            border: 2px solid #fff;

            image {
              width: 100%;
              height: 100%;
            }
          }

          .text {
            padding-left: 20rpx;

            .nickname {
              font-size: 44rpx;
              font-weight: 600;
            }

            .year {
              font-size: 26rpx;
              opacity: 0.6;
              padding-top: 5rpx;
            }
          }
        }

        .more {
          .iconfont {
            font-size: 40rpx;
          }
        }

      }

      .bg {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        overflow: hidden;

        image {
          width: 100%;
          height: 100%;
          filter: blur(20px);
          transform: scale(2);
          opacity: 0.5;
        }
      }
    }

    .main {
      width: 100%;
      min-height: 200rpx;
      background: #fff;
      border-radius: 30rpx;
      transform: translateY(-30rpx);
      padding: 30rpx 0;

      .info {
        padding: 10rpx 30rpx;
        display: flex;
        font-size: 30rpx;

        .item {
          padding-right: 20rpx;
          color: #888;

          text {
            font-weight: 600;
            color: #333;
          }
        }
      }

      .list {
        .group {
          padding: 15rpx 30rpx;
          border-bottom: 15rpx solid #f4f4f4;

          .item {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 25rpx 0;
            font-size: 36rpx;
            color: #555;
            border-bottom: 1rpx solid #f8f8f8;

            .left {
              display: flex;
              align-items: center;

              .iconfont {
                font-size: 38rpx;
                margin-right: 10rpx;
              }
            }

            .right {
              .iconfont {
                font-size: 26rpx;
              }
            }
          }

          .item:last-child {
            border: none;
          }
        }

        .group:last-child {
          border: none;
        }
      }
    }

  }
</style>

1.3 页面效果

在这里插入图片描述

2,使用uni-id-pages中的vuex状态管理

2.1 self页面中,script中引入store.js:

store.js位置:
在这里插入图片描述

  import {
    store,
    mutations
  } from '@/uni_modules/uni-id-pages/common/store.js'

在计算属性中定义两个方法(在当前页面拿到store中的登录用户信息和登录状态):

    computed: {
      userInfo() {
        return store.userInfo
      },
      hasLogin() {
        return store.hasLogin
      }
    },

测试一下,在onload中打印输出:

    onLoad() {
      console.log(this.userInfo)
      console.log(this.hasLogin)
    }

结果:
在这里插入图片描述

2.2 渲染顶部self页面
          <!-- 顶部 左侧 头像 -->
          <view class="pic">
            <image v-if="hasLogin&&userInfo.avatar_file&&userInfo.avatar_file.url" :src="userInfo.avatar_file.url"
              mode="aspectFill"></image>
            <image v-else src="../../static/images/user-default.jpg" mode="aspectFill"></image>
          </view>
          <!-- 顶部 左侧 昵称和时间 已登录 -->
          <view class="text" v-if="hasLogin">
            <view class="nickname">{{userInfo.nickname||userInfo.username||userInfo.mobile}}</view>

            <view class="year">
              <uni-dateformat :date="new Date() - 360000" :threshold="[3600,99*365*24*60*60*1000]"></uni-dateformat>
              注册
            </view>
          </view>

3,个人中心页面中的退出功能

3.1 修改一下store.js中的logout方法

三目运算符–修改点击退出是跳转的url页面地址
store.js

	async logout() {
		// 1. 已经过期就不需要调用服务端的注销接口	2.即使调用注销接口失败,不能阻塞客户端
		if(uniCloud.getCurrentUserInfo().tokenExpired > Date.now()){
			try{
				await uniIdCo.logout()
			}catch(e){
				console.error(e);
			}
		}
		uni.removeStorageSync('uni_id_token');
		uni.setStorageSync('uni_id_token_expired', 0)
		uni.redirectTo({
			url: `/${pagesJson.uniIdRouter?.loginPage ?? 'pages/self/self'}`, //uni_modules/uni-id-pages/pages/login/login-withoutpwd
		});
		uni.$emit('uni-id-pages-logout')
		this.setUserInfo({},{cover:true})
	},
3.2 self个人中心页面中使用退出方法
      //退出登录
      logout() {
        if (this.goLoginPage()) return;
        uni.showModal({
          title: "是否确认退出?",
          success: res => {
            console.log(res);
            if (res.confirm) {
              mutations.logout()
            }
          }
        })
      },
      //判断是否登录的方法
      goLoginPage() {
        if (!this.hasLogin) {
          uni.showToast({
            title: "未登录",
            icon: "none"
          })
          return true;
        }
        return false
      }

4,uniidrouter路由配置限制用户登录

uniIdRouter自动路由 参考链接

4.1 在pages.json中配置
  "uniIdRouter": {
    "loginPage": "uni_modules/uni-id-pages/pages/login/login-withpwd", // 登录页面路径
    "needLogin": [
      "pages/edit/edit", // 需要登录才可访问的页面列表,可以使用正则语法
      "uni_modules/uni-id-pages/pages/userinfo/userinfo"
    ],
    "resToLogin": true // 自动解析云对象及clientDB的错误码,如果是客户端token不正确或token过期则自动跳转配置的登录页面,配置为false则关闭此行为,默认true
  }
4.2 跳转到个人资料页面

个人资料页面位置:/uni_modules/uni-id-pages/pages/userinfo/userinfo
修改页面:

<view class="group" @click="toUserInfo">

点击跳转方法:

      //跳转到编辑个人资料
      toUserInfo() {
        if (this.hasLogin) {
          uni.navigateTo({
            url: '/uni_modules/uni-id-pages/pages/userinfo/userinfo'
          })
        } else {
          let route = this.$mp.page.route;
          uni.navigateTo({
            url: '/uni_modules/uni-id-pages/pages/login/login-withpwd?uniIdRedirectUrl=/' + route
          })
        }
      },

如果没有登录,就跳转到登录页面,如果登录了,点击跳转到个人资料页面。
个人资料页面:
在这里插入图片描述

4.3 设置头像区域背景
      <!-- 顶部 背景图 -->
      <view class="bg">
        <image v-if="hasLogin&&userInfo.avatar_file&&userInfo.avatar_file.url" :src="userInfo.avatar_file.url"
          mode="aspectFill"></image>
        <image v-else src="../../static/images/user-default.jpg" mode="aspectFill"></image>
      </view>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unreal Engine07:Actor的物理特性

写在前面 UE4作为物理引擎&#xff0c;其中一大功能就是能够赋予物体以物理特性。这里将简单介绍一下Actor常用的一些物理特性设置。 一、基本操作 这里介绍一些UE4的Editor基本操作&#xff1b; 1. Actor的变换 将Actor类拖动到地图中&#xff0c;生成实例&#xff1b;鼠…

408强化(二)线性表纯享版

目录 一、顺序表&#xff08;数组&#xff09;和链表总览 二、考情分析 2.1 从历年考情可以看出&#xff0c;如果一个方法出现了第2次&#xff0c;一般是以下情况&#xff1a; 2.2 没有考过的地方 三、 共同操作或考法 3.1 多指针后移 3.2 逆置 3.3 空间换时间的操作 3.…

一分钟了解微信公众号服务器配置自动回复

1、建一个web服务工程 2、开放任意一个接口&#xff0c; 比如 /aaa/bbb/ccc 把接口路径配置在这里&#xff0c;ip为公网ip或域名&#xff0c;其他的参数默认&#xff0c;对入门选手没啥用 3、该接口允许get和post两种方式访问&#xff0c;接口需要对于访问方式编写两套逻辑…

ubuntu下如何使用wireshark抓包,保姆级教程

Wireshark&#xff08;前称Ethereal&#xff09;是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换。 一、安装wireshark 打开终端&…

教育行业如何高效使用知识库?

在线知识库的有效性在商业世界中是众所周知的。知识库通常用于客户支持&#xff0c;或管理员工的内部知识。在教育系统中&#xff0c;知识库的优势鲜为人知。知识库是可用于各种应用程序的多功能软件。特别是考虑到当前网络影响我们所有人生活的环境&#xff0c;教育越来越多地…

数据结构<堆>

&#x1f387;&#x1f387;&#x1f387;作者&#xff1a; 小鱼不会骑车 &#x1f386;&#x1f386;&#x1f386;专栏&#xff1a; 《数据结构》 &#x1f393;&#x1f393;&#x1f393;个人简介&#xff1a; 一名专科大一在读的小比特&#xff0c;努力学习编程是我唯一…

字符串匹配 - 模式预处理:朴素算法(Naive)(暴力破解)

朴素的字符串匹配算法又称为暴力匹配算法&#xff08;Brute Force Algorithm&#xff09;&#xff0c;最为简单的字符串匹配算法。算法简介朴素的字符串匹配算法又称为暴力匹配算法&#xff08;Brute Force Algorithm&#xff09;&#xff0c;它的主要特点是&#xff1a;没有预…

功率放大器科普知识(晶体管功率放大器的注意事项)

虽然功率放大器是电子实验室的常用仪器&#xff0c;但是很多人对于它却没有清晰的认识&#xff0c;下面就让安泰电子来为大家介绍功率放大器的科普内容以及使用注意事项&#xff0c;希望大家可以对功率放大器有清晰的认识。功率放大器可以把输入信号的功率放大&#xff0c;以满…

NFT Insider #86:A16z 领投,YGG 获得 1380 万美元融资,The Sandbox与《北斗神拳》合作

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

智能小车红外循迹原理

循迹电路循迹电路由收发一体的红外收发管P1&#xff0c;P2&#xff1b;电位器R18&#xff0c;R29&#xff1b;发光二极管D6&#xff0c;D7和芯片LM324等组成。一共有两路&#xff0c;对应的红外电位器用于调节灵敏度。LM234用于信号的比较&#xff0c;并产生比较结果输出给单片…

MySQL8.0 optimizer_switch变化

Optimizer_switch变量是支持对优化器行为的控制。是一组值标志&#xff0c;每个标志都有一个on或off的值&#xff0c;以指示是否启用或禁用相应的行为。 MySQL8.0里除了熟悉的hash join重大变化之外&#xff0c;其他方面也有优化。 mysql> SHOW VARIABLES LIKE OPTIMIZER_…

14 基数排序(桶排序)

文章目录1 基数排序基本思想2 基数排序的代码实现2.1 java2.2 scala3 基数排序总结1 基数排序基本思想 1) 基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又称“桶子法”&#xff08;bucket sort&#…

【Python】循环语句(while,for)、运算符、字符串格式化

一、while循环Python 编程中 while 语句用于循环执行程序&#xff0c;即在某条件下&#xff0c;循环执行某段程序&#xff0c;以处理需要重复处理的相同任务。其基本形式为&#xff1a;while 判断条件(condition)&#xff1a;执行语句(statements)执行语句可以是单个语句或语句…

Git、小乌龟、Gitee的概述与安装应用超详细(组长与组员多人开发版本)

目录 一、概述 1.什么是Git&#xff1f; 2.Git历史来源 3.Git的优点? 4.什么是版本控制&#xff1f; 5.版本控制工具种类&#xff1f; 6.Git工作机制 7.Git、小乌龟、Gitee、凭据管理器的简单介绍 二、Git下载安装 下载Git 安装Git 安装完成后查看版本 三、下载小…

防水蓝牙耳机评测,值得入手的四款蓝牙耳机分享

提到蓝牙耳机&#xff0c;大家第一反应是音质跟佩戴舒适度要好&#xff0c;其实除了这两个功能&#xff0c;还有就是防水性能不能少&#xff0c;而且防水等级越高&#xff0c;耳机寿命也就越长&#xff0c;那么&#xff0c;我们该如何 选购一款好用的蓝牙耳机呢&#xff1f;下面…

Echarts 配置横轴竖轴指示线,更换颜色、线型和大小

第018个点击查看专栏目录本示例是描述如何在Echarts上配置横轴竖轴指示线&#xff0c;更换颜色、线型和大小。方法很简单&#xff0c;参考示例源代码。 文章目录示例效果示例源代码&#xff08;共85行&#xff09;相关资料参考专栏介绍示例效果 示例源代码&#xff08;共85行&a…

数据的TCP分段和IP分片

本文简述下TCP分段和IP分片的区别与联系。 我们知道&#xff0c;用户空间的数据拷贝到内核空间的TCP发送缓冲区&#xff08;这个是一个结构体&#xff0c;叫sk_buffer&#xff0c;简称skb&#xff09;后就由内核网络协议栈做后续的封装和发送处理了&#xff0c;用户无需考虑下…

【Node.js】开发自己的包!

造包开发自己的包&#xff01;初始化包的基本结构页面使用根据需要也可以将模块化拆分编写包的说明文档发布包把包发布在npm上删除已发布的包模块的加载机制内置模块的加载机制自定义模块的加载机制第三方模块的加载机制当目录作为模块时的加载机制开发自己的包&#xff01; 初…

3|射频识别技术|第二讲:RFID系统的组成与工作原理|批注·上

https://blog.csdn.net/m0_57656758/article/details/128153964?spm1001.2014.3001.5501我国用无线射频识别技术实现药品管理的市场还是空白其运用具有较大的市场空间。药品运输及存储环境监控药品有效期监控提升用药安全策略血液制剂监控特殊、违禁药品监控商品价格监控药品生…

【Flutter】入门Dart语言:简单易懂的变量指南

文章目录一、概述二、详解1. 变量的声明2. 常量变量3.late 延迟初始化变量4. 变量的命名规则三、总结一、概述 “不抱有希望的人生是毫无意义的。” —— 阿卜杜勒阿齐兹 Dart中的变量是存储值的容器。它们可以是数字、字符串、布尔值或其他数据类型。变量在定义时必须指定类型…