《仿盒马》app开发技术分享-- 个人中心&关于逻辑完善(36)

简介: 上一节我们针对首页的一些静态按钮做了一些功能上的完善,这一节我们要针对已有的功能做一下逻辑完善,经过测试,在一开始的登录中我们登录之后当前页面的状态并不能马上的展示出来,并且缺少退出功能,退出后我们同样要立马让页面修改为用户未登录的状态,在个人中心页面关于功能缺失,这一节我们就来完善对应的内容

技术栈

Appgallery connect

开发准备

上一节我们针对首页的一些静态按钮做了一些功能上的完善,这一节我们要针对已有的功能做一下逻辑完善,经过测试,在一开始的登录中我们登录之后当前页面的状态并不能马上的展示出来,并且缺少退出功能,退出后我们同样要立马让页面修改为用户未登录的状态,在个人中心页面关于功能缺失,这一节我们就来完善对应的内容

功能分析

要实现状态的修改,我们在登录以及退出登录页面间通信采用emitter来发送和接收消息,在消息接收成功后的回调里修改当前页面的参数,同时销毁存储的用户信息,关于页面我们直接添加当前应用以及作者的信息即可,同时为了能更好的方便同学们查看其他内容,在关于中我使用webview展示了某站的个人主页,可以查看最新的文章列表,同时在个人信息页面添加退出按钮和对应逻辑

代码实现

首先修改登录页面添加对应的逻辑,用来发送我们的登录状态

 async login(): Promise<void>{
   
    if (this.acc===''&&this.psw==='') {
   
      promptAction.showToast({
   message:"请输入账号或密码"})
      return
    }else {
   
      let condition = new cloudDatabase.DatabaseQuery(user);
      condition.equalTo("user_name",this.acc).and().equalTo("psw",this.psw)
      let listData = await databaseZone.query(condition);

      let json = JSON.stringify(listData)
      let data1:User[]= JSON.parse(json)
      if (data1.length>0) {
   
        if (data1[0].is_log_off) {
   
          promptAction.showDialog({
   
            title: '提示',
            message: '改账号已经注销',
            buttons: [
              {
   
                text: '去处理',
                color: '#ffffff'
              },
              {
   
                text: '关闭',
                color: '#ffffff'
              }
            ],
          })
            .then(data => {
   
              showToast(data.index+"")
              console.info('showDialog success, click button: ' + data.index);
            })
            .catch((err: Error) => {
   
              console.info('showDialog error: ' + err);
            })
        }else {
   

          let eventData: emitter.EventData = {
   
            data: {
   }
          };

          let innerEvent: emitter.InnerEvent = {
   
            eventId: 2001,
            priority: emitter.EventPriority.HIGH
          };

          emitter.emit(innerEvent, eventData);
          StorageUtils.set("user",JSON.stringify(data1[0]))
          router.back({
   
            url: 'pages/Index',
            params: {
   
              info: user
            }
          });
        }


      }else {
   
        showToast("请检查用户名或密码")
      }
      hilog.info(0x0000, 'testTag', `Succeeded in querying data, result: ${
   data1}`);
    }
  }

在这里我们通知后在我的页面组件中去接收,同时查询用户信息赋值,实现修改页面状态

aboutToAppear(): void {
   
    let innerEvent: emitter.InnerEvent = {
   
      eventId: 2001
    };
    let callback: Callback<emitter.EventData> = async (eventData: emitter.EventData) => {
   
      console.info(`eventData: ${
   JSON.stringify(eventData)}`);
      const value = await StorageUtils.getAll('user');
      if (value != "") {
   
        this.user = JSON.parse(value)
        if (this.user != null) {
   
          let databaseZone = cloudDatabase.zone('default');
          let condition = new cloudDatabase.DatabaseQuery(user_info);
          condition.equalTo("user_id", this.user?.user_id)
          let listData = await databaseZone.query(condition);
          let json = JSON.stringify(listData)
          let data2: UserInfo[] = JSON.parse(json)
          this.userInfo = data2[0]
          hilog.error(0x0000, 'testTag', `Failed to query data, code: ${
   data2}`);
        }
      }else {
   
        this.userInfo=null
        this.user=null
      }
    }
    emitter.on(innerEvent, callback);
  }

