Browse Source

feat :1.橙宝日志 喂养记录得页面新增。

suwenjiang 1 week ago
parent
commit
4a28185a45
43 changed files with 1735 additions and 1031 deletions
  1. 0 101
      .eslintrc-auto-import.json
  2. 0 97
      .eslintrc.cjs
  3. 0 5
      .husky/commit-msg
  4. 0 5
      .husky/pre-commit
  5. 0 14
      package.json
  6. 0 243
      pnpm-lock.yaml
  7. 3 3
      src/App.vue
  8. 0 25
      src/components/comment/comment.vue
  9. 25 0
      src/components/empty/empty.vue
  10. 40 0
      src/components/feed-wd-popup/data.json
  11. 89 0
      src/components/feed-wd-popup/feed-wd-popup.vue
  12. 44 0
      src/components/feedBnaner/data.json
  13. 26 0
      src/components/feedBnaner/feedBnaner.vue
  14. 53 0
      src/components/item-form/item-form.vue
  15. 250 0
      src/components/item-form/nurse-form.vue
  16. 51 0
      src/components/record-list/record-list.vue
  17. 3 3
      src/layouts/default.vue
  18. 3 3
      src/layouts/tabbar.vue
  19. 2 1
      src/locale/en.json
  20. 4 1
      src/locale/zh-Hans.json
  21. 102 0
      src/pages/babyInfo/babyInfo.vue
  22. 238 0
      src/pages/feed/feed.vue
  23. 284 234
      src/pages/index/index.vue
  24. 0 280
      src/pages/product/details.vue
  25. 33 0
      src/pages/record/data.js
  26. 271 0
      src/pages/record/record.vue
  27. 0 7
      src/static/images/category/collect.svg
  28. 0 3
      src/static/images/category/prefix.svg
  29. 0 3
      src/static/images/category/suffix.svg
  30. 10 0
      src/static/images/empty.svg
  31. 9 0
      src/static/images/index/baby-01.svg
  32. 20 0
      src/static/images/index/baby-02.svg
  33. 17 0
      src/static/images/index/baby-03.svg
  34. 4 0
      src/static/images/index/baby-04.svg
  35. 5 0
      src/static/images/index/baby-05.svg
  36. 14 0
      src/static/images/index/baby-06.svg
  37. 4 0
      src/static/images/index/baby-07.svg
  38. 4 0
      src/static/images/index/fi-rr-arrow-right.svg
  39. 3 0
      src/static/images/index/oval.svg
  40. 0 2
      src/types/auto-import.d.ts
  41. 15 0
      src/utils/index.ts
  42. 108 0
      tailwind.config.js
  43. 1 1
      uno.config.ts

+ 0 - 101
.eslintrc-auto-import.json

@@ -1,101 +0,0 @@
-{
-  "globals": {
-    "Component": true,
-    "ComponentPublicInstance": true,
-    "ComputedRef": true,
-    "EffectScope": true,
-    "ExtractDefaultPropTypes": true,
-    "ExtractPropTypes": true,
-    "ExtractPublicPropTypes": true,
-    "InjectionKey": true,
-    "PropType": true,
-    "Ref": true,
-    "VNode": true,
-    "WritableComputedRef": true,
-    "computed": true,
-    "createApp": true,
-    "customRef": true,
-    "defineAsyncComponent": true,
-    "defineComponent": true,
-    "effectScope": true,
-    "getCurrentInstance": true,
-    "getCurrentScope": true,
-    "h": true,
-    "inject": true,
-    "isProxy": true,
-    "isReactive": true,
-    "isReadonly": true,
-    "isRef": true,
-    "markRaw": true,
-    "nextTick": true,
-    "onActivated": true,
-    "onAddToFavorites": true,
-    "onBackPress": true,
-    "onBeforeMount": true,
-    "onBeforeUnmount": true,
-    "onBeforeUpdate": true,
-    "onDeactivated": true,
-    "onError": true,
-    "onErrorCaptured": true,
-    "onHide": true,
-    "onLaunch": true,
-    "onLoad": true,
-    "onMounted": true,
-    "onNavigationBarButtonTap": true,
-    "onNavigationBarSearchInputChanged": true,
-    "onNavigationBarSearchInputClicked": true,
-    "onNavigationBarSearchInputConfirmed": true,
-    "onNavigationBarSearchInputFocusChanged": true,
-    "onPageNotFound": true,
-    "onPageScroll": true,
-    "onPullDownRefresh": true,
-    "onReachBottom": true,
-    "onReady": true,
-    "onRenderTracked": true,
-    "onRenderTriggered": true,
-    "onResize": true,
-    "onScopeDispose": true,
-    "onServerPrefetch": true,
-    "onShareAppMessage": true,
-    "onShareTimeline": true,
-    "onShow": true,
-    "onTabItemTap": true,
-    "onThemeChange": true,
-    "onUnhandledRejection": true,
-    "onUnload": true,
-    "onUnmounted": true,
-    "onUpdated": true,
-    "provide": true,
-    "reactive": true,
-    "readonly": true,
-    "ref": true,
-    "resolveComponent": true,
-    "shallowReactive": true,
-    "shallowReadonly": true,
-    "shallowRef": true,
-    "toRaw": true,
-    "toRef": true,
-    "toRefs": true,
-    "toValue": true,
-    "triggerRef": true,
-    "unref": true,
-    "useAttrs": true,
-    "useCssModule": true,
-    "useCssVars": true,
-    "useRequest": true,
-    "useSlots": true,
-    "useUpload": true,
-    "useUpload2": true,
-    "watch": true,
-    "watchEffect": true,
-    "watchPostEffect": true,
-    "watchSyncEffect": true,
-    "DirectiveBinding": true,
-    "MaybeRef": true,
-    "MaybeRefOrGetter": true,
-    "onWatcherCleanup": true,
-    "useId": true,
-    "useModel": true,
-    "useTemplateRef": true
-  }
-}

+ 0 - 97
.eslintrc.cjs

@@ -1,97 +0,0 @@
-module.exports = {
-  env: {
-    browser: true,
-    es2021: true,
-    node: true,
-  },
-  extends: [
-    'eslint:recommended',
-    'plugin:@typescript-eslint/recommended',
-    'plugin:vue/vue3-essential',
-    // eslint-plugin-import 插件, @see https://www.npmjs.com/package/eslint-plugin-import
-    'plugin:import/recommended',
-    // eslint-config-airbnb-base 插件 已经改用 eslint-config-standard 插件
-    'standard',
-    // 1. 接入 prettier 的规则
-    'prettier',
-    'plugin:prettier/recommended',
-    './.eslintrc-auto-import.json',
-  ],
-  overrides: [
-    {
-      env: {
-        node: true,
-      },
-      files: ['.eslintrc.{js,cjs}'],
-      parserOptions: {
-        sourceType: 'script',
-      },
-    },
-  ],
-  parserOptions: {
-    ecmaVersion: 'latest',
-    parser: '@typescript-eslint/parser',
-    sourceType: 'module',
-  },
-  plugins: [
-    '@typescript-eslint',
-    'vue',
-    // 2. 加入 prettier 的 eslint 插件
-    'prettier',
-    // eslint-import-resolver-typescript 插件,@see https://www.npmjs.com/package/eslint-import-resolver-typescript
-    'import',
-  ],
-  rules: {
-    // 3. 注意要加上这一句,开启 prettier 自动修复的功能
-    'prettier/prettier': 'error',
-    // turn on errors for missing imports
-    'import/no-unresolved': 'off',
-    // 对后缀的检测,否则 import 一个ts文件也会报错,需要手动添加'.ts', 增加了下面的配置后就不用了
-    'import/extensions': [
-      'error',
-      'ignorePackages',
-      { js: 'never', jsx: 'never', ts: 'never', tsx: 'never' },
-    ],
-    // 只允许1个默认导出,关闭,否则不能随意export xxx
-    'import/prefer-default-export': ['off'],
-    'no-console': ['off'],
-    // 'no-unused-vars': ['off'],
-    // '@typescript-eslint/no-unused-vars': ['off'],
-    // 解决vite.config.ts报错问题
-    'import/no-extraneous-dependencies': 'off',
-    'no-plusplus': 'off',
-    'no-shadow': 'off',
-    'vue/multi-word-component-names': 'off',
-    '@typescript-eslint/no-explicit-any': 'off',
-    'no-underscore-dangle': 'off',
-    'no-use-before-define': 'off',
-    'no-undef': 'off',
-    'no-unused-vars': 'off',
-    'no-param-reassign': 'off',
-    '@typescript-eslint/no-unused-vars': 'off',
-    // 避免 `eslint` 对于 `typescript` 函数重载的误报
-    'no-redeclare': 'off',
-    '@typescript-eslint/no-redeclare': 'error',
-  },
-  // eslint-import-resolver-typescript 插件,@see https://www.npmjs.com/package/eslint-import-resolver-typescript
-  settings: {
-    'import/parsers': {
-      '@typescript-eslint/parser': ['.ts', '.tsx'],
-    },
-    'import/resolver': {
-      typescript: {},
-    },
-  },
-  globals: {
-    $t: true,
-    uni: true,
-    UniApp: true,
-    wx: true,
-    WechatMiniprogram: true,
-    getCurrentPages: true,
-    UniHelper: true,
-    Page: true,
-    App: true,
-    NodeJS: true,
-  },
-}

+ 0 - 5
.husky/commit-msg

@@ -1,5 +0,0 @@
-#!/usr/bin/env sh
-. "$(dirname -- "$0")/_/husky.sh"
-
-# Run the commit-msg hook
-npx --no-install commitlint --edit

+ 0 - 5
.husky/pre-commit

@@ -1,5 +0,0 @@
-#!/usr/bin/env sh
-. "$(dirname -- "$0")/_/husky.sh"
-
-# Run the pre-commit hook
-npx --no-install -- lint-staged

+ 0 - 14
package.json

@@ -17,21 +17,9 @@
     "uvm": "npx @dcloudio/uvm@latest",
     "uvm-rm": "node ./scripts/postupgrade.js",
     "postuvm": "echo upgrade uni-app success!",
-    "prepare": "git init && husky install ",
     "type-check": "vue-tsc --noEmit",
     "cz": "czg"
   },
-  "lint-staged": {
-    "**/*.{html,vue,ts,cjs,json,md}": [
-      "prettier --write"
-    ],
-    "**/*.{vue,js,ts,jsx,tsx}": [
-      "eslint --cache --fix"
-    ],
-    "**/*.{vue,css,scss,html}": [
-      "stylelint --fix"
-    ]
-  },
   "resolutions": {
     "bin-wrapper": "npm:bin-wrapper-china"
   },
@@ -96,8 +84,6 @@
     "eslint-plugin-import": "^2.31.0",
     "eslint-plugin-prettier": "^5.2.1",
     "eslint-plugin-vue": "^9.32.0",
-    "husky": "^8.0.3",
-    "lint-staged": "^15.2.10",
     "postcss": "^8.4.49",
     "postcss-html": "^1.7.0",
     "postcss-scss": "^4.0.9",

+ 0 - 243
pnpm-lock.yaml

@@ -186,12 +186,6 @@ importers:
       eslint-plugin-vue:
         specifier: ^9.32.0
         version: 9.32.0(eslint@8.57.1)
-      husky:
-        specifier: ^8.0.3
-        version: 8.0.3
-      lint-staged:
-        specifier: ^15.2.10
-        version: 15.2.10
       postcss:
         specifier: ^8.4.49
         version: 8.4.49
@@ -2156,18 +2150,10 @@ packages:
     resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
     engines: {node: '>=8'}
 
-  ansi-escapes@7.0.0:
-    resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
-    engines: {node: '>=18'}
-
   ansi-regex@5.0.1:
     resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
     engines: {node: '>=8'}
 
-  ansi-regex@6.1.0:
-    resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
-    engines: {node: '>=12'}
-
   ansi-styles@4.3.0:
     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
     engines: {node: '>=8'}
@@ -2176,10 +2162,6 @@ packages:
     resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
     engines: {node: '>=10'}
 
-  ansi-styles@6.2.1:
-    resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
-    engines: {node: '>=12'}
-
   any-base@1.1.0:
     resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==}
 
@@ -2415,10 +2397,6 @@ packages:
     resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
     engines: {node: '>=10'}
 
-  chalk@5.3.0:
-    resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
-    engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
-
   char-regex@1.0.2:
     resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
     engines: {node: '>=10'}
@@ -2441,14 +2419,6 @@ packages:
   cjs-module-lexer@1.4.1:
     resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==}
 
-  cli-cursor@5.0.0:
-    resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
-    engines: {node: '>=18'}
-
-  cli-truncate@4.0.0:
-    resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
-    engines: {node: '>=18'}
-
   cliui@7.0.4:
     resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
 
@@ -2480,10 +2450,6 @@ packages:
     resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
     engines: {node: '>= 0.8'}
 
-  commander@12.1.0:
-    resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
-    engines: {node: '>=18'}
-
   commander@2.20.3:
     resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
 
@@ -2807,9 +2773,6 @@ packages:
     resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==}
     engines: {node: '>=10'}
 
-  emoji-regex@10.4.0:
-    resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
-
   emoji-regex@8.0.0:
     resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
 
@@ -2833,10 +2796,6 @@ packages:
     resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
     engines: {node: '>=6'}
 
-  environment@1.1.0:
-    resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
-    engines: {node: '>=18'}
-
   error-ex@1.3.2:
     resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
 
@@ -3054,9 +3013,6 @@ packages:
     resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
     engines: {node: '>= 0.6'}
 
-  eventemitter3@5.0.1:
-    resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
-
   execa@5.1.1:
     resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
     engines: {node: '>=10'}
@@ -3220,10 +3176,6 @@ packages:
     resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
     engines: {node: 6.* || 8.* || >= 10.*}
 
-  get-east-asian-width@1.3.0:
-    resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
-    engines: {node: '>=18'}
-
   get-intrinsic@1.2.4:
     resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
     engines: {node: '>= 0.4'}
@@ -3394,11 +3346,6 @@ packages:
     resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
     engines: {node: '>=16.17.0'}
 
-  husky@8.0.3:
-    resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==}
-    engines: {node: '>=14'}
-    hasBin: true
-
   iconv-lite@0.4.24:
     resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
     engines: {node: '>=0.10.0'}
@@ -3528,14 +3475,6 @@ packages:
     resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
     engines: {node: '>=8'}
 
-  is-fullwidth-code-point@4.0.0:
-    resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
-    engines: {node: '>=12'}
-
-  is-fullwidth-code-point@5.0.0:
-    resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
-    engines: {node: '>=18'}
-
   is-function@1.0.2:
     resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==}
 
@@ -3916,10 +3855,6 @@ packages:
     resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
     engines: {node: '>=10'}
 
-  lilconfig@3.1.3:
-    resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
-    engines: {node: '>=14'}
-
   lines-and-columns@1.2.4:
     resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
 
@@ -3927,15 +3862,6 @@ packages:
     resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
 
-  lint-staged@15.2.10:
-    resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==}
-    engines: {node: '>=18.12.0'}
-    hasBin: true
-
-  listr2@8.2.5:
-    resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==}
-    engines: {node: '>=18.0.0'}
-
   load-bmfont@1.4.2:
     resolution: {integrity: sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==}
 
@@ -4008,10 +3934,6 @@ packages:
   lodash@4.17.21:
     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
 
-  log-update@6.1.0:
-    resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
-    engines: {node: '>=18'}
-
   lru-cache@5.1.1:
     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
 
@@ -4112,10 +4034,6 @@ packages:
     resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
     engines: {node: '>=12'}
 
-  mimic-function@5.0.1:
-    resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
-    engines: {node: '>=18'}
-
   min-document@2.19.0:
     resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==}
 
@@ -4284,10 +4202,6 @@ packages:
     resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
     engines: {node: '>=12'}
 
