vue commit

This commit is contained in:
zvv__666---vvz
2026-04-21 21:23:21 +08:00
commit 0fd6fbefd5
193 changed files with 65688 additions and 0 deletions

2
.browserslistrc Normal file
View File

@@ -0,0 +1,2 @@
> 1%
last 2 versions

35
.editorconfig Normal file
View File

@@ -0,0 +1,35 @@
# http://editorconfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
# Indentation override for js(x), ts(x) and vue files
[*.{js,jsx,ts,tsx,vue}]
indent_size = 2
indent_style = space
# Indentation override for css related files
[*.{css,styl,scss,less,sass}]
indent_size = 2
indent_style = space
# Indentation override for html files
[*.html]
indent_size = 2
indent_style = space
# Trailing space override for markdown file
[*.md]
trim_trailing_whitespace = false
# Indentation override for config files
[*.{json,yml}]
indent_size = 2
indent_style = space

23
.env.development Normal file
View File

@@ -0,0 +1,23 @@
# Base api
VUE_APP_BASE_API = '/api'
# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,
# to control whether the babel-plugin-dynamic-import-node plugin is enabled.
# It only does one thing by converting all import() to require().
# This configuration can significantly increase the speed of hot updates,
# when you have a large number of pages.
# Detail: https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js
NODE_ENV = 'development'
VUE_APP_NODE_ENV = 'dev'
//后端服务的地址
VUE_APP_URL = 'http://localhost:8080/admin'
VUE_APP_SOCKET_URL = 'ws://localhost:8080/ws/'
//VUE_APP_SOCKET_URL = 'ws://http://23ce4dbd.cpolar.cn/ws/'
VUE_CLI_BABEL_TRANSPILE_MODULES = true
# 删除权限 true/有
VUE_APP_DELETE_PERMISSIONS = true

12
.env.production Normal file
View File

@@ -0,0 +1,12 @@
# Base api
# Remeber to change this to your production server address
# Here I used my mock server for this project
# VUE_APP_BASE_API = 'https://vue-typescript-admin-mock-server.armour.now.sh/mock-api/v1/'
NODE_ENV = 'production'
VUE_APP_NODE_ENV = 'prod'
VUE_APP_BASE_API = '/api'
VUE_APP_URL=''
VUE_APP_SOCKET_URL = ''
# 删除权限 true/有
VUE_APP_DELETE_PERMISSIONS = false

10
.env.production.uat Normal file
View File

@@ -0,0 +1,10 @@
# Base api
# Remeber to change this to your production server address
# Here I used my mock server for this project
# VUE_APP_BASE_API = 'https://vue-typescript-admin-mock-server.armour.now.sh/mock-api/v1/'
NODE_ENV = 'production'
VUE_APP_NODE_ENV = 'prod:uat'
VUE_APP_BASE_API = '/api'
# 删除权限 true/有
VUE_APP_DELETE_PERMISSIONS = true

6
.env.staging Normal file
View File

@@ -0,0 +1,6 @@
# Set to production for building optimization
NODE_ENV = production
# Base api
# VUE_APP_BASE_API = '/stage-api'

3
.eslintignore Normal file
View File

@@ -0,0 +1,3 @@
dist/*.js
src/assets
tests/unit/coverage

60
.eslintrc.js Normal file
View File

@@ -0,0 +1,60 @@
module.exports = {
root: true,
env: {
browser: true,
node: true,
es6: true
},
'extends': [
'eslint:recommended',
'plugin:vue/recommended',
'@vue/standard',
'@vue/typescript'
],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'space-before-function-paren': 0,
'vue/array-bracket-spacing': 0,
'vue/arrow-spacing': 0,
'vue/block-spacing': 0,
'vue/brace-style': 'error',
'vue/camelcase': 'error',
'vue/comma-dangle': 'error',
'vue/component-name-in-template-casing': 'error',
'vue/eqeqeq': 'error',
'vue/key-spacing': 0,
'vue/match-component-file-name': 'error',
'vue/object-curly-spacing': 0,
'vue/max-attributes-per-line': 0,
'padded-blocks': 0,
'semi': 0,
'indent': 0,
'space-infix-ops': 0,
'space-before-blocks': 0,
'eqeqeq': 0,
'vue/eqeqeq': 0,
'object-curly-spacing': 0,
'keyword-spacing': 0,
'spaced-comment': 0,
'key-spacing': 0,
'comma-spacing': 0,
'comma-dangle': 0,
'space-in-parens': 0,
'standard/object-curly-even-spacing': 0,
},
parserOptions: {
parser: '@typescript-eslint/parser'
},
overrides: [
{
files: [
'**/__tests__/*.{j,t}s?(x)',
'**/tests/unit/**/*.spec.{j,t}s?(x)'
],
env: {
jest: true
}
}
]
}

26
.gitignore vendored Normal file
View File

@@ -0,0 +1,26 @@
.DS_Store
node_modules
/dist
/tests/e2e/videos/
/tests/e2e/screenshots/
/tests/**/coverage/
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
.history
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*

45
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,45 @@
####提示
#1.以下脚本设置的是master分支被合并时执行设置为平常用来发版本的分支即可
#2.版本自动化部署到nginx下
#3.执行yml脚本的runner名字设置的vue-runner1,即对应tags
stages: # Stages 表示构建阶段,这里有两个阶段 install, deploy
- install
- deploy
cache:
key: ${CI_BUILD_REF_NAME}
paths:
- node_modules/
install-staging:dep: # Jobs 表示构建工作,表示某个 Stage 里面执行的工作。
stage: install
tags:
- reggie-vue-runner #与注册runner时填写的tags保持一致
only: # 定义了只有在被merge到了master分支上 才会执行部署脚本。
- master
script:
- echo "=====start install======"
- npm install --registry=https://registry.npm.taobao.org #安装依赖
- echo "=====end install======"
artifacts: # 将这个job生成的依赖传递给下一个job。需要设置dependencies
expire_in: 60 mins # artifacets 的过期时间,因为这些数据都是直接保存在 Gitlab 机器上的,过于久远的资源就可以删除掉了
paths: # 需要被传递给下一个job的目录。
- node_modules/
deploy-staging:dep:
stage: deploy
tags:
- reggie-vue-runner
only:
- master
script:
- echo "=====start build======"
- npm run build:uat # 将项目打包 测试环境用npm run build:uat ---有删除权限 线上还是用npm run build ---没有删除权限
- echo "=====start deploy======"
- sudo cp -rf ./dist/ /usr/share/nginx/html/reggie
- echo "=====end deploy!!!!!!======"

5
.prettierrc.json Normal file
View File

@@ -0,0 +1,5 @@
{
"singleQuote": true,
"semi": false
}

6
Dockerfile Normal file
View File

@@ -0,0 +1,6 @@
FROM nginx
COPY ./dist /usr/share/nginx/html
RUN chmod -R 777 /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Chong Guo
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

5
babel.config.js Normal file
View File

@@ -0,0 +1,5 @@
module.exports = {
'presets': [
'@vue/app'
]
};

3
cypress.json Normal file
View File

@@ -0,0 +1,3 @@
{
"pluginsFile": "tests/e2e/plugins/index.js"
}

49
jest.config.js Normal file
View File

@@ -0,0 +1,49 @@
module.exports = {
'moduleFileExtensions': [
'js',
'jsx',
'json',
'vue',
'ts',
'tsx'
],
'transform': {
'^.+\\.vue$': 'vue-jest',
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
'^.+\\.tsx?$': 'ts-jest'
},
'transformIgnorePatterns': [
'/node_modules/'
],
'moduleNameMapper': {
'^@/(.*)$': '<rootDir>/src/$1'
},
'snapshotSerializers': [
'jest-serializer-vue'
],
'testMatch': [
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
],
'collectCoverage': true,
'collectCoverageFrom': [
'src/utils/**/*.{ts,vue}',
'!src/utils/auth.ts',
'!src/utils/request.ts',
'src/components/**/*.{ts,vue}'
],
'coverageDirectory': '<rootDir>/tests/unit/coverage',
'coverageReporters': [
'lcov',
'text-summary'
],
'testURL': 'http://localhost/',
'watchPlugins': [
'jest-watch-typeahead/filename',
'jest-watch-typeahead/testname'
],
'globals': {
'ts-jest': {
'babelConfig': true
}
}
};

20726
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

71
package.json Normal file
View File

@@ -0,0 +1,71 @@
{
"name": "vue-typescript-admin-template",
"version": "0.1.0",
"private": true,
"author": "Chong Guo <armourcy@gmail.com>",
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"build:uat": "vue-cli-service build --mode production.uat",
"lint": "vue-cli-service lint",
"svg": "vsvg -s ./src/icons/svg -t ./src/icons/components --ext ts --es6",
"test:e2e": "vue-cli-service test:e2e",
"test:unit": "vue-cli-service test:unit"
},
"dependencies": {
"@types/echarts": "^4.4.6",
"@types/webpack": "^4.41.12",
"area-data": "^5.0.6",
"axios": "^0.19.0",
"echarts": "^5.3.2",
"element-ui": "^2.12.0",
"js-cookie": "^2.2.1",
"md5": "^2.3.0",
"moment": "^2.24.0",
"normalize.css": "^8.0.1",
"nprogress": "^0.2.0",
"path-to-regexp": "^3.0.0",
"register-service-worker": "^1.6.2",
"vue": "^2.6.10",
"vue-area-linkage": "^5.1.0",
"vue-class-component": "^7.1.0",
"vue-property-decorator": "^8.2.2",
"vue-router": "^3.1.2",
"vue-svgicon": "^3.2.6",
"vuex": "^3.1.1",
"vuex-class": "^0.3.2",
"vuex-module-decorators": "^0.10.1",
"vuex-persistedstate": "^2.7.0"
},
"devDependencies": {
"@types/jest": "^24.0.18",
"@types/js-cookie": "^2.2.2",
"@types/nprogress": "^0.2.0",
"@types/webpack-env": "^1.14.0",
"@vue/cli-plugin-babel": "^3.11.0",
"@vue/cli-plugin-e2e-cypress": "^3.11.0",
"@vue/cli-plugin-eslint": "^3.11.0",
"@vue/cli-plugin-pwa": "^3.11.0",
"@vue/cli-plugin-typescript": "^3.11.0",
"@vue/cli-plugin-unit-jest": "^3.11.0",
"@vue/cli-service": "^3.11.0",
"@vue/eslint-config-standard": "^4.0.0",
"@vue/eslint-config-typescript": "^4.0.0",
"@vue/test-utils": "^1.0.0-beta.29",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.0.3",
"eslint": "^6.2.2",
"eslint-plugin-vue": "^5.2.3",
"fibers": "^4.0.2",
"jest": "^24.9.0",
"sass": "^1.22.10",
"sass-loader": "^7.3.1",
"style-resources-loader": "^1.2.1",
"ts-jest": "^24.0.2",
"typescript": "3.6.2",
"vue-cli-plugin-element": "^1.0.1",
"vue-cli-plugin-style-resources-loader": "^0.1.3",
"vue-template-compiler": "^2.6.10",
"webpack": "^4.39.3"
}
}

