wwf
4 天以前 7f2343d38fa048f6ce179ea0ab2c1a04f41a213c
功能完善
1 文件已重命名
9个文件已修改
21个文件已添加
1182 ■■■■ 已修改文件
entry/src/main/ets/pages/MainPage.ets 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/account/AboutPage.ets 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/account/AccountPage.ets 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/account/CourseCollection.ets 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/account/LearningRecordPage.ets 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/account/MessagePushPage.ets 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/account/PersonVitae.ets 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/account/SettingPage.ets 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/account/UserInfoPage.ets 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/home/BannerDetail.ets 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/home/ClassificationDetail.ets 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/home/Home.ets 233 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/login/LoginPage.ets 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/account_vitae.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/classification_detail_AI.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/classification_detail_bigdata.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/classification_detail_cloudcalc.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/classification_detail_cloudservice.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/classification_detail_link.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/classification_detail_roc.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/classification_detail_safety.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/classification_detail_shutong.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/classification_detail_storage.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/message_circle.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/message_gift.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/message_note.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/message_pencil.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/media/person_vitae.png 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/resources/base/profile/main_pages.json 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
oh-package-lock.json5 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
oh-package.json5 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entry/src/main/ets/pages/MainPage.ets
@@ -20,7 +20,7 @@
    { icon: 'tabs_message_icon', title: '消息' },
    { icon: 'tabs_account_icon', title: '我的' }
  ]
  @State selectIndex: number = 3
  @State selectIndex: number = 0
  private tabController: TabsController = new TabsController()
  @Builder tabItem(icon: ResourceStr,title: string,index: number){
entry/src/main/ets/pages/account/AboutPage.ets
New file
@@ -0,0 +1,112 @@
@Entry
@Component
export struct AboutPage {
  build() {
    Column() {
      Row() {
        Image($r('app.media.left_icon'))
          .width(20)
          .height(20)
        Text('关于')
          .fontSize(18)
          .fontWeight(700)
        Row()
      }
      .width('100%')
      .padding(10)
      .justifyContent(FlexAlign.SpaceBetween)
      Divider()
      Column() {
        Column({ space: 10 }) {
          Image($r('app.media.logo'))
            .width(60)
            .height(60)
          Text('学聘同行')
            .fontSize(14)
            .fontWeight(500)
            .fontColor(Color.Black)
          Text('当前版本 V2.1.2')
            .fontSize(14)
            .fontWeight(500)
            .fontColor('#999999')
        }
        .width('100%')
        .height('30%')
        .padding({ top: 50 })
        Column() {
          Divider()
            .margin({ bottom: 6 })
          List({ space: 10, initialIndex: 0 }){
            ListItem() {
              Row() {
                Text('检测更新')
                  .fontSize(14)
                  .fontWeight(500)
                  .layoutWeight(1)
                Image($r('app.media.chevron_right'))
                  .width(12)
                  .height(12)
              }
              .width('100%')
              .padding(8)
            }
            ListItem() {
              Row() {
                Text('去评分')
                  .fontSize(14)
                  .fontWeight(500)
                  .layoutWeight(1)
                Image($r('app.media.chevron_right'))
                  .width(12)
                  .height(12)
              }
              .width('100%')
              .padding(8)
            }
            ListItem() {
              Row() {
                Text('用户协议')
                  .fontSize(14)
                  .fontWeight(500)
                  .layoutWeight(1)
                Image($r('app.media.chevron_right'))
                  .width(12)
                  .height(12)
              }
              .width('100%')
              .padding(8)
            }
            ListItem() {
              Row() {
                Text('隐私政策')
                  .fontSize(14)
                  .fontWeight(500)
                  .layoutWeight(1)
                Image($r('app.media.chevron_right'))
                  .width(12)
                  .height(12)
              }
              .width('100%')
              .padding(8)
            }
          }
          .listDirection(Axis.Vertical) // 排列方向
          .scrollBar(BarState.Off)
          .friction(0.6)
          .edgeEffect(EdgeEffect.Spring)
          .width('100%')
          .divider({strokeWidth: 1,color: '#f0f0f0'})
        }
        .padding(16)
      }
      .padding({ top: 10 })
      .width('100%')
      .height('100%')
    }
  }
}
entry/src/main/ets/pages/account/AccountPage.ets
@@ -1,6 +1,73 @@
import { ComponentContent, router } from "@kit.ArkUI"
import { PromptActionClass } from '../../utils/PromptActionClass';
class accountListItem {
  title: string = ''
  icon: string | Resource = ''
}
class DialogParams {
  text: string = "";
  constructor(text: string) {
    this.text = text;
  }
}
@Builder
function buildText(params: DialogParams) {
  Column({ space: 12 }) {
    Text('已沟通')
      .width('100%')
      .fontSize(18)
      .fontWeight(700)
      .textAlign(TextAlign.Center)
    Text('4')
      .fontSize(26)
      .fontWeight(700)
      .fontColor('#1761f4')
      .width('100%')
      .textAlign(TextAlign.Center)
    Text('累计沟通岗位数')
      .fontSize(14)
      .fontColor('#666666')
    Text('您是职场中的中流砥柱')
      .width('100%')
      .textAlign(TextAlign.Center)
      .padding(16)
      .fontSize(14)
      .fontColor(Color.Black)
      .fontWeight(500)
      .backgroundColor('#f6f7fa')
  }
  .width(300)
  .padding(20)
  .borderRadius(14)
  .backgroundColor(Color.White)
}
@Builder
function buildText1(params: DialogParams) {
  Column({ space: 12 }) {
    Text('帮助中心')
      .width('100%')
      .fontSize(18)
      .fontWeight(700)
      .fontColor(Color.Black)
      .textAlign(TextAlign.Center)
    Text('400-100-1212')
      .fontSize(26)
      .fontWeight(700)
      .fontColor(Color.Black)
      .width('100%')
      .textAlign(TextAlign.Center)
    Button('拨打电话')
      .width('100%')
      .type(ButtonType.Normal)
      .borderRadius(8)
  }
  .width(300)
  .padding(20)
  .borderRadius(14)
  .backgroundColor(Color.White)
}
@Entry
@@ -12,6 +79,17 @@
    { title: '帮助中心', icon: $r('app.media.account_help') },
    { title: '关于我们', icon: $r('app.media.account_info') },
  ]
  @State dialogMessage: string = '注册成功';
  private ctx: UIContext = this.getUIContext();
  private contentNode: ComponentContent<Object> =
    new ComponentContent(this.ctx, wrapBuilder(buildText), new DialogParams((this.dialogMessage)));
  params: DialogParams = new DialogParams('注册成功')
  aboutToAppear(): void {
    PromptActionClass.setContext(this.ctx);
    PromptActionClass.setContentNode(this.contentNode);
    PromptActionClass.setOptions({ alignment: DialogAlignment.Center, offset: { dx: 0, dy: 0 } });
  }
  build() {
    Column() {
      Text('个人中心')
@@ -50,6 +128,11 @@
            .height(18)
        }
        .width('100%')
        .onClick(() =>{
          router.pushUrl({
            url: ''
          })
        })
        Column({ space: 16 }) {
          Row() {
@@ -132,7 +215,7 @@
            .fontColor(Color.Black)
        }
        Column({ space: 6 }) {
          Image($r('app.media.account_jianli'))
          Image($r('app.media.account_vitae'))
            .width(40)
            .height(40)
          Text('个人简历')
@@ -149,6 +232,12 @@
            .fontWeight(500)
            .fontColor(Color.Black)
        }
        .onClick(() => {
          console.log('点击')
          this.contentNode = new ComponentContent(this.ctx, wrapBuilder(buildText), new DialogParams((this.dialogMessage)));
          PromptActionClass.setContentNode(this.contentNode);
          PromptActionClass.openDialog()
        })
      }
      .width('100%')
      .backgroundColor(Color.White)
@@ -176,6 +265,21 @@
              }
              .width('100%')
              .padding(8)
              .onClick(() => {
                if (item.title == '隐私设置') {
                  router.pushUrl({
                    url: ''
                  })
                } else if (item.title == '消息通知') {
                } else if (item.title == '帮助中心') {
                  this.contentNode = new ComponentContent(this.ctx, wrapBuilder(buildText1), new DialogParams((this.dialogMessage)));
                  PromptActionClass.setContentNode(this.contentNode);
                  PromptActionClass.openDialog()
                } else if (item.title == '关于我们') {
                }
              })
            }
          })
        }
