Browse Source

Initial commit

pull/2/head
永旺云 2 years ago
commit
7714f1d4c2
  1. 192
      .drone.yml
  2. 12
      .editorconfig
  3. 2
      .env.development
  4. 2
      .env.production
  5. 4
      .eslintignore
  6. 173
      .eslintrc.cjs
  7. 1
      .gitattributes
  8. 30
      .gitignore
  9. 4
      .husky/commit-msg
  10. 4
      .husky/pre-commit
  11. 1
      .nvmrc
  12. 4
      .prettierignore
  13. 14
      .prettierrc.json
  14. 32
      .releaserc
  15. 3
      .stylelintignore
  16. 151
      .stylelintrc.cjs
  17. 9
      .vscode/extensions.json
  18. 12
      .vscode/settings.json
  19. 444
      README.md
  20. 90
      commitlint.config.cjs
  21. 10
      env.d.ts
  22. 15
      index.html
  23. 134
      iot_upload.py
  24. BIN
      logo.jpg
  25. 9451
      package-lock.json
  26. 94
      package.json
  27. 23
      postcss.config.cjs
  28. BIN
      public/static/img/Q.png
  29. BIN
      public/static/img/Z.png
  30. 215
      public/static/img/dt.gltf
  31. 279
      public/static/img/elevator.gltf
  32. 275
      public/static/img/elevatorDown.gltf
  33. BIN
      public/static/img/guide.glb
  34. BIN
      public/static/img/map/Frosting.png
  35. BIN
      public/static/img/map/bl.png
  36. BIN
      public/static/img/map/brick.png
  37. BIN
      public/static/img/map/build.png
  38. BIN
      public/static/img/map/building.png
  39. BIN
      public/static/img/map/c50.png
  40. BIN
      public/static/img/map/edifice.png
  41. BIN
      public/static/img/map/front.png
  42. BIN
      public/static/img/map/grassland.png
  43. BIN
      public/static/img/map/grassland2.png
  44. BIN
      public/static/img/map/grey.png
  45. BIN
      public/static/img/map/ground.png
  46. BIN
      public/static/img/map/ground2.png
  47. BIN
      public/static/img/map/office.png
  48. BIN
      public/static/img/map/office2.png
  49. BIN
      public/static/img/map/square.png
  50. BIN
      public/static/img/model/IDS_H.glb
  51. BIN
      public/static/img/model/IDS_V.glb
  52. BIN
      public/static/img/model/bangongyi.glb
  53. BIN
      public/static/img/model/chechanglangan.glb
  54. BIN
      public/static/img/model/chongdianzhuang.glb
  55. BIN
      public/static/img/model/flower1.glb
  56. BIN
      public/static/img/model/flower2.glb
  57. BIN
      public/static/img/model/gjz1.glb
  58. BIN
      public/static/img/model/grass.glb
  59. BIN
      public/static/img/model/honglvdeng.glb
  60. BIN
      public/static/img/model/huatan1.glb
  61. BIN
      public/static/img/model/huatan2.glb
  62. BIN
      public/static/img/model/jt_left.glb
  63. BIN
      public/static/img/model/jt_left_up.glb
  64. BIN
      public/static/img/model/jt_right.glb
  65. BIN
      public/static/img/model/jt_right_up.glb
  66. BIN
      public/static/img/model/jt_turn.glb
  67. BIN
      public/static/img/model/jt_up.glb
  68. BIN
      public/static/img/model/ludeng.glb
  69. BIN
      public/static/img/model/lvzhi.glb
  70. BIN
      public/static/img/model/officeTV.glb
  71. BIN
      public/static/img/model/park_paly.glb
  72. BIN
      public/static/img/model/penquan2.glb
  73. BIN
      public/static/img/model/qiche1.glb
  74. BIN
      public/static/img/model/qiche2.glb
  75. BIN
      public/static/img/model/qiche3.glb
  76. BIN
      public/static/img/model/qiche4.glb
  77. BIN
      public/static/img/model/qiche5.glb
  78. BIN
      public/static/img/model/qiche6.glb
  79. BIN
      public/static/img/model/qiche7.glb
  80. BIN
      public/static/img/model/qiche8.glb
  81. BIN
      public/static/img/model/qiche9.glb
  82. BIN
      public/static/img/model/ren1.glb
  83. BIN
      public/static/img/model/ren2.glb
  84. BIN
      public/static/img/model/ren3.glb
  85. BIN
      public/static/img/model/ren4.glb
  86. BIN
      public/static/img/model/ren5.glb
  87. BIN
      public/static/img/model/ren6.glb
  88. BIN
      public/static/img/model/table.glb
  89. BIN
      public/static/img/model/taiyangsan.glb
  90. BIN
      public/static/img/model/tingchechang.glb
  91. 414
      public/static/img/model/tree.gltf
  92. BIN
      public/static/img/model/tree2.glb
  93. BIN
      public/static/img/model/tree3.glb
  94. BIN
      public/static/img/model/xiaofangshuan.glb
  95. BIN
      public/static/img/model/yizi1.glb
  96. BIN
      public/static/img/model/zuoyi1.glb
  97. BIN
      public/static/img/model/zuoyi2.glb
  98. BIN
      public/static/img/new-shop.png
  99. BIN
      public/static/img/noth.png
  100. BIN
      public/static/img/promotion.png

192
.drone.yml

@ -0,0 +1,192 @@
kind: pipeline
type: docker
name: 程序部署
host_aliases:
- ip: 192.168.0.2
hostnames:
- git.1000my.com
clone:
pull: if-not-exists
depth: 1
trigger:
branch:
- test
- master
event:
- push
volumes:
- name: dockersock
host:
path: /data/drone/docker/sock
- name: node
host:
path: /data/drone/node_modules-navigation
- name: localtime
host:
path: /etc/localtime
steps:
- name: 生成Release版本
pull: if-not-exists
image: registry.cn-hangzhou.aliyuncs.com/tgabc-namespace/tgabc:semantic-release-v21.0.1
environment:
GITEA_TOKEN:
from_secret: "gitea_token"
USER:
from_secret: "gitea_username"
PASSWD:
from_secret: "gitea_password"
obs_key:
from_secret: "obs_key"
obs_secret:
from_secret: "obs_secret"
settings:
git_login:
from_secret: gitea_username
git_password:
from_secret: gitea_password
- name: 获取tag数据
image: alpine/git:v2.36.2
environment:
GITEA_TOKEN:
from_secret: "gitea_token"
USER:
from_secret: "gitea_username"
PASSWD:
from_secret: "gitea_password"
obs_key:
from_secret: "obs_key"
obs_secret:
from_secret: "obs_secret"
commands:
- git config --global credential.helper store
- echo "https://$USER:$PASSWD@git.1000my.com" >> ~/.git-credentials
- env
- git fetch --tags
- git submodule init
- git submodule update --recursive --remote
# 获取当前分支的tag
- git describe --abbrev=0 --tags > .tags
- cat .tags
# - git fetch --tags
# - git describe --tags `git rev-list --tags --max-count=1` > .tags
# - cat .tags
- name: 代码构建
pull: if-not-exists
# image: registry.k8s.1000my.com/library/node:16.15.0-slim
image: node:20-buster
environment:
GITEA_TOKEN:
from_secret: "gitea_token"
USER:
from_secret: "gitea_username"
PASSWD:
from_secret: "gitea_password"
obs_key:
from_secret: "obs_key"
obs_secret:
from_secret: "obs_secret"
volumes:
- name: node
path: /drone/src/node_modules
settings:
mirror: https://docker.mirrors.ustc.edu.cn
commands:
# npm打包
- npm install
- npm run build
- chown -R 1000:1000 ./
when:
branch:
- test
- master
- name: zip构建
pull: if-not-exists
image: registry.cn-hangzhou.aliyuncs.com/qmiot/init:tizen
settings:
mirror: https://docker.mirrors.ustc.edu.cn
commands:
# zip打包
- mv dist target
- zip_name=$DRONE_REPO_NAME.$(cat .tags).zip
- cd ./target
- rm -rf static/offline
- zip -q -r $zip_name ./
- ls $zip_name
- ls
- pwd
when:
branch:
- test
- master
- name: 上传zip到iot测试接口platformProgramAdd
pull: if-not-exists
image: registry.cn-hangzhou.aliyuncs.com/qmiot/init:apisix-init-base
environment:
url_for_iotplatform: 'http://192.168.0.142:31667'
url_for_iotfile: 'http://192.168.0.142:31666'
logo: '/drone/src/logo.jpg'
cdn_url: 'https://test-598d.1000my.com'
# genre: "Samsung"
commands:
# # 自动授权
# - export projectCode="projectCode=project-inluar4ppcxvciefgb_ila"
- export name="导视_测试版" # 应用名称(自行填写 必填)
- export version=$(cat .tags) # 应用版本
- export sourceId="8" # 应用来源id(默认为8 即测试环境专用) //如需更改查看测试环境平台级下应用管理新增应用的/api/platform/v1/platformProgram/platformProgramAdd接口
- export genre="localpack" # 应用类型 本地资源包 [outchain, localpack]
- export resolution="2160*3840竖屏" # 分辨率(自行填写)[1080*1920竖屏, 1920*1080横屏, 3840*2160横屏, 2160*3840竖屏]
- export package="/drone/src/target/$DRONE_REPO_NAME.$(cat .tags).zip" # zip包名称
- export des=$CI_COMMIT_MESSAGE # 应用描述
- python3 iot_upload.py
when:
branch:
- test
- name: 上传zip到iot正式接口platformProgramAdd
pull: if-not-exists
image: registry.cn-hangzhou.aliyuncs.com/qmiot/init:apisix-init-base
environment:
url_for_iotplatform: 'http://192.168.0.11:31667'
url_for_iotfile: 'http://192.168.0.11:31666'
logo: '/drone/src/logo.jpg'
cdn_url: 'https://qianmu-iot.1000my.com'
# genre: "Samsung"
commands:
- export name="导视_正式版" # 应用名称(自行填写)
- export version=$(cat .tags) # 应用版本
- export sourceId="3" # 应用来源id
- export genre="localpack" # 应用类型 本地资源包
- export resolution="1920*1080横屏" # 分辨率(自行填写)[1080*1920竖屏, 1920*1080横屏, 3840*2160横屏, 2160*3840竖屏]
- export package="/drone/src/target/$DRONE_REPO_NAME.$(cat .tags).zip" # zip包名称
- export des=$CI_COMMIT_MESSAGE # 应用描述
- python3 iot_upload.py
when:
branch:
- master
- name: dingTalk notification
pull: if-not-exists
image: lddsb/drone-dingtalk-message
failure: ignore
settings:
token: dingTalk token #具体项目钉钉群机器人token
type: markdown
message_color: true
message_pic: true
sha_link: true
tips_title: "${CI_REPO_NAME}"
debug: true
success_color: "008000"
failure_color: "FF0000"
tpl_repo_short_name: "${CI_REPO_NAME}"
msg_at_mobiles: "@${CI_COMMIT_AUTHOR_NAME}"
success_pic: "https://raw.githubusercontent.com/Ethan-Liuu/picture/master/success.png"
failure_pic: "https://raw.githubusercontent.com/Ethan-Liuu/picture/master/failed.png"
tpl: '/drone/src/.tpl'
when:
status: [failure, success]

