commit
59c644956b
53 changed files with 3139 additions and 0 deletions
@ -0,0 +1,2 @@ |
|||
> 1% |
|||
last 2 versions |
@ -0,0 +1,14 @@ |
|||
# http://editorconfig.org |
|||
root = true |
|||
|
|||
[*] |
|||
charset = utf-8 |
|||
indent_style = space |
|||
indent_size = 2 |
|||
end_of_line = lf |
|||
insert_final_newline = true |
|||
trim_trailing_whitespace = true |
|||
|
|||
[*.md] |
|||
insert_final_newline = false |
|||
trim_trailing_whitespace = false |
@ -0,0 +1,6 @@ |
|||
NODE_ENV='development' |
|||
# must start with VUE_APP_ |
|||
VUE_APP_ENV = 'development' |
|||
outputDir = 'epmet-work-h5-dev' |
|||
|
|||
|
@ -0,0 +1,5 @@ |
|||
NODE_ENV='production' |
|||
# must start with VUE_APP_ |
|||
VUE_APP_ENV = 'production' |
|||
outputDir = 'epmet-work-h5-prod' |
|||
|
@ -0,0 +1,4 @@ |
|||
NODE_ENV='production' |
|||
# must start with VUE_APP_ |
|||
VUE_APP_ENV = 'staging' |
|||
|
@ -0,0 +1,4 @@ |
|||
build/*.js |
|||
src/assets |
|||
public |
|||
dist |
@ -0,0 +1,54 @@ |
|||
module.exports = { |
|||
root: true, |
|||
env: { |
|||
browser: true, |
|||
node: true, |
|||
es6: true, |
|||
'vue/setup-compiler-macros': true |
|||
}, |
|||
globals: { |
|||
defineProps: 'readonly', |
|||
defineEmits: 'readonly' |
|||
}, |
|||
extends: ['plugin:vue/essential', 'eslint:recommended', 'plugin:prettier/recommended'], |
|||
parserOptions: { |
|||
parser: '@babel/eslint-parser' |
|||
}, |
|||
rules: { |
|||
'no-console': 'warn', |
|||
'no-debugger': 'warn', |
|||
'vue/script-setup-uses-vars': 'error', |
|||
'vue/custom-event-name-casing': 'off', |
|||
'no-use-before-define': 'off', |
|||
'no-unused-vars': [ |
|||
'error', |
|||
{ |
|||
argsIgnorePattern: '^_', |
|||
varsIgnorePattern: '^_' |
|||
} |
|||
], |
|||
'space-before-function-paren': '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/html-self-closing': [ |
|||
'error', |
|||
{ |
|||
html: { |
|||
void: 'always', |
|||
normal: 'never', |
|||
component: 'always' |
|||
}, |
|||
svg: 'always', |
|||
math: 'always' |
|||
} |
|||
], |
|||
'vue/v-on-event-hyphenation': 'off', |
|||
'vue/multi-word-component-names': 'off' |
|||
} |
|||
} |
@ -0,0 +1,24 @@ |
|||
.DS_Store |
|||
node_modules |
|||
/dist |
|||
/docs |
|||
# local env files |
|||
.env.local |
|||
.env.*.local |
|||
|
|||
# Log files |
|||
npm-debug.log* |
|||
yarn-debug.log* |
|||
yarn-error.log* |
|||
|
|||
# Editor directories and files |
|||
.idea |
|||
.vscode |
|||
*.suo |
|||
*.ntvs* |
|||
*.njsproj |
|||
*.sln |
|||
*.sw? |
|||
|
|||
package-lock.json |
|||
yarn.lock |
@ -0,0 +1,13 @@ |
|||
// https://github.com/michael-ciniawsky/postcss-load-config
|
|||
module.exports = { |
|||
plugins: { |
|||
autoprefixer: { |
|||
overrideBrowserslist: ['Android 4.1', 'iOS 7.1', 'Chrome > 31', 'ff > 31', 'ie >= 8'] |
|||
}, |
|||
'postcss-pxtorem': { |
|||
rootValue: 37.5, |
|||
propList: ['*'], |
|||
//selectorBlackList: ['van-']
|
|||
} |
|||
} |
|||
} |
@ -0,0 +1 @@ |
|||
README.md |
@ -0,0 +1,24 @@ |
|||
{ |
|||
"printWidth": 120, |
|||
"tabWidth": 2, |
|||
"singleQuote": true, |
|||
"trailingComma": "none", |
|||
"semi": false, |
|||
"wrap_line_length": 120, |
|||
"wrap_attributes": "auto", |
|||
"proseWrap": "always", |
|||
"arrowParens": "avoid", |
|||
"bracketSpacing": true, |
|||
"jsxBracketSameLine": true, |
|||
"useTabs": false, |
|||
"eslintIntegration":true, |
|||
"overrides": [ |
|||
{ |
|||
"files": ".prettierrc", |
|||
"options": { |
|||
"parser": "json" |
|||
} |
|||
} |
|||
], |
|||
"endOfLine": "auto" |
|||
} |
File diff suppressed because it is too large
@ -0,0 +1,22 @@ |
|||
// 获取 VUE_APP_ENV 非 NODE_ENV,测试环境依然 console
|
|||
const IS_PROD = ['production', 'prod'].includes(process.env.VUE_APP_ENV) |
|||
const plugins = [ |
|||
[ |
|||
'import', |
|||
{ |
|||
libraryName: 'vant', |
|||
libraryDirectory: 'es', |
|||
style: true |
|||
}, |
|||
'vant' |
|||
] |
|||
] |
|||
// 去除 console.log
|
|||
if (IS_PROD) { |
|||
plugins.push('transform-remove-console') |
|||
} |
|||
|
|||
module.exports = { |
|||
presets: [['@vue/cli-plugin-babel/preset', {useBuiltIns: 'usage', corejs: 3}]], |
|||
plugins |
|||
} |
@ -0,0 +1,17 @@ |
|||
{ |
|||
"compilerOptions": { |
|||
"target": "ES6", |
|||
"module": "commonjs", |
|||
"allowSyntheticDefaultImports": true, |
|||
"baseUrl": "./", |
|||
"paths": { |
|||
// 路径匹配 |
|||
"@/*": ["src/*"] |
|||
} |
|||
}, |
|||
"exclude": [ |
|||
// 排除某些文件 |
|||
"node_modules" |
|||
], |
|||
"include": ["./src/**/*"] //自动引入Vue组件和普通Js模块 |
|||
} |
@ -0,0 +1,60 @@ |
|||
{ |
|||
"name": "epmet-work-h5", |
|||
"version": "1.0.0", |
|||
"description": "", |
|||
"author": "", |
|||
"private": true, |
|||
"scripts": { |
|||
"serve": "vue-cli-service serve --host 0.0.0.0", |
|||
"dev": "vue-cli-service serve", |
|||
"build": "vue-cli-service build", |
|||
"build:dev": "vue-cli-service build --mode development", |
|||
"build:prod": "vue-cli-service build --mode production", |
|||
"build:stage": "vue-cli-service build --mode staging", |
|||
"lint": "vue-cli-service lint", |
|||
"deps": "yarn upgrade-interactive --latest" |
|||
}, |
|||
"dependencies": { |
|||
"@vue-office/docx": "^1.0.0", |
|||
"@vue-office/excel": "^1.0.0", |
|||
"@vue-office/pdf": "^1.0.0", |
|||
"amfe-flexible": "^2.2.1", |
|||
"axios": "^0.27.2", |
|||
"core-js": "^3.23.3", |
|||
"dayjs": "^1.11.7", |
|||
"eslint": "^8.12.0", |
|||
"eslint-plugin-vue": "^8.4.0", |
|||
"filemanager-webpack-plugin": "^8.0.0", |
|||
"html-webpack-plugin": "^5.5.3", |
|||
"less-loader": "^11.1.0", |
|||
"postcss-pxtorem": "^6.0.0", |
|||
"regenerator-runtime": "^0.13.5", |
|||
"vant": "^2.12.48", |
|||
"vconsole": "^3.15.0", |
|||
"vue": "^2.7.8", |
|||
"vue-demi": "^0.14.0", |
|||
"vue-router": "^3.5.4", |
|||
"vuex": "^3.6.2" |
|||
}, |
|||
"devDependencies": { |
|||
"@babel/core": "^7.18.10", |
|||
"@babel/eslint-parser": "^7.18.2", |
|||
"@vue/cli-plugin-babel": "~5.0.8", |
|||
"@vue/cli-plugin-eslint": "~5.0.8", |
|||
"@vue/cli-plugin-router": "~5.0.8", |
|||
"@vue/cli-plugin-vuex": "~5.0.8", |
|||
"@vue/cli-service": "~5.0.8", |
|||
"ajv": "^7.2.4", |
|||
"babel-eslint": "^10.1.0", |
|||
"babel-plugin-import": "^1.13.5", |
|||
"babel-plugin-transform-remove-console": "^6.9.4", |
|||
"eslint-config-prettier": "^8.5.0", |
|||
"eslint-plugin-prettier": "^4.0.0", |
|||
"less": "^4.1.2", |
|||
"postcss": "^8.4.12", |
|||
"prettier": "2.6.2", |
|||
"script-ext-html-webpack-plugin": "2.1.4", |
|||
"svg-sprite-loader": "5.1.1", |
|||
"webpack-bundle-analyzer": "^4.5.0" |
|||
} |
|||
} |
After Width: | Height: | Size: 4.2 KiB |
@ -0,0 +1,27 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> |
|||
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
|||
<!-- <% for (var i in |
|||
htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %> |
|||
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="preload" as="style" /> |
|||
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet" /> |
|||
<% } %> --> |
|||
<title><%= webpackConfig.name %></title> |
|||
</head> |
|||
<body> |
|||
<noscript> |
|||
<strong>We're sorry but <%= webpackConfig.name %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
|||
</noscript> |
|||
<div id="app"></div> |
|||
<!-- 使用CDN加速的JS文件,配置在vue.config.js下 --> |
|||
<!-- <% for (var i in |
|||
htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) { %> |
|||
<script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script> |
|||
<% } %> --> |
|||
<!-- built files will be auto injected --> |
|||
</body> |
|||
</html> |
@ -0,0 +1,14 @@ |
|||
<template> |
|||
<div id="app"> |
|||
<router-view /> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'App', |
|||
data() { |
|||
return {} |
|||
} |
|||
} |
|||
</script> |
|||
<style lang="less"></style> |
@ -0,0 +1,6 @@ |
|||
// import qs from 'qs'
|
|||
// axios
|
|||
// import request from '@/utils/request'
|
|||
//home api
|
|||
|
|||
|
@ -0,0 +1,7 @@ |
|||
const api = { |
|||
Login: '/user/login', |
|||
UserInfo: '/user/userinfo', |
|||
UserName: '/user/name' |
|||
} |
|||
|
|||
export default api |
@ -0,0 +1,32 @@ |
|||
import api from './index' |
|||
// axios
|
|||
import request from '@/utils/request' |
|||
|
|||
// 登录
|
|||
export function login(data) { |
|||
return request({ |
|||
url: api.Login, |
|||
method: 'post', |
|||
data |
|||
}) |
|||
} |
|||
|
|||
// 用户信息 post 方法
|
|||
export function getUserInfo(data) { |
|||
return request({ |
|||
url: api.UserInfo, |
|||
method: 'post', |
|||
data, |
|||
hideloading: true |
|||
}) |
|||
} |
|||
|
|||
// 用户名称 get 方法
|
|||
export function getUserName(params) { |
|||
return request({ |
|||
url: api.UserName, |
|||
method: 'get', |
|||
params, |
|||
hideloading: true |
|||
}) |
|||
} |
@ -0,0 +1,70 @@ |
|||
|
|||
html, |
|||
body #app { |
|||
color: @black; |
|||
background-color: @background-color; |
|||
} |
|||
|
|||
#app { |
|||
font-size: 16px; |
|||
background-size: 100% auto; |
|||
} |
|||
|
|||
.flex { |
|||
display: flex; |
|||
} |
|||
|
|||
.mr10 { |
|||
margin-right: 10px; |
|||
} |
|||
|
|||
.primary-color { |
|||
color: @blue; |
|||
} |
|||
|
|||
.jcsb { |
|||
justify-content: space-between; |
|||
} |
|||
|
|||
.aic { |
|||
align-items: center; |
|||
} |
|||
.container { |
|||
padding: 10px; |
|||
} |
|||
|
|||
|
|||
.card{ |
|||
background-color: #fff; |
|||
border-radius: 2px; |
|||
box-shadow: 0 1px 3px rgba(0,0,0,.3); |
|||
box-sizing: border-box; |
|||
width: 100%; |
|||
} |
|||
.flex{ |
|||
display: flex; |
|||
.flex1{ |
|||
flex: 1; |
|||
} |
|||
&-y{ |
|||
flex-direction: column; |
|||
} |
|||
&-center1{ |
|||
justify-content: center; |
|||
} |
|||
&-center2{ |
|||
align-items: center; |
|||
} |
|||
&-mean{ |
|||
justify-content: space-around; |
|||
} |
|||
&-end{ |
|||
justify-content: space-between; |
|||
} |
|||
} |
|||
.m-top12{ |
|||
margin-top: 12px; |
|||
} |
|||
|
|||
|
|||
|
@ -0,0 +1,35 @@ |
|||
|
|||
html, |
|||
body #app { |
|||
color: @black; |
|||
background-color: @background-color; |
|||
} |
|||
|
|||
#app { |
|||
font-size: 16px; |
|||
background-size: 100% auto; |
|||
} |
|||
|
|||
.flex { |
|||
display: flex; |
|||
} |
|||
|
|||
.mr10 { |
|||
margin-right: 10px; |
|||
} |
|||
|
|||
.primary-color { |
|||
color: @blue; |
|||
} |
|||
|
|||
.jcsb { |
|||
justify-content: space-between; |
|||
} |
|||
|
|||
.aic { |
|||
align-items: center; |
|||
} |
|||
.container { |
|||
padding: 10px; |
|||
} |
|||
|
@ -0,0 +1,36 @@ |
|||
// mixin |
|||
// 清除浮动 |
|||
@mixin clearfix { |
|||
&:after { |
|||
content: ""; |
|||
display: table; |
|||
clear: both; |
|||
} |
|||
} |
|||
|
|||
// 多行隐藏 |
|||
@mixin textoverflow($clamp:1) { |
|||
display: block; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
-o-text-overflow: ellipsis; |
|||
display: -webkit-box; |
|||
-webkit-line-clamp: $clamp; |
|||
/*! autoprefixer: ignore next */ |
|||
-webkit-box-orient: vertical; |
|||
} |
|||
|
|||
//flex box |
|||
@mixin flexbox($jc:space-between, $ai:center, $fd:row, $fw:nowrap) { |
|||
display: flex; |
|||
display: -webkit-flex; |
|||
flex: 1; |
|||
justify-content: $jc; |
|||
-webkit-justify-content: $jc; |
|||
align-items: $ai; |
|||
-webkit-align-items: $ai; |
|||
flex-direction: $fd; |
|||
-webkit-flex-direction: $fd; |
|||
flex-wrap: $fw; |
|||
-webkit-flex-wrap: $fw; |
|||
} |
@ -0,0 +1,688 @@ |
|||
// Color Palette |
|||
@black: #000; |
|||
@white: #fff; |
|||
@gray-1: #f7f8fa; |
|||
@gray-2: #f2f3f5; |
|||
@gray-3: #ebedf0; |
|||
@gray-4: #dcdee0; |
|||
@gray-5: #c8c9cc; |
|||
@gray-6: #969799; |
|||
@gray-7: #646566; |
|||
@gray-8: #323233; |
|||
@red: #ee0a24; |
|||
@blue: #1989fa; |
|||
@orange: #ff976a; |
|||
@orange-dark: #ed6a0c; |
|||
@orange-light: #fffbe8; |
|||
@green: #07c160; |
|||
|
|||
// Gradient Colors |
|||
@gradient-red: linear-gradient(to right, #ff6034, #ee0a24); |
|||
@gradient-orange: linear-gradient(to right, #ffd01e, #ff8917); |
|||
|
|||
// Component Colors |
|||
@text-color: @gray-8; |
|||
@active-color: @gray-2; |
|||
@active-opacity: 0.7; |
|||
@disabled-opacity: 0.5; |
|||
@background-color: @gray-1; |
|||
@background-color-light: #fafafa; |
|||
@text-link-color: #576b95; |
|||
|
|||
// Padding |
|||
@padding-base: 4px; |
|||
@padding-xs: @padding-base * 2; |
|||
@padding-sm: @padding-base * 3; |
|||
@padding-md: @padding-base * 4; |
|||
@padding-lg: @padding-base * 6; |
|||
@padding-xl: @padding-base * 8; |
|||
|
|||
// Font |
|||
@font-size-xs: 10px; |
|||
@font-size-sm: 12px; |
|||
@font-size-md: 14px; |
|||
@font-size-lg: 16px; |
|||
@font-weight-bold: 500; |
|||
@line-height-xs: 14px; |
|||
@line-height-sm: 18px; |
|||
@line-height-md: 20px; |
|||
@line-height-lg: 22px; |
|||
@base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', |
|||
Helvetica, Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB', |
|||
'Microsoft Yahei', sans-serif; |
|||
@price-integer-font-family: Avenir-Heavy, PingFang SC, Helvetica Neue, Arial, |
|||
sans-serif; |
|||
|
|||
// Animation |
|||
@animation-duration-base: 0.3s; |
|||
@animation-duration-fast: 0.2s; |
|||
|
|||
// Border |
|||
@border-color: @gray-3; |
|||
@border-width-base: 1px; |
|||
@border-radius-sm: 2px; |
|||
@border-radius-md: 4px; |
|||
@border-radius-lg: 8px; |
|||
@border-radius-max: 999px; |
|||
|
|||
//ActionSheet |
|||
@action-sheet-max-height: 90%; |
|||
@action-sheet-header-height: 48px; |
|||
@action-sheet-header-font-size: @font-size-lg; |
|||
@action-sheet-description-color: @gray-6; |
|||
@action-sheet-description-font-size: @font-size-md; |
|||
@action-sheet-description-line-height: 20px; |
|||
@action-sheet-item-background: @white; |
|||
@action-sheet-item-font-size: @font-size-lg; |
|||
@action-sheet-item-line-height: 22px; |
|||
@action-sheet-item-text-color: @text-color; |
|||
@action-sheet-item-disabled-text-color: @gray-5; |
|||
@action-sheet-subname-color: @gray-6; |
|||
@action-sheet-subname-font-size: @font-size-sm; |
|||
@action-sheet-subname-line-height: 20px; |
|||
@action-sheet-close-icon-size: 22px; |
|||
@action-sheet-close-icon-color: @gray-5; |
|||
@action-sheet-close-icon-padding: 0 @padding-md; |
|||
@action-sheet-cancel-text-color: @gray-7; |
|||
@action-sheet-cancel-padding-top: @padding-xs; |
|||
@action-sheet-cancel-padding-color: @background-color; |
|||
|
|||
// Button |
|||
@button-mini-height: 22px; |
|||
@button-mini-min-width: 50px; |
|||
@button-mini-font-size: @font-size-xs; |
|||
@button-small-height: 30px; |
|||
@button-small-font-size: @font-size-sm; |
|||
@button-small-min-width: 60px; |
|||
@button-normal-font-size: @font-size-md; |
|||
@button-large-height: 50px; |
|||
@button-default-color: @text-color; |
|||
@button-default-height: 44px; |
|||
@button-default-font-size: @font-size-lg; |
|||
@button-default-background-color: @white; |
|||
@button-default-border-color: @border-color; |
|||
@button-primary-color: @white; |
|||
@button-primary-background-color: @blue; |
|||
@button-primary-border-color: @blue; |
|||
@button-info-color: @white; |
|||
@button-info-background-color: @blue; |
|||
@button-info-border-color: @blue; |
|||
@button-danger-color: @white; |
|||
@button-danger-background-color: @red; |
|||
@button-danger-border-color: @red; |
|||
@button-warning-color: @white; |
|||
@button-warning-background-color: @orange; |
|||
@button-warning-border-color: @orange; |
|||
@button-line-height: 20px; |
|||
@button-border-width: 1px; |
|||
@button-border-radius: @border-radius-sm; |
|||
@button-round-border-radius: @border-radius-max; |
|||
@button-plain-background-color: @white; |
|||
@button-disabled-opacity: @disabled-opacity; |
|||
|
|||
// Calendar |
|||
@calendar-height: 100%; |
|||
@calendar-background-color: @white; |
|||
@calendar-popup-height: 90%; |
|||
@calendar-header-box-shadow: 0 2px 10px rgba(125, 126, 128, 0.16); |
|||
@calendar-header-title-height: 44px; |
|||
@calendar-header-title-font-size: @font-size-lg; |
|||
@calendar-header-subtitle-font-size: @font-size-md; |
|||
@calendar-weekdays-height: 30px; |
|||
@calendar-weekdays-font-size: @font-size-sm; |
|||
@calendar-month-title-font-size: @font-size-md; |
|||
@calendar-month-mark-color: fade(@gray-2, 80%); |
|||
@calendar-month-mark-font-size: 160px; |
|||
@calendar-day-height: 64px; |
|||
@calendar-day-font-size: @font-size-lg; |
|||
@calendar-range-edge-color: @white; |
|||
@calendar-range-edge-background-color: @red; |
|||
@calendar-range-middle-color: @red; |
|||
@calendar-range-middle-background-opacity: 0.1; |
|||
@calendar-selected-day-size: 54px; |
|||
@calendar-selected-day-color: @white; |
|||
@calendar-info-font-size: @font-size-xs; |
|||
@calendar-info-line-height: 14px; |
|||
@calendar-selected-day-background-color: @red; |
|||
@calendar-day-disabled-color: @gray-5; |
|||
@calendar-confirm-button-height: 36px; |
|||
@calendar-confirm-button-margin: 7px 0; |
|||
@calendar-confirm-button-line-height: 34px; |
|||
|
|||
// Card |
|||
@card-padding: @padding-xs @padding-md; |
|||
@card-font-size: @font-size-sm; |
|||
@card-text-color: @text-color; |
|||
@card-background-color: @background-color-light; |
|||
@card-thumb-size: 88px; |
|||
@card-title-line-height: 16px; |
|||
@card-desc-color: @gray-7; |
|||
@card-desc-line-height: 20px; |
|||
@card-price-color: @red; |
|||
@card-origin-price-color: @gray-7; |
|||
@card-origin-price-font-size: @font-size-xs; |
|||
@card-price-font-size: @font-size-sm; |
|||
@card-price-integer-font-size: @font-size-lg; |
|||
@card-price-font-family: @price-integer-font-family; |
|||
|
|||
// Cell |
|||
@cell-font-size: @font-size-md; |
|||
@cell-line-height: 24px; |
|||
@cell-vertical-padding: 10px; |
|||
@cell-horizontal-padding: @padding-md; |
|||
@cell-text-color: @text-color; |
|||
@cell-background-color: @white; |
|||
@cell-border-color: @border-color; |
|||
@cell-active-color: @active-color; |
|||
@cell-required-color: @red; |
|||
@cell-label-color: @gray-6; |
|||
@cell-label-font-size: @font-size-sm; |
|||
@cell-label-line-height: 18px; |
|||
@cell-label-margin-top: 3px; |
|||
@cell-value-color: @gray-6; |
|||
@cell-icon-size: 16px; |
|||
@cell-right-icon-color: @gray-6; |
|||
@cell-large-vertical-padding: @padding-sm; |
|||
@cell-large-title-font-size: @font-size-lg; |
|||
@cell-large-value-font-size: @font-size-lg; |
|||
@cell-large-label-font-size: @font-size-md; |
|||
|
|||
// CellGroup |
|||
@cell-group-background-color: @white; |
|||
@cell-group-title-color: @gray-6; |
|||
@cell-group-title-padding: @padding-md @padding-md @padding-xs; |
|||
@cell-group-title-font-size: @font-size-md; |
|||
@cell-group-title-line-height: 16px; |
|||
@cell-group-inset-padding: 0 @padding-md; |
|||
@cell-group-inset-border-radius: @border-radius-lg; |
|||
@cell-group-inset-title-padding: @padding-md @padding-md @padding-xs @padding-xl; |
|||
|
|||
// Checkbox |
|||
@checkbox-size: 20px; |
|||
@checkbox-border-color: @gray-5; |
|||
@checkbox-transition-duration: 0.2s; |
|||
@checkbox-label-margin: 10px; |
|||
@checkbox-label-color: @text-color; |
|||
@checkbox-checked-icon-color: @blue; |
|||
@checkbox-disabled-icon-color: @gray-5; |
|||
@checkbox-disabled-label-color: @gray-5; |
|||
@checkbox-disabled-background-color: @border-color; |
|||
|
|||
// Circle |
|||
@circle-text-color: @text-color; |
|||
|
|||
// Collapse |
|||
@collapse-item-transition-duration: 0.3s; |
|||
@collapse-item-content-padding: 15px; |
|||
@collapse-item-content-font-size: 13px; |
|||
@collapse-item-content-line-height: 1.5; |
|||
@collapse-item-content-text-color: @gray-6; |
|||
@collapse-item-content-background-color: @white; |
|||
@collapse-item-title-disabled-color: @gray-5; |
|||
|
|||
// CountDown |
|||
@count-down-text-color: @text-color; |
|||
@count-down-font-size: @font-size-md; |
|||
@count-down-line-height: 20px; |
|||
|
|||
// Dialog |
|||
@dialog-width: 320px; |
|||
@dialog-small-screen-width: 90%; |
|||
@dialog-font-size: @font-size-lg; |
|||
@dialog-border-radius: 16px; |
|||
@dialog-background-color: @white; |
|||
@dialog-header-font-weight: @font-weight-bold; |
|||
@dialog-header-line-height: 24px; |
|||
@dialog-header-padding-top: @padding-lg; |
|||
@dialog-header-isolated-padding: @padding-lg 0; |
|||
@dialog-message-padding: @padding-lg; |
|||
@dialog-message-font-size: @font-size-md; |
|||
@dialog-message-line-height: 20px; |
|||
@dialog-message-max-height: 60vh; |
|||
@dialog-has-title-message-text-color: @gray-7; |
|||
@dialog-has-title-message-padding-top: @padding-xs; |
|||
|
|||
// Field |
|||
@field-label-color: @gray-7; |
|||
@field-input-text-color: @text-color; |
|||
@field-input-error-text-color: @red; |
|||
@field-input-disabled-text-color: @gray-5; |
|||
@field-placeholder-text-color: @gray-5; |
|||
@field-icon-size: 16px; |
|||
@field-clear-icon-size: 16px; |
|||
@field-clear-icon-color: @gray-5; |
|||
@field-icon-container-color: @gray-6; |
|||
@field-error-message-color: @red; |
|||
@field-error-message-text-font-size: @font-size-sm; |
|||
@field-text-area-min-height: 18px; |
|||
@field-word-limit-color: @gray-7; |
|||
@field-word-limit-font-size: @font-size-sm; |
|||
@field-word-limit-line-height: 16px; |
|||
@field-word-num-full-color: @red; |
|||
@field-disabled-text-color: @gray-5; |
|||
|
|||
// GoodsAction |
|||
@goods-action-background-color: @white; |
|||
@goods-action-height: 50px; |
|||
@goods-action-icon-width: 48px; |
|||
@goods-action-icon-height: @goods-action-height; |
|||
@goods-action-icon-color: @text-color; |
|||
@goods-action-icon-size: 18px; |
|||
@goods-action-icon-font-size: @font-size-xs; |
|||
@goods-action-icon-text-color: @gray-7; |
|||
@goods-action-button-height: 40px; |
|||
@goods-action-button-line-height: @button-line-height; |
|||
@goods-action-button-border-radius: @border-radius-max; |
|||
@goods-action-button-warning-color: @gradient-orange; |
|||
@goods-action-button-danger-color: @gradient-red; |
|||
@goods-action-button-plain-color: @white; |
|||
|
|||
// Image |
|||
@image-placeholder-text-color: @gray-6; |
|||
@image-placeholder-font-size: @font-size-md; |
|||
@image-placeholder-background-color: @background-color; |
|||
@image-loading-icon-size: 32px; |
|||
@image-loading-icon-color: @gray-4; |
|||
@image-error-icon-size: 32px; |
|||
@image-error-icon-color: @gray-4; |
|||
|
|||
// Info |
|||
@info-size: 16px; |
|||
@info-color: @white; |
|||
@info-padding: 0 3px; |
|||
@info-font-size: 12px; |
|||
@info-font-weight: 500; |
|||
@info-border-width: 1px; |
|||
@info-background-color: @red; |
|||
@info-dot-color: @red; |
|||
@info-dot-size: 8px; |
|||
@info-font-family: -apple-system-font, Helvetica Neue, Arial, sans-serif; |
|||
|
|||
// Loading |
|||
@loading-text-color: @gray-6; |
|||
@loading-text-font-size: @font-size-md; |
|||
@loading-text-line-height: 20px; |
|||
@loading-spinner-color: @gray-5; |
|||
@loading-spinner-size: 30px; |
|||
@loading-spinner-animation-duration: 0.8s; |
|||
|
|||
// NavBar |
|||
@nav-bar-height: 46px; |
|||
@nav-bar-background-color: @white; |
|||
@nav-bar-arrow-size: 16px; |
|||
@nav-bar-icon-color: @blue; |
|||
@nav-bar-text-color: @blue; |
|||
@nav-bar-title-font-size: @font-size-lg; |
|||
@nav-bar-title-text-color: @text-color; |
|||
|
|||
// NoticeBar |
|||
@notice-bar-height: 40px; |
|||
@notice-bar-padding: 0 @padding-md; |
|||
@notice-bar-wrapable-padding: @padding-xs @padding-md; |
|||
@notice-bar-font-size: @font-size-md; |
|||
@notice-bar-text-color: @orange-dark; |
|||
@notice-bar-line-height: 24px; |
|||
@notice-bar-background-color: @orange-light; |
|||
@notice-bar-icon-size: 16px; |
|||
@notice-bar-icon-min-width: 22px; |
|||
|
|||
// Notify |
|||
@notify-padding: 6px 15px; |
|||
@notify-font-size: 14px; |
|||
@notify-line-height: 20px; |
|||
@notify-primary-background-color: @blue; |
|||
@notify-success-background-color: @blue; |
|||
@notify-danger-background-color: @red; |
|||
@notify-warning-background-color: @orange; |
|||
|
|||
// Overlay |
|||
@overlay-background-color: rgba(0, 0, 0, 0.7); |
|||
|
|||
// Panel |
|||
@panel-background-color: @white; |
|||
@panel-header-value-color: @red; |
|||
@panel-footer-padding: @padding-xs @padding-md; |
|||
|
|||
// Picker |
|||
@picker-background-color: @white; |
|||
@picker-toolbar-height: 44px; |
|||
@picker-title-font-size: @font-size-lg; |
|||
@picker-action-padding: 0 @padding-md; |
|||
@picker-action-font-size: @font-size-md; |
|||
@picker-confirm-action-color: @text-link-color; |
|||
@picker-cancel-action-color: @gray-6; |
|||
@picker-option-font-size: @font-size-lg; |
|||
@picker-option-text-color: @black; |
|||
@picker-loading-icon-color: @blue; |
|||
@picker-loading-mask-color: rgba(255, 255, 255, 0.9); |
|||
@picker-option-disabled-opacity: 0.3; |
|||
@picker-option-selected-text-color: @text-color; |
|||
|
|||
// Popup |
|||
@popup-background-color: @white; |
|||
@popup-round-border-radius: 16px; |
|||
@popup-close-icon-size: 18px; |
|||
@popup-close-icon-color: @gray-6; |
|||
@popup-close-icon-margin: 16px; |
|||
@popup-close-icon-z-index: 1; |
|||
|
|||
// Progress |
|||
@progress-height: 4px; |
|||
@progress-background-color: @gray-3; |
|||
@progress-pivot-padding: 0 5px; |
|||
@progress-color: @blue; |
|||
@progress-pivot-font-size: @font-size-xs; |
|||
@progress-pivot-line-height: 1.6; |
|||
@progress-pivot-background-color: @blue; |
|||
@progress-pivot-text-color: @white; |
|||
|
|||
// Radio |
|||
@radio-size: 20px; |
|||
@radio-border-color: @gray-5; |
|||
@radio-transition-duration: 0.2s; |
|||
@radio-label-margin: 10px; |
|||
@radio-label-color: @text-color; |
|||
@radio-checked-icon-color: @blue; |
|||
@radio-disabled-icon-color: @gray-5; |
|||
@radio-disabled-label-color: @gray-5; |
|||
@radio-disabled-background-color: @border-color; |
|||
|
|||
// Rate |
|||
@rate-horizontal-padding: 2px; |
|||
@rate-icon-size: 20px; |
|||
@rate-icon-void-color: @gray-5; |
|||
@rate-icon-full-color: @red; |
|||
@rate-icon-disabled-color: @gray-5; |
|||
@rate-icon-gutter: @padding-base; |
|||
|
|||
// Switch |
|||
@switch-width: 2em; |
|||
@switch-height: 1em; |
|||
@switch-node-size: 1em; |
|||
@switch-node-z-index: 1; |
|||
@switch-node-background-color: @white; |
|||
@switch-node-box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), |
|||
0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05); |
|||
@switch-background-color: @white; |
|||
@switch-on-background-color: @blue; |
|||
@switch-transition-duration: 0.3s; |
|||
@switch-disabled-opacity: 0.4; |
|||
@switch-border: 1px solid rgba(0, 0, 0, 0.1); |
|||
|
|||
// ShareSheet |
|||
@share-sheet-header-padding: @padding-sm @padding-md @padding-base; |
|||
@share-sheet-title-color: @text-color; |
|||
@share-sheet-title-font-size: @font-size-md; |
|||
@share-sheet-title-line-height: @line-height-md; |
|||
@share-sheet-description-color: @gray-6; |
|||
@share-sheet-description-font-size: @font-size-sm; |
|||
@share-sheet-description-line-height: 16px; |
|||
@share-sheet-icon-size: 48px; |
|||
@share-sheet-option-name-color: @gray-7; |
|||
@share-sheet-option-name-font-size: @font-size-sm; |
|||
@share-sheet-option-description-color: @gray-5; |
|||
@share-sheet-option-description-font-size: @font-size-sm; |
|||
@share-sheet-cancel-button-font-size: @font-size-lg; |
|||
@share-sheet-cancel-button-height: 48px; |
|||
@share-sheet-cancel-button-background: @white; |
|||
|
|||
// Search |
|||
@search-background-color: @gray-1; |
|||
@search-padding: 10px @padding-sm; |
|||
@search-input-height: 34px; |
|||
@search-label-padding: 0 5px; |
|||
@search-label-color: @text-color; |
|||
@search-label-font-size: @font-size-md; |
|||
@search-left-icon-color: @gray-6; |
|||
@search-action-padding: 0 @padding-xs; |
|||
@search-action-text-color: @text-color; |
|||
@search-action-font-size: @font-size-md; |
|||
|
|||
// Sidebar |
|||
@sidebar-width: 80px; |
|||
|
|||
// SidebarItem |
|||
@sidebar-font-size: @font-size-md; |
|||
@sidebar-line-height: 20px; |
|||
@sidebar-text-color: @text-color; |
|||
@sidebar-disabled-text-color: @gray-5; |
|||
@sidebar-padding: 20px @padding-sm 20px @padding-xs; |
|||
@sidebar-active-color: @active-color; |
|||
@sidebar-background-color: @background-color; |
|||
@sidebar-selected-font-weight: @font-weight-bold; |
|||
@sidebar-selected-text-color: @text-color; |
|||
@sidebar-selected-border-color: @red; |
|||
@sidebar-selected-background-color: @white; |
|||
|
|||
// Slider |
|||
@slider-active-background-color: @blue; |
|||
@slider-inactive-background-color: @gray-3; |
|||
@slider-disabled-opacity: @disabled-opacity; |
|||
@slider-bar-height: 2px; |
|||
@slider-button-width: 24px; |
|||
@slider-button-height: 24px; |
|||
@slider-button-border-radius: 50%; |
|||
@slider-button-background-color: @white; |
|||
@slider-button-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); |
|||
|
|||
// Step |
|||
@step-text-color: @gray-6; |
|||
@step-process-text-color: @text-color; |
|||
@step-font-size: @font-size-md; |
|||
@step-line-color: @border-color; |
|||
@step-finish-line-color: @blue; |
|||
@step-finish-text-color: @text-color; |
|||
@step-icon-size: 12px; |
|||
@step-circle-size: 5px; |
|||
@step-circle-color: @gray-6; |
|||
@step-horizontal-title-font-size: @font-size-sm; |
|||
|
|||
// Steps |
|||
@steps-background-color: @white; |
|||
|
|||
// Stepper |
|||
@stepper-active-color: #e8e8e8; |
|||
@stepper-background-color: @active-color; |
|||
@stepper-button-icon-color: @text-color; |
|||
@stepper-button-disabled-color: @background-color; |
|||
@stepper-button-disabled-icon-color: @gray-5; |
|||
@stepper-button-round-theme-color: @red; |
|||
@stepper-input-width: 32px; |
|||
@stepper-input-height: 28px; |
|||
@stepper-input-font-size: @font-size-md; |
|||
@stepper-input-line-height: normal; |
|||
@stepper-input-text-color: @text-color; |
|||
@stepper-input-disabled-text-color: @gray-5; |
|||
@stepper-input-disabled-background-color: @active-color; |
|||
@stepper-border-radius: @border-radius-md; |
|||
|
|||
// SubmitBar |
|||
@submit-bar-height: 50px; |
|||
@submit-bar-z-index: 100; |
|||
@submit-bar-background-color: @white; |
|||
@submit-bar-button-width: 110px; |
|||
@submit-bar-price-color: @red; |
|||
@submit-bar-price-font-size: @font-size-sm; |
|||
@submit-bar-currency-font-size: @font-size-sm; |
|||
@submit-bar-text-color: @text-color; |
|||
@submit-bar-text-font-size: 14px; |
|||
@submit-bar-tip-padding: 10px; |
|||
@submit-bar-tip-font-size: 12px; |
|||
@submit-bar-tip-line-height: 1.5; |
|||
@submit-bar-tip-color: #f56723; |
|||
@submit-bar-tip-background-color: #fff7cc; |
|||
@submit-bar-tip-icon-size: 12px; |
|||
@submit-bar-button-height: 40px; |
|||
@submit-bar-padding: 0 @padding-md; |
|||
@submit-bar-price-integer-font-size: 20px; |
|||
@submit-bar-price-font-family: @price-integer-font-family; |
|||
|
|||
// Tabbar |
|||
@tabbar-height: 50px; |
|||
@tabbar-background-color: @white; |
|||
|
|||
// TabbarItem |
|||
@tabbar-item-font-size: @font-size-sm; |
|||
@tabbar-item-text-color: @gray-7; |
|||
@tabbar-item-active-color: @blue; |
|||
@tabbar-item-line-height: 1; |
|||
@tabbar-item-icon-size: 22px; |
|||
@tabbar-item-margin-bottom: 4px; |
|||
|
|||
// Tab |
|||
@tab-text-color: @gray-7; |
|||
@tab-active-text-color: @text-color; |
|||
@tab-disabled-text-color: @gray-5; |
|||
@tab-font-size: @font-size-md; |
|||
|
|||
// Tabs |
|||
@tabs-default-color: @red; |
|||
@tabs-line-height: 44px; |
|||
@tabs-card-height: 30px; |
|||
@tabs-nav-background-color: @white; |
|||
@tabs-bottom-bar-height: 3px; |
|||
@tabs-bottom-bar-color: @tabs-default-color; |
|||
|
|||
// Tag |
|||
@tag-padding: 0 @padding-base; |
|||
@tag-text-color: @white; |
|||
@tag-font-size: @font-size-sm; |
|||
@tag-border-radius: 2px; |
|||
@tag-line-height: 16px; |
|||
@tag-medium-padding: 2px 6px; |
|||
@tag-large-padding: @padding-base @padding-xs; |
|||
@tag-large-border-radius: @border-radius-md; |
|||
@tag-large-font-size: @font-size-md; |
|||
@tag-round-border-radius: @border-radius-max; |
|||
@tag-danger-color: @red; |
|||
@tag-primary-color: @blue; |
|||
@tag-success-color: @blue; |
|||
@tag-warning-color: @orange; |
|||
@tag-default-color: @gray-6; |
|||
@tag-plain-background-color: @white; |
|||
|
|||
// Toast |
|||
@toast-max-width: 70%; |
|||
@toast-font-size: 14px; |
|||
@toast-text-color: @white; |
|||
@toast-line-height: 20px; |
|||
@toast-border-radius: @border-radius-lg; |
|||
@toast-background-color: fade(@black, 70%); |
|||
@toast-icon-size: 36px; |
|||
@toast-text-min-width: 96px; |
|||
@toast-text-padding: @padding-xs @padding-sm; |
|||
@toast-default-padding: @padding-md; |
|||
@toast-default-width: 88px; |
|||
@toast-default-min-height: 88px; |
|||
|
|||
// GridItem |
|||
@grid-item-content-padding: @padding-md @padding-xs; |
|||
@grid-item-content-background-color: @white; |
|||
@grid-item-content-active-color: @active-color; |
|||
@grid-item-icon-size: 26px; |
|||
@grid-item-text-color: @gray-7; |
|||
@grid-item-text-font-size: @font-size-sm; |
|||
|
|||
// Divider |
|||
@divider-margin: @padding-md 0; |
|||
@divider-text-color: @gray-6; |
|||
@divider-font-size: @font-size-md; |
|||
@divider-line-height: 24px; |
|||
@divider-border-color: @border-color; |
|||
@divider-content-padding: @padding-md; |
|||
@divider-content-left-width: 10%; |
|||
@divider-content-right-width: 10%; |
|||
|
|||
// Empty |
|||
@empty-padding: @padding-xl 0; |
|||
@empty-image-size: 160px; |
|||
@empty-description-margin-top: @padding-md; |
|||
@empty-description-padding: 0 60px; |
|||
@empty-description-color: @gray-6; |
|||
@empty-description-font-size: 14px; |
|||
@empty-description-line-height: 20px; |
|||
@empty-bottom-margin-top: 24px; |
|||
|
|||
// TreeSelect |
|||
@tree-select-font-size: @font-size-md; |
|||
@tree-select-nav-background-color: @background-color; |
|||
@tree-select-content-background-color: @white; |
|||
@tree-select-nav-item-padding: @padding-sm @padding-xs @padding-sm @padding-sm; |
|||
@tree-select-item-height: 44px; |
|||
@tree-select-item-active-color: @red; |
|||
@tree-select-item-disabled-color: @gray-5; |
|||
|
|||
// Uploader |
|||
@uploader-size: 80px; |
|||
@uploader-icon-size: 24px; |
|||
@uploader-icon-color: @gray-4; |
|||
@uploader-text-color: @gray-6; |
|||
@uploader-text-font-size: @font-size-sm; |
|||
@uploader-upload-background-color: @gray-1; |
|||
@uploader-upload-active-color: @active-color; |
|||
@uploader-delete-color: @white; |
|||
@uploader-delete-icon-size: 14px; |
|||
@uploader-delete-background-color: rgba(0, 0, 0, 0.7); |
|||
@uploader-file-background-color: @background-color; |
|||
@uploader-file-icon-size: 20px; |
|||
@uploader-file-icon-color: @gray-7; |
|||
@uploader-file-name-padding: 0 @padding-base; |
|||
@uploader-file-name-margin-top: @padding-xs; |
|||
@uploader-file-name-font-size: @font-size-sm; |
|||
@uploader-file-name-text-color: @gray-7; |
|||
@uploader-mask-background-color: fade(@gray-8, 88%); |
|||
@uploader-mask-icon-size: 22px; |
|||
@uploader-mask-message-font-size: @font-size-sm; |
|||
@uploader-mask-message-line-height: 14px; |
|||
@uploader-loading-icon-size: 22px; |
|||
@uploader-loading-icon-color: @white; |
|||
@uploader-disabled-opacity: @disabled-opacity; |
|||
|
|||
// DropdownMenu |
|||
@dropdown-menu-height: 50px; |
|||
@dropdown-menu-background-color: @white; |
|||
@dropdown-menu-title-font-size: 15px; |
|||
@dropdown-menu-title-text-color: @text-color; |
|||
@dropdown-menu-title-active-text-color: @red; |
|||
@dropdown-menu-title-disabled-text-color: @gray-6; |
|||
@dropdown-menu-title-padding: 0 @padding-lg 0 @padding-xs; |
|||
@dropdown-menu-title-line-height: 18px; |
|||
@dropdown-menu-option-active-color: @red; |
|||
@dropdown-menu-box-shadow: 0 2px 12px fade(@gray-7, 12); |
|||
|
|||
// IndexAnchor |
|||
@index-anchor-padding: 0 @padding-md; |
|||
@index-anchor-text-color: @text-color; |
|||
@index-anchor-font-weight: 500; |
|||
@index-anchor-font-size: @font-size-md; |
|||
@index-anchor-line-height: 32px; |
|||
@index-anchor-background-color: transparent; |
|||
@index-anchor-active-background-color: @white; |
|||
@index-anchor-active-text-color: @blue; |
|||
|
|||
// IndexBar |
|||
@index-bar-index-font-size: @font-size-xs; |
|||
@index-bar-index-line-height: 14px; |
|||
|
|||
// skeleton |
|||
@skeleton-padding: 0 @padding-md; |
|||
@skeleton-row-height: 16px; |
|||
@skeleton-row-background-color: @gray-2; |
|||
@skeleton-row-margin-top: @padding-sm; |
|||
@skeleton-avatar-background-color: @gray-2; |
|||
@skeleton-animation-duration: 1.2s; |
|||
|
|||
// Cascader |
|||
@cascader-header-height: 48px; |
|||
@cascader-header-padding: 0 16px; |
|||
@cascader-title-font-size: 16px; |
|||
@cascader-title-line-height: 20px; |
|||
@cascader-close-icon-size: 22px; |
|||
@cascader-close-icon-color: #c8c9cc; |
|||
@cascader-selected-icon-size: 18px; |
|||
@cascader-tabs-height: 48px; |
|||
@cascader-active-color: @blue; |
|||
@cascader-options-height: 384px; |
|||
@cascader-option-disabled-color: #c8c9cc; |
|||
@cascader-tab-color: #323233; |
|||
@cascader-unselected-tab-color: #969799; |
@ -0,0 +1,3 @@ |
|||
// variables |
|||
$background-color: #f8f8f8; |
|||
$theme-color: #07b0b8; |
After Width: | Height: | Size: 6.7 KiB |
@ -0,0 +1,54 @@ |
|||
<template> |
|||
<div> |
|||
<van-tabbar fixed route v-model="active" @change="handleChange"> |
|||
<van-tabbar-item v-for="(item, index) in data" :to="item.to" :icon="item.icon" :key="index"> |
|||
{{ item.title }} |
|||
</van-tabbar-item> |
|||
</van-tabbar> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'TabBar', |
|||
props: { |
|||
defaultActive: { |
|||
type: Number, |
|||
default: 0 |
|||
}, |
|||
data: { |
|||
type: Array, |
|||
default: () => { |
|||
return [] |
|||
} |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
active: this.defaultActive |
|||
} |
|||
}, |
|||
methods: { |
|||
handleChange(value) { |
|||
this.$emit('change', value) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<!-- Add "scoped" attribute to limit CSS to this component only --> |
|||
<style scoped> |
|||
h3 { |
|||
margin: 40px 0 0; |
|||
} |
|||
ul { |
|||
list-style-type: none; |
|||
padding: 0; |
|||
} |
|||
li { |
|||
display: inline-block; |
|||
margin: 0 10px; |
|||
} |
|||
a { |
|||
color: #42b983; |
|||
} |
|||
</style> |
@ -0,0 +1,9 @@ |
|||
// 本地环境配置
|
|||
module.exports = { |
|||
env: 'development', |
|||
title: 'e联社区', |
|||
baseUrl: 'http://192.168.1.144/', // 项目地址
|
|||
baseApi: 'http://192.168.1.144/api', // 本地api请求地址,注意:如果你使用了代理,请设置成'/'
|
|||
APPID: 'xxx', |
|||
APPSECRET: 'xxx', |
|||
} |
@ -0,0 +1,8 @@ |
|||
// 正式
|
|||
module.exports = { |
|||
env: 'production', |
|||
title: 'e联社区', |
|||
baseUrl: 'https://epmet-preview.elinkservice.cn/', // 正式项目地址
|
|||
baseApi: 'https://epmet-preview.elinkservice.cn/api', // 正式api请求地址
|
|||
APPSECRET: 'xxx', |
|||
} |
@ -0,0 +1,8 @@ |
|||
module.exports = { |
|||
env: 'staging', |
|||
title: 'e联社区', |
|||
baseUrl: 'https://test.xxx.com', // 测试项目地址
|
|||
baseApi: 'https://test.xxx.com/api', // 测试api请求地址
|
|||
APPID: 'xxx', |
|||
APPSECRET: 'xxx', |
|||
} |
@ -0,0 +1,3 @@ |
|||
// 根据环境引入不同配置 process.env.NODE_ENV
|
|||
const config = require('./env.' + process.env.VUE_APP_ENV) |
|||
module.exports = config |
@ -0,0 +1,37 @@ |
|||
/** |
|||
*格式化时间 |
|||
*yyyy-MM-dd hh:mm:ss |
|||
*/ |
|||
export function formatDate(time, fmt) { |
|||
if (time === undefined || '') { |
|||
return |
|||
} |
|||
const date = new Date(time) |
|||
if (/(y+)/.test(fmt)) { |
|||
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) |
|||
} |
|||
const o = { |
|||
'M+': date.getMonth() + 1, |
|||
'd+': date.getDate(), |
|||
'h+': date.getHours(), |
|||
'm+': date.getMinutes(), |
|||
's+': date.getSeconds() |
|||
} |
|||
for (const k in o) { |
|||
if (new RegExp(`(${k})`).test(fmt)) { |
|||
const str = o[k] + '' |
|||
fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? str : padLeftZero(str)) |
|||
} |
|||
} |
|||
return fmt |
|||
} |
|||
|
|||
function padLeftZero(str) { |
|||
return ('00' + str).substr(str.length) |
|||
} |
|||
/* |
|||
* 隐藏用户手机号中间四位 |
|||
*/ |
|||
export function hidePhone(phone) { |
|||
return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') |
|||
} |
@ -0,0 +1,7 @@ |
|||
import Vue from 'vue' |
|||
import * as filter from './filter' |
|||
|
|||
Object.keys(filter).forEach(k => Vue.filter(k, filter[k])) |
|||
|
|||
Vue.prototype.$formatDate = Vue.filter('formatDate') |
|||
Vue.prototype.$hidePhone = Vue.filter('hidePhone') |
@ -0,0 +1,39 @@ |
|||
import 'core-js/stable' |
|||
import 'regenerator-runtime/runtime' |
|||
|
|||
import Vue from 'vue' |
|||
import App from './App.vue' |
|||
import router from './router' |
|||
import store from './store' |
|||
|
|||
// 全局引入按需引入UI库 vant
|
|||
import '@/plugins/vant' |
|||
|
|||
// 引入全局样式
|
|||
import '@/assets/css/common.less' |
|||
import '@/assets/css/index.less' |
|||
// 移动端适配
|
|||
import 'amfe-flexible' |
|||
|
|||
Vue.config.productionTip = false |
|||
|
|||
// 日期格式化插件
|
|||
import dayjs from 'dayjs' |
|||
|
|||
Vue.prototype.$dayjs = dayjs |
|||
// 提示框封装
|
|||
// import { Tips } from '@/utils'
|
|||
|
|||
// Vue.prototype.$tips = Tips
|
|||
//开发环境使用,生产环境自动取消
|
|||
import Vconsole from 'vconsole' |
|||
|
|||
if (process.env.NODE_ENV !== 'production') { |
|||
new Vconsole() |
|||
} |
|||
new Vue({ |
|||
el: '#app', |
|||
router, |
|||
store, |
|||
render: h => h(App) |
|||
}) |
@ -0,0 +1,53 @@ |
|||
// 按需全局引入 @组件
|
|||
import Vue from 'vue' |
|||
import { |
|||
Button, |
|||
Field, |
|||
Cell, |
|||
Uploader, |
|||
Image, |
|||
Picker, |
|||
Popup, |
|||
Icon, |
|||
Toast, |
|||
Progress, |
|||
NavBar, |
|||
RadioGroup, |
|||
Radio, |
|||
Dialog, |
|||
Tabs, |
|||
Tab, |
|||
Tag, |
|||
Steps, |
|||
Step, |
|||
Divider, |
|||
List, |
|||
ActionSheet, |
|||
Checkbox, |
|||
CellGroup |
|||
} from 'vant' |
|||
|
|||
Vue.use(Button) |
|||
.use(Field) |
|||
.use(Cell) |
|||
.use(Uploader) |
|||
.use(Image) |
|||
.use(Picker) |
|||
.use(Popup) |
|||
.use(Icon) |
|||
.use(Toast) |
|||
.use(Progress) |
|||
.use(NavBar) |
|||
.use(RadioGroup) |
|||
.use(Radio) |
|||
.use(Dialog) |
|||
.use(Tabs) |
|||
.use(Tab) |
|||
.use(Tag) |
|||
.use(Steps) |
|||
.use(Step) |
|||
.use(Divider) |
|||
.use(List) |
|||
.use(ActionSheet) |
|||
.use(Checkbox) |
|||
.use(CellGroup) |
@ -0,0 +1,30 @@ |
|||
import Vue from 'vue' |
|||
import Router from 'vue-router' |
|||
import { constantRouterMap } from './router.config.js' |
|||
|
|||
// hack router push callback
|
|||
const originalPush = Router.prototype.push |
|||
Router.prototype.push = function push(location, onResolve, onReject) { |
|||
if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject) |
|||
return originalPush.call(this, location).catch(err => err) |
|||
} |
|||
|
|||
Vue.use(Router) |
|||
|
|||
const createRouter = () => |
|||
new Router({ |
|||
scrollBehavior: () => ({ y: 0 }), |
|||
routes: constantRouterMap |
|||
}) |
|||
|
|||
const router = createRouter() |
|||
|
|||
// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
|
|||
export function resetRouter() { |
|||
const newRouter = createRouter() |
|||
router.matcher = newRouter.matcher // reset router
|
|||
} |
|||
|
|||
|
|||
|
|||
export default router |
@ -0,0 +1,11 @@ |
|||
/** |
|||
* 基础路由 |
|||
* @type { *[] } |
|||
*/ |
|||
export const constantRouterMap = [ |
|||
{ |
|||
path: '/', |
|||
component: () => import('@/views/login'), |
|||
meta: { title: '登录', keepAlive: false } |
|||
} |
|||
] |
@ -0,0 +1,4 @@ |
|||
const getters = { |
|||
userName: state => state.app.userName |
|||
} |
|||
export default getters |
@ -0,0 +1,15 @@ |
|||
import Vue from 'vue' |
|||
import Vuex from 'vuex' |
|||
import getters from './getters' |
|||
import app from './modules/app' |
|||
|
|||
Vue.use(Vuex) |
|||
|
|||
const store = new Vuex.Store({ |
|||
modules: { |
|||
app |
|||
}, |
|||
getters |
|||
}) |
|||
|
|||
export default store |
@ -0,0 +1,19 @@ |
|||
const state = { |
|||
userName: '' |
|||
} |
|||
const mutations = { |
|||
SET_USER_NAME(state, name) { |
|||
state.userName = name |
|||
} |
|||
} |
|||
const actions = { |
|||
// 设置name
|
|||
setUserName({ commit }, name) { |
|||
commit('SET_USER_NAME', name) |
|||
} |
|||
} |
|||
export default { |
|||
state, |
|||
mutations, |
|||
actions |
|||
} |
@ -0,0 +1,110 @@ |
|||
/** |
|||
* Created by PanJiaChen on 16/11/18. |
|||
*/ |
|||
|
|||
/** |
|||
* Parse the time to string |
|||
* @param {(Object|string|number)} time |
|||
* @param {string} cFormat |
|||
* @returns {string} |
|||
*/ |
|||
export function parseTime(time, cFormat) { |
|||
if (arguments.length === 0) { |
|||
return null |
|||
} |
|||
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' |
|||
let date |
|||
if (typeof time === 'object') { |
|||
date = time |
|||
} else { |
|||
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { |
|||
time = parseInt(time) |
|||
} |
|||
if ((typeof time === 'number') && (time.toString().length === 10)) { |
|||
time = time * 1000 |
|||
} |
|||
date = new Date(time) |
|||
} |
|||
const formatObj = { |
|||
y: date.getFullYear(), |
|||
m: date.getMonth() + 1, |
|||
d: date.getDate(), |
|||
h: date.getHours(), |
|||
i: date.getMinutes(), |
|||
s: date.getSeconds(), |
|||
a: date.getDay() |
|||
} |
|||
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { |
|||
let value = formatObj[key] |
|||
// Note: getDay() returns 0 on Sunday
|
|||
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] } |
|||
if (result.length > 0 && value < 10) { |
|||
value = '0' + value |
|||
} |
|||
return value || 0 |
|||
}) |
|||
return time_str |
|||
} |
|||
|
|||
/** |
|||
* @param {number} time |
|||
* @param {string} option |
|||
* @returns {string} |
|||
*/ |
|||
export function formatTime(time, option) { |
|||
if (('' + time).length === 10) { |
|||
time = parseInt(time) * 1000 |
|||
} else { |
|||
time = +time |
|||
} |
|||
const d = new Date(time) |
|||
const now = Date.now() |
|||
|
|||
const diff = (now - d) / 1000 |
|||
|
|||
if (diff < 30) { |
|||
return '刚刚' |
|||
} else if (diff < 3600) { |
|||
// less 1 hour
|
|||
return Math.ceil(diff / 60) + '分钟前' |
|||
} else if (diff < 3600 * 24) { |
|||
return Math.ceil(diff / 3600) + '小时前' |
|||
} else if (diff < 3600 * 24 * 2) { |
|||
return '1天前' |
|||
} |
|||
if (option) { |
|||
return parseTime(time, option) |
|||
} else { |
|||
return ( |
|||
d.getMonth() + |
|||
1 + |
|||
'月' + |
|||
d.getDate() + |
|||
'日' + |
|||
d.getHours() + |
|||
'时' + |
|||
d.getMinutes() + |
|||
'分' |
|||
) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* @param {string} url |
|||
* @returns {Object} |
|||
*/ |
|||
export function param2Obj(url) { |
|||
const search = url.split('?')[1] |
|||
if (!search) { |
|||
return {} |
|||
} |
|||
return JSON.parse( |
|||
'{"' + |
|||
decodeURIComponent(search) |
|||
.replace(/"/g, '\\"') |
|||
.replace(/&/g, '","') |
|||
.replace(/=/g, '":"') |
|||
.replace(/\+/g, ' ') + |
|||
'"}' |
|||
) |
|||
} |
@ -0,0 +1,7 @@ |
|||
export const jsApiList = [ |
|||
'updateAppMessageShareData', |
|||
'updateTimelineShareData', |
|||
'getLocation', |
|||
'openLocation', |
|||
'chooseWXPay' |
|||
] |
@ -0,0 +1,58 @@ |
|||
import axios from 'axios' |
|||
import store from '@/store' |
|||
import { Toast } from 'vant' |
|||
// 根据环境不同引入不同api地址
|
|||
import { baseApi } from '@/config' |
|||
// create an axios instance
|
|||
const service = axios.create({ |
|||
baseURL: baseApi, // url = base api url + request url
|
|||
withCredentials: true, // send cookies when cross-domain requests
|
|||
timeout: 5000 // request timeout
|
|||
}) |
|||
|
|||
// request拦截器 request interceptor
|
|||
service.interceptors.request.use( |
|||
config => { |
|||
// 不传递默认开启loading
|
|||
if (!config.hideloading) { |
|||
// loading
|
|||
Toast.loading({ |
|||
forbidClick: true |
|||
}) |
|||
} |
|||
if (store.getters.token) { |
|||
config.headers['X-Token'] = '' |
|||
} |
|||
return config |
|||
}, |
|||
error => { |
|||
// do something with request error
|
|||
console.log(error) // for debug
|
|||
return Promise.reject(error) |
|||
} |
|||
) |
|||
// respone拦截器
|
|||
service.interceptors.response.use( |
|||
response => { |
|||
Toast.clear() |
|||
const res = response.data |
|||
if (res.status && res.status !== 200) { |
|||
// 登录超时,重新登录
|
|||
if (res.status === 401) { |
|||
store.dispatch('FedLogOut').then(() => { |
|||
location.reload() |
|||
}) |
|||
} |
|||
return Promise.reject(res || 'error') |
|||
} else { |
|||
return Promise.resolve(res) |
|||
} |
|||
}, |
|||
error => { |
|||
Toast.clear() |
|||
console.log('err' + error) // for debug
|
|||
return Promise.reject(error) |
|||
} |
|||
) |
|||
|
|||
export default service |
@ -0,0 +1,35 @@ |
|||
/** |
|||
* 封装操作localstorage本地存储的方法 |
|||
*/ |
|||
export const storage = { |
|||
//存储
|
|||
set(key, value) { |
|||
localStorage.setItem(key, JSON.stringify(value)) |
|||
}, |
|||
//取出数据
|
|||
get(key) { |
|||
return JSON.parse(localStorage.getItem(key)) |
|||
}, |
|||
// 删除数据
|
|||
remove(key) { |
|||
localStorage.removeItem(key) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 封装操作sessionStorage本地存储的方法 |
|||
*/ |
|||
export const sessionStorage = { |
|||
//存储
|
|||
set(key, value) { |
|||
window.sessionStorage.setItem(key, JSON.stringify(value)) |
|||
}, |
|||
//取出数据
|
|||
get(key) { |
|||
return JSON.parse(window.sessionStorage.getItem(key)) |
|||
}, |
|||
// 删除数据
|
|||
remove(key) { |
|||
window.sessionStorage.removeItem(key) |
|||
} |
|||
} |
@ -0,0 +1,20 @@ |
|||
/** |
|||
* Created by Sunnie on 19/06/04. |
|||
*/ |
|||
|
|||
/** |
|||
* @param {string} path |
|||
* @returns {Boolean} |
|||
*/ |
|||
export function isExternal(path) { |
|||
return /^(https?:|mailto:|tel:)/.test(path) |
|||
} |
|||
|
|||
/** |
|||
* @param {string} str |
|||
* @returns {Boolean} |
|||
*/ |
|||
export function validUsername(str) { |
|||
const valid_map = ['admin', 'editor'] |
|||
return valid_map.indexOf(str.trim()) >= 0 |
|||
} |
@ -0,0 +1,3 @@ |
|||
import Vconsole from 'vconsole' |
|||
const vConsole = new Vconsole() |
|||
export default vConsole |
@ -0,0 +1,12 @@ |
|||
import wx from 'weixin-js-sdk' |
|||
|
|||
const plugin = { |
|||
install(Vue) { |
|||
Vue.prototype.$wx = wx |
|||
Vue.wx = wx |
|||
}, |
|||
$wx: wx |
|||
} |
|||
|
|||
export default plugin |
|||
export const install = plugin.install |
@ -0,0 +1,46 @@ |
|||
<template> |
|||
<div class='login'> |
|||
<div class="card"> |
|||
<van-cell-group inset> |
|||
<van-field v-model="phone" label="手机号" type="tel" placeholder="请输入手机号" @blur="handelBlurPhone" /> |
|||
</van-cell-group> |
|||
<van-cell-group inset> |
|||
<van-field v-model="password" label="密码" type="password" placeholder="请输入密码" /> |
|||
</van-cell-group> |
|||
</div> |
|||
<van-button type="info" round block style="margin-top: 35px;">登录</van-button> |
|||
<div class="flex flex-end flex-center1 m-top12"> |
|||
<van-checkbox v-model="checked" shape="square">下次自动登录</van-checkbox> |
|||
<span>忘记密码?</span> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
data() { |
|||
return { |
|||
phone: null, |
|||
password: null, |
|||
checked:false |
|||
}; |
|||
}, |
|||
created() { }, |
|||
methods: { |
|||
handelBlurPhone() { |
|||
console.log(this.phone); |
|||
} |
|||
}, |
|||
components: {}, |
|||
computed: {}, |
|||
watch: {} |
|||
} |
|||
</script> |
|||
|
|||
<style lang='less' scoped> |
|||
.login{ |
|||
box-sizing: border-box; |
|||
width: calc(100% - 20px); |
|||
margin: 10px auto 0; |
|||
} |
|||
</style> |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 35 KiB |
@ -0,0 +1,171 @@ |
|||
const path = require('path') |
|||
const defaultSettings = require('./src/config/index.js') |
|||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin |
|||
const OUTPUT_FILE_NAME = process.env.outputDir |
|||
const FileManagerPlugin = require('filemanager-webpack-plugin') |
|||
const resolve = dir => path.join(__dirname, dir) |
|||
// page title
|
|||
const name = defaultSettings.title || 'vue mobile template' |
|||
// 生产环境,测试和正式
|
|||
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV) |
|||
|
|||
const { defineConfig } = require('@vue/cli-service') |
|||
module.exports = defineConfig({ |
|||
publicPath: process.env.NODE_ENV === 'development' ? '/' : '/epmet-work-h5', // 署应用包时的基本 URL。 vue-router hash 模式使用
|
|||
// publicPath: process.env.NODE_ENV === 'development' ? '/' : '/h5', //署应用包时的基本 URL。 vue-router history模式使用
|
|||
outputDir: `dist/${OUTPUT_FILE_NAME}`, // 生产环境构建文件的目录
|
|||
assetsDir: 'static', // outputDir的静态资源(js、css、img、fonts)目录
|
|||
lintOnSave: false, |
|||
productionSourceMap: false, // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
|
|||
devServer: { |
|||
// host: 'epmet-cloud.elinkservice.cn',
|
|||
port: 80, // 端口
|
|||
open: false, // 启动后打开浏览器
|
|||
client: { |
|||
overlay: { |
|||
// 当出现编译器错误或警告时,在浏览器中显示全屏覆盖层
|
|||
warnings: false, |
|||
errors: true |
|||
} |
|||
}, |
|||
proxy: { |
|||
//配置跨域
|
|||
'/api': { |
|||
// target: `http://219.146.91.110:30801`,
|
|||
target: `http://127.0.0.1:8080`, |
|||
changeOrigin: true, |
|||
ws: false, |
|||
pathRewrite: { |
|||
'^api': '' |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
css: { |
|||
extract: IS_PROD, |
|||
sourceMap: false, |
|||
loaderOptions: { |
|||
less: { |
|||
lessOptions: { |
|||
modifyVars: { |
|||
hack: `true; @import "assets/css/vant-theme.less";` |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
configureWebpack: config => { |
|||
config.name = name |
|||
config.plugins.push( |
|||
new FileManagerPlugin({ |
|||
events: { |
|||
onEnd: { |
|||
delete: [`./${OUTPUT_FILE_NAME}.zip`], |
|||
archive: [ |
|||
{ |
|||
source: `./dist/${OUTPUT_FILE_NAME}`, |
|||
destination: `./${OUTPUT_FILE_NAME}.zip` |
|||
} |
|||
] |
|||
} |
|||
} |
|||
}) |
|||
) |
|||
|
|||
// 为生产环境修改配置...
|
|||
// if (IS_PROD) {
|
|||
// // externals
|
|||
// config.externals = externals
|
|||
// }
|
|||
}, |
|||
|
|||
chainWebpack: config => { |
|||
config.plugins.delete('preload') // TODO: need test
|
|||
config.plugins.delete('prefetch') // TODO: need test
|
|||
|
|||
// set svg-sprite-loader
|
|||
config.module.rule('svg').exclude.add(resolve('src/assets/icons')).end() |
|||
config.module |
|||
.rule('icons') |
|||
.test(/\.svg$/) |
|||
.include.add(resolve('src/assets/icons')) |
|||
.end() |
|||
.use('svg-sprite-loader') |
|||
.loader('svg-sprite-loader') |
|||
.options({ |
|||
symbolId: 'icon-[name]' |
|||
}) |
|||
.end() |
|||
|
|||
// 别名 alias
|
|||
config.resolve.alias |
|||
.set('@', resolve('src')) |
|||
.set('assets', resolve('src/assets')) |
|||
.set('api', resolve('src/api')) |
|||
.set('views', resolve('src/views')) |
|||
.set('components', resolve('src/components')) |
|||
/** |
|||
* 设置保留空格 |
|||
*/ |
|||
config.module |
|||
.rule('vue') |
|||
.use('vue-loader') |
|||
.loader('vue-loader') |
|||
.tap(options => { |
|||
options.compilerOptions.preserveWhitespace = true |
|||
return options |
|||
}) |
|||
.end() |
|||
/** |
|||
* 打包分析 |
|||
*/ |
|||
if (IS_PROD) { |
|||
config.plugin('webpack-report').use(BundleAnalyzerPlugin, [ |
|||
{ |
|||
analyzerMode: 'static' |
|||
} |
|||
]) |
|||
} |
|||
config |
|||
// https://webpack.js.org/configuration/devtool/#development
|
|||
.when(!IS_PROD, config => config.devtool('cheap-source-map')) |
|||
|
|||
config.when(IS_PROD, config => { |
|||
config |
|||
.plugin('ScriptExtHtmlWebpackPlugin') |
|||
.after('html') |
|||
.use('script-ext-html-webpack-plugin', [ |
|||
{ |
|||
// 将 runtime 作为内联引入不单独存在
|
|||
inline: /runtime\..*\.js$/ |
|||
} |
|||
]) |
|||
.end() |
|||
config.optimization.splitChunks({ |
|||
chunks: 'all', |
|||
cacheGroups: { |
|||
// cacheGroups 下可以可以配置多个组,每个组根据test设置条件,符合test条件的模块
|
|||
commons: { |
|||
name: 'chunk-commons', |
|||
test: resolve('src/components'), |
|||
minChunks: 3, // 被至少用三次以上打包分离
|
|||
priority: 5, // 优先级
|
|||
reuseExistingChunk: true // 表示是否使用已有的 chunk,如果为 true 则表示如果当前的 chunk 包含的模块已经被抽取出去了,那么将不会重新生成新的。
|
|||
}, |
|||
node_vendors: { |
|||
name: 'chunk-libs', |
|||
chunks: 'initial', // 只打包初始时依赖的第三方
|
|||
test: /[\\/]node_modules[\\/]/, |
|||
priority: 10 |
|||
}, |
|||
vantUI: { |
|||
name: 'chunk-vantUI', // 单独将 vantUI 拆包
|
|||
priority: 20, // 数字大权重到,满足多个 cacheGroups 的条件时候分到权重高的
|
|||
test: /[\\/]node_modules[\\/]_?vant(.*)/ |
|||
} |
|||
} |
|||
}) |
|||
config.optimization.runtimeChunk('single') |
|||
}) |
|||
} |
|||
}) |
Loading…
Reference in new issue