├── .eslintrc.js ├── .postcssrc.js ├── README.md ├── build ├── build.js ├── check-versions.js ├── logo.png ├── utils.js ├── vue-loader.conf.js ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.pro.conf.js ├── config ├── dev.env.js ├── index.js ├── pro.env.js └── sit.env.js ├── index.html ├── package-lock.json ├── package.json ├── src ├── App.vue ├── components │ ├── audit │ │ └── ItemAudit.vue │ ├── checkbox │ │ ├── ColorCheckbox.vue │ │ └── ImgCheckbox.vue │ ├── datetime │ │ └── RangeDate.vue │ ├── editor │ │ └── Editor.vue │ ├── exception │ │ ├── ExceptionPage.vue │ │ └── typeConfig.js │ ├── import │ │ └── ImportExcel.vue │ ├── menu │ │ ├── Contextmenu.vue │ │ ├── SiderMenu.vue │ │ └── menu.js │ ├── setting │ │ ├── Setting.vue │ │ ├── SettingItem.vue │ │ └── StyleItem.vue │ ├── sketch │ │ └── ItemSketch.vue │ ├── tag │ │ └── ItemTag.vue │ ├── tool │ │ └── Drawer.vue │ └── upload-item │ │ └── UploadItem.vue ├── main.js ├── store │ ├── index.js │ └── modules │ │ ├── account.js │ │ └── setting.js ├── utils │ ├── auditItem.js │ ├── baseUtils.js │ ├── chartColor.js │ ├── color.js │ ├── common.js │ ├── commonConstants.js │ ├── corpMap.js │ ├── device.js │ ├── install.js │ ├── localstorage.js │ ├── permissionDirect.js │ ├── quizUtils.js │ ├── request.js │ ├── utils.less │ └── validator.js └── views │ ├── accident-record │ ├── ItemAdd.vue │ ├── ItemEdit.vue │ ├── ItemFactor.vue │ ├── ItemList.vue │ └── ItemParticulars.vue │ ├── bed-sketch │ ├── AllotBed.vue │ ├── BedAllotList.vue │ ├── ItemAdd.vue │ ├── ItemEdit.vue │ ├── ItemFactor.vue │ ├── ItemList.vue │ └── ItemParticulars.vue │ ├── chart │ ├── ChartPage.vue │ └── chart-item │ │ ├── CorpBaseDataBarChart.vue │ │ ├── CorpBaseDataPieChart.vue │ │ ├── CorpLeagueBarChart.vue │ │ ├── CorpPartyBarChart.vue │ │ └── CorpReportBarChart.vue │ ├── common │ ├── EmptyPageView.vue │ ├── GlobalFooter.vue │ ├── GlobalHeader.vue │ ├── GlobalLayout.vue │ ├── HeadInfo.vue │ ├── HeaderAvatar.vue │ ├── MenuView.vue │ ├── PageContent.vue │ ├── PageLayout.vue │ └── PageView.vue │ ├── error │ ├── 403.vue │ ├── 404.vue │ └── 500.vue │ ├── main │ └── MainPage.vue │ ├── nursing-salary │ ├── ItemAdd.vue │ ├── ItemEdit.vue │ ├── ItemFactor.vue │ ├── ItemList.vue │ └── ItemParticulars.vue │ ├── nursing-time-off │ ├── ItemAdd.vue │ ├── ItemEdit.vue │ ├── ItemFactor.vue │ ├── ItemList.vue │ └── ItemParticulars.vue │ ├── old-sketch │ ├── ItemAdd.vue │ ├── ItemEdit.vue │ ├── ItemFactor.vue │ ├── ItemList.vue │ └── ItemParticulars.vue │ ├── others │ ├── Excel.vue │ └── ImportResult.vue │ ├── personal │ ├── Profile.vue │ ├── UpdateAvatar.vue │ ├── UpdatePassword.vue │ └── UpdateProfile.vue │ ├── service-template-config │ ├── ItemAdd.vue │ ├── ItemEdit.vue │ ├── ItemFactor.vue │ └── ItemList.vue │ └── system │ ├── auth-menu │ ├── ButtonAdd.vue │ ├── ButtonEdit.vue │ ├── Icon.less │ ├── Icons.vue │ ├── ItemList.vue │ ├── MenuAdd.vue │ └── MenuEdit.vue │ ├── auth-role │ ├── ItemAdd.vue │ ├── ItemEdit.vue │ └── ItemList.vue │ └── auth-user │ ├── ItemAdd.vue │ ├── ItemEdit.vue │ ├── ItemList.vue │ └── ItemParticulars.vue └── static ├── avatar ├── 17e420c250804efe904a09a33796d5a10.jpg ├── 17e420c250804efe904a09a33796d5a16.jpg ├── 19034103295190235.jpg ├── 1d22f3e41d284f50b2c8fc32e0788698.jpeg ├── 20180414165754.jpg ├── 20180414165815.jpg ├── 20180414165821.jpg ├── 20180414165827.jpg ├── 20180414165834.jpg ├── 20180414165840.jpg ├── 20180414165846.jpg ├── 20180414165855.jpg ├── 20180414165909.jpg ├── 20180414165914.jpg ├── 20180414165920.jpg ├── 20180414165927.jpg ├── 20180414165936.jpg ├── 20180414165942.jpg ├── 20180414165947.jpg ├── 20180414165955.jpg ├── 20180414170003.jpg ├── 2dd7a2d09fa94bf8b5c52e5318868b4d9.jpg ├── 2dd7a2d09fa94bf8b5c52e5318868b4df.jpg ├── 496b3ace787342f7954b7045b8b06804.jpeg ├── 595ba7b05f2e485eb50565a50cb6cc3c.jpeg ├── 5997fedcc7bd4cffbd350b40d1b5b9824.jpg ├── 5997fedcc7bd4cffbd350b40d1b5b987.jpg ├── 87d8194bc9834e9f8f0228e9e530beb1.jpeg ├── 8f5b60ef00714a399ee544d331231820.jpeg ├── 964e40b005724165b8cf772355796c8c.jpeg ├── BiazfanxmamNRoxxVxka.png ├── WhxKECPNujWoWEFNdnJE.png ├── a3b10296862e40edb811418d64455d00.jpeg ├── a43456282d684e0b9319cf332f8ac468.jpeg ├── bba284ac05b041a8b8b0d1927868d5c9x.jpg ├── c7c4ee7be3eb4e73a19887dc713505145.jpg ├── cnrhVkzwxjPwAaCfPbdc.png ├── default.jpg ├── ff698bb2d25c4d218b3256b46c706ece.jpeg ├── gaOngJwsRYRaVAuXXcmB.png ├── jZUIxmJycoymBprLOUbT.png └── ubnKSIfAJTxIgXOKlciN.png ├── file └── city.json ├── img ├── favicon.ico ├── logo-blue.png ├── logo.png ├── map-mark-sign.png ├── map-mark.png ├── party-building-logo.png ├── side-bar-dark.svg ├── side-bar-left.svg ├── side-bar-light.svg └── side-bar-top.svg └── less ├── Chart.less ├── Color.less ├── Common.less ├── ItemParticulars.less └── MapView.less /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parserOptions: { 6 | parser: 'babel-eslint' 7 | }, 8 | env: { 9 | browser: true, 10 | }, 11 | extends: [ 12 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention 13 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. 14 | 'plugin:vue/essential', 15 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md 16 | 'standard' 17 | ], 18 | // required to lint *.vue files 19 | plugins: [ 20 | 'vue' 21 | ], 22 | // add your custom rules here 23 | rules: { 24 | // allow async-await 25 | 'generator-star-spacing': 'off', 26 | // allow debugger during development 27 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SpringBootVueYangLaoZhiYuanZhe 2 | 基于java SpringBoot和Vue养老服务管理志愿者管理系统设计 3 | 4 | 养老服务系统演示视频链接:https://live.csdn.net/v/290332 5 | 6 | 志愿者管理系统演示视频链接:https://live.csdn.net/v/357072 7 | 8 | 以上两个演示视频仅系统名字不一样,功能是一样的。 9 | 10 | 实现的功能: 11 | 12 | 管理员、志愿者、老人亲属三种角色 13 | 14 | 老人信息管理、个性化服务管理、志愿者管理、活动管理、系统管理等 15 | 16 | 用到的技术: 17 | 18 | 后端:java语言,SpringBoot框架,MySQL数据库,Maven依赖管理等 19 | 20 | 前端:vue等 21 | 22 | 详询 微信1:egvh56ufy7hh ,微信2:dabocode 。承接商业项目、课设、毕设和论文,包括但不限于Web、APP、小程序等,课设、毕设提供远程部署和不限次数代码解答! 23 | -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.pro.conf') 13 | 14 | const spinner = ora('>>>>>>>>>>>>>>>>>>>>>buildingApp<<<<<<<<<<<<<<<<<<<<<<<') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, (err, stats) => { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /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').execSync(cmd).toString().trim() 9 | } 10 | 11 | const versionRequirements = [ 12 | { 13 | name: 'node', 14 | currentVersion: semver.clean(process.version), 15 | versionRequirement: packageConfig.engines.node 16 | } 17 | ] 18 | 19 | if (shell.which('npm')) { 20 | versionRequirements.push({ 21 | name: 'npm', 22 | currentVersion: exec('npm --version'), 23 | versionRequirement: packageConfig.engines.npm 24 | }) 25 | } 26 | 27 | module.exports = function () { 28 | const warnings = [] 29 | 30 | for (let i = 0; i < versionRequirements.length; i++) { 31 | const mod = versionRequirements[i] 32 | 33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 34 | warnings.push(mod.name + ': ' + 35 | chalk.red(mod.currentVersion) + ' should be ' + 36 | chalk.green(mod.versionRequirement) 37 | ) 38 | } 39 | } 40 | 41 | if (warnings.length) { 42 | console.log('') 43 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 44 | console.log() 45 | 46 | for (let i = 0; i < warnings.length; i++) { 47 | const warning = warnings[i] 48 | console.log(' ' + warning) 49 | } 50 | 51 | console.log() 52 | process.exit(1) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/build/logo.png -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | //import ExtractTextPlugin from 'extract-text-webpack-plugin' 6 | //VUE.use(ExtractTextPlugin); 7 | const packageConfig = require('../package.json') 8 | 9 | exports.assetsPath = function (_path) { 10 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 11 | ? config.build.assetsSubDirectory 12 | : config.dev.assetsSubDirectory 13 | 14 | return path.posix.join(assetsSubDirectory, _path) 15 | } 16 | 17 | exports.cssLoaders = function (options) { 18 | options = options || {} 19 | 20 | const cssLoader = { 21 | loader: 'css-loader', 22 | options: { 23 | sourceMap: options.sourceMap 24 | } 25 | } 26 | 27 | const postcssLoader = { 28 | loader: 'postcss-loader', 29 | options: { 30 | sourceMap: options.sourceMap 31 | } 32 | } 33 | 34 | // generate loader string to be used with extract text plugin 35 | function generateLoaders (loader, loaderOptions) { 36 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 37 | 38 | if (loader) { 39 | loaders.push({ 40 | loader: loader + '-loader', 41 | options: Object.assign({}, loaderOptions, { 42 | sourceMap: options.sourceMap 43 | }) 44 | }) 45 | } 46 | 47 | // Extract CSS when that option is specified 48 | // (which is the case during production build) 49 | if (options.extract) { 50 | return ExtractTextPlugin.extract({ 51 | use: loaders, 52 | fallback: 'vue-style-loader' 53 | }) 54 | } else { 55 | return ['vue-style-loader'].concat(loaders) 56 | } 57 | } 58 | 59 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 60 | return { 61 | css: generateLoaders(), 62 | postcss: generateLoaders(), 63 | less: generateLoaders('less'), 64 | sass: generateLoaders('sass', { indentedSyntax: true }), 65 | scss: generateLoaders('sass'), 66 | stylus: generateLoaders('stylus'), 67 | styl: generateLoaders('stylus') 68 | } 69 | } 70 | 71 | // Generate loaders for standalone style files (outside of .vue) 72 | exports.styleLoaders = function (options) { 73 | const output = [] 74 | const loaders = exports.cssLoaders(options) 75 | 76 | for (const extension in loaders) { 77 | const loader = loaders[extension] 78 | output.push({ 79 | test: new RegExp('\\.' + extension + '$'), 80 | use: loader 81 | }) 82 | } 83 | 84 | return output 85 | } 86 | 87 | exports.createNotifierCallback = () => { 88 | const notifier = require('node-notifier') 89 | 90 | return (severity, errors) => { 91 | if (severity !== 'error') return 92 | 93 | const error = errors[0] 94 | const filename = error.file && error.file.split('!').pop() 95 | 96 | notifier.notify({ 97 | title: packageConfig.name, 98 | message: severity + ': ' + error.name, 99 | subtitle: filename || '', 100 | icon: path.join(__dirname, 'logo.png') 101 | }) 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | const webpack = require('webpack'); 7 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin') 8 | 9 | function resolve (dir) { 10 | return path.join(__dirname, '..', dir) 11 | } 12 | 13 | const createLintingRule = () => ({ 14 | test: /\.(js|vue)$/, 15 | loader: 'eslint-loader', 16 | enforce: 'pre', 17 | include: [resolve('src'), resolve('test')], 18 | options: { 19 | formatter: require('eslint-friendly-formatter'), 20 | emitWarning: !config.dev.showEslintErrorsInOverlay 21 | } 22 | }) 23 | 24 | module.exports = { 25 | context: path.resolve(__dirname, '../'), 26 | entry: { 27 | app: ['babel-polyfill', './src/main.js'] 28 | }, 29 | output: { 30 | path: config.build.assetsRoot, 31 | filename: '[name].js', 32 | publicPath: process.env.NODE_ENV === 'production' 33 | ? config.build.assetsPublicPath 34 | : config.dev.assetsPublicPath 35 | }, 36 | externals: { //注册index.html中通过<> 37 | 'AMap': 'AMap', 38 | 'AMapUI': 'AMapUI' 39 | }, 40 | resolve: { 41 | extensions: ['.js', '.vue', '.json','.less'], 42 | alias: { 43 | 'vue$': 'vue/dist/vue.esm.js', 44 | '@': resolve('src'), 45 | '~': resolve('src/components'), 46 | 'utils': resolve('src/utils'), 47 | /*使用的时候 @import "~@static/less/Common" webpack 会以~符号作为前缀的路径视为依赖模块去解析*/ 48 | '@static': resolve('static'), 49 | } 50 | }, 51 | module: { 52 | rules: [ 53 | ...(config.dev.useEslint ? [createLintingRule()] : []), 54 | { 55 | test: /\.vue$/, 56 | loader: 'vue-loader', 57 | options: vueLoaderConfig 58 | }, 59 | { 60 | test: /\.js$/, 61 | loader: 'babel-loader', 62 | exclude: /(node_modules|bower_components)/, 63 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] 64 | }, 65 | { 66 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 67 | loader: 'url-loader', 68 | options: { 69 | limit: 10000, 70 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 71 | } 72 | }, 73 | { 74 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 75 | loader: 'url-loader', 76 | options: { 77 | limit: 10000, 78 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 79 | } 80 | }, 81 | { 82 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 83 | loader: 'url-loader', 84 | options: { 85 | limit: 10000, 86 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 87 | } 88 | } 89 | ] 90 | }, 91 | node: { 92 | // prevent webpack from injecting useless setImmediate polyfill because Vue 93 | // source contains it (although only uses it if it's native). 94 | setImmediate: false, 95 | // prevent webpack from injecting mocks to Node native modules 96 | // that does not make sense for the client 97 | dgram: 'empty', 98 | fs: 'empty', 99 | net: 'empty', 100 | tls: 'empty', 101 | child_process: 'empty' 102 | }, 103 | plugins: [ 104 | // Ignore all locale files of moment.js 105 | new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), 106 | new webpack.optimize.UglifyJsPlugin({ 107 | beautify: false, 108 | comments: false, 109 | compress: { 110 | warnings: false, 111 | drop_console: true, 112 | collapse_vars: true, 113 | reduce_vars: true, 114 | }, 115 | cache:true 116 | }), 117 | ] 118 | } 119 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const path = require('path') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin-for-multihtml') 10 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 11 | const portfinder = require('portfinder') 12 | 13 | const HOST = process.env.HOST 14 | const PORT = process.env.PORT && Number(process.env.PORT) 15 | 16 | const devWebpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 19 | }, 20 | // cheap-module-eval-source-map is faster for development 21 | devtool: config.dev.devtool, 22 | 23 | // these devServer options should be customized in /config/index.js 24 | devServer: { 25 | clientLogLevel: 'warning', 26 | historyApiFallback: { 27 | rewrites: [ 28 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, 29 | ], 30 | }, 31 | hot: true, 32 | contentBase: false, // since we use CopyWebpackPlugin. 33 | compress: true, 34 | host: HOST || config.dev.host, 35 | port: PORT || config.dev.port, 36 | open: config.dev.autoOpenBrowser, 37 | overlay: config.dev.errorOverlay 38 | ? { warnings: false, errors: true } 39 | : false, 40 | publicPath: config.dev.assetsPublicPath, 41 | proxy: config.dev.proxyTable, 42 | quiet: true, // necessary for FriendlyErrorsPlugin 43 | watchOptions: { 44 | poll: config.dev.poll, 45 | } 46 | }, 47 | plugins: [ 48 | new webpack.DefinePlugin({ 49 | 'process.env': require('../config/dev.env') 50 | }), 51 | new webpack.HotModuleReplacementPlugin(), 52 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. 53 | new webpack.NoEmitOnErrorsPlugin(), 54 | // https://github.com/ampedandwired/html-webpack-plugin 55 | new HtmlWebpackPlugin({ 56 | filename: 'index.html', 57 | template: 'index.html', 58 | inject: true, 59 | multihtmlCache: true // 解决多页热部署的关键 60 | }), 61 | // copy custom static assets 62 | new CopyWebpackPlugin([ 63 | { 64 | from: path.resolve(__dirname, '../static'), 65 | to: config.dev.assetsSubDirectory, 66 | ignore: ['.*'] 67 | } 68 | ]), 69 | ] 70 | }) 71 | module.exports = new Promise((resolve, reject) => { 72 | portfinder.basePort = process.env.PORT || config.dev.port 73 | portfinder.getPort((err, port) => { 74 | if (err) { 75 | reject(err) 76 | } else { 77 | // publish the new Port, necessary for e2e tests 78 | process.env.PORT = port 79 | // add port to devServer config 80 | devWebpackConfig.devServer.port = port 81 | // Add FriendlyErrorsPlugin 82 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 83 | compilationSuccessInfo: { 84 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], 85 | }, 86 | onErrors: config.dev.notifyOnErrors 87 | ? utils.createNotifierCallback() 88 | : undefined 89 | })) 90 | resolve(devWebpackConfig) 91 | } 92 | }) 93 | }) 94 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./pro.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"dev"', 7 | BASE_API: '"http://127.0.0.1:9006/"', 8 | PROXY_URL: '"http://127.0.0.1:9006/"' 9 | }) 10 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | const BASE_API = process.env.BASE_API; 8 | const PROXY_URL = process.env.PROXY_URL; 9 | 10 | module.exports = { 11 | dev: { 12 | // Paths 13 | assetsSubDirectory: 'static', 14 | assetsPublicPath: '/', 15 | proxyTable: { 16 | '/api': { 17 | //target: 'https://local.scqgkj.com/api', 18 | target: PROXY_URL, 19 | pathRewrite: { 20 | '^/api': '/api' 21 | } 22 | } 23 | }, 24 | // Various Dev Server settingsg 25 | host: 'localhost', // can be overwritten by process.env.HOST 26 | port: 8088, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 27 | autoOpenBrowser: false, 28 | errorOverlay: true, 29 | notifyOnErrors: true, 30 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 31 | 32 | // Use Eslint Loader? 33 | // If true, your code will be linted during bundling and 34 | // linting errors and warnings will be shown in the console. 35 | useEslint: false, 36 | // If true, eslint errors and warnings will also be shown in the error overlay 37 | // in the browser. 38 | showEslintErrorsInOverlay: false, 39 | /** 40 | * Source Maps 41 | */ 42 | // https://webpack.js.org/configuration/devtool/#development 43 | devtool: 'cheap-module-eval-source-map', 44 | // If you have problems debugging vue-files in devtools, 45 | // set this to false - it *may* help 46 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 47 | cacheBusting: true, 48 | cssSourceMap: true 49 | }, 50 | 51 | build: { 52 | // Template for index.html 53 | index: path.resolve(__dirname, '../dist/index.html'), 54 | // Paths 55 | assetsRoot: path.resolve(__dirname, '../dist'), 56 | assetsSubDirectory: 'static', 57 | assetsPublicPath: './', 58 | /** 59 | * Source Maps 60 | */ 61 | productionSourceMap: true, 62 | // https://webpack.js.org/configuration/devtool/#production 63 | devtool: '#source-map', 64 | // Gzip off by default as many popular static hosts such as 65 | // Surge or Netlify already gzip all static assets for you. 66 | // Before setting to `true`, make sure to: 67 | // npm install --save-dev compression-webpack-plugin 68 | productionGzip: true, 69 | productionGzipExtensions: ['js', 'css'], 70 | // Run the build command with an extra argument to 71 | // View the bundle analyzer report after build finishes: 72 | // `npm run build --report` 73 | // Set to `true` or `false` to always turn it on or off 74 | bundleAnalyzerReport: true 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /config/pro.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"pro"', 4 | BASE_API: '"https://www.skywalking.pro/age-stage-api/"' 5 | } 6 | -------------------------------------------------------------------------------- /config/sit.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const devEnv = require('./dev.env') 4 | 5 | module.exports = merge(devEnv, { 6 | NODE_ENV: '"sit"', 7 | BASE_API: '"https://www.skywalking.pro/admin-api/common-platform-api/"' 8 | }) 9 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 志愿者服务管理系统 8 | 9 | 10 | 11 |
12 | 13 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appByVue", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "description": "AppByVue", 6 | "author": "Singer", 7 | "private": true, 8 | "scripts": { 9 | "fix": "npm run fix-memory-limit", 10 | "fix-memory-limit": "cross-env LIMIT=3072 increase-memory-limit", 11 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 12 | "pro": "webpack-dev-server --inline --progress --config build/webpack.pro.conf.js", 13 | "sit": "webpack-dev-server --inline --progress --config build/webpack.sit.conf.js", 14 | "start": "npm run dev --max_old_space_size=9000", 15 | "build:sit": "NODE_ENV=production env_config=sit node --max_old_space_size=9000 build/build.js", 16 | "build:pro": "NODE_ENV=production env_config=pro node --max_old_space_size=9000 build/build.js", 17 | "build:dev": "NODE_ENV=production env_config=dev node --max_old_space_size=9000 build/build.js" 18 | }, 19 | "dependencies": { 20 | "@antv/g2": "^4.1.16", 21 | "ant-design-vue": "^1.7.2", 22 | "area-data": "^5.0.6", 23 | "area-data-vue": "^1.0.9", 24 | "area-linkage-vue": "^5.1.2", 25 | "axios": "^0.18.0", 26 | "babel-polyfill": "^6.26.0", 27 | "color-name": "^1.1.4", 28 | "date-fns": "^1.29.0", 29 | "enquire.js": "^2.1.6", 30 | "html-webpack-plugin-for-multihtml": "^2.30.2", 31 | "js-md5": "^0.7.3", 32 | "vue": "^2.6.14", 33 | "vue-area-linkage": "^5.1.0", 34 | "vue-mini-player": "^0.2.1", 35 | "vue-router": "^3.0.1", 36 | "vue-video-player": "^5.0.2", 37 | "vue-waterfall-easy": "^2.4.4", 38 | "vuedraggable": "^2.16.0", 39 | "vuex": "^3.0.1", 40 | "wangeditor": "^4.6.5" 41 | }, 42 | "devDependencies": { 43 | "autoprefixer": "^7.1.2", 44 | "babel-core": "^6.22.1", 45 | "babel-eslint": "^8.2.1", 46 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 47 | "babel-jest": "^21.0.2", 48 | "babel-loader": "^7.1.1", 49 | "babel-plugin-dynamic-import-node": "^2.3.3", 50 | "babel-plugin-syntax-jsx": "^6.18.0", 51 | "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", 52 | "babel-plugin-transform-runtime": "^6.22.0", 53 | "babel-plugin-transform-vue-jsx": "^3.5.0", 54 | "babel-preset-env": "^1.3.2", 55 | "babel-preset-stage-2": "^6.22.0", 56 | "babel-register": "^6.22.0", 57 | "chalk": "^2.0.1", 58 | "chromedriver": "^2.46.0", 59 | "compression-webpack-plugin": "^1.1.12", 60 | "copy-webpack-plugin": "^4.0.1", 61 | "cross-env": "^6.0.3", 62 | "cross-spawn": "^5.0.1", 63 | "css-loader": "^0.28.0", 64 | "eslint": "^4.15.0", 65 | "eslint-config-standard": "^10.2.1", 66 | "eslint-friendly-formatter": "^3.0.0", 67 | "eslint-loader": "^1.7.1", 68 | "eslint-plugin-import": "^2.7.0", 69 | "eslint-plugin-node": "^5.2.0", 70 | "eslint-plugin-promise": "^3.4.0", 71 | "eslint-plugin-standard": "^3.0.1", 72 | "eslint-plugin-vue": "^4.0.0", 73 | "extract-text-webpack-plugin": "^3.0.2", 74 | "file-loader": "^1.1.4", 75 | "friendly-errors-webpack-plugin": "^1.6.1", 76 | "increase-memory-limit": "^1.0.7", 77 | "jest": "^22.0.4", 78 | "jest-serializer-vue": "^0.3.0", 79 | "less": "^3.7.1", 80 | "less-loader": "^4.1.0", 81 | "nightwatch": "^0.9.12", 82 | "node-notifier": "^5.1.2", 83 | "optimize-css-assets-webpack-plugin": "^3.2.0", 84 | "ora": "^1.2.0", 85 | "portfinder": "^1.0.13", 86 | "postcss-import": "^11.0.0", 87 | "postcss-loader": "^2.0.8", 88 | "postcss-url": "^7.2.1", 89 | "rimraf": "^2.6.0", 90 | "selenium-server": "^3.0.1", 91 | "semver": "^5.3.0", 92 | "shelljs": "^0.7.6", 93 | "uglifyjs-webpack-plugin": "^1.1.1", 94 | "url-loader": "^0.5.8", 95 | "vue-jest": "^1.0.2", 96 | "vue-loader": "^13.3.0", 97 | "vue-style-loader": "^3.0.1", 98 | "vue-template-compiler": "2.6.14", 99 | "webpack": "^3.6.0", 100 | "webpack-bundle-analyzer": "^2.9.0", 101 | "webpack-dev-server": "^2.9.1", 102 | "webpack-merge": "^4.1.0" 103 | }, 104 | "engines": { 105 | "node": ">= 6.0.0", 106 | "npm": ">= 3.0.0" 107 | }, 108 | "browserslist": [ 109 | "> 1%", 110 | "last 2 versions", 111 | "not ie <= 8" 112 | ] 113 | } 114 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 30 | 176 | -------------------------------------------------------------------------------- /src/components/checkbox/ColorCheckbox.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 128 | 129 | 143 | -------------------------------------------------------------------------------- /src/components/checkbox/ImgCheckbox.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 126 | 127 | 147 | -------------------------------------------------------------------------------- /src/components/datetime/RangeDate.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 26 | -------------------------------------------------------------------------------- /src/components/editor/Editor.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 159 | 160 | 180 | -------------------------------------------------------------------------------- /src/components/exception/ExceptionPage.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 35 | 36 | 72 | -------------------------------------------------------------------------------- /src/components/exception/typeConfig.js: -------------------------------------------------------------------------------- 1 | const config = { 2 | 403: { 3 | img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg', 4 | title: '403', 5 | desc: '抱歉,你无权访问该页面' 6 | }, 7 | 404: { 8 | img: 'https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg', 9 | title: '404', 10 | desc: '抱歉,你访问的页面不存在或仍在开发中' 11 | }, 12 | 500: { 13 | img: 'https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg', 14 | title: '500', 15 | desc: '抱歉,服务器出错了' 16 | } 17 | } 18 | 19 | export default config 20 | -------------------------------------------------------------------------------- /src/components/import/ImportExcel.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 68 | 69 | 72 | -------------------------------------------------------------------------------- /src/components/menu/Contextmenu.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 62 | 63 | 72 | -------------------------------------------------------------------------------- /src/components/menu/SiderMenu.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 65 | 66 | 122 | -------------------------------------------------------------------------------- /src/components/menu/menu.js: -------------------------------------------------------------------------------- 1 | import Menu from 'ant-design-vue/es/menu' 2 | import Icon from 'ant-design-vue/es/icon' 3 | 4 | const {Item, SubMenu} = Menu 5 | 6 | export default { 7 | name: 'IMenu', 8 | props: { 9 | menuData: { 10 | type: Array, 11 | required: true 12 | }, 13 | theme: { 14 | type: String, 15 | required: false, 16 | default: 'dark' 17 | }, 18 | mode: { 19 | type: String, 20 | required: false, 21 | default: 'inline' 22 | }, 23 | collapsed: { 24 | type: Boolean, 25 | required: false, 26 | default: false 27 | } 28 | }, 29 | data () { 30 | return { 31 | openKeys: [], 32 | selectedKeys: [], 33 | cachedOpenKeys: [] 34 | } 35 | }, 36 | computed: { 37 | rootSubmenuKeys: (vm) => { 38 | let keys = [] 39 | vm.menuData.forEach(item => { 40 | keys.push(item.path) 41 | }) 42 | return keys 43 | } 44 | }, 45 | created () { 46 | this.updateMenu() 47 | }, 48 | watch: { 49 | collapsed (val) { 50 | if (val) { 51 | this.cachedOpenKeys = this.openKeys 52 | this.openKeys = [] 53 | } else { 54 | this.openKeys = this.cachedOpenKeys 55 | } 56 | }, 57 | '$route': function () { 58 | this.updateMenu() 59 | } 60 | }, 61 | methods: { 62 | renderIcon: function (h, icon) { 63 | return icon === 'none' ? null 64 | : h( 65 | Icon, 66 | { 67 | props: {type: icon} 68 | }) 69 | }, 70 | renderMenuItem: function (h, menu, pIndex, index) { 71 | return h( 72 | Item, 73 | { 74 | key: menu.path ? menu.path : 'item_' + pIndex + '_' + index 75 | }, 76 | [ 77 | h( 78 | 'a', 79 | {attrs: {href: '#' + menu.path}}, 80 | [ 81 | this.renderIcon(h, menu.icon), 82 | h('span', [menu.name]) 83 | ] 84 | ) 85 | ] 86 | ) 87 | }, 88 | renderSubMenu: function (h, menu, pIndex, index) { 89 | const this2_ = this 90 | let subItem = [h('span', 91 | {slot: 'title'}, 92 | [ 93 | this.renderIcon(h, menu.icon), 94 | h('span', [menu.name]) 95 | ] 96 | )] 97 | let itemArr = [] 98 | let pIndex_ = pIndex + '_' + index 99 | menu.children.forEach(function (item, i) { 100 | itemArr.push(this2_.renderItem(h, item, pIndex_, i)) 101 | }) 102 | return h( 103 | SubMenu, 104 | {key: menu.path ? menu.path : 'submenu_' + pIndex + '_' + index}, 105 | subItem.concat(itemArr) 106 | ) 107 | }, 108 | renderItem: function (h, menu, pIndex, index) { 109 | if (!menu.hidden) { 110 | return menu.children ? this.renderSubMenu(h, menu, pIndex, index) : this.renderMenuItem(h, menu, pIndex, index) 111 | } 112 | }, 113 | renderMenu: function (h, menuTree) { 114 | const this2_ = this 115 | let menuArr = [] 116 | menuTree.forEach(function (menu, i) { 117 | if (!menu.hidden) { 118 | menuArr.push(this2_.renderItem(h, menu, '0', i)) 119 | } 120 | }) 121 | return menuArr 122 | }, 123 | onOpenChange (openKeys) { 124 | const latestOpenKey = openKeys.find(key => this.openKeys.indexOf(key) === -1) 125 | if (this.rootSubmenuKeys.indexOf(latestOpenKey) === -1) { 126 | this.openKeys = openKeys 127 | } else { 128 | this.openKeys = latestOpenKey ? [latestOpenKey] : [] 129 | } 130 | }, 131 | updateMenu () { 132 | let routes = this.$route.matched.concat() 133 | if (routes.length >= 4 && this.$route.meta.hidden) { 134 | routes.pop() 135 | this.selectedKeys = [routes[2].path] 136 | } else { 137 | this.selectedKeys = [routes.pop().path] 138 | } 139 | 140 | let openKeys = [] 141 | if (this.mode === 'inline') { 142 | routes.forEach((item) => { 143 | openKeys.push(item.path) 144 | }) 145 | } 146 | 147 | this.collapsed ? this.cachedOpenKeys = openKeys : this.openKeys = openKeys 148 | } 149 | }, 150 | render (h) { 151 | return h( 152 | Menu, 153 | { 154 | props: { 155 | theme: this.$props.theme, 156 | mode: this.$props.mode, 157 | openKeys: this.openKeys, 158 | selectedKeys: this.selectedKeys 159 | }, 160 | on: { 161 | openChange: this.onOpenChange, 162 | select: (obj) => { 163 | this.selectedKeys = obj.selectedKeys 164 | this.$emit('select', obj) 165 | } 166 | } 167 | }, this.renderMenu(h, this.menuData) 168 | ) 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /src/components/setting/Setting.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 125 | 126 | 140 | -------------------------------------------------------------------------------- /src/components/setting/SettingItem.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 14 | 15 | 26 | -------------------------------------------------------------------------------- /src/components/setting/StyleItem.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 16 | 17 | 37 | -------------------------------------------------------------------------------- /src/components/tag/ItemTag.vue: -------------------------------------------------------------------------------- 1 | 52 | 53 | 140 | 157 | -------------------------------------------------------------------------------- /src/components/tool/Drawer.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 64 | 65 | 134 | -------------------------------------------------------------------------------- /src/components/upload-item/UploadItem.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 89 | 90 | 93 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App' 3 | import router from './router' 4 | import Antd from 'ant-design-vue' 5 | import store from './store' 6 | import request from '@/utils/request' 7 | import db from '@/utils/localstorage' 8 | import baseUtils from '@/utils/baseUtils' 9 | import commonConstants from '@/utils/commonConstants' 10 | import validator from '@/utils/validator' 11 | import corpMap from '@/utils/corpMap' 12 | import chartColor from '@/utils/chartColor' 13 | import 'ant-design-vue/dist/antd.css' 14 | import '@/utils/install' 15 | import vueMiniPlayer from 'vue-mini-player' 16 | import 'vue-mini-player/lib/vue-mini-player.css' 17 | import { pcaa } from 'area-data-vue'; 18 | import 'area-linkage-vue/dist/index.css'; 19 | import AreaLinkageVue from 'area-linkage-vue'; 20 | Vue.config.productionTip = false 21 | Vue.use(Antd) 22 | Vue.use(db) 23 | Vue.use(vueMiniPlayer) 24 | Vue.use(AreaLinkageVue) 25 | Vue.use({ 26 | install (Vue) { 27 | Vue.prototype.$db = db 28 | } 29 | }) 30 | Vue.prototype.$post = request.post 31 | Vue.prototype.$get = request.get 32 | Vue.prototype.$put = request.put 33 | Vue.prototype.$putBodyRequest = request.putBodyRequest 34 | Vue.prototype.$delete = request.delete 35 | Vue.prototype.$export = request.export 36 | Vue.prototype.$exportData = request.exportData 37 | Vue.prototype.$download = request.download 38 | Vue.prototype.$upload = request.upload 39 | Vue.prototype.$postFormRequest= request.postFormRequest 40 | Vue.prototype.$postBodyRequest= request.postBodyRequest 41 | Vue.prototype.$isNullOrEmptyArray= baseUtils.isNullOrEmptyArray 42 | Vue.prototype.$isNull= baseUtils.isNull 43 | Vue.prototype.$baseUtils= baseUtils 44 | Vue.prototype.$handleTypeByValue= baseUtils.handleTypeByValue 45 | Vue.prototype.$isNumberString= baseUtils.isNumberString 46 | Vue.prototype.$isIdCardNumber= baseUtils.isIdCardNumber 47 | Vue.prototype.$setPagination= baseUtils.setPagination 48 | Vue.prototype.$setDataSource= baseUtils.setDataSource 49 | Vue.prototype.$handleImageUrl= baseUtils.handleImageUrl 50 | Vue.prototype.$randomString= baseUtils.randomString 51 | Vue.prototype.$commonConstants= commonConstants 52 | Vue.prototype.$validator= validator 53 | Vue.prototype.$corpMap= corpMap 54 | Vue.prototype.$chartColor= chartColor 55 | Vue.prototype.$pcaa = pcaa; 56 | Vue.prototype.$mainColor = 'rgb(42,132,255)' 57 | Vue.prototype.$pageViewBgColor = '#f3f4f6' 58 | Vue.prototype.$commonDark= '#000000' //普通黑色 59 | Vue.prototype.$commonRed= '#ed3f14' //普通红色 60 | Vue.prototype.$commonWhite= '#FFFFFF' //普通白色 61 | Vue.prototype.$sketchColor= '#7D7D7D' //简略信息 62 | Vue.prototype.$commonGreen= 'rgb(83,194,64)' //普通绿色 63 | Vue.prototype.$successCode = '200' 64 | //微信联系方式 65 | Vue.prototype.weChatQRCodeUrl = 'https://singer-coder-public.oss-cn-chengdu.aliyuncs.com/%E5%BE%AE%E4%BF%A1%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F.jpeg' 66 | //微信收款码 67 | Vue.prototype.weChatDonateQRCodeUrl = 'https://singer-coder-public.oss-cn-chengdu.aliyuncs.com/%E5%BE%AE%E4%BF%A1%E6%94%B6%E6%AC%BE%E4%BA%8C%E7%BB%B4%E7%A0%81.png' 68 | //支付宝收钱码 69 | Vue.prototype.aliPayDonateQRCodeUrl = 'https://singer-coder-public.oss-cn-chengdu.aliyuncs.com/%E6%94%AF%E4%BB%98%E5%AE%9D%E6%8D%90%E8%B5%A0.png' 70 | //阿里巴巴开发手册 71 | Vue.prototype.aliCodngGuideUrl = 'https://singer-coder-public.oss-cn-chengdu.aliyuncs.com/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C.png' 72 | /* eslint-disable no-new */ 73 | new Vue({ 74 | router, 75 | store, 76 | render: h => h(App) 77 | }).$mount('#App') 78 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import account from './modules/account' 4 | import setting from './modules/setting' 5 | 6 | Vue.use(Vuex) 7 | 8 | export default new Vuex.Store({ 9 | modules: { 10 | account, 11 | setting 12 | } 13 | }) 14 | -------------------------------------------------------------------------------- /src/store/modules/account.js: -------------------------------------------------------------------------------- 1 | import db from 'utils/localstorage' 2 | 3 | export default { 4 | namespaced: true, 5 | state: { 6 | token: db.get('USER_TOKEN'), 7 | expireTime: db.get('EXPIRE_TIME'), 8 | user: db.get('USER'), 9 | sketch: db.get('SKETCH'), 10 | permissions: db.get('PERMISSIONS'), 11 | roles: db.get('ROLES') 12 | }, 13 | getters: { 14 | getUser: (state) => {return state.user} 15 | }, 16 | mutations: { 17 | setToken (state, val) { 18 | db.save('USER_TOKEN', val) 19 | state.token = val 20 | }, 21 | setExpireTime (state, val) { 22 | db.save('EXPIRE_TIME', val) 23 | state.expireTime = val 24 | }, 25 | setUser (state, val) { 26 | db.save('USER', val) 27 | state.user = val 28 | }, 29 | setSketch (state, val) { 30 | db.save('SKETCH', val) 31 | state.sketch = val 32 | }, 33 | setPermissions (state, val) { 34 | db.save('PERMISSIONS', val) 35 | state.permissions = val 36 | }, 37 | setRoles (state, val) { 38 | db.save('ROLES', val) 39 | state.roles = val 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/store/modules/setting.js: -------------------------------------------------------------------------------- 1 | import db from 'utils/localstorage' 2 | 3 | export default { 4 | namespaced: true, 5 | state: { 6 | sidebar: { 7 | opened: true 8 | }, 9 | settingBar: { 10 | opened: false 11 | }, 12 | isMobile: false, 13 | theme: db.get('THEME', 'light'), 14 | layout: db.get('LAYOUT', 'side'), 15 | systemName: '志愿者服务管理系统', 16 | //copyright: `${new Date().getFullYear()} 养老驿站`, 17 | copyright: ``, 18 | multiPage: getBooleanValue(db.get('MULTI_PAGE'), true), 19 | fixSideBar: getBooleanValue(db.get('FIX_SIDEBAR'), true), 20 | fixHeader: getBooleanValue(db.get('FIX_HEADER'), true), 21 | colorList: [ 22 | 'rgb(245, 34, 45)', 23 | 'rgb(250, 84, 28)', 24 | 'rgb(250, 173, 20)', 25 | 'rgb(66, 185, 131)', 26 | 'rgb(82, 196, 26)', 27 | 'rgb(24, 144, 255)', 28 | 'rgb(47, 84, 235)', 29 | 'rgb(114, 46, 209)' 30 | ], 31 | color: db.get('COLOR', 'rgb(24, 144, 255)') 32 | }, 33 | mutations: { 34 | setDevice (state, isMobile) { 35 | state.isMobile = isMobile 36 | }, 37 | setTheme (state, theme) { 38 | db.save('THEME', theme) 39 | state.theme = theme 40 | }, 41 | setLayout (state, layout) { 42 | db.save('LAYOUT', layout) 43 | state.layout = layout 44 | }, 45 | setMultiPage (state, multiPage) { 46 | db.save('MULTI_PAGE', multiPage) 47 | state.multiPage = multiPage 48 | }, 49 | setSidebar (state, type) { 50 | state.sidebar.opened = type 51 | }, 52 | fixSideBar (state, flag) { 53 | db.save('FIX_SIDEBAR', flag) 54 | state.fixSideBar = flag 55 | }, 56 | fixHeader (state, flag) { 57 | db.save('FIX_HEADER', flag) 58 | state.fixHeader = flag 59 | }, 60 | setSettingBar (state, flag) { 61 | state.settingBar.opened = flag 62 | }, 63 | setColor (state, color) { 64 | db.save('COLOR', color) 65 | state.color = color 66 | } 67 | } 68 | } 69 | 70 | function getBooleanValue (value, defaultValue) { 71 | if (Object.is(value, null)) { 72 | return defaultValue 73 | } 74 | if (JSON.stringify(value) !== '{}') { 75 | return value 76 | } else { 77 | return false 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/utils/auditItem.js: -------------------------------------------------------------------------------- 1 | import request from './request' 2 | import {message, Modal, notification} from 'ant-design-vue' 3 | import store from '@/store' 4 | export const handleToStartStatusUrl = 'api/v1/auditProcess/handleToStartStatus' //把流程直接处理为最初开始的状态 5 | export const handleAuditUrl = 'api/v1/auditProcess/handleProcess' //处理审核提交的URL 6 | export const showAuditRecordUrl = 'api/v1/auditProcess/queryRecordByItemId' //查询审核记录的URL 7 | 8 | //发送get请求 9 | export const getRequest = async (url,params) => { 10 | let res = await request.get(url, 11 | params 12 | ) 13 | if(res){ 14 | return res 15 | }else{ 16 | return {} 17 | } 18 | } 19 | //发送post请求 20 | export const postBodyRequest = async (url,params) => { 21 | let res = await request.postBodyRequest(url, 22 | params 23 | ) 24 | if(res){ 25 | return res 26 | }else{ 27 | return {} 28 | } 29 | } 30 | //返回当前用户 31 | export const currentUser = async() => { 32 | return store.state.account.user 33 | } 34 | export const methodHandler = { 35 | //查询审核记录 36 | async showAuditRecord(itemId){ 37 | if(!itemId){ 38 | return new Array(); 39 | } 40 | let params = { 41 | itemId:itemId 42 | } 43 | let result = await request.get(showAuditRecordUrl,params); 44 | //console.log('data : '+JSON.stringify(result)) 45 | let data = result.data.data; 46 | let itemList = new Array(); 47 | if(data){ 48 | data.map(item => { 49 | //this.auditRecordList.push(item); 50 | itemList.push(item) 51 | }) 52 | } 53 | //console.log('itemList : '+JSON.stringify(itemList)) 54 | return itemList; 55 | }, 56 | //提交审核 57 | async submitAudit(itemId,auditType){ 58 | if(!itemId){ 59 | return {}; 60 | } 61 | if(!auditType){ 62 | return {}; 63 | } 64 | //从表单里面拿到值 65 | let result = await postBodyRequest(handleAuditUrl, { 66 | auditType:auditType, 67 | auditStatus:'APPROVED', 68 | itemId:itemId, 69 | auditRemark:'提交审核' 70 | }) 71 | let data = result.data 72 | if(data){ 73 | message.success('操作成功') 74 | return data; 75 | }else{ 76 | message.error('提交审核出现错误') 77 | return {} 78 | } 79 | }, 80 | //把流程直接处理为最初开始的状态 81 | async itemAuditToStart(itemId,auditType){ 82 | if(!itemId){ 83 | return {}; 84 | } 85 | if(!auditType){ 86 | return {}; 87 | } 88 | let result = await postBodyRequest(handleToStartStatusUrl, { 89 | auditType:auditType, 90 | auditStatus:'WAIT_HANDLE', 91 | itemId:itemId, 92 | auditRemark:'驳回审核' 93 | }) 94 | let data = result.data 95 | if(data){ 96 | message.success('操作成功') 97 | return data; 98 | }else{ 99 | message.error('驳回到最初审核流程出现错误') 100 | return {} 101 | } 102 | }, 103 | async recordWaitHandleShow(currentStep,auditStatus){ 104 | let roleCode = await currentUser.roleCode; 105 | console.log('roleCode : '+roleCode) 106 | if(roleCode == currentStep){ 107 | if(auditStatus == 'WAIT_HANDLE'){ 108 | return true; 109 | }else{ 110 | return false 111 | } 112 | }else{ 113 | return false; 114 | } 115 | }, 116 | } 117 | 118 | export default { 119 | itemAuditToStart:methodHandler.itemAuditToStart, 120 | submitAudit:methodHandler.submitAudit, 121 | showAuditRecord:methodHandler.showAuditRecord, 122 | recordWaitHandleShow:methodHandler.recordWaitHandleShow, 123 | }; 124 | -------------------------------------------------------------------------------- /src/utils/baseUtils.js: -------------------------------------------------------------------------------- 1 | //正则 2 | export const numberPattern = /^(\-|\+)?\d+(\.\d+)?$/; //正数、负数、和小数 3 | export const idCardNumberPattern = /^(\d{15}|\d{17}[\dxX])$/; //身份证号码正则 4 | export const cn = /^[\u4e00-\u9fa5]{0,}$/; //中文 5 | export const phoneNumberPattern = /^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$/ //手机号正则 6 | export const imagePrefix = 'http://ant-fun-web.oss-cn-chengdu.aliyuncs.com/' //图片拼接前缀 7 | const baseUtils = { 8 | randomString(){ 9 | return Math.random().toString(36).slice(-8) 10 | }, 11 | handleImageUrl(url){ 12 | if(this.$isNull(url)){ 13 | return ''; 14 | } 15 | return imagePrefix+url 16 | }, 17 | phoneNumberPattern(){ 18 | return phoneNumberPattern 19 | }, 20 | cn(){ 21 | return cn; 22 | }, 23 | idCardNumberPattern(){ 24 | return idCardNumberPattern; 25 | }, 26 | numberPattern(){ 27 | return numberPattern; 28 | }, 29 | //设置页面分页参数防止空 30 | setPagination(pagination,data){ 31 | if(!baseUtils.isNullOrEmptyArray(data.rows)){ 32 | pagination.total = data.total; 33 | }else{ 34 | pagination.total = 0; 35 | } 36 | return pagination; 37 | }, 38 | //设置Table组件deDataSource 39 | setDataSource(dataSource,data){ 40 | if(!baseUtils.isNullOrEmptyArray(data.rows)){ 41 | dataSource = data.rows 42 | }else{ 43 | dataSource = []; 44 | } 45 | return dataSource; 46 | }, 47 | ///判断数组是否为空 48 | isNullOrEmptyArray(array){ 49 | return (null == array || array.length <= 0); 50 | }, 51 | ///判断对象是否为空 52 | isNull(object){ 53 | if (typeof object === 'object') { 54 | let keys = Object.values(object) 55 | if(keys.length > 0){ 56 | return false; 57 | } 58 | return true 59 | }else { 60 | return object === '' || object === null || object === undefined 61 | } 62 | //return (null == object || object == 'undefined' || object == '' || NaN == object); 63 | }, 64 | rejectEmptyParams(obj) { // 剔除对象的空属性 65 | let data = new Object(); 66 | Object.getOwnPropertyNames(obj).forEach((item, index) => { 67 | if (obj.hasOwnProperty(item)) { // 判断对象中是否有这个属性 68 | let data = obj[item]; 69 | /*console.log('data : '+ data) 70 | console.log('this.$isNull(data) : '+ this.$isNull(data))*/ 71 | if(!this.$isNull(data)){ 72 | //delete obj[item] 73 | data[item] = data 74 | } 75 | } 76 | }) 77 | return data; 78 | }, 79 | //从数组里面删除一个数据 80 | deleteItemFromArray(array,item) { 81 | let index = array.indexOf(item); 82 | array.splice(index, 1) 83 | }, 84 | isIdCardNumber(value){ 85 | return this.matchExp(idCardNumberPattern,value); 86 | }, 87 | isNumberString(value){ 88 | if(this.$isNull(value)){ 89 | return false 90 | } 91 | if(!numberPattern.test(value)){ 92 | return false; 93 | }else{ 94 | return true; 95 | } 96 | return false; 97 | }, 98 | matchExp(pattern,value){ 99 | if(this.$isNull(value) || this.$isNull(pattern)){ 100 | return false 101 | } 102 | if(!pattern.test(value)){ 103 | return false; 104 | }else{ 105 | return true; 106 | } 107 | return false; 108 | }, 109 | isPlainObject(obj) { //是否是纯粹对象 110 | if(typeof obj !== 'object' || obj === null) return false; 111 | let proto = obj 112 | while(Object.getPrototypeOf(proto) !== null) { 113 | proto = Object.getPrototypeOf(proto) 114 | } 115 | return Object.getPrototypeOf(obj) === proto 116 | }, 117 | isString(obj){ //判断对象是否是字符串 118 | return Object.prototype.toString.call(obj) === "[object String]"; 119 | }, 120 | handleTypeByValue(value,optionList){ 121 | //console.log('optionList:'+JSON.stringify(optionList)) 122 | if(this.$isNull(value)){ 123 | console.log('返回空') 124 | return '无' 125 | } 126 | if(this.$isNull(optionList)){ 127 | console.log('optionList返回空') 128 | return ''; 129 | } 130 | let result = 131 | optionList.find(item => item.value == value); 132 | //console.log('result:'+JSON.stringify(result)) 133 | if(!this.$isNull(result)){ 134 | return result.text 135 | }else{ 136 | return '无' 137 | } 138 | }, 139 | } 140 | export default baseUtils; 141 | -------------------------------------------------------------------------------- /src/utils/chartColor.js: -------------------------------------------------------------------------------- 1 | export const chartColor = { 2 | "styleSheet":{ 3 | "brandColor":"#5B8FF9", 4 | "paletteQualitative10":[ 5 | "#5B8FF9", 6 | "#61DDAA", 7 | "#65789B", 8 | "#F6BD16", 9 | "#7262fd", 10 | "#78D3F8", 11 | "#9661BC", 12 | "#F6903D", 13 | "#008685", 14 | "#F08BB4" 15 | ], 16 | "paletteQualitative20":[ 17 | "#5B8FF9", 18 | "#CDDDFD", 19 | "#61DDAA", 20 | "#CDF3E4", 21 | "#65789B", 22 | "#CED4DE", 23 | "#F6BD16", 24 | "#FCEBB9", 25 | "#7262fd", 26 | "#D3CEFD", 27 | "#78D3F8", 28 | "#D3EEF9", 29 | "#9661BC", 30 | "#DECFEA", 31 | "#F6903D", 32 | "#FFE0C7", 33 | "#008685", 34 | "#BBDEDE", 35 | "#F08BB4", 36 | "#FFE0ED" 37 | ] 38 | } 39 | } 40 | 41 | export default { 42 | chartColor:chartColor 43 | }; 44 | -------------------------------------------------------------------------------- /src/utils/color.js: -------------------------------------------------------------------------------- 1 | import { message } from 'ant-design-vue/es' 2 | 3 | let lessNodesAppended 4 | 5 | const updateTheme = primaryColor => { 6 | if (!primaryColor) { 7 | return 8 | } 9 | const hideMessage = message.loading('加载主题...', 0) 10 | function buildIt () { 11 | if (!window.less) { 12 | return 13 | } 14 | setTimeout(() => { 15 | window.less 16 | .modifyVars({ 17 | '@primary-color': primaryColor 18 | }) 19 | .then(() => { 20 | hideMessage() 21 | }) 22 | .catch((e) => { 23 | console.log(e) 24 | message.error('Failed to update theme') 25 | hideMessage() 26 | }) 27 | }, 200) 28 | } 29 | if (!lessNodesAppended) { 30 | // insert less.js and color.less 31 | const lessStyleNode = document.createElement('link') 32 | const lessConfigNode = document.createElement('script') 33 | const lessScriptNode = document.createElement('script') 34 | lessStyleNode.setAttribute('rel', 'stylesheet/less') 35 | lessStyleNode.setAttribute('href', '../static/less/Color.less') 36 | lessConfigNode.innerHTML = ` 37 | window.less = { 38 | async: true, 39 | env: 'production', 40 | javascriptEnabled: true 41 | } 42 | ` 43 | lessScriptNode.src = 'https://cdn.bootcdn.net/ajax/libs/less.js/3.9.0/less.min.js' 44 | lessScriptNode.async = true 45 | lessScriptNode.onload = () => { 46 | buildIt() 47 | lessScriptNode.onload = null 48 | } 49 | document.body.appendChild(lessStyleNode) 50 | document.body.appendChild(lessConfigNode) 51 | document.body.appendChild(lessScriptNode) 52 | lessNodesAppended = true 53 | } else { 54 | buildIt() 55 | } 56 | } 57 | export { updateTheme } 58 | -------------------------------------------------------------------------------- /src/utils/common.js: -------------------------------------------------------------------------------- 1 | export function triggerWindowResizeEvent () { 2 | let event = document.createEvent('HTMLEvents') 3 | event.initEvent('resize', true, true) 4 | event.eventType = 'message' 5 | window.dispatchEvent(event) 6 | } 7 | -------------------------------------------------------------------------------- /src/utils/corpMap.js: -------------------------------------------------------------------------------- 1 | import baseUtils from './baseUtils' 2 | import request from './request' 3 | import {message} from 'ant-design-vue' 4 | export const corpCountUrl = 'api/v1/corpBaseData/countCorpMap'//企业地图统计URL 5 | 6 | 7 | //发送get请求 8 | export const getRequest = async (url,params) => { 9 | let res = await request.get(url, 10 | params 11 | ) 12 | if(res){ 13 | return res 14 | }else{ 15 | return {} 16 | } 17 | } 18 | //发送post请求 19 | export const postBodyRequest = async (url,params) => { 20 | let res = await request.postBodyRequest(url, 21 | params 22 | ) 23 | if(res){ 24 | return res 25 | }else{ 26 | return {} 27 | } 28 | } 29 | export const methodHandler ={ 30 | //查询企业地图信息 31 | async queryCorpMap(params = {}){ 32 | console.log("params : "+JSON.stringify(params)) 33 | let result = await postBodyRequest(corpCountUrl, { 34 | ...params 35 | }) 36 | let data = result.data.data 37 | if(data){ 38 | return data; 39 | }else{ 40 | message.error('查询企业地图信息出现错误') 41 | return {} 42 | } 43 | }, 44 | } 45 | 46 | 47 | export default { 48 | queryCorpMap:methodHandler.queryCorpMap, 49 | }; 50 | -------------------------------------------------------------------------------- /src/utils/device.js: -------------------------------------------------------------------------------- 1 | import enquireJs from 'enquire.js' 2 | 3 | const enquireScreen = function (call) { 4 | const hanlder = { 5 | match: function () { 6 | call && call(true) 7 | }, 8 | unmatch: function () { 9 | call && call(false) 10 | } 11 | } 12 | enquireJs.register('only screen and (max-width: 767.99px)', hanlder) 13 | } 14 | 15 | export default enquireScreen 16 | -------------------------------------------------------------------------------- /src/utils/install.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | import {hasPermission, hasNoPermission, hasAnyPermission, hasRole, hasAnyRole} from 'utils/permissionDirect' 4 | 5 | const Plugins = [ 6 | hasPermission, 7 | hasNoPermission, 8 | hasAnyPermission, 9 | hasRole, 10 | hasAnyRole 11 | ] 12 | 13 | Plugins.map((plugin) => { 14 | Vue.use(plugin) 15 | }) 16 | 17 | export default Vue 18 | -------------------------------------------------------------------------------- /src/utils/localstorage.js: -------------------------------------------------------------------------------- 1 | let db = { 2 | save (key, value) { 3 | localStorage.setItem(key, JSON.stringify(value)) 4 | }, 5 | get (key, defaultValue = {}) { 6 | return JSON.parse(localStorage.getItem(key)) || defaultValue 7 | }, 8 | remove (key) { 9 | localStorage.removeItem(key) 10 | }, 11 | clear () { 12 | localStorage.clear() 13 | } 14 | } 15 | 16 | export default db 17 | -------------------------------------------------------------------------------- /src/utils/permissionDirect.js: -------------------------------------------------------------------------------- 1 | // 定义一些和权限有关的 Vue指令 2 | // 必须包含列出的所有权限,元素才显示 3 | export const hasPermission = { 4 | install (Vue) { 5 | Vue.directive('hasPermission', { 6 | bind (el, binding, vnode) { 7 | let permissions = vnode.context.$store.state.account.permissions 8 | let value = binding.value 9 | let flag = true 10 | for (let v of value) { 11 | if (!permissions.includes(v)) { 12 | flag = false 13 | } 14 | } 15 | if (!flag) { 16 | if (!el.parentNode) { 17 | el.style.display = 'none' 18 | } else { 19 | el.parentNode.removeChild(el) 20 | } 21 | } 22 | } 23 | }) 24 | } 25 | } 26 | 27 | // 当不包含列出的权限时,渲染该元素 28 | export const hasNoPermission = { 29 | install (Vue) { 30 | Vue.directive('hasNoPermission', { 31 | bind (el, binding, vnode) { 32 | let permissions = vnode.context.$store.state.account.permissions 33 | let value = binding.value 34 | let flag = true 35 | for (let v of value) { 36 | if (permissions.includes(v)) { 37 | flag = false 38 | } 39 | } 40 | if (!flag) { 41 | if (!el.parentNode) { 42 | el.style.display = 'none' 43 | } else { 44 | el.parentNode.removeChild(el) 45 | } 46 | } 47 | } 48 | }) 49 | } 50 | } 51 | 52 | // 只要包含列出的任意一个权限,元素就会显示 53 | export const hasAnyPermission = { 54 | install (Vue) { 55 | Vue.directive('hasAnyPermission', { 56 | bind (el, binding, vnode) { 57 | let permissions = vnode.context.$store.state.account.permissions 58 | let value = binding.value 59 | let flag = false 60 | for (let v of value) { 61 | if (permissions.includes(v)) { 62 | flag = true 63 | } 64 | } 65 | if (!flag) { 66 | if (!el.parentNode) { 67 | el.style.display = 'none' 68 | } else { 69 | el.parentNode.removeChild(el) 70 | } 71 | } 72 | } 73 | }) 74 | } 75 | } 76 | 77 | // 必须包含列出的所有角色,元素才显示 78 | export const hasRole = { 79 | install (Vue) { 80 | Vue.directive('hasRole', { 81 | bind (el, binding, vnode) { 82 | let permissions = vnode.context.$store.state.account.roles 83 | let value = binding.value 84 | let flag = true 85 | for (let v of value) { 86 | if (!permissions.includes(v)) { 87 | flag = false 88 | } 89 | } 90 | if (!flag) { 91 | if (!el.parentNode) { 92 | el.style.display = 'none' 93 | } else { 94 | el.parentNode.removeChild(el) 95 | } 96 | } 97 | } 98 | }) 99 | } 100 | } 101 | 102 | // 只要包含列出的任意一个角色,元素就会显示 103 | export const hasAnyRole = { 104 | install (Vue) { 105 | Vue.directive('hasAnyRole', { 106 | bind (el, binding, vnode) { 107 | let permissions = vnode.context.$store.state.account.roles 108 | let value = binding.value 109 | let flag = false 110 | for (let v of value) { 111 | if (permissions.includes(v)) { 112 | flag = true 113 | } 114 | } 115 | if (!flag) { 116 | if (!el.parentNode) { 117 | el.style.display = 'none' 118 | } else { 119 | el.parentNode.removeChild(el) 120 | } 121 | } 122 | } 123 | }) 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /src/utils/quizUtils.js: -------------------------------------------------------------------------------- 1 | //问卷调查相关JS 2 | 3 | 4 | import baseUtils from './baseUtils' 5 | import md5 from 'js-md5' 6 | import moment from 'moment' 7 | 8 | const wjAppKey = 'wjn10op5sliemcuhwg' //问卷网AppKey 9 | const wjUser = 'me。20369691' //问卷网User 10 | const wjAppSecret = 'qzpb5ka8ui1hytce72oxnjfwgdls3604m9' //问卷网AppKey 11 | 12 | 13 | const quizUtils = { 14 | 15 | /** 16 | * 返回数据分析结果链接 17 | * @param shortId 项目短ID 18 | */ 19 | dataAnalysisResultsUrl(shortId){ 20 | if(baseUtils.isNull(shortId)){ 21 | return ''; 22 | } 23 | let current = moment().unix(); 24 | console.log('当前unix时间戳: '+current) 25 | let url = 'http://apitest.wenjuan.com/openapi/v3/get_basic_chart/?wj_appkey='+wjAppKey+'&wj_user='+wjUser+'&wj_short_id='+shortId+'&wj_timestamp='+current+'&wj_signature='; 26 | let needSign = wjAppKey+shortId+current+wjUser+wjAppSecret 27 | console.log('需要签名的字符串: '+needSign) 28 | let sign = md5(needSign) 29 | console.log('签名后的字符串: '+sign) 30 | url = url + sign 31 | console.log('拼接后的URL: '+url) 32 | return url; 33 | }, 34 | 35 | /** 36 | * 返回数据报表结果链接 37 | * @param shortId 项目短ID 38 | */ 39 | dataReportUrl(shortId){ 40 | if(baseUtils.isNull(shortId)){ 41 | return ''; 42 | } 43 | let current = moment().unix(); 44 | console.log('当前unix时间戳: '+current) 45 | let url = 'http://apitest.wenjuan.com/openapi/v3/get_report_chart/?wj_appkey='+wjAppKey+'&wj_user='+wjUser+'&wj_short_id='+shortId+'&wj_timestamp='+current+'&wj_signature='; 46 | let needSign = wjAppKey+shortId+current+wjUser+wjAppSecret 47 | console.log('需要签名的字符串: '+needSign) 48 | let sign = md5(needSign) 49 | console.log('签名后的字符串: '+sign) 50 | url = url + sign 51 | console.log('拼接后的URL: '+url) 52 | return url; 53 | }, 54 | 55 | /** 56 | * 返回数据报表结果链接 57 | * @param shortId 项目短ID 58 | */ 59 | dataAddUrl(){ 60 | let current = moment().unix(); 61 | console.log('当前unix时间戳: '+current) 62 | let url = 'http://apitest.wenjuan.com/openapi/v3/create_proj/?wj_appkey='+wjAppKey+'&wj_user='+wjUser+'&wj_timestamp='+current+'&wj_signature='; 63 | let needSign = wjAppKey+current+wjUser+wjAppSecret 64 | console.log('需要签名的字符串: '+needSign) 65 | let sign = md5(needSign) 66 | console.log('签名后的字符串: '+sign) 67 | url = url + sign 68 | console.log('拼接后的URL: '+url) 69 | return url; 70 | } 71 | 72 | } 73 | 74 | export default quizUtils; 75 | -------------------------------------------------------------------------------- /src/utils/utils.less: -------------------------------------------------------------------------------- 1 | .textOverflow() { 2 | overflow: hidden; 3 | text-overflow: ellipsis; 4 | word-break: break-all; 5 | white-space: nowrap; 6 | } 7 | 8 | .textOverflowMulti(@line: 3, @bg: #fff) { 9 | overflow: hidden; 10 | position: relative; 11 | line-height: 1.5em; 12 | max-height: @line * 1.5em; 13 | text-align: justify; 14 | margin-right: -1em; 15 | padding-right: 1em; 16 | &:before { 17 | background: @bg; 18 | content: '...'; 19 | padding: 0 1px; 20 | position: absolute; 21 | right: 14px; 22 | bottom: 0; 23 | } 24 | &:after { 25 | background: white; 26 | content: ''; 27 | margin-top: 0.2em; 28 | position: absolute; 29 | right: 14px; 30 | width: 1em; 31 | height: 1em; 32 | } 33 | } 34 | .clearfix() { 35 | zoom: 1; 36 | &:before, 37 | &:after { 38 | content: ' '; 39 | display: table; 40 | } 41 | &:after { 42 | clear: both; 43 | visibility: hidden; 44 | font-size: 0; 45 | height: 0; 46 | } 47 | } 48 | 49 | /*表单less样式*/ 50 | .a-form-model{ 51 | display:flex; 52 | justify-content:space-between; 53 | align-content: space-between; 54 | align-items: center; 55 | flex-wrap: wrap; 56 | flex-direction: column; 57 | display: flex; 58 | margin-top: 20px; 59 | .a-form-model-item-view{ 60 | width: 100%; 61 | display: flex; 62 | flex-direction: row; 63 | justify-content: space-between; 64 | .a-form-model-item{ //表单输入框的宽度 65 | width: 50%; 66 | } 67 | .a-form-model-item-single{ //单个表单输入框的宽度 68 | width: 100%; 69 | } 70 | } 71 | } 72 | /*登录表单less样式*/ 73 | .a-form-login-model{ 74 | display:flex; 75 | justify-content: center; /* 水平居中 */ 76 | align-items: center; /* 垂直居中 */ 77 | flex-wrap: wrap; 78 | flex-direction: column; 79 | display: flex; 80 | .a-form-model-login-item{ 81 | display: flex; 82 | } 83 | } 84 | .ant-upload-select-picture-card i { 85 | font-size: 32px; 86 | color: #999; 87 | } 88 | .ant-upload-select-picture-card .ant-upload-text { 89 | margin-top: 8px; 90 | color: #666; 91 | } 92 | .image-upload{ 93 | justify-content: space-between; 94 | align-content: space-between ; 95 | flex-wrap: wrap; 96 | } 97 | .image-upload-item:extend(.ant-upload-list-picture-card-container){ 98 | flex: 1; 99 | width: 70%; 100 | min-width: 70%; 101 | max-width: 25%; 102 | margin-left: 210px; 103 | } 104 | -------------------------------------------------------------------------------- /src/utils/validator.js: -------------------------------------------------------------------------------- 1 | import baseUtils from './baseUtils' 2 | //正则 3 | export const numberPattern = /^(\-|\+)?\d+(\.\d+)?$/; //正数、负数、和小数 4 | export const idCardNumberPattern = /^(\d{15}|\d{17}[\dxX])$/; //身份证号码正则 5 | export const cnPattern = /^[\u4e00-\u9fa5]{0,}$/; //中文 6 | export const phoneNumberPattern = /^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$/ //手机号正则 7 | 8 | //方法处理 9 | export const methodHandler ={ 10 | isCn(value){ 11 | return this.matchExp(cnPattern,value); 12 | }, 13 | isPhoneNumber(value){ 14 | return this.matchExp(phoneNumberPattern,value); 15 | }, 16 | isIdCardNumber(value){ 17 | return this.matchExp(idCardNumberPattern,value); 18 | }, 19 | isNumberString(value){ 20 | if(baseUtils.isNull(value)){ 21 | return false 22 | } 23 | if(!numberPattern.test(value)){ 24 | return false; 25 | }else{ 26 | return true; 27 | } 28 | return false; 29 | }, 30 | matchExp(pattern,value){ 31 | if(baseUtils.isNull(value) || baseUtils.isNull(pattern)){ 32 | return false 33 | } 34 | if(!pattern.test(value)){ 35 | return false; 36 | }else{ 37 | return true; 38 | } 39 | return false; 40 | }, 41 | /** 42 | * @param item 组装的数据item 43 | * @param originalList 原始的数据集合 44 | * @param data 45 | */ 46 | factorContrastData(item,dataList){ 47 | let contrastFactor = item.contrastFactor 48 | let contrastValue = item.contrastFactor 49 | let itemName = item.itemName 50 | //console.log('赋值之前的dataList :' + JSON.stringify(dataList)) 51 | if(dataList && dataList.length > 0 ){ 52 | //console.log('过滤前的dataList :' + JSON.stringify(dataList)) 53 | //先删除原来的数据 54 | dataList = dataList.filter((value,index,array)=>{return value.itemName != itemName;}) 55 | //console.log('过滤之后的dataList :' + JSON.stringify(dataList)) 56 | if(!baseUtils.isNull(contrastFactor) && !baseUtils.isNull(contrastValue)){ 57 | dataList.push(item); 58 | } 59 | }else{ 60 | dataList = new Array(); 61 | dataList.push(item); 62 | } 63 | //console.log('经过处理后的dataList : '+JSON.stringify(dataList)) 64 | return dataList; 65 | }, 66 | } 67 | export default { 68 | numberPattern:numberPattern, 69 | idCardNumberPattern:idCardNumberPattern, 70 | phoneNumberPattern:phoneNumberPattern, 71 | matchExp:methodHandler.matchExp, 72 | isNumberString:methodHandler.isNumberString, 73 | isIdCardNumber:methodHandler.isIdCardNumber, 74 | isPhoneNumber:methodHandler.isPhoneNumber, 75 | isCn:methodHandler.isCn, 76 | factorContrastData:methodHandler.factorContrastData, 77 | }; 78 | -------------------------------------------------------------------------------- /src/views/accident-record/ItemParticulars.vue: -------------------------------------------------------------------------------- 1 | 26 | 127 | -------------------------------------------------------------------------------- /src/views/bed-sketch/ItemParticulars.vue: -------------------------------------------------------------------------------- 1 | 38 | 132 | 139 | -------------------------------------------------------------------------------- /src/views/chart/ChartPage.vue: -------------------------------------------------------------------------------- 1 | 21 | 65 | 68 | -------------------------------------------------------------------------------- /src/views/common/EmptyPageView.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /src/views/common/GlobalFooter.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 17 | 18 | 37 | -------------------------------------------------------------------------------- /src/views/common/GlobalHeader.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 51 | 52 | 144 | -------------------------------------------------------------------------------- /src/views/common/GlobalLayout.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 85 | 86 | 101 | -------------------------------------------------------------------------------- /src/views/common/HeadInfo.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 27 | 28 | 55 | -------------------------------------------------------------------------------- /src/views/common/HeaderAvatar.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 97 | 98 | 114 | -------------------------------------------------------------------------------- /src/views/common/MenuView.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 156 | 157 | 162 | -------------------------------------------------------------------------------- /src/views/common/PageContent.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 43 | 44 | 109 | -------------------------------------------------------------------------------- /src/views/common/PageLayout.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 38 | 39 | 62 | -------------------------------------------------------------------------------- /src/views/common/PageView.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 38 | 39 | 49 | -------------------------------------------------------------------------------- /src/views/error/403.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /src/views/error/404.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /src/views/error/500.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /src/views/nursing-salary/ItemParticulars.vue: -------------------------------------------------------------------------------- 1 | 32 | 127 | -------------------------------------------------------------------------------- /src/views/nursing-time-off/ItemParticulars.vue: -------------------------------------------------------------------------------- 1 | 23 | 118 | -------------------------------------------------------------------------------- /src/views/old-sketch/ItemParticulars.vue: -------------------------------------------------------------------------------- 1 | 49 | 144 | -------------------------------------------------------------------------------- /src/views/others/ImportResult.vue: -------------------------------------------------------------------------------- 1 | 66 | 160 | 170 | -------------------------------------------------------------------------------- /src/views/personal/Profile.vue: -------------------------------------------------------------------------------- 1 | 42 | 99 | 110 | -------------------------------------------------------------------------------- /src/views/personal/UpdateAvatar.vue: -------------------------------------------------------------------------------- 1 | 34 | 104 | 123 | -------------------------------------------------------------------------------- /src/views/personal/UpdateProfile.vue: -------------------------------------------------------------------------------- 1 | 67 | 169 | -------------------------------------------------------------------------------- /src/views/system/auth-menu/ButtonAdd.vue: -------------------------------------------------------------------------------- 1 | 58 | 152 | -------------------------------------------------------------------------------- /src/views/system/auth-menu/ButtonEdit.vue: -------------------------------------------------------------------------------- 1 | 57 | 162 | -------------------------------------------------------------------------------- /src/views/system/auth-menu/Icon.less: -------------------------------------------------------------------------------- 1 | @active-color: #4a4a48; 2 | ul { 3 | max-height: 700px; 4 | overflow-y: auto; 5 | padding-left: .5rem; 6 | i { 7 | font-size: 1.5rem; 8 | border: 1px solid #f1f1f1; 9 | padding: .2rem; 10 | margin: .3rem; 11 | cursor: pointer; 12 | &.active, &:hover { 13 | border-radius: 2px; 14 | border-color: @active-color; 15 | background-color: @active-color; 16 | color: #fff; 17 | transition: all .3s; 18 | } 19 | } 20 | li { 21 | list-style: none; 22 | float: left; 23 | width: 5%; 24 | text-align: center; 25 | cursor: pointer; 26 | color: #555; 27 | transition: color .3s ease-in-out,background-color .3s ease-in-out; 28 | position: relative; 29 | margin: 3px 0; 30 | border-radius: 4px; 31 | background-color: #fff; 32 | overflow: hidden; 33 | padding: 10px 0 0; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/views/system/auth-user/ItemParticulars.vue: -------------------------------------------------------------------------------- 1 | 27 | 67 | 71 | -------------------------------------------------------------------------------- /static/avatar/17e420c250804efe904a09a33796d5a10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/17e420c250804efe904a09a33796d5a10.jpg -------------------------------------------------------------------------------- /static/avatar/17e420c250804efe904a09a33796d5a16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/17e420c250804efe904a09a33796d5a16.jpg -------------------------------------------------------------------------------- /static/avatar/19034103295190235.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/19034103295190235.jpg -------------------------------------------------------------------------------- /static/avatar/1d22f3e41d284f50b2c8fc32e0788698.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/1d22f3e41d284f50b2c8fc32e0788698.jpeg -------------------------------------------------------------------------------- /static/avatar/20180414165754.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165754.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165815.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165815.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165821.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165821.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165827.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165827.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165834.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165834.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165840.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165840.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165846.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165846.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165855.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165855.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165909.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165909.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165914.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165914.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165920.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165920.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165927.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165927.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165936.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165936.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165942.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165942.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165947.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165947.jpg -------------------------------------------------------------------------------- /static/avatar/20180414165955.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414165955.jpg -------------------------------------------------------------------------------- /static/avatar/20180414170003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/20180414170003.jpg -------------------------------------------------------------------------------- /static/avatar/2dd7a2d09fa94bf8b5c52e5318868b4d9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/2dd7a2d09fa94bf8b5c52e5318868b4d9.jpg -------------------------------------------------------------------------------- /static/avatar/2dd7a2d09fa94bf8b5c52e5318868b4df.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/2dd7a2d09fa94bf8b5c52e5318868b4df.jpg -------------------------------------------------------------------------------- /static/avatar/496b3ace787342f7954b7045b8b06804.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/496b3ace787342f7954b7045b8b06804.jpeg -------------------------------------------------------------------------------- /static/avatar/595ba7b05f2e485eb50565a50cb6cc3c.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/595ba7b05f2e485eb50565a50cb6cc3c.jpeg -------------------------------------------------------------------------------- /static/avatar/5997fedcc7bd4cffbd350b40d1b5b9824.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/5997fedcc7bd4cffbd350b40d1b5b9824.jpg -------------------------------------------------------------------------------- /static/avatar/5997fedcc7bd4cffbd350b40d1b5b987.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/5997fedcc7bd4cffbd350b40d1b5b987.jpg -------------------------------------------------------------------------------- /static/avatar/87d8194bc9834e9f8f0228e9e530beb1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/87d8194bc9834e9f8f0228e9e530beb1.jpeg -------------------------------------------------------------------------------- /static/avatar/8f5b60ef00714a399ee544d331231820.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/8f5b60ef00714a399ee544d331231820.jpeg -------------------------------------------------------------------------------- /static/avatar/964e40b005724165b8cf772355796c8c.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/964e40b005724165b8cf772355796c8c.jpeg -------------------------------------------------------------------------------- /static/avatar/BiazfanxmamNRoxxVxka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/BiazfanxmamNRoxxVxka.png -------------------------------------------------------------------------------- /static/avatar/WhxKECPNujWoWEFNdnJE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/WhxKECPNujWoWEFNdnJE.png -------------------------------------------------------------------------------- /static/avatar/a3b10296862e40edb811418d64455d00.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/a3b10296862e40edb811418d64455d00.jpeg -------------------------------------------------------------------------------- /static/avatar/a43456282d684e0b9319cf332f8ac468.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/a43456282d684e0b9319cf332f8ac468.jpeg -------------------------------------------------------------------------------- /static/avatar/bba284ac05b041a8b8b0d1927868d5c9x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/bba284ac05b041a8b8b0d1927868d5c9x.jpg -------------------------------------------------------------------------------- /static/avatar/c7c4ee7be3eb4e73a19887dc713505145.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/c7c4ee7be3eb4e73a19887dc713505145.jpg -------------------------------------------------------------------------------- /static/avatar/cnrhVkzwxjPwAaCfPbdc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/cnrhVkzwxjPwAaCfPbdc.png -------------------------------------------------------------------------------- /static/avatar/default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/default.jpg -------------------------------------------------------------------------------- /static/avatar/ff698bb2d25c4d218b3256b46c706ece.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/ff698bb2d25c4d218b3256b46c706ece.jpeg -------------------------------------------------------------------------------- /static/avatar/gaOngJwsRYRaVAuXXcmB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/gaOngJwsRYRaVAuXXcmB.png -------------------------------------------------------------------------------- /static/avatar/jZUIxmJycoymBprLOUbT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/jZUIxmJycoymBprLOUbT.png -------------------------------------------------------------------------------- /static/avatar/ubnKSIfAJTxIgXOKlciN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/avatar/ubnKSIfAJTxIgXOKlciN.png -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/logo-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/img/logo-blue.png -------------------------------------------------------------------------------- /static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/img/logo.png -------------------------------------------------------------------------------- /static/img/map-mark-sign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/img/map-mark-sign.png -------------------------------------------------------------------------------- /static/img/map-mark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/img/map-mark.png -------------------------------------------------------------------------------- /static/img/party-building-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KakarottoCui/SpringBootVueYangLaoZhiYuanZhe/6e2466442f6dbd4dd24425b5dc2f0dfefe2565c4/static/img/party-building-logo.png -------------------------------------------------------------------------------- /static/img/side-bar-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Group 5 Copy 5 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /static/img/side-bar-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Group 5 Copy 5 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /static/img/side-bar-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Group 5 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /static/img/side-bar-top.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Group 5 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /static/less/Chart.less: -------------------------------------------------------------------------------- 1 | .mainDiv{ 2 | display:flex; 3 | justify-content:space-between; /*元素和元素之间有空格。 */ 4 | align-content: space-between;/*子元素之间取消空白间隙,并把项目放在容器顶部。*/ 5 | flex-wrap: wrap; 6 | flex-direction: column; 7 | display: flex; 8 | width: 100%; 9 | height: 100%; 10 | } 11 | .chartItemGroup{ 12 | width: 100%; 13 | display: flex; 14 | flex-direction: row; 15 | justify-content: space-around; 16 | align-content:space-around; 17 | text-align: center; 18 | } 19 | .mainChartItem{ 20 | display: flex; 21 | flex-direction: column; 22 | text-align: center; 23 | width: 50%; 24 | } 25 | .chartItem{ 26 | width: 80%; 27 | } 28 | .chartText{ 29 | text-align: center; 30 | display: block; 31 | margin-bottom: 10px; 32 | font-weight:bold; 33 | font-size: 20px; 34 | color: #f5f4f9; 35 | } 36 | .chartSearchDiv{ 37 | padding: 24px; 38 | background: #14749b; 39 | border: 1px solid #d9d9d9; 40 | border-radius: 6px; 41 | margin-bottom: 30px; 42 | } 43 | /*图表统计文字*/ 44 | .chartStatisticText{ 45 | font-size: 20px; 46 | color: #f5f4f9; 47 | } 48 | -------------------------------------------------------------------------------- /static/less/Common.less: -------------------------------------------------------------------------------- 1 | .search{ 2 | margin-bottom: 54px; 3 | } 4 | .fold{ 5 | width: calc(100% - 216px); 6 | display: inline-block 7 | } 8 | .operator{ 9 | margin-bottom: 18px; 10 | } 11 | @media screen and (max-width: 900px) { 12 | .fold { 13 | width: 100%; 14 | } 15 | } 16 | .operator button { 17 | margin-right: 5px; 18 | } 19 | i { 20 | cursor: pointer; 21 | } 22 | //搜索框div 23 | .advanced-search-div{ 24 | 25 | } 26 | //搜索框样式 27 | .ant-advanced-search-form { 28 | padding: 24px; 29 | background: #fbfbfb; 30 | border: 1px solid #d9d9d9; 31 | border-radius: 6px; 32 | margin-bottom: 30px; 33 | //flex: 1;让子元素具备相同的长度 34 | flex: 1; 35 | } 36 | -------------------------------------------------------------------------------- /static/less/ItemParticulars.less: -------------------------------------------------------------------------------- 1 | .item-particulars { 2 | background: #fff; 3 | padding: 0 10px 10px 10px; 4 | } 5 | .item-particulars-side { 6 | background: #fff; 7 | } 8 | .item-particulars-side { 9 | max-width: 10rem !important; 10 | min-width: 10rem !important; 11 | width: 10rem !important; 12 | } 13 | .item-content{ 14 | margin-right: 1.2rem; 15 | } 16 | p { 17 | margin-bottom: 1rem; 18 | max-width: 15.5rem; 19 | } 20 | i { 21 | margin-right: .8rem; 22 | } 23 | -------------------------------------------------------------------------------- /static/less/MapView.less: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 100%; 3 | height: 100%; 4 | } 5 | .mapDiv{ 6 | position: relative; 7 | display:flex; 8 | flex-direction: row; 9 | justify-content:space-between; /*元素和元素之间有空格。 */ 10 | align-content: space-between;/*子元素之间取消空白间隙,并把项目放在容器顶部。*/ 11 | } 12 | .mapSearchDiv{ 13 | z-index: 10000; 14 | position: absolute; 15 | width: 400px; 16 | height: 10px; 17 | left:10px; 18 | top:10px; 19 | padding-left: 10px; 20 | } 21 | .switchButton{ 22 | z-index: 10000; 23 | position: absolute; 24 | width: 400px; 25 | height: 10px; 26 | left:20px; 27 | top:10px; 28 | padding-left: 10px; 29 | margin-left: 200px; 30 | } 31 | .statisticDiv{ 32 | z-index: 10000; 33 | position: absolute; 34 | width: 400px; 35 | height: 10px; 36 | left:10px; 37 | top:10px; 38 | padding-left: 10px; 39 | margin-left: 350px; 40 | } 41 | .statisticGroupItem{ 42 | width: 100%; 43 | display: flex; 44 | flex-direction: row; 45 | justify-content: space-between; 46 | background-color: #FFFFFF; 47 | box-shadow: 10px 10px 10px rgba(0,0,0,.5); 48 | border-radius: 8px; 49 | font-weight:bold 50 | } 51 | .mapContainer{ 52 | height: calc(100vh); //可视高度 53 | width: 100%; 54 | } 55 | --------------------------------------------------------------------------------