12
.editorconfig

@ -0,0 +1,12 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
max_line_length = 120
tab_width = 2
trim_trailing_whitespace = true

2
.env.development

@ -0,0 +1,2 @@
VITE_SENTRY_DSN_URL: http://936ea86f40634800857a65401ade2112@192.168.1.222:8000/3
VITE_SENTRY_ENVIRONMENT: development

2
.env.production

@ -0,0 +1,2 @@
VITE_SENTRY_DSN_URL: VITE_SENTRY_DSN_URL: http://936ea86f40634800857a65401ade2112@192.168.1.222:8000/3
VITE_SENTRY_ENVIRONMENT: production

4
.eslintignore

@ -0,0 +1,4 @@
node_modules
dist
public
.vscode

173
.eslintrc.cjs

@ -0,0 +1,173 @@
/* eslint-env node */
require('@rushstack/eslint-patch/modern-module-resolution')
module.exports = {
root: true,
extends: [
'plugin:vue/vue3-essential',
'eslint:recommended',
'@vue/eslint-config-typescript',
'@vue/eslint-config-prettier/skip-formatting'
],
parserOptions: {
ecmaVersion: 'latest'
},
rules: {
'@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/no-unused-vars': 'warn',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-var-requires': 1,
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'prettier/prettier': 'error',
'vue/multi-word-component-names': 'off',
'vue/attributes-order': [
'error',
{
order: [
'DEFINITION',
'LIST_RENDERING',
'CONDITIONALS',
'RENDER_MODIFIERS',
'GLOBAL',
['UNIQUE', 'SLOT'],
'TWO_WAY_BINDING',
'OTHER_DIRECTIVES',
'OTHER_ATTR',
'EVENTS',
'CONTENT'
],
alphabetical: false
}
],
'vue/component-name-in-template-casing': [
'error',
'PascalCase',
{
registeredComponentsOnly: false,
ignores: []
}
],
'vue/custom-event-name-casing': [
'error',
'kebab-case',
{
ignores: []
}
],
// 禁止出现console
'no-console': 'off',
// 禁止出现console
'no-var': 'warn',
// 禁用debugger
'no-debugger': 'warn',
// 禁止出现重复的 case 标签
'no-duplicate-case': 'warn',
// 禁止出现空语句块
'no-empty': 'warn',
// 禁止不必要的括号
'no-extra-parens': 'off',
// 禁止对 function 声明重新赋值
'no-func-assign': 'warn',
// 禁止在 return、throw、continue 和 break 语句之后出现不可达代码
'no-unreachable': 'warn',
// 强制所有控制语句使用一致的括号风格
curly: 'warn',
// 要求 switch 语句中有 default 分支
'default-case': 'warn',
// 强制尽可能地使用点号
'dot-notation': 'warn',
// 要求使用 === 和 !==
eqeqeq: 'error',
// 禁止 if 语句中 return 语句之后有 else 块
'no-else-return': 'error',
// 禁止出现空函数
'no-empty-function': 'warn',
// 禁用不必要的嵌套块
'no-lone-blocks': 'warn',
// 禁止使用多个空格
'no-multi-spaces': 'warn',
// 禁止多次声明同一变量
'no-redeclare': 'warn',
// 禁止在 return 语句中使用赋值语句
'no-return-assign': 'warn',
// 禁用不必要的 return await
'no-return-await': 'warn',
// 禁止自我赋值
'no-self-assign': 'warn',
// 禁止自身比较
'no-self-compare': 'warn',
// 禁止不必要的 catch 子句
'no-useless-catch': 'warn',
// 禁止多余的 return 语句
'no-useless-return': 'warn',
// 禁止变量声明与外层作用域的变量同名
'no-shadow': 'off',
// 允许delete变量
'no-delete-var': 'off',
// 强制数组方括号中使用一致的空格
'array-bracket-spacing': 'warn',
// 强制在代码块中使用一致的大括号风格
'brace-style': 'warn',
// 强制使用骆驼拼写法命名约定
camelcase: 'warn',
// 强制使用一致的缩进
indent: 'off',
// 强制在 JSX 属性中一致地使用双引号或单引号
// 'jsx-quotes': 'warn',
// 强制可嵌套的块的最大深度4
'max-depth': 'warn',
// 强制最大行数 300
// "max-lines": ["warn", { "max": 1200 }],
// 强制函数最大代码行数 50
// 'max-lines-per-function': ['warn', { max: 70 }],
// 强制函数块最多允许的的语句数量20
'max-statements': ['warn', 100],
// 强制回调函数最大嵌套深度
'max-nested-callbacks': ['warn', 3],
// 强制函数定义中最多允许的参数数量
'max-params': ['warn', 5],
// 强制每一行中所允许的最大语句数量
'max-statements-per-line': ['warn', { max: 1 }],
// 要求方法链中每个调用都有一个换行符
'newline-per-chained-call': ['warn', { ignoreChainWithDepth: 3 }],
// 禁止 if 作为唯一的语句出现在 else 语句中
'no-lonely-if': 'warn',
// 禁止空格和 tab 的混合缩进
'no-mixed-spaces-and-tabs': 'warn',
// 禁止出现多行空行
'no-multiple-empty-lines': 'warn',
// 禁止出现;
semi: ['warn', 'never'],
// 强制在块之前使用一致的空格
'space-before-blocks': 'warn',
// 强制在 function的左括号之前使用一致的空格
// 'space-before-function-paren': ['warn', 'never'],
// 强制在圆括号内使用一致的空格
'space-in-parens': 'warn',
// 要求操作符周围有空格
'space-infix-ops': 'warn',
// 强制在一元操作符前后使用一致的空格
'space-unary-ops': 'warn',
// 强制在注释中 // 或 /* 使用一致的空格
// "spaced-comment": "warn",
// 强制在 switch 的冒号左右有空格
'switch-colon-spacing': 'warn',
// 强制箭头函数的箭头前后使用一致的空格
'arrow-spacing': 'warn',
'prefer-const': 'warn',
'prefer-rest-params': 'warn',
'no-useless-escape': 'warn',
'no-irregular-whitespace': 'warn',
'no-prototype-builtins': 'warn',
'no-fallthrough': 'warn',
'no-extra-boolean-cast': 'warn',
'no-case-declarations': 'warn',
'no-async-promise-executor': 'warn'
}
}

1
.gitattributes

@ -0,0 +1 @@
* text=auto eol=lf

30
.gitignore

@ -0,0 +1,30 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
.eslintcache
dist
dist-ssr
coverage
*.local
tsconfig.app.tsbuildinfo
tsconfig.node.tsbuildinfo
vite.config.ts.*
/cypress/videos/
/cypress/screenshots/
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

4
.husky/commit-msg

@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx --no -- commitlint --edit $1

4
.husky/pre-commit

@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged

1
.nvmrc

@ -0,0 +1 @@
v20.10.0

4
.prettierignore

@ -0,0 +1,4 @@
node_modules
dist
public
.vscode

14
.prettierrc.json

@ -0,0 +1,14 @@
{
"plugins": [
"prettier-plugin-tailwindcss"
],
"tabWidth": 2,
"jsxSingleQuote": true,
"jsxBracketSameLine": true,
"endOfLine": "lf",
"printWidth": 140,
"arrowParens": "avoid",
"singleQuote": true,
"semi": false,
"trailingComma": "none"
}

32
.releaserc

@ -0,0 +1,32 @@
{
"branches": [
"master", {
"name": "test", "prerelease": "beta"
},
"test", {
"name": "dev", "prerelease": "dev"
}
],
"plugins": [
["@semantic-release/commit-analyzer", {
"preset": "angular",
"releaseRules": [
{"type": "docs", "scope":"README", "release": "patch"},
{"type": "refactor", "release": "patch"},
{"type": "style", "release": "patch"}
],
"parserOpts": {
"noteKeywords": ["BREAKING CHANGE", "BREAKING CHANGES"]
}
}],
"@semantic-release/release-notes-generator",
"@semantic-release/git",
["@saithodev/semantic-release-gitea", {
"giteaUrl": "https://git.1000my.com",
"assets": [
{"path": "compose-update.bin", "label": "gcc"},
{"path": "doc/up.prod.sql", "label": "线上环境更新SQL(up.prod.sql)"}
]
}]
]
}

3
.stylelintignore

