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"
|
||||
}
|
||||
}
|
||||