Vue项目实战-空间论坛(2)

项目实战

实现userlist页面

获取userlist列表,可使用ajax,axios 实现    

这里采用ajax实现,需要添加Jquery依赖,然后在UserListView.vue中引入

在UserListView.vue组件的入口函数中定义users变量,并引入ref

使用ajax从云端动态获取用户

并将返回结果展示,根据喜好调整css样式

注:响应式布局,比如框越大头像越大

实现访问个人页面的路由

修改路由,使个人页面带有参数

可在UserProfileView.vue中使用API----useRoute 并在导航栏组件中引入参数params:{userId: }

 

创建登录退出模块

从bootstrap中找到合适的登录按钮

动态获取用户名和密码,需要一个双向绑定的变量,响应式变量用ref

在入口函数中定义变量username,password,error_message并返回对象

用v-module分别把username,password与input标签双向绑定起来,因为div需要修改

注意:访问ref值的时候需要加上value

 login函数,在表单标签中添加点击事件触发login函数,并返回,此时表单会刷新,原因是绑定的是在表单提交之前的事件,执行完login函数后会提交它原本的时间,可用prevent阻止掉默认事件的发生

 由于各个页面之间都可能用到用户的个人信息,所以可以定义全局变量来存用户的个人信息

vue中提供一个维护全局变量的机制vuex 

 

 

 注:action中定义对state的各种操作,所有对state的更新方式

但是不能对state进行修改,对state的修改放在mutations执行

vue中对mutations的限制是不能执行异步操作-----从云端获取用户信息,获取后再更新state的是不能写在mutations中

modules模块的作用是把state中的对象做分割

方法:

 

 传统登录验证方式:

 js不能访问浏览器cookie

Jwt验证方式:

 

jwt中有一关键字user_Id

token可以在jwt网站中进行解析编码

注:get方法访问某个链接,所有参数都会放到链接中

创建user.js用于构建全局变量

login(context,data){}中参数context是传API,data为自己定义函数

在LoginView.vue中导入useStore,并调用user.js中actions中的login函数,调用此函数需要把login当做dispatch中的参数

如下:

在user.js中解析出resp

解码resp中的信息需要添加jwt-decode,并在user.js中引入,用jwt-decode导出的函数解码,从而

获取用户信息

并在登录成功后,调用getinfo接口,获取用户信息

并加上jwt验证,因为后端已经对此接口进行了授权,需要加上headers,授权方式为自定义


成功后将resp的内容更新到state中,actions中不能直接更新,所以要在mutations中更新,可在mutations中实现updateUser

在解码成功函数中调用mutations中的updateUser,调用方法如下

成功后调用 Login.view中的回调函数success,success传到了data参数中

失败则调用失败函数

由于acces每5分钟过期,因此可以每4.5分钟刷新一次令牌,可调用刷新JWT令牌的接口,并更新acces

 在登录页面组件中引入router,使得成功函数路由到相关链接,并在error函数中设置error_message,每次调用登录函数的时候清空

登录成功后将用户的用户名展示在登录NarBar上:

可以在NavBar中判断一下是否登录,此外登录成功的话还可以直接跳转个人空间页面

实现退出设置

登录是获取了access,再登出的时候只要消去token即可,或者清空state中的信息即可

在登录后,退出标签中加入触发函数,并在入口函数中编写logout函数        

注:只要是修改全局state就要把修改的函数定义在actions中(如果是同步的写在哪都可以,异步的话只能写在actions)

 

 在组件中调用mutations中的API:

调用actions则用dispatch 

注:store在html中引用要加$

实现查看好友动态

在UserListView中实现一个打开个人信息的函数,open_user_profile

并在点击卡片时返回

删除导航栏中的用户动态

注:vue在后台判断是否为执行逻辑,如果是则会封装成一个执行逻辑

   =>

注:不加()  传的是定义,加()传的是函数调用

<template>
   <ContentBase>
    <div class="card" v-for="user in users" :key="user.id" @click="open_user_profile(user.id)">
      <div class="card-body">
        <div class="row">
          <div class="col-1">
            <img :src="user.photo" alt="" class="img-fluid">
          </div>
          <div class="col-11">
            <div class="username">{{ user.username }}</div>
            <div class="follower-count">{{ user.followerCount }}</div>
          </div>
        </div>
      </div>
    </div>
   </ContentBase>