@ -0,0 +1,3 @@
node_modules/*
dist

151
.stylelintrc.cjs

@ -0,0 +1,151 @@
module.exports = {
extends: [
'stylelint-config-standard',
'stylelint-config-recommended-scss',
'stylelint-config-standard-vue',
],
plugins: ['stylelint-order'],
// 不同格式的文件指定自定义语法
overrides: [
{
files: ['**/*.(scss|css|vue|html)'],
customSyntax: 'postcss-scss',
},
{
files: ['**/*.(html|vue)'],
customSyntax: 'postcss-html',
},
],
ignoreFiles: ['**/*.js', '**/*.jsx', '**/*.tsx', '**/*.ts', '**/*.json', '**/*.md', '**/*.yaml'],
rules: {
'custom-property-empty-line-before': null,
// 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器
'no-descending-specificity': null,
'selector-pseudo-element-no-unknown': [
true,
{
ignorePseudoElements: [':deep'],
},
],
'selector-pseudo-class-no-unknown': [
true,
{
ignorePseudoClasses: ['deep'],
},
],
// 禁用每个选择器之前插入空行
'rule-empty-line-before': null,
// 禁止小于 1 的小数有一个前导零
// 'number-leading-zero': 'never',
// 一些特殊的scss指令
'at-rule-no-unknown': [
true,
{
ignoreAtRules: [
'function',
'if',
'else',
'else-if',
'each',
'include',
'mixin',
'tailwind',
'apply',
'variants',
'responsive',
'screen',
],
},
],
'scss/at-rule-no-unknown': [
true,
{
ignoreAtRules: ['tailwind', 'apply', 'variants', 'responsive', 'screen', 'cx', 'cy', 'r'],
},
],
'at-rule-empty-line-before': [
'always',
{
except: ['blockless-after-same-name-blockless', 'first-nested'],
ignore: ['after-comment'],
ignoreAtRules: ['else', 'else-if'],
},
],
// 指定样式的排序
'order/properties-order': [
'position',
'top',
'right',
'bottom',
'left',
'z-index',
'display',
'justify-content',
'align-items',
'flex-shrink',
'float',
'clear',
'overflow',
'overflow-x',
'overflow-y',
'width',
'min-width',
'max-width',
'height',
'min-height',
'max-height',
'padding',
'padding-top',
'padding-right',
'padding-bottom',
'padding-left',
'margin',
'margin-top',
'margin-right',
'margin-bottom',
'margin-left',
'font-size',
'font-family',
'text-align',
'text-justify',
'text-indent',
'text-overflow',
'text-decoration',
'white-space',
'color',
'background',
'background-position',
'background-repeat',
'background-size',
'background-color',
'background-clip',
'border',
'border-style',
'border-width',
'border-color',
'border-top-style',
'border-top-width',
'border-top-color',
'border-right-style',
'border-right-width',
'border-right-color',
'border-bottom-style',
'border-bottom-width',
'border-bottom-color',
'border-left-style',
'border-left-width',
'border-left-color',
'border-radius',
'opacity',
'filter',
'list-style',
'outline',
'visibility',
'box-shadow',
'text-shadow',
'resize',
'transition',
'content',
],
},
}

9
.vscode/extensions.json

@ -0,0 +1,9 @@
{
"recommendations": [
"vscode.i18n-ally",
"dbaeumer.vscode-eslint",
"vscode.stylelint",
"vscode.Tailwind-css-IntelliSense",
"esbenp.prettier-vscode"
]
}

12
.vscode/settings.json

@ -0,0 +1,12 @@
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
},
"css.validate": false,
"scss.validate": false,
"files.eol": "\n",
"i18n-ally.localesPaths": [
"src/locales/lang"
]
}

444
README.md