完成之后我们在个人信息页面新增退出按钮,添加发送事件,以及清空用户信息缓存

 Text("退出")
          .width('50%')
          .height(45)
          .fontColor(Color.White)
          .fontSize(16)
          .textAlign(TextAlign.Center)
          .backgroundColor("#fffc1515")
          .borderRadius(10)
          .margin({
   top:20})
          .onClick(()=>{
   
            StorageUtils.remove('user')
              router.back()
            let eventData: emitter.EventData = {
   
              data: {
   }
            };

            let innerEvent: emitter.InnerEvent = {
   
              eventId: 2001,
              priority: emitter.EventPriority.HIGH
            };

            emitter.emit(innerEvent, eventData);
          })

我们继续实现关于页面的逻辑,在这个页面我们只需要填充对应的信息即可,只需要注意跳转到web页面的事件

import {
    CommonTopBar } from '../widget/CommonTopBar';
import {
    router } from '@kit.ArkUI';
import {
    WebUrlModel } from '../model/WebUrlModel';

@Entry
@Component
struct AboutPage {
   
  @State message: string = 'Hello World';

  build() {
   
    Column() {
   
      CommonTopBar({
    title: "关于", alpha: 0, titleAlignment: TextAlign.Center ,backButton:true})
      Column({
   space:20}){
   
        Image($r('app.media.e_logo'))
          .height(200)
          .width(200)
          .borderRadius(10)
          .margin({
   top:20})

        Text("一款端云一体化的购物App")
          .fontSize(16)
          .fontWeight(FontWeight.Bold)
          .fontColor(Color.Black)


        Text("开发者:鸿蒙小林")
          .fontSize(16)
          .fontWeight(FontWeight.Bold)
          .fontColor(Color.Black)



        Text("点击查看app对应说明文章")
          .fontSize(16)
          .fontWeight(FontWeight.Bold)
          .fontColor(Color.Blue)
          .onClick(()=>{
   
            let url: WebUrlModel = {
   
              url: 'https://blog.csdn.net/qq_43238112?spm=1001.2014.3001.10640'
            };
            router.pushUrl({
   url:'pages/view/WebPage',params:url})
          })
      }
      .backgroundColor(Color.White)
      .height('100%')
      .width('100%')
      .alignItems(HorizontalAlign.Center)
    }
    .height('100%')
    .width('100%')
  }
}

点击后跳转到对应的web 展示页面

import {
    webview } from '@kit.ArkWeb';
import {
    router } from '@kit.ArkUI';
import {
    WebUrlModel } from '../model/WebUrlModel';
import {
    CommonTopBar } from '../widget/CommonTopBar';

@Entry
@Component
struct WebPage {
   
  @State urlInfo: WebUrlModel = null!;
  @State mode: MixedMode = MixedMode.All;

  aboutToAppear(): void {
   
    this.urlInfo = router.getParams() as WebUrlModel
  }

  webController: webview.WebviewController = new webview.WebviewController();

  build() {
   
    Column() {
   
      CommonTopBar({
    title: "我的主页", alpha: 0, titleAlignment: TextAlign.Center ,backButton:true})
      Web({
    src: this.urlInfo.url, controller: this.webController })
        .height('100%')
        .width('100%')
        .mixedMode(this.mode)
        .domStorageAccess(true)


    }
    .height('100%')
    .width('100%')
  }
}

到这里我们就实现了对已有功能的业务逻辑完善了

