├── .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 | 
39 | 
40 | 
41 | 
42 | 
43 | 
44 | 
45 | #### 商城后台-PC版
46 | ___
47 | > 使用VUE作为主框架编写的一套简单的商城后台系统, 使用element-ui为css框架(作者css太弱了,其实里面的css有能力的完全可以自己重写).麻雀虽小,五脏俱全. 能实现完整的购物流程, 该项目没有使用各种复杂的代码
48 | > > 定位: 适合初学者想学习VUE,又没有几个合适的项目练手的朋友.学习和使用VUE的各种特性和语法.
49 | > 本项目没有文档和测试,不保证安全和性能,仅仅用来学习交流
50 |
51 | * 权限管理
52 | * 列表
53 | * 分页
54 | * 对应前台的功能
55 | * ....
56 |
57 | 有些功能由于能力,精力限制,暂时还不完善,请不要纠结
58 | 图片展示:
59 | 
60 | 
61 | 
62 | 
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 |
2 |
3 |
4 |
5 |
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 |
2 |
4 |
5 |
8 | {{item.meta.title}}
10 | {{item.meta.title}}
12 |
13 |
14 |
15 |
16 |
17 |
44 |
45 |
57 |
--------------------------------------------------------------------------------
/src/components/Hamburger/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
22 |
23 |
24 |
25 |
40 |
41 |
56 |
--------------------------------------------------------------------------------
/src/components/ScrollBar/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
47 |
48 |
62 |
--------------------------------------------------------------------------------
/src/components/SvgIcon/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
34 |
35 |
44 |
--------------------------------------------------------------------------------
/src/components/Tinymce/components/editorImage.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 上传图片
7 |
8 |
10 |
19 | 点击上传
21 |
22 | 取 消
23 | 确 定
25 |
26 |
27 |
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 |
2 |
3 |
9 |
11 |
15 |
16 |
18 |
21 |
25 |
26 |
27 |
29 |
33 |
34 |
36 |
38 |
39 |
40 |
41 | {{la}}
45 |
46 |
47 |
48 | 立即创建
50 | 重置
52 |
53 |
54 |
55 |
56 |
57 |
148 |
149 |
--------------------------------------------------------------------------------
/src/views/admin/user/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
管理员列表
4 |
5 |
添加管理员
9 |
10 |
14 | 搜索
17 |
18 |
19 |
25 |
29 |
30 |
33 |
34 |
37 |
38 |
41 |
42 |
45 |
46 |
49 |
50 |
53 |
54 | 正常
56 | 禁用
58 |
59 |
60 |
62 |
63 | 编辑
66 | 删除
69 |
70 |
71 |
72 |
73 |
81 |
82 |
83 |
84 |
85 |
86 |
147 |
148 |
--------------------------------------------------------------------------------
/src/views/layout/Layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
28 |
29 |
39 |
--------------------------------------------------------------------------------
/src/views/layout/components/AppMain.vue:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
21 |
--------------------------------------------------------------------------------
/src/views/layout/components/Navbar.vue:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
8 |
10 |
11 |
![]()
13 |
14 |
15 |
17 |
19 |
20 | 主页
21 |
22 |
23 |
24 | 退出
26 |
27 |
28 |
29 |
30 |
31 |
32 |
65 |
66 |
107 |
108 |
--------------------------------------------------------------------------------
/src/views/layout/components/Sidebar/SidebarItem.vue:
--------------------------------------------------------------------------------
1 |
2 |
48 |
49 |
50 |
64 |
--------------------------------------------------------------------------------
/src/views/layout/components/Sidebar/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
12 |
13 |
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 |
2 |
3 |
10 | MJ后台管理系统
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 |
23 |
24 |
25 |
31 |
33 |
34 |
35 |
36 |
37 |
41 | 登录
42 |
43 |
44 |
45 |
46 |
47 |
48 |
94 |
95 |
176 |
--------------------------------------------------------------------------------
/src/views/member/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
会员管理
4 |
13 |
19 |
23 |
24 |
27 |
28 |
31 |
32 |
35 |
36 | 正常
38 | 封停
40 |
41 |
42 |
45 |
46 |
49 |
50 |
53 |
54 |
57 |
58 |
60 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
122 |
123 |
--------------------------------------------------------------------------------
/src/views/order/order/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
4 |
订单列表
5 |
6 |
7 |
10 |
12 |
14 |
16 |
18 |
20 |
21 |
23 | 搜索
26 |
27 |
28 |
35 |
38 |
39 |
42 |
43 |
46 |
47 |
50 |
51 |
54 |
55 |
58 |
59 |
62 |
63 |
66 |
67 |
70 |
71 |
74 |
75 |
78 |
79 | 取消
81 | 待付款
82 | 待发货
84 | 待签收
86 | 已完成
87 |
88 |
89 |
92 |
93 | 详情
96 |
97 |
102 |
103 |
104 |
105 |
106 |
114 |
115 |
116 |
117 |
118 |
119 |
153 |
154 |
--------------------------------------------------------------------------------
/src/views/system/database/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
数据库列表
4 |
5 | 备份数据库
9 | 系统初始化
13 |
14 |
20 |
23 |
24 |
27 |
28 |
31 |
32 |
34 |
35 | 下载
38 | 还原
41 | 删除
44 |
45 |
46 |
47 |
48 |
49 |
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
--------------------------------------------------------------------------------