@ -0,0 +1,444 @@
# vite_ts
### vue+vue-router+pinia+vite+typescript+prettier+eslint+stylelint+lint-staged+commitlint+tailwindcss
### 打包工具由webpack换成vite
### node版本请使用node18及以上
## 推荐使用node版本管理工具nvm
## 使用package.json内的脚本 'npm run commit' 提交代码
## 使用package.json内的脚本 'npm run commit' 提交代码
## 全局状态存储中以 map 为前缀的state状态都是用于数据检索用的 不建议用于页面展示
## css框架使用了tailwindcss
## 标准图标库 https://www.figma.com/file/cVbg9b6kIGiFdtgEisnMBo/NEW%E7%BB%84%E4%BB%B6%E5%BA%93?type=design&node-id=26%3A2189&mode=dev
## 地图sdk https://1000my.com/mapapidoc/index.html
解决文件行尾与prettier冲突 新项目根目录下新建.gitattributes文件(详细解决方案:https://juejin.cn/post/6844904062987550733)
```shell
老项目添加需要执行以下git命令
git rm --cached -r .
git reset --hard
.gitattributes
*.js eol=lf
*.jsx eol=lf
*.json eol=lf
```
# iconfont字体图标渐变色
```html
<!-- tailwindcss -->
<i class="iconfont icon-zhitimoshi bg-gradient-to-r from-pink-500 to-violet-500 bg-clip-text text-64 text-transparent"></i>
```
```css
.iconfont {
background-clip: text;
-webkit-text-fill-color: transparent;
background-image: linear-gradient(180deg, #BB8A65 0%, #E3BA9B 100%);
}
```
# 导视开发提测流程
1. 修改项目中根目录下的`.drone.yml`找到`name: 上传zip到iot测试接口platformProgramAdd文件`配置,如下所示:
```yml
commands:
# # 自动授权
# - export projectCode="projectCode=project-inluar4ppcxvciefgb_ila"
- export name="导视包ci流程测试" # 应用名称(自行填写 必填)
- export version=$(cat .tags) # 应用版本 (无需填写)
- export sourceId="8" # 应用来源id(默认为8 即测试环境专用 保持默认即可)
- export genre="localpack" # 应用类型 本地资源包 保持默认即可 [outchain, localpack]
- export resolution="1080*1920竖屏" # 分辨率(自行填写)[1080*1920竖屏, 1920*1080横屏, 3840*2160横屏, 2160*3840竖屏]
- export package="/drone/src/target/$DRONE_REPO_NAME.$(cat .tags).zip" # zip包名称 保持默认即可
- export des=$CI_COMMIT_MESSAGE # 应用描述 保持默认即可
- python3 iot_upload.py
```
2. 修改项目中根目录下的`.tpl`文件中的**git地址**配置,如下所示:
```tpl
<!-- 在.tpl文件的第6行,修改项目git地址 -->
<font color=[TPL_STATUS_COLOR] size="3">
项目git地址:https://git.1000my.com/
</font>
<!-- 以上海浦项写字楼项目为例,如下所示: -->
<font color=[TPL_STATUS_COLOR] size="3">
项目git地址:https://git.1000my.com/project_shpuxiang/shpuxiang_daoshi_vue
</font>
```
3. 钉钉**群机器人**配置([钉钉机器人接入官方文档](https://open.dingtalk.com/document/group/custom-robot-access))
* 在项目钉钉群界面点击右上角的**群设置**按钮。
* 在群设置界面点击**智能群助手**按钮。
* 在智能群助手界面点击**添加机器人**按钮。
* 在弹出的弹窗界面中点击添加机器人右边的**小齿轮**按钮。
* 在选择添加机器人列表中选择**自定义机器人**。
* 在机器人详情界面点击**添加**按钮。
* 在添加机器人界面可以修改机器人的**头像**以及**名字**,在**安全设置**选项中选择**自定义关键字**,并添加**地址**关键字,勾选**我已阅读并同意《自定义机器人服务及免责条款**》,然后点击**完成**按钮。
* 完成创建后会自动生成机器人的**Webhook**地址,例如:`https://oapi.dingtalk.com/robot/send?access_token=XXXXXX`。复制地址中的`access_token=`后面的值,修改项目中根目录下的`.drone.yml`文件中的**钉钉机器人token**配置,如下所示:
```yml
# 钉钉通知
- name: dingTalk notification
pull: if-not-exists
image: lddsb/drone-dingtalk-message
failure: ignore
settings:
token: 5f1337cd8cb70e007d2693f70a3ca89fdec543781a9a9fe2f5519e061a1820a8
```
4. 项目提测步骤:
* 通过`npm run commit`命令提交本地代码。
* `git push `提交代码到项目远端dev分支
* 在远端仓库合并`dev`分支到`test`分支
6. Vue3常用工具库函数[VueUse](https://vueuse.org/)
7. 开发 及内置组件使用说明见以下文档
8. 所有需要写在App.vue内的组件请放到PublicComponent组件
10. 地图SDK地址:https://1000my.com/mapapidoc/index.html
11. **所有跳到导航页面之前请先调用 @/utils/Class/Brand.ts 来生成一个新的shop数据 以更新store内的shop数据 (本身操作是店铺除外)看以下demo**
12. ```typescript
function nav(activity: Activity) {
return new Promise<Shop>((resolve, reject) => {
if (activity.shopCode?.length) {
const shop = mapShopListByCode.value[activity.shopCode]?.[0]
if (shop) {
resolve(shop)
} else {
reject('Unable to match store')
}
return
}
if (activity.point?.length) {
const { title, point, fileUrl, titleEn } = activity
const [buildingOrder, floorOrder, yaxis] = splitStringToArray(point)
const navBuildingInfo = buildingList.value.find(item => item.buildingOrder === buildingOrder)
const shop = new Brand({
shopName: title,
shopNameEn: titleEn,
floorOrder,
floor: navBuildingInfo?.floorList?.find(item => item.floorOrder === floorOrder)?.floor ?? '',
logoUrl: fileUrl[0],
yaxis,
buildingOrder,
building: navBuildingInfo?.building
})
resolve(shop)
}
})
}
```
# 组件使用
### AutoBackNotification
| props | type | desc | default |
| :---: | :----: | :----------: | :-----: |
| title | string | 提示文字 | '' |
| delay | number | 倒计时的数字 | 0 |
### Marquees
| props | type | desc | default |
| :-----: | :----: | :---------------------: | :-----: |
| content | string | 滚动的内容 | '' |
| delay | number | 第一次滚动时的延迟 时间 | 0.8 |
| speed | number | 滚动速度 | 40 |
### Icon
| props | type | desc | default |
| :---: | :------: | :------: | :--------------: |
| type | IconType | 图标类型 | '' |
| color | string | 填充颜色 | rgba(0, 0, 0, 1) |
Icon组件大小由父容器决定 所以需要给父容器指定宽高 type类型详见icon.d.ts
### Tabs
| props | type | desc | default |
| :-----------: | :-------: | :--------: | :-----: |
| list | TabItem[] | 数据源 | [] |
| indicateColor | string | 选中的颜色 | #fff |
TabItem类型 详见base.d.ts
| events | type | desc |
| :----: | :-----------------------------------: | :-----: |
| click | (item: TabItem, index: number)=>void | 点击tab |
组件默认ui无法满足设计稿时 可直接修改组件源码以满足设计稿 或者通过slot插槽自定义ui 详见以下demo
```html
<Tabs :list="tabs" class="p-1" indicate-color="#333">
<template #default="{ item, index, tabActiveIndex }">
<div class="relative z-0 p-11 flex-center">
<div class="h-10 w-10">
<Icon :type="item.icon" />
</div>
<div class="text-24 transition-all" :class="index === tabActiveIndex ? 'text-white' : 'text-gray-400'">
<p class="leading-none">{{ item.title }}</p>
<p class="leading-none">{{ item.titleEn }}</p>
</div>
</div>
</template>
</Tabs>
```
### ScrollView
| props | type | desc | default |
| :-------------: | :-------------: | :----------------------------------------------------------: | :-----: |
| list | array \| string | 监听的数据源 当数据源改动时会自动调用refresh重新计算滚动高度 | - |
| scrollbar | boolean | 显示滚动条 | false |
| scrollX | boolean | 是否需要横向滚动 | false |
| refreshDelay | number | 延迟初始化实例的时间 | 20 |
| scrollTop | boolean | 当list数据改变时是否自动回到顶部或者左边(scrollX为true时) | true |
| observeImage | boolean | 是否监听图片(有瀑布流布局的地方建议开启) | false |
| stopPropagation | boolean | 是否阻止事件冒泡。多用在嵌套 scroll 的场景。 | false |
| pullUp | boolean | 是否下拉刷新 | false |
### EffectFade
| props | type | desc | default |
| :--------: | :--------------------------: | :----------------: | :-----: |
| list | array | 内部渲染需要的数据 | [] |
| pagination | boolean \| PaginationOptions | 是否开启提示点 | false |
**此组件只初始化swiper轮播等相关逻辑 只做展示 dom节点自行实现 通过作用域插槽可拿到循环的每一项数据 作用域插槽字段: `{ item }`**
```javascript
<script lang="ts" setup>
import {ref} from 'vue'
import EffectFade from '@/components/EffectFade/EffectFade.vue'
const list = [
'https://img1.baidu.com/it/u=847956157,2750448390&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1695402000&t=85436b1a506b8cb8849887ab93c4ea2f',
'https://img0.baidu.com/it/u=937072262,2445742246&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1695402000&t=61d122c4ffd7b8f9e5feee57e4eff73a'
]
</script>
<template>
<div class="w-[400px] h-[150px] mx-auto">
<EffectFade pagination :list="list">
<template v-slot="{ item }">
<div class="w-[400px] h-[150px]">
<img :src="item" class="cover" alt="" />
</div>
</template>
</EffectFade>
</div>
</template>
```
### Written(手写组件的父元素需指定宽高)
| props | type | desc | default |
| :-------------: | :----: | :-----------------------------------: | :-------------------: |
| backgroundColor | string | canvas 背景色 | #f2f2f2 |
| borderRadius | string | canvas的圆角 | 10px |
| fillText | string | canvas绘制区域的提示文字 | 手写区域 |
| fillFontSize | string | canvas绘制区域的提示文字大小 | 100px |
| fillStyle | string | canvas绘制区域的提示文字颜色 | rgba(85, 73, 54, 0.1) |
| lang | string | CN \| EN 指定接口返回的是字母还是汉字 | CN |
| strokeStyle | string | 笔触的颜色 | #000 |
| events | type | desc | callback params |
| :----: | :------: | :------------------------------: | :----------------------------: |
| result | function | 组件内部响应式变量list变化时触发 | 接口请求成功之后返回的汉字列表 |
### PlateInput
| props | type | desc | default |
| :----------: | :------------: | :--------------: | :-----: |
| List | array | 车牌号或者车位号 | [] |
| btnText | string | 按钮提示文字 | '' |
| searchMethod | '车牌'\|'车位' | 找车方式 | '车牌' |
| events | type | desc |
| :----------: | :------: | :-------------------------: |
| handle-input | function | 点击输入框 |
| confirm | function | 确认找车 即点击找车按钮触发 |
**车牌输入框组件现在接受一个slot插槽 可以用来点击时显示loading提示或其他内容**
### PlateKeyboard
| props | type | desc | default |
| :-----------: | :----: | :--------------------------: | :-----: |
| searchMethods | string | 找车方式 ['车牌', '车位'] | '车牌' |
| events | type | desc |
| :-------------: | :------: | :------------------------------------------------------: |
| handle-keyboard | function | 点击找车键盘 参数为点击时的文字 如果为del则会触发del事件 |
| del | function | 删除 |
### Lottie动画组件
| props | type | desc | default |
| :------: | :--------------: | :----------------: | :-----: |
| isLocale | boolean | 是否是json本地文件 | true |
| path | Record<any, any> | 动画数据 | {} |
<!--组件会暴露内部lottie动画实例 :lottieInstance-->
# composition hooks 使用
### 活动导航
```javascript
const { nav } = useActivityNav() //nav接受参数类型
async function _nav(activity: Activity) {
await nav(activity)
//your code ...
}
```
### 通用导航的hooks
```javascript
<template>
<ScrollView ref="scroll" :list="pathShopList">
<div>
<!-- 经过店铺ui自行实现 -->
</div>
</ScrollView>
</template>
<script setup lang="ts">
import ScrollView from '@/base/ScrollView/ScrollView.vue'
//滚动组件实例传入hooks 在状态改变时能够使其重新计算 重新滚动到顶部
const scroll = ref<InstanceType<typeof ScrollView> | null>(null)
/*
directionInfo: 方向信息
pathShopList: 经过店铺
startNavi: 导航
backPathArray: 导航函数执行时的回调
*/
const { directionInfo, pathShopList, startNavi, backPathArray } = useStartNavi()
/*
passIdx: 经过店铺列表的经过状态索引
reset: 重置索引
*/
const { passIdx, reset } = usePassActive(pathShopList)
/*
replay:重播
pause:暂停
speedUp:加速
handleReplay:设置重播
togglePause: 设置暂停
handleSpeedUp: 设置加速
resetPause: 暂停初始化
scroll是ScrollView组件实例
*/
const { replay, pause, speedUp, handleReplay, togglePause, handleSpeedUp, resetPause } = useMapNavControl(reset, scroll)
/*
methodsList: 路线列表 视图层绑定
methodIdx: 路线选中索引
handleControl:路线选择
selectedWayMethod:此函数大多数情况无需调用 只需调用handleControl即可
*/
const { methodIdx, methodsList, handleControl, resetMethodIdx } = useChangeNavMethod(backPathArray, resetPause, reset, scroll)
/*
viewIcon: 文字及提示icon信息
setCameraViews: 导航视角
setText:设置文字
*/
const { viewIcon, setCameraViews, setText } = useCameraViews()
</script>
```
### 日期及天气
```javascript
const {whickWeek} = useDay()
const {currentTime} = useTime()
const {weather, icon} = useWeather()
```
### useSearchShop.ts
```javascript
import {ref} from 'vue'
import {useSearchShop} from '@/composables/useSearchShop'
const keywords = ref('')
const searchMethods = ref(0) //0:键盘搜索 1:手写搜索
//筛选之后的店铺列表
const {searchShopList} =useSearchShop(keywords,searchMethods)
```
### usePage.ts
```javascript
<ScrollView ref="scroll" pull-up @scroll-end="scrollEnd" :list="pathShopList">
<div>
your html code...
</div>
</ScrollView>
const { scrollEnd, pageList, loaded } =usePage(shopList, scroll)
```
### <!--ScrollView组件需开启pullUp 更具体使用详见具体项目 -->
## 其余hooks详见脚手架内的composables文件夹
# 项目内使用的工具函数
```javascript
import {
randomNumber, //两个数字之间的随机数
isPhoneNumber, // 手机号码验证
isUppercaseWord, //是否是大写
isZhWord, //是否是中文
isNumber, //是否是数字
isLicensePlate //验证输入车牌是否正确
uniqBy //数组内对象去重
futureDate, //未来几天 默认七天
formatDay, // 格式化年月日
isInDuringDate, //当前时间是否在指定时间段内
addPrefixByRecursive, //指定的资源加上地址前缀
splitStringToArray, //字符串点位转换成数组需以下划线 '_' 连接
trimAll //去除字符串所有空格
} from '@/utils/utils'
```

90
commitlint.config.cjs

@ -0,0 +1,90 @@
// @see: https://cz-git.qbenben.com/zh/guide
/** @type {import('cz-git').UserConfig} */
/* eslint-env node */
module.exports = {
ignores: [commit => commit.includes('init')],
extends: ['@commitlint/config-conventional'],
prompt: {
messages: {
type: '选择你要提交的类型 :',
scope: '选择一个提交范围(可选):',
customScope: '请输入自定义的提交范围 :',
subject: '填写简短精炼的变更描述 :\n',
body: '填写更加详细的变更描述(可选)。使用 "|" 换行 :\n',
breaking: '列举非兼容性重大的变更(可选)。使用 "|" 换行 :\n',
footerPrefixsSelect: '选择关联issue前缀(可选):',
customFooterPrefixs: '输入自定义issue前缀 :',
footer: '列举关联issue (可选) 例如: #31, #I3244 :\n',
confirmCommit: '是否提交或修改commit ?'
},
types: [
{ value: 'feat', name: 'feat: 🚀 新增功能 | A new feature', emoji: '🚀' },
{ value: 'fix', name: 'fix: 🧩 修复缺陷 | A bug fix', emoji: '🧩' },
{ value: 'docs', name: 'docs: 📚 文档更新 | Documentation only changes', emoji: '📚' },
{
value: 'style',
name: 'style: 🎨 代码格式 | Changes that do not affect the meaning of the code',
emoji: '🎨'
},
{
value: 'refactor',
name: "refactor: '♻️'代码重构(不包括 bug 修复、功能新增) | A code change that neither fixes a bug nor adds a feature",
emoji: '♻️'
},
{
value: 'perf',
name: 'perf: ⚡️️性能提升 | A code change that improves performance',
emoji: '⚡️'
},
{
value: 'test',
name: 'test: ✅ 测试相关 | Adding missing tests or correcting existing tests',
emoji: '✅'
},
{
value: 'build',
name: 'build: 📦️ 构建相关 | Changes that affect the build system or external dependencies',
emoji: '📦️'
},
{
value: 'ci',
name: 'ci: 🎡 持续集成 | Changes to our CI configuration files and scripts',
emoji: '🎡'
},
{ value: 'revert', name: 'revert: ⏪️ 回退代码 | Revert to a commit', emoji: '⏪️' },
{
value: 'chore',
name: 'chore: 🔨 其他修改 | Other changes that do not modify src or test files',
emoji: '🔨'
}
],
useEmoji: true,
themeColorCode: '',
scopes: [],
allowCustomScopes: true,
allowEmptyScopes: true,
customScopesAlign: 'bottom',
customScopesAlias: 'custom',
emptyScopesAlias: 'empty',
upperCaseSubject: false,
allowBreakingChanges: ['feat', 'fix'],
breaklineNumber: 100,
breaklineChar: '|',
skipQuestions: [],
issuePrefixs: [{ value: 'closed', name: 'closed: ISSUES has been processed' }],
customIssuePrefixsAlign: 'top',
emptyIssuePrefixsAlias: 'skip',
customIssuePrefixsAlias: 'custom',
allowCustomIssuePrefixs: true,
allowEmptyIssuePrefixs: true,
confirmColorize: true,
maxHeaderLength: Infinity,
maxSubjectLength: Infinity,
minSubjectLength: 0,
scopeOverrides: undefined,
defaultBody: '',
defaultIssues: '',
defaultScope: '',
defaultSubject: ''
}
}

10
env.d.ts

@ -0,0 +1,10 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_SENTRY_DSN_URL: string
readonly VITE_SENTRY_ENVIRONMENT: string
}
interface ImportMeta {
readonly env: ImportMetaEnv
}

15
index.html

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
<script src="./static/qm/three.js"></script>
<script src="./static/qm/MainMap_QM.js"></script>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

134
iot_upload.py

@ -0,0 +1,134 @@
import json
import os
import requests
def file_write(file_name,text_content):
# charset()
file = open(file_name , "w")
file.write(str(text_content))
file.close()
def dingtalk(cdn_url,packageUrl):
tpl_for_dingtalk=f'''
<font color=[TPL_STATUS_COLOR] size="3">
下载地址: (<a href="{cdn_url}{packageUrl}" target="_blank">{cdn_url}{packageUrl}</a>)
</font>
![image]([TPL_STATUS_PIC])
项目名称[PLUGIN_TPL_REPO_SHORT_NAME]
更新作者: [CI_COMMIT_AUTHOR_NAME]
<font color=[TPL_STATUS_COLOR] size="3">
更新内容[TPL_COMMIT_MSG]
</font>
[ [查看构建详情)]]([TPL_BUILD_LINK])
'''
print (tpl_for_dingtalk)
file_write("./.tpl",tpl_for_dingtalk)
def obsUpload(file,uploadType):
url_obsUpload = os.getenv('url_for_iotfile') + "/api/file/v1/attachment/obsUpload"
myfiles = {'file': open(file, 'rb')}
mydata = {'uploadType': uploadType}
r = requests.post(url_obsUpload, data=mydata, files=myfiles)
print (r.text)
json_str = r.text
info = json.loads(json_str)['data']
return info
# APP管理-新增APP
def platformAppAdd():
# with open(".tags") as f: version = f.read().strip()
logoFile = obsUpload(file=str(os.getenv('logo')), uploadType='logo')
packageFile = obsUpload(file=str(os.getenv('package')),uploadType='compress')
bodyjson = {
'name': os.getenv('name'),
'version': os.getenv('version'),
'genre': os.getenv('genre'),
'logoCode': logoFile['code'],
'logoUrl': logoFile['url'],
'packageCode': packageFile['code'],
'packageUrl': packageFile['url'],
'des': os.getenv('des')
}
print (bodyjson)
url_platformAppAdd = os.getenv('url_for_iotplatform') + "/api/platform/v1/platformApp/platformAppAdd"
headers = {'content-type': 'application/json;charset=UTF-8'}
r = requests.post(url_platformAppAdd, headers=headers, data=json.dumps(bodyjson))
print (r.text)
cdn_url = os.getenv('cdn_url')
packageUrl = packageFile['url']
dingtalk(cdn_url,packageUrl)
# 应用管理-授权(获取code list)
def getPlatformProgramList():
bodyjson = {
'name': os.getenv('name'),
'version': os.getenv('version'),
'genre': os.getenv('genre'),
}
print (bodyjson)
url_platformAppAdd = os.getenv('url_for_iotplatform') + "/api/platform/v1/platformProgram/getPlatformProgramList/1/10"
headers = {'content-type': 'application/json;charset=UTF-8'}
r = requests.post(url_platformAppAdd, headers=headers, data=json.dumps(bodyjson))
print (type(json.loads(r.text)))
print (json.loads(r.text)['data']["listObject"][0]['code'])
return json.loads(r.text)['data']["listObject"][0]['code']
# 应用管理-授权
def multipleProgramToOneProject():
codeList = getPlatformProgramList()
bodyjson = {
"projectCode": os.getenv('projectCode'),
"codeList": [codeList]
}
print (bodyjson)
url_platformAppAdd = os.getenv('url_for_iotplatform') + "/api/platform/v1/platformProgram/multipleProgramToOneProject"
headers = {'content-type': 'application/json;charset=UTF-8'}
r = requests.post(url_platformAppAdd, headers=headers, data=json.dumps(bodyjson))
print (r.text)
# 应用管理-新增应用
def platformProgramAdd():
# with open(".tags") as f: version = f.read().strip()
logoFile = obsUpload(file=str(os.getenv('logo')), uploadType='logo')
packageFile = obsUpload(file=str(os.getenv('package')),uploadType='compress')
bodyjson = {
'name': os.getenv('name'),
'version': os.getenv('version'),
'genre': os.getenv('genre'),
'sourceId': os.getenv('sourceId'),
"resolution": os.getenv('resolution'),
'logoCode': logoFile['code'],
'logoUrl': logoFile['url'],
'packageCode': packageFile['code'],
'packageUrl': packageFile['url'],
'des': os.getenv('des')
}
print (bodyjson)
url_platformAppAdd = os.getenv('url_for_iotplatform') + "/api/platform/v1/platformProgram/platformProgramAdd"
headers = {'content-type': 'application/json;charset=UTF-8'}
r = requests.post(url_platformAppAdd, headers=headers, data=json.dumps(bodyjson))
print (r.text)
cdn_url = os.getenv('cdn_url')
packageUrl = packageFile['url']
dingtalk(cdn_url,packageUrl)
# 自动授权
# multipleProgramToOneProject()
platformProgramAdd()

BIN
logo.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

9451
package-lock.json

File diff suppressed because it is too large

94
package.json

@ -0,0 +1,94 @@
{
"name": "vite-project",
"version": "0.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite --host",
"build-check": "run-p type-check \"build-only {@}\" --",
"preview": "vite preview",
"build": "vite build",
"type-check": "vue-tsc --build --force",
"eslint": "eslint . --ext .js,.jsx,.ts,.tsx,.vue",
"eslint:fix": "eslint . --fix --ext .js,.jsx,.ts,.tsx,.vue",
"lint": "eslint . --ext .vue,.js,.jsx,.ts,.tsx --fix",
"stylelint": "stylelint \"./**/*.{css,scss,sass,vue,html}\"",
"stylelint:fix": "stylelint \"./**/*.{css,scss,sass,vue,html}\" --fix",
"format": "prettier --write src/",
"commit": "git add . && git-cz",
"prepare": "husky"
},
"dependencies": {
"@better-scroll/core": "^2.5.1",
"@better-scroll/observe-image": "^2.5.1",
"@better-scroll/scroll-bar": "^2.5.1",
"@sentry/integrations": "^7.102.0",
"@sentry/vue": "^7.102.0",
"@vueuse/core": "^10.8.0",
"animate.css": "^4.1.1",
"axios": "^1.6.7",
"lodash-es": "^4.17.21",
"lottie-web": "^5.12.2",
"pinia": "^2.1.7",
"swiper": "^11.1.1",
"vue": "^3.4.15",
"vue-i18n": "^9.9.1",
"vue-router": "^4.2.5",
"vue3-lazyload": "^0.3.8"
},
"devDependencies": {
"@commitlint/cli": "^18.6.1",
"@commitlint/config-conventional": "^18.6.2",
"@rushstack/eslint-patch": "^1.3.3",
"@tsconfig/node20": "^20.1.2",
"@types/lodash-es": "^4.17.12",
"@types/node": "^20.11.10",
"@vitejs/plugin-vue": "^5.0.3",
"@vue/eslint-config-prettier": "^8.0.0",
"@vue/eslint-config-typescript": "^12.0.0",
"@vue/tsconfig": "^0.5.1",
"autoprefixer": "^10.4.17",
"commitizen": "^4.3.0",
"cz-git": "^1.8.0",
"eslint": "^8.49.0",
"eslint-plugin-vue": "^9.17.0",
"husky": "^9.0.11",
"lint-staged": "^15.2.2",
"mrm": "^0.1.2",
"npm-run-all2": "^6.1.1",
"pinia-logger": "^1.3.12",
"postcss": "^8.4.35",
"postcss-html": "^1.6.0",
"postcss-px-to-viewport-8-plugin": "^1.2.3",
"postcss-scss": "^4.0.9",
"prettier": "^3.0.3",
"prettier-plugin-tailwindcss": "^0.5.11",
"sass": "^1.71.1",
"stylelint": "^16.2.1",
"stylelint-config-recommended-scss": "^14.0.0",
"stylelint-config-standard": "^36.0.0",
"stylelint-config-standard-vue": "^1.0.0",
"stylelint-order": "^6.0.4",
"stylelint-scss": "^6.1.0",
"tailwindcss": "^3.4.1",
"typescript": "~5.3.0",
"vite": "^5.0.11",
"vue-tsc": "^1.8.27"
},
"config": {
"commitizen": {
"path": "node_modules/cz-git"
}
},
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
"lint-staged": {
"*.{vue,js,jsx,ts,tsx}": "eslint --cache --fix",
"*.{vue,scss,ts,tsx,css}": "stylelint --fix",
"*.src/": "prettier --write"
}
}

23
postcss.config.cjs

@ -0,0 +1,23 @@
// eslint-disable-next-line no-undef
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
'postcss-px-to-viewport-8-plugin': {
unitToConvert: 'px', // 要转化的单位
viewportWidth: 1920, // UI设计稿的宽度
unitPrecision: 8, // 转换后的精度,即小数点位数
propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
selectorBlackList: ['not-vw'], // 指定不转换为视窗单位的类名,
minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
replace: true, // 是否转换后直接更换属性值
exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配
landscape: false, // 是否处理横屏情况
landscapeUnit: 'vw', // 横屏时使用的单位
landscapeWidth: 1920 // 横屏时使用的视口宽度
}
}
}

