From e89a5f15ce00862bb6ae330ef5072e14b3af49d2 Mon Sep 17 00:00:00 2001 From: xiaoxiao Date: Wed, 27 Aug 2025 16:11:20 +0800 Subject: [PATCH] =?UTF-8?q?1.2.0=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AppScope/app.json5 | 4 +- commons/basic/Index.ets | 6 +- .../src/main/ets/Views/ScreeningView.ets | 107 +++ .../basic/src/main/ets/components/HdNav.ets | 21 +- .../src/main/ets/constants/BasicConstant.ets | 37 +- .../src/main/ets/models/LoginInfoModel.ets | 4 +- .../src/main/ets/models}/TagListModel.ets | 0 .../basic/src/main/ets/models}/TeachModel.ets | 0 .../resources/base/media/cb_screen_no.png | Bin 0 -> 1364 bytes .../resources/base/media/cb_screen_yes.png | Bin 0 -> 1364 bytes .../resources/base/media/eye_main_color.png | Bin 0 -> 1864 bytes .../base/media/kejian_download_icon.png | Bin 0 -> 1413 bytes corekit/hmrouter-consumer-rules.txt | 3 + corekit/hmrouter-obfuscation-rules.txt | 3 + features/Home/Index.ets | 4 +- .../main/ets/components/HomeSwiperComp.ets | 9 +- .../main/ets/components/ListCompGandan.ets | 3 +- .../src/main/ets/components/SecondaryLink.ets | 303 +++++--- .../src/main/ets/model/VideoTypeModel.ets | 2 +- .../src/main/ets/pages/EducationVideo.ets | 26 + features/Home/src/main/ets/pages/HomePage.ets | 39 +- features/Home/src/main/ets/pages/PlayBack.ets | 29 +- .../Home/src/main/ets/pages/VideoGandan.ets | 66 +- .../Home/src/main/ets/pages/VideoPage.ets | 2 +- .../base/media/home_top_scroll_default.png | Bin 0 -> 4380 bytes .../base/media/video_gandan_bottom_icon.png | Bin 0 -> 1865 bytes .../base/media/video_gandan_navigation2.png | Bin 0 -> 1394 bytes .../media/video_gandan_navigation_change.png | Bin 0 -> 1446 bytes .../src/main/ets/components/ItemCompTeach.ets | 2 +- .../netease/src/main/ets/view/SearchComp.ets | 2 +- .../netease/src/main/ets/view/TuwenComp.ets | 2 +- .../components/CopyAddAndEditRecordComp.ets | 647 ++++++++++++++++++ .../ets/components/RecordTheIllnessComp.ets | 4 +- .../src/main/ets/utils/ImageCompressor.ets | 293 ++++++++ .../register/src/main/ets/view/LoginComp.ets | 56 +- features/study/BuildProfile.ets | 17 + features/study/Index.ets | 5 + features/study/hvigorfile.ts | 6 + features/study/obfuscation-rules.txt | 23 + features/study/oh-package-lock.json5 | 25 + features/study/oh-package.json5 | 12 + .../main/ets/components/CoursewareComp.ets | 253 +++++++ .../src/main/ets/components/KeepStudyComp.ets | 84 +++ .../main/ets/components/SchoolhouseComp.ets | 290 ++++++++ .../study/src/main/ets/models/KeJianModel.ets | 35 + .../src/main/ets/views/ItemCompTeach.ets | 68 ++ .../src/main/ets/views/KeJianItemComp.ets | 139 ++++ features/study/src/main/module.json5 | 11 + .../main/resources/base/element/float.json | 8 + .../main/resources/base/element/string.json | 8 + .../resources/base/media/keepStudy_kejian.png | Bin 0 -> 5239 bytes .../base/media/keepStudy_video_icon.png | Bin 0 -> 5709 bytes .../base/media/kejian_list_right_bottom.png | Bin 0 -> 8895 bytes .../resources/base/media/kejian_type_pdff.png | Bin 0 -> 6282 bytes .../resources/base/media/kejian_type_ppt.png | Bin 0 -> 4708 bytes .../base/media/kejian_type_wordd.png | Bin 0 -> 5089 bytes .../media/schoolhouse_navigation_right.png | Bin 0 -> 1999 bytes .../study/src/ohosTest/ets/test/List.test.ets | 5 + features/study/src/ohosTest/module.json5 | 13 + features/study/src/test/List.test.ets | 5 + features/study/src/test/LocalUnit.test.ets | 33 + polyv/hmrouter-consumer-rules.txt | 3 + polyv/hmrouter-obfuscation-rules.txt | 3 + .../ets/pages/Courseware/CoursewarePage.ets | 13 + .../src/main/ets/pages/Tabbar/TabBarComp.ets | 52 +- .../pages/VideoPage/EducationVideoPage.ets | 13 + .../pages/WebView/EducationDetailsWebPage.ets | 87 +++ .../media/new_home_huaunjiao_SelectedIcon.png | Bin 0 -> 2562 bytes .../base/media/new_home_huaunjiao_icon.png | Bin 0 -> 3021 bytes .../base/media/new_nextStudy_default.png | Bin 0 -> 3703 bytes .../base/media/new_nextStudy_selected.png | Bin 0 -> 2802 bytes .../resources/base/profile/main_pages.json | 5 +- .../hmrouter-consumer-rules.txt | 3 + .../hmrouter-obfuscation-rules.txt | 3 + 74 files changed, 2704 insertions(+), 192 deletions(-) create mode 100644 commons/basic/src/main/ets/Views/ScreeningView.ets rename {features/Home/src/main/ets/model => commons/basic/src/main/ets/models}/TagListModel.ets (100%) rename {features/netease/src/main/ets/model => commons/basic/src/main/ets/models}/TeachModel.ets (100%) create mode 100644 commons/basic/src/main/resources/base/media/cb_screen_no.png create mode 100644 commons/basic/src/main/resources/base/media/cb_screen_yes.png create mode 100644 commons/basic/src/main/resources/base/media/eye_main_color.png create mode 100644 commons/basic/src/main/resources/base/media/kejian_download_icon.png create mode 100644 corekit/hmrouter-consumer-rules.txt create mode 100644 corekit/hmrouter-obfuscation-rules.txt create mode 100644 features/Home/src/main/ets/pages/EducationVideo.ets create mode 100644 features/Home/src/main/resources/base/media/home_top_scroll_default.png create mode 100644 features/Home/src/main/resources/base/media/video_gandan_bottom_icon.png create mode 100644 features/Home/src/main/resources/base/media/video_gandan_navigation2.png create mode 100644 features/Home/src/main/resources/base/media/video_gandan_navigation_change.png create mode 100644 features/patient/src/main/ets/components/CopyAddAndEditRecordComp.ets create mode 100644 features/patient/src/main/ets/utils/ImageCompressor.ets create mode 100644 features/study/BuildProfile.ets create mode 100644 features/study/Index.ets create mode 100644 features/study/hvigorfile.ts create mode 100644 features/study/obfuscation-rules.txt create mode 100644 features/study/oh-package-lock.json5 create mode 100644 features/study/oh-package.json5 create mode 100644 features/study/src/main/ets/components/CoursewareComp.ets create mode 100644 features/study/src/main/ets/components/KeepStudyComp.ets create mode 100644 features/study/src/main/ets/components/SchoolhouseComp.ets create mode 100644 features/study/src/main/ets/models/KeJianModel.ets create mode 100644 features/study/src/main/ets/views/ItemCompTeach.ets create mode 100644 features/study/src/main/ets/views/KeJianItemComp.ets create mode 100644 features/study/src/main/module.json5 create mode 100644 features/study/src/main/resources/base/element/float.json create mode 100644 features/study/src/main/resources/base/element/string.json create mode 100644 features/study/src/main/resources/base/media/keepStudy_kejian.png create mode 100644 features/study/src/main/resources/base/media/keepStudy_video_icon.png create mode 100644 features/study/src/main/resources/base/media/kejian_list_right_bottom.png create mode 100644 features/study/src/main/resources/base/media/kejian_type_pdff.png create mode 100644 features/study/src/main/resources/base/media/kejian_type_ppt.png create mode 100644 features/study/src/main/resources/base/media/kejian_type_wordd.png create mode 100644 features/study/src/main/resources/base/media/schoolhouse_navigation_right.png create mode 100644 features/study/src/ohosTest/ets/test/List.test.ets create mode 100644 features/study/src/ohosTest/module.json5 create mode 100644 features/study/src/test/List.test.ets create mode 100644 features/study/src/test/LocalUnit.test.ets create mode 100644 polyv/hmrouter-consumer-rules.txt create mode 100644 polyv/hmrouter-obfuscation-rules.txt create mode 100644 products/expert/src/main/ets/pages/Courseware/CoursewarePage.ets create mode 100644 products/expert/src/main/ets/pages/VideoPage/EducationVideoPage.ets create mode 100644 products/expert/src/main/ets/pages/WebView/EducationDetailsWebPage.ets create mode 100644 products/expert/src/main/resources/base/media/new_home_huaunjiao_SelectedIcon.png create mode 100644 products/expert/src/main/resources/base/media/new_home_huaunjiao_icon.png create mode 100644 products/expert/src/main/resources/base/media/new_nextStudy_default.png create mode 100644 products/expert/src/main/resources/base/media/new_nextStudy_selected.png create mode 100644 scene_single_video/hmrouter-consumer-rules.txt create mode 100644 scene_single_video/hmrouter-obfuscation-rules.txt diff --git a/AppScope/app.json5 b/AppScope/app.json5 index 7a8795b..cc127c9 100644 --- a/AppScope/app.json5 +++ b/AppScope/app.json5 @@ -2,8 +2,8 @@ "app": { "bundleName": "cn.shangyu.gdxzExports", "vendor": "example", - "versionCode": 1000000, - "versionName": "1.0.0", + "versionCode": 1000003, + "versionName": "1.1.0", "icon": "$media:layered_image", "label": "$string:app_name" } diff --git a/commons/basic/Index.ets b/commons/basic/Index.ets index c35df9a..c147c74 100644 --- a/commons/basic/Index.ets +++ b/commons/basic/Index.ets @@ -109,4 +109,8 @@ export { customAttachment } from './src/main/ets/models/customAttachment' export { ImageUtil } from './src/main/ets/utils/ImageUtil' -export { compressedImage,saveImageToGallery,CompressedImageInfo } from './src/main/ets/utils/ImageCompressUtils' \ No newline at end of file +export { compressedImage,saveImageToGallery,CompressedImageInfo } from './src/main/ets/utils/ImageCompressUtils' + +export { ScreeningView } from './src/main/ets/Views/ScreeningView' + +export { TagListModel, TagList} from './src/main/ets/models/TagListModel' \ No newline at end of file diff --git a/commons/basic/src/main/ets/Views/ScreeningView.ets b/commons/basic/src/main/ets/Views/ScreeningView.ets new file mode 100644 index 0000000..27f00b1 --- /dev/null +++ b/commons/basic/src/main/ets/Views/ScreeningView.ets @@ -0,0 +1,107 @@ +import { TagList, TagListModel } from "../models/TagListModel"; +import { promptAction } from "@kit.ArkUI"; +import { HashMap } from "@kit.ArkTS"; +import { BusinessError } from "@kit.BasicServicesKit"; +import { hdHttp, HdResponse } from "../utils/request"; +import { BasicConstant } from "../constants/BasicConstant"; + +@Component +export struct ScreeningView { + @State tags:TagList[] = [] + @Prop selectedArray:TagList[] = [] + @Prop type:string = '0' + private isSelectedItem?: (value: TagList[]) => void; + + aboutToAppear(): void { + let hashMap: HashMap = new HashMap(); + hdHttp.post(BasicConstant.tagList,{ + type:this.type + } as TagModel).then(async (res: HdResponse) => { + let json:TagListModel = JSON.parse(res+'') as TagListModel; + if (json.code == '1') { + this.tags = json.data + } + }).catch((err: BusinessError) => { + console.error('Response tagList'+err) + }) + } + + build() { + Column() { + Grid() { + ForEach(this.tags, (item: TagList, index: number) => { + GridItem() { + Text(item.NAME) + .height(25) + .width('100%') + .padding({left:5,right:5}) + .fontWeight(FontWeight.Regular) + .fontSize(13) + .maxLines(1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .fontColor(this.selectedArray.some(selected=>selected.ID === item.ID)?$r('app.color.top_title'): $r('app.color.999999')) + // .fontColor(this.selectedArray.indexOf(item)!=-1 ? $r('app.color.top_title'): $r('app.color.999999')) + .textAlign(TextAlign.Center) + .border({ width: 1, color:this.selectedArray.some(selected=>selected.ID === item.ID)? $r('app.color.top_title'): '#999999' }) + .borderRadius(30) + .onClick(() => { + const targetIndex = this.selectedArray.findIndex( + selected => selected.ID === item.ID + ); + if(targetIndex !== -1) { + const newSelected = [...this.selectedArray]; + newSelected.splice(targetIndex, 1); + this.selectedArray = newSelected; + } else { + if (this.selectedArray.length >= 3) { + promptAction.showToast({ message: '最多选择三个标签!', duration: 1000 }); + return; + } + this.selectedArray.push(item) + } + }) + } + }) + } + .padding(10) + .columnsTemplate('1fr 1fr 1fr 1fr') + .columnsGap(10) + .rowsGap(10) + .backgroundColor(Color.White) + .height('100%') + .width('100%') + .layoutWeight(1) + Row() { + Text('重置').height(40) + .textAlign(TextAlign.Center) + .fontColor($r('app.color.top_title') ) + .border({ width: 1, color: $r('app.color.top_title') }) + .borderRadius(5) + .layoutWeight(1) + .margin({left:15}) + .onClick(()=>{ + this.selectedArray= []; + }) + Text('确定') + .height(40) + .fontColor(Color.White).textAlign(TextAlign.Center) + .border({ width: 1, color: $r('app.color.top_title') }) + .borderRadius(5) + .layoutWeight(1) + .backgroundColor($r('app.color.top_title')) + .margin({left:10,right:15}) + .onClick(()=>{ + this.isSelectedItem?.(this.selectedArray) + }) + }.width('100%') + .height(60) + .backgroundColor(Color.White) + } + .width('100%') + .height('100%') + } +} + +interface TagModel { + type:string +} diff --git a/commons/basic/src/main/ets/components/HdNav.ets b/commons/basic/src/main/ets/components/HdNav.ets index 0823ec1..893c3aa 100644 --- a/commons/basic/src/main/ets/components/HdNav.ets +++ b/commons/basic/src/main/ets/components/HdNav.ets @@ -22,8 +22,12 @@ export struct HdNav { @Prop rightIcon: ResourceStr = $r('sys.media.ohos_ic_public_more') @Prop + twoRightIcon: ResourceStr = $r('sys.media.ohos_ic_public_more') + @Prop showRightIcon: boolean = true @Prop + showTwoRightItem: boolean = false + @Prop showLeftIcon: boolean = true @Prop showRightText: boolean = false @@ -41,6 +45,8 @@ export struct HdNav { isLeftAction: boolean = false // 添加右侧点击函数 private rightItemAction:()=> void = () => {}; + // 添加右侧第二个按钮的点击函数 + private twoRightItemAction:()=> void = () => {}; // 添加左侧点击函数 private leftItemAction:()=> void = () => {}; @@ -74,20 +80,29 @@ export struct HdNav { this.titleBuilder() } } + .margin({left:this.showTwoRightItem?20:0}) .height(56) .width(150) .layoutWeight(1) if (this.showRightIcon) { - Row() - { + Row() { Image(this.rightIcon) .size({ width: 24, height: 24 }) .objectFit(ImageFit.Contain) .bindMenu(this.menuBuilder) .onClick(()=>this.rightItemAction()) + if (this.showTwoRightItem) { + Image(this.twoRightIcon) + .margin({left:15}) + .size({ width: 24, height: 24 }) + .objectFit(ImageFit.Contain) + .bindMenu(this.menuBuilder) + .onClick(()=>this.twoRightItemAction()) + } } - .size({ width: 50, height: 50 }).justifyContent(FlexAlign.End) + .size(this.showTwoRightItem?{width:70,height:50}:{ width: 50, height: 50 }) + .justifyContent(FlexAlign.End) } else if (this.showRightText) { Text(this.rightText) diff --git a/commons/basic/src/main/ets/constants/BasicConstant.ets b/commons/basic/src/main/ets/constants/BasicConstant.ets index 5cfaeb9..00aecf9 100644 --- a/commons/basic/src/main/ets/constants/BasicConstant.ets +++ b/commons/basic/src/main/ets/constants/BasicConstant.ets @@ -6,27 +6,28 @@ export class BasicConstant { static readonly getzcxy = "https://doc.igandan.com/app/integral/hmos_expert_zcxy.html";// 注册协议正式地址 //测试环境 - // static readonly urlExpertAPI = "https://dev-app.igandan.com/app/expertAPI/"; - // static readonly urlExpertApp = "https://dev-app.igandan.com/app/expertApp/" - // static readonly urlHtml = "http://dev-doc.igandan.com/app/" - // static readonly urlImage = "https://dev-doc.igandan.com/app/" - // static readonly urlExpert = "https://dev-app.igandan.com/app/expert/" - // static readonly wxUrl = "https://dev-wx.igandan.com/"; - // static readonly polvId = "11";//保利威视学员id - // static readonly urlApp="https://dev-app.igandan.com/app/" + static readonly urlExpertAPI = "https://dev-app.igandan.com/app/expertAPI/"; + static readonly urlExpertApp = "https://dev-app.igandan.com/app/expertApp/" + static readonly urlHtml = "http://dev-doc.igandan.com/app/" + static readonly urlImage = "https://dev-doc.igandan.com/app/" + static readonly urlExpert = "https://dev-app.igandan.com/app/expert/" + static readonly wxUrl = "https://dev-wx.igandan.com/"; + static readonly polvId = "11";//保利威视学员id + static readonly urlApp="https://dev-app.igandan.com/app/" //正式环境 - static readonly urlExpertAPI = "https://app.igandan.com/app/expertAPI/"; - static readonly urlExpertApp = "http://app.igandan.com/app/expertApp/" - static readonly urlHtml = "http://doc.igandan.com/app/" - static readonly urlImage = "http://doc.igandan.com/app/" - static readonly urlExpert = "http://app.igandan.com/app/expert/" - static readonly wxUrl = "https://wx.igandan.com/";// 微信服务器地址 - static readonly polvId = "21";//保利威视学员id - static readonly urlApp="http://app.igandan.com/app/" + // static readonly urlExpertAPI = "https://app.igandan.com/app/expertAPI/"; + // static readonly urlExpertApp = "http://app.igandan.com/app/expertApp/" + // static readonly urlHtml = "http://doc.igandan.com/app/" + // static readonly urlImage = "http://doc.igandan.com/app/" + // static readonly urlExpert = "http://app.igandan.com/app/expert/" + // static readonly wxUrl = "https://wx.igandan.com/";// 微信服务器地址 + // static readonly polvId = "21";//保利威视学员id + // static readonly urlApp="http://app.igandan.com/app/" static readonly getSystemTimeStamp = BasicConstant.urlApp+'manager/getSystemTimeStamp' static readonly addBonusPoints = BasicConstant.urlExpertApp+'addBonusPoints' static readonly indexV2 = BasicConstant.urlExpertAPI+'indexV2';//首页轮播 + static readonly getAppActivity = BasicConstant.urlExpertAPI+'getAppActivity' static readonly applyList = BasicConstant.urlExpert+'applyList' static readonly groupList = BasicConstant.urlExpertApp+'groupList' static readonly isMaiLanExpert = BasicConstant.urlExpertAPI+'isMaiLanExpert' @@ -72,7 +73,11 @@ export class BasicConstant { static readonly meetingHistoryList = BasicConstant.urlExpertAPI + "meetingHistoryList"; static readonly videoRoll = BasicConstant.urlExpertAPI + "videoRoll"; static readonly expertVideoTypeList = BasicConstant.urlExpertAPI + "expertVideoTypeList"; + static readonly patientVideoNew = BasicConstant.urlExpertApp + 'patientVideoNew'; static readonly videoByKeyWordsNew = BasicConstant.urlExpertApp + "videoByKeyWordsNew"; + static readonly patientVideoByKeyWordsNew = BasicConstant.urlExpertApp + 'patientVideoByKeyWordsNew' + static readonly feedBack = BasicConstant.urlExpert+'feedBack' + static readonly ganDanFileByKeyWords = BasicConstant.urlExpertAPI+'ganDanFileByKeyWords'//肝胆课件 static readonly tagList = BasicConstant.urlExpertApp + "tagList"; static readonly meetingListBySearch = BasicConstant.urlExpertAPI + "meetingListBySearch"; static readonly videoBySearchNew = BasicConstant.urlExpertApp+'videoBySearchNew';//搜索肝胆视频列表 diff --git a/commons/basic/src/main/ets/models/LoginInfoModel.ets b/commons/basic/src/main/ets/models/LoginInfoModel.ets index 5162ba0..7e536c6 100644 --- a/commons/basic/src/main/ets/models/LoginInfoModel.ets +++ b/commons/basic/src/main/ets/models/LoginInfoModel.ets @@ -52,7 +52,9 @@ export interface Data{ state:number; realName:string; specialy:Array; - + special:SpecialDisease[]; + YX_accid:string; + YX_token:string } export interface BaseBean{ diff --git a/features/Home/src/main/ets/model/TagListModel.ets b/commons/basic/src/main/ets/models/TagListModel.ets similarity index 100% rename from features/Home/src/main/ets/model/TagListModel.ets rename to commons/basic/src/main/ets/models/TagListModel.ets diff --git a/features/netease/src/main/ets/model/TeachModel.ets b/commons/basic/src/main/ets/models/TeachModel.ets similarity index 100% rename from features/netease/src/main/ets/model/TeachModel.ets rename to commons/basic/src/main/ets/models/TeachModel.ets diff --git a/commons/basic/src/main/resources/base/media/cb_screen_no.png b/commons/basic/src/main/resources/base/media/cb_screen_no.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3c5fdc0b68c26c2d265a84fe6eb5e921a9d391 GIT binary patch literal 1364 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!ZaB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7KMf<|~|UP^v> zu_jo#udkJ7UU5lcUUI6Zi>(sS0KLr26f1L6QzH{gGhUI2$*<4On9mVa^UGcH4m8Bi-4)RDKjRRfr0U)r;B4q z#jQ8feKlATC61qM3+q%?RJU9ZGoj_GMG*F#bB-RFB8m%OI^P=k5;{jWusMcqq zXimT(y{*@TllNr3i8^FZxzDB4_T;oaCfgZo z)+_;u47$hrRQ9;ao_tlMW2gV>*#613vPLiB-C1AAnSM@G?rYHe(&p z_taT(($QZ`5AN-_sOZoXLkq7=oOn=31dv+FHKXBC0e_wXO*OXr!emeRW f}qv+&w5@8RL*(2`njxgN@xNAWP|U_ literal 0 HcmV?d00001 diff --git a/commons/basic/src/main/resources/base/media/cb_screen_yes.png b/commons/basic/src/main/resources/base/media/cb_screen_yes.png new file mode 100644 index 0000000000000000000000000000000000000000..b3090ef7b74a50d04685dec625eec91fa2f0a12e GIT binary patch literal 1364 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!ZaB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7KMf<|~|UP^v> zu_jo#udkJ7UU5lcUUI6Zi>(sS0KLr26f0*lGbblY7gtjQLnA{&S93=TQ#VH!3r8bY zXD2f!b7z=dm;B_?+|;}hnBEkGUN@Y2K`9}(0BEyIYEfocYKmJ?ey#%8$5xrR-QtYX zJgD9j+-`BfsaGH97=2K@BE>UI2$*<4On9mVa^UGcH4m8Bi-4*6O=;$B1_s8Ho-U3d z6}R3@_tjuYlsJC2O`|YIars%sr%f(Lo;^`ckI~%ugGc<-+04@?8=HmRN(Sbm<^j7`hR%hJ-1uQ|N$>wEk2d(Qv<^R2f0-p%r<9x9Wj_Dx$G%TjaC zc8z1X{dL7->c6JF?*6!Y`Ly_iDD6`}n@>J{y>51Ln$K#N>qeK^uQZBGNf-XnxbK45 zstMJmQOg(o?~8m_^~U9p>$FspsVjr>8D~$s;J9$7+wBYIc4z zbe*=5k<(gpQ!-QT;cu!ulkR6vSv_N~gT}VjQqKtYjm6D-wBC3f5~%#=Qfiy#?cSK@ z(=5yI;b`Nu-?Dh>8M|*-#B-QMmcYc%-1Ko*~0vn^}o3B hNoeV7|J(fx%nTC8JAzLKTD}F9bDpk#F6*2UngCXL_s{?U literal 0 HcmV?d00001 diff --git a/commons/basic/src/main/resources/base/media/eye_main_color.png b/commons/basic/src/main/resources/base/media/eye_main_color.png new file mode 100644 index 0000000000000000000000000000000000000000..727e68336387b8d2da951841bb6897549c873f3a GIT binary patch literal 1864 zcmaJ?X;2eq7~V(;h#-fkp;1^8s)&&6CIm<%5lA>q7>udlO-NQqA=$WDO%SRGRf8g< z-~lpT^}_K+5EVqI2a14N8yODK;z?@-)Zw;tLDBvw-I?9*nCE%k=Y7BTo6U@h47IWP z)(QXsoA5A^lo%o6rCO4SFHdES5rY#R9D^@FSK@j(h5&&|G!6m7)$({mipZ78tL`BF z0AS{-lEvUL5;0GKsu}WO48x$-5^MnQpKH*{6^RHA#v$=44WHIgc8vzAlzdt=M*>N- zLL@;IwiZJctc{c@)+Q>rO4?ij=x^W=0%`=8g9deyM#nSoX(PHkVm`dhq=6$4JdscP zWGY4y1qx9N0XYngmjZ&lL0>Kd=D^;5uqViZU^WwCGhwzD%;G^@9?SthKQtm5rd-LB zib6ieB367_0*-5WOr~D1XXx1s6pLrVTrQUhv6w8D7lH87C2MfG!Aql~k1B`|odQ#7 zaTTfohZW^<=xUr#BbTf6HzdxL9S)O3}`r|QJ_Tf|4_C13tERuk*|LL zQ&=ZU)*?(PqC;0>3gX~a(uYH7c|r`4<0vLW(WKETMkSy)s!Kq%pil_9N2@eSRIi&g z0+&d5;Tjz-*C>#15uZi~FjOifFPIzb$MW@M3w>c97!Kxep`gHE$X6s{`Go`pirAxE z5vo|NMl|>+SNWCeJtlX!6VzHFvIxOcYY=4!hN{7ljCrcDy})DYeda31_QD#I%OuP& zhtKt2=RCSaG|%w#OV<*MFMW?_h-Sx#uHMq)vY)stSHnetGDA~s-j4~9^QToG;M<2J z-5nTMBBm!N(;n@GlD*)%X3NHqoblt?Y5R_nRvO$h{|050jg)gW$4DJj(bS$7aK&#NN?PeUvdLk23yD5) z(X?|psv;8>>WZ?ie4LPFF*nd~cxt+RWBGl%;#d($yO`o{+C*CTc89oIkVpQ(37WUp z^7+eMokP=Wccq!p(Mv$8L5wb-A%R6zUtXtiuy$j%4Gr9McNG4=lS=kf!+Y2J|+%IYfYYvBQ-L6dqZz?ZOM#3a{R(u7qW6o z^anSD*}JN4iI+L&juT@3l-QDD1bR&7C0?e)pQ@i38e!blb|MKVsG-Q-l^e~A?oFAW zYS(-w<1deRi#hRe+=FM$sT6TBmRWEr&-w7heAg@5^&8*KyXAMiaq-fVn8&kMb$V9{ zy}B~tW$!I%)s2&z>VtmWCOBAn=)iMtE`BoDt9#MSbD1fuXj_X(l~K9PZs6mcEn8Qx i1f{+DLqkUg?PCES=CsM3=bc9WZQ;R@qBB9U>Hh$w4c*27 literal 0 HcmV?d00001 diff --git a/commons/basic/src/main/resources/base/media/kejian_download_icon.png b/commons/basic/src/main/resources/base/media/kejian_download_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..697d5ebb6bccc9dde46963166b73e501a227993a GIT binary patch literal 1413 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0z*Q}aq-dQ%X3O>pW3C5PMspv^9+MVV!(DQ-pixe8!!TV>*Q ziy=<)pn6kqyTu5nUVWfr^g)q}6xlE#UI z;_+(t2{BH-8ke3LMw@8=j5ae5jtA`tHPiOB7B~iMZDFxH@kMHFkP~a%F1`@OgwzHrA_m5%ao+VE_w*=4M?t9?%y3TOb ziiM*0TmtncU*OAs71E@h$a3$=MlX-$()Um3ziL-g%Q7tf*mP&vzfDt$6`41h*!=td z)@0jR>x^wWwjI9@9{R2+!th6QmUmitjB}FCFTw9K|6ZKFw>9s&j!WqACW))wUeS-k b8yFdigPxv$a3u39s9^MT^>bP0l+XkKCGY)B literal 0 HcmV?d00001 diff --git a/corekit/hmrouter-consumer-rules.txt b/corekit/hmrouter-consumer-rules.txt new file mode 100644 index 0000000..8f76f14 --- /dev/null +++ b/corekit/hmrouter-consumer-rules.txt @@ -0,0 +1,3 @@ +-keep-file-name +-keep-property-name +-keep-global-name \ No newline at end of file diff --git a/corekit/hmrouter-obfuscation-rules.txt b/corekit/hmrouter-obfuscation-rules.txt new file mode 100644 index 0000000..8f76f14 --- /dev/null +++ b/corekit/hmrouter-obfuscation-rules.txt @@ -0,0 +1,3 @@ +-keep-file-name +-keep-property-name +-keep-global-name \ No newline at end of file diff --git a/features/Home/Index.ets b/features/Home/Index.ets index 2c7c728..26f717d 100644 --- a/features/Home/Index.ets +++ b/features/Home/Index.ets @@ -30,4 +30,6 @@ export { VideoSelected } from './src/main/ets/pages/VideoSelected' export { videoTools } from './src/main/ets/polyv/VideoUtil' -export { CustomScanResultComp }from './src/main/ets/components/CustomScanResultComp' \ No newline at end of file +export { CustomScanResultComp }from './src/main/ets/components/CustomScanResultComp' + +export { EducationVideo } from './src/main/ets/pages/EducationVideo' \ No newline at end of file diff --git a/features/Home/src/main/ets/components/HomeSwiperComp.ets b/features/Home/src/main/ets/components/HomeSwiperComp.ets index 5fd335b..c32276d 100644 --- a/features/Home/src/main/ets/components/HomeSwiperComp.ets +++ b/features/Home/src/main/ets/components/HomeSwiperComp.ets @@ -6,6 +6,7 @@ import { router } from '@kit.ArkUI' export struct HomeSwiperComp { @Prop newslist: newsModel[]; @Prop expertData:expertDetailModel; + @State isSuccessImage:boolean = false build() { Column() { @@ -13,17 +14,21 @@ export struct HomeSwiperComp { ForEach(this.newslist, (item: newsModel,index:number) => { Stack({alignContent:Alignment.Center}) { Image(item.headImg) + .alt($r('app.media.home_top_scroll_default')) .objectFit(ImageFit.Fill)// 图片填充模式 + .onComplete(() => { + this.isSuccessImage = true + }) .width('100%').height('100%') if (index == 0) { Column({space:5}){ Text(this.expertData.realName+'专家工作室') .fontSize(19) - .fontColor(Color.White) + .fontColor(this.isSuccessImage?Color.White:Color.Black) .margin({left:20,top:60}) Text(this.expertData.hospitalName) .fontSize(16) - .fontColor(Color.White) + .fontColor(this.isSuccessImage?Color.White:Color.Black) .margin({left:20}) }.width('100%').alignItems(HorizontalAlign.Start) } diff --git a/features/Home/src/main/ets/components/ListCompGandan.ets b/features/Home/src/main/ets/components/ListCompGandan.ets index a6030c2..89508a7 100644 --- a/features/Home/src/main/ets/components/ListCompGandan.ets +++ b/features/Home/src/main/ets/components/ListCompGandan.ets @@ -12,6 +12,7 @@ export struct ListCompGandan { @State isEmptyViewVisible: boolean = false; // 控制显隐的状态变量 @Prop@Watch('onUpdate') sort:string='2' + @Prop pageType:string = '' // @Consume@Watch('gotoTop') // toTop:boolean; @Prop@Watch('onUpdate') @@ -67,7 +68,7 @@ export struct ListCompGandan { this.hashMap.set('page', this.page+"") this.hashMap.set("sort", this.sort); this.hashMap.set('typeUuid', this.type_uuid) - hdHttp.httpReq(BasicConstant.videoByKeyWordsNew,this.hashMap).then(async (res: HdResponse) => { + hdHttp.httpReq(this.pageType=='患教视频'?BasicConstant.patientVideoByKeyWordsNew:BasicConstant.videoByKeyWordsNew,this.hashMap).then(async (res: HdResponse) => { logger.info('Response videoByTypeNew'+res); let json:VideoMoreModel = JSON.parse(res+'') as VideoMoreModel; this.dialog.close() diff --git a/features/Home/src/main/ets/components/SecondaryLink.ets b/features/Home/src/main/ets/components/SecondaryLink.ets index 5a3b7ad..a5dd4c7 100644 --- a/features/Home/src/main/ets/components/SecondaryLink.ets +++ b/features/Home/src/main/ets/components/SecondaryLink.ets @@ -19,10 +19,13 @@ import { BusinessError } from '@kit.BasicServicesKit'; import { VideoTypeModel,TypeList,VideoType } from '../model/VideoTypeModel' import { ArrayList } from '@kit.ArkTS'; import { ListCompGandan } from '../components/ListCompGandan' -import { TagListModel,TagList } from '../model/TagListModel' +import { TagListModel,TagList } from '@itcast/basic/src/main/ets/models/TagListModel' import { promptAction } from '@kit.ArkUI' +import { it } from '@ohos/hypium'; + @Component export struct SecondaryLink { + @Prop pageType:string = '' @State currentTagIndex: number = 0; // 一级列表焦点索引值 @State currentTagIndex2: number = -1; // 2级列表焦点索引值 @State private tagLists:VideoType[] = []; // 一级列表数据 @@ -112,7 +115,7 @@ export struct SecondaryLink { Row().height(10).width('100%') .backgroundColor('#efefef') Stack({alignContent:Alignment.Top}) { - ListCompGandan({ sort:this.sort,type_uuid:this.type_uuid,keywords:this.keywords}).padding({left:10,right:10}) + ListCompGandan({ pageType:this.pageType,sort:this.sort,type_uuid:this.type_uuid,keywords:this.keywords}).padding({left:10,right:10}) if(this.isOpenSelect1) { Column() @@ -126,6 +129,8 @@ export struct SecondaryLink { .padding({left:5,right:5}) .fontWeight(FontWeight.Regular) .fontSize(13) + .maxLines(1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) .fontColor(this.tagPosition.indexOf(item)!=-1 ? $r('app.color.top_title'): $r('app.color.848284')) .textAlign(TextAlign.Center) .border({ width: 1, color:this.tagPosition.indexOf(item)!=-1 ? $r('app.color.top_title'): '#999999' }) @@ -213,76 +218,110 @@ export struct SecondaryLink { } if(this.isOpenSelect) { - Row() { - // TODO:知识点: 2.一级列表绑定Scroller对象 - List() { - // 性能知识点:此处为横向列表,列表项确定且数量较少,使用了ForEach,在列表项多的情况下,推荐使用LazyForeEach - ForEach(this.tagLists, (item: VideoType, index: number) => { - ListItem() { - Text(item.name) - .width('100%') - .padding(10) - .fontWeight(FontWeight.Regular) - .fontSize(15) - .fontColor(this.currentTagIndex === index ? $r('app.color.top_title'): $r('app.color.848284')) - .textAlign(TextAlign.Center) - .backgroundColor(this.currentTagIndex === index ? $r('sys.color.ohos_id_color_background') : '') - - .onClick(() => { - this.currentTagIndex = index; - this.contentData=this.arrayList[index]; - - }) - } - }) - } - .backgroundColor('#efefef') - .width('27%') - .height('100%') - // 二级列表 - List() { - if(this.currentTagIndex==0) - { - ListItem() { - Row() { - Text('全部视频') - .fontSize(15) - .padding(10) - .fontColor(this.currentTagIndex2 === -2 ? $r('app.color.top_title'): $r('app.color.848284')) + if (this.pageType == '患教视频') { + Row() { + List() { + ForEach(this.tagLists, (item: VideoType, index: number) => { + ListItem() { + Column() { + Text(item.name) + .width('100%') + .padding(10) + .fontWeight(FontWeight.Regular) + .fontSize(15) + .fontColor(this.currentTagIndex === index ? $r('app.color.top_title') : Color.Gray) + .onClick(() => { + this.currentTagIndex = index; + this.videoTitle = item.name + this.type_uuid = item.uuid + this.changeSelectRescourse() + }) + Blank() + .width('95%') + .height(0.5) + .backgroundColor(Color.Gray) + .margin({left:10,right:10}) + } } - }.onClick(()=>{ - this.videoTitle='全部视频' - this.currentTagIndex2=-2 - this.changeSelectRescourse() - this.type_uuid='' }) } - ForEach(this.contentData, (item: TypeList,index: number) => { - ListItem() { - Row() { + .backgroundColor(Color.White) + .width('100%') + .height('100%') + }.width('100%').alignItems(VerticalAlign.Top) + } else { + Row() { + // TODO:知识点: 2.一级列表绑定Scroller对象 + List() { + // 性能知识点:此处为横向列表,列表项确定且数量较少,使用了ForEach,在列表项多的情况下,推荐使用LazyForeEach + ForEach(this.tagLists, (item: VideoType, index: number) => { + ListItem() { Text(item.name) - .fontSize(15) + .width('100%') .padding(10) - .fontColor(this.currentTagIndex2 === index&& this.videoTitle==item.name ? $r('app.color.top_title'): $r('app.color.848284')) + .fontWeight(FontWeight.Regular) + .fontSize(15) + .fontColor(this.currentTagIndex === index ? $r('app.color.top_title') : $r('app.color.848284')) + .textAlign(TextAlign.Center) + .backgroundColor(this.currentTagIndex === index ? $r('sys.color.ohos_id_color_background') : '') + + .onClick(() => { + this.currentTagIndex = index; + this.contentData = this.arrayList[index]; + + }) } - }.onClick(()=>{ - this.currentTagIndex2=index - this.videoTitle=item.name - this.type_uuid=item.uuid - this.changeSelectRescourse() }) + } + .backgroundColor('#efefef') + .width('27%') + .height('100%') + + // 二级列表 + List() { + if (this.currentTagIndex == 0) { + ListItem() { + Row() { + Text('全部视频') + .fontSize(15) + .padding(10) + .fontColor(this.currentTagIndex2 === -2 ? $r('app.color.top_title') : $r('app.color.848284')) + } + }.onClick(() => { + this.videoTitle = '全部视频' + this.currentTagIndex2 = -2 + this.changeSelectRescourse() + this.type_uuid = '' + }) + } + ForEach(this.contentData, (item: TypeList, index: number) => { + ListItem() { + Row() { + Text(item.name) + .fontSize(15) + .padding(10) + .fontColor(this.currentTagIndex2 === index && this.videoTitle == item.name ? + $r('app.color.top_title') : $r('app.color.848284')) + } + }.onClick(() => { + this.currentTagIndex2 = index + this.videoTitle = item.name + this.type_uuid = item.uuid + this.changeSelectRescourse() + }) + }) + } + .backgroundColor(Color.White) + .layoutWeight(1) + .divider({ + strokeWidth: 1, + color: $r('app.color.common_gray_border'), + startMargin: 10, + endMargin: 10 }) - } - .backgroundColor(Color.White) - .layoutWeight(1) - .divider({ - strokeWidth: 1, - color: $r('app.color.common_gray_border'), - startMargin:10, - endMargin:10 - }) - .height('100%') - }.width('100%').alignItems(VerticalAlign.Top) + .height('100%') + }.width('100%').alignItems(VerticalAlign.Top) + } } } @@ -290,81 +329,117 @@ export struct SecondaryLink { } } - changeSelectRescourse() - { + changeSelectRescourse() { this.videoImg=$r('app.media.video_select') this.videoImgt=$r('app.media.select_video') this.videoText=$r('app.color.top_title') this.isOpenSelect=false } - initList() - { + initList() { let hashMap: HashMap = new HashMap(); - hdHttp.httpReq(BasicConstant.expertVideoTypeList,hashMap).then(async (res: HdResponse) => { - + hdHttp.httpReq(this.pageType=='患教视频'?BasicConstant.patientVideoNew:BasicConstant.expertVideoTypeList,hashMap).then(async (res: HdResponse) => { let json:VideoTypeModel = JSON.parse(res+'') as VideoTypeModel; - this.tagLists=json.data - for (let i = 0;i=4){ - substring = title.substring(0, 4);//取出来前4位 - }else if(title.length>=3){ - substring = title.substring(0, 3);//取出来前3位 - }else if (title.length>=2){ - substring = title.substring(0, 2);//取出来前2位 + let title: string = json.data[j].name + let itemUuid:string = json.data[j].uuid + let digit: boolean = ChangeUtil.isFirstDigit(title.charAt(0)); //判断首位是否是数字 + let asciiAlpha: boolean = ChangeUtil.isLetter(title.charAt(0)); //字母 + if (digit || asciiAlpha) { + let substring: string = ''; + if (title.length >= 4) { + substring = title.substring(0, 4); //取出来前4位 + } else if (title.length >= 3) { + substring = title.substring(0, 3); //取出来前3位 + } else if (title.length >= 2) { + substring = title.substring(0, 2); //取出来前2位 } - if (substring.includes("-")){//含有- - let split: string[] = substring.split("-"); - if (split.length>1){ + if (substring.includes("---")) { //含有- + let split: string[] = substring.split("---"); + if (split.length > 1) { s = split[split.length - 1] + title.substring(4, title.length); - }else { - s = title.substring(4, title.length); + } else { + s = title.substring(4, title.length); } - datatagname[j].name=s; + this.tagLists.push({name:s,uuid:itemUuid} as VideoType) + } else if (substring.includes("--")) { + let split: string[] = substring.split("--"); + if (split.length > 1) { + s = split[split.length - 1] + title.substring(4, title.length); + } else { + s = title.substring(4, title.length); + } + this.tagLists.push({name:s,uuid:itemUuid} as VideoType) + } else if (substring.includes("-")) { + let split: string[] = substring.split("-"); + if (split.length > 1) { + s = split[split.length - 1] + title.substring(4, title.length); + } else { + s = title.substring(4, title.length); + } + this.tagLists.push({name:s,uuid:itemUuid} as VideoType) + } else { + this.tagLists.push({name:title,uuid:itemUuid} as VideoType) } + } else { + this.tagLists.push({name:title,uuid:itemUuid} as VideoType) } } - const indexesToRemove = new Set(k); // 使用 Set 提高查找效率 - const newArr = datatagname.filter((_, index) => !indexesToRemove.has(index)); - this.arrayList.add(newArr) - k=[] + } else { + this.tagLists = json.data + for (let i = 0; i < this.tagLists.length; i++) { + let datatagname = json.data[i].list; + let k: number[] = []; + for (let j = 0; j < datatagname.length; j++) { + let s: string; + if ("z-BMS专家端" == (datatagname[j].name)) { + k.push(j); + } + let title: string = datatagname[j].name + let digit: boolean = ChangeUtil.isFirstDigit(title.charAt(0)); //判断首位是否是数字 + let asciiAlpha: boolean = ChangeUtil.isLetter(title.charAt(0)); //字母 + if (digit || asciiAlpha) { + let substring: string = ''; + if (title.length >= 4) { + substring = title.substring(0, 4); //取出来前4位 + } else if (title.length >= 3) { + substring = title.substring(0, 3); //取出来前3位 + } else if (title.length >= 2) { + substring = title.substring(0, 2); //取出来前2位 + } + if (substring.includes("-")) { + let split: string[] = substring.split("-"); + if (split.length > 1) { + s = split[split.length - 1] + title.substring(4, title.length); + } else { + s = title.substring(4, title.length); + } + datatagname[j].name = s; + } + } + } + const indexesToRemove = new Set(k); // 使用 Set 提高查找效率 + const newArr = datatagname.filter((_, index) => !indexesToRemove.has(index)); + this.arrayList.add(newArr) + k = [] + } } this.contentData=this.arrayList[0]; - - }).catch((err: BusinessError) => { - - }) - let hashMap1: HashMap = new HashMap(); - hashMap1.set("type", "2") hdHttp.post(BasicConstant.tagList,{ - type:'2' + type:this.pageType=='患教视频'?'5':'2' } as TagModel).then(async (res: HdResponse) => { let json:TagListModel = JSON.parse(res+'') as TagListModel; this.tags=json.data - - - }).catch((err: BusinessError) => { - - }) } } -interface TagModel -{ +interface TagModel { type:string } diff --git a/features/Home/src/main/ets/model/VideoTypeModel.ets b/features/Home/src/main/ets/model/VideoTypeModel.ets index 54acf3d..3f88f01 100644 --- a/features/Home/src/main/ets/model/VideoTypeModel.ets +++ b/features/Home/src/main/ets/model/VideoTypeModel.ets @@ -5,7 +5,7 @@ export interface VideoTypeModel { } export interface VideoType{ - + uuid:string; name:string; list:TypeList[]; } diff --git a/features/Home/src/main/ets/pages/EducationVideo.ets b/features/Home/src/main/ets/pages/EducationVideo.ets new file mode 100644 index 0000000..64ab391 --- /dev/null +++ b/features/Home/src/main/ets/pages/EducationVideo.ets @@ -0,0 +1,26 @@ +import { SecondaryLink } from '../components/SecondaryLink'; +import router from '@ohos.router'; +import { HdNav } from '@itcast/basic' + +@Component +export struct EducationVideo { + @State isShowNaviLeft:boolean = false + @State rightBottom:string = '' + @State rightBottomPath:string = '' + @State rightBottomTitle:string = '' + + build() { + Column() { + HdNav({ title: '患教视频', showRightIcon: true, showLeftIcon:true,showRightText:false,rightIcon:$r('app.media.selected_hospital_ws'),rightItemAction:()=>{ + router.pushUrl({ + url:'pages/SearchPage/VideoSearchPage', + params:{'pageName':'视频'} + }) + }}) + SecondaryLink({pageType:'患教视频'}).layoutWeight(1) + }.width('100%') + .height('100%') + .backgroundColor($r('app.color.top_bg')) + + } +} diff --git a/features/Home/src/main/ets/pages/HomePage.ets b/features/Home/src/main/ets/pages/HomePage.ets index f4a8797..98ecc1f 100644 --- a/features/Home/src/main/ets/pages/HomePage.ets +++ b/features/Home/src/main/ets/pages/HomePage.ets @@ -6,7 +6,7 @@ import { HomeReplayVideoComp } from '../components/HomeReplayVideoComp' import { getDisplayWindowWidth } from 'media-player-common' import { BusinessError } from '@kit.BasicServicesKit'; import HashMap from '@ohos.util.HashMap'; -import { BasicConstant,hdHttp, HdResponse ,logger,HdHomeNav} from '@itcast/basic/Index' +import { BasicConstant,hdHttp, HdResponse ,logger,HdHomeNav, ChangeUtil} from '@itcast/basic/Index' import { HomeModel,dataModel, newsModel,iconsModel } from '../model/HomeModel'; import { DefaultHintProWindows,SignPopWindow,HdLoadingDialog } from '@itcast/basic' import { promptAction, router } from '@kit.ArkUI'; @@ -21,6 +21,9 @@ export struct HomePage { // toTop:boolean; @State hintMessage:string = ''; @State signData:Record = {}; + @State rightBottom:string = '' + @State rightBottomPath:string = '' + @State rightBottomTitle:string = '' scroller:Scroller = new Scroller() @@ -64,10 +67,12 @@ export struct HomePage { gotoTop() { this.scroller.scrollToIndex(0); this.initData() + this.getAppActivity() } aboutToAppear(): void { this.initData() + this.getAppActivity() } initData() { @@ -112,6 +117,25 @@ export struct HomePage { }) } + getAppActivity() { + const hashMap: HashMap = new HashMap() + this.dialog.open() + hashMap.clear() + hashMap.set('id','6') + hdHttp.httpReq(BasicConstant.getAppActivity,hashMap).then(async (res: HdResponse) => { + logger.info('Response addBonusPoints'+res) + this.dialog.close() + let json:Record> = JSON.parse(res+'') as Record> + if (json.code == '200') { + this.rightBottom = json.data['img'] + this.rightBottomPath = json.data['url_path'] + this.rightBottomTitle = json.data['name'] + } + }).catch((err: BusinessError) => { + this.dialog.close() + }) + } + build() { Stack(){ Scroll(this.scroller) { @@ -164,6 +188,19 @@ export struct HomePage { }) } }) + + Image(BasicConstant.urlImage+this.rightBottom) + .width(76) + .height(40) + .position({ x: '100%', y: '100%' }) + .translate({ x: -76, y: -76 }) + .visibility(ChangeUtil.stringIsUndefinedAndNull(this.rightBottom)?Visibility.None:Visibility.Visible) + .onClick(()=>{ + router.pushUrl({ + url: 'pages/WebView/WebPage', + params: {'title':this.rightBottomTitle,'url':this.rightBottomPath} + }) + }) } .alignContent(Alignment.Top) .backgroundColor('#f4f4f4') diff --git a/features/Home/src/main/ets/pages/PlayBack.ets b/features/Home/src/main/ets/pages/PlayBack.ets index b405204..8ee4c9f 100644 --- a/features/Home/src/main/ets/pages/PlayBack.ets +++ b/features/Home/src/main/ets/pages/PlayBack.ets @@ -1,10 +1,11 @@ import { HdNav } from '@itcast/basic' import { ListCompBack } from '../components/ListCompBack' +import { router } from '@kit.ArkUI'; @Entry @Component export struct PlayBack { - + @State params:Record = router.getParams() as Record @State notselectImg: ResourceStr = $r('app.media.triangle_normal'); @State selectImg: ResourceStr = $r('app.media.triangle_green_theme'); @State yearWords:Array =[] @@ -16,22 +17,32 @@ export struct PlayBack { @State timeText:string='会议时间'; @State typeText:string='会议类别'; @State type:string=''; - onPageShow(): void { - console.log('VideoPage onPageShow!'); - } + @State isShowNaviRight:boolean = false - onPageHide(): void { - console.log('VideoPage onPageHide!'); - } aboutToAppear(): void { this.getSelect() - + if (this.params) { + if (this.params["pageName"] == '肝胆视频') { + this.isShowNaviRight = true + } + } } build() { Column() { - HdNav({ title: '肝胆回放', showRightIcon: false, showLeftIcon: true}) + if (this.isShowNaviRight) { + HdNav({ title: '肝胆视频', showRightIcon: true, showLeftIcon:true,showRightText:false,showTwoRightItem:true,twoRightIcon:$r('app.media.video_gandan_navigation2'),rightIcon:$r('app.media.selected_hospital_ws'),rightItemAction:()=>{ + router.pushUrl({ + url:'pages/SearchPage/VideoSearchPage', + params:{'pageName':'视频'} + }) + },twoRightItemAction:()=>{ + router.back() + }}) + } else { + HdNav({ title: '肝胆回放', showRightIcon: false, showLeftIcon: true}) + } Row() { Row() { diff --git a/features/Home/src/main/ets/pages/VideoGandan.ets b/features/Home/src/main/ets/pages/VideoGandan.ets index b8d2361..b354a4b 100644 --- a/features/Home/src/main/ets/pages/VideoGandan.ets +++ b/features/Home/src/main/ets/pages/VideoGandan.ets @@ -1,14 +1,18 @@ import { SecondaryLink } from '../components/SecondaryLink'; import router from '@ohos.router'; -import { BasicConstant, HdNav } from '@itcast/basic' +import { BasicConstant, ChangeUtil, hdHttp, HdNav, HdResponse } from '@itcast/basic' import { SwiperComp } from '../components/SwiperComp' -import { emitter } from '@kit.BasicServicesKit'; +import { BusinessError, emitter } from '@kit.BasicServicesKit'; import { getDisplayWindowWidth } from 'media-player-common' +import { HashMap } from '@kit.ArkTS'; @Component export struct VideoGandan { @State params:Record = router.getParams() as Record @State isShowNaviLeft:boolean = false + @State rightBottom:string = '' + @State rightBottomPath:string = '' + @State rightBottomTitle:string = '' aboutToAppear(): void { if (this.params) { @@ -16,19 +20,73 @@ export struct VideoGandan { this.isShowNaviLeft = true } } + this.getAppActivity() + } + + + getAppActivity() { + const hashMap: HashMap = new HashMap() + hashMap.clear() + hashMap.set('id','6') + hdHttp.httpReq(BasicConstant.getAppActivity,hashMap).then(async (res: HdResponse) => { + let json:Record> = JSON.parse(res+'') as Record> + if (json.code == '200') { + this.rightBottom = json.data['img'] + this.rightBottomPath = json.data['url_path'] + this.rightBottomTitle = json.data['name'] + } + }).catch((err: BusinessError) => { + }) } build() { Column() { - HdNav({ title: '肝胆视频', showRightIcon: true, showLeftIcon: this.isShowNaviLeft,showRightText:false,rightIcon:$r('app.media.selected_hospital_ws'),rightItemAction:()=>{ + HdNav({ title: '肝胆视频', showRightIcon: true, showLeftIcon: this.isShowNaviLeft,showRightText:false,showTwoRightItem:true,twoRightIcon:$r('app.media.video_gandan_navigation_change'),rightIcon:$r('app.media.selected_hospital_ws'),rightItemAction:()=>{ router.pushUrl({ url:'pages/SearchPage/VideoSearchPage', params:{'pageName':'视频'} }) + },twoRightItemAction:()=>{ + router.pushUrl({ + url:'pages/VideoPage/PlayBackPage', + params:{'pageName':'肝胆视频'} + }) }}) SwiperComp().height(getDisplayWindowWidth().vp / 16 * 9) - SecondaryLink().layoutWeight(1) + SecondaryLink({pageType:'肝胆视频'}) + .margin({bottom:55}) + .layoutWeight(1) + Row(){ + Image($r('app.media.video_gandan_bottom_icon')) + .size({width:22,height:22}) + Text('患教视频') + .fontSize(16) + .fontColor(Color.White) + } + .justifyContent(FlexAlign.Center) + .width('100%') + .height(53) + .position({y:'94%'}) + .backgroundColor('rgb(63,199,193)') + .onClick(() => { + router.pushUrl({ + url: 'pages/VideoPage/EducationVideoPage' + }) + }) + + Image(BasicConstant.urlImage+this.rightBottom) + .width(76) + .height(40) + .position({ x: '100%', y: '100%' }) + .translate({ x: -76, y: -126 }) + .visibility(ChangeUtil.stringIsUndefinedAndNull(this.rightBottom)?Visibility.None:Visibility.Visible) + .onClick(()=>{ + router.pushUrl({ + url: 'pages/WebView/WebPage', + params: {'title':this.rightBottomTitle,'url':this.rightBottomPath} + }) + }) }.width('100%') .height('100%') .backgroundColor($r('app.color.top_bg')) diff --git a/features/Home/src/main/ets/pages/VideoPage.ets b/features/Home/src/main/ets/pages/VideoPage.ets index 9a5aed1..b0019a2 100644 --- a/features/Home/src/main/ets/pages/VideoPage.ets +++ b/features/Home/src/main/ets/pages/VideoPage.ets @@ -99,7 +99,7 @@ export struct VideoPage { .layoutWeight(1) .justifyContent(FlexAlign.Center) .onClick(() => { - router.pushUrl({url:'pages/VideoPage/PlayBackPage'}) + router.pushUrl({url:'pages/VideoPage/PlayBackPage', params:{'pageName':'肝胆会议'}}) }) diff --git a/features/Home/src/main/resources/base/media/home_top_scroll_default.png b/features/Home/src/main/resources/base/media/home_top_scroll_default.png new file mode 100644 index 0000000000000000000000000000000000000000..332899551ed28eb13cfade0adcc8c4d2269c0fa2 GIT binary patch literal 4380 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 I71xOW2CHHk_W%F@ literal 0 HcmV?d00001 diff --git a/features/Home/src/main/resources/base/media/video_gandan_bottom_icon.png b/features/Home/src/main/resources/base/media/video_gandan_bottom_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0863b5cf6a01b6eac456e898dabb41ee6088df GIT binary patch literal 1865 zcmaJ?do)ye9G}!^gk@F~J=`vZWS*D@Q^wrU%!bteLk%U|$Ml z>+oQP;d;ETG`Ab_YvV1!o?D@ZGW zlMq=N4u_@%hpEz%RRT3QZ!X|#5Rw8YOeg^Zx?H0Z8bsiGT_I^3kC`Cw9zrCGzz;!1 z2893;42JI9(z z3i#-Y+=;*>g3tX%b3y#FevE%p(y$Zts@lh=Xn29 zSQnP6g_#Oiho#^uvT+GcMps&)1c#LbhKFI;@{uZrBw+-mOTx5(L;|=*AR0BM*SWoi z2L%b`8Xck3s9-rH0!aY|f~bW7Vit!B3B0BLJWn=T$`eREd3^M`7z(`4Scr@si|43%AGzw$WAPf5%Orzg8vFW1 zpGS_!;W3(@rk31%ntND74m(ax^~{5GA$eI&$suu=q4U|Uy9*{RoOmvA@eN0{`asB~ zQ0h=Q;CR^OU3S)*txRgB^|)ISI-O1{5{17C8D}rf90FZU9Dm6Do^!r$PuVh&Y^RmI zZDDP1<&^=?#9O^73Ad4i(kP$tbF1pOtMre!kMA`23?xMt!LrE#d9K!U&>zaB(Pw}V z)CeAIqIa0LWY~go7Nye<-2)YW#ci9`H9I%EiWXaK#xm>Ah*@_rx1r0scoN&pbZIf( zVOC5-vRVb>*|4w+|cW?B?5&(oL2*zD-ZNY_3tAPfjWAX2(Of`fZ#IhtF4c zBb$=$wVZo%raimKT3Ue5+mdXuCi6RAzv)+;A1t49x5vcYl@yHmf<10J8ssIq8Z z)bMNE`Ka>w8(gwn8sXue-nKspKP-N^dqEeV&wJP3Vv!$imAw_v?}ygre$mq}H}&h> zz-Q%W|M)S$&s}r&j#tvULED<%2-$_HJ)KvjCtllfB23$gm(DmlC+qnVEBpTYn=zwZ z&%kWwg_6`gaY@$SsNBYfvbWy`VKTYNM*BgtfNo9@ZNVlD!oIx-*W45*UGGG z?pu(*1`cI!EnOd5{?u7*6N#!PZFbuzd}dcAom^IM-)#0cBsX&Cs&~%8(^SS_$ztg8 z(eUo5Xv;;8`(MX|RMfxOyhwSOP9L+T)m$#KF|( ztDDCTCA3Ua6q%Nf_id6VkKJ(>sg7xSlGb-!64Pc`CoAmS+uS)2I)B&U21VZ`+^Ti^ zYR01&-QKtk@vV-j#G@zK@D+=QD<~y@{E*Z68MF8jz5U9RrN{2YB|1$~?W=Yd9}Pb_ z`ABzWg|&DmpVC>ARtc!KxxJ&f^Af%&^F8J;jYYXwTisUsOY;fi&rL23hAREzvi=1P C{>yIw literal 0 HcmV?d00001 diff --git a/features/Home/src/main/resources/base/media/video_gandan_navigation2.png b/features/Home/src/main/resources/base/media/video_gandan_navigation2.png new file mode 100644 index 0000000000000000000000000000000000000000..b74d7a68092433af3e58b95b0c78897b4349e44d GIT binary patch literal 1394 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0z*Q}aq-dQ%X3&2Z`kC5PMspv^9+MVV!(DQ-pixe8!!TV>*Q zi!n~~pn6kqyTt^jUVWfr^g)q}6xlE#UhmG&%oH_UWU61+ZollEirbhDZ>G6)M-(hLDDrpC^ zmd|W%1*UZkGZ*SJF)I{&IPBZ-;n&;0H%*=#s@%K!xx?{Gou4_Mef1Xd`oIRs* z+efniHb33H^ZXm-4)5c?vUUH@7X6+LrrR^uK74U=m6~9Ly8MAtcGqs5s*YN}&)iXm zrKLeYfXT^$gM(2~f#usmrNv%ef?1EJZaul7(&_P?OXqu^KaP((Zti*VgSnf+qOO&D z9@g5ewNX10Y8lC}itmlP8Dr?-eQF^=w@=NPBO6s^o6pdG#x$;B-LDCcw}qBjFd5$5 zrZidS%l(wnmI9HkE59BbJ0Q+_!{Fh~rKcqhe4IVg(Pn|p6DOU*YG%idfcXtmFP zlf}eu<=2BheM}o=9KNDbA-FB|wd|9R-d#&ed(ctn@ljl{YddLhA?wFME8JaoJ=Tvc z#$r@vrV`MYK^P?i!V)rJ$;|wilu*s4h{(t?*s>@I3nV6H8B1^>;+0YK5AiN{??;~J z`8~hi`^$UYSW}snvL^+Cpfr6IZsJBH_U#aI|62Z^?{mXTY`K*+(+#Z8#t=}cleQB; zPudy@6Jc`(PTwYqAxLo0ZLzXe!!gW3lTup@BlVLWjtxP@C4P_1(L}JoPBgkHjpUE7 z$0We*)JSR-2E^de5iWOCkRi;$8jB;? zBjKVk&IZhcS8T@ORvL+mWjz=S`+PpBPcEgIMi^DA)i5H1WwLw@k?##qtj(WKd9&jR zIN^0LZV&6GDG*b%+36NmBjKDrPl5Do$x`0UGI0fi{WcGbN|9JfaiGEQ|4@?LLVH;g z@sHpC6!uyI9s)KIUb=;Ga0l0r9Sh~bbPQo*X~sg+&G9N4T{KI3U9<=2bg`-xg2T0L z%1QgYM>aSH1E#0Etc`LIdR!ynRHSaV6GLPwSz#$&q2yi^EmxH(3y?CTv`~g4Wh%8w z73bo#qlF|WHqLc!am$fyxv_R2JzQj*VBBX2X9Yu(U?XkJy}cKFTfI%Lb6YQX`LA5WUQqI^=M>74e0Gd#N>r|Zk!hk;+Aj61{PEVBAS@YJl}vN$X9sNh3hw&=A4 z`x}S5X9g37OeYibT8ow!c?vK!aP4BadbG1%zjOfY*}Ho@du9L1&aOk%pXlU*D=IG52 zj@Kn*$TgiJ*NAHG{P3V~^@Uupw8%4_CFWgb`$qOpBM4P=T}cl@)^%vgJLia(ky$~E4897cyVOX3^+D3;nD zcnIZKnUq&cLW73$Swn}0c46VtYiEM}hVT2neINu8=p99%rwD&Q#%@l1c@2KG>{RRD D&*1o= literal 0 HcmV?d00001 diff --git a/features/netease/src/main/ets/components/ItemCompTeach.ets b/features/netease/src/main/ets/components/ItemCompTeach.ets index 088e2c2..9e052a8 100644 --- a/features/netease/src/main/ets/components/ItemCompTeach.ets +++ b/features/netease/src/main/ets/components/ItemCompTeach.ets @@ -4,7 +4,7 @@ import { PerfactInputSheet } from '@itcast/basic/src/main/ets/Views/PerfactInput import { LengthMetrics, router } from '@kit.ArkUI' import { ChatKitClient } from '@nimkit/chatkit'; import { StringIsEmpty } from '@nimkit/common'; -import { PatientTBean } from '../model/TeachModel'; +import { PatientTBean } from '@itcast/basic/src/main/ets/models/TeachModel'; @Preview diff --git a/features/netease/src/main/ets/view/SearchComp.ets b/features/netease/src/main/ets/view/SearchComp.ets index 80784be..03d586f 100644 --- a/features/netease/src/main/ets/view/SearchComp.ets +++ b/features/netease/src/main/ets/view/SearchComp.ets @@ -3,7 +3,7 @@ import { HMRouter, HMRouterMgr } from '@hadss/hmrouter' import { PullToRefreshLayout, RefreshController } from 'refreshlib' import { HashMap } from '@kit.ArkTS'; import { BusinessError } from '@kit.BasicServicesKit'; -import { PatientTBean, TeachModel } from '../model/TeachModel'; +import { PatientTBean, TeachModel } from '@itcast/basic/src/main/ets/models/TeachModel'; import { promptAction } from '@kit.ArkUI'; import { ItemCompTeach } from '../components/ItemCompTeach'; import { PatientVBean, TeachVideoModel } from '../model/TeachVideoModel'; diff --git a/features/netease/src/main/ets/view/TuwenComp.ets b/features/netease/src/main/ets/view/TuwenComp.ets index 5d7da58..028915c 100644 --- a/features/netease/src/main/ets/view/TuwenComp.ets +++ b/features/netease/src/main/ets/view/TuwenComp.ets @@ -3,7 +3,7 @@ import { HMRouter, HMRouterMgr, HMRouterPathCallback, HMRouterPathInfo } from '@ import { PullToRefreshLayout, RefreshController } from 'refreshlib' import { HashMap } from '@kit.ArkTS'; import { BusinessError } from '@kit.BasicServicesKit'; -import { PatientTBean, TeachModel } from '../model/TeachModel'; +import { PatientTBean, TeachModel } from '@itcast/basic/src/main/ets/models/TeachModel'; import { promptAction } from '@kit.ArkUI'; import { ItemCompTeach } from '../components/ItemCompTeach'; import { StringIsEmpty } from '@nimkit/common'; diff --git a/features/patient/src/main/ets/components/CopyAddAndEditRecordComp.ets b/features/patient/src/main/ets/components/CopyAddAndEditRecordComp.ets new file mode 100644 index 0000000..badf26f --- /dev/null +++ b/features/patient/src/main/ets/components/CopyAddAndEditRecordComp.ets @@ -0,0 +1,647 @@ +import { HMRouter, HMRouterMgr } from "@hadss/hmrouter"; +import { + authStore, + BasicConstant, + ChangePhotoGrids, ChangeUtil, + compressedImage, + hdHttp, + HdLoadingDialog, + HdNav, + HdResponse, + logger, + PhotoActionSheet, TimestampUtil, ViewImageInfo } from "@itcast/basic"; +import { promptAction } from "@kit.ArkUI"; +import { BusinessError } from "@kit.BasicServicesKit"; +import { rcp } from "@kit.RemoteCommunicationKit"; +import { image } from "@kit.ImageKit"; +import { fileIo } from "@kit.CoreFileKit"; +import { buffer } from "@kit.ArkTS"; +import { ImageCompressor,ImageCompressOptions } from "../utils/ImageCompressor"; + +@HMRouter({pageUrl:'CopyAddAndEditRecordComp'}) +@Component +export struct CopyAddAndEditRecordComp { + @State photos: string[] = [] + @State base64Array:string[] = [] + @State maxSelectNumber: number = 8 + private params: ESObject = HMRouterMgr.getCurrentParam() + private photoSheetDialog!: CustomDialogController; + @State nowDate:Date = new Date + @State creat_time:string = TimestampUtil.format(this.nowDate,'YYYY-MM-DD') + @State recordUuid:string = '' + @State inputContent:string = '' + @State + @Watch('onAddImg') + addImg: boolean=false + @State + @Watch('onRemoveImg') + removeImg: boolean=false + @State removeIndex: number = 0 + + dialog: CustomDialogController = new CustomDialogController({ + builder: HdLoadingDialog({ message: '加载中...' }), + customStyle: true, + alignment: DialogAlignment.Center + }) + + onAddImg() { + this.photoSheetDialog.open() + } + onRemoveImg() { + this.photos.splice(this.removeIndex, 1) + this.maxSelectNumber = 8 - this.photos.length; + + // this.convertUrisOrUrlsToBase64(this.photos).then(base64Array => { + // console.info('转换结果:', base64Array+'转换个数:'+base64Array.length) + // this.base64Array = base64Array + // }).catch((err:BusinessError) => { + // console.error('批量转换失败:', err) + // }) + } + + aboutToAppear(): void { + this.initPhotoDialog() + if (this.params) { + if (this.params["model"]) { + const model:recordList = this.params["model"] + this.photos.push(...this.changeToImgs(model.photo)) + this.inputContent = model.des + this.recordUuid = model.uuid + this.creat_time = model.create_date + this.maxSelectNumber = 8 - this.photos.length + + // this.convertUrisOrUrlsToBase64(this.photos).then(base64Array => { + // console.info('转换结果:', base64Array+'转换个数:'+base64Array.length) + // this.base64Array = base64Array + // }).catch((err:BusinessError) => { + // console.error('批量转换失败:', err) + // }) + } + } + } + + async submitData() { + if (ChangeUtil.stringIsUndefinedAndNull(this.creat_time)) { + promptAction.showToast({ message:'请选择日期', duration: 1000 }) + return + } + if (ChangeUtil.stringIsUndefinedAndNull(this.inputContent)) { + promptAction.showToast({ message:'请描述患者病情', duration: 1000 }) + return + } + this.dialog.open() + this.base64Array =await this.convertUrisOrUrlsToBase64(this.photos) + const requestUrl = this.recordUuid?BasicConstant.upConditionRecord:BasicConstant.addConditionRecord + const entity: rcp.MultipartForm = this.recordUuid? new rcp.MultipartForm({ + "uuid":this.recordUuid, + "des":this.inputContent, + "create_date":this.creat_time + }) : new rcp.MultipartForm({ + "expert_uuid":authStore.getUser().uuid, + "patient_uuid":this.params["patient_uuid"], + "des":this.inputContent, + "create_date":this.creat_time + }) + this.base64Array.forEach((base64Str: string, index: number) => { + if (index < 8) { + entity.fields[`img${index + 1}`] = base64Str; + } + }) + const session = rcp.createSession(); + session.post(requestUrl, entity) + .then((response) => { + this.dialog.close(); + logger.info('Response '+requestUrl+':'+response); + let json:Record | Array>> = JSON.parse(response+'') as Record | Array>>; + if(json.code == '1') { + HMRouterMgr.pop({param:{"isRefresh":"1"}}) + promptAction.showToast({ message:'提交病情记录成功', duration: 1000 }) + } else { + console.error('获取患者信息失败:'+json.message) + promptAction.showToast({ message: String(json.message), duration: 1000 }) + } + }) + .catch((err: BusinessError) => { + this.dialog.close(); + console.error(`Response fails: ${err}`); + }) + } + + deleteTecordData() { + const entity = { + "uuid": this.recordUuid + } as Record + this.dialog.open() + hdHttp.post(BasicConstant.delConditionRecord, entity).then(async (res: HdResponse) => { + this.dialog.close(); + logger.info('Response delConditionRecord'+res); + let json:Record | Array>> = JSON.parse(res+'') as Record | Array>>; + if(json.code == '1') { + HMRouterMgr.pop({param:{"isRefresh":"1"}}) + promptAction.showToast({ message:'删除病情记录成功', duration: 1000 }) + } else { + console.error('删除病情记录信息失败:'+json.message) + promptAction.showToast({ message: String(json.message), duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + console.error(`Response fails: ${err}`); + }) + } + + build() { + Column() { + HdNav({title:'病情记录',isLeftAction:true,showRightIcon:false,showRightText:true,rightText:'提交',rightItemAction:()=>{ + this.submitData() + },leftItemAction:()=>{ + HMRouterMgr.pop() + }}) + this.contentView() + + if (this.params){ + if (this.params["model"]) { + Text('删除该条记录') + .textAlign(TextAlign.Center) + .fontSize(16) + .fontColor(Color.White) + .backgroundColor($r('app.color.main_color')) + .width('90%') + .height(50) + .borderRadius(5) + .margin({left:10,right:10,bottom:20}) + .onClick(()=>{ + this.deleteTecordData() + }) + } + } + } + .width('100%') + } + + @Builder + contentView() { + Row(){ + Text('日期') + .fontColor($r('app.color.main_color')) + .margin({left:10}) + .layoutWeight(1) + + Text(this.creat_time) + .margin({right:10}) + .onClick(()=>{ + this.selectedData() + }) + } + .width('100%') + .height(50) + .margin({top:5}) + + Blank() + .width('100%') + .height(0.5) + .margin({left:10}) + .backgroundColor('#999999') + + TextArea({ + placeholder:'请描述患者病情', + text:this.inputContent + }) + .backgroundColor(Color.White) + .margin({top:10}) + .width('100%') + .height(150) + .onChange((values:string)=>{ + this.inputContent = values + }) + + ChangePhotoGrids({ + imgList:this.changeToImg(this.photos), + maxSelectNumber:8, + addImg:this.addImg, + removeImg:this.removeImg, + removeIndex:this.removeIndex + }) + .height(200) + .padding({top:10}) + .backgroundColor('#f4f4f4') + + Blank() + .layoutWeight(1) + } + + changeToImg( imgListurl:string[]) { + let imgListtmps:ViewImageInfo[]=[] + imgListurl.forEach((url: string) => { + let item = {uri:url} as ViewImageInfo + imgListtmps.push(item) + }) + return imgListtmps + } + + changeToImgs( imgListurl:string[]) { + let imgListtmps:string[]=[] + imgListurl.forEach((url: string) => { + let item = BasicConstant.urlHtml + url + imgListtmps.push(item) + }) + return imgListtmps + } + + private initPhotoDialog() { + this.photoSheetDialog = new CustomDialogController({ + builder: PhotoActionSheet({ + controller: this.photoSheetDialog, + maxSelectNumber:this.maxSelectNumber, + onPhotoSelected: async (uris: string[] | string) => { + let selectedUris: string[] = []; + if (Array.isArray(uris)) { + selectedUris = uris; + } else if (typeof uris === 'string') { + selectedUris = [uris]; + } + this.photos.push(...selectedUris); + this.maxSelectNumber = 8 - this.photos.length + exampleUsage(this.photos) + // this.convertUrisOrUrlsToBase64(this.photos).then(base64Array => { + // console.info('转换结果:', base64Array+'转换个数:'+base64Array.length) + // this.base64Array = base64Array + // }).catch((err:BusinessError) => { + // console.error('批量转换失败:', err) + // }) + } + }), + alignment: DialogAlignment.Bottom, + customStyle: true, + autoCancel: false, + backgroundColor: ('rgba(0,0,0,0.5)'), + height: '100%' + }); + } + + selectedData(){ + CalendarPickerDialog.show({ + selected: new Date(), + backgroundColor: Color.White, + backgroundBlurStyle: BlurStyle.NONE, + shadow: ShadowStyle.OUTER_FLOATING_SM, + onAccept: (value) => { + const today = new Date(); + today.setHours(0, 0, 0, 0); + const selected = new Date(value); + selected.setHours(0, 0, 0, 0); + if (selected < today) { + promptAction.showToast({ message: '只能选择今天及以后的日期', duration: 1500 }) + return + } + this.creat_time = TimestampUtil.format(value,'YYYY-MM-DD') + } + }) + } + async convertUrisOrUrlsToBase64(items: string[]): Promise { + const results: string[] = []; + const MAX_SIZE_KB = 200; // 最大200KB + + for (const item of items) { + try { + let base64Str: string; + + // 处理本地文件URI + if (item.startsWith('file://')) { + base64Str = await this.compressLocalImageToTargetSize(item, MAX_SIZE_KB); + } + // 处理网络URL + else if (item.startsWith('http://') || item.startsWith('https://') || ChangeUtil.isImageFileByRegex(item)) { + base64Str = await this.compressNetworkImageToTargetSize(item, MAX_SIZE_KB); + } + // 处理其他类型资源 + else { + throw new Error(`不支持的URI格式: ${item}`); + } + + results.push(base64Str); + } catch (err) { + console.error(`转换失败: ${JSON.stringify(err)}`); + // 可以选择跳过失败项或使用默认图片 + results.push(''); + } + } + return results; + } + + // 压缩本地图片到目标大小 + private async compressLocalImageToTargetSize(uri: string, maxSizeKB: number): Promise { + try { + // 打开文件 + const file = await fileIo.open(uri, fileIo.OpenMode.READ_ONLY); + const imageSource = image.createImageSource(file.fd); + + // 获取图片信息 + const imageInfo = await imageSource.getImageInfo(); + const originalSize = (await fileIo.stat(uri)).size; + + // 如果原始图片已经小于目标大小,直接返回 + if (originalSize <= maxSizeKB * 1024) { + const buffers = await this.readLocalFile(uri); + await fileIo.close(file.fd); + imageSource.release(); + return buffer.from(buffers).toString('base64'); + } + + // 渐进式压缩策略 + let quality = 90; + let scaleFactor = 1.0; + let compressedBuffer: ArrayBuffer; + + do { + // 计算新的尺寸 + const newWidth = Math.floor(imageInfo.size.width * scaleFactor); + const newHeight = Math.floor(imageInfo.size.height * scaleFactor); + + // 创建解码选项 + const decodingOptions: image.DecodingOptions = { + desiredSize: { width: newWidth, height: newHeight }, + desiredPixelFormat:image.PixelMapFormat.RGBA_8888, + // desiredPixelFormat: image.PixelFormat.RGBA_8888, + }; + + // 获取像素图 + const pixelMap = await imageSource.createPixelMap(decodingOptions); + + // 使用ImagePacker进行压缩 + const imagePacker = image.createImagePacker(); + const option: image.PackingOption = { + format: "image/jpeg", + quality: quality, + }; + + compressedBuffer = await imagePacker.packing(pixelMap, option); + + // 释放资源 + pixelMap.release(); + imagePacker.release(); + + // 调整压缩参数 + if (compressedBuffer.byteLength > maxSizeKB * 1024) { + if (quality > 50) { + // 优先降低质量 + quality -= 10; + } else if (scaleFactor > 0.4) { + // 其次缩小尺寸 + scaleFactor *= 0.8; + quality = 70; // 重置质量为中等值 + } else { + // 已经达到最小尺寸和最低质量,强制使用当前结果 + break; + } + } + } while (compressedBuffer.byteLength > maxSizeKB * 1024); + + // 转换为Base64 + const base64Str = buffer.from(compressedBuffer).toString('base64'); + + // 释放资源 + await fileIo.close(file.fd); + imageSource.release(); + + return base64Str; + } catch (err) { + throw new Error(`本地图片压缩失败: ${JSON.stringify(err)}`); + } + } + + // 压缩网络图片到目标大小 + private async compressNetworkImageToTargetSize(url: string, maxSizeKB: number): Promise { + try { + // 下载网络资源 + const arrayBuffer = await ChangeUtil.downloadNetworkResource(url); + + // 如果下载的图片已经小于目标大小,直接返回 + if (arrayBuffer.byteLength <= maxSizeKB * 1024) { + return buffer.from(arrayBuffer).toString('base64'); + } + + // 创建临时文件 + const tempUri = await this.saveToTempFile(arrayBuffer); + + try { + // 使用本地压缩方法处理 + const result = await this.compressLocalImageToTargetSize(tempUri, maxSizeKB); + + // 删除临时文件 + await this.deleteTempFile(tempUri); + + return result; + } catch (err) { + // 确保临时文件被删除 + await this.deleteTempFile(tempUri); + throw new Error(`网络图片处理失败: ${JSON.stringify(err)}`); + } + } catch (err) { + throw new Error(`网络图片处理失败: ${JSON.stringify(err)}`); + } + } + // async convertUrisOrUrlsToBase64(items: string[]): Promise { + // const results: string[] = []; + // const MAX_SIZE_KB = 500; // 最大500KB + // + // for (const item of items) { + // try { + // let base64Str: string; + // + // // 处理本地文件URI + // if (item.startsWith('file://')) { + // base64Str = await this.processLocalImage(item, MAX_SIZE_KB); + // } + // // 处理网络URL + // else if (item.startsWith('http://') || item.startsWith('https://') || ChangeUtil.isImageFileByRegex(item)) { + // base64Str = await this.processNetworkImage(item, MAX_SIZE_KB); + // } + // // 处理其他类型资源 + // else { + // throw new Error(`不支持的URI格式: ${item}`); + // } + // + // results.push(base64Str); + // } catch (err) { + // console.error(`转换失败: ${JSON.stringify(err)}`); + // results.push(''); // 失败时返回空字符串 + // } + // } + // return results; + // } + // + // // 处理本地图片 + // private async processLocalImage(uri: string, maxSizeKB: number): Promise { + // try { + // // 创建图片源 + // const fileSource = await fileIo.open(uri, fileIo.OpenMode.READ_ONLY); + // const imageSource = image.createImageSource(fileSource.fd); + // + // // 获取原始图片信息 + // const pixelMap = await imageSource.createPixelMap(); + // const originalWidth = pixelMap.getPixelBytesNumber(); + // + // // 计算压缩比例,目标500KB以内 + // let quality = 0.9; + // let targetWidth = 800; // 初始目标宽度 + // + // // 如果原始图片太大,逐步压缩 + // if (originalWidth > maxSizeKB * 1024) { + // quality = Math.min(0.6, (maxSizeKB * 1024) / originalWidth); + // targetWidth = Math.min(800, Math.sqrt((maxSizeKB * 1024) / originalWidth) * 100); + // } + // + // // 压缩图片 + // const compressedImageInfo = await compressedImage(pixelMap, targetWidth); + // const compressedUri = compressedImageInfo.imageUri; + // + // // 读取压缩后的图片 + // const compressedBuffer = await this.readLocalFile(compressedUri); + // + // // 如果还是太大,进一步压缩 + // if (compressedBuffer.byteLength > maxSizeKB * 1024) { + // const imagePackerApi = image.createImagePacker(); + // const packOpts: image.PackingOption = { + // format: "image/jpeg", + // quality: Math.max(0.3, quality * 0.8) // 进一步降低质量 + // }; + // + // const finalBuffer = await imagePackerApi.packing(imageSource, packOpts); + // const finalBase64 = buffer.from(finalBuffer).toString('base64'); + // + // // 清理资源 + // imagePackerApi.release(); + // imageSource.release(); + // await fileIo.close(fileSource.fd); + // + // return finalBase64; + // } + // + // // 转换为Base64 + // const base64Str = buffer.from(compressedBuffer).toString('base64'); + // + // // 清理资源 + // imageSource.release(); + // await fileIo.close(fileSource.fd); + // + // return base64Str; + // + // } catch (err) { + // throw new Error(`本地图片处理失败: ${JSON.stringify(err)}`); + // } + // } + // + // // 处理网络图片 + // private async processNetworkImage(url: string, maxSizeKB: number): Promise { + // try { + // // 下载网络资源 + // const arrayBuffer = await ChangeUtil.downloadNetworkResource(url); + // + // // 如果下载的图片太大,进行压缩 + // if (arrayBuffer.byteLength > maxSizeKB * 1024) { + // // 创建临时文件来压缩 + // const tempUri = await this.saveToTempFile(arrayBuffer); + // const compressedBase64 = await this.processLocalImage(tempUri, maxSizeKB); + // + // // 清理临时文件 + // await this.deleteTempFile(tempUri); + // + // return compressedBase64; + // } + // + // // 直接转换为Base64 + // return buffer.from(arrayBuffer).toString('base64'); + // + // } catch (err) { + // throw new Error(`网络图片处理失败: ${JSON.stringify(err)}`); + // } + // } + // + // 保存到临时文件 + private async saveToTempFile(arrayBuffer: ArrayBuffer): Promise { + try { + // 使用应用缓存目录作为临时目录 + const context = getContext(this); + const tempDir = context.cacheDir; + const tempFileName = `temp_${Date.now()}.jpg`; + const tempPath = `${tempDir}/${tempFileName}`; + + const file = await fileIo.open(tempPath, fileIo.OpenMode.CREATE | fileIo.OpenMode.WRITE_ONLY); + await fileIo.write(file.fd, arrayBuffer); + await fileIo.close(file.fd); + + return tempPath; + } catch (err) { + throw new Error(`临时文件保存失败: ${JSON.stringify(err)}`); + } + } + + // 删除临时文件 + private async deleteTempFile(uri: string): Promise { + try { + await fileIo.unlink(uri); + } catch (err) { + console.warn(`临时文件删除失败: ${JSON.stringify(err)}`); + } + } + + // 优化后的本地文件读取方法 + async readLocalFile(uri: string): Promise { + try { + // 使用异步方式读取,避免阻塞 + const file = await fileIo.open(uri, fileIo.OpenMode.READ_ONLY); + const stat = await fileIo.stat(uri); + const size = stat.size; + + // 限制文件大小,避免内存溢出 + if (size > 10 * 1024 * 1024) { // 10MB限制 + throw new Error('文件过大,超过10MB限制'); + } + + const buffer = new ArrayBuffer(size); + await fileIo.read(file.fd, buffer); + await fileIo.close(file); + + return buffer; + } catch (err) { + throw new Error(`文件读取失败: ${JSON.stringify(err)}`); + } + } +} + +interface recordList { + create_date: string + des: string + patient_uuid: string + expert_uuid: string + uuid:string + photo:Array + lineHeight:Length +} + +async function exampleUsage(imageUris:string[]) { + try { + const options = { + maxSizeKB: 200, // 目标大小200KB + quality: 85, // 初始质量85% + maxWidth: 1200, // 最大宽度1200px + maxHeight: 1200, // 最大高度1200px + outputFormat: 'image/jpeg' // 输出格式 + } as ImageCompressOptions; + + const results = await ImageCompressor.compressImages(imageUris, options); + + results.forEach(result => { + if (result.success) { + console.info(`图片压缩成功: ${result.uri}`); + console.info(`原始大小: ${result.originalSize}字节`); + console.info(`压缩后大小: ${result.compressedSize}字节`); + console.info(`Base64数据长度: ${result.base64.length}`); + } else { + console.error(`图片压缩失败: ${result.uri}, 错误: ${result.error}`); + } + }); + } catch (error) { + console.error(`批量压缩失败: ${error.message}`); + } +} diff --git a/features/patient/src/main/ets/components/RecordTheIllnessComp.ets b/features/patient/src/main/ets/components/RecordTheIllnessComp.ets index 178839e..c4796db 100644 --- a/features/patient/src/main/ets/components/RecordTheIllnessComp.ets +++ b/features/patient/src/main/ets/components/RecordTheIllnessComp.ets @@ -60,7 +60,7 @@ export struct RecordTheIllnessComp { build() { Column() { HdNav({isLeftAction:true,title:'病情记录',showRightText:false,rightIcon:$r('app.media.record_add_list'),rightItemAction:()=>{ - HMRouterMgr.push({pageUrl:'AddAndEditRecordComp',param:{"patient_uuid":this.params.patient_uuid}},{ + HMRouterMgr.push({pageUrl:'CopyAddAndEditRecordComp',param:{"patient_uuid":this.params.patient_uuid}},{ onResult:(popInfo:HMPopInfo)=>{ if (popInfo && popInfo.result && popInfo.result["isRefresh"] !== undefined) { this.pageNumber = 1 @@ -172,7 +172,7 @@ export struct RecordTheIllnessComp { } .width('100%') .onClick(()=>{ - HMRouterMgr.push({pageUrl:'AddAndEditRecordComp',param:{"model":item}},{ + HMRouterMgr.push({pageUrl:'CopyAddAndEditRecordComp',param:{"model":item}},{ onResult:(popInfo:HMPopInfo)=>{ if (popInfo && popInfo.result && popInfo.result["isRefresh"] !== undefined) { this.pageNumber = 1 diff --git a/features/patient/src/main/ets/utils/ImageCompressor.ets b/features/patient/src/main/ets/utils/ImageCompressor.ets new file mode 100644 index 0000000..ba52ec6 --- /dev/null +++ b/features/patient/src/main/ets/utils/ImageCompressor.ets @@ -0,0 +1,293 @@ +import { image } from '@kit.ImageKit'; +import { fileIo } from '@kit.CoreFileKit'; +import { buffer } from '@kit.ArkTS'; +import { BusinessError } from '@kit.BasicServicesKit'; + +/** + * 图片压缩选项接口 + */ +export interface ImageCompressOptions { + maxSizeKB: number; // 目标最大大小(KB) + quality?: number; // 初始质量(0-100),默认80 + maxWidth?: number; // 最大宽度,默认1200 + maxHeight?: number; // 最大高度,默认1200 + outputFormat?: string; // 输出格式,默认'image/jpeg' +} + +/** + * 压缩结果接口 + */ +export interface CompressResult { + uri: string; // 原始URI + base64: string; // 压缩后的base64数据 + success: boolean; // 是否成功 + error?: string; // 错误信息(如果有) + originalSize: number; // 原始大小(字节) + compressedSize: number; // 压缩后大小(字节) +} + +/** + * 图片压缩工具类 + */ +interface GeneratedTypeLiteralInterface_1 { + width: number; + height: number; +} + +export class ImageCompressor { + /** + * 批量压缩图片 + * @param uris 图片URI数组 + * @param options 压缩选项 + * @returns 压缩结果数组 + */ + static async compressImages( + uris: string[], + options: ImageCompressOptions + ): Promise { + const results: CompressResult[] = []; + + // 并行处理所有图片 - 修复类型问题 + const compressPromises: Promise[] = uris.map((uri: string): Promise => { + return ImageCompressor.compressSingleImage(uri, options) + .catch((error: Error): CompressResult => { + // 明确返回符合 CompressResult 接口的对象 + const errorResult: CompressResult = { + uri: uri, + base64: '', + success: false, + error: error.message, + originalSize: 0, + compressedSize: 0 + }; + return errorResult; + }); + }); + + // 等待所有压缩操作完成 + const compressedResults = await Promise.all(compressPromises); + results.push(...compressedResults); + + return results; + } + + /** + * 压缩单张图片 + * @param uri 图片URI + * @param options 压缩选项 + * @returns 压缩结果 + */ + private static async compressSingleImage( + uri: string, + options: ImageCompressOptions + ): Promise { + // 设置默认选项 + const compressOptions: Required = { + maxSizeKB: options.maxSizeKB, + quality: options.quality ?? 80, + maxWidth: options.maxWidth ?? 1200, + maxHeight: options.maxHeight ?? 1200, + outputFormat: options.outputFormat ?? 'image/jpeg' + }; + + try { + // 获取原始图片信息 + const originalSize = await ImageCompressor.getFileSize(uri); + + // 如果已经是目标大小以下,直接转换为base64 + if (originalSize <= compressOptions.maxSizeKB * 1024) { + const fileBuffer = await ImageCompressor.readFileToBuffer(uri); + const base64Data = buffer.from(fileBuffer).toString('base64'); + + return { + uri, + base64: base64Data, + success: true, + originalSize, + compressedSize: originalSize + }; + } + + // 打开图片源 + const imageSource = await ImageCompressor.createImageSource(uri); + + // 获取图片信息 + const imageInfo = await imageSource.getImageInfo(); + + // 计算目标尺寸(保持宽高比) + const targetSize = ImageCompressor.calculateTargetSize( + imageInfo.size.width, + imageInfo.size.height, + compressOptions.maxWidth, + compressOptions.maxHeight + ); + + // 渐进式压缩直到达到目标大小 + const compressedBuffer = await ImageCompressor.progressiveCompression( + imageSource, + targetSize, + compressOptions + ); + + // 转换为base64 + const base64Data = buffer.from(compressedBuffer).toString('base64'); + + // 释放资源 + imageSource.release(); + + return { + uri, + base64: base64Data, + success: true, + originalSize, + compressedSize: compressedBuffer.byteLength + }; + } catch (error) { + throw new Error(`压缩图片失败: ${error.message}`); + } + } + + /** + * 渐进式压缩图片直到达到目标大小 + */ + private static async progressiveCompression( + imageSource: image.ImageSource, + targetSize: GeneratedTypeLiteralInterface_1, + options: Required + ): Promise { + let quality = options.quality; + let scaleFactor = 1.0; + let compressedBuffer: ArrayBuffer; + + do { + // 创建解码选项 + const decodingOptions: image.DecodingOptions = { + desiredSize: { + width: Math.floor(targetSize.width * scaleFactor), + height: Math.floor(targetSize.height * scaleFactor) + }, + desiredPixelFormat: image.PixelMapFormat.RGBA_8888, + }; + + // 获取像素图 + const pixelMap = await imageSource.createPixelMap(decodingOptions); + + // 使用ImagePacker进行压缩 + const imagePacker = image.createImagePacker(); + const packOptions: image.PackingOption = { + format: options.outputFormat, + quality: quality, + }; + + compressedBuffer = await imagePacker.packing(pixelMap, packOptions); + + // 释放资源 + pixelMap.release(); + imagePacker.release(); + + // 调整压缩参数 + if (compressedBuffer.byteLength > options.maxSizeKB * 1024) { + if (quality > 50) { + // 优先降低质量 + quality -= 10; + } else if (scaleFactor > 0.4) { + // 其次缩小尺寸 + scaleFactor *= 0.8; + quality = 70; // 重置质量为中等值 + } else { + // 已经达到最小尺寸和最低质量,强制使用当前结果 + break; + } + } + } while (compressedBuffer.byteLength > options.maxSizeKB * 1024); + + return compressedBuffer; + } + + /** + * 计算目标尺寸(保持宽高比) + */ + private static calculateTargetSize( + originalWidth: number, + originalHeight: number, + maxWidth: number, + maxHeight: number + ): GeneratedTypeLiteralInterface_1 { + let width = originalWidth; + let height = originalHeight; + + // 如果宽度超过最大值,按比例缩放 + if (width > maxWidth) { + const ratio = maxWidth / width; + width = maxWidth; + height = height * ratio; + } + + // 如果高度超过最大值,按比例缩放 + if (height > maxHeight) { + const ratio = maxHeight / height; + height = maxHeight; + width = width * ratio; + } + + return { width: Math.floor(width), height: Math.floor(height) }; + } + + /** + * 创建图片源 + */ + private static async createImageSource(uri: string): Promise { + try { + if (uri.startsWith('file://')) { + const file = await fileIo.open(uri, fileIo.OpenMode.READ_ONLY); + return image.createImageSource(file.fd); + } else { + return image.createImageSource(uri); + } + } catch (error) { + throw new Error(`创建图片源失败: ${error.message}`); + } + } + + /** + * 获取文件大小 + */ + private static async getFileSize(uri: string): Promise { + try { + if (uri.startsWith('file://')) { + const realUri = uri.substring(7); // 移除file://前缀 + const stat = await fileIo.stat(realUri); + return stat.size; + } else { + // 对于网络图片,可能需要通过其他方式获取大小 + // 这里简单返回0,实际应用中可能需要实现网络图片大小获取 + return 0; + } + } catch (error) { + console.warn(`获取文件大小失败: ${error.message}`); + return 0; + } + } + + /** + * 读取文件到缓冲区 + */ + private static async readFileToBuffer(uri: string): Promise { + try { + let realUri = uri; + if (uri.startsWith('file://')) { + realUri = uri.substring(7); // 移除file://前缀 + } + + const file = await fileIo.open(realUri, fileIo.OpenMode.READ_ONLY); + const stat = await fileIo.stat(realUri); + const fileBuffer = new ArrayBuffer(stat.size); + await fileIo.read(file.fd, fileBuffer); + await fileIo.close(file.fd); + + return fileBuffer; + } catch (error) { + throw new Error(`读取文件失败: ${error.message}`); + } + } +} \ No newline at end of file diff --git a/features/register/src/main/ets/view/LoginComp.ets b/features/register/src/main/ets/view/LoginComp.ets index 0ea5d7a..7351058 100644 --- a/features/register/src/main/ets/view/LoginComp.ets +++ b/features/register/src/main/ets/view/LoginComp.ets @@ -1,5 +1,6 @@ import { authStore, hdHttp, HdResponse,HdNav,BasicConstant, logger,LoginInfo,ChangeUtil, - patientDbManager } from '@itcast/basic' + patientDbManager, + DefaultHintProWindows} from '@itcast/basic' import { promptAction, router } from '@kit.ArkUI' import { BusinessError } from '@kit.BasicServicesKit'; import HashMap from '@ohos.util.HashMap'; @@ -38,6 +39,31 @@ export struct LoginComp { hashMap: HashMap = new HashMap(); + private hintWindowDialog!: CustomDialogController + @State smsMessage:string = '' + + + private hintPopWindowDialog() { + this.hintWindowDialog = new CustomDialogController({ + builder:DefaultHintProWindows({ + controller:this.hintWindowDialog, + message:this.smsMessage, + cancleTitle:'', + confirmTitleColor: '#333333', + selectedButton: (index:number)=>{ + this.hintWindowDialog.close(); + } + }), + alignment: DialogAlignment.Center, + cornerRadius:24, + backgroundColor: ('rgba(0,0,0,0.5)'), + }) + } + + aboutToAppear(): void { + this.hintPopWindowDialog() + } + dialog = new CustomDialogController({ builder: PrivacyDialog({ isPassLogin:this.isPassLogin, @@ -96,11 +122,6 @@ export struct LoginComp { console.info(`Response login succeeded: ${res}`); let json:LoginInfo = JSON.parse(res+'') as LoginInfo; if(json.code=='1'||json.code=='200') { - this.YX_token=json.YX_token - this.YX_accid=json.YX_accid - preferenceStore.setItemString(BasicConstant.YX_accid,json.YX_accid) - preferenceStore.setItemString(BasicConstant.YX_token,json.YX_token) - this.arrToStringSpecialy(json.special) this.getSaveUserInfor(1,json) } else { promptAction.showToast({ message: json.message, duration: 1000 }) @@ -128,6 +149,19 @@ export struct LoginComp { } else { this.loadPatients()//登录成功后获取患者数据存入数据库 + if (this.isPassLogin) { + this.YX_token=objs.YX_token + this.YX_accid=objs.YX_accid + preferenceStore.setItemString(BasicConstant.YX_accid,objs.YX_accid) + preferenceStore.setItemString(BasicConstant.YX_token,objs.YX_token) + this.arrToStringSpecialy(objs.special) + } else { + this.YX_token=objs.data.YX_token + this.YX_accid=objs.data.YX_accid + preferenceStore.setItemString(BasicConstant.YX_accid,objs.data.YX_accid) + preferenceStore.setItemString(BasicConstant.YX_token,objs.data.YX_token) + this.arrToStringSpecialy(objs.data.special) + } authStore.setUser(objs.data) // emitter.emit({ eventId: 100401 }) logger.info('Response state'+state); @@ -167,6 +201,14 @@ export struct LoginComp { this.hashMap.set('mobile',this.mobile) this.hashMap.set('type','7') hdHttp.httpReq(BasicConstant.urlExpertAPI+'smsSend',this.hashMap).then(async (res: HdResponse) => { + let json:Record = JSON.parse(res+'') as Record + if (json.code == '200') { + this.istime=true + this.startTime() + } else { + this.smsMessage = json.message + this.hintWindowDialog.open() + } }).catch((err: BusinessError) => { this.loading = false console.info(`Response login succeeded: ${err}`); @@ -255,8 +297,6 @@ export struct LoginComp { else { this.getMessage() - this.istime=true - this.startTime() } }) diff --git a/features/study/BuildProfile.ets b/features/study/BuildProfile.ets new file mode 100644 index 0000000..3a501e5 --- /dev/null +++ b/features/study/BuildProfile.ets @@ -0,0 +1,17 @@ +/** + * Use these variables when you tailor your ArkTS code. They must be of the const type. + */ +export const HAR_VERSION = '1.0.0'; +export const BUILD_MODE_NAME = 'debug'; +export const DEBUG = true; +export const TARGET_NAME = 'default'; + +/** + * BuildProfile Class is used only for compatibility purposes. + */ +export default class BuildProfile { + static readonly HAR_VERSION = HAR_VERSION; + static readonly BUILD_MODE_NAME = BUILD_MODE_NAME; + static readonly DEBUG = DEBUG; + static readonly TARGET_NAME = TARGET_NAME; +} \ No newline at end of file diff --git a/features/study/Index.ets b/features/study/Index.ets new file mode 100644 index 0000000..053c309 --- /dev/null +++ b/features/study/Index.ets @@ -0,0 +1,5 @@ +export { SchoolhouseComp } from './src/main/ets/components/SchoolhouseComp'; + +export { KeepStudyComp } from './src/main/ets/components/KeepStudyComp'; + +export { CoursewareComp } from './src/main/ets/components/CoursewareComp'; \ No newline at end of file diff --git a/features/study/hvigorfile.ts b/features/study/hvigorfile.ts new file mode 100644 index 0000000..4218707 --- /dev/null +++ b/features/study/hvigorfile.ts @@ -0,0 +1,6 @@ +import { harTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/features/study/obfuscation-rules.txt b/features/study/obfuscation-rules.txt new file mode 100644 index 0000000..272efb6 --- /dev/null +++ b/features/study/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/features/study/oh-package-lock.json5 b/features/study/oh-package-lock.json5 new file mode 100644 index 0000000..d504604 --- /dev/null +++ b/features/study/oh-package-lock.json5 @@ -0,0 +1,25 @@ +{ + "meta": { + "stableOrder": true + }, + "lockfileVersion": 3, + "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", + "specifiers": { + "@itcast/basic@../../commons/basic": "@itcast/basic@../../commons/basic", + "refreshlib@../../RefreshLib": "refreshlib@../../RefreshLib" + }, + "packages": { + "@itcast/basic@../../commons/basic": { + "name": "@itcast/basic", + "version": "1.0.0", + "resolved": "../../commons/basic", + "registryType": "local" + }, + "refreshlib@../../RefreshLib": { + "name": "refreshlib", + "version": "1.0.0", + "resolved": "../../RefreshLib", + "registryType": "local" + } + } +} \ No newline at end of file diff --git a/features/study/oh-package.json5 b/features/study/oh-package.json5 new file mode 100644 index 0000000..d578c41 --- /dev/null +++ b/features/study/oh-package.json5 @@ -0,0 +1,12 @@ +{ + "name": "study", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "Index.ets", + "author": "", + "license": "Apache-2.0", + "dependencies": { + "@itcast/basic": "file:../../commons/basic", + "refreshlib": "file:../../RefreshLib" + } +} diff --git a/features/study/src/main/ets/components/CoursewareComp.ets b/features/study/src/main/ets/components/CoursewareComp.ets new file mode 100644 index 0000000..05d1425 --- /dev/null +++ b/features/study/src/main/ets/components/CoursewareComp.ets @@ -0,0 +1,253 @@ +import { + authStore, + BasicConstant, + DefaultHintProWindows, + EmptyViewComp, hdHttp, HdLoadingDialog, HdNav, + HdResponse, + ScreeningView, TagList } from "@itcast/basic" +import { promptAction, router } from "@kit.ArkUI" +import { PullToRefreshLayout, RefreshController } from "refreshlib"; +import { HashMap } from "@kit.ArkTS"; +import { BusinessError } from "@kit.BasicServicesKit"; +import { KeJianModel, KeJianRequest } from "../models/KeJianModel"; +import { KeJianItemComp } from "../views/KeJianItemComp"; + +@Component +export struct CoursewareComp { + @State isHotOrNew:boolean = false + @State isShowSC:boolean = false + @State isEmptyViewVisible: boolean = false; // 控制显隐的状态变量 + @State sort:string = '0' + @State pageNumber:number = 1; + @State totalPageNumer:number = 1; + @State selectedTag:TagList[] = [] + scroller = new Scroller(); + public controller:RefreshController = new RefreshController(); + @State keyWordsStr:string = '' + @State data : KeJianModel[] = []; + + alertView:CustomDialogController = new CustomDialogController({ + builder:DefaultHintProWindows({ + title:'提示', + message:'肝胆相照将稍后与您沟通课件分享\n谢谢您的支持', + cancleTitleColor: '#333333', + confirmTitleColor: $r('app.color.main_color'), + selectedButton: (index:number)=>{ + if (index === 1) { + this.commitKeJian() + } + this.alertView.close(); + } + }), + alignment: DialogAlignment.Center, + cornerRadius:24, + backgroundColor: ('rgba(0,0,0,0.5)'), + }) + + dialog: CustomDialogController = new CustomDialogController({ + builder: HdLoadingDialog({ message: '加载中...' }), + customStyle: true, + alignment: DialogAlignment.Center + }) + + aboutToAppear() { + this.getApplyList(); + } + getApplyList() { + const hashMap: HashMap = new HashMap(); + hashMap.set('page',this.pageNumber.toString()); + hashMap.set("sort", this.sort); + hashMap.set("keywords", String(this.keyWordsStr)); + this.dialog.open() + hdHttp.httpReq(BasicConstant.ganDanFileByKeyWords,hashMap).then(async (res: HdResponse) => { + this.dialog.close(); + let json:KeJianRequest = JSON.parse(res+'') as KeJianRequest; + if(json.code == '200') { + if(this.pageNumber==1) { + this.data=[] + if(json.data!=null) { + this.data = json.data.list; + } + } else if(this.pageNumber>1) { + this.data.push(...json.data.list) + } + this.totalPageNumer = json.data.totalPage; + if (this.data.length > 0) { + this.isEmptyViewVisible = false; + } else { + this.isEmptyViewVisible = true; + } + } else { + promptAction.showToast({ message: json.message, duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + this.controller.refreshError(); + console.info(`Response fails: ${err}`); + }) + } + + commitKeJian() { + const entity = { + "content":'我要共享课件', + "expertUuid": authStore.getUser().uuid + } as Record + this.dialog.open() + hdHttp.post(BasicConstant.feedBack, entity).then(async (res: HdResponse) => { + this.dialog.close(); + console.info('Response delConditionRecord'+res); + let json:Record | Array>> = JSON.parse(res+'') as Record | Array>>; + if(json.code == '1') { + promptAction.showToast({ message:'谢谢您的支持', duration: 1000 }) + } else { + console.error('删除病情记录信息失败:'+json.message) + promptAction.showToast({ message: String(json.message), duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + console.error(`Response fails: ${err}`); + promptAction.showToast({ message: String('分享失败,请重试'), duration: 1000 }) + }) + } + + build() { + Column() { + HdNav({ title: '肝胆课件',showRightIcon: true,rightIcon:$r('app.media.selected_hospital_ws') ,showRightText:false, + rightItemAction:()=>{ + router.pushUrl({ + url:'pages/SearchPage/VideoSearchPage', + params:{'pageName':'视频'} + }) + }}) + + Column(){ + Row(){ + Row(){ + Text(this.isHotOrNew?'最热':'最新') + .fontSize(16) + .fontColor($r('app.color.main_color')) + Image(this.isHotOrNew?$r('app.media.cb_hot'):$r('app.media.cb_new')) + .width(16) + .height(16) + } + .layoutWeight(1) + .justifyContent(FlexAlign.Center) + .onClick(()=>{ + this.isHotOrNew = !this.isHotOrNew + if (this.isHotOrNew) { + this.sort = '1' + } else { + this.sort = '0' + } + this.pageNumber = 1; + this.getApplyList(); + }) + Blank() + .width(1) + .height(20) + .backgroundColor('#f4f4f4') + Row(){ + Text('筛选') + .fontSize(16) + .fontColor(this.selectedTag.length>0?$r('app.color.main_color'):Color.Gray) + Image(this.selectedTag.length>0?$r('app.media.cb_screen_yes'):$r('app.media.cb_screen_no')) + .width(16) + .height(16) + } + .layoutWeight(1) + .justifyContent(FlexAlign.Center) + .onClick(()=>{ + this.isShowSC = !this.isShowSC + }) + } + .width('100%') + .height(45) + .backgroundColor(Color.White) + } + .width('100%') + .height(50) + .backgroundColor('#f4f4f4') + + if (this.isEmptyViewVisible){ + EmptyViewComp({promptText:'暂无课件',isVisibility:this.isEmptyViewVisible}).layoutWeight(1) + } else { + PullToRefreshLayout({ + scroller:this.scroller, + viewKey:"ListPage", + controller:this.controller, + contentView:()=>{ + this.contentView() + }, + + onRefresh:()=>{ + this.pageNumber = 1; + this.getApplyList(); + setTimeout(() => { + this.controller.refreshSuccess() + }, 1000) + }, + onCanPullRefresh:()=>{ + if (!this.scroller.currentOffset()) { + /*处理无数据,为空的情况*/ + return true + } + //如果列表到顶,返回true,表示可以下拉,返回false,表示无法下拉 + return this.scroller.currentOffset().yOffset <= 0 + }, + onLoad:()=>{ + this.pageNumber++; + this.getApplyList(); + setTimeout(() => { + this.controller.loadSuccess() + }, 1000) + + }, + onCanPullLoad: () => { + if (this.pageNumber >= this.totalPageNumer) { + return false; + } else { + return true; + } + } + }).width('100%').layoutWeight(1).clip(true) + } + + Image($r('app.media.kejian_list_right_bottom')) + .width(76) + .height(40) + .position({ x: '100%', y: '100%' }) + .translate({ x: -76, y: -106 }) + .onClick(()=>{this.alertView.open()}) + + if (this.isShowSC) { + ScreeningView({type:'6',selectedArray:this.selectedTag,isSelectedItem:(value: TagList[])=>{ + this.selectedTag = value + this.isShowSC = false + this.keyWordsStr = value.map(tag => tag.NAME).join(",") + this.pageNumber = 1; + this.getApplyList(); + }}) + .width('100%') + .height('calc(100% - 152vp)') + } + } + .height('100%') + .width('100%') + .backgroundColor('#F1F3F5') + } + + @Builder + contentView() { + List({ scroller: this.scroller }) { + ForEach(this.data, (item: KeJianModel) => { + ListItem() { + KeJianItemComp({item:item}) + } + }) + } + .width('100%') + .height('100%') + .edgeEffect(EdgeEffect.None) + .scrollBar(BarState.Off) + } +} diff --git a/features/study/src/main/ets/components/KeepStudyComp.ets b/features/study/src/main/ets/components/KeepStudyComp.ets new file mode 100644 index 0000000..9ca7a6d --- /dev/null +++ b/features/study/src/main/ets/components/KeepStudyComp.ets @@ -0,0 +1,84 @@ +import { HdNav } from "@itcast/basic" +import { router } from "@kit.ArkUI" + +@Component +export struct KeepStudyComp { + + build() { + Column() { + HdNav({title:'继续教育',showLeftIcon:false,showRightIcon:false,showRightText:false}) + + Row(){ + Image($r('app.media.keepStudy_video_icon')) + .width(50) + .height(50) + .margin({left:10}) + .objectFit(ImageFit.Fill) + Column(){ + Text('肝胆视频') + .fontSize(16) + Text('数千集精彩报告等您来看') + .fontSize(14) + .margin({top:5}) + .fontColor($r('app.color.common_gray_02')) + } + .alignItems(HorizontalAlign.Start) + .margin({left:10,right:10}) + .layoutWeight(1) + + Image($r('app.media.arrow_right')) + .width(12) + .height(15) + .margin({right:10}) + } + .width('95%') + .height(90) + .borderRadius(3) + .backgroundColor(Color.White) + .margin({left:10,top:10,right:10}) + .onClick(()=>{ + router.pushUrl({ + url:'pages/VideoPage/VideoGandanPage', + params:{"page":"首页"} + }) + }) + + Row(){ + Image($r('app.media.keepStudy_kejian')) + .width(50) + .height(50) + .margin({left:10}) + .objectFit(ImageFit.Fill) + Column(){ + Text('肝胆课件') + .fontSize(16) + Text('国内专业优质肝胆课件共享平台') + .fontSize(14) + .margin({top:5}) + .fontColor($r('app.color.common_gray_02')) + } + .alignItems(HorizontalAlign.Start) + .margin({left:10,right:10}) + .layoutWeight(1) + .onClick(()=>{ + router.pushUrl({ + url:'pages/Courseware/CoursewarePage' + }) + }) + + Image($r('app.media.arrow_right')) + .width(12) + .height(15) + .margin({right:10}) + } + .width('95%') + .height(90) + .borderRadius(3) + .backgroundColor(Color.White) + .margin({left:10,top:10,right:10}) + } + .width('100%') + .height('100%') + .backgroundColor('#F1F3F5') + } +} diff --git a/features/study/src/main/ets/components/SchoolhouseComp.ets b/features/study/src/main/ets/components/SchoolhouseComp.ets new file mode 100644 index 0000000..ec81301 --- /dev/null +++ b/features/study/src/main/ets/components/SchoolhouseComp.ets @@ -0,0 +1,290 @@ +import { + authStore, + BasicConstant, EmptyViewComp, hdHttp, HdLoadingDialog, HdNav, + HdResponse, + ScreeningView, TagList } from "@itcast/basic" +import { promptAction, router } from "@kit.ArkUI" +import { PullToRefreshLayout, RefreshController } from "refreshlib" +import { PatientTBean, TeachModel } from '@itcast/basic/src/main/ets/models/TeachModel'; +import { ItemCompTeach } from "../views/ItemCompTeach"; +import { BusinessError } from "@kit.BasicServicesKit"; +import { HashMap } from "@kit.ArkTS"; +import { it } from "@ohos/hypium"; + +@Preview +@Component +export struct SchoolhouseComp { + @State isHotOrNew:boolean = false + @State isShowSC:boolean = false + @State selectedTag:TagList[] = [] + @State isEmptyViewVisible: boolean = false; // 控制显隐的状态变量 + public controller:RefreshController = new RefreshController(); + scroller = new Scroller(); + @State pageNumber:number = 1; + @State totalPageNumer:number = 1; + @State data:PatientTBean[]=[]; + @State sort:string = '1' + @State keyWordsStr:string = '' + + dialog: CustomDialogController = new CustomDialogController({ + builder: HdLoadingDialog({ message: '加载中...' }), + customStyle: true, + alignment: DialogAlignment.Center + }) + + aboutToAppear() { + this.getApplyList(); + } + getApplyList() { + const hashMap: HashMap = new HashMap(); + hashMap.set('page',this.pageNumber.toString()); + hashMap.set("type", this.sort); + hashMap.set("keywords", String(this.keyWordsStr)); + this.dialog.open() + hdHttp.httpReq(BasicConstant.polularScienceArticleListByKeywordsNew,hashMap).then(async (res: HdResponse) => { + this.dialog.close(); + let json:TeachModel = JSON.parse(res+'') as TeachModel; + if(json.code == '1') { + if(this.pageNumber==1) { + this.data=[] + if(json.data!=null) { + this.data = json.data; + } + } else if(this.pageNumber>1) { + this.data.push(...json.data) + } + this.totalPageNumer =json.totalPage; + if (this.data.length > 0) { + this.isEmptyViewVisible = false; + } else { + this.isEmptyViewVisible = true; + } + } else { + promptAction.showToast({ message: json.message, duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + this.controller.refreshError(); + console.info(`Response fails: ${err}`); + }) + } + + build() { + Column() { + HdNav({ title: '患教学堂', showLeftIcon:false , showRightIcon: true,rightIcon:$r('app.media.schoolhouse_navigation_right'),showRightText:false, + rightItemAction:()=>{ + router.pushUrl({ + url: 'pages/WebView/WebPage', + params: {'title':'投稿','url':'http://doc.igandan.com/app/html/news/f771025027f2486493d9daa7eb0d9b11.html'} + }) + }}) + + Column(){ + Row(){ + Text('患教文库') + .fontSize(18) + .fontColor($r('app.color.main_color')) + .height('100%') + .textAlign(TextAlign.Center) + .layoutWeight(1) + Blank() + .width(1) + .height('100%') + .backgroundColor('#f4f4f4') + Text('患教视频') + .fontSize(18) + .fontColor(Color.Gray) + .height('100%') + .textAlign(TextAlign.Center) + .layoutWeight(1) + .onClick(()=>{ + router.pushUrl({ + url: 'pages/VideoPage/EducationVideoPage' + }) + }) + Blank() + .width(1) + .height('100%') + .backgroundColor('#f4f4f4') + Text('常见问题') + .fontSize(18) + .fontColor(Color.Gray) + .height('100%') + .textAlign(TextAlign.Center) + .layoutWeight(1) + .onClick(()=>{ + router.pushUrl({ + url: 'pages/WebView/WebPage', + params: {'title':'常见问题','url':BasicConstant.wxUrl+'wxPatient/index.htm#/problem?link=share'} + }) + }) + } + .width('100%') + .height(45) + Blank() + .width('100%') + .height(1) + .backgroundColor('#f4f4f4') + Row(){ + Row(){ + Image($r('app.media.search_no')) + .width(16) + .height(16) + Text('搜索') + .fontSize(16) + .fontColor(Color.Gray) + } + .layoutWeight(1) + .justifyContent(FlexAlign.Center) + .onClick(()=>{ + router.pushUrl({ + url:'pages/SearchPage/VideoSearchPage', + params:{'pageName':'视频'} + }) + }) + Blank() + .width(1) + .height(20) + .backgroundColor('#f4f4f4') + Row(){ + Text(this.isHotOrNew?'最热':'最新') + .fontSize(16) + .fontColor($r('app.color.main_color')) + Image(this.isHotOrNew?$r('app.media.cb_hot'):$r('app.media.cb_new')) + .width(16) + .height(16) + } + .layoutWeight(1) + .justifyContent(FlexAlign.Center) + .onClick(()=>{ + this.isHotOrNew = !this.isHotOrNew + if (this.isHotOrNew) { + this.sort = '2' + } else { + this.sort = '1' + } + this.pageNumber = 1; + this.getApplyList(); + }) + Blank() + .width(1) + .height(20) + .backgroundColor('#f4f4f4') + Row(){ + Text('筛选') + .fontSize(16) + .fontColor(this.selectedTag.length>0?$r('app.color.main_color'):Color.Gray) + Image(this.selectedTag.length>0?$r('app.media.cb_screen_yes'):$r('app.media.cb_screen_no')) + .width(16) + .height(16) + } + .layoutWeight(1) + .justifyContent(FlexAlign.Center) + .onClick(()=>{ + this.isShowSC = !this.isShowSC + }) + } + .width('100%') + .height(45) + } + .width('100%') + .height(92) + .backgroundColor(Color.White) + + if (this.isEmptyViewVisible){ + EmptyViewComp({promptText:'暂无科普内容',isVisibility:this.isEmptyViewVisible}).layoutWeight(1) + } else { + PullToRefreshLayout({ + scroller:this.scroller, + viewKey:"ListPage", + controller:this.controller, + contentView:()=>{ + this.contentView() + }, + + onRefresh:()=>{ + this.pageNumber = 1; + this.getApplyList(); + setTimeout(() => { + this.controller.refreshSuccess() + }, 1000) + }, + onCanPullRefresh:()=>{ + if (!this.scroller.currentOffset()) { + /*处理无数据,为空的情况*/ + return true + } + //如果列表到顶,返回true,表示可以下拉,返回false,表示无法下拉 + return this.scroller.currentOffset().yOffset <= 0 + }, + onLoad:()=>{ + this.pageNumber++; + this.getApplyList(); + setTimeout(() => { + this.controller.loadSuccess() + }, 1000) + + }, + onCanPullLoad: () => { + if (this.pageNumber >= this.totalPageNumer) { + return false; + } else { + return true; + } + } + }).width('100%').layoutWeight(1).clip(true) + } + + if (this.isShowSC) { + ScreeningView({type:'4',selectedArray:this.selectedTag,isSelectedItem:(value: TagList[])=>{ + this.selectedTag = value + this.isShowSC = false + this.keyWordsStr = value.map(tag => tag.NAME).join(",") + this.pageNumber = 1; + this.getApplyList(); + }}) + .width('100%') + .height('calc(100% - 182vp)') + } + } + .height('100%') + .width('100%') + .backgroundColor('#F1F3F5') + } + + @Builder + contentView(){ + List({ scroller: this.scroller }) { + ForEach(this.data, (item: PatientTBean, index) => { + ListItem() { + ItemCompTeach({item:item}) + .onClick(()=>{this.pushDetailsView(item)}) + } + }) + } + .width('100%') + .height('100%') + .edgeEffect(EdgeEffect.None) + } + + private pushDetailsView(item: PatientTBean) { + const entity = { + "news_article_uuid":item.uuid, + "user_uuid": authStore.getUser().uuid, + "type":'2' + } as Record + this.dialog.open() + hdHttp.post(BasicConstant.read, entity).then(async (res: HdResponse) => { + this.dialog.close(); + console.info('Response delConditionRecord'+res); + let json:Record | Array>> = JSON.parse(res+'') as Record | Array>>; + if(json.code == '1') { + router.pushUrl({url:"pages/WebView/EducationDetailsWebPage",params:{"model":item}}) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + console.error(`Response fails: ${err}`); + promptAction.showToast({ message: String('患教文库数据请求失败!'), duration: 1000 }) + }) + } +} diff --git a/features/study/src/main/ets/models/KeJianModel.ets b/features/study/src/main/ets/models/KeJianModel.ets new file mode 100644 index 0000000..c904d54 --- /dev/null +++ b/features/study/src/main/ets/models/KeJianModel.ets @@ -0,0 +1,35 @@ +export interface KeJianRequest { + code:string; + data:KeJianList; + message:string; +} + +export interface KeJianList { + list:KeJianModel[] + totalPage:number + pageNumber:number + pageSize:number + totalRow:number +} + +export interface KeJianModel{ + uuid:string; + title:string; + type:string; + price:string; + readnum:string; + providername:string; + hospitalname:string; + discount:string; + preview_path:string; + tags:string; + order_id:string; + downloadername:string; + author:string; + download_path:string; + order_status:string; + create_date:string; + sort:string; + provider:string; + status:string +} \ No newline at end of file diff --git a/features/study/src/main/ets/views/ItemCompTeach.ets b/features/study/src/main/ets/views/ItemCompTeach.ets new file mode 100644 index 0000000..bc8a891 --- /dev/null +++ b/features/study/src/main/ets/views/ItemCompTeach.ets @@ -0,0 +1,68 @@ +import { BasicConstant, TimestampUtil } from '@itcast/basic'; +import { PatientTBean } from '@itcast/basic/src/main/ets/models/TeachModel'; + + +@Preview +@Component +export struct ItemCompTeach { + @Prop item:PatientTBean; + + aboutToAppear(): void { + + } + build() { + Column() { + Row() { + Image(BasicConstant.urlHtml+this.item.imgPath).width(114).height(76).alt($r('app.media.home_scroll_default1')) + Column() { + Text(this.item.topic).fontColor($r('app.color.common_gray_01')).fontSize(16) .textOverflow({ overflow: TextOverflow.Ellipsis }).height(40) + .ellipsisMode(EllipsisMode.END).maxLines(2) .textAlign(TextAlign.Start).align(Alignment.TopStart) + .width('100%') + Row() { + Row() { + Text('今日') + .borderRadius(30) + .fontColor(Color.White) + .backgroundColor('#f24d57') + .fontSize(11) + .padding({ left: 5, right: 5,top:2,bottom:2 }) + .visibility(TimestampUtil.isToday(this.item.modifyDate) ? Visibility.Visible : Visibility.None) + Text(this.item.modifyDate.length > 10 ? this.item.modifyDate.substring(5, 10) : this.item.modifyDate) + .fontColor($r('app.color.common_gray_03')) + .fontSize(12) + + .visibility(!TimestampUtil.isToday(this.item.modifyDate) ? Visibility.Visible : Visibility.None) + }.width(80).align(Alignment.Start) + + Row() { + Image($r('app.media.read_commient')).width(10).height(10) + Text(this.item.readnum > 100000 ? this.item.readnum * 1.000 / 10000.00 + '万' : this.item.readnum + '') + .fontColor($r('app.color.common_gray_03')).padding({left:3}) + .fontSize(12) + }.width(80).align(Alignment.Start) + + Row() { + Image($r('app.media.argee_commient')).width(10).height(10) + Text(this.item.agreenum > 100000 ? this.item.agreenum * 1.000 / 10000.00 + '万' : this.item.agreenum + '') + .fontColor($r('app.color.common_gray_03')).padding({left:3}) + .fontSize(12) + }.width(80).align(Alignment.Start) + } + .margin({top:10}) + .width('100%') + }.padding({left:10}) + .layoutWeight(1) + + }.alignSelf(ItemAlign.Start) + + .width('100%') + .padding(10) + .onClick(() => { + + }) + Text().backgroundColor($r('app.color.efefef')).width('100%').height(1) + } + .backgroundColor(Color.White) + } +} + diff --git a/features/study/src/main/ets/views/KeJianItemComp.ets b/features/study/src/main/ets/views/KeJianItemComp.ets new file mode 100644 index 0000000..ab36506 --- /dev/null +++ b/features/study/src/main/ets/views/KeJianItemComp.ets @@ -0,0 +1,139 @@ +import { ChangeUtil } from "@itcast/basic"; +import { KeJianModel } from "../models/KeJianModel"; + +@Component +export struct KeJianItemComp { + @Prop item:KeJianModel + + build() { + Column() { + Row() { + Image(this.item.type == 'pptx' ? $r('app.media.kejian_type_ppt') : + this.item.type == 'pdf' ? $r('app.media.kejian_type_pdff') : + this.item.type == 'docx' || this.item.type == 'doc' ? $r('app.media.kejian_type_wordd') : + $r('app.media.kejian_type_pdff')) + .margin({ left: 10 }) + .size({ width: 60, height: 72 }) + Column() { + Text(this.item.title) + .maxLines(2) + .fontSize(16) + Text(this.contentShow(this.item.providername,this.item.hospitalname)) + .fontSize(14) + .maxLines(1) + .fontColor('#888888') + .textOverflow({ overflow: TextOverflow.Ellipsis }) + .margin({ top: 5, right: 10 }) + Row() { + Row() { + Image($r('app.media.read_commient')) + .size({ width: 18, height: 18 }) + Text(this.item.readnum + '人阅读') + .margin({ left: 2 }) + .fontColor('#999999') + .fontSize(14) + } + .margin({ top: 12 }) + + if (this.item.price == '0') { + Row() { + Image($r('app.media.kejian_download_icon')) + .size({ width: 15, height: 15 }) + Text('免费') + .margin({ left: 2 }) + .fontColor('#999999') + .fontSize(14) + } + .margin({ top: 12 ,left: 10 }) + } else { + if (Number(this.item.price) > 0) { + if (this.item.discount == '1') { + Row() { + Image($r('app.media.kejian_download_icon')) + .size({ width: 15, height: 15 }) + Text('¥') + .margin({ left: 2 }) + .fontSize(13) + .fontColor(Color.Red) + Text(this.formatPrice(this.item.price)) + .fontColor(Color.Red) + .fontSize(16) + } + .margin({ top: 12 ,left: 10 }) + } else if (this.item.discount == '0') { + Row() { + Image($r('app.media.kejian_download_icon')) + .size({ width: 15, height: 15 }) + Text('免费') + .margin({ left: 2 }) + .fontColor('#999999') + .fontSize(14) + } + .margin({ top: 12 ,left: 10 }) + } else if (this.item.discount == '-1') { + } else { + Row() { + Image($r('app.media.kejian_download_icon')) + .size({ width: 15, height: 15 }) + Text('¥') + .margin({ left: 2 }) + .fontSize(13) + .fontColor(Color.Red) + Text(this.formatPrice2(this.item.price, this.item.discount)) + .fontColor(Color.Red) + .fontSize(16) + Text('原价') + .margin({ left: 10 }) + .fontSize(12) + .fontColor('#999999') + Text('¥'+this.formatPrice(this.item.price)) + .fontSize(12) + .fontColor('#999999') + .decoration({ type: TextDecorationType.LineThrough }) + } + .margin({ top: 12 ,left: 10 }) + } + } + } + } + .alignItems(VerticalAlign.Bottom) + } + .width('80%') + .margin({ left: 10, right: 10 }) + .alignItems(HorizontalAlign.Start) + } + .width('100%') + .padding({top:10,bottom:10}) + Blank() + .width('100%') + .height(0.5) + .backgroundColor(Color.Gray) + } + .width('100%') + .backgroundColor(Color.White) + } + + private formatPrice(priceStr: string): string { + let priceInFen = parseFloat(priceStr); + let priceInYuan = priceInFen / 100; + return `${priceInYuan.toFixed(2)}`; + } + + private formatPrice2(priceStr: string,discount: string): string { + let priceInFen = parseFloat(priceStr); + let priceInYuan = priceInFen / 100 * parseFloat(discount); + return `${priceInYuan.toFixed(2)}`; + } + + private contentShow(name:string,hospital:string):string { + let newname:string = '' + let newhospital:string = '' + if (!ChangeUtil.stringIsUndefinedAndNull(name)) { + newname = name + } + if (!ChangeUtil.stringIsUndefinedAndNull(hospital)) { + newhospital = hospital + } + return `${newname} ${newhospital}` + } +} diff --git a/features/study/src/main/module.json5 b/features/study/src/main/module.json5 new file mode 100644 index 0000000..1848d45 --- /dev/null +++ b/features/study/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "study", + "type": "har", + "deviceTypes": [ + "default", + "tablet", + "2in1" + ] + } +} diff --git a/features/study/src/main/resources/base/element/float.json b/features/study/src/main/resources/base/element/float.json new file mode 100644 index 0000000..a0a93dd --- /dev/null +++ b/features/study/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} \ No newline at end of file diff --git a/features/study/src/main/resources/base/element/string.json b/features/study/src/main/resources/base/element/string.json new file mode 100644 index 0000000..f51a9c8 --- /dev/null +++ b/features/study/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "page_show", + "value": "page from package" + } + ] +} diff --git a/features/study/src/main/resources/base/media/keepStudy_kejian.png b/features/study/src/main/resources/base/media/keepStudy_kejian.png new file mode 100644 index 0000000000000000000000000000000000000000..e89292a8253e560568d7d0e37569ffa75a2146c4 GIT binary patch literal 5239 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 GWB&*5U1vT3 literal 0 HcmV?d00001 diff --git a/features/study/src/main/resources/base/media/kejian_list_right_bottom.png b/features/study/src/main/resources/base/media/kejian_list_right_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..155f968b565baad3287eaf59b22ff4464e396e82 GIT binary patch literal 8895 zcmaKSbyQSe_cw@22}nES%uoWt(48~H4BaUuLpKak0)nK}(A^;&Qi8O^fOLm|2+|-a z0tzoazvuh>-ap>wy=&cj&OLX3K6{_NKkJ^g&b^TuYKlYzGz3^!SVRc8oYq~tad&#- zJ-oYqJ2h>*YXB&D1C+LlHOkAv-3m(<>GHw~h;Xv7vC^`#K>D~1T1jAG;jr527@!PP zRm3b^oVYFi+HiY2x!$3%uq33tT`epftWdxgRyKCdlHea7JHbFZq$F5hP?bm36=r2? z2lsWi()Lx;vGjGY6h(rirGOINVs`{iRwxUgx09o@hnTk{_+PwYcm2P^5HRpxCMX9< z@c#s5psE3cxwu;a1-XT|EO`Y4fx@EPyh8i}qN2}$d_24&5FQZ-FFzNrkeC3E7#|<- z-v{{4n>*54OiNDT-@fkdB*C^Ql&cs7;^pPV?ZwaS;%)=s6%`eQ@bE$S__*#YxIBEE zQ5N1@&K^wvFvwYXSi0M}qU>Cpfqxk-UbuLoB*Ax){?8PgT>nGs?D6k3-6ag-ZQ%;x z<>vW2rGE@nRsa8{PEP-^_CRS_{cpVgPht-pA6F}gmX(K#r@Q4{;jEedx^fkRxm#JF zT-FzUsWmdr8r_s;Z&M_JC`)32fww{YaT7 zM275rVz$g{w0GwPQcZ;aGtcY#wKhSusNJ{db4`tubtxL`=;mqLL1dl z#$ZLr9Llt%jnBvG`0ZM9zXJgRE<&LR@?CLjQ(N~Wt|@M#`iNlzf$;6f3A{~)_Q*^b z*OP&e+z{rX_SbKHBx@>svimrprhJhI1SUp#lxPu=-R^@kJudETGRkRc%8JhpI$*O1 zQD*tWTEk!UyD|g=r=epgiQ70&MTeY$zfq(zKOb?pk-MpxF16)QRw+pMb)O?5>fP^o zgQ4iy;^}SM?~QV-1#Gc#(Hg6fpj~OV;MTBM?WMZHA$vLrs9zji$!y^p0q_s<$Uzx6 z>-xa2HBD1O9G^g5au+vyFz;D zW~qUuXY<*`c-W!Z;{39Fc(^*|BOEM%zw@5Fvuh9AHth!9Gq$lYb!jM?L`qLS&G;+_ zzxA1C+;0h&$C(^Q_e!WH zid(dI`kGin(`v<8n1hwztV{{*w;}J=>5Ws+a%Sx5vhPZYLPtmlUqFolGMrY;1P%+& zahI&VXoE#UkbI+?;hiTLYkMCIn!0a3)`nDDi<6eyi-7sX!aAfag-o)t7321oV5*9^ z-%Z%^qwokZ5zjK42bk8gijcn6-7n(Is09X}|29=yL%?qRr_qVy<9&GFFD zc@QT-$;9ojxL{G1kTn)f_ngwu_Synv5*0ny4=MaTyg_7J1f%KqpmG_hp;6TWpCd^4e_)xq%zVVDNW^k;9(i( zYi6Q0;Tg{wAqH_JKPObLyec|6RDfo2e5U=e@pDNJZh7_i>PM1a3^XdeEg2Wg_U6w% z#=R?<;_FDcI1&xJr#F(J2&fF5X4oy<%B0yg^Op=;_46Bil#woxLElu}63-x6yLx$- z;^2_Lb=^|0;ZQ@-XV}*2_I?vjZ#daD z%#<%~Xfw|!%cXq^0Iu;pPnHJiJ+-qY#ZDl7bS+pzuuLz=Zyec);G@A!*!r=#`mCqB zb3sdLAbe<3_*-xF+_-V+9(+fEQ}bh)n$Xit6B-#<`*|S zhwaMPv;{uKG1kx6S(XnCAyqcRx6UK7Xla#6Ml!~l(2m5ynw434uPQThX z8uUPZB)jik-b(P^N%R#a6HSBPstc5b4Ti~mjM;%|ekODCTzH-y^nxtU?3KgSvyAk# zjk}nPE{bS&DzguEiZCPfX{fK zyq=AF6!Y@>0wfiv&Yt@i@ZEaqYVuw!D6*)w_)aBI_FI;n;XaW>-PaB$QOs|iVG-nZ z_LZ-dOU}fKvVD0i{Nt+2t#ig_fvuP+O98xe6dnDnX5*DgoOg1R zDaHbaW{qg4r;eC$-Q-WgzQk3g`G6NVc+D!5Vye6VoYdE+UHnN~cz}gjS(4YN|ND;S)!%@HkAr&Y@3AL-{*BmvxN^?s@OZ z6m$igO_12Miy!&^1D8zLu&~nS?dlAZCjU(mB^xcb;1Avd2#yNU9lYmB`aD1Bkke6x z(1ePR=_Qe1Fvw6WWn0vJ{K40$#l5OYU2wLHYU ze44GEZQ$%kx}kV1R>9!xFBDfDvxb{YrzB$fI@MgEg8W-zn8NS*9+VW(Ct z+8yLJDcSlOpFHH1P_(g-eNgYAnNaI0k8Qy3n8|cYUVU$=3C5?vwtEBzHiqPP$AV^{VqlELJ>_YL)~w>iNq~(Vr8jjKb-BCeaOI3>)`m4vUbooxjr)} z9>*(o+Z;JL5Y}?A4FOR8$?@7PWhX^_E7Z(9?2V9QGKGwB<#q1eZ$7xEqq5ORBU{p+ z0z2}r?glB{ZvJ?h&=J9s!pw?Kh;BThRHw{;3L5-zD!|Fj31+qy@?G}(g|nyv=kr}( zUU3%2Ro26LV~K;Ep*r@Jwn|N#%t}~GvYajYp6S@5H=T*5CBytxxR2Tc!N)p*qf<&y zUkmKO`~n_lN4lo~UYf5rtu)P@TxyLj3i#IH5~iKPww<))^g1@NkZsZ)jNf^dxI)Em z+TUMlfgs&$3VXNI!5z1o$7BkFI|VqO7EIIe0G(PU^2@M+<(mL2(|o6`Si4De9*|=2 z*-|(D8`>3pVX@L^-;f3-!I4!ppUw=gq4~=zrMmi0WghvMi8m`ETSiaziLLm2S^d`A zzY9@OG8ykC0ab}$br9#3(@Sy4fn_=8KQZ!Su2-G#SNC02_FT8u2XY?*a?FyekDZ^ zi!lkp5+-l~vUq4-gY2I?!YmM>(b=)-1hoBBGEWml7WUF zdfl@74wyGyO<;Sx+Q1DX%dvBQoN(M^H|5_!f($|Ki}P+6@ZGCVtekm4<=~rcKN#jK z_gFD=`hWz`Sk(4%$-23t1`qS8>DAgaOYGjQJub*5k~r;9aVTE<*vKZF?{MT99~ibN z8!i~a9jV@+lPD{#C#aL3K*YiEHoh_a88E36IlY)P=NxDTc)$Mh!cvjmgwN^$i0O<@ z%qlWp9TO&dp+e*>#|G^m_{ADcP0{m^9K+khmq>tYX|_&%!C#L2v`#bfh%AIx=1b&H zc6s2{sS=GUQGH{i z+dxrA0L)-p_&T1RlU6iMThKc=JO=F%lBmwtD7Fv+5z0ZV`+7smh6k5h0%IgNYEH?6PR-n8+ zQe;xHk(hP^t3`OvFJ-K8I2Z`tJ3e&vF+9iMiC@JpP{y)a^5EN1Y@aoa2r3s&1cw}O zq?A{9x#;JpBR4VH=bp|?BlIxL*<<=F5A_4*MZxhJi5gJ}8R=~8va>GIcrqukaoVk+ zwtH7%W-6qBnG11xz2GAXnn~)@quT`&JI9p*xTBCEoxZlGBK`=wHg2o5I zw>Jr7$lriO-lhH~B5RPIT6IbYD*Dq`4AvjT^-5V0obFqQ3MYMP5}aEx9`d#pmK;sC z7F5eCmNNxcgp2kv1kskn_5&JyDmmD7X^%f!@CjhbvWHnz63}lz?m?O~=Ps(8GH8wK zz9X09G$XAQ{R;~N6BRa+uklCfPy*vXdH^vIv>>~4aRZ+`8!{O!CNoH3blCajaCxqN zWHYa3MnoXU{6k1R9=poxv*^#Fr1UBuIvq*?Cj5=?IwFu@u8W-x4Sp0eZfr|SDRU*a zbtlmrAti%7mGTE&^RFMfb6>YT7Z)Fi#AA2-^JRTvWjykiq_SeND@I55&nAgO1tq0k zQCFXw+*8E&xlL+z9FHD+R~Hp70|U*>jg(7A|FE0CL~go{aGIVtb! zndm~BWV+CKtnbskh}m8ebvgE@E*hcC#KYK{ z2gSfHzu~8AQNL~#R~ZBQOKAZgW5M?I4-ahd@jVEQyB)`HcrbmDA-(t4J_Qp#r^$s2 zAI1HO9NtIp4xALVN)?E_&wBfgb{FNuclKG9^KoE)_GINt>TxyOfSPwvKj|2rG;(cfgcR!tCnm7! znhD>#Z%+e9nq3KA8f$#Q9sGXz(cVVFSBcInXHW{a7w+b)MlxfI-(rH2IhTboWZsDkn=+co< zcx)oiih||+@rRYHNd6jMvW7RWatAG_L2;)KkLtt3u9QE{zj=FVpsDc;P>L-!;z=hg zy^((qRQPT78^Dr5voSD+!09%9Y$JO=vuTNBC;O{nd}Gb#V1%S^M{JIGj+?yMikW&e zwGnS7x=Vo+Bz*pIN;PygG4J%3+tqBiIE7*Y+uat!&Sp;n!iDo~?SkO!h+~BB*XK1Y zKIi*&OC?k-Wfh$cPA8Y5M%QG>fnmfL?rpNu+v1A|OyIcfl2$WZ?B?~Can4hMXQKEU1p&?0?`Q#T_afL< zdUx#_Dnl+>;txb9UR{&oxE-3~7sTe{@c4dR^R={d-Bzm}N%TCmd_+Q+4b9=G*URo# zs5R9_<&{^O-r_1R%n-98acjJMxQ-=`a!u${NZp-`rwp*DW!^4Hem@Q7ix8N8{cxO# zSS0SO)Yd2^c~1cx&A^jESbm@*HB#7FX^QF9o_St{FyFzO@BxAeujENVUUz#)Vckro zPM0IEZK?_=k#gg07rp2N^a{T~k&eRGOEl{(Wx|t8>_xKz_xn3uYU*;gnc)<8tUSoA zpqAtzS2}o`43s|Tr}K=jXXEbattaDI3;XYCx7*GH3yja`HQD0arFk;RV{-TR~u~8PZ_)r9EFqs5r)Hnjm5()U19Gu zmr?9KZ3kB3`d!^VVJWJI9R*=zjY*#u^xhJ>wva#-!9aSt7ky>6Od*j z76M6?@Jm5_iS>m6KW5Aj>f)Qb3^S<^qcYhFAxtDjd zoyw@NQ;$5c0MX^1wTg|*0j*^#o#W)37v&=y#mg%d@%8q_O#y_Dz4@3#NC2z{*F1=4q*d=bK2|!g zBu#uQ7jhO=3)jjA&F*m9OwE2VmFFuLg6MdE#E&FC7*MR#pP#9IQ_d{cKVnjO1E?ci zweU1zA!tinCne*BQz|6j>pUNzZFxI)$=?{#ds~-t;8-*PVz}Dsvk9#XDZ1Nfc9Qfv z4YRr2p_UUDC|cN3nH?PaN*M9rBWW)766r`FujTzent9d_#S!M9B`v%^rRQn54-dEq zR;0b>tK!hfzxd78ZHT9FDLP&kwY{%3(4;2iFzCHaUAZk(ZG`=vEJcO*SM*EeSHFcz zm=Y2PUfq~G7tQE$t{Z;4IK7g9K*k>IOTZDFi-(`2LVKBTg+kw`w&;^LD>W^oA2Y8~ zywv@uGHrM~Q1Z}7wEekH0GslxLvtrYM;9_jK`2uINRF)~)U_F{!1m4hvvZwj|EcjO zyR(5(4^5!a*&^@)ASh)2y8r-;bP&~A~{ zj-driVqW!NAWn;^q5z{(ZbA9LP-!`sp)mqcT`O{J_8|DcRV#!BU02x8xz-^2nGlT| z;_H6MZfUBE-c_FIr{~iDz7a?2(~f^U&z-%Aas6tLoxM&CGE{1+< z$bI%zq*hONz1G=PqT_1PDYvE9kL+WOlr*_5B$E9y+Q0|g=_oRkmv>KhrH_Ov`I}+r!9Y7h38V5v44PHS_}USEB&;}LBbDv?7HhH zF@JcPra-G8_=__x{^^n1m#rKKFw;u+fZK>aFu#!XF|4eu=9MXC8FREDrJ+wgZ6Ay8 z6w;Q@H8x64R#)DfXqkFlIv=@xdG4+w0RVp|AtBsAX+@^6-K#); zcP*RoFz=lKwR-fU%(Y?J?u`CFO2=+I`Sg;wGR8;6vt^OnHnj>`?0C4c1d`pEkG^FB zD{W@u7F%(&$cvU|Rx74Cj0|n*@bDp1NZbd;(BPyWJnZ_%Q@HXqmWsEgBivWV`veQV zOftXgsurg2U&~e7JDS~@1ci6urhB02%%pND!mg&lQ#EKVxBJt@Qw(a(Upp9l(Ok6g?ff>Nc^ z-aAgw`WDe%jHoC*oyzpy;h2GQy(x-L+^ta0yJAci$zM#QFMlU}z*8wfqTBkz^GJY4 zQYC^##fXB(v`4v_1eEbBz~3u*^6s@l3;arxA`}k^q*SJjsm-7*6-uvq#r zhhi}OA{q~N_x!R|*?&egSB9mJWdfJmR|0<*Vw>CcSZ6*r*abZP(61tD~EQ z`egT~6@QhJLy57WQJ6iIQeIcs*?0#{Yo>59HtxJJnS~mhntkFDk5?&I%HmABJ+!#D zCS#W^wBfh9I(1d4uR6XH96qmbXC&LtZ`ZK)o*R98rJ{}FpA&f*E6+3&Or+xgl>IF( zD9)9>_Vn(nWm3}ip089*?gs%~ldkKxbOx2Kbrn3q_la^{zT8N)iy{=t5Gr)!N{@Kn z)(g9Q2xgo;qG`q^a`zn_#FWqymat3e!Qvw@@+M1*6q8okWELuSzT-zuAJwQo@h7=z zCSvjc3LNid>B!|Qi{;4UToDhLTF#NPq4+y@#30Y#UOlE@oIWaPWq>fMvK)UdC9 zIPUKhq>3Ba`URT7Z5H7wP^f)Gq$%SQA1|W#nM%#UmZyR-90^*C2Gm(z@I=Pm&sZRi184&}7K{jGWh|BF6+49xq-fuz?j7wTF}Nio;{Y zS_r!@E%XFH=T~Xo+Zy4#UT_Bo)JP7+xn(jM&-gA-z#4c{_(Q*FC8*{R-X^OA9=iM1(Lw%k(WX zqp}R1#Cbi8+5G&1Yg16yR1F`2`HEFN7E@gePSj_K5pv^R)7=N#l{j=$#Uu)qg(M!| c-g|@vIC_%g-FKk=_m>icyqa7!)I9kA0AzZ4Hvj+t literal 0 HcmV?d00001 diff --git a/features/study/src/main/resources/base/media/kejian_type_pdff.png b/features/study/src/main/resources/base/media/kejian_type_pdff.png new file mode 100644 index 0000000000000000000000000000000000000000..63054719ba1d7efd75c5a90e48fa75f4eb64ae1a GIT binary patch literal 6282 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 SyK}$)4rr=r!(XdD2>L$<34>$+ literal 0 HcmV?d00001 diff --git a/features/study/src/main/resources/base/media/kejian_type_ppt.png b/features/study/src/main/resources/base/media/kejian_type_ppt.png new file mode 100644 index 0000000000000000000000000000000000000000..00f005db144558ca24701b1aaec2213f27b301de GIT binary patch literal 4708 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 literal 0 HcmV?d00001 diff --git a/features/study/src/main/resources/base/media/kejian_type_wordd.png b/features/study/src/main/resources/base/media/kejian_type_wordd.png new file mode 100644 index 0000000000000000000000000000000000000000..9652f5784d2ef3bc02ea9b4b0502868f16281c17 GIT binary patch literal 5089 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 H!lV8J2xcze literal 0 HcmV?d00001 diff --git a/features/study/src/main/resources/base/media/schoolhouse_navigation_right.png b/features/study/src/main/resources/base/media/schoolhouse_navigation_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c9912dc3fde6a462026ef050d2904b10048a91 GIT binary patch literal 1999 zcmaJ?dsGuw9v&bBOdAnID4=!-2X(1QCQr#gfGkOXEy+SmHPF`PH9!o>gvq2lY!%V9 zp@Q}y=YrrB?zS#;F32D!CVPfw&X41fC z5ZoxF{T7r;mH{TC7y|MbJh~2IalsV=28+ky#35SLL4TGLuavJNC2~V;PZz@ zc*FELutF?-?u)R5v^*TQz)WUgVIiZC!$7fICQBd?Fd;UR&88Cwy0zGhYl`S*Yt)Q_ z7_sUwg9SIBX3(Rk(V{k7NFyTsEd`V1g{;~7yi7#Fm_-^3lf{5MDa`<7vi}b?nO>l+ zxB~e--v23VRTf(irUJ2|HcUq}E+@+4$^s{2hz3V7C5qY5|jz!DXur zW<6SH{nInJOa`Z!t+>XlL(;@T8X>?i81%51E#-=M$-LNDqR1=>PXNVoVp*}$SU#J@ zU%}?jaK)(3W&mIeR zRxXnWhUw|+ANo9VL=2B-`(kPd)O%YY4*Lo^9>!+Cqnju%OY3IPbX}C9sJ|hDz;t6 zLw{MbYRWV@qN)Msah$nvO~oC{*;vHiqIt2_hr)Ts~-#;tbbtrI_`GD_KnN3M@51D71uJi z^e?XlC5|EO%Q?|LFOQwF)pkDJANkKGHw(k|v zh;6;LD;$4COp+z?ueno|jzzSt1d`1$O{JdpAODLic2|M(KcpIZe2}YRh;qQ!l)JdA zmja^zGAvP zqOm&j?g3TQD)(82eE^DPm8rD?CuOsuj=OY!R(WcgS?Z6;OE;&-e@2}k|5T`1D}++R z`;vw)@5)xwMSZ)*D?ZK^Ra4)*oaGht86cV*6LV`A1&$pGBpO2m&V%z zZ-pV}ZPoFcFGOyyC=VpP6vFEt{B+OJ;QN5z@xa|Fj5$@9OO0fVAFkzmQ)8rRe{RjJ zJJb4hXy#ne772Xx=8d}cH9qAbIkYQoZBI$UT+pfWB}}SuL$LMQnbxqwfXQG^eadxfqJt$#5(f zYy{xu={N55Q~XEU?pK9%-fDX{j;u(nE8P#`P`sj-d7-gh-nIU=`aRl*ngZ&E&DPYf zZgk`{!#kT>D$%>P7(ssH`G{B6Zg0BPhF=^{JH&aEUWF}{pzB(ShgP+W-WEBp25bm$ z)$e-k;Q;?}Si7rXNBYBHZs`6j9@0^$#KOlK$ip2iPamX|dI5LJDe?#;j_LWurb*=D J)<3Ju{tHm^4y*tG literal 0 HcmV?d00001 diff --git a/features/study/src/ohosTest/ets/test/List.test.ets b/features/study/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..794c7dc --- /dev/null +++ b/features/study/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/features/study/src/ohosTest/module.json5 b/features/study/src/ohosTest/module.json5 new file mode 100644 index 0000000..7fe2ef4 --- /dev/null +++ b/features/study/src/ohosTest/module.json5 @@ -0,0 +1,13 @@ +{ + "module": { + "name": "study_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/features/study/src/test/List.test.ets b/features/study/src/test/List.test.ets new file mode 100644 index 0000000..bb5b5c3 --- /dev/null +++ b/features/study/src/test/List.test.ets @@ -0,0 +1,5 @@ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/features/study/src/test/LocalUnit.test.ets b/features/study/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..165fc16 --- /dev/null +++ b/features/study/src/test/LocalUnit.test.ets @@ -0,0 +1,33 @@ +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/polyv/hmrouter-consumer-rules.txt b/polyv/hmrouter-consumer-rules.txt new file mode 100644 index 0000000..8f76f14 --- /dev/null +++ b/polyv/hmrouter-consumer-rules.txt @@ -0,0 +1,3 @@ +-keep-file-name +-keep-property-name +-keep-global-name \ No newline at end of file diff --git a/polyv/hmrouter-obfuscation-rules.txt b/polyv/hmrouter-obfuscation-rules.txt new file mode 100644 index 0000000..8f76f14 --- /dev/null +++ b/polyv/hmrouter-obfuscation-rules.txt @@ -0,0 +1,3 @@ +-keep-file-name +-keep-property-name +-keep-global-name \ No newline at end of file diff --git a/products/expert/src/main/ets/pages/Courseware/CoursewarePage.ets b/products/expert/src/main/ets/pages/Courseware/CoursewarePage.ets new file mode 100644 index 0000000..b46370d --- /dev/null +++ b/products/expert/src/main/ets/pages/Courseware/CoursewarePage.ets @@ -0,0 +1,13 @@ +import { CoursewareComp } from 'study'; + +@Entry +@Component +struct CoursewarePage { + build() { + Column() { + CoursewareComp() + } + .height('100%') + .width('100%') + } +} \ No newline at end of file diff --git a/products/expert/src/main/ets/pages/Tabbar/TabBarComp.ets b/products/expert/src/main/ets/pages/Tabbar/TabBarComp.ets index acb4c6c..47343c7 100644 --- a/products/expert/src/main/ets/pages/Tabbar/TabBarComp.ets +++ b/products/expert/src/main/ets/pages/Tabbar/TabBarComp.ets @@ -4,6 +4,7 @@ import { TabBarCompModel } from '../../models/TabBarCompModel' import { TabBarItems } from '../../contants/TabBarItems' import { BasicConstant,AESEncryptionDecryption,authStore,preferenceStore } from '@itcast/basic' import mediaquery from '@ohos.mediaquery'; +import { KeepStudyComp, SchoolhouseComp } from 'study' @Component export struct TabBarComp { @@ -48,41 +49,50 @@ export struct TabBarComp { index: this.activeIndex }) { - TabContent() { - if (this.activeIndex === 0) HomePage() - } - .tabBar(this.TabBarBuilder( { - defaultIcon: $r('app.media.home_default_icon'), - activeIcon: $r('app.media.home_selected_icon'), - label: '首页' - }, 0)) - .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]) TabContent() { - if (this.activeIndex === 1) VideoPage() + if (this.activeIndex === 0) HomePage() + } + .tabBar(this.TabBarBuilder( { + defaultIcon: $r('app.media.home_default_icon'), + activeIcon: $r('app.media.home_selected_icon'), + label: '首页' + }, 0)) + .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]) + TabContent() { + if (this.activeIndex === 1) SchoolhouseComp() + } + .tabBar(this.TabBarBuilder({ + defaultIcon: $r('app.media.new_home_huaunjiao_icon'), + activeIcon: $r('app.media.new_home_huaunjiao_SelectedIcon'), + label: '患教学堂' + }, 1)) + .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]) + TabContent() { + if (this.activeIndex === 2) VideoPage() } .tabBar(this.TabBarBuilder({ defaultIcon: $r('app.media.home_my_meeting_nor'), activeIcon: $r('app.media.home_my_meeting_sel'), label: '会议·直播' - }, 1)) - .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]) - TabContent() { - if (this.activeIndex === 2) VideoGandan() - } - .tabBar(this.TabBarBuilder({ - defaultIcon: $r('app.media.video_tabbar_icon'), - activeIcon: $r('app.media.video_tabbar_selected_icon'), - label: '视频' }, 2)) .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]) TabContent() { - if (this.activeIndex === 3) MyHomePage() + if (this.activeIndex === 3) KeepStudyComp() + } + .tabBar(this.TabBarBuilder({ + defaultIcon: $r('app.media.new_nextStudy_default'), + activeIcon: $r('app.media.new_nextStudy_selected'), + label: '继续教育' + }, 3)) + .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]) + TabContent() { + if (this.activeIndex === 4) MyHomePage() } .tabBar(this.TabBarBuilder({ defaultIcon: $r('app.media.my_tabbar_icon'), activeIcon: $r('app.media.my_tabbar_selected_icon'), label: '我的' - }, 3)) + }, 4)) .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]) } diff --git a/products/expert/src/main/ets/pages/VideoPage/EducationVideoPage.ets b/products/expert/src/main/ets/pages/VideoPage/EducationVideoPage.ets new file mode 100644 index 0000000..748ff2e --- /dev/null +++ b/products/expert/src/main/ets/pages/VideoPage/EducationVideoPage.ets @@ -0,0 +1,13 @@ +import { EducationVideo } from 'home' + +@Entry +@Component +struct EducationVideoPage { + build() { + Column() { + EducationVideo() + } + .height('100%') + .width('100%') + } +} \ No newline at end of file diff --git a/products/expert/src/main/ets/pages/WebView/EducationDetailsWebPage.ets b/products/expert/src/main/ets/pages/WebView/EducationDetailsWebPage.ets new file mode 100644 index 0000000..35436ef --- /dev/null +++ b/products/expert/src/main/ets/pages/WebView/EducationDetailsWebPage.ets @@ -0,0 +1,87 @@ +import webview from '@ohos.web.webview'; +import { BasicConstant, HdNav, preferenceStore } from '@itcast/basic'; +import router from '@ohos.router'; +import { image } from '@kit.ImageKit'; +import { photoAccessHelper } from '@kit.MediaLibraryKit'; +import { promptAction } from '@kit.ArkUI'; +import { fileIo, fileUri } from '@kit.CoreFileKit'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { PatientTBean } from '@itcast/basic/src/main/ets/models/TeachModel'; + +@Entry +@Component +struct EducationDetailsWebPage { + private controller: webview.WebviewController = new webview.WebviewController(); + @State params:RouteParams = router.getParams() as RouteParams; + + // 修改为移动端User-Agent,解决链接中有视频的问题 + private customUserAgent: string = 'Mozilla/5.0 (Linux; Android 10; HarmonyOS) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 gdxz-expert'; + + @State contentWidth: number = 0; + @State contentHeight: number = 0; + @State url: string = BasicConstant.urlHtml+this.params.model.path; + @State title: string = '患教详情'; + + onBackPress(): boolean | void { + if (this.controller.accessStep(-1)) { + this.controller.backward(); + return true; + } + return false; + } + + build() { + Column() { + HdNav({ title: this.title, showRightIcon: false, hasBorder: true ,isLeftAction:true,leftItemAction:()=>{ + if (this.controller.accessBackward()) { + this.controller.backward(); + } else { + router.back(); + } + }}) + Web({ + src: this.url, + controller: this.controller + }) + .id('webView') + .mixedMode(MixedMode.All) + .overScrollMode(OverScrollMode.ALWAYS) + .domStorageAccess(true) + .onControllerAttached(() => { + let userAgent = this.controller.getUserAgent() + this.customUserAgent; + this.controller.setCustomUserAgent(userAgent); + }) + .onPageEnd(() => { + // 注入JS获取body高度 + this.controller.runJavaScript( + 'document.documentElement.scrollWidth', (error, result) => { + if (!error) this.contentWidth = Number(result); + } + ); + this.controller.runJavaScript('document.body.scrollHeight',(error,result)=>{ + if (!error) this.contentHeight = Number(result); + }) + + }) + .width('100%') + .layoutWeight(1) + .height('calc(100% - 80vp)') + + Row(){ + Row(){ + Image('') + .size({width:20,height:20}) + } + .margin({left:15,top:12}) + } + .alignItems(VerticalAlign.Top) + .backgroundColor(Color.White) + } + .width('100%') + .height('100%') + } +} + +interface RouteParams { + model:PatientTBean +} \ No newline at end of file diff --git a/products/expert/src/main/resources/base/media/new_home_huaunjiao_SelectedIcon.png b/products/expert/src/main/resources/base/media/new_home_huaunjiao_SelectedIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..40ce5bc26e623f98ea27224431b96fa53aca12fd GIT binary patch literal 2562 zcmV+d3jOtoP)Px;yh%hsRCr$PTzzm<)fNAp`}QLN5(JWL5<&>cCWHXBjO|byr_<3&ZE*^8DkGq! z6e|u2gJk(?X9O&Wz$PF9ww<;@9T^3th}uC>u@0?mby6rGpBq33A-e%0Atda_yQlMZ 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 Y4;Fw>g6zhr3IG5A07*qoM6N<$g1zm?mjD0& literal 0 HcmV?d00001 diff --git a/products/expert/src/main/resources/base/media/new_home_huaunjiao_icon.png b/products/expert/src/main/resources/base/media/new_home_huaunjiao_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad8a2a454ddb80264771f54f9a0077e97439755 GIT binary patch literal 3021 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 P00000NkvXXu0mjfzBivm literal 0 HcmV?d00001 diff --git a/products/expert/src/main/resources/base/media/new_nextStudy_default.png b/products/expert/src/main/resources/base/media/new_nextStudy_default.png new file mode 100644 index 0000000000000000000000000000000000000000..78d95981e560fb82ccca731a15b7346628873598 GIT binary patch literal 3703 zcmV--4v6uIP)Px@F-b&0RCr$Pn}2jv<(bF7&pUT!LYVv@L@Njiwmo&%YHN?S6{~x+^|bC0g<9}* zx7EhhW;JG%v1l0JW;4bQJs1!VO>$)CWyDD{A*VeXH540RA2!aQa z5JECD_kH#}Gxy36Loj9t;_orz9|2T201^Pb zK%^gdjscY8dZ=fmM}Z!zE$4N5c`{aYgX zE)jo|8PlA_r2xDF&?8>2_nBZY*dL3<<`D5e0dylXmpbi|0Br=&9S8(|Ra;w|EF_$Q zLlNmnr4qLQXaMLuX7)G>8c>Rs18QwJ9Nv??$j;8r@?U3O`G!*vDA8#2Tq3#+;9G$Ywu;RCHKp)SB4PjgqD6}i<+7OO z=4RiNDP>pLHq`?BH2{;G_j+YZDWxCo?HzcvrKLsZ(qArZ@(QJ=r^mBr&#s$nTQ6hA zxd43bRspypmC_H*o;~}$6FFvETU)32{r>Bj^-2IAbEJ*|-c3Xgr&8L=m(=71N^^6w zQCV5}NoM^6W?lfm>%cfdgx>&aQ8*laDIdmIM@Pprt#u6GYl*1h=(fbGM4oVIY3Xlk zYikE{k%;59IcX^Ic>Ek@``cP`O_oyBMEJedc(k;%bln|y+;Q+^COPt5(O1c2@;c{~ z`mzfKfNZIMC8BQAH2-j-W1bWg%d)=4tnUMGQI>RwY5o9_vbJp5vUC0V^#!p=1w>a@ zSG8>?zo9iRb8H*oAjkY3BE+Ulnc7`bQ!_MPIOB$r(HnctOQljx0DmuQzyuLqC-U4K z4u^j^-ie${d&{ye1h~yH2+JIOV*~sgGcE1!@Bc$fOG_fxF~$X@v$OMzR4R2dvzAlk zZ{&o{OaN~yr5@87PnxE=JJ-SU*-jkG^78TpTI*UOd>(*f578c_uvRH!O)wbTo{L_~ z35xhCRaNCzrBd7q;6eZ;&Vmxmc*3^rm9uBh-hLvdNQMlXP1IJ& z6^v|m+fFXjnr|bbi$pnRwhwOyu-5DKudT1Ie|Kbmqe6+ta;1E@6+2s~A2548|r+&<&+=vQqUViA8T3(hb=4+CiL@9*C&s^AzX zu~_U0$N6$S*?j=5wQc*+rlzKCg`9A)`j!u`l&S&vb|CGFxX)H1RU<~<2q;l;;m>kg z5z!#PYyJL7_tw?b?Jd^C3ptKBm=zTjUk5}9^VwNr^#SzVNF?&~F;Fb4eLgdZg?e6= zc*%QxM7W=sp746TJA=XCa3Lq2@4iK^1OkC-rPLRRu$Y;@m^FrY*9QRlh1UAc#>U2d zBNZ*JSg~TJ&*!@i(DRugAw$tp@N_r7({f zq9msrZA-mG{H#*6acC&{tk37Wnptm{5GavI|h!fGaU@$0I0=6tmKGMWO z$zG&oS!V-!2|(8|^K<})`#%xA1<;CQGWlPFgM<5yr*{@CSm3$jl1n~j7{=9r=nOtT zYYZ_9_7UM%M4r}gIQ*NDkWV=%j^s#H!G%hxd0N}^0et#sG%US@*JN9Hz1UD+-|&{Z zD6u}v%F51H3fBYaZSuJh@m~oRJ)@M`SXx^8zsEBmPe~|Qi!`QAoqCpSC+BLNj)sXL z_&ip;>>eXBodidFyAK@i+u)Q*Mi&{i8N#fpbELparGUI zM!!jfC*>uj=wHI&$Snnf($y6`Kar4{lXN8O%|M{+v!`NMG8T(T)Gg*fvBKdgtZufe9bArL({&9WAA~cT0qN@PZIos#%NF=hdqoe&YtutGnh+a0$j59m( z$vN`ozSz~(H9e6S-V8vphkKZDLqkKu)*`HPTtiq^?0IIE@B)a`wWeu4D^*a;`qvpJ zmEw^|q%kj0oE-CynIXB8K}o!uX5*T1&A7mgGw#HZeU96p1A(%t+S*!iBk2D7+dct! z&KMj_{BiN(#iLeOjayQrzOAC7>|SOpl0lTBcyDk2qOlyb0&_T~`(sZYydH@(h^L+N zGj1r-b1W8H0I*aZNM!%lwyozkH8q_Q8N|#*h%z~KB()(YPh&V7iMmAO|5>wU`D$uv zB%wFzEs+y~(%HFkMk-~z$jp*SOcL<|(`?+7^QS0aL(8%*V7C7QpmU@`+c5a=g29G2 zWynkgLfKkC$};eSNF*Y<@#Gb)+k<6UQD!aG3G%$;_4>Xt(dks#+U4ctivj*25gE+b zlt?6Qb#+HaN5^Niw$r{95uP{AhHLT-3R=2_y5d{Z$u*b@p4ZDqGiQ4FtbGML@jI$ z1X9=3*4{0rPWmYdl(x3Evkb!{{)MDC#2#2zQc`kPzKe;+0wke_!-o&oFzfD2TQL

9*?>&6f*A_39~4Y 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 Ef=$&z5C8xG literal 0 HcmV?d00001 diff --git a/products/expert/src/main/resources/base/profile/main_pages.json b/products/expert/src/main/resources/base/profile/main_pages.json index 0bc446b..c3e1b4b 100644 --- a/products/expert/src/main/resources/base/profile/main_pages.json +++ b/products/expert/src/main/resources/base/profile/main_pages.json @@ -46,6 +46,9 @@ "pages/VideoPage/PLVMediaPlayerOnlyVideoPage", "pages/Netease/OutpatientPage", "pages/PatientsPage/GroupSendMessagePage", - "pages/VideoPage/CustomScanResultPage" + "pages/VideoPage/CustomScanResultPage", + "pages/VideoPage/EducationVideoPage", + "pages/Courseware/CoursewarePage", + "pages/WebView/EducationDetailsWebPage" ] } \ No newline at end of file diff --git a/scene_single_video/hmrouter-consumer-rules.txt b/scene_single_video/hmrouter-consumer-rules.txt new file mode 100644 index 0000000..8f76f14 --- /dev/null +++ b/scene_single_video/hmrouter-consumer-rules.txt @@ -0,0 +1,3 @@ +-keep-file-name +-keep-property-name +-keep-global-name \ No newline at end of file diff --git a/scene_single_video/hmrouter-obfuscation-rules.txt b/scene_single_video/hmrouter-obfuscation-rules.txt new file mode 100644 index 0000000..8f76f14 --- /dev/null +++ b/scene_single_video/hmrouter-obfuscation-rules.txt @@ -0,0 +1,3 @@ +-keep-file-name +-keep-property-name +-keep-global-name \ No newline at end of file