├── .babelrc
├── .editorconfig
├── .gitignore
├── .postcssrc.js
├── .prettierrc
├── README.md
├── build
├── build.js
├── check-versions.js
├── dev-client.js
├── dev-server.js
├── utils.js
├── vue-loader.conf.js
├── webpack.base.conf.js
├── webpack.dev.conf.js
└── webpack.prod.conf.js
├── config
├── dev.env.js
├── index.js
└── prod.env.js
├── deploy.sh
├── index.html
├── package.json
├── server
├── .gitignore
├── app.js
├── bin
│ ├── global.js
│ └── www
├── config.js
├── controllers
│ ├── book.js
│ └── user.js
├── data
│ ├── book.js
│ └── user.js
├── package.json
├── public
│ ├── images
│ │ ├── apple.jpg
│ │ └── pic_s_200_1.jpg
│ └── stylesheets
│ │ ├── style.css
│ │ └── style.less
├── readme
├── routes
│ ├── api
│ │ └── v1
│ │ │ ├── books.js
│ │ │ ├── index.js
│ │ │ └── users.js
│ └── index.js
└── views
│ ├── error.ejs
│ └── index.ejs
├── src
├── drage.json
├── App.vue
├── api
│ ├── api_book.js
│ ├── api_user.js
│ ├── env.js
│ └── index.js
├── assets
│ ├── iconfont
│ │ ├── demo.css
│ │ ├── demo_fontclass.html
│ │ ├── demo_symbol.html
│ │ ├── demo_unicode.html
│ │ ├── iconfont.css
│ │ ├── iconfont.eot
│ │ ├── iconfont.js
│ │ ├── iconfont.svg
│ │ ├── iconfont.ttf
│ │ └── iconfont.woff
│ ├── images
│ │ ├── 404.gif
│ │ ├── book.png
│ │ ├── cover.jpg
│ │ ├── forest.png
│ │ ├── girl.jpg
│ │ ├── hill.png
│ │ ├── mainbg.jpg
│ │ ├── sunrise.png
│ │ ├── sunshine.png
│ │ └── user.jpeg
│ └── styles
│ │ └── main.scss
├── common
│ └── util.js
├── components
│ ├── Dashboard.vue
│ ├── Drage.vue
│ ├── Home.vue
│ ├── Login.vue
│ ├── Main.vue
│ ├── book
│ │ └── list.vue
│ ├── bookcategory
│ │ └── list.vue
│ ├── govfile
│ │ ├── AcceptFile.vue
│ │ ├── AcceptShow.vue
│ │ └── SendFile.vue
│ ├── office
│ │ ├── CarAdd.vue
│ │ ├── CarList.vue
│ │ ├── MeetAdd.vue
│ │ ├── MeetList.vue
│ │ ├── Supervise.vue
│ │ └── SuperviseTask.vue
│ ├── person
│ │ ├── Timelist.vue
│ │ └── Todo.vue
│ └── user
│ │ ├── changepwd.vue
│ │ ├── list.vue
│ │ └── profile.vue
├── main.js
└── router
│ └── index.js
└── static
├── .gitkeep
└── dagreD3
├── dagre-d3.core.js
├── dagre-d3.core.min.js
├── dagre-d3.core.min.js.map
├── dagre-d3.js
├── dagre-d3.min.js
└── dagre-d3.min.js.map
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", { "modules": false }],
4 | "stage-2"
5 | ],
6 | "plugins": ["transform-runtime"],
7 | "comments": false,
8 | "env": {
9 | "test": {
10 | "presets": ["env", "stage-2"],
11 | "plugins": [ "istanbul" ]
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | // to edit target browsers: use "browserlist" field in package.json
6 | "autoprefixer": {}
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 120,
3 | "semi": true,
4 | "singleQuote": true,
5 | "trailingComma": "none",
6 | "bracketSpacing": true,
7 | "jsxBracketSameLine": false,
8 | "arrowParens": "avoid",
9 | "requirePragma": false,
10 | "proseWrap": "preserve"
11 | }
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Vueadmin
2 | > 一个基于vue2.x编写的后端管理项目
3 |
4 | ## 介绍
5 |
6 |
7 | ### 说明
8 |
9 | 这是一个用vuejs2.0和element-ui 2.x搭建的后台管理界面。
10 |
11 | ### 项目结构
12 | ```
13 | ├── build #webpack编译相关文件目录,一般不用动
14 | ├── config #配置目录
15 | │ ├────dev.env.js #开发环境变量
16 | │ ├────index.js #主配置文件
17 | │ └────prod.env.js #生产环境变量
18 | ├── dist #生产环境下build后的文件存放目录(发布目录)
19 | ├── src #前端项目源码目录
20 | │ ├───—api #封装的接口文件目录
21 | │ ├───—assets #资源目录
22 | │ ├───—common #公用文件目录
23 | │ ├───—components #组件及页面文件目录
24 | │ ├───—router #路由目录
25 | │ ├───—App.vue #项目入口文件
26 | │ └────main.js #项目的核心文件
27 | ├── static #开发模式下的静态资源目录
28 | ├── index.html #首页入口文件,你可以添加一些 meta 信息或同统计代码啥的
29 | ├── package.json #项目配置文件
30 | └── README.md #项目的说明文档,markdown 格式
31 | ```
32 |
33 | ### 相关技术:
34 |
35 | * vuejs2.0:一套构建用户界面的渐进式框架,易用、灵活、高效。
36 | * element-ui:一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的组件库。
37 | * vue-router:官方的路由组件,配合vue.js创建单页应用(SPA)非常简单。
38 | * axios: 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用。
39 |
40 | ## 项目编译和运行
41 |
42 | ``` bash
43 | 第一步: 先安装node环境,可以用nvm安装,支持多版本切换
44 |
45 | 第二步:下载项目
46 | 可以直接在git上下载项目源码。
47 | 或者通过git命令下载
48 | #git命令下载
49 | git clone https://github.com/fanguyun214/VueAdmin
50 |
51 | 假定项目已经下载下来了。
52 |
53 |
54 | 第三步:启动前端
55 | (1)新开一个命令行窗口
56 | (2)定位到项目目录并安装依赖
57 | > cd 你自己的位置/VueAdmin
58 | > npm install
59 | (3)依赖安装成功后执行启动命令
60 | > npm run dev
61 | # 显示如下内容说明本地启动成功
62 | # DONE Compiled successfully in 7515ms
63 | # Listening at http://localhost:8081
64 |
65 |
66 | #正式环境编译命令
67 | # build for production with minification
68 | npm run build
69 |
70 | ```
71 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/build/build.js:
--------------------------------------------------------------------------------
1 | require('./check-versions')()
2 |
3 | process.env.NODE_ENV = 'production'
4 |
5 | var ora = require('ora')
6 | var rm = require('rimraf')
7 | var path = require('path')
8 | var chalk = require('chalk')
9 | var webpack = require('webpack')
10 | var config = require('../config')
11 | var webpackConfig = require('./webpack.prod.conf')
12 |
13 | var spinner = ora('building for production...')
14 | spinner.start()
15 |
16 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
17 | if (err) throw err
18 | webpack(webpackConfig, function (err, stats) {
19 | spinner.stop()
20 | if (err) throw err
21 | process.stdout.write(stats.toString({
22 | colors: true,
23 | modules: false,
24 | children: false,
25 | chunks: false,
26 | chunkModules: false
27 | }) + '\n\n')
28 |
29 | console.log(chalk.cyan(' Build complete.\n'))
30 | console.log(chalk.yellow(
31 | ' Tip: built files are meant to be served over an HTTP server.\n' +
32 | ' Opening index.html over file:// won\'t work.\n'
33 | ))
34 | })
35 | })
36 |
--------------------------------------------------------------------------------
/build/check-versions.js:
--------------------------------------------------------------------------------
1 | var chalk = require('chalk')
2 | var semver = require('semver')
3 | var packageConfig = require('../package.json')
4 |
5 | function exec (cmd) {
6 | return require('child_process').execSync(cmd).toString().trim()
7 | }
8 |
9 | var versionRequirements = [
10 | {
11 | name: 'node',
12 | currentVersion: semver.clean(process.version),
13 | versionRequirement: packageConfig.engines.node
14 | },
15 | {
16 | name: 'npm',
17 | currentVersion: exec('npm --version'),
18 | versionRequirement: packageConfig.engines.npm
19 | }
20 | ]
21 |
22 | module.exports = function () {
23 | var warnings = []
24 | for (let i = 0; i < versionRequirements.length; i++) {
25 | var mod = versionRequirements[i]
26 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
27 | warnings.push(mod.name + ': ' +
28 | chalk.red(mod.currentVersion) + ' should be ' +
29 | chalk.green(mod.versionRequirement)
30 | )
31 | }
32 | }
33 |
34 | if (warnings.length) {
35 | console.log('')
36 | console.log(chalk.yellow('To use this template, you must update following to modules:'))
37 | console.log()
38 | for (let i = 0; i < warnings.length; i++) {
39 | var warning = warnings[i]
40 | console.log(' ' + warning)
41 | }
42 | console.log()
43 | process.exit(1)
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/build/dev-client.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | require('eventsource-polyfill')
3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
4 |
5 | hotClient.subscribe(function (event) {
6 | if (event.action === 'reload') {
7 | window.location.reload()
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/build/dev-server.js:
--------------------------------------------------------------------------------
1 | require('./check-versions')()
2 |
3 | var config = require('../config')
4 | if (!process.env.NODE_ENV) {
5 | process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
6 | }
7 |
8 | var opn = require('opn')
9 | var path = require('path')
10 | var express = require('express')
11 | var webpack = require('webpack')
12 | var proxyMiddleware = require('http-proxy-middleware')
13 | var webpackConfig = require('./webpack.dev.conf')
14 |
15 | // default port where dev server listens for incoming traffic
16 | var port = process.env.PORT || config.dev.port
17 | // automatically open browser, if not set will be false
18 | var autoOpenBrowser = !!config.dev.autoOpenBrowser
19 | // Define HTTP proxies to your custom API backend
20 | // https://github.com/chimurai/http-proxy-middleware
21 | var proxyTable = config.dev.proxyTable
22 |
23 | var app = express()
24 | var compiler = webpack(webpackConfig)
25 |
26 | var devMiddleware = require('webpack-dev-middleware')(compiler, {
27 | publicPath: webpackConfig.output.publicPath,
28 | quiet: true
29 | })
30 |
31 | var hotMiddleware = require('webpack-hot-middleware')(compiler, {
32 | log: () => {}
33 | })
34 | // force page reload when html-webpack-plugin template changes
35 | compiler.plugin('compilation', function (compilation) {
36 | compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
37 | hotMiddleware.publish({ action: 'reload' })
38 | cb()
39 | })
40 | })
41 |
42 | // proxy api requests
43 | Object.keys(proxyTable).forEach(function (context) {
44 | var options = proxyTable[context]
45 | if (typeof options === 'string') {
46 | options = { target: options }
47 | }
48 | app.use(proxyMiddleware(options.filter || context, options))
49 | })
50 |
51 | // handle fallback for HTML5 history API
52 | app.use(require('connect-history-api-fallback')())
53 |
54 | // serve webpack bundle output
55 | app.use(devMiddleware)
56 |
57 | // enable hot-reload and state-preserving
58 | // compilation error display
59 | app.use(hotMiddleware)
60 |
61 | // serve pure static assets
62 | var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
63 | app.use(staticPath, express.static('./static'))
64 |
65 | var uri = 'http://localhost:' + port
66 |
67 | var _resolve
68 | var readyPromise = new Promise(resolve => {
69 | _resolve = resolve
70 | })
71 |
72 | console.log('> Starting dev server...')
73 | devMiddleware.waitUntilValid(() => {
74 | console.log('> Listening at ' + uri + '\n')
75 | // when env is testing, don't need open it
76 | if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
77 | opn(uri)
78 | }
79 | _resolve()
80 | })
81 |
82 | var server = app.listen(port)
83 |
84 | module.exports = {
85 | ready: readyPromise,
86 | close: () => {
87 | server.close()
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/build/utils.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var config = require('../config')
3 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
4 |
5 | exports.assetsPath = function (_path) {
6 | var assetsSubDirectory = process.env.NODE_ENV === 'production'
7 | ? config.build.assetsSubDirectory
8 | : config.dev.assetsSubDirectory
9 | return path.posix.join(assetsSubDirectory, _path)
10 | }
11 |
12 | exports.cssLoaders = function (options) {
13 | options = options || {}
14 |
15 | var cssLoader = {
16 | loader: 'css-loader',
17 | options: {
18 | minimize: process.env.NODE_ENV === 'production',
19 | sourceMap: options.sourceMap
20 | }
21 | }
22 |
23 | // generate loader string to be used with extract text plugin
24 | function generateLoaders (loader, loaderOptions) {
25 | var loaders = [cssLoader]
26 | if (loader) {
27 | loaders.push({
28 | loader: loader + '-loader',
29 | options: Object.assign({}, loaderOptions, {
30 | sourceMap: options.sourceMap
31 | })
32 | })
33 | }
34 |
35 | // Extract CSS when that option is specified
36 | // (which is the case during production build)
37 | if (options.extract) {
38 | return ExtractTextPlugin.extract({
39 | use: loaders,
40 | fallback: 'vue-style-loader'
41 | })
42 | } else {
43 | return ['vue-style-loader'].concat(loaders)
44 | }
45 | }
46 |
47 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html
48 | return {
49 | css: generateLoaders(),
50 | postcss: generateLoaders(),
51 | less: generateLoaders('less'),
52 | sass: generateLoaders('sass', { indentedSyntax: true }),
53 | scss: generateLoaders('sass'),
54 | stylus: generateLoaders('stylus'),
55 | styl: generateLoaders('stylus')
56 | }
57 | }
58 |
59 | // Generate loaders for standalone style files (outside of .vue)
60 | exports.styleLoaders = function (options) {
61 | var output = []
62 | var loaders = exports.cssLoaders(options)
63 | for (var extension in loaders) {
64 | var loader = loaders[extension]
65 | output.push({
66 | test: new RegExp('\\.' + extension + '$'),
67 | use: loader
68 | })
69 | }
70 | return output
71 | }
72 |
--------------------------------------------------------------------------------
/build/vue-loader.conf.js:
--------------------------------------------------------------------------------
1 | var utils = require('./utils')
2 | var config = require('../config')
3 | var isProduction = process.env.NODE_ENV === 'production'
4 |
5 | module.exports = {
6 | loaders: utils.cssLoaders({
7 | sourceMap: isProduction
8 | ? config.build.productionSourceMap
9 | : config.dev.cssSourceMap,
10 | extract: isProduction
11 | })
12 | }
13 |
--------------------------------------------------------------------------------
/build/webpack.base.conf.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var utils = require('./utils')
3 | var config = require('../config')
4 | var vueLoaderConfig = require('./vue-loader.conf')
5 |
6 | function resolve (dir) {
7 | return path.join(__dirname, '..', dir)
8 | }
9 |
10 | module.exports = {
11 | entry: {
12 | app: './src/main.js'
13 | },
14 | output: {
15 | path: config.build.assetsRoot,
16 | filename: '[name].js',
17 | publicPath: process.env.NODE_ENV === 'production'
18 | ? config.build.assetsPublicPath
19 | : config.dev.assetsPublicPath
20 | },
21 | resolve: {
22 | extensions: ['.js', '.vue', '.json'],
23 | alias: {
24 | 'vue$': 'vue/dist/vue.esm.js',
25 | '@': resolve('src')
26 | }
27 | },
28 | module: {
29 | rules: [
30 | {
31 | test: /\.vue$/,
32 | loader: 'vue-loader',
33 | options: vueLoaderConfig
34 | },
35 | {
36 | test: /\.js$/,
37 | loader: 'babel-loader',
38 | include: [resolve('src'), resolve('test')]
39 | },
40 | {
41 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
42 | loader: 'url-loader',
43 | options: {
44 | limit: 10000,
45 | name: utils.assetsPath('img/[name].[hash:7].[ext]')
46 | }
47 | },
48 | {
49 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
50 | loader: 'url-loader',
51 | options: {
52 | limit: 10000,
53 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
54 | }
55 | }
56 | ]
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/build/webpack.dev.conf.js:
--------------------------------------------------------------------------------
1 | var utils = require('./utils')
2 | var webpack = require('webpack')
3 | var config = require('../config')
4 | var merge = require('webpack-merge')
5 | var baseWebpackConfig = require('./webpack.base.conf')
6 | var HtmlWebpackPlugin = require('html-webpack-plugin')
7 | var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
8 |
9 | // add hot-reload related code to entry chunks
10 | Object.keys(baseWebpackConfig.entry).forEach(function (name) {
11 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
12 | })
13 |
14 | module.exports = merge(baseWebpackConfig, {
15 | module: {
16 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
17 | },
18 | // cheap-module-eval-source-map is faster for development
19 | devtool: '#cheap-module-eval-source-map',
20 | plugins: [
21 | new webpack.DefinePlugin({
22 | 'process.env': config.dev.env
23 | }),
24 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
25 | new webpack.HotModuleReplacementPlugin(),
26 | new webpack.NoEmitOnErrorsPlugin(),
27 | // https://github.com/ampedandwired/html-webpack-plugin
28 | new HtmlWebpackPlugin({
29 | filename: 'index.html',
30 | template: 'index.html',
31 | inject: true
32 | }),
33 | new FriendlyErrorsPlugin()
34 | ]
35 | })
36 |
--------------------------------------------------------------------------------
/build/webpack.prod.conf.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var utils = require('./utils')
3 | var webpack = require('webpack')
4 | var config = require('../config')
5 | var merge = require('webpack-merge')
6 | var baseWebpackConfig = require('./webpack.base.conf')
7 | var CopyWebpackPlugin = require('copy-webpack-plugin')
8 | var HtmlWebpackPlugin = require('html-webpack-plugin')
9 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
10 | var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
11 |
12 | var env = config.build.env
13 |
14 | var webpackConfig = merge(baseWebpackConfig, {
15 | module: {
16 | rules: utils.styleLoaders({
17 | sourceMap: config.build.productionSourceMap,
18 | extract: true
19 | })
20 | },
21 | devtool: config.build.productionSourceMap ? '#source-map' : false,
22 | output: {
23 | path: config.build.assetsRoot,
24 | filename: utils.assetsPath('js/[name].[chunkhash].js'),
25 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
26 | },
27 | plugins: [
28 | // http://vuejs.github.io/vue-loader/en/workflow/production.html
29 | new webpack.DefinePlugin({
30 | 'process.env': env
31 | }),
32 | new webpack.optimize.UglifyJsPlugin({
33 | compress: {
34 | warnings: false
35 | },
36 | sourceMap: true
37 | }),
38 | // extract css into its own file
39 | new ExtractTextPlugin({
40 | filename: utils.assetsPath('css/[name].[contenthash].css')
41 | }),
42 | // Compress extracted CSS. We are using this plugin so that possible
43 | // duplicated CSS from different components can be deduped.
44 | new OptimizeCSSPlugin({
45 | cssProcessorOptions: {
46 | safe: true
47 | }
48 | }),
49 | // generate dist index.html with correct asset hash for caching.
50 | // you can customize output by editing /index.html
51 | // see https://github.com/ampedandwired/html-webpack-plugin
52 | new HtmlWebpackPlugin({
53 | filename: config.build.index,
54 | template: 'index.html',
55 | inject: true,
56 | minify: {
57 | removeComments: true,
58 | collapseWhitespace: true,
59 | removeAttributeQuotes: true
60 | // more options:
61 | // https://github.com/kangax/html-minifier#options-quick-reference
62 | },
63 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin
64 | chunksSortMode: 'dependency'
65 | }),
66 | // split vendor js into its own file
67 | new webpack.optimize.CommonsChunkPlugin({
68 | name: 'vendor',
69 | minChunks: function (module, count) {
70 | // any required modules inside node_modules are extracted to vendor
71 | return (
72 | module.resource &&
73 | /\.js$/.test(module.resource) &&
74 | module.resource.indexOf(
75 | path.join(__dirname, '../node_modules')
76 | ) === 0
77 | )
78 | }
79 | }),
80 | // extract webpack runtime and module manifest to its own file in order to
81 | // prevent vendor hash from being updated whenever app bundle is updated
82 | new webpack.optimize.CommonsChunkPlugin({
83 | name: 'manifest',
84 | chunks: ['vendor']
85 | }),
86 | // copy custom static assets
87 | new CopyWebpackPlugin([
88 | {
89 | from: path.resolve(__dirname, '../static'),
90 | to: config.build.assetsSubDirectory,
91 | ignore: ['.*']
92 | }
93 | ])
94 | ]
95 | })
96 |
97 | if (config.build.productionGzip) {
98 | var CompressionWebpackPlugin = require('compression-webpack-plugin')
99 |
100 | webpackConfig.plugins.push(
101 | new CompressionWebpackPlugin({
102 | asset: '[path].gz[query]',
103 | algorithm: 'gzip',
104 | test: new RegExp(
105 | '\\.(' +
106 | config.build.productionGzipExtensions.join('|') +
107 | ')$'
108 | ),
109 | threshold: 10240,
110 | minRatio: 0.8
111 | })
112 | )
113 | }
114 |
115 | if (config.build.bundleAnalyzerReport) {
116 | var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
117 | webpackConfig.plugins.push(new BundleAnalyzerPlugin())
118 | }
119 |
120 | module.exports = webpackConfig
121 |
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | var merge = require('webpack-merge')
2 | var prodEnv = require('./prod.env')
3 |
4 | module.exports = merge(prodEnv, {
5 | NODE_ENV: '"development"'
6 | })
7 |
--------------------------------------------------------------------------------
/config/index.js:
--------------------------------------------------------------------------------
1 | // see http://vuejs-templates.github.io/webpack for documentation.
2 | var path = require('path');
3 |
4 | module.exports = {
5 | build: {
6 | env: require('./prod.env'),
7 | index: path.resolve(__dirname, '../dist/index.html'),
8 | assetsRoot: path.resolve(__dirname, '../dist'),
9 | assetsSubDirectory: 'static',
10 | assetsPublicPath: '/',
11 | productionSourceMap: true,
12 | // Gzip off by default as many popular static hosts such as
13 | // Surge or Netlify already gzip all static assets for you.
14 | // Before setting to `true`, make sure to:
15 | // npm install --save-dev compression-webpack-plugin
16 | productionGzip: false,
17 | productionGzipExtensions: ['js', 'css'],
18 | // Run the build command with an extra argument to
19 | // View the bundle analyzer report after build finishes:
20 | // `npm run build --report`
21 | // Set to `true` or `false` to always turn it on or off
22 | bundleAnalyzerReport: process.env.npm_config_report
23 | },
24 | dev: {
25 | env: require('./dev.env'),
26 | port: 8081,
27 | autoOpenBrowser: true,
28 | assetsSubDirectory: 'static',
29 | assetsPublicPath: '/',
30 | proxyTable: {
31 | // '/api': {
32 | // target: 'http://localhost:3000',
33 | // changeOrigin: true,
34 | // pathRewrite: {
35 | // '^/api': '/api'
36 | // }
37 | // }
38 | },
39 | // CSS Sourcemaps off by default because relative paths are "buggy"
40 | // with this option, according to the CSS-Loader README
41 | // (https://github.com/webpack/css-loader#sourcemaps)
42 | // In our experience, they generally work as expected,
43 | // just be aware of this issue when enabling this option.
44 | cssSourceMap: false,
45 | showEslintErrorsInOverlay: true
46 | }
47 | };
48 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | NODE_ENV: '"production"'
3 | }
4 |
--------------------------------------------------------------------------------
/deploy.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # handle=$1;
4 | # env=$2;
5 |
6 | # 远程部署机 webhook
7 | # 如果用远程机器部署的话就要用到以下方法
8 | # preHandle(){
9 | # git pull orgin master
10 | # npm config set registry http://registry.npm.taobao.org/
11 | # npm install
12 | # npm run build-prod
13 | # }
14 | # 清空dist目录
15 | emptyRemoteDist(){
16 | echo "[exec]remove remote: 118.193.189.35 web"
17 | ssh fanguyun214@118.193.189.35 "rm -rf /web/*"
18 | }
19 | # 发送文件到正式服
20 | transferFileToProSever(){
21 | echo "[exec]transfer file to product:118.193.189.35 sever"
22 | scp -r ./dist/* fanguyun214@118.193.189.35:/web/
23 | }
24 | # 发送文件到测试服
25 | # transferFileToTestSever(){
26 | # echo "[exec]transfer file to development::yourip sever"
27 | # scp -r ./dist/* root@yourip:/www/jiketoutiao_admin/
28 | # }
29 |
30 |
31 | # if [ $handle == "build" ]
32 | # then
33 | # if [ $env == "prod" ]
34 | # then
35 | # env='prod'
36 | # echo "[exec]build ==> build production"
37 | # npm run build
38 | # emptyRemoteDist
39 | # transferFileToProSever
40 | # else
41 | # env='dev'
42 | # echo "[exec]build ==> build development"
43 | # npm run build
44 | # emptyRemoteDist
45 | # transferFileToTestSever
46 | # fi
47 | # fi
48 |
49 | echo "[exec]build ==> build&push"
50 | npm run build
51 | emptyRemoteDist
52 | transferFileToProSever
53 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 武汉教育局OA系统
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "litadmin",
3 | "version": "1.2.0",
4 | "description": "A Vue.js project for admin",
5 | "author": "jerry9022@qq.com",
6 | "private": true,
7 | "scripts": {
8 | "server": "node server/bin/www",
9 | "dev": "node build/dev-server.js",
10 | "build": "node build/build.js",
11 | "deploy": "deploy.sh"
12 | },
13 | "dependencies": {
14 | "axios": "^0.16.2",
15 | "echarts": "^3.8.5",
16 | "element-ui": "^2.4.1",
17 | "lodash": "^4.17.4",
18 | "vue": "^2.5.9",
19 | "vue-fullcalendar": "^1.0.9",
20 | "vue-router": "^2.8.1",
21 | "vue-template-compiler": "^2.5.9",
22 | "vue2-editor": "^2.4.2"
23 | },
24 | "devDependencies": {
25 | "autoprefixer": "^6.7.2",
26 | "babel-core": "^6.26.0",
27 | "babel-loader": "^6.2.10",
28 | "babel-plugin-transform-runtime": "^6.22.0",
29 | "babel-preset-env": "^1.6.0",
30 | "babel-preset-stage-2": "^6.24.1",
31 | "babel-register": "^6.26.0",
32 | "chalk": "^1.1.3",
33 | "connect-history-api-fallback": "^1.3.0",
34 | "copy-webpack-plugin": "^4.0.1",
35 | "css-loader": "^0.26.4",
36 | "eventsource-polyfill": "^0.9.6",
37 | "express": "^4.15.4",
38 | "extract-text-webpack-plugin": "^2.1.2",
39 | "file-loader": "^0.10.0",
40 | "friendly-errors-webpack-plugin": "^1.1.3",
41 | "function-bind": "^1.1.1",
42 | "html-webpack-plugin": "^2.30.1",
43 | "http-proxy-middleware": "^0.17.3",
44 | "jquery": "^3.3.1",
45 | "node-sass": "^4.5.3",
46 | "opn": "^4.0.2",
47 | "optimize-css-assets-webpack-plugin": "^1.3.2",
48 | "ora": "^1.3.0",
49 | "prettier": "1.13.6",
50 | "rimraf": "^2.6.2",
51 | "sass-loader": "^6.0.6",
52 | "semver": "^5.4.1",
53 | "style-loader": "^0.16.1",
54 | "url-loader": "^0.5.9",
55 | "vue-loader": "^11.1.4",
56 | "vue-particles": "^1.0.9",
57 | "vue-style-loader": "^2.0.0",
58 | "webpack": "^2.7.0",
59 | "webpack-bundle-analyzer": "^2.9.0",
60 | "webpack-dev-middleware": "^1.12.0",
61 | "webpack-hot-middleware": "^2.19.1",
62 | "webpack-merge": "^2.6.1"
63 | },
64 | "engines": {
65 | "node": ">= 4.0.0",
66 | "npm": ">= 3.0.0"
67 | },
68 | "browserslist": [
69 | "> 1%",
70 | "last 2 versions",
71 | "not ie <= 8"
72 | ]
73 | }
74 |
--------------------------------------------------------------------------------
/server/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### Node template
3 | # Logs
4 | logs
5 | *.log
6 | npm-debug.log*
7 | yarn-debug.log*
8 | yarn-error.log*
9 |
10 | # Runtime data
11 | pids
12 | *.pid
13 | *.seed
14 | *.pid.lock
15 |
16 | # Directory for instrumented libs generated by jscoverage/JSCover
17 | lib-cov
18 |
19 | # Coverage directory used by tools like istanbul
20 | coverage
21 |
22 | # nyc test coverage
23 | .nyc_output
24 |
25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
26 | .grunt
27 |
28 | # Bower dependency directory (https://bower.io/)
29 | bower_components
30 |
31 | # node-waf configuration
32 | .lock-wscript
33 |
34 | # Compiled binary addons (http://nodejs.org/api/addons.html)
35 | build/Release
36 |
37 | # Dependency directories
38 | node_modules/
39 | jspm_packages/
40 |
41 | # Typescript v1 declaration files
42 | typings/
43 |
44 | # Optional npm cache directory
45 | .npm
46 |
47 | # Optional eslint cache
48 | .eslintcache
49 |
50 | # Optional REPL history
51 | .node_repl_history
52 |
53 | # Output of 'npm pack'
54 | *.tgz
55 |
56 | # Yarn Integrity file
57 | .yarn-integrity
58 |
59 | # dotenv environment variables file
60 | .env
61 |
62 |
63 |
--------------------------------------------------------------------------------
/server/app.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var path = require('path');
3 | var favicon = require('serve-favicon');
4 | var logger = require('morgan');
5 | var cookieParser = require('cookie-parser');
6 | var bodyParser = require('body-parser');
7 | var lessMiddleware = require('less-middleware');
8 | var session = require('express-session');
9 | // var cors = require('cors');
10 |
11 | var index = require('./routes/index');
12 |
13 | var app = express();
14 |
15 | // view engine setup
16 | app.set('views', path.join(__dirname, 'views'));
17 | app.set('view engine', 'ejs');
18 | // uncomment after placing your favicon in /public
19 | //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
20 | app.use(logger('dev'));
21 | app.use(bodyParser.json());
22 | app.use(bodyParser.urlencoded({extended: false}));
23 | app.use(cookieParser());
24 | app.use(session({
25 | resave: false,
26 | saveUninitialized: false,
27 | cookie: {maxAge: 24 * 60 * 60 * 1000}, //设置maxAge是1天,即1天后session和相应的cookie失效过期
28 | secret: 'love'
29 | }));
30 | app.use(lessMiddleware(path.join(__dirname, 'public')));
31 | app.use(express.static(path.join(__dirname, 'public')));
32 |
33 | //跨域问题处理
34 | // app.use(cors());
35 | app.all('*', function (req, res, next) {
36 | res.header('Access-Control-Allow-Origin', "http://localhost:8081");
37 | res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH,OPTIONS');
38 | res.header('Access-Control-Allow-Headers', 'Content-Type');
39 | res.header('Access-Control-Allow-Credentials','true'); //告诉客户端可以在HTTP请求中带上Cookie
40 | next();
41 | })
42 |
43 | app.use('/', index.router);
44 |
45 | // catch 404 and forward to error handler
46 | app.use(function (req, res, next) {
47 | var err = new Error('Not Found');
48 | err.status = 404;
49 | next(err);
50 | });
51 |
52 | // error handler
53 | app.use(function (err, req, res, next) {
54 | // set locals, only providing error in development
55 | res.locals.message = err.message;
56 | res.locals.error = req.app.get('env') === 'development' ? err : {};
57 |
58 | // render the error page
59 | res.status(err.status || 500);
60 | res.render('error');
61 | });
62 |
63 | module.exports = app;
64 |
--------------------------------------------------------------------------------
/server/bin/global.js:
--------------------------------------------------------------------------------
1 | global.$fs = require('fs');
2 | global.$path = require('path');
3 | global._ = require('lodash');
4 |
--------------------------------------------------------------------------------
/server/bin/www:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /**
4 | * Module dependencies.
5 | */
6 | require('./global');
7 |
8 | var app = require('../app');
9 | var debug = require('debug')('empty:server');
10 | var http = require('http');
11 |
12 | /**
13 | * Get port from environment and store in Express.
14 | */
15 |
16 | var port = normalizePort(process.env.PORT || '3000');
17 | app.set('port', port);
18 |
19 | /**
20 | * Create HTTP server.
21 | */
22 |
23 | var server = http.createServer(app);
24 |
25 | /**
26 | * Listen on provided port, on all network interfaces.
27 | */
28 |
29 | server.listen(port);
30 | server.on('error', onError);
31 | server.on('listening', onListening);
32 |
33 | /**
34 | * Normalize a port into a number, string, or false.
35 | */
36 |
37 | function normalizePort(val) {
38 | var port = parseInt(val, 10);
39 |
40 | if (isNaN(port)) {
41 | // named pipe
42 | return val;
43 | }
44 |
45 | if (port >= 0) {
46 | // port number
47 | return port;
48 | }
49 |
50 | return false;
51 | }
52 |
53 | /**
54 | * Event listener for HTTP server "error" event.
55 | */
56 |
57 | function onError(error) {
58 | if (error.syscall !== 'listen') {
59 | throw error;
60 | }
61 |
62 | var bind = typeof port === 'string'
63 | ? 'Pipe ' + port
64 | : 'Port ' + port;
65 |
66 | // handle specific listen errors with friendly messages
67 | switch (error.code) {
68 | case 'EACCES':
69 | console.error(bind + ' requires elevated privileges');
70 | process.exit(1);
71 | break;
72 | case 'EADDRINUSE':
73 | console.error(bind + ' is already in use');
74 | process.exit(1);
75 | break;
76 | default:
77 | throw error;
78 | }
79 | }
80 |
81 | /**
82 | * Event listener for HTTP server "listening" event.
83 | */
84 |
85 | function onListening() {
86 | var addr = server.address();
87 | var bind = typeof addr === 'string'
88 | ? 'pipe ' + addr
89 | : 'port ' + addr.port;
90 | debug('Listening on ' + bind);
91 | console.log('server is runing... Listening on ' + bind)
92 | if (bind.indexOf("port") > -1) {
93 | var uri = 'http://localhost:' + addr.port;
94 | console.log('> Listening at ' + uri + '\n')
95 | }
96 |
97 | }
98 |
--------------------------------------------------------------------------------
/server/config.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by jerry on 2017/7/6.
3 | */
4 | var path = require('path');
5 | module.exports = {
6 | publicPath: path.join(__dirname, 'public')
7 | }
--------------------------------------------------------------------------------
/server/controllers/book.js:
--------------------------------------------------------------------------------
1 | /**
2 | * books 控制器
3 | * Created by jerry on 2017/11/2.
4 | */
5 | const Mock = require('mockjs');
6 | const Books = require('../data/book');
7 | let bookController = {};
8 | let _Books = Books;
9 |
10 | /**
11 | * 通过书名查询,获取图书列表
12 | * @param req
13 | * @param res
14 | */
15 | bookController.find = function (req, res) {
16 | let page = parseInt(req.query.page || 1); //页码(默认第1页)
17 | let limit = parseInt(req.query.limit || 10); //每页显示条数(默认10条)
18 | let name = req.query.name || ''; //图书名称
19 | let total = 0;
20 | let rltBooks = [];
21 | if (name.length > 0) {
22 | let mockBooks = _Books.filter(book => {
23 | return book.name.indexOf(name) > -1;
24 | });
25 | total = mockBooks.length; //总条数
26 | rltBooks = mockBooks.filter((u, index) => index < limit * page && index >= limit * (page - 1))
27 | } else {
28 | total = _Books.length; //总条数
29 | rltBooks = _Books.filter((u, index) => index < limit * page && index >= limit * (page - 1))
30 | }
31 | res.json({
32 | total: total,
33 | limit: limit,
34 | books: rltBooks
35 | })
36 | };
37 |
38 | /**
39 | * 通过id获取某一条图书新
40 | * @param req
41 | * @param res
42 | */
43 | bookController.findById = function (req, res) {
44 | let id = _.trim(req.params.id || '');
45 | if (!id) {
46 | return res.json({"errcode": 40002, "errmsg": "不合法的参数"});
47 | }
48 | let book = _.find(_Books, function (b) {
49 | return b.id === id;
50 | });
51 | res.json(book || null)
52 | };
53 |
54 | /**
55 | * 添加一条图书信息
56 | * @param req
57 | * @param res
58 | */
59 | bookController.create = function (req, res) {
60 | let name = req.body.name;
61 | let author = req.body.author;
62 | let description = req.body.description;
63 | let publishAt = req.body.publishAt;
64 | _Books.push({
65 | id: Mock.Random.guid(),
66 | name: name,
67 | author: author,
68 | description: description,
69 | publishAt: publishAt
70 | });
71 | res.json({"errcode": 0, "errmsg": "新增成功"})
72 | };
73 |
74 | /***
75 | * 更新一条图书记录
76 | * @param req
77 | * @param res
78 | */
79 | bookController.update = function (req, res) {
80 | let id = _.trim(req.params.id || '');
81 | if (!id) {
82 | return res.json({"errcode": 40002, "errmsg": "不合法的参数"});
83 | }
84 | let name = req.body.name;
85 | let author = req.body.author;
86 | let description = req.body.description;
87 | let publishAt = req.body.publishAt;
88 |
89 | let i = _.findIndex(_Books, function (u) {
90 | return u.id === id
91 | })
92 | if (i > -1) {
93 | _Books[i].name = name;
94 | _Books[i].author = author;
95 | _Books[i].description = description;
96 | _Books[i].publishAt = publishAt;
97 | res.json({"errcode": 0, "errmsg": "修改成功"});
98 | } else {
99 | res.json({"errcode": 40009, "errmsg": "处理失败"});
100 | }
101 | };
102 |
103 | /**
104 | * 更新一条图书记录的部分信息
105 | * @param req
106 | * @param res
107 | */
108 | bookController.patch = function (req, res) {
109 |
110 | };
111 |
112 | /**
113 | * 批量删除
114 | * @param req
115 | * @param res
116 | */
117 | bookController.deleteBatch = function (req, res) {
118 | let ids = req.params.ids;
119 | ids = ids.split(',');
120 | _Books = _Books.filter(b => !ids.includes(b.id))
121 | res.json({"errcode": 0, "errmsg": "删除成功"});
122 | };
123 |
124 | /**
125 | * 单条删除
126 | * @param req
127 | * @param res
128 | */
129 | bookController.delete = function (req, res) {
130 | let id = _.trim(req.params.id || '');
131 | if (!id) {
132 | return res.json({"errcode": 40002, "errmsg": "不合法的参数"});
133 | }
134 | let i = _.findIndex(_Books, function (u) {
135 | return u.id === id
136 | })
137 | if (i > -1) {
138 | _Books.splice(i, 1);
139 | res.json({"errcode": 0, "errmsg": "修改成功"});
140 | } else {
141 | res.json({"errcode": 40009, "errmsg": "处理失败"});
142 | }
143 | };
144 |
145 | module.exports = bookController;
146 |
--------------------------------------------------------------------------------
/server/controllers/user.js:
--------------------------------------------------------------------------------
1 | /**
2 | * users 控制器
3 | *
4 | * Created by jerry on 2017/11/2.
5 | */
6 | const Users = require('../data/user');
7 | let userController = {};
8 | let _Users = Users;
9 |
10 | /**
11 | * 检查用户的登录状态
12 | * @param req
13 | * @param res
14 | * @param next
15 | */
16 | userController.checkLogin = function (req, res, next) {
17 | //用户已经登录
18 | if (req.session.userId) {
19 | next();
20 | }
21 | else {
22 | res.json({"errcode": 40001, "errmsg": "您还没有登录"});
23 | }
24 | };
25 |
26 | /**
27 | * 登录
28 | * @param req
29 | * @param res
30 | */
31 | userController.login = function (req, res) {
32 | let username = _.trim(req.query.username || req.body.username || '');
33 | let pwd = req.body.pwd;
34 | if (!username || !pwd) {
35 | return res.json({"errcode": 40002, "errmsg": "不合法的参数"});
36 | }
37 |
38 | // 通过用户名获取到用户信息
39 | let user = _.find(_Users, function (u) {
40 | return u.username === username;
41 | });
42 | console.log('---_Users----');
43 | console.log(_Users);
44 | if (!user) {
45 | return res.json({"errcode": 40003, "errmsg": "用户不存在"});
46 | }
47 | if (user.password === pwd) {
48 | //设置session
49 | req.session.userId = user.id;
50 |
51 | return res.json({
52 | id: user.id,
53 | username: user.username,
54 | nickname: user.nickname,
55 | name: user.name,
56 | email: user.email
57 | });
58 | } else {
59 | return res.json({"errcode": 40004, "errmsg": "密码错误"});
60 | }
61 | };
62 |
63 | /**
64 | * 退出登录
65 | * @param req
66 | * @param res
67 | */
68 | userController.logout = function (req, res) {
69 | req.session.destroy();
70 | res.json({"errcode": 0, "errmsg": "退出完成"});
71 | };
72 |
73 | /**
74 | * 修改个人部分信息
75 | * @param req
76 | * @param res
77 | */
78 | userController.profile = function (req, res) {
79 | let nickname = req.body.nickname;
80 | let email = req.body.email;
81 | let name = req.body.name;
82 | let i = _.findIndex(_Users, function (u) {
83 | return u.id === req.session.userId
84 | })
85 | if (i > -1) {
86 | _Users[i].nickname = nickname;
87 | _Users[i].email = email;
88 | _Users[i].name = name;
89 | res.json({"errcode": 0, "errmsg": "修改成功"});
90 | } else {
91 | res.json({"errcode": 40009, "errmsg": "处理失败"});
92 | }
93 | };
94 |
95 | /**
96 | * 修改密码
97 | * @param req
98 | * @param res
99 | */
100 | userController.changepwd = function (req, res) {
101 | //TODO 未开发
102 | };
103 |
104 | /**
105 | * 通过书名查询,获取图书列表
106 | * @param req
107 | * @param res
108 | */
109 | userController.find = function (req, res) {
110 | let page = parseInt(req.query.page || 1); //页码(默认第1页)
111 | let limit = parseInt(req.query.limit || 10); //每页显示条数(默认10条)
112 | let name = req.query.name || '';
113 | let total = 0;
114 | let rltUsers = [];
115 | if (name.length > 0) {
116 | let mockUsers = _Users.filter(user => {
117 | return (user.username.indexOf(name) > -1 || user.nickname.indexOf(name) > -1 || user.name.indexOf(name) > -1)
118 | });
119 | total = mockUsers.length; //总条数
120 | rltUsers = mockUsers.filter((u, index) => index < limit * page && index >= limit * (page - 1))
121 | } else {
122 | total = _Users.length; //总条数
123 | rltUsers = _Users.filter((u, index) => index < limit * page && index >= limit * (page - 1))
124 | }
125 | res.json({
126 | total: total,
127 | limit: limit,
128 | users: rltUsers
129 | })
130 | };
131 |
132 | module.exports = userController;
133 |
--------------------------------------------------------------------------------
/server/data/book.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 初始化图书(book)模拟数据
3 | *
4 | * Created by jerry on 2017/11/13.
5 | */
6 | const Mock = require('mockjs');
7 |
8 | const Books = [];
9 | for (let i = 0; i < 100; i++) {
10 | Books.push(Mock.mock({
11 | id: Mock.Random.guid(),
12 | name: Mock.Random.ctitle(2, 12),
13 | author: Mock.Random.cname(),
14 | description: Mock.Random.csentence(180, 500),
15 | publishAt: Mock.Random.date()
16 | }))
17 | }
18 |
19 | module.exports = Books;
20 |
--------------------------------------------------------------------------------
/server/data/user.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by jerry on 2017/11/13.
3 | * 初始化用户(user)模拟数据
4 | *
5 | * Created by jerry on 2017/11/13.
6 | */
7 | const Users = [];
8 | Users.push({
9 | id: 1,
10 | username: 'admin', //用户名
11 | name: "风车车", //姓名
12 | password: '123456', //密码
13 | email: 'jerry9022@qq.com', //邮箱
14 | nickname: '超级管理员', //昵称
15 | sex: 1, //性别
16 | addr: '北京市海淀区上地七街'
17 | });
18 |
19 | Users.push({
20 | id: 2,
21 | username: 'staff',
22 | name: "枫叶", //姓名
23 | password: '123123',
24 | email: '1642499350@qq.com',
25 | nickname: '普通管理员',
26 | sex: 1, //性别
27 | addr: '北京市海淀区'
28 | });
29 |
30 | module.exports = Users;
31 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "LitAdminServer",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "start": "node ./bin/www"
7 | },
8 | "dependencies": {
9 | "async": "^2.5.0",
10 | "body-parser": "~1.17.1",
11 | "cookie-parser": "~1.4.3",
12 | "cors": "^2.8.4",
13 | "debug": "~2.6.3",
14 | "ejs": "~2.5.6",
15 | "express": "~4.15.2",
16 | "express-session": "^1.15.6",
17 | "images": "^2.2.1",
18 | "less-middleware": "~2.2.0",
19 | "mockjs": "^1.0.1-beta3",
20 | "morgan": "~1.8.1",
21 | "request": "^2.81.0",
22 | "serve-favicon": "~2.4.2"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/server/public/images/apple.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/server/public/images/apple.jpg
--------------------------------------------------------------------------------
/server/public/images/pic_s_200_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/server/public/images/pic_s_200_1.jpg
--------------------------------------------------------------------------------
/server/public/stylesheets/style.css:
--------------------------------------------------------------------------------
1 | body{margin:0;padding:0;font-size:13px;min-width:768px}.head-top{background:rgba(18,26,44,0.8);height:60px;color:#ffffff;display:flex;align-items:center}.head-top .logo{padding-left:15px;padding-right:5px}.head-top .logo-title{font-size:20px}.main-content{border:1px solid steelblue;min-height:400px}
--------------------------------------------------------------------------------
/server/public/stylesheets/style.less:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0px;
3 | padding: 0px;
4 | font-size: 13px;
5 | //background: #efefef;
6 | min-width: 768px;
7 | }
8 |
9 | .head-top {
10 | background: rgba(18, 26, 44, 0.8);
11 | height: 60px;
12 | color: #ffffff;
13 | display: flex;
14 | align-items: center; //垂直居中
15 |
16 | .logo {
17 | padding-left: 15px;
18 | padding-right: 5px;
19 | }
20 |
21 | .logo-title {
22 | font-size: 20px;
23 | }
24 | }
25 |
26 | .main-content {
27 | border: 1px solid steelblue;
28 | min-height: 400px;
29 | }
30 |
--------------------------------------------------------------------------------
/server/readme:
--------------------------------------------------------------------------------
1 | 后端提供接口。
2 |
--------------------------------------------------------------------------------
/server/routes/api/v1/books.js:
--------------------------------------------------------------------------------
1 | /***
2 | * books相关路由
3 | * 采用 restful api 风格
4 | */
5 | var express = require('express');
6 | var router = express.Router();
7 | var indexRouter = {};
8 | var userController = require('../../../controllers/user');
9 | var bookController = require('../../../controllers/book');
10 |
11 | //先检查登录
12 | router.use(userController.checkLogin);
13 |
14 | //返回book的集合
15 | router.get('/', bookController.find);
16 |
17 | //返回指定的book
18 | router.get('/:id', bookController.findById);
19 |
20 | //创建book
21 | router.post('/', bookController.create);
22 |
23 | //更新book全部信息
24 | router.put('/:id', bookController.update);
25 |
26 | //更新book部分信息
27 | router.patch('/:id', bookController.patch);
28 |
29 | //批量删除
30 | router.delete('/batch/:ids', bookController.deleteBatch);
31 |
32 | //删除指定的book
33 | router.delete('/:id', bookController.delete);
34 |
35 |
36 |
37 | indexRouter.router = router;
38 |
39 | module.exports = indexRouter;
40 |
--------------------------------------------------------------------------------
/server/routes/api/v1/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var router = express.Router();
3 |
4 | var indexRouter = {};
5 |
6 | //轮询当前目录下的子模块,并挨个加载其路由配置
7 | $fs.readdir(__dirname, function (err, files) {
8 | files.forEach(function (file) {
9 | if (!_.startsWith(file, '.') && file !== 'index.js') {
10 | try {
11 | router.use('/' + file.replace('.js', ''), require('./' + file).router);
12 | } catch (ex) {
13 | console.error('路由加载错误[' + $path.join(__dirname, file) + ']:' + ex.stack);
14 | }
15 | }
16 | });
17 | });
18 |
19 | indexRouter.router = router;
20 | module.exports = indexRouter;
21 |
--------------------------------------------------------------------------------
/server/routes/api/v1/users.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by jerry on 2017/11/13.
3 | * users相关路由
4 | * 采用 restful api 风格
5 | */
6 |
7 | var express = require('express');
8 | var router = express.Router();
9 | var indexRouter = {};
10 | var userController = require('../../../controllers/user');
11 |
12 | //用户登录
13 | router.post('/login', userController.login);
14 | //用户退出
15 | router.get('/logout', userController.logout);
16 |
17 | //先检查登录
18 | router.use(userController.checkLogin);
19 |
20 | //更新个人部分信息
21 | router.patch('/profile', userController.profile);
22 | //用户修改个人密码
23 | router.patch('/changepwd', userController.changepwd);
24 |
25 | //返回user的集合
26 | router.get('/', userController.find);
27 | //
28 | // //返回指定的user
29 | // router.get('/:id', userController.findById);
30 | //
31 | // //创建user
32 | // router.post('/', userController.create);
33 | //
34 | // //更新user全部信息
35 | // router.put('/:id', userController.update);
36 | //
37 | // //更新user部分信息
38 | // router.patch('/:id', userController.patch);
39 | //
40 | // //删除指定的user
41 | // router.delete('/:id', userController.delete);
42 |
43 | indexRouter.router = router;
44 |
45 | module.exports = indexRouter;
46 |
47 |
--------------------------------------------------------------------------------
/server/routes/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var router = express.Router();
3 | var indexRouter = {};
4 |
5 | //接口访问
6 | router.use('/api/v1', require('./api/v1/index').router);
7 |
8 | /* 服务端主页 */
9 | router.get('/', function (req, res) {
10 | res.render('index');
11 | });
12 |
13 | indexRouter.router = router;
14 |
15 | module.exports = indexRouter;
16 |
--------------------------------------------------------------------------------
/server/views/error.ejs:
--------------------------------------------------------------------------------
1 | <%= message %>
2 | <%= error.status %>
3 | <%= error.stack %>
4 |
--------------------------------------------------------------------------------
/server/views/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 服务端页面
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | 这个是服务端页面
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
提供了如下restful风格接口:
27 | 用户登录:POST /api/v1/users/login
28 | 用户退出:GET /api/v1/users/logout
29 | 修改个人信息:PATCH /api/v1/users/profile
30 | 获取用户列表:GET /api/v1/users
31 |
32 | 获取图书列表:GET /api/v1/books
33 | 获取一条图书信息:GET /api/v1/books/:id
34 | 添加一条图书信息:POST /api/v1/books/
35 | 修改一条图书信息:PUT /api/v1/books/:id
36 | 删除一条图书信息:DELETE /api/v1/books/:id
37 | 批量删除图片信息:DELETE /api/v1/books/batch/:ids
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/ drage.json:
--------------------------------------------------------------------------------
1 | {
2 | name: '开始',
3 | label: '',
4 | state: '',
5 | grage:[
6 | {
7 | name:'',
8 | grage: [{}],
9 | label: ''
10 | state: ''
11 | }
12 | ]
13 | }
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
13 |
14 |
30 |
--------------------------------------------------------------------------------
/src/api/api_book.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by jerry on 2017/11/13.
3 | * 图书相关api
4 | */
5 | import * as API from './'
6 |
7 | export default {
8 |
9 | //查询获取book列表(通过page分页)
10 | findList: params => {
11 | return API.GET('/api/v1/books', params)
12 | },
13 |
14 | //查询获取一条book信息
15 | findById: id => {
16 | return API.GET(`/api/v1/books/${id}`)
17 | },
18 |
19 | add: params => {
20 | return API.POST(`/api/v1/books`, params)
21 | },
22 | update: (id, params) => {
23 | return API.PUT(`/api/v1/books/${id}`, params)
24 | },
25 |
26 | //单个删除book
27 | remove: id => {
28 | return API.DELETE(`/api/v1/books/${id}`)
29 | },
30 |
31 | //批量删除,传ids数组
32 | removeBatch: (ids) => {
33 | return API.DELETE(`/api/v1/books/batch/${ids}`)
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/src/api/api_user.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by jerry on 2017/11/13.
3 | * 用户相关api
4 | */
5 | import * as API from './'
6 |
7 | export default {
8 | //登录
9 | login: params => {
10 | return API.POST('/api/v1/users/login', params)
11 | },
12 | //登出
13 | logout: params => {
14 | return API.GET('/api/v1/users/logout', params)
15 | },
16 | //修改个人信息
17 | changeProfile: params => {
18 | return API.PATCH('/api/v1/users/profile', params)
19 | },
20 |
21 | //查询获取user列表(通过page分页)
22 | findList: params => {
23 | return API.GET('/api/v1/users', params)
24 | },
25 | }
26 |
--------------------------------------------------------------------------------
/src/api/env.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by jerry on 2017/11/13
3 | * 设置api请求的baseURL
4 | * 实际项目中建议该文件不纳入版本管理
5 | */
6 | export default {
7 | baseURL: 'http://localhost:3000',
8 | // baseURL: '',
9 | isDev: true
10 | }
11 |
--------------------------------------------------------------------------------
/src/api/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by jerry on 2017/6/9.
3 | */
4 | import Env from './env';
5 | import axios from 'axios';
6 |
7 | axios.defaults.withCredentials = true;
8 | // axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
9 | // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';//配置请求头
10 |
11 | //添加一个请求拦截器
12 | // axios.interceptors.request.use(function (config) {
13 | // console.dir(config);
14 | // return config;
15 | // }, function (error) {
16 | // // Do something with request error
17 | // return Promise.reject(error);
18 | // });
19 |
20 | // 添加一个响应拦截器
21 | axios.interceptors.response.use(
22 | function(response) {
23 | if (response.data && response.data.errcode) {
24 | if (parseInt(response.data.errcode) === 40001) {
25 | //未登录
26 | this.$emit('goto', '/login');
27 | }
28 | }
29 |
30 | return response;
31 | },
32 | function(error) {
33 | // Do something with response error
34 | return Promise.reject(error);
35 | }
36 | );
37 |
38 | //基地址
39 | let base = Env.baseURL;
40 |
41 | //测试使用
42 | export const ISDEV = Env.isDev;
43 |
44 | //通用方法
45 | export const POST = (url, params) => {
46 | return axios.post(`${base}${url}`, params).then(res => res.data);
47 | };
48 |
49 | export const GET = (url, params) => {
50 | return axios.get(`${base}${url}`, { params: params }).then(res => res.data);
51 | };
52 |
53 | export const PUT = (url, params) => {
54 | return axios.put(`${base}${url}`, params).then(res => res.data);
55 | };
56 |
57 | export const DELETE = (url, params) => {
58 | return axios
59 | .delete(`${base}${url}`, { params: params })
60 | .then(res => res.data);
61 | };
62 |
63 | export const PATCH = (url, params) => {
64 | return axios.patch(`${base}${url}`, params).then(res => res.data);
65 | };
66 |
--------------------------------------------------------------------------------
/src/assets/iconfont/demo.css:
--------------------------------------------------------------------------------
1 | *{margin: 0;padding: 0;list-style: none;}
2 | /*
3 | KISSY CSS Reset
4 | 理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。
5 | 2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。
6 | 3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。
7 | 特色:1. 适应中文;2. 基于最新主流浏览器。
8 | 维护:玉伯, 正淳
9 | */
10 |
11 | /** 清除内外边距 **/
12 | body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */
13 | dl, dt, dd, ul, ol, li, /* list elements 列表元素 */
14 | pre, /* text formatting elements 文本格式元素 */
15 | form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */
16 | th, td /* table elements 表格元素 */ {
17 | margin: 0;
18 | padding: 0;
19 | }
20 |
21 | /** 设置默认字体 **/
22 | body,
23 | button, input, select, textarea /* for ie */ {
24 | font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif;
25 | }
26 | h1, h2, h3, h4, h5, h6 { font-size: 100%; }
27 | address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */
28 | code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */
29 | small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */
30 |
31 | /** 重置列表元素 **/
32 | ul, ol { list-style: none; }
33 |
34 | /** 重置文本格式元素 **/
35 | a { text-decoration: none; }
36 | a:hover { text-decoration: underline; }
37 |
38 |
39 | /** 重置表单元素 **/
40 | legend { color: #000; } /* for ie6 */
41 | fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */
42 | button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */
43 | /* 注:optgroup 无法扶正 */
44 |
45 | /** 重置表格元素 **/
46 | table { border-collapse: collapse; border-spacing: 0; }
47 |
48 | /* 清除浮动 */
49 | .ks-clear:after, .clear:after {
50 | content: '\20';
51 | display: block;
52 | height: 0;
53 | clear: both;
54 | }
55 | .ks-clear, .clear {
56 | *zoom: 1;
57 | }
58 |
59 | .main {
60 | padding: 30px 100px;
61 | width: 960px;
62 | margin: 0 auto;
63 | }
64 | .main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;}
65 |
66 | .helps{margin-top:40px;}
67 | .helps pre{
68 | padding:20px;
69 | margin:10px 0;
70 | border:solid 1px #e7e1cd;
71 | background-color: #fffdef;
72 | overflow: auto;
73 | }
74 |
75 | .icon_lists{
76 | width: 100% !important;
77 |
78 | }
79 |
80 | .icon_lists li{
81 | float:left;
82 | width: 100px;
83 | height:180px;
84 | text-align: center;
85 | list-style: none !important;
86 | }
87 | .icon_lists .icon{
88 | font-size: 42px;
89 | line-height: 100px;
90 | margin: 10px 0;
91 | color:#333;
92 | -webkit-transition: font-size 0.25s ease-out 0s;
93 | -moz-transition: font-size 0.25s ease-out 0s;
94 | transition: font-size 0.25s ease-out 0s;
95 |
96 | }
97 | .icon_lists .icon:hover{
98 | font-size: 100px;
99 | }
100 |
101 |
102 |
103 | .markdown {
104 | color: #666;
105 | font-size: 14px;
106 | line-height: 1.8;
107 | }
108 |
109 | .highlight {
110 | line-height: 1.5;
111 | }
112 |
113 | .markdown img {
114 | vertical-align: middle;
115 | max-width: 100%;
116 | }
117 |
118 | .markdown h1 {
119 | color: #404040;
120 | font-weight: 500;
121 | line-height: 40px;
122 | margin-bottom: 24px;
123 | }
124 |
125 | .markdown h2,
126 | .markdown h3,
127 | .markdown h4,
128 | .markdown h5,
129 | .markdown h6 {
130 | color: #404040;
131 | margin: 1.6em 0 0.6em 0;
132 | font-weight: 500;
133 | clear: both;
134 | }
135 |
136 | .markdown h1 {
137 | font-size: 28px;
138 | }
139 |
140 | .markdown h2 {
141 | font-size: 22px;
142 | }
143 |
144 | .markdown h3 {
145 | font-size: 16px;
146 | }
147 |
148 | .markdown h4 {
149 | font-size: 14px;
150 | }
151 |
152 | .markdown h5 {
153 | font-size: 12px;
154 | }
155 |
156 | .markdown h6 {
157 | font-size: 12px;
158 | }
159 |
160 | .markdown hr {
161 | height: 1px;
162 | border: 0;
163 | background: #e9e9e9;
164 | margin: 16px 0;
165 | clear: both;
166 | }
167 |
168 | .markdown p,
169 | .markdown pre {
170 | margin: 1em 0;
171 | }
172 |
173 | .markdown > p,
174 | .markdown > blockquote,
175 | .markdown > .highlight,
176 | .markdown > ol,
177 | .markdown > ul {
178 | width: 80%;
179 | }
180 |
181 | .markdown ul > li {
182 | list-style: circle;
183 | }
184 |
185 | .markdown > ul li,
186 | .markdown blockquote ul > li {
187 | margin-left: 20px;
188 | padding-left: 4px;
189 | }
190 |
191 | .markdown > ul li p,
192 | .markdown > ol li p {
193 | margin: 0.6em 0;
194 | }
195 |
196 | .markdown ol > li {
197 | list-style: decimal;
198 | }
199 |
200 | .markdown > ol li,
201 | .markdown blockquote ol > li {
202 | margin-left: 20px;
203 | padding-left: 4px;
204 | }
205 |
206 | .markdown code {
207 | margin: 0 3px;
208 | padding: 0 5px;
209 | background: #eee;
210 | border-radius: 3px;
211 | }
212 |
213 | .markdown pre {
214 | border-radius: 6px;
215 | background: #f7f7f7;
216 | padding: 20px;
217 | }
218 |
219 | .markdown pre code {
220 | border: none;
221 | background: #f7f7f7;
222 | margin: 0;
223 | }
224 |
225 | .markdown strong,
226 | .markdown b {
227 | font-weight: 600;
228 | }
229 |
230 | .markdown > table {
231 | border-collapse: collapse;
232 | border-spacing: 0px;
233 | empty-cells: show;
234 | border: 1px solid #e9e9e9;
235 | width: 95%;
236 | margin-bottom: 24px;
237 | }
238 |
239 | .markdown > table th {
240 | white-space: nowrap;
241 | color: #333;
242 | font-weight: 600;
243 |
244 | }
245 |
246 | .markdown > table th,
247 | .markdown > table td {
248 | border: 1px solid #e9e9e9;
249 | padding: 8px 16px;
250 | text-align: left;
251 | }
252 |
253 | .markdown > table th {
254 | background: #F7F7F7;
255 | }
256 |
257 | .markdown blockquote {
258 | font-size: 90%;
259 | color: #999;
260 | border-left: 4px solid #e9e9e9;
261 | padding-left: 0.8em;
262 | margin: 1em 0;
263 | font-style: italic;
264 | }
265 |
266 | .markdown blockquote p {
267 | margin: 0;
268 | }
269 |
270 | .markdown .anchor {
271 | opacity: 0;
272 | transition: opacity 0.3s ease;
273 | margin-left: 8px;
274 | }
275 |
276 | .markdown .waiting {
277 | color: #ccc;
278 | }
279 |
280 | .markdown h1:hover .anchor,
281 | .markdown h2:hover .anchor,
282 | .markdown h3:hover .anchor,
283 | .markdown h4:hover .anchor,
284 | .markdown h5:hover .anchor,
285 | .markdown h6:hover .anchor {
286 | opacity: 1;
287 | display: inline-block;
288 | }
289 |
290 | .markdown > br,
291 | .markdown > p > br {
292 | clear: both;
293 | }
294 |
295 |
296 | .hljs {
297 | display: block;
298 | background: white;
299 | padding: 0.5em;
300 | color: #333333;
301 | overflow-x: auto;
302 | }
303 |
304 | .hljs-comment,
305 | .hljs-meta {
306 | color: #969896;
307 | }
308 |
309 | .hljs-string,
310 | .hljs-variable,
311 | .hljs-template-variable,
312 | .hljs-strong,
313 | .hljs-emphasis,
314 | .hljs-quote {
315 | color: #df5000;
316 | }
317 |
318 | .hljs-keyword,
319 | .hljs-selector-tag,
320 | .hljs-type {
321 | color: #a71d5d;
322 | }
323 |
324 | .hljs-literal,
325 | .hljs-symbol,
326 | .hljs-bullet,
327 | .hljs-attribute {
328 | color: #0086b3;
329 | }
330 |
331 | .hljs-section,
332 | .hljs-name {
333 | color: #63a35c;
334 | }
335 |
336 | .hljs-tag {
337 | color: #333333;
338 | }
339 |
340 | .hljs-title,
341 | .hljs-attr,
342 | .hljs-selector-id,
343 | .hljs-selector-class,
344 | .hljs-selector-attr,
345 | .hljs-selector-pseudo {
346 | color: #795da3;
347 | }
348 |
349 | .hljs-addition {
350 | color: #55a532;
351 | background-color: #eaffea;
352 | }
353 |
354 | .hljs-deletion {
355 | color: #bd2c00;
356 | background-color: #ffecec;
357 | }
358 |
359 | .hljs-link {
360 | text-decoration: underline;
361 | }
362 |
363 | pre{
364 | background: #fff;
365 | }
366 |
367 |
368 |
369 |
370 |
371 |
--------------------------------------------------------------------------------
/src/assets/iconfont/iconfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/iconfont/iconfont.eot
--------------------------------------------------------------------------------
/src/assets/iconfont/iconfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/iconfont/iconfont.ttf
--------------------------------------------------------------------------------
/src/assets/iconfont/iconfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/iconfont/iconfont.woff
--------------------------------------------------------------------------------
/src/assets/images/404.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/images/404.gif
--------------------------------------------------------------------------------
/src/assets/images/book.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/images/book.png
--------------------------------------------------------------------------------
/src/assets/images/cover.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/images/cover.jpg
--------------------------------------------------------------------------------
/src/assets/images/forest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/images/forest.png
--------------------------------------------------------------------------------
/src/assets/images/girl.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/images/girl.jpg
--------------------------------------------------------------------------------
/src/assets/images/hill.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/images/hill.png
--------------------------------------------------------------------------------
/src/assets/images/mainbg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/images/mainbg.jpg
--------------------------------------------------------------------------------
/src/assets/images/sunrise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/images/sunrise.png
--------------------------------------------------------------------------------
/src/assets/images/sunshine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/images/sunshine.png
--------------------------------------------------------------------------------
/src/assets/images/user.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/src/assets/images/user.jpeg
--------------------------------------------------------------------------------
/src/assets/styles/main.scss:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 0px;
3 | margin: 0px auto;
4 | }
5 |
6 | a {
7 | text-decoration: none;
8 | }
9 |
10 | #app {
11 | font: 14px Helvetica Neue, Helvetica, PingFang SC, \5fae\8f6f\96c5\9ed1,
12 | Tahoma, Arial, sans-serif;
13 | -webkit-font-smoothing: antialiased;
14 | -moz-osx-font-smoothing: grayscale;
15 | text-align: left;
16 | color: #2c3e50;
17 | }
18 |
19 | //home.vue
20 | .el-menu-item,
21 | .el-submenu__title {
22 | color: #fff;
23 | background-color: #20262e;
24 | font-weight: 800;
25 | }
26 |
27 | .el-menu .el-menu-item,
28 | .el-submenu .el-submenu__title {
29 | height: 56px;
30 | line-height: 56px;
31 | background-color: #20262e !important;
32 | span {
33 | opacity: 0.8;
34 | }
35 | }
36 |
37 | .el-menu--inline {
38 | .el-menu-item {
39 | line-height: 42px !important;
40 | height: 42px !important;
41 | }
42 | }
43 | .el-menu-item:hover,
44 | .el-submenu .el-menu-item:hover,
45 | .el-submenu__title:hover {
46 | background-color: rgba(0, 0, 0, 0.3);
47 | }
48 | .is-opened {
49 | background-color: #20262e !important;
50 | .el-menu-item {
51 | line-height: 42px !important;
52 | height: 42px !important;
53 | }
54 | }
55 | .el-submenu .el-menu-item {
56 | background-color: #20262e;
57 | }
58 |
59 | .el-submenu .el-menu-item:hover {
60 | background-color: #20262e;
61 | }
62 |
63 | .el-submenu .el-menu-item.is-active,
64 | .el-menu-item.is-active,
65 | .el-submenu .el-menu-item.is-active:hover,
66 | .el-menu-item.is-active:hover {
67 | border-left: 3px solid #409eff;
68 | }
69 | .el-menu--popup {
70 | background-color: #20262e;
71 | .el-menu-item {
72 | line-height: 42px;
73 | height: 42px;
74 | font-weight: normal;
75 | }
76 | }
77 |
78 | .el-menu .iconfont {
79 | margin-right: 8px;
80 | }
81 |
82 | .warp-breadcrum {
83 | border-left: 3px solid #409eff;
84 | margin: 15px 10px 15px 10px;
85 | text-indent: 8px;
86 | }
87 | .el-table td,
88 | .el-table th {
89 | padding: 6px 0;
90 | }
91 | .oa_main {
92 | .oa_search {
93 | margin: 20px 10px 10px 10px;
94 | }
95 | }
96 | .ql-toolbar.ql-snow .ql-formats {
97 | margin-right: 0 !important;
98 | }
99 | .ql-toolbar.ql-snow .ql-formats:nth-child(4),
100 | .ql-toolbar.ql-snow .ql-formats:nth-child(8),
101 | .ql-toolbar.ql-snow .ql-formats:nth-child(9) {
102 | display: none;
103 | }
104 | .ql-snow .ql-toolbar button svg,
105 | .quillWrapper .ql-snow.ql-toolbar button svg {
106 | width: 16px !important;
107 | height: 16px !important;
108 | }
109 | .ql-snow .ql-picker-label:before {
110 | position: absolute;
111 | }
112 | .editer {
113 | .ql-picker.ql-color-picker svg {
114 | width: 16px !important;
115 | height: 16px !important;
116 | position: absolute;
117 | }
118 | }
119 | .quillWrapper .ql-snow.ql-toolbar .ql-formats {
120 | margin-bottom: 0 !important;
121 | }
122 | .quillWrapper .ql-snow.ql-toolbar {
123 | padding-top: 10px !important;
124 | padding-bottom: 0px !important;
125 | }
126 | .ql-picker:not(.ql-background) {
127 | top: 0 !important;
128 | }
129 |
--------------------------------------------------------------------------------
/src/common/util.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by jerry on 2017/4/14.
3 | */
4 | var SIGN_REGEXP = /([yMdhsm])(\1*)/g
5 | var DEFAULT_PATTERN = 'yyyy-MM-dd'
6 | function padding (s, len) {
7 | let l = len - (s + '').length
8 | for (var i = 0; i < l; i++) { s = '0' + s }
9 | return s
10 | };
11 |
12 | export default {
13 | getQueryStringByName: function (name) {
14 | var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
15 | var r = window.location.search.substr(1).match(reg)
16 | var context = ''
17 | if (r != null) { context = r[2] }
18 | reg = null
19 | r = null
20 | return context === null || context === '' || context === 'undefined' ? '' : context
21 | },
22 | formatDate: {
23 |
24 | format: function (date, pattern) {
25 | pattern = pattern || DEFAULT_PATTERN
26 | return pattern.replace(SIGN_REGEXP, function ($0) {
27 | switch ($0.charAt(0)) {
28 | case 'y': return padding(date.getFullYear(), $0.length)
29 | case 'M': return padding(date.getMonth() + 1, $0.length)
30 | case 'd': return padding(date.getDate(), $0.length)
31 | case 'w': return date.getDay() + 1
32 | case 'h': return padding(date.getHours(), $0.length)
33 | case 'm': return padding(date.getMinutes(), $0.length)
34 | case 's': return padding(date.getSeconds(), $0.length)
35 | }
36 | })
37 | },
38 | parse: function (dateString, pattern) {
39 | var matchs1 = pattern.match(SIGN_REGEXP)
40 | var matchs2 = dateString.match(/(\d)+/g)
41 | if (matchs1.length === matchs2.length) {
42 | var _date = new Date(1970, 0, 1)
43 | for (var i = 0; i < matchs1.length; i++) {
44 | var _int = parseInt(matchs2[i])
45 | var sign = matchs1[i]
46 | switch (sign.charAt(0)) {
47 | case 'y': _date.setFullYear(_int); break
48 | case 'M': _date.setMonth(_int - 1); break
49 | case 'd': _date.setDate(_int); break
50 | case 'h': _date.setHours(_int); break
51 | case 'm': _date.setMinutes(_int); break
52 | case 's': _date.setSeconds(_int); break
53 | }
54 | }
55 | return _date
56 | }
57 | return null
58 | }
59 |
60 | }
61 |
62 | }
63 |
--------------------------------------------------------------------------------
/src/components/Dashboard.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
8 |
9 |
19 |
--------------------------------------------------------------------------------
/src/components/Drage.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
108 |
147 |
--------------------------------------------------------------------------------
/src/components/Home.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 | 武汉教育局OA管理系统
12 |
13 |
14 |
15 |
张飒
17 |
18 |
19 | 个人信息
20 |
21 |
22 | 修改密码
23 |
24 | 退出登录
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | copyright ©2018 XXX版权所有
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
130 |
131 |
272 |
--------------------------------------------------------------------------------
/src/components/Login.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
21 |
22 |
24 | 用户登录
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | 登录
34 |
35 |
36 |
37 |
38 |
39 |
79 |
88 |
145 |
--------------------------------------------------------------------------------
/src/components/Main.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 首页
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | 待办事项
18 | 25
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 日程安排
28 | 30
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | 我的督办
38 | 18
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | {{dateList.date}}
49 | {{dateList.weekday}}
50 |
51 |
52 | {{dateList.time}}
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | 公开公文
65 |
66 |
67 |
68 |
69 |
70 |
71 |
75 |
81 |
82 |
88 |
89 |
95 |
96 |
102 |
103 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 | 部门公文
120 |
121 |
122 |
123 |
124 |
125 |
126 |
130 |
136 |
137 |
143 |
144 |
150 |
151 |
157 |
158 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 | 通知公告
178 |
179 |
180 |
181 |
182 |
183 |
184 |
188 |
193 |
194 |
200 |
201 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 | 部门文档
218 |
219 |
220 |
221 |
222 |
223 |
224 |
228 |
233 |
234 |
240 |
241 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
316 |
376 |
386 |
--------------------------------------------------------------------------------
/src/components/book/list.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 首页
6 | 图书管理
7 | 图书列表
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | 查询
20 |
21 |
22 | 新增
23 |
24 |
25 |
26 |
27 |
28 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | {{ props.row.description }}
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 | 编辑
47 | 删除
48 |
49 |
50 |
51 |
52 |
53 |
54 | 批量删除
55 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
101 |
102 |
103 |
104 |
105 |
106 |
330 |
331 |
336 |
--------------------------------------------------------------------------------
/src/components/bookcategory/list.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 首页
6 | 图书管理
7 | 图书分类
8 |
9 |
10 |
11 |
12 | 神马也没有!
13 |
14 |
15 |
16 |
25 |
--------------------------------------------------------------------------------
/src/components/govfile/AcceptFile.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 首页
8 | 公文管理
9 | 收文管理
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
29 |
30 |
31 |
32 | 查询
33 |
34 |
35 |
36 |
37 |
41 |
46 |
47 |
52 |
53 |
58 |
59 |
64 |
65 |
70 |
71 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
111 |
113 |
--------------------------------------------------------------------------------
/src/components/govfile/AcceptShow.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
68 |
69 | 将文件拖到此处,或点击上传
70 |
71 |
72 |
73 | 立即创建
74 | 取消
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
119 |
128 |
133 |
--------------------------------------------------------------------------------
/src/components/govfile/SendFile.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
68 |
69 | 将文件拖到此处,或点击上传
70 |
71 |
72 |
73 | 立即创建
74 | 取消
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
119 |
128 |
133 |
--------------------------------------------------------------------------------
/src/components/office/CarAdd.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
56 |
57 |
58 |
59 |
60 |
61 |
66 |
67 |
68 |
69 |
70 |
71 |
76 |
77 |
78 |
79 | 立即创建
80 | 取消
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
118 |
127 |
--------------------------------------------------------------------------------
/src/components/office/CarList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 首页
8 | 办公管理
9 | 车辆管理
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
26 |
27 |
28 |
29 | 查询
30 | 车辆申请
31 |
32 |
33 |
34 |
35 |
39 |
44 |
45 |
50 |
51 |
56 |
57 |
62 |
63 |
68 |
69 |
74 |
75 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
126 |
128 |
--------------------------------------------------------------------------------
/src/components/office/MeetAdd.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 首页
8 | 办公管理
9 | 会议管理
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
34 |
35 |
36 |
37 |
38 |
39 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
63 |
64 | 将文件拖到此处,或点击上传
65 |
66 |
67 |
68 | 立即创建
69 | 取消
70 |
71 |
72 |
73 |
74 |
75 |
76 |
102 |
104 |
--------------------------------------------------------------------------------
/src/components/office/MeetList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 首页
8 | 办公管理
9 | 会议管理
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | 查询
24 | 新增会议
25 |
26 |
27 |
28 |
29 |
33 |
38 |
39 |
45 |
46 |
51 |
52 |
57 |
58 |
63 |
64 |
69 |
70 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
123 |
125 |
--------------------------------------------------------------------------------
/src/components/office/Supervise.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 首页
8 | 办公管理
9 | 督办通知
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
29 |
30 |
31 |
32 | 查询
33 | 新增督办
34 |
35 |
36 |
37 |
38 |
42 |
47 |
48 |
53 |
54 |
59 |
60 |
65 |
66 |
71 |
72 |
77 |
78 |
83 |
84 |
85 |
86 |
87 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
140 |
142 |
--------------------------------------------------------------------------------
/src/components/office/SuperviseTask.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
44 |
48 |
49 |
50 |
51 |
52 |
57 |
58 |
59 |
60 |
61 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
81 |
82 |
83 |
84 |
89 |
90 | 将文件拖到此处,或点击上传
91 |
92 |
93 |
94 | 立即创建
95 | 取消
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
142 |
151 |
156 |
--------------------------------------------------------------------------------
/src/components/person/Timelist.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 首页
8 | 个人事务
9 | 日程安排
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
26 |
27 |
28 |
29 |
30 |
34 |
35 |
36 |
37 | 查询
38 | 新增日程
39 |
40 |
41 |
42 |
43 |
44 |
52 |
53 | sadfsd {{ scope.event.title }} test
54 |
55 |
56 |
57 |
58 |
59 |
162 |
169 |
182 |
--------------------------------------------------------------------------------
/src/components/person/Todo.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 首页
8 | 个人事务
9 | 待办事项
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
29 |
30 |
31 |
32 | 查询
33 |
34 |
35 |
36 |
37 |
41 |
46 |
47 |
52 |
53 |
58 |
59 |
64 |
65 |
70 |
71 |
76 |
77 |
82 |
83 |
88 |
89 | 办理
90 | 查看
91 | 过程
92 |
93 |
94 |
95 |
96 |
97 |
124 |
126 |
--------------------------------------------------------------------------------
/src/components/user/changepwd.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 首页
6 | 设置
7 | 修改密码
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | 提交
24 |
25 |
26 |
27 |
28 |
29 |
50 |
--------------------------------------------------------------------------------
/src/components/user/list.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 首页
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 |
42 |
43 |
105 |
106 |
109 |
--------------------------------------------------------------------------------
/src/components/user/profile.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 首页
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 |
131 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | // The Vue build version to load with the `import` command
2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
3 | import Vue from 'vue';
4 | import App from './App';
5 | import router from './router';
6 | import ElementUI from 'element-ui';
7 | import fullCalendar from 'vue-fullcalendar';
8 | import VueParticles from 'vue-particles';
9 |
10 | import 'element-ui/lib/theme-chalk/index.css';
11 | import '@/assets/iconfont/iconfont.css';
12 | import '@/assets/styles/main.scss';
13 |
14 | Vue.config.productionTip = true;
15 | Vue.use(ElementUI);
16 | Vue.use(VueParticles);
17 | Vue.component('full-calendar', fullCalendar);
18 |
19 | /* eslint-disable no-new */
20 | new Vue({
21 | el: '#app',
22 | router,
23 | template: '',
24 | components: { App }
25 | });
26 |
--------------------------------------------------------------------------------
/src/router/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Router from 'vue-router';
3 | import Home from '@/components/Home';
4 | import Dashboard from '@/components/Dashboard';
5 | import Main from '@/components/Main';
6 |
7 | // 个人事务
8 | import Todo from '@/components/person/Todo';
9 | import Timelist from '@/components/person/Timelist';
10 |
11 | //公文管理
12 | import SendFile from '@/components/govfile/SendFile';
13 | import AcceptFile from '@/components/govfile/AcceptFile';
14 | import AcceptShow from '@/components/govfile/AcceptShow';
15 |
16 | //办公管理
17 | import Supervise from '@/components/office/Supervise';
18 | import SuperviseTask from '@/components/office/SuperviseTask';
19 | import CarList from '@/components/office/CarList';
20 | import CarAdd from '@/components/office/CarAdd';
21 | import MeetList from '@/components/office/MeetList';
22 | import MeetAdd from '@/components/office/MeetAdd';
23 |
24 | import BookList from '@/components/book/list';
25 | import BookCategoryList from '@/components/bookcategory/list';
26 |
27 | import UserList from '@/components/user/list';
28 | import UserChangePwd from '@/components/user/changepwd';
29 | import UserProfile from '@/components/user/profile';
30 |
31 | import Drage from '@/components/Drage'
32 |
33 | // 懒加载方式,当路由被访问的时候才加载对应组件
34 | const Login = resolve => require(['@/components/Login'], resolve);
35 |
36 | Vue.use(Router);
37 |
38 | let router = new Router({
39 | // mode: 'history',
40 | routes: [
41 | {
42 | path: '/login',
43 | name: '登录',
44 | component: Login
45 | },
46 | {
47 | path: '/D3',
48 | name: 'D3',
49 | component: Drage
50 | },
51 | {
52 | path: '/',
53 | name: '个人事务',
54 | component: Home,
55 | redirect: '/main',
56 | // leaf: true, // 只有一个节点
57 | menuShow: true,
58 | iconCls: 'iconfont icon-component', // 图标样式class
59 | children: [
60 | {
61 | path: '/main',
62 | name: '首页',
63 | component: Main
64 | },
65 | {
66 | path: '/person/todo',
67 | component: Todo,
68 | name: '待办事项',
69 | menuShow: true
70 | },
71 | {
72 | path: '/person/timelist',
73 | component: Timelist,
74 | name: '日程安排',
75 | menuShow: true
76 | },
77 | {
78 | path: '/geren',
79 | component: Dashboard,
80 | name: '个人通讯',
81 | menuShow: true
82 | },
83 | {
84 | path: '/jihua',
85 | component: Dashboard,
86 | name: '工作计划',
87 | menuShow: true
88 | },
89 | {
90 | path: '/wendan',
91 | component: Dashboard,
92 | name: '个人文档',
93 | menuShow: true
94 | }
95 | ]
96 | },
97 | {
98 | path: '/',
99 | component: Home,
100 | name: '公文管理',
101 | menuShow: true,
102 | iconCls: 'iconfont icon-survey1', // 图标样式class
103 | children: [
104 | {
105 | path: '/govfile/sendfile',
106 | component: SendFile,
107 | name: '发文管理',
108 | menuShow: true
109 | },
110 | {
111 | path: '/govfile/acceptfile',
112 | component: AcceptFile,
113 | name: '收文管理',
114 | menuShow: true
115 | },
116 | {
117 | path: '/govfile/acceptshow',
118 | component: AcceptShow,
119 | name: '收文管理',
120 | menuShow: false
121 | },
122 | {
123 | path: '/guidan',
124 | component: Dashboard,
125 | name: '归档文件',
126 | menuShow: true
127 | },
128 | {
129 | path: '/chaxun',
130 | component: Dashboard,
131 | name: '公文查询',
132 | menuShow: true
133 | }
134 | ]
135 | },
136 | {
137 | path: '/',
138 | component: Home,
139 | name: '办公管理',
140 | menuShow: true,
141 | iconCls: 'iconfont icon-electronics',
142 | children: [
143 | {
144 | path: '/book/list',
145 | component: Dashboard,
146 | name: '部门文件',
147 | menuShow: true
148 | },
149 | {
150 | path: '/book/category',
151 | component: Dashboard,
152 | name: '领导动态',
153 | menuShow: true
154 | },
155 | {
156 | path: '/book/renshi',
157 | component: Dashboard,
158 | name: '人事管理',
159 | menuShow: true
160 | },
161 | {
162 | path: '/book/kaoqin',
163 | component: Dashboard,
164 | name: '考勤管理',
165 | menuShow: true
166 | },
167 | {
168 | path: '/office/meetlist',
169 | component: MeetList,
170 | name: '会议管理',
171 | menuShow: true
172 | },
173 | {
174 | path: '/office/meetadd',
175 | component: MeetAdd,
176 | name: '新增会议',
177 | menuShow: false
178 | },
179 | {
180 | path: '/book/wupin',
181 | component: Dashboard,
182 | name: '物品管理',
183 | menuShow: true
184 | },
185 | {
186 | path: '/office/supervise',
187 | component: Supervise,
188 | name: '督办通知',
189 | menuShow: true
190 | },
191 | {
192 | path: '/office/supervisetask',
193 | component: SuperviseTask,
194 | name: '督办通知表单',
195 | menuShow: false
196 | },
197 | {
198 | path: '/office/carlist',
199 | component: CarList,
200 | name: '车辆管理',
201 | menuShow: true
202 | },
203 | {
204 | path: '/office/caradd',
205 | component: CarAdd,
206 | name: '车辆s申请',
207 | menuShow: false
208 | },
209 | {
210 | path: '/office/ss',
211 | component: Dashboard,
212 | name: '通知公告',
213 | menuShow: true
214 | }
215 | ]
216 | },
217 | {
218 | path: '/',
219 | component: Home,
220 | name: '通讯管理',
221 | menuShow: true,
222 | iconCls: 'iconfont icon-earth', // 图标样式class
223 | children: [
224 | {
225 | path: '/user/youjian',
226 | component: Dashboard,
227 | name: '电子邮件',
228 | menuShow: true
229 | },
230 | {
231 | path: '/dunxin',
232 | component: Dashboard,
233 | name: '手机短信',
234 | menuShow: true
235 | },
236 | {
237 | path: '/liuchengku',
238 | component: Dashboard,
239 | name: '办事流程库',
240 | menuShow: true
241 | },
242 | {
243 | path: '/minglu',
244 | component: Dashboard,
245 | name: '通讯名录',
246 | menuShow: true
247 | }
248 | ]
249 | },
250 | {
251 | path: '/',
252 | component: Home,
253 | name: '系统管理',
254 | menuShow: true,
255 | iconCls: 'iconfont icon-set', // 图标样式class
256 | children: [
257 | {
258 | path: '/user/ry',
259 | component: Dashboard,
260 | name: '人员管理',
261 | menuShow: true
262 | },
263 | {
264 | path: '/bm',
265 | component: Dashboard,
266 | name: '部门管理',
267 | menuShow: true
268 | },
269 | {
270 | path: '/user/hj',
271 | component: Dashboard,
272 | name: '角色管理',
273 | menuShow: true
274 | },
275 | {
276 | path: '/quanxian',
277 | component: Dashboard,
278 | name: '权限管理',
279 | menuShow: true
280 | },
281 | {
282 | path: '/wh',
283 | component: Dashboard,
284 | name: '系统设置',
285 | menuShow: true
286 | },
287 | {
288 | path: 'user/profile',
289 | component: UserProfile,
290 | name: '个人信息',
291 | menuShow: false
292 | },
293 | {
294 | path: 'user/changepwd',
295 | component: UserChangePwd,
296 | name: '修改密码',
297 | menuShow: false
298 | }
299 | ]
300 | }
301 | ]
302 | });
303 |
304 | router.beforeEach((to, from, next) => {
305 | // console.log('to:' + to.path)
306 | if (to.path.startsWith('/login')) {
307 | window.localStorage.removeItem('access-user');
308 | next();
309 | } else {
310 | let user = JSON.parse(window.localStorage.getItem('access-user'));
311 | if (!user) {
312 | next({ path: '/login' });
313 | } else {
314 | next();
315 | }
316 | }
317 | });
318 |
319 | export default router;
320 |
--------------------------------------------------------------------------------
/static/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanguyun/VueAdmin/b8e05c31330feb3cf06cd49734eff4447631bfa6/static/.gitkeep
--------------------------------------------------------------------------------
/static/dagreD3/dagre-d3.core.min.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["build/dist/dagre-d3.core.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","dagreD3","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","graphlib","dagre","intersect","render","util","version","./lib/dagre","./lib/graphlib","./lib/intersect","./lib/render","./lib/util","./lib/version","2","default","normal","vee","undirected","parent","id","edge","type","marker","append","attr","path","style","applyStyle","./util","3","d3","addLabel","createClusters","selection","clusters","nodes","filter","v","isSubgraph","svgClusters","selectAll","data","remove","enter","node","applyTransition","each","thisGroup","select","labelGroup","clusterLabelPos","c","domCluster","exit","./d3","./label/add-label","4","_","createEdgeLabels","svgEdgeLabels","edges","edgeToId","classed","label","bbox","getBBox","labelId","has","width","height","./lodash","5","intersectNode","createEdgePaths","arrows","svgPaths","domEdge","elem","applyClass","arrowheadId","uniqueId","makeFragmentRef","location","href","calcPoints","arrowhead","url","fragmentId","baseUrl","split","tail","head","w","points","slice","unshift","push","createLine","line","x","d","y","curve","getCoords","matrix","ownerSVGElement","getScreenCTM","inverse","multiply","translate","svgPathsEnter","sourceElem","range","map","svgPathExit","source","getTotalLength","./intersect/intersect-node","6","createNodes","shapes","simpleNodes","svgNodes","labelDom","shape","pick","paddingLeft","paddingRight","paddingTop","paddingBottom","shapeSvg","shapeBBox","7","undefined","8","9","10","circle","ellipse","polygon","rect","./intersect-circle","./intersect-ellipse","./intersect-node","./intersect-polygon","./intersect-rect","11","intersectEllipse","intersectCircle","rx","point","12","ry","cx","cy","px","py","det","Math","sqrt","dx","abs","dy","13","intersectLine","p1","p2","q1","q2","a1","a2","b1","b2","c1","c2","r1","r2","r3","r4","denom","offset","num","sameSign","14","15","intersectPolygon","polyPoints","x1","y1","intersections","minX","Number","POSITIVE_INFINITY","minY","forEach","entry","min","left","top","console","log","sort","p","q","pdx","pdy","distp","qdx","qdy","distq","./intersect-line","16","intersectRect","h","sx","sy","17","addHtmlLabel","root","fo","div","insert","html","labelStyle","client","getBoundingClientRect","../util","18","addTextLabel","addSVGLabel","labelSvg","labelType","labelBBox","./add-html-label","./add-svg-label","./add-text-label","19","domNode","appendChild","20","lines","processEscapeSequences","text","newText","escaped","ch","21","lodash","22","positionClusters","created","23","positionEdgeLabels","24","positionNodes","25","layout","fn","svg","preProcessGraph","outputGroup","createOrSelectGroup","clustersGroup","edgePathsGroup","edgeLabels","postProcessGraph","value","arguments","NODE_DEFAULT_ATTRS","EDGE_DEFAULT_ATTRS","curveLinear","children","defaults","paddingX","paddingY","padding","k","_prevWidth","_prevHeight","name","empty","./arrows","./create-clusters","./create-edge-labels","./create-edge-paths","./create-nodes","./dagre","./position-clusters","./position-edge-labels","./position-nodes","./shapes","26","diamond","max","SQRT2","join","./intersect/intersect-circle","./intersect/intersect-ellipse","./intersect/intersect-polygon","./intersect/intersect-rect","27","escapeId","ID_DELIM","str","String","replace","dom","styleFn","classFn","otherClasses","graph","isPlainObject","transition","isFunction","28"],"mappings":"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"}
--------------------------------------------------------------------------------