diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index b6597af..3b50ea1 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -1,18 +1,11 @@ import common from '@ohos.app.ability.common'; import router from '@ohos.router'; -import { JudgeConfig } from "../config"; +import { JudgeConfig } from '../config'; import promptAction from '@ohos.promptAction'; -import errorMsgDialog from './compontents/errorMsgDialog'; -import imageBtn from './compontents/imageBtn'; import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements'; import { BaseInfoType, centerCallBackMsgType } from '../model/Common'; -import { - CarInfoType, - InitializeTheCentralTableType, - MASYSSETTableType, - TimeSynchronizationRspBody -} from '../model'; +import { CarInfoType, InitializeTheCentralTableType, MASYSSETTableType, TimeSynchronizationRspBody } from '../model'; import { GetCarInfo, GetDeviceInfo, SetCurrentTime, UseAuth } from './Index/utils'; import { GetSyncData, InitializeTheCentralTable } from '../utils/table/Operation'; import { BusinessError } from '@ohos.base'; @@ -24,8 +17,10 @@ import { CenterUDPBusinessInstance } from '../utils/business/CenterUdpBusiness'; import { DrivingDataStorage } from '../utils/business/DrivingDataStorage'; import { JudgeUdpBusinessInstance } from '../utils/business/JudgeUdpBusiness'; import { JudgeEmitterInstance } from '../utils/business/UdpEvent'; -import { LoadingDialog } from './Index/Loading'; -import { ExitDialog } from './Index/ExitDialog' +import HeaderComponent from './compontents/Header'; +import CardComponent from './Index/Card'; +import BottomMessageComponent from './Index/BottomMessage'; +import LoadingComponent from './Index/Loading'; @Entry @@ -45,42 +40,17 @@ struct Index { @State fd: number = -1; @State carInfo: CarInfoType = {}; @State num: number = 0; + // 请求网络表等待弹窗 + customDialogController: CustomDialogController = new CustomDialogController({ + builder: LoadingComponent(), + customStyle: true, + alignment: DialogAlignment.Center, + autoCancel: true + }); private context = getContext(this) as common.UIAbilityContext; private fileHelper: FileHelper = new FileHelper(this.context) private avPlayer: VoiceAnnounce = new VoiceAnnounce(this.context) private timeInfo: TimeSynchronizationRspBody = {} - private loadingDialog: CustomDialogController = new CustomDialogController({ - builder: LoadingDialog(), - customStyle: true, - alignment: DialogAlignment.Center, - autoCancel: false - }) - private delDialog: CustomDialogController = new CustomDialogController({ - builder: LoadingDialog({ - text: "正在清理本地数据,请稍候……" - }), - customStyle: true, - alignment: DialogAlignment.Center, - autoCancel: false - }) - private exitDialog: CustomDialogController = new CustomDialogController({ - builder: ExitDialog(), - customStyle: true, - alignment: DialogAlignment.Center, - autoCancel: false - }) - private errorDialog: CustomDialogController = new CustomDialogController({ - builder: errorMsgDialog({ - title: AppStorage.get('title'), - type: AppStorage.get('type'), - cancel: () => { - }, - confirm: () => { - } - }), - customStyle: true, - alignment: DialogAlignment.Center, - }) @Styles commStyle(){ @@ -122,17 +92,15 @@ struct Index { AppStorage.setOrCreate('lsh', '1111111111111') } - exam() { - this.loadingDialog.open() + // 联网考试逻辑处理 + onlineExam() { + this.customDialogController.open() if (!this.timeInfo) { - // AppStorage.setOrCreate('type', 1) - // AppStorage.setOrCreate('title', '时间同步接口连接失败') - this.errorDialog.open() promptAction.showToast({ message: `时间同步接口连接失败`, duration: 3000 }); - this.loadingDialog.close() + this.customDialogController.close() return } if (!this.carInfo) { @@ -140,16 +108,14 @@ struct Index { message: `车辆信息接口获取失败`, duration: 3000 }); - AppStorage.setOrCreate('type', 1) - AppStorage.setOrCreate('title', '车辆信息接口获取失败') - this.errorDialog.open() - this.loadingDialog.close() + this.customDialogController.close() return } this.testXMLToJSONInWorker() } - practice() { + // 单机训练逻辑处理 + singlePlayerTraining() { AppStorage.setOrCreate('singlePlay', true) if (JudgeConfig.isTrajectoryOpen) { router.pushUrl({ @@ -184,7 +150,6 @@ struct Index { singlePlay: this.singlePlay } InitializeTheCentralTable(param).then((ret) => { - this.loadingDialog.close() if (ret) { GetSyncData("MA_SYSSET").then(data => { data.forEach(sys => { @@ -229,7 +194,6 @@ struct Index { } },) await GetDeviceInfo(this.context) - // getTCP() this.carInfo = AppStorage.get('carInfo')! this.deviceId = this.carInfo.carNo || "" await SetCurrentTime() @@ -245,90 +209,39 @@ struct Index { } build() { - Column() { - Row() { - Image($r('app.media.logo')).width('30%').margin({ left: 24 }) - Row() { - Image($r('app.media.btn_setting')).width('16.7%') - .onClick(async () => { - router.pushUrl({ - url: 'pages/Settings', - }, router.RouterMode.Single); - }) - Image($r('app.media.btn_back')).width('14.4%') - .onClick(() => { - this.exitDialog.open() - }) + Flex({ + justifyContent: FlexAlign.SpaceBetween, + direction: FlexDirection.Column + }) { + HeaderComponent({ + shortLogo: false + }) + CardComponent({ + isSingle: this.singlePlay, + singleClick: () => { + this.singlePlayerTraining() + }, + networkingClick: () => { + this.onlineExam() } - } - .width('100%') - .height(100) - .justifyContent(FlexAlign.SpaceBetween) - - Row() { - imageBtn({ btnWidth: '28%', imgSrc: this.singlePlay ? $r('app.media.index_dj') : $r('app.media.index_lw') }) - .margin({ left: 80 * this.ratio }) - .onClick(() => { - if (this.singlePlay) { - this.practice() - } else { - this.exam() - } - }) - imageBtn({ btnWidth: '28%', imgSrc: $r('app.media.index_zj') }) - .margin({ right: 80 * this.ratio }) - .onClick(() => { - router.pushUrl({ - url: 'pages/CarCheck' - }, router.RouterMode.Single); - }) - } - .padding({ top: 30, bottom: 30 }) - .layoutWeight(1) - .width('100%') - .justifyContent(FlexAlign.SpaceAround) - - Row() { - Column() { - Text('V外壳:' + this.baseInfo?.version) - .fontColor('#CCAE7A') - .fontSize(28) - .width('30%') - .margin({ bottom: 10 }) - Text('V评判:' + this.baseInfo.judgeVersion) - .fontColor('#CCAE7A') - .fontSize(28) - .width('30%') - .margin({ bottom: 10 }) - - Text('授权信息:' + (this.baseInfo.hasAuth ? '已授权' : '未授权')) - .fontColor('#CCAE7A') - .fontSize(28) - .width('30%') + }) + BottomMessageComponent({ + version: this.baseInfo.version, + judgeVersion: this.baseInfo.judgeVersion, + hasAuth: this.baseInfo.hasAuth, + examCarNumber: this.baseInfo.deviceNo, + versionClick: () => { + this.singlePlay = !this.singlePlay + AppStorage.setOrCreate('singlePlay', this.singlePlay) } - .margin({ left: 24 }) - .gesture( - GestureGroup(GestureMode.Exclusive, - TapGesture({ count: 2 }) - .onAction(() => { - this.singlePlay = !this.singlePlay - AppStorage.setOrCreate('singlePlay', this.singlePlay) - }) - ) - ) - - Text('考车号:' + this.deviceId) - .fontColor('#CCAE7A') - .fontSize(36) - .margin({ right: 24 }) - } - .padding({ top: 10, bottom: 10 }) - .width('100%') - .justifyContent(FlexAlign.SpaceBetween) + }) } - .width('100%') - .height('100%') - .justifyContent(FlexAlign.SpaceBetween) + .width("100%") + .height("100%") .backgroundImage($r('app.media.index_bg')) + .backgroundImageSize({ + width: "100%", + height: "100%" + }) } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/Index/BottomMessage.ets b/entry/src/main/ets/pages/Index/BottomMessage.ets new file mode 100644 index 0000000..433fe70 --- /dev/null +++ b/entry/src/main/ets/pages/Index/BottomMessage.ets @@ -0,0 +1,38 @@ +@Component +export default struct BottomMessageComponent { + @State version: string = "" + @State judgeVersion: string = "" + @State hasAuth: boolean = false + @State examCarNumber: string = "" + versionClick?: () => void + + build() { + Flex( + { + justifyContent: FlexAlign.SpaceBetween, + alignItems: ItemAlign.End + } + ) { + Column() { + Text('V外壳:' + this.version).textCommonStyle() + Text('V评判:' + this.judgeVersion).textCommonStyle() + Text("授权信息:" + this.hasAuth ? "已授权" : "未授权").textCommonStyle() + }.gesture( + GestureGroup(GestureMode.Exclusive, + TapGesture({ count: 2 }) + .onAction(() => { + this.versionClick && this.versionClick() + }) + ) + ) + + Text("考车号: " + this.examCarNumber).textCommonStyle() + } + } +} + +@Extend(Text) +function textCommonStyle() { + .fontSize(35) + .fontColor("#C7AF81") +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/Index/Card.ets b/entry/src/main/ets/pages/Index/Card.ets new file mode 100644 index 0000000..00a58c5 --- /dev/null +++ b/entry/src/main/ets/pages/Index/Card.ets @@ -0,0 +1,66 @@ +import LoadingComponent from './Loading'; +import router from '@ohos.router'; + +@Component +export default struct CardComponent { + // 是否单机 + @Prop isSingle: boolean = false + + // 单机点击 + singleClick?: () => void + networkingClick?: () => void + + build() { + Flex({ + alignItems: ItemAlign.Center, + justifyContent: FlexAlign.SpaceAround + }) { + if (this.isSingle) { + // 单机 + CardItemComponent({ + url: $r("app.media.index_dj") + }).onClick(() => { + this.singleClick && this.singleClick() + // router.pushUrl({ + // url: "pages/CandidatesList" + // }) + }) + } else { + // 联网 + CardItemComponent({ + url: $r("app.media.index_lw") + }) + .onClick(() => { + this.networkingClick && this.networkingClick() + // this.customDialogController.open() + }) + } + // 车辆自检 + CardItemComponent({ + url: $r("app.media.index_zj") + }) + .onClick(() => { + router.pushUrl({ + url: 'pages/CarCheck' + }, router.RouterMode.Single); + }) + }.height(700) + } +} + +@Component +struct CardItemComponent { + @State url: Resource = $r("app.media.index_zj") + + build() { + Column() { + } + .backgroundImage(this.url) + .backgroundImageSize({ + width: "100%", + height: "100%" + }) + .width(500) + .height("100%") + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/Index/Loading.ets b/entry/src/main/ets/pages/Index/Loading.ets index 80b1bc5..c21fd39 100644 --- a/entry/src/main/ets/pages/Index/Loading.ets +++ b/entry/src/main/ets/pages/Index/Loading.ets @@ -1,13 +1,13 @@ @CustomDialog -export struct LoadingDialog { - @Prop private text: string = "获取考车信息,请稍候……" - @State private angle: number = 0 - private controller: CustomDialogController +export default struct LoadingComponent { + @State angle: number = 0 + private controller?: CustomDialogController; aboutToAppear(): void { + // loading旋转动画 animateTo({ - duration: 5000, - curve: Curve.EaseOut, + duration: 1500, + curve: Curve.Linear, iterations: -1, playMode: PlayMode.Normal, }, () => { @@ -17,23 +17,29 @@ export struct LoadingDialog { build() { Column() { - Image($r('app.media.open_loading')) - .width(200) - .rotate({ angle: this.angle }) - .height(200) - .margin({ top: 30 }) - Image($r('app.media.car')) - .width(80) - .height(80) - .position({ x: 288, y: 89 }) - Text(this.text) - .fontSize(24) - .margin({ top: 20 }) - .fontWeight(400) + Stack() { + Image($r('app.media.car')).width(150).height(150) + Image($r('app.media.open_loading')) + .width(300) + .height(300) + .rotate({ + angle: this.angle, + }) + }.margin({ + top: 40, + bottom: 40 + }) + + Text("获取考车信息,请稍候...").fontSize(40).fontWeight(FontWeight.Bold) } - .width(660) - .height(360) - .backgroundColor('#E6E3DF') - .borderRadius(19) + .width(900) + .height(500) + .borderRadius(20) + .backgroundColor("#E5E3DF") + .shadow({ + radius: 30, + color: "#E7B544" + }) + } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/Index/utils.ets b/entry/src/main/ets/pages/Index/utils.ets index 48b6ad7..36eeea0 100644 --- a/entry/src/main/ets/pages/Index/utils.ets +++ b/entry/src/main/ets/pages/Index/utils.ets @@ -47,6 +47,7 @@ export async function GetCarInfo() { deviceNo: AppStorage.get('deviceNo') || "" }; let res: ApiResponseType = await obtainCarExamInfo(params) + console.log("获取到的车辆信息", res) if (res.obtainCarExamInfoRsp && res.obtainCarExamInfoRsp.body) { const carInfo: ObtainCarExamInfoRspBody = res?.obtainCarExamInfoRsp?.body! carInfo.plateNo = decodeURIComponent(carInfo.plateNo) @@ -54,6 +55,7 @@ export async function GetCarInfo() { } } +// 获取授权 export async function UseAuth(context: common.UIAbilityContext): Promise { return new Promise((resolve, reject) => { const permissions: Array = @@ -63,13 +65,13 @@ export async function UseAuth(context: common.UIAbilityContext): Promise { let grantStatus: Array = res.authResults; let length: number = grantStatus.length; + resolve(true) for (let i = 0; i < length; i++) { if (grantStatus[i] !== 0) { reject(false) return; } } - resolve(true) }).catch((err: BusinessError) => { console.log("获取权限失败", JSON.stringify(err)) reject(false) diff --git a/entry/src/main/ets/pages/Register.ets b/entry/src/main/ets/pages/Register.ets index 518f974..4efe21f 100644 --- a/entry/src/main/ets/pages/Register.ets +++ b/entry/src/main/ets/pages/Register.ets @@ -125,7 +125,7 @@ struct Index { const fileUtil = new FileUtils(this.context) const folderPath = await fileUtil.initFolder(`/config`); fileUtil.addFile(`${folderPath}/deviceNo.txt`, JSON.stringify(param)) - AppStorage.setOrCreate('deviceNo', this.ip) + AppStorage.setOrCreate('deviceNo', this.ip) // upDateTableByArray('DeviceInfoTable', [{ deviceId: this.ip }]) registrationDeviceNo(param).then((res: ApiResponseType) => { if (res.registrationDeviceNoRsp && res.registrationDeviceNoRsp.head && diff --git a/entry/src/main/ets/pages/TerminalInfos.ets b/entry/src/main/ets/pages/TerminalInfos.ets index 20329e9..9ae562f 100644 --- a/entry/src/main/ets/pages/TerminalInfos.ets +++ b/entry/src/main/ets/pages/TerminalInfos.ets @@ -92,8 +92,12 @@ struct Index { centerIp: this.inputTextList1[2], centerPort: this.inputTextList1[3] } + console.log("保存参数", JSON.stringify(param)) this.fileUtil.addFile(`${folderPath}/ipConfig.txt`, JSON.stringify(param)) AppStorage.setOrCreate("EnvironmentConfiguration", param) + const host = `http://${param.centerIp}:${param.centerPort}` + console.log("中心host",host) + AppStorage.setOrCreate("host", host) ethernet.setIfaceConfig("eth0", { mode: ethernet.IPSetMode.STATIC, ipAddr: this.inputTextList1[9], @@ -101,7 +105,7 @@ struct Index { gateway: this.inputTextList1[5], //value.gateway网关 netMask: this.inputTextList1[4], //value.netMask网络掩码 dnsServers: this.inputTextList1[6], - domain:"" + domain: "" }, (error: BusinessError) => { if (error) { Prompt.showToast({ diff --git a/entry/src/main/ets/pages/compontents/Header.ets b/entry/src/main/ets/pages/compontents/Header.ets new file mode 100644 index 0000000..9b59314 --- /dev/null +++ b/entry/src/main/ets/pages/compontents/Header.ets @@ -0,0 +1,110 @@ +/* + * @Author: wangzhongjie + * @Date: 2024-07-18 15:53:08 + * @LastEditors: wangzhongjie + * @LastEditTime: 2024-07-18 15:53:08 + * @Description: 头部 + * @Email: shutdown0630@163.com + */ +import dayTs from '../../utils/Date' +import router from '@ohos.router' +import Prompt from '@system.prompt' +import common from '@ohos.app.ability.common' + +@Component +export default struct HeaderComponent { + @State shortLogo: boolean = true + @State time: string = "" + @State timer: number = 0 + // 自定义返回区域 + @BuilderParam + backAreaBuilder?: () => void = this.customBuilder + // 扩充Logo后面区域 + @BuilderParam + logoExpansionBuilder?: () => void = this.customBuilder + + @Builder + customBuilder() { + } + + aboutToAppear(): void { + this.getCurrentTime() + this.timer = setInterval(() => { + this.getCurrentTime() + }, 1000) + } + + aboutToDisappear(): void { + clearInterval(this.timer) + } + + getCurrentTime() { + this.time = dayTs(new Date()).format("YYYY-MM-DD HH:mm:ss") + } + + build() { + Flex({ + justifyContent: FlexAlign.SpaceBetween, + alignItems: ItemAlign.Center + }) { + if (this.shortLogo) { + Row() { + Image($r('app.media.shortLogo')).height(100).width(150).objectFit(ImageFit.Contain).margin({ + left: 10 + }) + Text(this.time) + .fontColor("#fff") + .margin({ + left: 10 + }).fontSize(16) + if (this.logoExpansionBuilder) { + this.logoExpansionBuilder() + } + } + } else { + Image($r('app.media.logo')).height(100).width(400).objectFit(ImageFit.Contain).margin({ + left: 10 + }) + } + if (this.shortLogo) { + if (this.backAreaBuilder) { + this.backAreaBuilder() + } else { + Image($r('app.media.topB_back')).height(100).onClick(() => { + router.back() + }) + } + } else { + + Row() { + Image($r('app.media.btn_setting')).height(100).onClick(() => { + console.log("点击设置") + router.pushUrl({ + url: 'pages/Settings', + }, router.RouterMode.Single); + }) + Image($r('app.media.btn_back')).height(100).onClick(() => { + Prompt.showDialog({ + title: "提示", + message: "确定要退出吗?", + buttons: [ + { + text: '取消', + color: '#666666' + }, + { + text: '退出', + color: '#666666' + } + ], + success: () => { + (getContext(this) as common.UIAbilityContext).terminateSelf() + } + }) + }) + } + } + } + .height(100) + } +} \ No newline at end of file diff --git a/entry/src/main/ets/utils/Request.ets b/entry/src/main/ets/utils/Request.ets index b16b6b0..e9553a8 100644 --- a/entry/src/main/ets/utils/Request.ets +++ b/entry/src/main/ets/utils/Request.ets @@ -39,46 +39,43 @@ function setObj(target: Record, key: string, value: object) { } function transfer(target: Array, name?: string): object { - const result: object = new Object() - - target.forEach((el: object) => { - const _elements: Array = el['_elements'] + const result: Record = {}; // 使用 Record 类型以便动态添加属性 + target.forEach((el: ESObject) => { + const _elements: Array = el['_elements']; if (el['_type'] === "element") { if (_elements === undefined) { - return + return; } - const jsonObj: Record = result[el['_name']] as Record + const jsonObj: ESObject = result[el['_name']]; const handleCommonArray = (obj: object) => { if (Array.isArray(jsonObj)) { - result[el['_name']].push(obj) + jsonObj.push(obj); } else { - result[el['_name']] = [result[el['_name']], obj] + result[el['_name']] = [jsonObj, obj]; } - } + }; - if (_elements && _elements.length === 1 && _elements[0]['_type'] === 'text') { + if (_elements && _elements.length && _elements[0]['_type'] === 'text') { if (jsonObj) { - handleCommonArray(_elements[0]['_text']) + handleCommonArray(_elements[0]['_text']); } else { - setObj(jsonObj, el['_name'], _elements[0]["_text"]) - // jsonObj[el['_name'] as string] = _elements[0]["_text"] as object + result[el['_name']] = _elements[0]['_text']; } } else { if (jsonObj) { - handleCommonArray(transfer(el['_elements'], el['_name'])) + handleCommonArray(transfer(el['_elements'], el['_name'])); } else { - setObj(jsonObj, el['_name'], transfer(el['_elements'], el['_name'])) - // jsonObj[el['_name'] as string] = transfer(el['_elements'], el['_name']) + result[el['_name']] = transfer(el['_elements'], el['_name']); } } } else if (el['_attributes'] && name) { result[name] = { value: el['_text'], - attributes: el['__attributes'] - } + attributes: el['_attributes'], // 修复属性名 + }; } - }) - return result + }); + return result; } interface CenterCodeResult { @@ -123,6 +120,7 @@ export default function Request(options: RequestOption) const instance = http.createHttp() const baseURL = options.host || base console.log(RequestTag, "基础url:", baseURL) + console.log(RequestTag, "参数", JSON.stringify(options.data)) instance.request(baseURL + options.url, { method: options.method, header: { @@ -172,7 +170,7 @@ export default function Request(options: RequestOption) } }).catch((err: BusinessError) => { - console.error(RequestTag, "出错的url:", options.url, "错误信息:", JSON.stringify(err)) + console.error(RequestTag, "出错的url:", baseURL, options.url, "错误信息:", JSON.stringify(err)) if (!err || !(err?.message)) { reject({ code: -1