相关文章
|
3月前
《仿盒马》app开发技术分享-- 商品兑换校验(70)
上一节我们实现了可兑换商品的详情,我们能够查看到商品更多的信息,这一节我们来实现商品兑换相关的功能,在进行商品兑换之前,我们在兑换详情页面,点击立即兑换按钮之后我们需要跳转到兑换详情页,但是用户的积分可能达不到我们当前商品的兑换标准,这时候如果我们进入了下个页面,在用户点击确认的时候去校验,就让用户多操作了一步,这样的操作体验非常的不友好,所以我们在兑换前进行校验,通过校验后我们在确认页实现地址添加相关的内容
84 4
|
3月前
|
数据库
《仿盒马》app开发技术分享-- 兑换商品取消订单&取消列表展示(77)
上一节我们实现了兑换订单待发货列表的展示逻辑,成功的在列表中展示出来,我们在订单条目中新增了两个按钮,确认揽收与取消订单,这一节我们要实现的功能是订单的取消,以及订单取消后取消列表的展示
82 1
|
3月前
|
存储
《仿盒马》app开发技术分享-- 兑换订单提交(73)
上一节我们实现了兑换提交前的准备页面,向用户展示了兑换相关的所有信息,这一节我们就可以实现兑换订单的提交了
82 1
|
3月前
《仿盒马》app开发技术分享-- 注销账号恢复(85)
上一节我们实现了欢迎页的逻辑,并且在欢迎页面实现了对账号状态的提示,但是如果我们的用户之前因为一些原因注销了账号,但现在又想用回我们的应用怎么办?我们这一节就要在注销账号的提示弹窗处,实现一个账号恢复功能,使我们的用户可以继续使用我们的应用
89 0
|
3月前
《仿盒马》app开发技术分享-- 逻辑优化第三弹(83)
现在我们的app功能已经趋近完善,bug和缺失的细节也越来越少了,我们继续对app进行优化,首先是我们的积分页面,我们只实现了全部的积分展示内容,对收入和支出的积分明细并没有进行展示,这里我们要实现一下,然后就是我们的优惠券,我们已过期的优惠券并没有修改状态为已过期。
78 0
|
数据库
《仿盒马》app开发技术分享-- 逻辑优化第二弹(82)
这一节我们继续对我们已有的业务逻辑进行优化,在积分兑换完商品后我们回到积分展示页面发现积分的数量并没有减少,而是重新进入才会发生变化,上一节我们实现商城订单的确认揽收之后继续在待收货页面实现确认揽收按钮的业务逻辑。
78 0
|
3月前
《仿盒马》app开发技术分享-- 逻辑优化第一弹(81)
随着上一节我们兑换商品订单相关逻辑的实现,我们的app功能已经更加的完善了,接下来我们开始对整个app缺失的小功能以及对已有的功能bug进行优化和逻辑的新增,这一节我们新增的功能是,商城订单的揽收 功能,兑换订单的取消后积分退回功能,如果不实现积分退回,就会出现用户兑换后取消订单,但是积分已经消耗的情况
74 0
|
3月前
《仿盒马》app开发技术分享-- 兑换商品收货确认&已完成列表展示(79)
上一节我们实现了兑换商品订单的确认揽收功能,实现了tabs切换时的数据刷新,实现了待收货订单的列表展示。这一节我们要实现确认收货功能,并且实现待收货的列表展示功能
78 0
|
3月前
《仿盒马》app开发技术分享-- 兑换商品确认揽收&待收货列表展示(78)
上一节我们实现了订单取消功能,实现了tabs切换时的数据刷新,实现了已取消订单的列表展示。这一节我们要实现揽收功能,并且实现待收货的列表展示功能
71 0
|
存储
《仿盒马》app开发技术分享-- 待发货兑换订单列表(76)
上一节我们实现了兑换订单展示页面的框架,这一节我们要进行兑换订单的展示,在兑换订单提交后,默认的状态是待发货状态,我们用列表的方式展示出来
74 0

热门文章

最新文章