5
postcss.config.js Normal file
View File

@@ -0,0 +1,5 @@
module.exports = {
'plugins': {
'autoprefixer': {}
}
};

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="520.000000pt" height="520.000000pt" viewBox="0 0 520.000000 520.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,520.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1897 4883 c-3 -3 -39 -7 -79 -9 -66 -4 -125 -10 -138 -14 -3 -1 -13
-2 -22 -1 -10 1 -18 -3 -18 -10 0 -9 -3 -9 -14 0 -11 9 -18 8 -30 -5 -10 -9
-20 -14 -23 -11 -3 4 -15 1 -27 -5 -11 -7 -24 -13 -28 -14 -5 -1 -9 -2 -10 -4
-2 -1 -10 -3 -19 -5 -10 -1 -40 -14 -67 -28 -28 -14 -53 -23 -56 -20 -3 3 -8
-2 -12 -11 -3 -9 -10 -14 -14 -11 -4 3 -13 -2 -20 -10 -7 -8 -16 -12 -21 -9
-5 3 -9 0 -9 -6 0 -6 -4 -8 -10 -5 -5 3 -10 2 -10 -3 0 -5 -16 -17 -35 -28
-19 -10 -35 -23 -35 -28 0 -5 -3 -7 -6 -3 -6 6 -36 -16 -62 -45 -9 -9 -19 -15
-24 -12 -4 3 -8 1 -8 -5 0 -5 -9 -13 -20 -16 -11 -4 -18 -10 -15 -15 3 -4 -10
-17 -28 -29 -17 -11 -27 -21 -22 -21 6 0 -3 -9 -20 -20 -16 -11 -25 -20 -20
-20 6 -1 -1 -7 -15 -15 -14 -8 -21 -14 -16 -15 5 0 -3 -11 -18 -25 -14 -13
-26 -29 -26 -35 0 -6 -4 -8 -10 -5 -5 3 -10 3 -10 -2 0 -4 -13 -22 -28 -39
-60 -70 -72 -84 -72 -90 0 -4 -11 -17 -26 -30 -14 -13 -21 -24 -17 -24 4 0 3
-4 -2 -8 -18 -12 -66 -82 -58 -82 4 0 0 -5 -9 -11 -10 -5 -18 -14 -18 -20 0
-9 -8 -21 -38 -54 -7 -8 -10 -15 -6 -15 3 0 1 -6 -5 -13 -6 -8 -7 -18 -3 -23
4 -5 3 -6 -2 -2 -10 9 -46 -44 -46 -67 0 -8 -6 -18 -13 -22 -7 -4 -19 -23 -26
-40 -8 -18 -18 -33 -23 -33 -5 0 -7 -4 -3 -9 3 -5 -2 -17 -11 -25 -8 -9 -12
-16 -9 -16 4 0 0 -11 -9 -25 -9 -14 -13 -25 -9 -25 5 0 3 -4 -2 -8 -6 -4 -25
-41 -44 -82 -18 -41 -37 -84 -41 -95 -33 -73 -59 -136 -60 -143 -3 -28 -14
-52 -23 -52 -6 0 -8 -3 -4 -6 3 -3 -4 -31 -15 -62 -11 -32 -21 -61 -22 -67 -1
-5 -4 -14 -8 -20 -3 -5 -9 -26 -14 -45 -11 -49 -11 -49 -14 -55 -1 -3 -4 -9
-5 -15 -1 -5 -4 -12 -5 -15 -1 -3 -4 -9 -5 -15 -1 -5 -3 -11 -5 -12 -1 -2 -3
-12 -5 -23 -4 -23 -10 -46 -24 -93 -5 -18 -10 -35 -10 -37 -1 -3 -1 -6 -2 -7
0 -2 -2 -19 -5 -37 -2 -19 -10 -39 -17 -43 -7 -4 -8 -8 -1 -8 7 0 5 -23 -7
-67 -9 -38 -19 -90 -23 -118 -3 -27 -8 -68 -11 -90 -3 -22 -7 -53 -10 -70 -27
-163 -27 -652 0 -813 3 -17 7 -46 10 -62 11 -66 17 -93 29 -134 7 -23 12 -50
10 -59 -1 -9 3 -17 9 -17 5 0 7 -3 4 -7 -4 -3 -2 -12 3 -19 6 -6 10 -16 9 -20
-1 -5 1 -18 5 -29 31 -81 36 -98 32 -103 -3 -2 3 -17 14 -32 11 -15 17 -30 13
-34 -3 -3 0 -6 7 -6 7 0 10 -3 7 -6 -3 -4 -1 -16 5 -28 7 -11 13 -23 13 -26 0
-3 7 -16 15 -30 8 -14 15 -27 15 -30 4 -18 30 -60 37 -60 4 0 7 -3 6 -7 -3 -9
62 -106 74 -111 4 -2 8 -9 8 -16 0 -6 9 -18 20 -26 11 -8 20 -20 20 -27 0 -7
7 -13 15 -13 8 0 15 -4 15 -9 0 -13 58 -70 64 -63 3 3 6 -2 6 -11 0 -10 7 -17
15 -17 8 0 15 -4 15 -10 0 -5 4 -10 10 -10 5 0 23 -14 40 -31 16 -18 30 -28
30 -23 0 5 5 1 11 -8 5 -10 17 -18 24 -18 8 0 15 -4 15 -8 0 -5 16 -14 35 -22
19 -8 35 -17 35 -22 0 -4 6 -8 13 -9 6 0 34 -11 62 -24 27 -13 53 -21 57 -19
5 3 8 1 8 -3 0 -8 77 -35 105 -38 6 0 15 -4 22 -8 6 -4 23 -8 37 -9 14 -1 26
-5 26 -8 0 -6 33 -11 78 -13 12 -1 22 -3 22 -6 0 -4 19 -7 43 -9 55 -3 69 -6
85 -15 6 -5 12 -5 12 0 0 4 14 8 30 8 17 0 30 -2 30 -5 0 -7 96 -3 109 4 5 3
12 0 14 -6 4 -10 6 -9 6 1 1 11 4 11 16 1 8 -7 15 -8 15 -4 0 5 19 10 43 12
57 3 91 7 102 13 6 3 20 4 33 3 12 0 22 2 22 7 0 4 12 6 28 5 15 -2 31 -1 37
2 5 4 28 8 50 9 21 2 42 7 45 11 3 4 19 8 35 10 55 4 82 9 92 15 5 3 23 9 39
12 38 8 58 13 62 15 2 3 6 4 52 14 19 4 44 11 55 16 21 9 73 22 77 18 2 -1 14
5 28 12 14 8 30 15 35 16 6 2 20 5 32 8 11 2 35 12 52 20 17 9 33 16 36 16 19
1 199 74 207 85 4 5 8 6 8 2 0 -5 15 1 33 12 19 11 37 18 40 14 4 -3 7 -1 7 5
0 7 3 11 8 10 4 -2 73 30 153 70 80 39 149 72 153 72 4 0 14 7 23 15 8 8 19
13 24 10 5 -4 9 -1 9 5 0 7 6 10 12 8 7 -3 18 0 25 6 25 22 38 31 48 32 25 2
74 27 69 35 -3 5 -2 8 3 7 11 -3 56 12 72 25 7 6 20 12 29 13 8 2 18 6 21 11
11 15 45 38 37 26 -4 -7 -3 -13 2 -13 6 0 12 7 16 15 3 8 12 15 20 15 8 0 17
6 19 13 8 18 8 2 10 -373 l2 -345 88 -1 87 -1 0 126 c1 69 1 255 1 413 l-1
287 40 17 c21 10 37 21 34 26 -5 8 10 12 35 9 7 -2 10 2 6 8 -5 10 7 15 28 12
4 0 7 3 7 9 0 5 16 17 35 26 19 9 35 21 35 26 0 5 4 7 9 4 5 -4 11 -3 13 1 1
5 35 28 73 53 39 25 72 48 73 53 2 4 8 5 13 1 5 -3 12 2 15 10 3 9 10 14 14
11 4 -3 11 2 14 11 3 8 10 12 16 9 5 -3 10 1 10 10 0 9 4 14 9 11 5 -3 20 5
34 18 14 13 28 21 31 19 3 -3 8 2 12 11 3 9 15 16 26 16 10 0 16 5 13 10 -3 6
2 13 11 17 18 7 50 31 86 65 10 10 21 18 24 18 6 0 47 36 106 92 15 14 28 24
28 22 0 -3 48 43 108 103 108 109 252 281 252 302 0 6 4 11 9 11 9 0 32 37 78
130 16 30 31 57 35 58 5 2 8 12 8 21 0 10 3 21 7 24 13 13 45 113 67 208 40
176 22 407 -48 593 -32 85 -91 204 -113 228 -9 10 -13 18 -9 18 4 0 -4 15 -18
33 -15 19 -26 37 -26 40 0 11 -119 168 -179 236 -81 93 -142 151 -216 205 -22
17 -42 33 -45 36 -3 4 -21 15 -40 26 -19 10 -37 22 -40 25 -3 3 -20 14 -37 23
-18 9 -33 21 -33 26 0 6 -6 10 -14 10 -8 0 -21 6 -28 13 -7 7 -28 20 -45 28
-18 7 -33 17 -33 20 0 4 -11 10 -24 13 -14 3 -31 12 -38 19 -16 15 -70 41 -80
39 -5 -1 -8 2 -8 6 0 5 -16 14 -35 22 -19 8 -35 18 -35 24 0 5 -3 6 -7 3 -3
-4 -12 -2 -20 4 -7 6 -13 8 -13 3 0 -5 -4 -4 -8 3 -4 6 -14 13 -22 15 -8 2
-21 9 -28 16 -8 7 -17 10 -22 7 -5 -3 -10 -2 -12 2 -4 10 -80 47 -90 45 -5 -1
-8 3 -8 9 0 6 -7 9 -15 5 -8 -3 -15 -1 -15 4 0 6 -7 10 -15 10 -8 0 -15 5 -15
11 0 5 -5 7 -10 4 -6 -3 -10 -1 -10 6 0 7 -3 9 -7 6 -3 -4 -12 -2 -20 4 -7 6
-13 8 -13 3 0 -5 -4 -3 -9 4 -4 7 -18 14 -29 15 -12 1 -22 5 -22 10 0 4 -4 5
-10 2 -5 -3 -10 -1 -10 4 0 6 -7 11 -15 11 -15 0 -23 3 -81 33 -17 9 -34 14
-38 10 -3 -3 -6 -1 -6 6 0 7 -4 9 -10 6 -5 -3 -10 -2 -10 4 0 6 -7 7 -17 4
-10 -4 -14 -2 -9 5 4 7 -1 10 -14 7 -11 -2 -20 1 -20 6 0 6 -4 7 -10 4 -5 -3
-10 -1 -10 6 0 7 -3 9 -7 6 -3 -4 -12 -2 -20 4 -7 6 -13 8 -13 4 0 -4 -6 -2
-14 4 -8 7 -27 14 -42 17 -16 3 -33 9 -40 15 -6 5 -14 6 -17 2 -4 -3 -7 -2 -7
4 0 5 -7 10 -15 11 -8 1 -22 3 -30 4 -8 1 -15 5 -15 10 0 4 -8 8 -18 8 -10 0
-24 6 -31 13 -11 10 -12 9 -6 -3 7 -12 6 -13 -6 -4 -8 5 -48 21 -89 33 -41 13
-86 28 -100 34 -14 6 -29 9 -34 8 -5 -1 -21 2 -35 8 -14 5 -35 12 -46 17 -11
4 -31 9 -45 11 -14 2 -32 7 -40 10 -8 4 -19 8 -25 9 -5 1 -12 3 -15 4 -3 1
-12 3 -20 5 -8 1 -71 15 -139 30 -68 15 -137 28 -155 30 -17 2 -31 4 -31 5 0
1 -11 3 -25 5 -14 1 -43 5 -65 9 -22 4 -71 9 -110 12 -130 10 -154 12 -163 18
-5 3 -12 3 -15 -1z"/>
<path d="M4526 1543 c-2 -2 -12 -5 -23 -7 -37 -8 -111 -47 -151 -81 -43 -37
-92 -113 -95 -145 -1 -11 -4 -20 -8 -20 -13 0 -1 -156 16 -195 18 -42 108
-135 131 -135 8 0 14 -3 14 -8 0 -8 103 -58 160 -77 3 -1 18 -7 33 -13 16 -7
32 -12 36 -12 5 0 14 -7 21 -15 7 -8 16 -12 21 -9 5 3 9 2 9 -3 0 -4 12 -14
28 -21 32 -14 90 -67 113 -102 18 -28 24 -150 8 -150 -6 0 -8 -4 -5 -8 7 -11
-31 -72 -44 -72 -6 0 -9 -4 -6 -9 3 -5 -17 -18 -46 -30 -54 -23 -191 -30 -203
-11 -3 6 -15 10 -26 10 -10 0 -19 5 -19 10 0 6 -4 10 -10 10 -20 0 -63 56 -80
102 -9 26 -16 66 -15 88 1 22 -1 40 -4 41 -3 0 -43 1 -89 2 -66 2 -82 -1 -83
-13 -1 -8 -2 -22 -3 -30 -1 -8 2 -23 7 -32 5 -12 4 -18 -5 -18 -9 0 -9 -3 0
-12 7 -7 12 -21 12 -33 0 -36 48 -124 88 -162 52 -49 72 -65 72 -57 0 4 8 0
18 -9 10 -10 22 -14 25 -10 4 3 7 2 7 -4 0 -5 6 -10 13 -11 6 -1 28 -5 47 -9
31 -6 200 -9 248 -3 19 2 34 8 103 39 64 30 143 110 155 158 4 13 9 23 13 23
12 0 21 188 10 210 -4 8 -13 30 -19 48 -7 17 -17 32 -23 32 -6 0 -8 2 -5 6 7
7 -72 89 -94 97 -10 3 -18 11 -18 17 0 6 -4 8 -10 5 -5 -3 -10 -3 -10 2 0 4
-15 14 -32 22 -18 8 -36 18 -39 23 -3 5 -16 10 -27 11 -12 1 -22 4 -22 8 0 4
-10 10 -22 14 -31 10 -37 12 -43 15 -3 1 -8 3 -12 5 -47 12 -136 59 -168 87
-32 27 -58 75 -50 88 3 6 3 10 -2 10 -4 0 -8 14 -8 30 -1 17 3 30 8 30 4 0 5
4 2 10 -18 28 60 110 120 125 39 11 125 12 125 3 0 -5 9 -8 20 -8 26 0 86 -54
105 -94 9 -18 16 -48 17 -67 l1 -36 89 0 88 1 0 38 c0 21 -4 38 -8 38 -4 0 -9
11 -10 25 -7 93 -141 235 -221 235 -12 0 -21 4 -21 8 0 7 -197 12 -204 5z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

