鸿蒙期末个人项目-黑马健康——项目阶段八:发现页面和我的页面UI界面以及 ...

张裕  金牌会员 | 2024-10-22 19:08:37 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 354|帖子 354|积分 1062

目录

项目介绍:
页面布局:
分析:
发现页面UI设计:
我的页面UI设计:
登录页面UI设计:
健康信息页面UI设计:
页面实现效果:
出现的问题与办理:
阶段项目代码:
发现页面代码:
 我的页面代码:
登录页面代码:
健康信息页面代码:


项目介绍:

黑马健康软件是一款基于全民健康的软件,重要有三个页面构成,分别是欢迎页面,统计记录页面,食物列表页面。
页面布局:

分析:

发现页面UI设计:



  • 总体是一个列式布局,第一行是一有两个文本组件构成,第二行是由list组件构成的一个水平滑动样式,第三行是有两个文本构成,最后是由list组件渲染的列式布局样式
我的页面UI设计:



  • 总体是列式布局,第一行是有两个Image组件构成,此中一个是之前在食物列表页面用到的消息的渲染效果,另一个是一个设置按钮,点击按钮之后,会弹出一个panel弹窗,在这里可以点击换字体大小,实现全局变化字体大小的效果,并实现用户持久化;第二行是一个有Image组件和Text组件渲染的用户登录的样式,点击后,可以跳转到用户登录注册的界面(这里只实现了用户的登录),输入信息后,点击“登录”按钮,即可跳转回顾页,而且输入的账号等登录乐成的信息也会传递返来,而且重新进行登录注册组件的渲染。第三行是一个关于健康数据的组件,由Image组件和Text组件构成,点击后可以跳转到健康数据页面。最后一行是由List组件循环渲染的应用功能的组件。
登录页面UI设计:



  • 登录页面是一个列式布局,第一行是由Image组件构成的登录标识,第二行是一个文本组件,第三行和四行分别是输入的用户名和密码,最后一行是登录和注册的按钮;
健康信息页面UI设计:



  • 总体是列式布局,首部是有两个Image组件构成,此中一个是退出此页面,返回主页面的退回图片,下面的部分是由一个网格Grid组件构成的,用ForEach循环渲染健康信息。
页面实现效果:







出现的问题与办理:



  • 当不给这一行设定宽度的时间,Blank()组件是不起作用的

分配宽度之后:




  • 调用子组件时一直报错,但是不妨碍功能的利用,图片能正常加载



实行了很多遍,官方论坛里看还是没有办理
办理方式就是关闭编译器重新打开,不报错了


  • 发现页面的主题推荐,加载不出图片和文字资源。查抄之后,发现是构造函数的赋值错误

改动之后:图片资源和文字资源精确加载



  • 如果利用@Consume和@Provide来传递数据,只能在父子组件之间进行传递,不能在同一品级之间传递
  • 出现了运行时异常,在main_pages.json配置的必须是一个页面,带有@entry装饰器



  •  这里click利用的装饰器是@link,就不能利用 this. 去传递参数,应该利用$传递参数



  • 当未登录是不能获取到页面跳转所传递过来的值,加上条件判断,等点击登录按钮,而且传递过来当界说的@State修饰的状态变量仍是false的时间才获取数据否则不会获取数据,而且将这两个变量实现持久化。 出现的问题仍旧如下:

但是经过console.log后发现数据都传递过来了,
但是在用户登录的界面偶尔渲染不上,(那种感觉似乎是页面渲染和数据的传递在竞速)而且出现了一些bug,就是当实现登录后,点击退出,再次进入该应用时,就会发生一些运行时异常,直接卡退。
经过重新的梳理分析,发如今页面跳转获取数据时有逻辑上的问题,很可能没有执行登录,就去获取登录页面穿过来的值,这样就会导致卡退。办理办法就是利用一些状态参数来控制传值,当点击登录而且登录乐成时,才会去获取数据,进行数据传递和页面的渲染,在登录乐成之后,就会将背面页面渲染所要用到的数据实现持久化处理,而且状态参数也会实现持久化处理。

阶段项目代码:

