发表于: 2020-05-28 23:01:29

1 2059




今日完成

解决掉昨日的bug 重新学习理解生命周期函数

细节优化基本完成

重新学习理解cookie相关知识,完成登出操作及登录状态判断


明日计划

任务打包上线,收尾处理


学习小程序

遇到的问题

bug原因 对生命周期函数理解不到位

将分页器的逻辑代码写入ngDoCheck()生命周期函数中

导致该方法无法被触发

将代码放入ngOnInit()生命周期函数中正常


遇到的问题

更改每页条数后 总共页数延迟更新

原因

改变每页条数后

页面通过url发送http异步请求

分页器从父组件获取的数据没有更新 

页面加载完成

数据更新

页面没有重新加载

解决办法

父组件给分页器组件传数据时使用不可变数据类型

 <app-article-paging
    *ngIf="pageTotal"
    [pageSize]="pageSize"
    [pageTotal]="pageTotal"
  ></app-article-paging>

子组件使用ngOnchange()检测父组件的传值变化

并执行分页器的逻辑代码来更新视图

 ngOnChanges(changes: SimpleChanges): void {
    this.calParams();
    console.log(this.toolData.pageSize)
  }

分页器最终完成情况

<div class="paging">
  <span class="paging-tool"
    ><nz-select [(ngModel)]="toolData.pageSize" (ngModelChange)="sizeCheck()">
      <nz-option nzValue="5" nzLabel="5条/页"></nz-option>
      <nz-option nzValue="10" nzLabel="10条/页"></nz-option>
      <nz-option nzValue="20" nzLabel="20条/页"></nz-option>
      <nz-option nzValue="30" nzLabel="30条/页"></nz-option>
    </nz-select>
  </span>
  <nav aria-label="Page navigation search">
    <ul class="pagination">
      <li class="page-item {{ data.status }}" *ngFor="let data of pagingData">
        <a
          class="page-link"
          [routerLink]="['/article']"
          [queryParams]="{ page: data.num }"
          queryParamsHandling="merge"
          >{{ data.text }}</a
        >
      </li>
    </ul>
  </nav>
  <span class="ml-2 paging-tool">共{{ toolData.totalPage }}页</span>
  <span class="paging-tool"
    >去第<input
      type="number"
      onmousewheel="return false"
      [(ngModel)]="toolData.toWitchPage"
      (change)="pageCheck()"
    />页</span
  >
  <button
    class="btn btn-outline-primary btn-sm paging-tool"
    (click)="pageConfirm()"
  >
    确定
  </button>

</div>


import { Component, OnInit, Input, SimpleChanges } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';

@Component({
  selector: 'app-article-paging',
  templateUrl: './article-paging.component.html',
  styleUrls: ['./article-paging.component.less']
})
export class ArticlePagingComponent implements OnInit {
  @Input() pageSize: number;
  @Input() pageTotal: number;


  // 生成分页器的数据
  public pagingData: Array<object>;

  // 自定义分页数据
  public toolData: any = {
    'totalPage': '',
    'pageSize': '',
    'toWitchPage': '1'
  }

  constructor(
    private route: ActivatedRoute,
    private Router: Router
  ) { }

  ngOnChanges(changes: SimpleChanges): void {
    this.calParams();
    console.log(this.toolData.pageSize)
  }


  ngOnInit(): void {

  }

  // 通过url获取参数 并计算分页逻辑所需要的参数
  calParams() {
    this.route.queryParams.subscribe(params => {
      // 当前页面参数
      let currentPage: number = !params.page ? 1 : params.page;

      // 计算总页数
      this.toolData.totalPage = Math.ceil(this.pageTotal / this.pageSize);

      // 每页列表数
      this.toolData.pageSize = !params.size ? '10' : (params.size + '');


      // 计算分页
      this.PageAlgorithm(currentPage, this.toolData.totalPage, 5);

    })

  }