24
public/index.html Normal file
View File

@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" href="favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
<title>苍穹外卖</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>
<!-- built files will be auto injected -->
<!-- <% if (process.env.VUE_APP_NODE_ENV === 'prod' ) { %>
<script type="text/javascript" src="https://pip-data-rollback.itheima.net/init.min.js" async="async" id="data-rollback" exchange="maintainExchange"></script>
<% } %> -->
</body>
</html>

20
public/manifest.json Normal file
View File

@@ -0,0 +1,20 @@
{
"name": "苍穹外卖",
"short_name": "Vue Ts Admin",
"icons": [
{
"src": "./img/icons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "./img/icons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "./index.html",
"display": "standalone",
"background_color": "#fff",
"theme_color": "#4DBA87"
}

2
public/robots.txt Normal file
View File

@@ -0,0 +1,2 @@
User-agent: *
Disallow:

View File

@@ -0,0 +1,563 @@
{
"header": {
"reportVersion": 2,
"event": "Allocation failed - JavaScript heap out of memory",
"trigger": "FatalError",
"filename": "report.20210610.155436.5628.0.001.json",
"dumpEventTime": "2021-06-10T15:54:36Z",
"dumpEventTimeStamp": "1623311676251",
"processId": 5628,
"threadId": null,
"cwd": "E:\\workSpace\\vue\\project-rjwm-admin-vue-ts",
"commandLine": [
"D:\\tools\\languageEnv\\node\\node.exe",
"E:\\workSpace\\vue\\project-rjwm-admin-vue-ts\\node_modules\\.bin\\\\..\\@vue\\cli-service\\bin\\vue-cli-service.js",
"serve"
],
"nodejsVersion": "v12.16.3",
"wordSize": 64,
"arch": "x64",
"platform": "win32",
"componentVersions": {
"node": "12.16.3",
"v8": "7.8.279.23-node.35",
"uv": "1.34.2",
"zlib": "1.2.11",
"brotli": "1.0.7",
"ares": "1.16.0",
"modules": "72",
"nghttp2": "1.40.0",
"napi": "5",
"llhttp": "2.0.4",
"http_parser": "2.9.3",
"openssl": "1.1.1g",
"cldr": "36.0",
"icu": "65.1",
"tz": "2019c",
"unicode": "12.1"
},
"release": {
"name": "node",
"lts": "Erbium",
"headersUrl": "https://nodejs.org/download/release/v12.16.3/node-v12.16.3-headers.tar.gz",
"sourceUrl": "https://nodejs.org/download/release/v12.16.3/node-v12.16.3.tar.gz",
"libUrl": "https://nodejs.org/download/release/v12.16.3/win-x64/node.lib"
},
"osName": "Windows_NT",
"osRelease": "6.1.7601",
"osVersion": "Windows 7 Ultimate Service Pack 1",
"osMachine": "x86_64",
"cpus": [
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 3591486,
"nice": 0,
"sys": 1681331,
"idle": 108769263,
"irq": 46238
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 338896,
"nice": 0,
"sys": 93975,
"idle": 113608882,
"irq": 405
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 3468385,
"nice": 0,
"sys": 1302514,
"idle": 109270744,
"irq": 200055
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 176905,
"nice": 0,
"sys": 38235,
"idle": 113826348,
"irq": 421
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 4137349,
"nice": 0,
"sys": 1150803,
"idle": 108753226,
"irq": 9438
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 888410,
"nice": 0,
"sys": 944632,
"idle": 112208212,
"irq": 72150
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 6490156,
"nice": 0,
"sys": 1070510,
"idle": 106480463,
"irq": 8564
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 292845,
"nice": 0,
"sys": 51558,
"idle": 113696602,
"irq": 546
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 4281728,
"nice": 0,
"sys": 1129150,
"idle": 108630001,
"irq": 10467
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 293453,
"nice": 0,
"sys": 272814,
"idle": 113474472,
"irq": 186935
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 5714737,
"nice": 0,
"sys": 1403431,
"idle": 106922461,
"irq": 11216
},
{
"model": "Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz",
"speed": 3300,
"user": 211599,
"nice": 0,
"sys": 78187,
"idle": 113750703,
"irq": 514
}
],
"networkInterfaces": [
{
"name": "本地连接",
"internal": false,
"mac": "1c:1b:0d:06:51:e4",
"address": "fe80::24eb:8f76:cede:ceab",
"netmask": "ffff:ffff:ffff:ffff::",
"family": "IPv6",
"scopeid": 11
},
{
"name": "本地连接",
"internal": false,
"mac": "1c:1b:0d:06:51:e4",
"address": "172.16.43.194",
"netmask": "255.255.192.0",
"family": "IPv4"
},
{
"name": "Loopback Pseudo-Interface 1",
"internal": true,
"mac": "00:00:00:00:00:00",
"address": "::1",
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
"family": "IPv6",
"scopeid": 0
},
{
"name": "Loopback Pseudo-Interface 1",
"internal": true,
"mac": "00:00:00:00:00:00",
"address": "127.0.0.1",
"netmask": "255.0.0.0",
"family": "IPv4"
}
],
"host": "CZBK-20200409KQ"
},
"javascriptStack": {
"message": "No stack.",
"stack": [
"Unavailable."
]
},
"nativeStack": [
{
"pc": "0x000000013f652449",
"symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+11577"
},
{
"pc": "0x000000013f6569a9",
"symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+29337"
},
{
"pc": "0x000000013f655828",
"symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+24856"
},
{
"pc": "0x000000013f78d8c2",
"symbol": "v8::base::CPU::has_sse+68658"
},
{
"pc": "0x000000013ffa9bbe",
"symbol": "v8::Isolate::ReportExternalAllocationLimitReached+94"
},
{
"pc": "0x000000013ff91c91",
"symbol": "v8::SharedArrayBuffer::Externalize+833"
},
{
"pc": "0x000000013fe5e1ec",
"symbol": "v8::internal::Heap::EphemeronKeyWriteBarrierFromCode+1436"
},
{
"pc": "0x000000013fe69420",
"symbol": "v8::internal::Heap::ProtectUnprotectedMemoryChunks+1312"
},
{
"pc": "0x000000013fe65f44",
"symbol": "v8::internal::Heap::PageFlagsAreConsistent+3204"
},
{
"pc": "0x000000013fe5b743",
"symbol": "v8::internal::Heap::CollectGarbage+1283"
},
{
"pc": "0x000000013fe59db4",
"symbol": "v8::internal::Heap::AddRetainedMap+2452"
},
{
"pc": "0x000000013fe7afbd",
"symbol": "v8::internal::Factory::NewFillerObject+61"
},
{
"pc": "0x000000013fbe1871",
"symbol": "v8::internal::interpreter::JumpTableTargetOffsets::iterator::operator=+1665"
},
{
"pc": "0x00000001403f6c4d",
"symbol": "v8::internal::SetupIsolateDelegate::SetupHeap+546637"
},
{
"pc": "0x00000001403f7d43",
"symbol": "v8::internal::SetupIsolateDelegate::SetupHeap+550979"
},
{
"pc": "0x00000079aa1ccd2b",
"symbol": ""
}
],
"javascriptHeap": {
"totalMemory": 2163404800,
"totalCommittedMemory": 2163404800,
"usedMemory": 2120118744,
"availableMemory": 57120176,
"memoryLimit": 2197815296,
"heapSpaces": {
"read_only_space": {
"memorySize": 262144,
"committedMemory": 262144,
"capacity": 32808,
"used": 32808,
"available": 0
},
"new_space": {
"memorySize": 23068672,
"committedMemory": 23068672,
"capacity": 11522016,
"used": 1072552,
"available": 10449464
},
"old_space": {
"memorySize": 1236938752,
"committedMemory": 1236938752,
"capacity": 1229757864,
"used": 1229019664,
"available": 738200
},
"code_space": {
"memorySize": 4362240,
"committedMemory": 4362240,
"capacity": 3741600,
"used": 3741600,
"available": 0
},
"map_space": {
"memorySize": 18616320,
"committedMemory": 18616320,
"capacity": 6707520,
"used": 6707520,
"available": 0
},
"large_object_space": {
"memorySize": 879239168,
"committedMemory": 879239168,
"capacity": 878721496,
"used": 878721496,
"available": 0
},
"code_large_object_space": {
"memorySize": 917504,
"committedMemory": 917504,
"capacity": 823104,
"used": 823104,
"available": 0
},
"new_large_object_space": {
"memorySize": 0,
"committedMemory": 0,
"capacity": 11522016,
"used": 0,
"available": 11522016
}
}
},
"resourceUsage": {
"userCpuSeconds": 1001.07,
"kernelCpuSeconds": 47.767,
"cpuConsumptionPercent": 15.9084,
"maxRss": 3146252288,
"pageFaults": {
"IORequired": 7262522,
"IONotRequired": 0
},
"fsActivity": {
"reads": 57874,
"writes": 276
}
},
"libuv": [
],
"workers": [
],
"environmentVariables": {
"=E:": "E:\\workSpace\\vue\\project-rjwm-admin-vue-ts",
"ALLUSERSPROFILE": "C:\\ProgramData",
"ANDROID_HOME": "D:\\tools\\languageEnv\\androidSdk",
"ANDROID_SDK_HOME": "D:\\tools\\languageEnv\\androidSdk",
"APPDATA": "C:\\Users\\itcast\\AppData\\Roaming",
"BABEL_ENV": "development",
"CHROME_CRASHPAD_PIPE_NAME": "\\\\.\\pipe\\crashpad_2628_OSFCTUHMTXXCSAUA",
"CLASSPATH": ".;D:\\tools\\languageEnv\\java\\lib;D:\\tools\\languageEnv\\java\\lib\\tools.jar;",
"COLORTERM": "truecolor",
"CommonProgramFiles": "C:\\Program Files\\Common Files",
"CommonProgramFiles(x86)": "C:\\Program Files (x86)\\Common Files",
"CommonProgramW6432": "C:\\Program Files\\Common Files",
"COMPUTERNAME": "CZBK-20200409KQ",
"ComSpec": "C:\\Windows\\system32\\cmd.exe",
"FLUTTER_STORAGE_BASE_URL": "https://storage.flutter-io.cn",
"FP_NO_HOST_CHECK": "NO",
"GIT_ASKPASS": "d:\\tools\\codeTools\\vscode\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass.sh",
"GRADLE_HOME": "D:\\tools\\languageEnv\\gradle\\gradle-6.6",
"HOMEDRIVE": "C:",
"HOMEPATH": "\\Users\\itcast",
"INIT_CWD": "E:\\workSpace\\vue\\project-rjwm-admin-vue-ts",
"JAVA_HOME": "D:\\tools\\languageEnv\\java",
"LANG": "zh_CN.UTF-8",
"LOCALAPPDATA": "C:\\Users\\itcast\\AppData\\Local",
"LOGONSERVER": "\\\\CZBK-20200409KQ",
"MAVEN_HOME": "D:\\tools\\languageEnv\\maven\\apache-maven-3.8.1",
"NODE": "D:\\tools\\languageEnv\\node\\node.exe",
"NODE_ENV": "development",
"NODE_PATH": "D:\\tools\\languageEnv\\node_global\\node_modules",
"npm_config_argv": "{\"remain\":[],\"cooked\":[\"run\",\"serve\"],\"original\":[\"serve\"]}",
"npm_config_bin_links": "true",
"npm_config_cache": "D:\\tools\\languageEnv\\node\\node_cache",
"npm_config_disturl": "https://npm.taobao.org/dist",
"npm_config_ignore_optional": "",
"npm_config_ignore_scripts": "",
"npm_config_init_license": "MIT",
"npm_config_init_version": "1.0.0",
"npm_config_msvs_version": "2017",
"npm_config_prefix": "D:\\tools\\languageEnv\\node\\node_global",
"npm_config_registry": "https://registry.npm.taobao.org",
"npm_config_save_prefix": "^",
"npm_config_strict_ssl": "true",
"npm_config_user_agent": "yarn/1.22.4 npm/? node/v12.16.3 win32 x64",
"npm_config_version_commit_hooks": "true",
"npm_config_version_git_message": "v%s",
"npm_config_version_git_sign": "",
"npm_config_version_git_tag": "true",
"npm_config_version_tag_prefix": "v",
"npm_execpath": "D:\\tools\\languageEnv\\yarn\\bin\\yarn.js",
"npm_lifecycle_event": "serve",
"npm_lifecycle_script": "vue-cli-service serve",
"npm_node_execpath": "D:\\tools\\languageEnv\\node\\node.exe",
"npm_package_author_email": "armourcy@gmail.com",
"npm_package_author_name": "Chong Guo",
"npm_package_dependencies_area_data": "^5.0.6",
"npm_package_dependencies_axios": "^0.19.0",
"npm_package_dependencies_echarts": "^4.6.0",
"npm_package_dependencies_element_ui": "^2.12.0",
"npm_package_dependencies_js_cookie": "^2.2.1",
"npm_package_dependencies_moment": "^2.24.0",
"npm_package_dependencies_normalize_css": "^8.0.1",
"npm_package_dependencies_nprogress": "^0.2.0",
"npm_package_dependencies_path_to_regexp": "^3.0.0",
"npm_package_dependencies_register_service_worker": "^1.6.2",
"npm_package_dependencies_vue": "^2.6.10",
"npm_package_dependencies_vuex": "^3.1.1",
"npm_package_dependencies_vuex_class": "^0.3.2",
"npm_package_dependencies_vuex_module_decorators": "^0.10.1",
"npm_package_dependencies_vuex_persistedstate": "^2.7.0",
"npm_package_dependencies_vue_area_linkage": "^5.1.0",
"npm_package_dependencies_vue_class_component": "^7.1.0",
"npm_package_dependencies_vue_property_decorator": "^8.2.2",
"npm_package_dependencies_vue_router": "^3.1.2",
"npm_package_dependencies_vue_svgicon": "^3.2.6",
"npm_package_dependencies__types_echarts": "^4.4.6",
"npm_package_dependencies__types_webpack": "^4.41.12",
"npm_package_description": "## 1 pc端需求概述",
"npm_package_devDependencies_babel_core": "^7.0.0-bridge.0",
"npm_package_devDependencies_babel_eslint": "^10.0.3",
"npm_package_devDependencies_eslint": "^6.2.2",
"npm_package_devDependencies_eslint_plugin_vue": "^5.2.3",
"npm_package_devDependencies_fibers": "^4.0.1",
"npm_package_devDependencies_jest": "^24.9.0",
"npm_package_devDependencies_sass": "^1.22.10",
"npm_package_devDependencies_sass_loader": "^7.3.1",
"npm_package_devDependencies_style_resources_loader": "^1.2.1",
"npm_package_devDependencies_ts_jest": "^24.0.2",
"npm_package_devDependencies_typescript": "3.6.2",
"npm_package_devDependencies_vue_cli_plugin_element": "^1.0.1",
"npm_package_devDependencies_vue_cli_plugin_style_resources_loader": "^0.1.3",
"npm_package_devDependencies_vue_template_compiler": "^2.6.10",
"npm_package_devDependencies_webpack": "^4.39.3",
"npm_package_devDependencies__types_jest": "^24.0.18",
"npm_package_devDependencies__types_js_cookie": "^2.2.2",
"npm_package_devDependencies__types_nprogress": "^0.2.0",
"npm_package_devDependencies__types_webpack_env": "^1.14.0",
"npm_package_devDependencies__vue_cli_plugin_babel": "^3.11.0",
"npm_package_devDependencies__vue_cli_plugin_e2e_cypress": "^3.11.0",
"npm_package_devDependencies__vue_cli_plugin_eslint": "^3.11.0",
"npm_package_devDependencies__vue_cli_plugin_pwa": "^3.11.0",
"npm_package_devDependencies__vue_cli_plugin_typescript": "^3.11.0",
"npm_package_devDependencies__vue_cli_plugin_unit_jest": "^3.11.0",
"npm_package_devDependencies__vue_cli_service": "^3.11.0",
"npm_package_devDependencies__vue_eslint_config_standard": "^4.0.0",
"npm_package_devDependencies__vue_eslint_config_typescript": "^4.0.0",
"npm_package_devDependencies__vue_test_utils": "^1.0.0-beta.29",
"npm_package_license": "MIT",
"npm_package_name": "vue-typescript-admin-template",
"npm_package_private": "true",
"npm_package_readmeFilename": "README.md",
"npm_package_scripts_build": "vue-cli-service build",
"npm_package_scripts_lint": "vue-cli-service lint",
"npm_package_scripts_serve": "vue-cli-service serve",
"npm_package_scripts_svg": "vsvg -s ./src/icons/svg -t ./src/icons/components --ext ts --es6",
"npm_package_scripts_test_e2e": "vue-cli-service test:e2e",
"npm_package_scripts_test_unit": "vue-cli-service test:unit",
"npm_package_version": "0.1.0",
"NUMBER_OF_PROCESSORS": "12",
"ORIGINAL_XDG_CURRENT_DESKTOP": "undefined",
"OS": "Windows_NT",
"Path": "C:\\Users\\itcast\\AppData\\Local\\Temp\\yarn--1623305083040-0.16842799735602587;E:\\workSpace\\vue\\project-rjwm-admin-vue-ts\\node_modules\\.bin;C:\\Users\\itcast\\AppData\\Local\\Yarn\\Data\\link\\node_modules\\.bin;D:\\tools\\languageEnv\\node\\node_global\\bin;D:\\tools\\languageEnv\\libexec\\lib\\node_modules\\npm\\bin\\node-gyp-bin;D:\\tools\\languageEnv\\lib\\node_modules\\npm\\bin\\node-gyp-bin;D:\\tools\\languageEnv\\node\\node_modules\\npm\\bin\\node-gyp-bin;C:\\Program Files\\Common Files\\Oracle\\Java\\javapath;C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;D:\\tools\\languageEnv\\node;D:\\tools\\editTools\\ue\\;D:\\tools\\codeTools\\vscode\\Microsoft VS Code\\bin;D:\\tools\\languageEnv\\yarn\\bin\\;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0;D:\\tools\\languageEnv\\androidSdk\\platform-tools;D:\\tools\\languageEnv\\androidSdk\\tools;D:\\tools\\languageEnv\\gradle\\gradle-6.6\\bin;D:\\tools\\languageEnv\\node\\node_global;D:\\tools\\managementTools\\Git\\cmd;D:\\tools\\languageEnv\\python;D:\\tools\\languageEnv\\node\\;D:\\tools\\languageEnv\\maven\\apache-maven-3.8.1\\bin;C:\\Windows\\System32;D:\\tools\\languageEnv\\java\\bin;D:\\tools\\languageEnv\\java\\jre\\bin;D:\\tools\\languageEnv\\flutter\\bin;C:\\Users\\itcast\\AppData\\Roaming\\npm",
"PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JSE;.WSF;.WSH;.MSC",
"PROCESSOR_ARCHITECTURE": "AMD64",
"PROCESSOR_IDENTIFIER": "Intel64 Family 6 Model 63 Stepping 2, GenuineIntel",
"PROCESSOR_LEVEL": "6",
"PROCESSOR_REVISION": "3f02",
"ProgramData": "C:\\ProgramData",
"ProgramFiles": "C:\\Program Files",
"ProgramFiles(x86)": "C:\\Program Files (x86)",
"ProgramW6432": "C:\\Program Files",
"PROMPT": "$P$G",
"PSModulePath": "C:\\Users\\itcast\\Documents\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\",
"PUBLIC": "C:\\Users\\Public",
"PUB_HOSTED_URL": "https://pub.flutter-io.cn",
"SystemDrive": "C:",
"SystemRoot": "C:\\Windows",
"TEMP": "C:\\Users\\itcast\\AppData\\Local\\Temp",
"TERM_PROGRAM": "vscode",
"TERM_PROGRAM_VERSION": "1.56.2",
"TMP": "C:\\Users\\itcast\\AppData\\Local\\Temp",
"USERDOMAIN": "CZBK-20200409KQ",
"USERNAME": "itcast",
"USERPROFILE": "C:\\Users\\itcast",
"VSCODE_GIT_ASKPASS_MAIN": "d:\\tools\\codeTools\\vscode\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass-main.js",
"VSCODE_GIT_ASKPASS_NODE": "D:\\tools\\codeTools\\vscode\\Microsoft VS Code\\Code.exe",
"VSCODE_GIT_IPC_HANDLE": "\\\\.\\pipe\\vscode-git-136ec50daa-sock",
"Vue": "D:\\tools\\languageEnv\\node\\node_global\\bin",
"VUE_APP_BASE_API": "/api",
"VUE_CLI_BABEL_TRANSPILE_MODULES": "true",
"VUE_CLI_ENTRY_FILES": "[\"E:\\\\workSpace\\\\vue\\\\project-rjwm-admin-vue-ts\\\\src\\\\main.ts\"]",
"WEBPACK_DEV_SERVER": "true",
"windir": "C:\\Windows",
"windows_tracing_flags": "3",
"windows_tracing_logfile": "C:\\BVTBin\\Tests\\installpackage\\csilogfile.log",
"WXDRIVE_START_ARGS": "--wxdrive-setting=0 --disable-gpu --disable-software-rasterizer --enable-features=NetworkServiceInProcess",
"YARN_WRAP_OUTPUT": "false"
},
"sharedObjects": [
"D:\\tools\\languageEnv\\node\\node.exe",
"C:\\Windows\\SYSTEM32\\ntdll.dll",
"C:\\Windows\\system32\\kernel32.dll",
"C:\\Windows\\system32\\KERNELBASE.dll",
"C:\\Windows\\system32\\ADVAPI32.DLL",
"C:\\Windows\\system32\\msvcrt.dll",
"C:\\Windows\\SYSTEM32\\sechost.dll",
"C:\\Windows\\system32\\RPCRT4.dll",
"C:\\Windows\\system32\\dbghelp.dll",
"C:\\Windows\\system32\\WS2_32.dll",
"C:\\Windows\\system32\\NSI.dll",
"C:\\Windows\\system32\\IPHLPAPI.DLL",
"C:\\Windows\\system32\\WINNSI.DLL",
"C:\\Windows\\system32\\PSAPI.DLL",
"C:\\Windows\\system32\\USERENV.dll",
"C:\\Windows\\system32\\profapi.dll",
"C:\\Windows\\system32\\USER32.dll",
"C:\\Windows\\system32\\GDI32.dll",
"C:\\Windows\\system32\\LPK.dll",
"C:\\Windows\\system32\\USP10.dll",
"C:\\Windows\\system32\\CRYPT32.dll",
"C:\\Windows\\system32\\MSASN1.dll",
"C:\\Windows\\system32\\bcrypt.dll",
"C:\\Windows\\system32\\WINMM.dll",
"C:\\Windows\\system32\\IMM32.DLL",
"C:\\Windows\\system32\\MSCTF.dll",
"C:\\Windows\\system32\\api-ms-win-core-synch-l1-2-0.DLL",
"C:\\Windows\\system32\\powrprof.dll",
"C:\\Windows\\system32\\SETUPAPI.dll",
"C:\\Windows\\system32\\CFGMGR32.dll",
"C:\\Windows\\system32\\OLEAUT32.dll",
"C:\\Windows\\system32\\ole32.dll",
"C:\\Windows\\system32\\DEVOBJ.dll",
"C:\\Windows\\system32\\uxtheme.dll",
"C:\\Windows\\system32\\mswsock.dll",
"C:\\Windows\\System32\\wshtcpip.dll",
"C:\\Windows\\System32\\wship6.dll",
"C:\\Windows\\system32\\bcryptprimitives.dll",
"C:\\Windows\\system32\\NLAapi.dll",
"C:\\Windows\\system32\\napinsp.dll",
"C:\\Windows\\system32\\pnrpnsp.dll",
"C:\\Windows\\system32\\DNSAPI.dll",
"C:\\Windows\\System32\\winrnr.dll",
"C:\\Windows\\system32\\wshbth.dll",
"C:\\Windows\\system32\\dhcpcsvc6.DLL",
"C:\\Windows\\system32\\dhcpcsvc.DLL",
"\\\\?\\E:\\workSpace\\vue\\project-rjwm-admin-vue-ts\\node_modules\\fibers\\bin\\win32-x64-72\\fibers.node",
"C:\\Windows\\system32\\cryptbase.dll",
"C:\\Windows\\system32\\apphelp.dll"
]
}

14
src/App.vue Normal file
View File

@@ -0,0 +1,14 @@
<template>
<div id="app">
<router-view />
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
@Component({
name: 'App',
})
export default class extends Vue {}
</script>

51
src/api/category.ts Normal file
View File

@@ -0,0 +1,51 @@
import request from '@/utils/request';
/**
*
* 分类管理
*
**/
// 查询分类列表接口
export const getCategoryPage = (params: any) => {
return request({
url: '/category/page',
method: 'get',
params
});
};
// 删除当前列的接口
export const deleCategory = (ids: string) => {
return request({
url: '/category',
method: 'delete',
params: { id:ids }
});
};
// 修改接口
export const editCategory = (params: any) => {
return request({
url: '/category',
method: 'put',
data: { ...params }
});
};
// 新增接口
export const addCategory = (params: any) => {
return request({
url: '/category',
method: 'post',
data: { ...params }
});
};
// 修改---启用禁用接口
export const enableOrDisableEmployee = (params: any) => {
return request({
url: `/category/status/${params.status}`,
method: 'post',
params: { id:params.id }
})
}

89
src/api/charts.ts Normal file
View File

@@ -0,0 +1,89 @@
import request from '@/utils/request'
/**
*
* 报表数据
*
**/
// 获取当日销售数据 -> 顶部数据
export const getDataes = (params: any) =>
request({
'url': `/report/amountCollect/${params.date}`,
'method': 'get'
})
// 获取当日销售数据 -> 顶部数据 - 营收概况
export const getChartsDataes = (params: any) =>
request({
'url': `/report/dayCollect/${params.start}/${params.end}`,
'method': 'get'
})
// 获取当日销售趋势数据24小时-> 销售趋势
export const getDayDataes= (params: any) =>
request({
'url': `/report/hourCollect/${params.type}/${params.date}`,
'method': 'get'
})
// 支付类型数据汇总 -> 店内收款构成 - 当日
export const getDayPayType = (params: any) =>
request({
'url': `/report/payTypeCollect/${params.date}`,
'method': 'get'
})
// 获取当日各种优惠类型数据汇总 -> 优惠指标
export const getprivilege = (params: any) =>
request({
'url': `/report/privilegeCollect/${params.date}`,
'method': 'get'
})
// 获取菜品分类销售排行 - 菜品分类占比 -当日
export const getSalesRanking = (params: any) =>
request({
'url': `/report/categoryCollect/${params.type}/${params.date}`,
'method': 'get'
})
// 获取当日菜品销售排行
export const getDayRanking = (params: any) =>
request({
'url': `/report/currentDishRank/${params.date}`,
'method': 'get'
})
// 获取一定日期之内的销售趋势 - 销售趋势 图
export const getTimeQuantumDataes = (params: any) =>
request({
'url': `/report/dayAmountCollect/${params.type}/${params.start}/${params.end}`,
'method': 'get'
})
// 获取时间范围之内的各种支付类型数据汇总 - 店内收款构成 - 时间段
export const getTimeQuantumReceivables = (params: any) =>
request({
'url': `/report/datePayTypeCollect/${params.start}/${params.end}`,
'method': 'get'
})
// 获取时间范围之内的菜品类别销售汇总 - 菜品分类占比 - 时间段
export const getTimeQuantumType = (params: any) =>
request({
'url': `/report/dateCategoryCollect/${params.type}/${params.start}/${params.end}`,
'method': 'get'
})
// 获取时间范围之内的菜品销售排行 - 菜品销售排行
export const getTimeQuantumDishes = (params: any) =>
request({
'url': `/report/dishRankForDate/${params.start}/${params.end}`,
'method': 'get'
})
// 获取时间范围之内的优惠指标汇总数据 - 顶部信息
export const getTimeQuantumDiscount = (params: any) =>
request({
'url': `/report/privilegeByDate/${params.start}/${params.end}`,
'method': 'get'
})

97
src/api/dish.ts Normal file
View File

@@ -0,0 +1,97 @@
import request from '@/utils/request'
/**
*
* 菜品管理
*
**/
// 查询列表接口
export const getDishPage = (params: any) => {
return request({
url: '/dish/page',
method: 'get',
params
})
}
// 删除接口
export const deleteDish = (ids: string) => {
return request({
url: '/dish',
method: 'delete',
params: { ids }
})
}
// 修改接口
export const editDish = (params: any) => {
return request({
url: '/dish',
method: 'put',
data: { ...params }
})
}
// 新增接口
export const addDish = (params: any) => {
return request({
url: '/dish',
method: 'post',
data: { ...params }
})
}
// 查询详情
export const queryDishById = (id: string | (string | null)[]) => {
return request({
url: `/dish/${id}`,
method: 'get'
})
}
// 获取菜品分类列表
export const getCategoryList = (params: any) => {
return request({
url: '/category/list',
method: 'get',
params
})
}
// 查菜品列表的接口
export const queryDishList = (params: any) => {
return request({
url: '/dish/list',
method: 'get',
params
})
}
// 文件down预览
export const commonDownload = (params: any) => {
return request({
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
url: '/common/download',
method: 'get',
params
})
}
// 起售停售---批量起售停售接口
export const dishStatusByStatus = (params: any) => {
return request({
url: `/dish/status/${params.status}`,
method: 'post',
params: { id: params.id }
})
}
//菜品分类数据查询
export const dishCategoryList = (params: any) => {
return request({
url: `/category/list`,
method: 'get',
params: { ...params }
})
}

63
src/api/employee.ts Normal file
View File

@@ -0,0 +1,63 @@
import request from '@/utils/request'
/**
*
* 员工管理
*
**/
// 登录、
export const login = (data: any) =>
request({
'url': '/employee/login',
'method': 'post',
data
})
// 退出
export const userLogout = (params: any) =>
request({
'url': `/employee/logout`, // 授课老师接口
'method': 'post',
params
})
export const getEmployeeList = (params: any) => {
return request({
url: '/employee/page',
method: 'get',
params
})
}
// 修改---启用禁用接口
export const enableOrDisableEmployee = (params: any) => {
return request({
url: `/employee/status/${params.status}`,
method: 'post',
params: { id:params.id }
})
}
// 新增---添加员工
export const addEmployee = (params: any) => {
return request({
url: '/employee',
method: 'post',
data: { ...params }
})
}
// 修改---添加员工
export const editEmployee = (params: any) => {
return request({
url: '/employee',
method: 'put',
data: { ...params }
})
}
// 修改页面反查详情接口
export const queryEmployeeById = (id: string | (string | null)[]) => {
return request({
url: `/employee/${id}`,
method: 'get'
})
}

97
src/api/index.ts Normal file
View File

@@ -0,0 +1,97 @@
import request from '@/utils/request'
// 营业额数据
// export const getTurnoverDataes = (data) =>
// request({
// 'url': `/report/turnoverStatistics`,
// 'method': 'get',
// data
// })
// 首页数据
// // 今日数据
// export const getTodayDataes = () =>
// request({
// 'url': `/workspace/todaydate`,
// 'method': 'get'
// })
// 订单管理
export const getOrderData = () =>
request({
'url': `/workspace/overviewOrders`,
'method': 'get'
})
// 菜品总览
export const getOverviewDishes = () =>
request({
'url': `/workspace/overviewDishes`,
'method': 'get'
})
// 套餐总览
export const getSetMealStatistics = () =>
request({
'url': `/workspace/overviewSetmeals`,
'method': 'get'
})
// 营业数据
export const getBusinessData= () =>
request({
'url': `/workspace/businessData`,
'method': 'get'
})
/**
*
* 报表数据
*
**/
// 统计
// 获取当日销售数据 -> 顶部数据
// export const getDataes = (params: any) =>
// request({
// 'url': `/report/amountCollect/${params.date}`,
// 'method': 'get'
// })
// 营业额统计
export const getTurnoverStatistics= (params: any) =>
request({
'url': `/report/turnoverStatistics`,
'method': 'get',
params
})
// 用户统计
export const getUserStatistics= (params: any) =>
request({
'url': `/report/userStatistics`,
'method': 'get',
params
})
// 订单统计
export const getOrderStatistics= (params: any) =>
request({
'url': `/report/ordersStatistics`,
'method': 'get',
params
})
// 销量排名TOP10
export const getTop= (params: any) =>
request({
'url': `/report/top10`,
'method': 'get',
params
})
// 数据概览
export const getDataOverView= (params: any) =>
request({
'url': `/report/dataOverView`,
'method': 'get',
params
})
// 导出
export function exportInfor() {
return request({
url: '/report/export',
method: 'get',
responseType: "blob"
})
}

31
src/api/inform.ts Normal file
View File

@@ -0,0 +1,31 @@
import request from '@/utils/request'
// 获取列表数据
export const getInformData = (params: any) => {
return request({
url: '/messages/page',
method: 'get',
params,
},)
}
// 获取未读
export const getCountUnread = () => {
return request({
url: '/messages/countUnread',
method: 'get'
},)
}
// 全部已读
export const batchMsg = (data: any) => {
return request({
url: '/messages/batch',
method: 'put',
data
})
}
// 标记已读
export const setStatus = (params: any) => {
return request({
url: `/messages/${params}`,
method: 'PUT'
})
}

68
src/api/order.ts Normal file
View File

@@ -0,0 +1,68 @@
import request from '@/utils/request'
// 查询列表页接口
export const getOrderDetailPage = (params: any) => {
return request({
url: '/order/conditionSearch',
method: 'get',
params
})
}
// 查看接口
export const queryOrderDetailById = (params: any) => {
return request({
url: `/order/details/${params.orderId}`,
method: 'get'
})
}
// 派送接口
export const deliveryOrder = (params: any) => {
return request({
url: `/order/delivery/${params.id}`,
method: 'put' /* */
})
}
//完成接口
export const completeOrder = (params: any) => {
return request({
url: `/order/complete/${params.id}`,
method: 'put' /* */
})
}
//订单取消
export const orderCancel = (params: any) => {
return request({
url: '/order/cancel',
method: 'put' /* */,
data: { ...params }
})
}
//接单
export const orderAccept = (params: any) => {
return request({
url: '/order/confirm',
method: 'put' /* */,
data: { ...params }
})
}
//拒单
export const orderReject = (params: any) => {
return request({
url: '/order/rejection',
method: 'put' /* */,
data: { ...params }
})
}
//获取待处理,待派送,派送中数量
export const getOrderListBy = (params: any) => {
return request({
url: '/order/statistics',
method: 'get' /* */
})
}

68
src/api/setMeal.ts Normal file
View File

@@ -0,0 +1,68 @@
import request from '@/utils/request'
/**
*
* 套餐管理
*
**/
// 查询列表数据
export const getSetmealPage = (params: any) => {
return request({
url: '/setmeal/page',
method: 'get',
params,
},)
}
// 删除数据接口
export const deleteSetmeal = (ids: string) => {
return request({
url: '/setmeal',
method: 'delete',
params: { ids }
})
}
// 修改数据接口
export const editSetmeal = (params: any) => {
return request({
url: '/setmeal',
method: 'put',
data: { ...params }
})
}
// 新增数据接口
export const addSetmeal = (params: any) => {
return request({
url: '/setmeal',
method: 'post',
data: { ...params }
})
}
// 查询详情接口
export const querySetmealById = (id: string | (string | null)[]) => {
return request({
url: `/setmeal/${id}`,
method: 'get'
})
}
// 批量起售禁售
export const setmealStatusByStatus = (params: any) => {
return request({
url: `/setmeal/status/${params.status}`,
method: 'post',
params: { id: params.ids }
})
}
//菜品分类数据查询
export const dishCategoryList = (params: any) => {
return request({
url: `/category/list`,
method: 'get',
params: { ...params }
})
}

21
src/api/users.ts Normal file
View File

@@ -0,0 +1,21 @@
import request from '@/utils/request'
// 修改密码
export const editPassword = (data: any) =>
request({
'url': '/employee/editPassword',
'method': 'put',
data
})
// 获取营业状态
export const getStatus = () =>
request({
'url': `/shop/status`,
'method': 'get'
})
// 设置营业状态
export const setStatus = (data:any) =>
request({
'url': `/shop/`+data,
'method': 'put',
'data':data
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 931 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 885 B

BIN
src/assets/icons/fall.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 938 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
src/assets/icons/msg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
src/assets/icons/time.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 B

BIN
src/assets/icons/up.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
src/assets/login/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 880 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
src/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
src/assets/noImg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
src/assets/preview.mp3 Normal file

Binary file not shown.

BIN
src/assets/reminder.mp3 Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
src/assets/table_empty.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View File

@@ -0,0 +1,104 @@
<template>
<el-breadcrumb
class="app-breadcrumb"
separator="/"
>
<transition-group name="breadcrumb">
<el-breadcrumb-item
v-for="(item, index) in breadcrumbs"
:key="item.path"
>
<span
v-if="item.redirect === 'noredirect' || index === breadcrumbs.length-1"
class="no-redirect"
>{{ item.meta.title }}</span>
<a
v-else
@click.prevent="handleLink(item)"
>{{ item.meta.title }}</a>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</template>
<script lang="ts">
import pathToRegexp from 'path-to-regexp'
import { Component, Vue, Watch } from 'vue-property-decorator'
import { RouteRecord, Route } from 'vue-router'
@Component({
'name': 'Breadcrumb'
})
export default class extends Vue {
private breadcrumbs: RouteRecord[] = []
@Watch('$route')
private onRouteChange(route: Route) {
// if you go to the redirect page, do not update the breadcrumbs
if (route.path.startsWith('/redirect/')) {
return
}
this.getBreadcrumb()
}
created () {
this.getBreadcrumb()
}
private getBreadcrumb () {
let matched = this.$route.matched.filter(
item => item.meta && item.meta.title
)
const first = matched[0]
// if (!this.isDashboard(first)) {
// matched = [
// { path: '/', meta: { title: '集团管理' } } as RouteRecord
// ].concat(matched)
// }
this.breadcrumbs = matched.filter(item => {
return item.meta && item.meta.title && item.meta.breadcrumb !== false
})
}
private isDashboard (route: RouteRecord) {
const name = route && route.meta && route.meta.title
return name === '集团管理'
}
private pathCompile (path: string) {
// To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
const { params } = this.$route
const toPath = pathToRegexp.compile(path)
return toPath(params)
}
private handleLink (item: any) {
const { redirect, path } = item
if (redirect) {
this.$router.push(redirect)
return
}
this.$router.push(this.pathCompile(path))
}
}
</script>
<style lang="scss" scoped>
.el-breadcrumb__inner,
.el-breadcrumb__inner a {
font-weight: 400 !important;
}
.app-breadcrumb.el-breadcrumb {
display: inline-block;
font-size: 14px;
line-height: 50px;
margin-left: 8px;
.no-redirect {
color: #97a8be;
cursor: text;
}
}
</style>

View File

@@ -0,0 +1,94 @@
<template>
<div
:id="id"
:class="className"
:style="{height: height, width: width}"
/>
</template>
<script lang="ts">
import echarts, { EChartOption } from 'echarts';
import {Component, Prop, Watch} from 'vue-property-decorator';
import { mixins } from 'vue-class-component';
import ResizeMixin from './mixins/resize';
@Component({
'name': 'BarChart'
})
export default class extends mixins(ResizeMixin) {
@Prop({ 'default': 'chart' }) private className!: string
@Prop({ 'default': 'BarChart' }) private id!: string
@Prop({ 'default': '100%' }) private width!: string
@Prop({ 'default': '250px' }) private height!: string
@Prop({ 'default': 'Requests' }) private title!: string
@Prop({ 'default': {} }) private chartData!: any
mounted() {
this.init()
}
@Watch('chartData')
private changeData(newVal:string ,oldVal:string){
this.init()
}
private init(){
this.$nextTick(() => {
this.initChart();
});
}
beforeDestroy() {
if (!this.chart) {
return;
}
this.chart.dispose();
this.chart = null;
}
private initChart() {
this.chart = echarts.init(document.getElementById(this.id) as HTMLDivElement);
const data = this.chartData;
this.chart.setOption({'title': {
'text': this.title,
'left': 'left'
},
'tooltip': {
'trigger': 'item',
'formatter': '{a} <br/>{b} : {c} ({d}%)'
},
'legend': {
'type': 'scroll',
'orient': 'vertical',
'left': 0,
'top': 50,
'bottom': 20,
'data': data.legendData,
'selected': data.selected
},
'series': [
{
'name': '占比',
'type': 'pie',
'radius': '65%',
'left':80,
'center': ['40%', '50%'],
'data': data.seriesData,
'emphasis': {
'itemStyle': {
'shadowBlur': 10,
'shadowOffsetX': 0,
'shadowColor': 'rgba(0, 0, 0, 0.5)'
}
},
'itemStyle': {
'normal': {
'color': function (params:any) {
var colorList = ['#389BFF', '#F26461', '#52C41A', '#08979C', '#597EF7', '#B37FEB','#FF7875', '#5CDBD3', '#FFC53D'];
return colorList[params.dataIndex];
}
}
}
}
]} as any);
}
}
</script>

View File

@@ -0,0 +1,154 @@
<template>
<div
:id="id"
:class="className"
:style="{height: height, width: width}"
/>
</template>
<script lang="ts">
import echarts, { EChartOption } from 'echarts';
import { Component, Prop, Watch } from 'vue-property-decorator';
import { mixins } from 'vue-class-component';
import ResizeMixin from './mixins/resize';
import { WatchOptions } from 'vue';
@Component({
'name': 'MixedChart'
})
export default class extends mixins(ResizeMixin) {
@Prop({ 'default': 'chart' }) private className!: string
@Prop({ 'default': 'mixedChart' }) private id!: string
@Prop({ 'default': '100%' }) private width!: string
@Prop({ 'default': '250px' }) private height!: string
@Prop({ 'default': 'Requests' }) private title!: string
@Prop({ 'default': {} }) private chartData!: any
mounted() {
this.init()
}
@Watch('chartData')
private changeData(newVal:string ,oldVal:string){
this.init()
}
init(){
this.$nextTick(() => {
this.initChart();
});
}
beforeDestroy() {
if (!this.chart) {
return;
}
this.chart.dispose();
this.chart = null;
}
private initChart() {
this.chart = echarts.init(document.getElementById(this.id) as HTMLDivElement);
this.chart.setOption({
'backgroundColor': '#fff',
'title': {
'text': this.title,
'top': '0',
'textStyle': {
'color': '#000',
'fontSize': 18
},
'subtextStyle': {
'color': '#90979c',
'fontSize': 16
}
},
'tooltip': {
'trigger': 'axis'
},
'grid': {
'left': '50',
'right': '5%',
'borderWidth': 0,
'top': 60,
'bottom': 34,
'textStyle': {
'color': '#fff'
}
},
'xAxis': [{
'type': 'category',
'axisLine': {
'lineStyle': {
'color': '#90979c'
}
},
'splitLine': {
'show': false
},
'axisTick': {
'show': true
},
'splitArea': {
'show': false
},
'axisLabel': {
'interval': 0,
'rotate':this.chartData.xData.length > 10 ? -25 : 0
},
'data': this.chartData.xData
}],
'yAxis': [{
'type': 'value',
'splitLine': {
'show': false
},
'axisLine': {
'lineStyle': {
'color': '#90979c'
}
},
'axisTick': {
'show': false
},
'axisLabel': {
'interval': 0
},
'splitArea': {
'show': false
}
}],
'series': [{
'name': '店内',
'type': 'bar',
'stack': 'total',
'barMaxWidth': 15,
'barGap': '10%',
'itemStyle': {
'normal': {
'barBorderRadius':[10, 10, 0, 0],
'color': new echarts.graphic.LinearGradient(
0, 0, 0, 1,
[
{'offset': 0, 'color': '#FFA868'},
{'offset': 1, 'color': '#FF9240'}
]
)
},
'label': {
'show': true,
'textStyle': {
'color': '#fff'
},
'position': 'insideTop',
formatter(p: any) {
return p.value > 0 ? p.value : '';
}
}
},
'data': this.chartData.yData
}]
} as EChartOption<EChartOption.SeriesLine | EChartOption.SeriesBar>);
}
}
</script>

View File

@@ -0,0 +1,139 @@
<template>
<div
:id="id"
:class="className"
:style="{height: height, width: width}"
/>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import echarts from 'echarts';
import { mixins } from 'vue-class-component';
import ResizeMixin from './mixins/resize';
@Component({
'name': 'LineChart'
})
export default class extends mixins(ResizeMixin) {
@Prop({ 'default': 'chart' }) private className!: string
@Prop({ 'default': 'chart' }) private id!: string
@Prop({ 'default': '100%' }) private width!: string
@Prop({ 'default': '300px' }) private height!: string
@Prop({ 'default': 'Requests' }) private title!: string
mounted() {
this.$nextTick(() => {
this.initChart();
});
}
private initChart() {
this.chart = echarts.init(document.getElementById(this.id) as HTMLDivElement);
this.chart.setOption({
'backgroundColor': '#fff',
'title': {
'top': 20,
'text': this.title,
'textStyle': {
'fontWeight': 'normal',
'fontSize': 16,
'color': '#000'
},
'left': '1%'
},
'tooltip': {
'trigger': 'axis'
},
'legend': {
'top': 20,
'icon': 'rect',
'itemWidth': 14,
'itemHeight': 5,
'itemGap': 13,
'data': ['CMCC', 'CTCC'],
'right': '4%',
'textStyle': {
'fontSize': 12,
'color': '#000'
}
},
'grid': {
'top': 100,
'left': '2%',
'right': '2%',
'bottom': '2%',
'containLabel': true
},
'xAxis': [{
'type': 'category',
'boundaryGap': false,
'axisLine': {
'lineStyle': {
'color': '#57617B'
}
},
'axisLabel': {
'interval': 0,
'rotate':-20
},
'data': ['13:00', '13:05', '13:10', '13:15', '13:20', '13:25', '13:30', '13:35', '13:40', '13:45', '13:50', '13:55']
}],
'yAxis': [{
'type': 'value',
'name': '(%)',
'axisTick': {
'show': false
},
'axisLine': {
'lineStyle': {
'color': '#57617B'
}
},
'axisLabel': {
'margin': 10,
'fontSize': 14
},
'splitLine': {
'lineStyle': {
'color': '#EEF3F8'
}
}
}],
'series': [{
'name': 'CMCC',
'type': 'line',
'smooth': true,
'symbol': 'circle',
'symbolSize': 5,
'showSymbol': false,
'lineStyle': {
'width': 2
},
'areaStyle': {
'color': new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
'offset': 0,
'color': 'rgba(255, 140, 54, 0.3)'
}, {
'offset': 0.8,
'color': 'rgba(255, 140, 54, 0)'
}], false),
'shadowColor': 'rgba(0, 0, 0, 0.1)',
'shadowBlur': 10
},
'itemStyle': {
'color': '#FF783D',
'borderColor': '#FF783D',
'borderWidth': 12
},
'data': [220, 182, 191, 134, 150, 120, 110, 125, 145, 122, 165, 122]
}]
} as any);
}
}
</script>
<style lang="scss" scoped>
</style>

