init
							
								
								
									
										11
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,11 @@ | |||||||
|  | /node_modules | ||||||
|  | /oh_modules | ||||||
|  | /local.properties | ||||||
|  | /.idea | ||||||
|  | **/build | ||||||
|  | /.hvigor | ||||||
|  | .cxx | ||||||
|  | /.clangd | ||||||
|  | /.clang-format | ||||||
|  | /.clang-tidy | ||||||
|  | **/.test | ||||||
							
								
								
									
										10
									
								
								AppScope/app.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,10 @@ | |||||||
|  | { | ||||||
|  |   "app": { | ||||||
|  |     "bundleName": "com.duolun.carcheck", | ||||||
|  |     "vendor": "example", | ||||||
|  |     "versionCode": 1000000, | ||||||
|  |     "versionName": "1.0.0", | ||||||
|  |     "icon": "$media:app_icon", | ||||||
|  |     "label": "$string:app_name" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								AppScope/resources/base/element/string.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  |   "string": [ | ||||||
|  |     { | ||||||
|  |       "name": "app_name", | ||||||
|  |       "value": "CarCheck" | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								AppScope/resources/base/media/app_icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										49
									
								
								build-profile.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,49 @@ | |||||||
|  | { | ||||||
|  |   "app": { | ||||||
|  |     "signingConfigs": [ | ||||||
|  |       { | ||||||
|  |         "name": "default", | ||||||
|  |         "material": { | ||||||
|  |           "certpath": "C:/Users/93218/.ohos/config/openharmony/default_CarCheck_6ws2ImxKBjIWjhrUlW-0T3ac5TPJiURAdOxen_4yKNg=.cer", | ||||||
|  |           "storePassword": "0000001BF3EF3EB0C6F978CCFB0D2A5C055C5EB1D78AC653B437E08F8A4467F8EA9965F9421065DE6B3C97", | ||||||
|  |           "keyAlias": "debugKey", | ||||||
|  |           "keyPassword": "0000001B2F0B6BBEED96B88A79ECCFCD15E9E9679B30B19FA73F5DC1FDA1B997385C0B00083BF75AF6C707", | ||||||
|  |           "profile": "C:/Users/93218/.ohos/config/openharmony/default_CarCheck_6ws2ImxKBjIWjhrUlW-0T3ac5TPJiURAdOxen_4yKNg=.p7b", | ||||||
|  |           "signAlg": "SHA256withECDSA", | ||||||
|  |           "storeFile": "C:/Users/93218/.ohos/config/openharmony/default_CarCheck_6ws2ImxKBjIWjhrUlW-0T3ac5TPJiURAdOxen_4yKNg=.p12" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     ], | ||||||
|  |     "products": [ | ||||||
|  |       { | ||||||
|  |         "name": "default", | ||||||
|  |         "signingConfig": "default", | ||||||
|  |         "compatibleSdkVersion": 10, | ||||||
|  |         "compileSdkVersion": 10, | ||||||
|  |         "runtimeOS": "OpenHarmony" | ||||||
|  |       } | ||||||
|  |     ], | ||||||
|  |     "buildModeSet": [ | ||||||
|  |       { | ||||||
|  |         "name": "debug", | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "release" | ||||||
|  |       } | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   "modules": [ | ||||||
|  |     { | ||||||
|  |       "name": "entry", | ||||||
|  |       "srcPath": "./entry", | ||||||
|  |       "targets": [ | ||||||
|  |         { | ||||||
|  |           "name": "default", | ||||||
|  |           "applyToProducts": [ | ||||||
|  |             "default" | ||||||
|  |           ] | ||||||
|  |         } | ||||||
|  |       ] | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								entry/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,6 @@ | |||||||
|  | /node_modules | ||||||
|  | /oh_modules | ||||||
|  | /.preview | ||||||
|  | /build | ||||||
|  | /.cxx | ||||||
|  | /.test | ||||||
							
								
								
									
										13
									
								
								entry/build-profile.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |   "apiType": "stageMode", | ||||||
|  |   "buildOption": { | ||||||
|  |   }, | ||||||
|  |   "targets": [ | ||||||
|  |     { | ||||||
|  |       "name": "default", | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "ohosTest", | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								entry/hvigorfile.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,6 @@ | |||||||
|  | import { hapTasks } from '@ohos/hvigor-ohos-plugin'; | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |     system: hapTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */ | ||||||
|  |     plugins:[]         /* Custom plugin to extend the functionality of Hvigor. */ | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								entry/oh-package.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,10 @@ | |||||||
|  | { | ||||||
|  |   "name": "entry", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "description": "Please describe the basic information.", | ||||||
|  |   "main": "", | ||||||
|  |   "author": "", | ||||||
|  |   "license": "", | ||||||
|  |   "dependencies": {} | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										78
									
								
								entry/src/main/ets/components/Button.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,78 @@ | |||||||
|  | export enum CusButtonType { | ||||||
|  |   Info, | ||||||
|  |   Primary, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export enum CusButtonSize { | ||||||
|  |   Small, | ||||||
|  |   Normal, | ||||||
|  |   Large | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ButtonSize: Record<number, Array<number>> = { | ||||||
|  |   0: [8, 54], | ||||||
|  |   1: [12, 54], | ||||||
|  |   2: [16, 54], | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @Extend(Button) | ||||||
|  | function button(size: CusButtonSize, block: boolean) { | ||||||
|  |   .padding(block ? { | ||||||
|  |     top: ButtonSize[size][0], | ||||||
|  |     bottom: ButtonSize[size][0] | ||||||
|  |   } : { | ||||||
|  |     left: ButtonSize[size][1], | ||||||
|  |     right: ButtonSize[size][1], | ||||||
|  |     top: ButtonSize[size][0], | ||||||
|  |     bottom: ButtonSize[size][0] | ||||||
|  |   }).fontSize(18).type(ButtonType.Normal) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @Extend(Button) | ||||||
|  | function info(size: CusButtonSize, block: boolean) { | ||||||
|  |   .backgroundColor(0xffffff) | ||||||
|  |   .fontColor(0x0D419D) | ||||||
|  |   .border({ | ||||||
|  |     width: 1, | ||||||
|  |     color: 0x0D419D, | ||||||
|  |     radius: 6 | ||||||
|  |   }) | ||||||
|  |   .button(size, block) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @Extend(Button) | ||||||
|  | function primary(size: CusButtonSize, block: boolean) { | ||||||
|  |   .backgroundColor(0x0D419D) | ||||||
|  |   .fontColor(0xffffff) | ||||||
|  |   .border({ | ||||||
|  |     width: 1, | ||||||
|  |     color: 0x0D419D, | ||||||
|  |     radius: 6 | ||||||
|  |   }) | ||||||
|  |   .button(size, block) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @Component | ||||||
|  | export default struct CusButton { | ||||||
|  |   label: string = "" | ||||||
|  |   buttonType: CusButtonType = CusButtonType.Info | ||||||
|  |   buttonSize: CusButtonSize = CusButtonSize.Normal | ||||||
|  |   block: boolean = false | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     if (this.block) { | ||||||
|  |       if (this.buttonType === CusButtonType.Info) { | ||||||
|  |         Button(this.label).info(this.buttonSize, this.block).width("100%") | ||||||
|  |       } else { | ||||||
|  |         Button(this.label).primary(this.buttonSize, this.block).width("100%") | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       if (this.buttonType === CusButtonType.Info) { | ||||||
|  |         Button(this.label).info(this.buttonSize, this.block) | ||||||
|  |       } else { | ||||||
|  |         Button(this.label).primary(this.buttonSize, this.block) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										55
									
								
								entry/src/main/ets/components/Dialog.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,55 @@ | |||||||
|  | import CusButton, { CusButtonType } from './Button' | ||||||
|  | 
 | ||||||
|  | interface Button { | ||||||
|  |   label: string | ||||||
|  |   type: CusButtonType | ||||||
|  |   click: () => void | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @CustomDialog | ||||||
|  | export default struct Exiting { | ||||||
|  |   private controller: CustomDialogController | ||||||
|  |   button: Button[] = [] | ||||||
|  |   message: string[] = [] | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     Column() { | ||||||
|  |       Row() { | ||||||
|  |         Text("提示").fontSize(28).fontColor(0xffffff) | ||||||
|  |         Blank() | ||||||
|  |         Image($rawfile("img/close.png")).width(18) | ||||||
|  |       } | ||||||
|  |       .width("100%") | ||||||
|  |       .linearGradient({ | ||||||
|  |         angle: 90, | ||||||
|  |         direction: GradientDirection.Right, | ||||||
|  |         colors: [[0x2876D6, 0.0], [0x2876D6, 1.0]] | ||||||
|  |       }) | ||||||
|  |       .padding({ left: 24, right: 24, top: 18, bottom: 18 }) | ||||||
|  |       .width("100%") | ||||||
|  |       .borderRadius({ topLeft: 6, topRight: 6 }) | ||||||
|  | 
 | ||||||
|  |       Column() { | ||||||
|  |         Image($rawfile('img/warning.png')).width(64).margin({ bottom: 40 }) | ||||||
|  |         ForEach(this.message, (item: string, index: number) => { | ||||||
|  |           Text(item).fontSize(18).fontColor(0x3F4042).margin({ bottom: index < this.message.length - 1 ? 8 : 40 }) | ||||||
|  |         }) | ||||||
|  |         Row() { | ||||||
|  |           ForEach(this.button, (item: Button, index: number) => { | ||||||
|  |             CusButton({ | ||||||
|  |               label: item.label, | ||||||
|  |               buttonType: item.type | ||||||
|  |             }) | ||||||
|  |               .margin({ right: index < this.button.length - 1 ? 8 : 0, left: index > 0 ? 8 : 0 }) | ||||||
|  |               .onClick(() => { | ||||||
|  |                 item.click() | ||||||
|  |               }) | ||||||
|  |           }) | ||||||
|  |         }.width("100%").justifyContent(FlexAlign.Center) | ||||||
|  |       }.padding({ top: 42, bottom: 42, left: 120, right: 120 }).alignItems(HorizontalAlign.Center).width("100%") | ||||||
|  |     } | ||||||
|  |     .backgroundColor(0xffffff) | ||||||
|  |     .borderRadius(6).width("50%") | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								entry/src/main/ets/components/Footer.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,13 @@ | |||||||
|  | @Component | ||||||
|  | export default struct Footer { | ||||||
|  |   build() { | ||||||
|  |     Row() { | ||||||
|  |       Text("版权所有:多伦科技股份有限公司").fontSize(14).letterSpacing(1).fontColor(0xffffff) | ||||||
|  |     } | ||||||
|  |     .width("100%") | ||||||
|  |     .height(52) | ||||||
|  |     .backgroundColor(0x0D419D) | ||||||
|  |     .alignItems(VerticalAlign.Center) | ||||||
|  |     .justifyContent(FlexAlign.Center) | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										84
									
								
								entry/src/main/ets/components/Header.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,84 @@ | |||||||
|  | import window from '@ohos.window' | ||||||
|  | import Exiting from './Dialog' | ||||||
|  | import router from '@ohos.router' | ||||||
|  | import { CusButtonType } from './Button' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @Component | ||||||
|  | export default struct Header { | ||||||
|  |   @State BarHeight: number = 0 | ||||||
|  |   @StorageProp("line") line: string = "1" | ||||||
|  |   private controller: CustomDialogController = new CustomDialogController({ | ||||||
|  |     builder: Exiting({ | ||||||
|  |       button: [ | ||||||
|  |         { | ||||||
|  |           label: "确认", | ||||||
|  |           type: CusButtonType.Primary, | ||||||
|  |           click: () => { | ||||||
|  |             this.controller.close() | ||||||
|  |             router.back({ | ||||||
|  |               url: "pages/Home" | ||||||
|  |             }) | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           label: "取消", | ||||||
|  |           type: CusButtonType.Info, | ||||||
|  |           click: () => { | ||||||
|  |             this.controller.close() | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       ], | ||||||
|  |       message: [ | ||||||
|  |         "您是否确认退出本次查验?", | ||||||
|  |         "点击确定则退出本次查验,请将车辆使出查验区" | ||||||
|  |       ] | ||||||
|  |     }), | ||||||
|  |     customStyle: true, | ||||||
|  |   }) | ||||||
|  |   showFun: boolean = true | ||||||
|  | 
 | ||||||
|  |   async aboutToAppear(): Promise<void> { | ||||||
|  |     let win = await window.getLastWindow(getContext(this)) | ||||||
|  |     this.BarHeight = px2vp(win.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM).topRect.height) | ||||||
|  |     win.setWindowSystemBarProperties({ | ||||||
|  |       statusBarColor: "#0D419D", | ||||||
|  |       statusBarContentColor: "#ffffff" | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     Column() { | ||||||
|  |       Row() { | ||||||
|  |       }.width("100%").height(this.BarHeight) | ||||||
|  | 
 | ||||||
|  |       if (this.showFun) { | ||||||
|  |         Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { | ||||||
|  |           Image($rawfile('img/logo_en.png')).height(36) | ||||||
|  |           Text("小车智能查验装备").fontSize(24).fontColor(0xffffff) | ||||||
|  |           Row() { | ||||||
|  |             Text(this.line + "号线") | ||||||
|  |               .fontColor(0xffffff) | ||||||
|  |               .padding({ top: 12, bottom: 12, left: 24, right: 24 }) | ||||||
|  |               .margin({ right: 12 }) | ||||||
|  |               .linearGradient({ | ||||||
|  |                 angle: 90, | ||||||
|  |                 direction: GradientDirection.Right, | ||||||
|  |                 colors: [[0X5596FF, 0.0], [0X5FCBFF, 1.0]] | ||||||
|  |               }) | ||||||
|  |               .borderRadius(6) | ||||||
|  | 
 | ||||||
|  |             Button({ type: ButtonType.Normal }) { | ||||||
|  |               Row() { | ||||||
|  |                 Image($rawfile('img/exit.png')).margin({ right: 6 }).height(16) | ||||||
|  |                 Text("退出").margin({ left: 6 }).fontSize(16).fontColor(0x8A8C8F) | ||||||
|  |               }.alignItems(VerticalAlign.Center) | ||||||
|  |             }.backgroundColor(0xffffff).borderRadius(6).padding(12).onClick(() => { | ||||||
|  |               this.controller.open() | ||||||
|  |             }) | ||||||
|  |           } | ||||||
|  |         }.padding({ left: 30, right: 30, top: 16, bottom: 16 }) | ||||||
|  |       } | ||||||
|  |     }.width("100%").backgroundColor(0x0D419D) | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										48
									
								
								entry/src/main/ets/entryability/EntryAbility.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,48 @@ | |||||||
|  | import AbilityConstant from '@ohos.app.ability.AbilityConstant'; | ||||||
|  | import hilog from '@ohos.hilog'; | ||||||
|  | import UIAbility from '@ohos.app.ability.UIAbility'; | ||||||
|  | import Want from '@ohos.app.ability.Want'; | ||||||
|  | import window from '@ohos.window'; | ||||||
|  | import { requestPermission } from '../utils/system'; | ||||||
|  | 
 | ||||||
|  | export default class EntryAbility extends UIAbility { | ||||||
|  |   onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onDestroy(): void { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async onWindowStageCreate(windowStage: window.WindowStage): Promise<void> { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); | ||||||
|  |     let window = await windowStage.getMainWindow() | ||||||
|  |     window.setWindowSystemBarEnable(["status"]) | ||||||
|  |     window.setWindowLayoutFullScreen(true) | ||||||
|  |     requestPermission(this.context, ['ohos.permission.CAMERA', 'ohos.permission.FILE_ACCESS_MANAGER']) | ||||||
|  |       .then(() => { | ||||||
|  |         windowStage.loadContent('pages/Login', (err) => { | ||||||
|  |           if (err.code) { | ||||||
|  |             hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); | ||||||
|  |             return; | ||||||
|  |           } | ||||||
|  |           hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); | ||||||
|  |         }); | ||||||
|  |       }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onWindowStageDestroy(): void { | ||||||
|  |     // Main window is destroyed, release UI related resources | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onForeground(): void { | ||||||
|  |     // Ability has brought to foreground | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onBackground(): void { | ||||||
|  |     // Ability has back to background | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										84
									
								
								entry/src/main/ets/pages/Home.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,84 @@ | |||||||
|  | import window from '@ohos.window' | ||||||
|  | import Footer from '../components/Footer' | ||||||
|  | import router from '@ohos.router' | ||||||
|  | import Header from '../components/Header' | ||||||
|  | import CusButton, { CusButtonSize, CusButtonType } from '../components/Button' | ||||||
|  | 
 | ||||||
|  | @Entry | ||||||
|  | @Component | ||||||
|  | struct Home { | ||||||
|  |   aboutToAppear(): void { | ||||||
|  |     window.getLastWindow(getContext(this)).then(win => { | ||||||
|  |       win.setWindowSystemBarProperties({ | ||||||
|  |         statusBarColor: "#0D419D", | ||||||
|  |         statusBarContentColor: "#ffffff" | ||||||
|  |       }) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     Column() { | ||||||
|  |       Header({ | ||||||
|  |         showFun: false | ||||||
|  |       }) | ||||||
|  |       Column() { | ||||||
|  |         Image($rawfile('img/logo_cn.png')) | ||||||
|  |           .backgroundImageSize(ImageSize.Contain) | ||||||
|  |           .height(32) | ||||||
|  |           .margin({ bottom: "12%" }) | ||||||
|  |         Text("小车智能查验设备") | ||||||
|  |           .focusable(true) | ||||||
|  |           .defaultFocus(true) | ||||||
|  |           .margin({ bottom: 12 }) | ||||||
|  |           .fontSize(36) | ||||||
|  |           .fontWeight(700) | ||||||
|  |         Text("版本:1.0.0").margin({ bottom: "15%" }) | ||||||
|  | 
 | ||||||
|  |         Text("1号查验线机器人") | ||||||
|  |           .fontSize(24) | ||||||
|  |           .fontColor(0xffffff) | ||||||
|  |           .padding({ top: 30, bottom: 30 }) | ||||||
|  |           .borderRadius(6) | ||||||
|  |           .linearGradient({ | ||||||
|  |             angle: 90, | ||||||
|  |             direction: GradientDirection.Right, | ||||||
|  |             colors: [[0X5596FF, 0.0], [0X5FCBFF, 1.0]] | ||||||
|  |           }) | ||||||
|  |           .textAlign(TextAlign.Center) | ||||||
|  |           .width("100%") | ||||||
|  |           .margin({ bottom: "10%" }) | ||||||
|  | 
 | ||||||
|  |         Row() { | ||||||
|  |           CusButton({ | ||||||
|  |             label: "登出", | ||||||
|  |             buttonSize: CusButtonSize.Large, | ||||||
|  |             block: true | ||||||
|  |           }).layoutWeight(1).margin({ right: 12 }).onClick(() => { | ||||||
|  |             router.back({ | ||||||
|  |               url: "pages/Login" | ||||||
|  |             }) | ||||||
|  |           }) | ||||||
|  | 
 | ||||||
|  |           CusButton({ | ||||||
|  |             label: "确认", | ||||||
|  |             buttonType: CusButtonType.Primary, | ||||||
|  |             block: true, | ||||||
|  |             buttonSize: CusButtonSize.Large | ||||||
|  |           }).layoutWeight(1).margin({ left: 12 }).onClick(() => { | ||||||
|  |             // router.pushUrl({ | ||||||
|  |             //   url: "pages/ProjectCheck" | ||||||
|  |             // }, router.RouterMode.Single) | ||||||
|  |             // router.pushUrl({ | ||||||
|  |             //   url: "pages/Scan" | ||||||
|  |             // }, router.RouterMode.Single) | ||||||
|  |             router.pushUrl({ | ||||||
|  |               url: "pages/Sign" | ||||||
|  |             }, router.RouterMode.Single) | ||||||
|  |           }) | ||||||
|  |         }.width("100%") | ||||||
|  |       }.layoutWeight(1).padding({ left: "36%", right: "36%", top: "10%" }) | ||||||
|  | 
 | ||||||
|  |       Footer() | ||||||
|  |     }.width('100%').height('100%').backgroundColor(0xe7f3ff) | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										194
									
								
								entry/src/main/ets/pages/Login.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,194 @@ | |||||||
|  | import window from '@ohos.window' | ||||||
|  | import router from '@ohos.router' | ||||||
|  | 
 | ||||||
|  | @Component | ||||||
|  | struct InputComponent { | ||||||
|  |   @Link value: string | ||||||
|  |   @State focus: boolean = false | ||||||
|  |   placeholder: string = '' | ||||||
|  |   label: string = '' | ||||||
|  |   type: InputType = InputType.Normal | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     Column() { | ||||||
|  |       Text(this.label).fontColor(0x3F4042).fontSize(16).margin({ bottom: 8 }) | ||||||
|  |       TextInput({ | ||||||
|  |         text: $$this.value, | ||||||
|  |         placeholder: this.placeholder | ||||||
|  |       }) | ||||||
|  |         .fontSize(20) | ||||||
|  |         .padding(12) | ||||||
|  |         .defaultFocus(false) | ||||||
|  |         .backgroundColor(0xffffff) | ||||||
|  |         .focusable(true) | ||||||
|  |         .onFocus(() => { | ||||||
|  |           this.focus = true | ||||||
|  |         }) | ||||||
|  |         .onBlur(() => { | ||||||
|  |           this.focus = false | ||||||
|  |         }) | ||||||
|  |         .type(this.type) | ||||||
|  |         .border({ | ||||||
|  |           width: 1, | ||||||
|  |           color: this.focus ? 0xB4CFFA : 0xE2E3E2, | ||||||
|  |           style: BorderStyle.Solid, | ||||||
|  |           radius: 6 | ||||||
|  |         }) | ||||||
|  |         .placeholderColor(0xD8D8D8) | ||||||
|  | 
 | ||||||
|  |     }.alignItems(HorizontalAlign.Start) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @Component | ||||||
|  | struct SelectComponent { | ||||||
|  |   @Link value: number | ||||||
|  |   @State focus: boolean = false | ||||||
|  |   @Prop options: SelectOption[] = [] | ||||||
|  |   @State selected: number = -1 | ||||||
|  |   placeholder: string = '' | ||||||
|  |   label: string = '' | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     Column() { | ||||||
|  |       Text(this.label).fontColor(0x3F4042).fontSize(16).margin({ bottom: 8 }) | ||||||
|  |       Select(this.options) | ||||||
|  |         .font({ | ||||||
|  |           size: 16 | ||||||
|  |         }) | ||||||
|  |         .backgroundColor(0xffffff) | ||||||
|  |         .value($$this.value) | ||||||
|  |         .selected(this.selected) | ||||||
|  |         .padding(12) | ||||||
|  |         .defaultFocus(false) | ||||||
|  |         .focusable(true) | ||||||
|  |         .onFocus(() => { | ||||||
|  |           this.focus = true | ||||||
|  |         }) | ||||||
|  |         .onBlur(() => { | ||||||
|  |           this.focus = false | ||||||
|  |         }) | ||||||
|  |         .border({ | ||||||
|  |           width: 1, | ||||||
|  |           color: this.focus ? 0xB4CFFA : 0xE2E3E2, | ||||||
|  |           style: BorderStyle.Solid, | ||||||
|  |           radius: 6 | ||||||
|  |         }) | ||||||
|  |         .width("100%") | ||||||
|  |         .height(44) | ||||||
|  |     }.alignItems(HorizontalAlign.Start) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @Entry | ||||||
|  | @Component | ||||||
|  | struct Index { | ||||||
|  |   @State account: string = '' | ||||||
|  |   @State password: string = '' | ||||||
|  |   @State line: number = -1 | ||||||
|  |   @State options: SelectOption[] = [ | ||||||
|  |     { value: "1号线" }, | ||||||
|  |     { value: "2号线" }, | ||||||
|  |     { value: "3号线" } | ||||||
|  |   ] | ||||||
|  | 
 | ||||||
|  |   aboutToAppear(): void { | ||||||
|  |     window.getLastWindow(getContext(this)).then(win => { | ||||||
|  |       win.setWindowSystemBarProperties({ | ||||||
|  |         statusBarColor: "transparent", | ||||||
|  |         statusBarContentColor: "#000000" | ||||||
|  |       }) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   login() { | ||||||
|  |     router.pushUrl({ | ||||||
|  |       url: "pages/Home" | ||||||
|  |     }, router.RouterMode.Single) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     Row() { | ||||||
|  |       Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { | ||||||
|  | 
 | ||||||
|  |         Column() { | ||||||
|  |           Image($rawfile('img/logo_cn.png')) | ||||||
|  |             .backgroundImageSize(ImageSize.Contain) | ||||||
|  |             .height(32) | ||||||
|  |             .margin({ bottom: "10%" }) | ||||||
|  |           Text("小车智能查验设备") | ||||||
|  |             .focusable(true) | ||||||
|  |             .defaultFocus(true) | ||||||
|  |             .margin({ bottom: 12 }) | ||||||
|  |             .fontSize(36) | ||||||
|  |             .fontWeight(700) | ||||||
|  |           Text("版本:1.0.0").margin({ bottom: "10%" }) | ||||||
|  | 
 | ||||||
|  |           Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceBetween }) { | ||||||
|  |             InputComponent({ | ||||||
|  |               label: '请输入机器人账号', | ||||||
|  |               value: this.account | ||||||
|  |             }) | ||||||
|  |             InputComponent({ | ||||||
|  |               label: '请输入登录密码', | ||||||
|  |               value: this.password, | ||||||
|  |               type: InputType.Password | ||||||
|  |             }) | ||||||
|  |             SelectComponent({ | ||||||
|  |               label: "请选择检测路线", | ||||||
|  |               value: this.line, | ||||||
|  |               options: this.options | ||||||
|  |             }) | ||||||
|  | 
 | ||||||
|  |             Button("登录") | ||||||
|  |               .fontSize(20) | ||||||
|  |               .padding(12) | ||||||
|  |               .backgroundColor(0x0D419D) | ||||||
|  |               .fontColor(0xffffff) | ||||||
|  |               .type(ButtonType.Normal) | ||||||
|  |               .border({ | ||||||
|  |                 width: 1, | ||||||
|  |                 color: 0x0D419D, | ||||||
|  |                 style: BorderStyle.Solid, | ||||||
|  |                 radius: 6 | ||||||
|  |               }) | ||||||
|  |               .margin({ top: 12 }) | ||||||
|  |               .width("100%") | ||||||
|  |               .onClick(() => { | ||||||
|  |                 this.login() | ||||||
|  |               }) | ||||||
|  |           }.layoutWeight(1) | ||||||
|  |         } | ||||||
|  |         .padding(40) | ||||||
|  |         .alignItems(HorizontalAlign.Center) | ||||||
|  |         .height('100%') | ||||||
|  |         .width("100%") | ||||||
|  |         .backgroundColor('rgba(255,255,255,0.5)') | ||||||
|  |         .backgroundBlurStyle(BlurStyle.Regular) | ||||||
|  |         .borderRadius(18) | ||||||
|  |         .border({ | ||||||
|  |           width: 2, | ||||||
|  |           color: 0xffffff, | ||||||
|  |           style: BorderStyle.Solid | ||||||
|  |         }) | ||||||
|  | 
 | ||||||
|  |         Text("版权所有:多伦科技股份有限公司") | ||||||
|  |           .fontSize(14) | ||||||
|  |           .padding({ top: 2, bottom: 2 }) | ||||||
|  |           .margin({ top: "15%", bottom: "10%" }) | ||||||
|  |       } | ||||||
|  |       .margin({ right: '12%' }) | ||||||
|  |       .padding({ | ||||||
|  |         top: "12%" | ||||||
|  |       }) | ||||||
|  |       .height('100%') | ||||||
|  |       .width("30%") | ||||||
|  |     } | ||||||
|  |     .width('100%') | ||||||
|  |     .height('100%') | ||||||
|  |     .backgroundImage($rawfile('img/login/background.png')) | ||||||
|  |     .backgroundImageSize(ImageSize.Cover) | ||||||
|  |     .justifyContent(FlexAlign.End) | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								entry/src/main/ets/pages/ProjectCheck.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,25 @@ | |||||||
|  | import Footer from '../components/Footer' | ||||||
|  | import window from '@ohos.window' | ||||||
|  | import Header from '../components/Header' | ||||||
|  | 
 | ||||||
|  | @Entry | ||||||
|  | @Component | ||||||
|  | struct ProjectCheck { | ||||||
|  |   aboutToAppear(): void { | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     Column() { | ||||||
|  |       Header() | ||||||
|  |       Row() { | ||||||
|  |         Image($rawfile('img/check/scan.png')).layoutWeight(1).margin({ right: 32 }).height("100%") | ||||||
|  |         Column() { | ||||||
|  | 
 | ||||||
|  |         }.width("33%") | ||||||
|  |       }.layoutWeight(1).width("100%").padding({ left: 32, top: 40, right: 32, bottom: 40 }).backgroundColor(0xd7ebfd) | ||||||
|  | 
 | ||||||
|  |       Footer() | ||||||
|  |     }.width('100%').height('100%') | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										56
									
								
								entry/src/main/ets/pages/Scan.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,56 @@ | |||||||
|  | import { CameraUtils } from '../utils/cameraUtils'; | ||||||
|  | import Header from '../components/Header'; | ||||||
|  | import Footer from '../components/Footer'; | ||||||
|  | import common from '@ohos.app.ability.common'; | ||||||
|  | 
 | ||||||
|  | @Entry | ||||||
|  | @Component | ||||||
|  | struct Scan { | ||||||
|  |   @State showVideo: boolean = false | ||||||
|  |   private xComponentController: XComponentController = new XComponentController() | ||||||
|  |   private cameraUtils: CameraUtils = new CameraUtils(getContext(this) as common.UIAbilityContext) | ||||||
|  |   private surfaceId: string = "" | ||||||
|  | 
 | ||||||
|  |   aboutToAppear(): void { | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   aboutToDisappear(): void { | ||||||
|  |     this.cameraUtils.destroy() | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     Column() { | ||||||
|  |       Header() | ||||||
|  |       Row() { | ||||||
|  |         Row() { | ||||||
|  |           if (this.showVideo) { | ||||||
|  |             XComponent({ | ||||||
|  |               id: "cameraPreview", | ||||||
|  |               type: XComponentType.SURFACE, | ||||||
|  |               controller: this.xComponentController | ||||||
|  |             }).onLoad(() => { | ||||||
|  |               this.surfaceId = this.xComponentController.getXComponentSurfaceId() | ||||||
|  |               this.cameraUtils.init(this.surfaceId).then(() => { | ||||||
|  |                 this.cameraUtils.startPreview() | ||||||
|  |               }) | ||||||
|  |             }).width("100%").height("100%").renderFit(RenderFit.RESIZE_CONTAIN) | ||||||
|  |           } else { | ||||||
|  |             Image($rawfile('img/check/scan.png')).width("100%").height("100%") | ||||||
|  |           } | ||||||
|  |         }.layoutWeight(1).margin({ right: 32 }) | ||||||
|  | 
 | ||||||
|  |         Column() { | ||||||
|  |           Text("请扫描受理凭证").fontSize(36).fontColor(0x161B21).fontWeight(700).margin({ bottom: 64 }) | ||||||
|  |           Text("识别结果").fontSize(24).fontColor(0x161B21).fontWeight(700).margin({ bottom: 30 }) | ||||||
|  |           RowSplit() { | ||||||
|  |             Text("流水号").width("16%").fontWeight(700).fontSize(18).fontColor(0x161B21) | ||||||
|  |             Text("1293982729381").layoutWeight(1).fontSize(18).fontColor(0x102A9A).padding({ left: 20 }) | ||||||
|  |           }.resizeable(false).borderColor(0xAEC4E8) | ||||||
|  |         }.width("33%").height("100%").alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.Start) | ||||||
|  |       }.layoutWeight(1).width("100%").padding({ left: 32, top: 54, right: 32, bottom: 54 }).backgroundColor(0xd7ebfd) | ||||||
|  | 
 | ||||||
|  |       Footer() | ||||||
|  |     }.width('100%').height('100%') | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										95
									
								
								entry/src/main/ets/pages/Sign.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,95 @@ | |||||||
|  | import CusButton, { CusButtonType } from '../components/Button' | ||||||
|  | import Footer from '../components/Footer' | ||||||
|  | import Header from '../components/Header' | ||||||
|  | 
 | ||||||
|  | @Entry | ||||||
|  | @Component | ||||||
|  | struct Sign { | ||||||
|  |   @State base64: string = "" | ||||||
|  |   private isReady: boolean = false | ||||||
|  |   private context: CanvasRenderingContext2D = new CanvasRenderingContext2D() | ||||||
|  |   private isStart: boolean = false | ||||||
|  | 
 | ||||||
|  |   onStart(event: TouchEvent) { | ||||||
|  |     if (!this.isReady) { | ||||||
|  |       return | ||||||
|  |     } | ||||||
|  |     this.isStart = true | ||||||
|  |     this.context.beginPath() | ||||||
|  |     this.context.moveTo(event.touches[0].x, event.touches[0].y) | ||||||
|  |     this.context.strokeStyle = "#000000" | ||||||
|  |     this.context.lineWidth = 5 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onMove(event: TouchEvent) { | ||||||
|  |     if (!this.isReady || !this.isStart) { | ||||||
|  |       return | ||||||
|  |     } | ||||||
|  |     this.context.lineTo(event.touches[0].x, event.touches[0].y) | ||||||
|  |     this.context.stroke() | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onStop(event: TouchEvent) { | ||||||
|  |     if (!this.isReady || !this.isStart) { | ||||||
|  |       return | ||||||
|  |     } | ||||||
|  |     this.context.closePath() | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   clear() { | ||||||
|  |     this.base64 = "" | ||||||
|  |     this.context.clearRect(0, 0, this.context.width, this.context.height) | ||||||
|  |     this.context.fillStyle = "#ffffff" | ||||||
|  |     this.context.fillRect(0, 0, this.context.width, this.context.height) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   submit() { | ||||||
|  |     this.base64 = this.context.toDataURL("image/jpeg", 0.92) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     Column() { | ||||||
|  |       Header() | ||||||
|  |       Column() { | ||||||
|  |         Text("车主签名").fontSize(32).fontColor(0x161B21).fontWeight(700).margin({ top: 36, bottom: 36 }) | ||||||
|  |         Canvas(this.context) | ||||||
|  |           .backgroundColor(0xffffff) | ||||||
|  |           .layoutWeight(1) | ||||||
|  |           .width("100%") | ||||||
|  |           .onReady(() => { | ||||||
|  |             this.isReady = true | ||||||
|  |             this.context.fillStyle = "#ffffff" | ||||||
|  |             this.context.fillRect(0, 0, this.context.width, this.context.height) | ||||||
|  |           }) | ||||||
|  |           .onTouch(event => { | ||||||
|  |             switch (event.type) { | ||||||
|  |               case TouchType.Down: | ||||||
|  |                 this.onStart(event) | ||||||
|  |                 break | ||||||
|  |               case TouchType.Up: | ||||||
|  |                 this.onStop(event) | ||||||
|  |                 break | ||||||
|  |               case TouchType.Move: | ||||||
|  |                 this.onMove(event) | ||||||
|  |                 break | ||||||
|  |               case TouchType.Cancel: | ||||||
|  |                 this.onStop(event) | ||||||
|  |                 break | ||||||
|  |               default: | ||||||
|  |                 return | ||||||
|  |             } | ||||||
|  |           }) | ||||||
|  |         Row() { | ||||||
|  |           CusButton({ label: "确认", buttonType: CusButtonType.Primary }).margin({ right: 12 }).onClick(() => { | ||||||
|  |             this.submit() | ||||||
|  |           }) | ||||||
|  |           CusButton({ label: "重签" }).margin({ left: 12 }).onClick(() => { | ||||||
|  |             this.clear() | ||||||
|  |           }) | ||||||
|  |         }.margin({ top: 36, bottom: 36 }).width("100%").justifyContent(FlexAlign.Center) | ||||||
|  |       }.layoutWeight(1).alignItems(HorizontalAlign.Start).padding({ left: 180, right: 180 }) | ||||||
|  | 
 | ||||||
|  |       Footer() | ||||||
|  |     }.width("100%").height("100%").backgroundColor(0xe6f2ff) | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								entry/src/main/ets/pages/Waiting.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,13 @@ | |||||||
|  | import Footer from '../components/Footer' | ||||||
|  | import Header from '../components/Header' | ||||||
|  | 
 | ||||||
|  | @Entry | ||||||
|  | @Component | ||||||
|  | struct Waiting { | ||||||
|  |   build() { | ||||||
|  |     Column() { | ||||||
|  |       Header() | ||||||
|  |       Footer() | ||||||
|  |     }.height("100%").width("100%") | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										97
									
								
								entry/src/main/ets/utils/cameraUtils.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,97 @@ | |||||||
|  | import common from '@ohos.app.ability.common' | ||||||
|  | import camera from '@ohos.multimedia.camera' | ||||||
|  | import image from '@ohos.multimedia.image' | ||||||
|  | import util from '@ohos.util' | ||||||
|  | 
 | ||||||
|  | export class CameraUtils { | ||||||
|  |   private manager: camera.CameraManager | ||||||
|  |   private device: camera.CameraDevice | ||||||
|  |   private ability: camera.CameraOutputCapability | ||||||
|  |   private cameraInput?: camera.CameraInput | ||||||
|  |   private photoOutput: camera.PhotoOutput | undefined = undefined; | ||||||
|  |   private previewOutput: camera.PreviewOutput | undefined = undefined; | ||||||
|  |   private session: camera.CaptureSession | ||||||
|  |   private imageReceiver: image.ImageReceiver | ||||||
|  |   private takeCallback?: (base64: string) => void | ||||||
|  | 
 | ||||||
|  |   constructor(context: common.UIAbilityContext) { | ||||||
|  |     this.manager = camera.getCameraManager(context) | ||||||
|  |     this.device = this.getUsbCamera() | ||||||
|  |     this.ability = this.getCameraAbility(this.device) | ||||||
|  |     this.imageReceiver = image.createImageReceiver(this.ability.photoProfiles[0].size.width, this.ability.photoProfiles[0].size.height, image.ImageFormat.JPEG, 8) | ||||||
|  |     this.session = this.manager.createCaptureSession(); | ||||||
|  |     this.imageReceiver.on("imageArrival", async () => { | ||||||
|  |       let img: image.Image = await this.imageReceiver.readNextImage() | ||||||
|  |       const imagePacker = image.createImagePacker(); | ||||||
|  |       let component = await img.getComponent(image.ComponentType.JPEG) | ||||||
|  |       let source = image.createImageSource(component.byteBuffer) | ||||||
|  |       const options: image.PackingOption = { | ||||||
|  |         format: "image/jpeg", | ||||||
|  |         quality: 100 | ||||||
|  |       }; | ||||||
|  |       const arrayBuffer = await imagePacker.packing(source, options); | ||||||
|  |       let base64 = new util.Base64Helper().encodeToStringSync(new Uint8Array(arrayBuffer)) | ||||||
|  |       img.release() | ||||||
|  |       this.takeCallback?.(base64) | ||||||
|  |       this.takeCallback = undefined | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private getUsbCamera(): camera.CameraDevice { | ||||||
|  |     let list = this.manager.getSupportedCameras() | ||||||
|  |     let device: camera.CameraDevice = list.find(item => item.connectionType === camera.ConnectionType.CAMERA_CONNECTION_USB_PLUGIN)! | ||||||
|  |     return device | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private getCameraAbility(cameraDevice: camera.CameraDevice): camera.CameraOutputCapability { | ||||||
|  |     return this.manager.getSupportedOutputCapability(cameraDevice) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async init(surfaceId: string) { | ||||||
|  |     try { | ||||||
|  |       this.cameraInput = this.manager.createCameraInput(this.device); | ||||||
|  |       this.cameraInput?.open() | ||||||
|  |       let photoSurfaceId: string = await this.imageReceiver.getReceivingSurfaceId() | ||||||
|  |       this.photoOutput = this.manager.createPhotoOutput(this.ability.photoProfiles[0], photoSurfaceId) | ||||||
|  |       this.previewOutput = this.manager.createPreviewOutput(this.ability.previewProfiles[0], surfaceId) | ||||||
|  |       this.session.beginConfig() | ||||||
|  |       this.session.addInput(this.cameraInput!) | ||||||
|  |       this.session.addOutput(this.previewOutput) | ||||||
|  |       this.session.addOutput(this.photoOutput) | ||||||
|  |       await this.session.commitConfig() | ||||||
|  |     } catch (e) { | ||||||
|  |       console.log("error", JSON.stringify(e)) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   destroy() { | ||||||
|  |     this.session.release() | ||||||
|  |     this.cameraInput?.close() | ||||||
|  |     this.imageReceiver.release() | ||||||
|  |     this.previewOutput?.release() | ||||||
|  |     this.photoOutput?.release() | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async startPreview() { | ||||||
|  |     return this.session.start() | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async takePhoto() { | ||||||
|  |     return new Promise<string>((resolve, reject) => { | ||||||
|  |       try { | ||||||
|  |         let photoSetting: camera.PhotoCaptureSetting = { | ||||||
|  |           rotation: camera.ImageRotation.ROTATION_0, | ||||||
|  |           quality: camera.QualityLevel.QUALITY_LEVEL_MEDIUM, | ||||||
|  |           mirror: false | ||||||
|  |         } | ||||||
|  |         this.photoOutput?.capture(photoSetting) | ||||||
|  |         this.takeCallback = (base64: string) => { | ||||||
|  |           resolve(base64) | ||||||
|  |         } | ||||||
|  |       } catch (error) { | ||||||
|  |         reject(error) | ||||||
|  |         console.log("err", JSON.stringify(error)) | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										73
									
								
								entry/src/main/ets/utils/file.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,73 @@ | |||||||
|  | import common from '@ohos.app.ability.common' | ||||||
|  | import fs from '@ohos.file.fs'; | ||||||
|  | import zlib from '@ohos.zlib'; | ||||||
|  | 
 | ||||||
|  | async function compressFileToCache(input: string, output: string, context: common.UIAbilityContext,): Promise<string> { | ||||||
|  |   if (!fs.accessSync(input)) { | ||||||
|  |     return "" | ||||||
|  |   } | ||||||
|  |   const tempDir = context.cacheDir + '/' + output | ||||||
|  |   if (fs.statSync(input).isDirectory()) { | ||||||
|  |     fs.listFileSync(input).forEach(name => { | ||||||
|  |       fs.copyFileSync(input + '/' + name, tempDir + '/' + name) | ||||||
|  |     }) | ||||||
|  |     await zlib.compressFile(tempDir, tempDir + '.zip', { | ||||||
|  |       level: zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION, | ||||||
|  |       memLevel: zlib.MemLevel.MEM_LEVEL_DEFAULT, | ||||||
|  |       strategy: zlib.CompressStrategy.COMPRESS_STRATEGY_DEFAULT_STRATEGY | ||||||
|  |     }) | ||||||
|  |     fs.rmdirSync(context.cacheDir + '/' + output) | ||||||
|  |     return tempDir + '.zip' | ||||||
|  |   } else { | ||||||
|  |     const tempDir = context.cacheDir + '/' + output | ||||||
|  |     fs.copyFileSync(input, output) | ||||||
|  |     await zlib.compressFile(tempDir, tempDir + '.zip', { | ||||||
|  |       level: zlib.CompressLevel.COMPRESS_LEVEL_DEFAULT_COMPRESSION, | ||||||
|  |       memLevel: zlib.MemLevel.MEM_LEVEL_DEFAULT, | ||||||
|  |       strategy: zlib.CompressStrategy.COMPRESS_STRATEGY_DEFAULT_STRATEGY | ||||||
|  |     }) | ||||||
|  |     fs.unlinkSync(context.cacheDir + '/' + output) | ||||||
|  |     return tempDir + '.zip' | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | export class UsbUtils { | ||||||
|  |   private context: common.UIAbilityContext | ||||||
|  | 
 | ||||||
|  |   constructor(context: common.UIAbilityContext) { | ||||||
|  |     this.context = context | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   getUsbDiskPath() { | ||||||
|  |     let path = "" | ||||||
|  |     try { | ||||||
|  |       path = fs.listFileSync("/mnt/data/external")[0] | ||||||
|  |     } catch (error) { | ||||||
|  |       console.log("err", JSON.stringify(error)) | ||||||
|  |     } | ||||||
|  |     return '/mnt/data/external' + '/' + path | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async copyTrackToUsb() { | ||||||
|  |     try { | ||||||
|  |       let path = this.getUsbDiskPath() | ||||||
|  |       let trackPath = await compressFileToCache('/data/log/duolun/logs', "track", this.context) | ||||||
|  |       fs.copyFileSync(trackPath, path + '/' + "track.zip") | ||||||
|  |       fs.unlinkSync(trackPath) | ||||||
|  |     } catch (error) { | ||||||
|  |       console.log("err", JSON.stringify(error)) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async copyLogToUsb() { | ||||||
|  |     try { | ||||||
|  |       let path = this.getUsbDiskPath() | ||||||
|  |       let logPath = await compressFileToCache('/data/log/hilog', "logs", this.context) | ||||||
|  |       fs.copyFileSync(logPath, path + '/' + "log.zip") | ||||||
|  |       fs.unlinkSync(logPath) | ||||||
|  |     } catch (error) { | ||||||
|  |       console.log("err", JSON.stringify(error)) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								entry/src/main/ets/utils/system.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,20 @@ | |||||||
|  | import common from '@ohos.app.ability.common'; | ||||||
|  | import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl'; | ||||||
|  | 
 | ||||||
|  | export function requestPermission(context: common.UIAbilityContext, permissions: Permissions[], autoToSetting: boolean = false): Promise<void> { | ||||||
|  |   let manager = abilityAccessCtrl.createAtManager(); | ||||||
|  |   return manager.requestPermissionsFromUser(context, permissions).then((data): Promise<void> => { | ||||||
|  |     let status = data.authResults | ||||||
|  |     for (let i = 0; i < status.length; i++) { | ||||||
|  |       if (status[i] == 2) { | ||||||
|  |         if (autoToSetting) { | ||||||
|  | 
 | ||||||
|  |         } else { | ||||||
|  |           return Promise.reject() | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     return Promise.resolve() | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										81
									
								
								entry/src/main/module.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,81 @@ | |||||||
|  | { | ||||||
|  |   "module": { | ||||||
|  |     "name": "entry", | ||||||
|  |     "type": "entry", | ||||||
|  |     "description": "$string:module_desc", | ||||||
|  |     "mainElement": "EntryAbility", | ||||||
|  |     "deviceTypes": [ | ||||||
|  |       "default", | ||||||
|  |       "tablet" | ||||||
|  |     ], | ||||||
|  |     "deliveryWithInstall": true, | ||||||
|  |     "installationFree": false, | ||||||
|  |     "pages": "$profile:main_pages", | ||||||
|  |     "abilities": [ | ||||||
|  |       { | ||||||
|  |         "name": "EntryAbility", | ||||||
|  |         "srcEntry": "./ets/entryability/EntryAbility.ets", | ||||||
|  |         "description": "$string:EntryAbility_desc", | ||||||
|  |         "icon": "$media:icon", | ||||||
|  |         "label": "$string:EntryAbility_label", | ||||||
|  |         "startWindowIcon": "$media:startIcon", | ||||||
|  |         "startWindowBackground": "$color:start_window_background", | ||||||
|  |         "exported": true, | ||||||
|  |         "skills": [ | ||||||
|  |           { | ||||||
|  |             "entities": [ | ||||||
|  |               "entity.system.home" | ||||||
|  |             ], | ||||||
|  |             "actions": [ | ||||||
|  |               "action.system.home" | ||||||
|  |             ] | ||||||
|  |           } | ||||||
|  |         ] | ||||||
|  |       } | ||||||
|  |     ], | ||||||
|  |     "requestPermissions": [ | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.CAMERA" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.INTERNET" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.FILE_ACCESS_MANAGER" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.DISTRIBUTED_DATASYNC", | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.STORAGE_MANAGER" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.WRITE_AUDIO" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.READ_AUDIO" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.READ_DOCUMENT" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.WRITE_DOCUMENT" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.MEDIA_LOCATION" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.WRITE_MEDIA" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.READ_MEDIA" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.READ_IMAGEVIDEO" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "name": "ohos.permission.WRITE_IMAGEVIDEO" | ||||||
|  |       } | ||||||
|  |     ] | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								entry/src/main/resources/base/element/color.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  |   "color": [ | ||||||
|  |     { | ||||||
|  |       "name": "start_window_background", | ||||||
|  |       "value": "#FFFFFF" | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								entry/src/main/resources/base/element/string.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,16 @@ | |||||||
|  | { | ||||||
|  |   "string": [ | ||||||
|  |     { | ||||||
|  |       "name": "module_desc", | ||||||
|  |       "value": "module description" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "EntryAbility_desc", | ||||||
|  |       "value": "description" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "EntryAbility_label", | ||||||
|  |       "value": "label" | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/base/media/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/base/media/startIcon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.2 KiB | 
							
								
								
									
										10
									
								
								entry/src/main/resources/base/profile/main_pages.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,10 @@ | |||||||
|  | { | ||||||
|  |   "src": [ | ||||||
|  |     "pages/Login", | ||||||
|  |     "pages/Home", | ||||||
|  |     "pages/Scan", | ||||||
|  |     "pages/ProjectCheck", | ||||||
|  |     "pages/Waiting", | ||||||
|  |     "pages/Sign" | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								entry/src/main/resources/en_US/element/string.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,16 @@ | |||||||
|  | { | ||||||
|  |   "string": [ | ||||||
|  |     { | ||||||
|  |       "name": "module_desc", | ||||||
|  |       "value": "module description" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "EntryAbility_desc", | ||||||
|  |       "value": "description" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "EntryAbility_label", | ||||||
|  |       "value": "label" | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/img/check/scan.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 72 KiB | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/img/close.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 435 B | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/img/exit.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 337 B | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/img/login/background.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.8 MiB | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/img/logo_cn.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/img/logo_en.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/img/warning.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										16
									
								
								entry/src/main/resources/zh_CN/element/string.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,16 @@ | |||||||
|  | { | ||||||
|  |   "string": [ | ||||||
|  |     { | ||||||
|  |       "name": "module_desc", | ||||||
|  |       "value": "模块描述" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "EntryAbility_desc", | ||||||
|  |       "value": "description" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "EntryAbility_label", | ||||||
|  |       "value": "label" | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								entry/src/ohosTest/ets/test/Ability.test.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,35 @@ | |||||||
|  | import hilog from '@ohos.hilog'; | ||||||
|  | import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; | ||||||
|  | 
 | ||||||
|  | export default function abilityTest() { | ||||||
|  |   describe('ActsAbilityTest', () => { | ||||||
|  |     // 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. | ||||||
|  |       hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); | ||||||
|  |       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); | ||||||
|  |     }) | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										5
									
								
								entry/src/ohosTest/ets/test/List.test.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,5 @@ | |||||||
|  | import abilityTest from './Ability.test'; | ||||||
|  | 
 | ||||||
|  | export default function testsuite() { | ||||||
|  |   abilityTest(); | ||||||
|  | } | ||||||
							
								
								
									
										49
									
								
								entry/src/ohosTest/ets/testability/TestAbility.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,49 @@ | |||||||
|  | import UIAbility from '@ohos.app.ability.UIAbility'; | ||||||
|  | import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; | ||||||
|  | import hilog from '@ohos.hilog'; | ||||||
|  | import { Hypium } from '@ohos/hypium'; | ||||||
|  | import testsuite from '../test/List.test'; | ||||||
|  | import window from '@ohos.window'; | ||||||
|  | import Want from '@ohos.app.ability.Want'; | ||||||
|  | import AbilityConstant from '@ohos.app.ability.AbilityConstant'; | ||||||
|  | 
 | ||||||
|  | export default class TestAbility extends UIAbility { | ||||||
|  |   onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onCreate'); | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? ''); | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:' + JSON.stringify(launchParam) ?? ''); | ||||||
|  |     let abilityDelegator: AbilityDelegatorRegistry.AbilityDelegator; | ||||||
|  |     abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator(); | ||||||
|  |     let abilityDelegatorArguments: AbilityDelegatorRegistry.AbilityDelegatorArgs; | ||||||
|  |     abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments(); | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'start run testcase!!!'); | ||||||
|  |     Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onDestroy() { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onDestroy'); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onWindowStageCreate(windowStage: window.WindowStage) { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageCreate'); | ||||||
|  |     windowStage.loadContent('testability/pages/Index', (err) => { | ||||||
|  |       if (err.code) { | ||||||
|  |         hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |       hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onWindowStageDestroy() { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageDestroy'); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onForeground() { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onForeground'); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onBackground() { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onBackground'); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								entry/src/ohosTest/ets/testability/pages/Index.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,17 @@ | |||||||
|  | @Entry | ||||||
|  | @Component | ||||||
|  | struct Index { | ||||||
|  |   @State message: string = 'Hello World'; | ||||||
|  | 
 | ||||||
|  |   build() { | ||||||
|  |     Row() { | ||||||
|  |       Column() { | ||||||
|  |         Text(this.message) | ||||||
|  |           .fontSize(50) | ||||||
|  |           .fontWeight(FontWeight.Bold) | ||||||
|  |       } | ||||||
|  |       .width('100%') | ||||||
|  |     } | ||||||
|  |     .height('100%') | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										50
									
								
								entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,50 @@ | |||||||
|  | import hilog from '@ohos.hilog'; | ||||||
|  | import TestRunner from '@ohos.application.testRunner'; | ||||||
|  | import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; | ||||||
|  | import Want from '@ohos.app.ability.Want'; | ||||||
|  | 
 | ||||||
|  | let abilityDelegator: AbilityDelegatorRegistry.AbilityDelegator | undefined = undefined | ||||||
|  | let abilityDelegatorArguments: AbilityDelegatorRegistry.AbilityDelegatorArgs | undefined = undefined | ||||||
|  | 
 | ||||||
|  | async function onAbilityCreateCallback() { | ||||||
|  |   hilog.info(0x0000, 'testTag', '%{public}s', 'onAbilityCreateCallback'); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | async function addAbilityMonitorCallback(err : Error) { | ||||||
|  |   hilog.info(0x0000, 'testTag', 'addAbilityMonitorCallback : %{public}s', JSON.stringify(err) ?? ''); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export default class OpenHarmonyTestRunner implements TestRunner { | ||||||
|  |   constructor() { | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   onPrepare() { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner OnPrepare '); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async onRun() { | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun run'); | ||||||
|  |     abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() | ||||||
|  |     abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() | ||||||
|  |     const bundleName = abilityDelegatorArguments.bundleName; | ||||||
|  |     const testAbilityName = 'TestAbility'; | ||||||
|  |     const moduleName = abilityDelegatorArguments.parameters['-m']; | ||||||
|  |     let lMonitor: AbilityDelegatorRegistry.AbilityMonitor = { | ||||||
|  |       abilityName: testAbilityName, | ||||||
|  |       onAbilityCreate: onAbilityCreateCallback, | ||||||
|  |       moduleName: moduleName | ||||||
|  |     }; | ||||||
|  |     abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback) | ||||||
|  |     const want: Want = { | ||||||
|  |       bundleName: bundleName, | ||||||
|  |       abilityName: testAbilityName, | ||||||
|  |       moduleName: moduleName | ||||||
|  |     }; | ||||||
|  |     abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator(); | ||||||
|  |     abilityDelegator.startAbility(want, (err, data) => { | ||||||
|  |       hilog.info(0x0000, 'testTag', 'startAbility : err : %{public}s', JSON.stringify(err) ?? ''); | ||||||
|  |       hilog.info(0x0000, 'testTag', 'startAbility : data : %{public}s',JSON.stringify(data) ?? ''); | ||||||
|  |     }) | ||||||
|  |     hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun end'); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								entry/src/ohosTest/module.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,36 @@ | |||||||
|  | { | ||||||
|  |   "module": { | ||||||
|  |     "name": "entry_test", | ||||||
|  |     "type": "feature", | ||||||
|  |     "description": "$string:module_test_desc", | ||||||
|  |     "mainElement": "TestAbility", | ||||||
|  |     "deviceTypes": [ | ||||||
|  |       "tablet" | ||||||
|  |     ], | ||||||
|  |     "deliveryWithInstall": true, | ||||||
|  |     "installationFree": false, | ||||||
|  |     "pages": "$profile:test_pages", | ||||||
|  |     "abilities": [ | ||||||
|  |       { | ||||||
|  |         "name": "TestAbility", | ||||||
|  |         "srcEntry": "./ets/testability/TestAbility.ets", | ||||||
|  |         "description": "$string:TestAbility_desc", | ||||||
|  |         "icon": "$media:icon", | ||||||
|  |         "label": "$string:TestAbility_label", | ||||||
|  |         "exported": true, | ||||||
|  |         "startWindowIcon": "$media:icon", | ||||||
|  |         "startWindowBackground": "$color:start_window_background", | ||||||
|  |         "skills": [ | ||||||
|  |           { | ||||||
|  |             "actions": [ | ||||||
|  |               "action.system.home" | ||||||
|  |             ], | ||||||
|  |             "entities": [ | ||||||
|  |               "entity.system.home" | ||||||
|  |             ] | ||||||
|  |           } | ||||||
|  |         ] | ||||||
|  |       } | ||||||
|  |     ] | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								entry/src/ohosTest/resources/base/element/color.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  |   "color": [ | ||||||
|  |     { | ||||||
|  |       "name": "start_window_background", | ||||||
|  |       "value": "#FFFFFF" | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								entry/src/ohosTest/resources/base/element/string.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,16 @@ | |||||||
|  | { | ||||||
|  |   "string": [ | ||||||
|  |     { | ||||||
|  |       "name": "module_test_desc", | ||||||
|  |       "value": "test ability description" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "TestAbility_desc", | ||||||
|  |       "value": "the test ability" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "TestAbility_label", | ||||||
|  |       "value": "test label" | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								entry/src/ohosTest/resources/base/media/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
| @ -0,0 +1,5 @@ | |||||||
|  | { | ||||||
|  |   "src": [ | ||||||
|  |     "testability/pages/Index" | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								hvigor/hvigor-config.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,22 @@ | |||||||
|  | { | ||||||
|  |   "hvigorVersion": "3.2.4", | ||||||
|  |   "dependencies": { | ||||||
|  |     "@ohos/hvigor-ohos-plugin": "3.2.4" | ||||||
|  |   }, | ||||||
|  |   "execution": { | ||||||
|  |     // "analyze": "default",                    /* Define the build analyze mode. Value: [ "default" | "verbose" | false ]. Default: "default" */ | ||||||
|  |     // "daemon": true,                          /* Enable daemon compilation. Value: [ true | false ]. Default: true */ | ||||||
|  |     // "incremental": true,                     /* Enable incremental compilation. Value: [ true | false ]. Default: true */ | ||||||
|  |     // "parallel": true,                        /* Enable parallel compilation. Value: [ true | false ]. Default: true */ | ||||||
|  |     // "typeCheck": false,                      /* Enable typeCheck. Value: [ true | false ]. Default: false */ | ||||||
|  |   }, | ||||||
|  |   "logging": { | ||||||
|  |     // "level": "info"                          /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ | ||||||
|  |   }, | ||||||
|  |   "debugging": { | ||||||
|  |     // "stacktrace": false                      /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ | ||||||
|  |   }, | ||||||
|  |   "nodeOptions": { | ||||||
|  |     // "maxOldSpaceSize": 4096                  /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process */ | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								hvigor/hvigor-wrapper.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										6
									
								
								hvigorfile.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,6 @@ | |||||||
|  | import { appTasks } from '@ohos/hvigor-ohos-plugin'; | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |     system: appTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */ | ||||||
|  |     plugins:[]         /* Custom plugin to extend the functionality of Hvigor. */ | ||||||
|  | } | ||||||
							
								
								
									
										54
									
								
								hvigorw
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,54 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | # ---------------------------------------------------------------------------- | ||||||
|  | #  Hvigor startup script, version 1.0.0 | ||||||
|  | # | ||||||
|  | #  Required ENV vars: | ||||||
|  | #  ------------------ | ||||||
|  | #    NODE_HOME - location of a Node home dir | ||||||
|  | #    or | ||||||
|  | #    Add /usr/local/nodejs/bin to the PATH environment variable | ||||||
|  | # ---------------------------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | HVIGOR_APP_HOME="`pwd -P`" | ||||||
|  | HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js | ||||||
|  | #NODE_OPTS="--max-old-space-size=4096" | ||||||
|  | 
 | ||||||
|  | fail() { | ||||||
|  |   echo "$*" | ||||||
|  |   exit 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | set_executable_node() { | ||||||
|  |   EXECUTABLE_NODE="${NODE_HOME}/bin/node" | ||||||
|  |   if [ -x "$EXECUTABLE_NODE" ]; then | ||||||
|  |     return | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   EXECUTABLE_NODE="${NODE_HOME}/node" | ||||||
|  |   if [ -x "$EXECUTABLE_NODE" ]; then | ||||||
|  |     return | ||||||
|  |   fi | ||||||
|  |   fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Determine node to start hvigor wrapper script | ||||||
|  | if [ -n "${NODE_HOME}" ]; then | ||||||
|  |   set_executable_node | ||||||
|  | else | ||||||
|  |   EXECUTABLE_NODE="node" | ||||||
|  |   command -v ${EXECUTABLE_NODE} &> /dev/null || fail "ERROR: NODE_HOME not set and 'node' command not found" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Check hvigor wrapper script | ||||||
|  | if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ]; then | ||||||
|  |   fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ -z "${NODE_OPTS}" ]; then | ||||||
|  |   NODE_OPTS="--" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # start hvigor-wrapper script | ||||||
|  | exec "${EXECUTABLE_NODE}" "${NODE_OPTS}" \ | ||||||
|  |   "${HVIGOR_WRAPPER_SCRIPT}" "$@" | ||||||
							
								
								
									
										54
									
								
								hvigorw.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,54 @@ | |||||||
|  | @rem | ||||||
|  | @rem ---------------------------------------------------------------------------- | ||||||
|  | @rem  Hvigor startup script for Windows, version 1.0.0 | ||||||
|  | @rem | ||||||
|  | @rem  Required ENV vars: | ||||||
|  | @rem  ------------------ | ||||||
|  | @rem    NODE_HOME - location of a Node home dir | ||||||
|  | @rem    or | ||||||
|  | @rem    Add %NODE_HOME%/bin to the PATH environment variable | ||||||
|  | @rem ---------------------------------------------------------------------------- | ||||||
|  | @rem | ||||||
|  | @echo off | ||||||
|  | 
 | ||||||
|  | @rem Set local scope for the variables with windows NT shell | ||||||
|  | if "%OS%"=="Windows_NT" setlocal | ||||||
|  | 
 | ||||||
|  | set DIRNAME=%~dp0 | ||||||
|  | if "%DIRNAME%" == "" set DIRNAME=. | ||||||
|  | set APP_BASE_NAME=%~n0 | ||||||
|  | set APP_HOME=%DIRNAME% | ||||||
|  | 
 | ||||||
|  | set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js | ||||||
|  | set NODE_EXE=node.exe | ||||||
|  | @rem set NODE_OPTS="--max-old-space-size=4096" | ||||||
|  | 
 | ||||||
|  | @rem Resolve any "." and ".." in APP_HOME to make it shorter. | ||||||
|  | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | ||||||
|  | 
 | ||||||
|  | if not defined NODE_OPTS set NODE_OPTS="--" | ||||||
|  | 
 | ||||||
|  | @rem Find node.exe | ||||||
|  | if defined NODE_HOME ( | ||||||
|  |   set NODE_HOME=%NODE_HOME:"=% | ||||||
|  |   set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE% | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | %NODE_EXE% --version >NUL 2>&1 | ||||||
|  | if "%ERRORLEVEL%" == "0" ( | ||||||
|  |   "%NODE_EXE%" "%NODE_OPTS%" "%WRAPPER_MODULE_PATH%" %* | ||||||
|  | ) else if exist "%NODE_EXE_PATH%" ( | ||||||
|  |   "%NODE_EXE%" "%NODE_OPTS%" "%WRAPPER_MODULE_PATH%" %* | ||||||
|  | ) else ( | ||||||
|  |   echo. | ||||||
|  |   echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. | ||||||
|  |   echo. | ||||||
|  |   echo Please set the NODE_HOME variable in your environment to match the | ||||||
|  |   echo location of your NodeJs installation. | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | if "%ERRORLEVEL%" == "0" ( | ||||||
|  |   if "%OS%" == "Windows_NT" endlocal | ||||||
|  | ) else ( | ||||||
|  |   exit /b %ERRORLEVEL% | ||||||
|  | ) | ||||||
							
								
								
									
										13
									
								
								oh-package-lock.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |   "lockfileVersion": 1, | ||||||
|  |   "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", | ||||||
|  |   "specifiers": { | ||||||
|  |     "@ohos/hypium@1.0.13": "@ohos/hypium@1.0.13" | ||||||
|  |   }, | ||||||
|  |   "packages": { | ||||||
|  |     "@ohos/hypium@1.0.13": { | ||||||
|  |       "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.13.tgz", | ||||||
|  |       "integrity": "sha512-d0+XvDeAYk5Vgl6JQ8Q1G+NPmTyJI8qgZ1PwPfcUbx/dfyKVAAv9lz1XtVNhYypyWEKqAzu8zMAC9GuHo2Y53Q==" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								oh-package.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |   "name": "carcheck", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "description": "Please describe the basic information.", | ||||||
|  |   "main": "", | ||||||
|  |   "author": "", | ||||||
|  |   "license": "", | ||||||
|  |   "dependencies": { | ||||||
|  |   }, | ||||||
|  |   "devDependencies": { | ||||||
|  |     "@ohos/hypium": "1.0.13" | ||||||
|  |   } | ||||||
|  | } | ||||||