BIN
public/static/img/Q.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
public/static/img/Z.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

215
public/static/img/dt.gltf

@ -0,0 +1,215 @@
{
"asset":{
"version":"2.0",
"generator":"Created using the official Cinema 4D glTF Exporter 1.000x284978"
},
"buffers":[{
"uri":"data:application/octet-stream;base64,SQBAAGgAUgAoADEAWgAmAFAAdQAWADIAdAAlAHUAcwAoAHQAMQBzAEAAUgBcAHEADgBcAHAAKwA6ABcAXABSAEUAHAAsABgAEABtABIAEAAgAG0AYABOAHoAZwBRAGUAZgBnAGQAYwBiAGUAYgBMAGQASwB3AA0ARQAGAHAARQBJAAYAewBqADsAIQARAFoAGgBdAB0ALQBdAAMAPgA/AEEAQwAYAEEAeQBCAHoAAwA0AAIAAgA1ACwAVwAjAFUAPQBXAFQAOABDAG0AVABVAHsAZgBkAAkAJAAMACcAYQBoAGAAGQApAGAAYQBNAGgAIABUAG4AFQBNABQASQAUAF8AOAAbAAQAegA3AFgAGQBYABoAcgB4ADoAbQBuADgAKABMACUAJQBiABYACQAqAHEAXQAaADwABgAkAEMAGQBpAFYAMABIAAEAVgAiADMAFgBjAHIADgBwAF4ATwAsAHEAKgBMAFIAIgAjAFsAPgA1ADMAWwBXAD8AOgAKADwAbABDADYAagBaAEYABAAYADgALQADAC8ALAAcAC4AQwBBAGsAVQAhAGoAeABjAAoAOwBGADAAPwA9AEQAawBEABIAWQAyADoAMwA0AFYAMwBbAD4AIwATACEAOQA9ACAAZgAJAAIAJgBpAFMAHQAtAB8AAwACAAAAWAAZAHoARwALAC8ATgBZACsAUABTAEcAdgB1AFkAbwAGAGwAGABPAAcAGgAFABcAVgBdABkAUQBnAC0AEgA5ABAADwAwAC4AeQBOAEIAQAB0AHYAGAAHADYAHgAcAAQAAgAsAAEAQgArADcADABLAAgAXgBvADYAXAAOAAcALQBdAFEAGwA7AA8ABAAPAB4AHwALAB0AbgB7ABsAUwAZAAsASABHAAAARgBQAEgAQQBPAD4AaQATACIAEQATACYAFQAUAGgAQAB2AGgAKABzADEAJgBTAFAAFgByADIAJQAWAHUAKAAlAHQAcwB0AEAAXAAHAHEAXABFAHAAOgA8ABcAUgAxAEUALABPABgAbQBrABIAIABuAG0ATgB5AHoAUQAKAGUAZwBlAGQAYgBkAGUATAAqAGQAdwApAA0ABgBvAHAASQBfAAYAagBGADsAEQAmAFoAXQAtAB0AXQA0AAMAPwBEAEEAGABPAEEAQgA3AHoANAA1AAIANQBPACwAIwAhAFUAVwBVAFQA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",
"byteLength":2940
},
{
"uri":"data:application/octet-stream;base64,JQAmAC0AIAAnABsAHgAkAB0AIAAaAC0ALQAoACAALAAZABoAJAAoABgAHAAZACcAJQAtAB0AGwAsACAANwAtACoANQAiAC0AMwAlADQAAQA5ACAAOAAxAAUABAAqACIAIQAuADYAIwApADMAMAAyAAYALQA3ADUALwAlAB0AIAArADEANAAvAAcABQA5ADgAMgAwABsAOAABADEAOQAFACsABwAjADQAIQA2AAYAKgAEADcALgAsABsAIgA1AAQAIQAGAC4AIwAHACkAJQAbACYAJQAdABsAHwAZACYAJAAcACgAGQAsABgAGgAcAB4AEAAIABQAEwALABAAFAAMABcAFwAPABYABQAGAAEABAAFAAAABwAEAAMABgAHAAIAEgAKABMAFgAOABUAFQANABEADAAIAA0ACAALAAwACwAKAA8ACgAJAA4AEQAJABIAFwATABQAFgASABcAFQARABYADAANAAMACQAIAAYADwAMAAAACAALAAcADgAPAAEACwAKAAQADQAOAAIACgAJAAUAJgAoAC0AJwAfABsAJAAYAB0AGgAeAC0AKAAnACAAGQAcABoAKAAmABgAGQAfACcALQAeAB0ALAAaACAALQAAACoAIgAAAC0AJQAvADQAOQArACAAMQAaAAUAKgAAACIALgAbADYAKQAlADMAMgAsAAYANwAeADUAJQApAB0AKwAaADEALwAdAAcAOQABADgAMAA2ABsAAQAgADEABQAaACsAIwAzADQANgAwAAYABAAeADcALAAyABsANQAeAAQABgAsAC4ABwAdACkAGwAfACYAHQAsABsAGQAYACYAHAAnACgALAAdABgAHAAkAB4ACAAMABQACwAIABAADAAPABcADwAOABYABgACAAEABQABAAAABAAAAAMABwADAAIACgALABMADgANABUADQAJABEACAAJAA0ACwAPAAwACgAOAA8ACQANAA4ACQAKABIAEwAQABQAEgATABcAEQASABYADQACAAMACAAHAAYADAADAAAACwAEAAcADwAAAAEACgAFAAQADgABAAIACQAGAAUAxrBTvwAAAADGsFO/xrBTPwAAAADGsFO/xrBTPwAAAAD1DEI/xrBTvwAAAAD1DEI/1lRlvwAAAADWVGW/1lRlPwAAAADWVGW/1lRlPwAAAADWVGU/1lRlvwAAAADWVGU/1lRlv1OBkz3WVGU/1lRlP1OBkz3WVGU/1lRlP1OBkz3WVGW/1lRlv1OBkz3WVGW/xrBTv1OBkz31DEI/xrBTP1OBkz31DEI/xrBTP1OBkz3GsFO/xrBTv1OBkz3GsFO/1lRlv+tQED7WVGU/1lRlP+tQED7WVGU/1lRlP+tQED7WVGW/1lRlv+tQED7WVGW/xrBTv+tQED71DEI/xrBTP+tQED71DEI/xrBTP+tQED7GsFO/xrBTv+tQED7GsFO/1lRlvw3Ke0DWVGU/1lRlPw3Ke0DWVGU/1lRlP4kZgEDWVGW/xrBTP4kZgEDmsFM/1lRlPw3Ke0DWVGW/1lRlv4kZgEDWVGU/1lRlv4kZgEDWVGW/xrBTPw3Ke0DmsFM/xrBTPz0WgEDGsFO/xrBTP+BVuTvWVGU/1lRlv+BVuTvGsFO/1lRlv+BVuTvGsFM/1lRlvw3Ke0DWVGW/xrBTv4kZgEDmsFM/xrBTvw3Ke0DmsFM/xrBTPw3Ke0DGsFO/xrBTvw3Ke0DGsFO/1lRlvz0WgEDGsFM/xrBTv+BVuTvWVGW/1lRlPz0WgEDGsFO/1lRlP4kZgEDWVGU/xrBTv4kZgEDGsFO/xrBTPz0WgEDWVGU/xrBTvz0WgEDWVGU/1lRlP+BVuTvGsFM/xrBTPz0WgEDWVGW/1lRlPz0WgEDGsFM/xrBTv+BVuTvGsFM/xrBTv+BVuTvWVGU/1lRlvz0WgEDGsFO/xrBTP+BVuTvGsFM/xrBTvz0WgEDWVGW/xrBTP+BVuTvWVGW/1lRlP+BVuTvGsFO/",
"byteLength":1500
},
{
"uri":"data:application/octet-stream;base64,AAAHAAYABAABAAIABwAAAAMABwAFAAYAAQADAAIAAAACAAMA0GZmPwAAAADQZma/0GZmv3UegEDQZmY/0GZmvwAAAADQZma/0GZmv3UegEDQZma/0GZmvwAAAADQZmY/0GZmP3UegEDQZmY/0GZmPwAAAADQZmY/0GZmP3UegEDQZma/",
"byteLength":132
}],
"scenes":[{
"nodes":[0,
1,
2]
}],
"nodes":[{
"name":"zhitibox",
"mesh":0
},
{
"name":"zhitijiegou",
"mesh":1
},
{
"name":"zhitiboli",
"mesh":2
}],
"meshes":[{
"name":"zhitibox",
"primitives":[{
"attributes":{
"POSITION":1
},
"indices":0,
"material":0
}]
},
{
"name":"zhitijiegou",
"primitives":[{
"attributes":{
"POSITION":3
},
"indices":2,
"material":1
}]
},
{
"name":"zhitiboli",
"primitives":[{
"attributes":{
"POSITION":5
},
"indices":4,
"material":2
}]
}],
"accessors":[{
"bufferView":0,
"type":"SCALAR",
"componentType":5123,
"count":726,
"byteOffset":0,
"min":[0],
"max":[123]
},
{
"bufferView":1,
"type":"VEC3",
"componentType":5126,
"count":124,
"byteOffset":0,
"min":[-0.699999988079071,
0.0,
-0.7774372100830078],
"max":[0.699999988079071,
1.8124762773513795,
0.7774372100830078]
},
{
"bufferView":2,
"type":"SCALAR",
"componentType":5123,
"count":402,
"byteOffset":0,
"min":[0],
"max":[57]
},
{
"bufferView":3,
"type":"VEC3",
"componentType":5126,
"count":58,
"byteOffset":0,
"min":[-0.8958257436752319,
0.0,
-0.8958257436752319],
"max":[0.8958257436752319,
4.003117084503174,
0.8958257436752319]
},
{
"bufferView":4,
"type":"SCALAR",
"componentType":5123,
"count":18,
"byteOffset":0,
"min":[0],
"max":[7]
},
{
"bufferView":5,
"type":"VEC3",
"componentType":5126,
"count":8,
"byteOffset":0,
"min":[-0.9000062942504883,
0.0,
-0.9000062942504883],
"max":[0.9000062942504883,
4.00371789932251,
0.9000062942504883]
}],
"bufferViews":[{
"buffer":0,
"byteOffset":0,
"byteLength":1452,
"target":34963
},
{
"buffer":0,
"byteOffset":1452,
"byteLength":1488,
"target":34962
},
{
"buffer":1,
"byteOffset":0,
"byteLength":804,
"target":34963
},
{
"buffer":1,
"byteOffset":804,
"byteLength":696,
"target":34962
},
{
"buffer":2,
"byteOffset":0,
"byteLength":36,
"target":34963
},
{
"buffer":2,
"byteOffset":36,
"byteLength":96,
"target":34962
}],
"materials":[{
"pbrMetallicRoughness":{
"baseColorFactor":[0.8,
0.8,
0.8,
1.0],
"metallicFactor":0.0,
"roughnessFactor":0.5
},
"emissiveFactor":[0.0,
0.0,
0.0],
"alphaMode":"OPAQUE",
"doubleSided":true,
"name":"cccbox"
},
{
"pbrMetallicRoughness":{
"baseColorFactor":[0.5,
0.5,
0.5,
1.0],
"metallicFactor":0.0,
"roughnessFactor":0.5
},
"emissiveFactor":[0.0,
0.0,
0.0],
"alphaMode":"OPAQUE",
"doubleSided":true,
"name":"cccjiegou"
},
{
"pbrMetallicRoughness":{
"baseColorFactor":[0.5,
0.5,
0.5,
0.44999999999999998],
"metallicFactor":0.0,
"roughnessFactor":0.5
},
"emissiveFactor":[0.0,
0.0,
0.0],
"alphaMode":"BLEND",
"doubleSided":true,
"name":"ccaboli"
}]
}