entry/src/main/ets/pages/account/CourseCollection.ets
New file
@@ -0,0 +1,126 @@
class Course {
  title: string = ''
  desc: string = ''
  count: string = ''
  time: string = ''
  difficult: string = ''
}
@Entry
@Component
export struct CourseCollection {
  @State courseList: Course[] = [
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: 'Java高级:JVM深度调优与JVM深度调优', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
  ]
  build() {
    Column() {
      Row() {
        Image($r('app.media.left_icon'))
          .width(20)
          .height(20)
        Text('课程收藏')
          .fontSize(18)
          .fontWeight(700)
        Row()
      }
      .width('100%')
      .padding(10)
      .justifyContent(FlexAlign.SpaceBetween)
      Divider()
      Column() {
        List({ space: 10, initialIndex: 0 }) {
          ForEach(this.courseList, (item: Course, index: number) => {
            ListItem() {
              Row({ space: 10 }) {
                Column() {
                  Text(item.title)
                    .fontSize(14)
                    .fontWeight(800)
                    .maxLines(1)
                    .textOverflow({ overflow: TextOverflow.Ellipsis })
                  Text(item.desc)
                    .fontSize(12)
                    .fontColor('#666666')
                    .maxLines(2)
                    .textOverflow({ overflow: TextOverflow.Ellipsis })
                  Row() {
                    Row({ space: 2 }) {
                      Image($r('app.media.person_icon'))
                        .width(10)
                        .height(10)
                      Text(item.count)
                        .fontSize(10)
                        .fontColor('#666666')
                    }
                    Row({ space: 2 }) {
                      Image($r('app.media.video_icon'))
                        .width(10)
                        .height(10)
                      Text(item.time)
                        .fontSize(10)
                        .fontColor('#666666')
                    }
                    Text() {
                      Span('课程难度: ')
                      Span(item.difficult)
                    }
                    .fontSize(10)
                    .fontColor('#666666')
                  }
                  .width('100%')
                  .justifyContent(FlexAlign.SpaceBetween)
                }
                .layoutWeight(0)
                .width(170)
                .height('100%')
                .justifyContent(FlexAlign.SpaceBetween)
                .alignItems(HorizontalAlign.Start)
                Image($r('app.media.active_list_img'))
                  .aspectRatio(16/9)
                  .height('100%')
                  .layoutWeight(1)
              }
              .width('100%')
              .height(100)
              .padding(10)
              .justifyContent(FlexAlign.SpaceBetween)
              .border({ width: 1, style: BorderStyle.Solid, color: '#f2f2f2' })
              .borderRadius(10)
            }
          }, (index: number) => index.toString())
        }
        .listDirection(Axis.Vertical) // 排列方向
        .scrollBar(BarState.Off)
        .friction(0.6)
        .edgeEffect(EdgeEffect.Spring)
        .width('100%')
        .height('100%')
      }
      .padding(16)
    }
    .width('100%')
    .height('100%')
  }
}
entry/src/main/ets/pages/account/LearningRecordPage.ets
New file
@@ -0,0 +1,98 @@
import { McLineChart, Options } from '@mcui/mccharts'
@Entry
@Component
export struct LearningRecordPage {
  @State maxData: number[] = [0, 0, 0, 5, 0, 5, 0]
  // 初始化数据
  @State seriesOption: Options = new Options({
    xAxis:{
      data:['09-01','09-02','09-03','09-04','09-05','09-06','09-07']
    },
    yAxis:{
      name:'分钟'
    },
    series:[
      {
        name:'学习时长',
        data: this.maxData
      }
    ]
  })
  build() {
    Column() {
      Row() {
        Image($r('app.media.left_icon'))
          .width(20)
          .height(20)
        Text('学习记录')
          .fontSize(18)
          .fontWeight(700)
        Row()
      }
      .width('100%')
      .padding(10)
      .justifyContent(FlexAlign.SpaceBetween)
      Divider()
      Column({ space: 20 }) {
        Row() {
          Column({ space: 12 }) {
            Text('总学习时长')
              .fontColor('#666666')
              .fontSize(14)
            Text() {
              Span('10')
                .fontSize(20)
                .fontWeight(700)
                .fontColor('#1761f4')
              Span(' 分钟')
                .fontSize(12)
            }
          }
          Column({ space: 12 }) {
            Text('今日学习时长')
              .fontColor('#666666')
              .fontSize(14)
            Text() {
              Span('0')
                .fontSize(20)
                .fontWeight(700)
                .fontColor('#1761f4')
              Span(' 分钟')
                .fontSize(12)
            }
          }
        }
        .width('100%')
        .justifyContent(FlexAlign.SpaceEvenly)
        .padding(20)
        .borderRadius(10)
        .shadow({ radius: 10, color: '#dcdcdc' })
        Text('近一周学习时长统计')
          .fontSize(14)
          .fontColor(Color.Black)
          .fontWeight(500)
          .width('100%')
        Column(){
          McLineChart({
            options: this.seriesOption
          })
        }
        .width('100%')
        .height(200)
      }
      .padding(16)
    }
    .width('100%')
    .height('100%')
  }
}
entry/src/main/ets/pages/account/MessagePushPage.ets
New file
@@ -0,0 +1,98 @@
class MessageItem {
  icon: string | Resource = ''
  title: string = ''
  desc: string = ''
  time: string = ''
  isRead: boolean = false
}
@Entry
@Component
export struct MessagePushPage {
  @State messagePushFlag: boolean = false
  @State autoUpdateFlag: boolean = false
  @State messageList: MessageItem[] = [
    { icon: $r('app.media.message_note'), title: '课程提醒', desc: '您报名的《全栈开发:前后端打通实战》', time: '09-01 12:55', isRead: false },
    { icon: $r('app.media.message_gift'), title: '福袋派送官', desc: '您获得了一张价值100元的课程抵扣券,您可以从', time: '09-01 10:55', isRead: true },
    { icon: $r('app.media.message_pencil'), title: '官方通知', desc: '本平台将于09-01 00 对平台进行维护,请各位用户', time: '08-31 10:55', isRead: true }
  ]
  build() {
    Column() {
      Row() {
        Image($r('app.media.left_icon'))
          .width(20)
          .height(20)
        Text('消息通知')
          .fontSize(18)
          .fontWeight(700)
        Row()
      }
      .width('100%')
      .padding(10)
      .justifyContent(FlexAlign.SpaceBetween)
      Divider()
      Column() {
        List({ space: 10, initialIndex: 0 }){
          ForEach(this.messageList, (item: MessageItem) => {
            ListItem() {
              Row() {
                Image(item.icon)
                  .width(40)
                  .height(40)
                Column({ space: 10 }) {
                  Row() {
                    Text(item.title)
                      .fontSize(14)
                      .fontWeight(500)
                      .fontColor(Color.Black)
                    Text(item.time)
                      .fontSize(12)
                      .fontWeight(500)
                      .margin({ left: 10 })
                      .fontColor('#666666')
                  }
                  .width('100%')
                  Text(item.desc)
                    .width('100%')
                    .fontSize(12)
                    .maxLines(1)
                    .fontColor('#666666')
                    .textOverflow({ overflow: TextOverflow.Ellipsis })
                }
                .width(260)
                .margin({ left: 10 })
                if (!item.isRead) {
                  Image($r('app.media.message_circle'))
                    .width(10)
                    .height(10)
                }
              }
              .width('100%')
              .height(80)
              .padding({ left: 16,right: 16, top: 4, bottom: 4 })
              .borderRadius(10)
              .backgroundColor(Color.White)
              .onClick(() => {
              })
            }
          })
        }
        .listDirection(Axis.Vertical) // 排列方向
        .scrollBar(BarState.Off)
        .friction(0.6)
        .edgeEffect(EdgeEffect.Spring)
        .width('100%')
        .divider({strokeWidth: 1,color: '#f0f0f0'})
      }
      .padding({ top: 10 })
      .backgroundColor('#f5f5f7')
      .width('100%')
      .height('100%')
    }
  }
}
entry/src/main/ets/pages/account/PersonVitae.ets
New file
@@ -0,0 +1,25 @@
@Entry
@Component
export struct CourseCollection {
  build() {
    Column() {
      Row() {
        Image($r('app.media.left_icon'))
          .width(20)
          .height(20)
        Text('个人简历')
          .fontSize(18)
          .fontWeight(700)
        Row()
      }
      .width('100%')
      .padding(10)
      .justifyContent(FlexAlign.SpaceBetween)
      Divider()
      Image($r('app.media.person_vitae'))
        .width('100%')
    }
  }
}
entry/src/main/ets/pages/account/SettingPage.ets
New file
@@ -0,0 +1,70 @@
@Entry
@Component
export struct SettingPage {
  @State messagePushFlag: boolean = false
  @State autoUpdateFlag: boolean = false
  build() {
    Column() {
      Row() {
        Image($r('app.media.left_icon'))
          .width(20)
          .height(20)
        Text('隐私设置')
          .fontSize(18)
          .fontWeight(700)
        Row()
      }
      .width('100%')
      .padding(10)
      .justifyContent(FlexAlign.SpaceBetween)
      Divider()
      Column() {
        Row() {
          Column({ space: 10 }) {
            Text('是否开启消息推送')
              .fontColor(Color.Black)
              .width('100%')
            Text(`您已经${this.messagePushFlag?'开启':'关闭'}消息推送`)
              .fontSize(12)
              .fontColor('#666666')
              .width('100%')
          }
          .layoutWeight(1)
          Toggle({ type: ToggleType.Switch, isOn: this.messagePushFlag })
            .selectedColor('#007DFF')
            .switchPointColor('#FFFFFF')
            .onChange(() => {
              this.messagePushFlag = !this.messagePushFlag
            })
        }
        Divider().margin({ top: 20, bottom: 20 })
          .color('#ededed')
        Row() {
          Column({ space: 10 }) {
            Text('是否开启自动更新')
              .fontColor(Color.Black)
              .width('100%')
            Text(`您已经${this.autoUpdateFlag?'开启':'关闭'}自动更新`)
              .fontSize(12)
              .fontColor('#666666')
              .width('100%')
          }
          .layoutWeight(1)
          Toggle({ type: ToggleType.Switch, isOn: this.autoUpdateFlag })
            .selectedColor('#007DFF')
            .switchPointColor('#FFFFFF')
            .onChange(() => {
              this.autoUpdateFlag = !this.autoUpdateFlag
            })
        }
      }
      .padding(16)
      .width('100%')
      .height('100%')
    }
  }
}
entry/src/main/ets/pages/account/UserInfoPage.ets
New file
@@ -0,0 +1,115 @@
@Entry
@Component
export struct UserInfo {
  @State nickName: string = ''
  @State gender: string = ''
  @State age: string = ''
  @State preferJob: string = ''
  @State job: string = ''
  @State introduce: string = ''
  build() {
    Column() {
      Row() {
        Image($r('app.media.left_icon'))
          .width(20)
          .height(20)
        Text('个人信息')
          .fontSize(18)
          .fontWeight(700)
        Row()
      }
      .width('100%')
      .padding(10)
      .justifyContent(FlexAlign.SpaceBetween)
      Divider()
      Column({ space: 14 }) {
        Column() {
          Text(`昵称`)
            .fontSize(14)
            .fontColor('#666666')
            .width('100%')
          TextInput({ placeholder: '请输入', text: this.nickName })
            .placeholderFont({ size: 14 })
            .showUnderline(true)
            .margin({ top: -6 })
        }
        Column() {
          Text(`性别`)
            .fontSize(14)
            .fontColor('#666666')
            .width('100%')
          TextInput({ placeholder: '请输入', text: this.gender })
            .placeholderFont({ size: 14 })
            .showUnderline(true)
            .margin({ top: -6 })
        }
        Column() {
          Text(`年龄`)
            .fontSize(14)
            .fontColor('#666666')
            .width('100%')
          TextInput({ placeholder: '请输入', text: this.age })
            .placeholderFont({ size: 14 })
            .showUnderline(true)
            .margin({ top: -6 })
        }
        Column() {
          Text(`职业`)
            .fontSize(14)
            .fontColor('#666666')
            .width('100%')
          TextInput({ placeholder: '请输入', text: this.job })
            .placeholderFont({ size: 14 })
            .showUnderline(true)
            .margin({ top: -6 })
        }
        Column() {
          Text(`心仪职业`)
            .fontSize(14)
            .fontColor('#666666')
            .width('100%')
          TextInput({ placeholder: '请输入', text: this.preferJob })
            .placeholderFont({ size: 14 })
            .showUnderline(true)
            .margin({ top: -6 })
        }
        Column() {
          Text(`个人简介`)
            .fontColor('#666666')
            .fontSize(14)
            .width('100%')
          TextArea({ placeholder: '介绍一下你自己吧~', text: this.job })
            .placeholderFont({ size: 14 })
            .backgroundColor('#fff')
            .border({ width: 1, color: '#666666' })
            .borderRadius(5)
            .minLines(10)
            .maxLength(200)
            .showCounter(true)
            .margin({ top: 10 })
        }
        Button('保存')
          .fontSize(14)
          .height(36)
          .type(ButtonType.Normal)
          .borderRadius(6)
          .width('100%')
          .fontColor(Color.White)
          .backgroundColor('#1761f4')
      }
      .height('100%')
      .width('100%')
      .padding(16)
    }
  }
}
entry/src/main/ets/pages/home/BannerDetail.ets
@@ -1,17 +1,61 @@
import { router } from "@kit.ArkUI";
import { promptAction, router } from "@kit.ArkUI";
import { http } from "@kit.NetworkKit";
import { HttpResponseResult } from "../../data/HttpResponse";
import { LvMarkdownIn } from "@luvi/lv-markdown-in"
class BannerInfo {
  pic: string = ''
  content: string = ''
}
@Entry
@Component
export struct BannerDetail {
  @State index: number = 0;
struct BannerDetail {
  @State bannerId: string = '';
  @State bannerInfo: BannerInfo = {
    pic: '',
    content: ''
  }
  aboutToAppear(): void {
    interface Params {
      index: number
      bannerId: string
    }
    const params: Params = router.getParams() as Params
    if (params) {
      this.index = params.index
      this.bannerId = params.bannerId
      console.log('bannerId', this.bannerId)
      this.getDetail()
    }
  }
  getDetail() {
    interface PostData  {
      bannerId: string,
    }
    let postData: PostData = {
      bannerId: this.bannerId
    }
    let httpRequest = http.createHttp();
    httpRequest.request(
      `http://192.168.20.70:8080/quiz-community/public/v1.0/home/slideshows/details?bannerId=${this.bannerId}`,
      {
        method: http.RequestMethod.GET,
        header: { 'Content-Type': 'application/json', 'x-jwt-token': `Bearer ${AppStorage.get('x-jwt-token')}` },
      },
      (err, data) => {
        console.log('response', '/home/slideshows/details')
        console.log(JSON.stringify(data.result))
        if (data.responseCode == 200) {
          const resData = (typeof data.result == 'string' ? JSON.parse(data.result) : data.result) as HttpResponseResult<BannerInfo>
          if (resData.code == 200) {
            this.bannerInfo = resData.data as BannerInfo
          } else {
            promptAction.showToast({ message: resData.msg })
          }
        }
      }
    )
  }
  build() {
@@ -20,6 +64,9 @@
        Image($r('app.media.left_icon'))
          .width(20)
          .height(20)
          .onClick(() => {
            router.back()
          })
        Text('详情页')
          .fontSize(18)
          .fontWeight(700)
@@ -29,31 +76,13 @@
      .padding(10)
      .justifyContent(FlexAlign.SpaceBetween)
      Image($r('app.media.image1'))
      Image(this.bannerInfo.pic)
        .width('100%')
        .height(150)
      Column({ space: 10 }) {
        Text('华为[1+X]《网络系统建设与运维》')
          .fontWeight(800)
      LvMarkdownIn({ text: this.bannerInfo.content.toString() })
          .width('100%')
        Text('课程介绍')
          .width('100%')
          .fontSize(14)
          .fontWeight(800)
          .margin({ top: 10 })
        Text('本课程是计算机网络技术、通信技术等专业的专业核心课程,旨在培养学生的网络技术职业能力、职业素养和创新能力。' +
          '\n采用项目式实训教学,通过引入一个循序渐进的企业网络组建案例,让学生在模拟真实场景中掌握中小型企业网络组建的知识和能力' +
          '教材内容覆盖华为“1+X”证书考试要求,包含大量实操练习。')
          .width('100%')
          .fontSize(13)
          .lineHeight(20)
      }
      .padding(14)
        .height(560)
    }
    .width('100%')
entry/src/main/ets/pages/home/ClassificationDetail.ets
@@ -1,15 +1,43 @@
import { router } from "@kit.ArkUI"
import { promptAction, router } from "@kit.ArkUI"
import { http } from "@kit.NetworkKit"
import { LvMarkdownIn } from "@luvi/lv-markdown-in"
import { HttpResponseResult } from "../../data/HttpResponse"
@Entry
@Component
export struct ClassificationDetail {
  @State title: string = ''
  @State moduleName: string = ''
  @State content: string = ''
  aboutToAppear(): void {
    interface Params {
      title: string
      moduleName: string
    }
    const params = router.getParams() as Params
    this.title = params.title
    this.moduleName = params.moduleName
    this.getDetail()
  }
  getDetail() {
    let httpRequest = http.createHttp();
    httpRequest.request(
      `http://192.168.20.70:8080/quiz-community/public/v1.0/home/module/details?moduleName=${this.moduleName}`,
      {
        method: http.RequestMethod.GET,
        header: { 'Content-Type': 'application/json', 'x-jwt-token': `Bearer ${AppStorage.get('x-jwt-token')}` },
      },
      (err, data) => {
        console.log('response', '/home/module/details')
        console.log(JSON.stringify(data.result))
        if (data.responseCode == 200) {
          const resData = (typeof data.result == 'string' ? JSON.parse(data.result) : data.result) as HttpResponseResult<string>
          if (resData.code == 200) {
            this.content = resData.data || ''
          } else {
            promptAction.showToast({ message: resData.msg })
          }
        }
      }
    )
  }
  build() {
@@ -18,6 +46,9 @@
        Image($r('app.media.left_icon'))
          .width(20)
          .height(20)
          .onClick(() => {
            router.back()
          })
        Text('详情页')
          .fontSize(18)
          .fontWeight(700)
@@ -27,26 +58,14 @@
      .padding(10)
      .justifyContent(FlexAlign.SpaceBetween)
      Image($r('app.media.image1'))
      if (this.moduleName) {
        Image($r(`app.media.classification_detail_${this.moduleName}`))
        .width('100%')
        .height(180)
      Column({ space: 10 }) {
        Text('详情介绍')
          .width('100%')
          .fontSize(14)
          .fontWeight(800)
          .margin({ top: 10 })
        Text('本课程是计算机网络技术、通信技术等专业的专业核心课程,旨在培养学生的网络技术职业能力、职业素养和创新能力。' +
          '\n采用项目式实训教学,通过引入一个循序渐进的企业网络组建案例,让学生在模拟真实场景中掌握中小型企业网络组建的知识和能力' +
          '教材内容覆盖华为“1+X”证书考试要求,包含大量实操练习。')
          .width('100%')
          .fontSize(13)
          .lineHeight(20)
      }
      .padding(14)
      LvMarkdownIn({ text: this.content.toString() })
        .width('100%')
        .height(560)
    }
    .width('100%')
    .height('100%')
entry/src/main/ets/pages/home/Home.ets
@@ -1,79 +1,83 @@
import { router } from "@kit.ArkUI"
import { promptAction, router } from "@kit.ArkUI"
import http from '@ohos.net.http';
import { HttpResponseResult } from "../../data/HttpResponse";
import { JSON } from "@kit.ArkTS";
class TabBarBase {
  title: string = ''
}
class SwiperItem {
  pic: string = ''
  id: string = ''
  sort: number = 0
}
class Classification {
  title: string = ''
  value: string = ''
  icon: ResourceStr = ''
}
class Activity {
  title: string = ''
  timeScope: string = ''
  signupCount: number = 0
  statusText: string = ''
  id: string = ''
  name: string = ''
  pic: string = ''
  startDate: string = ''
  endTime: string = ''
  signupCount: string = ''
  status: string = ''
}
class Course {
  title: string = ''
  desc: string = ''
  count: string = ''
  time: string = ''
  difficult: string = ''
  name: string = ''
  pic: string = ''
  description: string = ''
  playCount: number = 0
  duration: number = 0
  difficulty: number = 0
}
@Entry
@Component
export struct Home {
  @State pageHeight: number = 0
  @State activeIndex:number = 1
  @State activeIndex:number = 0
  @State tabList: TabBarBase[] = [
    { title: '首页' },
    { title: '课程' }
  ]
  private tabController: TabsController = new TabsController()
  @State swiperList: ResourceStr[] = [
    $r('app.media.image1'),
    $r('app.media.image1'),
    $r('app.media.image1'),
  ]
  @State swiperList: SwiperItem[] = []
  @State swiperIndex: number = 0
  //TabBar样式
  @State classificationList: Classification[] = [
    { title: '数通', icon: $r('app.media.classification_shutong') },
    { title: '安全', icon: $r('app.media.classification_safety') },
    { title: '云计算', icon: $r('app.media.classification_cloudcalc') },
    { title: '存储', icon: $r('app.media.classification_storage') },
    { title: '鲲鹏', icon: $r('app.media.classification_roc') },
    { title: 'AI', icon: $r('app.media.classification_AI') },
    { title: '连接', icon: $r('app.media.classification_link') },
    { title: '大数据', icon: $r('app.media.classification_bigdata') },
    { title: '云服务', icon: $r('app.media.classification_cloudservice') },
    { title: '更多', icon: $r('app.media.classification_more') },
    { title: '数通', value: 'shutong', icon: $r('app.media.classification_shutong') },
    { title: '安全', value: 'safety', icon: $r('app.media.classification_safety') },
    { title: '云计算', value: 'cloudcalc', icon: $r('app.media.classification_cloudcalc') },
    { title: '存储', value: 'storage', icon: $r('app.media.classification_storage') },
    { title: '鲲鹏', value: 'roc', icon: $r('app.media.classification_roc') },
    { title: 'AI', value: 'AI', icon: $r('app.media.classification_AI') },
    { title: '连接', value: 'link', icon: $r('app.media.classification_link') },
    { title: '大数据', value: 'bigdata', icon: $r('app.media.classification_bigdata') },
    { title: '云服务', value: 'cloudservice', icon: $r('app.media.classification_cloudservice') },
    { title: '更多', value: '', icon: $r('app.media.classification_more') },
  ]
  @State activityList: Activity[] = [
    { title: '北京人工智能IE', timeScope: '20250520-20250620', signupCount: 80, statusText: '报名中' },
    { title: '北京人工智能IE', timeScope: '20250520-20250620', signupCount: 80, statusText: '进行中' },
    { title: '北京人工智能IE', timeScope: '20250520-20250620', signupCount: 80, statusText: '已结束' },
    { title: '北京人工智能IE', timeScope: '20250520-20250620', signupCount: 80, statusText: '报名中' },
    { title: '北京人工智能IE', timeScope: '20250520-20250620', signupCount: 80, statusText: '已结束' },
  ]
  @State activityList: Activity[] = []
  @State courseList: Course[] = [
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: 'Java高级:JVM深度调优与JVM深度调优', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: 'Java高级:JVM深度调优与JVM深度调优', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
    // { title: '零基础到企业级项目实战', 'desc': '针对零基础小白或想升级技术栈的前端从业者,从核心语法入手,逐步深入Vue3组件开发打件开发件开发', count: '800', time: '01:30:23', difficult: '简单' },
  ]
@@ -93,24 +97,110 @@
  getTagFontColor(statusText: string) {
    switch (statusText) {
      case '报名中':
      case 'signup':
        return '#10920e'
      case '进行中':
      case 'training':
        return '#ffa100'
      default :
        return '#666666'
    }
  }
  getTagBgColor(statusText: string) {
    switch (statusText) {
      case '报名中':
  getTagBgColor(status: string) {
    switch (status) {
      case 'signup':
        return '#d5f2db'
      case '进行中':
      case 'training':
        return '#fff0cc'
      default :
        return '#ebebeb'
    }
  }
  getStatusText(status: string) {
    if (status == 'signup') {
      return '报名中'
    } else if (status == 'training') {
      return '进行中'
    } else if (status == 'finished') {
      return '已结束'
    }
    return ''
  }
  aboutToAppear(): void {
    this.getBannerList()
    this.getActivityList()
    this.getCourseList()
  }
  getBannerList() {
    let httpRequest = http.createHttp();
    httpRequest.request(
      "http://192.168.20.70:8080/quiz-community/public/v1.0/home/slideshows",
      {
        method: http.RequestMethod.GET,
        header: { 'Content-Type': 'application/json', 'x-jwt-token': `Bearer ${AppStorage.get('x-jwt-token')}` },
      },
      (err, data) => {
        console.log('response', '/home/slideshows')
        console.log(JSON.stringify(data.result))
        if (data.responseCode == 200) {
          const resData = (typeof data.result == 'string' ? JSON.parse(data.result) : data.result) as HttpResponseResult<SwiperItem[]>
          if (resData.code == 200) {
            this.swiperList = resData.data || []
          } else {
            promptAction.showToast({ message: resData.msg })
          }
        }
      }
    )
  }
  getActivityList() {
    let httpRequest = http.createHttp();
    httpRequest.request(
      "http://192.168.20.70:8080/quiz-community/public/v1.0/home/hotTraining",
      {
        method: http.RequestMethod.GET,
        header: { 'Content-Type': 'application/json', 'x-jwt-token': `Bearer ${AppStorage.get('x-jwt-token')}` },
      },
      (err, data) => {
        console.log('response', '/home/hotTraining')
        console.log(JSON.stringify(data.result))
        if (data.responseCode == 200) {
          const resData = (typeof data.result == 'string' ? JSON.parse(data.result) : data.result) as HttpResponseResult<Activity[]>
          if (resData.code == 200) {
            this.activityList = resData.data || []
          } else {
            promptAction.showToast({ message: resData.msg })
          }
        }
      }
    )
  }
  getCourseList() {
    let httpRequest = http.createHttp();
    httpRequest.request(
      "http://192.168.20.70:8080/quiz-community/public/v1.0/home/courses",
      {
        method: http.RequestMethod.GET,
        header: { 'Content-Type': 'application/json', 'x-jwt-token': `Bearer ${AppStorage.get('x-jwt-token')}` },
      },
      (err, data) => {
        console.log('response', '/home/courses')
        console.log(JSON.stringify(data.result))
        if (data.responseCode == 200) {
          const resData = (typeof data.result == 'string' ? JSON.parse(data.result) : data.result) as HttpResponseResult<Course[]>
          if (resData.code == 200) {
            this.courseList = resData.data || []
          } else {
            promptAction.showToast({ message: resData.msg })
          }
        }
      }
    )
  }
  build() {
@@ -127,16 +217,16 @@
            TabContent() {
              Column({ space: 10 }){
                Swiper() {
                  ForEach(this.swiperList, (item: Resource) => {
                    Image(item)
                  ForEach(this.swiperList, (item: SwiperItem) => {
                    Image(item.pic)
                      .width('100%')
                      .height(120)
                      .backgroundColor(0xAFEEEE)
                      .onClick(() => {
                        this.getUIContext().getRouter().pushUrl({
                        router.push({
                          url: 'pages/home/BannerDetail',
                          params: {
                            id: index
                            bannerId: item.id
                          }
                        })
                      })
@@ -169,10 +259,11 @@
                          .fontWeight(500)
                      }
                      .onClick(() => {
                        if (!item.value) return
                        router.pushUrl({
                          url: 'pages/home/ClassificationDetail',
                          params: {
                            title: item.title
                            moduleName: item.value
                          }
                        })
                      })
@@ -202,14 +293,14 @@
                    ListItem() {
                      Row() {
                        Column({ space: 6 }) {
                          Text(item.title)
                          Text(item.name)
                            .fontSize(12)
                            .fontWeight(500)
                          Row() {
                            Image($r('app.media.date_icon'))
                              .width(12)
                              .height(12)
                            Text(item.timeScope)
                            Text(`${item.startDate}-${item.endTime}`)
                              .fontSize(10)
                              .fontColor('#676767')
                              .margin({ left: 4 })
@@ -217,13 +308,13 @@
                          Text(`${item.signupCount || 0}人已报名`)
                            .fontSize(10)
                            .fontColor('#676767')
                          Text(item.statusText)
                          Text(this.getStatusText(item.status))
                            .fontSize(10)
                            .fontWeight(500)
                            .padding(6)
                            .borderRadius(10)
                            .fontColor(this.getTagFontColor(item.statusText))
                            .backgroundColor(this.getTagBgColor(item.statusText))
                            .fontColor(this.getTagFontColor(item.status))
                            .backgroundColor(this.getTagBgColor(item.status))
                        }
                        .height('100%')
                        .justifyContent(FlexAlign.Start)
@@ -253,7 +344,7 @@
                .divider({ strokeWidth: 1, color: '#e8e8e8' }) // 每行之间的分界线
                .edgeEffect(EdgeEffect.Spring)
                .width('100%')
                .height(300)
                .height(360)
              }
              .height('100%')
            }
@@ -284,12 +375,12 @@
                    ListItem() {
                      Row({ space: 10 }) {
                        Column() {
                          Text(item.title)
                          Text(item.name)
                            .fontSize(14)
                            .fontWeight(800)
                            .maxLines(1)
                            .textOverflow({ overflow: TextOverflow.Ellipsis })
                          Text(item.desc)
                          Text(item.description)
                            .fontSize(12)
                            .fontColor('#666666')
                            .maxLines(2)
@@ -299,7 +390,7 @@
                              Image($r('app.media.person_icon'))
                                .width(10)
                                .height(10)
                              Text(item.count)
                              Text(`${item.playCount}`)
                                .fontSize(10)
                                .fontColor('#666666')
                            }
@@ -307,13 +398,13 @@
                              Image($r('app.media.video_icon'))
                                .width(10)
                                .height(10)
                              Text(item.time)
                              Text(`${item.duration}`)
                                .fontSize(10)
                                .fontColor('#666666')
                            }
                            Text() {
                              Span('课程难度: ')
                              Span(item.difficult)
                              Span(`${item.difficulty}`)
                            }
                            .fontSize(10)
                            .fontColor('#666666')
entry/src/main/ets/pages/login/LoginPage.ets
@@ -1,5 +1,5 @@
import { UserInfoBase } from '../../data/UserInfoBase'
import { promptAction } from '@kit.ArkUI'
import { promptAction, router } from '@kit.ArkUI'
import PreferencesUtils from '../../utils/PreferencesUtils'
import http from '@ohos.net.http';
import { HttpResponseResult } from '../../data/HttpResponse';
@@ -86,6 +86,9 @@
            PreferencesUtils.putPreferences('UserInfo','user',JSON.stringify(this.userInfoData))
            AppStorage.SetOrCreate('x-jwt-token', resData.data?.token)
            promptAction.showToast({ message: '登录成功' })
            router.push({
              url: 'pages/MainPage'
            })
          } else {
            promptAction.showToast({ message: resData.msg })
          }
entry/src/main/resources/base/media/account_vitae.png

entry/src/main/resources/base/media/classification_detail_AI.png
entry/src/main/resources/base/media/classification_detail_bigdata.png
entry/src/main/resources/base/media/classification_detail_cloudcalc.png
entry/src/main/resources/base/media/classification_detail_cloudservice.png
entry/src/main/resources/base/media/classification_detail_link.png
entry/src/main/resources/base/media/classification_detail_roc.png
entry/src/main/resources/base/media/classification_detail_safety.png
entry/src/main/resources/base/media/classification_detail_shutong.png
entry/src/main/resources/base/media/classification_detail_storage.png
entry/src/main/resources/base/media/message_circle.png
entry/src/main/resources/base/media/message_gift.png
entry/src/main/resources/base/media/message_note.png
entry/src/main/resources/base/media/message_pencil.png
entry/src/main/resources/base/media/person_vitae.png
entry/src/main/resources/base/profile/main_pages.json
@@ -10,6 +10,11 @@
    "pages/home/ActiveDetail",
    "pages/search/SearchPage",
    "pages/message/MessagePage",
    "pages/message/MessageDetailsPage"
    "pages/message/MessageDetailsPage",
    "pages/account/UserInfoPage",
    "pages/account/LearningRecordPage",
    "pages/account/SettingPage",
    "pages/account/MessagePushPage",
    "pages/account/AboutPage"
  ]
}
oh-package-lock.json5
@@ -6,10 +6,38 @@
  "lockfileVersion": 3,
  "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
  "specifiers": {
    "@luvi/html2md@^1.0.0": "@luvi/html2md@1.0.3",
    "@luvi/lv-markdown-in@^2.0.15": "@luvi/lv-markdown-in@2.0.15",
    "@mcui/mccharts@^2.8.9": "@mcui/mccharts@2.8.9",
    "@ohos/hamock@1.0.0": "@ohos/hamock@1.0.0",
    "@ohos/hypium@1.0.21": "@ohos/hypium@1.0.21"
    "@ohos/hypium@1.0.21": "@ohos/hypium@1.0.21",
    "@wuyan/hm_chart@^2.0.4": "@wuyan/hm_chart@2.0.4"
  },
  "packages": {
    "@luvi/html2md@1.0.3": {
      "name": "",
      "version": "1.0.3",
      "integrity": "sha512-BBa2FqQKQ48dBmG+n2z63IGpbIV4Gc/g5Qj1FGssZ6ki+DHqYknZ46FRVRJeKtrfmCjYoiiKx5FtBjOuqnwbtA==",
      "resolved": "https://ohpm.openharmony.cn/ohpm/@luvi/html2md/-/html2md-1.0.3.har",
      "registryType": "ohpm"
    },
    "@luvi/lv-markdown-in@2.0.15": {
      "name": "",
      "version": "2.0.15",
      "integrity": "sha512-PSM3/BybA7QkYwiRUaxmsMdzBXyyz3AAQmdy84PzdTLo0t8AH7oOo4j01C6LvvnX0OzaQ6T3pFIpMOUqGxWEZg==",
      "resolved": "https://ohpm.openharmony.cn/ohpm/@luvi/lv-markdown-in/-/lv-markdown-in-2.0.15.har",
      "registryType": "ohpm",
      "dependencies": {
        "@luvi/html2md": "^1.0.0"
      }
    },
    "@mcui/mccharts@2.8.9": {
      "name": "",
      "version": "2.8.9",
      "integrity": "sha512-mdpzc6TlYlR/xV+OH3u0Jq5s1UeND8EKQuyXUdtjPMozffrbitPWJcp5N4Fji9v1xs8d/WP62OKnbp79iWMtHA==",
      "resolved": "https://ohpm.openharmony.cn/ohpm/@mcui/mccharts/-/mccharts-2.8.9.har",
      "registryType": "ohpm"
    },
    "@ohos/hamock@1.0.0": {
      "name": "",
      "version": "1.0.0",
@@ -23,6 +51,13 @@
      "integrity": "sha512-iyKGMXxE+9PpCkqEwu0VykN/7hNpb+QOeIuHwkmZnxOpI+dFZt6yhPB7k89EgV1MiSK/ieV/hMjr5Z2mWwRfMQ==",
      "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.21.har",
      "registryType": "ohpm"
    },
    "@wuyan/hm_chart@2.0.4": {
      "name": "",
      "version": "2.0.4",
      "integrity": "sha512-fjyE05RpY0splKSNe5HWA4XHcQ4hZFyoKsJCQu27H8B7AvzCp3UcO5Y+Gsb+hfmg5kItNzVl3RkwUZ2klX2ffg==",
      "resolved": "https://ohpm.openharmony.cn/ohpm/@wuyan/hm_chart/-/hm_chart-2.0.4.har",
      "registryType": "ohpm"
    }
  }
}
oh-package.json5
@@ -2,9 +2,13 @@
  "modelVersion": "5.0.5",
  "description": "Please describe the basic information.",
  "dependencies": {
    "@wuyan/hm_chart": "^2.0.4",
    "@mcui/mccharts": "^2.8.9",
    "@luvi/lv-markdown-in": "^2.0.15"
  },
  "devDependencies": {
    "@ohos/hypium": "1.0.21",
    "@ohos/hamock": "1.0.0"
  }
  },
  "dynamicDependencies": {}
}