diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/.gitignore" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/.gitignore" new file mode 100644 index 0000000000000000000000000000000000000000..91d237bb144c7fb1777e50271857ef0f593286fc --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/.gitignore" @@ -0,0 +1,5 @@ +/node_modules +/local.properties +/.idea +**/build +/.hvigor \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/AppScope/app.json5" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/AppScope/app.json5" new file mode 100644 index 0000000000000000000000000000000000000000..faf2e7d148230a1b97e31629833a966f6ec48587 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/AppScope/app.json5" @@ -0,0 +1,11 @@ +{ + "app": { + "bundleName": "com.example.healthydietix", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name", + "distributedNotificationEnabled": true + } +} diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/AppScope/resources/base/element/string.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/AppScope/resources/base/element/string.json" new file mode 100644 index 0000000000000000000000000000000000000000..182bad3440a179c5e2991ae4ab7548bbaf638f6f --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/AppScope/resources/base/element/string.json" @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "HealthyDietIX" + } + ] +} diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/AppScope/resources/base/media/app_icon.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/AppScope/resources/base/media/app_icon.png" new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/AppScope/resources/base/media/app_icon.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/build-profile.json5" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/build-profile.json5" new file mode 100644 index 0000000000000000000000000000000000000000..d7b1117cdb34aab2983ac65026d9e8dcc91332d1 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/build-profile.json5" @@ -0,0 +1,27 @@ +{ + "app": { + "signingConfigs": [], + "compileSdkVersion": 9, + "compatibleSdkVersion": 9, + "products": [ + { + "name": "default", + "signingConfig": "default", + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/.gitignore" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/.gitignore" new file mode 100644 index 0000000000000000000000000000000000000000..5a6ba80fa3d9498a23ae8ae7d9518f8743fa8a96 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/.gitignore" @@ -0,0 +1,4 @@ +/node_modules +/.preview +/build +/.cxx \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/build-profile.json5" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/build-profile.json5" new file mode 100644 index 0000000000000000000000000000000000000000..f8f03407f77914b43168aeca6bb0929efd6700b4 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/build-profile.json5" @@ -0,0 +1,13 @@ +{ + "apiType": 'stageMode', + "buildOption": { + }, + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/hvigorfile.js" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/hvigorfile.js" new file mode 100644 index 0000000000000000000000000000000000000000..d7720ee6a7aad5c617d1fd2f6fc8c87067bfa32c --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/hvigorfile.js" @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/package-lock.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/package-lock.json" new file mode 100644 index 0000000000000000000000000000000000000000..15bc7145be1490029883067847743ea7134cf545 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/package-lock.json" @@ -0,0 +1,5 @@ +{ + "name": "entry", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/package.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/package.json" new file mode 100644 index 0000000000000000000000000000000000000000..c4e988f30f2ec9e3430a4d0c8f05e89fabbc2659 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/package.json" @@ -0,0 +1,13 @@ +{ + "name": "entry", + "version": "1.0.0", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "description": "example description", + "repository": {}, + "license": "ISC", + "dependencies": {} +} diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/Application/MyAbilityStage.ts" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/Application/MyAbilityStage.ts" new file mode 100644 index 0000000000000000000000000000000000000000..4bea34b35db86d55f1a555e4bfb97778968567d6 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/Application/MyAbilityStage.ts" @@ -0,0 +1,9 @@ +import hilog from '@ohos.hilog'; +import AbilityStage from "@ohos.application.AbilityStage" + +export default class MyAbilityStage extends AbilityStage { + onCreate() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'AbilityStage onCreate'); + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/MainAbility/MainAbility.ts" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/MainAbility/MainAbility.ts" new file mode 100644 index 0000000000000000000000000000000000000000..131d2dd061c9e71fd3c2422243a37fddf412edd3 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/MainAbility/MainAbility.ts" @@ -0,0 +1,51 @@ +import hilog from '@ohos.hilog'; +import Ability from '@ohos.application.Ability' +import Window from '@ohos.window' + +export default class MainAbility extends Ability { + onCreate(want, launchParam) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? ''); + hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:' + JSON.stringify(launchParam) ?? ''); + } + + onDestroy() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: Window.WindowStage) { + // Main window is created, set main page for this ability + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/index', (err, data) => { + if (err.code) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.ERROR); + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); + }); + } + + onWindowStageDestroy() { + // Main window is destroyed, release UI related resources + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground() { + // Ability has brought to foreground + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground() { + // Ability has back to background + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/common/BreakpointSystem.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/common/BreakpointSystem.ets" new file mode 100644 index 0000000000000000000000000000000000000000..59130ced6132fca5aad6c84babc034110b3d14d4 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/common/BreakpointSystem.ets" @@ -0,0 +1,78 @@ +import mediaQuery from '@ohos.mediaquery'; + +declare interface BreakPointTypeOption { + xs?: T + sm?: T + md?: T + lg?: T + xl?: T + xxl?: T +} + +export class BreakPointType { + options: BreakPointTypeOption + + constructor(option: BreakPointTypeOption) { + this.options = option + } + + getValue(currentBreakPoint: string) { + if (currentBreakPoint === 'xs') { + return this.options.xs + } else if (currentBreakPoint === 'sm') { + return this.options.sm + } else if (currentBreakPoint === 'md') { + return this.options.md + } else if (currentBreakPoint === 'lg') { + return this.options.lg + } else if (currentBreakPoint === 'xl') { + return this.options.xl + } else if (currentBreakPoint === 'xxl') { + return this.options.xxl + } else { + return undefined + } + } +} + +type Breakpoint = { + name: string + condition: string + mediaQueryListener?: mediaQuery.MediaQueryListener +} + +export class BreakpointSystem { + private currentBreakpoint: string = 'md' + private breakpoints: Breakpoint[] = [ + { name: 'xs', condition: '(device-type: wearable)' }, + { name: 'sm', condition: '(device-type: default) and (orientation: portrait)' }, + { name: 'md', condition: '(device-type: default) and (orientation: landscape)' }, + { name: 'md', condition: '(device-type: tablet) and (orientation: portrait)' }, + { name: 'lg', condition: '(device-type: tablet) and (orientation: landscape)' } + ] + private updateCurrentBreakpoint(breakpoint: string) { + if (this.currentBreakpoint !== breakpoint) { + this.currentBreakpoint = breakpoint + AppStorage.Set('currentBreakpoint', this.currentBreakpoint) + } + } + + public register() { + this.breakpoints.forEach((breakpoint: Breakpoint, index) => { + let condition + condition = breakpoint.condition + breakpoint.mediaQueryListener = mediaQuery.matchMediaSync(condition) + breakpoint.mediaQueryListener.on('change', (mediaQueryResult) => { + if (mediaQueryResult.matches) { + this.updateCurrentBreakpoint(breakpoint.name) + } + }) + }) + } + + public unregister() { + this.breakpoints.forEach((breakpoint: Breakpoint) => { + breakpoint.mediaQueryListener.off('change') + }) + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/common/Constants.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/common/Constants.ets" new file mode 100644 index 0000000000000000000000000000000000000000..46fd90e866bd7df8dce4fed8b0317db31622fc3e --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/common/Constants.ets" @@ -0,0 +1 @@ +export let CIRCLE_RADIUS: number = 80 \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/mock/MockData.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/mock/MockData.ets" new file mode 100644 index 0000000000000000000000000000000000000000..9c119bee331632a987e8d3f012087a154b23daff --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/mock/MockData.ets" @@ -0,0 +1,202 @@ +import { FoodInfo, CategoryId, MealTimeId, DietRecord } from '../model/DataModels'; + +export let mockFoods: Array = [ + { + id: 0, + letter: 'Tomato', + name: $r('app.string.food_name_tomato'), + image: $r('app.media.tomato'), + categoryId: CategoryId.Vegetable, + calories: 15, + protein: 0.9, + fat: 0.2, + carbohydrates: 3.3, + vitaminC: 14.0 + }, + { + id: 1, + letter: 'Walnut', + name: $r('app.string.food_name_walnut'), + image: $r('app.media.walnut'), + categoryId: CategoryId.Nut, + calories: 646, + protein: 14.9, + fat: 58.8, + carbohydrates: 19.1, + vitaminC: 1.0 + }, + { + id: 2, + letter: 'Cucumber', + name: $r('app.string.food_name_cucumber'), + image: $r('app.media.cucumber'), + categoryId: CategoryId.Vegetable, + calories: 16, + protein: 0.8, + fat: 0.2, + carbohydrates: 2.9, + vitaminC: 9.0 + }, + { + id: 3, + letter: 'Blueberry', + name: $r('app.string.food_name_blueberry'), + image: $r('app.media.blueberry'), + categoryId: CategoryId.Fruit, + calories: 57, + protein: 0.7, + fat: 0.3, + carbohydrates: 14.5, + vitaminC: 9.7 + }, + { + id: 4, + letter: 'Crab', + name: $r('app.string.food_name_crab'), + image: $r('app.media.crab'), + categoryId: CategoryId.Seafood, + calories: 97, + protein: 19, + fat: 1.5, + carbohydrates: 0, + vitaminC: 7.6 + }, + { + id: 5, + letter: 'IceCream', + name: $r('app.string.food_name_ice_cream'), + image: $r('app.media.icecream'), + categoryId: CategoryId.Dessert, + calories: 150, + protein: 3.5, + fat: 11, + carbohydrates: 24, + vitaminC: 0.6 + }, + { + id: 6, + letter: 'Onion', + name: $r('app.string.food_name_onion'), + image: $r('app.media.onion'), + categoryId: CategoryId.Vegetable, + calories: 40, + protein: 1.1, + fat: 0.2, + carbohydrates: 9, + vitaminC: 8.0 + }, + { + id: 7, + letter: 'Mushroom', + name: $r('app.string.food_name_mushroom'), + image: $r('app.media.mushroom'), + categoryId: CategoryId.Vegetable, + calories: 20, + protein: 3.1, + fat: 0.3, + carbohydrates: 3.3, + vitaminC: 206 + }, + { + id: 8, + letter: 'Kiwi', + name: $r('app.string.food_name_kiwi'), + image: $r('app.media.kiwi'), + categoryId: CategoryId.Fruit, + calories: 61, + protein: 0.8, + fat: 0.6, + carbohydrates: 14.5, + vitaminC: 62 + }, + { + id: 9, + letter: 'Pitaya', + name: $r('app.string.food_name_pitaya'), + image: $r('app.media.pitaya'), + categoryId: CategoryId.Fruit, + calories: 55, + protein: 1.1, + fat: 0.2, + carbohydrates: 13.3, + vitaminC: 3.0 + }, + { + id: 10, + letter: 'Avocado', + name: $r('app.string.food_name_avocado'), + image: $r('app.media.avocado'), + categoryId: CategoryId.Fruit, + calories: 171, + protein: 2.0, + fat: 15.3, + carbohydrates: 7.4, + vitaminC: 8.0 + }, + { + id: 11, + letter: 'Strawberry', + name: $r('app.string.food_name_strawberry'), + image: $r('app.media.strawberry'), + categoryId: CategoryId.Fruit, + calories: 32, + protein: 1.0, + fat: 0.2, + carbohydrates: 7.1, + vitaminC: 47.0 + } +] + +export let mockFoodInfo: FoodInfo = { + id: 0, + letter: 'Tomato', + name: $r('app.string.food_name_tomato'), + image: $r('app.media.tomato'), + categoryId: CategoryId.Vegetable, + calories: 15, + protein: 0.9, + fat: 0.2, + carbohydrates: 3.3, + vitaminC: 14.0 +} + +export let mockDietRecords: Array = [ + { + id: 1, + foodId: 2, + mealTime: { name: $r('app.string.meal_time_dinner'), id: MealTimeId.Dinner }, + weight: 200 + }, + { + id: 2, + foodId: 8, + mealTime: { name: $r('app.string.meal_time_dinner'), id: MealTimeId.Dinner }, + weight: 200 + }, + { + id: 3, + foodId: 6, + mealTime: { name: $r('app.string.meal_time_lunch'), id: MealTimeId.Lunch }, + weight: 200 + }, + { + id: 4, + foodId: 3, + mealTime: { name: $r('app.string.meal_time_dinner'), id: MealTimeId.Dinner }, + weight: 200 + } +] + + + + + + + + + + + + + + diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/model/DataModels.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/model/DataModels.ets" new file mode 100644 index 0000000000000000000000000000000000000000..69bf0d4570cc7026553a7649cf18ffac17294395 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/model/DataModels.ets" @@ -0,0 +1,105 @@ +export enum CategoryId { + Fruit = 0, + Vegetable, + Nut, + Seafood, + Dessert +} + +export type Category = { + name: Resource + id: CategoryId +} + +export type FoodInfo = { + id: number + letter: string + name: string | Resource + image: Resource + categoryId: CategoryId + calories: number + protein: number + fat: number + carbohydrates: number + vitaminC: number +} + +export enum MealTimeId { + Breakfast = 0, + Lunch, + Dinner, + Supper +} + +export class MealTime { + name: Resource + id: MealTimeId + + constructor(id: MealTimeId) { + this.id = id + switch (id) { + case MealTimeId.Breakfast: + this.name = $r('app.string.meal_time_breakfast') + break + case MealTimeId.Lunch: + this.name = $r('app.string.meal_time_lunch') + break + case MealTimeId.Dinner: + this.name = $r('app.string.meal_time_dinner') + break + case MealTimeId.Supper: + this.name = $r('app.string.meal_time_supper') + break + } + } +} + +export class DietRecord { + id: number + foodId: number + mealTime: MealTime + weight: number + + constructor(id: number, foodId: number, mealTime: MealTime, weight: number) { + this.id = id + this.foodId = foodId + this.mealTime = mealTime + this.weight = weight + } +} + +export class MealFoodInfo { + recordId: number + name: string | Resource + image: Resource + calories: number + protein: number + fat: number + carbohydrates: number + weight: number + + constructor(recordId: number, name: string | Resource, image: Resource, calories: number, protein: number, fat: number, carbohydrates: number, weight: number) { + this.recordId = recordId + this.name = name + this.image = image + this.calories = calories + this.protein = protein + this.fat = fat + this.carbohydrates = carbohydrates + this.weight = weight + } +} + +@Observed +export class OneMealStatisticsInfo { + mealTime: MealTime + mealFoods: Array = [] + totalCalories: number = 0 + totalFat: number = 0 + totalCarbohydrates: number = 0 + totalProtein: number = 0 + + constructor(mealTime: MealTime) { + this.mealTime = mealTime + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/model/DataUtil.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/model/DataUtil.ets" new file mode 100644 index 0000000000000000000000000000000000000000..1d4ce93f5c5226500164a7629b36c25b6ca19965 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/model/DataUtil.ets" @@ -0,0 +1,183 @@ +import router from '@ohos.router'; +import { FoodInfo, Category, CategoryId, MealTimeId, OneMealStatisticsInfo, MealFoodInfo, DietRecord } from './DataModels'; +import { mockFoods, mockFoodInfo, mockDietRecords } from '../mock/MockData'; + +const DEBUG_PREVIEW = false +const MOCK_API = true + +export function getFoods(): Array { + return mockFoods +} + +export function getFoodInfo(keyName: string): FoodInfo { + return DEBUG_PREVIEW ? mockFoodInfo : router.getParams()[keyName] +} + +export let initDietRecords: Array = [ + { + id: -1, + foodId: 0, + mealTime: { name: $r('app.string.meal_time_breakfast'), id: MealTimeId.Breakfast }, + weight: 0 + }, + { + id: -1, + foodId: 0, + mealTime: { name: $r('app.string.meal_time_lunch'), id: MealTimeId.Lunch }, + weight: 0 + }, + { + id: -1, + foodId: 0, + mealTime: { name: $r('app.string.meal_time_dinner'), id: MealTimeId.Dinner }, + weight: 0 + }, + { + id: -1, + foodId: 0, + mealTime: { name: $r('app.string.meal_time_supper'), id: MealTimeId.Supper }, + weight: 0 + } +] + +export function getDietRecords(): Array { + return DEBUG_PREVIEW ? initDietRecords.concat(mockDietRecords) : AppStorage.Get>('dietRecords') +} + +export function getFoodCategories(): Category[] { + return [ + { id: CategoryId.Vegetable, name: $r('app.string.category_vegetable') }, + { id: CategoryId.Fruit, name: $r('app.string.category_fruit') }, + { id: CategoryId.Nut, name: $r('app.string.category_nut') }, + { id: CategoryId.Seafood, name: $r('app.string.category_seafood') }, + { id: CategoryId.Dessert, name: $r('app.string.category_dessert') } + ] +} + +export function getMileTimes(): string[] { + if (MOCK_API) { + return ['早餐', '午餐', '晚餐', '夜宵'] + } else { + let mealTimeResources: Resource[] = [$r("app.string.meal_time_breakfast"), $r('app.string.meal_time_lunch'), $r('app.string.meal_time_dinner'), $r('app.string.meal_time_supper'), $r('app.string.category_dessert')] + let mealTimes = [] + mealTimeResources.forEach(item => { + let mealTime = this.context.resourceManger.getStringSync(item.id) + if (mealTime !== '') { + mealTimes.push(mealTime) + } + }) + return mealTimes + } +} + +export function getSortedFoodData(): Array { + let letterReg = /^[A-Z]$/ + let list = new Array() + let foods = getFoods() + for (let i=0; i { + console.info('meal statistics') + let dietRecords = getDietRecords() + const mealMap = new Map() + dietRecords.forEach((item) => { + let oneMealStatisticsInfo: OneMealStatisticsInfo = mealMap.get(item.mealTime.id) + if (oneMealStatisticsInfo === undefined) { + oneMealStatisticsInfo = new OneMealStatisticsInfo(item.mealTime) + } + let foodInfo = getFoods().find((food) => { + return food.id === item.foodId + }) + let calories = foodInfo.calories * item.weight + let protein = foodInfo.protein * item.weight + let fat = foodInfo.fat * item.weight + let carbohydrates = foodInfo.carbohydrates * item.weight + oneMealStatisticsInfo.mealFoods.push(new MealFoodInfo(item.id, foodInfo.name, foodInfo.image, calories, protein, fat, carbohydrates, item.weight)) + oneMealStatisticsInfo.totalFat += fat + oneMealStatisticsInfo.totalCalories += calories + oneMealStatisticsInfo.totalCarbohydrates += carbohydrates + oneMealStatisticsInfo.totalProtein += protein + mealMap.set(item.mealTime.id, oneMealStatisticsInfo) + }) + return Array.from(mealMap.values()) +} + +export function updateDietWeight(recordId: number, weight: number) { + let dietRecords = getDietRecords() + let index = dietRecords.findIndex((record) => { + return record.id === recordId + }) + dietRecords[index].weight = weight + AppStorage.SetOrCreate>('dietRecords', dietRecords) +} + + + +export function getCartRecords(): Array { + return DEBUG_PREVIEW ? initDietRecords.concat(mockDietRecords) : AppStorage.Get>('dietRecords') +} + +export function amount(): Array { + console.info('calculate the total price') + let dietRecords = getCartRecords() + const mealMap = new Map() + dietRecords.forEach((item) => { + let oneMealStatisticsInfo: OneMealStatisticsInfo = mealMap.get(item.mealTime.id) + if (oneMealStatisticsInfo === undefined) { + oneMealStatisticsInfo = new OneMealStatisticsInfo(item.mealTime) + } + let foodInfo = getFoods().find((food) => { + return food.id === item.foodId + }) + let calories = foodInfo.calories * item.weight + let protein = foodInfo.protein * item.weight + let fat = foodInfo.fat * item.weight + let carbohydrates = foodInfo.carbohydrates * item.weight + oneMealStatisticsInfo.mealFoods.push(new MealFoodInfo(item.id, foodInfo.name, foodInfo.image, calories, protein, fat, carbohydrates, item.weight)) + oneMealStatisticsInfo.totalFat += fat + oneMealStatisticsInfo.totalCalories += calories + oneMealStatisticsInfo.totalCarbohydrates += carbohydrates + oneMealStatisticsInfo.totalProtein += protein + mealMap.set(item.mealTime.id, oneMealStatisticsInfo) + }) + return Array.from(mealMap.values()) +} + +export function updateGoodCount(recordId: number, weight: number) { + let dietRecords = getDietRecords() + let index = dietRecords.findIndex((record) => { + return record.id === recordId + }) + dietRecords[index].weight = weight + AppStorage.SetOrCreate>('dietRecords', dietRecords) +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/model/MarketModels.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/model/MarketModels.ets" new file mode 100644 index 0000000000000000000000000000000000000000..906919695a865ca73d0664d77de0d0e26b40f39a --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/model/MarketModels.ets" @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2022 LookerSong + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const GoodsData: any[] = [ + { 'typeId': 1, 'typeName': '时令蔬菜', 'id': 1, 'goodsName': '白菜', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 1, 'typeName': '时令蔬菜', 'id': 2, 'goodsName': '胡萝卜', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 1, 'typeName': '时令蔬菜', 'id': 3, 'goodsName': '生菜', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 1, 'typeName': '时令蔬菜', 'id': 4, 'goodsName': '芹菜', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 1, 'typeName': '时令蔬菜', 'id': 5, 'goodsName': '上海青', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 1, 'typeName': '时令蔬菜', 'id': 6, 'goodsName': '娃娃菜', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 1, 'typeName': '时令蔬菜', 'id': 7, 'goodsName': '苦瓜', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 1, 'typeName': '时令蔬菜', 'id': 8, 'goodsName': '冬瓜', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 1, 'typeName': '时令蔬菜', 'id': 9, 'goodsName': '黄瓜', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 2, 'typeName': '肉禽鱼蛋', 'id': 10, 'goodsName': '猪肉', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 2, 'typeName': '肉禽鱼蛋', 'id': 11, 'goodsName': '鸡肉', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 2, 'typeName': '肉禽鱼蛋', 'id': 12, 'goodsName': '草鱼', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 2, 'typeName': '肉禽鱼蛋', 'id': 13, 'goodsName': '土鸡蛋', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 3, 'typeName': '新鲜水果', 'id': 14, 'goodsName': '苹果', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 3, 'typeName': '新鲜水果', 'id': 15, 'goodsName': '香蕉', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 3, 'typeName': '新鲜水果', 'id': 16, 'goodsName': '梨', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 3, 'typeName': '新鲜水果', 'id': 17, 'goodsName': '葡萄', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 3, 'typeName': '新鲜水果', 'id': 18, 'goodsName': '西瓜', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 4, 'typeName': '酒水饮料', 'id': 19, 'goodsName': '可乐', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 4, 'typeName': '酒水饮料', 'id': 20, 'goodsName': '橙汁', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 4, 'typeName': '酒水饮料', 'id': 21, 'goodsName': '菠萝啤', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 5, 'typeName': '休闲零食', 'id': 22, 'goodsName': '辣条', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 5, 'typeName': '休闲零食', 'id': 23, 'goodsName': '薯片', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 5, 'typeName': '休闲零食', 'id': 24, 'goodsName': '棒棒糖', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 5, 'typeName': '休闲零食', 'id': 25, 'goodsName': '口香糖', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 5, 'typeName': '休闲零食', 'id': 26, 'goodsName': '饼干', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 5, 'typeName': '休闲零食', 'id': 27, 'goodsName': '巧克力', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 5, 'typeName': '休闲零食', 'id': 28, 'goodsName': '瓜子', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 6, 'typeName': '调味料', 'id': 29, 'goodsName': '生抽', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 6, 'typeName': '调味料', 'id': 30, 'goodsName': '陈醋', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 6, 'typeName': '调味料', 'id': 31, 'goodsName': '鸡精', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 6, 'typeName': '调味料', 'id': 32, 'goodsName': '胡椒粉', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 6, 'typeName': '调味料', 'id': 33, 'goodsName': '豆瓣酱', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 6, 'typeName': '调味料', 'id': 34, 'goodsName': '蒜蓉酱', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 6, 'typeName': '调味料', 'id': 35, 'goodsName': '辣椒酱', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 7, 'typeName': '日用品', 'id': 36, 'goodsName': '纸巾', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 7, 'typeName': '日用品', 'id': 37, 'goodsName': '洗洁精', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 7, 'typeName': '日用品', 'id': 38, 'goodsName': '洗衣液', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 7, 'typeName': '日用品', 'id': 39, 'goodsName': '洗发精', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 7, 'typeName': '日用品', 'id': 40, 'goodsName': '沐浴露', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 7, 'typeName': '日用品', 'id': 41, 'goodsName': '牙刷', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 7, 'typeName': '日用品', 'id': 42, 'goodsName': '毛巾', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 7, 'typeName': '日用品', 'id': 43, 'goodsName': '牙膏', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + { 'typeId': 7, 'typeName': '日用品', 'id': 44, 'goodsName': '一次性筷子', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, + // { 'typeId': 1, 'typeName': '商品类别', 'id': 1, 'goodsName': '商品名', 'imageUrl': $r('app.media.tomato'), 'price': 1.8 }, +] + +export class TabItem { + position: number; + typeName: string; + constructor(position: number, typeName: string) { + this.position = position; + this.typeName = typeName; + } +} + +export class GoodsItem { + tag: boolean; + index: number; + goodsName: string; + imageUrl: string; + price: number; + count: number; + constructor(tag: boolean, index: number, goodsName: string, imageUrl: string, price: number, count: number) { + this.tag = tag; + this.index = index; + this.goodsName = goodsName; + this.imageUrl = imageUrl; + this.price = price; + this.count = count; + } +} + +export class LinkDataItem { + tabArray: Array = [] + listArray: Array = [] + constructor(tabArray: Array, listArray: Array) { + this.tabArray = tabArray; + this.listArray = listArray; + } +} + +export function getLinkData(): LinkDataItem { + let linkDataItem = new LinkDataItem([], []); + let typeId: number = 0; + GoodsData.forEach(item => { + if (typeId !== item.typeId) { + let tabItem = new TabItem(linkDataItem.listArray.length, item.typeName); + linkDataItem.tabArray.push(tabItem) + let goodsItem = new GoodsItem(true, linkDataItem.tabArray.length - 1, item.typeName, '', 0, 0); + linkDataItem.listArray.push(goodsItem) + } + let goodsItem = new GoodsItem(false, linkDataItem.tabArray.length - 1, item.goodsName, item.imageUrl, item.price, item.count); + linkDataItem.listArray.push(goodsItem); + typeId = item.typeId; + }) + return linkDataItem; +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/Community.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/Community.ets" new file mode 100644 index 0000000000000000000000000000000000000000..3bfe225337b5966f240ee177fc09967f8fa2fe30 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/Community.ets" @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2022 LookerSong + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@Component +struct UserInfo { + @State private isFollowed: boolean = false + + build() { + Row() { + Image($r('app.media.icon_customer')) + .width(50) + .height(50) + .borderRadius(25) + .backgroundColor('#fcfcfc') + Text('某某用户').fontSize(16).margin({ left: 15 }) + Blank() + Button(this.isFollowed ? '已关注' : '关注', { type: ButtonType.Capsule, stateEffect: true }) + .width(80) + .height(40) + .margin({ right: 10 }) + .borderRadius(8) + .backgroundColor(this.isFollowed ? '#74cd57' : '#a2a2a2') + .onClick(() => { + this.isFollowed = !this.isFollowed + }) + } + .width('100%') + .padding(10) + } +} + +@Component +struct MessageContent { + private imageList: Array = [$r('app.media.icon_comment_thumbsup'), $r('app.media.icon_comment_thumbsup')] + build() { + Column() { + Text('今天做的这几道菜,孩子都很喜欢吃。').fontSize(16).margin({ left: 20, right: 20 }) + if (this.imageList.length > 0) { + Row() { + Image($r('app.media.dish1')).width(80).height(80).margin(10).objectFit(ImageFit.Cover) + Image($r('app.media.dish2')).width(80).height(80).margin(10).objectFit(ImageFit.Cover) + Image($r('app.media.dish3')).width(80).height(80).margin(10).objectFit(ImageFit.Cover) + } + } + } + .margin(10) + .alignItems(HorizontalAlign.Start) + } +} + +@Component +struct KeyPanel { + private isMine: boolean = false + @State private isThumbsUP: boolean = false + build() { + Row({ space: 50 }) { + Row() { + Image($r('app.media.icon_comment_thumbsup')).width(25).height(25).fillColor(this.isThumbsUP ? '#cd2f27' : '#000000') + Text('点赞').fontSize(14).margin({ left: 5 }) + } + .onClick(() => { + this.isThumbsUP = !this.isThumbsUP + }) + Row() { + Image($r('app.media.icon_comment')).width(25).height(25) + Text('评论').fontSize(14).margin({ left: 5 }) + } + if (this.isMine) { + Row() { + Image($r('app.media.icon_comment_delete')).width(25).height(25) + Text('删除').fontSize(14).margin({ left: 5 }) + } + } else { + Row() { + Image($r('app.media.icon_comment_report')).width(25).height(25) + Text('举报').fontSize(14).margin({ left: 5 }) + } + } + } + .margin({ left: 20, bottom: 10 }) + } +} + +@Component +struct MessageItem { + build() { + Column() { + UserInfo() + MessageContent() + KeyPanel() + } + .alignItems(HorizontalAlign.Start) + .margin(10) + .borderRadius(10) + .backgroundColor('#e6e6e6') + } +} + +@Entry +@Component +export struct MessageList { + @State private showButton: boolean = false + build() { + Column() { + Text('美食交流圈') + .width('100%') + .fontSize(30) + .textAlign(TextAlign.Center) + .backgroundColor('#f2f3f5') + + List() { + ListItem() { + MessageItem() + } + ListItem() { + MessageItem() + } + ListItem() { + MessageItem() + } + ListItem() { + MessageItem() + } + ListItem() { + MessageItem() + } + ListItem() { + MessageItem() + } + } + .width('100%') + .alignListItem(ListItemAlign.Center) + + Button({ type: ButtonType.Circle, stateEffect: true }) { + Image($r('app.media.icon_manage')).width(25).height(25) + } + .width(50) + .height(50) + .position({ x: '77%', y: '85%' }) + .borderRadius(30) + .borderWidth(1) + .backgroundColor('#fcfcfc') + .onClick(() => { + this.showButton = !this.showButton + }) + + if (this.showButton) { + Button({ type: ButtonType.Circle, stateEffect: true }) { + Text('我发的').fontSize(16) + } + .width(60) + .height(60) + .position({ x: '54%', y: '86%' }) + .borderRadius(30) + .borderWidth(1) + .backgroundColor('#fcfcfc') + .onClick(() => { + console.log('筛选自己发布的交流圈') + this.showButton = !this.showButton + }) + + Button({ type: ButtonType.Circle, stateEffect: true }) { + Text('我的\n关注').fontSize(14) + } + .width(60) + .height(60) + .position({ x: '60%', y: '78%' }) + .borderRadius(30) + .borderWidth(1) + .backgroundColor('#fcfcfc') + .onClick(() => { + console.log('筛选关注的用户的交流圈') + this.showButton = !this.showButton + }) + + Button({ type: ButtonType.Circle, stateEffect: true }) { + Text('新建').fontSize(16) + } + .width(60) + .height(60) + .position({ x: '77%', y: '74%' }) + .borderRadius(30) + .borderWidth(1) + .backgroundColor('#fcfcfc') + .onClick(() => { + console.log('进入编辑页面') + this.showButton = !this.showButton + }) + } + } + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/CookBook.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/CookBook.ets" new file mode 100644 index 0000000000000000000000000000000000000000..9aded316fdef8fc1eecd3a7308631ca9bcacdd7c --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/CookBook.ets" @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2022 LookerSong + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@ohos.router'; +import { BreakPointType } from '../common/BreakpointSystem'; + +@Component +struct DishItem { + private dishItem: DishInfo + + build() { + Column() { + Image(this.dishItem.image) + .objectFit(ImageFit.Cover) + .backgroundColor('#f1f3f5') + .height(130) + Text(this.dishItem.name) + .fontSize(16) + } + .width(150) + .height(150) + .margin(10) + .clip(new Rect({ width: '100%', height: '100%', radius: 10 })) + .backgroundColor('#e8e8e8') + .onClick(() => { + router.push({ url: 'pages/CookBookDetail', params: { dishId: this.dishItem } }) + }) + } +} + +@Component +struct DishesGrid { + @StorageProp('currentBreakpoint') currentBreakpoint: string = 'md' + private dishItems: DishInfo[] + + build() { + Grid() { + ForEach(this.dishItems, (item: DishInfo) => { + GridItem() { + DishItem({ dishItem: item }) + } + }) + } + .columnsTemplate(new BreakPointType({ + sm: '1fr 1fr', + md: '1fr 1fr 1fr', + lg: '1fr 1fr 1fr 1fr' + }).getValue(this.currentBreakpoint)) + .columnsGap(8) + .rowsGap(8) + .padding({ left: 16, right: 16 }) + } +} + +export enum DishesCategoryId { + HomeCooking = 0, + Soup, + Cakes, + FitnessMeal +} + +export type DishesCategory = { + id: DishesCategoryId + name: string +} + +export type DishInfo = { + id: number + name: string + image: Resource + categoryId: DishesCategoryId +} + +@Entry +@Component +export struct CookBook { + @State currentTabIndex: number = 0 + private dishItems: Array = [ + { id: 0, name: '酸辣土豆丝', image: $r('app.media.dish1'), categoryId: DishesCategoryId.HomeCooking }, + { id: 1, name: '玉米排骨汤', image: $r('app.media.dish2'), categoryId: DishesCategoryId.Soup }, + { id: 2, name: '麻薯', image: $r('app.media.dish3'), categoryId: DishesCategoryId.Cakes }, + { id: 3, name: '水煮鸡胸', image: $r('app.media.dish4'), categoryId: DishesCategoryId.FitnessMeal }, + ] + private foodCategories: Array = [ + { id: 0, name: '家常菜' }, + { id: 1, name: '炖汤' }, + { id: 2, name: '糕点' }, + { id: 3, name: '健身餐' }, + ] + + @Builder tabBarItemBuilder(value: string, index: number) { + Text(value) + .fontColor(this.currentTabIndex === index ? 'rgba(0,0,0,0.9)' : 'rgba(0,0,0,0.6)') + .fontSize(this.currentTabIndex === index ? 24 : 18) + .margin({ top: 2 }) + .height(56) + } + + build() { + Stack() { + Tabs() { + TabContent() { + DishesGrid({ dishItems: this.dishItems }) + }.tabBar(this.tabBarItemBuilder('全部', 0)) + ForEach(this.foodCategories, (dishCategory: DishesCategory, index) => { + TabContent() { + DishesGrid({ dishItems: this.dishItems.filter(item => (item.categoryId === dishCategory.id)) }) + }.tabBar(this.tabBarItemBuilder(dishCategory.name, index + 1)) + }) + } + .animationDuration(0) + .barMode(BarMode.Scrollable) + .onChange((index) => { + this.currentTabIndex = index + }) + + Button({ type: ButtonType.Circle, stateEffect: true }) { + Image($r('app.media.icon_newone')).width(25).height(25) + } + .width(50) + .height(50) + .position({ x: '75%', y: '85%' }) + .borderRadius(30) + .borderWidth(1) + .backgroundColor('#fcfcfc') + .onClick(() => { + router.push({ url: 'pages/CookBookCreate' }) + }) + } + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/CookBookCreate.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/CookBookCreate.ets" new file mode 100644 index 0000000000000000000000000000000000000000..467a4cf6b8dc9576adabd42ba3cb96bc112dbbae --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/CookBookCreate.ets" @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2022 LookerSong + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import prompt from '@ohos.prompt'; +import router from '@ohos.router'; + +@Component +struct PageTitle { + private titleName: string = '新建菜谱' + + build() { + Row() { + Image($r('app.media.back')) + .width(20) + .height(20) + .onClick(() => { + router.back() + }) + Text(this.titleName) + .fontSize(22) + .margin({ left: 20 }) + Blank() + Button('发布', { type: ButtonType.Normal, stateEffect: true }) + .width(80) + .height(40) + .margin({ right: 10 }) + .borderRadius(8) + .backgroundColor('#a2a2a2') + .onClick(() => { + prompt.showToast({ + message: '功能暂未开发,发布失败……', + duration: 2000, + }); + }) + } + .padding(12) + .width('100%') + } +} + +@Component +struct DishOutline { + build() { + Row() { + Image($r('app.media.icon_upload')) + .width(140) + .height(140) + .borderWidth(2) + .margin(20) + .padding(50) + .backgroundColor('#ffffff') + .onClick(() => { + console.log('上传图片') + }) + Column({ space: 20 }) { + Row() { + Text('分类').fontSize(20).margin({ left: 10 }) + Select([{ value:'家常菜' }, { value:'炖汤' }, { value:'糕点' }, { value:'健身餐' }]) + .width(140) + .selected(0) + .value('家常菜') + .font({size: 20, weight:400, family: 'serif', style: FontStyle.Normal }) + .selectedOptionFont({size: 16, weight: 400, family: 'serif', style: FontStyle.Normal }) + .optionFont({size: 16, weight: 400, family: 'serif', style: FontStyle.Normal }) + .onSelect((index:number)=>{ + console.info("Select:" + index) + }) + } + TextInput({ placeholder: '菜品名称' }).width(160) + } + .width('50%') + } + .width('100%') + } +} + +@Component +struct CookingStep { + build() { + Column() { + Row() { + Text('步骤n').fontSize(20).margin({ left: 20 }) + Blank() + Button('删除', { type: ButtonType.Normal, stateEffect: true }) + .width(80) + .height(40) + .margin({ right: 20 }) + .borderRadius(8) + .backgroundColor('#f75653') + .onClick(() => { + console.log('删除这一步骤') + }) + } + .width('100%') + .margin({ bottom: 10 }) + TextArea({ placeholder: '具体操作' }).fontSize(16) + } + .margin({ top: 10, bottom: 10 }) + .alignItems(HorizontalAlign.Start) + } +} + +@Entry +@Component +struct Main { + build() { + Column() { + PageTitle() + DishOutline() + List() { + ListItem() { + CookingStep() + } + ListItem() { + CookingStep() + } + ListItem() { + CookingStep() + } + } + Button('下一步', { type: ButtonType.Normal, stateEffect: true }) + .width(80) + .height(40) + .margin({ left: 30, top: 10 }) + .borderRadius(8) + .backgroundColor('#8ce559') + .onClick(() => { + console.log('新增一个步骤文本输入') + }) + } + .alignItems(HorizontalAlign.Start) + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/CookBookDetail.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/CookBookDetail.ets" new file mode 100644 index 0000000000000000000000000000000000000000..4da4f1d732fa4708dbbe61d2fe218ad41645fc1d --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/CookBookDetail.ets" @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2022 LookerSong + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@ohos.router'; + +@Component +struct PageTitle { + private dishName: string = '水煮鸡胸' + @State private isCollected: boolean = false + + build() { + Row() { + Image($r('app.media.back')) + .width(20) + .height(20) + .onClick(() => { + router.back() + }) + Text(this.dishName) + .fontSize(22) + .margin({ left: 20 }) + Blank() + Button(this.isCollected ? '已收藏' : '收藏', { type: ButtonType.Capsule, stateEffect: true }) + .width(80) + .height(40) + .margin({ right: 10 }) + .borderRadius(8) + .backgroundColor(this.isCollected ? '#74cd57' : '#a2a2a2') + .onClick(() => { + this.isCollected = !this.isCollected + }) + } + .padding(12) + .width('100%') + } +} + +@Component +struct UserInfo { + private userIcon: Resource = $r('app.media.icon_customer') + private userName: string = '六星厨师' + @State private isFollowed: boolean = false + + build() { + Row() { + Image(this.userIcon) + .width(50) + .height(50) + Text(this.userName) + .fontSize(18) + .margin({ left: 20 }) + Blank() + Button(this.isFollowed ? '已关注' : '关注', { type: ButtonType.Capsule, stateEffect: true }) + .width(80) + .height(40) + .margin({ right: 10 }) + .borderRadius(8) + .backgroundColor(this.isFollowed ? '#74cd57' : '#a2a2a2') + .onClick(() => { + this.isFollowed = !this.isFollowed + }) + } + .padding(12) + .width('100%') + } +} + +@Component +struct SingleStepper { + private index: number + private operation: string + build() { + Column() { + Text(`第${this.index}步`).fontSize(20).margin(10) + Text(this.operation).fontSize(16).margin({ left: 20, right: 20 }) + } + .alignItems(HorizontalAlign.Start) + } +} + +@Entry +@Component +struct CookingGuide { + private allSteps: Array = [ + '将鸡胸洗净,用温水淹没鸡肉,放入适量白胡椒粉和百里香腌制30~60分钟', + '将鸡肉联通腌制的水一起倒入锅中,开大火盖上锅盖', + '煮五分钟,期间偶尔翻动肉块', + '五分钟后关火,盖好锅盖再闷五分钟', + '将鸡肉捞出盛到碗里,淋上酱油就大功告成', + ] + + build() { + Column() { + Stack() { + Image($r('app.media.dish4')) + PageTitle() + } + .alignContent(Alignment.TopStart) + .width('100%') + .height(200) + UserInfo() + List() { + ForEach(this.allSteps, (item, index) => { + ListItem() { + SingleStepper({ index: index+1, operation: item }) + } + }) + } + } + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/FoodDetail.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/FoodDetail.ets" new file mode 100644 index 0000000000000000000000000000000000000000..dd2ddb7ce7048ac0227459238a4e85c43a2848a0 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/FoodDetail.ets" @@ -0,0 +1,528 @@ +/* + * Copyright (c) 2022 LookerSong + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import curves from '@ohos.curves' +import router from '@ohos.router' +import { CIRCLE_RADIUS } from '../common/Constants' +import { BreakPointType } from '../common/BreakpointSystem' +import { FoodInfo, CategoryId, MealTime, MealTimeId, DietRecord } from '../model/DataModels' +import { getFoodInfo, initDietRecords, getMileTimes , getSortedFoodData} from '../model/DataUtil' + +@Component +struct FoodListItem { + private foodItem: FoodInfo + + build() { + Row() { + Image(this.foodItem.image) + .objectFit(ImageFit.Contain) + .autoResize(false) + .height(40) + .width(40) + .backgroundColor('#FFf1f3f5') + .margin({ right: 16 }) + .borderRadius(6) + Text(this.foodItem.name) + .fontSize(14) + } + .height(64) + .width('100%') + .onClick(() => { + let foodone: FoodInfo = getFoodInfo('foodId') + router.push({ url: 'pages/FoodsContrast', params: { FoodOne: foodone, FoodTwo: this.foodItem }}) + }) + } +} + +@Component +struct ListModeFoods { + private foodItems: FoodInfo[] = getSortedFoodData() + + build() { + Column() { + List() { + ForEach(this.foodItems, (item) => { + ListItem() { + if (item.letter !== undefined) { + FoodListItem({ foodItem: item }) + } else { + Text(item) + .fontSize(14) + .height(48) + .margin({ left: 24 }) + .width('100%') + } + } + }) + } + .layoutWeight(1) + } + .width('100%') + } +} + +@Styles function cardStyle () { + .height('100%') + .padding({ top: 20, right: 20, left: 20 }) + .backgroundColor(Color.White) + .borderRadius(12) +} + +@Component +struct CardTitle { + private title: Resource + private subtitle: Resource + + build() { + Row() { + Text(this.title) + .fontSize(26) + Blank() + Text(this.subtitle) + .fontSize(13) + .fontColor('rgba(0,0,0,0.6)') + } + .width('100%') + .height(26) + } +} + +@Component +struct PageTitle { + private foodName: Resource = $r('app.string.title_food_detail') + @Link showList: boolean + + build() { + Row() { + Image($r('app.media.back')) + .width(20) + .height(20) + .onClick(() => { + router.back() + }) + Text(this.foodName) + .fontSize(22) + .margin({ left: 20 }) + Blank() + Button(this.showList ? $r('app.string.button_foodlist_close') : $r('app.string.button_food_contrast'), { type: ButtonType.Normal, stateEffect: true }) + .width(80) + .height(40) + .margin({ right: 10 }) + .borderRadius(8) + .backgroundColor($r('app.color.theme_color_green')) + .onClick(() => { + this.showList = !this.showList + }) + } + .padding(12) + .width('100%') + } +} + +@Component +struct FoodImageDisplay { + private foodInfo: FoodInfo + @State imageBgColorA: number = 0 + @StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm' + + @Link isEnlarge: boolean + @Link newHeight: number + @State imageHeight: number = 250 + + build() { + Stack({ alignContent: Alignment.BottomStart }) { + Image(this.foodInfo.image) + .sharedTransition(this.foodInfo.letter, { + duration: 400, + curve: curves.cubicBezier(0.2, 0.2, 0.1, 1.0), + delay: 100 + }) + .height(this.imageHeight) + .backgroundColor(`rgba(255, 255, 255, ${this.imageBgColorA})`) + .animation({ duration: 500 }) + .objectFit(ImageFit.Contain) + .onClick(() => { + if (!this.isEnlarge) { + this.isEnlarge = true + this.imageHeight = this.newHeight; + } + }) + .gesture( + PanGesture({ fingers: 1, direction: PanDirection.Down, distance: 10 }) + .onActionEnd(() => { + if (this.isEnlarge) { + this.isEnlarge = false; + this.imageHeight = 250; + } + }) + ) + if (!this.isEnlarge) { + Text(this.foodInfo.name) + .fontSize(26) + .fontWeight(FontWeight.Bold) + .margin({ left: 26, bottom: 18 }) + } + } + .height(this.currentBreakpoint == 'lg' ? 166 : 280) + } +} + +@Component +struct ContentTable { + private foodInfo: FoodInfo + + @Builder IngredientItem(title: Resource, colorValue: string, name: Resource, value: Resource) { + Row() { + Text(title) + .fontSize(18) + .fontWeight(FontWeight.Bold) + .layoutWeight(1) + .align(Alignment.Start) + Row() { + Circle({ width: 6, height: 6 }) + .margin({ right: 12 }) + .fill(colorValue) + Text(name) + .fontSize(18) + Blank() + Text(value) + .fontSize(18) + } + .width('100%') + .layoutWeight(2) + } + .margin({ bottom: 35 }) + } + + build() { + Column() { + this.IngredientItem($r('app.string.diet_record_energy'), '#F54040', $r('app.string.diet_record_calorie'), $r('app.string.calorie_with_kcal_unit', this.foodInfo.calories.toString())) + this.IngredientItem($r('app.string.nutrition_element'), '#CCC', $r('app.string.nutrition_element'), $r('app.string.weight_with_gram_unit', this.foodInfo.protein.toString())) + this.IngredientItem(null, '#F5D640', $r('app.string.diet_record_fat'), $r('app.string.weight_with_gram_unit', this.foodInfo.fat.toString())) + this.IngredientItem(null, '#9E9EFF', $r('app.string.diet_record_carbohydrates'), $r('app.string.weight_with_gram_unit', this.foodInfo.carbohydrates.toString())) + this.IngredientItem(null, '#53F540', $r('app.string.diet_record_vitaminC'), $r('app.string.weight_with_milligram_unit', this.foodInfo.vitaminC.toString())) + } + .cardStyle() + } +} + +@Component +struct CaloriesProgress { + private foodInfo: FoodInfo + private averageCalories: number = 0 + private totalCalories: number = 0 + private highCalories: boolean = false + + aboutToAppear() { + switch (this.foodInfo.categoryId) { + case CategoryId.Vegetable: + this.averageCalories = 26 + break + case CategoryId.Fruit: + this.averageCalories = 60 + break + case CategoryId.Nut: + this.averageCalories = 606 + break + case CategoryId.Seafood: + this.averageCalories = 56 + break + case CategoryId.Dessert: + this.averageCalories = 365 + break + } + this.totalCalories = this.averageCalories * 2 + this.highCalories = this.foodInfo.calories < this.averageCalories + } + + build() { + Column() { + CardTitle({ title: $r('app.string.diet_record_energy'), subtitle: $r('app.string.unit_weight') }) + + Row() { + Text(this.foodInfo.calories.toString()) + .fontColor(this.getCalorieColor()) + .fontSize(65) + Text($r('app.string.calorie_with_kcal_unit', '')) + .fontSize(20) + .margin({ bottom: 10 }) + } + .margin({ top: 25, bottom: 25 }) + .alignItems(VerticalAlign.Bottom) + + Text(this.highCalories ? $r('app.string.high_calorie_food') : $r('app.string.low_calorie_food')) + .fontSize(13) + .fontColor('#313131') + + Progress({ value: this.foodInfo.calories, total: this.totalCalories, style: ProgressStyle.Linear }) + .style({ strokeWidth: 24 }) + .color(this.getCalorieColor()) + .margin({ top: 18 }) + } + .cardStyle() + } + + getCalorieColor() { + return this.highCalories ? $r('app.color.high_calorie') : $r('app.color.low_calorie') + } +} + +class NutritionElement { + element: Resource + weight: number + percent: number + beginAngle: number + endAngle: number + color: string + + constructor(element: Resource, weight: number, color: string) { + this.element = element + this.weight = weight + this.color = color + } +} + +@Component +struct NutritionPieChart { + private foodInfo: FoodInfo + private nutritionElements: NutritionElement[] + private settings: RenderingContextSettings = new RenderingContextSettings(true) + private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings) + + build() { + Column() { + CardTitle({ title: $r('app.string.nutrition_element'), subtitle: $r('app.string.unit_weight') }) + Canvas(this.context) + .height(CIRCLE_RADIUS * 2) + .aspectRatio(1) + .margin({ top: 30, bottom: 32 }) + .onReady(() => { + this.nutritionElements.forEach((item) => { + this.context.beginPath() + this.context.moveTo(CIRCLE_RADIUS, CIRCLE_RADIUS) + this.context.arc(CIRCLE_RADIUS, CIRCLE_RADIUS, CIRCLE_RADIUS, item.beginAngle, item.endAngle) + this.context.fillStyle = item.color + this.context.fill() + }) + }) + Row() { + ForEach(this.nutritionElements, (item: NutritionElement) => { + Row({ space: 4 }) { + Circle({ width: 8, height: 8 }).fill(item.color) + Text(item.element).fontSize(12) + Text($r('app.string.weight_with_gram_unit', item.weight.toString())).fontSize(12) + } + }) + } + .width('100%') + .justifyContent(FlexAlign.SpaceAround) + } + .cardStyle() + } +} + +@Component +struct NutritionPercent { + private foodInfo: FoodInfo + private nutritionElements: NutritionElement[] + + build() { + Column() { + CardTitle({ title: $r('app.string.nutrition_element'), subtitle: $r('app.string.unit_weight') }) + + Row() { + ForEach(this.nutritionElements, (item: NutritionElement) => { + Column() { + Stack({ alignContent: Alignment.Center }) { + Progress({ value: item.percent, type: ProgressType.Ring }) + .style({ strokeWidth: 10 }) + .color(item.color) + .margin(4) + Text(item.percent + '%').fontSize(17) + } + + Text(item.element) + .fontSize(13) + .margin({ top: 24 }) + Text($r('app.string.weight_with_gram_unit', item.weight.toString())) + .fontSize(13) + }.layoutWeight(1) + + }) + } + .width('100%') + .margin({ top: 50 }) + } + .cardStyle() + } +} + +@CustomDialog +struct Record { + private foodInfo: FoodInfo + private controller: CustomDialogController + private select: number = 1 + private mileTime: string[] = getMileTimes() + private foodWeight: string[] = ['25', '50', '100', '150', '200', '250', '300', '350', '400', '450', '500'] + private mealTimeId: MealTimeId = MealTimeId.Lunch + private mealWeight: number = Number(this.foodWeight[this.select]) + + build() { + Column() { + Row({ space: 6 }) { + Column() { + Text(this.foodInfo.name) + .minFontSize(18) + .maxFontSize(30) + .maxLines(1) + Text($r('app.string.calorie_with_kcal_unit', this.foodInfo.calories.toString())) + .fontSize(16) + .fontColor('rgba(0,0,0,0.4)') + .margin({ top: 2 }) + } + .layoutWeight(1) + .justifyContent(FlexAlign.Center) + + TextPicker({ range: this.mileTime, selected: this.select }) + .layoutWeight(1) + .linearGradient({ + angle: 0, + direction: GradientDirection.Top, + colors: [[0xfdfdfd, 0.0], [0xe0e0e0, 0.5], [0xfdfdfd, 1]], + }) + .onChange((value: string, index: number) => { + this.mealTimeId = index + }) + + TextPicker({ range: this.foodWeight, selected: this.select }) + .layoutWeight(1) + .linearGradient({ + angle: 0, + direction: GradientDirection.Top, + colors: [[0xfdfdfd, 0.0], [0xe0e0e0, 0.5], [0xfdfdfd, 1]], + }) + .onChange((value: string) => { + this.mealWeight = Number(value) + }) + } + .height(128) + + Button($r('app.string.button_food_detail_complete'), { type: ButtonType.Capsule, stateEffect: true }) + .height(43) + .width('100%') + .margin({ top: 33, left: 72, right: 72 }) + .backgroundColor($r('app.color.theme_color_green')) + .onClick(() => { + let dietRecordsList = AppStorage.Get>('dietRecords') + if (dietRecordsList == undefined || dietRecordsList.length === 0) { + dietRecordsList = initDietRecords + } + let dietRecordData = new DietRecord(dietRecordsList.length, this.foodInfo.id, new MealTime(this.mealTimeId), this.mealWeight) + dietRecordsList.push(dietRecordData) + AppStorage.SetOrCreate>('dietRecords', dietRecordsList) + this.controller.close() + }) + } + .cardStyle() + .height(254) + .width('90%') + } +} + +@Entry +@Component +struct FoodDetail { + @StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm' + private foodInfo: FoodInfo = getFoodInfo('foodId') + private nutritionElements: NutritionElement[] + dialogController: CustomDialogController = new CustomDialogController({ + builder: Record({ foodInfo: this.foodInfo }), + autoCancel: true, + alignment: DialogAlignment.Bottom, + offset: { dx: 0, dy: -20 }, + customStyle: true + }) + @State isHide: boolean = false + @State windowHeight: number = 250 + @State openContrast: boolean = false + + aboutToAppear() { + let total = this.foodInfo.protein + this.foodInfo.fat + this.foodInfo.carbohydrates + this.nutritionElements = [ + new NutritionElement($r('app.string.diet_record_protein'), this.foodInfo.protein, '#ff9421'), + new NutritionElement($r('app.string.diet_record_fat'), this.foodInfo.fat, '#ffd100'), + new NutritionElement($r('app.string.diet_record_carbohydrates'), this.foodInfo.carbohydrates, '#4cd041') + ] + let lastEndAngle = -0.5 * Math.PI + this.nutritionElements.forEach((value) => { + let percent = value.weight / total + value.percent = Math.round(percent * 100) + value.beginAngle = lastEndAngle + value.endAngle = (percent * 2 * Math.PI) + lastEndAngle + lastEndAngle = value.endAngle + return value + }) + } + + build() { + Stack({ alignContent: Alignment.BottomEnd }) { + Scroll() { + Column() { + PageTitle({ showList: $openContrast }) + FoodImageDisplay({ foodInfo: this.foodInfo, isEnlarge: $isHide, newHeight: $windowHeight }) + if (!this.isHide) { + Swiper() { + ContentTable({ foodInfo: this.foodInfo }) + CaloriesProgress({ foodInfo: this.foodInfo }) + NutritionPercent({ foodInfo: this.foodInfo, nutritionElements: this.nutritionElements }) + NutritionPieChart({ foodInfo: this.foodInfo, nutritionElements: this.nutritionElements }) + } + .indicator(new BreakPointType({ sm: true, md: false, lg: false }).getValue(this.currentBreakpoint)) + .displayCount(new BreakPointType({ sm: 1, md: 2, lg: 3 }).getValue(this.currentBreakpoint)) + .clip(new Rect().width('100%').height('100%').radiusWidth(15).radiusHeight(15)) + .itemSpace(20) + .height(330) + .indicatorStyle({ selectedColor: $r('app.color.theme_color_green') }) + .margin({ top: 10, right: 10, left: 10 }) + + Button($r('app.string.button_food_detail_record'), { type: ButtonType.Capsule, stateEffect: true }) + .height(42) + .width('80%') + .margin({ top: 20 }) + .backgroundColor($r('app.color.theme_color_green')) + .onClick(() => { + this.dialogController.open() + }) + } + } + .alignItems(HorizontalAlign.Center) + .onAreaChange((oldValue: Area, newValue: Area) => { + this.windowHeight = typeof newValue.height === 'number' ? newValue.height : this.windowHeight; + }) + } + .backgroundColor('#EDF2F5') + .height('100%') + .align(Alignment.Top) + + if (this.openContrast) { + ListModeFoods() + .width(180) + .height('90%') + .margin({ top: '10%' }) + .backgroundColor('#fcfcfc') + } + } + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/FoodsContrast.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/FoodsContrast.ets" new file mode 100644 index 0000000000000000000000000000000000000000..447d3b3cf5705b292cac9a4d6be81aa88683eabe --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/FoodsContrast.ets" @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2022 LookerSong + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@ohos.router'; +import { FoodInfo, CategoryId, MealTime, MealTimeId, DietRecord } from '../model/DataModels' +import { getFoodInfo, initDietRecords, getMileTimes , getSortedFoodData} from '../model/DataUtil' +import { mockFoods } from '../mock/MockData'; + +@Component +struct PageTitle { + private titleName: Resource = $r('app.string.title_food_contrast') + + build() { + Row() { + Image($r('app.media.back')) + .width(20) + .height(20) + .onClick(() => { + router.back() + }) + Text(this.titleName) + .fontSize(22) + .margin({ left: 20 }) + } + .padding(12) + .width('100%') + } +} + +@Component +struct OneVsOne { + private imageOne: Resource + private imageTwo: Resource + build() { + Row() { + Image(this.imageOne).width(120).height(120) + Text('VS').fontSize(20).margin({ left: 30, right: 30 }) + Image(this.imageTwo).width(120).height(120) + } + } +} + +@Component +struct CompareItem { + private ValueOne: number = 0 + private ValueTwo: number = 0 + private ElementItem: Resource + build() { + Row() { + Text(this.ValueOne.toString()).layoutWeight(1).fontSize(20).fontColor(this.ValueOne > this.ValueTwo ? '#fe931f' : '#000000') + Text(this.ElementItem).fontSize(20).layoutWeight(1) + Text(this.ValueTwo.toString()).layoutWeight(1).fontSize(20).fontColor(this.ValueTwo > this.ValueOne ? '#fe931f' : '#000000') + } + .margin(20) + } +} + +@Component +struct ContentCompare { + private FoodOne: FoodInfo + private FoodTwo: FoodInfo + + build() { + Column() { + Row() { + Text(this.FoodOne.name).layoutWeight(1).fontSize(24) + Text('营养元素').layoutWeight(1).fontSize(24) + Text(this.FoodTwo.name).layoutWeight(1).fontSize(24) + }.margin({ top: 20, bottom: 30 }) + CompareItem({ ValueOne: this.FoodOne.calories, ElementItem: $r('app.string.diet_record_energy'), ValueTwo: this.FoodTwo.calories }) + CompareItem({ ValueOne: this.FoodOne.protein, ElementItem: $r('app.string.diet_record_protein'), ValueTwo: this.FoodTwo.protein }) + CompareItem({ ValueOne: this.FoodOne.fat, ElementItem: $r('app.string.diet_record_fat'), ValueTwo: this.FoodTwo.fat }) + CompareItem({ ValueOne: this.FoodOne.carbohydrates, ElementItem: $r('app.string.diet_record_carbohydrates'), ValueTwo: this.FoodTwo.carbohydrates }) + CompareItem({ ValueOne: this.FoodOne.vitaminC, ElementItem: $r('app.string.diet_record_vitaminC'), ValueTwo: this.FoodTwo.vitaminC }) + } + } +} + +@Entry +@Component +struct Contrast { + private FoodOne: FoodInfo = getFoodInfo('FoodOne') + private FoodTwo: FoodInfo = getFoodInfo('FoodTwo') + + build() { + Stack() { + Column() { + PageTitle() + OneVsOne({ imageOne: this.FoodOne.image, imageTwo: this.FoodTwo.image }) + ContentCompare({ FoodOne: this.FoodOne, FoodTwo: this.FoodTwo }) + } + } + } +} + + + + + + + diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/Home.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/Home.ets" new file mode 100644 index 0000000000000000000000000000000000000000..02cc80038a6b26dc37acc7124ec00da111236f14 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/Home.ets" @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2022 LookerSong + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@ohos.router' +import curves from '@ohos.curves' +import { BreakpointSystem, BreakPointType } from '../common/BreakpointSystem' +import { FoodInfo, Category } from '../model/DataModels' +import { getFoods, getFoodCategories, getSortedFoodData } from '../model/DataUtil' +import { Records } from './components/DietRecord' +import { CookBook } from './CookBook'; +import { MarketList } from './MarketList'; +import { MessageList } from './Community'; + +@Component +struct FoodListItem { + private foodItem: FoodInfo + + build() { + Navigator({ target: 'pages/FoodDetail' }) { + Row() { + Image(this.foodItem.image) + .objectFit(ImageFit.Contain) + .autoResize(false) + .height(40) + .width(40) + .backgroundColor('#FFf1f3f5') + .margin({ right: 16 }) + .borderRadius(6) + .sharedTransition(this.foodItem.letter, { + duration: 400, + curve: curves.cubicBezier(0.2, 0.2, 0.1, 1.0), + delay: 100 + }) + Text(this.foodItem.name) + .fontSize(14) + Blank() + Text($r('app.string.calorie_with_kcal_unit', this.foodItem.calories.toString())) + .fontSize(14) + } + .height(64) + .width('100%') + } + .params({ foodId: this.foodItem }) + .margin({ right: 24, left: 32 }) + } +} + +@Component +struct ListModeFoods { + private foodItems: FoodInfo[] = getSortedFoodData() + + build() { + Column() { + Text($r("app.string.title_food_list")) + .width('100%') + .height(56) + .padding({ left: 20 }) + .backgroundColor('#FF1f3f5') + .fontSize(20) + + List() { + ForEach(this.foodItems, (item) => { + ListItem() { + if (item.letter !== undefined) { + FoodListItem({ foodItem: item }) + } else { + Text(item) + .fontSize(14) + .height(48) + .margin({ left: 24 }) + .width('100%') + } + } + }) + } + .layoutWeight(1) + } + } +} + +@Component +struct FoodGridItem { + private foodItem: FoodInfo + + build() { + Column() { + Image(this.foodItem.image) + .objectFit(ImageFit.Contain) + .backgroundColor('#f1f3f5') + .height(152) + .sharedTransition(this.foodItem.letter, { + duration: 400, + curve: curves.cubicBezier(0.2, 0.2, 0.1, 1.0), + delay: 100 + }) + Row() { + Text(this.foodItem.name) + .fontSize(14) + Blank() + Text($r('app.string.calorie_with_kcal_unit', this.foodItem.calories.toString())) + .fontSize(14) + .fontColor(0x99000000) + } + .padding({ left: 12, right: 12 }) + .width('100%') + .height(32) + .backgroundColor('#E5E5E5') + } + .height(184) + .clip(new Rect({ width: '100%', height: '100%', radius: 12 })) + .onClick(() => { + router.push({ url: 'pages/FoodDetail', params: { foodId: this.foodItem } }) + }) + } +} + +@Component +struct FoodGrid { + @StorageProp('currentBreakpoint') currentBreakpoint: string = 'md' + private foodItems: FoodInfo[] + + build() { + Grid() { + ForEach(this.foodItems, (item: FoodInfo) => { + GridItem() { + FoodGridItem({ foodItem: item }) + } + }) + } + .columnsTemplate(new BreakPointType({ + sm: '1fr 1fr', + md: '1fr 1fr 1fr', + lg: '1fr 1fr 1fr 1fr' + }).getValue(this.currentBreakpoint)) + .columnsGap(8) + .rowsGap(8) + .padding({ left: 16, right: 16 }) + } +} + +@Component +struct CategoryModeFoods { + @State currentTabIndex: number = 0 + private foodItems: FoodInfo[] = getFoods() + private foodCategories: Category[] = getFoodCategories() + + @Builder tabBarItemBuilder(value: Resource, index: number) { + Text(value) + .fontColor(this.currentTabIndex === index ? 'rgba(0,0,0,0.9)' : 'rgba(0,0,0,0.6)') + .fontSize(this.currentTabIndex === index ? 24 : 18) + .margin({ top: 2 }) + .height(56) + } + + build() { + Tabs() { + TabContent() { + FoodGrid({ foodItems: this.foodItems }) + }.tabBar(this.tabBarItemBuilder($r('app.string.category_all'), 0)) + + ForEach(this.foodCategories, (foodCategory: Category, index) => { + TabContent() { + FoodGrid({ foodItems: this.foodItems.filter(item => (item.categoryId === foodCategory.id)) }) + }.tabBar(this.tabBarItemBuilder(foodCategory.name, index + 1)) + }) + } + .animationDuration(0) + .barMode(BarMode.Scrollable) + .onChange((index) => { + this.currentTabIndex = index + }) + } +} + +@Component +struct FoodsDisplay { + @State isCategoryMode: boolean = true + + build() { + Stack({ alignContent: Alignment.TopEnd }) { + if (this.isCategoryMode) { + CategoryModeFoods() + } else { + ListModeFoods() + } + Row() { + Image($r("app.media.ic_switch")) + .height(24) + .width(24) + .margin({ left: 24, right: 24 }) + } + .height(56) + .backgroundColor(this.isCategoryMode ? Color.White : '#F1F3F5') + .onClick(() => { + this.isCategoryMode = !this.isCategoryMode + }) + } + } +} + +@Entry +@Component +struct Home { + @State currentTabIndex: number = 0 + @StorageProp('currentBreakpoint') currentBreakpoint: string = 'md' + private breakpointSystem: BreakpointSystem = new BreakpointSystem() + + @Builder bottomBarItemBuilder(name: Resource, icon: Resource, index: number) { + Flex({ + direction: new BreakPointType({ + sm: FlexDirection.Column, + md: FlexDirection.Row, + lg: FlexDirection.Column + }).getValue(this.currentBreakpoint), + justifyContent: FlexAlign.Center, + alignItems: ItemAlign.Center + }) { + Image(icon) + .height(24) + .width(24) + .fillColor(this.getTabBarColor(index)) + Text(name) + .margin(new BreakPointType({ + sm: { top: 4 }, + md: { left: 8 }, + lg: { top: 4 } + }).getValue(this.currentBreakpoint)) + .fontSize(11) + .fontColor(this.getTabBarColor(index)) + } + .width('100%') + .height('100%') + } + + aboutToAppear() { + this.breakpointSystem.register() + } + + aboutToDisappear() { + this.breakpointSystem.unregister() + } + + build() { + Tabs({ + barPosition: new BreakPointType({ + sm: BarPosition.End, + md: BarPosition.End, + lg: BarPosition.Start + }).getValue(this.currentBreakpoint) + }) { + TabContent() { + CookBook() + }.tabBar(this.bottomBarItemBuilder($r("app.string.tab_bar_cookbook"), $r("app.media.ic_bottom_cooking"), 0)) + + TabContent() { + FoodsDisplay() + }.tabBar(this.bottomBarItemBuilder($r("app.string.tab_bar_content"), $r("app.media.ic_bottom_content"), 1)) + + TabContent() { + MessageList() + }.tabBar(this.bottomBarItemBuilder($r("app.string.tab_bar_community"), $r("app.media.ic_bottom_community"), 2)) + + TabContent() { + MarketList() + }.tabBar(this.bottomBarItemBuilder($r("app.string.tab_bar_basket"), $r("app.media.ic_bottom_basket"), 3)) + + TabContent() { + Records() + }.tabBar(this.bottomBarItemBuilder($r("app.string.tab_bar_record"), $r("app.media.ic_bottom_record"), 4)) + } + .vertical(new BreakPointType({ sm: false, md: false, lg: true }).getValue(this.currentBreakpoint)) + .barWidth(new BreakPointType({ sm: '100%', md: '100%', lg: '56vp' }).getValue(this.currentBreakpoint)) + .barHeight(new BreakPointType({ sm: '56vp', md: '56vp', lg: '60%' }).getValue(this.currentBreakpoint)) + .animationDuration(0) + .onChange((index) => { + this.currentTabIndex = index + }) + } + + private getTabBarColor(index: number) { + return this.currentTabIndex == index ? $r('app.color.tab_bar_select_color') : $r('app.color.tab_bar_normal_color') + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/Logo.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/Logo.ets" new file mode 100644 index 0000000000000000000000000000000000000000..0ed0251657ee7dd392915021b026efc871cf505f --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/Logo.ets" @@ -0,0 +1,65 @@ +import curves from '@ohos.curves'; +import router from '@ohos.router'; + +@Entry +@Component +struct Logo { + @State opacityValue: number = 0; + @State scaleValue: number = 0; + private rightPath: string = 'M319.5 128.1 c103.5 0 187.5 84 187.5 187.5 v15 a172.5 172.5 0 0 3 -172.5 172.5 H198 a36 36 0 0 3 -13.8 -1 207 207 0 0 0 87 -372 h48.3 z'; + private rightBottomPath: string = 'M270.6 128.1 h48.6 c51.6 0 98.4 21 132.3 54.6 a411 411 0 0 3 -45.6 123 c-25.2 45.6 -56.4 84 -87.6 110.4 a206.1 206.1 0 0 0 -47.7 -288 z'; + + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Shape() { + Path() + .commands('M162 128.7 a222 222 0 0 1 100.8 374.4 H198 a36 36 0 0 3 -36 -36') + .fill(Color.White) + + Path() + .commands(this.rightPath) + .fill('none') + .linearGradient({ angle: 30, colors: [['#c4ffa0', 0], ['#ffffff', 1]] }) + .clip(new Path().commands(this.rightPath)) + + Path() + .commands(this.rightBottomPath) + .fill('none') + .linearGradient({ angle: 50, colors: [['#8cc36a', 0.1], ['#b3eb90', 0.4], ['#ffffff', 0.7]] }) + .clip(new Path().commands(this.rightBottomPath)) + } + .width(210) + .height(210) + .scale({ x: this.scaleValue, y: this.scaleValue }) + .opacity(this.opacityValue) + .onAppear(() => { + animateTo({ + duration: 1000, + curve: curves.cubicBezier(0.4, 0, 1, 1), + delay: 100, + onFinish: () => { + setTimeout(() => { + router.replace({ url: 'pages/Home' }) + }, 1000) + } + }, () => { + this.opacityValue = 1 + this.scaleValue = 1 + }) + }) + + Text($r("app.string.healthy_diet")) + .margin({ top: 300 }) + .fontSize(26) + .fontColor(Color.White) + + Text($r("app.string.logo_description")) + .margin({ top: 4 }) + .fontSize(17) + .fontColor(Color.White) + } + .width('100%') + .height('100%') + .linearGradient({ angle: 180, colors: [['#bde895', 0.1], ['#95de7f', 0.6], ['#7ab967', 1]] }) + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/MarketDetail.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/MarketDetail.ets" new file mode 100644 index 0000000000000000000000000000000000000000..b378757e490d459effb2a81a6c321ee15a70300b --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/MarketDetail.ets" @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2022 LookerSong + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@ohos.router'; +import { TabItem, GoodsItem, getLinkData } from '../model/MarketModels'; + +@Component +struct GoodsList { + @State index: number = 0; + @State requestSuccess: boolean = false; + private tabArray: Array = []; + @Provide private listArray: Array = []; + private scroller: Scroller = new Scroller(); + aboutToAppear() { + setTimeout(() => { + let linkDataItem = getLinkData(); + this.tabArray = linkDataItem.tabArray; + this.listArray = linkDataItem.listArray; + this.requestSuccess = true; + }, 1200) + } + + build() { + Row() { + if (this.requestSuccess) { + Scroll() { + Column() { + ForEach(this.tabArray.map((item1, index1) => { + return { index: index1, data: item1 }; + }), item => { + Text(item.data.typeName) + .width('100%') + .height(60) + .fontColor(0x696969) + .fontSize(14) + .textAlign(TextAlign.Center) + .backgroundColor(this.index === item.index ? 0xffffff : null) + .onClick(() => { + if (this.index !== item.index) { + this.index = item.index; + this.scroller.scrollToIndex(item.data.position); + } + }) + }, item => '' + item.data) + }.height('100%') + }.width(80).height('100%').backgroundColor(0xdddddd).scrollBar(BarState.Off) + + List({ scroller: this.scroller }) { + ForEach(this.listArray, item => { + if (item.tag) { + ListItem() { + Text(item.goodsName) + .width('100%') + .height(40) + .padding({ left: 10 }) + .fontSize(20) + .fontColor(0x696969) + .backgroundColor(0xefefef) + }.sticky(Sticky.Normal) + } else { + ListItem() { + Row() { + Image(item.imageUrl) + .width(90) + .height(90) + .margin(5) + .borderRadius(10) + .objectFit(ImageFit.Cover) + Column() { + Text(item.goodsName) + .fontSize(16) + .fontColor(0x363636) + Row() { + Text(item.price === 0 ? '限量免费' : '¥' + item.price) + .fontSize(14) + .fontColor(0xff6600) + Counter() { + Text('0') + }.margin({ left: 30 }) + .onInc(() => { + console.log('加一') + }) + .onDec(() => { + console.log('减一') + }) + } + .margin({ top: 10 }) + } + .alignItems(HorizontalAlign.Start) + } + } + } + }, item => '' + item) + } + .layoutWeight(1) + .onScrollIndex((firstIndex: number) => { + if (this.index !== this.listArray[firstIndex].index) { + this.index = this.listArray[firstIndex].index + } + }) + } else { + Text('数据加载中……') + .width('100%') + .height('100%') + .textAlign(TextAlign.Center) + } + } + } +} + +@Component +struct MarketInfo { + build() { + Row() { + Column() { + Row() { + Image($r('app.media.icon_back')) + .width(20) + .height(20) + .margin({ right: 10 }) + .onClick(() => { + router.back() + }) + Text('某某超市').fontSize(20) + Text('评分:4.2分').fontSize(12).margin({ left: 20 }) + }.margin({ bottom: 20 }) + Text('节日期间,全场商品九折优惠,购物满200元送鸡蛋一盒').fontSize(14).maxLines(2) + } + .alignItems(HorizontalAlign.Start) + .width('65%') + .margin({ left: 20 }) + Blank() + Image($r('app.media.logo_shop2')) + .width(80) + .height(80) + .margin(10) + .borderRadius(10) + } + .width('100%') + .height(80) + .margin(10) + .borderRadius(10) + } +} + +@Component +struct CommentItem { + build() { + Column() { + Row() { + Image($r('app.media.icon_customer')) + .width(40) + .height(40) + .margin(10) + .borderRadius(20) + .backgroundColor('#fcfcfc') + Column() { + Text('匿名用户').fontSize(16).margin({ bottom: 5 }) + Text('2022-09-24').fontSize(14) + }.alignItems(HorizontalAlign.Start) + Blank() + Image($r('app.media.icon_more')) + .width(20) + .height(20) + .margin({ right: 20 }) + } + .width('100%') + .height(60) + Row() { + Rating({ rating: 4, indicator: true }) + .stars(5) + .stepSize(0.5) + .width(75) + .height(15) + Text('满意度: 比较满意').fontSize(12).margin({ left: 20 }) + } + .height(20) + .margin({ left: 20 }) + Text('经常在这家买东西,水果蔬菜都挺新鲜,只是配送速度有些慢。').fontSize(16).margin(10) + } + .alignItems(HorizontalAlign.Start) + .width('100%') + .borderRadius(10) + .backgroundColor('#e6e6e6') + } +} + +@Component +struct Comment { + build() { + List({ space: 10, initialIndex: 0 }) { + ListItem() { + CommentItem() + } + ListItem() { + CommentItem() + } + ListItem() { + CommentItem() + } + ListItem() { + CommentItem() + } + ListItem() { + CommentItem() + } + ListItem() { + CommentItem() + } + } + .width('100%') + .padding(15) + .alignListItem(ListItemAlign.Center) + } +} + +@Component +struct StoreFront { + build() { + Column({ space: 20 }) { + Row() { + Column() { + Text('某某超市').fontSize(20).margin({ left: 10, top: 10 }) + Row() { + Image($r('app.media.icon_location')).width(20).height(20).margin(10) + Text('广东省惠州市惠城区某某镇某某路5号').fontSize(14).fontColor('#696969') + } + } + .alignItems(HorizontalAlign.Start) + Blank() + Image($r('app.media.icon_call')).width(40).height(40).margin(10) + } + .width('100%').margin({ top: 20 }) + + Column() { + Text('店面环境').fontSize(20).margin({ left: 10, top: 10 }) + Row() { + Image($r('app.media.logo_shop1')) + .width(80) + .height(80) + .margin(10) + .borderRadius(10) + Image($r('app.media.logo_shop2')) + .width(80) + .height(80) + .margin(10) + .borderRadius(10) + Image($r('app.media.logo_shop3')) + .width(80) + .height(80) + .margin(10) + .borderRadius(10) + } + } + .width('100%').alignItems(HorizontalAlign.Start) + Column({ space: 20 }) { + Text('商家信息').fontSize(20).margin({ left: 10, top: 10 }) + Text('商家品类:生鲜超市').fontSize(16).fontColor('#696969').margin({ left: 10 }) + Text('营业时间:周一至周日06:00-22:00').fontSize(16).fontColor('#696969').margin({ left: 10 }) + } + .width('100%').alignItems(HorizontalAlign.Start) + Button('查看本店更多信息', { type: ButtonType.Capsule, stateEffect: false }).opacity(0.5) + .backgroundColor('#317aff').width(200) + } + } +} + +@Component +struct ShopCart { + build() { + Row() { + Image($r('app.media.icon_cart')) + .width(40) + .height(40) + .objectFit(ImageFit.Contain) + .margin({ left: 10, right: 10 }) + Text('¥0') + .fontSize(20) + Blank() + Button() { + Text('提交订单').fontSize(16) + }.width(90).height(30).margin({ right: 10 }).backgroundColor('#4395ff') + } + .width('100%') + .backgroundColor('#fcfcfc') + } +} + +@Entry +@Component +struct Main { + build() { + Column() { + MarketInfo().height('10%') + Tabs() { + TabContent() { + Column() { + GoodsList().height('92%') + ShopCart().height('8%') + } + }.tabBar('全部商品').backgroundColor('#fcfcfc') + TabContent() { + Comment() + }.tabBar('评价').backgroundColor('#fcfcfc') + TabContent() { + StoreFront() + }.tabBar('商家').backgroundColor('#fcfcfc') + } + .height('90%') + .scrollable(false) + .barWidth(280) + .barMode(BarMode.Scrollable) + } + .backgroundColor('#b4f1fe') + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/MarketList.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/MarketList.ets" new file mode 100644 index 0000000000000000000000000000000000000000..e07d624b9440115537eccc571a3c8c2a2e02abd3 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/MarketList.ets" @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2022 LookerSong + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import router from '@ohos.router'; +export type MarketInfo = { + logo: string | Resource + name: string | Resource, + notice: string, + star: number +} + +export let mockMarkets: Array = [ + { logo: $r('app.media.logo_shop1'), name: '某某农贸市场', notice: '品类齐全,欢迎各位前来选购', star: 3.8 }, + { logo: $r('app.media.logo_shop2'), name: '某某超市', notice: '节日期间,全场八折优惠', star: 4.7 }, + { logo: $r('app.media.logo_shop3'), name: '某记士多店', notice: '新店开张,请多关照!', star: 3.5 }, + { logo: $r('app.media.logo_shop1'), name: '某某农贸市场', notice: '品类齐全,欢迎各位前来选购', star: 3.8 }, + { logo: $r('app.media.logo_shop2'), name: '某某超市', notice: '节日期间,全场八折优惠', star: 4.7 }, + { logo: $r('app.media.logo_shop3'), name: '某记士多店', notice: '新店开张,请多关照!', star: 3.5 }, + { logo: $r('app.media.logo_shop1'), name: '某某农贸市场', notice: '品类齐全,欢迎各位前来选购', star: 3.8 }, + { logo: $r('app.media.logo_shop2'), name: '某某超市', notice: '节日期间,全场八折优惠', star: 4.7 }, + { logo: $r('app.media.logo_shop3'), name: '某记士多店', notice: '新店开张,请多关照!', star: 3.5 }, +] + +@Component +struct MarketItem { + private Market: MarketInfo + build() { + Row() { + Image(this.Market.logo) + .width(90) + .height(90) + .borderRadius(10) + .margin({ left: 15, top: 10, bottom: 10 }) + Column() { + Text(this.Market.name).fontSize(20) + Text(this.Market.notice).fontSize(14).margin({ top: 5, bottom: 10 }) + Rating({ rating: this.Market.star, indicator: true }) + .stars(5) + .stepSize(0.5) + .width(100) + .height(20) + } + .margin({ left: 30 }) + .alignItems(HorizontalAlign.Start) + } + .width('100%') + .onClick(() => { + router.push({ + url: 'pages/MarketDetail', +// params: { foodId: this.foodItem } + }) + }) + } +} + +@Entry +@Component +export struct MarketList { + private AllMarkets: Array = mockMarkets + + build() { + Column() { + Text('附近的商家') + .width('100%') + .fontSize(30) + .textAlign(TextAlign.Center) + .backgroundColor('#f2f3f5') + Scroll() { + List() { + ForEach(this.AllMarkets, (item) => { + ListItem() { + MarketItem({ Market: item }) + } + }) + } + }.scrollBar(BarState.Auto) + } + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/components/CustomCounter.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/components/CustomCounter.ets" new file mode 100644 index 0000000000000000000000000000000000000000..4f33451465483d167735b4b4e51fa774e05a6f30 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/components/CustomCounter.ets" @@ -0,0 +1,74 @@ +@Preview +@Component +struct DecIcon { + private click: () => void = undefined + + build() { + Stack() { + Image($r('app.media.icon_sub')) + .width(20) + .height(20) + .objectFit(ImageFit.Contain) + } + .width(20) + .height(20) + .onClick(() => { + this.click() + }) + } +} + +@Preview +@Component +struct IncIcon { + private readonly click: () => void = undefined + build() { + Stack() { + Image($r('app.media.icon_add')) + .width(20) + .height(20) + .objectFit(ImageFit.Contain) + } + .width(20) + .height(20) + .onClick(() => { + this.click() + }) + } +} + +@Component +export struct CustomCounter { + @Prop value: string + private onDec: () => void = undefined + private onInc: () => void = undefined + + build() { + Row() { + DecIcon({ click: this.onDec }) + Text(this.value).margin({ left: 11, right: 11 }) + IncIcon({ click: this.onInc }) + } + } +} + +@Preview +@Entry +@Component +struct PreviewCustomCounter { + @State weight: number = 50 + + build() { + Row() { + CustomCounter({ + value: this.weight + 'g', + onDec: () => { + this.weight -= 50 + }, + onInc: () => { + this.weight += 50 + } + }) + } + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/components/DietRecord.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/components/DietRecord.ets" new file mode 100644 index 0000000000000000000000000000000000000000..96afc02a8f94c11365f64dbfa0118f210c5ac130 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/ets/pages/components/DietRecord.ets" @@ -0,0 +1,356 @@ +import { OneMealStatisticsInfo, MealFoodInfo, DietRecord } from '../../model/DataModels'; +import { statistics, updateDietWeight } from '../../model/DataUtil'; +import { BreakPointType } from '../../common/BreakpointSystem'; +import { CustomCounter } from './CustomCounter'; + +class HistogramLegend { + public color: string + public value: Resource + + constructor(color: string, value: Resource) { + this.color = color + this.value = value + } +} + +function GetColor(value: number): Resource { + if (value / 1000 > 100) { + return $r("app.color.theme_color_orange") + } else { + return $r("app.color.theme_color_green") + } +} + +@Component +struct Histogram { + @Consume('dietData') dietData: Array + @BuilderParam content: any + @BuilderParam legendComponent: any + private title: string | Resource + private legend: HistogramLegend[] + + build() { + Column() { + Text(this.title) + .width('100%') + .height(46) + .textAlign(TextAlign.Start) + .fontSize(24) + .fontColor('#000000') + .fontFamily('HarmonyHeTi-Medium') + + Stack({ alignContent: Alignment.Bottom }) { + Column() { + ForEach(new Array(6), (item) => { + Divider() + .strokeWidth(1) + .color('#d8d8d8') + }) + } + .height('100%') + .margin({ top: 20 }) + .justifyContent(FlexAlign.SpaceBetween) + + Column() { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceEvenly, alignItems: ItemAlign.Start }) { + ForEach(this.dietData, (item: OneMealStatisticsInfo) => { + if (item.mealFoods.length > 1) { + Column() { + this.content(item) + Text(item.mealTime.name).fontSize(14) + .fontColor('#7e7e7e') + .fontFamily('HarmonyHeTi') + .margin({ top: 10 }) + } + .justifyContent(FlexAlign.End) + .height('100%') + } + }) + } + } + .height(236) + } + .height(190) + + Row() { + ForEach(this.legend, item => { + Row() { + Rect({ width: 9, height: 9, radius: 9 }).fill(item.color).margin({ right: 18 }) + this.legendComponent(item) + } + }) + } + .justifyContent(FlexAlign.SpaceEvenly) + .width('100%') + .margin({ top: 70 }) + } + .height('100%') + .padding({ left: 32, right: 32 }) + .borderRadius(12) + .backgroundColor('#ffffff') + } +} + +@Component +struct NutritionHistogramContent { + private legend: HistogramLegend[] = [ + new HistogramLegend('#FFD339', $r("app.string.diet_record_fat")), + new HistogramLegend('#FD9A42', $r("app.string.diet_record_protein")), + new HistogramLegend('#73CD57', $r("app.string.diet_record_carbohydrates")) + ] + + @Builder legendComponent(item: HistogramLegend) { + Text(item.value).fontSize(12).fontColor('#18181a').fontFamily('HarmonyHeTi') + } + + @Builder content(item) { + Column() { + if (item.totalFat > 0) { + Rect({ width: 14, height: item.totalFat / 200 + 14, radius: 7 }).fill('#fd9a42') + .margin({ bottom: -28 }) + .padding({ top: 14 }) + } + if (item.totalProtein > 0) { + Rect({ width: 14, height: item.totalProtein / 200 + 14, radius: 7 }) + .fill('#FBD44E') + .padding({ top: 14 }) + .margin({ bottom: -21 }) + } + if (item.totalCarbohydrates > 0) { + Rect({ width: 14, height: item.totalCarbohydrates / 200 + 14, radius: 7 }).fill('#73CD57') + .padding({ top: 7 }) + .margin({ bottom: -7 }) + } + } + .clip(true) + } + + build() { + Row() { + Histogram({ + title: $r("app.string.nutrition_element"), + content: this.content, + legend: this.legend, + legendComponent: this.legendComponent + }) + } + } +} + +@Component +struct HeatHistogramContent { + private legend: HistogramLegend[] = [ + new HistogramLegend('#FD9A42', $r("app.string.high_calorie")), + new HistogramLegend('#73CD57', $r("app.string.medium_low_calories")), + ] + + @Builder legendComponent(item) { + Text(item.value).fontSize(12).fontColor('#18181a').fontFamily('HarmonyHeTi') + } + + @Builder content(item) { + Column() { + Rect({ width: 14, height: item.totalCalories / 1000 + 14, radius: 14 }) + .fill(GetColor(item.totalCalories)) + .margin({ bottom: -7 }) + .padding({ top: 7 }) + } + .clip(true) + } + + build() { + Row() { + Histogram({ + title: $r("app.string.diet_record_calorie"), + content: this.content, + legend: this.legend, + legendComponent: this.legendComponent + }) + } + } +} + +@Component +struct MealFoodDetail { + @Consume('dataChange') notifyDataChange: number + @State shown: boolean = true + @State translateX: number = 0 + private mealFoodInfo: MealFoodInfo + private panTranslateX: number = 300 + + build() { + if (this.shown) { + if (this.mealFoodInfo.weight != 0) { + Row() { + Row() { + Image(this.mealFoodInfo.image) + .width(50) + .height(50) + Column() { + Text(this.mealFoodInfo.name) + .fontSize(16) + .fontColor('#444444') + .fontFamily('HarmonyHeTi') + .margin({ bottom: 4 }) + Text($r('app.string.calorie_with_kcal_unit', (this.mealFoodInfo.calories / 100).toString())) + .fontSize(11) + .fontColor('#A3A3A3') + .fontFamily('HarmonyHeTi') + } + .alignItems(HorizontalAlign.Start) + + Blank() + CustomCounter({ + // value: this.mealFoodInfo.weight + 'g', + value: this.mealFoodInfo.weight + 'g', + onDec: () => { + if (this.mealFoodInfo.weight > 0) { + this.mealFoodInfo.weight -= 50 + updateDietWeight(this.mealFoodInfo.recordId, this.mealFoodInfo.weight) + this.notifyDataChange++ + } + }, + onInc: () => { + this.mealFoodInfo.weight += 50 + updateDietWeight(this.mealFoodInfo.recordId, this.mealFoodInfo.weight) + this.notifyDataChange++ + } + }) + } + .width('100%') + + Image($r("app.media.ic_public_delete")) + .backgroundColor('#E84026') + .objectFit(ImageFit.ScaleDown) + .borderRadius(20) + .margin({ left: 50 }) + .size({ width: 40, height: 40 }) + .onClick(() => { + animateTo({ duration: 400 }, () => { + this.shown = false + }) + }) + } + .transition({ type: TransitionType.Delete, translate: { x: -350, y: 0 }, opacity: 0 }) + .translate({ x: this.translateX }) + .width('100%') + .height(70) + .gesture( + PanGesture() + .onActionUpdate((event: GestureEvent) => { + if (event.offsetX < 0) { + if (event.offsetX < -100) { + this.translateX = (event.offsetX * Math.exp(-1.848)) - 100 + } else { + this.translateX = event.offsetX + } + } + }) + ) + } + } + } +} + +@Component +struct MealCard { + @ObjectLink mealInfo: OneMealStatisticsInfo + + build() { + Column() { + if (this.mealInfo.mealFoods.length > 1) { + Text(this.mealInfo.mealTime.name) + .fontSize(24) + .fontFamily('HarmonyHeTi-Medium') + .height(56) + .width('100%') + .backgroundColor('#FFFFFF') + .padding({ left: 16, right: 16 }) + + ForEach(this.mealInfo.mealFoods, (mealItem) => { + MealFoodDetail({ mealFoodInfo: mealItem }) + }) + } + } + .backgroundColor(Color.White) + .borderRadius(12) + .padding({ left: 16, right: 16 }) + .margin(12) + } +} + +@Component +struct DietDetails { + @Consume("dietData") dietData: Array + @StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm' + + build() { + Scroll() { + Column() { + Swiper() { + HeatHistogramContent() + NutritionHistogramContent() + } + .itemSpace(12) + .height(400) + .width('100%') + .indicatorStyle({ selectedColor: $r('app.color.theme_color_green') }) + .indicator(new BreakPointType({ sm: true, md: true, lg: false }).getValue(this.currentBreakpoint)) + .displayCount(new BreakPointType({ sm: 1, md: 1, lg: 2 }).getValue(this.currentBreakpoint)) + + ForEach(this.dietData, (item) => { + MealCard({ mealInfo: item }) + }) + } + } + .backgroundColor('#EDF2F5') + } +} + +@Component +struct NoRecord { + build() { + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start }) { + Text($r("app.string.title_record")) + .fontSize(26) + .padding({ left: 26, top: 12 }) + Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Image($r("app.media.norecord")) + .height(130) + .width(130) + Text($r("app.string.no_record_content")) + .fontSize(15) + .fontColor('rgba(0, 0,0,0.4)') + } + .width('100%') + } + .width('100%') + } +} + +@Entry +@Component +export struct Records { + @StorageLink('dietRecords') @Watch('onDataChange') dietRecords: Array = [] + @Provide("dietData") dietStatisticsData: Array = [] + @Provide("dataChange") @Watch('onDataChange') listenDataChange: number = 0 + + onDataChange() { + console.log('onDataChange') + this.dietStatisticsData = statistics() + } + + aboutToAppear() { + this.dietStatisticsData = statistics() + } + + build() { + Column() { + if (this.dietStatisticsData.length === 0) { + NoRecord() + } else { + DietDetails() + } + } + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/module.json5" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/module.json5" new file mode 100644 index 0000000000000000000000000000000000000000..1069f21904e0fcf3c4ce4f124aa66dfd50c999f8 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/module.json5" @@ -0,0 +1,38 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "srcEntrance": "./ets/Application/MyAbilityStage.ts", + "description": "$string:entry_desc", + "mainElement": "MainAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "MainAbility", + "srcEntrance": "./ets/MainAbility/MainAbility.ts", + "description": "$string:MainAbility_desc", + "icon": "$media:icon", + "label": "$string:MainAbility_label", + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:white", + "visible": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/element/color.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/element/color.json" new file mode 100644 index 0000000000000000000000000000000000000000..196ca1a0dc7122514e6c3f90d006c5a405dcc422 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/element/color.json" @@ -0,0 +1,36 @@ +{ + "color": [ + { + "name": "white", + "value": "#FFFFFF" + }, + { + "name": "high_calorie", + "value": "#EE584C" + }, + { + "name": "low_calorie", + "value": "#73CD57" + }, + { + "name": "theme_color_orange", + "value": "#FD9A42" + }, + { + "name": "theme_color_green", + "value": "#73CD57" + }, + { + "name": "theme_color_grey", + "value": "#999999" + }, + { + "name": "tab_bar_select_color", + "value": "#73CD57" + }, + { + "name": "tab_bar_normal_color", + "value": "#999999" + } + ] +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/element/string.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/element/string.json" new file mode 100644 index 0000000000000000000000000000000000000000..490210a3908f47722dc942d49dacc98b97669a5f --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/element/string.json" @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "entry_desc", + "value": "description" + }, + { + "name": "MainAbility_desc", + "value": "description" + }, + { + "name": "MainAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/avocado.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/avocado.png" new file mode 100644 index 0000000000000000000000000000000000000000..a2848b10707f0f4f1c6a661826d822e678b3cceb Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/avocado.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/back.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/back.png" new file mode 100644 index 0000000000000000000000000000000000000000..2b0806c99ba80ca8bd23cf65f0b8eebf01dcb460 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/back.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/blueberry.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/blueberry.png" new file mode 100644 index 0000000000000000000000000000000000000000..a07421e575d4d41e718ace47c16aaba8ac0755ac Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/blueberry.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/crab.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/crab.png" new file mode 100644 index 0000000000000000000000000000000000000000..b71a627013711964e4d5d3b271e9311a2b525f65 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/crab.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/cucumber.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/cucumber.png" new file mode 100644 index 0000000000000000000000000000000000000000..6dd74778e8d76e29a269fdd0155084292504ef61 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/cucumber.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish1.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish1.png" new file mode 100644 index 0000000000000000000000000000000000000000..79bdf5ea51610e43db95d9aa5855ee6867028e6d Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish1.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish2.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish2.png" new file mode 100644 index 0000000000000000000000000000000000000000..ae4e8fb75976026272b75b5fc6e1706926a4d031 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish2.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish3.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish3.png" new file mode 100644 index 0000000000000000000000000000000000000000..37731cd3f02cdb98a0a01f60e4ae5d1b5d63c73d Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish3.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish4.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish4.png" new file mode 100644 index 0000000000000000000000000000000000000000..e1ed277e4b42932446a13c74f43148a83d1cb37b Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/dish4.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_basket.svg" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_basket.svg" new file mode 100644 index 0000000000000000000000000000000000000000..7796a65fa5a34ab6e5106859e5a9895f3e539c44 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_basket.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_community.svg" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_community.svg" new file mode 100644 index 0000000000000000000000000000000000000000..6f18cacda25f360de7ef11521c8d011427f73ef4 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_community.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_content.svg" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_content.svg" new file mode 100644 index 0000000000000000000000000000000000000000..4420a4869a8ebf40851f4147ebbd653b45be8031 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_content.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_cooking.svg" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_cooking.svg" new file mode 100644 index 0000000000000000000000000000000000000000..d176c120b506d822c043ec0dcfe91866a0e7e4ab --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_cooking.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_home.svg" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_home.svg" new file mode 100644 index 0000000000000000000000000000000000000000..c74324a979a1b8ab7237ca210338a679d91db169 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_home.svg" @@ -0,0 +1 @@ + Public/ic_public_home_filled \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_record.svg" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_record.svg" new file mode 100644 index 0000000000000000000000000000000000000000..0ce96909d080b69c5ef26072720f4f2429d0f72b --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_bottom_record.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_public_delete.svg" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_public_delete.svg" new file mode 100644 index 0000000000000000000000000000000000000000..5e69d92bec10119023e8d891648ecce85d6507be --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_public_delete.svg" @@ -0,0 +1,31 @@ + + + Public/ic_public_delete + + + + + + + + + + \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_switch.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_switch.png" new file mode 100644 index 0000000000000000000000000000000000000000..51aa0fc19aeb19ee0599d09f9802fd1f344818ec Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/ic_switch.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icecream.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icecream.png" new file mode 100644 index 0000000000000000000000000000000000000000..13a867424f48674c3e95590ec9887d38cd00fbfd Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icecream.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon.png" new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_add.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_add.png" new file mode 100644 index 0000000000000000000000000000000000000000..c45d639a3d2da4bcfb5d6214216296b0c0c707d8 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_add.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_back.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_back.png" new file mode 100644 index 0000000000000000000000000000000000000000..ee34912236e04de49f16610cb612a7d175403a3c Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_back.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_call.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_call.png" new file mode 100644 index 0000000000000000000000000000000000000000..fc2bc38d0f3a1b88d03c1b3a0b36fc994afdefdb Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_call.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_cart.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_cart.png" new file mode 100644 index 0000000000000000000000000000000000000000..c24f31807ad93ca83f5ba8576280042a4a1b426f Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_cart.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment.png" new file mode 100644 index 0000000000000000000000000000000000000000..8f1b4279911fe2f9bd18d650ad09a3c3b9e7751f Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment_delete.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment_delete.png" new file mode 100644 index 0000000000000000000000000000000000000000..b2f108f7172d4e419e82aafad0a14f6774e7c874 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment_delete.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment_report.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment_report.png" new file mode 100644 index 0000000000000000000000000000000000000000..3901a3c809231e5833a9af2997921f8b96db4c66 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment_report.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment_thumbsup.svg" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment_thumbsup.svg" new file mode 100644 index 0000000000000000000000000000000000000000..2c4aeb81e03e917d6f021d506b5e1f4c5ebc5219 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_comment_thumbsup.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_customer.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_customer.png" new file mode 100644 index 0000000000000000000000000000000000000000..1c749c79a24e02aafbe0c1ee79a8343868c064c2 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_customer.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_location.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_location.png" new file mode 100644 index 0000000000000000000000000000000000000000..bf1c231adbb0de08e9bb76ece049fcf6b9276568 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_location.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_manage.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_manage.png" new file mode 100644 index 0000000000000000000000000000000000000000..a94d49272fecf78b7d72694900a7cdb87d004fde Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_manage.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_more.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_more.png" new file mode 100644 index 0000000000000000000000000000000000000000..b5e11a5494d11b3872109f1b2f8c4f207b1d2d1b Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_more.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_newone.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_newone.png" new file mode 100644 index 0000000000000000000000000000000000000000..865afdf01e55f26ad380196169308c8b141eddb1 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_newone.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_sub.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_sub.png" new file mode 100644 index 0000000000000000000000000000000000000000..721cb66a4d9e566ccd6f9c5df5c8278fcbc1b43b Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_sub.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_upload.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_upload.png" new file mode 100644 index 0000000000000000000000000000000000000000..2e26a3784f17f180a1ea6d87e6d4292abce92814 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/icon_upload.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/kiwi.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/kiwi.png" new file mode 100644 index 0000000000000000000000000000000000000000..f22fb4328a9850ddd526d165964096c1bb9778a7 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/kiwi.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo.png" new file mode 100644 index 0000000000000000000000000000000000000000..826c9813215ecaef36f1900b9ad37c93598181c2 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo_shop1.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo_shop1.png" new file mode 100644 index 0000000000000000000000000000000000000000..0201988a2b39dbed2edc00a32613107eddd55078 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo_shop1.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo_shop2.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo_shop2.png" new file mode 100644 index 0000000000000000000000000000000000000000..6d43cdb7d6d35841b234524026f717669bdfa0ee Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo_shop2.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo_shop3.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo_shop3.png" new file mode 100644 index 0000000000000000000000000000000000000000..157cbddf3ccdd30aa7171f7c380b3d06f6987715 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/logo_shop3.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/mushroom.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/mushroom.png" new file mode 100644 index 0000000000000000000000000000000000000000..3e984ee10df7a0ff4dae4558f17f2c6c7b89075f Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/mushroom.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/norecord.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/norecord.png" new file mode 100644 index 0000000000000000000000000000000000000000..724b2e1a37f43c954e599e64d34e61e3826b8e5e Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/norecord.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/onion.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/onion.png" new file mode 100644 index 0000000000000000000000000000000000000000..9c1c5a81c2ff9717df20fcec6a7a8e128b41f1ee Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/onion.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/pitaya.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/pitaya.png" new file mode 100644 index 0000000000000000000000000000000000000000..2770b34deb402ab0639e861fb83e4c8a5865bf59 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/pitaya.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/strawberry.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/strawberry.png" new file mode 100644 index 0000000000000000000000000000000000000000..a8d239456cdac76fa31e919768151ed6e74cae44 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/strawberry.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/tomato.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/tomato.png" new file mode 100644 index 0000000000000000000000000000000000000000..93ad983d4862485684c34cfcf1632569a13ae5a1 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/tomato.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/walnut.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/walnut.png" new file mode 100644 index 0000000000000000000000000000000000000000..8187a4209586dae8522fb494386cc9d64aba95df Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/media/walnut.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/profile/main_pages.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/profile/main_pages.json" new file mode 100644 index 0000000000000000000000000000000000000000..09b88b6e2fbe4bc3342e7757feb8b7957fb8c745 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/base/profile/main_pages.json" @@ -0,0 +1,15 @@ +{ + "src": [ + "pages/Logo", + "pages/Home", + "pages/FoodDetail", + "pages/FoodsContrast", + "pages/components/DietRecord", + "pages/MarketList", + "pages/MarketDetail", + "pages/CookBook", + "pages/CookBookDetail", + "pages/CookBookCreate", + "pages/Community" + ] +} diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/en_GB/element/string.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/en_GB/element/string.json" new file mode 100644 index 0000000000000000000000000000000000000000..bfd4b977627149ad60e98f4e9460189be3e1e014 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/en_GB/element/string.json" @@ -0,0 +1,220 @@ +{ + "string": [ + { + "name": "healthy_diet", + "value": "Healthy Diet" + }, + { + "name": "logo_description", + "value": "Healthy life comes from a balanced diet" + }, + { + "name": "title_record", + "value": "Record" + }, + { + "name": "no_record_content", + "value": "No record, please return Home page to add." + }, + { + "name": "tab_bar_cookbook", + "value": "CookBook" + }, + { + "name": "tab_bar_content", + "value": "Content" + }, + { + "name": "tab_bar_community", + "value": "Community" + }, + { + "name": "tab_bar_record", + "value": "Records" + }, + { + "name": "tab_bar_basket", + "value": "Store" + }, + { + "name": "category_all", + "value": "All" + }, + { + "name": "category_fruit", + "value": "Fruit" + }, + { + "name": "category_vegetable", + "value": "Vegetable" + }, + { + "name": "category_nut", + "value": "Nut" + }, + { + "name": "category_seafood", + "value": "Seafood" + }, + { + "name": "category_dessert", + "value": "Dessert" + }, + { + "name": "diet_record_energy", + "value": "Energy" + }, + { + "name": "diet_record_calorie", + "value": "Calories" + }, + { + "name": "nutrition_element", + "value": "Nutrition Element" + }, + { + "name": "high_calorie", + "value": "High" + }, + { + "name": "medium_low_calories", + "value": "Medium-Low" + }, + { + "name": "low_calorie", + "value": "Low-Calories" + }, + { + "name": "low_calorie_food", + "value": "Low-Calories" + }, + { + "name": "high_calorie_food", + "value": "High-Calories" + }, + { + "name": "diet_record_fat", + "value": "Fat" + }, + { + "name": "diet_record_protein", + "value": "Protein" + }, + { + "name": "diet_record_vitaminC", + "value": "VitaminC" + }, + { + "name": "diet_record_carbohydrates", + "value": "Carbohydrates" + }, + { + "name": "title_food_detail", + "value": "Food Detail" + }, + { + "name": "button_food_detail_complete", + "value": "Complete" + }, + { + "name": "button_food_detail_record", + "value": "Record" + }, + { + "name": "title_food_list", + "value": "Food List" + }, + { + "name": "meal_time_breakfast", + "value": "Breakfast" + }, + { + "name": "meal_time_lunch", + "value": "Lunch" + }, + { + "name": "meal_time_dinner", + "value": "Dinner" + }, + { + "name": "meal_time_supper", + "value": "Supper" + }, + { + "name": "food_name_tomato", + "value": "Tomato" + }, + { + "name": "food_name_walnut", + "value": "Walnut" + }, + { + "name": "food_name_cucumber", + "value": "Cucumber" + }, + { + "name": "food_name_blueberry", + "value": "Blueberry" + }, + { + "name": "food_name_crab", + "value": "Crab" + }, + { + "name": "food_name_ice_cream", + "value": "IceCream" + }, + { + "name": "food_name_onion", + "value": "Onion" + }, + { + "name": "food_name_mushroom", + "value": "Mushroom" + }, + { + "name": "food_name_kiwi", + "value": "Kiwi" + }, + { + "name": "food_name_pitaya", + "value": "Pitaya" + }, + { + "name": "food_name_avocado", + "value": "Avocado" + }, + { + "name": "food_name_strawberry", + "value": "Strawberry" + }, + { + "name": "unit_weight", + "value": "per 100g" + }, + { + "name": "weight_with_gram_unit", + "value": "%s g" + }, + { + "name": "weight_with_milligram_unit", + "value": "%s mg" + }, + { + "name": "calorie_with_kcal_unit", + "value": "%s kcal" + }, + { + "name": "button_food_contrast", + "value": "Contrast" + }, + { + "name": "button_foodlist_close", + "value": "Close" + }, + { + "name": "title_food_contrast", + "value": "Nutritional Comparison" + } + ] +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/zh_CN/element/string.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/zh_CN/element/string.json" new file mode 100644 index 0000000000000000000000000000000000000000..637a84611f4fb5f621fe8c331870c5d469b591f3 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/main/resources/zh_CN/element/string.json" @@ -0,0 +1,220 @@ +{ + "string": [ + { + "name": "healthy_diet", + "value": "健康饮食" + }, + { + "name": "logo_description", + "value": "健康的生活来自均衡的饮食" + }, + { + "name": "title_record", + "value": "记录" + }, + { + "name": "no_record_content", + "value": "无记录,请返回首页添加." + }, + { + "name": "tab_bar_cookbook", + "value": "食谱" + }, + { + "name": "tab_bar_content", + "value": "营养表" + }, + { + "name": "tab_bar_community", + "value": "圈子" + }, + { + "name": "tab_bar_record", + "value": "记录" + }, + { + "name": "tab_bar_basket", + "value": "菜篮" + }, + { + "name": "category_all", + "value": "所有" + }, + { + "name": "category_fruit", + "value": "水果" + }, + { + "name": "category_vegetable", + "value": "蔬菜" + }, + { + "name": "category_nut", + "value": "坚果" + }, + { + "name": "category_seafood", + "value": "海鲜" + }, + { + "name": "category_dessert", + "value": "甜点" + }, + { + "name": "diet_record_energy", + "value": "热量" + }, + { + "name": "diet_record_calorie", + "value": "卡路里" + }, + { + "name": "nutrition_element", + "value": "营养元素" + }, + { + "name": "high_calorie", + "value": "高热量" + }, + { + "name": "medium_low_calories", + "value": "中低热量" + }, + { + "name": "low_calorie", + "value": "低热量" + }, + { + "name": "low_calorie_food", + "value": "低热量食物" + }, + { + "name": "high_calorie_food", + "value": "高热量食物" + }, + { + "name": "diet_record_fat", + "value": "脂肪" + }, + { + "name": "diet_record_protein", + "value": "蛋白质" + }, + { + "name": "diet_record_vitaminC", + "value": "维他命C" + }, + { + "name": "diet_record_carbohydrates", + "value": "碳水" + }, + { + "name": "title_food_detail", + "value": "食物详情" + }, + { + "name": "button_food_detail_complete", + "value": "完成" + }, + { + "name": "button_food_detail_record", + "value": "记录" + }, + { + "name": "title_food_list", + "value": "食物列表" + }, + { + "name": "meal_time_breakfast", + "value": "早餐" + }, + { + "name": "meal_time_lunch", + "value": "午餐" + }, + { + "name": "meal_time_dinner", + "value": "晚餐" + }, + { + "name": "meal_time_supper", + "value": "夜宵" + }, + { + "name": "food_name_tomato", + "value": "番茄" + }, + { + "name": "food_name_walnut", + "value": "核桃" + }, + { + "name": "food_name_cucumber", + "value": "黄瓜" + }, + { + "name": "food_name_blueberry", + "value": "蓝莓" + }, + { + "name": "food_name_crab", + "value": "螃蟹" + }, + { + "name": "food_name_ice_cream", + "value": "冰激凌" + }, + { + "name": "food_name_onion", + "value": "洋葱" + }, + { + "name": "food_name_mushroom", + "value": "蘑菇" + }, + { + "name": "food_name_kiwi", + "value": "猕猴桃" + }, + { + "name": "food_name_pitaya", + "value": "火龙果" + }, + { + "name": "food_name_avocado", + "value": "牛油果" + }, + { + "name": "food_name_strawberry", + "value": "草莓" + }, + { + "name": "unit_weight", + "value": "每100克" + }, + { + "name": "weight_with_gram_unit", + "value": "%s 克" + }, + { + "name": "weight_with_milligram_unit", + "value": "%s 毫克" + }, + { + "name": "calorie_with_kcal_unit", + "value": "%s 千卡" + }, + { + "name": "button_food_contrast", + "value": "对比" + }, + { + "name": "button_foodlist_close", + "value": "关闭" + }, + { + "name": "title_food_contrast", + "value": "营养对比" + } + ] +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/Application/TestAbilityStage.ts" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/Application/TestAbilityStage.ts" new file mode 100644 index 0000000000000000000000000000000000000000..e68b50ad31acfcaa9b79f8d9dd3706297efdce51 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/Application/TestAbilityStage.ts" @@ -0,0 +1,9 @@ +import hilog from '@ohos.hilog'; +import AbilityStage from "@ohos.application.AbilityStage" + +export default class TestAbilityStage extends AbilityStage { + onCreate() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbilityStage onCreate'); + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/TestAbility/TestAbility.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/TestAbility/TestAbility.ets" new file mode 100644 index 0000000000000000000000000000000000000000..b1a1a7717a0b74e464b0244323d4c3c465703acf --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/TestAbility/TestAbility.ets" @@ -0,0 +1,59 @@ +import hilog from '@ohos.hilog'; +import Ability from '@ohos.application.Ability' +import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry' +import { Hypium } from '@ohos/hypium' +import testsuite from '../test/List.test' +import Window from '@ohos.window' + +export default class TestAbility extends Ability { + onCreate(want, launchParam) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + 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) ?? ''); + var abilityDelegator: any + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + var abilityDelegatorArguments: any + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'start run testcase!!!'); + Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite) + } + + onDestroy() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onDestroy'); + } + + onWindowStageCreate(windowStage: Window.WindowStage) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageCreate'); + windowStage.loadContent('TestAbility/pages/index', (err, data) => { + if (err.code) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.ERROR); + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', + JSON.stringify(data) ?? ''); + }); + + globalThis.abilityContext = this.context; + } + + onWindowStageDestroy() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageDestroy'); + } + + onForeground() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onForeground'); + } + + onBackground() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onBackground'); + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/TestAbility/pages/index.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/TestAbility/pages/index.ets" new file mode 100644 index 0000000000000000000000000000000000000000..954dfe0e29874c9ef11a5ace1673f79e27999864 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/TestAbility/pages/index.ets" @@ -0,0 +1,35 @@ +import hilog from '@ohos.hilog'; + +@Entry +@Component +struct Index { + aboutToAppear() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility index aboutToAppear'); + } + @State message: string = 'Hello World' + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + Button() { + Text('next page') + .fontSize(20) + .fontWeight(FontWeight.Bold) + }.type(ButtonType.Capsule) + .margin({ + top: 20 + }) + .backgroundColor('#0D9FFB') + .width('35%') + .height('5%') + .onClick(()=>{ + }) + } + .width('100%') + } + .height('100%') + } + } \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/TestRunner/OpenHarmonyTestRunner.ts" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/TestRunner/OpenHarmonyTestRunner.ts" new file mode 100644 index 0000000000000000000000000000000000000000..94579b9c1535bc11ee56ee53b48fc90a9977e33a --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/TestRunner/OpenHarmonyTestRunner.ts" @@ -0,0 +1,71 @@ +import hilog from '@ohos.hilog'; +import TestRunner from '@ohos.application.testRunner' +import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry' + +var abilityDelegator = undefined +var abilityDelegatorArguments = undefined + +function translateParamsToString(parameters) { + const keySet = new Set([ + '-s class', '-s notClass', '-s suite', '-s it', + '-s level', '-s testType', '-s size', '-s timeout', + '-s dryRun' + ]) + let targetParams = ''; + for (const key in parameters) { + if (keySet.has(key)) { + targetParams = `${targetParams} ${key} ${parameters[key]}` + } + } + return targetParams.trim() +} + +async function onAbilityCreateCallback() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'onAbilityCreateCallback'); +} + +async function addAbilityMonitorCallback(err: any) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', 'addAbilityMonitorCallback : %{public}s', JSON.stringify(err) ?? ''); +} + +export default class OpenHarmonyTestRunner implements TestRunner { + constructor() { + } + + onPrepare() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner OnPrepare '); + } + + async onRun() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun run'); + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + var testAbilityName = abilityDelegatorArguments.bundleName + '.TestAbility' + let lMonitor = { + abilityName: testAbilityName, + onAbilityCreate: onAbilityCreateCallback, + }; + abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback) + var cmd = 'aa start -d 0 -a TestAbility' + ' -b ' + abilityDelegatorArguments.bundleName + cmd += ' '+translateParamsToString(abilityDelegatorArguments.parameters) + var debug = abilityDelegatorArguments.parameters['-D'] + if (debug == 'true') + { + cmd += ' -D' + } + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', 'cmd : %{public}s', cmd); + abilityDelegator.executeShellCommand(cmd, + (err: any, d: any) => { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', 'executeShellCommand : err : %{public}s', JSON.stringify(err) ?? ''); + hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.stdResult ?? ''); + hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.exitCode ?? ''); + }) + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun end'); + } +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/test/Ability.test.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/test/Ability.test.ets" new file mode 100644 index 0000000000000000000000000000000000000000..460fe8c8c124c821c5451615acc8949f619dbc3f --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/test/Ability.test.ets" @@ -0,0 +1,36 @@ +import hilog from '@ohos.hilog'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium' + +export default function abilityTest() { + describe('ActsAbilityTest', function () { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(function () { + // 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(function () { + // 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(function () { + // 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(function () { + // 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, function () { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + 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) + }) + }) +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/test/List.test.ets" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/test/List.test.ets" new file mode 100644 index 0000000000000000000000000000000000000000..d766fe249dfc3ada636f27e64d9b64451ce32c93 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/ets/test/List.test.ets" @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test' + +export default function testsuite() { + abilityTest() +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/module.json5" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/module.json5" new file mode 100644 index 0000000000000000000000000000000000000000..12ee37445568e17ac80024a39a3da9a283215e61 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/module.json5" @@ -0,0 +1,38 @@ +{ + "module": { + "name": "entry_test", + "type": "feature", + "srcEntrance": "./ets/Application/TestAbilityStage.ts", + "description": "$string:entry_test_desc", + "mainElement": "TestAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:test_pages", + "abilities": [ + { + "name": "TestAbility", + "srcEntrance": "./ets/TestAbility/TestAbility.ets", + "description": "$string:TestAbility_desc", + "icon": "$media:icon", + "label": "$string:TestAbility_label", + "visible": true, + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:white", + "skills": [ + { + "actions": [ + "action.system.home" + ], + "entities": [ + "entity.system.home" + ] + } + ] + } + ] + } +} diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/element/color.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/element/color.json" new file mode 100644 index 0000000000000000000000000000000000000000..1bbc9aa9617e97c45440e1d3d66afc1154837012 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/element/color.json" @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "white", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/element/string.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/element/string.json" new file mode 100644 index 0000000000000000000000000000000000000000..36d4230c53e9f5a07ae343ad8dc9808341975e3b --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/element/string.json" @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "entry_test_desc", + "value": "test ability description" + }, + { + "name": "TestAbility_desc", + "value": "the test ability" + }, + { + "name": "TestAbility_label", + "value": "test label" + } + ] +} \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/media/icon.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/media/icon.png" new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/media/icon.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/profile/test_pages.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/profile/test_pages.json" new file mode 100644 index 0000000000000000000000000000000000000000..fcef82b4dfc18e28106ff9ecd1c8b48ec74d18a4 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/entry/src/ohosTest/resources/base/profile/test_pages.json" @@ -0,0 +1,5 @@ +{ + "src": [ + "TestAbility/pages/index" + ] +} diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/hvigorfile.js" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/hvigorfile.js" new file mode 100644 index 0000000000000000000000000000000000000000..5f2735e3deeaf655828407544bbed9365c258278 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/hvigorfile.js" @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').appTasks \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/package-lock.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/package-lock.json" new file mode 100644 index 0000000000000000000000000000000000000000..94465bbd324a79e0d6bd4b95f071ed51dd37cbfd --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/package-lock.json" @@ -0,0 +1,1226 @@ +{ + "name": "healthydietix", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/hos-sdkmanager-common": { + "version": "1.0.4", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hos-sdkmanager-common/-/@ohos/hos-sdkmanager-common-1.0.4.tgz", + "integrity": "sha512-LWrfF8Js+u54BcEAdyjzsA81iGBA4LPvQdQ1ig/pX6mvTieUPSvtjtAzdI8nnGVmJRLrHwAMHEO/syd9d8UAFw==", + "requires": { + "@ohos/sdkmanager-common": "^1.1.8" + } + }, + "@ohos/hvigor": { + "version": "1.2.2", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.2.2.tgz", + "integrity": "sha512-GfXCf7pDnyEcxWkG7Edd23XPxgym1vY37zdNt/Gj0pZmw0f+FrP+blfCzVWfYQYlI76krzd96+kvD4lgWkIPBQ==", + "requires": { + "@ohos/hvigor-base": "1.2.2", + "fs-extra": "10.0.1", + "interpret": "1.4.0", + "liftoff": "4.0.0", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.0", + "v8flags": "3.2.0", + "yargs": "7.1.2" + } + }, + "@ohos/hvigor-base": { + "version": "1.2.2", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.2.2.tgz", + "integrity": "sha512-omwL/qjTE7DTCQdHZnMKuAxKlH1JOgOxaVAae1ca8j/oPuNgY6Spn+mpYRDHIktvav6axMmHT9zV1hJykY4GEg==", + "requires": { + "fs-extra": "10.0.1", + "json5": "2.2.0", + "log4js": "6.4.1", + "once": "1.4.0", + "pretty-hrtime": "1.0.0" + } + }, + "@ohos/hvigor-ohos-plugin": { + "version": "1.2.2", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.2.2.tgz", + "integrity": "sha512-gir91UxlhMbf2E/NjTYWJGrsNGBKD/1YYbaEdmswD/qW18UDY7jyuqSVyV/gj0h9+iji+gd53rXWzpLLztG5lg==", + "requires": { + "@ohos/hos-sdkmanager-common": "1.0.4", + "@ohos/hvigor-base": "1.2.2", + "@ohos/sdkmanager-common": "1.1.8", + "adm-zip": "0.5.9", + "ajv": "8.10.0", + "execa": "5.1.1", + "fast-xml-parser": "4.0.3", + "fs-extra": "10.0.1", + "glob": "7.2.0", + "iconv-lite": "0.6.3", + "json5": "2.2.0", + "lodash": "4.17.21", + "pretty-hrtime": "1.0.3", + "resolve-package-path": "4.0.3" + }, + "dependencies": { + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==" + } + } + }, + "@ohos/hypium": { + "version": "1.0.2", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hypium/-/@ohos/hypium-1.0.2.tgz", + "integrity": "sha512-HWW62q6hbd0PhvPTH96lo4j//owFwyCLj6Q2jmVLDW6mOt1dwJJwUQ7qUH+Cni/6MmcnyXKvt9I0moGAPK1aCw==" + }, + "@ohos/sdkmanager-common": { + "version": "1.1.8", + "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.8.tgz", + "integrity": "sha512-mxq69+6Zg/ybeQGnOtkBzOTbNBkEdiYehRKWsAD/je53v1W+ahauLqe90pNZEiBuVYugzb6z2EaJtAXYZtE8gQ==" + }, + "adm-zip": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", + "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==" + }, + "ajv": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==" + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "date-format": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.13.tgz", + "integrity": "sha512-bnYCwf8Emc3pTD8pXnre+wfnjGtfi5ncMDKy7+cWZXbmRAsdWkOQHrfC1yz/KiwP5thDp2kCHWYWKBX4HP1hoQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-xml-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.3.tgz", + "integrity": "sha512-xhQbg3a/EYNHwK0cxIG1nZmVkHX/0tWihamn5pU4Mhd9KEVE2ga8ZJiqEUgB2sApElvAATOdMTLjgqIpvYDUkQ==", + "requires": { + "strnum": "^1.0.5" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + } + }, + "flagged-respawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "requires": { + "for-in": "^1.0.1" + } + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "liftoff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log4js": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha512-MaSQenn0f9oxIjtCufclpV00MuYTiHaXPbdcfPIM+quMqoa8cXywjHHx4LhhIAZlXqPWMdcUpYviajfmHtHRJw==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pretty-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", + "integrity": "sha512-CU2l5CYUAptUYq/671ajexQfXuxJFwwg0n243Kdkx8bTjeenedsWgu8TGHPm03vLfNtk3aTXgySKPp3Usykudw==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-package-path": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/resolve-package-path/-/resolve-package-path-4.0.3.tgz", + "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", + "requires": { + "path-root": "^0.1.1" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" + }, + "streamroller": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.2.tgz", + "integrity": "sha512-wZswqzbgGGsXYIrBYhOE0yP+nQ6XRk7xDcYwuQAGTYXdyAUmvgVFE0YU1g5pvQT0m7GBaQfYcSnlHbapuK0H0A==", + "requires": { + "date-format": "^4.0.13", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } +} diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/package.json" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/package.json" new file mode 100644 index 0000000000000000000000000000000000000000..1325702ae3b14e848f69d82cc3147e6349aee8a8 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/HealthyDietIX/package.json" @@ -0,0 +1,17 @@ +{ + "name": "healthydietix", + "version": "1.0.0", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "project" + }, + "description": "example description", + "repository": {}, + "license": "ISC", + "dependencies": { + "@ohos/hypium": "1.0.2", + "@ohos/hvigor": "1.2.2", + "@ohos/hvigor-ohos-plugin": "1.2.2" + } +} diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/README.md" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/README.md" new file mode 100644 index 0000000000000000000000000000000000000000..789800d932296407381dc6eda44d6e1282827156 --- /dev/null +++ "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/README.md" @@ -0,0 +1,59 @@ +# 基于ArkUI的健康生活APP——购食会 + +## 一、项目概述 + +本项目使用最新的API9,基于eTS的声明式语言进行开发。在课程相关案例的基础上进行其它功能页面的开发,除了原先的食物营养详情页,摄入量记录页,还新增了购物页面、食谱页面、仿朋友圈页面,使APP的功能更加丰富。从营养表页面查询某些食物的营养详情,然后在超市购物页面选购需要的食材,再按照食谱页面的指示制作美食,还能在朋友圈与他人交流今天的厨艺心得,记录最近的营养摄入等等。集购物、饮食、以厨会友于一体,因此取名为——购食会。 + +## 二、项目结构 + +项目结构如下图所示: + +![项目结构](resource/%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84.png) + +## 三、实际效果预览 + +- 营养对比页面 + +![营养对比页面](resource/%E8%90%A5%E5%85%BB%E5%AF%B9%E6%AF%94%E9%A1%B5%E9%9D%A2%E6%88%AA%E5%9B%BE.png) + +- 超市购物相关页面 + +![菜篮购物相关页面](resource/%E8%8F%9C%E7%AF%AE%E8%B4%AD%E7%89%A9%E9%A1%B5%E9%9D%A2%E6%88%AA%E5%9B%BE.png) + +- 食谱相关页面 + +![食谱相关页面](resource/%E9%A3%9F%E8%B0%B1%E9%A1%B5%E9%9D%A2%E6%88%AA%E5%9B%BE.png) + +- 美食交流圈页面 + +![美食交流圈页面](resource/%E7%BE%8E%E9%A3%9F%E4%BA%A4%E6%B5%81%E5%9C%88%E9%A1%B5%E9%9D%A2%E6%88%AA%E5%9B%BE.png) + +## 四、主要功能说明 + +### 1、营养对比页面 + +![营养对比动图展示](resource/%E9%A3%9F%E7%89%A9%E8%90%A5%E5%85%BB%E5%AF%B9%E6%AF%94%E9%A1%B5%E9%9D%A2%E5%8A%A8%E5%9B%BE%E5%B1%95%E7%A4%BA.gif) + +在原先营养详情页的基础上增加了一个食物营养对比页面。点击详情页右上角的按钮可以控制食物列表的显隐,点击选中其中某个食物进入营养对比页面,两个食物中哪个的营养元素含量较高则显示为橙色,方便用户比较。 + +### 2、超市购物相关页面 + +![购物相关页面动图展示](resource/%E8%B6%85%E5%B8%82%E8%B4%AD%E7%89%A9%E7%9B%B8%E5%85%B3%E9%A1%B5%E9%9D%A2%E5%8A%A8%E5%9B%BE%E5%B1%95%E7%A4%BA.gif) + +知道了哪些东西有营养就买一些,点击“菜篮”底部页签切换到超市列表,点击进入店内逛逛。左侧的商品类别能够帮助用户更快的找到对应类别的商品,评价显示了在这家店购物过的顾客印象,商家页签则显示了该超市的地址、电话等具体信息。 + +### 3、食谱相关页面 + +![食谱相关页面动图展示](resource/%E9%A3%9F%E8%B0%B1%E7%9B%B8%E5%85%B3%E9%A1%B5%E9%9D%A2%E5%8A%A8%E5%9B%BE%E5%B1%95%E7%A4%BA.gif) + +原材料买到手了,得把这些东西加工后吃进肚子里才能摄入其中的营养。如果不知道怎么做,进入食谱页面照着其他有经验的用户分享的食谱学着做菜,点击收藏和关注持续学习厨艺。如果你本身厨艺还不错,也可以点击悬浮按钮进入食谱编辑页面,把自己拿手好菜的做法分享给大家。 + +### 4、美食交流圈页面 + +![美食交流圈动图展示](resource/%E7%BE%8E%E9%A3%9F%E4%BA%A4%E6%B5%81%E5%9C%88%E9%A1%B5%E9%9D%A2%E5%8A%A8%E5%9B%BE%E5%B1%95%E7%A4%BA.gif) + +除了在食谱页面学习厨艺,也可以在美食交流圈聊些一日三餐的趣事,找到有趣的好友一起交流厨艺心得。 + +## 五、回顾总结 + +本次活动时间比较紧张,平时要忙其它事情,我只能趁着晚上和星期天的时间来写这个项目,做得比较仓促,项目所用的图片素材并不齐全,一些功能也还没有实现。不过通过这段时间的学习,我在实际的项目开发中学到了不少关于eTS开发的知识,现在基本能够使用eTS写几个简单的页面,今后也会继续精进自己的技术。这个项目是我第一次使用eTS开发,多少包含了个人的一些理解,希望能对想要学习的新手提供一点帮助。 \ No newline at end of file diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\347\276\216\351\243\237\344\272\244\346\265\201\345\234\210\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\347\276\216\351\243\237\344\272\244\346\265\201\345\234\210\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" new file mode 100644 index 0000000000000000000000000000000000000000..9b78ed5c28b0f5bc2bc0850cfe25694ec4fc60bb Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\347\276\216\351\243\237\344\272\244\346\265\201\345\234\210\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\347\276\216\351\243\237\344\272\244\346\265\201\345\234\210\351\241\265\351\235\242\346\210\252\345\233\276.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\347\276\216\351\243\237\344\272\244\346\265\201\345\234\210\351\241\265\351\235\242\346\210\252\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..cfdbe458e7492497dde0c1b2db73357b87c65a42 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\347\276\216\351\243\237\344\272\244\346\265\201\345\234\210\351\241\265\351\235\242\346\210\252\345\233\276.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\350\217\234\347\257\256\350\264\255\347\211\251\351\241\265\351\235\242\346\210\252\345\233\276.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\350\217\234\347\257\256\350\264\255\347\211\251\351\241\265\351\235\242\346\210\252\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..c9783c7a6583063c51a9118d6b46c043ff47c461 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\350\217\234\347\257\256\350\264\255\347\211\251\351\241\265\351\235\242\346\210\252\345\233\276.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\350\220\245\345\205\273\345\257\271\346\257\224\351\241\265\351\235\242\346\210\252\345\233\276.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\350\220\245\345\205\273\345\257\271\346\257\224\351\241\265\351\235\242\346\210\252\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..5c2af3fe0cf4ee72a5815cc6774812ea07c2d24a Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\350\220\245\345\205\273\345\257\271\346\257\224\351\241\265\351\235\242\346\210\252\345\233\276.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\350\266\205\345\270\202\350\264\255\347\211\251\347\233\270\345\205\263\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\350\266\205\345\270\202\350\264\255\347\211\251\347\233\270\345\205\263\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" new file mode 100644 index 0000000000000000000000000000000000000000..5ef50a8b28b7abfe628d7ccbb6600a723d0db83f Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\350\266\205\345\270\202\350\264\255\347\211\251\347\233\270\345\205\263\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\241\271\347\233\256\347\273\223\346\236\204.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\241\271\347\233\256\347\273\223\346\236\204.png" new file mode 100644 index 0000000000000000000000000000000000000000..f02c47095d0782841787271902f38318e11b313d Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\241\271\347\233\256\347\273\223\346\236\204.png" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\243\237\347\211\251\350\220\245\345\205\273\345\257\271\346\257\224\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\243\237\347\211\251\350\220\245\345\205\273\345\257\271\346\257\224\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" new file mode 100644 index 0000000000000000000000000000000000000000..dddc6d62ede0312445ce22375cd8c50448dcdf64 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\243\237\347\211\251\350\220\245\345\205\273\345\257\271\346\257\224\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\243\237\350\260\261\347\233\270\345\205\263\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\243\237\350\260\261\347\233\270\345\205\263\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" new file mode 100644 index 0000000000000000000000000000000000000000..5f7e29672c9eb8ec9a0e06b097bfdea504c01ba6 Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\243\237\350\260\261\347\233\270\345\205\263\351\241\265\351\235\242\345\212\250\345\233\276\345\261\225\347\244\272.gif" differ diff --git "a/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\243\237\350\260\261\351\241\265\351\235\242\346\210\252\345\233\276.png" "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\243\237\350\260\261\351\241\265\351\235\242\346\210\252\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..31bf46e7f2a077bb0d210983b4d0143e3a933c0d Binary files /dev/null and "b/2022_ArkUI_Bootcamp/LookerSong-\350\264\255\351\243\237\344\274\232/resource/\351\243\237\350\260\261\351\241\265\351\235\242\346\210\252\345\233\276.png" differ diff --git "a/2022_ArkUI_Bootcamp/\345\215\216\344\270\272\350\264\246\345\217\267+my_ArkUI_project/kenio_zhang_7_7.md" "b/2022_ArkUI_Bootcamp/\345\215\216\344\270\272\350\264\246\345\217\267+my_ArkUI_project/kenio_zhang_7_7.md" deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git "a/2022_ArkUI_Bootcamp/\345\215\216\344\270\272\350\264\246\345\217\267+my_ArkUI_project/my_ArkUI_code/README.md" "b/2022_ArkUI_Bootcamp/\345\215\216\344\270\272\350\264\246\345\217\267+my_ArkUI_project/my_ArkUI_code/README.md" deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000