├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── README.md ├── build ├── build.js ├── check-versions.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 ├── index.html ├── package-lock.json ├── package.json ├── root ├── index.html └── static │ ├── css │ └── app.b6aa8c90a139822e0f8ef60ab5d84e84.css │ ├── fonts │ └── element-icons.6f0a763.ttf │ ├── img │ └── 404.a57b6f3.png │ ├── js │ ├── 0.7119c52e5a2c35c2750c.js │ ├── 1.2cd78258efd64cac9a28.js │ ├── 10.df736b3d7cef1ebf4894.js │ ├── 11.8d4bb718b03c7a613f8e.js │ ├── 12.41a621cd87be1d862bd6.js │ ├── 13.e9989130f879df682133.js │ ├── 14.4bcacc5a833eef8ffdc7.js │ ├── 15.1165b50de0a89c3ba199.js │ ├── 16.8801754020229bc88e5d.js │ ├── 17.00679087301a7e44186e.js │ ├── 18.145149ce8e6fde3bcb4e.js │ ├── 2.b29f04f5506b6a47dd74.js │ ├── 3.999064b91ef0b11e4f94.js │ ├── 4.00c3dc11d971ad332f4a.js │ ├── 5.6d6e2bf5d206b734e784.js │ ├── 6.aad6fcb658017173649f.js │ ├── 7.b7b135bd11a4d214288a.js │ ├── 8.417a6197e8e07422d7fd.js │ ├── 9.9c6db03361562d92bd0d.js │ ├── app.5b92ebd7443f13597ea0.js │ ├── manifest.67611814c8e19f35f9f2.js │ └── vendor.3445c7f51caef42dd93e.js │ ├── masterjoy_shop.sql │ ├── shop_template_2018-05-10_16-14-45.sql │ ├── sk_cart.sql │ ├── sk_order.sql │ ├── sk_order_info.sql │ ├── sk_user.sql │ └── tinymce │ ├── langs │ └── zh_CN.js │ ├── skins │ └── lightgray │ │ ├── content.inline.min.css │ │ ├── content.min.css │ │ ├── fonts │ │ ├── tinymce-small.eot │ │ ├── tinymce-small.json │ │ ├── tinymce-small.svg │ │ ├── tinymce-small.ttf │ │ ├── tinymce-small.woff │ │ ├── tinymce.eot │ │ ├── tinymce.json │ │ ├── tinymce.svg │ │ ├── tinymce.ttf │ │ └── tinymce.woff │ │ ├── img │ │ ├── anchor.gif │ │ ├── loader.gif │ │ ├── object.gif │ │ └── trans.gif │ │ ├── skin.ie7.min.css │ │ └── skin.min.css │ └── tinymce.min.js ├── src ├── App.vue ├── api │ ├── adminUser.js │ ├── cate.js │ ├── dashboard.js │ ├── database.js │ ├── express.js │ ├── login.js │ ├── member.js │ ├── node.js │ ├── order.js │ ├── product.js │ ├── recommend.js │ └── role.js ├── assets │ ├── 404_images │ │ ├── 404.png │ │ └── 404_cloud.png │ └── img │ │ └── avatar.gif ├── components │ ├── Breadcrumb │ │ └── index.vue │ ├── Hamburger │ │ └── index.vue │ ├── MDinput │ │ └── index.vue │ ├── ScrollBar │ │ └── index.vue │ ├── SvgIcon │ │ └── index.vue │ └── Tinymce │ │ ├── components │ │ └── editorImage.vue │ │ └── index.vue ├── icons │ ├── index.js │ └── svg │ │ ├── admin-manage.svg │ │ ├── database.svg │ │ ├── eye.svg │ │ ├── form.svg │ │ ├── member.svg │ │ ├── node.svg │ │ ├── order.svg │ │ ├── password.svg │ │ ├── product.svg │ │ ├── recommend.svg │ │ ├── role.svg │ │ ├── system.svg │ │ └── table.svg ├── main.js ├── permission.js ├── router │ └── index.js ├── store │ ├── getters.js │ ├── index.js │ └── modules │ │ ├── app.js │ │ ├── product.js │ │ └── user.js ├── styles │ ├── element-ui.scss │ ├── index.scss │ ├── mixin.scss │ ├── sidebar.scss │ ├── transition.scss │ └── variables.scss ├── utils │ ├── auth.js │ ├── index.js │ ├── mixin.js │ ├── request.js │ └── validate.js └── views │ ├── 404.vue │ ├── admin │ ├── node │ │ └── index.vue │ ├── role │ │ └── index.vue │ └── user │ │ ├── addUser.vue │ │ └── index.vue │ ├── dashboard │ └── index.vue │ ├── layout │ ├── Layout.vue │ └── components │ │ ├── AppMain.vue │ │ ├── Navbar.vue │ │ ├── Sidebar │ │ ├── SidebarItem.vue │ │ └── index.vue │ │ ├── avatar.gif │ │ └── index.js │ ├── login │ └── index.vue │ ├── member │ └── index.vue │ ├── order │ ├── express │ │ └── index.vue │ └── order │ │ ├── detail.vue │ │ └── index.vue │ ├── product │ ├── cate │ │ └── index.vue │ └── pro │ │ ├── addPro.vue │ │ ├── editPro.vue │ │ └── index.vue │ ├── recommend │ ├── content │ │ └── index.vue │ └── postion │ │ └── index.vue │ └── system │ └── database │ └── index.vue └── static ├── .gitkeep ├── masterjoy_shop.sql ├── shop_template_2018-05-10_16-14-45.sql ├── sk_cart.sql ├── sk_order.sql ├── sk_order_info.sql ├── sk_user.sql └── tinymce ├── langs └── zh_CN.js ├── skins └── lightgray │ ├── content.inline.min.css │ ├── content.min.css │ ├── fonts │ ├── tinymce-small.eot │ ├── tinymce-small.json │ ├── tinymce-small.svg │ ├── tinymce-small.ttf │ ├── tinymce-small.woff │ ├── tinymce.eot │ ├── tinymce.json │ ├── tinymce.svg │ ├── tinymce.ttf │ └── tinymce.woff │ ├── img │ ├── anchor.gif │ ├── loader.gif │ ├── object.gif │ └── trans.gif │ ├── skin.ie7.min.css │ └── skin.min.css └── tinymce.min.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"] 12 | } 13 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Editor directories and files 9 | .idea 10 | .vscode 11 | *.suo 12 | *.ntvs* 13 | *.njsproj 14 | *.sln 15 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | * 本项目仅供交流和学习使用 3 | * 项目出现的任何BUG和需要优化的地方请 PR 或 ISSUES, 作者不保证会第一时间会修改,只有在业余时间才会进行修改 4 | * 如果觉得不错,请帮忙点个star ,举手之劳 5 | * 作者一直都是把github当U盘用, 所以请不要在意master分支提交那么多次 6 | 7 | # 项目地址 8 | * [商城前台-Mobil版 演示地址](http://www.masterjoy.top) 9 | * [商城前台-Mobil版 github](https://github.com/MasterJoyHunan/app) 10 | * [商城后台-PC版 演示地址](http://www.masterjoy.top/root) 11 | * [商城后台-PC版 github](https://github.com/MasterJoyHunan/adminForVue) 12 | * [商城后台 php源码 github](https://github.com/MasterJoyHunan/shopAdmin) 13 | 14 | # 项目介绍 15 | #### 商城前台-Mobil版 16 | ___ 17 | > 使用VUE作为主框架编写的一套简单的商城系统, 使用vux作为css框架(作者css太弱了,其实里面的css有能力的完全可以自己重写).麻雀虽小,五脏俱全. 能实现完整的购物流程, 该项目没有使用各种复杂的代码 18 | > > 定位: 适合初学者想学习VUE,又没有几个合适的项目练手的朋友.学习和使用VUE的各种特性和语法. 19 | > 本项目没有文档和测试,不保证安全和性能,仅仅用来学习交流 20 | 21 | 该项目的功能含有: 22 | 23 | * 登录 24 | * 首页 25 | * 分类 26 | * 购物车 27 | * 个人中心 28 | * 商品详情 29 | * 商品SKU选择 30 | * 立即购买 31 | * 加入购物车 32 | * 订单列表 33 | * 订单详情 34 | * .... 35 | 36 | 有些功能由于能力,精力限制,暂时还不完善,请不要纠结 37 | 图片展示: 38 | ![登录](http://www.masterjoy.top/uploads/app/login.png) 39 | ![首页](http://www.masterjoy.top/uploads/app/index.png) 40 | ![分类](http://www.masterjoy.top/uploads/app/cate.png) 41 | ![个人中心](http://www.masterjoy.top/uploads/app/member.png) 42 | ![商品](http://www.masterjoy.top/uploads/app/detail2.png) 43 | ![商品](http://www.masterjoy.top/uploads/app/detail.png) 44 | ![订单](http://www.masterjoy.top/uploads/app/order.png) 45 | #### 商城后台-PC版 46 | ___ 47 | > 使用VUE作为主框架编写的一套简单的商城后台系统, 使用element-ui为css框架(作者css太弱了,其实里面的css有能力的完全可以自己重写).麻雀虽小,五脏俱全. 能实现完整的购物流程, 该项目没有使用各种复杂的代码 48 | > > 定位: 适合初学者想学习VUE,又没有几个合适的项目练手的朋友.学习和使用VUE的各种特性和语法. 49 | > 本项目没有文档和测试,不保证安全和性能,仅仅用来学习交流 50 | 51 | * 权限管理 52 | * 列表 53 | * 分页 54 | * 对应前台的功能 55 | * .... 56 | 57 | 有些功能由于能力,精力限制,暂时还不完善,请不要纠结 58 | 图片展示: 59 | ![登录](http://www.masterjoy.top/uploads/root/login.png) 60 | ![首页](http://www.masterjoy.top/uploads/root/index.png) 61 | ![分类](http://www.masterjoy.top/uploads/root/cate.png) 62 | ![权限管理](http://www.masterjoy.top/uploads/root/node.png) 63 | 64 | # 作者简介 65 | 作者是半路出家自学的PHP的程序员,fu南人, 主要从事后端PHP开发, 从业3年,PHP也不是很熟, 前端也不是很强, 就这样吧, 如有对项目有疑问或需要联系作者, 请 PR 或者 issuse 或者发邮箱 386442876@qq.com 66 | # 基于 67 | 本项目或多或少用到了别人的代码,确实做了很多次伸手党(注: 在MIT协议情况下),在此谢谢在GitHub上的大神 68 | 感谢他们开源精神,以下 69 | * [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin/blob/master/README.zh-CN.md) 70 | * vue-element-admin 是一个后台集成解决方案,它基于 Vue.js 和 element。它使用了最新的前端技术栈,内置了i18国际化解决方案,动态路由,权限验证等很多功能特性,相信不管你的需求是什么,本项目都能帮助到你。 71 | # 多说两句 72 | 前端的变化速度日新月异, 以前很火的Jquery我们公司已经不怎么用了,而新的MVVM的框架将成为主流,而VUE又是其中佼佼者, 由国人大神尤雨溪主导开发,中文文档非常友好,社区非常繁荣. 73 | 现在学习前端可以构建单页面应用,可以打包成APP IOS, 甚至可以打包成桌面应用,让我这个学PHP的也心动不已.前端实在是太棒了!希望大家能早日精通前端, 升职加薪,赢取白富美 74 | # 技术栈 75 | * 商城前台-Mobil版 76 | * vue 77 | * vue-cli 78 | * less 79 | * vue-router 80 | * vuex 81 | * vux 82 | * axios 83 | * es-lint 84 | * better-scroll 85 | * 商城后台-PC版 86 | * vue 87 | * vue-cli 88 | * scss 89 | * vue-router 90 | * vuex 91 | * element-ui 92 | * axios 93 | * es-lint 94 | * echarts 95 | * es6-promise 96 | * 商城后台 97 | * think-php 5.0 98 | 99 | # 搭建本地服务 100 | > 1. 克隆https://github.com/MasterJoyHunan/shopAdmin到本地,并把项目根目录的里的/data/xxx.sql的数据库文件给导入 101 | 102 | 注意: 103 | * 先创建shop_template数据库 104 | * 再运行进行导入 105 | * github上上传的时候,我忽略了database.php文件,请自己创建 106 | * database.php下 107 | * database = '你的数据库', 108 | * prefix = 'mj_' , 109 | * mysql_path' => '备份文件所在的目录' 110 | 111 | 以上运行,如果没报错,可以进行下一步了 112 | > 2.克隆https://github.com/MasterJoyHunan/shopAdmin到本地, npm install && npm run dev 113 | 114 | 注意: 115 | * 由于shopAdmin是单独项目, js请求会跨域, 导致请求不成功, 所幸vue-cli提供了一个代理的功能. 进入shopAdmin/config/index.js, 修改以下内容 116 | 117 | proxyTable: { 118 | "/shop": { 119 | target: "http://localhost/web/public/shop", //修改为你需要调用api入口 120 | changeOrigin: true, 121 | pathRewrite: { 122 | "^/shop": "/" 123 | } 124 | } 125 | }, 126 | // 该代码是指, 所有调用/shop的地方都换装换成http://localhost/web/public/shop 127 | 128 | 接下来,运行下面的操作 129 | 130 | # 运行VUE项目 131 | ``` bash 132 | # 安装依赖 133 | npm install 134 | 135 | # 运行项目 136 | npm run dev 137 | 138 | # 打包 139 | npm run build 140 | 141 | # build for production and view the bundle analyzer report 142 | npm run build --report 143 | ``` 144 | 145 | # 协议 146 | > license MIT -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, (err, stats) => { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | 7 | function exec (cmd) { 8 | return require('child_process').execSync(cmd).toString().trim() 9 | } 10 | 11 | const versionRequirements = [ 12 | { 13 | name: 'node', 14 | currentVersion: semver.clean(process.version), 15 | versionRequirement: packageConfig.engines.node 16 | } 17 | ] 18 | 19 | if (shell.which('npm')) { 20 | versionRequirements.push({ 21 | name: 'npm', 22 | currentVersion: exec('npm --version'), 23 | versionRequirement: packageConfig.engines.npm 24 | }) 25 | } 26 | 27 | module.exports = function () { 28 | const warnings = [] 29 | 30 | for (let i = 0; i < versionRequirements.length; i++) { 31 | const mod = versionRequirements[i] 32 | 33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 34 | warnings.push(mod.name + ': ' + 35 | chalk.red(mod.currentVersion) + ' should be ' + 36 | chalk.green(mod.versionRequirement) 37 | ) 38 | } 39 | } 40 | 41 | if (warnings.length) { 42 | console.log('') 43 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 44 | console.log() 45 | 46 | for (let i = 0; i < warnings.length; i++) { 47 | const warning = warnings[i] 48 | console.log(' ' + warning) 49 | } 50 | 51 | console.log() 52 | process.exit(1) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | const packageConfig = require('../package.json') 6 | 7 | exports.assetsPath = function (_path) { 8 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 9 | ? config.build.assetsSubDirectory 10 | : config.dev.assetsSubDirectory 11 | 12 | return path.posix.join(assetsSubDirectory, _path) 13 | } 14 | 15 | exports.cssLoaders = function (options) { 16 | options = options || {} 17 | 18 | const cssLoader = { 19 | loader: 'css-loader', 20 | options: { 21 | sourceMap: options.sourceMap 22 | } 23 | } 24 | 25 | const postcssLoader = { 26 | loader: 'postcss-loader', 27 | options: { 28 | sourceMap: options.sourceMap 29 | } 30 | } 31 | 32 | // generate loader string to be used with extract text plugin 33 | function generateLoaders (loader, loaderOptions) { 34 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 35 | 36 | if (loader) { 37 | loaders.push({ 38 | loader: loader + '-loader', 39 | options: Object.assign({}, loaderOptions, { 40 | sourceMap: options.sourceMap 41 | }) 42 | }) 43 | } 44 | 45 | // Extract CSS when that option is specified 46 | // (which is the case during production build) 47 | if (options.extract) { 48 | return ExtractTextPlugin.extract({ 49 | use: loaders, 50 | fallback: 'vue-style-loader' 51 | }) 52 | } else { 53 | return ['vue-style-loader'].concat(loaders) 54 | } 55 | } 56 | 57 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 58 | return { 59 | css: generateLoaders(), 60 | postcss: generateLoaders(), 61 | less: generateLoaders('less'), 62 | sass: generateLoaders('sass', { indentedSyntax: true }), 63 | scss: generateLoaders('sass'), 64 | stylus: generateLoaders('stylus'), 65 | styl: generateLoaders('stylus') 66 | } 67 | } 68 | 69 | // Generate loaders for standalone style files (outside of .vue) 70 | exports.styleLoaders = function (options) { 71 | const output = [] 72 | const loaders = exports.cssLoaders(options) 73 | 74 | for (const extension in loaders) { 75 | const loader = loaders[extension] 76 | output.push({ 77 | test: new RegExp('\\.' + extension + '$'), 78 | use: loader 79 | }) 80 | } 81 | 82 | return output 83 | } 84 | 85 | exports.createNotifierCallback = () => { 86 | const notifier = require('node-notifier') 87 | 88 | return (severity, errors) => { 89 | if (severity !== 'error') return 90 | 91 | const error = errors[0] 92 | const filename = error.file && error.file.split('!').pop() 93 | 94 | notifier.notify({ 95 | title: packageConfig.name, 96 | message: severity + ': ' + error.name, 97 | subtitle: filename || '', 98 | icon: path.join(__dirname, 'logo.png') 99 | }) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | 7 | function resolve (dir) { 8 | return path.join(__dirname, '..', dir) 9 | } 10 | 11 | const createLintingRule = () => ({ 12 | test: /\.(js|vue)$/, 13 | loader: 'eslint-loader', 14 | enforce: 'pre', 15 | include: [resolve('src'), resolve('test')], 16 | options: { 17 | formatter: require('eslint-friendly-formatter'), 18 | emitWarning: !config.dev.showEslintErrorsInOverlay 19 | } 20 | }) 21 | 22 | module.exports = { 23 | context: path.resolve(__dirname, '../'), 24 | entry: { 25 | app: './src/main.js' 26 | }, 27 | output: { 28 | path: config.build.assetsRoot, 29 | filename: '[name].js', 30 | publicPath: process.env.NODE_ENV === 'production' 31 | ? config.build.assetsPublicPath 32 | : config.dev.assetsPublicPath 33 | }, 34 | resolve: { 35 | extensions: ['.js', '.vue', '.json'], 36 | alias: { 37 | 'vue$': 'vue/dist/vue.esm.js', 38 | '@': resolve('src'), 39 | } 40 | }, 41 | module: { 42 | rules: [ 43 | ...(config.dev.useEslint ? [createLintingRule()] : []), 44 | { 45 | test: /\.vue$/, 46 | loader: 'vue-loader', 47 | options: vueLoaderConfig 48 | }, 49 | { 50 | test: /\.js$/, 51 | loader: 'babel-loader', 52 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] 53 | }, 54 | { 55 | test: /\.svg$/, 56 | loader: 'svg-sprite-loader', 57 | include: [resolve('src/icons')], 58 | options: { 59 | symbolId: 'icon-[name]' 60 | } 61 | }, 62 | { 63 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 64 | loader: 'url-loader', 65 | exclude: [resolve('src/icons')], 66 | options: { 67 | limit: 10000, 68 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 69 | } 70 | }, 71 | { 72 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 73 | loader: 'url-loader', 74 | options: { 75 | limit: 10000, 76 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 77 | } 78 | }, 79 | { 80 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 81 | loader: 'url-loader', 82 | options: { 83 | limit: 10000, 84 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 85 | } 86 | } 87 | ] 88 | }, 89 | node: { 90 | // prevent webpack from injecting useless setImmediate polyfill because Vue 91 | // source contains it (although only uses it if it's native). 92 | setImmediate: false, 93 | // prevent webpack from injecting mocks to Node native modules 94 | // that does not make sense for the client 95 | dgram: 'empty', 96 | fs: 'empty', 97 | net: 'empty', 98 | tls: 'empty', 99 | child_process: 'empty' 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const path = require('path') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 11 | const portfinder = require('portfinder') 12 | 13 | const HOST = process.env.HOST 14 | const PORT = process.env.PORT && Number(process.env.PORT) 15 | 16 | const devWebpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 19 | }, 20 | // cheap-module-eval-source-map is faster for development 21 | devtool: config.dev.devtool, 22 | 23 | // these devServer options should be customized in /config/index.js 24 | devServer: { 25 | clientLogLevel: 'warning', 26 | historyApiFallback: { 27 | rewrites: [ 28 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, 29 | ], 30 | }, 31 | hot: true, 32 | contentBase: false, // since we use CopyWebpackPlugin. 33 | compress: true, 34 | host: HOST || config.dev.host, 35 | port: PORT || config.dev.port, 36 | open: config.dev.autoOpenBrowser, 37 | overlay: config.dev.errorOverlay ? { warnings: false, errors: true } : false, 38 | publicPath: config.dev.assetsPublicPath, 39 | proxy: config.dev.proxyTable, 40 | quiet: true, // necessary for FriendlyErrorsPlugin 41 | watchOptions: { 42 | poll: config.dev.poll, 43 | } 44 | }, 45 | plugins: [ 46 | new webpack.DefinePlugin({ 47 | 'process.env': require('../config/dev.env') 48 | }), 49 | new webpack.HotModuleReplacementPlugin(), 50 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. 51 | new webpack.NoEmitOnErrorsPlugin(), 52 | // https://github.com/ampedandwired/html-webpack-plugin 53 | new HtmlWebpackPlugin({ 54 | filename: 'index.html', 55 | template: 'index.html', 56 | inject: true, 57 | path: config.dev.assetsPublicPath + config.dev.assetsSubDirectory 58 | }), 59 | // copy custom static assets 60 | new CopyWebpackPlugin([{ 61 | from: path.resolve(__dirname, '../static'), 62 | to: config.dev.assetsSubDirectory, 63 | ignore: ['.*'] 64 | }]) 65 | ] 66 | }) 67 | 68 | module.exports = new Promise((resolve, reject) => { 69 | portfinder.basePort = process.env.PORT || config.dev.port 70 | portfinder.getPort((err, port) => { 71 | if (err) { 72 | reject(err) 73 | } else { 74 | // publish the new Port, necessary for e2e tests 75 | process.env.PORT = port 76 | // add port to devServer config 77 | devWebpackConfig.devServer.port = port 78 | 79 | // Add FriendlyErrorsPlugin 80 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 81 | compilationSuccessInfo: { 82 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], 83 | }, 84 | onErrors: config.dev.notifyOnErrors ? 85 | utils.createNotifierCallback() : undefined 86 | })) 87 | 88 | resolve(devWebpackConfig) 89 | } 90 | }) 91 | }) -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const webpack = require('webpack') 5 | const config = require('../config') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 12 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin') 13 | 14 | const env = require('../config/prod.env') 15 | 16 | const webpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ 19 | sourceMap: config.build.productionSourceMap, 20 | extract: true, 21 | usePostCSS: true 22 | }) 23 | }, 24 | devtool: config.build.productionSourceMap ? config.build.devtool : false, 25 | output: { 26 | path: config.build.assetsRoot, 27 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 28 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 29 | }, 30 | plugins: [ 31 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 32 | new webpack.DefinePlugin({ 33 | 'process.env': env 34 | }), 35 | new UglifyJsPlugin({ 36 | uglifyOptions: { 37 | compress: { 38 | warnings: false 39 | } 40 | }, 41 | sourceMap: config.build.productionSourceMap, 42 | parallel: true 43 | }), 44 | // extract css into its own file 45 | new ExtractTextPlugin({ 46 | filename: utils.assetsPath('css/[name].[contenthash].css'), 47 | // Setting the following option to `false` will not extract CSS from codesplit chunks. 48 | // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. 49 | // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 50 | // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 51 | allChunks: true, 52 | }), 53 | // Compress extracted CSS. We are using this plugin so that possible 54 | // duplicated CSS from different components can be deduped. 55 | new OptimizeCSSPlugin({ 56 | cssProcessorOptions: config.build.productionSourceMap ? 57 | { safe: true, map: { inline: false } } : 58 | { safe: true } 59 | }), 60 | // generate dist index.html with correct asset hash for caching. 61 | // you can customize output by editing /index.html 62 | // see https://github.com/ampedandwired/html-webpack-plugin 63 | new HtmlWebpackPlugin({ 64 | filename: config.build.index, 65 | template: 'index.html', 66 | inject: true, 67 | path: config.build.assetsPublicPath + config.build.assetsSubDirectory, 68 | minify: { 69 | removeComments: true, 70 | collapseWhitespace: true, 71 | removeAttributeQuotes: true 72 | // more options: 73 | // https://github.com/kangax/html-minifier#options-quick-reference 74 | }, 75 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 76 | chunksSortMode: 'dependency' 77 | }), 78 | // keep module.id stable when vendor modules does not change 79 | new webpack.HashedModuleIdsPlugin(), 80 | // enable scope hoisting 81 | new webpack.optimize.ModuleConcatenationPlugin(), 82 | // split vendor js into its own file 83 | new webpack.optimize.CommonsChunkPlugin({ 84 | name: 'vendor', 85 | minChunks(module) { 86 | // any required modules inside node_modules are extracted to vendor 87 | return ( 88 | module.resource && 89 | /\.js$/.test(module.resource) && 90 | module.resource.indexOf( 91 | path.join(__dirname, '../node_modules') 92 | ) === 0 93 | ) 94 | } 95 | }), 96 | // extract webpack runtime and module manifest to its own file in order to 97 | // prevent vendor hash from being updated whenever app bundle is updated 98 | new webpack.optimize.CommonsChunkPlugin({ 99 | name: 'manifest', 100 | minChunks: Infinity 101 | }), 102 | // This instance extracts shared chunks from code splitted chunks and bundles them 103 | // in a separate chunk, similar to the vendor chunk 104 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk 105 | new webpack.optimize.CommonsChunkPlugin({ 106 | name: 'app', 107 | async: 'vendor-async', 108 | children: true, 109 | minChunks: 3 110 | }), 111 | 112 | // copy custom static assets 113 | new CopyWebpackPlugin([{ 114 | from: path.resolve(__dirname, '../static'), 115 | to: config.build.assetsSubDirectory, 116 | ignore: ['.*'] 117 | }]) 118 | ] 119 | }) 120 | 121 | if (config.build.productionGzip) { 122 | const CompressionWebpackPlugin = require('compression-webpack-plugin') 123 | 124 | webpackConfig.plugins.push( 125 | new CompressionWebpackPlugin({ 126 | asset: '[path].gz[query]', 127 | algorithm: 'gzip', 128 | test: new RegExp( 129 | '\\.(' + 130 | config.build.productionGzipExtensions.join('|') + 131 | ')$' 132 | ), 133 | threshold: 10240, 134 | minRatio: 0.8 135 | }) 136 | ) 137 | } 138 | 139 | if (config.build.bundleAnalyzerReport) { 140 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 141 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 142 | } 143 | 144 | module.exports = webpackConfig -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"', 7 | BASE_API: '"/api"', 8 | CDN: "'http://localhost/web/public/uploads/'" 9 | }) 10 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: { 14 | '/api':{ 15 | target: 'http://localhost/web/public/vueapi', 16 | changeOrigin: true, 17 | pathRewrite: { 18 | '^/api':'/' 19 | } 20 | } 21 | }, 22 | 23 | // Various Dev Server settings 24 | host: 'localhost', // can be overwritten by process.env.HOST 25 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 26 | autoOpenBrowser: false, 27 | errorOverlay: true, 28 | notifyOnErrors: true, 29 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 30 | 31 | // Use Eslint Loader? 32 | // If true, your code will be linted during bundling and 33 | // linting errors and warnings will be shown in the console. 34 | useEslint: true, 35 | // If true, eslint errors and warnings will also be shown in the error overlay 36 | // in the browser. 37 | showEslintErrorsInOverlay: false, 38 | 39 | /** 40 | * Source Maps 41 | */ 42 | 43 | // https://webpack.js.org/configuration/devtool/#development 44 | devtool: 'cheap-module-eval-source-map', 45 | 46 | // If you have problems debugging vue-files in devtools, 47 | // set this to false - it *may* help 48 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 49 | cacheBusting: true, 50 | 51 | cssSourceMap: true 52 | }, 53 | 54 | build: { 55 | // Template for index.html 56 | index: path.resolve(__dirname, '../root/index.html'), 57 | 58 | // Paths 59 | assetsRoot: path.resolve(__dirname, '../root'), 60 | assetsSubDirectory: 'static', 61 | assetsPublicPath: './', 62 | 63 | /** 64 | * Source Maps 65 | */ 66 | 67 | productionSourceMap: false, 68 | // https://webpack.js.org/configuration/devtool/#production 69 | devtool: '#source-map', 70 | 71 | // Gzip off by default as many popular static hosts such as 72 | // Surge or Netlify already gzip all static assets for you. 73 | // Before setting to `true`, make sure to: 74 | // npm install --save-dev compression-webpack-plugin 75 | productionGzip: false, 76 | productionGzipExtensions: ['js', 'css'], 77 | 78 | // Run the build command with an extra argument to 79 | // View the bundle analyzer report after build finishes: 80 | // `npm run build --report` 81 | // Set to `true` or `false` to always turn it on or off 82 | bundleAnalyzerReport: process.env.npm_config_report 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"', 4 | BASE_API: "'/vueapi/'", 5 | CDN: "'/uploads/'", 6 | } 7 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | admin_vue 7 | 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "admin_vue", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "masterjoy", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "lint": "eslint --ext .js,.vue src", 11 | "build": "node build/build.js" 12 | }, 13 | "dependencies": { 14 | "axios": "^0.18.0", 15 | "echarts": "^4.1.0", 16 | "element-ui": "^2.3.5", 17 | "es6-promise": "^4.2.4", 18 | "js-cookie": "^2.2.0", 19 | "normalize.css": "^8.0.0", 20 | "nprogress": "^0.2.0", 21 | "vue": "^2.5.2", 22 | "vue-router": "^3.0.1", 23 | "vuex": "^3.0.1" 24 | }, 25 | "devDependencies": { 26 | "autoprefixer": "^7.1.2", 27 | "babel-core": "^6.22.1", 28 | "babel-eslint": "^8.2.1", 29 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 30 | "babel-loader": "^7.1.1", 31 | "babel-plugin-syntax-jsx": "^6.18.0", 32 | "babel-plugin-transform-runtime": "^6.22.0", 33 | "babel-plugin-transform-vue-jsx": "^3.5.0", 34 | "babel-preset-env": "^1.3.2", 35 | "babel-preset-stage-2": "^6.22.0", 36 | "chalk": "^2.0.1", 37 | "copy-webpack-plugin": "^4.0.1", 38 | "css-loader": "^0.28.0", 39 | "eslint": "^4.15.0", 40 | "eslint-config-standard": "^10.2.1", 41 | "eslint-friendly-formatter": "^3.0.0", 42 | "eslint-loader": "^1.7.1", 43 | "eslint-plugin-html": "^4.0.3", 44 | "eslint-plugin-import": "^2.7.0", 45 | "eslint-plugin-node": "^5.2.0", 46 | "eslint-plugin-promise": "^3.4.0", 47 | "eslint-plugin-standard": "^3.0.1", 48 | "eslint-plugin-vue": "^4.0.0", 49 | "extract-text-webpack-plugin": "^3.0.0", 50 | "file-loader": "^1.1.4", 51 | "friendly-errors-webpack-plugin": "^1.6.1", 52 | "html-webpack-plugin": "^2.30.1", 53 | "node-notifier": "^5.1.2", 54 | "optimize-css-assets-webpack-plugin": "^3.2.0", 55 | "ora": "^1.2.0", 56 | "portfinder": "^1.0.13", 57 | "postcss-import": "^11.0.0", 58 | "postcss-loader": "^2.0.8", 59 | "postcss-url": "^7.2.1", 60 | "rimraf": "^2.6.0", 61 | "sass": "^1.32.8", 62 | "sass-loader": "^7.1.0", 63 | "semver": "^5.3.0", 64 | "shelljs": "^0.7.6", 65 | "svg-sprite-loader": "^3.7.3", 66 | "uglifyjs-webpack-plugin": "^1.1.1", 67 | "url-loader": "^0.5.8", 68 | "vue-loader": "^13.3.0", 69 | "vue-style-loader": "^3.0.1", 70 | "vue-template-compiler": "^2.5.2", 71 | "webpack": "^3.6.0", 72 | "webpack-bundle-analyzer": "^2.9.0", 73 | "webpack-dev-server": "^2.9.1", 74 | "webpack-merge": "^4.1.0" 75 | }, 76 | "engines": { 77 | "node": ">= 6.0.0", 78 | "npm": ">= 3.0.0" 79 | }, 80 | "browserslist": [ 81 | "> 1%", 82 | "last 2 versions", 83 | "not ie <= 8" 84 | ] 85 | } 86 | -------------------------------------------------------------------------------- /root/index.html: -------------------------------------------------------------------------------- 1 | admin_vue
-------------------------------------------------------------------------------- /root/static/fonts/element-icons.6f0a763.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/fonts/element-icons.6f0a763.ttf -------------------------------------------------------------------------------- /root/static/img/404.a57b6f3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/img/404.a57b6f3.png -------------------------------------------------------------------------------- /root/static/js/0.7119c52e5a2c35c2750c.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([0],{UgCr:function(t,a,e){"use strict";a.e=function(t){return Object(r.a)({url:"product/index",params:t})},a.d=function(){return Object(r.a)({url:"product/addPro"})},a.a=function(t){return Object(r.a)({url:"product/addPro",method:"post",data:t})},a.c=function(t){return Object(r.a)({url:"product/editPro",method:"post",data:t})},a.b=function(t){return Object(r.a)({url:"product/delPro",method:"post",data:t})},a.f=function(t){return Object(r.a)({url:"product/getProdetail",method:"get",params:t})};var r=e("vLgD")},vsZy:function(t,a,e){"use strict";e.d(a,"a",function(){return r});var r={created:function(){this._getData()},data:function(){return{cdn:"/uploads/",table_loading:!0,list:[],params:{pageSize:10,page:1},page_sizes:[10,25,50,100],total:1}},methods:{handleSizeChange:function(t){this.params.pageSize=t,this._getData()},handleCurrentChange:function(t){this._getData()},search:function(){this._getData()},_getData:function(){throw Error("请先获取数据")}}}}}); -------------------------------------------------------------------------------- /root/static/js/10.df736b3d7cef1ebf4894.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([10],{L0VS:function(t,e){},cgTB:function(t,e,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=a("Dd8w"),r=a.n(n),i=a("lhz5"),l=a("NYxO"),s={name:"userIndex",mixins:[a("vsZy").a],data:function(){return{params:{user_name:""}}},methods:r()({handleEdit:function(t,e){this.setEditAdmin(e),this.$router.push("/admin/addAdmin")},handleDel:function(t,e){var a=this;this.$confirm("删除管理员将不可恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){Object(i.a)(e).then(function(e){a.$message({message:"删除成功",type:"success"}),a.list.splice(t,1)})})},addAdmin:function(t){this.$router.push("/admin/addAdmin/"),this.setEditAdmin({})},_getData:function(){var t=this;Object(i.b)(this.params).then(function(e){t.list=e.data.data,t.total=e.data.total,t.pageSize=e.data.per_page,t.page=e.data.current_page,t.table_loading=!1}).catch(function(e){t.table_loading=!0})}},Object(l.d)({setEditAdmin:"SET_EDIT_ADMIN"}))},c={render:function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"app-container"},[a("p",{staticClass:"page-title"},[t._v("管理员列表")]),t._v(" "),a("div",{staticClass:"filter-container"},[a("el-button",{staticClass:"filter-item",attrs:{type:"primary",plain:""},on:{click:function(e){t.addAdmin()}}},[t._v("添加管理员")]),t._v(" "),a("div",{staticStyle:{float:"right"}},[a("el-input",{staticClass:"filter-item",staticStyle:{width:"200px"},attrs:{placeholder:"管理员用户名"},model:{value:t.params.user_name,callback:function(e){t.$set(t.params,"user_name",e)},expression:"params.user_name"}}),t._v(" "),a("el-button",{staticClass:"filter-item",attrs:{type:"primary"},on:{click:t.search}},[t._v("搜索")])],1)],1),t._v(" "),a("el-table",{directives:[{name:"loading",rawName:"v-loading",value:t.table_loading,expression:"table_loading"}],attrs:{"element-loading-text":"加载中...",border:"",fit:"","highlight-current-row":"",data:t.list}},[a("el-table-column",{attrs:{label:"ID",prop:"id",align:"center",width:"60px"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"管理员名称",prop:"user_name"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"管理员真实姓名",prop:"real_name"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"管理员角色",prop:"role.role_name"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"最后登录IP",prop:"last_login_ip"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"最后登录时间",prop:"last_login_time"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"状态",width:"80px"},scopedSlots:t._u([{key:"default",fn:function(e){return[1==e.row.status?a("el-tag",{attrs:{type:"success"}},[t._v("正常")]):t._e(),t._v(" "),0==e.row.status?a("el-tag",{attrs:{type:"danger"}},[t._v("禁用")]):t._e()]}}])}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"操作"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("el-button",{attrs:{size:"mini",type:"primary"},on:{click:function(a){t.handleEdit(e.$index,e.row)}}},[t._v("编辑")]),t._v(" "),a("el-button",{attrs:{size:"mini",type:"danger"},on:{click:function(a){t.handleDel(e.$index,e.row)}}},[t._v("删除")])]}}])})],1),t._v(" "),a("div",{staticClass:"page-container"},[a("el-pagination",{attrs:{background:"","current-page":t.params.page,"page-sizes":t.page_sizes,"page-size":t.params.pageSize,layout:"total, sizes, prev, pager, next, jumper",total:t.total},on:{"size-change":t.handleSizeChange,"update:currentPage":function(e){t.$set(t.params,"page",e)},"current-change":t.handleCurrentChange}})],1)],1)},staticRenderFns:[]};var o=a("VU/8")(s,c,!1,function(t){a("L0VS")},"data-v-0605e38e",null);e.default=o.exports},lhz5:function(t,e,a){"use strict";e.b=function(t){return Object(n.a)({url:"user/index",method:"get",params:t})},e.a=function(t){return Object(n.a)({url:"user/userDel",method:"post",data:t})},e.c=function(){return Object(n.a)({url:"user/userAdd",method:"get"})},e.d=function(t){var e=t.id?"user/userEdit":"user/userAdd";return Object(n.a)({url:e,method:"post",data:t})};var n=a("vLgD")}}); -------------------------------------------------------------------------------- /root/static/js/11.8d4bb718b03c7a613f8e.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([11],{"5Fa2":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n("vLgD");var a={name:"node",created:function(){this._getData()},data:function(){return{tree:[],showDialog:!1,title:"",form:{id:0,type_id:0,node_name:"",control_name:"",action_name:"",component_name:"",is_menu:0,p_name:""},formRule:{node_name:[{required:!0,message:"请输入节点名",trigger:"blur"}],control_name:[{required:!0,message:"请输入控制器名",trigger:"blur"}],action_name:[{required:!0,message:"请输入方法名",trigger:"blur"}],component_name:[],is_menu:[{required:!0,message:"请选择是否是菜单",trigger:"blur"}]}}},methods:{renderContent:function(e,t){var n=this,o=t.node,a=t.data;t.store;return e("span",{class:"custom-tree-node"},[e("span",[o.label]),e("span",{class:"operation"},[e("div",[e("el-button",{attrs:{size:"mini",type:"text"},style:"color:#409EFF",on:{click:function(){return n.append(o,a,1)}}},["编辑该节点"]),e("el-button",{attrs:{size:"mini",type:"text"},style:"color:#67c23a",on:{click:function(){return n.append(o,a,2)}}},["添加子节点"]),e("el-button",{attrs:{size:"mini",type:"text"},style:"color:#f56c6c",on:{click:function(){return n.remove(o,a)}}},["删除该节点"])])])])},append:function(e,t,n){this.showDialog=!0,this.title="添加节点",1==n?(this.form.p_name=e.parent.data.label||"顶级节点",this.form.type_id=t.type_id,this.form.control_name=t.control_name,this.form.action_name=t.action_name,this.form.component_name=t.component_name,this.form.node_name=t.label,this.form.is_menu=t.is_menu,this.form.id=t.id):2==n?(this.title="添加节点",this.form.p_name=t.label,this.form.type_id=t.id,this.form.control_name="",this.form.action_name="",this.form.component_name="",this.form.node_name="",this.form.is_menu=2,this.form.id=0):(this.title="添加节点",this.form.p_name="顶级节点",this.form.type_id=0,this.form.control_name="#",this.form.action_name="#",this.form.component_name="",this.form.node_name="",this.form.is_menu=2,this.form.id=0)},onSubmit:function(){var e=this;this.$refs.nodeForm.validate(function(t){if(!t)return!1;var n;0===e.form.id?(n=e.form,Object(o.a)({url:"node/nodeAdd",method:"post",data:n})).then(function(t){e.$message({message:t.msg,type:"success"}),e.showDialog=!1,e._getData()}):function(e){return Object(o.a)({url:"node/nodeEdit",method:"post",data:e})}(e.form).then(function(t){e.$message({message:t.msg,type:"success"}),e.showDialog=!1,e._getData()})})},remove:function(e,t){var n=this;this.$confirm("删除节点将不可恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){var a;(a=t,Object(o.a)({url:"node/nodeDel",method:"post",data:a})).then(function(o){n.$message({message:o.msg,type:"success"});var a=e.parent,i=a.data.children||a.data,r=i.findIndex(function(e){return e.id===t.id});i.splice(r,1)})})},_getData:function(){var e=this;Object(o.a)({url:"node/index"}).then(function(t){e.tree=t.data})}}},i={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"app-container"},[n("p",{staticClass:"page-title"},[e._v("节点列表")]),e._v(" "),n("div",{staticClass:"filter-container"},[n("el-button",{staticClass:"filter-item",attrs:{type:"primary",plain:""},on:{click:function(t){e.append("")}}},[e._v("添加顶级节点")])],1),e._v(" "),n("el-tree",{staticStyle:{width:"40%",margin:"50px 0 0 80px"},attrs:{data:e.tree,"node-key":"id","expand-on-click-node":!1,"render-content":e.renderContent}}),e._v(" "),n("el-dialog",{attrs:{visible:e.showDialog,title:e.title,width:"30%"},on:{"update:visible":function(t){e.showDialog=t}}},[n("el-form",{ref:"nodeForm",attrs:{model:e.form,"status-icon":"","label-width":"100px",rules:e.formRule},nativeOn:{submit:function(e){e.preventDefault()}}},[n("el-form-item",{attrs:{label:"节点名",prop:"node_name"}},[n("el-input",{model:{value:e.form.node_name,callback:function(t){e.$set(e.form,"node_name",t)},expression:"form.node_name"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"所属节点"}},[n("el-input",{attrs:{disabled:""},model:{value:e.form.p_name,callback:function(t){e.$set(e.form,"p_name",t)},expression:"form.p_name"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"控制器名",prop:"control_name"}},[n("el-input",{attrs:{disabled:!e.form.type_id},model:{value:e.form.control_name,callback:function(t){e.$set(e.form,"control_name",t)},expression:"form.control_name"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"方法名",prop:"action_name"}},[n("el-input",{attrs:{disabled:!e.form.type_id},model:{value:e.form.action_name,callback:function(t){e.$set(e.form,"action_name",t)},expression:"form.action_name"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"组件名",prop:"component_name"}},[n("el-input",{model:{value:e.form.component_name,callback:function(t){e.$set(e.form,"component_name",t)},expression:"form.component_name"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"是否是菜单",prop:"is_menu"}},[n("el-radio-group",{attrs:{disabled:!e.form.type_id},model:{value:e.form.is_menu,callback:function(t){e.$set(e.form,"is_menu",t)},expression:"form.is_menu"}},[n("el-radio",{attrs:{label:2,border:""}},[e._v("是")]),e._v(" "),n("el-radio",{attrs:{label:1,border:""}},[e._v("否")])],1)],1),e._v(" "),n("el-form-item",[n("div",{staticStyle:{float:"right"}},[n("el-button",{attrs:{type:"primary"},on:{click:e.onSubmit}},[e._v("提交")]),e._v(" "),n("el-button",{attrs:{type:"success"},on:{click:function(t){e.showDialog=!1}}},[e._v("取消")])],1)])],1)],1)],1)},staticRenderFns:[]};var r=n("VU/8")(a,i,!1,function(e){n("G2zv")},null,null);t.default=r.exports},G2zv:function(e,t){}}); -------------------------------------------------------------------------------- /root/static/js/12.41a621cd87be1d862bd6.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([12],{"62NT":function(t,e){},LBb0:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var a=n("vLgD");var i={name:"database",created:function(){this._getData()},data:function(){return{table_loading:!0,list:[]}},methods:{backSql:function(){var t=this;this.$confirm("是否备份数据库","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){Object(a.a)({url:"data/backup"}).then(function(e){t.$message({message:e.msg,type:"success"}),t._getData()})})},initSql:function(){var t=this;this.$confirm("系统将恢复初始状态,不可恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){Object(a.a)({url:"data/initData"}).then(function(e){t.$message({message:e.msg,type:"success"})})})},download:function(t){location.href="http://localhost/web/public/vueapi/data/download?filename="+t.title},restore:function(t){var e=this;this.$confirm("系统将继续还原操作,不可恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){var n;(n=t,Object(a.a)({url:"data/restore",params:n})).then(function(t){e.$message({message:t.msg,type:"success"})})})},deleteSql:function(t,e){var n=this;this.$confirm("该数据库将进行删除,不可恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){var i;(i=e,Object(a.a)({url:"data/del",params:i})).then(function(e){n.$message({message:e.msg,type:"success"}),n.list.splice(t,1)})})},_getData:function(){var t=this;Object(a.a)({url:"data/index"}).then(function(e){t.list=e.data,t.table_loading=!1}).catch(function(e){t.table_loading=!0})}}},l={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"app-container"},[n("p",{staticClass:"page-title"},[t._v("数据库列表")]),t._v(" "),n("div",{staticClass:"filter-container"},[n("el-button",{staticClass:"filter-item",attrs:{type:"primary",plain:""},on:{click:function(e){t.backSql()}}},[t._v("备份数据库")]),t._v(" "),n("el-button",{staticClass:"filter-item",attrs:{type:"danger",plain:""},on:{click:function(e){t.initSql()}}},[t._v("系统初始化")])],1),t._v(" "),n("el-table",{directives:[{name:"loading",rawName:"v-loading",value:t.table_loading,expression:"table_loading"}],attrs:{"element-loading-text":"加载中...",border:"",fit:"","highlight-current-row":"",data:t.list}},[n("el-table-column",{attrs:{align:"center",label:"数据库",prop:"title"}}),t._v(" "),n("el-table-column",{attrs:{align:"center",label:"数据库大小",prop:"size"}}),t._v(" "),n("el-table-column",{attrs:{align:"center",label:"创建时间",prop:"addtime"}}),t._v(" "),n("el-table-column",{attrs:{align:"center",label:"操作"},scopedSlots:t._u([{key:"default",fn:function(e){return[n("el-button",{attrs:{size:"mini",type:"primary"},on:{click:function(n){t.download(e.row)}}},[t._v("下载")]),t._v(" "),n("el-button",{attrs:{size:"mini",type:"warning"},on:{click:function(n){t.restore(e.row)}}},[t._v("还原")]),t._v(" "),n("el-button",{attrs:{size:"mini",type:"danger"},on:{click:function(n){t.deleteSql(e.$index,e.row)}}},[t._v("删除")])]}}])})],1)],1)},staticRenderFns:[]};var c=n("VU/8")(i,l,!1,function(t){n("62NT")},"data-v-6f4562ea",null);e.default=c.exports}}); -------------------------------------------------------------------------------- /root/static/js/13.e9989130f879df682133.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([13],{"3Lcq":function(e,n){},"T+/8":function(e,n,t){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var o=t("Dd8w"),s=t.n(o),a=t("NYxO"),r={name:"login",data:function(){return{loginForm:{user_name:"admin",password:""},loginRules:{user_name:[{required:!0,trigger:"blur",message:"请输入用户名"}],password:[{required:!0,trigger:"blur",min:5,message:"长度至少为5位"}]},loading:!1,pwdType:"password"}},methods:s()({showPwd:function(){"password"===this.pwdType?this.pwdType="":this.pwdType="password"},handleLogin:function(){var e=this;this.$refs.loginForm.validate(function(n){if(!n)return!1;e.loading=!0,e.Login(e.loginForm).then(function(){e.loading=!1,e.$router.push({path:"/"})}).catch(function(){e.loading=!1})})}},Object(a.b)(["Login"]))},i={render:function(){var e=this,n=e.$createElement,t=e._self._c||n;return t("div",{staticClass:"login-container"},[t("el-form",{ref:"loginForm",staticClass:"card-box login-form",attrs:{autoComplete:"on",model:e.loginForm,rules:e.loginRules,"label-position":"left","label-width":"0px"}},[t("h3",{staticClass:"title"},[e._v("MJ后台管理系统")]),e._v(" "),t("el-form-item",{attrs:{prop:"username"}},[t("span",{staticClass:"svg-container svg-container_login"},[t("svg-icon",{attrs:{"icon-class":"user"}})],1),e._v(" "),t("el-input",{attrs:{name:"username",type:"text",autoComplete:"on",placeholder:"user_name"},model:{value:e.loginForm.user_name,callback:function(n){e.$set(e.loginForm,"user_name",n)},expression:"loginForm.user_name"}})],1),e._v(" "),t("el-form-item",{attrs:{prop:"password"}},[t("span",{staticClass:"svg-container"},[t("svg-icon",{attrs:{"icon-class":"password"}})],1),e._v(" "),t("el-input",{attrs:{name:"password",type:e.pwdType,autoComplete:"on",placeholder:"*****"},nativeOn:{keyup:function(n){return"button"in n||!e._k(n.keyCode,"enter",13,n.key,"Enter")?e.handleLogin(n):null}},model:{value:e.loginForm.password,callback:function(n){e.$set(e.loginForm,"password",n)},expression:"loginForm.password"}}),e._v(" "),t("span",{staticClass:"show-pwd",on:{click:e.showPwd}},[t("svg-icon",{attrs:{"icon-class":"eye"}})],1)],1),e._v(" "),t("el-form-item",[t("el-button",{staticStyle:{width:"100%"},attrs:{type:"primary",loading:e.loading},nativeOn:{click:function(n){return n.preventDefault(),e.handleLogin(n)}}},[e._v("\n 登录\n ")])],1)],1)],1)},staticRenderFns:[]};var l=t("VU/8")(r,i,!1,function(e){t("3Lcq")},null,null);n.default=l.exports}}); -------------------------------------------------------------------------------- /root/static/js/14.4bcacc5a833eef8ffdc7.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([14],{"4F0n":function(t,e){},OuAp:function(t,e,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=a("vLgD");var l={name:"member",mixins:[a("vsZy").a],data:function(){return{params:{name:""}}},methods:{setStatus:function(t,e){var a,l=1==e.status?0:1;(a={id:e.id,status:e.status},Object(n.a)({url:"member/changeStatus",method:"post",data:a})).then(function(t){}).catch(function(t){e.status=l})},_getData:function(){var t,e=this;(t=this.params,Object(n.a)({url:"member/index",method:"get",params:t})).then(function(t){e.total=t.data.total,e.pageSize=t.data.per_page,e.page=t.data.current_page,e.list=t.data.data,e.table_loading=!1}).catch(function(t){e.table_loading=!0})}}},s={render:function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"app-container"},[a("p",{staticClass:"page-title"},[t._v("会员管理")]),t._v(" "),a("div",{staticClass:"filter-container"},[a("div",{staticStyle:{float:"right",display:"flex"}},[a("el-input",{staticStyle:{margin:"0 3px"},model:{value:t.params.tel,callback:function(e){t.$set(t.params,"tel",t._n(e))},expression:"params.tel"}}),t._v(" "),a("el-button",{staticClass:"filter-item",attrs:{type:"primary"},on:{click:function(e){t.search()}}},[t._v("搜索")])],1)]),t._v(" "),a("el-table",{directives:[{name:"loading",rawName:"v-loading",value:t.table_loading,expression:"table_loading"}],attrs:{"element-loading-text":"加载中...",border:"",fit:"","highlight-current-row":"",data:t.list}},[a("el-table-column",{attrs:{label:"ID",prop:"id",align:"center",width:"60px"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",prop:"tel",label:"电话号码"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",prop:"true_name",label:"真实姓名"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",prop:"status",label:"状态"},scopedSlots:t._u([{key:"default",fn:function(e){return[1==e.row.status?a("el-tag",{attrs:{type:"success"}},[t._v("正常")]):a("el-tag",{attrs:{type:"warning"}},[t._v("封停")])]}}])}),t._v(" "),a("el-table-column",{attrs:{align:"center",prop:"amoney",label:"内置积分"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",prop:"add_time",label:"注册时间"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",prop:"last_login_time",label:"最后登录时间"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"操作",width:"80px"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("el-tooltip",{attrs:{content:"设置会员是否封停",placement:"top"}},[a("el-switch",{attrs:{"active-value":1,"inactive-value":0,"active-color":"#13ce66","inactive-color":"#ff4949"},nativeOn:{click:function(a){t.setStatus(e.$index,e.row)}},model:{value:e.row.status,callback:function(a){t.$set(e.row,"status",a)},expression:"scope.row.status"}})],1)]}}])})],1),t._v(" "),a("div",{staticClass:"page-container"},[a("el-pagination",{attrs:{background:"","current-page":t.params.page,"page-sizes":t.page_sizes,"page-size":t.params.pageSize,layout:"total, sizes, prev, pager, next, jumper",total:t.total},on:{"size-change":t.handleSizeChange,"update:currentPage":function(e){t.$set(t.params,"page",e)},"current-change":t.handleCurrentChange}})],1)],1)},staticRenderFns:[]};var r=a("VU/8")(l,s,!1,function(t){a("4F0n")},"data-v-5129c764",null);e.default=r.exports}}); -------------------------------------------------------------------------------- /root/static/js/15.1165b50de0a89c3ba199.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([15],{FVP5:function(e,t){},fkUX:function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=i("vLgD");var o={name:"role",created:function(){this._getData()},data:function(){return{table_loading:!0,list:[],params:{pageSize:10,page:1},form:{role_name:"",id:""},formRole:{role_name:[{required:!0,message:"请填写角色名",trigger:"blur"}]},showDialog:!1,showDialogDistribution:!1,title:"",tree:[],choseKeys:[],temp_id:""}},methods:{addRole:function(){this.showDialog=!0,this.title="添加角色"},handleEdit:function(e,t){this.showDialog=!0,this.title="编辑角色",this.form.id=t.id,this.form.role_name=t.role_name},handleAuth:function(e,t){var i,o=this;this.showDialogDistribution=!0,(i=t,Object(a.a)({url:"role/giveAccess",method:"get",params:i})).then(function(e){o.temp_id=t.id,o.tree&&(o.tree=e.data.tree),o.choseKeys=e.data.choseKeys?e.data.choseKeys:[]})},giveAccess:function(){var e,t=this,i=this.$refs.tree.getCheckedKeys().join(","),o={id:this.temp_id,rule:i};(e=o,Object(a.a)({url:"role/giveAccess",method:"post",data:e})).then(function(e){t.$message({message:e.msg,type:"success"}),t.showDialogDistribution=!1})},handleDel:function(e,t){var i=this;this.$confirm("删除角色将不可恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){var o;(o={id:t.id},Object(a.a)({url:"role/roleDel",method:"post",data:o})).then(function(t){i.$message({message:t.msg,type:"success"}),i.list.splice(e,1)})})},onSubmit:function(){var e=this;this.$refs.roleForm.validate(function(t){if(!t)return!1;var i,o;(i=e.form,o=i.id?"role/roleEdit":"role/roleAdd",Object(a.a)({url:o,method:"post",data:i})).then(function(t){e.showDialog=!1,e.$message({message:t.msg,type:"success"}),e.form.id="",e._getData()})})},_getData:function(){var e,t=this;(e=this.params,Object(a.a)({url:"role/index",method:"get",params:e})).then(function(e){t.table_loading=!1,t.list=e.data.data})}}},n={render:function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"app-container"},[i("p",{staticClass:"page-title"},[e._v("角色管理")]),e._v(" "),i("div",{staticClass:"filter-container"},[i("el-button",{staticClass:"filter-item",attrs:{type:"primary",plain:""},on:{click:function(t){e.addRole()}}},[e._v("添加角色")])],1),e._v(" "),i("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.table_loading,expression:"table_loading"}],attrs:{"element-loading-text":"加载中...",border:"",fit:"","highlight-current-row":"",data:e.list}},[i("el-table-column",{attrs:{align:"center",width:"60px",label:"ID",prop:"id"}}),e._v(" "),i("el-table-column",{attrs:{align:"center",label:"角色",prop:"role_name"}}),e._v(" "),i("el-table-column",{attrs:{align:"center",label:"操作"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("el-button",{attrs:{size:"mini",type:"primary"},on:{click:function(i){e.handleEdit(t.$index,t.row)}}},[e._v("编辑\n ")]),e._v(" "),1!=t.row.id?i("el-button",{attrs:{size:"mini",type:"success"},on:{click:function(i){e.handleAuth(t.$index,t.row)}}},[e._v("分配权限\n ")]):e._e(),e._v(" "),1!=t.row.id?i("el-button",{attrs:{size:"mini",type:"danger"},on:{click:function(i){e.handleDel(t.$index,t.row)}}},[e._v("删除\n ")]):e._e()]}}])})],1),e._v(" "),i("el-dialog",{attrs:{visible:e.showDialog,title:e.title,width:"30%"},on:{"update:visible":function(t){e.showDialog=t}}},[i("el-form",{ref:"roleForm",attrs:{model:e.form,"status-icon":"","label-width":"80px",rules:e.formRole},nativeOn:{submit:function(e){e.preventDefault()}}},[i("el-form-item",{attrs:{label:"角色名",prop:"role_name"}},[i("el-input",{model:{value:e.form.role_name,callback:function(t){e.$set(e.form,"role_name",t)},expression:"form.role_name"}})],1),e._v(" "),i("el-form-item",[i("el-button",{staticStyle:{float:"right"},attrs:{type:"primary"},on:{click:function(t){e.onSubmit()}}},[e._v("确定")])],1)],1)],1),e._v(" "),i("el-dialog",{staticClass:"my-dialog",attrs:{visible:e.showDialogDistribution,title:"分配权限",width:"30%"},on:{"update:visible":function(t){e.showDialogDistribution=t}}},[i("el-tree",{ref:"tree",attrs:{data:e.tree,"show-checkbox":"","node-key":"id","default-expand-all":"","default-checked-keys":e.choseKeys}}),e._v(" "),i("el-button",{staticStyle:{float:"right"},attrs:{type:"primary"},on:{click:function(t){e.giveAccess()}}},[e._v("确定分配")])],1)],1)},staticRenderFns:[]};var l=i("VU/8")(o,n,!1,function(e){i("FVP5")},null,null);t.default=l.exports}}); -------------------------------------------------------------------------------- /root/static/js/16.8801754020229bc88e5d.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([16],{MuZL:function(t,e,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var l=a("Dd8w"),n=a.n(l),r=a("UgCr"),i=a("NYxO"),s={name:"goods",mixins:[a("vsZy").a],data:function(){return{cate:[],params:{title:"",cate_id:""}}},methods:n()({getRowClass:function(t){return 0==t.row.sku.length?"hide-expand":""},handleEdit:function(t){this.$router.push({path:"/product/editgoods",query:{id:t.id}})},handleDel:function(t,e){var a=this;this.$confirm("删除商品将不可恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){console.log(e),Object(r.b)({id:e.id,type:1}).then(function(e){a.list.splice(t,1)})})},addGoods:function(){this.$router.push("/product/addgoods")},_getData:function(){var t=this;Object(r.e)(this.params).then(function(e){t.list=e.data.pro.data,t.cate=e.data.cate,t.total=e.data.pro.total,t.pageSize=e.data.pro.per_page,t.page=e.data.pro.current_page,t.table_loading=!1}).catch(function(e){t.table_loading=!0})}},Object(i.d)({setPro:"SET_PRODUCT"}))},o={render:function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"app-container",attrs:{id:"product-index"}},[a("p",{staticClass:"page-title"},[t._v("商品列表")]),t._v(" "),a("div",{staticClass:"filter-container"},[a("el-button",{staticClass:"filter-item",attrs:{type:"primary",plain:""},on:{click:function(e){t.addGoods()}}},[t._v("添加商品")]),t._v(" "),a("div",{staticStyle:{float:"right",display:"flex"}},[a("el-select",{attrs:{placeholder:"分类"},model:{value:t.params.cate_id,callback:function(e){t.$set(t.params,"cate_id",e)},expression:"params.cate_id"}},t._l(t.cate,function(t,e){return a("el-option",{key:e,attrs:{label:t,value:e}})})),t._v(" "),a("el-input",{staticClass:"filter-item",staticStyle:{width:"200px",margin:"0 3px"},attrs:{placeholder:"商品名"},model:{value:t.params.title,callback:function(e){t.$set(t.params,"title",e)},expression:"params.title"}}),t._v(" "),a("el-button",{staticClass:"filter-item",attrs:{type:"primary"},on:{click:t.search}},[t._v("搜索")])],1)],1),t._v(" "),a("el-table",{directives:[{name:"loading",rawName:"v-loading",value:t.table_loading,expression:"table_loading"}],ref:"tableRef",attrs:{"element-loading-text":"加载中...",border:"","highlight-current-row":"","row-class-name":t.getRowClass,"row-key":"id",data:t.list}},[a("el-table-column",{attrs:{type:"expand"},scopedSlots:t._u([{key:"default",fn:function(e){return e.row.sku.length?[a("el-table",{staticClass:"sku-table",attrs:{data:e.row.sku,size:"mini","highlight-current-row":""}},[a("el-table-column",{attrs:{prop:"name",align:"center",label:"属性名"}}),t._v(" "),a("el-table-column",{attrs:{prop:"img",align:"center",label:"商品图片"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("div",{staticClass:"img-container"},[a("img",{staticClass:"img-container",attrs:{src:t.cdn+e.row.img}})])]}}])}),t._v(" "),a("el-table-column",{attrs:{prop:"market_price",align:"center",label:"市场价"}}),t._v(" "),a("el-table-column",{attrs:{prop:"price",align:"center",label:"售价"}}),t._v(" "),a("el-table-column",{attrs:{prop:"stock",align:"center",label:"库存"}}),t._v(" "),a("el-table-column",{attrs:{prop:"sales_volume",align:"center",label:"售出"}})],1)]:void 0}}])}),t._v(" "),a("el-table-column",{attrs:{label:"ID",prop:"id",align:"center",width:"60px"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"商品名",prop:"title"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"商品图片"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("img",{staticStyle:{width:"50px",height:"50px",dislay:"block"},attrs:{src:t.cdn+e.row.img}})]}}])}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"所属分类",prop:"cate_id"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("span",[t._v(t._s(t.cate[e.row.cate_id]))])]}}])}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"市场价",prop:"market_price"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"售价",prop:"price"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"库存",width:"80px",prop:"stock"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"销量",width:"80px",prop:"sales_volume"}}),t._v(" "),a("el-table-column",{attrs:{align:"center",label:"状态",width:"80px"},scopedSlots:t._u([{key:"default",fn:function(e){return[1==e.row.status?a("el-tag",{attrs:{type:"success"}},[t._v("上架")]):t._e(),t._v(" "),0==e.row.status?a("el-tag",{attrs:{type:"danger"}},[t._v("下架")]):t._e()]}}])}),t._v(" "),a("el-table-column",{attrs:{align:"center",width:"170px",label:"操作"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("el-button",{attrs:{size:"mini",type:"primary"},on:{click:function(a){t.handleEdit(e.row)}}},[t._v("编辑")]),t._v(" "),a("el-button",{attrs:{size:"mini",type:"danger"},on:{click:function(a){t.handleDel(e.$index,e.row)}}},[t._v("删除")])]}}])})],1),t._v(" "),a("div",{staticClass:"page-container"},[a("el-pagination",{attrs:{background:"","current-page":t.params.page,"page-sizes":t.page_sizes,"page-size":t.params.pageSize,layout:"total, sizes, prev, pager, next, jumper",total:t.total},on:{"size-change":t.handleSizeChange,"update:currentPage":function(e){t.$set(t.params,"page",e)},"current-change":t.handleCurrentChange}})],1)],1)},staticRenderFns:[]};var c=a("VU/8")(s,o,!1,function(t){a("ZK54")},null,null);e.default=c.exports},ZK54:function(t,e){}}); -------------------------------------------------------------------------------- /root/static/js/17.00679087301a7e44186e.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([17],{LVwl:function(t,e){},pG3U:function(t,e,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var a=s("fZjL"),i=s.n(a),n=s("vLgD");var o={name:"express-list",data:function(){return{list:[],showDialog:!1,form:{id:"",name:"",tel:"",address:"",contact:"",contact_tel:"",sort:""},formRule:{name:[{required:!0,message:"快递公司必填",trigger:"blur"}]}}},created:function(){this._getData()},methods:{addExpress:function(){var t=this;this.showDialog=!0,i()(this.form).map(function(e){t.form[e]=""})},onSubmit:function(){var t=this;this.$refs.cateForm.validate(function(e){if(!e)return!1;var s;t.form.id>0?(s=t.form,Object(n.a)({url:"express/editExpress",method:"post",data:s})).then(function(e){t.$message({message:e.msg,type:"success"}),t._getData(),t.showDialog=!1}):function(t){return Object(n.a)({url:"express/addExpress",method:"post",data:t})}(t.form).then(function(e){t.$message({message:e.msg,type:"success"}),t.list.unshift(t.form),t.showDialog=!1})})},handleEdit:function(t){var e=this;i()(this.form).map(function(s){e.form[s]=t[s]}),this.showDialog=!0},handleDel:function(t,e){var s=this;this.$confirm("是否确定删除快递公司","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){var a;(a={id:t},Object(n.a)({url:"express/delExpress",method:"post",data:a})).then(function(t){s.$message({message:"删除成功",type:"success"}),s.list.splice(e,1)})})},_getData:function(){var t,e=this;Object(n.a)({url:"express/index",method:"get",params:t}).then(function(t){e.list=t.data})}}},r={render:function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"app-container",attrs:{id:"express"}},[s("p",{staticClass:"page-title"},[t._v("快递公司列表")]),t._v(" "),s("div",{staticClass:"filter-container"},[s("el-button",{staticClass:"filter-item",attrs:{type:"primary",plain:""},on:{click:function(e){t.addExpress()}}},[t._v("添加快递公司")])],1),t._v(" "),s("div",{staticClass:"flex-box"},t._l(t.list,function(e,a){return s("div",{key:a,staticClass:"card-container"},[s("el-card",{staticClass:"box-card"},[s("div",{staticClass:"title-header",attrs:{slot:"header"},slot:"header"},[s("span",{staticClass:"title"},[t._v(t._s(e.name))]),t._v(" "),s("el-button",{attrs:{circle:"",size:"mini",type:"success",icon:"el-icon-edit"},on:{click:function(s){t.handleEdit(e)}}}),t._v(" "),s("el-button",{attrs:{circle:"",size:"mini",type:"danger",icon:"el-icon-delete"},on:{click:function(s){t.handleDel(e.id,a)}}})],1),t._v(" "),s("div",{staticClass:"text item card-content"},[s("div",{staticClass:"card-content-left"},[t._v("公司电话")]),t._v(" "),s("div",{staticClass:"card-content-rigth"},[t._v(t._s(e.tel))])]),t._v(" "),s("div",{staticClass:"text item card-content"},[s("div",{staticClass:"card-content-left"},[t._v("公司地址")]),t._v(" "),s("div",{staticClass:"card-content-rigth"},[t._v(t._s(e.address))])]),t._v(" "),s("div",{staticClass:"text item card-content"},[s("div",{staticClass:"card-content-left"},[t._v("联系人/收件人")]),t._v(" "),s("div",{staticClass:"card-content-rigth"},[t._v(t._s(e.contact))])]),t._v(" "),s("div",{staticClass:"text item card-content"},[s("div",{staticClass:"card-content-left"},[t._v("联系人电话")]),t._v(" "),s("div",{staticClass:"card-content-rigth"},[t._v(t._s(e.contact_tel))])])])],1)})),t._v(" "),s("el-dialog",{attrs:{visible:t.showDialog,title:"添加快递公司",width:"25%"},on:{"update:visible":function(e){t.showDialog=e}}},[s("el-form",{ref:"cateForm",attrs:{model:t.form,"status-icon":"","label-width":"120px",rules:t.formRule},nativeOn:{submit:function(t){t.preventDefault()}}},[s("el-form-item",{attrs:{label:"快递公司",prop:"name"}},[s("el-input",{model:{value:t.form.name,callback:function(e){t.$set(t.form,"name",e)},expression:"form.name"}})],1),t._v(" "),s("el-form-item",{attrs:{label:"快递公司电话",prop:"tel"}},[s("el-input",{model:{value:t.form.tel,callback:function(e){t.$set(t.form,"tel",e)},expression:"form.tel"}})],1),t._v(" "),s("el-form-item",{attrs:{label:"快递公司地址",prop:"address"}},[s("el-input",{model:{value:t.form.address,callback:function(e){t.$set(t.form,"address",e)},expression:"form.address"}})],1),t._v(" "),s("el-form-item",{attrs:{label:"联系人/收件员",prop:"contact"}},[s("el-input",{model:{value:t.form.contact,callback:function(e){t.$set(t.form,"contact",e)},expression:"form.contact"}})],1),t._v(" "),s("el-form-item",{attrs:{label:"联系人电话",prop:"contact_tel"}},[s("el-input",{model:{value:t.form.contact_tel,callback:function(e){t.$set(t.form,"contact_tel",e)},expression:"form.contact_tel"}})],1),t._v(" "),s("el-form-item",{attrs:{label:"排序",prop:"sort"}},[s("el-input",{attrs:{type:"number"},model:{value:t.form.sort,callback:function(e){t.$set(t.form,"sort",t._n(e))},expression:"form.sort"}})],1),t._v(" "),s("el-form-item",[s("div",{staticStyle:{float:"right"}},[s("el-button",{attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("提交")])],1)])],1)],1)],1)},staticRenderFns:[]};var c=s("VU/8")(o,r,!1,function(t){s("LVwl")},"data-v-113f0e6e",null);e.default=c.exports}}); -------------------------------------------------------------------------------- /root/static/js/5.6d6e2bf5d206b734e784.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([5],{O5oG:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=n("m40h"),i={name:"addRecommend-list",mixins:[n("vsZy").a],data:function(){return{showDialog:!1,form:{name:""},formRule:{name:[{required:!0,message:"请输入分类名",trigger:"blur"}]},inputValue:""}},methods:{handelAdd:function(){this.form.name="",this.showDialog=!0},onSubmit:function(){var e=this;this.$refs.cateForm.validate(function(t){if(!t)return!1;Object(a.b)(e.form).then(function(t){e.$message({message:t.msg,type:"success"}),e._getData(),e.showDialog=!1})})},handleEdit:function(e,t){var n=this;Object(a.f)(t).then(function(e){n.$message({message:e.msg,type:"success"}),t.old_name=t.name,t.edit=!1})},handleCancel:function(e){e.edit=!1,e.name=e.old_name},handleDel:function(e,t){var n=this;this.$confirm("是否确定删除该分类","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){Object(a.d)({id:t.id}).then(function(t){n.$message({message:"删除成功",type:"success"}),n.list.splice(e,1)})})},_getData:function(){var e=this;Object(a.g)().then(function(t){t.data.map(function(e){e.edit=!1,e.old_name=e.name}),e.list=t.data,e.table_loading=!1}).catch(function(t){e.table_loading=!0})}}},o={render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"app-container"},[n("p",{staticClass:"page-title"},[e._v("推荐位置管理(请勿随意添加)")]),e._v(" "),n("div",{staticClass:"filter-container"},[n("el-button",{staticClass:"filter-item",attrs:{type:"primary",plain:""},on:{click:function(t){e.handelAdd()}}},[e._v("添加推荐位置")])],1),e._v(" "),n("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.table_loading,expression:"table_loading"}],attrs:{"element-loading-text":"加载中...",border:"",fit:"","highlight-current-row":"",data:e.list}},[n("el-table-column",{attrs:{label:"ID",prop:"id",align:"center",width:"60px"}}),e._v(" "),n("el-table-column",{attrs:{align:"center",label:"分类名"},scopedSlots:e._u([{key:"default",fn:function(t){return[t.row.edit?n("el-input",{staticClass:"edit-input",attrs:{size:"small"},model:{value:t.row.name,callback:function(n){e.$set(t.row,"name",n)},expression:"scope.row.name"}}):n("span",[e._v(e._s(t.row.name))])]}}])}),e._v(" "),n("el-table-column",{attrs:{align:"center",label:"操作",width:"400px"},scopedSlots:e._u([{key:"default",fn:function(t){return[t.row.edit?n("el-button",{attrs:{icon:"el-icon-refresh",size:"mini",type:"warning"},on:{click:function(n){e.handleCancel(t.row)}}},[e._v("取消\n ")]):e._e(),e._v(" "),t.row.edit?n("el-button",{attrs:{icon:"el-icon-circle-check-outline",size:"mini",type:"success"},on:{click:function(n){e.handleEdit(t.$index,t.row)}}},[e._v("保存\n ")]):n("el-button",{attrs:{size:"mini",type:"primary",icon:"el-icon-edit"},on:{click:function(e){t.row.edit=!t.row.edit}}},[e._v("编辑\n ")]),e._v(" "),n("el-button",{attrs:{size:"mini",type:"danger",icon:"el-icon-close"},on:{click:function(n){e.handleDel(t.$index,t.row)}}},[e._v("删除\n ")])]}}])})],1),e._v(" "),n("el-dialog",{attrs:{visible:e.showDialog,title:"添加推荐位",width:"30%"},on:{"update:visible":function(t){e.showDialog=t}}},[n("el-form",{ref:"cateForm",attrs:{model:e.form,"status-icon":"","label-width":"100px",rules:e.formRule},nativeOn:{submit:function(e){e.preventDefault()}}},[n("el-form-item",{attrs:{label:"推荐位名",prop:"name"}},[n("el-input",{model:{value:e.form.name,callback:function(t){e.$set(e.form,"name",t)},expression:"form.name"}})],1),e._v(" "),n("el-form-item",[n("div",{staticStyle:{float:"right"}},[n("el-button",{attrs:{type:"primary"},on:{click:e.onSubmit}},[e._v("提交")])],1)])],1)],1)],1)},staticRenderFns:[]};var c=n("VU/8")(i,o,!1,function(e){n("uCTT")},"data-v-769ac09a",null);t.default=c.exports},m40h:function(e,t,n){"use strict";t.g=function(){return Object(a.a)({url:"Recommend/index"})},t.b=function(e){return Object(a.a)({url:"Recommend/addRecommendList",method:"post",data:e})},t.f=function(e){return Object(a.a)({url:"Recommend/editRecommendList",method:"post",data:e})},t.d=function(e){return Object(a.a)({url:"Recommend/delRecommendList",method:"post",data:e})},t.h=function(e){return Object(a.a)({url:"Recommend/content",method:"get",params:e})},t.a=function(e){return Object(a.a)({url:"Recommend/addRecommendContent",method:"post",data:e})},t.e=function(e){return Object(a.a)({url:"Recommend/editRecommendContent",method:"post",data:e})},t.c=function(e){return Object(a.a)({url:"Recommend/delRecommendContent",method:"post",data:e})};var a=n("vLgD")},uCTT:function(e,t){}}); -------------------------------------------------------------------------------- /root/static/js/7.b7b135bd11a4d214288a.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([7],{B35p:function(t,e,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var l=a("FWz8"),r={name:"order-list",mixins:[a("vsZy").a],data:function(){return{params:{status:""}}},methods:{handleGetDetail:function(t){this.$router.push({path:"/order/detail",query:{id:t.id}})},handleDel:function(t,e){},_getData:function(){var t=this;Object(l.b)(this.params).then(function(e){t.list=e.data.data,t.total=parseInt(e.data.total),t.params.pageSize=parseInt(e.data.per_page),t.params.page=parseInt(e.data.current_page),t.table_loading=!1}).catch(function(e){t.table_loading=!1})}}},n={render:function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"app-container",attrs:{id:"order"}},[a("p",{staticClass:"page-title"},[t._v("订单列表")]),t._v(" "),a("div",{staticClass:"filter-container"},[a("div",{staticStyle:{float:"right",display:"flex"}},[a("el-select",{staticStyle:{width:"200px",margin:"0 3px"},attrs:{placeholder:"选择订单状态"},model:{value:t.params.status,callback:function(e){t.$set(t.params,"status",e)},expression:"params.status"}},[a("el-option",{attrs:{label:"取消",value:"-1"}}),t._v(" "),a("el-option",{attrs:{label:"待支付",value:"0"}}),t._v(" "),a("el-option",{attrs:{label:"待发货",value:"1"}}),t._v(" "),a("el-option",{attrs:{label:"待收货",value:"2"}}),t._v(" "),a("el-option",{attrs:{label:"完成",value:"3"}})],1),t._v(" "),a("el-button",{staticClass:"filter-item",attrs:{type:"primary"},on:{click:function(e){t.search()}}},[t._v("搜索")])],1)]),t._v(" "),a("el-table",{directives:[{name:"loading",rawName:"v-loading",value:t.table_loading,expression:"table_loading"}],ref:"tableRef",attrs:{"element-loading-text":"加载中...",border:"","highlight-current-row":"","row-key":"id",data:t.list}},[a("el-table-column",{attrs:{label:"ID",prop:"id",align:"center"}}),t._v(" "),a("el-table-column",{attrs:{label:"订单编号",prop:"no",align:"center"}}),t._v(" "),a("el-table-column",{attrs:{label:"用户",prop:"uid",align:"center"}}),t._v(" "),a("el-table-column",{attrs:{label:"货物金额",prop:"money",align:"center"}}),t._v(" "),a("el-table-column",{attrs:{label:"邮费",prop:"postage",align:"center"}}),t._v(" "),a("el-table-column",{attrs:{label:"总金额",prop:"amount",align:"center"}}),t._v(" "),a("el-table-column",{attrs:{label:"优惠金额",prop:"reduce",align:"center"}}),t._v(" "),a("el-table-column",{attrs:{label:"支付金额",prop:"payment",align:"center"}}),t._v(" "),a("el-table-column",{attrs:{label:"添加订单时间",prop:"add_date",align:"center"}}),t._v(" "),a("el-table-column",{attrs:{label:"支付订单时间",prop:"pay_date",align:"center"}}),t._v(" "),a("el-table-column",{attrs:{label:"订单状态",prop:"status",align:"center"},scopedSlots:t._u([{key:"default",fn:function(e){return[-1==e.row.status?a("el-tag",{attrs:{type:"danger"}},[t._v("取消")]):t._e(),t._v(" "),0==e.row.status?a("el-tag",[t._v("待付款")]):t._e(),t._v(" "),1==e.row.status?a("el-tag",{attrs:{type:"success"}},[t._v("待发货")]):t._e(),t._v(" "),2==e.row.status?a("el-tag",{attrs:{type:"warning"}},[t._v("待签收")]):t._e(),t._v(" "),3==e.row.status?a("el-tag",[t._v("已完成")]):t._e()]}}])}),t._v(" "),a("el-table-column",{attrs:{label:"操作",width:"170px",align:"center"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("el-button",{attrs:{size:"mini",type:"primary"},on:{click:function(a){t.handleGetDetail(e.row)}}},[t._v("详情\n ")])]}}])})],1),t._v(" "),a("div",{staticClass:"page-container"},[a("el-pagination",{attrs:{background:"","current-page":t.params.page,"page-sizes":t.page_sizes,"page-size":t.params.pageSize,layout:"total, sizes, prev, pager, next, jumper",total:t.total},on:{"size-change":t.handleSizeChange,"update:currentPage":function(e){t.$set(t.params,"page",e)},"current-change":t.handleCurrentChange}})],1)],1)},staticRenderFns:[]};var s=a("VU/8")(r,n,!1,function(t){a("J8B7")},"data-v-6d3a5d10",null);e.default=s.exports},FWz8:function(t,e,a){"use strict";e.b=function(t){return Object(l.a)({url:"order/index",method:"get",params:t})},e.a=function(t){return Object(l.a)({url:"order/getOrderDetail",method:"get",params:t})},e.d=function(t){return Object(l.a)({url:"order/sendGoods",method:"post",data:t})},e.c=function(t){return Object(l.a)({url:"order/selfPickedUp",method:"post",data:t})};var l=a("vLgD")},J8B7:function(t,e){}}); -------------------------------------------------------------------------------- /root/static/js/8.417a6197e8e07422d7fd.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([8],{FWz8:function(e,s,t){"use strict";s.b=function(e){return Object(r.a)({url:"order/index",method:"get",params:e})},s.a=function(e){return Object(r.a)({url:"order/getOrderDetail",method:"get",params:e})},s.d=function(e){return Object(r.a)({url:"order/sendGoods",method:"post",data:e})},s.c=function(e){return Object(r.a)({url:"order/selfPickedUp",method:"post",data:e})};var r=t("vLgD")},"aZ+E":function(e,s,t){"use strict";Object.defineProperty(s,"__esModule",{value:!0});var r=t("FWz8"),a={name:"order-list",data:function(){return{cdn:"/uploads/",order:{},expressList:[],expressInfo:{id:"",express:"",express_no:""},formRule:{express:[{required:!0,message:"请填写快递公司",trigger:"blur"}],express_no:[{required:!0,min:5,message:"请填写正确快递单号",trigger:"blur"}]},showDialog:!1}},created:function(){this._getData()},methods:{sendGoods:function(){this.showDialog=!0,this.expressInfo.express="",this.expressInfo.express_no=""},pickedUp:function(){var e=this;this.$confirm("确认客户过来自提?","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){Object(r.c)({id:e.order.id}).then(function(s){e.$message({message:"删除成功",type:"success"}),e.order.status=3,e.order.express="自提",e.order.express_no="自提"})})},onSubmit:function(){var e=this;this.$refs.expressForm.validate(function(s){if(!s)return!1;e.expressInfo.id=e.$route.query.id,Object(r.d)(e.expressInfo).then(function(s){e.$message({message:s.msg,type:"success"}),e.showDialog=!1,e.order.status=2,e.order.express=e.expressInfo.express,e.order.express_no=e.expressInfo.express_no})})},_getData:function(){var e=this;Object(r.a)({id:this.$route.query.id}).then(function(s){e.order=s.data.order,e.expressList=s.data.express}).catch(function(s){e.$router.back()})},getImg:function(e){return(this.cdn+e.img).replace(/\\/g,"/")}}},n={render:function(){var e=this,s=e.$createElement,t=e._self._c||s;return t("div",{staticClass:"app-container",attrs:{id:"order-detail"}},[t("el-row",[t("el-col",{staticClass:"order-left",attrs:{span:18}},[t("div",{staticClass:"box-container"},[t("el-steps",{attrs:{active:e.order.status+2,"align-center":""}},[t("el-step",{attrs:{title:"取消订单"}}),e._v(" "),t("el-step",{attrs:{title:"等待支付"}}),e._v(" "),t("el-step",{attrs:{title:"等待发货"}}),e._v(" "),t("el-step",{attrs:{title:"等待收货"}}),e._v(" "),t("el-step",{attrs:{title:"完成订单"}})],1),e._v(" "),t("div",{staticClass:"product"},[t("p",{staticStyle:{"border-bottom":"1px dashed #ccc",padding:"10px",color:"#ccc"}},[e._v("商品列表")]),e._v(" "),t("div",{staticClass:"product-container"},e._l(e.order.info,function(s,r){return t("div",{key:r,staticClass:"product-item"},[t("div",{staticClass:"img",style:{backgroundImage:"url("+e.getImg(s)+")"}}),e._v(" "),t("div",{staticClass:"text-container text-title"},[t("div",{staticClass:"title"},[e._v(e._s(s.name))]),e._v(" "),s.name_ext?t("div",{staticClass:"sku"},[e._v("\n 商品属性 : "+e._s(s.name_ext))]):t("div",{staticClass:"sku"},[e._v(" ")])]),e._v(" "),t("div",{staticClass:"text-container text-price"},[t("div",{staticClass:"price"},[e._v("\n 价格 : ¥"+e._s(s.price))]),e._v(" "),t("div",{staticClass:"num"},[e._v("\n 购买数量 : "+e._s(s.num))])])])}))])],1)]),e._v(" "),t("el-col",{staticClass:"order-right",attrs:{span:6}},[t("ul",{staticClass:"price"},[t("li",[t("span",[e._v("商品总价")]),e._v(" "),t("span",[e._v("¥ "+e._s(e.order.money))])]),e._v(" "),t("li",[t("span",[e._v("邮费")]),e._v(" "),t("span",[e._v("¥ "+e._s(e.order.postage))])]),e._v(" "),t("li",[t("span",[e._v("优惠")]),e._v(" "),t("span",[e._v("¥ "+e._s(e.order.reduce))])]),e._v(" "),t("li",[t("span",[e._v("订单总价")]),e._v(" "),t("span",[e._v("¥ "+e._s(e.order.amount))])]),e._v(" "),t("li",{staticClass:"pay"},[t("span",[e._v("已支付")]),e._v(" "),t("span",[e._v("¥ "+e._s(e.order.payment))])])]),e._v(" "),t("span",{staticClass:"post"},[e._v("#收货信息")]),e._v(" "),t("ul",{staticClass:"address"},[t("li",[t("span",[e._v("收货人")]),e._v(" "),t("span",[e._v(e._s(e.order.post_name))])]),e._v(" "),t("li",[t("span",[e._v("收货电话")]),e._v(" "),t("span",[e._v(e._s(e.order.post_tel))])]),e._v(" "),t("li",[t("span",[e._v("收货地址")]),e._v(" "),t("span",[e._v(e._s(e.order.post_address))])])]),e._v(" "),t("span",{staticClass:"post"},[e._v("#快递信息")]),e._v(" "),e.order.status>1?t("ul",{staticClass:"address"},[t("li",[t("span",[e._v("快递公司")]),e._v(" "),t("span",[e._v(e._s(e.order.express))])]),e._v(" "),t("li",[t("span",[e._v("快递单号")]),e._v(" "),t("span",[e._v(e._s(e.order.express_no))])])]):1==e.order.status?t("div",{staticClass:"express"},[t("el-button",{attrs:{type:"success",plain:"",size:"mini"},on:{click:function(s){e.sendGoods()}}},[e._v("点击发货")]),e._v(" "),t("el-button",{attrs:{type:"primary",plain:"",size:"mini"},on:{click:function(s){e.pickedUp()}}},[e._v("自提")])],1):e._e()])],1),e._v(" "),t("el-dialog",{attrs:{visible:e.showDialog,title:"填写发货信息",width:"30%"},on:{"update:visible":function(s){e.showDialog=s}}},[t("el-form",{ref:"expressForm",attrs:{"status-icon":"","label-width":"120px",model:e.expressInfo,rules:e.formRule},nativeOn:{submit:function(e){e.preventDefault()}}},[t("el-form-item",{attrs:{label:"快递公司",prop:"express"}},[t("el-select",{staticStyle:{width:"100%"},model:{value:e.expressInfo.express,callback:function(s){e.$set(e.expressInfo,"express",s)},expression:"expressInfo.express"}},e._l(e.expressList,function(e,s){return t("el-option",{key:s,attrs:{value:e,label:e}})}))],1),e._v(" "),t("el-form-item",{attrs:{label:"快递单号",prop:"express_no"}},[t("el-input",{model:{value:e.expressInfo.express_no,callback:function(s){e.$set(e.expressInfo,"express_no",s)},expression:"expressInfo.express_no"}})],1),e._v(" "),t("el-form-item",[t("div",{staticStyle:{float:"right"}},[t("el-button",{attrs:{type:"primary"},on:{click:e.onSubmit}},[e._v("提交")])],1)])],1)],1)],1)},staticRenderFns:[]};var i=t("VU/8")(a,n,!1,function(e){t("q/jq")},"data-v-24d371d6",null);s.default=i.exports},"q/jq":function(e,s){}}); -------------------------------------------------------------------------------- /root/static/js/9.9c6db03361562d92bd0d.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([9],{DYq4:function(e,t){},K6tQ:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r("Dd8w"),s=r.n(a),l=r("fZjL"),o=r.n(l),n=r("NYxO"),i=r("lhz5"),u={name:"adduserd",created:function(){var e=this;this.$nextTick(function(){e._getRole()})},data:function(){return{formValue:{user_name:"",role_id:"",password:"",real_name:"",status:0,id:null},passwordPlaceholder:"",user_name_readonly:!1,roles:{},status:{},formRules:{user_name:[{required:!0,message:"必填项",trigger:"blur"},{min:5,message:"最少为输入5位数",trigger:"blur"}],password:[{min:6,message:"最少为输入6位数",trigger:"blur"}],role_id:[{required:!0,message:"必填项",trigger:"change"}],real_name:[{required:!0,message:"必填项",trigger:"blur"},{min:2,message:"最少为输入2位数",trigger:"blur"}]}}},methods:{onSubmit:function(){var e=this;this.$refs.loginForm.validate(function(t){if(!t)return!1;Object(i.d)(e.formValue).then(function(t){e.$message({message:t.msg,type:"success"}),e.$router.push("/admin/user")})})},resetForm:function(){this.$refs.loginForm.resetFields()},_getRole:function(){var e=this;o()(this.editAdmin).length>0&&(this.formValue.user_name=this.editAdmin.user_name,this.formValue.real_name=this.editAdmin.real_name,this.formValue.role_id=this.editAdmin.role_id,this.formValue.status=this.editAdmin.status,this.formValue.id=this.editAdmin.id,this.formValue.password="",this.passwordPlaceholder="不填不修改",this.user_name_readonly=!0),Object(i.c)().then(function(t){e.roles=t.data.role,e.status=t.data.status})}},computed:s()({},Object(n.c)(["editAdmin"]))},m={render:function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"app-container"},[r("el-form",{ref:"loginForm",attrs:{"label-width":"180px","status-icon":"",rules:e.formRules,model:e.formValue},nativeOn:{submit:function(e){e.preventDefault()}}},[r("el-form-item",{attrs:{label:"管理员账号",prop:"user_name"}},[r("el-input",{staticStyle:{width:"280px"},attrs:{name:"name",disabled:e.user_name_readonly},model:{value:e.formValue.user_name,callback:function(t){e.$set(e.formValue,"user_name",t)},expression:"formValue.user_name"}})],1),e._v(" "),r("el-form-item",{attrs:{label:"设置角色",prop:"role_id"}},[r("el-select",{staticStyle:{width:"280px"},attrs:{placeholder:"请选择"},model:{value:e.formValue.role_id,callback:function(t){e.$set(e.formValue,"role_id",t)},expression:"formValue.role_id"}},e._l(e.roles,function(e,t){return r("el-option",{key:t,attrs:{label:e.role_name,value:e.id}})}))],1),e._v(" "),r("el-form-item",{attrs:{label:"设置密码",prop:"password"}},[r("el-input",{staticStyle:{width:"280px"},attrs:{type:"password",placeholder:e.passwordPlaceholder},model:{value:e.formValue.password,callback:function(t){e.$set(e.formValue,"password",t)},expression:"formValue.password"}})],1),e._v(" "),r("el-form-item",{attrs:{label:"真实姓名",prop:"real_name"}},[r("el-input",{staticStyle:{width:"280px"},model:{value:e.formValue.real_name,callback:function(t){e.$set(e.formValue,"real_name",t)},expression:"formValue.real_name"}})],1),e._v(" "),r("el-form-item",{attrs:{label:"是否启用"}},[r("el-radio-group",{model:{value:e.formValue.status,callback:function(t){e.$set(e.formValue,"status",t)},expression:"formValue.status"}},e._l(e.status,function(t,a){return r("el-radio",{key:a,attrs:{border:"",label:a}},[e._v(e._s(t))])}))],1),e._v(" "),r("el-form-item",[r("el-button",{attrs:{type:"primary"},on:{click:function(t){e.onSubmit()}}},[e._v("立即创建")]),e._v(" "),e.user_name_readonly?e._e():r("el-button",{on:{click:e.resetForm}},[e._v("重置")])],1)],1)],1)},staticRenderFns:[]};var d=r("VU/8")(u,m,!1,function(e){r("DYq4")},"data-v-1c83bdec",null);t.default=d.exports},lhz5:function(e,t,r){"use strict";t.b=function(e){return Object(a.a)({url:"user/index",method:"get",params:e})},t.a=function(e){return Object(a.a)({url:"user/userDel",method:"post",data:e})},t.c=function(){return Object(a.a)({url:"user/userAdd",method:"get"})},t.d=function(e){var t=e.id?"user/userEdit":"user/userAdd";return Object(a.a)({url:t,method:"post",data:e})};var a=r("vLgD")}}); -------------------------------------------------------------------------------- /root/static/js/manifest.67611814c8e19f35f9f2.js: -------------------------------------------------------------------------------- 1 | !function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){for(var f,d,i,u=0,b=[];u删除订单 | 0=>待付款 | 1 => 待提货 | 2=>已完成', 34 | `add_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加订单时间', 35 | `pay_date` timestamp NULL DEFAULT NULL COMMENT '支付时间', 36 | `send_date` timestamp NULL DEFAULT NULL COMMENT '发货时间', 37 | `get_date` timestamp NULL DEFAULT NULL COMMENT '收货时间', 38 | `cancel_date` timestamp NULL DEFAULT NULL COMMENT '取消时间', 39 | `express` varchar(10) DEFAULT NULL COMMENT '快递', 40 | `express_no` varchar(50) DEFAULT NULL COMMENT '快递单号', 41 | `wx_no` varchar(50) DEFAULT NULL COMMENT '微信订单号', 42 | `pay_way` tinyint(3) DEFAULT NULL COMMENT '支付方式', 43 | `reduce` decimal(10,2) DEFAULT '0.00' COMMENT '优惠金额', 44 | PRIMARY KEY (`id`), 45 | KEY `uid` (`uid`) USING BTREE, 46 | KEY `no` (`no`) USING BTREE 47 | ) ENGINE=InnoDB AUTO_INCREMENT=213 DEFAULT CHARSET=utf8 COMMENT='订单表'; 48 | -------------------------------------------------------------------------------- /root/static/sk_order_info.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : outline_源购优品 5 | Source Server Version : 50719 6 | Source Host : 192.168.0.50:3306 7 | Source Database : twy1 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50719 11 | File Encoding : 65001 12 | 13 | Date: 2018-05-10 14:26:55 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for sk_order_info 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `sk_order_info`; 22 | CREATE TABLE `sk_order_info` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `pid` int(11) NOT NULL COMMENT '订单pid', 25 | `pro_id` int(11) NOT NULL COMMENT '商品id', 26 | `pro_ext_id` int(11) NOT NULL COMMENT '商品扩展id', 27 | `name` varchar(50) NOT NULL COMMENT '商品名', 28 | `name_ext` varchar(50) DEFAULT NULL COMMENT '商品属性名字', 29 | `price` decimal(10,2) NOT NULL COMMENT '商品价格', 30 | `num` tinyint(3) unsigned NOT NULL COMMENT '商品数量', 31 | `img` varchar(50) DEFAULT NULL COMMENT '商品图片', 32 | PRIMARY KEY (`id`), 33 | KEY `order_id` (`pid`) 34 | ) ENGINE=InnoDB AUTO_INCREMENT=246 DEFAULT CHARSET=utf8 COMMENT='订单商品表'; 35 | -------------------------------------------------------------------------------- /root/static/sk_user.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : outline_中网科技 5 | Source Server Version : 50719 6 | Source Host : 192.168.0.50:3306 7 | Source Database : zhonweb 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50719 11 | File Encoding : 65001 12 | 13 | Date: 2018-05-10 16:08:32 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for sk_user 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `sk_user`; 22 | CREATE TABLE `sk_user` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `tel` varchar(12) DEFAULT NULL COMMENT '电话号码', 25 | `password` varchar(32) DEFAULT NULL COMMENT '密码', 26 | `openid` varchar(50) DEFAULT NULL COMMENT '微信open_id', 27 | `wxname` binary(50) DEFAULT NULL COMMENT '微信名', 28 | `headimgurl` text, 29 | `province` varchar(20) DEFAULT NULL COMMENT '省', 30 | `city` varchar(20) DEFAULT NULL COMMENT '市', 31 | `area` varchar(20) DEFAULT NULL COMMENT '区', 32 | `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态', 33 | `add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', 34 | `last_login_time` timestamp NULL DEFAULT NULL COMMENT '最后登录时间', 35 | `true_name` varchar(50) DEFAULT NULL COMMENT '真实姓名', 36 | `idcard` varchar(18) DEFAULT NULL COMMENT '身份证', 37 | `amoney` decimal(10,2) DEFAULT '0.00' COMMENT 'A积分(每日转账使用)', 38 | `bmoney` decimal(10,2) DEFAULT '0.00' COMMENT 'B积分(提现使用)', 39 | `cmoney` decimal(10,2) DEFAULT '0.00' COMMENT 'C积分(购物券)', 40 | `app_token` varchar(50) DEFAULT NULL COMMENT 'APP软件token 推送使用', 41 | `pid` int(11) DEFAULT NULL COMMENT '推荐人ID', 42 | `rank` tinyint(1) DEFAULT '0' COMMENT '会员等级 0=>普通会员 ,1=>推广专员 ,2=>商务代表', 43 | `server_password` varchar(32) DEFAULT NULL COMMENT '服务密码', 44 | `ticket` varchar(50) DEFAULT NULL COMMENT '微信二维码生成', 45 | `lp_openid` varchar(50) DEFAULT NULL COMMENT '小程序openid', 46 | `union_id` varchar(50) DEFAULT NULL COMMENT '微信开放平台唯一ID', 47 | PRIMARY KEY (`id`), 48 | KEY `tel` (`tel`) USING BTREE 49 | ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='用户信息表'; 50 | -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/content.inline.min.css: -------------------------------------------------------------------------------- 1 | .mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}hr{cursor:default}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #F00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#3399ff !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7ACAFF}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1} -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/fonts/tinymce-small.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/tinymce/skins/lightgray/fonts/tinymce-small.eot -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/fonts/tinymce-small.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/tinymce/skins/lightgray/fonts/tinymce-small.ttf -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/fonts/tinymce-small.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/tinymce/skins/lightgray/fonts/tinymce-small.woff -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/fonts/tinymce.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/tinymce/skins/lightgray/fonts/tinymce.eot -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/fonts/tinymce.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/tinymce/skins/lightgray/fonts/tinymce.ttf -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/fonts/tinymce.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/tinymce/skins/lightgray/fonts/tinymce.woff -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/img/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/tinymce/skins/lightgray/img/anchor.gif -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/tinymce/skins/lightgray/img/loader.gif -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/img/object.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/tinymce/skins/lightgray/img/object.gif -------------------------------------------------------------------------------- /root/static/tinymce/skins/lightgray/img/trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/root/static/tinymce/skins/lightgray/img/trans.gif -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/api/adminUser.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | export function getAdminList(params) { 3 | return request({ 4 | url: 'user/index', 5 | method: 'get', 6 | params, 7 | }) 8 | } 9 | export function delAdmin(params) { 10 | return request({ 11 | url: 'user/userDel', 12 | method: 'post', 13 | data: params, 14 | }) 15 | } 16 | 17 | export function getRegAdminInfo() { 18 | return request({ 19 | url: 'user/userAdd', 20 | method: 'get', 21 | }) 22 | } 23 | 24 | export function regAdmin(params) { 25 | const url = params.id ? 'user/userEdit' : 'user/userAdd' 26 | return request({ 27 | url: url, 28 | method: 'post', 29 | data: params 30 | }) 31 | } -------------------------------------------------------------------------------- /src/api/cate.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | export function getCate(params) { 3 | return request({ 4 | url: 'cate/index', 5 | params: params 6 | }) 7 | } 8 | 9 | export function addCate(params) { 10 | return request({ 11 | url: 'cate/addCate', 12 | data: params, 13 | method: 'post' 14 | }) 15 | } 16 | 17 | export function editCate(params) { 18 | return request({ 19 | url: 'cate/editCate', 20 | data: params, 21 | method: 'post' 22 | }) 23 | } 24 | 25 | export function delCate(params) { 26 | return request({ 27 | url: 'cate/delCate', 28 | params: params 29 | }) 30 | } 31 | 32 | export function addCateAttr(params) { 33 | return request({ 34 | url: 'cate/addCateSku', 35 | params: params 36 | }) 37 | } 38 | 39 | export function delCateAttr(params) { 40 | return request({ 41 | url: 'cate/delCateSku', 42 | params: params 43 | }) 44 | } -------------------------------------------------------------------------------- /src/api/dashboard.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request" 2 | export function memberCharts() { 3 | return request({ 4 | url: "index/member" 5 | }) 6 | } 7 | 8 | export function salesCharts() { 9 | return request({ 10 | url: "index/sales" 11 | }) 12 | } 13 | 14 | export function sysInfo() { 15 | return request({ 16 | url: "index/systemCount" 17 | }) 18 | } 19 | 20 | export function orderInfo() { 21 | return request({ 22 | url: "index/orderInfo" 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /src/api/database.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | export function getList() { 3 | return request({ 4 | url: 'data/index', 5 | }) 6 | } 7 | 8 | export function back() { 9 | return request({ 10 | url: 'data/backup', 11 | }) 12 | } 13 | 14 | export function init() { 15 | return request({ 16 | url: 'data/initData', 17 | }) 18 | } 19 | 20 | export function restore(params) { 21 | return request({ 22 | url: 'data/restore', 23 | params: params 24 | }) 25 | } 26 | 27 | export function del(params) { 28 | return request({ 29 | url: 'data/del', 30 | params: params 31 | }) 32 | } -------------------------------------------------------------------------------- /src/api/express.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request" 2 | 3 | export function getTotal(params) { 4 | return request({ 5 | url: "express/index", 6 | method: "get", 7 | params 8 | }) 9 | } 10 | 11 | export function addExpress(data) { 12 | return request({ 13 | url: "express/addExpress", 14 | method: "post", 15 | data 16 | }) 17 | } 18 | 19 | export function editExpress(data) { 20 | return request({ 21 | url: "express/editExpress", 22 | method: "post", 23 | data 24 | }) 25 | } 26 | 27 | export function delExpress(data) { 28 | return request({ 29 | url: "express/delExpress", 30 | method: "post", 31 | data 32 | }) 33 | } -------------------------------------------------------------------------------- /src/api/login.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request" 2 | 3 | export function login(user_name, password) { 4 | return request({ 5 | url: "login/dologin", 6 | method: "post", 7 | data: { 8 | user_name, 9 | password 10 | } 11 | }) 12 | } 13 | 14 | export function getInfo() { 15 | return request({ 16 | url: "index/user", 17 | method: "get" 18 | }) 19 | } 20 | 21 | export function logout() { 22 | return request({ 23 | url: "login/logout", 24 | method: "post" 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /src/api/member.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request" 2 | export function getList(params) { 3 | return request({ 4 | url: "member/index", 5 | method: "get", 6 | params 7 | }) 8 | } 9 | 10 | export function changeStatus(data) { 11 | return request({ 12 | url: "member/changeStatus", 13 | method: "post", 14 | data 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /src/api/node.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | export function getNode() { 3 | return request({ 4 | url: 'node/index', 5 | }) 6 | } 7 | 8 | export function delNode(param) { 9 | return request({ 10 | url: 'node/nodeDel', 11 | method: 'post', 12 | data: param, 13 | }) 14 | } 15 | 16 | export function editNode(param) { 17 | return request({ 18 | url: 'node/nodeEdit', 19 | method: 'post', 20 | data: param, 21 | }) 22 | } 23 | 24 | export function addNode(param) { 25 | return request({ 26 | url: 'node/nodeAdd', 27 | method: 'post', 28 | data: param, 29 | }) 30 | } -------------------------------------------------------------------------------- /src/api/order.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request" 2 | 3 | export function getTotal(params) { 4 | return request({ 5 | url: "order/index", 6 | method: "get", 7 | params 8 | }) 9 | } 10 | 11 | export function getOrderDetail(params) { 12 | return request({ 13 | url: "order/getOrderDetail", 14 | method: "get", 15 | params 16 | }) 17 | } 18 | 19 | export function sendGoods(data) { 20 | return request({ 21 | url: "order/sendGoods", 22 | method: "post", 23 | data 24 | }) 25 | } 26 | 27 | export function selfPickedUp(data) { 28 | return request({ 29 | url: "order/selfPickedUp", 30 | method: "post", 31 | data 32 | }) 33 | } 34 | 35 | -------------------------------------------------------------------------------- /src/api/product.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getGoods(params) { 4 | return request({ 5 | url: 'product/index', 6 | params: params 7 | }) 8 | } 9 | 10 | export function getCate() { 11 | return request({ 12 | url: 'product/addPro', 13 | }) 14 | } 15 | 16 | export function addPro(params) { 17 | return request({ 18 | url: 'product/addPro', 19 | method: 'post', 20 | data: params 21 | }) 22 | } 23 | 24 | export function editPro(params) { 25 | return request({ 26 | url: 'product/editPro', 27 | method: 'post', 28 | data: params 29 | }) 30 | } 31 | 32 | export function delPro(params) { 33 | return request({ 34 | url: 'product/delPro', 35 | method: 'post', 36 | data: params 37 | }) 38 | } 39 | 40 | export function getPro(params) { 41 | return request({ 42 | url: 'product/getProdetail', 43 | method: 'get', 44 | params 45 | }) 46 | } -------------------------------------------------------------------------------- /src/api/recommend.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request" 2 | 3 | // 推荐位相关 4 | export function getRecommendList() { 5 | return request({ 6 | url: "Recommend/index" 7 | }) 8 | } 9 | 10 | export function addRecommendList(params) { 11 | return request({ 12 | url: "Recommend/addRecommendList", 13 | method: "post", 14 | data: params 15 | }) 16 | } 17 | 18 | export function editRecommendList(params) { 19 | return request({ 20 | url: "Recommend/editRecommendList", 21 | method: "post", 22 | data: params 23 | }) 24 | } 25 | 26 | export function delRecommendList(params) { 27 | return request({ 28 | url: "Recommend/delRecommendList", 29 | method: "post", 30 | data: params 31 | }) 32 | } 33 | 34 | // 推荐位内容相关 35 | export function recommendContent(params) { 36 | return request({ 37 | url: "Recommend/content", 38 | method: "get", 39 | params 40 | }) 41 | } 42 | 43 | export function addRecommendContent(params) { 44 | return request({ 45 | url: "Recommend/addRecommendContent", 46 | method: "post", 47 | data: params 48 | }) 49 | } 50 | 51 | export function editRecommendContent(params) { 52 | return request({ 53 | url: "Recommend/editRecommendContent", 54 | method: "post", 55 | data: params 56 | }) 57 | } 58 | 59 | export function delRecommendContent(params) { 60 | return request({ 61 | url: "Recommend/delRecommendContent", 62 | method: "post", 63 | data: params 64 | }) 65 | } 66 | -------------------------------------------------------------------------------- /src/api/role.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getRoleList(params) { 4 | return request({ 5 | url: 'role/index', 6 | method: 'get', 7 | params, 8 | }) 9 | } 10 | 11 | export function addRoles(params) { 12 | const url = params.id ? 'role/roleEdit' : 'role/roleAdd' 13 | return request({ 14 | url: url, 15 | method: 'post', 16 | data: params, 17 | }) 18 | } 19 | 20 | export function delRoles(params) { 21 | return request({ 22 | url: 'role/roleDel', 23 | method: 'post', 24 | data: params, 25 | }) 26 | } 27 | 28 | export function getAuth(params) { 29 | return request({ 30 | url: 'role/giveAccess', 31 | method: 'get', 32 | params, 33 | }) 34 | } 35 | 36 | export function setAuth(params) { 37 | return request({ 38 | url: 'role/giveAccess', 39 | method: 'post', 40 | data: params, 41 | }) 42 | } -------------------------------------------------------------------------------- /src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/src/assets/404_images/404.png -------------------------------------------------------------------------------- /src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /src/assets/img/avatar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/src/assets/img/avatar.gif -------------------------------------------------------------------------------- /src/components/Breadcrumb/index.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 44 | 45 | 57 | -------------------------------------------------------------------------------- /src/components/Hamburger/index.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 40 | 41 | 56 | -------------------------------------------------------------------------------- /src/components/ScrollBar/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 47 | 48 | 62 | -------------------------------------------------------------------------------- /src/components/SvgIcon/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 34 | 35 | 44 | -------------------------------------------------------------------------------- /src/components/Tinymce/components/editorImage.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 103 | 104 | 111 | -------------------------------------------------------------------------------- /src/icons/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import SvgIcon from '@/components/SvgIcon'// svg组件 3 | 4 | // register globally 5 | Vue.component('svg-icon', SvgIcon) 6 | 7 | const requireAll = requireContext => requireContext.keys().map(requireContext) 8 | const req = require.context('./svg', false, /\.svg$/) 9 | requireAll(req) 10 | -------------------------------------------------------------------------------- /src/icons/svg/admin-manage.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/database.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/eye.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/form.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/member.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/node.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/order.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/password.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/product.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/recommend.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/role.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/system.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | require('es6-promise').polyfill() 2 | import Vue from 'vue' 3 | import 'normalize.css/normalize.css' // A modern alternative to CSS resets 4 | 5 | import ElementUI from 'element-ui' 6 | import 'element-ui/lib/theme-chalk/index.css' 7 | import locale from 'element-ui/lib/locale/lang/zh-CN' 8 | 9 | import '@/styles/index.scss' // global css 10 | 11 | import App from './App' 12 | import router from './router' 13 | import store from './store' 14 | 15 | import '@/icons' // icon 16 | import '@/permission' // permission control 17 | Vue.use(ElementUI, { locale }) 18 | 19 | Vue.config.productionTip = false 20 | 21 | new Vue({ 22 | el: '#app', 23 | router, 24 | store, 25 | template: '', 26 | components: { App } 27 | }) -------------------------------------------------------------------------------- /src/permission.js: -------------------------------------------------------------------------------- 1 | import router from './router' 2 | import store from './store' 3 | import NProgress from 'nprogress' // Progress 进度条 4 | import 'nprogress/nprogress.css' // Progress 进度条样式 5 | import { Message } from 'element-ui' 6 | import { getToken } from '@/utils/auth' // 验权 7 | 8 | const whiteList = ['/login'] // 不重定向白名单 9 | router.beforeEach((to, from, next) => { 10 | NProgress.start() 11 | if (getToken()) { 12 | if (to.path === '/login') { 13 | next({ path: '/' }) 14 | } else { 15 | if (store.getters.roles.length === 0) { 16 | store.dispatch('GetInfo').then(res => { // 拉取用户信息 17 | next() 18 | }).catch(() => { 19 | store.dispatch('FedLogOut').then(() => { 20 | Message.error('验证失败,请重新登录') 21 | next({ path: '/login' }) 22 | }) 23 | }) 24 | } else { 25 | next() 26 | } 27 | } 28 | } else { 29 | if (whiteList.indexOf(to.path) !== -1) { 30 | next() 31 | } else { 32 | next('/login') 33 | NProgress.done() 34 | } 35 | } 36 | }) 37 | 38 | router.afterEach(() => { 39 | NProgress.done() // 结束Progress 40 | }) -------------------------------------------------------------------------------- /src/store/getters.js: -------------------------------------------------------------------------------- 1 | const getters = { 2 | sidebar: state => state.app.sidebar, 3 | token: state => state.user.token, 4 | avatar: state => state.user.avatar, 5 | name: state => state.user.name, 6 | roles: state => state.user.roles, 7 | editAdmin: state => state.user.editAdmin, 8 | adminNode: state => state.user.node, 9 | pro: state => state.product.pro 10 | } 11 | export default getters -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | require('es6-promise').polyfill() 2 | import Vue from 'vue' 3 | import Vuex from 'vuex' 4 | import app from './modules/app' 5 | import user from './modules/user' 6 | import product from './modules/product' 7 | import getters from './getters' 8 | 9 | import createLog from 'vuex/dist/logger' 10 | Vue.use(Vuex) 11 | const debug = process.env.NODE_ENV !== 'production' 12 | 13 | const store = new Vuex.Store({ 14 | modules: { 15 | app, 16 | user, 17 | product 18 | }, 19 | getters, 20 | strict: debug, 21 | plugins: debug ? [createLog()] : [] 22 | }) 23 | 24 | export default store -------------------------------------------------------------------------------- /src/store/modules/app.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | const app = { 4 | state: { 5 | sidebar: { 6 | opened: !+Cookies.get('sidebarStatus') 7 | } 8 | }, 9 | mutations: { 10 | TOGGLE_SIDEBAR: state => { 11 | if (state.sidebar.opened) { 12 | Cookies.set('sidebarStatus', 1) 13 | } else { 14 | Cookies.set('sidebarStatus', 0) 15 | } 16 | state.sidebar.opened = !state.sidebar.opened 17 | } 18 | }, 19 | actions: { 20 | ToggleSideBar: ({ commit }) => { 21 | commit('TOGGLE_SIDEBAR') 22 | } 23 | } 24 | } 25 | 26 | export default app -------------------------------------------------------------------------------- /src/store/modules/product.js: -------------------------------------------------------------------------------- 1 | 2 | const product = { 3 | state: { 4 | pro: {} 5 | }, 6 | 7 | mutations: { 8 | SET_PRODUCT: (state, pro) => { 9 | state.pro = pro 10 | }, 11 | }, 12 | 13 | actions: { 14 | } 15 | } 16 | 17 | export default product -------------------------------------------------------------------------------- /src/store/modules/user.js: -------------------------------------------------------------------------------- 1 | import { login, logout, getInfo } from '@/api/login' 2 | import { getToken, setToken, removeToken } from '@/utils/auth' 3 | 4 | const user = { 5 | state: { 6 | token: getToken(), 7 | name: '', 8 | roles: [], 9 | editAdmin: {}, 10 | node: [] 11 | }, 12 | 13 | mutations: { 14 | SET_TOKEN: (state, token) => { 15 | state.token = token 16 | }, 17 | SET_NAME: (state, name) => { 18 | state.name = name 19 | }, 20 | SET_ROLES: (state, roles) => { 21 | state.roles = roles 22 | }, 23 | SET_EDIT_ADMIN: (state, editAdmin) => { 24 | state.editAdmin = editAdmin 25 | }, 26 | SET_ADMIN_NODE: (state, node) => { 27 | state.node = node 28 | } 29 | }, 30 | 31 | actions: { 32 | // 登录 33 | Login({ commit }, userInfo) { 34 | return new Promise((resolve, reject) => { 35 | login(userInfo.user_name, userInfo.password).then(response => { 36 | setToken(true) 37 | commit('SET_TOKEN', true) 38 | resolve() 39 | }).catch(error => { 40 | reject(error) 41 | }) 42 | }) 43 | }, 44 | 45 | // 获取用户信息 46 | GetInfo({ commit, state }) { 47 | return new Promise((resolve, reject) => { 48 | getInfo(state.token).then(response => { 49 | const data = response.data 50 | commit('SET_ADMIN_NODE', data.node) 51 | commit('SET_ROLES', data.role.role_name) 52 | commit('SET_NAME', data.true_name) 53 | resolve(response) 54 | }).catch(error => { 55 | reject(error) 56 | }) 57 | }) 58 | }, 59 | 60 | // 登出 61 | LogOut({ commit, state }) { 62 | return new Promise((resolve, reject) => { 63 | logout(state.token).then(() => { 64 | commit('SET_TOKEN', false) 65 | commit('SET_ROLES', []) 66 | removeToken() 67 | resolve() 68 | }).catch(error => { 69 | reject(error) 70 | }) 71 | }) 72 | }, 73 | 74 | // 前端 登出 75 | FedLogOut({ commit }) { 76 | return new Promise(resolve => { 77 | commit('SET_TOKEN', false) 78 | removeToken() 79 | resolve() 80 | }) 81 | } 82 | } 83 | } 84 | 85 | export default user -------------------------------------------------------------------------------- /src/styles/element-ui.scss: -------------------------------------------------------------------------------- 1 | //to reset element-ui default css 2 | .el-upload { 3 | input[type="file"] { 4 | display: none !important; 5 | } 6 | } 7 | 8 | .el-upload__input { 9 | display: none; 10 | } 11 | 12 | //暂时性解决diolag 问题 https://github.com/ElemeFE/element/issues/2461 13 | .el-dialog { 14 | transform: none; 15 | left: 0; 16 | position: relative; 17 | margin: 0 auto; 18 | } 19 | 20 | //element ui upload 21 | /* .upload-container { 22 | .el-upload { 23 | width: 100%; 24 | .el-upload-dragger { 25 | width: 100%; 26 | height: 200px; 27 | } 28 | } 29 | } */ -------------------------------------------------------------------------------- /src/styles/index.scss: -------------------------------------------------------------------------------- 1 | @import "./variables.scss"; 2 | @import "./mixin.scss"; 3 | @import "./transition.scss"; 4 | @import "./element-ui.scss"; 5 | @import "./sidebar.scss"; 6 | body { 7 | -moz-osx-font-smoothing: grayscale; 8 | -webkit-font-smoothing: antialiased; 9 | text-rendering: optimizeLegibility; 10 | font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, 11 | Microsoft YaHei, Arial, sans-serif; 12 | } 13 | 14 | html { 15 | box-sizing: border-box; 16 | } 17 | 18 | *, 19 | *:before, 20 | *:after { 21 | box-sizing: inherit; 22 | } 23 | 24 | div:focus { 25 | outline: none; 26 | } 27 | 28 | a:focus, 29 | a:active { 30 | outline: none; 31 | } 32 | 33 | a, 34 | a:focus, 35 | a:hover { 36 | cursor: pointer; 37 | color: inherit; 38 | text-decoration: none; 39 | } 40 | 41 | .clearfix { 42 | &:after { 43 | visibility: hidden; 44 | display: block; 45 | font-size: 0; 46 | content: " "; 47 | clear: both; 48 | height: 0; 49 | } 50 | } 51 | 52 | //main-container全局样式 53 | .app-main { 54 | min-height: 100%; 55 | } 56 | 57 | .app-container { 58 | padding: 20px; 59 | } 60 | 61 | .filter-container { 62 | padding-bottom: 10px; 63 | .filter-item { 64 | display: inline-block; 65 | vertical-align: middle; 66 | margin-bottom: 10px; 67 | } 68 | } 69 | 70 | .page-container { 71 | float: right; 72 | margin: 20px; 73 | } 74 | 75 | .page-title { 76 | color: #ccc; 77 | border-bottom: 1px dashed #ccc; 78 | padding: 10px; 79 | } 80 | -------------------------------------------------------------------------------- /src/styles/mixin.scss: -------------------------------------------------------------------------------- 1 | @mixin clearfix { 2 | &:after { 3 | content: ""; 4 | display: table; 5 | clear: both; 6 | } 7 | } 8 | 9 | @mixin scrollBar { 10 | &::-webkit-scrollbar-track-piece { 11 | background: #d3dce6; 12 | } 13 | &::-webkit-scrollbar { 14 | width: 6px; 15 | } 16 | &::-webkit-scrollbar-thumb { 17 | background: #99a9bf; 18 | border-radius: 20px; 19 | } 20 | } 21 | 22 | @mixin relative { 23 | position: relative; 24 | width: 100%; 25 | height: 100%; 26 | } 27 | 28 | -------------------------------------------------------------------------------- /src/styles/sidebar.scss: -------------------------------------------------------------------------------- 1 | #app { 2 | // 主体区域 3 | .main-container { 4 | min-height: 100%; 5 | transition: margin-left 0.28s; 6 | margin-left: 180px; 7 | } // 侧边栏 8 | .sidebar-container { 9 | transition: width 0.28s; 10 | width: 180px!important; 11 | height: 100%; 12 | position: fixed; 13 | top: 0; 14 | bottom: 0; 15 | left: 0; 16 | z-index: 1001; 17 | a { 18 | display: inline-block; 19 | width: 100%; 20 | } 21 | .svg-icon { 22 | margin-right: 16px; 23 | } 24 | .el-menu { 25 | border: none; 26 | width: 100%; 27 | } 28 | } 29 | .hideSidebar { 30 | .sidebar-container,.sidebar-container .el-menu { 31 | width: 36px!important; 32 | // overflow: inherit; 33 | } 34 | .main-container { 35 | margin-left: 36px; 36 | } 37 | } 38 | .hideSidebar { 39 | .submenu-title-noDropdown { 40 | padding-left: 10px!important; 41 | position: relative; 42 | span { 43 | height: 0; 44 | width: 0; 45 | overflow: hidden; 46 | visibility: hidden; 47 | transition: opacity .3s cubic-bezier(.55, 0, .1, 1); 48 | opacity: 0; 49 | display: inline-block; 50 | } 51 | &:hover { 52 | span { 53 | display: block; 54 | border-radius: 3px; 55 | z-index: 1002; 56 | width: 140px; 57 | height: 56px; 58 | visibility: visible; 59 | position: absolute; 60 | right: -145px; 61 | text-align: left; 62 | text-indent: 20px; 63 | top: 0px; 64 | background-color: $subMenuBg!important; 65 | opacity: 1; 66 | } 67 | } 68 | } 69 | .el-submenu { 70 | &>.el-submenu__title { 71 | padding-left: 10px!important; 72 | &>span { 73 | display: none; 74 | } 75 | .el-submenu__icon-arrow { 76 | display: none; 77 | } 78 | } 79 | .nest-menu { 80 | .el-submenu__icon-arrow { 81 | display: block!important; 82 | } 83 | span { 84 | display: inline-block!important; 85 | } 86 | } 87 | } 88 | } 89 | .nest-menu .el-submenu>.el-submenu__title, 90 | .el-submenu .el-menu-item { 91 | min-width: 180px!important; 92 | background-color: $subMenuBg!important; 93 | &:hover { 94 | background-color: $menuHover!important; 95 | } 96 | } 97 | .el-menu--collapse .el-menu .el-submenu{ 98 | min-width: 180px!important; 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/styles/transition.scss: -------------------------------------------------------------------------------- 1 | //globl transition css 2 | 3 | /*fade*/ 4 | .fade-enter-active, 5 | .fade-leave-active { 6 | transition: opacity 0.28s; 7 | } 8 | 9 | .fade-enter, 10 | .fade-leave-active { 11 | opacity: 0; 12 | } 13 | 14 | /*fade*/ 15 | .breadcrumb-enter-active, 16 | .breadcrumb-leave-active { 17 | transition: all .5s; 18 | } 19 | 20 | .breadcrumb-enter, 21 | .breadcrumb-leave-active { 22 | opacity: 0; 23 | transform: translateX(20px); 24 | } 25 | 26 | .breadcrumb-move { 27 | transition: all .5s; 28 | } 29 | 30 | .breadcrumb-leave-active { 31 | position: absolute; 32 | } 33 | -------------------------------------------------------------------------------- /src/styles/variables.scss: -------------------------------------------------------------------------------- 1 | //sidebar 2 | $menuBg:#304156; 3 | $subMenuBg:#1f2d3d; 4 | $menuHover:#001528; 5 | -------------------------------------------------------------------------------- /src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | const TokenKey = 'Admin-Token' 4 | 5 | export function getToken() { 6 | return Cookies.get(TokenKey) 7 | } 8 | 9 | export function setToken(token) { 10 | return Cookies.set(TokenKey, token) 11 | } 12 | 13 | export function removeToken() { 14 | return Cookies.remove(TokenKey) 15 | } -------------------------------------------------------------------------------- /src/utils/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by jiachenpan on 16/11/18. 3 | */ 4 | 5 | export function parseTime(time, cFormat) { 6 | if (arguments.length === 0) { 7 | return null 8 | } 9 | const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' 10 | let date 11 | if (typeof time === 'object') { 12 | date = time 13 | } else { 14 | if (('' + time).length === 10) time = parseInt(time) * 1000 15 | date = new Date(time) 16 | } 17 | const formatObj = { 18 | y: date.getFullYear(), 19 | m: date.getMonth() + 1, 20 | d: date.getDate(), 21 | h: date.getHours(), 22 | i: date.getMinutes(), 23 | s: date.getSeconds(), 24 | a: date.getDay() 25 | } 26 | const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { 27 | let value = formatObj[key] 28 | if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1] 29 | if (result.length > 0 && value < 10) { 30 | value = '0' + value 31 | } 32 | return value || 0 33 | }) 34 | return time_str 35 | } 36 | 37 | export function formatTime(time, option) { 38 | time = +time * 1000 39 | const d = new Date(time) 40 | const now = Date.now() 41 | 42 | const diff = (now - d) / 1000 43 | 44 | if (diff < 30) { 45 | return '刚刚' 46 | } else if (diff < 3600) { // less 1 hour 47 | return Math.ceil(diff / 60) + '分钟前' 48 | } else if (diff < 3600 * 24) { 49 | return Math.ceil(diff / 3600) + '小时前' 50 | } else if (diff < 3600 * 24 * 2) { 51 | return '1天前' 52 | } 53 | if (option) { 54 | return parseTime(time, option) 55 | } else { 56 | return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分' 57 | } 58 | } 59 | 60 | export function inArray(arr, obj) { 61 | let i = arr.length 62 | while (i--) { 63 | if (arr[i] == obj) { 64 | return i 65 | } 66 | } 67 | return false 68 | } 69 | 70 | export function inArrayObject(arr, obj) { 71 | let i = arr.length 72 | while (i--) { 73 | const aProps = Object.keys(arr[i]) 74 | const bProps = Object.keys(obj) 75 | if (aProps.length != bProps.length) { 76 | continue 77 | } 78 | var flag = true 79 | for (var j = 0; j < aProps.length; j++) { 80 | const propName = aProps[j] 81 | // If values of same property are not equal, 82 | // objects are not equivalent 83 | if (arr[i][propName] != obj[propName]) { 84 | flag = false 85 | break 86 | } 87 | } 88 | if (flag) { 89 | return i 90 | } 91 | } 92 | return false 93 | } -------------------------------------------------------------------------------- /src/utils/mixin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 需要做表格 3 | */ 4 | const cdn = process.env.CDN 5 | export const pageMixin = { 6 | created() { 7 | this._getData() 8 | }, 9 | data() { 10 | return { 11 | cdn: cdn, // 图片CDN前缀 12 | table_loading: true, // 是否加载 13 | list: [], // 数据 14 | params: { 15 | pageSize: 10, // 每页显示条目个数 16 | page: 1 // 当前页数 17 | }, 18 | page_sizes: [10, 25, 50, 100], // 每页显示条目 19 | // page_sizes: [1, 2, 5, 10], // 每页显示条目 20 | total: 1 // 总共多少页 21 | } 22 | }, 23 | methods: { 24 | // 每页显示条目改变 25 | handleSizeChange(val) { 26 | this.params.pageSize = val 27 | this._getData() 28 | }, 29 | // 跳转页面 30 | handleCurrentChange(val) { 31 | this._getData() 32 | }, 33 | // 搜索 34 | search() { 35 | this._getData() 36 | }, 37 | // 获取数据 38 | _getData() { 39 | throw Error("请先获取数据") 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/utils/request.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import { Message, MessageBox } from 'element-ui' 3 | import store from '../store' 4 | import { getToken } from '@/utils/auth' 5 | 6 | // 创建axios实例 7 | const service = axios.create({ 8 | baseURL: process.env.BASE_API, // api的base_url 9 | timeout: 15000 // 请求超时时间 10 | }) 11 | 12 | // request拦截器 13 | service.interceptors.request.use(config => { 14 | if (store.getters.token) { 15 | config.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 16 | } 17 | return config 18 | }, error => { 19 | // Do something with request error 20 | console.log(error) // for debug 21 | Promise.reject(error) 22 | }) 23 | 24 | // respone拦截器 25 | service.interceptors.response.use( 26 | response => { 27 | const res = response.data 28 | if (res.status !== 1) { 29 | Message({ 30 | message: res.msg, 31 | type: 'error', 32 | duration: 5 * 1000 33 | }) 34 | if (location.href.indexOf('/login') === -1) { 35 | //不在登录界面就报错 36 | if (res.status == 404 || res.status == 304) { //被挤掉线 37 | MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { 38 | confirmButtonText: '重新登录', 39 | cancelButtonText: '取消', 40 | type: 'warning' 41 | }).then(() => { 42 | store.dispatch('FedLogOut').then(() => { 43 | location.reload() // 为了重新实例化vue-router对象 避免bug 44 | }) 45 | }) 46 | } 47 | } else { 48 | //如果在登录界面就不报错 49 | // return response.data 50 | } 51 | if (res.status == 500) { //被挤掉线 52 | MessageBox.confirm('服务器正在维护', '确定登出', { 53 | confirmButtonText: '重新登录', 54 | cancelButtonText: '取消', 55 | type: 'warning' 56 | }).then(() => { 57 | store.dispatch('FedLogOut').then(() => { 58 | location.reload() // 为了重新实例化vue-router对象 避免bug 59 | }) 60 | }) 61 | } 62 | return Promise.reject('error') 63 | } else { 64 | return response.data 65 | } 66 | }, 67 | error => { 68 | console.log('err' + error) // for debug 69 | Message({ 70 | message: error.message, 71 | type: 'error', 72 | duration: 5 * 1000 73 | }) 74 | return Promise.reject(error) 75 | } 76 | ) 77 | 78 | export default service -------------------------------------------------------------------------------- /src/utils/validate.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by jiachenpan on 16/11/18. 3 | */ 4 | 5 | export function isvalidUsername(str) { 6 | const valid_map = ['admin', 'editor'] 7 | return valid_map.indexOf(str.trim()) >= 0 8 | } 9 | 10 | /* 合法uri*/ 11 | export function validateURL(textval) { 12 | const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ 13 | return urlregex.test(textval) 14 | } 15 | 16 | /* 小写字母*/ 17 | export function validateLowerCase(str) { 18 | const reg = /^[a-z]+$/ 19 | return reg.test(str) 20 | } 21 | 22 | /* 大写字母*/ 23 | export function validateUpperCase(str) { 24 | const reg = /^[A-Z]+$/ 25 | return reg.test(str) 26 | } 27 | 28 | /* 大小写字母*/ 29 | export function validatAlphabets(str) { 30 | const reg = /^[A-Za-z]+$/ 31 | return reg.test(str) 32 | } -------------------------------------------------------------------------------- /src/views/admin/user/addUser.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | 148 | 149 | -------------------------------------------------------------------------------- /src/views/admin/user/index.vue: -------------------------------------------------------------------------------- 1 | 85 | 86 | 147 | 148 | -------------------------------------------------------------------------------- /src/views/layout/Layout.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 28 | 29 | 39 | -------------------------------------------------------------------------------- /src/views/layout/components/AppMain.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 21 | -------------------------------------------------------------------------------- /src/views/layout/components/Navbar.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 65 | 66 | 107 | 108 | -------------------------------------------------------------------------------- /src/views/layout/components/Sidebar/SidebarItem.vue: -------------------------------------------------------------------------------- 1 | 49 | 50 | 64 | -------------------------------------------------------------------------------- /src/views/layout/components/Sidebar/index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 53 | -------------------------------------------------------------------------------- /src/views/layout/components/avatar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/src/views/layout/components/avatar.gif -------------------------------------------------------------------------------- /src/views/layout/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as Navbar } from './Navbar' 2 | export { default as Sidebar } from './Sidebar' 3 | export { default as AppMain } from './AppMain' 4 | -------------------------------------------------------------------------------- /src/views/login/index.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 94 | 95 | 176 | -------------------------------------------------------------------------------- /src/views/member/index.vue: -------------------------------------------------------------------------------- 1 | 85 | 86 | 122 | 123 | -------------------------------------------------------------------------------- /src/views/order/order/index.vue: -------------------------------------------------------------------------------- 1 | 118 | 119 | 153 | 154 | -------------------------------------------------------------------------------- /src/views/system/database/index.vue: -------------------------------------------------------------------------------- 1 | 50 | 51 | 144 | 145 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/.gitkeep -------------------------------------------------------------------------------- /static/sk_cart.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : outline_中网科技 5 | Source Server Version : 50719 6 | Source Host : 192.168.0.50:3306 7 | Source Database : zhonweb 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50719 11 | File Encoding : 65001 12 | 13 | Date: 2018-05-10 16:09:01 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for sk_cart 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `sk_cart`; 22 | CREATE TABLE `sk_cart` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `uid` int(11) NOT NULL COMMENT '用户id', 25 | `pro_id` int(11) NOT NULL COMMENT '商品id', 26 | `pro_ext_id` int(11) unsigned NOT NULL COMMENT '商品扩展id', 27 | `name` varchar(50) NOT NULL COMMENT '商品名', 28 | `name_ext` varchar(50) DEFAULT NULL COMMENT '商品规格', 29 | `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品价格', 30 | `num` smallint(6) NOT NULL COMMENT '商品数量', 31 | `img` varchar(50) DEFAULT NULL COMMENT '商品图片', 32 | PRIMARY KEY (`id`), 33 | KEY `user_id` (`uid`) 34 | ) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8; 35 | -------------------------------------------------------------------------------- /static/sk_order.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : outline_源购优品 5 | Source Server Version : 50719 6 | Source Host : 192.168.0.50:3306 7 | Source Database : twy1 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50719 11 | File Encoding : 65001 12 | 13 | Date: 2018-05-10 14:26:38 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for sk_order 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `sk_order`; 22 | CREATE TABLE `sk_order` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `uid` int(11) NOT NULL COMMENT '用户ID', 25 | `post_name` varchar(50) NOT NULL COMMENT '收件人', 26 | `post_tel` varchar(50) NOT NULL COMMENT '收货电话', 27 | `post_address` text COMMENT '收货地址', 28 | `money` decimal(10,2) DEFAULT NULL COMMENT '货物金额', 29 | `postage` decimal(10,2) DEFAULT NULL COMMENT '邮费', 30 | `amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单总金额', 31 | `payment` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '已支付', 32 | `no` varchar(50) NOT NULL COMMENT '订单编号', 33 | `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '-1=>删除订单 | 0=>待付款 | 1 => 待提货 | 2=>已完成', 34 | `add_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加订单时间', 35 | `pay_date` timestamp NULL DEFAULT NULL COMMENT '支付时间', 36 | `send_date` timestamp NULL DEFAULT NULL COMMENT '发货时间', 37 | `get_date` timestamp NULL DEFAULT NULL COMMENT '收货时间', 38 | `cancel_date` timestamp NULL DEFAULT NULL COMMENT '取消时间', 39 | `express` varchar(10) DEFAULT NULL COMMENT '快递', 40 | `express_no` varchar(50) DEFAULT NULL COMMENT '快递单号', 41 | `wx_no` varchar(50) DEFAULT NULL COMMENT '微信订单号', 42 | `pay_way` tinyint(3) DEFAULT NULL COMMENT '支付方式', 43 | `reduce` decimal(10,2) DEFAULT '0.00' COMMENT '优惠金额', 44 | PRIMARY KEY (`id`), 45 | KEY `uid` (`uid`) USING BTREE, 46 | KEY `no` (`no`) USING BTREE 47 | ) ENGINE=InnoDB AUTO_INCREMENT=213 DEFAULT CHARSET=utf8 COMMENT='订单表'; 48 | -------------------------------------------------------------------------------- /static/sk_order_info.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : outline_源购优品 5 | Source Server Version : 50719 6 | Source Host : 192.168.0.50:3306 7 | Source Database : twy1 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50719 11 | File Encoding : 65001 12 | 13 | Date: 2018-05-10 14:26:55 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for sk_order_info 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `sk_order_info`; 22 | CREATE TABLE `sk_order_info` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `pid` int(11) NOT NULL COMMENT '订单pid', 25 | `pro_id` int(11) NOT NULL COMMENT '商品id', 26 | `pro_ext_id` int(11) NOT NULL COMMENT '商品扩展id', 27 | `name` varchar(50) NOT NULL COMMENT '商品名', 28 | `name_ext` varchar(50) DEFAULT NULL COMMENT '商品属性名字', 29 | `price` decimal(10,2) NOT NULL COMMENT '商品价格', 30 | `num` tinyint(3) unsigned NOT NULL COMMENT '商品数量', 31 | `img` varchar(50) DEFAULT NULL COMMENT '商品图片', 32 | PRIMARY KEY (`id`), 33 | KEY `order_id` (`pid`) 34 | ) ENGINE=InnoDB AUTO_INCREMENT=246 DEFAULT CHARSET=utf8 COMMENT='订单商品表'; 35 | -------------------------------------------------------------------------------- /static/sk_user.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : outline_中网科技 5 | Source Server Version : 50719 6 | Source Host : 192.168.0.50:3306 7 | Source Database : zhonweb 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50719 11 | File Encoding : 65001 12 | 13 | Date: 2018-05-10 16:08:32 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for sk_user 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `sk_user`; 22 | CREATE TABLE `sk_user` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `tel` varchar(12) DEFAULT NULL COMMENT '电话号码', 25 | `password` varchar(32) DEFAULT NULL COMMENT '密码', 26 | `openid` varchar(50) DEFAULT NULL COMMENT '微信open_id', 27 | `wxname` binary(50) DEFAULT NULL COMMENT '微信名', 28 | `headimgurl` text, 29 | `province` varchar(20) DEFAULT NULL COMMENT '省', 30 | `city` varchar(20) DEFAULT NULL COMMENT '市', 31 | `area` varchar(20) DEFAULT NULL COMMENT '区', 32 | `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态', 33 | `add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', 34 | `last_login_time` timestamp NULL DEFAULT NULL COMMENT '最后登录时间', 35 | `true_name` varchar(50) DEFAULT NULL COMMENT '真实姓名', 36 | `idcard` varchar(18) DEFAULT NULL COMMENT '身份证', 37 | `amoney` decimal(10,2) DEFAULT '0.00' COMMENT 'A积分(每日转账使用)', 38 | `bmoney` decimal(10,2) DEFAULT '0.00' COMMENT 'B积分(提现使用)', 39 | `cmoney` decimal(10,2) DEFAULT '0.00' COMMENT 'C积分(购物券)', 40 | `app_token` varchar(50) DEFAULT NULL COMMENT 'APP软件token 推送使用', 41 | `pid` int(11) DEFAULT NULL COMMENT '推荐人ID', 42 | `rank` tinyint(1) DEFAULT '0' COMMENT '会员等级 0=>普通会员 ,1=>推广专员 ,2=>商务代表', 43 | `server_password` varchar(32) DEFAULT NULL COMMENT '服务密码', 44 | `ticket` varchar(50) DEFAULT NULL COMMENT '微信二维码生成', 45 | `lp_openid` varchar(50) DEFAULT NULL COMMENT '小程序openid', 46 | `union_id` varchar(50) DEFAULT NULL COMMENT '微信开放平台唯一ID', 47 | PRIMARY KEY (`id`), 48 | KEY `tel` (`tel`) USING BTREE 49 | ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='用户信息表'; 50 | -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/content.inline.min.css: -------------------------------------------------------------------------------- 1 | .mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}hr{cursor:default}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #F00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#3399ff !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7ACAFF}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1} -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/fonts/tinymce-small.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/tinymce/skins/lightgray/fonts/tinymce-small.eot -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/fonts/tinymce-small.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/tinymce/skins/lightgray/fonts/tinymce-small.ttf -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/fonts/tinymce-small.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/tinymce/skins/lightgray/fonts/tinymce-small.woff -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/fonts/tinymce.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/tinymce/skins/lightgray/fonts/tinymce.eot -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/fonts/tinymce.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/tinymce/skins/lightgray/fonts/tinymce.ttf -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/fonts/tinymce.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/tinymce/skins/lightgray/fonts/tinymce.woff -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/img/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/tinymce/skins/lightgray/img/anchor.gif -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/tinymce/skins/lightgray/img/loader.gif -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/img/object.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/tinymce/skins/lightgray/img/object.gif -------------------------------------------------------------------------------- /static/tinymce/skins/lightgray/img/trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterJoyHunan/adminForVue/7e6003f2048cdfcf5f233be7820f3add98c0499d/static/tinymce/skins/lightgray/img/trans.gif --------------------------------------------------------------------------------