-  onetime@7.0.0:
-    resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
-    engines: {node: '>=18'}
-
   open@8.4.2:
     resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
     engines: {node: '>=12'}
@@ -4410,11 +4324,6 @@ packages:
     resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
     engines: {node: '>=12'}
 
-  pidtree@0.6.0:
-    resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
-    engines: {node: '>=0.10'}
-    hasBin: true
-
   pify@2.3.0:
     resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
     engines: {node: '>=0.10.0'}
@@ -4728,17 +4637,10 @@ packages:
     resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
     hasBin: true
 
-  restore-cursor@5.1.0:
-    resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
-    engines: {node: '>=18'}
-
   reusify@1.0.4:
     resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
     engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
 
-  rfdc@1.4.1:
-    resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
-
   rimraf@3.0.2:
     resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
     deprecated: Rimraf versions prior to v4 are no longer supported
@@ -4865,14 +4767,6 @@ packages:
     resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
     engines: {node: '>=10'}
 
-  slice-ansi@5.0.0:
-    resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
-    engines: {node: '>=12'}
-
-  slice-ansi@7.1.0:
-    resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
-    engines: {node: '>=18'}
-
   source-map-js@1.2.1:
     resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
     engines: {node: '>=0.10.0'}
@@ -4924,10 +4818,6 @@ packages:
   std-env@3.8.0:
     resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==}
 
-  string-argv@0.3.2:
-    resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
-    engines: {node: '>=0.6.19'}
-
   string-hash@1.1.3:
     resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==}
 
@@ -4939,10 +4829,6 @@ packages:
     resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
     engines: {node: '>=8'}
 
-  string-width@7.2.0:
-    resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
-    engines: {node: '>=18'}
-
   string.prototype.trim@1.2.9:
     resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
     engines: {node: '>= 0.4'}
@@ -4961,10 +4847,6 @@ packages:
     resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
     engines: {node: '>=8'}
 
-  strip-ansi@7.1.0:
-    resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
-    engines: {node: '>=12'}
-
   strip-bom@3.0.0:
     resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
     engines: {node: '>=4'}
@@ -5503,10 +5385,6 @@ packages:
     resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
     engines: {node: '>=10'}
 
-  wrap-ansi@9.0.0:
-    resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
-    engines: {node: '>=18'}
-
   wrappy@1.0.2:
     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
 
@@ -5590,11 +5468,6 @@ packages:
     resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
     engines: {node: '>= 6'}
 
-  yaml@2.5.1:
-    resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==}
-    engines: {node: '>= 14'}
-    hasBin: true
-
   yaml@2.6.1:
     resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==}
     engines: {node: '>= 14'}
@@ -8523,22 +8396,14 @@ snapshots:
     dependencies:
       type-fest: 0.21.3
 
-  ansi-escapes@7.0.0:
-    dependencies:
-      environment: 1.1.0
-
   ansi-regex@5.0.1: {}
 
-  ansi-regex@6.1.0: {}
-
   ansi-styles@4.3.0:
     dependencies:
       color-convert: 2.0.1
 
   ansi-styles@5.2.0: {}
 
-  ansi-styles@6.2.1: {}
-
   any-base@1.1.0: {}
 
   anymatch@3.1.3:
@@ -8845,8 +8710,6 @@ snapshots:
       ansi-styles: 4.3.0
       supports-color: 7.2.0
 
-  chalk@5.3.0: {}
-
   char-regex@1.0.2: {}
 
   chokidar@3.6.0:
@@ -8871,15 +8734,6 @@ snapshots:
 
   cjs-module-lexer@1.4.1: {}
 
-  cli-cursor@5.0.0:
-    dependencies:
-      restore-cursor: 5.1.0
-
-  cli-truncate@4.0.0:
-    dependencies:
-      slice-ansi: 5.0.0
-      string-width: 7.2.0
-
   cliui@7.0.4:
     dependencies:
       string-width: 4.2.3
@@ -8910,8 +8764,6 @@ snapshots:
     dependencies:
       delayed-stream: 1.0.0
 
-  commander@12.1.0: {}
-
   commander@2.20.3: {}
 
   commitlint@18.6.1(@types/node@20.17.9)(typescript@5.7.2):
@@ -9184,8 +9036,6 @@ snapshots:
 
   emittery@0.8.1: {}
 
-  emoji-regex@10.4.0: {}
-
   emoji-regex@8.0.0: {}
 
   encodeurl@1.0.2: {}
@@ -9201,8 +9051,6 @@ snapshots:
 
   env-paths@2.2.1: {}
 
-  environment@1.1.0: {}
-
   error-ex@1.3.2:
     dependencies:
       is-arrayish: 0.2.1
@@ -9535,8 +9383,6 @@ snapshots:
 
   etag@1.8.1: {}
 
-  eventemitter3@5.0.1: {}
-
   execa@5.1.1:
     dependencies:
       cross-spawn: 7.0.6
@@ -9741,8 +9587,6 @@ snapshots:
 
   get-caller-file@2.0.5: {}
 
-  get-east-asian-width@1.3.0: {}
-
   get-intrinsic@1.2.4:
     dependencies:
       es-errors: 1.3.0
@@ -9932,8 +9776,6 @@ snapshots:
 
   human-signals@5.0.0: {}
 
-  husky@8.0.3: {}
-
   iconv-lite@0.4.24:
     dependencies:
       safer-buffer: 2.1.2
@@ -10041,12 +9883,6 @@ snapshots:
 
   is-fullwidth-code-point@3.0.0: {}
 
-  is-fullwidth-code-point@4.0.0: {}
-
-  is-fullwidth-code-point@5.0.0:
-    dependencies:
-      get-east-asian-width: 1.3.0
-
   is-function@1.0.2: {}
 
   is-generator-fn@2.1.0: {}
@@ -10644,36 +10480,10 @@ snapshots:
 
   lilconfig@2.1.0: {}
 
-  lilconfig@3.1.3: {}
-
   lines-and-columns@1.2.4: {}
 
   lines-and-columns@2.0.4: {}
 
-  lint-staged@15.2.10:
-    dependencies:
-      chalk: 5.3.0
-      commander: 12.1.0
-      debug: 4.3.7
-      execa: 8.0.1
-      lilconfig: 3.1.3
-      listr2: 8.2.5
-      micromatch: 4.0.8
-      pidtree: 0.6.0
-      string-argv: 0.3.2
-      yaml: 2.5.1
-    transitivePeerDependencies:
-      - supports-color
-
-  listr2@8.2.5:
-    dependencies:
-      cli-truncate: 4.0.0
-      colorette: 2.0.20
-      eventemitter3: 5.0.1
-      log-update: 6.1.0
-      rfdc: 1.4.1
-      wrap-ansi: 9.0.0
-
   load-bmfont@1.4.2:
     dependencies:
       buffer-equal: 0.0.1
@@ -10738,14 +10548,6 @@ snapshots:
 
   lodash@4.17.21: {}
 
-  log-update@6.1.0:
-    dependencies:
-      ansi-escapes: 7.0.0
-      cli-cursor: 5.0.0
-      slice-ansi: 7.1.0
-      strip-ansi: 7.1.0
-      wrap-ansi: 9.0.0
-
   lru-cache@5.1.1:
     dependencies:
       yallist: 3.1.1
@@ -10827,8 +10629,6 @@ snapshots:
 
   mimic-fn@4.0.0: {}
 
-  mimic-function@5.0.1: {}
-
   min-document@2.19.0:
     dependencies:
       dom-walk: 0.1.2
@@ -10998,10 +10798,6 @@ snapshots:
     dependencies:
       mimic-fn: 4.0.0
 
-  onetime@7.0.0:
-    dependencies:
-      mimic-function: 5.0.1
-
   open@8.4.2:
     dependencies:
       define-lazy-prop: 2.0.0
@@ -11113,8 +10909,6 @@ snapshots:
 
   picomatch@4.0.2: {}
 
-  pidtree@0.6.0: {}
-
   pify@2.3.0: {}
 
   pinia-plugin-persistedstate@3.2.1(pinia@2.0.36(typescript@5.7.2)(vue@3.4.21(typescript@5.7.2))):
@@ -11413,15 +11207,8 @@ snapshots:
       path-parse: 1.0.7
       supports-preserve-symlinks-flag: 1.0.0
 
-  restore-cursor@5.1.0:
-    dependencies:
-      onetime: 7.0.0
-      signal-exit: 4.1.0
-
   reusify@1.0.4: {}
 
-  rfdc@1.4.1: {}
-
   rimraf@3.0.2:
     dependencies:
       glob: 7.2.3
@@ -11584,16 +11371,6 @@ snapshots:
       astral-regex: 2.0.0
       is-fullwidth-code-point: 3.0.0
 
-  slice-ansi@5.0.0:
-    dependencies:
-      ansi-styles: 6.2.1
-      is-fullwidth-code-point: 4.0.0
-
-  slice-ansi@7.1.0:
-    dependencies:
-      ansi-styles: 6.2.1
-      is-fullwidth-code-point: 5.0.0
-
   source-map-js@1.2.1: {}
 
   source-map-support@0.5.21:
@@ -11637,8 +11414,6 @@ snapshots:
 
   std-env@3.8.0: {}
 
-  string-argv@0.3.2: {}
-
   string-hash@1.1.3: {}
 
   string-length@4.0.2:
@@ -11652,12 +11427,6 @@ snapshots:
       is-fullwidth-code-point: 3.0.0
       strip-ansi: 6.0.1
 
-  string-width@7.2.0:
-    dependencies:
-      emoji-regex: 10.4.0
-      get-east-asian-width: 1.3.0
-      strip-ansi: 7.1.0
-
   string.prototype.trim@1.2.9:
     dependencies:
       call-bind: 1.0.7
@@ -11685,10 +11454,6 @@ snapshots:
     dependencies:
       ansi-regex: 5.0.1
 
-  strip-ansi@7.1.0:
-    dependencies:
-      ansi-regex: 6.1.0
-
   strip-bom@3.0.0: {}
 
   strip-bom@4.0.0: {}
@@ -12309,12 +12074,6 @@ snapshots:
       string-width: 4.2.3
       strip-ansi: 6.0.1
 
-  wrap-ansi@9.0.0:
-    dependencies:
-      ansi-styles: 6.2.1
-      string-width: 7.2.0
-      strip-ansi: 7.1.0
-
   wrappy@1.0.2: {}
 
   write-file-atomic@3.0.3:
@@ -12369,8 +12128,6 @@ snapshots:
 
   yaml@1.10.2: {}
 
-  yaml@2.5.1: {}
-
   yaml@2.6.1: {}
 
   yargs-parser@20.2.9: {}

+ 3 - 3
src/App.vue

@@ -3,9 +3,9 @@
   import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'
   import i18n from './locale'
 
-  onLaunch(() => {
-    console.log('App Launch')
-  })
+  // onLaunch((ad) => {
+  //   console.log(ad, 'App Launch')
+  // })
   onShow(() => {
     console.log('App Show')
   })

+ 0 - 25
src/components/comment/comment.vue

@@ -1,25 +0,0 @@
-<template>
-  <view class="hot-tags-container">
-    评论
-    <!-- <view
-      class="hot-tag-item"
-      v-for="(tag, i) in tags"
-      :class="{ active: currentTag === i }"
-      @click="currentTag = i"
-      :key="tag"
-    >
-      {{ tag }}
-    </view> -->
-  </view>
-</template>
-
-<script lang="ts" setup>
-  defineOptions({
-    name: 'Comment',
-  })
-
-  const currentTag = defineModel<number>('currentTag')
-  const tags = ref<string[]>(['All', 'Shoes', 'Fast Food', 'Snack', 'Clothing'])
-</script>
-
-<style lang="scss" scoped></style>

+ 25 - 0
src/components/empty/empty.vue

@@ -0,0 +1,25 @@
+<template>
+  <view :class="top">
+    <wd-status-tip :image="image" :tip="tip" />
+  </view>
+</template>
+
+<script lang="ts" setup>
+  import image from '@img/empty.svg'
+  defineOptions({
+    name: 'Empty',
+  })
+
+  defineProps({
+    tip: {
+      type: String,
+      default: '',
+    },
+    top: {
+      type: String,
+      default: '',
+    },
+  })
+</script>
+
+<style lang="scss" scoped></style>

+ 40 - 0
src/components/feed-wd-popup/data.json

@@ -0,0 +1,40 @@
+[
+  {
+    "id": "01",
+    "title": "喂奶",
+    "type": 1
+  },
+  {
+    "id": "01",
+    "title": "睡眠 ",
+    "type": 4
+  },
+  {
+    "id": "01",
+    "title": "尿布",
+    "type": 3
+  },
+
+  {
+    "id": "01",
+    "title": "辅食",
+    "type": 2
+  },
+  {
+    "id": "01",
+    "title": "吸奶",
+    "type": 5
+  },
+  {
+    "id": "01",
+
+    "title": "洗澡",
+    "type": 6
+  },
+  {
+    "id": "01",
+
+    "title": "游泳",
+    "type": 7
+  }
+]

+ 89 - 0
src/components/feed-wd-popup/feed-wd-popup.vue

@@ -0,0 +1,89 @@
+<template>
+  <!-- <wd-action-sheet v-model="show" safe-area-inset-bottom title=" " @close="show = !show">
+    <view class="box-border py-16 px-6">
+      <view class="grid grid-cols-4 gap-6">
+        <view
+          v-for="(item, index) in dataList"
+          :key="item.id + index"
+          class="flex flex-col items-center"
+          @click="goToPage(item?.type)"
+        >
+          <view class="w-16 h-16 rounded-2xl overflow-hidden mb-2">
+            <image
+              :src="item?.img"
+              :alt="item?.title"
+              class="w-full h-full object-cover"
+              mode="scaleToFill"
+            />
+          </view>
+          <span class="text-sm text-gray-600">{{ item.title }}</span>
+        </view>
+      </view>
+    </view>
+  </wd-action-sheet> -->
+  <wd-popup
+    v-model="show"
+    position="bottom"
+    closable
+    custom-style="height: 720rpx;border-radius: 16rpx "
+    @close="show = !show"
+  >
+    <view class="box-border py-16 px-6">
+      <view class="grid grid-cols-4 gap-6">
+        <view
+          v-for="(item, index) in dataList"
+          :key="item.id + index"
+          class="flex flex-col items-center"
+          @click="goToPage(item?.type)"
+        >
+          <view class="w-16 h-16 rounded-2xl overflow-hidden mb-2">
+            <image
+              :src="item?.img"
+              :alt="item?.title"
+              class="w-full h-full object-cover"
+              mode="scaleToFill"
+            />
+          </view>
+          <span class="text-sm text-gray-600">{{ item.title }}</span>
+        </view>
+      </view>
+    </view>
+  </wd-popup>
+</template>
+
+<script setup>
+  import baby01 from '@img/index/baby-01.svg'
+  import baby02 from '@img/index/baby-02.svg'
+  import baby03 from '@img/index/baby-03.svg'
+  import baby04 from '@img/index/baby-04.svg'
+  import baby05 from '@img/index/baby-05.svg'
+  import baby06 from '@img/index/baby-06.svg'
+  import baby07 from '@img/index/baby-07.svg'
+  defineOptions({
+    name: 'FeedWdPopup',
+  })
+
+  const list = [baby01, baby03, baby04, baby02, baby05, baby06, baby07]
+  import data from './data.json'
+  const show = defineModel('show')
+  const dataList = ref([])
+  function getList() {
+    dataList.value = data.map((item, index) => ({
+      ...item,
+      img: list[index],
+    }))
+  }
+
+  function goToPage(type) {
+    // console.log(type, '44')
+
+    uni.navigateTo({
+      url: `/pages/record/record?type=${type}`,
+    })
+  }
+  onMounted(() => {
+    getList()
+  })
+</script>
+
+<style lang="scss" scoped></style>

+ 44 - 0
src/components/feedBnaner/data.json