View File

@@ -0,0 +1,152 @@
<template>
<div
:id="id"
:class="className"
:style="{height: height, width: width}"
/>
</template>
<script lang="ts">
import echarts, { EChartOption } from 'echarts';
import {Component, Prop, Watch} from 'vue-property-decorator';
import { mixins } from 'vue-class-component';
import ResizeMixin from './mixins/resize';
@Component({
'name': 'MixedChart'
})
export default class extends mixins(ResizeMixin) {
@Prop({ 'default': 'chart' }) private className!: string
@Prop({ 'default': 'mixedChart' }) private id!: string
@Prop({ 'default': '100%' }) private width!: string
@Prop({ 'default': '250px' }) private height!: string
@Prop({ 'default': 'Requests' }) private title!: string
@Prop({ 'default': {} }) private chartData!: any
mounted() {
this.init()
}
@Watch('chartData')
private changeData(newVal:string ,oldVal:string){
this.init()
}
init(){
this.$nextTick(() => {
this.initChart();
});
}
beforeDestroy() {
if (!this.chart) {
return;
}
this.chart.dispose();
this.chart = null;
}
private initChart() {
this.chart = echarts.init(document.getElementById(this.id) as HTMLDivElement);
this.chart.setOption({
'backgroundColor': '#fff',
'title': {
'text': this.title,
'top': '0',
'textStyle': {
'color': '#000',
'fontSize': 18
},
'subtextStyle': {
'color': '#90979c',
'fontSize': 16
}
},
'tooltip': {
'trigger': 'axis'
},
'grid': {
'left': '50',
'right': '5%',
'borderWidth': 0,
'top': 60,
'bottom': 35,
'textStyle': {
'color': '#fff'
}
},
'xAxis': [{
'type': 'category',
'axisLine': {
'lineStyle': {
'color': '#90979c'
}
},
'splitLine': {
'show': false
},
'axisTick': {
'show': true
},
'splitArea': {
'show': false
},
'axisLabel': {
'interval': 0,
'rotate':-20
},
'data': this.chartData.xData
}],
'yAxis': [{
'type': 'value',
'splitLine': {
'show': false
},
'axisLine': {
'lineStyle': {
'color': '#90979c'
}
},
'axisTick': {
'show': false
},
'axisLabel': {
'interval': 0
},
'splitArea': {
'show': false
}
}],
'series': [{
'name': '店内',
'type': 'bar',
'stack': 'total',
'barMaxWidth': 15,
'barGap': '10%',
'itemStyle': {
'normal': {
'barBorderRadius':[10, 10, 0, 0],
'color': new echarts.graphic.LinearGradient(
0, 0, 0, 1,
[
{'offset': 0, 'color': '#55A9FF'},
{'offset': 1, 'color': '#379AFF'}
]
)
},
'label': {
'show': true,
'textStyle': {
'color': '#fff'
},
'position': 'insideTop',
formatter(p: any) {
return p.value > 0 ? p.value : '';
}
}
},
'data': this.chartData.yData
}]
} as EChartOption<EChartOption.SeriesLine | EChartOption.SeriesBar>);
}
}
</script>

