├── .babelrc
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .postcssrc.js
├── .travis.yml
├── LICENSE
├── README.md
├── README.zh-CN.md
├── build
├── build.js
├── check-versions.js
├── logo.png
├── utils.js
├── vue-loader.conf.js
├── webpack.base.conf.js
├── webpack.dev.conf.js
└── webpack.prod.conf.js
├── config
├── dev.env.js
├── index.js
├── local.env.js
├── prod.env.js
├── sit.env.js
└── sitali.env.js
├── favicon.ico
├── index.html
├── package.json
├── src
├── App.vue
├── api
│ ├── exportFile.js
│ ├── index.js
│ ├── login.js
│ └── qiniu.js
├── assets
│ ├── 401_images
│ │ └── 401.gif
│ ├── 404_images
│ │ ├── 404.png
│ │ └── 404_cloud.png
│ ├── custom-theme
│ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ └── index.css
│ ├── font
│ │ └── HelveticaNeueLTPro-ThEx.ttf
│ ├── images
│ │ ├── bg.png
│ │ ├── sex-man.png
│ │ ├── sex-women.png
│ │ ├── teacher-bg.png
│ │ ├── teacher-uploader-bg.png
│ │ ├── teacher.png
│ │ ├── teacher_default.png
│ │ ├── theme-img
│ │ │ ├── blackgold.png
│ │ │ ├── fox.png
│ │ │ ├── harvestjoy.png
│ │ │ ├── maidenheart.png
│ │ │ ├── minions.png
│ │ │ ├── naughtybear.png
│ │ │ ├── peachblossom.png
│ │ │ ├── soot.png
│ │ │ ├── thebigblue.png
│ │ │ └── universe.png
│ │ └── weather
│ │ │ ├── 1.png
│ │ │ ├── 2.png
│ │ │ ├── 3.png
│ │ │ ├── 4.png
│ │ │ └── 5.png
│ └── theme
│ │ ├── blackgold-theme
│ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ ├── images
│ │ │ ├── queren.png
│ │ │ ├── shu.png
│ │ │ ├── slidebar-bg.png
│ │ │ ├── tuifei.png
│ │ │ ├── zaidu.png
│ │ │ └── zongshou.png
│ │ └── index.css
│ │ ├── fox-theme
│ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ ├── images
│ │ │ ├── bg.png
│ │ │ ├── queren.png
│ │ │ ├── shu.png
│ │ │ ├── slidebar-bg.png
│ │ │ ├── slidebar-bom-bg.png
│ │ │ ├── tuifei.png
│ │ │ ├── zaidu.png
│ │ │ └── zongshou.png
│ │ └── index.css
│ │ ├── harvestjoy-theme
│ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ ├── images
│ │ │ ├── queren.png
│ │ │ ├── shu.png
│ │ │ ├── slidebar-bg.png
│ │ │ ├── tuifei.png
│ │ │ ├── zaidu.png
│ │ │ └── zongshou.png
│ │ └── index.css
│ │ ├── maidenheart-theme
│ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ ├── images
│ │ │ ├── bg.png
│ │ │ ├── queren.png
│ │ │ ├── shu.png
│ │ │ ├── slidebar-bg.png
│ │ │ ├── tuifei.png
│ │ │ ├── zaidu.png
│ │ │ └── zongshou.png
│ │ └── index.css
│ │ ├── minions-theme
│ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ ├── images
│ │ │ ├── bg.png
│ │ │ ├── queren.png
│ │ │ ├── shu.png
│ │ │ ├── slidebar-bg.png
│ │ │ ├── tuifei.png
│ │ │ ├── zaidu.png
│ │ │ └── zongshou.png
│ │ └── index.css
│ │ ├── naughtybear-theme
│ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ ├── images
│ │ │ ├── bg.png
│ │ │ ├── queren.png
│ │ │ ├── shu.png
│ │ │ ├── slidebar-bg.png
│ │ │ ├── tuifei.png
│ │ │ ├── zaidu.png
│ │ │ └── zongshou.png
│ │ └── index.css
│ │ ├── peachblossom-theme
│ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ ├── images
│ │ │ ├── bg.png
│ │ │ ├── queren.png
│ │ │ ├── shu.png
│ │ │ ├── slidebar-bg.png
│ │ │ ├── tuifei.png
│ │ │ ├── zaidu.png
│ │ │ └── zongshou.png
│ │ └── index.css
│ │ ├── soot-theme
│ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ ├── images
│ │ │ ├── queren.png
│ │ │ ├── shu.png
│ │ │ ├── slidebar-bg.png
│ │ │ ├── tuifei.png
│ │ │ ├── zaidu.png
│ │ │ └── zongshou.png
│ │ └── index.css
│ │ ├── thebigblue-theme
│ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ ├── images
│ │ │ ├── queren.png
│ │ │ ├── shu.png
│ │ │ ├── slidebar-bg.png
│ │ │ ├── tuifei.png
│ │ │ ├── zaidu.png
│ │ │ └── zongshou.png
│ │ └── index.css
│ │ └── universe-theme
│ │ ├── fonts
│ │ ├── element-icons.ttf
│ │ └── element-icons.woff
│ │ ├── images
│ │ ├── queren.png
│ │ ├── shu.png
│ │ ├── slidebar-bg.png
│ │ ├── tuifei.png
│ │ ├── zaidu.png
│ │ └── zongshou.png
│ │ └── index.css
├── components
│ ├── Breadcrumb
│ │ └── index.vue
│ ├── CountNum
│ │ └── index.vue
│ ├── CuttingImg
│ │ └── index.vue
│ ├── Dialog
│ │ └── index.vue
│ ├── Drawer
│ │ └── index.vue
│ ├── EleInput
│ │ └── index.vue
│ ├── EleMultiCascader
│ │ └── index.vue
│ ├── ErrorLog
│ │ └── index.vue
│ ├── Hamburger
│ │ └── index.vue
│ ├── ItemQuestion
│ │ └── index.vue
│ ├── Map
│ │ └── index.vue
│ ├── PanThumb
│ │ └── index.vue
│ ├── QuestionNaire
│ │ └── index.vue
│ ├── ScrollPane
│ │ └── index.vue
│ ├── SpeedTest
│ │ └── index.vue
│ ├── Sticky
│ │ └── index.vue
│ ├── SvgIcon
│ │ └── index.vue
│ ├── Tijian
│ │ └── index.vue
│ └── Toast
│ │ ├── index.vue
│ │ └── toast.js
├── directive
│ ├── el-dragDialog
│ │ ├── drag.js
│ │ └── index.js
│ ├── permission
│ │ ├── index.js
│ │ └── permission.js
│ ├── sticky.js
│ └── waves
│ │ ├── index.js
│ │ ├── waves.css
│ │ └── waves.js
├── errorLog.js
├── filters
│ └── index.js
├── icons
│ ├── index.js
│ ├── svg
│ │ ├── 404.svg
│ │ ├── ABC.svg
│ │ ├── BOC.svg
│ │ ├── BOHAIB.svg
│ │ ├── BOL.svg
│ │ ├── CCB.svg
│ │ ├── CEB.svg
│ │ ├── CGB.svg
│ │ ├── CIB.svg
│ │ ├── CITIC.svg
│ │ ├── CMB.svg
│ │ ├── CMBC.svg
│ │ ├── COMM.svg
│ │ ├── CZBANK.svg
│ │ ├── EGBANK.svg
│ │ ├── HSBANK.svg
│ │ ├── HXBANK.svg
│ │ ├── ICBC.svg
│ │ ├── PSBC.svg
│ │ ├── SPABANK.svg
│ │ ├── SPDB.svg
│ │ ├── ZYB.svg
│ │ ├── ZZBANK.svg
│ │ ├── backstage.svg
│ │ ├── bug.svg
│ │ ├── chart.svg
│ │ ├── clipboard.svg
│ │ ├── component.svg
│ │ ├── configure.svg
│ │ ├── dashboard.svg
│ │ ├── documentation.svg
│ │ ├── drag.svg
│ │ ├── edit.svg
│ │ ├── email.svg
│ │ ├── example.svg
│ │ ├── excel.svg
│ │ ├── eye.svg
│ │ ├── finance.svg
│ │ ├── foreground.svg
│ │ ├── form.svg
│ │ ├── guide 2.svg
│ │ ├── guide.svg
│ │ ├── home.svg
│ │ ├── icon.svg
│ │ ├── international.svg
│ │ ├── language.svg
│ │ ├── link.svg
│ │ ├── list.svg
│ │ ├── lock.svg
│ │ ├── logo.svg
│ │ ├── logout.svg
│ │ ├── message.svg
│ │ ├── money.svg
│ │ ├── nested.svg
│ │ ├── password.svg
│ │ ├── pdf.svg
│ │ ├── people.svg
│ │ ├── peoples.svg
│ │ ├── qq.svg
│ │ ├── setting.svg
│ │ ├── shopping.svg
│ │ ├── size.svg
│ │ ├── star.svg
│ │ ├── subject.svg
│ │ ├── tab.svg
│ │ ├── table.svg
│ │ ├── teacher-man.svg
│ │ ├── teacher-women.svg
│ │ ├── theme.svg
│ │ ├── tijian.svg
│ │ ├── tree.svg
│ │ ├── user.svg
│ │ ├── wechat.svg
│ │ ├── wifi.svg
│ │ ├── wmax.svg
│ │ ├── wmin.svg
│ │ └── zip.svg
│ └── svgo.yml
├── main.js
├── mixin
│ ├── exportFile.js
│ ├── filterSelect.js
│ ├── financeConfirm.js
│ ├── pagination.js
│ ├── tables.js
│ └── utils.js
├── mock
│ ├── article.js
│ ├── index.js
│ ├── login.js
│ ├── remoteSearch.js
│ └── transaction.js
├── permission.js
├── plugins
│ ├── index.js
│ └── print.js
├── router
│ ├── index.js
│ └── modules
│ │ └── foreground
│ │ ├── apply.js
│ │ └── index.js
├── store
│ ├── getters.js
│ ├── index.js
│ └── modules
│ │ ├── app.js
│ │ ├── apply.js
│ │ ├── campus.js
│ │ ├── constant.js
│ │ ├── errorLog.js
│ │ ├── exportFile.js
│ │ ├── itemQuestionMsg.js
│ │ ├── permission.js
│ │ ├── tagsView.js
│ │ └── user.js
├── styles
│ ├── btn.scss
│ ├── dialog.scss
│ ├── element-ui.scss
│ ├── index.scss
│ ├── mixin.scss
│ ├── sidebar.scss
│ ├── theme.scss
│ ├── transition.scss
│ ├── uploadImg.scss
│ └── variables.scss
├── utils
│ ├── auth.js
│ ├── buried.js
│ ├── clickoutside.js
│ ├── createUniqueString.js
│ ├── excel.js
│ ├── findCom.js
│ ├── index.js
│ ├── initTheme.js
│ ├── permission.js
│ ├── request.js
│ └── validate.js
└── views
│ ├── components
│ ├── Achievement.vue
│ ├── CarBall.vue
│ ├── ChangePwd.vue
│ ├── CommTable.vue
│ ├── Container.vue
│ ├── CourseCard.vue
│ ├── Header.vue
│ ├── Kanban.vue
│ ├── MulitiHeader.vue
│ ├── Theme.vue
│ ├── ThemePicker.vue
│ ├── UpdateRecord.vue
│ └── UserSettings.vue
│ ├── dashboard
│ ├── components
│ │ ├── BarChart.vue
│ │ ├── LineChart.vue
│ │ ├── PanelGroup.vue
│ │ ├── PieChart.vue
│ │ ├── RaddarChart.vue
│ │ └── SolidPieChart.vue
│ ├── home.vue
│ └── index.vue
│ ├── errorPage
│ ├── 401.vue
│ └── 404.vue
│ ├── foreground
│ └── apply
│ │ ├── add.vue
│ │ ├── candidatePay.vue
│ │ ├── components
│ │ ├── ClassQuery.vue
│ │ ├── CourseCart.vue
│ │ └── SelectCourse.vue
│ │ ├── index.vue
│ │ ├── info.vue
│ │ ├── refundRecord.vue
│ │ └── student.vue
│ ├── layout
│ ├── Layout.vue
│ ├── components
│ │ ├── AppMain.vue
│ │ ├── FastNav.vue
│ │ ├── Navbar.vue
│ │ ├── Sidebar
│ │ │ ├── FixiOSBug.js
│ │ │ ├── Item.vue
│ │ │ ├── Link.vue
│ │ │ ├── SidebarItem.vue
│ │ │ └── index.vue
│ │ ├── TagsView.vue
│ │ ├── Tips.vue
│ │ ├── Weather.vue
│ │ └── index.js
│ └── mixin
│ │ └── ResizeHandler.js
│ ├── login
│ ├── authredirect.vue
│ └── index.vue
│ ├── redirect
│ └── index.vue
│ └── upload
│ └── index.vue
└── static
├── echarts
├── diy.js
└── echarts.min.js
├── rsa
└── jsencrypt.min3.0.0-rc.1.js
└── vue
├── axios.min@0.18.0.js
├── element-ui@2.12.0.css
├── element-ui@2.12.0.js
├── element-ui@2.8.2-theme-picker.css
├── element-ui@2.8.2-theme-picker.min.css
├── fonts
├── element-icons.ttf
└── element-icons.woff
├── vue-router.min@3.0.6.js
├── vue.min@2.5.22.js
└── vuex.min@3.1.0.js
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", {
4 | "modules": false,
5 | "targets": {
6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
7 | }
8 | }],
9 | "stage-2"
10 | ],
11 | "plugins": ["transform-vue-jsx", "transform-runtime"],
12 | "env": {
13 | "development":{
14 | "plugins": ["dynamic-import-node"]
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | end_of_line = lf
9 | insert_final_newline = true
10 | trim_trailing_whitespace = true
11 |
12 | [*.md]
13 | insert_final_newline = false
14 | trim_trailing_whitespace = false
15 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | build/*.js
2 | config/*.js
3 | src/assets
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | **/*.log
8 |
9 | test/unit/coverage
10 | test/e2e/reports
11 | selenium-debug.log
12 |
13 | # Editor directories and files
14 | .idea
15 | .vscode
16 | *.suo
17 | *.ntvs*
18 | *.njsproj
19 | *.sln
20 |
21 | package-lock.json
22 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | "postcss-import": {},
6 | "postcss-url": {},
7 | // to edit target browsers: use "browserslist" field in package.json
8 | "autoprefixer": {}
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js: stable
3 | script: npm run test
4 | notifications:
5 | email: false
6 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017-present PanJiaChen
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Vue Element 主题切换Demo
2 |
3 | ## [在线预览地址](https://aaminly.github.io/vue-element-theme/dist/)
4 |
5 | ## 技术栈:
6 |
7 | vue + elementUI
8 |
--------------------------------------------------------------------------------
/build/build.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | require('./check-versions')()
3 |
4 | const ora = require('ora')
5 | const rm = require('rimraf')
6 | const path = require('path')
7 | const chalk = require('chalk')
8 | const webpack = require('webpack')
9 | const config = require('../config')
10 | const webpackConfig = require('./webpack.prod.conf')
11 | var connect = require('connect')
12 | var serveStatic = require('serve-static')
13 |
14 | const spinner = ora(
15 | 'building for ' + process.env.env_config + ' environment...'
16 | )
17 | spinner.start()
18 |
19 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
20 | if (err) throw err
21 | webpack(webpackConfig, (err, stats) => {
22 | spinner.stop()
23 | if (err) throw err
24 | process.stdout.write(
25 | stats.toString({
26 | colors: true,
27 | modules: false,
28 | children: false,
29 | chunks: false,
30 | chunkModules: false
31 | }) + '\n\n'
32 | )
33 |
34 | if (stats.hasErrors()) {
35 | console.log(chalk.red(' Build failed with errors.\n'))
36 | process.exit(1)
37 | }
38 |
39 | console.log(chalk.cyan(' Build complete.\n'))
40 | console.log(
41 | chalk.yellow(
42 | ' Tip: built files are meant to be served over an HTTP server.\n' +
43 | " Opening index.html over file:// won't work.\n"
44 | )
45 | )
46 |
47 | if (process.env.npm_config_preview) {
48 | const port = 9526
49 | const host = 'http://localhost:' + port
50 | const basePath = config.build.assetsPublicPath
51 | const app = connect()
52 |
53 | app.use(
54 | basePath,
55 | serveStatic('./dist', {
56 | index: ['index.html', '/']
57 | })
58 | )
59 |
60 | app.listen(port, function() {
61 | console.log(
62 | chalk.green(`> Listening at http://localhost:${port}${basePath}`)
63 | )
64 | })
65 | }
66 | })
67 | })
68 |
--------------------------------------------------------------------------------
/build/check-versions.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const chalk = require('chalk')
3 | const semver = require('semver')
4 | const packageConfig = require('../package.json')
5 | const shell = require('shelljs')
6 |
7 | function exec(cmd) {
8 | return require('child_process')
9 | .execSync(cmd)
10 | .toString()
11 | .trim()
12 | }
13 |
14 | const versionRequirements = [
15 | {
16 | name: 'node',
17 | currentVersion: semver.clean(process.version),
18 | versionRequirement: packageConfig.engines.node
19 | }
20 | ]
21 |
22 | if (shell.which('npm')) {
23 | versionRequirements.push({
24 | name: 'npm',
25 | currentVersion: exec('npm --version'),
26 | versionRequirement: packageConfig.engines.npm
27 | })
28 | }
29 |
30 | module.exports = function() {
31 | const warnings = []
32 |
33 | for (let i = 0; i < versionRequirements.length; i++) {
34 | const mod = versionRequirements[i]
35 |
36 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
37 | warnings.push(
38 | mod.name +
39 | ': ' +
40 | chalk.red(mod.currentVersion) +
41 | ' should be ' +
42 | chalk.green(mod.versionRequirement)
43 | )
44 | }
45 | }
46 |
47 | if (warnings.length) {
48 | console.log('')
49 | console.log(
50 | chalk.yellow(
51 | 'To use this template, you must update following to modules:'
52 | )
53 | )
54 | console.log()
55 |
56 | for (let i = 0; i < warnings.length; i++) {
57 | const warning = warnings[i]
58 | console.log(' ' + warning)
59 | }
60 |
61 | console.log()
62 | process.exit(1)
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/build/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/build/logo.png
--------------------------------------------------------------------------------
/build/utils.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const path = require('path')
3 | const config = require('../config')
4 | const MiniCssExtractPlugin = require('mini-css-extract-plugin')
5 | const packageConfig = require('../package.json')
6 |
7 | exports.assetsPath = function(_path) {
8 | const assetsSubDirectory =
9 | process.env.NODE_ENV === 'production'
10 | ? config.build.assetsSubDirectory
11 | : config.dev.assetsSubDirectory
12 |
13 | return path.posix.join(assetsSubDirectory, _path)
14 | }
15 |
16 | exports.cssLoaders = function(options) {
17 | options = options || {}
18 |
19 | const cssLoader = {
20 | loader: 'css-loader',
21 | options: {
22 | sourceMap: options.sourceMap
23 | }
24 | }
25 |
26 | const postcssLoader = {
27 | loader: 'postcss-loader',
28 | options: {
29 | sourceMap: options.sourceMap
30 | }
31 | }
32 |
33 | // generate loader string to be used with extract text plugin
34 | function generateLoaders(loader, loaderOptions) {
35 | const loaders = []
36 |
37 | // Extract CSS when that option is specified
38 | // (which is the case during production build)
39 | if (options.extract) {
40 | loaders.push(MiniCssExtractPlugin.loader)
41 | } else {
42 | loaders.push('vue-style-loader')
43 | }
44 |
45 | loaders.push(cssLoader)
46 |
47 | if (options.usePostCSS) {
48 | loaders.push(postcssLoader)
49 | }
50 |
51 | if (loader) {
52 | loaders.push({
53 | loader: loader + '-loader',
54 | options: Object.assign({}, loaderOptions, {
55 | sourceMap: options.sourceMap
56 | })
57 | })
58 | }
59 |
60 | return loaders
61 | }
62 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html
63 | return {
64 | css: generateLoaders(),
65 | postcss: generateLoaders(),
66 | less: generateLoaders('less'),
67 | sass: generateLoaders('sass', {
68 | indentedSyntax: true
69 | }),
70 | scss: generateLoaders('sass'),
71 | stylus: generateLoaders('stylus'),
72 | styl: generateLoaders('stylus')
73 | }
74 | }
75 |
76 | // Generate loaders for standalone style files (outside of .vue)
77 | exports.styleLoaders = function(options) {
78 | const output = []
79 | const loaders = exports.cssLoaders(options)
80 |
81 | for (const extension in loaders) {
82 | const loader = loaders[extension]
83 | output.push({
84 | test: new RegExp('\\.' + extension + '$'),
85 | use: loader
86 | })
87 | }
88 |
89 | return output
90 | }
91 |
92 | exports.createNotifierCallback = () => {
93 | const notifier = require('node-notifier')
94 |
95 | return (severity, errors) => {
96 | if (severity !== 'error') return
97 |
98 | const error = errors[0]
99 | const filename = error.file && error.file.split('!').pop()
100 |
101 | notifier.notify({
102 | title: packageConfig.name,
103 | message: severity + ': ' + error.name,
104 | subtitle: filename || '',
105 | icon: path.join(__dirname, 'logo.png')
106 | })
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/build/vue-loader.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | module.exports = {
4 | //You can set the vue-loader configuration by yourself.
5 | }
6 |
--------------------------------------------------------------------------------
/build/webpack.dev.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const path = require('path')
3 | const utils = require('./utils')
4 | const webpack = require('webpack')
5 | const config = require('../config')
6 | const merge = require('webpack-merge')
7 | const baseWebpackConfig = require('./webpack.base.conf')
8 | const HtmlWebpackPlugin = require('html-webpack-plugin')
9 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
10 | const portfinder = require('portfinder')
11 |
12 | function resolve(dir) {
13 | return path.join(__dirname, '..', dir)
14 | }
15 |
16 | const HOST = process.env.HOST
17 | const PORT = process.env.PORT && Number(process.env.PORT)
18 |
19 | const devWebpackConfig = merge(baseWebpackConfig, {
20 | mode: 'development',
21 | module: {
22 | rules: utils.styleLoaders({
23 | sourceMap: config.dev.cssSourceMap,
24 | usePostCSS: true
25 | })
26 | },
27 | // cheap-module-eval-source-map is faster for development
28 | devtool: config.dev.devtool,
29 |
30 | // these devServer options should be customized in /config/index.js
31 | devServer: {
32 | clientLogLevel: 'warning',
33 | historyApiFallback: true,
34 | hot: true,
35 | compress: true,
36 | host: HOST || config.dev.host,
37 | port: PORT || config.dev.port,
38 | open: config.dev.autoOpenBrowser,
39 | overlay: config.dev.errorOverlay
40 | ? { warnings: false, errors: true }
41 | : false,
42 | publicPath: config.dev.assetsPublicPath,
43 | proxy: config.dev.proxyTable,
44 | quiet: true, // necessary for FriendlyErrorsPlugin
45 | watchOptions: {
46 | poll: config.dev.poll
47 | }
48 | },
49 | plugins: [
50 | new webpack.DefinePlugin({
51 | 'process.env': require('../config/dev.env')
52 | }),
53 | new webpack.HotModuleReplacementPlugin(),
54 | // https://github.com/ampedandwired/html-webpack-plugin
55 | new HtmlWebpackPlugin({
56 | filename: 'index.html',
57 | template: 'index.html',
58 | inject: true,
59 | favicon: resolve('favicon.ico'),
60 | title: 'vue-element-admin',
61 | templateParameters: {
62 | BASE_URL: config.dev.assetsPublicPath + config.dev.assetsSubDirectory,
63 | },
64 | }),
65 | ]
66 | })
67 |
68 | module.exports = new Promise((resolve, reject) => {
69 | portfinder.basePort = process.env.PORT || config.dev.port
70 | portfinder.getPort((err, port) => {
71 | if (err) {
72 | reject(err)
73 | } else {
74 | // publish the new Port, necessary for e2e tests
75 | process.env.PORT = port
76 | // add port to devServer config
77 | devWebpackConfig.devServer.port = port
78 |
79 | // Add FriendlyErrorsPlugin
80 | devWebpackConfig.plugins.push(
81 | new FriendlyErrorsPlugin({
82 | compilationSuccessInfo: {
83 | messages: [
84 | `Your application is running here: http://${
85 | devWebpackConfig.devServer.host
86 | }:${port}`
87 | ]
88 | },
89 | onErrors: config.dev.notifyOnErrors
90 | ? utils.createNotifierCallback()
91 | : undefined
92 | })
93 | )
94 |
95 | resolve(devWebpackConfig)
96 | }
97 | })
98 | })
99 |
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | NODE_ENV: '"development"',
3 | ENV_CONFIG: '"dev"',
4 | BRANCHES: '"主干分支"',
5 | BASE_API: '"http://192.168.1.162:9003/"'
6 | }
7 |
--------------------------------------------------------------------------------
/config/local.env.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | NODE_ENV: '"production"',
3 | ENV_CONFIG: '"local"',
4 | BASE_API: '"/"'
5 | }
6 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | NODE_ENV: '"production"',
3 | ENV_CONFIG: '"prod"',
4 | BASE_API: '"http://127.0.0.1"'
5 | }
6 |
--------------------------------------------------------------------------------
/config/sit.env.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | NODE_ENV: '"production"',
3 | ENV_CONFIG: '"sit"',
4 | BASE_API: '"http://www.aabbvv.com:8888/"'
5 | }
6 |
--------------------------------------------------------------------------------
/config/sitali.env.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | NODE_ENV: '"production"',
3 | ENV_CONFIG: '"sitali"',
4 | BASE_API: '"http://47.93.162.86:8088/V4.0/api/"'
5 | }
6 |
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/favicon.ico
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 | 业务报名系统-BusinessRegistration
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
17 |
--------------------------------------------------------------------------------
/src/api/index.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 |
3 | // 获取字典
4 | export const getSysDictList = data =>
5 | request({
6 | url: '/a/backgroundSystem/sysDict/findSysDictList',
7 | data
8 | })
9 |
10 | // 获取用户列表
11 | export const getSysUserListSingle = data =>
12 | request({
13 | url: '/a/sysManage/findSysUserListSingle',
14 | data
15 | })
16 |
17 | // 获取教师列表
18 | export const getTeacherListSingle = data =>
19 | request({
20 | url: '/a/teacher/teacherAbout/findTeacherListSingle',
21 | data
22 | })
23 |
24 | // 获取教室列表
25 | export const getClassroomListSingle = data =>
26 | request({
27 | url: '/a/backgroundSystem/classroom/findClassroomListSingle',
28 | data
29 | })
30 |
31 | // 获取课程安排规律列表
32 | export const getDateslotListSingle = data =>
33 | request({
34 | url: '/a/backgroundSystem/dateslot/findDateslotListSingle',
35 | data
36 | })
37 |
38 | // 首页第一部分统计(包括总收入,总退费,在读学员数,确认收入)
39 | export const getFirstStatistics = data =>
40 | request({
41 | url: '/a/home/findFirstStatistics',
42 | data
43 | })
44 |
45 | // 首页第二部分统计(包括注册人数,订单数)
46 | export const getSecondStatistics = data =>
47 | request({
48 | url: '/a/home/findSecondStatistics',
49 | data
50 | })
51 |
52 | // 首页第三部分统计(包括转班通知,调课通知)
53 | export const getThreeStatistics = data =>
54 | request({
55 | url: '/a/home/findThreeStatistics',
56 | data
57 | })
58 |
59 | // 首页第四部分统计(包括学员年级,学员来源,近30天咨询转化)
60 | export const getFourStatistics = data =>
61 | request({
62 | url: '/a/home/findFourStatistics',
63 | data
64 | })
65 |
66 | // 通过卡号获取银行卡名称
67 | export const getBank = data =>
68 | request({
69 | url: '/a/sysManage/getBank',
70 | params: data,
71 | method: 'GET'
72 | })
73 |
74 | // 获取实时天气
75 | export const getWeather = data =>
76 | request({
77 | url: '/a/home/getWeather',
78 | data
79 | })
80 |
81 | // 图片上传
82 | export const uploadImg = data =>
83 | request({
84 | url: '/a/sysManage/uploadImg',
85 | data
86 | })
87 |
--------------------------------------------------------------------------------
/src/api/login.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 |
3 | // 登录
4 | export const login = (username, password) => {
5 | return request({
6 | url: '/user/authenCheck',
7 | data: {
8 | userPhoneAndName: username,
9 | password
10 | }
11 | })
12 | }
13 | // 获取用户信息
14 | export const getUserInfo = token => {
15 | token = token.split(';')
16 | return request({
17 | url: '/a/sysManage/getUserLoginInfo',
18 | data: {
19 | id: token[0]
20 | }
21 | })
22 | }
23 |
24 | // 登出
25 | export const logout = () => {
26 | return request({
27 | url: '/user/logout'
28 | })
29 | }
30 |
31 | // 发送验证码
32 | export const getAuthenCode = data => {
33 | return request({
34 | url: '/user/getAuthenCode',
35 | data
36 | })
37 | }
38 |
39 | // 忘记或修改密码
40 | export const changePassword = data => {
41 | return request({
42 | url: '/user/changePassword',
43 | data
44 | })
45 | }
46 |
--------------------------------------------------------------------------------
/src/api/qiniu.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 |
3 | export function getToken() {
4 | return request({
5 | url: '/qiniu/upload/token', // 假地址 自行替换
6 | method: 'get'
7 | })
8 | }
9 |
--------------------------------------------------------------------------------
/src/assets/401_images/401.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/401_images/401.gif
--------------------------------------------------------------------------------
/src/assets/404_images/404.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/404_images/404.png
--------------------------------------------------------------------------------
/src/assets/404_images/404_cloud.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/404_images/404_cloud.png
--------------------------------------------------------------------------------
/src/assets/custom-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/custom-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/custom-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/custom-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/font/HelveticaNeueLTPro-ThEx.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/font/HelveticaNeueLTPro-ThEx.ttf
--------------------------------------------------------------------------------
/src/assets/images/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/bg.png
--------------------------------------------------------------------------------
/src/assets/images/sex-man.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/sex-man.png
--------------------------------------------------------------------------------
/src/assets/images/sex-women.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/sex-women.png
--------------------------------------------------------------------------------
/src/assets/images/teacher-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/teacher-bg.png
--------------------------------------------------------------------------------
/src/assets/images/teacher-uploader-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/teacher-uploader-bg.png
--------------------------------------------------------------------------------
/src/assets/images/teacher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/teacher.png
--------------------------------------------------------------------------------
/src/assets/images/teacher_default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/teacher_default.png
--------------------------------------------------------------------------------
/src/assets/images/theme-img/blackgold.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/theme-img/blackgold.png
--------------------------------------------------------------------------------
/src/assets/images/theme-img/fox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/theme-img/fox.png
--------------------------------------------------------------------------------
/src/assets/images/theme-img/harvestjoy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/theme-img/harvestjoy.png
--------------------------------------------------------------------------------
/src/assets/images/theme-img/maidenheart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/theme-img/maidenheart.png
--------------------------------------------------------------------------------
/src/assets/images/theme-img/minions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/theme-img/minions.png
--------------------------------------------------------------------------------
/src/assets/images/theme-img/naughtybear.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/theme-img/naughtybear.png
--------------------------------------------------------------------------------
/src/assets/images/theme-img/peachblossom.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/theme-img/peachblossom.png
--------------------------------------------------------------------------------
/src/assets/images/theme-img/soot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/theme-img/soot.png
--------------------------------------------------------------------------------
/src/assets/images/theme-img/thebigblue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/theme-img/thebigblue.png
--------------------------------------------------------------------------------
/src/assets/images/theme-img/universe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/theme-img/universe.png
--------------------------------------------------------------------------------
/src/assets/images/weather/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/weather/1.png
--------------------------------------------------------------------------------
/src/assets/images/weather/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/weather/2.png
--------------------------------------------------------------------------------
/src/assets/images/weather/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/weather/3.png
--------------------------------------------------------------------------------
/src/assets/images/weather/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/weather/4.png
--------------------------------------------------------------------------------
/src/assets/images/weather/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/images/weather/5.png
--------------------------------------------------------------------------------
/src/assets/theme/blackgold-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/blackgold-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/theme/blackgold-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/blackgold-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/theme/blackgold-theme/images/queren.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/blackgold-theme/images/queren.png
--------------------------------------------------------------------------------
/src/assets/theme/blackgold-theme/images/shu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/blackgold-theme/images/shu.png
--------------------------------------------------------------------------------
/src/assets/theme/blackgold-theme/images/slidebar-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/blackgold-theme/images/slidebar-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/blackgold-theme/images/tuifei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/blackgold-theme/images/tuifei.png
--------------------------------------------------------------------------------
/src/assets/theme/blackgold-theme/images/zaidu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/blackgold-theme/images/zaidu.png
--------------------------------------------------------------------------------
/src/assets/theme/blackgold-theme/images/zongshou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/blackgold-theme/images/zongshou.png
--------------------------------------------------------------------------------
/src/assets/theme/fox-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/fox-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/theme/fox-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/fox-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/theme/fox-theme/images/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/fox-theme/images/bg.png
--------------------------------------------------------------------------------
/src/assets/theme/fox-theme/images/queren.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/fox-theme/images/queren.png
--------------------------------------------------------------------------------
/src/assets/theme/fox-theme/images/shu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/fox-theme/images/shu.png
--------------------------------------------------------------------------------
/src/assets/theme/fox-theme/images/slidebar-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/fox-theme/images/slidebar-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/fox-theme/images/slidebar-bom-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/fox-theme/images/slidebar-bom-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/fox-theme/images/tuifei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/fox-theme/images/tuifei.png
--------------------------------------------------------------------------------
/src/assets/theme/fox-theme/images/zaidu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/fox-theme/images/zaidu.png
--------------------------------------------------------------------------------
/src/assets/theme/fox-theme/images/zongshou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/fox-theme/images/zongshou.png
--------------------------------------------------------------------------------
/src/assets/theme/harvestjoy-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/harvestjoy-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/theme/harvestjoy-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/harvestjoy-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/theme/harvestjoy-theme/images/queren.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/harvestjoy-theme/images/queren.png
--------------------------------------------------------------------------------
/src/assets/theme/harvestjoy-theme/images/shu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/harvestjoy-theme/images/shu.png
--------------------------------------------------------------------------------
/src/assets/theme/harvestjoy-theme/images/slidebar-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/harvestjoy-theme/images/slidebar-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/harvestjoy-theme/images/tuifei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/harvestjoy-theme/images/tuifei.png
--------------------------------------------------------------------------------
/src/assets/theme/harvestjoy-theme/images/zaidu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/harvestjoy-theme/images/zaidu.png
--------------------------------------------------------------------------------
/src/assets/theme/harvestjoy-theme/images/zongshou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/harvestjoy-theme/images/zongshou.png
--------------------------------------------------------------------------------
/src/assets/theme/maidenheart-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/maidenheart-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/theme/maidenheart-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/maidenheart-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/theme/maidenheart-theme/images/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/maidenheart-theme/images/bg.png
--------------------------------------------------------------------------------
/src/assets/theme/maidenheart-theme/images/queren.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/maidenheart-theme/images/queren.png
--------------------------------------------------------------------------------
/src/assets/theme/maidenheart-theme/images/shu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/maidenheart-theme/images/shu.png
--------------------------------------------------------------------------------
/src/assets/theme/maidenheart-theme/images/slidebar-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/maidenheart-theme/images/slidebar-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/maidenheart-theme/images/tuifei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/maidenheart-theme/images/tuifei.png
--------------------------------------------------------------------------------
/src/assets/theme/maidenheart-theme/images/zaidu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/maidenheart-theme/images/zaidu.png
--------------------------------------------------------------------------------
/src/assets/theme/maidenheart-theme/images/zongshou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/maidenheart-theme/images/zongshou.png
--------------------------------------------------------------------------------
/src/assets/theme/minions-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/minions-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/theme/minions-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/minions-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/theme/minions-theme/images/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/minions-theme/images/bg.png
--------------------------------------------------------------------------------
/src/assets/theme/minions-theme/images/queren.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/minions-theme/images/queren.png
--------------------------------------------------------------------------------
/src/assets/theme/minions-theme/images/shu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/minions-theme/images/shu.png
--------------------------------------------------------------------------------
/src/assets/theme/minions-theme/images/slidebar-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/minions-theme/images/slidebar-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/minions-theme/images/tuifei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/minions-theme/images/tuifei.png
--------------------------------------------------------------------------------
/src/assets/theme/minions-theme/images/zaidu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/minions-theme/images/zaidu.png
--------------------------------------------------------------------------------
/src/assets/theme/minions-theme/images/zongshou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/minions-theme/images/zongshou.png
--------------------------------------------------------------------------------
/src/assets/theme/naughtybear-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/naughtybear-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/theme/naughtybear-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/naughtybear-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/theme/naughtybear-theme/images/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/naughtybear-theme/images/bg.png
--------------------------------------------------------------------------------
/src/assets/theme/naughtybear-theme/images/queren.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/naughtybear-theme/images/queren.png
--------------------------------------------------------------------------------
/src/assets/theme/naughtybear-theme/images/shu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/naughtybear-theme/images/shu.png
--------------------------------------------------------------------------------
/src/assets/theme/naughtybear-theme/images/slidebar-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/naughtybear-theme/images/slidebar-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/naughtybear-theme/images/tuifei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/naughtybear-theme/images/tuifei.png
--------------------------------------------------------------------------------
/src/assets/theme/naughtybear-theme/images/zaidu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/naughtybear-theme/images/zaidu.png
--------------------------------------------------------------------------------
/src/assets/theme/naughtybear-theme/images/zongshou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/naughtybear-theme/images/zongshou.png
--------------------------------------------------------------------------------
/src/assets/theme/peachblossom-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/peachblossom-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/theme/peachblossom-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/peachblossom-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/theme/peachblossom-theme/images/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/peachblossom-theme/images/bg.png
--------------------------------------------------------------------------------
/src/assets/theme/peachblossom-theme/images/queren.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/peachblossom-theme/images/queren.png
--------------------------------------------------------------------------------
/src/assets/theme/peachblossom-theme/images/shu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/peachblossom-theme/images/shu.png
--------------------------------------------------------------------------------
/src/assets/theme/peachblossom-theme/images/slidebar-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/peachblossom-theme/images/slidebar-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/peachblossom-theme/images/tuifei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/peachblossom-theme/images/tuifei.png
--------------------------------------------------------------------------------
/src/assets/theme/peachblossom-theme/images/zaidu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/peachblossom-theme/images/zaidu.png
--------------------------------------------------------------------------------
/src/assets/theme/peachblossom-theme/images/zongshou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/peachblossom-theme/images/zongshou.png
--------------------------------------------------------------------------------
/src/assets/theme/soot-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/soot-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/theme/soot-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/soot-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/theme/soot-theme/images/queren.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/soot-theme/images/queren.png
--------------------------------------------------------------------------------
/src/assets/theme/soot-theme/images/shu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/soot-theme/images/shu.png
--------------------------------------------------------------------------------
/src/assets/theme/soot-theme/images/slidebar-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/soot-theme/images/slidebar-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/soot-theme/images/tuifei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/soot-theme/images/tuifei.png
--------------------------------------------------------------------------------
/src/assets/theme/soot-theme/images/zaidu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/soot-theme/images/zaidu.png
--------------------------------------------------------------------------------
/src/assets/theme/soot-theme/images/zongshou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/soot-theme/images/zongshou.png
--------------------------------------------------------------------------------
/src/assets/theme/thebigblue-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/thebigblue-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/theme/thebigblue-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/thebigblue-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/theme/thebigblue-theme/images/queren.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/thebigblue-theme/images/queren.png
--------------------------------------------------------------------------------
/src/assets/theme/thebigblue-theme/images/shu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/thebigblue-theme/images/shu.png
--------------------------------------------------------------------------------
/src/assets/theme/thebigblue-theme/images/slidebar-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/thebigblue-theme/images/slidebar-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/thebigblue-theme/images/tuifei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/thebigblue-theme/images/tuifei.png
--------------------------------------------------------------------------------
/src/assets/theme/thebigblue-theme/images/zaidu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/thebigblue-theme/images/zaidu.png
--------------------------------------------------------------------------------
/src/assets/theme/thebigblue-theme/images/zongshou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/thebigblue-theme/images/zongshou.png
--------------------------------------------------------------------------------
/src/assets/theme/universe-theme/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/universe-theme/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/theme/universe-theme/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/universe-theme/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/theme/universe-theme/images/queren.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/universe-theme/images/queren.png
--------------------------------------------------------------------------------
/src/assets/theme/universe-theme/images/shu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/universe-theme/images/shu.png
--------------------------------------------------------------------------------
/src/assets/theme/universe-theme/images/slidebar-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/universe-theme/images/slidebar-bg.png
--------------------------------------------------------------------------------
/src/assets/theme/universe-theme/images/tuifei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/universe-theme/images/tuifei.png
--------------------------------------------------------------------------------
/src/assets/theme/universe-theme/images/zaidu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/universe-theme/images/zaidu.png
--------------------------------------------------------------------------------
/src/assets/theme/universe-theme/images/zongshou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/src/assets/theme/universe-theme/images/zongshou.png
--------------------------------------------------------------------------------
/src/components/Breadcrumb/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 | {{ item.meta.title }}
13 | {{ item.meta.title }}
14 |
15 |
16 |
17 |
18 |
19 |
20 |
67 |
68 |
82 |
--------------------------------------------------------------------------------
/src/components/CountNum/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
13 |
14 |
55 |
--------------------------------------------------------------------------------
/src/components/CuttingImg/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
25 |
26 |
27 |
83 |
--------------------------------------------------------------------------------
/src/components/Hamburger/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
30 |
31 |
32 |
33 |
48 |
49 |
64 |
--------------------------------------------------------------------------------
/src/components/ItemQuestion/index.vue:
--------------------------------------------------------------------------------
1 | /**
2 | * Author: qianweizhu
3 | * Date: 2019/10/21
4 | * Time: 16:28
5 | */
6 |
7 |
8 |
9 |
10 |
11 |
12 |
27 |
28 |
33 |
--------------------------------------------------------------------------------
/src/components/QuestionNaire/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
21 |
22 |
23 |
43 |
44 |
51 |
--------------------------------------------------------------------------------
/src/components/ScrollPane/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
63 |
64 |
80 |
--------------------------------------------------------------------------------
/src/components/SpeedTest/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
21 |
--------------------------------------------------------------------------------
/src/components/Sticky/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
14 |
96 |
97 |
105 |
--------------------------------------------------------------------------------
/src/components/SvgIcon/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
34 |
35 |
44 |
--------------------------------------------------------------------------------
/src/components/Toast/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ message }}
5 |
6 |
7 |
8 |
27 |
28 |
51 |
--------------------------------------------------------------------------------
/src/components/Toast/toast.js:
--------------------------------------------------------------------------------
1 | import Toast from './index'
2 |
3 | export default {
4 | install(Vue) {
5 | const ToastTpl = Vue.extend(Toast)
6 | const tpl = new ToastTpl().$mount()
7 | let timer = null
8 | const append = (msg, type, isObj = false) => {
9 | type && (tpl.type = type)
10 | let message = msg
11 | if (isObj) {
12 | tpl.type = msg.type
13 | message = msg.message
14 | }
15 | tpl.message = message
16 | timer || document.body.appendChild(tpl.$el)
17 | clearTimeout(timer)
18 | timer = setTimeout(() => {
19 | document.body.removeChild(tpl.$el)
20 | timer = null
21 | }, msg.duration || 2000)
22 | }
23 | Vue.prototype.$toast = (msg, type) =>
24 | append(msg, type, typeof msg === 'object')
25 | ;['success', 'error', 'warning'].forEach(type => {
26 | Vue.prototype.$toast[type] = msg => Vue.prototype.$toast(msg, type)
27 | })
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/directive/el-dragDialog/drag.js:
--------------------------------------------------------------------------------
1 | export default {
2 | bind(el, binding, vnode) {
3 | const dialogHeaderEl = el.querySelector('.el-dialog__header')
4 | const dragDom = el.querySelector('.el-dialog')
5 | dialogHeaderEl.style.cssText += ';cursor:move;'
6 | dragDom.style.cssText += ';top:0px;'
7 |
8 | // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
9 | const getStyle = (function() {
10 | if (window.document.currentStyle) {
11 | return (dom, attr) => dom.currentStyle[attr]
12 | } else {
13 | return (dom, attr) => getComputedStyle(dom, false)[attr]
14 | }
15 | })()
16 |
17 | dialogHeaderEl.onmousedown = (e) => {
18 | // 鼠标按下,计算当前元素距离可视区的距离
19 | const disX = e.clientX - dialogHeaderEl.offsetLeft
20 | const disY = e.clientY - dialogHeaderEl.offsetTop
21 |
22 | const dragDomWidth = dragDom.offsetWidth
23 | const dragDomHeight = dragDom.offsetHeight
24 |
25 | const screenWidth = document.body.clientWidth
26 | const screenHeight = document.body.clientHeight
27 |
28 | const minDragDomLeft = dragDom.offsetLeft
29 | const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
30 |
31 | const minDragDomTop = dragDom.offsetTop
32 | const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
33 |
34 | // 获取到的值带px 正则匹配替换
35 | let styL = getStyle(dragDom, 'left')
36 | let styT = getStyle(dragDom, 'top')
37 |
38 | if (styL.includes('%')) {
39 | styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
40 | styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
41 | } else {
42 | styL = +styL.replace(/\px/g, '')
43 | styT = +styT.replace(/\px/g, '')
44 | }
45 |
46 | document.onmousemove = function(e) {
47 | // 通过事件委托,计算移动的距离
48 | let left = e.clientX - disX
49 | let top = e.clientY - disY
50 |
51 | // 边界处理
52 | if (-(left) > minDragDomLeft) {
53 | left = -minDragDomLeft
54 | } else if (left > maxDragDomLeft) {
55 | left = maxDragDomLeft
56 | }
57 |
58 | if (-(top) > minDragDomTop) {
59 | top = -minDragDomTop
60 | } else if (top > maxDragDomTop) {
61 | top = maxDragDomTop
62 | }
63 |
64 | // 移动当前元素
65 | dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
66 |
67 | // emit onDrag event
68 | vnode.child.$emit('dragDialog')
69 | }
70 |
71 | document.onmouseup = function(e) {
72 | document.onmousemove = null
73 | document.onmouseup = null
74 | }
75 | }
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/src/directive/el-dragDialog/index.js:
--------------------------------------------------------------------------------
1 | import drag from './drag'
2 |
3 | const install = function(Vue) {
4 | Vue.directive('el-drag-dialog', drag)
5 | }
6 |
7 | if (window.Vue) {
8 | window['el-drag-dialog'] = drag
9 | Vue.use(install); // eslint-disable-line
10 | }
11 |
12 | drag.install = install
13 | export default drag
14 |
--------------------------------------------------------------------------------
/src/directive/permission/index.js:
--------------------------------------------------------------------------------
1 | import permission from './permission'
2 |
3 | const install = function(Vue) {
4 | Vue.directive('permission', permission)
5 | }
6 |
7 | if (window.Vue) {
8 | window['permission'] = permission
9 | Vue.use(install) // eslint-disable-line
10 | }
11 |
12 | permission.install = install
13 | export default permission
14 |
--------------------------------------------------------------------------------
/src/directive/permission/permission.js:
--------------------------------------------------------------------------------
1 | import store from '@/store'
2 | import { superAdminId } from '@/utils/auth'
3 |
4 | export default {
5 | inserted(el, binding, vnode) {
6 | const { value } = binding
7 | const roles = store.getters && store.getters.roles
8 |
9 | if (value && value instanceof Array && value.length > 0) {
10 | const permissionRoles = value
11 |
12 | const hasPermission = roles.some(role => {
13 | return permissionRoles.includes(role)
14 | })
15 |
16 | if (!hasPermission && store.getters.userInfo.id !== superAdminId) {
17 | el.parentNode && el.parentNode.removeChild(el)
18 | }
19 | } else {
20 | throw new Error(`need roles! Like v-permission="['admin','editor']"`)
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/directive/sticky.js:
--------------------------------------------------------------------------------
1 | const vueSticky = {}
2 | let listenAction
3 | vueSticky.install = Vue => {
4 | Vue.directive('sticky', {
5 | inserted(el, binding) {
6 | const params = binding.value || {}
7 | const stickyTop = params.stickyTop || 0
8 | const zIndex = params.zIndex || 1000
9 | const elStyle = el.style
10 |
11 | elStyle.position = '-webkit-sticky'
12 | elStyle.position = 'sticky'
13 | // if the browser support css sticky(Currently Safari, Firefox and Chrome Canary)
14 | // if (~elStyle.position.indexOf('sticky')) {
15 | // elStyle.top = `${stickyTop}px`;
16 | // elStyle.zIndex = zIndex;
17 | // return
18 | // }
19 | const elHeight = el.getBoundingClientRect().height
20 | const elWidth = el.getBoundingClientRect().width
21 | elStyle.cssText = `top: ${stickyTop}px; z-index: ${zIndex}`
22 |
23 | const parentElm = el.parentNode || document.documentElement
24 | const placeholder = document.createElement('div')
25 | placeholder.style.display = 'none'
26 | placeholder.style.width = `${elWidth}px`
27 | placeholder.style.height = `${elHeight}px`
28 | parentElm.insertBefore(placeholder, el)
29 |
30 | let active = false
31 |
32 | const getScroll = (target, top) => {
33 | const prop = top ? 'pageYOffset' : 'pageXOffset'
34 | const method = top ? 'scrollTop' : 'scrollLeft'
35 | let ret = target[prop]
36 | if (typeof ret !== 'number') {
37 | ret = window.document.documentElement[method]
38 | }
39 | return ret
40 | }
41 |
42 | const sticky = () => {
43 | if (active) {
44 | return
45 | }
46 | if (!elStyle.height) {
47 | elStyle.height = `${el.offsetHeight}px`
48 | }
49 |
50 | elStyle.position = 'fixed'
51 | elStyle.width = `${elWidth}px`
52 | placeholder.style.display = 'inline-block'
53 | active = true
54 | }
55 |
56 | const reset = () => {
57 | if (!active) {
58 | return
59 | }
60 |
61 | elStyle.position = ''
62 | placeholder.style.display = 'none'
63 | active = false
64 | }
65 |
66 | const check = () => {
67 | const scrollTop = getScroll(window, true)
68 | const offsetTop = el.getBoundingClientRect().top
69 | if (offsetTop < stickyTop) {
70 | sticky()
71 | } else {
72 | if (scrollTop < elHeight + stickyTop) {
73 | reset()
74 | }
75 | }
76 | }
77 | listenAction = () => {
78 | check()
79 | }
80 |
81 | window.addEventListener('scroll', listenAction)
82 | },
83 |
84 | unbind() {
85 | window.removeEventListener('scroll', listenAction)
86 | }
87 | })
88 | }
89 |
90 | export default vueSticky
91 |
92 |
--------------------------------------------------------------------------------
/src/directive/waves/index.js:
--------------------------------------------------------------------------------
1 | import waves from './waves'
2 |
3 | const install = function(Vue) {
4 | Vue.directive('waves', waves)
5 | }
6 |
7 | if (window.Vue) {
8 | window.waves = waves
9 | Vue.use(install); // eslint-disable-line
10 | }
11 |
12 | waves.install = install
13 | export default waves
14 |
--------------------------------------------------------------------------------
/src/directive/waves/waves.css:
--------------------------------------------------------------------------------
1 | .waves-ripple {
2 | position: absolute;
3 | border-radius: 100%;
4 | background-color: rgba(0, 0, 0, 0.15);
5 | background-clip: padding-box;
6 | pointer-events: none;
7 | -webkit-user-select: none;
8 | -moz-user-select: none;
9 | -ms-user-select: none;
10 | user-select: none;
11 | -webkit-transform: scale(0);
12 | -ms-transform: scale(0);
13 | transform: scale(0);
14 | opacity: 1;
15 | }
16 |
17 | .waves-ripple.z-active {
18 | opacity: 0;
19 | -webkit-transform: scale(2);
20 | -ms-transform: scale(2);
21 | transform: scale(2);
22 | -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
23 | transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
24 | transition: opacity 1.2s ease-out, transform 0.6s ease-out;
25 | transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out;
26 | }
--------------------------------------------------------------------------------
/src/directive/waves/waves.js:
--------------------------------------------------------------------------------
1 | import './waves.css'
2 |
3 | export default {
4 | bind(el, binding) {
5 | el.addEventListener('click', e => {
6 | const customOpts = Object.assign({}, binding.value)
7 | const opts = Object.assign({
8 | ele: el, // 波纹作用元素
9 | type: 'hit', // hit 点击位置扩散 center中心点扩展
10 | color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
11 | }, customOpts)
12 | const target = opts.ele
13 | if (target) {
14 | target.style.position = 'relative'
15 | target.style.overflow = 'hidden'
16 | const rect = target.getBoundingClientRect()
17 | let ripple = target.querySelector('.waves-ripple')
18 | if (!ripple) {
19 | ripple = document.createElement('span')
20 | ripple.className = 'waves-ripple'
21 | ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'
22 | target.appendChild(ripple)
23 | } else {
24 | ripple.className = 'waves-ripple'
25 | }
26 | switch (opts.type) {
27 | case 'center':
28 | ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px'
29 | ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px'
30 | break
31 | default:
32 | ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop || document.body.scrollTop) + 'px'
33 | ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft || document.body.scrollLeft) + 'px'
34 | }
35 | ripple.style.backgroundColor = opts.color
36 | ripple.className = 'waves-ripple z-active'
37 | return false
38 | }
39 | }, false)
40 | }
41 | }
42 |
43 |
--------------------------------------------------------------------------------
/src/errorLog.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import store from './store'
3 |
4 | // you can set only in production env show the error-log
5 | if (process.env.NODE_ENV === 'production') {
6 | Vue.config.errorHandler = function(err, vm, info, a) {
7 | // Don't ask me why I use Vue.nextTick, it just a hack.
8 | // detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500
9 | Vue.nextTick(() => {
10 | store.dispatch('addErrorLog', {
11 | err,
12 | vm,
13 | info,
14 | url: window.location.href
15 | })
16 | console.error(err, info)
17 | })
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/filters/index.js:
--------------------------------------------------------------------------------
1 | // set function parseTime,formatTime to filter
2 | export { parseTime, formatTime } from '@/utils'
3 |
4 | function pluralize(time, label) {
5 | if (time === 1) {
6 | return time + label
7 | }
8 | return time + label + 's'
9 | }
10 |
11 | export function timeAgo(time) {
12 | const between = Date.now() / 1000 - Number(time)
13 | if (between < 3600) {
14 | return pluralize(~~(between / 60), ' minute')
15 | } else if (between < 86400) {
16 | return pluralize(~~(between / 3600), ' hour')
17 | } else {
18 | return pluralize(~~(between / 86400), ' day')
19 | }
20 | }
21 |
22 | /* 数字 格式化*/
23 | export function numberFormatter(num, digits) {
24 | const si = [
25 | { value: 1e18, symbol: 'E' },
26 | { value: 1e15, symbol: 'P' },
27 | { value: 1e12, symbol: 'T' },
28 | { value: 1e9, symbol: 'G' },
29 | { value: 1e6, symbol: 'M' },
30 | { value: 1e3, symbol: 'k' }
31 | ]
32 | for (let i = 0; i < si.length; i++) {
33 | if (num >= si[i].value) {
34 | return (
35 | (num / si[i].value + 0.1)
36 | .toFixed(digits)
37 | .replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol
38 | )
39 | }
40 | }
41 | return num.toString()
42 | }
43 |
44 | export function toThousandFilter(num) {
45 | return (+num || 0)
46 | .toString()
47 | .replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','))
48 | }
49 |
50 | export function toFixed(num, d = 2) {
51 | var s = num + ''
52 | if (!d) d = 0
53 | if (s.indexOf('.') === -1) s += '.'
54 | s += new Array(d + 1).join('0')
55 | if (new RegExp('^(-|\\+)?(\\d+(\\.\\d{0,' + (d + 1) + '})?)\\d*$').test(s)) {
56 | s = '0' + RegExp.$2
57 | var pm = RegExp.$1
58 | var a = RegExp.$3.length
59 | var b = true
60 | if (a === d + 2) {
61 | a = s.match(/\d/g)
62 | if (parseInt(a[a.length - 1]) > 4) {
63 | for (var i = a.length - 2; i >= 0; i--) {
64 | a[i] = parseInt(a[i]) + 1
65 | if (a[i] === 10) {
66 | a[i] = 0
67 | b = i !== 1
68 | } else break
69 | }
70 | }
71 | s = a.join('').replace(new RegExp('(\\d+)(\\d{' + d + '})\\d$'), '$1.$2')
72 | }
73 | if (b) s = s.substr(1)
74 | return (pm + s).replace(/\.$/, '')
75 | }
76 | return num + ''
77 | }
78 |
--------------------------------------------------------------------------------
/src/icons/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import SvgIcon from '@/components/SvgIcon'// svg组件
3 |
4 | // register globally
5 | Vue.component('svg-icon', SvgIcon)
6 |
7 | const req = require.context('./svg', false, /\.svg$/)
8 | const requireAll = requireContext => requireContext.keys().map(requireContext)
9 | requireAll(req)
10 |
--------------------------------------------------------------------------------
/src/icons/svg/404.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/backstage.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/bug.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/chart.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/clipboard.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/component.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/dashboard.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/documentation.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/drag.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/edit.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/email.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/example.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/excel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/eye.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/finance.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/foreground.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/form.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/guide 2.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/guide.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/home.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/international.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/language.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/link.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/list.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/lock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/logout.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/message.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/money.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/nested.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/password.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/pdf.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/people.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/peoples.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/setting.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/shopping.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/size.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/star.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/subject.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/tab.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/table.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/theme.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/tijian.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/tree.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/user.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/wechat.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/wifi.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/wmax.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/wmin.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svg/zip.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/icons/svgo.yml:
--------------------------------------------------------------------------------
1 | # replace default config
2 |
3 | # multipass: true
4 | # full: true
5 |
6 | plugins:
7 |
8 | # - name
9 | #
10 | # or:
11 | # - name: false
12 | # - name: true
13 | #
14 | # or:
15 | # - name:
16 | # param1: 1
17 | # param2: 2
18 |
19 | - removeAttrs:
20 | attrs:
21 | - 'fill'
22 | - 'fill-rule'
23 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | // import Vue from 'Vue'
2 |
3 | import 'normalize.css/normalize.css' // A modern alternative to CSS resets
4 |
5 | // import Element from 'element-ui'
6 |
7 | import '@/utils/initTheme' // init theme
8 | import '@/styles/index.scss' // global css
9 |
10 | import App from './App'
11 | import router from './router'
12 | import store from './store'
13 |
14 | import './icons' // icon
15 | import './errorLog' // error log
16 | import './permission' // permission control
17 | // import './mock' // simulation data
18 |
19 | import * as filters from './filters' // global filters
20 | import plugins from './plugins' // global plugins
21 | import permission from '@/directive/permission' // global directive
22 | import Toast from './components/Toast/toast'
23 | import './mock'
24 |
25 | window.Vue.use(Toast)
26 |
27 | window.Vue.use(window.ELEMENT, { size: 'small' })
28 |
29 | // register global directive.
30 | window.Vue.use(permission)
31 |
32 | // register global plugins.
33 | window.Vue.use(plugins)
34 |
35 | // register global utility filters.
36 | Object.keys(filters).forEach(key => {
37 | window.Vue.filter(key, filters[key])
38 | })
39 |
40 | window.Vue.config.productionTip = false
41 |
42 | new window.Vue({
43 | el: '#app',
44 | router,
45 | store,
46 | render: h => h(App)
47 | })
48 |
--------------------------------------------------------------------------------
/src/mixin/exportFile.js:
--------------------------------------------------------------------------------
1 | export default {
2 | methods: {
3 | exportFile({ api, title = this.$route.meta.title, params = {}, onlyParams = '' }) {
4 | this.$confirm(`是否导出${title}?`, '提示', {
5 | confirmButtonText: '确定',
6 | cancelButtonText: '取消',
7 | type: 'warning'
8 | })
9 | .then(() => {
10 | this.$store.dispatch('exportCheck', {
11 | api,
12 | title,
13 | params: onlyParams || {
14 | ...this.select,
15 | ...params
16 | },
17 | h: this.$createElement
18 | })
19 | })
20 | .catch(() => {})
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/mixin/filterSelect.js:
--------------------------------------------------------------------------------
1 | import { gradeConfig } from '@/utils/auth'
2 | import { deepClone } from '@/utils'
3 |
4 | // 获取过滤后的学部列表
5 | function getDepartment(department, type) {
6 | const selectType = Array.isArray(type) ? type : [type]
7 | const grades = new Set()
8 | selectType.forEach(t => {
9 | for (const i in gradeConfig) {
10 | if (t <= gradeConfig[i]) {
11 | grades.add(i)
12 | break
13 | }
14 | }
15 | })
16 | return [...grades].reduce((prev, curr, index, arr) => {
17 | if (prev.some(item => item.value !== curr) || !prev.length) {
18 | const res = deepClone(department).find(t => t.value === curr)
19 | if (res) {
20 | res.disabled = arr.length > 1
21 | prev.push(res)
22 | }
23 | }
24 | return prev.filter(Boolean)
25 | }, [])
26 | }
27 |
28 | // 获取过滤后的年级列表
29 | function getGrade(grade, type) {
30 | return grade.reduce((prev, curr) => {
31 | if (curr.value <= gradeConfig[type] && (type === '1' || curr.value > gradeConfig[type - 1])) {
32 | prev.push(curr)
33 | }
34 | return prev
35 | }, [])
36 | }
37 |
38 | // 获取过滤后的科目列表
39 | function getSubject(subject, type) {
40 | const selectType = Array.isArray(type) ? type : [type]
41 | const filterData = selectType.reduce((prev, curr) => {
42 | const firstFilter = subject.filter(s => s.gradeIds.split(',').includes(curr))
43 | prev.push(...firstFilter.filter(f => !prev.some(p => p.id === f.id)))
44 | return prev
45 | }, [])
46 | return filterData.length ? filterData : subject
47 | }
48 |
49 | export default {
50 | computed: {
51 | filterDepartment() {
52 | return (type = '', department = this.constant.department_type) =>
53 | type.length ? getDepartment(department, type) : department
54 | },
55 | filterGrade() {
56 | return (type = '', grade = this.constant.grade) =>
57 | type.length
58 | ? Array.isArray(type)
59 | ? [].concat(...[...type].sort().map(t => getGrade(grade, t)))
60 | : getGrade(grade, type) : grade
61 | },
62 | filterSubject() {
63 | return (type = '', subject = this.constant.subject) =>
64 | type.length ? getSubject(subject, type) : subject
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/src/mixin/financeConfirm.js:
--------------------------------------------------------------------------------
1 | import IncomeDetails from '@/views/finance/financeConfirm/components/IncomeDetails'
2 | export default {
3 | components: {
4 | IncomeDetails
5 | },
6 | data() {
7 | return {
8 | showDetails: false,
9 | detailsInfo: {},
10 | detailsTitle: {}
11 | }
12 | },
13 | watch: {
14 | showDetails() {
15 | this.$emit('update:noShow', this.showDetails)
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/mixin/pagination.js:
--------------------------------------------------------------------------------
1 | export default {
2 | data() {
3 | return {
4 | page: 1,
5 | limit: 10,
6 | pageSizes: [10, 30, 50, 100],
7 | pageLayout: 'slot, total, sizes, prev, pager, next, jumper',
8 | vm: null
9 | }
10 | },
11 | created() {
12 | let that = this
13 | while (!this.vm && that.$parent) {
14 | if (that.fetchData) {
15 | this.vm = that
16 | } else {
17 | that = that.$parent
18 | }
19 | }
20 | if (this.limit !== 10) this.pageSizes.splice(0, 1, this.limit)
21 | },
22 | methods: {
23 | handleSizeChange(val, param = { page: 'page', limit: 'limit', fn: 'fetchData' }) {
24 | // 公共分页每页显示条数
25 | const { page, limit, fn } = param
26 | this.vm[limit] = val
27 | this.vm[page] = 1
28 | this.vm[fn] && this.vm[fn]()
29 | },
30 | handleCurrentChange(val, param = { page: 'page', fn: 'fetchData' }) {
31 | // 公共分页页码事件
32 | const { page, fn } = param
33 | this.vm[page] = val
34 | this.vm[fn] && this.vm[fn]()
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/mixin/utils.js:
--------------------------------------------------------------------------------
1 | export default {
2 | methods: {
3 | handleInputBlur(e, item, key, val) {
4 | const t = e.target
5 | if (!t.value) t.value = val
6 | if (item[key] === undefined) {
7 | this.$set(item, key, val)
8 | }
9 | }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/mock/article.js:
--------------------------------------------------------------------------------
1 | import Mock from 'mockjs'
2 | import { param2Obj } from '@/utils'
3 |
4 | const List = []
5 | const count = 100
6 |
7 | const baseContent = '我是测试数据我是测试数据

'
8 | const image_uri = 'https://wpimg.wallstcn.com/e4558086-631c-425c-9430-56ffb46e70b3'
9 |
10 | for (let i = 0; i < count; i++) {
11 | List.push(Mock.mock({
12 | id: '@increment',
13 | timestamp: +Mock.Random.date('T'),
14 | author: '@first',
15 | reviewer: '@first',
16 | title: '@title(5, 10)',
17 | content_short: '我是测试数据',
18 | content: baseContent,
19 | forecast: '@float(0, 100, 2, 2)',
20 | importance: '@integer(1, 3)',
21 | 'type|1': ['CN', 'US', 'JP', 'EU'],
22 | 'status|1': ['published', 'draft', 'deleted'],
23 | display_time: '@datetime',
24 | comment_disabled: true,
25 | pageviews: '@integer(300, 5000)',
26 | image_uri,
27 | platforms: ['a-platform']
28 | }))
29 | }
30 |
31 | export default {
32 | getList: config => {
33 | const { importance, type, title, page = 1, limit = 20, sort } = param2Obj(config.url)
34 |
35 | let mockList = List.filter(item => {
36 | if (importance && item.importance !== +importance) return false
37 | if (type && item.type !== type) return false
38 | if (title && item.title.indexOf(title) < 0) return false
39 | return true
40 | })
41 |
42 | if (sort === '-id') {
43 | mockList = mockList.reverse()
44 | }
45 |
46 | const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1))
47 |
48 | return {
49 | total: mockList.length,
50 | items: pageList
51 | }
52 | },
53 | getPv: () => ({
54 | pvData: [{ key: 'PC', pv: 1024 }, { key: 'mobile', pv: 1024 }, { key: 'ios', pv: 1024 }, { key: 'android', pv: 1024 }]
55 | }),
56 | getArticle: (config) => {
57 | const { id } = param2Obj(config.url)
58 | for (const article of List) {
59 | if (article.id === +id) {
60 | return article
61 | }
62 | }
63 | },
64 | createArticle: () => ({
65 | data: 'success'
66 | }),
67 | updateArticle: () => ({
68 | data: 'success'
69 | })
70 | }
71 |
--------------------------------------------------------------------------------
/src/mock/index.js:
--------------------------------------------------------------------------------
1 | import Mock from 'mockjs'
2 | import loginAPI from './login'
3 | import articleAPI from './article'
4 | import remoteSearchAPI from './remoteSearch'
5 | import transactionAPI from './transaction'
6 |
7 | // 修复在使用 MockJS 情况下,设置 withCredentials = true,且未被拦截的跨域请求丢失 Cookies 的问题
8 | // https://github.com/nuysoft/Mock/issues/300
9 | Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
10 | Mock.XHR.prototype.send = function() {
11 | if (this.custom.xhr) {
12 | this.custom.xhr.withCredentials = this.withCredentials || false
13 | }
14 | this.proxy_send(...arguments)
15 | }
16 |
17 | // Mock.setup({
18 | // timeout: '350-600'
19 | // })
20 |
21 | // 登录相关
22 | Mock.mock(/\/user\/authenCheck/, 'post', loginAPI.authenCheck)
23 | Mock.mock(/\/user\/login/, 'post', loginAPI.login)
24 |
25 | // 文章相关
26 | Mock.mock(/\/article\/list/, 'get', articleAPI.getList)
27 | Mock.mock(/\/article\/detail/, 'get', articleAPI.getArticle)
28 | Mock.mock(/\/article\/pv/, 'get', articleAPI.getPv)
29 | Mock.mock(/\/article\/create/, 'post', articleAPI.createArticle)
30 | Mock.mock(/\/article\/update/, 'post', articleAPI.updateArticle)
31 |
32 | // 搜索相关
33 | Mock.mock(/\/search\/user/, 'get', remoteSearchAPI.searchUser)
34 |
35 | // 账单相关
36 | Mock.mock(/\/transaction\/list/, 'get', transactionAPI.getList)
37 |
38 | export default Mock
39 |
--------------------------------------------------------------------------------
/src/mock/login.js:
--------------------------------------------------------------------------------
1 | export default {
2 | authenCheck: () => {
3 | return {
4 | code: 10000,
5 | msg: '登录成功',
6 | data: {
7 | authenCode:
8 | 'EOEpauj9hBSQZeLle0rsalfaa6MPHs6jRx6nbLyUMQE4H1a2APbVpKbYOrqCProH6KTbIZuzpRv4F4FsYgeDnDzu6T1eWF/VdbgMP2y2aTJuvmWNAp8CPdDQlELjIHZEUWoNpmDTR2p+9U0d1UMDGnm3zqbU3+LYEA+T2X4e0+w=' // 用户id以及随机字符串
9 | }
10 | }
11 | },
12 | login: () => {
13 | return {
14 | code: 10000,
15 | msg: '操作成功!',
16 | data: {
17 | token: '7bc93107aa8d4d22a74a484b1f759a4c;::;1544409807892',
18 | menu: ['1', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14'],
19 | roles: ['admin'],
20 | userInfo: {
21 | id: '7bc93107aa8d4d22a74a484b1f759a4c',
22 | name: 'admin',
23 | createDate: '2018-12-08T03:30:45.093+0000',
24 | updateDate: '2018-12-08T03:30:45.093+0000',
25 | remarks: null,
26 | loginName: 'admin',
27 | passWord: null,
28 | no: '00002',
29 | mobile: '18829207310',
30 | bankName: null,
31 | bankNo: null,
32 | isUseable: true,
33 | office: null,
34 | role: {
35 | id: 'sdfsdfdsfsdfsdfsdfd',
36 | name: '超管',
37 | createDate: '2018-12-10T02:43:27.956+0000',
38 | updateDate: '2018-12-10T02:43:27.956+0000',
39 | remarks: null,
40 | useable: false
41 | },
42 | useable: true
43 | }
44 | }
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/mock/remoteSearch.js:
--------------------------------------------------------------------------------
1 | import Mock from 'mockjs'
2 | import { param2Obj } from '@/utils'
3 |
4 | const NameList = []
5 | const count = 100
6 |
7 | for (let i = 0; i < count; i++) {
8 | NameList.push(Mock.mock({
9 | name: '@first'
10 | }))
11 | }
12 | NameList.push({ name: 'mockPan' })
13 |
14 | export default {
15 | searchUser: config => {
16 | const { name } = param2Obj(config.url)
17 | const mockNameList = NameList.filter(item => {
18 | const lowerCaseName = item.name.toLowerCase()
19 | if (name && lowerCaseName.indexOf(name.toLowerCase()) < 0) return false
20 | return true
21 | })
22 | return { items: mockNameList }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/mock/transaction.js:
--------------------------------------------------------------------------------
1 | import Mock from 'mockjs'
2 |
3 | const List = []
4 | const count = 20
5 |
6 | for (let i = 0; i < count; i++) {
7 | List.push(Mock.mock({
8 | order_no: '@guid()',
9 | timestamp: +Mock.Random.date('T'),
10 | username: '@name()',
11 | price: '@float(1000, 15000, 0, 2)',
12 | 'status|1': ['success', 'pending']
13 | }))
14 | }
15 |
16 | export default {
17 | getList: () => {
18 | return {
19 | total: List.length,
20 | items: List
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/plugins/index.js:
--------------------------------------------------------------------------------
1 | import EleMultiCascader from '@/components/EleMultiCascader'
2 | import CountNum from '@/components/CountNum'
3 | import CommTable from '@/views/components/CommTable'
4 |
5 | const MyPlugin = {
6 | install(Vue) {
7 | Vue.component(EleMultiCascader.name, EleMultiCascader)
8 | Vue.component(CountNum.name, CountNum)
9 | Vue.component(CommTable.name, CommTable)
10 | }
11 | }
12 |
13 | export default MyPlugin
14 |
--------------------------------------------------------------------------------
/src/router/index.js:
--------------------------------------------------------------------------------
1 | // import Vue from 'vue'
2 | // import Router from 'vue-router'
3 |
4 | import foreground from './modules/foreground'
5 |
6 | // Vue.use(Router)
7 |
8 | /* Layout */
9 | import Layout from '@/views/layout/Layout'
10 |
11 | export const constantRouterMap = [
12 | {
13 | path: '/redirect',
14 | component: Layout,
15 | hidden: true,
16 | children: [
17 | {
18 | path: '/redirect/:path*',
19 | component: () => import('@/views/redirect/index')
20 | }
21 | ]
22 | },
23 | {
24 | path: '/upload',
25 | component: () => import('@/views/upload'),
26 | meta: {
27 | upload: true
28 | },
29 | hidden: true
30 | },
31 | {
32 | path: '/login',
33 | component: () => import('@/views/login/index'),
34 | hidden: true
35 | },
36 | {
37 | path: '/auth-redirect',
38 | component: () => import('@/views/login/authredirect'),
39 | hidden: true
40 | },
41 | {
42 | path: '/error',
43 | component: Layout,
44 | hidden: true,
45 | redirect: '/error/401',
46 | children: [
47 | {
48 | path: '401',
49 | name: '401',
50 | meta: { title: '无权限' },
51 | component: () => import('@/views/errorPage/401')
52 | },
53 | {
54 | path: '404',
55 | name: '404',
56 | meta: { title: '找不到该页面' },
57 | component: () => import('@/views/errorPage/404')
58 | }
59 | ]
60 | },
61 | {
62 | path: '',
63 | component: Layout,
64 | redirect: 'index',
65 | children: [
66 | {
67 | path: 'index',
68 | component: () => import('@/views/dashboard/index'),
69 | name: 'Index',
70 | meta: { title: '首页', icon: 'home', noCache: true }
71 | }
72 | ]
73 | }
74 | ]
75 |
76 | const createRouter = () =>
77 | new window.VueRouter({
78 | mode: 'history', // require service support
79 | scrollBehavior: () => ({ y: 0 }),
80 | routes: constantRouterMap
81 | })
82 |
83 | const router = createRouter()
84 |
85 | // Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
86 | export function resetRouter() {
87 | const newRouter = createRouter()
88 | router.matcher = newRouter.matcher // reset router
89 | }
90 |
91 | export const asyncRouterMap = [
92 | foreground,
93 | { path: '*', redirect: '/error/404', hidden: true }
94 | ]
95 |
96 | export default router
97 |
--------------------------------------------------------------------------------
/src/router/modules/foreground/apply.js:
--------------------------------------------------------------------------------
1 | import Layout from '@/views/layout/Layout'
2 |
3 | export default {
4 | path: 'apply',
5 | component: Layout,
6 | redirect: '/foreground/apply/index',
7 | name: 'Apply',
8 | meta: {
9 | title: '报名'
10 | },
11 | children: [
12 | {
13 | path: 'index',
14 | component: () => import('@/views/foreground/apply'),
15 | name: 'ApplyList',
16 | meta: {
17 | title: '学员列表',
18 | activeMenu: '/foreground/apply'
19 | },
20 | hidden: true
21 | },
22 | {
23 | path: 'student/:id',
24 | component: () => import('@/views/foreground/apply/info'),
25 | name: 'StudentInfo',
26 | redirect: '/foreground/apply/student/:id/classQuery',
27 | meta: {
28 | title: '学员详情',
29 | breadcrumb: false
30 | },
31 | hidden: true,
32 | children: [
33 | {
34 | path: 'classQuery',
35 | component: () =>
36 | import('@/views/foreground/apply/components/ClassQuery'),
37 | name: 'ClassQuery',
38 | meta: {
39 | title: '班级查询',
40 | animation: false,
41 | activeMenu: '/foreground/apply'
42 | }
43 | }
44 | ]
45 | }
46 | ]
47 | }
48 |
--------------------------------------------------------------------------------
/src/router/modules/foreground/index.js:
--------------------------------------------------------------------------------
1 | /* Layout */
2 | import Container from '@/views/components/Container'
3 |
4 | /* router modules */
5 | import apply from './apply'
6 |
7 | export default {
8 | path: '/foreground',
9 | component: Container,
10 | redirect: '/foreground/apply',
11 | name: 'Foreground',
12 | alwaysShow: true,
13 | meta: {
14 | title: '前台系统',
15 | icon: 'foreground',
16 | id: 1
17 | },
18 | children: [
19 | apply
20 | ]
21 | }
22 |
--------------------------------------------------------------------------------
/src/store/getters.js:
--------------------------------------------------------------------------------
1 | const getters = {
2 | sex: state => state.app.sex.map(item => item.label),
3 | sidebar: state => state.app.sidebar,
4 | device: state => state.app.device,
5 | drawer: state => state.app.drawer,
6 | theme: state => state.app.theme,
7 | fastNav: state => state.app.fastNav,
8 | visitedViews: state => state.tagsView.visitedViews,
9 | cachedViews: state => state.tagsView.cachedViews,
10 | token: state => state.user.token,
11 | status: state => state.user.status,
12 | roles: state => state.user.roles,
13 | userInfo: state => state.user.userInfo,
14 | permission_routers: state => state.permission.routers,
15 | addRouters: state => state.permission.addRouters,
16 | errorLogs: state => state.errorLog.logs,
17 | constant: state => state.constant.constant,
18 | courseCart: state => state.apply.courseCart,
19 | printCard: state => state.apply.printCardInfo,
20 | campusStatus: state => state.campus.campusStatus,
21 | exportStatus: state => state.exportFile.exportStatus,
22 | itemQuestionMsg: state => state.itemQuestionMsg.msg
23 | }
24 | export default getters
25 |
--------------------------------------------------------------------------------
/src/store/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Vuex from 'vuex'
3 | import app from './modules/app'
4 | import errorLog from './modules/errorLog'
5 | import permission from './modules/permission'
6 | import tagsView from './modules/tagsView'
7 | import user from './modules/user'
8 | import constant from './modules/constant'
9 | import apply from './modules/apply'
10 | import campus from './modules/campus'
11 | import exportFile from './modules/exportFile'
12 | import itemQuestionMsg from './modules/itemQuestionMsg'
13 | import getters from './getters'
14 |
15 | Vue.use(Vuex)
16 |
17 | const store = new Vuex.Store({
18 | modules: {
19 | app,
20 | errorLog,
21 | permission,
22 | tagsView,
23 | user,
24 | constant,
25 | apply,
26 | campus,
27 | exportFile,
28 | itemQuestionMsg
29 | },
30 | getters
31 | })
32 |
33 | export default store
34 |
--------------------------------------------------------------------------------
/src/store/modules/app.js:
--------------------------------------------------------------------------------
1 | import Cookies from 'js-cookie'
2 | import { setTheme } from '@/utils'
3 |
4 | const fastNav = Cookies.get('fastNav')
5 | const app = {
6 | state: {
7 | sidebar: {
8 | opened: Cookies.get('sidebarStatus')
9 | ? !!+Cookies.get('sidebarStatus')
10 | : true,
11 | withoutAnimation: false
12 | },
13 | device: 'desktop',
14 | drawer: false,
15 | theme: Cookies.get('theme') || 'blackgold',
16 | themePicker: '',
17 | fastNav: fastNav ? JSON.parse(fastNav) : false,
18 | sex: [{ value: false, label: '女' }, { value: true, label: '男' }]
19 | },
20 | mutations: {
21 | TOGGLE_SIDEBAR: state => {
22 | state.sidebar.opened = !state.sidebar.opened
23 | state.sidebar.withoutAnimation = false
24 | if (state.sidebar.opened) {
25 | Cookies.set('sidebarStatus', 1)
26 | } else {
27 | Cookies.set('sidebarStatus', 0)
28 | }
29 | },
30 | CLOSE_SIDEBAR: (state, withoutAnimation) => {
31 | Cookies.set('sidebarStatus', 0)
32 | state.sidebar.opened = false
33 | state.sidebar.withoutAnimation = withoutAnimation
34 | },
35 | TOGGLE_DEVICE: (state, device) => {
36 | state.device = device
37 | },
38 | TOGGLE_DRAWER: (state, opened = true) => {
39 | state.drawer = opened
40 | },
41 | CHANGE_THEME: (state, theme = state.theme) => {
42 | Cookies.set('theme', theme)
43 | state.theme = theme
44 | setTheme(theme)
45 | },
46 | TOGGLE_FAST_NAV: state => {
47 | state.fastNav = !state.fastNav
48 | Cookies.set('fastNav', state.fastNav)
49 | }
50 | },
51 | actions: {
52 | toggleSideBar({ commit }) {
53 | commit('TOGGLE_SIDEBAR')
54 | },
55 | closeSideBar({ commit }, { withoutAnimation }) {
56 | commit('CLOSE_SIDEBAR', withoutAnimation)
57 | },
58 | toggleDevice({ commit }, device) {
59 | commit('TOGGLE_DEVICE', device)
60 | },
61 | toggleDrawer({ commit }, opened) {
62 | commit('TOGGLE_DRAWER', opened)
63 | },
64 | changeTheme({ commit }, { theme, id }) {
65 | return commit('CHANGE_THEME', theme)
66 | },
67 | toggleFastNav: ({ commit }) => {
68 | commit('TOGGLE_FAST_NAV')
69 | }
70 | }
71 | }
72 |
73 | export default app
74 |
--------------------------------------------------------------------------------
/src/store/modules/apply.js:
--------------------------------------------------------------------------------
1 |
2 | const apply = {
3 | state: {
4 | courseCart: [],
5 | printCardInfo: []
6 | },
7 | mutations: {
8 | SET_COURSE_CART(state, list) {
9 | state.courseCart = list
10 | },
11 | SET_PRINT_CARD(state, info) {
12 | state.printCardInfo = info
13 | }
14 | },
15 | actions: {
16 | addCourseCart({ dispatch }, { studentId, classId }) {
17 | return new Promise((resolve, reject) => {
18 |
19 | })
20 | },
21 | getCourseCart({ commit }, params) {
22 | return new Promise((resolve, reject) => {
23 |
24 | })
25 | },
26 | delCourseCart({ dispatch }, { id, studentId }) {
27 | return new Promise((resolve, reject) => {
28 |
29 | })
30 | }
31 | }
32 | }
33 |
34 | export default apply
35 |
--------------------------------------------------------------------------------
/src/store/modules/campus.js:
--------------------------------------------------------------------------------
1 | const campus = {
2 | state: {
3 | campusStatus: ''
4 | },
5 | mutations: {
6 | SET_CAMPUS_STATUS(state, list) {
7 | state.campusStatus = list
8 | }
9 | },
10 | actions: {
11 | getCampusStatus({ commit }, params) {
12 | commit('SET_CAMPUS_STATUS', params)
13 | }
14 | }
15 | }
16 |
17 | export default campus
18 |
--------------------------------------------------------------------------------
/src/store/modules/errorLog.js:
--------------------------------------------------------------------------------
1 | const errorLog = {
2 | state: {
3 | logs: []
4 | },
5 | mutations: {
6 | ADD_ERROR_LOG: (state, log) => {
7 | state.logs.push(log)
8 | }
9 | },
10 | actions: {
11 | addErrorLog({ commit }, log) {
12 | commit('ADD_ERROR_LOG', log)
13 | }
14 | }
15 | }
16 |
17 | export default errorLog
18 |
--------------------------------------------------------------------------------
/src/store/modules/itemQuestionMsg.js:
--------------------------------------------------------------------------------
1 | const itemQuestionMsg = {
2 | state: {
3 | msg: {
4 | returnsPersonAndTimes: '默认计算-退费状态为退款成功的数据', // 退费人数总计/退费人次总计
5 | signupAndPaymentNuber: '默认计算-所有班级类别以及包含短期退费人次' // 班级运营 - 报名缴费人次
6 | }
7 | }
8 | }
9 | export default itemQuestionMsg
10 |
--------------------------------------------------------------------------------
/src/store/modules/permission.js:
--------------------------------------------------------------------------------
1 | import { asyncRouterMap, constantRouterMap } from '@/router'
2 | import { superAdminId } from '@/utils/auth'
3 |
4 | /**
5 | * 通过meta.role判断是否与当前用户权限匹配
6 | * @param menus
7 | * @param route
8 | */
9 | function hasPermission(menus, route) {
10 | if (route.meta && route.meta.id) {
11 | return menus.some(id => String(route.meta.id) === id)
12 | } else {
13 | return true
14 | }
15 | }
16 |
17 | /**
18 | * 递归过滤异步路由表,返回符合用户角色权限的路由表
19 | * @param routes asyncRouterMap
20 | * @param roles
21 | */
22 | function filterAsyncRouter(routes, menus) {
23 | const res = []
24 | routes.forEach(route => {
25 | const tmp = { ...route }
26 | if (hasPermission(menus, tmp)) {
27 | if (tmp.children) {
28 | tmp.children = filterAsyncRouter(tmp.children, menus)
29 | }
30 | res.push(tmp)
31 | }
32 | })
33 | return res
34 | }
35 |
36 | function redirectIndex(routes) {
37 | return routes.map(route => {
38 | if (route.children) {
39 | route.children.some(c => {
40 | if (c.children.length) {
41 | route.redirect = `${route.path}/${c.path}/index`
42 | return true
43 | }
44 | })
45 | }
46 | return route
47 | })
48 | }
49 |
50 | const permission = {
51 | state: {
52 | routers: constantRouterMap,
53 | addRouters: []
54 | },
55 | mutations: {
56 | SET_ROUTERS: (state, routers) => {
57 | state.addRouters = routers
58 | state.routers = constantRouterMap.concat(routers)
59 | }
60 | },
61 | actions: {
62 | generateRoutes({ commit }, { id, menu }) {
63 | return new Promise(resolve => {
64 | // 排除超管
65 | // const accessedRoutes = id === superAdminId ? asyncRouterMap : Object.freeze(
66 | // redirectIndex(filterAsyncRouter(asyncRouterMap, menu))
67 | // )
68 | console.log(asyncRouterMap)
69 |
70 | commit('SET_ROUTERS', asyncRouterMap)
71 | resolve(asyncRouterMap)
72 | })
73 | }
74 | }
75 | }
76 |
77 | export default permission
78 |
--------------------------------------------------------------------------------
/src/styles/btn.scss:
--------------------------------------------------------------------------------
1 | @import './variables.scss';
2 |
3 | @mixin colorBtn($color) {
4 | background: $color;
5 | &:hover {
6 | color: $color;
7 | &:before,
8 | &:after {
9 | background: $color;
10 | }
11 | }
12 | }
13 |
14 | .blue-btn {
15 | @include colorBtn($blue)
16 | }
17 |
18 | .light-blue-btn {
19 | @include colorBtn($light-blue)
20 | }
21 |
22 | .red-btn {
23 | @include colorBtn($red)
24 | }
25 |
26 | .pink-btn {
27 | @include colorBtn($pink)
28 | }
29 |
30 | .green-btn {
31 | @include colorBtn($green)
32 | }
33 |
34 | .tiffany-btn {
35 | @include colorBtn($tiffany)
36 | }
37 |
38 | .yellow-btn {
39 | @include colorBtn($yellow)
40 | }
41 |
42 | .pan-btn {
43 | font-size: 14px;
44 | color: #fff;
45 | padding: 14px 36px;
46 | border-radius: 8px;
47 | border: none;
48 | outline: none;
49 | transition: 600ms ease all;
50 | position: relative;
51 | display: inline-block;
52 | &:hover {
53 | background: #fff;
54 | &:before,
55 | &:after {
56 | width: 100%;
57 | transition: 600ms ease all;
58 | }
59 | }
60 | &:before,
61 | &:after {
62 | content: '';
63 | position: absolute;
64 | top: 0;
65 | right: 0;
66 | height: 2px;
67 | width: 0;
68 | transition: 400ms ease all;
69 | }
70 | &::after {
71 | right: inherit;
72 | top: inherit;
73 | left: 0;
74 | bottom: 0;
75 | }
76 | }
77 |
78 | .custom-button {
79 | display: inline-block;
80 | line-height: 1;
81 | white-space: nowrap;
82 | cursor: pointer;
83 | background: #fff;
84 | color: #fff;
85 | -webkit-appearance: none;
86 | text-align: center;
87 | box-sizing: border-box;
88 | outline: 0;
89 | margin: 0;
90 | padding: 10px 15px;
91 | font-size: 14px;
92 | border-radius: 4px;
93 | }
94 |
95 |
--------------------------------------------------------------------------------
/src/styles/dialog.scss:
--------------------------------------------------------------------------------
1 | .dialog-footer{
2 | margin-top: 40px;
3 | display: flex;
4 | justify-content: center;
5 | & > .el-button{
6 | min-width: 20%;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/styles/mixin.scss:
--------------------------------------------------------------------------------
1 | @mixin clearfix {
2 | &:after {
3 | content: "";
4 | display: table;
5 | clear: both;
6 | }
7 | }
8 |
9 | @mixin scrollBar {
10 | &::-webkit-scrollbar-track-piece {
11 | background: #d3dce6;
12 | }
13 | &::-webkit-scrollbar {
14 | width: 6px;
15 | }
16 | &::-webkit-scrollbar-thumb {
17 | background: #99a9bf;
18 | border-radius: 20px;
19 | }
20 | }
21 |
22 | @mixin relative {
23 | position: relative;
24 | width: 100%;
25 | height: 100%;
26 | }
27 |
28 | @mixin pct($pct) {
29 | width: #{$pct};
30 | position: relative;
31 | margin: 0 auto;
32 | }
33 |
34 | @mixin triangle($width, $height, $color, $direction) {
35 | $width: $width/2;
36 | $color-border-style: $height solid $color;
37 | $transparent-border-style: $width solid transparent;
38 | height: 0;
39 | width: 0;
40 | @if $direction==up {
41 | border-bottom: $color-border-style;
42 | border-left: $transparent-border-style;
43 | border-right: $transparent-border-style;
44 | }
45 | @else if $direction==right {
46 | border-left: $color-border-style;
47 | border-top: $transparent-border-style;
48 | border-bottom: $transparent-border-style;
49 | }
50 | @else if $direction==down {
51 | border-top: $color-border-style;
52 | border-left: $transparent-border-style;
53 | border-right: $transparent-border-style;
54 | }
55 | @else if $direction==left {
56 | border-right: $color-border-style;
57 | border-top: $transparent-border-style;
58 | border-bottom: $transparent-border-style;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/styles/transition.scss:
--------------------------------------------------------------------------------
1 | //globl transition css
2 |
3 | /*fade*/
4 | .fade-enter-active,
5 | .fade-leave-active {
6 | transition: opacity 0.28s;
7 | }
8 |
9 | .fade-enter,
10 | .fade-leave-active {
11 | opacity: 0;
12 | }
13 |
14 | /*fade-transform*/
15 | .fade-transform-leave-active,
16 | .fade-transform-enter-active {
17 | transition: all .5s;
18 | }
19 | .fade-transform-enter {
20 | opacity: 0;
21 | transform: translateX(-30px);
22 | }
23 | .fade-transform-leave-to {
24 | opacity: 0;
25 | transform: translateX(30px);
26 | }
27 |
28 | /*breadcrumb transition*/
29 | .breadcrumb-enter-active,
30 | .breadcrumb-leave-active {
31 | transition: all .5s;
32 | }
33 |
34 | .breadcrumb-enter,
35 | .breadcrumb-leave-active {
36 | opacity: 0;
37 | transform: translateX(20px);
38 | }
39 |
40 | .breadcrumb-move {
41 | transition: all .5s;
42 | }
43 |
44 | .breadcrumb-leave-active {
45 | position: absolute;
46 | }
47 |
48 |
--------------------------------------------------------------------------------
/src/styles/uploadImg.scss:
--------------------------------------------------------------------------------
1 | // 上传头像
2 | .campus-management-box {
3 | .el-upload {
4 | width: 100%;
5 | .avatar-uploader-border {
6 | border: 1px solid #DCDFE6;
7 | display: inline-block;
8 | background: #F7F7FB;
9 | width: 100%;
10 | height: 242px;
11 | line-height:10px;
12 | text-align: center;
13 | font-size: 12px;
14 | border-radius: 10px;
15 | .el-icon-circle-plus{
16 | font-size: 30px;
17 | margin-top: 94px;
18 | margin-bottom: 10px;
19 | color: #c19b62;
20 | }
21 | .el-upload-tip{
22 | font-size: 10px;
23 | color: #aaaaaa;
24 | }
25 | }
26 | .avatar-uploader-border:hover{
27 | border-color: #c19b62;
28 | color: #c19b62;
29 | .el-icon-circle-plus{
30 | color: #c19b62;
31 | }
32 | .el-upload-tip{
33 | color: #c19b62;
34 | }
35 | }
36 | .el-image {
37 | width: 100%;
38 | height: 242px;
39 | .el-image__error {
40 | width: calc(100%);
41 | height: 242px;
42 | border-radius: 10px;
43 | border: 1px solid #F5F7FA;
44 | }
45 | .el-image__error:hover {
46 | border: 1px solid #c19b62;
47 | color: #c19b62;
48 | }
49 | .el-image__inner {
50 | object-fit:fill !important;
51 | width: 100%;
52 | height: 242px;
53 | }
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/src/styles/variables.scss:
--------------------------------------------------------------------------------
1 | $blue:#324157;
2 | $light-blue:#3A71A8;
3 | $red:#C03639;
4 | $pink: #E65D6E;
5 | $green: #30B08F;
6 | $tiffany: #4AB7BD;
7 | $yellow:#FEC171;
8 | $panGreen: #30B08F;
9 |
10 | //sidebar
11 | $menuBg:#304156;
12 | $subMenuBg:#1f2d3d;
13 | $menuHover:#001528;
14 |
--------------------------------------------------------------------------------
/src/utils/auth.js:
--------------------------------------------------------------------------------
1 | import Cookies from 'js-cookie'
2 |
3 | const TokenKey = 'Admin-Token'
4 |
5 | // 超管ID,在权限排除时使用
6 | export const superAdminId = '6'
7 |
8 | // 学部对应年级值上限
9 | export const gradeConfig = {
10 | 1: 6,
11 | 2: 9,
12 | 3: 12
13 | }
14 |
15 | export const KEY =
16 | 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAImJd0t2mwIVjWiMP9hLaauy+rlDsaW7ySQCt6q9VqRtdncGwkAAK9YqJUROHlPzdUdI5hwdDX2khptvHptieT2j/uhLy4J2X5Qa9L0AgY9P0W2sjQPwmaLkr7okTdpC42hK6J9t8kHAkwX0OEUxrpwMmBPRDhOmfPjZIgOIvBL7AgMBAAECgYBECG2sNHUkqMiUKJwEP/l7Z0NClUuwsZ0jZPy5RoMvPr5UzlEUG4GTpLFegk3aNRmUM2kwCub7eYDkLikzr5hMvS0YO70Jv93DdPzpx3tmz/g1PbHvmLcbMPktpFQeJZuIW+kMo0ROe9S2iucbH2ANSg8DUfQYOMXGdcZcFYLBYQJBAMt7wDAtNhIz7rrYfXqzVU4bUhkw3ZwlzpsP1SNsGFOIQx2BGdmMDAhpgRfPejZ9YdrgOXJkEL3IK2okmjCHGLMCQQCtCJot3aalJkwagS35Buxy5Y7m5jlLAJVZXjQmSIHw7BGEw5QzwAvdcQ+862QIu+gQ7ZaLRSbFB0BqSu2WEHCZAkBZmNbqH640W6udmB/APGCucLc4olyiGb+cZV9LJpibh19OCX+RW+ocdiBClLfScGj7EEobRVZdylrbdNxzy7ijAkEAoY3Hjg1F2yofoht8Veb9+uSUAMdxNLLNvovy+s916wAt9xw4Ef071rwKKqRIWNNAgBWkGlItOYZkwRlGLHca+QJBAKRxydI227rA5iHXsIJWzY5FTLFJ65w6zwuQ6cQu41/RNxpKYUH3Yztvk6rdV9ejZF8D1B2VbS9HW/NHRTrB2q8='
17 |
18 | export function getToken() {
19 | return Cookies.get(TokenKey)
20 | }
21 |
22 | export function setToken(token) {
23 | return Cookies.set(TokenKey, token)
24 | }
25 |
26 | export function removeToken() {
27 | return Cookies.remove(TokenKey)
28 | }
29 |
--------------------------------------------------------------------------------
/src/utils/buried.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @description 全埋点
3 | * 1.在所有methods方法中埋点为函数名
4 | * 2.在钩子函数中 (activated - created - mounted) 依次寻找这三个钩子
5 | * 如果存在就会增加埋点 VIEW
6 | *
7 | * 用法:
8 | * @Buried
9 | * 在单文件导出对象一级子对象下;
10 | * 如果某方法不想设置埋点 可以 return 'noBuried' 即可
11 | */
12 | export function Buried(target, funcName, descriptor) {
13 | const oriMethods = Object.assign({}, target.methods)
14 | const oriTarget = Object.assign({}, target)
15 | // methods方法中
16 | if (target.methods) {
17 | for (const name in target.methods) {
18 | target.methods[name] = function() {
19 | const result = oriMethods[name].call(this, ...arguments)
20 | // 如果方法中返回 noBuried 则不添加埋点
21 | if (typeof result === 'string' && result.includes('noBuried')) {
22 | console.log(name + '方法设置不添加埋点')
23 | } else if (result instanceof Promise) {
24 | result.then(res => {
25 | if (typeof res === 'string' && res.includes('noBuried')) { console.log(name + '方法设置不添加埋点'); return }
26 | console.log('添加埋点在methods方法中:', name.toUpperCase())
27 | this.$log(name)
28 | })
29 | } else {
30 | console.log('添加埋点在methods方法中:', name.toUpperCase())
31 | this.$log(name)
32 | }
33 | return result
34 | }
35 | }
36 | }
37 | // 钩子函数中
38 | const hookFun = (funName) => {
39 | target[funName] = function() {
40 | const result = oriTarget[funName].call(this, ...arguments)
41 | console.log('添加埋点,在钩子函数' + funName + '中:', 'VIEW')
42 | this.$log('VIEW')
43 | return result
44 | }
45 | }
46 | // 钩子函数中 view
47 | if (target.activated) {
48 | return hookFun('activated')
49 | } else if (target.created) {
50 | return hookFun('created')
51 | } else if (target.mounted) {
52 | return hookFun('mounted')
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/utils/clickoutside.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 |
3 | const isServer = Vue.prototype.$isServer
4 |
5 | /* istanbul ignore next */
6 | export const on = (function() {
7 | if (!isServer && document.addEventListener) {
8 | return function(element, event, handler) {
9 | if (element && event && handler) {
10 | element.addEventListener(event, handler, false)
11 | }
12 | }
13 | } else {
14 | return function(element, event, handler) {
15 | if (element && event && handler) {
16 | element.attachEvent('on' + event, handler)
17 | }
18 | }
19 | }
20 | })()
21 |
22 | const nodeList = []
23 | const ctx = '@@clickoutsideContext'
24 |
25 | let startClick
26 | let seed = 0
27 |
28 | !Vue.prototype.$isServer && on(document, 'mousedown', e => (startClick = e))
29 |
30 | !Vue.prototype.$isServer &&
31 | on(document, 'mouseup', e => {
32 | nodeList.forEach(node => node[ctx].documentHandler(e, startClick))
33 | })
34 |
35 | function createDocumentHandler(el, binding, vnode) {
36 | return function(mouseup = {}, mousedown = {}) {
37 | if (
38 | !vnode ||
39 | !vnode.context ||
40 | !mouseup.target ||
41 | !mousedown.target ||
42 | el.contains(mouseup.target) ||
43 | el.contains(mousedown.target) ||
44 | el === mouseup.target ||
45 | (vnode.context.popperElm &&
46 | (vnode.context.popperElm.contains(mouseup.target) ||
47 | vnode.context.popperElm.contains(mousedown.target)))
48 | ) {
49 | return
50 | }
51 |
52 | if (
53 | binding.expression &&
54 | el[ctx].methodName &&
55 | vnode.context[el[ctx].methodName]
56 | ) {
57 | vnode.context[el[ctx].methodName]()
58 | } else {
59 | el[ctx].bindingFn && el[ctx].bindingFn()
60 | }
61 | }
62 | }
63 |
64 | /**
65 | * v-clickoutside
66 | * @desc 点击元素外面才会触发的事件
67 | * @example
68 | * ```vue
69 | *
70 | * ```
71 | */
72 | export default {
73 | bind(el, binding, vnode) {
74 | nodeList.push(el)
75 | const id = seed++
76 | el[ctx] = {
77 | id,
78 | documentHandler: createDocumentHandler(el, binding, vnode),
79 | methodName: binding.expression,
80 | bindingFn: binding.value
81 | }
82 | },
83 |
84 | update(el, binding, vnode) {
85 | el[ctx].documentHandler = createDocumentHandler(el, binding, vnode)
86 | el[ctx].methodName = binding.expression
87 | el[ctx].bindingFn = binding.value
88 | },
89 |
90 | unbind(el) {
91 | const len = nodeList.length
92 |
93 | for (let i = 0; i < len; i++) {
94 | if (nodeList[i][ctx].id === el[ctx].id) {
95 | nodeList.splice(i, 1)
96 | break
97 | }
98 | }
99 | delete el[ctx]
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/src/utils/createUniqueString.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by jiachenpan on 17/3/8.
3 | */
4 | export default function createUniqueString() {
5 | const timestamp = +new Date() + ''
6 | const randomNum = parseInt((1 + Math.random()) * 65536) + ''
7 | return (+(randomNum + timestamp)).toString(32)
8 | }
9 |
--------------------------------------------------------------------------------
/src/utils/findCom.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 查看组件方法
3 | */
4 |
5 | // 由一个组件,向上找到最近的指定组件
6 | export function findComponentUpward(context, comName) {
7 | let parent = context.$parent
8 | let name = parent.$options.name
9 | while (name && (!name || name !== comName)) {
10 | parent = parent.$parent
11 | if (parent) name = parent.$options.name
12 | }
13 | return parent
14 | }
15 |
16 | // 由一个组件,向上找到所有的指定组件
17 | export function findComponentsUpward(context, comName) {
18 | const parents = []
19 | const parent = context.$parent
20 | if (parent) {
21 | if (parent.$options.name === comName) parents.push(parent)
22 | return parents.concat(findComponentsUpward(parent, comName))
23 | } else {
24 | return []
25 | }
26 | }
27 |
28 | // 由一个组件,向下找到最近的指定组件
29 | export function findComponentDownward(context, comName) {
30 | const childrens = context.$children
31 | let children = null
32 | if (childrens.length) {
33 | for (const child of childrens) {
34 | const name = child.$options.name
35 | if (name === comName) {
36 | children = child
37 | break
38 | } else {
39 | children = findComponentDownward(child, comName)
40 | if (children) break
41 | }
42 | }
43 | }
44 | return children
45 | }
46 |
47 | // 由一个组件,向下找到所有的指定组件
48 | export function findComponentsDownward(context, comName) {
49 | return context.$children.reduce((components, child) => {
50 | if (child.$options.name === comName) components.push(child)
51 | const foundChilds = findComponentsDownward(child, comName)
52 | return components.concat(foundChilds)
53 | }, [])
54 | }
55 |
56 | // 由一个组件,找到指定组件的兄弟组件
57 | export function findSiblingsComponents(context, comName, exceptMe = true) {
58 | const res = context.$parent.$children.filter(
59 | item => item.$options.name === comName
60 | )
61 | if (exceptMe) {
62 | const index = res.findIndex(item => item._uid === context._uid)
63 | res.splice(index, 1)
64 | }
65 | return res
66 | }
67 |
--------------------------------------------------------------------------------
/src/utils/initTheme.js:
--------------------------------------------------------------------------------
1 | import Cookies from 'js-cookie'
2 |
3 | const theme = Cookies.get('theme') || 'blackgold'
4 |
5 | if (theme) {
6 | document.body.className = theme + '-theme'
7 | require(`@/assets/theme/${theme}-theme/index.css`)
8 | }
9 |
--------------------------------------------------------------------------------
/src/utils/permission.js:
--------------------------------------------------------------------------------
1 | import store from '@/store'
2 | import { superAdminId } from '@/utils/auth'
3 |
4 | /**
5 | * @param {Array} value
6 | * @returns {Boolean}
7 | * @example see @/views/permission/directive.vue
8 | */
9 | export default function checkPermission(value) {
10 | if (value && value instanceof Array && value.length > 0) {
11 | const roles = store.getters && store.getters.roles
12 | const permissionRoles = value
13 |
14 | const hasPermission = roles.some(role => {
15 | return permissionRoles.includes(role)
16 | })
17 | // 排除超管
18 | return hasPermission || store.getters.userInfo.id === superAdminId
19 | } else {
20 | console.error(`need roles! Like v-permission="['id']"`)
21 | return false
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/utils/validate.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by jiachenpan on 16/11/18.
3 | */
4 |
5 | /**
6 | * @param {string} path
7 | * @returns {Boolean}
8 | */
9 | export function isExternal(path) {
10 | return /^(https?:|mailto:|tel:)/.test(path)
11 | }
12 |
13 | /* 合法uri*/
14 | export function validateURL(textval) {
15 | const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
16 | return urlregex.test(textval)
17 | }
18 |
19 | /* 小写字母*/
20 | export function validateLowerCase(str) {
21 | const reg = /^[a-z]+$/
22 | return reg.test(str)
23 | }
24 |
25 | /* 大写字母*/
26 | export function validateUpperCase(str) {
27 | const reg = /^[A-Z]+$/
28 | return reg.test(str)
29 | }
30 |
31 | /* 大小写字母*/
32 | export function validateAlphabets(str) {
33 | const reg = /^[A-Za-z]+$/
34 | return reg.test(str)
35 | }
36 |
37 | /**
38 | * validate email
39 | * @param email
40 | * @returns {boolean}
41 | */
42 | export function validateEmail(email) {
43 | const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
44 | return re.test(email)
45 | }
46 |
47 | /* 数字 */
48 | export function validateNumber(number) {
49 | const reg = /^[0-9]+$/
50 | return reg.test(number)
51 | }
52 |
53 | /* 手机号 */
54 | export function validatePhone(phone) {
55 | const reg = /^\d{11}$/
56 | return reg.test(phone)
57 | }
58 |
59 | /* 匹配价格保留两位数 */
60 | export function validateJustFloat(number) {
61 | const reg = /(^[1-9](\d+)?(\.\d{1,2})?$)|(^0$)|(^\d\.\d{1,2}$)/
62 | return reg.test(number)
63 | }
64 |
--------------------------------------------------------------------------------
/src/views/components/Container.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
--------------------------------------------------------------------------------
/src/views/components/Header.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
14 |
15 |
40 |
--------------------------------------------------------------------------------
/src/views/components/MulitiHeader.vue:
--------------------------------------------------------------------------------
1 |
60 |
--------------------------------------------------------------------------------
/src/views/components/Theme.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
10 |
11 | {{ item.label }}
12 |
13 |
14 |
15 |
16 |
17 |
55 |
56 |
100 |
--------------------------------------------------------------------------------
/src/views/components/UpdateRecord.vue:
--------------------------------------------------------------------------------
1 |
2 |
21 |
22 |
23 |
35 |
--------------------------------------------------------------------------------
/src/views/dashboard/components/BarChart.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
106 |
--------------------------------------------------------------------------------
/src/views/dashboard/home.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | Index
4 |
5 |
6 |
7 |
12 |
13 |
16 |
--------------------------------------------------------------------------------
/src/views/dashboard/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
15 |
--------------------------------------------------------------------------------
/src/views/errorPage/401.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Oops!
6 | 你没有权限访问该页面
7 | 如有不满请联系你领导
8 |
9 | -
10 | 或者你可以
11 | 回首页
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
48 |
49 |
90 |
--------------------------------------------------------------------------------
/src/views/foreground/apply/candidatePay.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
--------------------------------------------------------------------------------
/src/views/foreground/apply/refundRecord.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
14 |
--------------------------------------------------------------------------------
/src/views/layout/Layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
57 |
58 |
80 |
--------------------------------------------------------------------------------
/src/views/layout/components/AppMain.vue:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
24 |
25 |
50 |
51 |
83 |
--------------------------------------------------------------------------------
/src/views/layout/components/FastNav.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 报名
4 | 班级查询
5 | 缴退费总览
6 | 配置
7 |
8 |
9 |
10 |
15 |
16 |
46 |
--------------------------------------------------------------------------------
/src/views/layout/components/Sidebar/FixiOSBug.js:
--------------------------------------------------------------------------------
1 | export default {
2 | computed: {
3 | device() {
4 | return this.$store.state.app.device
5 | }
6 | },
7 | mounted() {
8 | // In order to fix the click on menu on the ios device will trigger the mouseeleave bug
9 | // https://github.com/PanJiaChen/vue-element-admin/issues/1135
10 | this.fixBugIniOS()
11 | },
12 | methods: {
13 | fixBugIniOS() {
14 | const $submenu = this.$refs.submenu
15 | if ($submenu) {
16 | const handleMouseleave = $submenu.handleMouseleave
17 | $submenu.handleMouseleave = (e) => {
18 | if (this.device === 'mobile') {
19 | return
20 | }
21 | handleMouseleave(e)
22 | }
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/views/layout/components/Sidebar/Item.vue:
--------------------------------------------------------------------------------
1 |
30 |
--------------------------------------------------------------------------------
/src/views/layout/components/Sidebar/Link.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
40 |
--------------------------------------------------------------------------------
/src/views/layout/components/Sidebar/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
主题切换Demo
10 |
Theme Changer
11 |
12 |
13 |
14 |
24 |
30 |
31 |
32 |
33 |
34 |
56 |
57 |
100 |
--------------------------------------------------------------------------------
/src/views/layout/components/Tips.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
56 |
57 |
82 |
--------------------------------------------------------------------------------
/src/views/layout/components/Weather.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
![]()
6 |
7 |
8 |
{{ weatherInfo.temperature }} / AQI: {{ weatherInfo.aqi }}
9 |
{{ weatherInfo.province }} {{ weatherInfo.city }}
10 |
11 |
12 |
天气获取中...
13 |
14 |
15 |
16 |
38 |
39 |
67 |
--------------------------------------------------------------------------------
/src/views/layout/components/index.js:
--------------------------------------------------------------------------------
1 | export { default as Navbar } from './Navbar'
2 | export { default as Sidebar } from './Sidebar/index.vue'
3 | export { default as TagsView } from './TagsView'
4 | export { default as AppMain } from './AppMain'
5 |
--------------------------------------------------------------------------------
/src/views/layout/mixin/ResizeHandler.js:
--------------------------------------------------------------------------------
1 | import store from '@/store'
2 |
3 | const { body } = document
4 | const WIDTH = 1024
5 | const RATIO = 3
6 |
7 | export default {
8 | watch: {
9 | $route(route) {
10 | if (this.device === 'mobile' && this.sidebar.opened) {
11 | store.dispatch('closeSideBar', { withoutAnimation: false })
12 | }
13 | }
14 | },
15 | beforeMount() {
16 | window.addEventListener('resize', this.resizeHandler)
17 | },
18 | mounted() {
19 | const isMobile = this.isMobile()
20 | if (isMobile) {
21 | store.dispatch('toggleDevice', 'mobile')
22 | store.dispatch('closeSideBar', { withoutAnimation: true })
23 | }
24 | },
25 | methods: {
26 | isMobile() {
27 | const rect = body.getBoundingClientRect()
28 | return rect.width - RATIO < WIDTH
29 | },
30 | resizeHandler() {
31 | if (!document.hidden) {
32 | const isMobile = this.isMobile()
33 | store.dispatch('toggleDevice', isMobile ? 'mobile' : 'desktop')
34 |
35 | if (isMobile) {
36 | store.dispatch('closeSideBar', { withoutAnimation: true })
37 | }
38 | }
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/views/login/authredirect.vue:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/src/views/redirect/index.vue:
--------------------------------------------------------------------------------
1 |
13 |
--------------------------------------------------------------------------------
/src/views/upload/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
41 |
42 |
64 |
--------------------------------------------------------------------------------
/static/vue/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/static/vue/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/static/vue/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Aaminly/vue-element-theme/58f47a8f22a0ab3a919d0a04faafc100a4b50e4d/static/vue/fonts/element-icons.woff
--------------------------------------------------------------------------------