  // 分页逻辑 返回数组 通过数据绑定
  PageAlgorithm(currentPage: numbertotalPage: numbershowPage: number) {
    let data: Array<object= [];
    // 展示页数的一半
    let half: number = Math.ceil((showPage - 1/ 2);

    //首页和上一页
    if (currentPage == 1) {


      data.push({ 'text': '首页''num': '''status': 'disabled' });
      data.push({ 'text': '上一页''num': '''status': 'disabled' });
    } else {
      data.push({ 'text': '首页''num': '1''status': '' })
      data.push({ 'text': '上一页''num': (currentPage - 1), 'status': '' })
    }
    // 判断分页类型
    if (totalPage > 5) {
      // 满足显示左省略时状态
      if (currentPage - half > 1) {
        // 左省略
        data.push({ "text": "···""num": """status": "disabled" });
        // 满足右省略号状态
        if (currentPage * 1 + half * 1 + 1 < totalPage) {
          for (let i = currentPage - half; i <= currentPage * 1 + half; i++) {

            if (i == currentPage) {
              data.push({ "text": i, "num": i, "status": "active" })
            } else {
              data.push({ "text": i, "num": i, "status": "" })
            }
          }
          // 右省略号
          data.push({ "text": "···""num": """status": "disabled" });
          // 不满足显示右省略
        } else {
          // 显示最后showPage个页数
          for (let i = totalPage - 4; i <= totalPage; i++) {

            if (i == currentPage) {
              data.push({ "text": i, "num": i, "status": "active" })
            } else {
              data.push({ "text": i, "num": i, "status": "" })
            }
          }
        }
        // 不满足显示左省略
      } else {
        // 显示前showPage个页数
        for (let i = 1; i <= 5; i++) {

          if (i == currentPage) {
            data.push({ "text": i, "num": i, "status": "active" })
          } else {
            data.push({ "text": i, "num": i, "status": "" })
          }
        }
        // 右省略号
        data.push({ "text": "···""num": """status": "disabled" });
      }




      //总页数小于展示页数 页码全部展示
    } else {
      for (let i = 1; i <= totalPage; i++) {
        if (i == currentPage) {
          data.push({ "text": i, "num": i, "status": "active" })
        } else {
          data.push({ "text": i, "num": i, "status": "" })
        }
      }
    }



    //末页和下一页
    if (currentPage == totalPage) {
      data.push({ 'text': '下一页''num': currentPage * 1 + 1'status': 'disabled' })
      data.push({ 'text': '末页''num': 'totalPage''status': 'disabled' })
    } else {
      data.push({ 'text': '下一页''num': currentPage * 1 + 1'status': '' })
      data.push({ 'text': '末页''num': totalPage'status': '' })
    }
    this.pagingData = data;
  }


  // 跳转确认按钮
  pageConfirm() {
    this.Router.navigate(['/article'], { queryParams: { 'page': this.toolData.toWitchPage }, queryParamsHandling: "merge" });

  }

  // url传参
  sizeCheck() {
    this.Router.navigate(['/article'], { queryParams: { 'size': this.toolData.pageSize }, queryParamsHandling: "merge" });
  }
  // 输入框检测
  pageCheck() {
    // 预算总页数
    let totalPage = Math.ceil(this.pageTotal / this.toolData.pageSize);

    if (this.toolData.toWitchPage < 1) {
      this.toolData.toWitchPage = 1;
    }
    if (this.toolData.toWitchPage > totalPage) {
      this.toolData.toWitchPage = totalPage;
    }
  }
}


理解如何判断登录状态

当发送登录请求时并登录成功后 

后端返信息表头带有cookie信息 客户端接收到后保存到本地

之后客户端再发送请求时,请求头会携带该cookie信息

进行登出操作后 本地及后端cookie删除

再次操作需要登录才能发送的http请求时 会返回错误信息 


拓展

根据前后端的约定,大致有这几种判断登录状态

●登录成功后,后端返回一个 cookie,根据这个 cookie 的有无来判断;退出登录时,后端会删除这个 cookie;

●登录成功后,前端设置 cookie,比如'isLogin = true',根据isLogin的值去判断;退出登录时删除 cookieisLogin 或设置  'isLogin = false'。

前台发送登录请求
后台返回 token,前台得到后台返回的 token,将其写入到 localStorage 中,后续请求中都携带 token
后台判断 token 是否过期,如果过期就对前台的请求响应过期标识或者状态码

前台得到过期标识后,清除 localStorage 中的 token,然后重定向到 login 路由

引用资料 https://www.cnblogs.com/momo798/p/11663349.html



拓展学习资料 

https://github.com/mqyqingfeng/Blog/issues/157

2 月份发布的 Chrome 80 版本中默认屏蔽了第三方的 Cookie,导致了阿里系的很多应用都产生了问题


Cookie 的作用

Cookie 主要用于以下三个方面:

  1. 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  2. 个性化设置(如用户自定义设置、主题等)
  3. 浏览器行为跟踪(如跟踪分析用户行为等)



收获

最开始对登录验证及cookie这块很模糊,今天总算清除了一些


返回列表 返回列表
评论

    分享到