发现页面代码:

  1. import { CommonConstants } from '../../common/constants/CommonConstants'
  2. import FunctionList from './FunctionList'
  3. import RecommendTheme from './RecommendTheme'
  4. import ThemeInfo from './ThemeInfo'
  5. /**
  6. * 发现页面
  7. */
  8. @Component
  9. export default struct FindPage {
  10.   @Consume fontSize:number
  11.   build() {
  12.     Column({ space: CommonConstants.SPACE_8 }) {
  13.       // 1.推荐主题
  14.       Row() {
  15.         Text('推荐主题')
  16.           .fontWeight(CommonConstants.FONT_WEIGHT_700)
  17.           .fontSize(this.fontSize+4)
  18.         Blank()
  19.         Text('更多')
  20.       }
  21.       .width(CommonConstants.THOUSANDTH_940)
  22.       .margin({ top: 10, bottom: 10 })
  23.       // 2.主题展示
  24.       Row({space:CommonConstants.SPACE_4}){
  25.         RecommendTheme()
  26.       }
  27.       .backgroundColor(Color.White)
  28.       .width(CommonConstants.THOUSANDTH_940)
  29.       .height(210)
  30.       .borderRadius(CommonConstants.DEFAULT_18)
  31.       .justifyContent(FlexAlign.SpaceEvenly)
  32.       .margin({ bottom: 10 })
  33.       // 3.功能管理
  34.       Row() {
  35.         Text('功能管理')
  36.           .fontWeight(CommonConstants.FONT_WEIGHT_700)
  37.           .fontSize(this.fontSize+4)
  38.         Blank()
  39.         Image($r('app.media.sort'))
  40.           .width(18)
  41.       }
  42.       .width(CommonConstants.THOUSANDTH_940)
  43.       .margin({ top: 10, bottom: 10 })
  44.       // 4.功能列表
  45.       FunctionList()
  46.         .layoutWeight(1)
  47.         .margin({left:5})
  48.    }
  49.     .width('100%')
  50.     .height('100%')
  51.     .backgroundColor($r('app.color.index_page_background'))
  52.   }
  53. }
复制代码
  1. import { CommonConstants } from '../../common/constants/CommonConstants'
  2. import ThemeInfo from './ThemeInfo'
  3. @Component
  4. export default struct RecommendTheme {
  5.    themeList: Array<ThemeInfo> = [
  6.     new ThemeInfo('绿泡泡', $r('app.media.background_green')),
  7.     new ThemeInfo('粉色回忆', $r('app.media.background_pink')),
  8.     new ThemeInfo('色彩碰撞', $r('app.media.background_color')),
  9.     new ThemeInfo('清凉一夏', $r('app.media.bacground_color2')),
  10.     new ThemeInfo('黑夜骑士', $r('app.media.background_color3')),
  11.     new ThemeInfo('甜美西瓜', $r('app.media.background_color4')),
  12.     new ThemeInfo('璀璨星河', $r('app.media.background_color5')),
  13.   ]
  14.   build() {
  15.     List(){
  16.       ForEach(this.themeList,(item:ThemeInfo)=>{
  17.         ListItem(){
  18.           Column({space:CommonConstants.SPACE_4}){
  19.             Image(item.images)
  20.               .width(120)
  21.               .aspectRatio(0.7)
  22.               .borderRadius(CommonConstants.DEFAULT_18)
  23.               .shadow({radius: 6, color:'#000000',offsetX:4,offsetY:4})
  24.             Text(item.name)
  25.               .fontWeight(20)
  26.           }
  27.         }.margin({left:7,right:5,top:10})
  28.       })
  29.     }.listDirection(Axis.Horizontal)//图片水平摆放
  30.   }
  31. }
