update
|
|
@ -0,0 +1,91 @@
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const { execSync } = require('child_process');
|
||||||
|
|
||||||
|
const scopes = fs
|
||||||
|
.readdirSync(path.resolve(__dirname, 'src'), { withFileTypes: true })
|
||||||
|
.filter((dirent) => dirent.isDirectory())
|
||||||
|
.map((dirent) => dirent.name.replace(/s$/, ''));
|
||||||
|
|
||||||
|
// precomputed scope
|
||||||
|
const scopeComplete = execSync('git status --porcelain || true')
|
||||||
|
.toString()
|
||||||
|
.trim()
|
||||||
|
.split('\n')
|
||||||
|
.find((r) => ~r.indexOf('M src'))
|
||||||
|
?.replace(/(\/)/g, '%%')
|
||||||
|
?.match(/src%%((\w|-)*)/)?.[1]
|
||||||
|
?.replace(/s$/, '');
|
||||||
|
|
||||||
|
/** @type {import('cz-git').UserConfig} */
|
||||||
|
module.exports = {
|
||||||
|
ignores: [(commit) => commit.includes('init')],
|
||||||
|
extends: ['@commitlint/config-conventional'],
|
||||||
|
rules: {
|
||||||
|
'body-leading-blank': [2, 'always'],
|
||||||
|
'footer-leading-blank': [1, 'always'],
|
||||||
|
'header-max-length': [2, 'always', 108],
|
||||||
|
'subject-empty': [2, 'never'],
|
||||||
|
'type-empty': [2, 'never'],
|
||||||
|
'subject-case': [0],
|
||||||
|
'type-enum': [
|
||||||
|
2,
|
||||||
|
'always',
|
||||||
|
['feat', 'fix', 'perf', 'style', 'docs', 'test', 'refactor', 'build', 'ci', 'chore', 'revert', 'wip', 'workflow', 'types', 'release'],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
prompt: {
|
||||||
|
/** @use `yarn commit :f` */
|
||||||
|
alias: {
|
||||||
|
f: 'docs: fix typos',
|
||||||
|
r: 'docs: update README',
|
||||||
|
s: 'style: update code format',
|
||||||
|
b: 'build: bump dependencies',
|
||||||
|
c: 'chore: update config',
|
||||||
|
},
|
||||||
|
customScopesAlign: !scopeComplete ? 'top' : 'bottom',
|
||||||
|
defaultScope: scopeComplete,
|
||||||
|
scopes: [...scopes, 'mock'],
|
||||||
|
allowEmptyIssuePrefixs: false,
|
||||||
|
allowCustomIssuePrefixs: false,
|
||||||
|
|
||||||
|
// English
|
||||||
|
typesAppend: [
|
||||||
|
{ value: 'wip', name: 'wip: work in process' },
|
||||||
|
{ value: 'workflow', name: 'workflow: workflow improvements' },
|
||||||
|
{ value: 'types', name: 'types: type definition file changes' },
|
||||||
|
],
|
||||||
|
|
||||||
|
// 中英文对照版
|
||||||
|
// 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: 新增功能' },
|
||||||
|
// { value: 'fix', name: 'fix: 修复缺陷' },
|
||||||
|
// { value: 'docs', name: 'docs: 文档变更' },
|
||||||
|
// { value: 'style', name: 'style: 代码格式' },
|
||||||
|
// { value: 'refactor', name: 'refactor: 代码重构' },
|
||||||
|
// { value: 'perf', name: 'perf: 性能优化' },
|
||||||
|
// { value: 'test', name: 'test: 添加疏漏测试或已有测试改动' },
|
||||||
|
// { value: 'build', name: 'build: 构建流程、外部依赖变更 (如升级 npm 包、修改打包配置等)' },
|
||||||
|
// { value: 'ci', name: 'ci: 修改 CI 配置、脚本' },
|
||||||
|
// { value: 'revert', name: 'revert: 回滚 commit' },
|
||||||
|
// { value: 'chore', name: 'chore: 对构建过程或辅助工具和库的更改 (不影响源文件、测试用例)' },
|
||||||
|
// { value: 'wip', name: 'wip: 正在开发中' },
|
||||||
|
// { value: 'workflow', name: 'workflow: 工作流程改进' },
|
||||||
|
// { value: 'types', name: 'types: 类型定义文件修改' },
|
||||||
|
// ],
|
||||||
|
// emptyScopesAlias: 'empty: 不填写',
|
||||||
|
// customScopesAlias: 'custom: 自定义',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
VITE_TOKEN_KEY=tokenKey
|
||||||
|
|
||||||
|
VITE_URL_PREFIX=/api
|
||||||
|
|
||||||
|
# VITE_BASE_APP_ID='wx0fd5e237dba24ff4'
|
||||||
|
VITE_BASE_APP_ID='wxbad2e8a91c62a734'
|
||||||
|
|
||||||
|
# VITE_BASE_APP_SECRET='14f1027251416b49734c36bf58d6a741'
|
||||||
|
VITE_BASE_APP_SECRET='e1b7fc425ca9cca05dd83609a6dc9c00'
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
VITE_USE_MOCK=false
|
||||||
|
|
||||||
|
VITE_USE_ERUDA=false
|
||||||
|
|
||||||
|
VITE_USE_COMPRESS=false
|
||||||
|
|
||||||
|
VITE_USE_REPORT=false
|
||||||
|
|
||||||
|
VITE_BASE_API_URL='http://139.224.10.234:8088'
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
VITE_USE_MOCK=false
|
||||||
|
|
||||||
|
VITE_USE_ERUDA=false
|
||||||
|
|
||||||
|
VITE_USE_COMPRESS=true
|
||||||
|
|
||||||
|
VITE_USE_REPORT=false
|
||||||
|
|
||||||
|
VITE_BASE_API_URL='/'
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
VITE_USE_MOCK=true
|
||||||
|
|
||||||
|
VITE_USE_ERUDA=true
|
||||||
|
|
||||||
|
VITE_USE_COMPRESS=true
|
||||||
|
|
||||||
|
VITE_USE_REPORT=false
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
*.sh
|
||||||
|
node_modules
|
||||||
|
*.md
|
||||||
|
*.woff
|
||||||
|
*.ttf
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
dist
|
||||||
|
/public
|
||||||
|
/docs
|
||||||
|
.husky
|
||||||
|
.local
|
||||||
|
/bin
|
||||||
|
Dockerfile
|
||||||
|
|
@ -0,0 +1,80 @@
|
||||||
|
{
|
||||||
|
"globals": {
|
||||||
|
"Component": true,
|
||||||
|
"ComponentPublicInstance": true,
|
||||||
|
"ComputedRef": true,
|
||||||
|
"EffectScope": true,
|
||||||
|
"InjectionKey": true,
|
||||||
|
"PropType": true,
|
||||||
|
"Ref": true,
|
||||||
|
"VNode": true,
|
||||||
|
"acceptHMRUpdate": true,
|
||||||
|
"computed": true,
|
||||||
|
"createApp": true,
|
||||||
|
"createPinia": true,
|
||||||
|
"customRef": true,
|
||||||
|
"defineAsyncComponent": true,
|
||||||
|
"defineComponent": true,
|
||||||
|
"defineStore": true,
|
||||||
|
"effectScope": true,
|
||||||
|
"getActivePinia": true,
|
||||||
|
"getCurrentInstance": true,
|
||||||
|
"getCurrentScope": true,
|
||||||
|
"h": true,
|
||||||
|
"inject": true,
|
||||||
|
"isProxy": true,
|
||||||
|
"isReactive": true,
|
||||||
|
"isReadonly": true,
|
||||||
|
"isRef": true,
|
||||||
|
"mapActions": true,
|
||||||
|
"mapGetters": true,
|
||||||
|
"mapState": true,
|
||||||
|
"mapStores": true,
|
||||||
|
"mapWritableState": true,
|
||||||
|
"markRaw": true,
|
||||||
|
"nextTick": true,
|
||||||
|
"onActivated": true,
|
||||||
|
"onBeforeMount": true,
|
||||||
|
"onBeforeRouteLeave": true,
|
||||||
|
"onBeforeRouteUpdate": true,
|
||||||
|
"onBeforeUnmount": true,
|
||||||
|
"onBeforeUpdate": true,
|
||||||
|
"onDeactivated": true,
|
||||||
|
"onErrorCaptured": true,
|
||||||
|
"onMounted": true,
|
||||||
|
"onRenderTracked": true,
|
||||||
|
"onRenderTriggered": true,
|
||||||
|
"onScopeDispose": true,
|
||||||
|
"onServerPrefetch": true,
|
||||||
|
"onUnmounted": true,
|
||||||
|
"onUpdated": true,
|
||||||
|
"provide": true,
|
||||||
|
"reactive": true,
|
||||||
|
"readonly": true,
|
||||||
|
"ref": true,
|
||||||
|
"resolveComponent": true,
|
||||||
|
"setActivePinia": true,
|
||||||
|
"setMapStoreSuffix": true,
|
||||||
|
"shallowReactive": true,
|
||||||
|
"shallowReadonly": true,
|
||||||
|
"shallowRef": true,
|
||||||
|
"storeToRefs": true,
|
||||||
|
"toRaw": true,
|
||||||
|
"toRef": true,
|
||||||
|
"toRefs": true,
|
||||||
|
"triggerRef": true,
|
||||||
|
"unref": true,
|
||||||
|
"useAttrs": true,
|
||||||
|
"useCssModule": true,
|
||||||
|
"useCssVars": true,
|
||||||
|
"useLink": true,
|
||||||
|
"useRoute": true,
|
||||||
|
"useRouter": true,
|
||||||
|
"useSlots": true,
|
||||||
|
"watch": true,
|
||||||
|
"watchEffect": true,
|
||||||
|
"watchPostEffect": true,
|
||||||
|
"watchSyncEffect": true,
|
||||||
|
"toValue": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
node: true,
|
||||||
|
es6: true,
|
||||||
|
},
|
||||||
|
parser: 'vue-eslint-parser',
|
||||||
|
parserOptions: {
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
ecmaVersion: 2020,
|
||||||
|
sourceType: 'module',
|
||||||
|
jsxPragma: 'React',
|
||||||
|
ecmaFeatures: {
|
||||||
|
jsx: true,
|
||||||
|
},
|
||||||
|
project: './tsconfig.*?.json',
|
||||||
|
createDefaultProgram: false,
|
||||||
|
extraFileExtensions: ['.vue'],
|
||||||
|
},
|
||||||
|
extends: ['plugin:vue/vue3-recommended', 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'],
|
||||||
|
plugins: ['vue', '@typescript-eslint', 'import'],
|
||||||
|
rules: {
|
||||||
|
'no-unused-vars': 'off',
|
||||||
|
'no-case-declarations': 'off',
|
||||||
|
'no-use-before-define': 'off',
|
||||||
|
'space-before-function-paren': 'off',
|
||||||
|
|
||||||
|
'import/first': 'error',
|
||||||
|
'import/newline-after-import': 'error',
|
||||||
|
'import/no-duplicates': 'error',
|
||||||
|
|
||||||
|
'@typescript-eslint/no-unused-vars': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
argsIgnorePattern: '^_',
|
||||||
|
varsIgnorePattern: '^_',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'@typescript-eslint/ban-ts-ignore': 'off',
|
||||||
|
'@typescript-eslint/ban-ts-comment': 'off',
|
||||||
|
'@typescript-eslint/ban-types': 'off',
|
||||||
|
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||||
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
|
'@typescript-eslint/no-var-requires': 'off',
|
||||||
|
'@typescript-eslint/no-empty-function': 'off',
|
||||||
|
'@typescript-eslint/no-use-before-define': 'off',
|
||||||
|
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||||
|
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||||
|
'vue/script-setup-uses-vars': 'error',
|
||||||
|
'vue/no-reserved-component-names': 'off',
|
||||||
|
'vue/custom-event-name-casing': 'off',
|
||||||
|
'vue/attributes-order': 'off',
|
||||||
|
'vue/one-component-per-file': 'off',
|
||||||
|
'vue/html-closing-bracket-newline': 'off',
|
||||||
|
'vue/max-attributes-per-line': 'off',
|
||||||
|
'vue/multiline-html-element-content-newline': 'off',
|
||||||
|
'vue/singleline-html-element-content-newline': 'off',
|
||||||
|
'vue/attribute-hyphenation': 'off',
|
||||||
|
'vue/require-default-prop': 'off',
|
||||||
|
'vue/require-explicit-emits': 'off',
|
||||||
|
'vue/html-self-closing': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
html: {
|
||||||
|
void: 'always',
|
||||||
|
normal: 'never',
|
||||||
|
component: 'always',
|
||||||
|
},
|
||||||
|
svg: 'always',
|
||||||
|
math: 'always',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'vue/multi-word-component-names': 'off',
|
||||||
|
},
|
||||||
|
globals: { defineOptions: 'readonly' },
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.fleet
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# shellcheck source=./_/husky.sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
PATH="/usr/local/bin:$PATH"
|
||||||
|
|
||||||
|
npx --no-install commitlint --edit "$1"
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
[ -n "$CI" ] && exit 0
|
||||||
|
|
||||||
|
# Format and submit code according to lintstagedrc.js configuration
|
||||||
|
npm run lint:lint-staged
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
/dist/*
|
||||||
|
.local
|
||||||
|
.output.js
|
||||||
|
/node_modules/**
|
||||||
|
|
||||||
|
**/*.svg
|
||||||
|
**/*.sh
|
||||||
|
|
||||||
|
/public/*
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
/dist/*
|
||||||
|
/public/*
|
||||||
|
public/*
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
FROM nginx
|
||||||
|
# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
|
||||||
|
COPY dist/ /usr/share/nginx/html/dist/
|
||||||
|
# 用本地的 nginx.conf 配置来替换nginx镜像里的默认配置
|
||||||
|
COPY nginx.conf /etc/nginx/nginx.conf
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
server {
|
||||||
|
listen 4399;
|
||||||
|
server_name admin.swfc.store;
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
# 定义要压缩的文件类型
|
||||||
|
gzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
|
||||||
|
# 定义压缩级别
|
||||||
|
gzip_comp_level 6;
|
||||||
|
# 定义压缩缓冲区大小
|
||||||
|
gzip_buffers 16 8k;
|
||||||
|
# 定义压缩最小文件大小
|
||||||
|
gzip_min_length 256;
|
||||||
|
# 定义压缩的 HTTP 版本
|
||||||
|
gzip_http_version 1.1;
|
||||||
|
# 定义压缩的条件
|
||||||
|
gzip_vary on;
|
||||||
|
# 定义压缩的处理方式
|
||||||
|
gzip_proxied any;
|
||||||
|
# 定义压缩的处理方法
|
||||||
|
gzip_static on;
|
||||||
|
|
||||||
|
root /usr/share/nginx/html/admin/dist;
|
||||||
|
location / {
|
||||||
|
index index.html index.htm;
|
||||||
|
# try_files $uri $uri/ @router;
|
||||||
|
}
|
||||||
|
|
||||||
|
location @router {
|
||||||
|
rewrite ^.*$ /index.html break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api{
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header REMOTE-HOST $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
client_max_body_size 20M;
|
||||||
|
proxy_send_timeout 500;
|
||||||
|
proxy_read_timeout 480;
|
||||||
|
rewrite ^/api(.*)$ $1 break;
|
||||||
|
proxy_pass http://localhost:8088;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
export const API_BASE_URL = '';
|
||||||
|
|
||||||
|
export const MOCK_API_BASE_URL = '';
|
||||||
|
|
||||||
|
export const API_TARGET_URL = '';
|
||||||
|
|
||||||
|
export const MOCK_API_TARGET_URL = '';
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
// Read all environment variable configuration files to process.env
|
||||||
|
export function wrapperEnv(envConf: Recordable): ViteEnv {
|
||||||
|
const ret: any = {};
|
||||||
|
|
||||||
|
for (const envName of Object.keys(envConf)) {
|
||||||
|
let realName = envConf[envName].replace(/\\n/g, '\n');
|
||||||
|
realName = realName === 'true' ? true : realName === 'false' ? false : realName;
|
||||||
|
|
||||||
|
if (envName === 'VITE_PORT') {
|
||||||
|
realName = Number(realName);
|
||||||
|
}
|
||||||
|
if (envName === 'VITE_PROXY' && realName) {
|
||||||
|
try {
|
||||||
|
realName = JSON.parse(realName.replace(/'/g, '"'));
|
||||||
|
} catch (error) {
|
||||||
|
realName = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret[envName] = realName;
|
||||||
|
if (typeof realName === 'string') {
|
||||||
|
process.env[envName] = realName;
|
||||||
|
} else if (typeof realName === 'object') {
|
||||||
|
process.env[envName] = JSON.stringify(realName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
/**
|
||||||
|
* @name AutoImportDeps
|
||||||
|
* @description 按需加载,自动引入
|
||||||
|
*/
|
||||||
|
|
||||||
|
import AutoImport from 'unplugin-auto-import/vite';
|
||||||
|
import { VarletUIResolver, VantResolver } from 'unplugin-vue-components/resolvers';
|
||||||
|
|
||||||
|
export const AutoImportDeps = () => {
|
||||||
|
return AutoImport({
|
||||||
|
dts: 'types/auto-imports.d.ts',
|
||||||
|
imports: [
|
||||||
|
'vue',
|
||||||
|
'pinia',
|
||||||
|
'vue-router',
|
||||||
|
{
|
||||||
|
'@vueuse/core': [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
eslintrc: {
|
||||||
|
enabled: true,
|
||||||
|
},
|
||||||
|
resolvers: [VarletUIResolver(), VantResolver()],
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
/**
|
||||||
|
* @name AutoRegistryComponents
|
||||||
|
* @description 按需加载,自动引入组件
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Components from 'unplugin-vue-components/vite';
|
||||||
|
import { VueUseComponentsResolver, VantResolver, VarletUIResolver } from 'unplugin-vue-components/resolvers';
|
||||||
|
|
||||||
|
const NutUIResolver = () => {
|
||||||
|
return (name) => {
|
||||||
|
if (name.startsWith('Nut')) {
|
||||||
|
const partialName = name.slice(3);
|
||||||
|
return {
|
||||||
|
name: partialName,
|
||||||
|
from: '@nutui/nutui',
|
||||||
|
sideEffects: `@nutui/nutui/dist/packages/${partialName.toLowerCase()}/style`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export const AutoRegistryComponents = () => {
|
||||||
|
return Components({
|
||||||
|
// dirs: ['src/components'],
|
||||||
|
extensions: ['vue', 'md'],
|
||||||
|
deep: true,
|
||||||
|
dts: 'types/components.d.ts',
|
||||||
|
directoryAsNamespace: false,
|
||||||
|
globalNamespaces: [],
|
||||||
|
directives: true,
|
||||||
|
include: [/\.vue$/, /\.vue\?vue/, /\.md$/],
|
||||||
|
exclude: [/[\\/]node_modules[\\/]/, /[\\/]\.git[\\/]/, /[\\/]\.nuxt[\\/]/],
|
||||||
|
resolvers: [VueUseComponentsResolver(), VantResolver(), VarletUIResolver(), NutUIResolver()],
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
/**
|
||||||
|
* @name ConfigCompressPlugin
|
||||||
|
* @description 开启.gz压缩
|
||||||
|
*/
|
||||||
|
|
||||||
|
import viteCompression from 'vite-plugin-compression';
|
||||||
|
|
||||||
|
export const ConfigCompressPlugin = () => {
|
||||||
|
return viteCompression({
|
||||||
|
verbose: true, // 默认即可
|
||||||
|
disable: false, //开启压缩(不禁用),默认即可
|
||||||
|
deleteOriginFile: false, //删除源文件
|
||||||
|
threshold: 10240, //压缩前最小文件大小
|
||||||
|
algorithm: 'gzip', //压缩算法
|
||||||
|
ext: '.gz', //文件类型
|
||||||
|
});
|
||||||
|
|
||||||
|
return [];
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
/**
|
||||||
|
* @name ConfigEruda
|
||||||
|
* @description 控制台,方便移动端调试
|
||||||
|
*/
|
||||||
|
|
||||||
|
import eruda from 'vite-plugin-eruda';
|
||||||
|
|
||||||
|
export const ConfigEruda = () => {
|
||||||
|
return eruda();
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
/**
|
||||||
|
* @name ConfigImageminPlugin
|
||||||
|
* @description 图片压缩
|
||||||
|
*/
|
||||||
|
|
||||||
|
import viteImagemin from 'vite-plugin-imagemin';
|
||||||
|
|
||||||
|
export function ConfigImageminPlugin() {
|
||||||
|
const plugin = viteImagemin({
|
||||||
|
gifsicle: {
|
||||||
|
optimizationLevel: 7,
|
||||||
|
interlaced: false,
|
||||||
|
},
|
||||||
|
mozjpeg: {
|
||||||
|
quality: 20,
|
||||||
|
},
|
||||||
|
optipng: {
|
||||||
|
optimizationLevel: 7,
|
||||||
|
},
|
||||||
|
pngquant: {
|
||||||
|
quality: [0.8, 0.9],
|
||||||
|
speed: 4,
|
||||||
|
},
|
||||||
|
svgo: {
|
||||||
|
plugins: [
|
||||||
|
{
|
||||||
|
name: 'removeViewBox',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'removeEmptyAttrs',
|
||||||
|
active: false,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
/**
|
||||||
|
* @name createVitePlugins
|
||||||
|
* @description 封装plugins数组统一调用
|
||||||
|
*/
|
||||||
|
|
||||||
|
import type { PluginOption } from 'vite';
|
||||||
|
import vue from '@vitejs/plugin-vue';
|
||||||
|
import vueJsx from '@vitejs/plugin-vue-jsx';
|
||||||
|
import vueSetupExtend from 'vite-plugin-vue-setup-extend-plus';
|
||||||
|
import { ConfigSvgIconsPlugin } from './svgIcons';
|
||||||
|
import { AutoRegistryComponents } from './component';
|
||||||
|
import { AutoImportDeps } from './autoImport';
|
||||||
|
import { ConfigMockPlugin } from './mock';
|
||||||
|
import { ConfigCompressPlugin } from './compress';
|
||||||
|
import { ConfigPagesPlugin } from './pages';
|
||||||
|
import { ConfigRestartPlugin } from './restart';
|
||||||
|
import { ConfigProgressPlugin } from './progress';
|
||||||
|
import { ConfigEruda } from './eruda';
|
||||||
|
import { ConfigImageminPlugin } from './imagemin';
|
||||||
|
import { ConfigVisualizerConfig } from './visualizer';
|
||||||
|
import Unocss from 'unocss/vite';
|
||||||
|
import { presetUno } from 'unocss';
|
||||||
|
|
||||||
|
export function createVitePlugins(env: ViteEnv, isBuild: boolean) {
|
||||||
|
const { VITE_USE_MOCK, VITE_USE_ERUDA, VITE_USE_COMPRESS, VITE_USE_REPORT } = env;
|
||||||
|
|
||||||
|
const vitePlugins: (PluginOption | PluginOption[])[] = [
|
||||||
|
// vue支持
|
||||||
|
vue(),
|
||||||
|
// JSX支持
|
||||||
|
vueJsx(),
|
||||||
|
// setup语法糖组件名支持
|
||||||
|
vueSetupExtend(),
|
||||||
|
];
|
||||||
|
|
||||||
|
// 自动按需引入组件
|
||||||
|
vitePlugins.push(AutoRegistryComponents());
|
||||||
|
|
||||||
|
// 自动按需引入依赖
|
||||||
|
vitePlugins.push(AutoImportDeps());
|
||||||
|
|
||||||
|
// 自动生成路由
|
||||||
|
vitePlugins.push(ConfigPagesPlugin());
|
||||||
|
|
||||||
|
// 监听配置文件改动重启
|
||||||
|
vitePlugins.push(ConfigRestartPlugin());
|
||||||
|
|
||||||
|
// 构建时显示进度条
|
||||||
|
vitePlugins.push(ConfigProgressPlugin());
|
||||||
|
|
||||||
|
// eruda
|
||||||
|
VITE_USE_ERUDA && vitePlugins.push(ConfigEruda());
|
||||||
|
|
||||||
|
// rollup-plugin-visualizer
|
||||||
|
VITE_USE_REPORT && vitePlugins.push(ConfigVisualizerConfig());
|
||||||
|
|
||||||
|
// vite-plugin-mock
|
||||||
|
VITE_USE_MOCK && vitePlugins.push(ConfigMockPlugin(isBuild));
|
||||||
|
|
||||||
|
// vite-plugin-svg-icons
|
||||||
|
vitePlugins.push(ConfigSvgIconsPlugin(isBuild));
|
||||||
|
|
||||||
|
vitePlugins.push(
|
||||||
|
Unocss({
|
||||||
|
presets: [presetUno()],
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isBuild) {
|
||||||
|
// vite-plugin-imagemin
|
||||||
|
vitePlugins.push(ConfigImageminPlugin());
|
||||||
|
|
||||||
|
// 开启.gz压缩 rollup-plugin-gzip
|
||||||
|
VITE_USE_COMPRESS && vitePlugins.push(ConfigCompressPlugin());
|
||||||
|
}
|
||||||
|
|
||||||
|
return vitePlugins;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
/**
|
||||||
|
* @name ConfigMockPlugin
|
||||||
|
* @description 引入mockjs,本地模拟接口
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { viteMockServe } from 'vite-plugin-mock';
|
||||||
|
export const ConfigMockPlugin = (isBuild: boolean) => {
|
||||||
|
return viteMockServe({
|
||||||
|
ignore: /^\_/,
|
||||||
|
mockPath: 'mock',
|
||||||
|
localEnabled: !isBuild,
|
||||||
|
prodEnabled: false, //实际开发请关闭,会影响打包体积
|
||||||
|
// https://github.com/anncwb/vite-plugin-mock/issues/9
|
||||||
|
injectCode: `
|
||||||
|
import { setupProdMockServer } from '../mock/_createProdMockServer';
|
||||||
|
setupProdMockServer();
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
/**
|
||||||
|
* @name ConfigPagesPlugin
|
||||||
|
* @description 动态生成路由
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Pages from 'vite-plugin-pages';
|
||||||
|
export const ConfigPagesPlugin = () => {
|
||||||
|
return Pages({
|
||||||
|
pagesDir: [{ dir: 'src/pages', baseRoute: '' }],
|
||||||
|
extensions: ['vue', 'md'],
|
||||||
|
exclude: ['**/components/*.vue'],
|
||||||
|
nuxtStyle: true,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
/**
|
||||||
|
* @name ConfigProgressPlugin
|
||||||
|
* @description 构建显示进度条
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Plugin } from 'vite';
|
||||||
|
import progress from 'vite-plugin-progress';
|
||||||
|
|
||||||
|
export const ConfigProgressPlugin = () => {
|
||||||
|
return progress() as Plugin;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
/**
|
||||||
|
* @name ConfigRestartPlugin
|
||||||
|
* @description 监听配置文件修改自动重启Vite
|
||||||
|
*/
|
||||||
|
|
||||||
|
import ViteRestart from 'vite-plugin-restart';
|
||||||
|
|
||||||
|
export const ConfigRestartPlugin = () => {
|
||||||
|
return ViteRestart({
|
||||||
|
restart: ['*.config.[jt]s', '**/config/*.[jt]s'],
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
/**
|
||||||
|
* @name SvgIconsPlugin
|
||||||
|
* @description 加载SVG文件,自动引入
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
export const ConfigSvgIconsPlugin = (isBuild: boolean) => {
|
||||||
|
return createSvgIconsPlugin({
|
||||||
|
// 指定需要缓存的图标文件夹
|
||||||
|
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
|
||||||
|
// 指定symbolId格式
|
||||||
|
symbolId: 'icon-[dir]-[name]',
|
||||||
|
svgoOptions: isBuild,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
/**
|
||||||
|
* @name ConfigVisualizerConfig
|
||||||
|
* @description 打包体积分析
|
||||||
|
*/
|
||||||
|
|
||||||
|
import visualizer from 'rollup-plugin-visualizer';
|
||||||
|
|
||||||
|
export function ConfigVisualizerConfig() {
|
||||||
|
return visualizer({
|
||||||
|
filename: './node_modules/.cache/visualizer/stats.html',
|
||||||
|
open: true,
|
||||||
|
gzipSize: true,
|
||||||
|
brotliSize: true,
|
||||||
|
}) as Plugin;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
import { API_BASE_URL, API_TARGET_URL, MOCK_API_BASE_URL, MOCK_API_TARGET_URL } from '../constant';
|
||||||
|
import { ProxyOptions } from 'vite';
|
||||||
|
type ProxyTargetList = Record<string, ProxyOptions>;
|
||||||
|
|
||||||
|
const init: ProxyTargetList = {
|
||||||
|
// test
|
||||||
|
[API_BASE_URL]: {
|
||||||
|
target: API_TARGET_URL,
|
||||||
|
changeOrigin: true,
|
||||||
|
rewrite: (path) => path.replace(new RegExp(`^${API_BASE_URL}`), ''),
|
||||||
|
},
|
||||||
|
// mock
|
||||||
|
[MOCK_API_BASE_URL]: {
|
||||||
|
target: MOCK_API_TARGET_URL,
|
||||||
|
changeOrigin: true,
|
||||||
|
rewrite: (path) => path.replace(new RegExp(`^${MOCK_API_BASE_URL}`), '/api'),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default init;
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name swfc.store;
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
# 定义要压缩的文件类型
|
||||||
|
gzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
|
||||||
|
# 定义压缩级别
|
||||||
|
gzip_comp_level 6;
|
||||||
|
# 定义压缩缓冲区大小
|
||||||
|
gzip_buffers 16 8k;
|
||||||
|
# 定义压缩最小文件大小
|
||||||
|
gzip_min_length 256;
|
||||||
|
# 定义压缩的 HTTP 版本
|
||||||
|
gzip_http_version 1.1;
|
||||||
|
# 定义压缩的条件
|
||||||
|
gzip_vary on;
|
||||||
|
# 定义压缩的处理方式
|
||||||
|
gzip_proxied any;
|
||||||
|
# 定义压缩的处理方法
|
||||||
|
gzip_static on;
|
||||||
|
|
||||||
|
root /usr/share/nginx/html/h5/dist;
|
||||||
|
location / {
|
||||||
|
index index.html index.htm;
|
||||||
|
try_files $uri $uri/ @router;
|
||||||
|
}
|
||||||
|
|
||||||
|
location @router {
|
||||||
|
rewrite ^.*$ /index.html break;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api{
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header REMOTE-HOST $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
client_max_body_size 20M;
|
||||||
|
proxy_send_timeout 500;
|
||||||
|
proxy_read_timeout 480;
|
||||||
|
rewrite ^/api(.*)$ $1 break;
|
||||||
|
proxy_pass http://localhost:8088;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,82 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" href="/favicon.ico" />
|
||||||
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"
|
||||||
|
/>
|
||||||
|
<meta name="format-detection" content="telephone=no, email=no, date=no, address=no" />
|
||||||
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
|
||||||
|
<meta http-equiv="Pragma" content="no-cache" />
|
||||||
|
<meta http-equiv="Expires" content="0" />
|
||||||
|
<script src="//res2.wx.qq.com/open/js/jweixin-1.6.0.js" type="text/javascript"></script>
|
||||||
|
<!-- <script src="wechatH5Video.min.js" type="text/javascript"></script> -->
|
||||||
|
<title>上海环球金融中心</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="videoWrapper"></div>
|
||||||
|
<div id="app"> </div>
|
||||||
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
// if ( window.sessionStorage.getItem('isFirst') !== 'false') {
|
||||||
|
// var source = '//huanqiuzhongxin.oss-cn-shanghai.aliyuncs.com/shipin/second.mp4';
|
||||||
|
// var video = new wechatH5Video(source, {
|
||||||
|
// context: 'videoWrapper',
|
||||||
|
// mask: false,
|
||||||
|
// poster:
|
||||||
|
// 'https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1541401188&di=41264a717eb6a592709efc04a66e216d&src=http://i8.download.fd.pchome.net/t_600x1024/g1/M00/07/04/oYYBAFMioPmIClVuAALr2NPIYaIAABZ9QKPJJUAAuvw540.jpg',
|
||||||
|
// playBtn: true,
|
||||||
|
// jumpBtn: false,
|
||||||
|
// autoClose: true,
|
||||||
|
// canvas: false,
|
||||||
|
// isRotate: true,
|
||||||
|
// onPlay() {
|
||||||
|
// },
|
||||||
|
// onPause() {
|
||||||
|
// },
|
||||||
|
// onEnd() {
|
||||||
|
// window.sessionStorage.setItem('isFirst', 'false');
|
||||||
|
// // console.log('end');
|
||||||
|
// },
|
||||||
|
// });
|
||||||
|
// video.load();
|
||||||
|
// setTimeout(() => {
|
||||||
|
// video.play();
|
||||||
|
// }, 50);
|
||||||
|
// }
|
||||||
|
|
||||||
|
document.addEventListener('touchstart', function (event) {
|
||||||
|
if (event.touches.length > 1) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var lastTouchEnd = 0;
|
||||||
|
|
||||||
|
document.addEventListener(
|
||||||
|
'touchend',
|
||||||
|
function (event) {
|
||||||
|
var now = new Date().getTime();
|
||||||
|
if (now - lastTouchEnd <= 300) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
lastTouchEnd = now;
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
|
||||||
|
document.addEventListener('gesturestart', function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<!-- <script src="https://cdn.bootcss.com/eruda/1.5.4/eruda.min.js"></script>
|
||||||
|
<script>
|
||||||
|
eruda.init();
|
||||||
|
</script> -->
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" href="/favicon.ico" />
|
||||||
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"
|
||||||
|
/>
|
||||||
|
<meta name="format-detection" content="telephone=no, email=no, date=no, address=no" />
|
||||||
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
|
||||||
|
<meta http-equiv="Pragma" content="no-cache" />
|
||||||
|
<meta http-equiv="Expires" content="0" />
|
||||||
|
<script src="//res2.wx.qq.com/open/js/jweixin-1.6.0.js" type="text/javascript"></script>
|
||||||
|
<script src="wechatH5Video.min.js" type="text/javascript"></script>
|
||||||
|
<title>上海环球金融中心</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="videoWrapper"></div>
|
||||||
|
<div id="app"> </div>
|
||||||
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
document.addEventListener('touchstart', function (event) {
|
||||||
|
if (event.touches.length > 1) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var lastTouchEnd = 0;
|
||||||
|
|
||||||
|
document.addEventListener(
|
||||||
|
'touchend',
|
||||||
|
function (event) {
|
||||||
|
var now = new Date().getTime();
|
||||||
|
if (now - lastTouchEnd <= 300) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
lastTouchEnd = now;
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
|
||||||
|
document.addEventListener('gesturestart', function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
import { MockMethod, Recordable } from 'vite-plugin-mock';
|
||||||
|
|
||||||
|
interface response {
|
||||||
|
body: Recordable;
|
||||||
|
query: Recordable;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default [
|
||||||
|
{
|
||||||
|
url: '/api/login',
|
||||||
|
method: 'post',
|
||||||
|
response: ({ body, query }: response) => {
|
||||||
|
console.log('body>>>>>>>>', body);
|
||||||
|
console.log('query>>>>>>>>', query);
|
||||||
|
return {
|
||||||
|
code: 200,
|
||||||
|
message: 'ok',
|
||||||
|
data: { name: 'Evan', age: 26 },
|
||||||
|
};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
] as MockMethod[];
|
||||||
|
|
@ -0,0 +1,138 @@
|
||||||
|
{
|
||||||
|
"name": "shop-h5",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"preview": "vite preview",
|
||||||
|
"lint:eslint": "eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix",
|
||||||
|
"lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
|
||||||
|
"lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
|
||||||
|
"lint:lint-staged": "lint-staged",
|
||||||
|
"prepare": "husky install",
|
||||||
|
"deps": "yarn upgrade-interactive --latest",
|
||||||
|
"commit": "git add . && git-cz"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@nutui/icons-vue": "^0.1.1",
|
||||||
|
"@nutui/nutui": "^4.2.1",
|
||||||
|
"@samrahnama/triple-state-slider": "^1.1.10",
|
||||||
|
"@varlet/ui": "^2.13.0",
|
||||||
|
"@vueuse/core": "10.2.1",
|
||||||
|
"@vueuse/integrations": "10.2.1",
|
||||||
|
"axios": "1.4.0",
|
||||||
|
"crypto-js": "^4.2.0",
|
||||||
|
"dayjs": "^1.11.9",
|
||||||
|
"mitt": "^3.0.1",
|
||||||
|
"pinia": "^2.1.3",
|
||||||
|
"pinia-plugin-persistedstate": "^3.1.0",
|
||||||
|
"quarkd": "^1.0.70",
|
||||||
|
"universal-cookie": "^4.0.4",
|
||||||
|
"unocss": "^0.57.4",
|
||||||
|
"vant": "^4.6.2",
|
||||||
|
"vue": "^3.3.1",
|
||||||
|
"vue-i18n": "^9.2.2",
|
||||||
|
"vue-router": "^4.2.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@commitlint/cli": "^17.6.6",
|
||||||
|
"@commitlint/config-conventional": "^17.6.6",
|
||||||
|
"@vitejs/plugin-basic-ssl": "^1.0.1",
|
||||||
|
"@vitejs/plugin-legacy": "^4.1.0",
|
||||||
|
"@vitejs/plugin-vue": "^4.2.3",
|
||||||
|
"@vitejs/plugin-vue-jsx": "^3.0.1",
|
||||||
|
"@vue/eslint-config-prettier": "^7.1.0",
|
||||||
|
"@vue/eslint-config-typescript": "^11.0.3",
|
||||||
|
"@vue/test-utils": "^2.4.0",
|
||||||
|
"@vue/tsconfig": "^0.4.0",
|
||||||
|
"amfe-flexible": "^2.2.1",
|
||||||
|
"autoprefixer": "^10.4.14",
|
||||||
|
"cnjm-postcss-px-to-viewport": "^1.0.0",
|
||||||
|
"consola": "^3.2.3",
|
||||||
|
"cross-env": "^7.0.3",
|
||||||
|
"cz-git": "^1.7.0",
|
||||||
|
"czg": "^1.7.0",
|
||||||
|
"eruda": "^3.0.0",
|
||||||
|
"eslint": "^8.45.0",
|
||||||
|
"eslint-config-prettier": "^8.8.0",
|
||||||
|
"eslint-define-config": "^1.21.0",
|
||||||
|
"eslint-plugin-import": "^2.27.5",
|
||||||
|
"eslint-plugin-prettier": "^5.0.0",
|
||||||
|
"eslint-plugin-simple-import-sort": "^10.0.0",
|
||||||
|
"eslint-plugin-vue": "^9.15.1",
|
||||||
|
"git-cz": "^4.9.0",
|
||||||
|
"husky": "8.0.3",
|
||||||
|
"jsdom": "^22.1.0",
|
||||||
|
"lint-staged": "13.2.3",
|
||||||
|
"mockjs": "^1.1.0",
|
||||||
|
"npm-run-all": "^4.1.5",
|
||||||
|
"postcss": "^8.4.26",
|
||||||
|
"postcss-html": "1.5.0",
|
||||||
|
"postcss-less": "^6.0.0",
|
||||||
|
"prettier": "^3.0.0",
|
||||||
|
"rollup-plugin-visualizer": "^5.9.1",
|
||||||
|
"stylelint": "^15.10.1",
|
||||||
|
"stylelint-config-property-sort-order-smacss": "^9.1.0",
|
||||||
|
"stylelint-config-recommended": "^13.0.0",
|
||||||
|
"stylelint-config-recommended-vue": "^1.5.0",
|
||||||
|
"stylelint-config-standard": "^34.0.0",
|
||||||
|
"stylelint-config-standard-scss": "^10.0.0",
|
||||||
|
"stylelint-order": "^6.0.3",
|
||||||
|
"stylelint-prettier": "^4.0.0",
|
||||||
|
"terser": "^5.19.0",
|
||||||
|
"typescript": "^5.1.6",
|
||||||
|
"unplugin-auto-import": "^0.16.6",
|
||||||
|
"unplugin-vue-components": "^0.25.1",
|
||||||
|
"vite": "^4.4.4",
|
||||||
|
"vite-plugin-compression": "^0.5.1",
|
||||||
|
"vite-plugin-eruda": "^1.0.1",
|
||||||
|
"vite-plugin-imagemin": "^0.6.1",
|
||||||
|
"vite-plugin-mock": "^3.0.0",
|
||||||
|
"vite-plugin-pages": "^0.31.0",
|
||||||
|
"vite-plugin-progress": "^0.0.7",
|
||||||
|
"vite-plugin-restart": "^0.3.1",
|
||||||
|
"vite-plugin-svg-icons": "^2.0.1",
|
||||||
|
"vite-plugin-vue-setup-extend-plus": "^0.1.0",
|
||||||
|
"vitest": "^0.33.0",
|
||||||
|
"vue-eslint-parser": "^9.3.1",
|
||||||
|
"vue-tsc": "^1.8.5"
|
||||||
|
},
|
||||||
|
"husky": {
|
||||||
|
"hooks": {
|
||||||
|
"pre-commit": "lint-staged"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resolutions": {
|
||||||
|
"bin-wrapper": "npm:bin-wrapper-china",
|
||||||
|
"gifsicle": "5.2.0"
|
||||||
|
},
|
||||||
|
"lint-staged": {
|
||||||
|
"*.{js,jsx,ts,tsx}": [
|
||||||
|
"eslint --fix",
|
||||||
|
"prettier --write"
|
||||||
|
],
|
||||||
|
"{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [
|
||||||
|
"prettier --write--parser json"
|
||||||
|
],
|
||||||
|
"package.json": [
|
||||||
|
"prettier --write"
|
||||||
|
],
|
||||||
|
"*.vue": [
|
||||||
|
"eslint --fix",
|
||||||
|
"prettier --write",
|
||||||
|
"stylelint --fix"
|
||||||
|
],
|
||||||
|
"*.{scss,less,styl,html}": [
|
||||||
|
"stylelint --fix",
|
||||||
|
"prettier --write"
|
||||||
|
],
|
||||||
|
"*.md": [
|
||||||
|
"prettier --write"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"commitizen": {
|
||||||
|
"path": "node_modules/cz-git"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
const judgeComponent = (file) => {
|
||||||
|
const ignore = ['vant', '@nutui', '@varlet']
|
||||||
|
return ignore.some((item) => path.join(file).includes(path.join('node_modules', item)))
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
autoprefixer: { overrideBrowserslist: ['Android 4.1', 'iOS 7.1', 'Chrome > 31', 'ff > 31', 'ie >= 8'] },
|
||||||
|
'cnjm-postcss-px-to-viewport': {
|
||||||
|
unitToConvert: 'px', // 要转化的单位
|
||||||
|
viewportWidth: 750, // UI设计稿的宽度
|
||||||
|
unitPrecision: 6, // 转换后的精度,即小数点位数
|
||||||
|
propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
|
||||||
|
viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
|
||||||
|
fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
|
||||||
|
minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
|
||||||
|
mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
|
||||||
|
replace: true, // 是否转换后直接更换属性值
|
||||||
|
landscape: false, //是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape)
|
||||||
|
landscapeUnit: 'rem', //横屏时使用的单位
|
||||||
|
landscapeWidth: 1134, //横屏时使用的视口宽度
|
||||||
|
include: [],
|
||||||
|
exclude: [], // 设置忽略文件,用正则做目录名匹配
|
||||||
|
customFun: ({ file }) => {
|
||||||
|
// 这个自定义的方法是针对处理vant组件下的设计稿为375问题
|
||||||
|
const designWidth = judgeComponent(file) ? 375 : 750
|
||||||
|
return designWidth
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
module.exports = {
|
||||||
|
printWidth: 140,
|
||||||
|
semi: true,
|
||||||
|
vueIndentScriptAndStyle: true,
|
||||||
|
singleQuote: true,
|
||||||
|
trailingComma: 'all',
|
||||||
|
proseWrap: 'never',
|
||||||
|
htmlWhitespaceSensitivity: 'strict',
|
||||||
|
endOfLine: 'auto',
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
files: '.*rc',
|
||||||
|
options: {
|
||||||
|
parser: 'json',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
<template>
|
||||||
|
<div class="w-screen h-screen overflow-scroll">
|
||||||
|
<router-view />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
// document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
|
||||||
|
// // 通过下面这个API隐藏底部导航栏
|
||||||
|
// WeixinJSBridge.call('hideToolbar');
|
||||||
|
// });
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
#app {
|
||||||
|
font-family: 'Fontquan-XinYiJiXiangSong', Arial, Helvetica, sans-serif;
|
||||||
|
// color: rgba(255, 240, 215, 0.8);
|
||||||
|
color: #ffdfbd;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
height: 100vh;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
.main {
|
||||||
|
background: url('@/assets/imgs/background.png');
|
||||||
|
// background-size: cover;
|
||||||
|
}
|
||||||
|
.bgi-light {
|
||||||
|
// background: url('@/assets/imgs/build.png') no-repeat;
|
||||||
|
background: url('https://huanqiuzhongxin.oss-cn-shanghai.aliyuncs.com/shipin/build.png') no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
.bg-lou {
|
||||||
|
background: url('@/assets/imgs/shop-detail/kuangs@2x.png') no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,137 @@
|
||||||
|
import { enc, SHA1 } from 'crypto-js';
|
||||||
|
import { http } from '@/utils/request';
|
||||||
|
// import { generateSignature } from '@/utils/util';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 账号密码登录
|
||||||
|
* @returns UseAxiosReturn
|
||||||
|
*/
|
||||||
|
export function loginPassword() {
|
||||||
|
return http.post(`/login`, {
|
||||||
|
data: { name: '123' },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getWxMpRequest(params: any) {
|
||||||
|
return http.get(`/wx/wxlogin`, {
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getWxMpJsToken(params: any) {
|
||||||
|
return http.get(`/wx/access`, {
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getWx({ token = localStorage.getItem('token'), url = window.location.href }: any) {
|
||||||
|
const res = await http.get('/weixin/cgi-bin/ticket/getticke', {
|
||||||
|
params: {
|
||||||
|
access_token: token,
|
||||||
|
type: 'jsapi',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// 生成nonceStr
|
||||||
|
const nonceStr = Math.random().toString(36).substring(2, 15);
|
||||||
|
|
||||||
|
// 获取timestamp(当前时间戳)
|
||||||
|
const timestamp = Math.floor(Date.now() / 1000);
|
||||||
|
|
||||||
|
// 根据需要的配置参数生成signature
|
||||||
|
const signature = SHA1(`noncestr=${nonceStr}×tamp=${timestamp}&url=${url}`).toString(enc.Hex);
|
||||||
|
|
||||||
|
return {
|
||||||
|
result: {
|
||||||
|
timestamp,
|
||||||
|
nonceStr,
|
||||||
|
signature,
|
||||||
|
jsapi_ticket: res?.data?.ticket,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
// return http.get(`/sns/oauth2/access_token`, {
|
||||||
|
// params: {
|
||||||
|
// code,
|
||||||
|
// grant_type: 'authorization_code',
|
||||||
|
// appid: import.meta.env.VITE_BASE_APP_ID,
|
||||||
|
// secret: import.meta.env.VITE_BASE_APP_SECRET,
|
||||||
|
// },
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询
|
||||||
|
* @param query .
|
||||||
|
* @returns .
|
||||||
|
*/
|
||||||
|
export function queryShopPage(params?: any): Promise<any> {
|
||||||
|
return http.get('/buiness/shop/query/page', { params });
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 查询详情
|
||||||
|
* @param query .
|
||||||
|
* @returns .
|
||||||
|
*/
|
||||||
|
export function queryShopDetail(params?: any): Promise<any> {
|
||||||
|
return http.get('/buiness/shop', { params });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询bx
|
||||||
|
* @param query .
|
||||||
|
* @returns .
|
||||||
|
*/
|
||||||
|
export function queryBoxPage(params?: any): Promise<any> {
|
||||||
|
return http.get('/buiness/box/query/page', { params });
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 查询详情bx
|
||||||
|
* @param query .
|
||||||
|
* @returns .
|
||||||
|
*/
|
||||||
|
export function queryBoxDetail(params?: any): Promise<any> {
|
||||||
|
return http.get('/buiness/box', { params });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询所有酒水
|
||||||
|
* @param query .
|
||||||
|
* @returns .
|
||||||
|
*/
|
||||||
|
export function queryHour(params?: any): Promise<any> {
|
||||||
|
return http.get('/buiness/shop/getHour', { params });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询季节菜
|
||||||
|
* @param query .
|
||||||
|
* @returns .
|
||||||
|
*/
|
||||||
|
export function querySeason(params?: any): Promise<any> {
|
||||||
|
return http.get('/buiness/shop/getSeason', { params });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询所有活动
|
||||||
|
* @param query .
|
||||||
|
* @returns .
|
||||||
|
*/
|
||||||
|
export function queryCoupon(params?: any): Promise<any> {
|
||||||
|
return http.get('/buiness/coupon/query/page', { params });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领取优惠券
|
||||||
|
* @param query .
|
||||||
|
* @returns .
|
||||||
|
*/
|
||||||
|
export function queryCouponLog(params?: any): Promise<any> {
|
||||||
|
return http.get('/buiness/coupon/getCoupon', { params });
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 核销优惠券
|
||||||
|
* @param query .
|
||||||
|
* @returns .
|
||||||
|
*/
|
||||||
|
export function queryVerification(params?: any): Promise<any> {
|
||||||
|
return http.get('/buiness/coupon/verification', { params });
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
html,
|
||||||
|
body,
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6,
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
scroll-behavior: auto;
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
|
@ -0,0 +1,10 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Fontquan-XinYiJiXiangSong';
|
||||||
|
src:
|
||||||
|
url('Fontquan-XinYiJiXiangSong-Regular.woff2') format('woff2'),
|
||||||
|
url('Fontquan-XinYiJiXiangSong-Regular.woff') format('woff');
|
||||||
|
/* url('https://huanqiuzhongxin.oss-cn-shanghai.aliyuncs.com/ziti/font.ttf'); */
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 739 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 6.9 MiB |
|
After Width: | Height: | Size: 163 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 8.8 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 171 KiB |
|
After Width: | Height: | Size: 170 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 875 KiB |
|
After Width: | Height: | Size: 193 KiB |
|
After Width: | Height: | Size: 169 KiB |
|
After Width: | Height: | Size: 903 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 885 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 9.5 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 12 KiB |