@ -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] |
||||
@ -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 |
||||
@ -0,0 +1,2 @@ |
|||||
|
VITE_SENTRY_DSN_URL: http://936ea86f40634800857a65401ade2112@192.168.1.222:8000/3 |
||||
|
VITE_SENTRY_ENVIRONMENT: development |
||||
@ -0,0 +1,2 @@ |
|||||
|
VITE_SENTRY_DSN_URL: VITE_SENTRY_DSN_URL: http://936ea86f40634800857a65401ade2112@192.168.1.222:8000/3 |
||||
|
VITE_SENTRY_ENVIRONMENT: production |
||||
@ -0,0 +1,4 @@ |
|||||
|
node_modules |
||||
|
dist |
||||
|
public |
||||
|
.vscode |
||||
@ -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' |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1 @@ |
|||||
|
* text=auto eol=lf |
||||
@ -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? |
||||
@ -0,0 +1,4 @@ |
|||||
|
#!/usr/bin/env sh |
||||
|
. "$(dirname -- "$0")/_/husky.sh" |
||||
|
|
||||
|
npx --no -- commitlint --edit $1 |
||||
@ -0,0 +1,4 @@ |
|||||
|
#!/bin/sh |
||||
|
. "$(dirname "$0")/_/husky.sh" |
||||
|
|
||||
|
npx lint-staged |
||||
@ -0,0 +1 @@ |
|||||
|
v20.10.0 |
||||
@ -0,0 +1,4 @@ |
|||||
|
node_modules |
||||
|
dist |
||||
|
public |
||||
|
.vscode |
||||
@ -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" |
||||
|
} |
||||
@ -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)"} |
||||
|
] |
||||
|
}] |
||||
|
] |
||||
|
} |
||||
@ -0,0 +1,3 @@ |
|||||
|
node_modules/* |
||||
|
|
||||
|
dist |
||||
@ -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', |
||||
|
], |
||||
|
}, |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
{ |
||||
|
"recommendations": [ |
||||
|
"vscode.i18n-ally", |
||||
|
"dbaeumer.vscode-eslint", |
||||
|
"vscode.stylelint", |
||||
|
"vscode.Tailwind-css-IntelliSense", |
||||
|
"esbenp.prettier-vscode" |
||||
|
] |
||||
|
} |
||||
@ -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" |
||||
|
] |
||||
|
} |
||||
@ -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' |
||||
|
``` |
||||
|
|
||||
@ -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: '' |
||||
|
} |
||||
|
} |
||||
@ -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 |
||||
|
} |
||||
@ -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> |
||||
@ -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> |
||||
|
|
||||
|
|
||||
|
 |
||||
|
|
||||
|
项目名称:[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() |
||||
|
After Width: | Height: | Size: 5.2 KiB |
@ -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" |
||||
|
} |
||||
|
} |
||||
@ -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 // 横屏时使用的视口宽度 |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 20 KiB |
@ -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" |
||||
|
}] |
||||
|
} |
||||
|
After Width: | Height: | Size: 196 KiB |
|
After Width: | Height: | Size: 442 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 442 KiB |
|
After Width: | Height: | Size: 397 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 352 KiB |
|
After Width: | Height: | Size: 211 KiB |
|
After Width: | Height: | Size: 233 KiB |
@ -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":"材质" |
||||
|
}] |
||||
|
} |
||||
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 6.4 KiB |