View File

@@ -0,0 +1,67 @@
import { ECharts } from 'echarts';
import { Component, Vue } from 'vue-property-decorator';
@Component({
'name': 'ResizeMixin'
})
export default class extends Vue {
protected chart!: ECharts | null
private sidebarElm?: Element
mounted() {
this.initResizeEvent();
this.initSidebarResizeEvent();
}
beforeDestroy() {
this.destroyResizeEvent();
this.destroySidebarResizeEvent();
}
activated() {
this.initResizeEvent();
this.initSidebarResizeEvent();
}
deactivated() {
this.destroyResizeEvent();
this.destroySidebarResizeEvent();
}
private chartResizeHandler() {
if (this.chart) {
this.chart.resize();
}
}
private sidebarResizeHandler(e: TransitionEvent) {
if (e.propertyName === 'width') {
this.chartResizeHandler();
}
}
private initResizeEvent() {
if (this.chartResizeHandler) {
window.addEventListener('resize', this.chartResizeHandler);
}
}
private destroyResizeEvent() {
if (this.chartResizeHandler) {
window.removeEventListener('resize', this.chartResizeHandler);
}
}
private initSidebarResizeEvent() {
this.sidebarElm = document.getElementsByClassName('sidebar-container')[0];
if (this.sidebarElm) {
this.sidebarElm.addEventListener('transitionend', this.sidebarResizeHandler as EventListener);
}
}
private destroySidebarResizeEvent() {
if (this.sidebarElm) {
this.sidebarElm.removeEventListener('transitionend', this.sidebarResizeHandler as EventListener);
}
}
}