279
public/static/img/elevator.gltf

File diff suppressed because one or more lines are too long

275
public/static/img/elevatorDown.gltf

File diff suppressed because one or more lines are too long

BIN
public/static/img/guide.glb

Binary file not shown.

BIN
public/static/img/map/Frosting.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

BIN
public/static/img/map/bl.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 KiB

BIN
public/static/img/map/brick.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
public/static/img/map/build.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 KiB

BIN
public/static/img/map/building.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 KiB

BIN
public/static/img/map/c50.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
public/static/img/map/edifice.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

BIN
public/static/img/map/front.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
public/static/img/map/grassland.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
public/static/img/map/grassland2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
public/static/img/map/grey.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

BIN
public/static/img/map/ground.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
public/static/img/map/ground2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
public/static/img/map/office.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

BIN
public/static/img/map/office2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

BIN
public/static/img/map/square.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

BIN
public/static/img/model/IDS_H.glb

Binary file not shown.

BIN
public/static/img/model/IDS_V.glb

Binary file not shown.

BIN
public/static/img/model/bangongyi.glb

Binary file not shown.

BIN
public/static/img/model/chechanglangan.glb

Binary file not shown.

BIN
public/static/img/model/chongdianzhuang.glb

Binary file not shown.

BIN
public/static/img/model/flower1.glb