</template>
  
  <script>
  import ContentBase from '@/components/ContentBase.vue';
  import {ref} from 'vue';
  import $ from 'jquery';
  import router from '@/router/index';
  import {useStore} from 'vuex';

  export default {
    name: 'UserListView',
    components: {
      ContentBase
    },
    setup(){
      const store=useStore();
      let users=ref([]);
      $.ajax({
        type: "get",
        url: "https://app165.acapp.acwing.com.cn/myspace/userlist/",
        success:function(resp) {
          users.value=resp;
          console.log(resp);
        }
      });
      const open_user_profile=userId=>{
        if(store.state.user.is_login){
          router.push({
            name:'userprofile',
            params:{
              userId:userId,
            }
          })
        }else{
          router.push({
            name:'login',
          })
        }
      }
      return{
        users,
        open_user_profile,
      }
    }
  }
  </script>
  
  <style scoped>
  img{
    border-radius: 50%;
  }
  .username{
    font-weight: bold;
    height: 50%;
  }
  .follower-count{
      font-weight: 12px;
      color: grey;
      height: 50%;
  }
  .card{
    margin-bottom: 20px;
    cursor: pointer;
  }
  .card:hover{
    box-shadow: 2px 2px 10px black;
    transition: 500ms;
  }
  </style>

 实现查看好友动态,需要动态从云端拉取用户信息

注:HTML中      src="user.photo"----字符串        :src="user.photo"----变量

使用API获取用户的帖子 

动态计算当前用户是不是自己,不是自己的话就不展示发帖功能

点击自己页面则可发帖,在根组件中加入完整路径强制刷新(原因是判断链接是否相同时是不包含参数的)

实现动态添加/删除帖子

在UserProfileWrite组件中调用发帖的API

帖子如果先在前端更新,但是提交有bug则可能出现数据库中并没有存储帖子的情况,出现数据不一致

但是等待后端返回再刷新的话不如先刷新流畅

注意:不要忘记更新用户动态中帖子的长度posts.count=resp.length;

给postlist添加删除按钮 ,并设置只有在展示自己的页面中才能展示出来(所以当前的页面可以使用动态计算)

当前的id可以从用户动态页面(父组件中)进行传回

 

 实现点击删除帖子的功能

绑定delete事件和delete函数

在子组件中定义delete事件

 

 

调用后端删除API,从数据库中删除帖子 

restAPI

 实现注册模块

可复用修改注册模块的代码,并调用注册的API

实现关注模块

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Vue2.0企业级项目实战,我可以提供一些常见的实践经验和建议。以下是几个重要的方面需要考虑: 1. 构建工具和项目结构:使用Vue CLI来搭建项目,它提供了一个简单且灵活的脚手架工具。在项目结构上,可以采用分模块的方式组织代码,将相关的组件、页面和逻辑放在一起。 2. 状态管理:使用Vuex来管理全局状态。Vuex提供了一个集中式的状态管理方案,可以方便地跨组件共享数据。在大型企业级项目中,合理划分模块和命名空间,将状态的变化和业务逻辑分离。 3. 路由管理:使用Vue Router来实现前端路由。Vue Router提供了一种简单且灵活的方式来管理应用程序的路由。可以根据业务需求,配置动态路由和嵌套路由。 4. 样式管理:使用CSS预处理器(如Sass或Less)来提高开发效率,并采用模块化的方式组织样式代码。可以使用BEM(Block Element Modifier)等命名规范来约束样式命名,保证样式的可维护性。 5. 组件化开发:将页面拆分成多个可复用的组件,提高代码的复用性和可维护性。在设计组件时,考虑组件的独立性、可扩展性和可测试性。 6. 异步请求:使用Axios等网络请求库来进行异步请求。可以封装统一的请求接口,对请求进行拦截和统一处理,例如添加请求头、处理错误等。 7. 性能优化:合理使用Vue的指令、计算属性和异步组件等特性,减少不必要的计算和渲染。可以使用Webpack等构建工具进行代码分割和懒加载,减小初始加载的资源体积。 8. 单元测试和端到端测试:使用Jest、Mocha等测试框架进行单元测试,并使用Cypress、Nightwatch等工具进行端到端测试。编写测试用例可以帮助发现潜在的问题,提高项目的质量和稳定性。 这些是Vue2.0企业级项目实战中的一些关键点,当然还有其他方面需要考虑,例如国际化、权限管理、错误日志等。根据具体需求,可以进行更深入的学习和实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值