View File

@@ -0,0 +1,40 @@
<!-- -->
<template>
<div class="empty-box">
<div class="img-box">
<img v-if="!isSearch"
src="../../assets/table_empty.png"
alt="">
<img v-else
src="../../assets/search_table_empty.png">
<p>{{ !isSearch ? '这里空空如也~' : 'Sorry木有找到您搜索的内容哦~' }}</p>
</div>
</div>
</template>
<script lang='ts'>
import { Vue, Component, Prop } from 'vue-property-decorator'
@Component({
name: 'Empty'
})
export default class extends Vue {
@Prop({ default: false }) isSearch: boolean //用来区分是搜索还是默认无数据
}
</script>
<style scoped lang="scss">
.empty-box {
text-align: center;
margin: 120px 0;
img {
margin: 0 atuo;
width: 238px;
height: 184px;
margin-top: 156px;
margin-bottom: 26px;
}
p {
color: #818693;
}
}
/* @import url(); 引入css类 */
</style>

View File

@@ -0,0 +1,31 @@
<template>
<div :class="[{'is-active': isActive}]" @click="toggleClick">
<svg-icon name="hamburger" width="20" height="20" />
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
@Component({
'name': 'Hamburger'
})
export default class extends Vue {
@Prop({ 'default': false }) private isActive!: boolean
private toggleClick() {
this.$emit('toggleClick');
}
}
</script>
<style lang="scss" scoped>
.svg-icon {
vertical-align: middle;
}
.is-active {
transform: rotate(180deg);
}
</style>