@@ -0,0 +1,44 @@
+[
+  {
+    "id": "01",
+    "number": 6,
+    "title": "喂奶",
+    "subTitle": "100ml"
+  },
+  {
+    "id": "01",
+    "number": 6,
+    "title": "喂奶",
+    "subTitle": ""
+  },
+  {
+    "id": "01",
+    "number": 6,
+    "title": "喂奶",
+    "subTitle": "100ml"
+  },
+  {
+    "id": "01",
+    "number": 6,
+    "title": "喂奶",
+    "subTitle": "100ml"
+  },
+  {
+    "id": "01",
+    "number": 6,
+    "title": "喂奶",
+    "subTitle": "100ml"
+  },
+  {
+    "id": "01",
+    "number": 6,
+    "title": "喂奶",
+    "subTitle": "100ml"
+  },
+  {
+    "id": "01",
+    "number": 6,
+    "title": "喂奶",
+    "subTitle": "100ml"
+  }
+]

+ 26 - 0
src/components/feedBnaner/feedBnaner.vue

@@ -0,0 +1,26 @@
+<template>
+  <view class="mt-2 bg-white pb-3 overflow-y-auto">
+    <view class="box-border w-160 grid grid-cols-7 gap-4 px-4">
+      <view v-for="(item, index) in dataList" :key="item.id + index" class="text-center">
+        <view class="text-lg font-semibold text-gray-800">{{ item.number }}</view>
+        <view class="text-sm text-gray-800 mt-1">{{ item.title }}</view>
+        <view class="text-xs text-gray-500 mt-1">{{ item?.subTitle }}</view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+  defineOptions({
+    name: 'FeedBnaner',
+  })
+  import data from './data.json'
+  defineProps({
+    dataList: {
+      type: Array,
+      default: data,
+    },
+  })
+</script>
+
+<style lang="scss" scoped></style>

+ 53 - 0
src/components/item-form/item-form.vue

@@ -0,0 +1,53 @@
+<template>
+  <view class="w-full bg-white box-border py-[32rpx]" :class="classes">
+    <view
+      class="w-full box-border px-3 flex justify-between items-center text-base text-[#333]"
+      :class="labelClass"
+    >
+      <view>
+        <span v-if="required && !requiredRight" class="text-[#FB4848]">*</span>
+        {{ label }}
+        <span v-if="required && requiredRight" class="text-[#FB4848]">*</span>
+      </view>
+      <slot name="value" />
+    </view>
+    <slot name="default" />
+  </view>
+  <view v-if="border" style="border-bottom: 2rpx solid #f2f2f2" class="ml-3"></view>
+</template>
+
+<script setup>
+  defineOptions({
+    name: 'ItemForm',
+  })
+
+  defineProps({
+    classes: {
+      type: String,
+      default: '',
+    },
+    label: {
+      type: String,
+      default: '',
+    },
+    labelClass: {
+      type: String,
+      default: '',
+    },
+    required: {
+      type: Boolean,
+      default: false,
+    },
+    requiredRight: {
+      type: Boolean,
+      default: false,
+    },
+
+    border: {
+      type: Boolean,
+      default: true,
+    },
+  })
+</script>
+
+<style lang="scss" scoped></style>

+ 250 - 0
src/components/item-form/nurse-form.vue

@@ -0,0 +1,250 @@
+<template>
+  <template v-if="type == 1">
+    <ItemForm label="喂奶方式">
+      <template #default>
+        <wd-select-picker
+          type="radio"
+          title="喂奶方式"
+          v-model="nurseMethod"
+          :columns="feedMethodList"
+          @confirm="handleConfirm2"
+        ></wd-select-picker>
+      </template>
+    </ItemForm>
+
+    <ItemForm v-if="nurseMethod != 1" label="喂奶量">
+      <template #default>
+        <wd-input
+          no-border
+          type="number"
+          placeholder="请填写"
+          size="large"
+          maxlength="30"
+          v-model="nurseAmount"
+        >
+          <!--    @input="handleChange" -->
+          <template #suffix>ml</template>
+        </wd-input>
+        <view v-if="nurseAmountList.length" class="px-3 pt-3 flex justify-start">
+          <view
+            v-for="item in nurseAmountList"
+            :key="item"
+            @click="nurseAmount = item"
+            class="box-border py-[4rpx] px-2 text-xs bg-[#F3F3F3] mr-2 rounded-full"
+          >
+            {{ item }}
+          </view>
+        </view>
+      </template>
+    </ItemForm>
+  </template>
+
+  <template v-if="type != 2 && type != 3 && type != 4">
+    <ItemForm label="开始时间">
+      <template #default>
+        <wd-calendar
+          type="datetime"
+          v-model="startTime"
+          title="时间"
+          hide-second
+          @confirm="handleConfirmTime"
+          :time-filter="timeFilter"
+        />
+      </template>
+    </ItemForm>
+
+    <ItemForm label="结束时间">
+      <template #default>
+        <wd-calendar type="datetime" v-model="endTime" title="时间" />
+      </template>
+    </ItemForm>
+  </template>
+
+  <template v-if="type == 2">
+    <ItemForm label="辅食名称">
+      <template #default>
+        <wd-input
+          no-border
+          type="number"
+          placeholder="请填写"
+          size="large"
+          maxlength="30"
+          v-model="complementaryName"
+        >
+          <!--    @input="handleChange" -->
+        </wd-input>
+        <view v-if="nurseAmountList.length" class="px-3 pt-3 flex justify-start">
+          <view
+            v-for="item in nurseAmountList"
+            :key="item"
+            @click="complementaryName = item"
+            class="box-border py-[4rpx] px-2 text-xs bg-[#F3F3F3] mr-2 rounded-full"
+          >
+            {{ item }}
+          </view>
+        </view>
+      </template>
+    </ItemForm>
+
+    <ItemForm label="辅食时间">
+      <template #default>
+        <wd-calendar
+          type="datetime"
+          v-model="startTime"
+          title="时间"
+          hide-second
+          @confirm="handleConfirmTime"
+          :time-filter="timeFilter"
+        />
+      </template>
+    </ItemForm>
+  </template>
+
+  <template v-if="type == 3">
+    <ItemForm label="更换时间">
+      <template #default>
+        <wd-calendar
+          type="datetime"
+          v-model="startTime"
+          title="时间"
+          hide-second
+          @confirm="handleConfirmTime"
+          :time-filter="timeFilter"
+        />
+      </template>
+    </ItemForm>
+    <ItemForm label="有无便便">
+      <template #default>
+        <wd-select-picker
+          type="radio"
+          title="排便"
+          v-model="hasStool"
+          :columns="cacationList"
+          @confirm="handleConfirm2"
+        ></wd-select-picker>
+      </template>
+    </ItemForm>
+  </template>
+
+  <template v-if="type == 4">
+    <ItemForm label="入睡时间">
+      <template #default>
+        <wd-calendar
+          type="datetime"
+          v-model="startTime"
+          title="时间"
+          hide-second
+          @confirm="handleConfirmTime"
+          :time-filter="timeFilter"
+        />
+      </template>
+    </ItemForm>
+
+    <ItemForm label="睡醒时间">
+      <template #default>
+        <wd-calendar type="datetime" v-model="endTime" title="时间" />
+      </template>
+    </ItemForm>
+  </template>
+
+  <template v-if="type == 5">
+    <ItemForm label="吸奶量">
+      <template #default>
+        <wd-input
+          no-border
+          type="number"
+          placeholder="请填写"
+          size="large"
+          maxlength="30"
+          v-model="milkOutput"
+        >
+          <!--    @input="handleChange" -->
+          <template #suffix>ml</template>
+        </wd-input>
+        <view v-if="nurseAmountList.length" class="px-3 pt-3 flex justify-start">
+          <view
+            v-for="item in nurseAmountList"
+            :key="item"
+            @click="milkOutput = item"
+            class="box-border py-[4rpx] px-2 text-xs bg-[#F3F3F3] mr-2 rounded-full"
+          >
+            {{ item }}
+          </view>
+        </view>
+      </template>
+    </ItemForm>
+  </template>
+</template>
+
+<script setup>
+  import { formattedDate } from '@/utils'
+  import { feedMethodList, cacationList } from '@/pages/record/data.js'
+  import ItemForm from './item-form.vue'
+  defineOptions({
+    name: 'NurseForm',
+  })
+
+  const type = defineModel('type')
+  const nurseMethod = defineModel('nurseMethod')
+  const nurseAmount = defineModel('nurseAmount')
+  const startTime = defineModel('startTime')
+
+  const endTime = defineModel('endTime')
+  const complementaryName = defineModel('complementaryName')
+  const milkOutput = defineModel('milkOutput')
+  const hasStool = defineModel('hasStool')
+  // 获取喂奶量的历史记录的请求
+  const nurseAmountList = ref([])
+  function getNurseAmountList() {
+    // 得传type 1 喂奶  2辅食 5 吸奶
+    let data = []
+
+    if (type.value == 2) {
+      data = ['小米粥', '小米粥', '小米粥', '小米粥', '小米粥']
+    } else {
+      data = [50, 100, 200, 300, 600]
+    }
+
+    nurseAmountList.value = data
+  }
+
+  function handleConfirm2({ value }) {
+    if (value != 1 && type.value == 1) getNurseAmountList()
+    if (type.value == 1) nurseMethod.value = value
+    if (type.value == 3) hasStool.value = value
+  }
+  function handleConfirmTime({ value, type }) {
+    //  formattedDate(value)
+    startTime.value = value
+  }
+
+  function timeFilter({ type, values }) {
+    if (type === 'minute') {
+      // 只展示 0,10,20,30,40,50 分钟选项
+      return values.filter((item) => {
+        return item
+      })
+    }
+    return values
+  }
+
+  watch(
+    type,
+    (newVal) => {
+      if (newVal == 2 || newVal == 5) {
+        getNurseAmountList()
+      }
+    },
+    {
+      deep: true,
+      immediate: true,
+    },
+  )
+
+  // function handleChange({ value }) {
+  //   // 请求添加到历史记录的事件
+  //   console.log(value, '555')
+  // }
+</script>
+
+<style lang="scss" scoped></style>

+ 51 - 0
src/components/record-list/record-list.vue

@@ -0,0 +1,51 @@
+<template>
+  <view class="w-full mt-2 bg-white px-4">
+    <view
+      v-for="(item, index) in dataList"
+      :key="index"
+      class="w-full box-border py-4 last:border-b-0"
+    >
+      <view class="flex justify-between items-center">
+        <view style="border: 1px solid red" @click.stop="goToPage(item)">
+          <view class="text-xs text-gray-400">
+            <image class="w-[20rpx] h-[20rpx]" :src="oval" mode="widthFix" />
+            {{ item.time }}
+          </view>
+          <view class="mt-1 text-gray-800">{{ item.title }}</view>
+          <view class="mt-1 text-xs text-gray-500 line-clamp-1">
+            {{ item?.desc ? item?.desc : '无备注' }}
+            asdjaghjsdhgajsdgajhsdgahsdghsgdasdgajshgggggggggg
+          </view>
+          <view v-if="item?.recorder" class="mt-1 text-xs text-gray-400">
+            记录者:{{ item?.recorder }}
+          </view>
+        </view>
+        <view v-if="item?.image" class="ml-4">
+          <img :src="item?.image" class="w-16 h-16 rounded-lg object-cover" alt="记录图片" />
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+  import oval from '@img/index/oval.svg'
+  defineOptions({
+    name: 'Recordlist',
+  })
+
+  defineProps({
+    dataList: {
+      type: Array,
+      default: [],
+    },
+  })
+
+  function goToPage({ type, id }) {
+    uni.navigateTo({
+      url: `/pages/record/record?type=${type}&id=${id}`,
+    })
+  }
+</script>
+
+<style lang="scss" scoped></style>

+ 3 - 3
src/layouts/default.vue

@@ -10,8 +10,8 @@
   import type { ConfigProviderThemeVars } from 'wot-design-uni'
 
   const themeVars: ConfigProviderThemeVars = {
-    // colorTheme: 'red',
-    // buttonPrimaryBgColor: '#07c160',
-    // buttonPrimaryColor: '#07c160',
+    colorTheme: '#F88842',
+    buttonPrimaryBgColor: '#F88842',
+    // buttonPrimaryColor: '#F88842',
   }
 </script>

+ 3 - 3
src/layouts/tabbar.vue

@@ -11,8 +11,8 @@
   import type { ConfigProviderThemeVars } from 'wot-design-uni'
 
   const themeVars: ConfigProviderThemeVars = {
-    // colorTheme: 'red',
-    // buttonPrimaryBgColor: '#07c160',
-    // buttonPrimaryColor: '#07c160',
+    // colorTheme: '#F88842',
+    // buttonPrimaryBgColor: '#F88842',
+    // buttonPrimaryColor: '#F88842',
   }
 </script>

+ 2 - 1
src/locale/en.json

@@ -15,5 +15,6 @@
   "home.hotSelling": "Hot Selling",
   "product.details": "Product Details",
   "product.dscription": "Description",
-  "product.description": "Description"
+  "product.description": "Description",
+  "feed.records": "Feeding Record"
 }

+ 4 - 1
src/locale/zh-Hans.json