复制代码

  1. import { CommonConstants } from '../../common/constants/CommonConstants'
  2. import ThemeInfo from './ThemeInfo'
  3. @Component
  4. export default struct  FunctionList{
  5.   @Consume fontSize:number
  6.   themeList: Array<ThemeInfo> = [
  7.     new ThemeInfo('消息通知', $r('app.media.fun_1')),
  8.     new ThemeInfo('闹钟', $r('app.media.fun_2')),
  9.     new ThemeInfo('名片', $r('app.media.fun_3')),
  10.     new ThemeInfo('查找设备', $r('app.media.fun_4')),
  11.     new ThemeInfo('遥控拍照', $r('app.media.fun_5')),
  12.     new ThemeInfo('天气推送', $r('app.media.fun_6')),
  13.     new ThemeInfo('音乐', $r('app.media.fun_7')),
  14.     new ThemeInfo('常用联系人', $r('app.media.fun_8')),
  15.     new ThemeInfo('健康提醒', $r('app.media.fun_9')),
  16.     new ThemeInfo('其他功能', $r('app.media.fun_10')),
  17.   ]
  18.   build() {
  19.     List(){
  20.       ForEach(this.themeList,(item:ThemeInfo)=>{
  21.         ListItem(){
  22.           Row({space:CommonConstants.SPACE_8}){
  23.             Image(item.images)
  24.               .width(35)
  25.               .height(35)
  26.               .margin({left:7,right:15})
  27.               .borderRadius(CommonConstants.DEFAULT_18)
  28.               // .shadow({radius: 6, color:'#000000',offsetX:4,offsetY:4})
  29.             Text(item.name)
  30.               .fontWeight(26)
  31.               .fontSize(this.fontSize-2)
  32.           }
  33.           .padding(8)
  34.           .backgroundColor(Color.White)
  35.           .borderRadius(CommonConstants.DEFAULT_18)
  36.           .width(CommonConstants.THOUSANDTH_940)
  37.           .height(50)
  38.         }.margin({left:12,right:5,top:2,bottom:8})
  39.       })
  40.     }
  41.   }
  42. }
复制代码
 我的页面代码:

  1. import router from '@ohos.router'
  2. import preferences from '@ohos.data.preferences'
  3. import { CommonConstants } from '../../common/constants/CommonConstants'
  4. import ChangePanel from '../../viewmodel/ChangePanel'
  5. import AppSetting from './AppSetting'
  6. import MyPageHeader from './MyPageHeader'
  7. import preferencesUtil from '../../common/utils/preferencesUtil'
  8. /**
  9. * 我的页面
  10. */
  11. @Component
  12. export default struct MyPage {
  13.    days:number = 1
  14.   @Consume showPanel:number
  15.   @Consume fontSize:number
  16.   @Prop username:string
  17.   @Prop hasLogin:boolean
  18.   @Link clickLogin:boolean
  19.   @State user_name:string = '用户请登录'
  20.   @State welcome_use:string = '请注册/登录使用~'
  21.   build() {
  22.     Column({space:CommonConstants.SPACE_8}){
  23.       // 1.我的页面首部
  24.       MyPageHeader()
  25.       // 2.用户的登录注册
  26.         Row(){
  27.           if(!this.hasLogin){
  28.             Image($r('app.media.entry'))
  29.               .width(70)
  30.               .fillColor(Color.Red)
  31.               .margin({right:10})
  32.           }else{
  33.             Image($r('app.media.user_img'))
  34.               .width(70)
  35.               .margin({right:10})
  36.           }
  37.           Column(){
  38.             if(this.hasLogin){
  39.               Text('ID:  '+this.username)
  40.                 .fontWeight(CommonConstants.FONT_WEIGHT_600)
  41.                 .fontColor(Color.Red)
  42.                 .fontSize(this.fontSize+4)
  43.               Text('欢迎使用黑马健康!')
  44.                 .fontColor($r('app.color.light_gray'))
  45.                 .fontSize(this.fontSize-2)
  46.             }else{
  47.               Text(this.user_name)
  48.                 .fontWeight(CommonConstants.FONT_WEIGHT_600)
  49.                 .fontColor(Color.Red)
  50.                 .fontSize(this.fontSize+4)
  51.               Text(this.welcome_use)
  52.                 .fontColor($r('app.color.light_gray'))
  53.                 .fontSize(this.fontSize-2)
  54.             }
  55.           }
  56.         }
  57.         .padding(10)
  58.         .height('100')
  59.         .width(CommonConstants.THOUSANDTH_940)
  60.         .justifyContent(FlexAlign.Start)
  61.         .margin({bottom:13,top:6})
  62.         .backgroundColor($r('app.color.White_Color'))
  63.         .borderRadius(CommonConstants.DEFAULT_10)
  64.         .onClick(()=>{
  65.           //当点击登录时,首先将this.clickLogin ,this.hasLogin的状态写进首选项
  66.           console.log('成功点击登录'+'testTag')
  67.           this.clickLogin = true
  68.           preferencesUtil.putPreferenceValue('UserLoginInfo','clickVictoryInfo',this.clickLogin)
  69.           this.hasLogin = false
  70.           preferencesUtil.putPreferenceValue('HasLogin','HasLoginInfo',this.hasLogin)
  71.           router.pushUrl({
  72.                 url:'pages/LoginPage'
  73.           })
  74.         })
  75.         // 3.健康使用
  76.         // 覆盖的功能
  77.       Row({space:CommonConstants.SPACE_8}){
  78.         Column({space:CommonConstants.SPACE_8}){
  79.           //您已健康使用多少天?点击查看健康数据
  80.           Text(`您已健康使用 ${this.days} 天`)
  81.             .fontSize(this.fontSize+4)
  82.             .fontWeight(CommonConstants.FONT_WEIGHT_600)
  83.             .fontColor(Color.White)
  84.           Text('点击查看您的健康信息')
  85.             .fontSize(this.fontSize-2)
  86.             .fontColor(Color.White)
  87.         }
  88.         Blank()
  89.        Image($r('app.media.healthInfo'))
  90.          .width(60)
  91.       }
  92.       .padding(10)
  93.       .width(CommonConstants.THOUSANDTH_940)
  94.       .height(80)
  95.       .backgroundColor($r('app.color.primary_color'))
  96.       .borderRadius(CommonConstants.DEFAULT_18)
  97.       .shadow({radius: 6, color:'#000000',offsetX:7,offsetY:10})
  98.       .onClick(()=>{
  99.         router.pushUrl({
  100.           url:'pages/HealthStatisticPage'
  101.         })
  102.       })
  103.       //VIP设置
  104.       Row({space:CommonConstants.SPACE_8}){
  105.         Column({space:CommonConstants.SPACE_8}){
  106.           Text('升级VIP享更多专属权限')
  107.             .fontSize(this.fontSize+2)
  108.             .fontWeight(CommonConstants.FONT_WEIGHT_600)
  109.             .fontColor(Color.White)
  110.           Text('升级VIP享更多专属权限')
  111.             .fontSize(this.fontSize-2)
  112.             .fontColor(Color.White)
  113.         }
  114.         Blank()
  115.         Button('去升级')
  116.           .type(ButtonType.Capsule)
  117.           .fontColor($r('app.color.primary_color'))
  118.           .backgroundColor(Color.White)
  119.       }
  120.       .padding(10)
  121.       .width(CommonConstants.THOUSANDTH_940)
  122.       .height(80)
  123.       .backgroundColor($r('app.color.primary_color'))
  124.       .borderRadius(CommonConstants.DEFAULT_18)
  125.       .shadow({radius: 6, color:'#000000',offsetX:7,offsetY:10})
  126.       // 4.应用的设置等
  127.         AppSetting()
  128.           .layoutWeight(1)
  129.       if(this.showPanel===1){
  130.         ChangePanel()
  131.           .transition({
  132.             translate: { y: 115 }
  133.           })
  134.           .layoutWeight(1)
  135.       }
  136.     }
  137.     .width('100%')
  138.     .height('100%')
  139.     .backgroundColor($r('app.color.index_page_background'))
  140.   }
  141. }