View File

@@ -0,0 +1,83 @@
<template>
<div class="HeadLable">
<span
v-if="goback"
class="goBack"
@click="goBack()"
><img
src="@/assets/icons/btn_back@2x.png"
alt=""
> 返回</span>
<span v-if="!butList">{{ title }}</span>
<div v-if="butList">
<slot />
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
@Component({
'name': 'Hamburger'
})
export default class extends Vue {
@Prop({ 'default': false }) private goback!: boolean
@Prop({ 'default': false }) private butList!: boolean
@Prop({ 'default': '集团管理' }) private title!: string
private toggleClick() {
this.$emit('toggleClick')
}
private goBack() {
this.$router.go(-1)
}
}
</script>
<style lang="scss" scoped>
.HeadLable{
// position: absolute;
background: #fff;
color: #333333;
height: 64px;
font-size: 16px;
// width: 300px;
padding-left: 22px;
line-height: 64px;
font-weight: 700;
margin-bottom: 15px;
top:0px;
left: 0px;
opacity: 0;
animation: opacity 500ms ease-out 800ms forwards;
.goBack{
border-right: solid 1px #d8dde3;
padding-right: 14px;
margin-right: 14px;
font-size: 16px;
color: #333333;
cursor: pointer;
font-weight: 400;
img{
position: relative;
top:24px;
margin-right: 5px;
width: 18px;
height: 18px;
float: left;
}
}
}
@keyframes opacity {
0% {
opacity: 0;
left: 80px;
}
100% {
opacity: 1;
left: 0;
}
}
</style>

