├── static ├── .gitkeep └── favicon.ico ├── .eslintignore ├── src ├── assets │ ├── er.png │ └── logo-1.png ├── common │ ├── css │ │ ├── icon.css │ │ └── init.css │ ├── js │ │ └── common.js │ └── less │ │ └── index.less ├── admin │ ├── views │ │ ├── mangerFAQ.vue │ │ ├── mangeLocal.vue │ │ ├── mangernews.vue │ │ ├── mangerprods.vue │ │ ├── siteoption.vue │ │ ├── mangeradmin.vue │ │ ├── mangersends.vue │ │ ├── FAQ │ │ │ ├── addFAQ.vue │ │ │ └── allFAQ.vue │ │ ├── mangeruser.vue │ │ ├── news │ │ │ ├── addnews.vue │ │ │ └── allnews.vue │ │ ├── siteoption │ │ │ ├── newsetoption.vue │ │ │ ├── setoption.vue │ │ │ └── setabout.vue │ │ ├── sends │ │ │ ├── hassends.vue │ │ │ └── submitsends.vue │ │ ├── adminlogin.vue │ │ ├── adminhome.vue │ │ ├── adminer │ │ │ ├── newadminer.vue │ │ │ └── alladminer.vue │ │ ├── prods │ │ │ ├── addtype.vue │ │ │ └── addprod.vue │ │ └── localProds │ │ │ ├── newLocal.vue │ │ │ └── allLocalProds.vue │ └── admin.vue ├── components │ ├── 404.vue │ ├── back.vue │ ├── home.vue │ ├── footer.vue │ ├── up.vue │ ├── page │ │ ├── newscontent.vue │ │ ├── news.vue │ │ ├── FAQ.vue │ │ ├── products.vue │ │ ├── manger │ │ │ ├── my.vue │ │ │ └── history.vue │ │ ├── manger.vue │ │ ├── localProduct.vue │ │ ├── localProd.vue │ │ └── product │ │ │ ├── productcontent.vue │ │ │ └── productlist.vue │ ├── login.vue │ ├── con-home.vue │ ├── regin.vue │ └── header.vue ├── vuex │ └── moudules │ │ ├── index.js │ │ └── cart.js ├── utils │ ├── getroutes.js │ ├── mdshow.vue │ ├── mangemenu.vue │ ├── mdupload.vue │ └── uploadUi.vue ├── App.vue ├── api │ ├── api.js │ └── adminApi.js ├── main.js ├── data │ ├── data.js │ └── mock.js └── router │ ├── index.js │ └── asyncRoutes.js ├── config ├── prod.env.js ├── dev.env.js └── index.js ├── .editorconfig ├── .postcssrc.js ├── .gitignore ├── .babelrc ├── index.html ├── .eslintrc.js ├── README.md └── package.json /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | config/*.js 3 | -------------------------------------------------------------------------------- /src/assets/er.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyttonlee/learn/HEAD/src/assets/er.png -------------------------------------------------------------------------------- /src/common/css/icon.css: -------------------------------------------------------------------------------- 1 | @import url('//at.alicdn.com/t/font_465635_ztmvllj24xcg14i.css'); -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyttonlee/learn/HEAD/static/favicon.ico -------------------------------------------------------------------------------- /src/assets/logo-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lyttonlee/learn/HEAD/src/assets/logo-1.png -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /src/admin/views/mangerFAQ.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/admin/views/mangeLocal.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/admin/views/mangernews.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/admin/views/mangerprods.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/admin/views/siteoption.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/admin/views/mangeradmin.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/admin/views/mangersends.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/components/404.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /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 | }) 8 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | data/ 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | 9 | # Editor directories and files 10 | .idea 11 | .vscode 12 | *.suo 13 | *.ntvs* 14 | *.njsproj 15 | *.sln 16 | -------------------------------------------------------------------------------- /src/vuex/moudules/index.js: -------------------------------------------------------------------------------- 1 | const files = require.context('.', false, /\.js$/) 2 | const modules = {} 3 | console.log(files) 4 | files.keys().forEach(key => { 5 | if (key === './index.js') return 6 | modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default 7 | }) 8 | 9 | export default modules 10 | -------------------------------------------------------------------------------- /src/common/css/init.css: -------------------------------------------------------------------------------- 1 | table { 2 | font-size: 14px; 3 | } 4 | form { 5 | font-size: 14px; 6 | } 7 | @media screen and (max-width: 768px) { 8 | table { 9 | font-size: 8px; 10 | } 11 | form { 12 | font-size: 8px; 13 | } 14 | } 15 | .el-menu { 16 | border-right: none; 17 | } -------------------------------------------------------------------------------- /src/utils/getroutes.js: -------------------------------------------------------------------------------- 1 | import store from '../vuex/store' 2 | const getPath = pathName => { 3 | return new Promise(resolve => { 4 | const route = store.state.addRoutes[0].children 5 | const culRoute = route.filter(r => { 6 | return r.name === pathName 7 | }) 8 | // console.log(culRoute) 9 | resolve(culRoute[0].children) 10 | }) 11 | } 12 | export default getPath 13 | -------------------------------------------------------------------------------- /.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-runtime"], 12 | "env": { 13 | "test": { 14 | "presets": ["env", "stage-2"], 15 | "plugins": ["istanbul"] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/vuex/moudules/cart.js: -------------------------------------------------------------------------------- 1 | const state = { 2 | stars: 0 3 | } 4 | const mutations = { 5 | add (state, data) { 6 | state.stars += data 7 | } 8 | } 9 | const actions = { 10 | asyncAdd ({commit}, data) { 11 | setTimeout(() => { 12 | commit('add', data.num) 13 | }, data.time) 14 | } 15 | } 16 | 17 | export default { 18 | state, 19 | mutations, 20 | actions 21 | } 22 | -------------------------------------------------------------------------------- /src/common/js/common.js: -------------------------------------------------------------------------------- 1 | // 获取最近7天日期 2 | let myDate = new Date() 3 | myDate.setDate(myDate.getDate() - 7) 4 | let dateArray = [] 5 | let dateTemp 6 | let flag = 1 7 | for (var i = 0; i < 7; i++) { 8 | dateTemp = myDate.getFullYear() + '-' + (myDate.getMonth() + 1) + '-' + myDate.getDate() 9 | dateArray.push(dateTemp) 10 | myDate.setDate(myDate.getDate() + flag) 11 | } 12 | export {dateArray} 13 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 辰农优品 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/components/back.vue: -------------------------------------------------------------------------------- 1 | 7 | 17 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/common/less/index.less: -------------------------------------------------------------------------------- 1 | @color: rgba(12, 65, 38, 0.6); 2 | .leftborder { 3 | height: 60px; 4 | border-left: 4px solid @color; 5 | margin: 0 15px; 6 | background-color: #f2f3f2; 7 | text-align: left; 8 | padding-left:20px; 9 | line-height: 60px; 10 | @media screen and (max-width: 768px) { 11 | margin: 0 1px; 12 | height: 45px; 13 | line-height: 45px; 14 | padding-left: 15px; 15 | } 16 | } 17 | .learncontent { 18 | margin: 20px 15px; 19 | box-shadow: 0 0 5px @color; 20 | border-radius: 10px; 21 | padding: 10px; 22 | @media screen and (max-width: 768px) { 23 | margin: 10px 1px; 24 | padding: 2px; 25 | } 26 | } 27 | @p-color: rgba(126, 113, 113, 0.8); 28 | 29 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parser: 'babel-eslint', 6 | parserOptions: { 7 | sourceType: 'module' 8 | }, 9 | env: { 10 | browser: true, 11 | }, 12 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md 13 | extends: 'standard', 14 | // required to lint *.vue files 15 | plugins: [ 16 | 'html' 17 | ], 18 | // add your custom rules here 19 | 'rules': { 20 | // allow paren-less arrow functions 21 | 'arrow-parens': 0, 22 | // allow async-await 23 | 'generator-star-spacing': 0, 24 | // allow debugger during development 25 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/components/home.vue: -------------------------------------------------------------------------------- 1 | 16 | 31 | -------------------------------------------------------------------------------- /src/utils/mdshow.vue: -------------------------------------------------------------------------------- 1 | 12 | 28 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | 18 | 38 | -------------------------------------------------------------------------------- /src/components/footer.vue: -------------------------------------------------------------------------------- 1 | 13 | 22 | 23 | 42 | 43 | -------------------------------------------------------------------------------- /src/components/up.vue: -------------------------------------------------------------------------------- 1 | 7 | 41 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /src/utils/mangemenu.vue: -------------------------------------------------------------------------------- 1 | 26 | 42 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /src/components/page/newscontent.vue: -------------------------------------------------------------------------------- 1 | 18 | 49 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/components/page/news.vue: -------------------------------------------------------------------------------- 1 | 19 | 43 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # learn 2 | 3 | ### 这是一个Vue,node,mongodb打造的代理商城项目 4 | 5 | >前端技术栈 vue vue-router vuex axios elmeent-ui echart mavon-editor 6 | 7 | >后端技术栈 express mongoose express-promise-router 8 | 9 | >功能:登录、注册、商品列表、商品详情、新闻列表、新闻详情、帮助文档、用户发货、数据统计,以及对商品、新闻、文档、整站设置的增删查改等操作 10 | 11 | > 2018-4-25 新增完成管理员权限的功能 12 | 13 | 14 | 15 | ### 部分页面阅览 16 | 17 | 首页 18 | 19 | ![image](https://github.com/lyttonlee/pic/blob/master/1.png?raw=true) 20 | 21 | ![index.gif](https://github.com/lyttonlee/pic/blob/master/index.gif?raw=true) 22 | 23 | ## 使用 24 | #### 本项目使用前后端分离 25 | 1、 在本地安装mongodb,并启动 26 | 27 | 2、 clone 服务端代码到本地 28 | 29 | [服务端server](https://github.com/lyttonlee/express-server-for-learn.git) 30 | 31 | ``` bash 32 | # clone server 33 | git clone https://github.com/lyttonlee/express-server-for-learn.git 34 | 35 | # install 36 | npm i 37 | 38 | # start 39 | npm start 40 | ``` 41 | 3、 clone 前端代码到本地 42 | 43 | ``` bash 44 | # clone clent 45 | git clone https://github.com/lyttonlee/learn.git 46 | 47 | # install 48 | npm i 49 | 50 | # start 51 | npm start 52 | # 或者 53 | npm run dev 54 | 55 | # build 56 | npm run build 57 | ``` 58 | 59 | 4、 注意 60 | 61 | > 如果要打包后测试,请将api中的 api.js 以及 adminapi.js 中的 62 | 63 | 64 | ``` 65 | let base = '/learn' 66 | 改为 67 | let base = '' 68 | ``` 69 | 5、 如何进入后台管理 70 | 71 | > 因为没有在页面上显示后台管理员登录的地址,所以需要你自己输入地址 72 | /adminlogin ------> 管理员登录地址 73 | /admin -----> 如果没有管理员登录会重定向到管理员登录页面 74 | /addadminer ------> 你可以自己创建一个管理员账号,然后登录 75 | 76 | 77 | 78 | 79 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 80 | -------------------------------------------------------------------------------- /src/utils/mdupload.vue: -------------------------------------------------------------------------------- 1 | 4 | 54 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 2 | 'use strict' 3 | // Template version: 1.1.3 4 | // see http://vuejs-templates.github.io/webpack for documentation. 5 | 6 | const path = require('path') 7 | 8 | module.exports = { 9 | build: { 10 | env: require('./prod.env'), 11 | index: path.resolve(__dirname, '../dist/index.html'), 12 | assetsRoot: path.resolve(__dirname, '../dist'), 13 | assetsSubDirectory: 'static', 14 | assetsPublicPath: '/', 15 | productionSourceMap: true, 16 | // Gzip off by default as many popular static hosts such as 17 | // Surge or Netlify already gzip all static assets for you. 18 | // Before setting to `true`, make sure to: 19 | // npm install --save-dev compression-webpack-plugin 20 | productionGzip: false, 21 | productionGzipExtensions: ['js', 'css'], 22 | // Run the build command with an extra argument to 23 | // View the bundle analyzer report after build finishes: 24 | // `npm run build --report` 25 | // Set to `true` or `false` to always turn it on or off 26 | bundleAnalyzerReport: process.env.npm_config_report 27 | }, 28 | dev: { 29 | env: require('./dev.env'), 30 | port: process.env.PORT || 8080, 31 | autoOpenBrowser: true, 32 | assetsSubDirectory: 'static', 33 | assetsPublicPath: '/', 34 | // 设置代理,访问/learn的都将访问localhost:8088 35 | proxyTable: { 36 | '/api': { 37 | target: 'http://localhost:8088', 38 | changeOrigin: true, 39 | // pathRewrite: { 40 | // '^/learn': '/' 41 | // } 42 | } 43 | }, 44 | // CSS Sourcemaps off by default because relative paths are "buggy" 45 | // with this option, according to the CSS-Loader README 46 | // (https://github.com/webpack/css-loader#sourcemaps) 47 | // In our experience, they generally work as expected, 48 | // just be aware of this issue when enabling this option. 49 | cssSourceMap: false 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/components/page/FAQ.vue: -------------------------------------------------------------------------------- 1 | 23 | 58 | 59 | 87 | -------------------------------------------------------------------------------- /src/api/api.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | // dev 4 | // let base = '/learn/api' 5 | // // build 6 | let base = '/api' 7 | // 注册接口 8 | export const ReginUser = params => { 9 | return axios.post(`${base}/regin`, params) 10 | } 11 | // 登录接口 12 | export const LoginUser = params => { 13 | return axios.get(`${base}/login`, {params: params}) 14 | } 15 | // 判断用户是否被注册 16 | export const hasReginedUser = params => { 17 | return axios.get(`${base}/hasregined`, {params: params}) 18 | } 19 | // 获取七牛云上传token 20 | export const GetQiniuUpToken = params => { 21 | return axios.get(`${base}/gettoken`, {params: params}) 22 | } 23 | // 上传图片接口 24 | export const UploadFile = params => { 25 | return axios({ 26 | url: base + '/upload', 27 | method: 'post', 28 | headers: { 'Content-Type': 'multipart/form-data' }, 29 | data: params 30 | }) 31 | } 32 | // 获取商品列表接口 33 | export const GetProductList = params => { 34 | return axios.get(`${base}/productlist`, {params: params}) 35 | } 36 | // 获取批发商品列表 37 | export const getLocalProds = params => { 38 | return axios.get(`${base}/querylocalprods`, {params: params}) 39 | } 40 | // 获取批发商品 41 | export const getCulLocalprod = params => { 42 | return axios.get(`${base}/cullocalprod`, {params: params}) 43 | } 44 | // 添加待发货 45 | export const newPreSend = params => { 46 | return axios.post(`${base}/newpresend`, params) 47 | } 48 | // 删除一条待发货记录 49 | export const DeleteSend = params => { 50 | return axios.delete(`${base}/deletesend`, {params: params}) 51 | } 52 | // 修改一条待发货记录 53 | export const EditSend = params => { 54 | return axios.post(`${base}/editsend`, params) 55 | } 56 | // 获取查询商品接口 57 | export const SearchProductList = params => { 58 | return axios.get(`${base}/search`, {params: params}) 59 | } 60 | 61 | // 商品详情接口 62 | export const GetProduct = params => { 63 | return axios.get(`${base}/product`, {params: params}) 64 | } 65 | // 个人待发货接口 66 | export const GetPresends = params => { 67 | return axios.get(`${base}/presends`, {params: params}) 68 | } 69 | // 个人已发货接口 70 | export const GetSended = params => { 71 | return axios.get(`${base}/sended`, {params: params}) 72 | } 73 | // 修改付款后发货单状态为正在发货 74 | export const UpdateSends = params => { 75 | return axios.post(`${base}/updatesends`, params) 76 | } 77 | // 获取商品 78 | export const GetProd = params => { 79 | return axios.get(`${base}/getprod`, {params: params}) 80 | } 81 | -------------------------------------------------------------------------------- /src/admin/views/FAQ/addFAQ.vue: -------------------------------------------------------------------------------- 1 | 23 | 77 | 78 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "learn", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "lytton", 6 | "private": true, 7 | "scripts": { 8 | "dev": "node build/dev-server.js", 9 | "start": "npm run dev", 10 | "build": "node build/build.js", 11 | "lint": "eslint --ext .js,.vue src" 12 | }, 13 | "dependencies": { 14 | "axios": "^0.17.0", 15 | "echarts": "^3.8.5", 16 | "element-ui": "^2.0.3", 17 | "mavon-editor": "^2.4.16", 18 | "moment": "^2.22.1", 19 | "vue": "^2.5.2", 20 | "vue-router": "^3.0.1", 21 | "vuex": "^3.0.1" 22 | }, 23 | "devDependencies": { 24 | "autoprefixer": "^7.1.2", 25 | "axios-mock-adapter": "^1.9.0", 26 | "babel-core": "^6.22.1", 27 | "babel-eslint": "^7.1.1", 28 | "babel-loader": "^7.1.1", 29 | "babel-plugin-transform-runtime": "^6.22.0", 30 | "babel-preset-env": "^1.3.2", 31 | "babel-preset-stage-2": "^6.22.0", 32 | "babel-register": "^6.22.0", 33 | "chalk": "^2.0.1", 34 | "connect-history-api-fallback": "^1.3.0", 35 | "copy-webpack-plugin": "^4.0.1", 36 | "css-loader": "^0.28.0", 37 | "eslint": "^3.19.0", 38 | "eslint-config-standard": "^10.2.1", 39 | "eslint-friendly-formatter": "^3.0.0", 40 | "eslint-loader": "^1.7.1", 41 | "eslint-plugin-html": "^3.0.0", 42 | "eslint-plugin-import": "^2.7.0", 43 | "eslint-plugin-node": "^5.2.0", 44 | "eslint-plugin-promise": "^3.4.0", 45 | "eslint-plugin-standard": "^3.0.1", 46 | "eventsource-polyfill": "^0.9.6", 47 | "express": "^4.14.1", 48 | "extract-text-webpack-plugin": "^3.0.0", 49 | "fastclick": "^1.0.6", 50 | "file-loader": "^1.1.4", 51 | "friendly-errors-webpack-plugin": "^1.6.1", 52 | "hover.css": "^2.2.1", 53 | "html-webpack-plugin": "^2.30.1", 54 | "http-proxy-middleware": "^0.17.3", 55 | "less": "^2.7.3", 56 | "less-loader": "^4.0.5", 57 | "mockjs": "^1.0.1-beta3", 58 | "opn": "^5.1.0", 59 | "optimize-css-assets-webpack-plugin": "^3.2.0", 60 | "ora": "^1.2.0", 61 | "portfinder": "^1.0.13", 62 | "rimraf": "^2.6.0", 63 | "semver": "^5.3.0", 64 | "shelljs": "^0.7.6", 65 | "url-loader": "^0.5.8", 66 | "vue-loader": "^13.3.0", 67 | "vue-style-loader": "^3.0.1", 68 | "vue-template-compiler": "^2.5.2", 69 | "webpack": "^3.6.0", 70 | "webpack-bundle-analyzer": "^2.9.0", 71 | "webpack-dev-middleware": "^1.12.0", 72 | "webpack-hot-middleware": "^2.18.2", 73 | "webpack-merge": "^4.1.0" 74 | }, 75 | "engines": { 76 | "node": ">= 7.6.0", 77 | "npm": ">= 5.0.0" 78 | }, 79 | "browserslist": [ 80 | "> 1%", 81 | "last 2 versions", 82 | "not ie <= 8" 83 | ] 84 | } 85 | -------------------------------------------------------------------------------- /src/components/page/products.vue: -------------------------------------------------------------------------------- 1 | 31 | 65 | 103 | -------------------------------------------------------------------------------- /src/admin/views/mangeruser.vue: -------------------------------------------------------------------------------- 1 | 48 | 89 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | // 引入element-ui组件和css 7 | import ElementUi from 'element-ui' 8 | import 'element-ui/lib/theme-chalk/index.css' 9 | // 引入vuex 10 | // import Vuex from 'vuex' 11 | import store from './vuex/store' 12 | // 引入mavon-editor 13 | import mavonEditor from 'mavon-editor' 14 | import 'mavon-editor/dist/css/index.css' 15 | // 引入axios 16 | import axios from 'axios' 17 | // 引入moment 18 | import moment from 'moment' 19 | // 引入七牛云上传组件 20 | import qiniuUpload from './utils/uploadUi' 21 | import mdUpload from './utils/mdupload' 22 | import mdShow from './utils/mdshow' 23 | import mangeMenu from './utils/mangemenu' 24 | // 引入fastclick 25 | // import FastClick from 'fastclick' 26 | // 引入echarts,最好是按需引入 27 | // import ECharts from 'echarts' 28 | // 引入mock并初始化 29 | // import Mock from './data/mock' 30 | // Mock.init() 31 | Vue.component('qiniu-upload', qiniuUpload) 32 | Vue.component('md-upload', mdUpload) 33 | Vue.component('md-show', mdShow) 34 | Vue.component('mange-menu', mangeMenu) 35 | Vue.use(ElementUi) 36 | // Vue.use(Vuex) 37 | Vue.use(mavonEditor) 38 | Vue.prototype.$axios = axios 39 | Vue.prototype.$moment = moment 40 | // FastClick.attach(document.body) 41 | 42 | Vue.config.productionTip = false 43 | // 这个官方名字叫导航守卫,挺形象的 44 | router.beforeEach((to, from, next) => { 45 | // 如果是去登录或注册,那就先把user移除 46 | if (to.path === '/login' || to.path === '/regin') { 47 | sessionStorage.removeItem('user') 48 | store.dispatch('logout') 49 | } 50 | // 如果去管理员登录,那就先移除管理员adminer 51 | if (to.path === '/adminlogin') { 52 | sessionStorage.removeItem('adminer') 53 | store.dispatch('logout') 54 | } 55 | let user = store.state.user 56 | let adminer = store.state.adminer 57 | // if (!user && (to.path === '/manger/my' || to.path === '/manger/send' || to.path === '/manger/history')) { 58 | // next({ path: '/login' }) 59 | // } else { 60 | // next() 61 | // } 62 | // 如果用户没有登录且前往需要用户登录才能访问的页面,那就让他先登录 63 | if (!user && to.meta.requireUser) { 64 | next({ path: '/login' }) 65 | } else { 66 | next() 67 | } 68 | if (to.path === '/admin' && !adminer) { 69 | next({ 70 | path: '/adminlogin' 71 | // query: {redirect: to.fullPath} 72 | }) 73 | } 74 | // 如果管理员已经登录 75 | if (adminer) { 76 | // 判断路由是否生成 77 | if (store.state.addRoutes.length === 0) { 78 | // 判断已登录的管理员权限 79 | const role = adminer.role 80 | console.log(role) 81 | // 根据权限生成可访问的路由 82 | store.dispatch('adminRoutes', {role}).then(() => { 83 | // console.log(store.state.addRoutes) 84 | router.addRoutes(store.state.addRoutes) 85 | next({...to, replace: true}) 86 | }) 87 | next() 88 | } 89 | } 90 | }) 91 | 92 | /* eslint-disable no-new */ 93 | new Vue({ 94 | el: '#app', 95 | router, 96 | store, 97 | template: '', 98 | components: { App } 99 | }) 100 | -------------------------------------------------------------------------------- /src/data/data.js: -------------------------------------------------------------------------------- 1 | import avatarLee from '../assets/avatar.jpg' 2 | import avatarZhang from '../assets/avatar2.jpg' 3 | import {dateArray} from '../common/js/common' 4 | import Mock from 'mockjs' 5 | const users = [ 6 | { 7 | username: 'lytton', 8 | password: '123456', 9 | email: '123@163.com', 10 | tel: '15181589155', 11 | name: '李小白', 12 | time: '2017-11-11', 13 | avatar: avatarLee 14 | }, 15 | { 16 | username: 'zhangsan', 17 | password: '123456', 18 | email: '321@163.com', 19 | tel: '13789546327', 20 | name: '张三', 21 | time: '2017-08-17', 22 | avatar: avatarZhang 23 | } 24 | ] 25 | // 。。。。。。。。。。。。 26 | const prodnames = [] 27 | for (let index = 0; index < 25; index++) { 28 | prodnames.push(Mock.mock( 29 | Mock.Random.ctitle() 30 | )) 31 | } 32 | 33 | // 数据扩展 34 | Mock.Random.extend({ 35 | productclass: function () { 36 | let classes = ['石榴', '松子', '火腿', '其它'] 37 | return this.pick(classes) 38 | }, 39 | status: function () { 40 | let states = ['待发货', '正在发货', '已发货', '已签收'] 41 | return this.pick(states) 42 | }, 43 | bename: function () { 44 | let benames = ['李小白', '张三'] 45 | return this.pick(benames) 46 | }, 47 | senddate: function () { 48 | let senddate = dateArray 49 | return this.pick(senddate) 50 | }, 51 | prodname: function () { 52 | return this.pick(prodnames) 53 | } 54 | // sendprod: function () { 55 | // let prods = products.productname 56 | // console.log(prods) 57 | // return this.pick(prods) 58 | // } 59 | }) 60 | const products = [ 61 | { 62 | class: 'pomegranate', 63 | name: '石榴', 64 | prods: [] 65 | }, 66 | { 67 | class: 'pine', 68 | name: '松子', 69 | prods: [] 70 | }, 71 | { 72 | class: 'ham', 73 | name: '火腿', 74 | prods: [] 75 | }, 76 | { 77 | class: 'other', 78 | name: '其它', 79 | prods: [] 80 | } 81 | ] 82 | for (let index = 0; index < 4; index++) { 83 | products[index].prods.push(Mock.mock({ 84 | productname: Mock.Random.prodname(), 85 | productclass: Mock.Random.productclass(), 86 | 'productprice|100-200': 1, 87 | productintro: Mock.Random.cparagraph(), 88 | productimage: Mock.Random.image('400x400', '@color'), 89 | 'productsells|20-700': 1, 90 | producrselling: Mock.Random.boolean() 91 | })) 92 | } 93 | const sends = [] 94 | for (let i = 0; i < 45; i++) { 95 | sends.push(Mock.mock({ 96 | bename: Mock.Random.bename(), 97 | sendname: Mock.Random.cname(), 98 | sendaddr: Mock.Random.city(), 99 | 'sendtel|0-9': 11, 100 | recepname: Mock.Random.cname(), 101 | recepaddr: Mock.Random.city(), 102 | 'receptel|0-9': 11, 103 | sendprod: Mock.Random.prodname(), 104 | 'sendprice|100-200': 1, 105 | sendmsg: Mock.Random.ctitle(), 106 | sendstatus: Mock.Random.status(), 107 | 'sendcode|1-9': 13, 108 | date: Mock.Random.senddate(), 109 | sendprodtype: Mock.Random.productclass() 110 | })) 111 | } 112 | 113 | export {users, products, sends} 114 | -------------------------------------------------------------------------------- /src/components/page/manger/my.vue: -------------------------------------------------------------------------------- 1 | 20 | 108 | 120 | 121 | -------------------------------------------------------------------------------- /src/components/page/manger.vue: -------------------------------------------------------------------------------- 1 | 40 | 69 | 70 | 122 | -------------------------------------------------------------------------------- /src/components/page/localProduct.vue: -------------------------------------------------------------------------------- 1 | 37 | 98 | 128 | -------------------------------------------------------------------------------- /src/utils/uploadUi.vue: -------------------------------------------------------------------------------- 1 | 16 | 93 | 124 | -------------------------------------------------------------------------------- /src/admin/views/FAQ/allFAQ.vue: -------------------------------------------------------------------------------- 1 | 48 | 113 | 114 | -------------------------------------------------------------------------------- /src/components/page/manger/history.vue: -------------------------------------------------------------------------------- 1 | 74 | 93 | 94 | 119 | -------------------------------------------------------------------------------- /src/admin/views/news/addnews.vue: -------------------------------------------------------------------------------- 1 | 34 | 92 | 93 | -------------------------------------------------------------------------------- /src/admin/views/siteoption/newsetoption.vue: -------------------------------------------------------------------------------- 1 | 33 | 110 | -------------------------------------------------------------------------------- /src/components/page/localProd.vue: -------------------------------------------------------------------------------- 1 | 35 | 80 | 142 | -------------------------------------------------------------------------------- /src/admin/views/sends/hassends.vue: -------------------------------------------------------------------------------- 1 | 86 | 107 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | // 引入公共组件 4 | import Login from '@/components/login' 5 | import Regin from '@/components/regin' 6 | import AdminLogin from '@/admin/views/adminlogin' 7 | 8 | // 引入前端组件 9 | import Home from '@/components/home' 10 | import ConHome from '@/components/con-home' 11 | import Products from '@/components/page/products' 12 | import FAQ from '@/components/page/FAQ' 13 | import News from '@/components/page/news' 14 | import Manger from '@/components/page/manger' 15 | import NewsContent from '@/components/page/newscontent' 16 | // 工作台子组件 17 | import My from '@/components/page/manger/my' 18 | import Send from '@/components/page/manger/send' 19 | import MyHistory from '@/components/page/manger/history' 20 | // 商品子组件 21 | import ProductList from '@/components/page/product/productlist' 22 | import ProductContent from '@/components/page/product/productcontent' 23 | // 添加新管理员 24 | import NewAdminer from '@/admin/views/adminer/newadminer' 25 | // lazyLoad components 26 | // const lazyComp = name => () => import(`@/components/${name}`) 27 | Vue.use(Router) 28 | // 无需权限就可以访问的常时路由,其实就是前端路由 29 | export const constantRoutes = [ 30 | // 前端路由 31 | { 32 | path: '/', 33 | hidden: true, 34 | type: 'client', 35 | component: Home, 36 | children: [ 37 | { 38 | path: '/', 39 | hidden: true, 40 | component: ConHome 41 | }, 42 | { 43 | path: '/products', 44 | name: '商品', 45 | class: 'el-icon-goods', 46 | component: Products, 47 | redirect: '/product/全部商品', 48 | children: [ 49 | { 50 | // 这里用的动态路由,需要一个冒号: 51 | path: '/product/:class', 52 | component: ProductList 53 | } 54 | ] 55 | }, 56 | { 57 | path: '/product/:class/:productname', 58 | hidden: true, 59 | component: ProductContent 60 | }, 61 | { 62 | path: '/news/:id', 63 | hidden: true, 64 | component: NewsContent 65 | }, 66 | // { 67 | // path: '/localproduct', 68 | // name: '批发', 69 | // component: lazyComp('page/localProduct') 70 | // }, 71 | // { 72 | // path: '/localproduct/:id', 73 | // hidden: true, 74 | // component: lazyComp('page/localProd') 75 | // }, 76 | { 77 | path: '/FAQ', 78 | name: '文档', 79 | hidden: true, 80 | component: FAQ 81 | }, 82 | { 83 | path: '/news', 84 | name: '动态', 85 | component: News 86 | }, 87 | { 88 | path: '/manger', 89 | name: '工作台', 90 | redirect: '/manger/my', 91 | meta: { 92 | requireUser: true 93 | }, 94 | component: Manger, 95 | // hasChild: true, 96 | children: [ 97 | { 98 | path: '/manger/my', 99 | meta: { 100 | requireUser: true 101 | }, 102 | name: '我的信息', 103 | component: My 104 | }, 105 | { 106 | path: '/manger/send', 107 | name: '发货管理', 108 | meta: { 109 | requireUser: true 110 | }, 111 | component: Send 112 | }, 113 | { 114 | path: '/manger/history', 115 | name: '发货记录', 116 | meta: { 117 | requireUser: true 118 | }, 119 | component: MyHistory 120 | } 121 | ] 122 | } 123 | ] 124 | }, 125 | // 登录注册路由 126 | { 127 | path: '/adminlogin', 128 | hidden: true, 129 | component: AdminLogin 130 | }, 131 | { 132 | path: '/login', 133 | name: '', 134 | hidden: true, 135 | component: Login 136 | }, 137 | { 138 | path: '/regin', 139 | name: '', 140 | hidden: true, 141 | component: Regin 142 | }, 143 | { 144 | path: '/addadminer', 145 | name: '添加管理员', 146 | component: NewAdminer 147 | } 148 | ] 149 | 150 | export default new Router({ 151 | routes: constantRoutes, 152 | mode: 'history' 153 | }) 154 | -------------------------------------------------------------------------------- /src/admin/views/adminlogin.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 137 | 138 | 151 | -------------------------------------------------------------------------------- /src/api/adminApi.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | // dev 4 | // let base = '/learn/api' 5 | // // build 6 | let base = '/api' 7 | // 后台登录接口 8 | export const AdminLogin = params => { 9 | return axios.get(`${base}/admin/login`, {params: params}) 10 | } 11 | // 判断管理员是否被注册 12 | export const hasReginedAdminer = params => { 13 | return axios.get(`${base}/admin/hasregined`, {params: params}) 14 | } 15 | // 添加管理员接口 16 | export const NewAdminer = params => { 17 | return axios.post(`${base}/admin/newadminer`, params) 18 | } 19 | // 删除关于我们 20 | export const DeleteAdminer = params => { 21 | return axios.delete(`${base}/admin/deleteadminer`, {params: params}) 22 | } 23 | // 获取管理员 24 | export const GetAdminer = params => { 25 | return axios.get(`${base}/admin/getadminer`, {params: params}) 26 | } 27 | // 修改管理员 28 | export const EditAdminer = params => { 29 | return axios.post(`${base}/admin/editadminer`, params) 30 | } 31 | // 添加商品类 32 | export const NewProducts = params => { 33 | return axios.post(`${base}/admin/newproducts`, params) 34 | } 35 | // 获取商品分类 36 | export const GetProducts = params => { 37 | return axios.get(`${base}/admin/getproducts`, {params: params}) 38 | } 39 | // 修改商品分类 40 | export const EditProduct = params => { 41 | return axios.post(`${base}/admin/editproduct`, params) 42 | } 43 | // 添加一个商品 44 | export const NewProd = params => { 45 | return axios.post(`${base}/admin/newprod`, params) 46 | } 47 | 48 | // 获取商品 49 | export const GetProds = params => { 50 | return axios.get(`${base}/admin/getprods`, {params: params}) 51 | } 52 | 53 | // 修改商品 54 | export const EditProd = params => { 55 | return axios.post(`${base}/admin/editprod`, params) 56 | } 57 | 58 | // 添加一个批发商品 59 | export const newLocalProd = params => { 60 | return axios.post(`${base}/admin/localprod`, params) 61 | } 62 | // 获取所有批发商品 63 | export const getAllLocalProds = params => { 64 | return axios.get(`${base}/admin/localprod`, {params: params}) 65 | } 66 | // 修改一个批发商品 67 | export const editLocalProd = params => { 68 | return axios.put(`${base}/admin/localprod`, params) 69 | } 70 | 71 | // 获取用户 72 | export const GetUsers = params => { 73 | return axios.get(`${base}/admin/getusers`, {params: params}) 74 | } 75 | 76 | // 获取用户发货量 77 | export const UserSendNum = params => { 78 | return axios.get(`${base}/admin/sendunm`, {params: params}) 79 | } 80 | 81 | // 获取所有正在发货订单 82 | export const Sendsing = params => { 83 | return axios.get(`${base}/admin/sendsing`, {params: params}) 84 | } 85 | 86 | // 更新订单状态 87 | export const UpdateSends = params => { 88 | return axios.post(`${base}/admin/updatesends`, params) 89 | } 90 | 91 | // 获取所有正在发货订单 92 | export const Sendsed = params => { 93 | return axios.get(`${base}/admin/sendsed`, {params: params}) 94 | } 95 | // 创建网站设置 96 | export const NewOption = params => { 97 | return axios.post(`${base}/admin/siteoption`, params) 98 | } 99 | // 获取网站设置 100 | export const GetOption = params => { 101 | return axios.get(`${base}/admin/siteoption`, {params: params}) 102 | } 103 | // 更新网站基本设置 104 | export const SiteOption = params => { 105 | return axios.put(`${base}/admin/siteoption`, params) 106 | } 107 | // 新增关于我们 108 | export const NewAbout = params => { 109 | return axios.post(`${base}/admin/about`, params) 110 | } 111 | // 修改关于我们 112 | export const EditAbout = params => { 113 | return axios.put(`${base}/admin/about`, params) 114 | } 115 | // 删除关于我们 116 | export const DeleteAbout = params => { 117 | return axios.delete(`${base}/admin/about`, {params: params}) 118 | } 119 | // 获取关于我们 120 | export const GetAbout = params => { 121 | return axios.get(`${base}/admin/about`, {params: params}) 122 | } 123 | // 新增新闻 124 | export const NewNews = params => { 125 | return axios.post(`${base}/admin/news`, params) 126 | } 127 | // 修改新闻 128 | export const EditNews = params => { 129 | return axios.put(`${base}/admin/news`, params) 130 | } 131 | // 获取新闻 132 | export const GetNews = params => { 133 | return axios.get(`${base}/admin/news`, {params: params}) 134 | } 135 | // 帮助文档 136 | const NewFaq = params => { 137 | return axios.post(`${base}/admin/faq`, params) 138 | } 139 | const EditFaq = params => { 140 | return axios.put(`${base}/admin/faq`, params) 141 | } 142 | const GetFaq = params => { 143 | return axios.get(`${base}/admin/faq`, {params: params}) 144 | } 145 | export { 146 | NewFaq, 147 | EditFaq, 148 | GetFaq 149 | } 150 | -------------------------------------------------------------------------------- /src/components/page/product/productcontent.vue: -------------------------------------------------------------------------------- 1 | 44 | 95 | 157 | 158 | 159 | -------------------------------------------------------------------------------- /src/components/login.vue: -------------------------------------------------------------------------------- 1 | 55 | 56 | 144 | 145 | 168 | 169 | -------------------------------------------------------------------------------- /src/admin/admin.vue: -------------------------------------------------------------------------------- 1 | 50 | 51 | 106 | 107 | 168 | 169 | 170 | -------------------------------------------------------------------------------- /src/admin/views/adminhome.vue: -------------------------------------------------------------------------------- 1 | 41 | 145 | 163 | 164 | 165 | -------------------------------------------------------------------------------- /src/admin/views/adminer/newadminer.vue: -------------------------------------------------------------------------------- 1 | 29 | 146 | 159 | -------------------------------------------------------------------------------- /src/components/con-home.vue: -------------------------------------------------------------------------------- 1 | 46 | 97 | 187 | 188 | 189 | -------------------------------------------------------------------------------- /src/data/mock.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import Adapter from 'axios-mock-adapter' 3 | import {users, products, sends} from './data' 4 | import avatarDefault from '../assets/logo.png' 5 | export default { 6 | init () { 7 | // 创建Adapter 实例 8 | const mock = new Adapter(axios) 9 | 10 | // 模拟登录接口 11 | mock.onPost('/login').reply(config => { 12 | // 解析axios传过来的数据 13 | let {username, password} = JSON.parse(config.data) 14 | return new Promise((resolve, reject) => { 15 | // 先创建一个用户为空对象 16 | let user = {} 17 | // 判断模拟的假数据中是否有和传过来的数据匹配的 18 | let hasUser = users.some(person => { 19 | // 如果存在这样的数据 20 | if (person.username === username && person.password === password) { 21 | user = JSON.parse(JSON.stringify(person)) 22 | user.password = '' 23 | return true 24 | } else { 25 | // 如果没有这个person 26 | return false 27 | } 28 | }) 29 | // 如果有这么一个人 30 | setTimeout(() => { 31 | if (hasUser) { 32 | resolve([200, { code: 200, msg: '登录成功', user }]) 33 | // 如果没有这个人 34 | } else { 35 | resolve([200, { code: 500, msg: '账号或密码错误' }]) 36 | } 37 | }, 1500) 38 | }) 39 | }) 40 | 41 | // 模拟注册接口 42 | mock.onPost('/regin').reply(config => { 43 | // console.log(config) 44 | // console.log(config.data) 45 | let {username, password, tel, email, name} = JSON.parse(config.data) 46 | let adduser = { 47 | username: username, 48 | password: password, 49 | email: email, 50 | name: name, 51 | tel: tel, 52 | avatar: avatarDefault, 53 | time: new Date() 54 | } 55 | users.push(adduser) 56 | adduser.password = '' 57 | return new Promise((resolve, reject) => { 58 | resolve([200, {adduser}]) 59 | }) 60 | }) 61 | // 模拟获取商品列表 62 | mock.onGet('/productlist').reply(config => { 63 | let productclass = config.params 64 | // console.log(productclass) 65 | let productlist = products.filter(p => { 66 | if (productclass === '') { 67 | return true 68 | } else if (p.productclass === productclass) { 69 | return true 70 | } else { 71 | return false 72 | } 73 | }) 74 | // console.log(productlist) 75 | return new Promise((resolve, reject) => { 76 | resolve([200, { 77 | productlist 78 | }]) 79 | }) 80 | }) 81 | // 模拟查询列表 82 | mock.onGet('/search').reply(config => { 83 | let searchname = config.params 84 | // console.log(searchname) 85 | let searchRes = [] 86 | products.forEach(p => { 87 | if (p.productname.indexOf(searchname) !== -1) { 88 | searchRes.push(p) 89 | } 90 | }) 91 | // console.log(searchRes) 92 | return new Promise((resolve, reject) => { 93 | setTimeout(() => { 94 | if (searchRes.length > 0) { 95 | resolve([200, { 96 | code: 200, 97 | searchRes 98 | }]) 99 | } else { 100 | resolve([200, { 101 | code: 500, 102 | msg: '很抱歉没有查询到结果,请确定商品名' 103 | }]) 104 | } 105 | }, 500) 106 | }) 107 | }) 108 | // 商品详情 109 | mock.onGet('/product').reply(config => { 110 | let {productclass, productname} = config.params 111 | let curproduct = {} 112 | products.forEach(p => { 113 | if (p.productclass === productclass && p.productname === productname) { 114 | curproduct = p 115 | } 116 | }) 117 | return new Promise((resolve, reject) => { 118 | resolve([200, {curproduct}]) 119 | }) 120 | }) 121 | // 获取个人待发货列表 122 | mock.onGet('/presend').reply(config => { 123 | // console.log(config) 124 | // console.log(sends) 125 | let {bename, status} = config.params 126 | // console.log(bename, status) 127 | let presend = sends.filter(pre => { 128 | // console.log(pre) 129 | if (pre.bename === bename && pre.sendstatus === status) { 130 | return true 131 | } else { 132 | return false 133 | } 134 | }) 135 | // console.log(presend) 136 | return new Promise((resolve, reject) => { 137 | if (presend.length > 0) { 138 | resolve([200, {presend}]) 139 | } else { 140 | resolve([200, { 141 | msg: '还没有发货列表' 142 | }]) 143 | } 144 | }) 145 | }) 146 | // 获取个人已发货列表 147 | mock.onGet('/sended').reply(config => { 148 | let {bename, status} = config.params 149 | let sended = sends.filter(ed => { 150 | if (ed.bename === bename && ed.sendstatus !== status) { 151 | return true 152 | } 153 | }) 154 | // console.log(sended) 155 | return new Promise((resolve, reject) => { 156 | if (sended.length > 0) { 157 | resolve([200, {sended}]) 158 | } else { 159 | resolve([200, {msg: '没有记录'}]) 160 | } 161 | }) 162 | }) 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /src/admin/views/news/allnews.vue: -------------------------------------------------------------------------------- 1 | 67 | 144 | 145 | -------------------------------------------------------------------------------- /src/admin/views/prods/addtype.vue: -------------------------------------------------------------------------------- 1 | 89 | 190 | 207 | -------------------------------------------------------------------------------- /src/admin/views/sends/submitsends.vue: -------------------------------------------------------------------------------- 1 | 89 | 177 | 197 | 198 | 199 | -------------------------------------------------------------------------------- /src/admin/views/siteoption/setoption.vue: -------------------------------------------------------------------------------- 1 | 61 | 131 | 194 | -------------------------------------------------------------------------------- /src/admin/views/localProds/newLocal.vue: -------------------------------------------------------------------------------- 1 | 59 | 163 | 198 | -------------------------------------------------------------------------------- /src/components/page/product/productlist.vue: -------------------------------------------------------------------------------- 1 | 54 | 141 | 236 | 237 | 238 | -------------------------------------------------------------------------------- /src/admin/views/localProds/allLocalProds.vue: -------------------------------------------------------------------------------- 1 | 73 | 181 | 232 | -------------------------------------------------------------------------------- /src/admin/views/siteoption/setabout.vue: -------------------------------------------------------------------------------- 1 | 68 | 199 | -------------------------------------------------------------------------------- /src/admin/views/adminer/alladminer.vue: -------------------------------------------------------------------------------- 1 | 74 | 218 | 250 | -------------------------------------------------------------------------------- /src/admin/views/prods/addprod.vue: -------------------------------------------------------------------------------- 1 | 59 | 205 | 240 | 241 | 242 | -------------------------------------------------------------------------------- /src/components/regin.vue: -------------------------------------------------------------------------------- 1 | 88 | 247 | 248 | 271 | -------------------------------------------------------------------------------- /src/router/asyncRoutes.js: -------------------------------------------------------------------------------- 1 | // 引入后端管理组件 2 | import Admin from '@/admin/admin' 3 | import AdminHome from '@/admin/views/adminhome' 4 | import MangerAdmin from '@/admin/views/mangeradmin' 5 | import MangerProds from '@/admin/views/mangerprods' 6 | // import MangerLocal from '@/admin/views/mangeLocal' 7 | import MangerSends from '@/admin/views/mangersends' 8 | import MangerUser from '@/admin/views/mangeruser' 9 | import SiteOption from '@/admin/views/siteoption' 10 | import MangeNews from '@/admin/views/mangernews' 11 | import MangeFAQ from '@/admin/views/mangerFAQ' 12 | // 引入后端子组件 13 | // 商品类组件 14 | import AddType from '@/admin/views/prods/addtype' 15 | import AddProd from '@/admin/views/prods/addprod' 16 | import AllProds from '@/admin/views/prods/allprods' 17 | // 管理员类子组件 18 | import AllAdminer from '@/admin/views/adminer/alladminer' 19 | import NewAdminer from '@/admin/views/adminer/newadminer' 20 | // 发货管理类子组件 21 | import SubmitSends from '@/admin/views/sends/submitsends' 22 | import HasSends from '@/admin/views/sends/hassends' 23 | // 新闻动态子组件 24 | import AllNews from '@/admin/views/news/allnews' 25 | import AddNews from '@/admin/views/news/addnews' 26 | // 帮助文档子组件 27 | import AddFAQ from '@/admin/views/FAQ/addFAQ' 28 | import AllFAQ from '@/admin/views/FAQ/allFAQ' 29 | // 网站设置类子组件 30 | import SetOption from '@/admin/views/siteoption/setoption' 31 | import SetAbout from '@/admin/views/siteoption/setabout' 32 | import NewSetAbout from '@/admin/views/siteoption/newsetoption' 33 | import Page404 from '@/components/404' 34 | // 路由懒加载 35 | const lazyAdmin = name => () => import(`@/admin/views/${name}`) 36 | // 需要验证权限才能访问的路由 37 | export const asyncRoutes = [ 38 | // 后端页面路由 39 | // 后端主路由 40 | { 41 | path: '/admin', 42 | component: Admin, 43 | type: 'admin', 44 | hidden: true, 45 | meta: { 46 | requireAdminer: true, 47 | role: ['superAdmin', 'admin', 'prodSender', 'prodManger'] 48 | }, 49 | children: [ 50 | // 后端首页 51 | { 52 | path: '/admin', 53 | meta: { 54 | requireAdminer: true, 55 | role: ['superAdmin', 'admin', 'prodSender', 'prodManger'] 56 | }, 57 | component: AdminHome, 58 | name: '管理首页' 59 | }, 60 | // 商品管理 61 | { 62 | path: '/admin/mangeprods', 63 | name: '商品管理', 64 | meta: { 65 | requireAdminer: true, 66 | role: ['superAdmin', 'admin', 'prodManger'] 67 | }, 68 | component: MangerProds, 69 | redirect: '/admin/mangeprods/allprods', 70 | children: [ 71 | { 72 | path: '/admin/mangeprods/allprods', 73 | name: '全部商品', 74 | meta: { 75 | requireAdminer: true 76 | }, 77 | component: AllProds 78 | }, 79 | { 80 | path: '/admin/mangeprods/addprodstype', 81 | name: '添加商品分类', 82 | meta: { 83 | requireAdminer: true 84 | }, 85 | component: AddType 86 | }, 87 | { 88 | path: '/admin/mangeprods/addprod', 89 | name: '新增商品', 90 | meta: { 91 | requireAdminer: true 92 | }, 93 | component: AddProd 94 | } 95 | ] 96 | }, 97 | // 批发管理 98 | { 99 | path: '/admin/mangelocal', 100 | name: '批发管理', 101 | meta: { 102 | requireAdminer: true, 103 | role: ['superAdmin', 'admin', 'prodManger'] 104 | }, 105 | component: lazyAdmin('mangeLocal'), 106 | redirect: '/admin/mangelocal/alllocalprods', 107 | children: [ 108 | { 109 | path: '/admin/mangelocal/alllocalprods', 110 | name: '全部批发商品', 111 | meta: { 112 | requireAdminer: true 113 | }, 114 | component: lazyAdmin('localProds/allLocalProds') 115 | }, 116 | { 117 | path: '/admin/mangelocal/addlocalprod', 118 | name: '新增批发商品', 119 | meta: { 120 | requireAdminer: true 121 | }, 122 | component: lazyAdmin('localProds/newLocal') 123 | } 124 | ] 125 | }, 126 | // 订单管理 127 | { 128 | path: '/admin/mangesends', 129 | name: '订单管理', 130 | meta: { 131 | requireAdminer: true, 132 | role: ['superAdmin', 'admin', 'prodSender'] 133 | }, 134 | component: MangerSends, 135 | redirect: '/admin/mangesends/submitsends', 136 | children: [ 137 | { 138 | path: '/admin/mangesends/submitsends', 139 | name: '打印发货运单', 140 | meta: { 141 | requireAdminer: true 142 | }, 143 | component: SubmitSends 144 | }, 145 | { 146 | path: '/admin/mangesends/hassends', 147 | name: '已发货订单', 148 | meta: { 149 | requireAdminer: true 150 | }, 151 | component: HasSends 152 | } 153 | ] 154 | }, 155 | // 用户管理 156 | { 157 | path: '/admin/mangeuser', 158 | name: '用户管理', 159 | meta: { 160 | requireAdminer: true, 161 | role: ['superAdmin', 'admin'] 162 | }, 163 | component: MangerUser 164 | }, 165 | // 管理员账户管理 166 | { 167 | path: '/admin/mangeadmin', 168 | name: '管理人员', 169 | meta: { 170 | requireAdminer: true, 171 | role: ['superAdmin'] 172 | }, 173 | component: MangerAdmin, 174 | redirect: '/admin/mangeadmin/alladminers', 175 | children: [ 176 | { 177 | path: '/admin/mangeadmin/alladminers', 178 | name: '管理员列表', 179 | meta: { 180 | requireAdminer: true 181 | }, 182 | component: AllAdminer 183 | }, 184 | { 185 | path: '/admin/mangeadmin/newadminer', 186 | name: '新增管理员', 187 | meta: { 188 | requireAdminer: true 189 | }, 190 | component: NewAdminer 191 | } 192 | ] 193 | }, 194 | // 新闻管理 195 | { 196 | path: '/admin/mangenews', 197 | name: '新闻管理', 198 | component: MangeNews, 199 | meta: { 200 | requireAdminer: true, 201 | role: ['superAdmin', 'admin'] 202 | }, 203 | redirect: '/admin/mangenews/allnews', 204 | children: [ 205 | { 206 | path: '/admin/mangenews/allnews', 207 | name: '全部新闻', 208 | component: AllNews, 209 | meta: { 210 | requireAdminer: true 211 | } 212 | }, 213 | { 214 | path: '/admin/mangenews/addnews', 215 | name: '添加新闻动态', 216 | component: AddNews, 217 | meta: { 218 | requireAdminer: true 219 | } 220 | } 221 | ] 222 | }, 223 | // FAQ文档管理 224 | { 225 | path: '/admin/mangeFAQ', 226 | name: '文档管理', 227 | component: MangeFAQ, 228 | meta: { 229 | requireAdminer: true, 230 | role: ['superAdmin', 'admin'] 231 | }, 232 | redirect: '/admin/mangeFAQ/all', 233 | children: [ 234 | { 235 | path: '/admin/mangeFAQ/all', 236 | name: '全部帮助文档', 237 | component: AllFAQ, 238 | meta: { 239 | requireAdminer: true 240 | } 241 | }, 242 | { 243 | path: '/admin/mangeFAQ/new', 244 | name: '添加FAQ文档', 245 | component: AddFAQ, 246 | meta: { 247 | requireAdminer: true 248 | } 249 | } 250 | ] 251 | }, 252 | // 网站管理 253 | { 254 | path: '/admin/siteoption', 255 | name: '网站设置', 256 | component: SiteOption, 257 | meta: { 258 | requireAdminer: true, 259 | role: ['superAdmin'] 260 | }, 261 | redirect: '/admin/siteoption/setoption', 262 | children: [ 263 | { 264 | path: '/admin/siteoption/setoption', 265 | name: '网站基本设置', 266 | component: SetOption, 267 | meta: { 268 | requireAdminer: true 269 | } 270 | }, 271 | { 272 | path: '/admin/siteoption/setabout', 273 | name: '关于我们', 274 | component: SetAbout, 275 | meta: { 276 | requireAdminer: true 277 | } 278 | }, 279 | { 280 | path: '/admin/siteoption/newsetabout', 281 | name: '添加新内容', 282 | component: NewSetAbout, 283 | meta: { 284 | requireAdminer: true 285 | } 286 | } 287 | ] 288 | } 289 | ] 290 | }, 291 | // 404 292 | { 293 | path: '*', 294 | hidden: true, 295 | component: Page404 296 | } 297 | ] 298 | -------------------------------------------------------------------------------- /src/components/header.vue: -------------------------------------------------------------------------------- 1 | 116 | 180 | 276 | --------------------------------------------------------------------------------