复制代码
  1. import { CommonConstants } from '../../common/constants/CommonConstants'
  2. @Component
  3. export default struct MyPageHeader {
  4.   @Consume showPanel:number
  5.   build() {
  6.     Column(){
  7.       // 1.设置按钮和信息
  8.       Row({space:CommonConstants.SPACE_10}){
  9.         Blank()
  10.         Image($r('app.media.setting')).width(28).margin({right:10})
  11.           .onClick(()=>{
  12.             this.showPanel = -this.showPanel
  13.             console.log("弹窗显示成功",'testTag')
  14.           })
  15.         Badge({count:1,position:BadgePosition.RightTop,style:{fontSize:12}}){
  16.           Image($r('app.media.ic_public_email'))
  17.             .width(28)
  18.         }
  19.       }
  20.       .width(350)
  21.       .margin({top:7})
  22.       .height(30)
  23.     }
  24.   }
  25. }
复制代码
登录页面代码:

  1. import router from '@ohos.router'
  2. import prompt from '@ohos.prompt'
  3. import { CommonConstants } from '../common/constants/CommonConstants'
  4. import preferencesUtil from '../common/utils/preferencesUtil'
  5. @Entry
  6. @Component
  7. struct LoginPage {
  8.   @State username:string = ''
  9.   @State password:string = ''
  10.   @State hasLogin:boolean = false
  11.   build() {
  12.    
  13.       Image($r('app.media.login_img'))
  14.         .width(60)
  15.         .margin({top:160,bottom:10})
  16.       Text('欢迎登录')
  17.         .fontWeight(CommonConstants.FONT_WEIGHT_600)
  18.         .fontSize(30)
  19.       Row(){
  20.         Text('用户名:').fontWeight(CommonConstants.FONT_WEIGHT_600).fontSize(18)
  21.         TextInput({placeholder:'请输入用户名:'})
  22.           .margin({top:20,bottom:15})
  23.           .width(250)
  24.           .height(40)
  25.           .fontColor(Color.Blue)
  26.           .onChange((value:string)=>{
  27.             this.username = value
  28.           })
  29.         }.width(300)
  30.       Row(){
  31.         Text('密   码:').fontWeight(CommonConstants.FONT_WEIGHT_600).fontSize(18)
  32.         TextInput({placeholder:'请输入密码:'})
  33.           .type(InputType.Password)
  34.           .width(250)
  35.           .height(40)
  36.           .fontColor(Color.Blue)
  37.           .onChange((value:string)=>{
  38.             this.password = value
  39.           })
  40.       }.width(300)
  41.       Row({space:CommonConstants.SPACE_12}){
  42.         Button('登录')
  43.           .type(ButtonType.Capsule)
  44.           .fontSize(18)
  45.           .backgroundColor($r('app.color.primary_color'))
  46.           .onClick(()=>{
  47.             // router.back()
  48.             //如果输入的用户名或者密码为空,则提示
  49.             if(this.username==='' || this.password ===''){
  50.               //登录失败
  51.               prompt.showToast({
  52.                 message:"账号和密码均不可以为空!"
  53.               })
  54.             }else{
  55.               //登录成功
  56.               this.hasLogin = true
  57.               console.log('hasLogin:'+this.hasLogin.toString()+'testTag')
  58.               console.log('username:'+this.username.toString()+'testTag')
  59.               //将已经登录成功的信息写入首选项
  60.               preferencesUtil.putPreferenceValue('HasLogin','HasLoginInfo',this.hasLogin)
  61.               router.replaceUrl({
  62.                 url:'pages/Index',
  63.                 params:{
  64.                   username:this.username,
  65.                 }
  66.               })
  67.             }
  68.           })
  69.         Button('注册')
  70.           .type(ButtonType.Capsule)
  71.           .fontSize(18)
  72.           .backgroundColor($r('app.color.light_gray'))
  73.       }.margin({top:30})
  74.     }
  75.     .backgroundColor($r('app.color.index_page_background'))
  76.     .height('100%')
  77.     .width('100%')
  78.   }
  79. }