Binary file not shown.

BIN
public/static/img/model/flower2.glb

Binary file not shown.

BIN
public/static/img/model/gjz1.glb

Binary file not shown.

BIN
public/static/img/model/grass.glb

Binary file not shown.

BIN
public/static/img/model/honglvdeng.glb

Binary file not shown.

BIN
public/static/img/model/huatan1.glb

Binary file not shown.

BIN
public/static/img/model/huatan2.glb

Binary file not shown.

BIN
public/static/img/model/jt_left.glb

Binary file not shown.

BIN
public/static/img/model/jt_left_up.glb

Binary file not shown.

BIN
public/static/img/model/jt_right.glb

Binary file not shown.

BIN
public/static/img/model/jt_right_up.glb

Binary file not shown.

BIN
public/static/img/model/jt_turn.glb

Binary file not shown.

BIN
public/static/img/model/jt_up.glb

Binary file not shown.

BIN
public/static/img/model/ludeng.glb

Binary file not shown.

BIN
public/static/img/model/lvzhi.glb

Binary file not shown.

BIN
public/static/img/model/officeTV.glb

Binary file not shown.

BIN
public/static/img/model/park_paly.glb

Binary file not shown.

BIN
public/static/img/model/penquan2.glb

Binary file not shown.

BIN
public/static/img/model/qiche1.glb

Binary file not shown.

BIN
public/static/img/model/qiche2.glb

Binary file not shown.

BIN
public/static/img/model/qiche3.glb

Binary file not shown.

BIN
public/static/img/model/qiche4.glb

Binary file not shown.

BIN
public/static/img/model/qiche5.glb

Binary file not shown.

BIN
public/static/img/model/qiche6.glb

Binary file not shown.

BIN
public/static/img/model/qiche7.glb

Binary file not shown.

BIN
public/static/img/model/qiche8.glb

Binary file not shown.

BIN
public/static/img/model/qiche9.glb

Binary file not shown.

BIN
public/static/img/model/ren1.glb

Binary file not shown.

BIN
public/static/img/model/ren2.glb

Binary file not shown.

BIN
public/static/img/model/ren3.glb

Binary file not shown.

BIN
public/static/img/model/ren4.glb

Binary file not shown.

BIN
public/static/img/model/ren5.glb

Binary file not shown.

BIN
public/static/img/model/ren6.glb

Binary file not shown.

BIN
public/static/img/model/table.glb

Binary file not shown.

BIN
public/static/img/model/taiyangsan.glb

Binary file not shown.

BIN
public/static/img/model/tingchechang.glb

Binary file not shown.

414
public/static/img/model/tree.gltf