@@ -1,7 +1,7 @@
 {
   "tabbar.home": "主页",
   "tabbar.category": "分类",
-  "tabbar.music": "购物车",
+  "tabbar.music": "听歌",
   "tabbar.community": "社区",
   "tabbar.person": "我的",
   "app.name": "中文标题",
@@ -10,7 +10,10 @@
   "introduction": "我是 {name},身高:{detail.height},体重:{detail.weight}",
   "category.search": "搜索",
   "home.search": "搜索",
+  "feed.records": "喂养记录",
   "home.seeAll": "更多",
+  "my.baby": "我的宝宝",
+  "my.babyInfo": "宝宝信息",
   "home.hotCategory": "热门分类",
   "home.hotSelling": "热销商品",
   "product.details": "商品详情",

+ 102 - 0
src/pages/babyInfo/babyInfo.vue

@@ -0,0 +1,102 @@
+<!-- 使用 type="home" 属性设置首页,其他页面不需要设置,默认为page;推荐使用json5,更强大,且允许注释 -->
+<route lang="json5" type="babyInfo">
+{
+  style: {
+    navigationStyle: 'default',
+    navigationBarTitleText: '%my.babyInfo%',
+  },
+}
+</route>
+<template>
+  <view class="min-h-screen bg-white">
+    <!-- 顶部导航栏 -->
+    <view class="fixed top-0 left-0 w-full bg-white border-b border-gray-100 z-50">
+      <view class="flex items-center justify-between px-4 h-12">
+        <text class="text-sm text-blue-500">编辑</text>
+      </view>
+    </view>
+
+    <!-- 主要内容区域 -->
+    <view class="pt-14 pb-4 px-4">
+      <!-- 头像区域 -->
+      <view class="flex justify-center mt-6 mb-8 relative">
+        <view
+          class="relative w-20 h-20 rounded-full bg-blue-50 flex items-center justify-center overflow-hidden"
+        >
+          <image :src="babyAvatarUrl" alt="宝宝头像" class="w-full h-full object-cover" />
+          <view
+            class="absolute bottom-0 right-0 w-6 h-6 bg-blue-500 rounded-full flex items-center justify-center"
+          >
+            <icon class="fas fa-camera text-white text-xs"></icon>
+          </view>
+        </view>
+      </view>
+
+      <!-- 信息列表 -->
+      <view class="space-y-4">
+        <view class="info-item">
+          <text class="info-label">宝宝昵称</text>
+          <text class="info-value">小星星</text>
+        </view>
+
+        <view class="info-item">
+          <text class="info-label">宝宝性别</text>
+          <text class="info-value">男孩</text>
+        </view>
+
+        <view class="info-item">
+          <text class="info-label">宝宝生日</text>
+          <text class="info-value">2023年3月4日</text>
+        </view>
+
+        <view class="info-item">
+          <text class="info-label">宝宝血型</text>
+          <text class="info-value text-gray-400">未填写</text>
+        </view>
+
+        <view class="info-item">
+          <text class="info-label">宝宝二维码</text>
+          <icon class="fas fa-chevron-right text-gray-400"></icon>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+  import { ref } from 'vue'
+  const babyAvatarUrl = ref(
+    'https://ai-public.mastergo.com/ai/img_res/8a91ddc9c5fd46352c7b33ff40870fb7.jpg',
+  )
+
+  const show = ref(false)
+  onLaunch(({id}) => {
+    if (id) {
+      //请求宝宝得参数
+      show.value = true
+    } else {
+      //没有宝宝参数
+      show.value = false
+    }
+  })
+</script>
+
+<style scoped>
+  .info-item {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 14px 0;
+    border-bottom: 1px solid #f0f0f0;
+  }
+
+  .info-label {
+    font-size: 15px;
+    color: #333333;
+  }
+
+  .info-value {
+    font-size: 15px;
+    color: #666666;
+  }
+</style>

+ 238 - 0
src/pages/feed/feed.vue

@@ -0,0 +1,238 @@
+<!-- 使用 type="home" 属性设置首页,其他页面不需要设置,默认为page;推荐使用json5,更强大,且允许注释 -->
+<route lang="json5" type="feed">
+{
+  style: {
+    navigationStyle: 'custom',
+    navigationBarTitleText: '%feed.records%',
+  },
+}
+</route>
+<template>
+  <view class="min-h-screen bg-white">
+    <wd-navbar
+      title="喂养记录"
+      left-arrow
+      fixed
+      :placeholder="true"
+      safeAreaInsetTop
+      right-text="统计"
+      @click-left="handleClickLeft"
+      @click-right="handleClickRight"
+    ></wd-navbar>
+
+    <view class="pb-[30rpx]">
+      <!-- 主要内容区 -->
+      <view class="">
+        <!-- 日历部分 -->
+        <!-- <view class="bg-white px-4 py-3">
+          <view class="flex items-center justify-between mb-4">
+            <span class="text-sm text-gray-600">2023/12月</span>
+            <view class="flex space-x-1">
+              <i class="fas fa-chevron-left text-gray-400 text-xs"></i>
+              <i class="fas fa-chevron-right text-gray-400 text-xs"></i>
+            </view>
+          </view>
+
+          <view class="grid grid-cols-7 gap-2 text-center">
+            <view
+              v-for="day in ['一', '二', '三', '四', '五', '六', '日']"
+              :key="day"
+              class="text-xs text-gray-400"
+            >
+              {{ day }}
+            </view>
+            <view
+              v-for="date in 31"
+              :key="date"
+              class="relative h-8 flex items-center justify-center"
+            >
+              <span :class="date === 15 ? 'text-orange-500' : 'text-gray-600'" class="text-sm">
+                {{ date }}
+              </span>
+              <view
+                v-if="date === 15"
+                class="absolute bottom-1 w-1 h-1 rounded-full bg-orange-500"
+              ></view>
+            </view>
+          </view>
+        </view> -->
+
+        <view class="box-border pb-[32rpx]">
+          <view
+            :class="showCalendar ? 'h-[465rpx]' : 'h-[236rpx]'"
+            class="pt-[32rpx] overflow-hidden"
+          >
+            <wd-calendar-view
+              type="daterange"
+              :show-panel-title="true"
+              :show-confirm="false"
+              :formatter="formatter"
+              v-model="value"
+              @change="handleChange"
+            />
+          </view>
+
+          <wd-divider>
+            <wd-icon
+              @click="showCalendar = !showCalendar"
+              :name="showCalendar ? 'arrow-up' : 'arrow-down'"
+              size="36rpx"
+              color="#333"
+            />
+          </wd-divider>
+        </view>
+        <wd-gap bg-color="#F2F2F2"></wd-gap>
+        <view class="p-4">2020年12月15日 {{ value }}</view>
+
+        <template v-if="records.length">
+          <FeedBnaner />
+          <RecordList :dataList="records" />
+        </template>
+
+        <Empty v-else top="pt-[200rpx]" />
+      </view>
+
+      <!-- 悬浮添加按钮 -->
+      <view
+        @click="showPopup = !showPopup"
+        style="box-shadow: 0px 2px 12px rgba(255, 184, 137, 0.5)"
+        class="fixed right-4 bottom-25 w-12 h-12 bg-[#F88842] rounded-full flex items-center justify-center"
+      >
+        <wd-icon name="add" size="52rpx" color="white"></wd-icon>
+      </view>
+    </view>
+
+    <FeedWdPopup v-model:show="showPopup" />
+  </view>
+</template>
+
+<script setup>
+  import Empty from '@/components/empty/empty.vue'
+  import FeedBnaner from '@/components/feedBnaner/feedBnaner.vue'
+  import RecordList from '@/components/record-list/record-list.vue'
+  import FeedWdPopup from '@/components/feed-wd-popup/feed-wd-popup.vue'
+  import { onLoad } from '@dcloudio/uni-app'
+  import { ref } from 'vue'
+
+  onLoad(({ id }) => {
+    if (id) {
+      //请求宝宝得参数
+      // records.value = [0]
+    } else {
+      console.log(4567)
+      //没有宝宝参数
+      records.value = []
+    }
+  })
+  // 获取屏幕边界到安全区域距离
+  const { safeAreaInsets } = uni.getSystemInfoSync()
+  const babyAvatarUrl = ref(
+    'https://ai-public.mastergo.com/ai/img_res/8a91ddc9c5fd46352c7b33ff40870fb7.jpg',
+  )
+
+  const records = ref([
+    {
+      id: '0',
+      type: 1,
+      time: '13:00',
+      title: '喂奶 200ml',
+      desc: '宝宝今天胃口很好',
+
+      recorder: '妈妈 王小美',
+      // image: 'https://ai-public.mastergo.com/ai/img_res/3a46635d73b74316cd39813502beb964.jpg',
+    },
+    {
+      id: '1',
+      type: 2,
+      time: '10:00-13:00',
+      title: '母乳喂养',
+      desc: '持续了30分钟',
+      recorder: '妈妈 王小美',
+      image: 'https://ai-public.mastergo.com/ai/img_res/3d04b8dc21d0fe5f0f639f125fbd5c53.jpg',
+    },
+    {
+      id: '2',
+      type: 3,
+      time: '10:00',
+      title: '辅食 50ml',
+      desc: '今天尝试了新的米糊,宝宝很喜欢',
+      recorder: '妈妈 王小美',
+      image: '',
+    },
+  ])
+
+  const showCalendar = ref(false)
+  const showPopup = ref(false)
+
+  const dataList = ref()
+
+  // const { show: showToast } = useToast()
+  function handleClickRight() {
+    // showToast('按钮')
+  }
+
+  function handleClickLeft() {
+    uni.navigateBack()
+  }
+
+  const value = ref(1741881600000)
+
+  function handleChange({ value }) {
+    console.log(value)
+  }
+
+  const formatter = (day) => {
+    const date = new Date(day.date)
+    const now = new Date()
+    const year = date.getFullYear()
+    const month = date.getMonth()
+    const da = date.getDate()
+    const nowYear = now.getFullYear()
+    const nowMonth = now.getMonth()
+    const nowDa = now.getDate()
+
+    if (year === nowYear && month === nowMonth && da === nowDa) {
+      // day.topInfo = '今天'
+      day.bottomInfo = '·'
+    }
+
+    // if (month === 5 && da === 18) {
+    //   day.topInfo = '618大促'
+    // }
+
+    // if (month === 10 && da === 11) {
+    //   day.topInfo = '京东双11'
+    // }
+
+    // if (day.type === 'start') {
+    //   day.bottomInfo = '开始'
+    // }
+
+    // if (day.type === 'end') {
+    //   day.bottomInfo = '结束'
+    // }
+
+    // if (day.type === 'same') {
+    //   day.bottomInfo = '开始/结束'
+    // }
+
+    return day
+  }
+</script>
+
+<style scoped>
+  .border-b {
+    border-color: rgba(229, 231, 235, 0.5);
+  }
+
+  ::v-deep .wd-month__day.is-start .wd-month__day-container,
+  ::v-deep .wd-month__day,
+  ::v-deep .wd-month__day.is-end .wd-month__day-container {
+    border-radius: 50%;
+  }
+
+  ::v-deep .wd-month__day-bottom {
+    bottom: 0;
+    font-size: 30px;
+  }
+</style>

+ 284 - 234
src/pages/index/index.vue

@@ -10,280 +10,330 @@
 </route>
 <template>
   <view class="bg-white overflow-hidden pb-tab" :style="{ marginTop: safeAreaInsets?.top + 'px' }">
-    <wd-sticky>
-      <view class="pos-msg-container w-100vw bg-white">
-        <view class="pos-container">
-          <image style="width: 36rpx" src="@/static/images/pos.svg" mode="widthFix"></image>
-          <view class="pos-name">Serbia</view>
-          <image style="width: 36rpx" src="@/static/images/select.svg" mode="widthFix"></image>
+    <view class="min-h-screen bg-white">
+      <view class="max-w-lg mx-auto p-4">
+        <view class="h-[220rpx] mb-[32rpx]">
+          <view class="flex justify-end items-center h-[88rpx]">
+            <view
+              v-show="childrenList.length > 1"
+              @click="showChildren = !showChildren"
+              class="text-sm flex justify-center items-center px-4 py-1 text-orange-500 border-[2rpx] border-solid border-orange-500 rounded-full whitespace-nowrap"
+            >
+              <wd-icon
+                name="translate-bold"
+                color="#F88842"
+                size="28rpx"
+                class="pr-[8rpx]"
+              ></wd-icon>
+              切换
+            </view>
+          </view>
+          <view class="flex items-center gap-3">
+            <img :src="avatarUrl" class="w-16 h-16 rounded-full object-cover" alt="Baby Avatar" />
+            <view v-if="childrenInfo">
+              <view class="text-xl font-semibold">
+                {{ childrenInfo.name }}
+              </view>
+              <view class="text-gray-600 text-sm">{{ childrenInfo.old }}</view>
+            </view>
+            <view v-else>
+              <text class="text-xl font-semibold text-[#333]">暂无宝宝,请立即添加</text>
+            </view>
+          </view>
         </view>
-        <view class="msg-info">
-          <image style="width: 76rpx" src="@/static/images/msg.svg" mode="widthFix"></image>
+
+        <view
+          v-if="inform"
+          class="flex items-center justify-between bg-[#FFAC78]/[0.2] px-[32rpx] py-[8rpx] rounded-full mb-[32rpx]"
+        >
+          <text class="text-orange-500 text-xs">一周时间又到了,该测量宝宝的身高体重了哦~</text>
+          <wd-icon name="close" color="#F88842" size="24rpx"></wd-icon>
         </view>
-      </view>
-    </wd-sticky>
-    <view class="search-container">
-      <view class="search-item">
-        <image style="width: 40rpx" src="@/static/images/search.svg" mode="widthFix"></image>
-        <view class="search-text">{{ t('home.search') }}</view>
-      </view>
-    </view>
-    <view class="card-swiper-container">
-      <wd-swiper
-        autoplay
-        v-model:current="current"
-        custom-indicator-class="custom-indicator-class"
-        custom-image-class="custom-image"
-        custom-next-image-class="custom-image-prev"
-        custom-prev-image-class="custom-image-prev"
-        :list="swiperList"
-      ></wd-swiper>
-    </view>
-    <view class="hot-category">
-      <view class="home-title">
-        <view class="home-title-text">{{ t('home.hotCategory') }}</view>
-        <view @click="gotoCategory" class="home-see-all">
-          <view class="see-all-text">{{ t('home.seeAll') }}</view>
-          <image class="w-9rpx" src="@/static/images/right.svg" mode="widthFix"></image>
+
+        <view class="">
+          <view class="flex items-center justify-between mb-4">
+            <text class="text-lg font-medium">喂养记录</text>
+            <view @click="withButtonProps" class="text-gray-400 flex items-center gap-1">
+              查看详情
+              <wd-icon name="arrow-right" color="#999" size="28rpx"></wd-icon>
+            </view>
+          </view>
+
+          <view class="grid grid-cols-2 gap-4">
+            <view
+              v-for="(item, index) in cardList"
+              :key="item.id + index"
+              :class="item.bg"
+              @click.stop="goToPage(item.id)"
+              class="p-[24rpx] rounded-xl flex items-center gap-2 box-border"
+            >
+              <view class="w-[96rpx] h-[96rpx] shrink-0">
+                <image class="w-full h-full object-cover" :src="item.img" mode="widthFix" alt="" />
+              </view>
+              <view class="shrink-0">
+                <view class="text-base text-[#333]">{{ item.title }}</view>
+                <view class="text-gray-600 text-[20rpx] mt-2">
+                  {{ item.subTitle ? item.subTitle : item.onTitle }}
+                </view>
+              </view>
+            </view>
+          </view>
         </view>
       </view>
-      <view class="hot-category-content">
-        <view v-for="item in categories" :key="item.id" class="category-item">
-          <image class="category-item-img" :src="item.img" mode="scaleToFill"></image>
-          <view class="category-item-text">{{ item.text }}</view>
+
+      <wd-gap bg-color="#F2F2F2"></wd-gap>
+
+      <view
+        style="border-bottom: 2rpx solid #f2f2f2"
+        class="box-border flex items-center justify-between p-4"
+      >
+        <text class="text-lg font-medium">生长记录</text>
+        <view @click="withButtonProps" class="text-gray-400 flex items-center gap-1">
+          查看详情
+          <wd-icon name="arrow-right" color="#999" size="28rpx"></wd-icon>
         </view>
       </view>
-    </view>
-    <view class="hot-selling">
-      <view class="selling-title">
-        <view class="selling-title-text">{{ t('home.hotSelling') }}</view>
-        <view class="block"></view>
+      <view class="max-w-lg mx-auto p-4">
+        <template v-if="growthRecordList.length">
+          <view
+            v-for="(item, index) in growthRecordList"
+            :key="item.id + index"
+            class="border rounded-xl py-4"
+          >
+            <view class="flex justify-between text-sm text-gray-500">
+              <text>{{ item.date }}</text>
+              <text>{{ item.old }}</text>
+            </view>
+            <view class="mt-3 grid grid-cols-2 gap-4">
+              <view>
+                <view class="text-gray-600">身高:{{ item.height }}</view>
+                <view class="text-gray-600 mt-1">头围:{{ item.headC }}</view>
+              </view>
+              <view class="text-right">
+                <view class="text-gray-600">体重:{{ item.weight }}</view>
+              </view>
+            </view>
+          </view>
+        </template>
+
+        <Empty v-else />
       </view>
-      <HotTags v-model:current-tag="currentTag"></HotTags>
-      <ProductList></ProductList>
     </view>
   </view>
+  <wd-action-sheet v-model="showChildren" class="text-xl" title="选择宝宝" @close="close">
+    <wd-cell-group border>
+      <wd-cell
+        size="large"
+        v-for="(item, index) in childrenList"
+        :key="item.id"
+        @click="getChildren(item.id)"
+        is-link
+        center
+      >
+        <template #icon>
+          <view class="w-[96rpx] h-[96rpx] rounded-full overflow-hidden mr-[28rpx]">
+            <img class="w-full h-full object-cover" :src="item.img" alt="" />
+          </view>
+        </template>
+        <template #title>
+          <view class="h-full flex items-center text-xl">
+            {{ item.name }}
+          </view>
+        </template>
+      </wd-cell>
+    </wd-cell-group>
+  </wd-action-sheet>
   <tabbar />
 </template>
 
 <script lang="ts" setup>
-  import HotTags from '@/components/hot-tags/hot-tags.vue'
-  import ProductList from '@/components/product-list/product-list.vue'
-  import { t } from '@/locale'
-  import CateImg1 from '@/static/temp/cate-1.png'
-  import CateImg2 from '@/static/temp/cate-2.png'
-  import CateImg3 from '@/static/temp/cate-3.png'
-  import CateImg4 from '@/static/temp/cate-4.png'
+  import Empty from '@/components/empty/empty.vue'
+  import tabbar from '@/layouts/tabbar.vue'
+  import baby01 from '@img/index/baby-01.svg'
+  import baby02 from '@img/index/baby-02.svg'
+  import baby03 from '@img/index/baby-03.svg'
+  import baby04 from '@img/index/baby-04.svg'
 
+  import { useMessage, useToast } from 'wot-design-uni'
+  const message = useMessage()
   defineOptions({
     name: 'Home',
   })
-
+  const avatarUrl = ref(
+    'https://ai-public.mastergo.com/ai/img_res/143ef8d204b778ce9763c0e887f9bde2.jpg',
+  )
   const current = ref(0)
   const currentTag = ref(0)
+  const showChildren = ref(false)
 
-  const gotoCategory = () => {
-    uni.switchTab({
-      url: '/pages/category/category',
-    })
-  }
-  const swiperList = ref([
-    'https://t.xiaoyaotravel.com/image/TourImComplait/messageContent/696b679508664bb4bceb6cc6b06d0cdc.png',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/redpanda.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/capybara.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/panda.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/moon.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/meng.jpg',
+  const inform = ref('')
+  const childrenInfo = ref({
+    id: '0',
+    name: '小奥特曼',
+    old: '2岁3个月4天',
+  })
+
+  const childrenList = ref([
+    {
+      id: '0',
+      name: '小奥特曼',
+      img: avatarUrl.value,
+    },
+    {
+      id: '1',
+      name: '小奥特曼',
+      img: avatarUrl.value,
+    },
+    {
+      id: '2',
+      name: '小奥特曼',
+      img: avatarUrl.value,
+    },
   ])
 
-  const categories = ref([
-    { img: CateImg1, id: 1, text: 'Panda' },
-    { img: CateImg2, id: 2, text: 'Gift Shop' },
-    { img: CateImg3, id: 3, text: 'Egg&Meat' },
-    { img: CateImg4, id: 4, text: 'Vegs&Fruits' },
+  const growthRecordList = ref([])
+
+  // 卡片的数组
+  const cardList = ref([
+    {
+      id: '',
+      img: baby01,
+      title: '喂奶',
+      bg: 'bg-blue-50',
+      subTitle: '2次,共100ml',
+      onTitle: '0次,共0ml',
+    },
+    {
+      id: 'cardList',
+      img: baby02,
+      title: '辅食',
+      bg: 'bg-yellow-50',
+      subTitle: '1次',
+      onTitle: '0次',
+    },
+    {
+      id: 'cardList',
+      img: baby03,
+      title: '睡眠',
+      bg: 'bg-pink-50',
+      subTitle: '2次,共10分钟',
+      onTitle: '0次,共0分钟',
+    },
+    {
+      id: 'cardList',
+      img: baby04,
+      title: '尿不湿',
+      bg: 'bg-green-50',
+      subTitle: '1次,共1次便便',
+      onTitle: '0次,共0次便便',
+    },
   ])
 
+  function close() {
+    showChildren.value = false
+  }
   // 获取屏幕边界到安全区域距离
   const { safeAreaInsets } = uni.getSystemInfoSync()
-</script>
-
-<style lang="scss" scoped>
-  :deep(.wd-sticky__container) {
-    top: 0 !important;
-  }
-  .hot-selling {
-    box-sizing: border-box;
-    display: flex;
-    flex-direction: column;
-    align-items: flex-start;
-    justify-content: center;
-    padding: 24rpx 0 24rpx 32rpx;
-
-    .selling-title {
-      box-sizing: border-box;
-      display: flex;
-      align-items: center;
-      justify-content: space-between;
-      width: 100%;
-      padding-right: 32rpx;
-      font-family: 'PingFang SC';
-      font-size: 36rpx;
-      font-style: normal;
-      font-weight: 600;
-      line-height: 52rpx; /* 144.444% */
-      color: $shop-text-3;
 
-      .selling-see-all {
-        display: flex;
-        align-items: center;
+  // 暂无宝宝数据
+  function withButtonProps() {
+    message
+      .confirm({
+        msg: '请先添加宝宝后再录入',
+        title: '暂无宝宝数据',
+        confirmButtonText: '前往添加',
 
-        .selling-see-all-text {
-          margin-right: 18rpx;
-          font-family: 'PingFang SC';
-          font-size: 24rpx;
-          font-style: normal;
-          font-weight: 400;
-          line-height: 40rpx; /* 166.667% */
-          color: $shop-primary;
-          text-align: center;
-        }
-      }
-    }
+        cancelButtonProps: {
+          // type: 'error',
+          customClass: 'custom-shadow',
+        },
+        confirmButtonProps: {
+          // type: 'success',
+          customClass: 'custom-shadow',
+        },
+      })
+      .then(() => {
+        uni.navigateTo({
+          url: '/pages/babyInfo/babyInfo',
+        })
+      })
+      .catch((error) => {
+        console.log(error)
+      })
   }
 
-  .hot-category {
-    box-sizing: border-box;
-    display: flex;
-    flex-direction: column;
-    align-items: flex-start;
-    justify-content: center;
-    padding: 24rpx 32rpx;
-
-    .hot-category-content {
-      display: flex;
-      justify-content: space-between;
-      width: 100%;
-      margin-top: 24rpx;
-
-      .category-item {
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-
-        .category-item-img {
-          width: 128rpx;
-          height: 128rpx;
-          margin-bottom: 8rpx;
-          border-radius: 50%;
-        }
-
-        .category-item-text {
-          font-family: 'PingFang SC';
-          font-size: 14px;
-          font-style: normal;
-          font-weight: 400;
-          line-height: 22px; /* 157.143% */
-          color: $shop-text-3;
-        }
-      }
-    }
-
-    .home-title {
-      display: flex;
-      align-items: center;
-      justify-content: space-between;
-      width: 100%;
-      padding-right: 5rpx;
-      font-family: 'PingFang SC';
-      font-size: 36rpx;
-      font-style: normal;
-      font-weight: 600;
-      line-height: 52rpx; /* 144.444% */
-      color: $shop-text-3;
+  async function getChildren(id: string) {
+    console.log(id, 'getChildren')
+    await close()
+    // let data = await require('/')
+  }
 
-      .home-see-all {
-        display: flex;
-        align-items: center;
+  // 获取生长记录
+  async function getGrowthRecordList() {
+    let data = await [
+      {
+        id: 'Record',
+        date: '2025-03-07',
+        old: '2岁4个月3天',
+        height: '85.0cm',
+        weight: '3kg',
+        headC: '30cm',
+      },
+      {
+        id: 'Record',
+        date: '2025-03-07',
+        old: '2岁4个月3天',
+        height: '85.0cm',
+        weight: '3kg',
+        headC: '30cm',
+      },
+      {
+        id: 'Record',
+        date: '2025-03-07',
+        old: '2岁4个月3天',
+        height: '85.0cm',
+        weight: '3kg',
+        headC: '30cm',
+      },
+    ]
 
-        .see-all-text {
-          margin-right: 18rpx;
-          font-family: 'PingFang SC';
-          font-size: 24rpx;
-          font-style: normal;
-          font-weight: 400;
-          line-height: 40rpx; /* 166.667% */
-          color: $shop-primary;
-          text-align: center;
-        }
-      }
-    }
+    growthRecordList.value = data
+    // http.post('/')
   }
 
-  .card-swiper-container {
-    box-sizing: border-box;
-    padding: 0 16rpx 24rpx;
-    padding-bottom: 24rpx;
-    --wot-swiper-radius: 0;
-    --wot-swiper-item-padding: 0 0;
-    --wot-swiper-nav-dot-color: rgba(255, 169, 145, 0.2);
-    --wot-swiper-nav-dot-active-color: #ff4c1b;
+  // 跳转到喂养记录的页面
+  function goToPage(params: string) {
+    // if (params) {
+    console.log(params, 1234)
 
-    :deep(.custom-indicator-class) {
-      bottom: -24rpx;
-    }
-    :deep(.custom-image) {
-      border-radius: 12rpx;
-    }
-    :deep(.custom-image-prev) {
-      height: 300rpx !important;
-    }
+    uni.navigateTo({
+      url: `/pages/feed/feed?id=${params}`,
+    })
+    // } else {
+    // withButtonProps()
+    // }
   }
-  .search-container {
-    box-sizing: border-box;
-    padding: 0 16rpx 24rpx;
 
-    .search-item {
-      box-sizing: border-box;
-      display: flex;
-      align-items: center;
-      height: 84rpx;
-      padding: 20rpx 24rpx;
-      border: 2rpx solid $shop-bg-line;
-      border-radius: 42rpx;
+  onMounted(() => {
+    getGrowthRecordList()
+  })
+</script>
 
-      .search-text {
-        margin-left: 16rpx;
-        font-family: 'PingFang SC';
-        font-size: 28rpx;
-        font-style: normal;
-        font-weight: 400;
-        line-height: 44rpx; /* 157.143% */
-        color: var(--999, #999);
-        text-align: center;
-      }
-    }
+<style lang="scss" scoped>
+  .fa-signal,
+  .fa-wifi,
+  .fa-battery-full {
+    font-size: 14px;
+    color: #262626;
   }
-  .pos-msg-container {
-    box-sizing: border-box;
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    padding: 16rpx 23rpx;
-
-    .pos-container {
-      display: flex;
-      align-items: center;
-      height: 76rpx;
 
-      .pos-name {
-        margin: 0 16rpx;
-        font-family: 'PingFang SC';
-        font-size: 28rpx;
-        font-style: normal;
-        font-weight: 600;
-        line-height: 44rpx; /* 157.143% */
-        color: var(--333, #333);
-        text-align: center;
+  :deep() {
+    .wd-message-box {
+      .custom-shadow {
+        box-shadow:
+          0 3px 1px -2px rgb(0 0 0 / 20%),
+          0 2px 2px 0 rgb(0 0 0 / 14%),
+          0 1px 5px 0 rgb(0 0 0 / 12%);
       }
     }
   }

+ 0 - 280
src/pages/product/details.vue

@@ -1,280 +0,0 @@
-<route lang="json5">
-{
-  style: {
-    navigationStyle: 'custom',
-    navigationBarTitleText: '%product.details%',
-  },
-}
-</route>
-<template>
-  <!-- :style="{ marginTop: safeAreaInsets?.top + 'px' }" -->
-  <view class="w-full h-[100vh] box-border">
-    <wd-navbar :bordered="false" fixed safeAreaInsetTop @click-left="handleClickLeft">
-      <template #left>
-        <view class="w-68rpx h-68rpx rounded-full bg-white flex justify-center items-center">
-          <wd-icon name="thin-arrow-left" size="18" />
-        </view>
-      </template>
-      <template #right>
-        <view
-          class="w-68rpx h-68rpx overflow-hidden rounded-full bg-white flex justify-center items-center"
-        >
-          <image class="w-56rpx h-56rpx" :src="collect" alt=""></image>
-        </view>
-      </template>
-    </wd-navbar>
-
-    <view class="w-full relative">
-      <wd-swiper
-        class="w-full aspect-[3/4] object-cover"
-        :list="swiperList"
-        :autoplay="false"
-        :indicator="false"
-        height="1000rpx"
-        v-model:current="current"
-        @click="handleClick"
-        @change="onChange"
-      ></wd-swiper>
-      <view
-        class="overflow-hidden flex space-x-8rpx box-border p-8rpx mx-auto absolute bottom-48rpx left-1/2 -translate-x-1/2 bg-white rounded-8rpx"
-      >
-        <view
-          v-for="(item, index) in swiperList.slice(0, 6)"
-          :key="index"
-          class="w-100rpx h-100rpx relative shrink-0"
-        >
-          <wd-img width="100%" height="100%" :src="item" @click="previewImage(index)" />
-          <view
-            v-show="index === 5 && swiperListNumber"
-            @click="previewImage(index)"
-            class="w-full h-full flex justify-center items-center absolute top-0 left-0 text-28rpx font-semibold text-white bg-[#000]/[0.4] z-500"
-          >
-            + {{ swiperListNumber }}
-          </view>
-        </view>
-      </view>
-    </view>
-    <view class="w-full box-border px-32rpx">
-      <view class="flex justify-between items-center py-[24rpx]">
-        <span class="text-[#333] font-semibold text-xl line-clamp-1">
-          {{ 'Light Brown Jacket' }}
-        </span>
-        <span class="text-[#ff4c1b] font-semibold text-base">USD 84.00</span>
-      </view>
-
-      <h1 class="font-semibold text-base">{{ 'Description' }}</h1>
-      <p class="line-clamp-2 text-sm text-[#666]">
-        <span class="">
-          Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod Lorem ipsum dolor
-          sit amet, consectetur adipiscing elit, sed do eiusmod
-        </span>
-        <span class="text-[#ff4c1b] underline">red more</span>
-      </p>
-      <wd-divider class="my-24rpx" color="#F2F2F2"></wd-divider>
-      <h1 class="font-medium text-base">{{ 'Product Parameter' }}</h1>
-
-      <!-- <wd-cell is-link size="large" title="View detailed parameters" /> -->
-      <!-- <wd-cell is-link size="large" trpxitle="View detailed parameters" /> -->
-      <view class="w-full box-border py-18rpx flex justify-between" @click="parameterShow = true">
-        <span class="w-[630rpx] line-clamp-1 text-sm text-[#999]">View detailed parameters</span>
-        <wd-icon name="arrow-right" color="#666" size="48rpx"></wd-icon>
-      </view>
-      <wd-table
-        class="rounded-24rpx"
-        :showHeader="false"
-        :data="parameterDataList.slice(0, 4)"
-        :stripe="false"
-        :fixed-header="false"
-      >
-        <wd-table-col width="50%" style="color: #666" prop="name" label=""></wd-table-col>
-        <wd-table-col width="50%" prop="label" label=""></wd-table-col>
-      </wd-table>
-    </view>
-
-    <wd-action-sheet v-model="parameterShow" :title="t('product.description')" @close="close">
-      <view class="w-full box-border p-32rpx pb-100rpx">
-        <!-- <wd-table
-          class="rounded-24rpx"
-          :showHeader="false"
-          :data="parameterDataList"
-          :stripe="false"
-          :ellipsis="false"
-        >
-          <wd-table-col width="50%" style="color: #666" prop="name" label=""></wd-table-col>
-          <wd-table-col width="50%" prop="label" label=""></wd-table-col>
-        </wd-table> -->
-        <view class="w-full">
-          <view class="w-[50%]">12345</view>
-          <view class="w-[50%]">1234564</view>
-        </view>
-        <!-- <view class="rounded-24rpx overflow-hidden parameter-tabel">
-          <table border class="w-full border-collapse parameter-tabel">
-            <tbody>
-              <tr>
-                <td class="wd-table__value">数据1</td>
-                <td class="wd-table__value">数据2</td>
-                <td class="wd-table__value">数据3</td>
-              </tr>
-              <tr>
-                <td class="wd-table__value">数据4</td>
-                <td class="wd-table__value">数据5</td>
-                <td class="wd-table__value">数据6</td>
-              </tr>
-            </tbody>
-          </table>
-        </view> -->
-      </view>
-    </wd-action-sheet>
-
-    <Comment />
-  </view>
-</template>
-
-<script lang="ts" setup>
-  import { t } from '@/locale'
-  import collect from '@/static/images/category/collect.svg'
-  const { safeAreaInsets } = uni.getSystemInfoSync()
-
-  type parameterType = {
-    id: string
-    name: string
-    label: string
-  }
-  const categoryIndex = ref<number>(0)
-
-  function handleClickLeft() {
-    uni.navigateBack()
-  }
-
-  const current = ref<number>(0)
-  const parameterShow = ref<boolean>(false)
-  const parameterDataList = ref<parameterType[]>([
-    {
-      id: 'string',
-      name: 'Brand',
-      label: 'Jacket',
-    },
-    {
-      id: 'string',
-      name: 'Name',
-      label: 'Light Brown Jacket',
-    },
-    {
-      id: 'string',
-      name: 'Text',
-      label: 'Light Brown Jacket',
-    },
-    {
-      id: 'string',
-      name: 'Text',
-      label: 'Visit Nepal 2020 Tourist Arrivals in Last 11 Months',
-    },
-    {
-      id: 'string',
-      name: 'Text',
-      label: 'Visit Nepal 2020 Tourist Arrivals in Last 11 Months',
-    },
-    {
-      id: 'string',
-      name: 'Text',
-      label: 'Visit Nepal 2020 Tourist Arrivals in Last 11 Months',
-    },
-    {
-      id: 'string',
-      name: 'Text',
-      label: 'Visit Nepal 2020 Tourist Arrivals in Last 11 Months',
-    },
-    {
-      id: 'string',
-      name: 'Text',
-      label: 'Visit Nepal 2020 Tourist Arrivals in Last 11 Months',
-    },
-    {
-      id: 'string',
-      name: 'Text',
-      label: 'Visit Nepal 2020 Tourist Arrivals in Last 11 Months',
-    },
-    {
-      id: 'string',
-      name: 'Text',
-      label: 'Visit Nepal 2020 Tourist Arrivals in Last 11 Months',
-    },
-    {
-      id: 'string',
-      name: 'Text',
-      label: 'Visit Nepal 2020 Tourist Arrivals in Last 11 Months',
-    },
-  ])
-
-  const swiperList = ref<string[]>([
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/redpanda.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/capybara.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/panda.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/moon.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/meng.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/meng.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/meng.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/meng.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/meng.jpg',
-    'https://registry.npmmirror.com/wot-design-uni-assets/*/files/meng.jpg',
-    // 'https://registry.npmmirror.com/wot-design-uni-assets/*/files/meng.jpg',
-  ])
-
-  const swiperListNumber = computed(() =>
-    swiperList.value.length > 6 ? swiperList.value.length - 6 : 0,
-  )
-
-  function handleClick(e) {
-    console.log(e)
-  }
-  function onChange(e) {
-    console.log(e)
-  }
-
-  function previewImage(current: number) {
-    uni.previewImage({
-      urls: swiperList.value,
-      current,
-      loop: true,
-      indicator: 'number',
-    })
-  }
-
-  function close() {
-    parameterShow.value = false
-  }
-
-  onLoad((id) => {
-    console.log(id, '商品详情')
-  })
-
-  onMounted(() => {})
-</script>
-<style lang="scss" scoped>
-  ::v-deep .wd-navbar {
-    background: linear-gradient(180deg, rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0) 100%);
-  }
-
-  ::v-deep .wd-swiper__track {
-    --wot-swiper-radius: 0px;
-  }
-
-  .text-color {
-    color: #ff4c1b;
-  }
-
-  .parameter-tabel {
-    border: 2rpx solid #f2f2f2;
-  }
-  tr :first-child {
-    border-radius: 24rpx 0rpx;
-  }
-
-  ::v-deep .wd-table-col:first-child > .wd-table__cell {
-    color: #666;
-  }
-
-  ::v-deep .wd-action-sheet__header {
-    border: 2rpx solid #f2f2f2;
-  }
-</style>

+ 33 - 0
src/pages/record/data.js

@@ -0,0 +1,33 @@
+export const formData = [
+  {
+    label: '记录类型',
+    input: '',
+  },
+  {},
+]
+// 喂奶方式
+export const feedMethodList = [
+  {
+    label: '母乳亲喂',
+    value: 1,
+  },
+  {
+    label: '母乳瓶喂',
+    value: 2,
+  },
+  {
+    label: '配方奶',
+    value: 3,
+  },
+]
+// 喂奶方式
+export const cacationList = [
+  {
+    label: '有便便',
+    value: 1,
+  },
+  {
+    label: '无便便',
+    value: 2,
+  },
+]

+ 271 - 0
src/pages/record/record.vue

@@ -0,0 +1,271 @@
+<!-- 使用 type="home" 属性设置首页,其他页面不需要设置,默认为page;推荐使用json5,更强大,且允许注释 -->
+<route lang="json5" type="feed">
+{
+  style: {
+    navigationStyle: 'custom',
+    navigationBarTitleText: '%feed.records%',
+  },
+}
+</route>
+<template>
+  <view class="min-h-screen bg-[#F2F2F2] box-border pb-35">
+    <wd-navbar
+      :title="title"
+      left-arrow
+      fixed
+      :placeholder="true"
+      :safeAreaInsetTop="true"
+      @click-left="handleClickLeft"
+    >
+      <template v-if="show" #right>
+        <view @click="handleClickRight">
+          <wd-icon name="search" size="18" />
+        </view>
+      </template>
+    </wd-navbar>
+    <wd-form ref="formRef" :model="formData">
+      <ItemForm label="记录类型">
+        <template #default>
+          <wd-picker
+            label=""
+            size="large"
+            :columns="columns"
+            v-model="formData.type"
+            @confirm="handleConfirm"
+          />
+        </template>
+      </ItemForm>
+
+      <NurseForm
+        v-model:nurseMethod="formData.nurseMethod"
+        v-model:type="formData.type"
+        v-model:startTime="formData.startTime"
+        v-model:endTime="formData.endTime"
+        v-model:complementaryName="formData.complementaryName"
+        v-model:milkOutput="formData.milkOutput"
+        v-model:hasStool="formData.hasStool"
+      />
+
+      <ItemForm :border="false" label="备注">
+        <template #default>
+          <view class="px-3 mt-[16rpx] box-border">
+            <view class="rounded-lg bg-[#F2F2F2]">
+              <wd-textarea
+                clear-trigger="focus"
+                auto-height
+                size="large"
+                placeholder="填写备注信息"
+                v-model="formData.remark"
+                :maxlength="120"
+                no-border
+                show-word-limit
+              />
+            </view>
+            <!--       clearable   -->
+          </view>
+        </template>
+      </ItemForm>
+
+      <wd-gap bg-color="#F2F2F2"></wd-gap>
+
+      <ItemForm :border="false" label="图片">
+        <template #default>
+          <view class="px-3 mt-3">
+            <wd-upload
+              :file-list="formData.images"
+              image-mode="aspectFill"
+              :header="{
+                Authorization: '1234',
+                project: '123',
+              }"
+              :action="uploadUrl"
+              multiple
+              @change="handleChangeImage"
+              :before-remove="beforeRemove"
+            ></wd-upload>
+          </view>
+        </template>
+      </ItemForm>
+
+      <view
+        class="w-full box-border fixed bottom-0 left-0 px-3 pt-2 pb-8 bg-white"
+        :style="{ marginBottom: safeAreaInsets?.bottom + 'px' }"
+      >
+        <wd-button @click="handleSubmit" block>保存</wd-button>
+      </view>
+    </wd-form>
+    <wd-toast />
+    <wd-message-box />
+  </view>
+</template>
+
+<script setup>
+  import ItemForm from '@/components/item-form/item-form.vue'
+  import NurseForm from '@/components/item-form/nurse-form.vue'
+  import typeDataList from '@/components/feed-wd-popup/data.json'
+  import { feedMethodList } from './data.js'
+  import { ref, reactive } from 'vue'
+  import { useToast, useMessage } from 'wot-design-uni'
+  import { onLoad } from '@dcloudio/uni-app'
+
+  const messageBox = useMessage()
+  const toast = useToast()
+  const uploadUrl = `${import.meta.env.VITE_UPLOAD_BASEURL}/admin/app/tourismProjectTravelNotesWrite/upload`
+
+  // 获取屏幕边界到安全区域距离
+  const { safeAreaInsets } = uni.getSystemInfoSync()
+
+  const columns = ref(
+    typeDataList.map(({ title, type }) => ({
+      label: title,
+      value: type,
+    })),
+  )
+  const message = useMessage()
+  const show = ref(false)
+  const title = ref('')
+  const formRef = ref('')
+
+  // 表单数据
+  const formData = reactive({
+    id: '',
+    type: 1, //记录类型
+    nurseMethod: 1, // 喂奶方式
+    complementaryName: '', // 辅食名称
+    hasStool: 1, //有无粪便
+    milkOutput: '', //吸奶量
+    startTime: null,
+    endTime: null,
+    remark: '', //备注
+    images: [], //图片
+  })
+
+  // 新增喂养记录和修改喂养记录提交按钮
+  function handleSubmit() {
+    formRef.value
+      .validate()
+      .then(({ valid, errors }) => {
+        console.log(valid, 'valid')
+
+        if (valid) {
+        }
+      })
+      .catch((error) => {
+        console.log(error, 'error')
+      })
+    console.log(formData, 'handleSubmit')
+  }
+
+  // 删除这条数据
+  function handleDelete(id) {
+    console.log(id, 'handleDelete')
+    toast.loading('删除中...')
+    setTimeout(() => {
+      toast.close()
+
+      toast.success('删除成功')
+    }, 2000)
+  }
+
+  function handleClickRight() {
+    message
+      .confirm({
+        msg: '是否删除',
+      })
+      .then(() => {
+        handleDelete()
+      })
+      .catch((error) => {
+        console.log(error)
+      })
+  }
+
+  function handleClickLeft() {
+    uni.navigateBack()
+  }
+
+  function handleConfirm({ value, type }) {
+    formData.type = value
+  }
+
+  // 图片上传
+  function handleChangeImage({ fileList: files }) {
+    formData.images = files
+  }
+
+  // 移除图片
+  const beforeRemove = ({ file, fileList, resolve }) => {
+    console.log(file, 555)
+    console.log(formData.images, 555)
+    formData.images
+    messageBox
+      .confirm({
+        msg: '确定删除这张照片吗?',
+        // title: '提示',
+      })
+      .then(() => {
+        toast.success('删除成功')
+        // resolve(true)
+      })
+      .catch(() => {
+        toast.show('取消删除操作')
+      })
+  }
+
+  //
+  function changeFormData(types) {
+    // if (types == 1) {
+    //   formData = {
+    //     ...formData,
+    //     nurseMethod: 1,
+    //     startTime: null,
+    //     endTime: null,
+    //   }
+    // }
+    // nurseMethod: 1, // 喂奶方式
+    // complementaryName: '', // 辅食名称
+    // hasStool: 1, //有无粪便
+    // milkOutput: '', //吸奶量
+    // startTime: null,
+    // endTime: null,
+  }
+
+  onLoad(({ type, id }) => {
+    if (id) {
+      show.value = true
+      title.value = '记录详情'
+      // 获取详情的请求
+    } else {
+      show.value = false
+      title.value = '新增记录'
+    }
+    formData.type = type
+    formData.id = id ? id : ''
+  })
+</script>
+
+<style scoped>
+  ::v-deep .wd-textarea__value {
+    padding: 24rpx;
+    background-color: transparent;
+  }
+  ::v-deep .wd-textarea,
+  ::v-deep .wd-textarea__count {
+    background-color: transparent;
+  }
+  ::v-deep .wd-textarea__count {
+    right: 56rpx;
+  }
+
+  ::v-deep .wd-button.is-primary {
+    background: linear-gradient(270deg, #f88842 0%, #ffac78 100%);
+  }
+  ::v-deep .wd-input.is-large {
+    padding: 8rpx 24rpx;
+  }
+
+  ::v-deep .wd-upload__close {
+    top: 8rpx;
+    right: 8rpx;
+  }
+</style>

+ 0 - 7
src/static/images/category/collect.svg

@@ -1,7 +0,0 @@
-<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M9.75317 4.65807C11.076 4.29652 12.5102 5.35265 12.9566 7.01873C13.4029 8.68398 12.6928 10.3276 11.3701 10.69C10.0481 11.0514 8.61388 9.99527 8.16664 8.32929C7.72032 6.66404 8.43044 5.02044 9.75317 4.65807Z" stroke="#333333" stroke-width="1.51667"/>
-<path d="M21 19.4126C21 16.8361 18.1264 14.746 14.5834 14.746C11.0394 14.746 8.16669 16.8361 8.16669 19.4126C8.16669 21.99 11.0403 24.0793 14.5834 24.0793C18.1273 24.0793 21 21.99 21 19.4126Z" stroke="#333333" stroke-width="1.51667"/>
-<path d="M24.0319 9.51906C22.8362 9.10397 21.4522 9.93347 20.9428 11.3706C20.4324 12.8083 20.9893 14.3102 22.1858 14.7254C23.3817 15.1397 24.7655 14.311 25.2742 12.873C25.7846 11.4352 25.2277 9.93334 24.0319 9.51906Z" stroke="#333333" stroke-width="1.51667"/>
-<path d="M7.30863 11.5828C6.62109 9.99698 5.13019 9.14815 3.97842 9.68666C2.82722 10.224 2.45066 11.9447 3.13904 13.5303C3.82632 15.1152 5.31831 15.9647 6.46868 15.4276C7.61987 14.8902 7.99618 13.1686 7.30863 11.5828Z" stroke="#333333" stroke-width="1.51667"/>
-<path d="M18.0508 4.42103C16.6932 4.22721 15.4019 5.45389 15.1667 7.16263C14.9314 8.87136 15.8401 10.4128 17.1985 10.6074C18.5553 10.8021 19.8466 9.57457 20.0826 7.86666C20.3179 6.15876 19.4084 4.61568 18.0508 4.42103Z" stroke="#333333" stroke-width="1.51667"/>
-</svg>

+ 0 - 3
src/static/images/category/prefix.svg

@@ -1,3 +0,0 @@
-<svg width="9" height="9" viewBox="0 0 9 9" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M9 0H0C4.97056 0 9 4.02944 9 9V0Z" fill="white"/>
-</svg>

+ 0 - 3
src/static/images/category/suffix.svg

@@ -1,3 +0,0 @@
-<svg width="9" height="9" viewBox="0 0 9 9" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M9 9V0C9 4.97056 4.97056 9 0 9H9Z" fill="white"/>
-</svg>

File diff suppressed because it is too large
+ 10 - 0
src/static/images/empty.svg


+ 9 - 0
src/static/images/index/baby-01.svg

@@ -0,0 +1,9 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="48" height="48" rx="12" fill="#A3D4FF" fill-opacity="0.6"/>
+<path d="M24.0994 29.0646C21.0198 29.0646 18.1264 27.2594 16.4671 29.5913C15.4043 31.0866 14.7803 32.9141 14.7803 34.8906C14.7803 39.9436 18.8772 44.0416 23.9302 44.0416C28.9832 44.0416 33.0822 39.9436 33.0822 34.8906C33.0822 33.1214 32.582 31.4716 31.7138 30.0724C30.0989 27.4719 27.3863 29.0646 24.0994 29.0646ZM23.9693 40.5327C20.2489 40.5327 17.2328 37.5165 17.2328 33.795C17.2328 32.3991 17.6568 31.1036 18.3834 30.0301C19.5943 28.2376 21.2673 30.2068 23.5928 30.2068C26.0495 30.2068 28.5771 28.373 29.7531 30.3368C30.359 31.3468 30.7091 32.5291 30.7091 33.795C30.7091 37.5176 27.6919 40.5327 23.9704 40.5327H23.9693Z" fill="#FFFDED"/>
+<path d="M38.8554 21.007C38.8554 24.2019 32.1727 26.795 23.9302 26.795C15.6877 26.795 9.00608 24.2019 9.00608 21.007C9.00608 17.8122 15.6887 15.2212 23.9302 15.2212C32.1717 15.2212 38.8554 17.8111 38.8554 21.007Z" fill="#FFFDED"/>
+<path d="M34.0827 21.8678C34.0827 24.1511 29.5373 25.9986 23.9291 25.9986C18.321 25.9986 13.7746 24.15 13.7746 21.8678C13.7746 19.5857 18.3231 17.7371 23.9291 17.7371C29.5352 17.7371 34.0827 19.5878 34.0827 21.8678Z" fill="#F88842"/>
+<path d="M9.00608 22.4421C9.00608 25.638 15.6887 28.2301 23.9302 28.2301C32.1717 28.2301 38.8554 25.638 38.8554 22.4421V25.6433C38.8554 28.8392 32.1727 31.4292 23.9302 31.4292C15.6877 31.4292 9.00608 28.8392 9.00608 25.6433" fill="#FFFDED"/>
+<path d="M23.9291 25.305C29.7414 25.305 33.7749 24.1924 33.5275 20.7353C33.2017 16.1635 27.2594 15.0541 27.2594 13.2246C27.2594 12.1797 27.7828 10.8091 27.7828 9.37193C27.7828 7.93472 26.867 4.40991 23.9291 4.40991C20.9913 4.40991 20.0786 7.93684 20.0786 9.37193C20.0786 10.807 20.6021 12.1797 20.6021 13.2246C20.6021 15.0541 14.6587 16.1624 14.3329 20.7353C14.0855 24.1924 18.119 25.305 23.9291 25.305Z" fill="#E1F1FF"/>
+<path opacity="0.5" d="M26.0654 7.15331C26.0654 7.77303 25.5631 8.27643 24.9433 8.27643C24.3236 8.27643 23.8192 7.77303 23.8192 7.15331C23.8192 6.53359 24.3226 6.03125 24.9433 6.03125C25.5641 6.03125 26.0654 6.53253 26.0654 7.15331Z" fill="#FFFDED"/>
+</svg>

+ 20 - 0
src/static/images/index/baby-02.svg

@@ -0,0 +1,20 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="baby_06">
+<rect width="48" height="48" rx="12" fill="#FFEDCC"/>
+<g id="Group 6">
+<path id="Vector" d="M37.0063 32.5301C37.0063 35.4023 31.2449 37.7289 24.1373 37.7289C17.0297 37.7289 11.2704 35.4013 11.2704 32.5301C11.2704 29.6589 17.0307 27.3313 24.1373 27.3313C31.2439 27.3313 37.0063 29.6568 37.0063 32.5301Z" fill="#D2E4E0"/>
+<path id="Vector_2" d="M37.0063 32.53C37.0063 35.4023 31.2449 37.7288 24.1373 37.7288C17.0297 37.7288 11.2704 35.4012 11.2704 32.53" fill="#D2E4E0"/>
+<path id="Vector_3" d="M37.0063 32.53C37.0063 35.4023 31.2449 37.7288 24.1373 37.7288C17.0297 37.7288 11.2704 35.4012 11.2704 32.53" fill="#D2E4E0"/>
+<path id="Vector_4" d="M40.3608 20.6299C37.5795 20.6299 35.327 23.2028 35.327 26.3754C35.327 29.548 37.5806 32.1231 40.3608 32.1231C43.141 32.1231 45.3946 28.1785 45.3946 25.0027C45.3946 21.827 43.14 20.6299 40.3608 20.6299ZM40.3608 22.9871C43.0395 22.9871 43.0395 24.2487 43.0395 25.0027C43.0395 27.3653 41.321 29.7648 40.3608 29.7648C38.9088 29.7648 37.6821 28.2145 37.6821 26.3744C37.6821 24.5343 38.9088 22.986 40.3608 22.986" fill="#FFFDED"/>
+<path id="Vector_5" d="M7.91594 20.6299C5.13465 20.6299 2.88 21.8291 2.88 25.0027C2.88 28.1764 5.13571 32.1231 7.91594 32.1231C10.6962 32.1231 12.9498 29.5501 12.9498 26.3754C12.9498 23.2007 10.6951 20.6299 7.91594 20.6299ZM7.91594 22.9871C9.36792 22.9871 10.5946 24.5396 10.5946 26.3754C10.5946 28.2113 9.36792 29.7658 7.91594 29.7658C6.95571 29.7658 5.23723 27.3653 5.23723 25.0038C5.23723 24.2498 5.23723 22.9882 7.91594 22.9882" fill="#FFFDED"/>
+<path id="Vector_6" d="M39.9991 16.9676C39.9991 20.5071 32.8978 23.3751 24.1384 23.3751C15.3789 23.3751 8.2776 20.5071 8.2776 16.9676C8.2776 13.4281 15.3789 10.5601 24.1384 10.5601C32.8978 10.5601 39.9991 13.4281 39.9991 16.9676Z" fill="#FFFDED"/>
+<path id="Vector_7" d="M37.4293 22.9712C37.4293 26.5107 31.4787 29.3798 24.1373 29.3798C16.796 29.3798 10.8474 26.5107 10.8474 22.9712C10.8474 19.4316 16.7981 16.5647 24.1373 16.5647C31.4765 16.5647 37.4293 19.4327 37.4293 22.9712Z" fill="#88B9B0"/>
+<path id="Vector_8" d="M37.0063 32.5301C37.0063 35.4023 31.2449 37.7289 24.1373 37.7289C17.0297 37.7289 11.2704 35.4012 11.2704 32.5301L8.27655 16.9675C8.27655 20.5071 15.3778 23.3751 24.1373 23.3751C32.8968 23.3751 39.9981 20.5071 39.9981 16.9675L37.0053 32.5301" fill="#FFFDED"/>
+<path id="Vector_9" d="M27.5764 31.9422C27.3184 31.9422 27.1111 31.7318 27.1111 31.4727C27.1111 31.2136 27.3184 31.0063 27.5764 31.0063C27.8344 31.0063 28.0459 31.2136 28.0459 31.4727C28.0459 31.7318 27.8355 31.9422 27.5764 31.9422ZM25.2266 33.7041L24.683 33.1637L24.1426 33.7041L23.9089 33.4725L24.5371 32.8443L23.9248 32.2309H25.4423L24.83 32.8443L25.4582 33.4725L25.2266 33.7041ZM21.8541 31.9422C21.5929 31.9422 21.3846 31.7318 21.3846 31.4727C21.3846 31.2136 21.5929 31.0063 21.8541 31.0063C22.1153 31.0063 22.3184 31.2136 22.3184 31.4727C22.3184 31.7318 22.109 31.9422 21.8541 31.9422ZM30.7617 27.2659C30.1525 26.5647 29.1489 26.4378 28.5165 26.9856C28.434 27.0554 28.3664 27.1347 28.3103 27.2183C27.3437 26.4653 26.0747 26.0063 24.683 26.0063C23.2913 26.0063 21.9831 26.4812 21.0092 27.2542C20.9489 27.158 20.8791 27.067 20.7818 26.9856C20.1494 26.4378 19.1469 26.5647 18.5377 27.2659C17.9318 27.9681 17.9508 28.9801 18.5811 29.5258C18.8095 29.7214 19.0633 29.8092 19.3224 29.8113C19.241 30.1423 19.1966 30.485 19.1966 30.8339C19.1966 33.5 21.6532 34.9488 24.683 34.9488C27.7128 34.9488 30.1716 33.501 30.1716 30.8339C30.1716 30.4807 30.125 30.137 30.0425 29.805C30.2784 29.7881 30.5079 29.7056 30.7172 29.5268C31.3496 28.9812 31.3687 27.9691 30.7627 27.2669L30.7617 27.2659Z" fill="#FFBF46"/>
+<path id="Vector_10" d="M24.1384 10.5601C15.3789 10.5601 8.2776 13.4281 8.2776 16.9676C8.2776 20.5071 15.3789 23.3751 24.1384 23.3751C32.8978 23.3751 39.9991 20.5071 39.9991 16.9676C39.9991 13.4281 32.8978 10.5601 24.1384 10.5601ZM24.1384 12.2151C28.1675 12.2151 31.9313 12.839 34.7337 13.9716C36.927 14.8578 38.3441 16.0338 38.3441 16.9687C38.3441 17.9035 36.927 19.0795 34.7337 19.9657C31.9302 21.0983 28.1675 21.7222 24.1384 21.7222C20.1092 21.7222 16.3465 21.0983 13.543 19.9657C11.3497 19.0795 9.93263 17.9035 9.93263 16.9687C9.93263 16.0338 11.3497 14.8578 13.543 13.9716C16.3465 12.839 20.1092 12.2151 24.1384 12.2151Z" fill="#FFD78C"/>
+<path id="Vector_11" d="M12.7901 19.6348C11.0314 18.8004 9.93265 17.7904 9.93265 16.9677C9.93265 16.0328 11.3497 14.8569 13.543 13.9707C16.3465 12.8381 20.1092 12.2141 24.1384 12.2141C28.1675 12.2141 31.9313 12.8381 34.7337 13.9707C36.927 14.8569 38.3441 16.0328 38.3441 16.9677C38.3441 17.7904 37.2464 18.8004 35.4867 19.6348C33.1517 17.7936 28.9427 16.5648 24.1373 16.5648C19.3319 16.5648 15.124 17.7936 12.789 19.6348" fill="#FFFDED"/>
+<path id="Vector_12" d="M24.1384 21.7212C20.1092 21.7212 16.3465 21.0973 13.543 19.9646C13.2808 19.8589 13.0291 19.7478 12.7901 19.6347C15.1251 17.7935 19.334 16.5647 24.1384 16.5647C28.9427 16.5647 33.1527 17.7935 35.4877 19.6347C35.2487 19.7478 34.997 19.8589 34.7337 19.9646C31.9302 21.0973 28.1675 21.7212 24.1384 21.7212Z" fill="#F6DAA5"/>
+<path id="Vector_13" d="M28.1168 23.1721H20.16C14.1067 22.5408 9.45464 20.5008 8.47114 17.9691C8.34424 17.6423 8.27867 17.3081 8.27867 16.9676C8.27867 13.4281 15.38 10.5601 24.1394 10.5601C32.8989 10.5601 40.0002 13.4281 40.0002 16.9676C40.0002 17.3081 39.9346 17.6434 39.8077 17.9691C38.8242 20.5008 34.1722 22.5408 28.1178 23.1721M12.7911 19.6347C13.0301 19.7478 13.2818 19.8578 13.5441 19.9646C16.3476 21.0972 20.1103 21.7212 24.1394 21.7212C28.1686 21.7212 31.9323 21.0972 34.7348 19.9646C34.997 19.8589 35.2487 19.7478 35.4888 19.6347C37.2475 18.8003 38.3462 17.7904 38.3462 16.9676C38.3462 16.0328 36.9291 14.8568 34.7358 13.9706C31.9323 12.838 28.1697 12.214 24.1405 12.214C20.1113 12.214 16.3486 12.838 13.5451 13.9706C11.3518 14.8568 9.93475 16.0328 9.93475 16.9676C9.93475 17.7904 11.0335 18.8003 12.7922 19.6347" fill="#FFBF46"/>
+</g>
+</g>
+</svg>

+ 17 - 0
src/static/images/index/baby-03.svg

@@ -0,0 +1,17 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="baby_02">
+<rect width="48" height="48" rx="12" fill="#FFC9E4"/>
+<g id="Group 2">
+<path id="Vector" d="M24.34 5.85229C26.2753 15.0126 40.0982 18.0424 40.7612 28.2813C41.5216 40.0029 31.5555 42.3982 24.34 42.3982C17.1245 42.3982 7.52746 39.4784 7.92086 28.2813C8.2783 18.0265 20.7857 17.5538 24.34 5.85229Z" fill="#FFFDED"/>
+<path id="Vector_2" d="M11.2193 31.5038C11.2193 33.2614 9.91535 34.6869 8.31003 34.6869C6.70471 34.6869 5.40289 33.2614 5.40289 31.5038C5.40289 29.7462 6.70365 28.3228 8.31003 28.3228C9.91641 28.3228 11.2193 29.7483 11.2193 31.5038Z" fill="#FFFDED"/>
+<path id="Vector_3" d="M43.018 31.5038C43.018 33.2614 41.7162 34.6869 40.1066 34.6869C38.4971 34.6869 37.1974 33.2614 37.1974 31.5038C37.1974 29.7462 38.5024 28.3228 40.1066 28.3228C41.7109 28.3228 43.018 29.7483 43.018 31.5038Z" fill="#FFFDED"/>
+<path id="Vector_4" d="M25.9403 37.6254C25.9403 38.518 25.2159 39.2455 24.3191 39.2455C23.4224 39.2455 22.7001 38.518 22.7001 37.6254C22.7001 36.7329 23.4266 36 24.3191 36C25.2117 36 25.9403 36.7297 25.9403 37.6254Z" fill="#FFC9E4"/>
+<path id="Vector_5" d="M24.5875 16.0415C23.4686 16.657 22.5898 17.5453 21.9944 18.5764C21.398 19.6075 21.0818 20.7813 21.0818 21.9753C21.0818 23.0793 21.3535 24.2013 21.9225 25.2356C22.3095 25.9378 22.8679 26.4888 23.5151 26.8631C24.1634 27.2375 24.9005 27.4363 25.6503 27.4363C26.3429 27.4363 27.0473 27.2661 27.6955 26.9097C28.1471 26.6612 28.5035 26.2995 28.7446 25.8818C28.9857 25.464 29.1126 24.9892 29.1126 24.5059C29.1126 24.0586 29.0026 23.6028 28.7721 23.184C28.606 22.8826 28.3639 22.6436 28.0857 22.4829C27.8066 22.3221 27.4893 22.2365 27.1657 22.2354C26.8664 22.2354 26.5608 22.3094 26.2816 22.4638C26.0701 22.5812 25.9009 22.7515 25.7877 22.9482C25.6746 23.1449 25.6143 23.368 25.6143 23.5954C25.6143 23.8048 25.6661 24.0195 25.774 24.2151C25.9009 24.4446 26.1885 24.5281 26.418 24.4012C26.6475 24.2743 26.7311 23.9856 26.6042 23.7572C26.5756 23.7043 26.5629 23.6514 26.5629 23.5954C26.5629 23.5351 26.5788 23.4748 26.6094 23.422C26.6401 23.3691 26.6824 23.3257 26.7406 23.2929C26.877 23.2178 27.0208 23.183 27.1646 23.183C27.3201 23.183 27.4756 23.2242 27.6099 23.3025C27.7452 23.3807 27.8594 23.4939 27.9409 23.6398C28.0921 23.9148 28.164 24.2098 28.164 24.5027C28.164 24.8189 28.0805 25.132 27.9229 25.4048C27.7653 25.6777 27.5348 25.9114 27.2376 26.0753C26.7321 26.3534 26.1885 26.4845 25.6503 26.4845C25.0676 26.4845 24.4933 26.3301 23.99 26.0393C23.4866 25.7485 23.0551 25.3223 22.7526 24.7756C22.262 23.8841 22.0293 22.9228 22.0293 21.9731C22.0293 20.9473 22.3011 19.9353 22.814 19.0491C23.3269 18.1629 24.0788 17.4015 25.0432 16.8695C25.2727 16.7437 25.3563 16.455 25.2304 16.2255C25.1046 15.996 24.8159 15.9125 24.5864 16.0383" fill="#FFC9E4"/>
+<path id="Vector_6" d="M44.9247 3.13768C43.0053 1.20241 40.3488 0 37.4237 0C40.3477 0 43.0042 1.20241 44.9237 3.13768" fill="#FFFDED"/>
+</g>
+<path id="Vector 3" d="M31.5455 10L34 10.6667L31 12.3333L33.7273 13" stroke="#FFFDED" stroke-linecap="round" stroke-linejoin="round"/>
+<path id="Vector 4" d="M38.7887 6.61355L41.9036 8.37749L37.2323 9.60538L40.7191 11.4643" stroke="#FFFDED" stroke-linecap="round" stroke-linejoin="round"/>
+<path id="Vector 1" d="M13 31.5C14.3903 31.9785 15.1513 31.9237 16.5 31.5" stroke="#FFC9E4" stroke-linecap="round"/>
+<path id="Vector 2" d="M32 31.5C33.3903 31.9785 34.1513 31.9237 35.5 31.5" stroke="#FFC9E4" stroke-linecap="round"/>
+</g>
+</svg>

File diff suppressed because it is too large
+ 4 - 0
src/static/images/index/baby-04.svg


+ 5 - 0
src/static/images/index/baby-05.svg

@@ -0,0 +1,5 @@
+<svg width="57" height="56" viewBox="0 0 57 56" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="0.875" width="56" height="56" rx="12" fill="#FFE6D2"/>
+<path d="M25.954 12.6903V9.5487C25.954 8.87274 26.2225 8.22447 26.7005 7.7465C27.1785 7.26852 27.8268 7 28.5027 7H29.5527C30.2287 7 30.877 7.26852 31.3549 7.7465C31.8329 8.22447 32.1014 8.87274 32.1014 9.5487V12.7036L41.935 21H16.105L25.954 12.6903ZM40.2942 24.7058L42.7547 40.1653C42.73 42.533 41.7658 44.7938 40.0742 46.4506C38.3826 48.1074 36.1022 49.0244 33.7345 49H24.715C22.3475 49.0244 20.0672 48.1075 18.3756 46.4509C16.684 44.7942 15.7198 42.5335 15.6948 40.166L18.1546 24.7065H40.2942V24.7058ZM32.9148 29.6464H26.3551C25.9183 29.6464 25.4993 29.8199 25.1904 30.1288C24.8816 30.4377 24.708 30.8567 24.708 31.2935C24.708 31.7303 24.8816 32.1493 25.1904 32.4582C25.4993 32.7671 25.9183 32.9406 26.3551 32.9406H32.9155C33.3524 32.9405 33.7713 32.7669 34.0801 32.4579C34.3889 32.149 34.5624 31.73 34.5623 31.2931C34.5622 30.8563 34.3886 30.4374 34.0796 30.1286C33.7706 29.8198 33.3517 29.6463 32.9148 29.6464ZM32.9148 34.5877H29.6346C29.1978 34.5877 28.7788 34.7612 28.4699 35.0701C28.1611 35.379 27.9875 35.798 27.9875 36.2348C27.9875 36.6716 28.1611 37.0906 28.4699 37.3995C28.7788 37.7084 29.1978 37.8819 29.6346 37.8819H32.9148C33.3517 37.8819 33.7706 37.7084 34.0795 37.3995C34.3884 37.0906 34.5619 36.6716 34.5619 36.2348C34.5619 35.798 34.3884 35.379 34.0795 35.0701C33.7706 34.7612 33.3517 34.5877 32.9148 34.5877ZM24.715 42.8232H32.9148C33.3517 42.8232 33.7706 42.6497 34.0795 42.3408C34.3884 42.0319 34.5619 41.6129 34.5619 41.1761C34.5619 40.7393 34.3884 40.3203 34.0795 40.0114C33.7706 39.7025 33.3517 39.529 32.9148 39.529H24.715C24.2782 39.529 23.8592 39.7025 23.5503 40.0114C23.2415 40.3203 23.0679 40.7393 23.0679 41.1761C23.0679 41.6129 23.2415 42.0319 23.5503 42.3408C23.8592 42.6497 24.2782 42.8232 24.715 42.8232Z" fill="#FFFDED"/>
+<path d="M17.6748 18.9441H40.0748C42.4081 18.9441 43.5748 20.1108 43.5748 22.4441C43.5748 24.7774 42.4081 25.9441 40.0748 25.9441H17.6748C15.3415 25.9441 14.1748 24.7774 14.1748 22.4441C14.1748 20.1108 15.3415 18.9441 17.6748 18.9441Z" fill="#FFAA65"/>
+</svg>

+ 14 - 0
src/static/images/index/baby-06.svg

@@ -0,0 +1,14 @@
+<svg width="57" height="56" viewBox="0 0 57 56" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="0.625" width="56" height="56" rx="12" fill="#BCD2FF"/>
+<g clip-path="url(#clip0_164_26719)">
+<path d="M47.8443 13.2486C41.5784 5.61707 28.2212 5.5765 17.6913 13.1675C6.92271 20.9281 2.87425 33.911 8.98556 42.1647C15.2295 50.5966 29.4383 50.6112 40.3654 42.2081C51.0435 33.9966 54.2404 21.0397 47.8443 13.2486ZM31.6972 32.0663C26.0471 36.1991 19.516 37.0062 17.1159 33.8698C14.7158 30.7334 17.3517 24.8389 23.0047 20.7055C28.6576 16.5721 35.1858 15.7656 37.5865 18.902C39.9872 22.0384 37.3501 27.9335 31.6972 32.0663Z" fill="#FFFDED"/>
+<path d="M21.9736 10.5745C20.4727 11.3296 19.0363 12.2014 17.6784 13.1816C16.4519 14.0647 15.2918 15.0326 14.207 16.0779C15.171 15.9026 20.4406 21.1621 20.8482 22.5028C21.5244 21.8646 22.2411 21.2686 22.9941 20.7185C23.9174 20.042 24.8936 19.4373 25.9137 18.91C24.4129 17.6447 21.6697 11.9575 21.9736 10.5745Z" fill="#4F8AFF"/>
+<path d="M8.75543 23.2405C7.2645 26.059 6.37721 28.9987 6.16504 31.8516L8.75543 23.2405ZM8.6972 41.7781C8.78714 41.9081 8.87938 42.0372 8.97394 42.1653C11.283 45.2831 14.6817 47.2506 18.6021 48.0666C15.5096 45.3411 16.0492 37.8392 20.5693 35.697C19.4525 35.5381 18.4862 35.1537 17.7442 34.5343C14.6632 32.285 6.8517 36.4195 8.6972 41.7781ZM34.5671 29.5527C33.6847 30.4718 32.721 31.313 31.6873 32.0663C30.4552 32.9727 29.1274 33.7474 27.7264 34.3771C26.5734 36.4313 30.0015 45.8996 32.6518 46.5872C35.4193 45.4943 38.013 44.0207 40.3544 42.211C41.9037 41.0224 43.3359 39.6948 44.6323 38.2455C42.7136 34.4007 39.1609 31.6329 34.5671 29.5527ZM50.8416 25.9542C51.5525 21.7977 50.89 17.7551 48.7217 14.457C45.6049 12.0555 38.039 14.1566 38.1773 20.005C38.5394 20.9958 38.5509 22.1517 38.2523 23.3865C40.8652 20.9749 48.9517 21.1857 50.8416 25.9542ZM40.0886 8.28907C37.2808 7.47581 34.145 7.29039 30.9164 7.73563C28.6766 9.25225 29.1292 16.3123 31.7109 17.0535C33.4486 16.8686 34.9972 17.0856 36.1814 17.7264C33.8193 16.0249 35.448 9.13446 40.0886 8.28907Z" fill="#4F8AFF"/>
+<path d="M16.2667 31.8516C16.0586 30.4364 16.4316 28.7828 17.2958 27.0892C16.9009 25.0998 12.2298 22.0107 8.85412 23.0427C7.23981 26.0303 6.30524 29.1604 6.13574 32.1852C9.79619 27.5463 15.5858 30.0114 16.2667 31.8516Z" fill="#4F8AFF"/>
+</g>
+<defs>
+<clipPath id="clip0_164_26719">
+<rect width="45" height="41" fill="white" transform="translate(6.125 7.5)"/>
+</clipPath>
+</defs>
+</svg>

File diff suppressed because it is too large
+ 4 - 0
src/static/images/index/baby-07.svg


+ 4 - 0
src/static/images/index/fi-rr-arrow-right.svg

@@ -0,0 +1,4 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10.1728 3.41031L11.8661 5.12112C12.1119 5.36724 12.25 5.70087 12.25 6.04872C12.25 6.3072 12.0058 6.47314 11.7473 6.47314H11.1354H2.18758C2.07153 6.47314 1.96024 6.42704 1.87819 6.34498C1.79613 6.26293 1.75003 6.15164 1.75003 6.03559C1.75003 5.91955 1.79613 5.80825 1.87819 5.7262C1.96024 5.64414 2.07153 5.59804 2.18758 5.59804H11.1092L9.55149 4.02725C9.47 3.94527 9.42426 3.83437 9.42426 3.71878C9.42426 3.60319 9.47 3.49229 9.55149 3.41031C9.59217 3.3693 9.64056 3.33675 9.69388 3.31453C9.7472 3.29232 9.80439 3.28088 9.86215 3.28088C9.91991 3.28088 9.9771 3.29232 10.0304 3.31453C10.0837 3.33675 10.1321 3.3693 10.1728 3.41031Z" fill="#F88842"/>
+<path d="M3.82725 10.5898L2.13394 8.87897C1.88813 8.63285 1.75006 8.29922 1.75006 7.95137C1.75006 7.69289 1.99427 7.52695 2.25275 7.52695L2.86465 7.52695L11.8125 7.52695C11.9285 7.52695 12.0398 7.57305 12.1219 7.65511C12.2039 7.73716 12.25 7.84846 12.25 7.9645C12.25 8.08054 12.2039 8.19184 12.1219 8.27389C12.0398 8.35595 11.9285 8.40205 11.8125 8.40205L2.8909 8.40205L4.44857 9.97284C4.53006 10.0548 4.5758 10.1657 4.5758 10.2813C4.5758 10.3969 4.53006 10.5078 4.44857 10.5898C4.40789 10.6308 4.3595 10.6633 4.30618 10.6856C4.25286 10.7078 4.19567 10.7192 4.13791 10.7192C4.08015 10.7192 4.02296 10.7078 3.96964 10.6856C3.91632 10.6633 3.86793 10.6308 3.82725 10.5898Z" fill="#F88842"/>
+</svg>

+ 3 - 0
src/static/images/index/oval.svg

@@ -0,0 +1,3 @@
+<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.00003 2.88459C3.83361 2.88459 2.88465 3.83355 2.88465 4.99997C2.88465 6.16639 3.83362 7.11535 5.00003 7.11535C6.16645 7.11535 7.11541 6.16638 7.11541 4.99997C7.11541 3.83354 6.16644 2.88459 5.00003 2.88459ZM5 0C7.76143 0 10 2.23858 10 5C10 7.76143 7.76142 10 5 10C2.23858 10 0 7.76142 0 5C0 2.23858 2.23858 0 5 0Z" fill="#F88842"/>
+</svg>

+ 0 - 2
src/types/auto-import.d.ts

@@ -79,12 +79,10 @@ declare global {
   const useCssVars: typeof import('vue')['useCssVars']
   const useId: typeof import('vue')['useId']
   const useModel: typeof import('vue')['useModel']
-  const useNavbarWeixin: (typeof import('../hooks/useNavbarWeixin'))['default']
   const useRequest: typeof import('../hooks/useRequest')['default']
   const useSlots: typeof import('vue')['useSlots']
   const useTemplateRef: typeof import('vue')['useTemplateRef']
   const useUpload: typeof import('../hooks/useUpload')['default']
-  const useUpload2: typeof import('../hooks/useUpload2')['default']
   const watch: typeof import('vue')['watch']
   const watchEffect: typeof import('vue')['watchEffect']
   const watchPostEffect: typeof import('vue')['watchPostEffect']

+ 15 - 0
src/utils/index.ts

@@ -16,3 +16,18 @@ export const getEnvBaseUploadUrl = () => {
 
   return baseUploadUrl
 }
+
+export const formattedDate = (tims: number): string => {
+  if (!tims) return '' // 如果没有选择日期,返回空字符串
+
+  const date = new Date(tims) // 将时间戳转换为 Date 对象
+
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0') // 月份从 0 开始,+1
+  const day = String(date.getDate()).padStart(2, '0')
+  const hour = String(date.getHours()).padStart(2, '0')
+  const minute = String(date.getMinutes()).padStart(2, '0')
+
+  // 格式化为 yyyy-mm-dd hh:mm
+  return `${year}-${month}-${day} ${hour}:${minute}`
+}

+ 108 - 0
tailwind.config.js

@@ -0,0 +1,108 @@
+/** @type {import('tailwindcss').Config} */
+
+const generateSpacingMap = () => {
+  const tmpList = {}
+  for (let index = 0; index < 1000; index++) {
+    tmpList[index] = `${index}px`
+  }
+  return tmpList
+}
+
+const generateFontSize = () => {
+  const tmpList = {}
+  let start = 14
+  for (let index = 1; index < 50; index++) {
+    tmpList[`${index === 1 ? '' : index}xl`] = `${start + 2}px`
+    start = start + 2
+  }
+  return tmpList
+}
+
+module.exports = {
+  content: [
+    './src/components/**/*.{js,vue,ts}',
+    './src/layouts/**/*.vue',
+    './src/pages/**/*.vue',
+    './src/plugins/**/*.{js,ts}',
+    './src/app.vue',
+  ],
+  theme: {
+    // spacing: {
+    //   ...generateSpacingMap(),
+    //   wrap: '1200px'
+    // },
+    // fontSize: {
+    //   sm: '12px',
+    //   base: '14px',
+    //   ...generateFontSize()
+    // },
+    // lineHeight: {
+    //   sm: '12px',
+    //   base: '14px',
+    //   xl: '16px',
+    //   '2xl': '18px',
+    //   '3xl': '20px',
+    //   '4xl': '22px',
+    //   '5xl': '24px',
+    //   '6xl': '26px',
+    //   '7xl': '28px',
+    //   '8xl': '30px',
+    //   '9xl': '32px',
+    //   '11xl': '36px',
+    //   '12xl': '38px',
+    //   '14xl': '42px'
+    // },
+    // borderRadius: {
+    //   sm: '2px',
+    //   DEFAULT: '4px',
+    //   md: '6px',
+    //   lg: '8px',
+    //   xl: '10px',
+    //   '2xl': '12px',
+    //   '3xl': '14px',
+    //   '4xl': '16px',
+    //   '5xl': '18px',
+    //   '6xl': '20px',
+    //   full: '9999px'
+    // },
+
+    extend: {
+      colors: {
+        primary: '#F88842',
+        linkHover: '#F88842',
+        navEntryHover: 'rgba(0, 0, 0, 0.04)',
+        noticeContent: '#61687c',
+        'black-3': '#333333',
+        'black-4': '#444444',
+        'black-6': '#666666',
+        'black-9': '#999999',
+        'black-c': '#cccccc',
+        'black-d': '#dddddd',
+        'black-e': '#eeeeee',
+        'black-f5': '#f5f5f5',
+        'black-fa': '#fafafa',
+        'black-ef': '#efefef',
+        line: '#f8f8f8',
+      },
+      // boxShadow: {
+      //   '3xl': '0 0 12px 0 rgba(0,0,0,0.1)',
+      //   card: '0 3px 11px 1px rgba(93, 93, 03, 0.2)',
+      //   navEntry: '4px 0px 40px 0px rgba(93, 93, 03, 0.2)'
+      // },
+      // minWidth: {
+      //   wrap: '1200px',
+      // },
+      // fontFamily: {
+      //   youSheBiaoti: ['YouSheBiaoTiHei'],
+      //   DIN: ['DINAlternate-Bold, DINAlternate']
+      // },
+      letterSpacing: {
+        1: '2rpx',
+      },
+      // lineClamp: {
+      //   8: '8',
+      //   9: '9'
+      // }
+    },
+  },
+}

+ 1 - 1
uno.config.ts

@@ -76,7 +76,7 @@ export default defineConfig({
     ],
     ['pt-safe', { 'padding-top': 'env(safe-area-inset-top)' }],
     ['pb-safe', { 'padding-bottom': 'env(safe-area-inset-bottom)' }],
-    ['border', { border: '1rpx solid red' }],
+    // ['border', { border: '1rpx solid red' }],
     ['pb-tab', { 'padding-bottom': '144rpx' }],
   ],
 })

Some files were not shown because too many files changed in this diff