View File

@@ -0,0 +1,199 @@
<!-- -->
<template>
<div class="upload-item">
<el-upload ref="uploadfiles"
:accept="type"
:class="{ borderNone: imageUrl }"
class="avatar-uploader"
action="/api/common/upload"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:on-remove="handleRemove"
:on-error="handleError"
:before-upload="beforeAvatarUpload"
:headers="headers">
<img v-if="imageUrl"
:src="imageUrl"
class="avatar">
<i v-else
class="el-icon-plus avatar-uploader-icon" />
<span v-if="imageUrl"
class="el-upload-list__item-actions">
<span class="el-upload-span"
@click.stop="oploadImgDel">
删除图片
</span>
<span class="el-upload-span"> 重新上传 </span>
</span>
</el-upload>
<p class="upload-tips">
<slot />
</p>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
import { baseUrl } from '@/config.json'
import { getToken } from '@/utils/cookies'
@Component({
name: 'UploadImage'
})
export default class extends Vue {
@Prop({ default: '.jpg,.jpeg,.png' }) type: string
@Prop({ default: 2 }) size: number
@Prop({ default: '' }) propImageUrl: string
private headers = {
token: getToken()
}
private imageUrl = ''
handleRemove() {}
@Watch('propImageUrl')
private onChange(val) {
this.imageUrl = val
}
handleError(err, file, fileList) {
console.log(err, file, fileList, 'handleError')
this.$message({
message: '图片上传失败',
type: 'error'
})
}
handleAvatarSuccess(response: any, file: any, fileList: any) {
// this.imageUrl = response.data
// this.imageUrl = `http://172.17.2.120:8080/common/download?name=${response.data}`
this.imageUrl = `${response.data}`
// this.imageUrl = `${baseUrl}/common/download?name=${response.data}`
this.$emit('imageChange', this.imageUrl)
}
oploadImgDel() {
this.imageUrl = ''
this.$emit('imageChange', this.imageUrl)
}
beforeAvatarUpload(file) {
const isLt2M = file.size / 1024 / 1024 < this.size
if (!isLt2M) {
this.$message({
message: `上传文件大小不能超过${this.size}M!`,
type: 'error'
})
return false
}
}
}
</script>
<style lang='scss'>
.borderNone {
.el-upload {
border: 1px solid #d9d9d9 !important;
}
}
</style>
<style scoped lang="scss">
.avatar-uploader .el-icon-plus:after {
position: absolute;
display: inline-block;
content: ' ' !important;
left: calc(50% - 20px);
top: calc(50% - 40px);
width: 40px;
height: 40px;
background: url('./../../assets/icons/icon_upload@2x.png') center center
no-repeat;
background-size: 20px;
}
.el-upload-list__item-actions:hover .upload-icon {
display: inline-block;
}
.el-icon-zoom-in:before {
content: '\E626';
}
.el-icon-delete:before {
content: '\E612';
}
.el-upload-list__item-actions:hover {
opacity: 1;
}
.upload-item {
display: flex;
align-items: center;
.el-form-item__content {
width: 500px !important;
}
}
.upload-tips {
font-size: 12px;
color: #666666;
display: inline-block;
line-height: 17px;
margin-left: 36px;
}
.el-upload-list__item-actions {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
cursor: default;
text-align: center;
color: #fff;
opacity: 0;
font-size: 20px;
background-color: rgba(0, 0, 0, 0.5);
transition: opacity 0.3s;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader {
display: inline-block;
}
.avatar-uploader .el-upload:hover {
border-color: #F26461;
}
.el-upload-span {
width: 100px;
height: 30px;
border: 1px solid #ffffff;
border-radius: 4px;
font-size: 14px;
text-align: center;
line-height: 30px;
}
.el-upload-span:first-child {
margin-bottom: 20px;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 200px;
height: 160px;
line-height: 160px;
text-align: center;
}
.avatar {
width: 200px;
height: 160px;
display: block;
}
</style>

View File

@@ -0,0 +1,42 @@
<!-- -->
<template>
<div class="input-auto-complete">
<el-input
v-model="input"
:placeholder="placeholder"
style="width: 250px"
clearable
@clear="init"
@keyup.enter.native="init"
>
<i
slot="prefix"
class="el-input__icon el-icon-search"
style="cursor: pointer"
@click="init"
/>
</el-input>
</div>
</template>
<script lang='ts'>
import { Vue, Component, Prop } from 'vue-property-decorator'
@Component({
name: 'InputAutoComplete',
})
export default class extends Vue {
private input: any = ''
@Prop({ default: [] }) data: Array<any>
@Prop({ default: '' }) placeholder: string
@Prop({ default: 'name' }) ObKey: string
init() {
this.$emit('init', this.input)
}
}
</script>
<style scoped>
.input-auto-complete {
display: inline-block;
}
</style>

3
src/config.json Normal file
View File

@@ -0,0 +1,3 @@
{
"baseUrl": "/api"
}

13
src/icons/README.md Normal file
View File

@@ -0,0 +1,13 @@
# vue-svgicon
## English
* All svg components were generated by `vue-svgicon` using svg files
* After you adding new svg files into `icons/svg` folder, run `yarn svg` to regerenrate all svg components (before this, you should have `vue-svgicon` installed globally or use `npx`)
* See details at: [https://github.com/MMF-FE/vue-svgicon](https://github.com/MMF-FE/vue-svgicon)
## 中文
* 所有的 svg 组件都是由 `vue-svgicon` 生成的
* 每当在 `icons/svg` 文件夹内添加 icon 之后,可以通过执行 `yarn svg` 来重新生成所有组件 (在此之前需要全局安装 `vue-svgicon` 或使用 `npx`)
* 详细文档请见:[https://github.com/MMF-FE/vue-svgicon](https://github.com/MMF-FE/vue-svgicon)

View File

@@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'dashboard': {
width: 32,
height: 32,
viewBox: '0 0 1024 1024',
data: '<path pid="4758" d="M888 462.4L544 142.4c-19.2-17.6-48-17.6-65.6 0l-344 320c-9.6 9.6-16 22.4-16 35.2v355.2c0 27.2 22.4 49.6 49.6 49.6h240V657.6c0-56 46.4-102.4 102.4-102.4 56 0 102.4 46.4 102.4 102.4v246.4h240c27.2 0 49.6-22.4 49.6-49.6V497.6c1.6-12.8-4.8-25.6-14.4-35.2z"/>'
}
})

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