复制代码
健康信息页面代码:

  1. import router from '@ohos.router'
  2. import { CommonConstants } from '../common/constants/CommonConstants'
  3. import preferencesUtil from '../common/utils/preferencesUtil'
  4. import HealthComponent from '../view/health/HealthComponent'
  5. @Entry
  6. @Component
  7. struct HealthStatisticPage {
  8.   @State hasLogin:boolean = false
  9.   async aboutToAppear(){
  10.     //将登录成功的值从用户首选项中取出来
  11.     this.hasLogin = await preferencesUtil.getPreferenceValue('HasLogin','HasLoginInfo',false) as boolean
  12.   }
  13.   build() {
  14.     Column({space:CommonConstants.SPACE_10}){
  15.       Row({space:CommonConstants.SPACE_10}){
  16.         Image($r('app.media.ic_public_back')).width(40)
  17.           .onClick(()=>{
  18.             router.back()
  19.           })
  20.         Text('健康').fontSize(20)
  21.         Blank()
  22.         if(this.hasLogin){
  23.           Image($r('app.media.user_img')).width(40)
  24.         }else{
  25.           Image($r('app.media.entry')).width(40)
  26.         }
  27.       }
  28.       .width(CommonConstants.THOUSANDTH_940)
  29.       .margin({top:10})
  30.       //网格记录项,祥康组件
  31.       HealthComponent()
  32.             .layoutWeight(1)
  33.     }.width('100%')
  34.     .height('100%')
  35.     .backgroundColor($r('app.color.index_page_background'))
  36.   }
  37. }
复制代码



参考黑马课堂老师的讲解,欢迎大家的批评和指正。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表