@ -0,0 +1,414 @@
{
"asset":{
"version":"2.0",
"generator":"Created using the official Cinema 4D glTF Exporter 1.000x284978"
},
"scenes":[{
"nodes":[0]
}],
"nodes":[{
"name":"方块树",
"translation":[0.0,
54.09450149536133,
0.0],
"rotation":[0.0,
0.0,
0.0,
-1.0],
"scale":[1.0,
1.0,
1.0],
"children":[1,
2,
3,
4]
},
{
"name":"圆柱体",
"translation":[0.0,
-39.05268859863281,
0.0],
"rotation":[0.0,
0.0,
0.0,
-1.0],
"scale":[1.0,
1.0,
1.0],
"mesh":0
},
{
"name":"圆锥体.2",
"translation":[0.0,
-2.9577174186706545,
0.0],
"rotation":[0.0,
0.0,
0.0,
-1.0],
"scale":[1.0,
1.0,
1.0],
"mesh":1
},
{
"name":"圆锥体.1",
"translation":[0.0,
11.526834487915039,
0.0],
"rotation":[0.0,
0.0,
0.0,
-1.0],
"scale":[1.0,
1.0,
1.0],
"mesh":2
},
{
"name":"圆锥体",
"translation":[0.0,
24.944711685180665,
0.0],
"rotation":[0.0,
0.0,
0.0,
-1.0],
"scale":[1.0,
1.0,
1.0],
"mesh":3
}],
"meshes":[{
"name":"圆柱体",
"primitives":[{
"attributes":{
"POSITION":1,
"NORMAL":2,
"TEXCOORD_0":3
},
"indices":0,
"material":0
}]
},
{
"name":"圆锥体.2",
"primitives":[{
"attributes":{
"POSITION":5,
"NORMAL":6,
"TEXCOORD_0":7
},
"indices":4,
"material":1
}]
},
{
"name":"圆锥体.1",
"primitives":[{
"attributes":{
"POSITION":9,
"NORMAL":10,
"TEXCOORD_0":11
},
"indices":8,
"material":1
}]
},
{
"name":"圆锥体",
"primitives":[{
"attributes":{
"POSITION":13,
"NORMAL":14,
"TEXCOORD_0":15
},
"indices":12,
"material":1
}]
}],
"accessors":[{
"bufferView":0,
"type":"SCALAR",
"componentType":5123,
"count":120,
"byteOffset":0,
"min":[0],
"max":[43]
},
{
"bufferView":1,
"type":"VEC3",
"componentType":5126,
"count":44,
"byteOffset":0,
"min":[-2.437448501586914,
-14.820405006408692,
-2.3181512355804445],
"max":[2.437448501586914,
24.215106964111329,
2.3181512355804445]
},
{
"bufferView":1,
"type":"VEC3",
"componentType":5126,
"count":44,
"byteOffset":12,
"min":[-0.9941859841346741,
-1.0,
-0.9788010716438294],
"max":[0.9941859841346741,
1.0,
0.9788010716438294]
},
{
"bufferView":1,
"type":"VEC2",
"componentType":5126,
"count":44,
"byteOffset":24,
"min":[0.0,
0.0],
"max":[1.0,
1.0]
},
{
"bufferView":2,
"type":"SCALAR",
"componentType":5123,
"count":36,
"byteOffset":0,
"min":[0],
"max":[25]
},
{
"bufferView":3,
"type":"VEC3",
"componentType":5126,
"count":26,
"byteOffset":0,
"min":[-29.99250602722168,
-23.775028228759767,
-29.99250602722168],
"max":[29.99250602722168,
16.158737182617189,
29.99250602722168]
},
{
"bufferView":3,
"type":"VEC3",
"componentType":5126,
"count":26,
"byteOffset":12,
"min":[-0.6245018243789673,
-1.0,
-0.6245018243789673],
"max":[0.6245018243789673,
0.4690360426902771,
0.6245018243789673]
},
{
"bufferView":3,
"type":"VEC2",
"componentType":5126,
"count":26,
"byteOffset":24,
"min":[0.0,
0.0],
"max":[1.0,
1.0]
},
{
"bufferView":4,
"type":"SCALAR",
"componentType":5123,
"count":36,
"byteOffset":0,
"min":[0],
"max":[25]
},
{
"bufferView":5,
"type":"VEC3",
"componentType":5126,
"count":26,
"byteOffset":0,
"min":[-22.81072998046875,
-13.725996971130371,
-22.81072998046875],
"max":[22.81072998046875,
12.289488792419434,
22.81072998046875]
},
{
"bufferView":5,
"type":"VEC3",
"componentType":5126,
"count":26,
"byteOffset":12,
"min":[-0.6009717583656311,
-1.0,
-0.6009717583656311],
"max":[0.6009717583656311,
0.5269401669502258,
0.6009717583656311]
},
{
"bufferView":5,
"type":"VEC2",
"componentType":5126,
"count":26,
"byteOffset":24,
"min":[0.0,
0.0],
"max":[1.0,
1.0]
},
{
"bufferView":6,
"type":"SCALAR",
"componentType":5123,
"count":36,
"byteOffset":0,
"min":[0],
"max":[25]
},
{
"bufferView":7,
"type":"VEC3",
"componentType":5126,
"count":26,
"byteOffset":0,
"min":[-16.715009689331056,
-11.619623184204102,
-16.715009689331056],
"max":[16.715009689331056,
9.005364418029786,
16.715009689331056]
},
{
"bufferView":7,
"type":"VEC3",
"componentType":5126,
"count":26,
"byteOffset":12,
"min":[-0.6135097742080689,
-1.0,
-0.6135097742080689],
"max":[0.6135097742080689,
0.4972037374973297,
0.6135097742080689]
},
{
"bufferView":7,
"type":"VEC2",
"componentType":5126,
"count":26,
"byteOffset":24,
"min":[0.0,
0.0],
"max":[1.0,
1.0]
}],
"bufferViews":[{
"buffer":0,
"byteOffset":0,
"byteLength":240,
"target":34963
},
{
"buffer":0,
"byteOffset":240,
"byteLength":1408,
"target":34962,
"byteStride":32
},
{
"buffer":1,
"byteOffset":0,
"byteLength":72,
"target":34963
},
{
"buffer":1,
"byteOffset":72,
"byteLength":832,
"target":34962,
"byteStride":32
},
{
"buffer":2,
"byteOffset":0,
"byteLength":72,
"target":34963
},
{
"buffer":2,
"byteOffset":72,
"byteLength":832,
"target":34962,
"byteStride":32
},
{
"buffer":3,
"byteOffset":0,
"byteLength":72,
"target":34963
},
{
"buffer":3,
"byteOffset":72,
"byteLength":832,
"target":34962,
"byteStride":32
}],
"buffers":[{
"uri":"data:application/octet-stream;base64,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",
"byteLength":1648
},
{
"uri":"data:application/octet-stream;base64,GQAYABcAFgAVABQAEwASABEAEAAPAA4ADQAIAAwAAQAHAAAACAAGAAsABwAFAAAABgAEAAoABQADAAAABAACAAkAAwABAAAAAAAAAEIzvsEAAAAAAAAAAAAAgL8AAAAAAAAAPwAAAD+n8O9BQjO+wQAAAAAAAAAAAACAvwAAAAAAAAAAAAAAPwAAAAAYRYFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqFUEJ0IzvsGn8O/BAAAAAAAAgL8AAAAAAAAAPwAAAAAAAAAAGEWBQQAAAAAAAAAAAAAAAAAAAAAAAIA+AAAAAKfw78FCM77BqFWEpwAAAAAAAIC/AAAAAAAAgD8AAAA/AAAAABhFgUEAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAB7gManQjO+wafw70EAAAAAAACAvwAAAAAAAAA/AACAPwAAAAAYRYFBAAAAAAAAAAAAAAAAAAAAAAAAQD8AAAAAp/DvQUIzvsEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgD+oVQQnQjO+wafw78EAAAAAAAAAAAAAAAAAAIA+AACAP6fw78FCM77BqFWEpwAAAAAAAAAAAAAAAAAAAD8AAIA/e4DGp0IzvsGn8O9BAAAAAAAAAAAAAAAAAABAPwAAgD8AAAAAGEWBQQAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAKfw70FCM77BAAAAAFrfHz9+JfA+Wt8fvwAAAAAAAIA/AAAAABhFgUEAAAAAWt8fP34l8D5a3x+/AACAPgAAAACoVQQnQjO+wafw78Fa3x8/fiXwPlrfH78AAIA+AACAP6hVBCdCM77Bp/DvwVrfH79+JfA+Wt8fvwAAgD4AAIA/AAAAABhFgUEAAAAAWt8fv34l8D5a3x+/AAAAPwAAAACn8O/BQjO+wahVhKda3x+/fiXwPlrfH78AAAA/AACAP6fw78FCM77BqFWEp1rfH79+JfA+Wt8fPwAAAD8AAIA/AAAAABhFgUEAAAAAWt8fv34l8D5a3x8/AABAPwAAAAB7gManQjO+wafw70Fa3x+/fiXwPlrfHz8AAEA/AACAP3uAxqdCM77Bp/DvQVrfHz9+JfA+Wt8fPwAAQD8AAIA/AAAAABhFgUEAAAAAWt8fP34l8D5a3x8/AACAPwAAAACn8O9BQjO+wQAAAABa3x8/fiXwPlrfHz8AAIA/AACAPw==",
"byteLength":904
},
{
"uri":"data:application/octet-stream;base64,GQAYABcAFgAVABQAEwASABEAEAAPAA4ADQAIAAwAAQAHAAAACAAGAAsABwAFAAAABgAEAAoABQADAAAABAACAAkAAwABAAAAAAAAAK+dW8EAAAAAAAAAAAAAgL8AAAAAAAAAPwAAAD9gfLZBr51bwQAAAAAAAAAAAACAvwAAAAAAAAAAAAAAPwAAAAC/oURBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEvJJq+dW8FgfLbBAAAAAAAAgL8AAAAAAAAAPwAAAAAAAAAAv6FEQQAAAAAAAAAAAAAAAAAAAAAAAIA+AAAAAGB8tsGvnVvBJEtJpwAAAAAAAIC/AAAAAAAAgD8AAAA/AAAAAL+hREEAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAABb+Janr51bwWB8tkEAAAAAAACAvwAAAAAAAAA/AACAPwAAAAC/oURBAAAAAAAAAAAAAAAAAAAAAAAAQD8AAAAAYHy2Qa+dW8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgD8kS8kmr51bwWB8tsEAAAAAAAAAAAAAAAAAAIA+AACAP2B8tsGvnVvBJEtJpwAAAAAAAAAAAAAAAAAAAD8AAIA/W/iWp6+dW8FgfLZBAAAAAAAAAAAAAAAAAABAPwAAgD8AAAAAv6FEQQAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAGB8tkGvnVvBAAAAAEnZGT+N5QY/SdkZvwAAAAAAAIA/AAAAAL+hREEAAAAASdkZP43lBj9J2Rm/AACAPgAAAAAkS8kmr51bwWB8tsFJ2Rk/jeUGP0nZGb8AAIA+AACAPyRLySavnVvBYHy2wUnZGb+N5QY/SdkZvwAAgD4AAIA/AAAAAL+hREEAAAAASdkZv43lBj9J2Rm/AAAAPwAAAABgfLbBr51bwSRLSadJ2Rm/jeUGP0nZGb8AAAA/AACAP2B8tsGvnVvBJEtJp0nZGb+N5QY/SdkZPwAAAD8AAIA/AAAAAL+hREEAAAAASdkZv43lBj9J2Rk/AABAPwAAAABb+Janr51bwWB8tkFJ2Rm/jeUGP0nZGT8AAEA/AACAP1v4lqevnVvBYHy2QUnZGT+N5QY/SdkZPwAAQD8AAIA/AAAAAL+hREEAAAAASdkZP43lBj9J2Rk/AACAPwAAAABgfLZBr51bwQAAAABJ2Rk/jeUGP0nZGT8AAIA/AACAPw==",
"byteLength":904
},
{
"uri":"data:application/octet-stream;base64,GQAYABcAFgAVABQAEwASABEAEAAPAA4ADQAIAAwAAQAHAAAACAAGAAsABwAFAAAABgAEAAoABQADAAAABAACAAkAAwABAAAAAAAAAPrpOcEAAAAAAAAAAAAAgL8AAAAAAAAAPwAAAD9XuIVB+uk5wQAAAAAAAAAAAACAvwAAAAAAAAAAAAAAPwAAAAD5FRBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdYCTJvrpOcFXuIXBAAAAAAAAgL8AAAAAAAAAPwAAAAAAAAAA+RUQQQAAAAAAAAAAAAAAAAAAAAAAAIA+AAAAAFe4hcH66TnBdYATpwAAAAAAAIC/AAAAAAAAgD8AAAA/AAAAAPkVEEEAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAACvQF2n+uk5wVe4hUEAAAAAAACAvwAAAAAAAAA/AACAPwAAAAD5FRBBAAAAAAAAAAAAAAAAAAAAAAAAQD8AAAAAV7iFQfrpOcEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgD91gJMm+uk5wVe4hcEAAAAAAAAAAAAAAAAAAIA+AACAP1e4hcH66TnBdYATpwAAAAAAAAAAAAAAAAAAAD8AAIA/r0Bdp/rpOcFXuIVBAAAAAAAAAAAAAAAAAABAPwAAgD8AAAAA+RUQQQAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAFe4hUH66TnBAAAAAPoOHT99kf4++g4dvwAAAAAAAIA/AAAAAPkVEEEAAAAA+g4dP32R/j76Dh2/AACAPgAAAAB1gJMm+uk5wVe4hcH6Dh0/fZH+PvoOHb8AAIA+AACAP3WAkyb66TnBV7iFwfoOHb99kf4++g4dvwAAgD4AAIA/AAAAAPkVEEEAAAAA+g4dv32R/j76Dh2/AAAAPwAAAABXuIXB+uk5wXWAE6f6Dh2/fZH+PvoOHb8AAAA/AACAP1e4hcH66TnBdYATp/oOHb99kf4++g4dPwAAAD8AAIA/AAAAAPkVEEEAAAAA+g4dv32R/j76Dh0/AABAPwAAAACvQF2n+uk5wVe4hUH6Dh2/fZH+PvoOHT8AAEA/AACAP69AXaf66TnBV7iFQfoOHT99kf4++g4dPwAAQD8AAIA/AAAAAPkVEEEAAAAA+g4dP32R/j76Dh0/AACAPwAAAABXuIVB+uk5wQAAAAD6Dh0/fZH+PvoOHT8AAIA/AACAPw==",
"byteLength":904
}],
"materials":[{
"pbrMetallicRoughness":{
"baseColorFactor":[0.48,
0.3724800000000004,
0.32639999999999999,
1.0],
"metallicFactor":0.0,
"roughnessFactor":0.5
},
"emissiveFactor":[0.0,
0.0,
0.0],
"alphaMode":"OPAQUE",
"doubleSided":true,
"name":"材质.1"
},
{
"pbrMetallicRoughness":{
"baseColorFactor":[0.2558749999999998,
0.75,
0.24749999999999998,
1.0],
"metallicFactor":0.0,
"roughnessFactor":0.5
},
"emissiveFactor":[0.0,
0.0,
0.0],
"alphaMode":"OPAQUE",
"doubleSided":true,
"name":"材质"
}]
}

BIN
public/static/img/model/tree2.glb

Binary file not shown.

BIN
public/static/img/model/tree3.glb

Binary file not shown.

BIN
public/static/img/model/xiaofangshuan.glb

Binary file not shown.

BIN
public/static/img/model/yizi1.glb

Binary file not shown.

BIN
public/static/img/model/zuoyi1.glb

Binary file not shown.

BIN
public/static/img/model/zuoyi2.glb

Binary file not shown.

BIN
public/static/img/new-shop.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
public/static/img/noth.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

BIN
public/static/img/promotion.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

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

Loading…
Cancel
Save